From a3d2574cf47b52e2a7f69cfcbb1a10fb254a4c85 Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Sun, 7 Mar 2010 12:56:44 +0600 Subject: [PATCH] Added into mercurial repository --- ALL_BUILD.vcproj | 88 + AUTHORS | 0 AUTHORS.sim | 38 + CMakeLists.txt | 258 + CMakeLists.txt.user | 222 + COPYING | 340 + ChangeLog | 99 + ChangeLog.old | 189 + ConfigureChecks.cmake | 34 + Doxyfile | 1557 ++ INSTALL | 167 + README | 46 + README.SVN | 16 + TODO.CMake | 15 + TODO.MingW | 5 + admin/Doxyfile.am | 102 + admin/Doxyfile.global | 192 + admin/acinclude.m4.in | 6040 ++++++++ admin/am_edit | 2441 +++ admin/bcheck.pl | 157 + admin/compile | 142 + admin/conf.change.pl | 191 + admin/config.guess | 1464 ++ admin/config.pl | 238 + admin/config.sub | 1575 ++ admin/configure.in.bot.end | 47 + admin/configure.in.min | 70 + admin/debianrules | 43 + admin/depcomp | 530 + admin/deps.am | 19 + admin/detect-autoconf.pl | 172 + admin/install-sh | 401 + admin/libtool.m4.in | 5891 +++++++ admin/missing | 353 + admin/mkinstalldirs | 158 + admin/nmcheck | 371 + admin/oldinclude.m4.in | 192 + admin/pkg.m4.in | 57 + admin/ylwrap | 223 + altlinux.spec | 476 + asp-linux.spec | 169 + cmake/COPYING-CMAKE-SCRIPTS | 27 + cmake/CheckStructMember.cmake | 42 + cmake/DistTarget.cmake | 36 + cmake/FindFlex.cmake | 32 + cmake/FindLibIconv.cmake | 40 + cmake/FindLibraryWithDebug.cmake | 113 + cmake/FindOpenSSL.cmake | 63 + cmake/Flex.cmake | 26 + cmake/Jisp.cmake | 49 + cmake/KDE4InstallIcons.cmake | 130 + cmake/MacroBoolTo01.cmake | 20 + cmake/MacroEnsureOutOfSourceBuild.cmake | 16 + cmake/MacroEnsureVersion.cmake | 35 + cmake/Po.cmake | 98 + cmake/SimPlugins.cmake | 76 + cmake/XGetText.cmake | 65 + cmake/cmake_uninstall.cmake.in | 23 + cmake/kde4uic.cmake | 53 + config.h.cmake | 37 + configure.in.in | 154 + export_nix.py | 71 + fedora.spec | 122 + .../VC8_deploy/Microsoft.VC80.CRT.manifest | 15 + .../plugins/Microsoft.VC80.CRT.manifest | 49 + .../VC8_deploy/sim.exe.intermediate.manifest | 14 + install_win32/iconv.dll | Bin 0 -> 888832 bytes install_win32/libeay32.dll | Bin 0 -> 1073152 bytes install_win32/libxml2.dll | Bin 0 -> 946688 bytes install_win32/libxslt.dll | Bin 0 -> 153088 bytes install_win32/mingw/sim.nsi | 364 + install_win32/nsis_installer_full.nsi | 268 + install_win32/sim-window-small.bmp | Bin 0 -> 185274 bytes install_win32/ssleay32.dll | Bin 0 -> 200704 bytes install_win32/zlib1.dll | Bin 0 -> 59904 bytes jisp-resources.txt | 7 + ltdl.m4 | 421 + mandrake.spec | 133 + plugins/__homedir/CMakeLists.txt | 25 + plugins/__homedir/__homedir.vcproj | 369 + plugins/__homedir/configure.in.in | 5 + plugins/__homedir/homedir.cpp | 249 + plugins/__homedir/homedir.h | 44 + plugins/__homedir/homedir.rc | 97 + plugins/__homedir/homedircfg.cpp | 81 + plugins/__homedir/homedircfg.h | 39 + plugins/__homedir/homedircfgbase.ui | 70 + plugins/__migrate/CMakeLists.txt | 23 + plugins/__migrate/__migrate.vcproj | 404 + plugins/__migrate/migrate.cpp | 86 + plugins/__migrate/migrate.h | 32 + plugins/__migrate/migrate.rc | 97 + plugins/__migrate/migratedlg.cpp | 401 + plugins/__migrate/migratedlg.h | 72 + plugins/__migrate/migratedlgbase.ui | 142 + plugins/_core/CMakeLists.txt | 203 + plugins/_core/GPL-Icons/1downarrow.png | Bin 0 -> 716 bytes plugins/_core/GPL-Icons/1leftarrow.png | Bin 0 -> 745 bytes plugins/_core/GPL-Icons/1rightarrow.png | Bin 0 -> 791 bytes plugins/_core/GPL-Icons/1uparrow.png | Bin 0 -> 729 bytes plugins/_core/GPL-Icons/SMS-protocol.png | Bin 0 -> 450 bytes plugins/_core/GPL-Icons/aim_online.png | Bin 0 -> 651 bytes plugins/_core/GPL-Icons/auth.png | Bin 0 -> 577 bytes plugins/_core/GPL-Icons/birthday.png | Bin 0 -> 854 bytes plugins/_core/GPL-Icons/button_cancel.png | Bin 0 -> 702 bytes plugins/_core/GPL-Icons/button_ok.png | Bin 0 -> 554 bytes plugins/_core/GPL-Icons/cell.png | Bin 0 -> 1022 bytes plugins/_core/GPL-Icons/collapsed.png | Bin 0 -> 296 bytes plugins/_core/GPL-Icons/configure.png | Bin 0 -> 904 bytes plugins/_core/GPL-Icons/contacts.png | Bin 0 -> 903 bytes plugins/_core/GPL-Icons/def_status_away.png | Bin 0 -> 276 bytes plugins/_core/GPL-Icons/def_status_dnd.png | Bin 0 -> 380 bytes plugins/_core/GPL-Icons/def_status_ffc.png | Bin 0 -> 453 bytes plugins/_core/GPL-Icons/def_status_na.png | Bin 0 -> 331 bytes .../_core/GPL-Icons/def_status_occupied.png | Bin 0 -> 391 bytes plugins/_core/GPL-Icons/empty.png | Bin 0 -> 85 bytes plugins/_core/GPL-Icons/error.png | Bin 0 -> 769 bytes plugins/_core/GPL-Icons/exit.png | Bin 0 -> 840 bytes plugins/_core/GPL-Icons/expanded.png | Bin 0 -> 264 bytes plugins/_core/GPL-Icons/fax.png | Bin 0 -> 741 bytes plugins/_core/GPL-Icons/file.png | Bin 0 -> 641 bytes plugins/_core/GPL-Icons/fileopen.png | Bin 0 -> 875 bytes plugins/_core/GPL-Icons/filesave.png | Bin 0 -> 667 bytes plugins/_core/GPL-Icons/find_user.png | Bin 0 -> 974 bytes plugins/_core/GPL-Icons/floating.png | Bin 0 -> 513 bytes plugins/_core/GPL-Icons/fonts.png | Bin 0 -> 841 bytes plugins/_core/GPL-Icons/gadu_away.png | Bin 0 -> 895 bytes plugins/_core/GPL-Icons/gadu_dnd.png | Bin 0 -> 763 bytes plugins/_core/GPL-Icons/gadu_invisible.png | Bin 0 -> 777 bytes plugins/_core/GPL-Icons/gadu_offline.png | Bin 0 -> 481 bytes plugins/_core/GPL-Icons/gadu_online.png | Bin 0 -> 944 bytes plugins/_core/GPL-Icons/group_collapsed.png | Bin 0 -> 293 bytes plugins/_core/GPL-Icons/group_expanded.png | Bin 0 -> 298 bytes plugins/_core/GPL-Icons/grp_create.png | Bin 0 -> 878 bytes plugins/_core/GPL-Icons/grp_off.png | Bin 0 -> 957 bytes plugins/_core/GPL-Icons/grp_on.png | Bin 0 -> 782 bytes plugins/_core/GPL-Icons/grp_rename.png | Bin 0 -> 661 bytes plugins/_core/GPL-Icons/home.png | Bin 0 -> 3562 bytes plugins/_core/GPL-Icons/icondef.xml | 437 + plugins/_core/GPL-Icons/icq_online.png | Bin 0 -> 1005 bytes plugins/_core/GPL-Icons/jabber.png | Bin 0 -> 308 bytes plugins/_core/GPL-Icons/jabber_offline.png | Bin 0 -> 250 bytes plugins/_core/GPL-Icons/mail_generic.png | Bin 0 -> 536 bytes plugins/_core/GPL-Icons/message.png | Bin 0 -> 468 bytes plugins/_core/GPL-Icons/msn_online.png | Bin 0 -> 844 bytes plugins/_core/GPL-Icons/network.png | Bin 0 -> 979 bytes plugins/_core/GPL-Icons/no_phone.png | Bin 0 -> 877 bytes plugins/_core/GPL-Icons/non-im-contact.png | Bin 0 -> 897 bytes plugins/_core/GPL-Icons/online_off.png | Bin 0 -> 2896 bytes plugins/_core/GPL-Icons/online_on.png | Bin 0 -> 2944 bytes plugins/_core/GPL-Icons/pager.png | Bin 0 -> 563 bytes plugins/_core/GPL-Icons/phone.png | Bin 0 -> 723 bytes plugins/_core/GPL-Icons/remove.png | Bin 0 -> 850 bytes plugins/_core/GPL-Icons/run.png | Bin 0 -> 1139 bytes plugins/_core/GPL-Icons/security.png | Bin 0 -> 963 bytes plugins/_core/GPL-Icons/sim.png | Bin 0 -> 832 bytes plugins/_core/GPL-Icons/sms.png | Bin 0 -> 646 bytes plugins/_core/GPL-Icons/unknown_icon_1.png | Bin 0 -> 259 bytes plugins/_core/GPL-Icons/url.png | Bin 0 -> 902 bytes plugins/_core/GPL-Icons/webpress.png | Bin 0 -> 761 bytes plugins/_core/GPL-Icons/work.png | Bin 0 -> 3457 bytes plugins/_core/GPL-Icons/yahoo_away.png | Bin 0 -> 936 bytes plugins/_core/GPL-Icons/yahoo_dnd.png | Bin 0 -> 936 bytes plugins/_core/GPL-Icons/yahoo_invisible.png | Bin 0 -> 999 bytes plugins/_core/GPL-Icons/yahoo_na.png | Bin 0 -> 936 bytes plugins/_core/GPL-Icons/yahoo_offline.png | Bin 0 -> 881 bytes plugins/_core/GPL-Icons/yahoo_online.png | Bin 0 -> 878 bytes plugins/_core/_core.vcproj | 4408 ++++++ plugins/_core/additional/0.png | Bin 0 -> 2856 bytes plugins/_core/additional/1.png | Bin 0 -> 2856 bytes plugins/_core/additional/icondef.xml | 19 + plugins/_core/arcfg.cpp | 121 + plugins/_core/arcfg.h | 45 + plugins/_core/arcfgbase.ui | 133 + plugins/_core/autoreply.cpp | 204 + plugins/_core/autoreply.h | 55 + plugins/_core/autoreplybase.ui | 151 + plugins/_core/cfgdlg.cpp | 642 + plugins/_core/cfgdlg.h | 120 + plugins/_core/cfgdlgbase.ui | 177 + plugins/_core/cmenu.cpp | 249 + plugins/_core/cmenu.h | 58 + plugins/_core/commands.cpp | 343 + plugins/_core/commands.h | 71 + plugins/_core/connectionsettings.cpp | 55 + plugins/_core/connectionsettings.h | 36 + plugins/_core/connectionsettingsbase.ui | 121 + plugins/_core/connectwnd.cpp | 95 + plugins/_core/connectwnd.h | 38 + plugins/_core/connectwndbase.ui | 195 + plugins/_core/container.cpp | 1119 ++ plugins/_core/container.h | 169 + plugins/_core/core.cpp | 4123 +++++ plugins/_core/core.h | 345 + plugins/_core/core.rc | 97 + plugins/_core/core_consts.h | 198 + plugins/_core/core_events.h | 269 + plugins/_core/core_pch.h | 119 + plugins/_core/declinedlg.cpp | 66 + plugins/_core/declinedlg.h | 38 + plugins/_core/declinedlgbase.ui | 123 + plugins/_core/editmail.cpp | 61 + plugins/_core/editmail.h | 37 + plugins/_core/editmailbase.ui | 152 + plugins/_core/editphone.cpp | 161 + plugins/_core/editphone.h | 48 + plugins/_core/editphonebase.ui | 182 + .../SIM-icons-Crystal-full.jisp | Bin 0 -> 251987 bytes .../SIM-icons-Crystal-full.jisp.license | 4 + .../SIM-icons-Nuvola-full.jisp | Bin 0 -> 258805 bytes .../SIM-icons-Nuvola-full.jisp.license | 4 + .../emoticons_prebuilt/SIM-icons-XP-full.jisp | Bin 0 -> 246814 bytes .../SIM-icons-XP-full.jisp.license | 1 + .../_core/emoticons_prebuilt/additional.jisp | Bin 0 -> 4957 bytes .../additional.jisp.license | 1 + plugins/_core/emoticons_prebuilt/amibulb.jisp | Bin 0 -> 5505 bytes .../emoticons_prebuilt/amibulb.jisp.license | 1 + .../_core/emoticons_prebuilt/apple_ichat.jisp | Bin 0 -> 13881 bytes .../apple_ichat.jisp.license | 1 + plugins/_core/emoticons_prebuilt/gants.jisp | Bin 0 -> 138163 bytes .../emoticons_prebuilt/gants.jisp.license | 1 + plugins/_core/emoticons_prebuilt/icq5.1.jisp | Bin 0 -> 126566 bytes .../emoticons_prebuilt/icq5.1.jisp.license | 1 + plugins/_core/emoticons_prebuilt/icq5.jisp | Bin 0 -> 25632 bytes .../emoticons_prebuilt/icq5.jisp.license | 1 + plugins/_core/emoticons_prebuilt/icqlite.jisp | Bin 0 -> 52970 bytes .../emoticons_prebuilt/icqlite.jisp.license | 1 + .../_core/emoticons_prebuilt/lovenmoney.jisp | Bin 0 -> 8195 bytes .../lovenmoney.jisp.license | 1 + plugins/_core/emoticons_prebuilt/msn.jisp | Bin 0 -> 63201 bytes .../_core/emoticons_prebuilt/msn.jisp.license | 3 + plugins/_core/emoticons_prebuilt/sim.jisp | Bin 0 -> 65843 bytes .../_core/emoticons_prebuilt/sim.jisp.license | 1 + plugins/_core/emoticons_prebuilt/sim2.jisp | Bin 0 -> 56658 bytes .../emoticons_prebuilt/sim2.jisp.license | 1 + plugins/_core/emoticons_prebuilt/smiles.jisp | Bin 0 -> 19730 bytes .../emoticons_prebuilt/smiles.jisp.license | 1 + plugins/_core/emoticons_prebuilt/yahoo.jisp | Bin 0 -> 121850 bytes .../emoticons_prebuilt/yahoo.jisp.license | 1 + plugins/_core/filecfg.cpp | 71 + plugins/_core/filecfg.h | 36 + plugins/_core/filecfgbase.ui | 140 + plugins/_core/filetransfer.cpp | 554 + plugins/_core/filetransfer.h | 71 + plugins/_core/filetransferbase.ui | 212 + plugins/_core/fontconfigbase.ui | 122 + plugins/_core/history.cpp | 927 ++ plugins/_core/history.h | 89 + plugins/_core/historycfg.cpp | 748 + plugins/_core/historycfg.h | 73 + plugins/_core/historycfgbase.ui | 372 + plugins/_core/historywnd.cpp | 464 + plugins/_core/historywnd.h | 67 + plugins/_core/icq5.1/0.png | Bin 0 -> 4426 bytes plugins/_core/icq5.1/1.png | Bin 0 -> 4221 bytes plugins/_core/icq5.1/10.png | Bin 0 -> 4881 bytes plugins/_core/icq5.1/11.png | Bin 0 -> 4482 bytes plugins/_core/icq5.1/12.png | Bin 0 -> 4436 bytes plugins/_core/icq5.1/13.png | Bin 0 -> 4244 bytes plugins/_core/icq5.1/14.png | Bin 0 -> 4636 bytes plugins/_core/icq5.1/15.png | Bin 0 -> 4268 bytes plugins/_core/icq5.1/16.png | Bin 0 -> 4240 bytes plugins/_core/icq5.1/17.png | Bin 0 -> 4350 bytes plugins/_core/icq5.1/18.png | Bin 0 -> 4267 bytes plugins/_core/icq5.1/19.png | Bin 0 -> 4668 bytes plugins/_core/icq5.1/2.png | Bin 0 -> 4465 bytes plugins/_core/icq5.1/20.png | Bin 0 -> 4476 bytes plugins/_core/icq5.1/21.png | Bin 0 -> 4137 bytes plugins/_core/icq5.1/22.png | Bin 0 -> 4217 bytes plugins/_core/icq5.1/23.png | Bin 0 -> 3969 bytes plugins/_core/icq5.1/24.png | Bin 0 -> 4368 bytes plugins/_core/icq5.1/25.png | Bin 0 -> 4092 bytes plugins/_core/icq5.1/26.png | Bin 0 -> 4616 bytes plugins/_core/icq5.1/27.png | Bin 0 -> 4289 bytes plugins/_core/icq5.1/3.png | Bin 0 -> 4377 bytes plugins/_core/icq5.1/4.png | Bin 0 -> 4096 bytes plugins/_core/icq5.1/5.png | Bin 0 -> 4531 bytes plugins/_core/icq5.1/6.png | Bin 0 -> 4398 bytes plugins/_core/icq5.1/7.png | Bin 0 -> 4531 bytes plugins/_core/icq5.1/8.png | Bin 0 -> 4555 bytes plugins/_core/icq5.1/9.png | Bin 0 -> 4574 bytes plugins/_core/icq5.1/icondef.xml | 149 + plugins/_core/icq5/00.png | Bin 0 -> 745 bytes plugins/_core/icq5/01.png | Bin 0 -> 832 bytes plugins/_core/icq5/02.png | Bin 0 -> 793 bytes plugins/_core/icq5/03.png | Bin 0 -> 790 bytes plugins/_core/icq5/04.png | Bin 0 -> 871 bytes plugins/_core/icq5/05.png | Bin 0 -> 800 bytes plugins/_core/icq5/06.png | Bin 0 -> 801 bytes plugins/_core/icq5/07.png | Bin 0 -> 1035 bytes plugins/_core/icq5/08.png | Bin 0 -> 961 bytes plugins/_core/icq5/09.png | Bin 0 -> 735 bytes plugins/_core/icq5/10.png | Bin 0 -> 892 bytes plugins/_core/icq5/11.png | Bin 0 -> 762 bytes plugins/_core/icq5/12.png | Bin 0 -> 891 bytes plugins/_core/icq5/13.png | Bin 0 -> 920 bytes plugins/_core/icq5/14.png | Bin 0 -> 699 bytes plugins/_core/icq5/15.png | Bin 0 -> 692 bytes plugins/_core/icq5/16.png | Bin 0 -> 782 bytes plugins/_core/icq5/17.png | Bin 0 -> 838 bytes plugins/_core/icq5/18.png | Bin 0 -> 738 bytes plugins/_core/icq5/19.png | Bin 0 -> 830 bytes plugins/_core/icq5/20.png | Bin 0 -> 759 bytes plugins/_core/icq5/21.png | Bin 0 -> 885 bytes plugins/_core/icq5/22.png | Bin 0 -> 983 bytes plugins/_core/icq5/23.png | Bin 0 -> 502 bytes plugins/_core/icq5/24.png | Bin 0 -> 568 bytes plugins/_core/icq5/25.png | Bin 0 -> 442 bytes plugins/_core/icq5/26.png | Bin 0 -> 780 bytes plugins/_core/icq5/27.png | Bin 0 -> 934 bytes plugins/_core/icq5/icondef.xml | 149 + plugins/_core/icqlite/0.png | Bin 0 -> 1656 bytes plugins/_core/icqlite/1.png | Bin 0 -> 1613 bytes plugins/_core/icqlite/10.png | Bin 0 -> 1973 bytes plugins/_core/icqlite/11.png | Bin 0 -> 1984 bytes plugins/_core/icqlite/12.png | Bin 0 -> 1726 bytes plugins/_core/icqlite/13.png | Bin 0 -> 1879 bytes plugins/_core/icqlite/14.png | Bin 0 -> 1649 bytes plugins/_core/icqlite/15.png | Bin 0 -> 1689 bytes plugins/_core/icqlite/16.png | Bin 0 -> 1668 bytes plugins/_core/icqlite/17.png | Bin 0 -> 2037 bytes plugins/_core/icqlite/18.png | Bin 0 -> 1837 bytes plugins/_core/icqlite/19.png | Bin 0 -> 1889 bytes plugins/_core/icqlite/2.png | Bin 0 -> 1641 bytes plugins/_core/icqlite/20.png | Bin 0 -> 1893 bytes plugins/_core/icqlite/21.png | Bin 0 -> 2007 bytes plugins/_core/icqlite/22.png | Bin 0 -> 1775 bytes plugins/_core/icqlite/23.png | Bin 0 -> 1636 bytes plugins/_core/icqlite/24.png | Bin 0 -> 1369 bytes plugins/_core/icqlite/25.png | Bin 0 -> 1801 bytes plugins/_core/icqlite/26.png | Bin 0 -> 1750 bytes plugins/_core/icqlite/27.png | Bin 0 -> 1724 bytes plugins/_core/icqlite/3.png | Bin 0 -> 1689 bytes plugins/_core/icqlite/4.png | Bin 0 -> 1704 bytes plugins/_core/icqlite/5.png | Bin 0 -> 1776 bytes plugins/_core/icqlite/6.png | Bin 0 -> 1612 bytes plugins/_core/icqlite/7.png | Bin 0 -> 1614 bytes plugins/_core/icqlite/8.png | Bin 0 -> 1741 bytes plugins/_core/icqlite/9.png | Bin 0 -> 1882 bytes plugins/_core/icqlite/icondef.xml | 149 + plugins/_core/interfacecfg.cpp | 351 + plugins/_core/interfacecfg.h | 58 + plugins/_core/interfacecfgbase.ui | 229 + plugins/_core/jisp/1downarrow.png | Bin 0 -> 133 bytes plugins/_core/jisp/1leftarrow.png | Bin 0 -> 135 bytes plugins/_core/jisp/1rightarrow.png | Bin 0 -> 139 bytes plugins/_core/jisp/1uparrow.png | Bin 0 -> 125 bytes plugins/_core/jisp/add.png | Bin 0 -> 175 bytes plugins/_core/jisp/aim.png | Bin 0 -> 478 bytes plugins/_core/jisp/alert.png | Bin 0 -> 230 bytes plugins/_core/jisp/auth.png | Bin 0 -> 242 bytes plugins/_core/jisp/away.png | Bin 0 -> 341 bytes plugins/_core/jisp/bgcolor.png | Bin 0 -> 352 bytes plugins/_core/jisp/birthday.png | Bin 0 -> 212 bytes plugins/_core/jisp/button_cancel.png | Bin 0 -> 686 bytes plugins/_core/jisp/button_ok.png | Bin 0 -> 632 bytes plugins/_core/jisp/cancel.png | Bin 0 -> 659 bytes plugins/_core/jisp/cell.png | Bin 0 -> 230 bytes plugins/_core/jisp/chat.png | Bin 0 -> 482 bytes plugins/_core/jisp/collapsed.png | Bin 0 -> 296 bytes plugins/_core/jisp/configure.png | Bin 0 -> 419 bytes plugins/_core/jisp/connect.png | Bin 0 -> 692 bytes plugins/_core/jisp/contacts.png | Bin 0 -> 238 bytes plugins/_core/jisp/dnd.png | Bin 0 -> 318 bytes plugins/_core/jisp/editcopy.png | Bin 0 -> 420 bytes plugins/_core/jisp/editcut.png | Bin 0 -> 232 bytes plugins/_core/jisp/editpaste.png | Bin 0 -> 731 bytes plugins/_core/jisp/empty.png | Bin 0 -> 85 bytes plugins/_core/jisp/encoding.png | Bin 0 -> 268 bytes plugins/_core/jisp/encrypted.png | Bin 0 -> 272 bytes plugins/_core/jisp/error.png | Bin 0 -> 208 bytes plugins/_core/jisp/exit.png | Bin 0 -> 252 bytes plugins/_core/jisp/expanded.png | Bin 0 -> 264 bytes plugins/_core/jisp/fax.png | Bin 0 -> 321 bytes plugins/_core/jisp/ffc.png | Bin 0 -> 283 bytes plugins/_core/jisp/fgcolor.png | Bin 0 -> 360 bytes plugins/_core/jisp/file.png | Bin 0 -> 343 bytes plugins/_core/jisp/fileclose.png | Bin 0 -> 606 bytes plugins/_core/jisp/fileopen.png | Bin 0 -> 528 bytes plugins/_core/jisp/filesave.png | Bin 0 -> 535 bytes plugins/_core/jisp/filter.png | Bin 0 -> 695 bytes plugins/_core/jisp/find.png | Bin 0 -> 637 bytes plugins/_core/jisp/floating.png | Bin 0 -> 251 bytes plugins/_core/jisp/gadu.png | Bin 0 -> 833 bytes plugins/_core/jisp/gadu_away.png | Bin 0 -> 859 bytes plugins/_core/jisp/gadu_dnd.png | Bin 0 -> 859 bytes plugins/_core/jisp/gadu_invisible.png | Bin 0 -> 839 bytes plugins/_core/jisp/gadu_na.png | Bin 0 -> 859 bytes plugins/_core/jisp/gadu_offline.png | Bin 0 -> 859 bytes plugins/_core/jisp/grp_collapse.png | Bin 0 -> 244 bytes plugins/_core/jisp/grp_create.png | Bin 0 -> 213 bytes plugins/_core/jisp/grp_expand.png | Bin 0 -> 262 bytes plugins/_core/jisp/grp_off.png | Bin 0 -> 260 bytes plugins/_core/jisp/grp_on.png | Bin 0 -> 182 bytes plugins/_core/jisp/grp_rename.png | Bin 0 -> 233 bytes plugins/_core/jisp/help.png | Bin 0 -> 986 bytes plugins/_core/jisp/history.png | Bin 0 -> 328 bytes plugins/_core/jisp/home.png | Bin 0 -> 292 bytes plugins/_core/jisp/icondef.xml | 363 + plugins/_core/jisp/icq.png | Bin 0 -> 369 bytes plugins/_core/jisp/icqphone.png | Bin 0 -> 169 bytes plugins/_core/jisp/icqphonebusy.png | Bin 0 -> 202 bytes plugins/_core/jisp/ignorelist.png | Bin 0 -> 297 bytes plugins/_core/jisp/info.png | Bin 0 -> 512 bytes plugins/_core/jisp/interest.png | Bin 0 -> 369 bytes plugins/_core/jisp/jabber.png | Bin 0 -> 308 bytes plugins/_core/jisp/license | 1 + plugins/_core/jisp/listmsg.png | Bin 0 -> 179 bytes plugins/_core/jisp/livejournal.png | Bin 0 -> 272 bytes plugins/_core/jisp/lunch.png | Bin 0 -> 220 bytes plugins/_core/jisp/mail_generic.png | Bin 0 -> 575 bytes plugins/_core/jisp/mailpager.png | Bin 0 -> 240 bytes plugins/_core/jisp/message.png | Bin 0 -> 380 bytes plugins/_core/jisp/more.png | Bin 0 -> 245 bytes plugins/_core/jisp/msn.png | Bin 0 -> 589 bytes plugins/_core/jisp/na.png | Bin 0 -> 370 bytes plugins/_core/jisp/network.png | Bin 0 -> 232 bytes plugins/_core/jisp/new.png | Bin 0 -> 495 bytes plugins/_core/jisp/nonim.png | Bin 0 -> 178 bytes plugins/_core/jisp/nophone.png | Bin 0 -> 336 bytes plugins/_core/jisp/nosound.png | Bin 0 -> 349 bytes plugins/_core/jisp/occupied.png | Bin 0 -> 377 bytes plugins/_core/jisp/onback.png | Bin 0 -> 191 bytes plugins/_core/jisp/online_off.png | Bin 0 -> 2896 bytes plugins/_core/jisp/online_on.png | Bin 0 -> 2944 bytes plugins/_core/jisp/onphone.png | Bin 0 -> 220 bytes plugins/_core/jisp/pager.png | Bin 0 -> 188 bytes plugins/_core/jisp/past.png | Bin 0 -> 267 bytes plugins/_core/jisp/phone.png | Bin 0 -> 229 bytes plugins/_core/jisp/pict.png | Bin 0 -> 236 bytes plugins/_core/jisp/redo.png | Bin 0 -> 351 bytes plugins/_core/jisp/register.png | Bin 0 -> 184 bytes plugins/_core/jisp/remove.png | Bin 0 -> 239 bytes plugins/_core/jisp/run.png | Bin 0 -> 878 bytes plugins/_core/jisp/security.png | Bin 0 -> 240 bytes plugins/_core/jisp/sharedfiles.png | Bin 0 -> 213 bytes plugins/_core/jisp/sim.png | Bin 0 -> 832 bytes plugins/_core/jisp/simcard.png | Bin 0 -> 173 bytes plugins/_core/jisp/sms.png | Bin 0 -> 414 bytes plugins/_core/jisp/sound.png | Bin 0 -> 298 bytes plugins/_core/jisp/text.png | Bin 0 -> 483 bytes plugins/_core/jisp/text_bold.png | Bin 0 -> 189 bytes plugins/_core/jisp/text_italic.png | Bin 0 -> 186 bytes plugins/_core/jisp/text_strike.png | Bin 0 -> 192 bytes plugins/_core/jisp/text_under.png | Bin 0 -> 215 bytes plugins/_core/jisp/translit.png | Bin 0 -> 204 bytes plugins/_core/jisp/typing.png | Bin 0 -> 233 bytes plugins/_core/jisp/undo.png | Bin 0 -> 379 bytes plugins/_core/jisp/urgentmsg.png | Bin 0 -> 133 bytes plugins/_core/jisp/url.png | Bin 0 -> 644 bytes plugins/_core/jisp/useroffline.png | Bin 0 -> 353 bytes plugins/_core/jisp/useronline.png | Bin 0 -> 355 bytes plugins/_core/jisp/userunknown.png | Bin 0 -> 363 bytes plugins/_core/jisp/web.png | Bin 0 -> 251 bytes plugins/_core/jisp/webpress.png | Bin 0 -> 293 bytes plugins/_core/jisp/work.png | Bin 0 -> 275 bytes plugins/_core/jisp/yahoo.png | Bin 0 -> 541 bytes plugins/_core/jisp/yahoo_away.png | Bin 0 -> 527 bytes plugins/_core/jisp/yahoo_dnd.png | Bin 0 -> 517 bytes plugins/_core/jisp/yahoo_offline.png | Bin 0 -> 546 bytes plugins/_core/libintl.cpp | 423 + plugins/_core/logindlg.cpp | 650 + plugins/_core/logindlg.h | 101 + plugins/_core/logindlgbase.ui | 224 + plugins/_core/maininfo.cpp | 620 + plugins/_core/maininfo.h | 65 + plugins/_core/maininfobase.ui | 382 + plugins/_core/mainwin.cpp | 266 + plugins/_core/mainwin.h | 71 + plugins/_core/manager.cpp | 163 + plugins/_core/manager.h | 51 + plugins/_core/managerbase.ui | 150 + plugins/_core/msgauth.cpp | 104 + plugins/_core/msgauth.h | 43 + plugins/_core/msgcfg.cpp | 71 + plugins/_core/msgcfg.h | 38 + plugins/_core/msgcfgbase.ui | 85 + plugins/_core/msgcontacts.cpp | 153 + plugins/_core/msgcontacts.h | 48 + plugins/_core/msgedit.cpp | 1683 ++ plugins/_core/msgedit.h | 140 + plugins/_core/msgfile.cpp | 215 + plugins/_core/msgfile.h | 45 + plugins/_core/msggen.cpp | 126 + plugins/_core/msggen.h | 44 + plugins/_core/msgrecv.cpp | 209 + plugins/_core/msgrecv.h | 44 + plugins/_core/msgsms.cpp | 309 + plugins/_core/msgsms.h | 60 + plugins/_core/msgurl.cpp | 159 + plugins/_core/msgurl.h | 43 + plugins/_core/msgview.cpp | 1466 ++ plugins/_core/msgview.h | 92 + plugins/_core/msgview_menu.cpp | 88 + plugins/_core/newprotocol.cpp | 242 + plugins/_core/newprotocol.h | 73 + plugins/_core/newprotocolbase.ui | 65 + plugins/_core/nonim.cpp | 76 + plugins/_core/nonim.h | 43 + plugins/_core/nonimbase.ui | 117 + plugins/_core/pagerbase.ui | 106 + plugins/_core/pagerdetails.cpp | 89 + plugins/_core/pagerdetails.h | 38 + plugins/_core/phonebase.ui | 201 + plugins/_core/phonedetails.cpp | 134 + plugins/_core/phonedetails.h | 41 + plugins/_core/pict/CMakeLists.txt | 7 + plugins/_core/pict/connect.gif | Bin 0 -> 14947 bytes plugins/_core/pict/connect.mng | Bin 0 -> 14659 bytes plugins/_core/plugincfg.cpp | 76 + plugins/_core/plugincfg.h | 37 + plugins/_core/plugincfgbase.ui | 74 + plugins/_core/prefcfg.cpp | 138 + plugins/_core/prefcfg.h | 48 + plugins/_core/prefcfgbase.ui | 54 + plugins/_core/search.cpp | 854 ++ plugins/_core/search.h | 115 + plugins/_core/searchall.cpp | 184 + plugins/_core/searchall.h | 59 + plugins/_core/searchallbase.ui | 131 + plugins/_core/searchbase.ui | 99 + plugins/_core/smiles/Angel.png | Bin 0 -> 864 bytes plugins/_core/smiles/Angry.png | Bin 0 -> 1182 bytes plugins/_core/smiles/Annoyed.png | Bin 0 -> 1102 bytes plugins/_core/smiles/Cool.png | Bin 0 -> 970 bytes plugins/_core/smiles/Crying.png | Bin 0 -> 1056 bytes plugins/_core/smiles/Embarrassed.png | Bin 0 -> 1136 bytes plugins/_core/smiles/Grin.png | Bin 0 -> 1008 bytes plugins/_core/smiles/Indifferent.png | Bin 0 -> 1103 bytes plugins/_core/smiles/Kiss.png | Bin 0 -> 1062 bytes plugins/_core/smiles/Sad.png | Bin 0 -> 1166 bytes plugins/_core/smiles/Skeptical.png | Bin 0 -> 1129 bytes plugins/_core/smiles/Smile.png | Bin 0 -> 1142 bytes plugins/_core/smiles/Surprised.png | Bin 0 -> 1089 bytes plugins/_core/smiles/Teaser.png | Bin 0 -> 1132 bytes plugins/_core/smiles/Uptight.png | Bin 0 -> 990 bytes plugins/_core/smiles/Wink.png | Bin 0 -> 1079 bytes plugins/_core/smiles/icondef.xml | 97 + plugins/_core/smscfg.cpp | 37 + plugins/_core/smscfg.h | 34 + plugins/_core/smscfgbase.ui | 59 + plugins/_core/status.cpp | 554 + plugins/_core/status.h | 68 + plugins/_core/statuswnd.cpp | 388 + plugins/_core/statuswnd.h | 98 + plugins/_core/styles/CMakeLists.txt | 30 + plugins/_core/styles/SIM.2.xsl | 70 + plugins/_core/styles/SIM.3.xsl | 54 + plugins/_core/styles/SIM.4.(2+3).xsl | 57 + plugins/_core/styles/SIM.5.2.2.xsl | 160 + plugins/_core/styles/SIM.5.2.3.xsl | 160 + plugins/_core/styles/SIM.5.2.4.xsl | 167 + plugins/_core/styles/SIM.5.2.5.xsl | 167 + plugins/_core/styles/SIM.5.2.xsl | 160 + plugins/_core/styles/SIM.5.xsl | 162 + plugins/_core/styles/SIM.xsl | 64 + plugins/_core/styles/Separated.2.xsl | 71 + plugins/_core/styles/Separated.3.xsl | 54 + plugins/_core/styles/Separated.4.xsl | 67 + plugins/_core/styles/Separated.5.(2+3).xsl | 54 + plugins/_core/styles/Separated.6.(2+4).xsl | 70 + plugins/_core/styles/Separated.7.(3+4).xsl | 53 + plugins/_core/styles/Separated.8.(2+3+4).xsl | 53 + plugins/_core/styles/Separated.xsl | 68 + plugins/_core/styles/XChat.xsl | 47 + plugins/_core/styles/XChat2seconds.xsl | 47 + plugins/_core/styles/XChat3fullDate.xsl | 47 + plugins/_core/textedit_menu.cpp | 138 + plugins/_core/tmpl.cpp | 268 + plugins/_core/tmpl.h | 55 + plugins/_core/toolbar_container.cpp | 143 + plugins/_core/toolbar_history.cpp | 85 + plugins/_core/toolbar_main.cpp | 356 + plugins/_core/toolbar_msgedit.cpp | 196 + plugins/_core/toolbar_textedit.cpp | 88 + plugins/_core/toolbarcfg.cpp | 52 + plugins/_core/toolbarcfg.h | 38 + plugins/_core/toolsetup.cpp | 258 + plugins/_core/toolsetup.h | 53 + plugins/_core/toolsetupbase.ui | 256 + plugins/_core/usercfg.cpp | 624 + plugins/_core/usercfg.h | 60 + plugins/_core/userhistorycfg.cpp | 70 + plugins/_core/userhistorycfg.h | 40 + plugins/_core/userhistorycfgbase.ui | 158 + plugins/_core/userlist.cpp | 1162 ++ plugins/_core/userlist.h | 173 + plugins/_core/userview.cpp | 1419 ++ plugins/_core/userview.h | 107 + plugins/_core/userviewcfg.cpp | 240 + plugins/_core/userviewcfg.h | 44 + plugins/_core/userviewcfgbase.ui | 475 + plugins/_core/userviewdelegate.cpp | 289 + plugins/_core/userviewdelegate.h | 25 + plugins/_core/userwnd.cpp | 340 + plugins/_core/userwnd.h | 87 + plugins/about/CMakeLists.txt | 24 + plugins/about/about.cpp | 157 + plugins/about/about.h | 49 + plugins/about/about.rc | 97 + plugins/about/about.vcproj | 438 + plugins/about/aboutdlg.cpp | 152 + plugins/about/aboutdlg.h | 47 + plugins/about/aboutdlgbase.ui | 194 + plugins/action/CMakeLists.txt | 29 + plugins/action/action.cpp | 306 + plugins/action/action.h | 57 + plugins/action/action.rc | 97 + plugins/action/action.vcproj | 592 + plugins/action/actioncfg.cpp | 160 + plugins/action/actioncfg.h | 48 + plugins/action/actioncfgbase.ui | 97 + plugins/action/additem.cpp | 64 + plugins/action/additem.h | 35 + plugins/action/additembase.ui | 171 + plugins/action/menucfg.cpp | 116 + plugins/action/menucfg.h | 44 + plugins/action/menucfgbase.ui | 109 + plugins/action/resource.h | 18 + plugins/autoaway/CMakeLists.txt | 70 + plugins/autoaway/autoaway.cpp | 390 + plugins/autoaway/autoaway.h | 70 + plugins/autoaway/autoaway.rc | 97 + plugins/autoaway/autoaway.vcproj | 418 + plugins/autoaway/autoawaycfg.cpp | 72 + plugins/autoaway/autoawaycfg.h | 40 + plugins/autoaway/autoawaycfgbase.ui | 141 + plugins/autoaway/configure.in.in | 24 + plugins/autoaway/idleui.cpp | 177 + plugins/autoaway/idleui.def | 6 + plugins/autoaway/idleui.h | 10 + plugins/autoaway/idleui.rc | 97 + plugins/autoaway/idleui.vcproj | 265 + plugins/background/CMakeLists.txt | 23 + plugins/background/background.cpp | 177 + plugins/background/background.h | 63 + plugins/background/background.rc | 97 + plugins/background/background.vcproj | 369 + plugins/background/bkgndcfg.cpp | 100 + plugins/background/bkgndcfg.h | 37 + plugins/background/bkgndcfgbase.ui | 257 + plugins/dock/CMakeLists.txt | 22 + plugins/dock/dock.cpp | 394 + plugins/dock/dock.h | 77 + plugins/dock/dock.rc | 97 + plugins/dock/dock.vcproj | 477 + plugins/dock/dockcfg.cpp | 68 + plugins/dock/dockcfg.h | 39 + plugins/dock/dockcfgbase.ui | 177 + plugins/dock/dockwnd.cpp | 383 + plugins/dock/dockwnd.h | 90 + plugins/filter/CMakeLists.txt | 23 + plugins/filter/filter.cpp | 429 + plugins/filter/filter.h | 68 + plugins/filter/filter.rc | 97 + plugins/filter/filter.vcproj | 500 + plugins/filter/filtercfg.cpp | 75 + plugins/filter/filtercfg.h | 46 + plugins/filter/filtercfgbase.ui | 74 + plugins/filter/ignorelist.cpp | 238 + plugins/filter/ignorelist.h | 46 + plugins/filter/ignorelistbase.ui | 73 + plugins/flash/flash_win32.zip | Bin 0 -> 16440 bytes plugins/flash/flash_win32/FlashWnd.cpp | 156 + plugins/flash/flash_win32/FlashWnd.h | 1018 ++ plugins/flash/flash_win32/StdAfx.cpp | 8 + plugins/flash/flash_win32/StdAfx.h | 47 + plugins/flash/flash_win32/flash.cpp | 246 + plugins/flash/flash_win32/flash.h | 23 + plugins/flash/flash_win32/flash.ico | Bin 0 -> 1078 bytes plugins/flash/flash_win32/flash.rc | 135 + plugins/flash/flash_win32/flash.sln | 20 + plugins/flash/flash_win32/flash.vcproj | 335 + plugins/flash/flash_win32/resource.h | 27 + plugins/flash/flash_win32/small.ico | Bin 0 -> 318 bytes plugins/floaty/CMakeLists.txt | 23 + plugins/floaty/floaty.cpp | 250 + plugins/floaty/floaty.h | 63 + plugins/floaty/floaty.rc | 97 + plugins/floaty/floaty.vcproj | 374 + plugins/floaty/floatywnd.cpp | 560 + plugins/floaty/floatywnd.h | 77 + plugins/forward/CMakeLists.txt | 28 + plugins/forward/forward.cpp | 208 + plugins/forward/forward.h | 52 + plugins/forward/forward.rc | 97 + plugins/forward/forward.vcproj | 369 + plugins/forward/forwardcfg.cpp | 62 + plugins/forward/forwardcfg.h | 40 + plugins/forward/forwardcfgbase.ui | 112 + plugins/gpg/CMakeLists.txt | 41 + plugins/gpg/configure.in.in | 5 + plugins/gpg/gpg.cpp | 998 ++ plugins/gpg/gpg.h | 123 + plugins/gpg/gpg.rc | 97 + plugins/gpg/gpg.vcproj | 761 + plugins/gpg/gpg_pch.h | 46 + plugins/gpg/gpgadv.cpp | 51 + plugins/gpg/gpgadv.h | 38 + plugins/gpg/gpgadvbase.ui | 164 + plugins/gpg/gpgcfg.cpp | 244 + plugins/gpg/gpgcfg.h | 57 + plugins/gpg/gpgcfgbase.ui | 222 + plugins/gpg/gpgfind.cpp | 116 + plugins/gpg/gpgfind.h | 51 + plugins/gpg/gpgfindbase.ui | 86 + plugins/gpg/gpggen.cpp | 188 + plugins/gpg/gpggen.h | 42 + plugins/gpg/gpggenbase.ui | 210 + plugins/gpg/gpguser.cpp | 120 + plugins/gpg/gpguser.h | 43 + plugins/gpg/gpguserbase.ui | 98 + plugins/gpg/passphrase.cpp | 70 + plugins/gpg/passphrase.h | 44 + plugins/gpg/passphrasebase.ui | 111 + plugins/gpg/resource.h | 18 + plugins/icons/CMakeLists.txt | 23 + plugins/icons/icon.cpp | 129 + plugins/icons/icon.h | 46 + plugins/icons/iconcfg.cpp | 132 + plugins/icons/iconcfg.h | 43 + plugins/icons/iconcfgbase.ui | 84 + plugins/icons/icons.rc | 97 + plugins/icons/icons.vcproj | 372 + plugins/icq/CMakeLists.txt | 105 + plugins/icq/aboutinfo.cpp | 83 + plugins/icq/aboutinfo.h | 45 + plugins/icq/aboutinfobase.ui | 57 + plugins/icq/advsearch.cpp | 64 + plugins/icq/advsearch.h | 36 + plugins/icq/advsearchbase.ui | 328 + plugins/icq/aimconfig.cpp | 95 + plugins/icq/aimconfig.h | 44 + plugins/icq/aimconfigbase.ui | 251 + plugins/icq/aiminfo.cpp | 227 + plugins/icq/aiminfo.h | 44 + plugins/icq/aiminfobase.ui | 430 + plugins/icq/aimsearch.cpp | 36 + plugins/icq/aimsearch.h | 36 + plugins/icq/aimsearchbase.ui | 221 + plugins/icq/aimservices.cpp | 430 + plugins/icq/configure.in.in | 5 + plugins/icq/encodingdlg.cpp | 92 + plugins/icq/encodingdlg.h | 38 + plugins/icq/encodingdlgbase.ui | 126 + plugins/icq/homeinfo.cpp | 134 + plugins/icq/homeinfo.h | 47 + plugins/icq/homeinfobase.ui | 242 + plugins/icq/icq.cpp | 439 + plugins/icq/icq.h | 95 + plugins/icq/icq.rc | 97 + plugins/icq/icq.vcproj | 2669 ++++ plugins/icq/icq_events.h | 33 + plugins/icq/icq_pch.h | 61 + plugins/icq/icqbos.cpp | 46 + plugins/icq/icqbuddy.cpp | 640 + plugins/icq/icqbuddy.h | 20 + plugins/icq/icqbuffer.cpp | 539 + plugins/icq/icqbuffer.h | 152 + plugins/icq/icqclient.cpp | 3568 +++++ plugins/icq/icqclient.h | 987 ++ plugins/icq/icqconfig.cpp | 155 + plugins/icq/icqconfig.h | 47 + plugins/icq/icqconfigbase.ui | 509 + plugins/icq/icqdirect.cpp | 3039 ++++ plugins/icq/icqdirect.h | 199 + plugins/icq/icqicmb.cpp | 2575 ++++ plugins/icq/icqicmb.h | 106 + plugins/icq/icqinfo.cpp | 275 + plugins/icq/icqinfo.h | 46 + plugins/icq/icqinfobase.ui | 841 + plugins/icq/icqlists.cpp | 1812 +++ plugins/icq/icqlocation.cpp | 648 + plugins/icq/icqlocation.h | 18 + plugins/icq/icqlogin.cpp | 398 + plugins/icq/icqmessage.cpp | 1593 ++ plugins/icq/icqmessage.h | 142 + plugins/icq/icqpicture.cpp | 152 + plugins/icq/icqpicture.h | 50 + plugins/icq/icqpicturebase.ui | 123 + plugins/icq/icqping.cpp | 40 + plugins/icq/icqsearch.cpp | 477 + plugins/icq/icqsearch.h | 104 + plugins/icq/icqsearchbase.ui | 228 + plugins/icq/icqsecure.cpp | 228 + plugins/icq/icqsecure.h | 49 + plugins/icq/icqsecurebase.ui | 170 + plugins/icq/icqservice.cpp | 723 + plugins/icq/icqservice.h | 47 + plugins/icq/icqssbi.cpp | 358 + plugins/icq/icqssbi.h | 32 + plugins/icq/icqstatus.cpp | 63 + plugins/icq/icqstatus.h | 38 + plugins/icq/icqvarious.cpp | 1833 +++ plugins/icq/interestsinfo.cpp | 244 + plugins/icq/interestsinfo.h | 46 + plugins/icq/interestsinfobase.ui | 129 + plugins/icq/moreinfo.cpp | 258 + plugins/icq/moreinfo.h | 48 + plugins/icq/moreinfobase.ui | 335 + plugins/icq/pastinfo.cpp | 311 + plugins/icq/pastinfo.h | 49 + plugins/icq/pastinfobase.ui | 185 + plugins/icq/polling.cpp | 401 + plugins/icq/polling.h | 78 + plugins/icq/rtf.ll | 1044 ++ plugins/icq/rtfgen.cpp | 1112 ++ plugins/icq/securedlg.cpp | 109 + plugins/icq/securedlg.h | 45 + plugins/icq/securedlgbase.ui | 110 + plugins/icq/snac.cpp | 22 + plugins/icq/snac.h | 25 + plugins/icq/verifydlg.cpp | 55 + plugins/icq/verifydlg.h | 41 + plugins/icq/verifydlgbase.ui | 262 + plugins/icq/warndlg.cpp | 99 + plugins/icq/warndlg.h | 43 + plugins/icq/warndlgbase.ui | 128 + plugins/icq/workinfo.cpp | 159 + plugins/icq/workinfo.h | 46 + plugins/icq/workinfobase.ui | 275 + plugins/icq/xml.cpp | 219 + plugins/icq/xml.h | 94 + plugins/jabber/CMakeLists.txt | 68 + plugins/jabber/discoinfo.cpp | 310 + plugins/jabber/discoinfo.h | 65 + plugins/jabber/discoinfobase.ui | 522 + plugins/jabber/httppoll.cpp | 184 + plugins/jabber/infoproxy.cpp | 49 + plugins/jabber/infoproxy.h | 38 + plugins/jabber/infoproxybase.ui | 61 + plugins/jabber/jabber.cpp | 423 + plugins/jabber/jabber.h | 107 + plugins/jabber/jabber.rc | 97 + plugins/jabber/jabber.vcproj | 1635 ++ plugins/jabber/jabber_auth.cpp | 112 + plugins/jabber/jabber_events.h | 116 + plugins/jabber/jabber_pch.h | 55 + plugins/jabber/jabber_rosters.cpp | 2893 ++++ plugins/jabber/jabber_ssl.cpp | 27 + plugins/jabber/jabber_ssl.h | 35 + plugins/jabber/jabberaboutinfo.cpp | 83 + plugins/jabber/jabberaboutinfo.h | 44 + plugins/jabber/jabberaboutinfobase.ui | 40 + plugins/jabber/jabberadd.cpp | 492 + plugins/jabber/jabberadd.h | 98 + plugins/jabber/jabberaddbase.ui | 145 + plugins/jabber/jabberbrowser.cpp | 1023 ++ plugins/jabber/jabberbrowser.h | 133 + plugins/jabber/jabberbuffer.cpp | 52 + plugins/jabber/jabberbuffer.h | 51 + plugins/jabber/jabberclient.cpp | 2816 ++++ plugins/jabber/jabberclient.h | 541 + plugins/jabber/jabberconfig.cpp | 195 + plugins/jabber/jabberconfig.h | 47 + plugins/jabber/jabberconfigbase.ui | 605 + plugins/jabber/jabberfiletransfer.cpp | 469 + plugins/jabber/jabberhomeinfo.cpp | 102 + plugins/jabber/jabberhomeinfo.h | 43 + plugins/jabber/jabberhomeinfobase.ui | 126 + plugins/jabber/jabberinfo.cpp | 261 + plugins/jabber/jabberinfo.h | 48 + plugins/jabber/jabberinfobase.ui | 441 + plugins/jabber/jabbermessage.cpp | 243 + plugins/jabber/jabbermessage.h | 91 + plugins/jabber/jabberpicture.cpp | 178 + plugins/jabber/jabberpicture.h | 50 + plugins/jabber/jabberpicturebase.ui | 123 + plugins/jabber/jabbersearch.cpp | 721 + plugins/jabber/jabbersearch.h | 93 + plugins/jabber/jabberstatus.cpp | 78 + plugins/jabber/jabberstatus.h | 44 + plugins/jabber/jabberworkinfo.cpp | 96 + plugins/jabber/jabberworkinfo.h | 43 + plugins/jabber/jabberworkinfobase.ui | 132 + plugins/jabber/jidadvsearch.cpp | 38 + plugins/jabber/jidadvsearch.h | 37 + plugins/jabber/jidadvsearchbase.ui | 76 + plugins/jabber/jidsearch.cpp | 202 + plugins/jabber/jidsearch.h | 63 + plugins/jabber/jidsearchbase.ui | 87 + plugins/livejournal/CMakeLists.txt | 26 + plugins/livejournal/configure.in.in | 4 + plugins/livejournal/journalsearch.cpp | 49 + plugins/livejournal/journalsearch.h | 44 + plugins/livejournal/journalsearchbase.ui | 55 + plugins/livejournal/livejournal.cpp | 1492 ++ plugins/livejournal/livejournal.h | 196 + plugins/livejournal/livejournal.rc | 97 + plugins/livejournal/livejournal.vcproj | 601 + plugins/livejournal/livejournalcfg.cpp | 99 + plugins/livejournal/livejournalcfg.h | 46 + plugins/livejournal/livejournalcfgbase.ui | 301 + plugins/livejournal/msgjournal.cpp | 212 + plugins/livejournal/msgjournal.h | 60 + plugins/livejournal/msgjournalbase.ui | 142 + plugins/logger/CMakeLists.txt | 21 + plugins/logger/logconfig.cpp | 119 + plugins/logger/logconfig.h | 41 + plugins/logger/logconfigbase.ui | 71 + plugins/logger/logger.cpp | 249 + plugins/logger/logger.h | 63 + plugins/logger/logger.rc | 97 + plugins/logger/logger.vcproj | 411 + plugins/msn/CMakeLists.txt | 33 + plugins/msn/configure.in.in | 5 + plugins/msn/msn.cpp | 232 + plugins/msn/msn.h | 50 + plugins/msn/msn.rc | 97 + plugins/msn/msn.vcproj | 748 + plugins/msn/msn_pch.h | 47 + plugins/msn/msnclient.cpp | 2757 ++++ plugins/msn/msnclient.h | 329 + plugins/msn/msnconfig.cpp | 95 + plugins/msn/msnconfig.h | 47 + plugins/msn/msnconfigbase.ui | 358 + plugins/msn/msnfiletransfer.cpp | 407 + plugins/msn/msnhttp.cpp | 172 + plugins/msn/msnhttp.h | 54 + plugins/msn/msninfo.cpp | 128 + plugins/msn/msninfo.h | 44 + plugins/msn/msninfobase.ui | 225 + plugins/msn/msnpacket.cpp | 530 + plugins/msn/msnpacket.h | 164 + plugins/msn/msnsearch.cpp | 61 + plugins/msn/msnsearch.h | 45 + plugins/msn/msnsearchbase.ui | 68 + plugins/navigate/CMakeLists.txt | 25 + plugins/navigate/navcfg.cpp | 74 + plugins/navigate/navcfg.h | 39 + plugins/navigate/navcfgbase.ui | 108 + plugins/navigate/navigate.cpp | 623 + plugins/navigate/navigate.h | 54 + plugins/navigate/navigate.rc | 97 + plugins/navigate/navigate.vcproj | 416 + plugins/navigate/parseurl.ll | 114 + plugins/netmonitor/CMakeLists.txt | 21 + plugins/netmonitor/monitor.cpp | 279 + plugins/netmonitor/monitor.h | 71 + plugins/netmonitor/netmonitor.cpp | 198 + plugins/netmonitor/netmonitor.h | 74 + plugins/netmonitor/netmonitor.vcproj | 349 + plugins/ontop/CMakeLists.txt | 23 + plugins/ontop/configure.in.in | 1 + plugins/ontop/ontop.cpp | 346 + plugins/ontop/ontop.h | 101 + plugins/ontop/ontop.rc | 97 + plugins/ontop/ontop.vcproj | 406 + plugins/ontop/ontopcfg.cpp | 37 + plugins/ontop/ontopcfg.h | 37 + plugins/ontop/ontopcfgbase.ui | 82 + plugins/osd/CMakeLists.txt | 24 + plugins/osd/osd.cpp | 847 + plugins/osd/osd.h | 129 + plugins/osd/osd.rc | 97 + plugins/osd/osd.vcproj | 499 + plugins/osd/osdconfig.cpp | 116 + plugins/osd/osdconfig.h | 44 + plugins/osd/osdconfigbase.ui | 163 + plugins/osd/osdiface.cpp | 120 + plugins/osd/osdiface.h | 40 + plugins/osd/osdifacebase.ui | 201 + plugins/proxy/CMakeLists.txt | 28 + plugins/proxy/proxy.cpp | 1311 ++ plugins/proxy/proxy.h | 87 + plugins/proxy/proxy.rc | 97 + plugins/proxy/proxy.vcproj | 451 + plugins/proxy/proxycfg.cpp | 245 + plugins/proxy/proxycfg.h | 53 + plugins/proxy/proxycfgbase.ui | 189 + plugins/proxy/proxyerror.cpp | 79 + plugins/proxy/proxyerror.h | 43 + plugins/proxy/proxyerrorbase.ui | 129 + plugins/remote/CMakeLists.txt | 78 + plugins/remote/IContextMenuImpl.h | 49 + plugins/remote/IShellExtInitImpl.h | 26 + plugins/remote/SIM_ext.cpp | 391 + plugins/remote/SIM_ext.h | 129 + plugins/remote/SIM_ext.rgs | 45 + plugins/remote/SimControl.cpp | 184 + plugins/remote/SimControl.h | 35 + plugins/remote/SimControl.rgs | 26 + plugins/remote/configure.in.in | 1 + plugins/remote/remote.cpp | 1080 ++ plugins/remote/remote.h | 89 + plugins/remote/remote.rc | 97 + plugins/remote/remote.vcproj | 407 + plugins/remote/remotecfg.cpp | 113 + plugins/remote/remotecfg.h | 39 + plugins/remote/remotecfgbase.ui | 128 + plugins/remote/resource.h | 21 + plugins/remote/sim_remote.cpp | 83 + plugins/remote/simctrl.cpp | 477 + plugins/remote/simctrl.desktop | 11 + plugins/remote/simctrl.vcproj | 232 + plugins/remote/simext.cpp | 76 + plugins/remote/simext.def | 9 + plugins/remote/simext.idl | 38 + plugins/remote/simext.rc | 140 + plugins/remote/simext.vcproj | 331 + plugins/remote/simipc.cpp | 29 + plugins/remote/simipc.vcproj | 240 + plugins/remote/simremote.def | 9 + plugins/remote/simremote.idl | 38 + plugins/remote/simremote.rc | 140 + plugins/remote/simremote.vcproj | 333 + plugins/remote/x-icq.desktop | 51 + plugins/replace/CMakeLists.txt | 20 + plugins/replace/replace.cpp | 172 + plugins/replace/replace.h | 50 + plugins/replace/replace.rc | 97 + plugins/replace/replace.vcproj | 412 + plugins/replace/replacecfg.cpp | 111 + plugins/replace/replacecfg.h | 46 + plugins/replace/replacecfgbase.ui | 68 + plugins/shortcuts/CMakeLists.txt | 23 + plugins/shortcuts/configure.in.in | 1 + plugins/shortcuts/mousecfg.cpp | 184 + plugins/shortcuts/mousecfg.h | 45 + plugins/shortcuts/mousecfgbase.ui | 95 + plugins/shortcuts/shortcutcfg.cpp | 259 + plugins/shortcuts/shortcutcfg.h | 49 + plugins/shortcuts/shortcutcfgbase.ui | 109 + plugins/shortcuts/shortcuts.cpp | 870 ++ plugins/shortcuts/shortcuts.h | 122 + plugins/shortcuts/shortcuts.rc | 97 + plugins/shortcuts/shortcuts.vcproj | 499 + plugins/skype/call_end | 4 + plugins/skype/call_start | 5 + plugins/skype/icons/cr16-action-call.png | Bin 0 -> 170 bytes .../icons/cr16-action-contact_ffc_overlay.png | Bin 0 -> 884 bytes .../skype/icons/cr16-app-skype_protocol.png | Bin 0 -> 379 bytes plugins/skype/icons/cr22-action-call.png | Bin 0 -> 515 bytes plugins/skype/icons/cr32-action-call.png | Bin 0 -> 1017 bytes plugins/skype/icons/hi16-action-call.png | Bin 0 -> 170 bytes .../icons/hi16-action-contact_ffc_overlay.png | Bin 0 -> 702 bytes .../hi16-action-contact_unknown_overlay.png | Bin 0 -> 159 bytes .../skype/icons/hi16-action-skype_connect.png | Bin 0 -> 144 bytes plugins/skype/icons/icondef.xml | 48 + plugins/skype/libskype/skype.cpp | 797 + plugins/skype/libskype/skype.h | 466 + .../skype/libskype/skypedbus/connection.cpp | 426 + plugins/skype/libskype/skypedbus/connection.h | 95 + .../skype/libskype/skypedbus/integrator.cpp | 450 + plugins/skype/libskype/skypedbus/integrator.h | 94 + plugins/skype/libskype/skypedbus/message.cpp | 738 + plugins/skype/libskype/skypedbus/message.h | 136 + .../libskype/skypedbus/skypeconnection.cpp | 391 + .../libskype/skypedbus/skypeconnection.h | 171 + plugins/skype/skypeaccount.cpp | 828 + plugins/skype/skypeaccount.h | 509 + plugins/skype/skypeaddcontact.cpp | 93 + plugins/skype/skypeaddcontact.h | 66 + plugins/skype/skypeaddcontactbase.ui | 144 + plugins/skype/skypecalldialog.cpp | 295 + plugins/skype/skypecalldialog.h | 103 + plugins/skype/skypecalldialogbase.ui | 300 + plugins/skype/skypechatsession.cpp | 222 + plugins/skype/skypechatsession.h | 133 + plugins/skype/skypeconference.cpp | 76 + plugins/skype/skypeconference.h | 64 + plugins/skype/skypecontact.cpp | 421 + plugins/skype/skypecontact.h | 150 + plugins/skype/skypedetails.cpp | 88 + plugins/skype/skypedetails.h | 76 + plugins/skype/skypedetailsbase.ui | 277 + plugins/skype/skypeeditaccount.cpp | 158 + plugins/skype/skypeeditaccount.h | 65 + plugins/skype/skypeeditaccountbase.ui | 1125 ++ plugins/skype/skypeeditaccountwidget.cpp | 17 + plugins/skype/skypeprotocol.cpp | 194 + plugins/skype/skypeprotocol.h | 133 + plugins/sms/CMakeLists.txt | 31 + plugins/sms/gsm_ta.cpp | 680 + plugins/sms/gsm_ta.h | 137 + plugins/sms/serial.cpp | 646 + plugins/sms/serial.h | 52 + plugins/sms/sms.cpp | 638 + plugins/sms/sms.h | 133 + plugins/sms/sms.rc | 97 + plugins/sms/sms.vcproj | 550 + plugins/sms/smssetup.cpp | 89 + plugins/sms/smssetup.h | 45 + plugins/sms/smssetupbase.ui | 304 + plugins/sms/xpm/simcard.xpm | 23 + plugins/sound/CMakeLists.txt | 53 + plugins/sound/ogg.rules | 19 + plugins/sound/sound.cpp | 287 + plugins/sound/sound.h | 69 + plugins/sound/sound.rc | 97 + plugins/sound/sound.vcproj | 613 + plugins/sound/soundconfig.cpp | 78 + plugins/sound/soundconfig.h | 44 + plugins/sound/soundconfigbase.ui | 98 + plugins/sound/sounds/added.ogg | Bin 0 -> 103653 bytes plugins/sound/sounds/alert.ogg | Bin 0 -> 51573 bytes plugins/sound/sounds/auth.ogg | Bin 0 -> 62278 bytes plugins/sound/sounds/authrequest.ogg | Bin 0 -> 35026 bytes plugins/sound/sounds/contactrequest.ogg | Bin 0 -> 73699 bytes plugins/sound/sounds/contacts.ogg | Bin 0 -> 43265 bytes plugins/sound/sounds/deleted.ogg | Bin 0 -> 40432 bytes plugins/sound/sounds/error.ogg | Bin 0 -> 118424 bytes plugins/sound/sounds/file.ogg | Bin 0 -> 233051 bytes plugins/sound/sounds/filedone.ogg | Bin 0 -> 56595 bytes plugins/sound/sounds/mailpager.ogg | Bin 0 -> 15276 bytes plugins/sound/sounds/message.ogg | Bin 0 -> 23038 bytes plugins/sound/sounds/msgsent.ogg | Bin 0 -> 44235 bytes plugins/sound/sounds/refused.ogg | Bin 0 -> 31343 bytes plugins/sound/sounds/sms.ogg | Bin 0 -> 12125 bytes plugins/sound/sounds/startup.ogg | Bin 0 -> 360957 bytes plugins/sound/sounds/startup2.ogg | Bin 0 -> 238643 bytes plugins/sound/sounds/startup3.ogg | Bin 0 -> 486525 bytes plugins/sound/sounds/url.ogg | Bin 0 -> 51421 bytes plugins/sound/sounds/vip-online.ogg | Bin 0 -> 25044 bytes plugins/sound/sounds/web.ogg | Bin 0 -> 29196 bytes plugins/sound/sounduser.cpp | 139 + plugins/sound/sounduser.h | 44 + plugins/sound/sounduserbase.ui | 89 + plugins/spell/CMakeLists.txt | 53 + plugins/spell/configure.in.in | 17 + plugins/spell/spell.cpp | 330 + plugins/spell/spell.h | 87 + plugins/spell/spell.rc | 97 + plugins/spell/spell.vcproj | 596 + plugins/spell/spellcfg.cpp | 137 + plugins/spell/spellcfg.h | 48 + plugins/spell/spellcfgbase.ui | 98 + plugins/spell/speller.cpp | 229 + plugins/spell/speller.h | 88 + plugins/spell/spellfind.cpp | 121 + plugins/spell/spellfind.h | 48 + plugins/spell/spellfindbase.ui | 86 + plugins/spell/spellhighlight.cpp | 158 + plugins/spell/spellhighlight.h | 44 + plugins/splash/CMakeLists.txt | 20 + plugins/splash/SIM-IM.svg | 976 ++ plugins/splash/simsvg-template.png | Bin 0 -> 5797 bytes plugins/splash/splash.cpp | 119 + plugins/splash/splash.h | 46 + plugins/splash/splash.png | Bin 0 -> 6386 bytes plugins/splash/splash.vcproj | 300 + plugins/styles/CMakeLists.txt | 27 + plugins/styles/fontconfig.cpp | 112 + plugins/styles/fontconfig.h | 40 + plugins/styles/fontconfigbase.ui | 151 + plugins/styles/metal/CMakeLists.txt | 31 + plugins/styles/metal/marble.xpm | 470 + plugins/styles/metal/metal.cpp | 523 + plugins/styles/metal/metal.h | 73 + plugins/styles/metal/metal.rc | 97 + plugins/styles/metal/metal.vcproj | 264 + plugins/styles/metal/metal.xpm | 130 + plugins/styles/metal/stone1.xpm | 353 + plugins/styles/metal/stonebright.xpm | 353 + plugins/styles/metal/stonedark.xpm | 353 + plugins/styles/styles.cpp | 164 + plugins/styles/styles.h | 58 + plugins/styles/styles.rc | 97 + plugins/styles/styles.vcproj | 466 + plugins/styles/stylescfg.cpp | 64 + plugins/styles/stylescfg.h | 41 + plugins/styles/stylescfgbase.ui | 34 + plugins/styles/wood/CMakeLists.txt | 31 + plugins/styles/wood/wood.cpp | 1452 ++ plugins/styles/wood/wood.h | 91 + plugins/styles/wood/wood.rc | 97 + plugins/styles/wood/wood.vcproj | 266 + plugins/transparent/CMakeLists.txt | 27 + plugins/transparent/configure.in.in | 10 + plugins/transparent/transparent.cpp | 278 + plugins/transparent/transparent.h | 63 + plugins/transparent/transparent.rc | 97 + plugins/transparent/transparent.vcproj | 398 + plugins/transparent/transparentcfg.cpp | 44 + plugins/transparent/transparentcfg.h | 37 + plugins/transparent/transparentcfgbase.ui | 114 + plugins/transparent/transtop.cpp | 64 + plugins/transparent/transtop.h | 48 + plugins/update/CMakeLists.txt | 18 + plugins/update/update.cpp | 466 + plugins/update/update.h | 92 + plugins/update/update.rc | 97 + plugins/update/update.vcproj | 310 + plugins/weather/CMakeLists.txt | 28 + plugins/weather/jisp/0.png | Bin 0 -> 17002 bytes plugins/weather/jisp/1.png | Bin 0 -> 17002 bytes plugins/weather/jisp/10.png | Bin 0 -> 17956 bytes plugins/weather/jisp/11.png | Bin 0 -> 17965 bytes plugins/weather/jisp/12.png | Bin 0 -> 17567 bytes plugins/weather/jisp/13.png | Bin 0 -> 12871 bytes plugins/weather/jisp/14.png | Bin 0 -> 14445 bytes plugins/weather/jisp/15.png | Bin 0 -> 20404 bytes plugins/weather/jisp/16.png | Bin 0 -> 17004 bytes plugins/weather/jisp/17.png | Bin 0 -> 16983 bytes plugins/weather/jisp/18.png | Bin 0 -> 12791 bytes plugins/weather/jisp/19.png | Bin 0 -> 11120 bytes plugins/weather/jisp/2.png | Bin 0 -> 17002 bytes plugins/weather/jisp/20.png | Bin 0 -> 9101 bytes plugins/weather/jisp/21.png | Bin 0 -> 11561 bytes plugins/weather/jisp/22.png | Bin 0 -> 11120 bytes plugins/weather/jisp/23.png | Bin 0 -> 4173 bytes plugins/weather/jisp/24.png | Bin 0 -> 4173 bytes plugins/weather/jisp/25.png | Bin 0 -> 4142 bytes plugins/weather/jisp/26.png | Bin 0 -> 9628 bytes plugins/weather/jisp/27.png | Bin 0 -> 7438 bytes plugins/weather/jisp/28.png | Bin 0 -> 9027 bytes plugins/weather/jisp/29.png | Bin 0 -> 9152 bytes plugins/weather/jisp/3.png | Bin 0 -> 17002 bytes plugins/weather/jisp/30.png | Bin 0 -> 10654 bytes plugins/weather/jisp/31.png | Bin 0 -> 17576 bytes plugins/weather/jisp/32.png | Bin 0 -> 9904 bytes plugins/weather/jisp/33.png | Bin 0 -> 8353 bytes plugins/weather/jisp/34.png | Bin 0 -> 9576 bytes plugins/weather/jisp/35.png | Bin 0 -> 17002 bytes plugins/weather/jisp/36.png | Bin 0 -> 9870 bytes plugins/weather/jisp/37.png | Bin 0 -> 19002 bytes plugins/weather/jisp/38.png | Bin 0 -> 19003 bytes plugins/weather/jisp/39.png | Bin 0 -> 18550 bytes plugins/weather/jisp/4.png | Bin 0 -> 16983 bytes plugins/weather/jisp/40.png | Bin 0 -> 18883 bytes plugins/weather/jisp/41.png | Bin 0 -> 14617 bytes plugins/weather/jisp/42.png | Bin 0 -> 16731 bytes plugins/weather/jisp/43.png | Bin 0 -> 17451 bytes plugins/weather/jisp/44.png | Bin 0 -> 4142 bytes plugins/weather/jisp/45.png | Bin 0 -> 15926 bytes plugins/weather/jisp/46.png | Bin 0 -> 13746 bytes plugins/weather/jisp/47.png | Bin 0 -> 20299 bytes plugins/weather/jisp/5.png | Bin 0 -> 18384 bytes plugins/weather/jisp/6.png | Bin 0 -> 17907 bytes plugins/weather/jisp/7.png | Bin 0 -> 18509 bytes plugins/weather/jisp/8.png | Bin 0 -> 17786 bytes plugins/weather/jisp/9.png | Bin 0 -> 16762 bytes plugins/weather/jisp/icondef.xml | 248 + plugins/weather/jisp/license | 1 + plugins/weather/jisp/m0.png | Bin 0 -> 86 bytes plugins/weather/jisp/m1.png | Bin 0 -> 419 bytes plugins/weather/jisp/m10.png | Bin 0 -> 912 bytes plugins/weather/jisp/m11.png | Bin 0 -> 924 bytes plugins/weather/jisp/m12.png | Bin 0 -> 965 bytes plugins/weather/jisp/m13.png | Bin 0 -> 965 bytes plugins/weather/jisp/m14.png | Bin 0 -> 993 bytes plugins/weather/jisp/m15.png | Bin 0 -> 1022 bytes plugins/weather/jisp/m16.png | Bin 0 -> 912 bytes plugins/weather/jisp/m17.png | Bin 0 -> 878 bytes plugins/weather/jisp/m18.png | Bin 0 -> 779 bytes plugins/weather/jisp/m19.png | Bin 0 -> 779 bytes plugins/weather/jisp/m2.png | Bin 0 -> 456 bytes plugins/weather/jisp/m20.png | Bin 0 -> 775 bytes plugins/weather/jisp/m21.png | Bin 0 -> 775 bytes plugins/weather/jisp/m22.png | Bin 0 -> 674 bytes plugins/weather/jisp/m23.png | Bin 0 -> 621 bytes plugins/weather/jisp/m24.png | Bin 0 -> 540 bytes plugins/weather/jisp/m25.png | Bin 0 -> 529 bytes plugins/weather/jisp/m26.png | Bin 0 -> 487 bytes plugins/weather/jisp/m27.png | Bin 0 -> 441 bytes plugins/weather/jisp/m28.png | Bin 0 -> 441 bytes plugins/weather/jisp/m29.png | Bin 0 -> 86 bytes plugins/weather/jisp/m3.png | Bin 0 -> 516 bytes plugins/weather/jisp/m4.png | Bin 0 -> 521 bytes plugins/weather/jisp/m5.png | Bin 0 -> 642 bytes plugins/weather/jisp/m6.png | Bin 0 -> 642 bytes plugins/weather/jisp/m7.png | Bin 0 -> 687 bytes plugins/weather/jisp/m8.png | Bin 0 -> 765 bytes plugins/weather/jisp/m9.png | Bin 0 -> 803 bytes plugins/weather/jisp/na.png | Bin 0 -> 2037 bytes plugins/weather/weather.cpp | 719 + plugins/weather/weather.h | 83 + plugins/weather/weather.rc | 97 + plugins/weather/weather.vcproj | 848 ++ plugins/weather/weathercfg.cpp | 158 + plugins/weather/weathercfg.h | 51 + plugins/weather/weathercfgbase.ui | 215 + plugins/weather/wifacecfg.cpp | 129 + plugins/weather/wifacecfg.h | 39 + plugins/weather/wifacecfgbase.ui | 106 + plugins/windock/CMakeLists.txt | 24 + plugins/windock/configure.in.in | 1 + plugins/windock/windock.cpp | 535 + plugins/windock/windock.h | 68 + plugins/windock/windock.rc | 97 + plugins/windock/windock.vcproj | 312 + plugins/yahoo/CMakeLists.txt | 40 + plugins/yahoo/configure.in.in | 4 + plugins/yahoo/crypt.cpp | 165 + plugins/yahoo/yahoo.cpp | 184 + plugins/yahoo/yahoo.h | 48 + plugins/yahoo/yahoo.rc | 97 + plugins/yahoo/yahoo.vcproj | 742 + plugins/yahoo/yahoo_pch.h | 43 + plugins/yahoo/yahooauth.cpp | 1379 ++ plugins/yahoo/yahoocfg.cpp | 91 + plugins/yahoo/yahoocfg.h | 47 + plugins/yahoo/yahoocfgbase.ui | 362 + plugins/yahoo/yahooclient.cpp | 2155 +++ plugins/yahoo/yahooclient.h | 311 + plugins/yahoo/yahoofiletransfer.cpp | 486 + plugins/yahoo/yahoohttp.cpp | 131 + plugins/yahoo/yahooinfo.cpp | 153 + plugins/yahoo/yahooinfo.h | 44 + plugins/yahoo/yahooinfobase.ui | 263 + plugins/yahoo/yahoosearch.cpp | 212 + plugins/yahoo/yahoosearch.h | 56 + plugins/yahoo/yahoosearchbase.ui | 123 + plugins/yahoo/yahootransformtables.c | 1999 +++ plugins/zodiak/CMakeLists.txt | 14 + plugins/zodiak/xpm/1.xpm | 69 + plugins/zodiak/xpm/10.xpm | 69 + plugins/zodiak/xpm/11.xpm | 69 + plugins/zodiak/xpm/12.xpm | 69 + plugins/zodiak/xpm/2.xpm | 69 + plugins/zodiak/xpm/3.xpm | 69 + plugins/zodiak/xpm/4.xpm | 69 + plugins/zodiak/xpm/5.xpm | 69 + plugins/zodiak/xpm/6.xpm | 69 + plugins/zodiak/xpm/7.xpm | 69 + plugins/zodiak/xpm/8.xpm | 69 + plugins/zodiak/xpm/9.xpm | 69 + plugins/zodiak/zodiak.cpp | 267 + plugins/zodiak/zodiak.h | 74 + plugins/zodiak/zodiak.rc | 97 + plugins/zodiak/zodiak.vcproj | 363 + po/bg.po | 9889 ++++++++++++ po/ca.po | 10679 +++++++++++++ po/cs.po | 10466 +++++++++++++ po/de.po | 11012 +++++++++++++ po/el.po | 10682 +++++++++++++ po/es.po | 10512 +++++++++++++ po/fr.po | 12585 +++++++++++++++ po/he.po | 10817 +++++++++++++ po/hu.po | 10655 +++++++++++++ po/it.po | 10469 +++++++++++++ po/nl.po | 10777 +++++++++++++ po/pl.po | 10774 +++++++++++++ po/pt_BR.po | 12718 ++++++++++++++++ po/ru.po | 11273 ++++++++++++++ po/sim.pot | 9684 ++++++++++++ po/sk.po | 12475 +++++++++++++++ po/sv.po | 10008 ++++++++++++ po/sw.po | 10545 +++++++++++++ po/th.po | 10346 +++++++++++++ po/tr.po | 10761 +++++++++++++ po/uk.po | 10474 +++++++++++++ po/zh_TW.po | 10123 ++++++++++++ porting-issues.html | 14 + resource.h | 22 + sim.pro | 159 + sim.pro.user | 309 + sim.sln | 454 + sim.vcproj | 2327 +++ sim/CMakeLists.txt | 310 + sim/aboutdata.cpp | 310 + sim/aboutdata.h | 231 + sim/buffer.cpp | 349 + sim/buffer.h | 104 + sim/builtinlogger.cpp | 68 + sim/builtinlogger.h | 43 + sim/cfg.cpp | 1622 ++ sim/cfg.h | 251 + sim/cjk_variants.h | 4241 ++++++ sim/clientlist.cpp | 30 + sim/clientlist.h | 28 + sim/clientmanager.cpp | 149 + sim/clientmanager.h | 39 + sim/cmddef.cpp | 475 + sim/cmddef.h | 97 + sim/contacts.cpp | 1393 ++ sim/contacts.h | 240 + sim/contacts/client.cpp | 237 + sim/contacts/client.h | 110 + sim/contacts/clientdataiterator.cpp | 75 + sim/contacts/clientdataiterator.h | 29 + sim/contacts/clientuserdata.cpp | 199 + sim/contacts/clientuserdata.h | 46 + sim/contacts/clientuserdataprivate.cpp | 24 + sim/contacts/clientuserdataprivate.h | 21 + sim/contacts/contact.cpp | 446 + sim/contacts/contact.h | 92 + sim/contacts/group.cpp | 67 + sim/contacts/group.h | 47 + sim/contacts/imstatus.cpp | 16 + sim/contacts/imstatus.h | 36 + sim/contacts/packettype.cpp | 19 + sim/contacts/packettype.h | 28 + sim/contacts/protocol.cpp | 18 + sim/contacts/protocol.h | 38 + sim/contacts/protocolmanager.cpp | 102 + sim/contacts/protocolmanager.h | 49 + sim/contacts/userdata.cpp | 100 + sim/contacts/userdata.h | 47 + sim/country.cpp | 543 + sim/country.h | 47 + sim/event.cpp | 186 + sim/event.h | 1170 ++ sim/exec.cpp | 66 + sim/exec.h | 44 + sim/fetch.cpp | 371 + sim/fetch.h | 58 + sim/fetchclientprivate.h | 82 + sim/html.h | 54 + sim/html.ll | 393 + sim/icons.cpp | 714 + sim/icons.h | 77 + sim/icq.ico | Bin 0 -> 4710 bytes sim/johab_hangul.h | 202 + sim/kdeisversion.h | 35 + sim/libltdl/ltdl.c | 3416 +++++ sim/libltdl/ltdl.h | 350 + sim/log.cpp | 97 + sim/log.h | 49 + sim/message.cpp | 653 + sim/message.h | 322 + sim/misc.cpp | 749 + sim/misc.h | 139 + sim/other_icons/sim-16x16.ico | Bin 0 -> 1150 bytes sim/other_icons/sim.icns | Bin 0 -> 155272 bytes sim/other_icons/sim_XP-style.ico | Bin 0 -> 43646 bytes sim/paths.cpp | 99 + sim/paths.h | 21 + sim/plugins.cpp | 907 ++ sim/plugins.h | 119 + sim/png/CMakeLists.txt | 3 + sim/png/hi16-app-sim.png | Bin 0 -> 832 bytes sim/png/hi22-app-sim.png | Bin 0 -> 1151 bytes sim/png/hi32-app-sim.png | Bin 0 -> 1941 bytes sim/png/hi48-app-sim.png | Bin 0 -> 3236 bytes sim/png/hi64-app-sim.png | Bin 0 -> 4897 bytes sim/png/hi72-app-sim.png | Bin 0 -> 5317 bytes sim/png/lo16-app-sim.png | Bin 0 -> 328 bytes sim/png/lo22-app-sim.png | Bin 0 -> 415 bytes sim/png/lo32-app-sim.png | Bin 0 -> 583 bytes sim/profile.cpp | 111 + sim/profile.h | 47 + sim/profilemanager.cpp | 147 + sim/profilemanager.h | 46 + sim/propertyhub.cpp | 279 + sim/propertyhub.h | 73 + sim/qzip/ioapi.c | 177 + sim/qzip/ioapi.h | 74 + sim/qzip/qzip.cpp | 159 + sim/qzip/qzip.h | 52 + sim/qzip/unzip.c | 1605 ++ sim/qzip/unzip.h | 360 + sim/sax.cpp | 133 + sim/sax.h | 46 + sim/sim-kde.menu | 1 + sim/sim.cpp | 128 + sim/sim.desktop | 10 + sim/sim.ico | Bin 0 -> 39366 bytes sim/sim.pro.user | 160 + sim/sim.rc | 102 + sim/sim_pch.h | 91 + sim/simapi.cpp | 752 + sim/simapi.h | 61 + sim/simapp/kdesimapp.cpp | 53 + sim/simapp/kdesimapp.h | 26 + sim/simapp/simapp.cpp | 29 + sim/simapp/simapp.h | 24 + sim/simfs.cpp | 169 + sim/simfs.h | 64 + sim/simgui/ballonmsg.cpp | 316 + sim/simgui/ballonmsg.h | 80 + sim/simgui/datepicker.cpp | 102 + sim/simgui/datepicker.h | 58 + sim/simgui/editfile.cpp | 396 + sim/simgui/editfile.h | 152 + sim/simgui/fontedit.cpp | 202 + sim/simgui/fontedit.h | 48 + sim/simgui/intedit.cpp | 71 + sim/simgui/intedit.h | 66 + sim/simgui/linklabel.cpp | 45 + sim/simgui/linklabel.h | 38 + sim/simgui/listview.cpp | 490 + sim/simgui/listview.h | 131 + sim/simgui/logindlgbase.ui | 224 + sim/simgui/preview.cpp | 114 + sim/simgui/preview.h | 60 + sim/simgui/qchildwidget.cpp | 93 + sim/simgui/qchildwidget.h | 41 + sim/simgui/qcolorbutton.cpp | 92 + sim/simgui/qcolorbutton.h | 54 + sim/simgui/qkeybutton.cpp | 140 + sim/simgui/qkeybutton.h | 49 + sim/simgui/textshow.cpp | 627 + sim/simgui/textshow.h | 146 + sim/simgui/toolbtn.cpp | 741 + sim/simgui/toolbtn.h | 188 + sim/simtests.vcproj | 825 + sim/singleton.h | 38 + sim/socket/clientsocket.cpp | 183 + sim/socket/clientsocket.h | 61 + sim/socket/clientsocketnotify.h | 26 + sim/socket/interfacechecker.cpp | 159 + sim/socket/interfacechecker.h | 48 + sim/socket/ip.cpp | 47 + sim/socket/ip.h | 28 + sim/socket/ipresolver.cpp | 81 + sim/socket/ipresolver.h | 35 + sim/socket/iresolver.h | 28 + sim/socket/serversocket.cpp | 13 + sim/socket/serversocket.h | 28 + sim/socket/serversocketnotify.cpp | 38 + sim/socket/serversocketnotify.h | 30 + sim/socket/simclientsocket.cpp | 330 + sim/socket/simclientsocket.h | 68 + sim/socket/simresolver.cpp | 79 + sim/socket/simresolver.h | 45 + sim/socket/simserversocket.cpp | 74 + sim/socket/simserversocket.h | 31 + sim/socket/simsockets.cpp | 71 + sim/socket/simsockets.h | 28 + sim/socket/socket.cpp | 60 + sim/socket/socket.h | 72 + sim/socket/socketfactory.cpp | 122 + sim/socket/socketfactory.h | 49 + sim/socket/socketnotify.h | 22 + sim/socket/sslclient.cpp | 357 + sim/socket/sslclient.h | 46 + sim/socket/stdresolver.cpp | 102 + sim/socket/stdresolver.h | 44 + sim/socket/tcpclient.cpp | 205 + sim/socket/tcpclient.h | 65 + sim/tests/test.cpp | 29 + sim/tests/testbuffer.cpp | 56 + sim/tests/testbuffer.h | 20 + sim/tests/testclientmanager.cpp | 90 + sim/tests/testclientmanager.h | 45 + sim/tests/testclientsocket.cpp | 195 + sim/tests/testclientsocket.h | 119 + sim/tests/testconfig.cpp | 89 + sim/tests/testconfig.h | 29 + sim/tests/testcontact.cpp | 51 + sim/tests/testcontact.h | 24 + sim/tests/testcontactlist.cpp | 228 + sim/tests/testcontactlist.h | 58 + sim/tests/testpropertyhub.cpp | 121 + sim/tests/testpropertyhub.h | 30 + sim/tests/testprotocolmanager.cpp | 102 + sim/tests/testprotocolmanager.h | 30 + sim/tests/testsocketfactory.cpp | 27 + sim/tests/testsocketfactory.h | 108 + sim/tests/testuserdata.cpp | 36 + sim/tests/testuserdata.h | 22 + sim/translit.cpp | 68 + sim/translit.h | 2462 +++ sim/unquot.cpp | 260 + sim/unquot.h | 42 + sim/win32/iconv.h | 132 + sim/win32/jconfig.h | 47 + sim/win32/jmorecfg.h | 365 + sim/win32/jpeglib.h | 1096 ++ sim/win32/libeay32MD.lib | Bin 0 -> 657238 bytes sim/win32/libeay32MDd.lib | Bin 0 -> 657238 bytes sim/win32/libjpeg.lib | Bin 0 -> 231676 bytes sim/win32/libxml.lib | Bin 0 -> 372532 bytes sim/win32/libxml/SAX.h | 173 + sim/win32/libxml/SAX2.h | 176 + sim/win32/libxml/dict.h | 69 + sim/win32/libxml/encoding.h | 226 + sim/win32/libxml/entities.h | 139 + sim/win32/libxml/globals.h | 455 + sim/win32/libxml/hash.h | 233 + sim/win32/libxml/list.h | 137 + sim/win32/libxml/parser.h | 1217 ++ sim/win32/libxml/threads.h | 80 + sim/win32/libxml/tree.h | 1154 ++ sim/win32/libxml/valid.h | 458 + sim/win32/libxml/xlink.h | 189 + sim/win32/libxml/xmlIO.h | 360 + sim/win32/libxml/xmlautomata.h | 146 + sim/win32/libxml/xmlerror.h | 935 ++ sim/win32/libxml/xmlexports.h | 157 + sim/win32/libxml/xmlmemory.h | 222 + sim/win32/libxml/xmlregexp.h | 216 + sim/win32/libxml/xmlstring.h | 140 + sim/win32/libxml/xmlversion.h | 396 + sim/win32/libxml/xpath.h | 532 + sim/win32/libxml_a.lib | Bin 0 -> 2997100 bytes sim/win32/libxslt.lib | Bin 0 -> 52634 bytes sim/win32/libxslt/numbersInternals.h | 69 + sim/win32/libxslt/transform.h | 193 + sim/win32/libxslt/win32config.h | 97 + sim/win32/libxslt/xslt.h | 96 + sim/win32/libxslt/xsltInternals.h | 702 + sim/win32/libxslt/xsltconfig.h | 155 + sim/win32/libxslt/xsltexports.h | 142 + sim/win32/libxslt/xsltutils.h | 307 + sim/win32/libxslt/xsltwin32config.h | 105 + sim/win32/libz.a | Bin 0 -> 55978 bytes sim/win32/openssl/aes.h | 138 + sim/win32/openssl/applink.c | 94 + sim/win32/openssl/asn1.h | 1233 ++ sim/win32/openssl/asn1_mac.h | 571 + sim/win32/openssl/asn1t.h | 886 ++ sim/win32/openssl/bio.h | 770 + sim/win32/openssl/blowfish.h | 127 + sim/win32/openssl/bn.h | 827 + sim/win32/openssl/buffer.h | 118 + sim/win32/openssl/cast.h | 105 + sim/win32/openssl/comp.h | 66 + sim/win32/openssl/conf.h | 253 + sim/win32/openssl/conf_api.h | 89 + sim/win32/openssl/crypto.h | 550 + sim/win32/openssl/des.h | 244 + sim/win32/openssl/des_old.h | 445 + sim/win32/openssl/dh.h | 229 + sim/win32/openssl/dsa.h | 279 + sim/win32/openssl/dso.h | 368 + sim/win32/openssl/dtls1.h | 212 + sim/win32/openssl/e_os2.h | 279 + sim/win32/openssl/ebcdic.h | 19 + sim/win32/openssl/ec.h | 518 + sim/win32/openssl/ecdh.h | 123 + sim/win32/openssl/ecdsa.h | 270 + sim/win32/openssl/engine.h | 785 + sim/win32/openssl/err.h | 318 + sim/win32/openssl/evp.h | 966 ++ sim/win32/openssl/hmac.h | 108 + sim/win32/openssl/idea.h | 100 + sim/win32/openssl/krb5_asn.h | 256 + sim/win32/openssl/kssl.h | 179 + sim/win32/openssl/lhash.h | 200 + sim/win32/openssl/md2.h | 91 + sim/win32/openssl/md4.h | 116 + sim/win32/openssl/md5.h | 116 + sim/win32/openssl/obj_mac.h | 3393 +++++ sim/win32/openssl/objects.h | 1049 ++ sim/win32/openssl/ocsp.h | 614 + sim/win32/openssl/opensslconf.h | 212 + sim/win32/openssl/opensslv.h | 89 + sim/win32/openssl/ossl_typ.h | 174 + sim/win32/openssl/pem.h | 737 + sim/win32/openssl/pem2.h | 70 + sim/win32/openssl/pkcs12.h | 333 + sim/win32/openssl/pkcs7.h | 464 + sim/win32/openssl/pq_compat.h | 147 + sim/win32/openssl/pqueue.h | 95 + sim/win32/openssl/rand.h | 140 + sim/win32/openssl/rc2.h | 101 + sim/win32/openssl/rc4.h | 87 + sim/win32/openssl/ripemd.h | 103 + sim/win32/openssl/rsa.h | 430 + sim/win32/openssl/safestack.h | 1784 +++ sim/win32/openssl/sha.h | 199 + sim/win32/openssl/ssl.h | 1960 +++ sim/win32/openssl/ssl2.h | 268 + sim/win32/openssl/ssl23.h | 83 + sim/win32/openssl/ssl3.h | 555 + sim/win32/openssl/stack.h | 109 + sim/win32/openssl/store.h | 554 + sim/win32/openssl/symhacks.h | 383 + sim/win32/openssl/tls1.h | 305 + sim/win32/openssl/tmdiff.h | 93 + sim/win32/openssl/txt_db.h | 109 + sim/win32/openssl/ui.h | 381 + sim/win32/openssl/x509.h | 1340 ++ sim/win32/openssl/x509_vfy.h | 530 + sim/win32/openssl/x509v3.h | 759 + sim/win32/sim-default.vsprops | 16 + sim/win32/ssleay32MD.lib | Bin 0 -> 49104 bytes sim/win32/ssleay32MDd.lib | Bin 0 -> 49104 bytes sim/win32/ts.rules | 19 + sim/win32/uic.rules | 19 + sim/win32/zconf.h | 332 + sim/win32/zlib.h | 1357 ++ sim/xsl.cpp | 137 + sim/xsl.h | 39 + simall.vcproj | 88 + suse.spec | 95 + ts/bg.ts | 8165 ++++++++++ ts/ca.ts | 6789 +++++++++ ts/cs.ts | 8089 ++++++++++ ts/de.ts | 8192 ++++++++++ ts/el.ts | 5207 +++++++ ts/es.ts | 7969 ++++++++++ ts/fr.ts | 7855 ++++++++++ ts/he.ts | 6410 ++++++++ ts/hu.ts | 7958 ++++++++++ ts/it.ts | 7923 ++++++++++ ts/nl.ts | 6268 ++++++++ ts/pl.ts | 6365 ++++++++ ts/pt_BR.ts | 6817 +++++++++ ts/ru.ts | 8004 ++++++++++ ts/sk.ts | 8177 ++++++++++ ts/sv.ts | 8063 ++++++++++ ts/sw.ts | 7911 ++++++++++ ts/th.ts | 6843 +++++++++ ts/tr.ts | 6391 ++++++++ ts/uk.ts | 8092 ++++++++++ ts/zh_TW.ts | 4618 ++++++ 1689 files changed, 689717 insertions(+) create mode 100644 ALL_BUILD.vcproj create mode 100644 AUTHORS create mode 100644 AUTHORS.sim create mode 100644 CMakeLists.txt create mode 100644 CMakeLists.txt.user create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 ChangeLog.old create mode 100644 ConfigureChecks.cmake create mode 100644 Doxyfile create mode 100644 INSTALL create mode 100644 README create mode 100644 README.SVN create mode 100644 TODO.CMake create mode 100644 TODO.MingW create mode 100644 admin/Doxyfile.am create mode 100755 admin/Doxyfile.global create mode 100644 admin/acinclude.m4.in create mode 100644 admin/am_edit create mode 100644 admin/bcheck.pl create mode 100755 admin/compile create mode 100644 admin/conf.change.pl create mode 100755 admin/config.guess create mode 100644 admin/config.pl create mode 100755 admin/config.sub create mode 100644 admin/configure.in.bot.end create mode 100644 admin/configure.in.min create mode 100755 admin/debianrules create mode 100755 admin/depcomp create mode 100644 admin/deps.am create mode 100755 admin/detect-autoconf.pl create mode 100755 admin/install-sh create mode 100644 admin/libtool.m4.in create mode 100755 admin/missing create mode 100644 admin/mkinstalldirs create mode 100755 admin/nmcheck create mode 100644 admin/oldinclude.m4.in create mode 100644 admin/pkg.m4.in create mode 100755 admin/ylwrap create mode 100644 altlinux.spec create mode 100644 asp-linux.spec create mode 100644 cmake/COPYING-CMAKE-SCRIPTS create mode 100644 cmake/CheckStructMember.cmake create mode 100644 cmake/DistTarget.cmake create mode 100644 cmake/FindFlex.cmake create mode 100644 cmake/FindLibIconv.cmake create mode 100644 cmake/FindLibraryWithDebug.cmake create mode 100644 cmake/FindOpenSSL.cmake create mode 100644 cmake/Flex.cmake create mode 100644 cmake/Jisp.cmake create mode 100644 cmake/KDE4InstallIcons.cmake create mode 100644 cmake/MacroBoolTo01.cmake create mode 100644 cmake/MacroEnsureOutOfSourceBuild.cmake create mode 100644 cmake/MacroEnsureVersion.cmake create mode 100644 cmake/Po.cmake create mode 100644 cmake/SimPlugins.cmake create mode 100644 cmake/XGetText.cmake create mode 100644 cmake/cmake_uninstall.cmake.in create mode 100644 cmake/kde4uic.cmake create mode 100644 config.h.cmake create mode 100644 configure.in.in create mode 100644 export_nix.py create mode 100644 fedora.spec create mode 100644 install_win32/VC8_deploy/Microsoft.VC80.CRT.manifest create mode 100644 install_win32/VC8_deploy/plugins/Microsoft.VC80.CRT.manifest create mode 100644 install_win32/VC8_deploy/sim.exe.intermediate.manifest create mode 100644 install_win32/iconv.dll create mode 100644 install_win32/libeay32.dll create mode 100644 install_win32/libxml2.dll create mode 100644 install_win32/libxslt.dll create mode 100644 install_win32/mingw/sim.nsi create mode 100644 install_win32/nsis_installer_full.nsi create mode 100644 install_win32/sim-window-small.bmp create mode 100644 install_win32/ssleay32.dll create mode 100644 install_win32/zlib1.dll create mode 100644 jisp-resources.txt create mode 100644 ltdl.m4 create mode 100644 mandrake.spec create mode 100644 plugins/__homedir/CMakeLists.txt create mode 100644 plugins/__homedir/__homedir.vcproj create mode 100644 plugins/__homedir/configure.in.in create mode 100644 plugins/__homedir/homedir.cpp create mode 100644 plugins/__homedir/homedir.h create mode 100644 plugins/__homedir/homedir.rc create mode 100644 plugins/__homedir/homedircfg.cpp create mode 100644 plugins/__homedir/homedircfg.h create mode 100644 plugins/__homedir/homedircfgbase.ui create mode 100644 plugins/__migrate/CMakeLists.txt create mode 100644 plugins/__migrate/__migrate.vcproj create mode 100644 plugins/__migrate/migrate.cpp create mode 100644 plugins/__migrate/migrate.h create mode 100644 plugins/__migrate/migrate.rc create mode 100644 plugins/__migrate/migratedlg.cpp create mode 100644 plugins/__migrate/migratedlg.h create mode 100644 plugins/__migrate/migratedlgbase.ui create mode 100644 plugins/_core/CMakeLists.txt create mode 100644 plugins/_core/GPL-Icons/1downarrow.png create mode 100644 plugins/_core/GPL-Icons/1leftarrow.png create mode 100644 plugins/_core/GPL-Icons/1rightarrow.png create mode 100644 plugins/_core/GPL-Icons/1uparrow.png create mode 100644 plugins/_core/GPL-Icons/SMS-protocol.png create mode 100644 plugins/_core/GPL-Icons/aim_online.png create mode 100644 plugins/_core/GPL-Icons/auth.png create mode 100644 plugins/_core/GPL-Icons/birthday.png create mode 100644 plugins/_core/GPL-Icons/button_cancel.png create mode 100644 plugins/_core/GPL-Icons/button_ok.png create mode 100644 plugins/_core/GPL-Icons/cell.png create mode 100644 plugins/_core/GPL-Icons/collapsed.png create mode 100644 plugins/_core/GPL-Icons/configure.png create mode 100644 plugins/_core/GPL-Icons/contacts.png create mode 100644 plugins/_core/GPL-Icons/def_status_away.png create mode 100644 plugins/_core/GPL-Icons/def_status_dnd.png create mode 100644 plugins/_core/GPL-Icons/def_status_ffc.png create mode 100644 plugins/_core/GPL-Icons/def_status_na.png create mode 100644 plugins/_core/GPL-Icons/def_status_occupied.png create mode 100644 plugins/_core/GPL-Icons/empty.png create mode 100644 plugins/_core/GPL-Icons/error.png create mode 100644 plugins/_core/GPL-Icons/exit.png create mode 100644 plugins/_core/GPL-Icons/expanded.png create mode 100644 plugins/_core/GPL-Icons/fax.png create mode 100644 plugins/_core/GPL-Icons/file.png create mode 100644 plugins/_core/GPL-Icons/fileopen.png create mode 100644 plugins/_core/GPL-Icons/filesave.png create mode 100644 plugins/_core/GPL-Icons/find_user.png create mode 100644 plugins/_core/GPL-Icons/floating.png create mode 100644 plugins/_core/GPL-Icons/fonts.png create mode 100644 plugins/_core/GPL-Icons/gadu_away.png create mode 100644 plugins/_core/GPL-Icons/gadu_dnd.png create mode 100644 plugins/_core/GPL-Icons/gadu_invisible.png create mode 100644 plugins/_core/GPL-Icons/gadu_offline.png create mode 100644 plugins/_core/GPL-Icons/gadu_online.png create mode 100644 plugins/_core/GPL-Icons/group_collapsed.png create mode 100644 plugins/_core/GPL-Icons/group_expanded.png create mode 100644 plugins/_core/GPL-Icons/grp_create.png create mode 100644 plugins/_core/GPL-Icons/grp_off.png create mode 100644 plugins/_core/GPL-Icons/grp_on.png create mode 100644 plugins/_core/GPL-Icons/grp_rename.png create mode 100644 plugins/_core/GPL-Icons/home.png create mode 100644 plugins/_core/GPL-Icons/icondef.xml create mode 100644 plugins/_core/GPL-Icons/icq_online.png create mode 100644 plugins/_core/GPL-Icons/jabber.png create mode 100644 plugins/_core/GPL-Icons/jabber_offline.png create mode 100644 plugins/_core/GPL-Icons/mail_generic.png create mode 100644 plugins/_core/GPL-Icons/message.png create mode 100644 plugins/_core/GPL-Icons/msn_online.png create mode 100644 plugins/_core/GPL-Icons/network.png create mode 100644 plugins/_core/GPL-Icons/no_phone.png create mode 100644 plugins/_core/GPL-Icons/non-im-contact.png create mode 100644 plugins/_core/GPL-Icons/online_off.png create mode 100644 plugins/_core/GPL-Icons/online_on.png create mode 100644 plugins/_core/GPL-Icons/pager.png create mode 100644 plugins/_core/GPL-Icons/phone.png create mode 100644 plugins/_core/GPL-Icons/remove.png create mode 100644 plugins/_core/GPL-Icons/run.png create mode 100644 plugins/_core/GPL-Icons/security.png create mode 100644 plugins/_core/GPL-Icons/sim.png create mode 100644 plugins/_core/GPL-Icons/sms.png create mode 100644 plugins/_core/GPL-Icons/unknown_icon_1.png create mode 100644 plugins/_core/GPL-Icons/url.png create mode 100644 plugins/_core/GPL-Icons/webpress.png create mode 100644 plugins/_core/GPL-Icons/work.png create mode 100644 plugins/_core/GPL-Icons/yahoo_away.png create mode 100644 plugins/_core/GPL-Icons/yahoo_dnd.png create mode 100644 plugins/_core/GPL-Icons/yahoo_invisible.png create mode 100644 plugins/_core/GPL-Icons/yahoo_na.png create mode 100644 plugins/_core/GPL-Icons/yahoo_offline.png create mode 100644 plugins/_core/GPL-Icons/yahoo_online.png create mode 100644 plugins/_core/_core.vcproj create mode 100644 plugins/_core/additional/0.png create mode 100644 plugins/_core/additional/1.png create mode 100644 plugins/_core/additional/icondef.xml create mode 100644 plugins/_core/arcfg.cpp create mode 100644 plugins/_core/arcfg.h create mode 100644 plugins/_core/arcfgbase.ui create mode 100644 plugins/_core/autoreply.cpp create mode 100644 plugins/_core/autoreply.h create mode 100644 plugins/_core/autoreplybase.ui create mode 100644 plugins/_core/cfgdlg.cpp create mode 100644 plugins/_core/cfgdlg.h create mode 100644 plugins/_core/cfgdlgbase.ui create mode 100644 plugins/_core/cmenu.cpp create mode 100644 plugins/_core/cmenu.h create mode 100644 plugins/_core/commands.cpp create mode 100644 plugins/_core/commands.h create mode 100644 plugins/_core/connectionsettings.cpp create mode 100644 plugins/_core/connectionsettings.h create mode 100644 plugins/_core/connectionsettingsbase.ui create mode 100644 plugins/_core/connectwnd.cpp create mode 100644 plugins/_core/connectwnd.h create mode 100644 plugins/_core/connectwndbase.ui create mode 100644 plugins/_core/container.cpp create mode 100644 plugins/_core/container.h create mode 100644 plugins/_core/core.cpp create mode 100644 plugins/_core/core.h create mode 100644 plugins/_core/core.rc create mode 100644 plugins/_core/core_consts.h create mode 100644 plugins/_core/core_events.h create mode 100644 plugins/_core/core_pch.h create mode 100644 plugins/_core/declinedlg.cpp create mode 100644 plugins/_core/declinedlg.h create mode 100644 plugins/_core/declinedlgbase.ui create mode 100644 plugins/_core/editmail.cpp create mode 100644 plugins/_core/editmail.h create mode 100644 plugins/_core/editmailbase.ui create mode 100644 plugins/_core/editphone.cpp create mode 100644 plugins/_core/editphone.h create mode 100644 plugins/_core/editphonebase.ui create mode 100644 plugins/_core/emoticons_prebuilt/SIM-icons-Crystal-full.jisp create mode 100644 plugins/_core/emoticons_prebuilt/SIM-icons-Crystal-full.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/SIM-icons-Nuvola-full.jisp create mode 100644 plugins/_core/emoticons_prebuilt/SIM-icons-Nuvola-full.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/SIM-icons-XP-full.jisp create mode 100644 plugins/_core/emoticons_prebuilt/SIM-icons-XP-full.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/additional.jisp create mode 100644 plugins/_core/emoticons_prebuilt/additional.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/amibulb.jisp create mode 100644 plugins/_core/emoticons_prebuilt/amibulb.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/apple_ichat.jisp create mode 100644 plugins/_core/emoticons_prebuilt/apple_ichat.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/gants.jisp create mode 100644 plugins/_core/emoticons_prebuilt/gants.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/icq5.1.jisp create mode 100644 plugins/_core/emoticons_prebuilt/icq5.1.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/icq5.jisp create mode 100644 plugins/_core/emoticons_prebuilt/icq5.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/icqlite.jisp create mode 100644 plugins/_core/emoticons_prebuilt/icqlite.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/lovenmoney.jisp create mode 100644 plugins/_core/emoticons_prebuilt/lovenmoney.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/msn.jisp create mode 100644 plugins/_core/emoticons_prebuilt/msn.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/sim.jisp create mode 100644 plugins/_core/emoticons_prebuilt/sim.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/sim2.jisp create mode 100644 plugins/_core/emoticons_prebuilt/sim2.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/smiles.jisp create mode 100644 plugins/_core/emoticons_prebuilt/smiles.jisp.license create mode 100644 plugins/_core/emoticons_prebuilt/yahoo.jisp create mode 100644 plugins/_core/emoticons_prebuilt/yahoo.jisp.license create mode 100644 plugins/_core/filecfg.cpp create mode 100644 plugins/_core/filecfg.h create mode 100644 plugins/_core/filecfgbase.ui create mode 100644 plugins/_core/filetransfer.cpp create mode 100644 plugins/_core/filetransfer.h create mode 100644 plugins/_core/filetransferbase.ui create mode 100644 plugins/_core/fontconfigbase.ui create mode 100644 plugins/_core/history.cpp create mode 100644 plugins/_core/history.h create mode 100644 plugins/_core/historycfg.cpp create mode 100644 plugins/_core/historycfg.h create mode 100644 plugins/_core/historycfgbase.ui create mode 100644 plugins/_core/historywnd.cpp create mode 100644 plugins/_core/historywnd.h create mode 100644 plugins/_core/icq5.1/0.png create mode 100644 plugins/_core/icq5.1/1.png create mode 100644 plugins/_core/icq5.1/10.png create mode 100644 plugins/_core/icq5.1/11.png create mode 100644 plugins/_core/icq5.1/12.png create mode 100644 plugins/_core/icq5.1/13.png create mode 100644 plugins/_core/icq5.1/14.png create mode 100644 plugins/_core/icq5.1/15.png create mode 100644 plugins/_core/icq5.1/16.png create mode 100644 plugins/_core/icq5.1/17.png create mode 100644 plugins/_core/icq5.1/18.png create mode 100644 plugins/_core/icq5.1/19.png create mode 100644 plugins/_core/icq5.1/2.png create mode 100644 plugins/_core/icq5.1/20.png create mode 100644 plugins/_core/icq5.1/21.png create mode 100644 plugins/_core/icq5.1/22.png create mode 100644 plugins/_core/icq5.1/23.png create mode 100644 plugins/_core/icq5.1/24.png create mode 100644 plugins/_core/icq5.1/25.png create mode 100644 plugins/_core/icq5.1/26.png create mode 100644 plugins/_core/icq5.1/27.png create mode 100644 plugins/_core/icq5.1/3.png create mode 100644 plugins/_core/icq5.1/4.png create mode 100644 plugins/_core/icq5.1/5.png create mode 100644 plugins/_core/icq5.1/6.png create mode 100644 plugins/_core/icq5.1/7.png create mode 100644 plugins/_core/icq5.1/8.png create mode 100644 plugins/_core/icq5.1/9.png create mode 100644 plugins/_core/icq5.1/icondef.xml create mode 100644 plugins/_core/icq5/00.png create mode 100644 plugins/_core/icq5/01.png create mode 100644 plugins/_core/icq5/02.png create mode 100644 plugins/_core/icq5/03.png create mode 100644 plugins/_core/icq5/04.png create mode 100644 plugins/_core/icq5/05.png create mode 100644 plugins/_core/icq5/06.png create mode 100644 plugins/_core/icq5/07.png create mode 100644 plugins/_core/icq5/08.png create mode 100644 plugins/_core/icq5/09.png create mode 100644 plugins/_core/icq5/10.png create mode 100644 plugins/_core/icq5/11.png create mode 100644 plugins/_core/icq5/12.png create mode 100644 plugins/_core/icq5/13.png create mode 100644 plugins/_core/icq5/14.png create mode 100644 plugins/_core/icq5/15.png create mode 100644 plugins/_core/icq5/16.png create mode 100644 plugins/_core/icq5/17.png create mode 100644 plugins/_core/icq5/18.png create mode 100644 plugins/_core/icq5/19.png create mode 100644 plugins/_core/icq5/20.png create mode 100644 plugins/_core/icq5/21.png create mode 100644 plugins/_core/icq5/22.png create mode 100644 plugins/_core/icq5/23.png create mode 100644 plugins/_core/icq5/24.png create mode 100644 plugins/_core/icq5/25.png create mode 100644 plugins/_core/icq5/26.png create mode 100644 plugins/_core/icq5/27.png create mode 100644 plugins/_core/icq5/icondef.xml create mode 100644 plugins/_core/icqlite/0.png create mode 100644 plugins/_core/icqlite/1.png create mode 100644 plugins/_core/icqlite/10.png create mode 100644 plugins/_core/icqlite/11.png create mode 100644 plugins/_core/icqlite/12.png create mode 100644 plugins/_core/icqlite/13.png create mode 100644 plugins/_core/icqlite/14.png create mode 100644 plugins/_core/icqlite/15.png create mode 100644 plugins/_core/icqlite/16.png create mode 100644 plugins/_core/icqlite/17.png create mode 100644 plugins/_core/icqlite/18.png create mode 100644 plugins/_core/icqlite/19.png create mode 100644 plugins/_core/icqlite/2.png create mode 100644 plugins/_core/icqlite/20.png create mode 100644 plugins/_core/icqlite/21.png create mode 100644 plugins/_core/icqlite/22.png create mode 100644 plugins/_core/icqlite/23.png create mode 100644 plugins/_core/icqlite/24.png create mode 100644 plugins/_core/icqlite/25.png create mode 100644 plugins/_core/icqlite/26.png create mode 100644 plugins/_core/icqlite/27.png create mode 100644 plugins/_core/icqlite/3.png create mode 100644 plugins/_core/icqlite/4.png create mode 100644 plugins/_core/icqlite/5.png create mode 100644 plugins/_core/icqlite/6.png create mode 100644 plugins/_core/icqlite/7.png create mode 100644 plugins/_core/icqlite/8.png create mode 100644 plugins/_core/icqlite/9.png create mode 100644 plugins/_core/icqlite/icondef.xml create mode 100644 plugins/_core/interfacecfg.cpp create mode 100644 plugins/_core/interfacecfg.h create mode 100644 plugins/_core/interfacecfgbase.ui create mode 100644 plugins/_core/jisp/1downarrow.png create mode 100644 plugins/_core/jisp/1leftarrow.png create mode 100644 plugins/_core/jisp/1rightarrow.png create mode 100644 plugins/_core/jisp/1uparrow.png create mode 100644 plugins/_core/jisp/add.png create mode 100644 plugins/_core/jisp/aim.png create mode 100644 plugins/_core/jisp/alert.png create mode 100644 plugins/_core/jisp/auth.png create mode 100644 plugins/_core/jisp/away.png create mode 100644 plugins/_core/jisp/bgcolor.png create mode 100644 plugins/_core/jisp/birthday.png create mode 100644 plugins/_core/jisp/button_cancel.png create mode 100644 plugins/_core/jisp/button_ok.png create mode 100644 plugins/_core/jisp/cancel.png create mode 100644 plugins/_core/jisp/cell.png create mode 100644 plugins/_core/jisp/chat.png create mode 100644 plugins/_core/jisp/collapsed.png create mode 100644 plugins/_core/jisp/configure.png create mode 100644 plugins/_core/jisp/connect.png create mode 100644 plugins/_core/jisp/contacts.png create mode 100644 plugins/_core/jisp/dnd.png create mode 100644 plugins/_core/jisp/editcopy.png create mode 100644 plugins/_core/jisp/editcut.png create mode 100644 plugins/_core/jisp/editpaste.png create mode 100644 plugins/_core/jisp/empty.png create mode 100644 plugins/_core/jisp/encoding.png create mode 100644 plugins/_core/jisp/encrypted.png create mode 100644 plugins/_core/jisp/error.png create mode 100644 plugins/_core/jisp/exit.png create mode 100644 plugins/_core/jisp/expanded.png create mode 100644 plugins/_core/jisp/fax.png create mode 100644 plugins/_core/jisp/ffc.png create mode 100644 plugins/_core/jisp/fgcolor.png create mode 100644 plugins/_core/jisp/file.png create mode 100644 plugins/_core/jisp/fileclose.png create mode 100644 plugins/_core/jisp/fileopen.png create mode 100644 plugins/_core/jisp/filesave.png create mode 100644 plugins/_core/jisp/filter.png create mode 100644 plugins/_core/jisp/find.png create mode 100644 plugins/_core/jisp/floating.png create mode 100644 plugins/_core/jisp/gadu.png create mode 100644 plugins/_core/jisp/gadu_away.png create mode 100644 plugins/_core/jisp/gadu_dnd.png create mode 100644 plugins/_core/jisp/gadu_invisible.png create mode 100644 plugins/_core/jisp/gadu_na.png create mode 100644 plugins/_core/jisp/gadu_offline.png create mode 100644 plugins/_core/jisp/grp_collapse.png create mode 100644 plugins/_core/jisp/grp_create.png create mode 100644 plugins/_core/jisp/grp_expand.png create mode 100644 plugins/_core/jisp/grp_off.png create mode 100644 plugins/_core/jisp/grp_on.png create mode 100644 plugins/_core/jisp/grp_rename.png create mode 100644 plugins/_core/jisp/help.png create mode 100644 plugins/_core/jisp/history.png create mode 100644 plugins/_core/jisp/home.png create mode 100644 plugins/_core/jisp/icondef.xml create mode 100644 plugins/_core/jisp/icq.png create mode 100644 plugins/_core/jisp/icqphone.png create mode 100644 plugins/_core/jisp/icqphonebusy.png create mode 100644 plugins/_core/jisp/ignorelist.png create mode 100644 plugins/_core/jisp/info.png create mode 100644 plugins/_core/jisp/interest.png create mode 100644 plugins/_core/jisp/jabber.png create mode 100644 plugins/_core/jisp/license create mode 100644 plugins/_core/jisp/listmsg.png create mode 100644 plugins/_core/jisp/livejournal.png create mode 100644 plugins/_core/jisp/lunch.png create mode 100644 plugins/_core/jisp/mail_generic.png create mode 100644 plugins/_core/jisp/mailpager.png create mode 100644 plugins/_core/jisp/message.png create mode 100644 plugins/_core/jisp/more.png create mode 100644 plugins/_core/jisp/msn.png create mode 100644 plugins/_core/jisp/na.png create mode 100644 plugins/_core/jisp/network.png create mode 100644 plugins/_core/jisp/new.png create mode 100644 plugins/_core/jisp/nonim.png create mode 100644 plugins/_core/jisp/nophone.png create mode 100644 plugins/_core/jisp/nosound.png create mode 100644 plugins/_core/jisp/occupied.png create mode 100644 plugins/_core/jisp/onback.png create mode 100644 plugins/_core/jisp/online_off.png create mode 100644 plugins/_core/jisp/online_on.png create mode 100644 plugins/_core/jisp/onphone.png create mode 100644 plugins/_core/jisp/pager.png create mode 100644 plugins/_core/jisp/past.png create mode 100644 plugins/_core/jisp/phone.png create mode 100644 plugins/_core/jisp/pict.png create mode 100644 plugins/_core/jisp/redo.png create mode 100644 plugins/_core/jisp/register.png create mode 100644 plugins/_core/jisp/remove.png create mode 100644 plugins/_core/jisp/run.png create mode 100644 plugins/_core/jisp/security.png create mode 100644 plugins/_core/jisp/sharedfiles.png create mode 100644 plugins/_core/jisp/sim.png create mode 100644 plugins/_core/jisp/simcard.png create mode 100644 plugins/_core/jisp/sms.png create mode 100644 plugins/_core/jisp/sound.png create mode 100644 plugins/_core/jisp/text.png create mode 100644 plugins/_core/jisp/text_bold.png create mode 100644 plugins/_core/jisp/text_italic.png create mode 100644 plugins/_core/jisp/text_strike.png create mode 100644 plugins/_core/jisp/text_under.png create mode 100644 plugins/_core/jisp/translit.png create mode 100644 plugins/_core/jisp/typing.png create mode 100644 plugins/_core/jisp/undo.png create mode 100644 plugins/_core/jisp/urgentmsg.png create mode 100644 plugins/_core/jisp/url.png create mode 100644 plugins/_core/jisp/useroffline.png create mode 100644 plugins/_core/jisp/useronline.png create mode 100644 plugins/_core/jisp/userunknown.png create mode 100644 plugins/_core/jisp/web.png create mode 100644 plugins/_core/jisp/webpress.png create mode 100644 plugins/_core/jisp/work.png create mode 100644 plugins/_core/jisp/yahoo.png create mode 100644 plugins/_core/jisp/yahoo_away.png create mode 100644 plugins/_core/jisp/yahoo_dnd.png create mode 100644 plugins/_core/jisp/yahoo_offline.png create mode 100644 plugins/_core/libintl.cpp create mode 100644 plugins/_core/logindlg.cpp create mode 100644 plugins/_core/logindlg.h create mode 100644 plugins/_core/logindlgbase.ui create mode 100644 plugins/_core/maininfo.cpp create mode 100644 plugins/_core/maininfo.h create mode 100644 plugins/_core/maininfobase.ui create mode 100644 plugins/_core/mainwin.cpp create mode 100644 plugins/_core/mainwin.h create mode 100644 plugins/_core/manager.cpp create mode 100644 plugins/_core/manager.h create mode 100644 plugins/_core/managerbase.ui create mode 100644 plugins/_core/msgauth.cpp create mode 100644 plugins/_core/msgauth.h create mode 100644 plugins/_core/msgcfg.cpp create mode 100644 plugins/_core/msgcfg.h create mode 100644 plugins/_core/msgcfgbase.ui create mode 100644 plugins/_core/msgcontacts.cpp create mode 100644 plugins/_core/msgcontacts.h create mode 100644 plugins/_core/msgedit.cpp create mode 100644 plugins/_core/msgedit.h create mode 100644 plugins/_core/msgfile.cpp create mode 100644 plugins/_core/msgfile.h create mode 100644 plugins/_core/msggen.cpp create mode 100644 plugins/_core/msggen.h create mode 100644 plugins/_core/msgrecv.cpp create mode 100644 plugins/_core/msgrecv.h create mode 100644 plugins/_core/msgsms.cpp create mode 100644 plugins/_core/msgsms.h create mode 100644 plugins/_core/msgurl.cpp create mode 100644 plugins/_core/msgurl.h create mode 100644 plugins/_core/msgview.cpp create mode 100644 plugins/_core/msgview.h create mode 100644 plugins/_core/msgview_menu.cpp create mode 100644 plugins/_core/newprotocol.cpp create mode 100644 plugins/_core/newprotocol.h create mode 100644 plugins/_core/newprotocolbase.ui create mode 100644 plugins/_core/nonim.cpp create mode 100644 plugins/_core/nonim.h create mode 100644 plugins/_core/nonimbase.ui create mode 100644 plugins/_core/pagerbase.ui create mode 100644 plugins/_core/pagerdetails.cpp create mode 100644 plugins/_core/pagerdetails.h create mode 100644 plugins/_core/phonebase.ui create mode 100644 plugins/_core/phonedetails.cpp create mode 100644 plugins/_core/phonedetails.h create mode 100644 plugins/_core/pict/CMakeLists.txt create mode 100644 plugins/_core/pict/connect.gif create mode 100644 plugins/_core/pict/connect.mng create mode 100644 plugins/_core/plugincfg.cpp create mode 100644 plugins/_core/plugincfg.h create mode 100644 plugins/_core/plugincfgbase.ui create mode 100644 plugins/_core/prefcfg.cpp create mode 100644 plugins/_core/prefcfg.h create mode 100644 plugins/_core/prefcfgbase.ui create mode 100644 plugins/_core/search.cpp create mode 100644 plugins/_core/search.h create mode 100644 plugins/_core/searchall.cpp create mode 100644 plugins/_core/searchall.h create mode 100644 plugins/_core/searchallbase.ui create mode 100644 plugins/_core/searchbase.ui create mode 100644 plugins/_core/smiles/Angel.png create mode 100644 plugins/_core/smiles/Angry.png create mode 100644 plugins/_core/smiles/Annoyed.png create mode 100644 plugins/_core/smiles/Cool.png create mode 100644 plugins/_core/smiles/Crying.png create mode 100644 plugins/_core/smiles/Embarrassed.png create mode 100644 plugins/_core/smiles/Grin.png create mode 100644 plugins/_core/smiles/Indifferent.png create mode 100644 plugins/_core/smiles/Kiss.png create mode 100644 plugins/_core/smiles/Sad.png create mode 100644 plugins/_core/smiles/Skeptical.png create mode 100644 plugins/_core/smiles/Smile.png create mode 100644 plugins/_core/smiles/Surprised.png create mode 100644 plugins/_core/smiles/Teaser.png create mode 100644 plugins/_core/smiles/Uptight.png create mode 100644 plugins/_core/smiles/Wink.png create mode 100644 plugins/_core/smiles/icondef.xml create mode 100644 plugins/_core/smscfg.cpp create mode 100644 plugins/_core/smscfg.h create mode 100644 plugins/_core/smscfgbase.ui create mode 100644 plugins/_core/status.cpp create mode 100644 plugins/_core/status.h create mode 100644 plugins/_core/statuswnd.cpp create mode 100644 plugins/_core/statuswnd.h create mode 100644 plugins/_core/styles/CMakeLists.txt create mode 100644 plugins/_core/styles/SIM.2.xsl create mode 100644 plugins/_core/styles/SIM.3.xsl create mode 100644 plugins/_core/styles/SIM.4.(2+3).xsl create mode 100644 plugins/_core/styles/SIM.5.2.2.xsl create mode 100644 plugins/_core/styles/SIM.5.2.3.xsl create mode 100644 plugins/_core/styles/SIM.5.2.4.xsl create mode 100644 plugins/_core/styles/SIM.5.2.5.xsl create mode 100644 plugins/_core/styles/SIM.5.2.xsl create mode 100644 plugins/_core/styles/SIM.5.xsl create mode 100644 plugins/_core/styles/SIM.xsl create mode 100644 plugins/_core/styles/Separated.2.xsl create mode 100644 plugins/_core/styles/Separated.3.xsl create mode 100644 plugins/_core/styles/Separated.4.xsl create mode 100644 plugins/_core/styles/Separated.5.(2+3).xsl create mode 100644 plugins/_core/styles/Separated.6.(2+4).xsl create mode 100644 plugins/_core/styles/Separated.7.(3+4).xsl create mode 100644 plugins/_core/styles/Separated.8.(2+3+4).xsl create mode 100644 plugins/_core/styles/Separated.xsl create mode 100644 plugins/_core/styles/XChat.xsl create mode 100644 plugins/_core/styles/XChat2seconds.xsl create mode 100644 plugins/_core/styles/XChat3fullDate.xsl create mode 100644 plugins/_core/textedit_menu.cpp create mode 100644 plugins/_core/tmpl.cpp create mode 100644 plugins/_core/tmpl.h create mode 100644 plugins/_core/toolbar_container.cpp create mode 100644 plugins/_core/toolbar_history.cpp create mode 100644 plugins/_core/toolbar_main.cpp create mode 100644 plugins/_core/toolbar_msgedit.cpp create mode 100644 plugins/_core/toolbar_textedit.cpp create mode 100644 plugins/_core/toolbarcfg.cpp create mode 100644 plugins/_core/toolbarcfg.h create mode 100644 plugins/_core/toolsetup.cpp create mode 100644 plugins/_core/toolsetup.h create mode 100644 plugins/_core/toolsetupbase.ui create mode 100644 plugins/_core/usercfg.cpp create mode 100644 plugins/_core/usercfg.h create mode 100644 plugins/_core/userhistorycfg.cpp create mode 100644 plugins/_core/userhistorycfg.h create mode 100644 plugins/_core/userhistorycfgbase.ui create mode 100644 plugins/_core/userlist.cpp create mode 100644 plugins/_core/userlist.h create mode 100644 plugins/_core/userview.cpp create mode 100644 plugins/_core/userview.h create mode 100644 plugins/_core/userviewcfg.cpp create mode 100644 plugins/_core/userviewcfg.h create mode 100644 plugins/_core/userviewcfgbase.ui create mode 100644 plugins/_core/userviewdelegate.cpp create mode 100644 plugins/_core/userviewdelegate.h create mode 100644 plugins/_core/userwnd.cpp create mode 100644 plugins/_core/userwnd.h create mode 100644 plugins/about/CMakeLists.txt create mode 100644 plugins/about/about.cpp create mode 100644 plugins/about/about.h create mode 100644 plugins/about/about.rc create mode 100644 plugins/about/about.vcproj create mode 100644 plugins/about/aboutdlg.cpp create mode 100644 plugins/about/aboutdlg.h create mode 100644 plugins/about/aboutdlgbase.ui create mode 100644 plugins/action/CMakeLists.txt create mode 100644 plugins/action/action.cpp create mode 100644 plugins/action/action.h create mode 100644 plugins/action/action.rc create mode 100644 plugins/action/action.vcproj create mode 100644 plugins/action/actioncfg.cpp create mode 100644 plugins/action/actioncfg.h create mode 100644 plugins/action/actioncfgbase.ui create mode 100644 plugins/action/additem.cpp create mode 100644 plugins/action/additem.h create mode 100644 plugins/action/additembase.ui create mode 100644 plugins/action/menucfg.cpp create mode 100644 plugins/action/menucfg.h create mode 100644 plugins/action/menucfgbase.ui create mode 100644 plugins/action/resource.h create mode 100644 plugins/autoaway/CMakeLists.txt create mode 100644 plugins/autoaway/autoaway.cpp create mode 100644 plugins/autoaway/autoaway.h create mode 100644 plugins/autoaway/autoaway.rc create mode 100644 plugins/autoaway/autoaway.vcproj create mode 100644 plugins/autoaway/autoawaycfg.cpp create mode 100644 plugins/autoaway/autoawaycfg.h create mode 100644 plugins/autoaway/autoawaycfgbase.ui create mode 100644 plugins/autoaway/configure.in.in create mode 100644 plugins/autoaway/idleui.cpp create mode 100644 plugins/autoaway/idleui.def create mode 100644 plugins/autoaway/idleui.h create mode 100644 plugins/autoaway/idleui.rc create mode 100644 plugins/autoaway/idleui.vcproj create mode 100644 plugins/background/CMakeLists.txt create mode 100644 plugins/background/background.cpp create mode 100644 plugins/background/background.h create mode 100644 plugins/background/background.rc create mode 100644 plugins/background/background.vcproj create mode 100644 plugins/background/bkgndcfg.cpp create mode 100644 plugins/background/bkgndcfg.h create mode 100644 plugins/background/bkgndcfgbase.ui create mode 100644 plugins/dock/CMakeLists.txt create mode 100644 plugins/dock/dock.cpp create mode 100644 plugins/dock/dock.h create mode 100644 plugins/dock/dock.rc create mode 100644 plugins/dock/dock.vcproj create mode 100644 plugins/dock/dockcfg.cpp create mode 100644 plugins/dock/dockcfg.h create mode 100644 plugins/dock/dockcfgbase.ui create mode 100644 plugins/dock/dockwnd.cpp create mode 100644 plugins/dock/dockwnd.h create mode 100644 plugins/filter/CMakeLists.txt create mode 100644 plugins/filter/filter.cpp create mode 100644 plugins/filter/filter.h create mode 100644 plugins/filter/filter.rc create mode 100644 plugins/filter/filter.vcproj create mode 100644 plugins/filter/filtercfg.cpp create mode 100644 plugins/filter/filtercfg.h create mode 100644 plugins/filter/filtercfgbase.ui create mode 100644 plugins/filter/ignorelist.cpp create mode 100644 plugins/filter/ignorelist.h create mode 100644 plugins/filter/ignorelistbase.ui create mode 100644 plugins/flash/flash_win32.zip create mode 100644 plugins/flash/flash_win32/FlashWnd.cpp create mode 100644 plugins/flash/flash_win32/FlashWnd.h create mode 100644 plugins/flash/flash_win32/StdAfx.cpp create mode 100644 plugins/flash/flash_win32/StdAfx.h create mode 100644 plugins/flash/flash_win32/flash.cpp create mode 100644 plugins/flash/flash_win32/flash.h create mode 100644 plugins/flash/flash_win32/flash.ico create mode 100644 plugins/flash/flash_win32/flash.rc create mode 100644 plugins/flash/flash_win32/flash.sln create mode 100644 plugins/flash/flash_win32/flash.vcproj create mode 100644 plugins/flash/flash_win32/resource.h create mode 100644 plugins/flash/flash_win32/small.ico create mode 100644 plugins/floaty/CMakeLists.txt create mode 100644 plugins/floaty/floaty.cpp create mode 100644 plugins/floaty/floaty.h create mode 100644 plugins/floaty/floaty.rc create mode 100644 plugins/floaty/floaty.vcproj create mode 100644 plugins/floaty/floatywnd.cpp create mode 100644 plugins/floaty/floatywnd.h create mode 100644 plugins/forward/CMakeLists.txt create mode 100644 plugins/forward/forward.cpp create mode 100644 plugins/forward/forward.h create mode 100644 plugins/forward/forward.rc create mode 100644 plugins/forward/forward.vcproj create mode 100644 plugins/forward/forwardcfg.cpp create mode 100644 plugins/forward/forwardcfg.h create mode 100644 plugins/forward/forwardcfgbase.ui create mode 100644 plugins/gpg/CMakeLists.txt create mode 100644 plugins/gpg/configure.in.in create mode 100644 plugins/gpg/gpg.cpp create mode 100644 plugins/gpg/gpg.h create mode 100644 plugins/gpg/gpg.rc create mode 100644 plugins/gpg/gpg.vcproj create mode 100644 plugins/gpg/gpg_pch.h create mode 100644 plugins/gpg/gpgadv.cpp create mode 100644 plugins/gpg/gpgadv.h create mode 100644 plugins/gpg/gpgadvbase.ui create mode 100644 plugins/gpg/gpgcfg.cpp create mode 100644 plugins/gpg/gpgcfg.h create mode 100644 plugins/gpg/gpgcfgbase.ui create mode 100644 plugins/gpg/gpgfind.cpp create mode 100644 plugins/gpg/gpgfind.h create mode 100644 plugins/gpg/gpgfindbase.ui create mode 100644 plugins/gpg/gpggen.cpp create mode 100644 plugins/gpg/gpggen.h create mode 100644 plugins/gpg/gpggenbase.ui create mode 100644 plugins/gpg/gpguser.cpp create mode 100644 plugins/gpg/gpguser.h create mode 100644 plugins/gpg/gpguserbase.ui create mode 100644 plugins/gpg/passphrase.cpp create mode 100644 plugins/gpg/passphrase.h create mode 100644 plugins/gpg/passphrasebase.ui create mode 100644 plugins/gpg/resource.h create mode 100644 plugins/icons/CMakeLists.txt create mode 100644 plugins/icons/icon.cpp create mode 100644 plugins/icons/icon.h create mode 100644 plugins/icons/iconcfg.cpp create mode 100644 plugins/icons/iconcfg.h create mode 100644 plugins/icons/iconcfgbase.ui create mode 100644 plugins/icons/icons.rc create mode 100644 plugins/icons/icons.vcproj create mode 100644 plugins/icq/CMakeLists.txt create mode 100644 plugins/icq/aboutinfo.cpp create mode 100644 plugins/icq/aboutinfo.h create mode 100644 plugins/icq/aboutinfobase.ui create mode 100644 plugins/icq/advsearch.cpp create mode 100644 plugins/icq/advsearch.h create mode 100644 plugins/icq/advsearchbase.ui create mode 100644 plugins/icq/aimconfig.cpp create mode 100644 plugins/icq/aimconfig.h create mode 100644 plugins/icq/aimconfigbase.ui create mode 100644 plugins/icq/aiminfo.cpp create mode 100644 plugins/icq/aiminfo.h create mode 100644 plugins/icq/aiminfobase.ui create mode 100644 plugins/icq/aimsearch.cpp create mode 100644 plugins/icq/aimsearch.h create mode 100644 plugins/icq/aimsearchbase.ui create mode 100644 plugins/icq/aimservices.cpp create mode 100644 plugins/icq/configure.in.in create mode 100644 plugins/icq/encodingdlg.cpp create mode 100644 plugins/icq/encodingdlg.h create mode 100644 plugins/icq/encodingdlgbase.ui create mode 100644 plugins/icq/homeinfo.cpp create mode 100644 plugins/icq/homeinfo.h create mode 100644 plugins/icq/homeinfobase.ui create mode 100644 plugins/icq/icq.cpp create mode 100644 plugins/icq/icq.h create mode 100644 plugins/icq/icq.rc create mode 100644 plugins/icq/icq.vcproj create mode 100644 plugins/icq/icq_events.h create mode 100644 plugins/icq/icq_pch.h create mode 100644 plugins/icq/icqbos.cpp create mode 100644 plugins/icq/icqbuddy.cpp create mode 100644 plugins/icq/icqbuddy.h create mode 100644 plugins/icq/icqbuffer.cpp create mode 100644 plugins/icq/icqbuffer.h create mode 100644 plugins/icq/icqclient.cpp create mode 100644 plugins/icq/icqclient.h create mode 100644 plugins/icq/icqconfig.cpp create mode 100644 plugins/icq/icqconfig.h create mode 100644 plugins/icq/icqconfigbase.ui create mode 100644 plugins/icq/icqdirect.cpp create mode 100644 plugins/icq/icqdirect.h create mode 100644 plugins/icq/icqicmb.cpp create mode 100644 plugins/icq/icqicmb.h create mode 100644 plugins/icq/icqinfo.cpp create mode 100644 plugins/icq/icqinfo.h create mode 100644 plugins/icq/icqinfobase.ui create mode 100644 plugins/icq/icqlists.cpp create mode 100644 plugins/icq/icqlocation.cpp create mode 100644 plugins/icq/icqlocation.h create mode 100644 plugins/icq/icqlogin.cpp create mode 100644 plugins/icq/icqmessage.cpp create mode 100644 plugins/icq/icqmessage.h create mode 100644 plugins/icq/icqpicture.cpp create mode 100644 plugins/icq/icqpicture.h create mode 100644 plugins/icq/icqpicturebase.ui create mode 100644 plugins/icq/icqping.cpp create mode 100644 plugins/icq/icqsearch.cpp create mode 100644 plugins/icq/icqsearch.h create mode 100644 plugins/icq/icqsearchbase.ui create mode 100644 plugins/icq/icqsecure.cpp create mode 100644 plugins/icq/icqsecure.h create mode 100644 plugins/icq/icqsecurebase.ui create mode 100644 plugins/icq/icqservice.cpp create mode 100644 plugins/icq/icqservice.h create mode 100644 plugins/icq/icqssbi.cpp create mode 100644 plugins/icq/icqssbi.h create mode 100644 plugins/icq/icqstatus.cpp create mode 100644 plugins/icq/icqstatus.h create mode 100644 plugins/icq/icqvarious.cpp create mode 100644 plugins/icq/interestsinfo.cpp create mode 100644 plugins/icq/interestsinfo.h create mode 100644 plugins/icq/interestsinfobase.ui create mode 100644 plugins/icq/moreinfo.cpp create mode 100644 plugins/icq/moreinfo.h create mode 100644 plugins/icq/moreinfobase.ui create mode 100644 plugins/icq/pastinfo.cpp create mode 100644 plugins/icq/pastinfo.h create mode 100644 plugins/icq/pastinfobase.ui create mode 100644 plugins/icq/polling.cpp create mode 100644 plugins/icq/polling.h create mode 100644 plugins/icq/rtf.ll create mode 100644 plugins/icq/rtfgen.cpp create mode 100644 plugins/icq/securedlg.cpp create mode 100644 plugins/icq/securedlg.h create mode 100644 plugins/icq/securedlgbase.ui create mode 100644 plugins/icq/snac.cpp create mode 100644 plugins/icq/snac.h create mode 100644 plugins/icq/verifydlg.cpp create mode 100644 plugins/icq/verifydlg.h create mode 100644 plugins/icq/verifydlgbase.ui create mode 100644 plugins/icq/warndlg.cpp create mode 100644 plugins/icq/warndlg.h create mode 100644 plugins/icq/warndlgbase.ui create mode 100644 plugins/icq/workinfo.cpp create mode 100644 plugins/icq/workinfo.h create mode 100644 plugins/icq/workinfobase.ui create mode 100644 plugins/icq/xml.cpp create mode 100644 plugins/icq/xml.h create mode 100644 plugins/jabber/CMakeLists.txt create mode 100644 plugins/jabber/discoinfo.cpp create mode 100644 plugins/jabber/discoinfo.h create mode 100644 plugins/jabber/discoinfobase.ui create mode 100644 plugins/jabber/httppoll.cpp create mode 100644 plugins/jabber/infoproxy.cpp create mode 100644 plugins/jabber/infoproxy.h create mode 100644 plugins/jabber/infoproxybase.ui create mode 100644 plugins/jabber/jabber.cpp create mode 100644 plugins/jabber/jabber.h create mode 100644 plugins/jabber/jabber.rc create mode 100644 plugins/jabber/jabber.vcproj create mode 100644 plugins/jabber/jabber_auth.cpp create mode 100644 plugins/jabber/jabber_events.h create mode 100644 plugins/jabber/jabber_pch.h create mode 100644 plugins/jabber/jabber_rosters.cpp create mode 100644 plugins/jabber/jabber_ssl.cpp create mode 100644 plugins/jabber/jabber_ssl.h create mode 100644 plugins/jabber/jabberaboutinfo.cpp create mode 100644 plugins/jabber/jabberaboutinfo.h create mode 100644 plugins/jabber/jabberaboutinfobase.ui create mode 100644 plugins/jabber/jabberadd.cpp create mode 100644 plugins/jabber/jabberadd.h create mode 100644 plugins/jabber/jabberaddbase.ui create mode 100644 plugins/jabber/jabberbrowser.cpp create mode 100644 plugins/jabber/jabberbrowser.h create mode 100644 plugins/jabber/jabberbuffer.cpp create mode 100644 plugins/jabber/jabberbuffer.h create mode 100644 plugins/jabber/jabberclient.cpp create mode 100644 plugins/jabber/jabberclient.h create mode 100644 plugins/jabber/jabberconfig.cpp create mode 100644 plugins/jabber/jabberconfig.h create mode 100644 plugins/jabber/jabberconfigbase.ui create mode 100644 plugins/jabber/jabberfiletransfer.cpp create mode 100644 plugins/jabber/jabberhomeinfo.cpp create mode 100644 plugins/jabber/jabberhomeinfo.h create mode 100644 plugins/jabber/jabberhomeinfobase.ui create mode 100644 plugins/jabber/jabberinfo.cpp create mode 100644 plugins/jabber/jabberinfo.h create mode 100644 plugins/jabber/jabberinfobase.ui create mode 100644 plugins/jabber/jabbermessage.cpp create mode 100644 plugins/jabber/jabbermessage.h create mode 100644 plugins/jabber/jabberpicture.cpp create mode 100644 plugins/jabber/jabberpicture.h create mode 100644 plugins/jabber/jabberpicturebase.ui create mode 100644 plugins/jabber/jabbersearch.cpp create mode 100644 plugins/jabber/jabbersearch.h create mode 100644 plugins/jabber/jabberstatus.cpp create mode 100644 plugins/jabber/jabberstatus.h create mode 100644 plugins/jabber/jabberworkinfo.cpp create mode 100644 plugins/jabber/jabberworkinfo.h create mode 100644 plugins/jabber/jabberworkinfobase.ui create mode 100644 plugins/jabber/jidadvsearch.cpp create mode 100644 plugins/jabber/jidadvsearch.h create mode 100644 plugins/jabber/jidadvsearchbase.ui create mode 100644 plugins/jabber/jidsearch.cpp create mode 100644 plugins/jabber/jidsearch.h create mode 100644 plugins/jabber/jidsearchbase.ui create mode 100644 plugins/livejournal/CMakeLists.txt create mode 100644 plugins/livejournal/configure.in.in create mode 100644 plugins/livejournal/journalsearch.cpp create mode 100644 plugins/livejournal/journalsearch.h create mode 100644 plugins/livejournal/journalsearchbase.ui create mode 100644 plugins/livejournal/livejournal.cpp create mode 100644 plugins/livejournal/livejournal.h create mode 100644 plugins/livejournal/livejournal.rc create mode 100644 plugins/livejournal/livejournal.vcproj create mode 100644 plugins/livejournal/livejournalcfg.cpp create mode 100644 plugins/livejournal/livejournalcfg.h create mode 100644 plugins/livejournal/livejournalcfgbase.ui create mode 100644 plugins/livejournal/msgjournal.cpp create mode 100644 plugins/livejournal/msgjournal.h create mode 100644 plugins/livejournal/msgjournalbase.ui create mode 100644 plugins/logger/CMakeLists.txt create mode 100644 plugins/logger/logconfig.cpp create mode 100644 plugins/logger/logconfig.h create mode 100644 plugins/logger/logconfigbase.ui create mode 100644 plugins/logger/logger.cpp create mode 100644 plugins/logger/logger.h create mode 100644 plugins/logger/logger.rc create mode 100644 plugins/logger/logger.vcproj create mode 100644 plugins/msn/CMakeLists.txt create mode 100644 plugins/msn/configure.in.in create mode 100644 plugins/msn/msn.cpp create mode 100644 plugins/msn/msn.h create mode 100644 plugins/msn/msn.rc create mode 100644 plugins/msn/msn.vcproj create mode 100644 plugins/msn/msn_pch.h create mode 100644 plugins/msn/msnclient.cpp create mode 100644 plugins/msn/msnclient.h create mode 100644 plugins/msn/msnconfig.cpp create mode 100644 plugins/msn/msnconfig.h create mode 100644 plugins/msn/msnconfigbase.ui create mode 100644 plugins/msn/msnfiletransfer.cpp create mode 100644 plugins/msn/msnhttp.cpp create mode 100644 plugins/msn/msnhttp.h create mode 100644 plugins/msn/msninfo.cpp create mode 100644 plugins/msn/msninfo.h create mode 100644 plugins/msn/msninfobase.ui create mode 100644 plugins/msn/msnpacket.cpp create mode 100644 plugins/msn/msnpacket.h create mode 100644 plugins/msn/msnsearch.cpp create mode 100644 plugins/msn/msnsearch.h create mode 100644 plugins/msn/msnsearchbase.ui create mode 100644 plugins/navigate/CMakeLists.txt create mode 100644 plugins/navigate/navcfg.cpp create mode 100644 plugins/navigate/navcfg.h create mode 100644 plugins/navigate/navcfgbase.ui create mode 100644 plugins/navigate/navigate.cpp create mode 100644 plugins/navigate/navigate.h create mode 100644 plugins/navigate/navigate.rc create mode 100644 plugins/navigate/navigate.vcproj create mode 100644 plugins/navigate/parseurl.ll create mode 100644 plugins/netmonitor/CMakeLists.txt create mode 100644 plugins/netmonitor/monitor.cpp create mode 100644 plugins/netmonitor/monitor.h create mode 100644 plugins/netmonitor/netmonitor.cpp create mode 100644 plugins/netmonitor/netmonitor.h create mode 100644 plugins/netmonitor/netmonitor.vcproj create mode 100644 plugins/ontop/CMakeLists.txt create mode 100644 plugins/ontop/configure.in.in create mode 100644 plugins/ontop/ontop.cpp create mode 100644 plugins/ontop/ontop.h create mode 100644 plugins/ontop/ontop.rc create mode 100644 plugins/ontop/ontop.vcproj create mode 100644 plugins/ontop/ontopcfg.cpp create mode 100644 plugins/ontop/ontopcfg.h create mode 100644 plugins/ontop/ontopcfgbase.ui create mode 100644 plugins/osd/CMakeLists.txt create mode 100644 plugins/osd/osd.cpp create mode 100644 plugins/osd/osd.h create mode 100644 plugins/osd/osd.rc create mode 100644 plugins/osd/osd.vcproj create mode 100644 plugins/osd/osdconfig.cpp create mode 100644 plugins/osd/osdconfig.h create mode 100644 plugins/osd/osdconfigbase.ui create mode 100644 plugins/osd/osdiface.cpp create mode 100644 plugins/osd/osdiface.h create mode 100644 plugins/osd/osdifacebase.ui create mode 100644 plugins/proxy/CMakeLists.txt create mode 100644 plugins/proxy/proxy.cpp create mode 100644 plugins/proxy/proxy.h create mode 100644 plugins/proxy/proxy.rc create mode 100644 plugins/proxy/proxy.vcproj create mode 100644 plugins/proxy/proxycfg.cpp create mode 100644 plugins/proxy/proxycfg.h create mode 100644 plugins/proxy/proxycfgbase.ui create mode 100644 plugins/proxy/proxyerror.cpp create mode 100644 plugins/proxy/proxyerror.h create mode 100644 plugins/proxy/proxyerrorbase.ui create mode 100644 plugins/remote/CMakeLists.txt create mode 100644 plugins/remote/IContextMenuImpl.h create mode 100644 plugins/remote/IShellExtInitImpl.h create mode 100644 plugins/remote/SIM_ext.cpp create mode 100644 plugins/remote/SIM_ext.h create mode 100644 plugins/remote/SIM_ext.rgs create mode 100644 plugins/remote/SimControl.cpp create mode 100644 plugins/remote/SimControl.h create mode 100644 plugins/remote/SimControl.rgs create mode 100644 plugins/remote/configure.in.in create mode 100644 plugins/remote/remote.cpp create mode 100644 plugins/remote/remote.h create mode 100644 plugins/remote/remote.rc create mode 100644 plugins/remote/remote.vcproj create mode 100644 plugins/remote/remotecfg.cpp create mode 100644 plugins/remote/remotecfg.h create mode 100644 plugins/remote/remotecfgbase.ui create mode 100644 plugins/remote/resource.h create mode 100644 plugins/remote/sim_remote.cpp create mode 100644 plugins/remote/simctrl.cpp create mode 100644 plugins/remote/simctrl.desktop create mode 100644 plugins/remote/simctrl.vcproj create mode 100644 plugins/remote/simext.cpp create mode 100644 plugins/remote/simext.def create mode 100644 plugins/remote/simext.idl create mode 100644 plugins/remote/simext.rc create mode 100644 plugins/remote/simext.vcproj create mode 100644 plugins/remote/simipc.cpp create mode 100644 plugins/remote/simipc.vcproj create mode 100644 plugins/remote/simremote.def create mode 100644 plugins/remote/simremote.idl create mode 100644 plugins/remote/simremote.rc create mode 100644 plugins/remote/simremote.vcproj create mode 100644 plugins/remote/x-icq.desktop create mode 100644 plugins/replace/CMakeLists.txt create mode 100644 plugins/replace/replace.cpp create mode 100644 plugins/replace/replace.h create mode 100644 plugins/replace/replace.rc create mode 100644 plugins/replace/replace.vcproj create mode 100644 plugins/replace/replacecfg.cpp create mode 100644 plugins/replace/replacecfg.h create mode 100644 plugins/replace/replacecfgbase.ui create mode 100644 plugins/shortcuts/CMakeLists.txt create mode 100644 plugins/shortcuts/configure.in.in create mode 100644 plugins/shortcuts/mousecfg.cpp create mode 100644 plugins/shortcuts/mousecfg.h create mode 100644 plugins/shortcuts/mousecfgbase.ui create mode 100644 plugins/shortcuts/shortcutcfg.cpp create mode 100644 plugins/shortcuts/shortcutcfg.h create mode 100644 plugins/shortcuts/shortcutcfgbase.ui create mode 100644 plugins/shortcuts/shortcuts.cpp create mode 100644 plugins/shortcuts/shortcuts.h create mode 100644 plugins/shortcuts/shortcuts.rc create mode 100644 plugins/shortcuts/shortcuts.vcproj create mode 100644 plugins/skype/call_end create mode 100644 plugins/skype/call_start create mode 100644 plugins/skype/icons/cr16-action-call.png create mode 100644 plugins/skype/icons/cr16-action-contact_ffc_overlay.png create mode 100644 plugins/skype/icons/cr16-app-skype_protocol.png create mode 100644 plugins/skype/icons/cr22-action-call.png create mode 100644 plugins/skype/icons/cr32-action-call.png create mode 100644 plugins/skype/icons/hi16-action-call.png create mode 100644 plugins/skype/icons/hi16-action-contact_ffc_overlay.png create mode 100644 plugins/skype/icons/hi16-action-contact_unknown_overlay.png create mode 100644 plugins/skype/icons/hi16-action-skype_connect.png create mode 100644 plugins/skype/icons/icondef.xml create mode 100644 plugins/skype/libskype/skype.cpp create mode 100644 plugins/skype/libskype/skype.h create mode 100644 plugins/skype/libskype/skypedbus/connection.cpp create mode 100644 plugins/skype/libskype/skypedbus/connection.h create mode 100644 plugins/skype/libskype/skypedbus/integrator.cpp create mode 100644 plugins/skype/libskype/skypedbus/integrator.h create mode 100644 plugins/skype/libskype/skypedbus/message.cpp create mode 100644 plugins/skype/libskype/skypedbus/message.h create mode 100644 plugins/skype/libskype/skypedbus/skypeconnection.cpp create mode 100644 plugins/skype/libskype/skypedbus/skypeconnection.h create mode 100644 plugins/skype/skypeaccount.cpp create mode 100644 plugins/skype/skypeaccount.h create mode 100644 plugins/skype/skypeaddcontact.cpp create mode 100644 plugins/skype/skypeaddcontact.h create mode 100644 plugins/skype/skypeaddcontactbase.ui create mode 100644 plugins/skype/skypecalldialog.cpp create mode 100644 plugins/skype/skypecalldialog.h create mode 100644 plugins/skype/skypecalldialogbase.ui create mode 100644 plugins/skype/skypechatsession.cpp create mode 100644 plugins/skype/skypechatsession.h create mode 100644 plugins/skype/skypeconference.cpp create mode 100644 plugins/skype/skypeconference.h create mode 100644 plugins/skype/skypecontact.cpp create mode 100644 plugins/skype/skypecontact.h create mode 100644 plugins/skype/skypedetails.cpp create mode 100644 plugins/skype/skypedetails.h create mode 100644 plugins/skype/skypedetailsbase.ui create mode 100644 plugins/skype/skypeeditaccount.cpp create mode 100644 plugins/skype/skypeeditaccount.h create mode 100644 plugins/skype/skypeeditaccountbase.ui create mode 100644 plugins/skype/skypeeditaccountwidget.cpp create mode 100644 plugins/skype/skypeprotocol.cpp create mode 100644 plugins/skype/skypeprotocol.h create mode 100644 plugins/sms/CMakeLists.txt create mode 100644 plugins/sms/gsm_ta.cpp create mode 100644 plugins/sms/gsm_ta.h create mode 100644 plugins/sms/serial.cpp create mode 100644 plugins/sms/serial.h create mode 100644 plugins/sms/sms.cpp create mode 100644 plugins/sms/sms.h create mode 100644 plugins/sms/sms.rc create mode 100644 plugins/sms/sms.vcproj create mode 100644 plugins/sms/smssetup.cpp create mode 100644 plugins/sms/smssetup.h create mode 100644 plugins/sms/smssetupbase.ui create mode 100644 plugins/sms/xpm/simcard.xpm create mode 100644 plugins/sound/CMakeLists.txt create mode 100644 plugins/sound/ogg.rules create mode 100644 plugins/sound/sound.cpp create mode 100644 plugins/sound/sound.h create mode 100644 plugins/sound/sound.rc create mode 100644 plugins/sound/sound.vcproj create mode 100644 plugins/sound/soundconfig.cpp create mode 100644 plugins/sound/soundconfig.h create mode 100644 plugins/sound/soundconfigbase.ui create mode 100644 plugins/sound/sounds/added.ogg create mode 100644 plugins/sound/sounds/alert.ogg create mode 100644 plugins/sound/sounds/auth.ogg create mode 100644 plugins/sound/sounds/authrequest.ogg create mode 100644 plugins/sound/sounds/contactrequest.ogg create mode 100644 plugins/sound/sounds/contacts.ogg create mode 100644 plugins/sound/sounds/deleted.ogg create mode 100644 plugins/sound/sounds/error.ogg create mode 100644 plugins/sound/sounds/file.ogg create mode 100644 plugins/sound/sounds/filedone.ogg create mode 100644 plugins/sound/sounds/mailpager.ogg create mode 100644 plugins/sound/sounds/message.ogg create mode 100644 plugins/sound/sounds/msgsent.ogg create mode 100644 plugins/sound/sounds/refused.ogg create mode 100644 plugins/sound/sounds/sms.ogg create mode 100644 plugins/sound/sounds/startup.ogg create mode 100644 plugins/sound/sounds/startup2.ogg create mode 100644 plugins/sound/sounds/startup3.ogg create mode 100644 plugins/sound/sounds/url.ogg create mode 100644 plugins/sound/sounds/vip-online.ogg create mode 100644 plugins/sound/sounds/web.ogg create mode 100644 plugins/sound/sounduser.cpp create mode 100644 plugins/sound/sounduser.h create mode 100644 plugins/sound/sounduserbase.ui create mode 100644 plugins/spell/CMakeLists.txt create mode 100644 plugins/spell/configure.in.in create mode 100644 plugins/spell/spell.cpp create mode 100644 plugins/spell/spell.h create mode 100644 plugins/spell/spell.rc create mode 100644 plugins/spell/spell.vcproj create mode 100644 plugins/spell/spellcfg.cpp create mode 100644 plugins/spell/spellcfg.h create mode 100644 plugins/spell/spellcfgbase.ui create mode 100644 plugins/spell/speller.cpp create mode 100644 plugins/spell/speller.h create mode 100644 plugins/spell/spellfind.cpp create mode 100644 plugins/spell/spellfind.h create mode 100644 plugins/spell/spellfindbase.ui create mode 100644 plugins/spell/spellhighlight.cpp create mode 100644 plugins/spell/spellhighlight.h create mode 100644 plugins/splash/CMakeLists.txt create mode 100644 plugins/splash/SIM-IM.svg create mode 100644 plugins/splash/simsvg-template.png create mode 100644 plugins/splash/splash.cpp create mode 100644 plugins/splash/splash.h create mode 100644 plugins/splash/splash.png create mode 100644 plugins/splash/splash.vcproj create mode 100644 plugins/styles/CMakeLists.txt create mode 100644 plugins/styles/fontconfig.cpp create mode 100644 plugins/styles/fontconfig.h create mode 100644 plugins/styles/fontconfigbase.ui create mode 100644 plugins/styles/metal/CMakeLists.txt create mode 100644 plugins/styles/metal/marble.xpm create mode 100644 plugins/styles/metal/metal.cpp create mode 100644 plugins/styles/metal/metal.h create mode 100644 plugins/styles/metal/metal.rc create mode 100644 plugins/styles/metal/metal.vcproj create mode 100644 plugins/styles/metal/metal.xpm create mode 100644 plugins/styles/metal/stone1.xpm create mode 100644 plugins/styles/metal/stonebright.xpm create mode 100644 plugins/styles/metal/stonedark.xpm create mode 100644 plugins/styles/styles.cpp create mode 100644 plugins/styles/styles.h create mode 100644 plugins/styles/styles.rc create mode 100644 plugins/styles/styles.vcproj create mode 100644 plugins/styles/stylescfg.cpp create mode 100644 plugins/styles/stylescfg.h create mode 100644 plugins/styles/stylescfgbase.ui create mode 100644 plugins/styles/wood/CMakeLists.txt create mode 100644 plugins/styles/wood/wood.cpp create mode 100644 plugins/styles/wood/wood.h create mode 100644 plugins/styles/wood/wood.rc create mode 100644 plugins/styles/wood/wood.vcproj create mode 100644 plugins/transparent/CMakeLists.txt create mode 100644 plugins/transparent/configure.in.in create mode 100644 plugins/transparent/transparent.cpp create mode 100644 plugins/transparent/transparent.h create mode 100644 plugins/transparent/transparent.rc create mode 100644 plugins/transparent/transparent.vcproj create mode 100644 plugins/transparent/transparentcfg.cpp create mode 100644 plugins/transparent/transparentcfg.h create mode 100644 plugins/transparent/transparentcfgbase.ui create mode 100644 plugins/transparent/transtop.cpp create mode 100644 plugins/transparent/transtop.h create mode 100644 plugins/update/CMakeLists.txt create mode 100644 plugins/update/update.cpp create mode 100644 plugins/update/update.h create mode 100644 plugins/update/update.rc create mode 100644 plugins/update/update.vcproj create mode 100644 plugins/weather/CMakeLists.txt create mode 100644 plugins/weather/jisp/0.png create mode 100644 plugins/weather/jisp/1.png create mode 100644 plugins/weather/jisp/10.png create mode 100644 plugins/weather/jisp/11.png create mode 100644 plugins/weather/jisp/12.png create mode 100644 plugins/weather/jisp/13.png create mode 100644 plugins/weather/jisp/14.png create mode 100644 plugins/weather/jisp/15.png create mode 100644 plugins/weather/jisp/16.png create mode 100644 plugins/weather/jisp/17.png create mode 100644 plugins/weather/jisp/18.png create mode 100644 plugins/weather/jisp/19.png create mode 100644 plugins/weather/jisp/2.png create mode 100644 plugins/weather/jisp/20.png create mode 100644 plugins/weather/jisp/21.png create mode 100644 plugins/weather/jisp/22.png create mode 100644 plugins/weather/jisp/23.png create mode 100644 plugins/weather/jisp/24.png create mode 100644 plugins/weather/jisp/25.png create mode 100644 plugins/weather/jisp/26.png create mode 100644 plugins/weather/jisp/27.png create mode 100644 plugins/weather/jisp/28.png create mode 100644 plugins/weather/jisp/29.png create mode 100644 plugins/weather/jisp/3.png create mode 100644 plugins/weather/jisp/30.png create mode 100644 plugins/weather/jisp/31.png create mode 100644 plugins/weather/jisp/32.png create mode 100644 plugins/weather/jisp/33.png create mode 100644 plugins/weather/jisp/34.png create mode 100644 plugins/weather/jisp/35.png create mode 100644 plugins/weather/jisp/36.png create mode 100644 plugins/weather/jisp/37.png create mode 100644 plugins/weather/jisp/38.png create mode 100644 plugins/weather/jisp/39.png create mode 100644 plugins/weather/jisp/4.png create mode 100644 plugins/weather/jisp/40.png create mode 100644 plugins/weather/jisp/41.png create mode 100644 plugins/weather/jisp/42.png create mode 100644 plugins/weather/jisp/43.png create mode 100644 plugins/weather/jisp/44.png create mode 100644 plugins/weather/jisp/45.png create mode 100644 plugins/weather/jisp/46.png create mode 100644 plugins/weather/jisp/47.png create mode 100644 plugins/weather/jisp/5.png create mode 100644 plugins/weather/jisp/6.png create mode 100644 plugins/weather/jisp/7.png create mode 100644 plugins/weather/jisp/8.png create mode 100644 plugins/weather/jisp/9.png create mode 100644 plugins/weather/jisp/icondef.xml create mode 100644 plugins/weather/jisp/license create mode 100644 plugins/weather/jisp/m0.png create mode 100644 plugins/weather/jisp/m1.png create mode 100644 plugins/weather/jisp/m10.png create mode 100644 plugins/weather/jisp/m11.png create mode 100644 plugins/weather/jisp/m12.png create mode 100644 plugins/weather/jisp/m13.png create mode 100644 plugins/weather/jisp/m14.png create mode 100644 plugins/weather/jisp/m15.png create mode 100644 plugins/weather/jisp/m16.png create mode 100644 plugins/weather/jisp/m17.png create mode 100644 plugins/weather/jisp/m18.png create mode 100644 plugins/weather/jisp/m19.png create mode 100644 plugins/weather/jisp/m2.png create mode 100644 plugins/weather/jisp/m20.png create mode 100644 plugins/weather/jisp/m21.png create mode 100644 plugins/weather/jisp/m22.png create mode 100644 plugins/weather/jisp/m23.png create mode 100644 plugins/weather/jisp/m24.png create mode 100644 plugins/weather/jisp/m25.png create mode 100644 plugins/weather/jisp/m26.png create mode 100644 plugins/weather/jisp/m27.png create mode 100644 plugins/weather/jisp/m28.png create mode 100644 plugins/weather/jisp/m29.png create mode 100644 plugins/weather/jisp/m3.png create mode 100644 plugins/weather/jisp/m4.png create mode 100644 plugins/weather/jisp/m5.png create mode 100644 plugins/weather/jisp/m6.png create mode 100644 plugins/weather/jisp/m7.png create mode 100644 plugins/weather/jisp/m8.png create mode 100644 plugins/weather/jisp/m9.png create mode 100644 plugins/weather/jisp/na.png create mode 100644 plugins/weather/weather.cpp create mode 100644 plugins/weather/weather.h create mode 100644 plugins/weather/weather.rc create mode 100644 plugins/weather/weather.vcproj create mode 100644 plugins/weather/weathercfg.cpp create mode 100644 plugins/weather/weathercfg.h create mode 100644 plugins/weather/weathercfgbase.ui create mode 100644 plugins/weather/wifacecfg.cpp create mode 100644 plugins/weather/wifacecfg.h create mode 100644 plugins/weather/wifacecfgbase.ui create mode 100644 plugins/windock/CMakeLists.txt create mode 100644 plugins/windock/configure.in.in create mode 100644 plugins/windock/windock.cpp create mode 100644 plugins/windock/windock.h create mode 100644 plugins/windock/windock.rc create mode 100644 plugins/windock/windock.vcproj create mode 100644 plugins/yahoo/CMakeLists.txt create mode 100644 plugins/yahoo/configure.in.in create mode 100644 plugins/yahoo/crypt.cpp create mode 100644 plugins/yahoo/yahoo.cpp create mode 100644 plugins/yahoo/yahoo.h create mode 100644 plugins/yahoo/yahoo.rc create mode 100644 plugins/yahoo/yahoo.vcproj create mode 100644 plugins/yahoo/yahoo_pch.h create mode 100644 plugins/yahoo/yahooauth.cpp create mode 100644 plugins/yahoo/yahoocfg.cpp create mode 100644 plugins/yahoo/yahoocfg.h create mode 100644 plugins/yahoo/yahoocfgbase.ui create mode 100644 plugins/yahoo/yahooclient.cpp create mode 100644 plugins/yahoo/yahooclient.h create mode 100644 plugins/yahoo/yahoofiletransfer.cpp create mode 100644 plugins/yahoo/yahoohttp.cpp create mode 100644 plugins/yahoo/yahooinfo.cpp create mode 100644 plugins/yahoo/yahooinfo.h create mode 100644 plugins/yahoo/yahooinfobase.ui create mode 100644 plugins/yahoo/yahoosearch.cpp create mode 100644 plugins/yahoo/yahoosearch.h create mode 100644 plugins/yahoo/yahoosearchbase.ui create mode 100644 plugins/yahoo/yahootransformtables.c create mode 100644 plugins/zodiak/CMakeLists.txt create mode 100644 plugins/zodiak/xpm/1.xpm create mode 100644 plugins/zodiak/xpm/10.xpm create mode 100644 plugins/zodiak/xpm/11.xpm create mode 100644 plugins/zodiak/xpm/12.xpm create mode 100644 plugins/zodiak/xpm/2.xpm create mode 100644 plugins/zodiak/xpm/3.xpm create mode 100644 plugins/zodiak/xpm/4.xpm create mode 100644 plugins/zodiak/xpm/5.xpm create mode 100644 plugins/zodiak/xpm/6.xpm create mode 100644 plugins/zodiak/xpm/7.xpm create mode 100644 plugins/zodiak/xpm/8.xpm create mode 100644 plugins/zodiak/xpm/9.xpm create mode 100644 plugins/zodiak/zodiak.cpp create mode 100644 plugins/zodiak/zodiak.h create mode 100644 plugins/zodiak/zodiak.rc create mode 100644 plugins/zodiak/zodiak.vcproj create mode 100644 po/bg.po create mode 100644 po/ca.po create mode 100644 po/cs.po create mode 100644 po/de.po create mode 100644 po/el.po create mode 100644 po/es.po create mode 100644 po/fr.po create mode 100644 po/he.po create mode 100644 po/hu.po create mode 100644 po/it.po create mode 100644 po/nl.po create mode 100644 po/pl.po create mode 100644 po/pt_BR.po create mode 100644 po/ru.po create mode 100644 po/sim.pot create mode 100644 po/sk.po create mode 100644 po/sv.po create mode 100644 po/sw.po create mode 100644 po/th.po create mode 100644 po/tr.po create mode 100644 po/uk.po create mode 100644 po/zh_TW.po create mode 100644 porting-issues.html create mode 100644 resource.h create mode 100644 sim.pro create mode 100644 sim.pro.user create mode 100644 sim.sln create mode 100644 sim.vcproj create mode 100644 sim/CMakeLists.txt create mode 100644 sim/aboutdata.cpp create mode 100644 sim/aboutdata.h create mode 100644 sim/buffer.cpp create mode 100644 sim/buffer.h create mode 100644 sim/builtinlogger.cpp create mode 100644 sim/builtinlogger.h create mode 100644 sim/cfg.cpp create mode 100644 sim/cfg.h create mode 100644 sim/cjk_variants.h create mode 100644 sim/clientlist.cpp create mode 100644 sim/clientlist.h create mode 100644 sim/clientmanager.cpp create mode 100644 sim/clientmanager.h create mode 100644 sim/cmddef.cpp create mode 100644 sim/cmddef.h create mode 100644 sim/contacts.cpp create mode 100644 sim/contacts.h create mode 100644 sim/contacts/client.cpp create mode 100644 sim/contacts/client.h create mode 100644 sim/contacts/clientdataiterator.cpp create mode 100644 sim/contacts/clientdataiterator.h create mode 100644 sim/contacts/clientuserdata.cpp create mode 100644 sim/contacts/clientuserdata.h create mode 100644 sim/contacts/clientuserdataprivate.cpp create mode 100644 sim/contacts/clientuserdataprivate.h create mode 100644 sim/contacts/contact.cpp create mode 100644 sim/contacts/contact.h create mode 100644 sim/contacts/group.cpp create mode 100644 sim/contacts/group.h create mode 100644 sim/contacts/imstatus.cpp create mode 100644 sim/contacts/imstatus.h create mode 100644 sim/contacts/packettype.cpp create mode 100644 sim/contacts/packettype.h create mode 100644 sim/contacts/protocol.cpp create mode 100644 sim/contacts/protocol.h create mode 100644 sim/contacts/protocolmanager.cpp create mode 100644 sim/contacts/protocolmanager.h create mode 100644 sim/contacts/userdata.cpp create mode 100644 sim/contacts/userdata.h create mode 100644 sim/country.cpp create mode 100644 sim/country.h create mode 100644 sim/event.cpp create mode 100644 sim/event.h create mode 100644 sim/exec.cpp create mode 100644 sim/exec.h create mode 100644 sim/fetch.cpp create mode 100644 sim/fetch.h create mode 100644 sim/fetchclientprivate.h create mode 100644 sim/html.h create mode 100644 sim/html.ll create mode 100644 sim/icons.cpp create mode 100644 sim/icons.h create mode 100644 sim/icq.ico create mode 100644 sim/johab_hangul.h create mode 100644 sim/kdeisversion.h create mode 100644 sim/libltdl/ltdl.c create mode 100644 sim/libltdl/ltdl.h create mode 100644 sim/log.cpp create mode 100644 sim/log.h create mode 100644 sim/message.cpp create mode 100644 sim/message.h create mode 100644 sim/misc.cpp create mode 100644 sim/misc.h create mode 100644 sim/other_icons/sim-16x16.ico create mode 100644 sim/other_icons/sim.icns create mode 100644 sim/other_icons/sim_XP-style.ico create mode 100644 sim/paths.cpp create mode 100644 sim/paths.h create mode 100644 sim/plugins.cpp create mode 100644 sim/plugins.h create mode 100644 sim/png/CMakeLists.txt create mode 100644 sim/png/hi16-app-sim.png create mode 100644 sim/png/hi22-app-sim.png create mode 100644 sim/png/hi32-app-sim.png create mode 100644 sim/png/hi48-app-sim.png create mode 100644 sim/png/hi64-app-sim.png create mode 100644 sim/png/hi72-app-sim.png create mode 100644 sim/png/lo16-app-sim.png create mode 100644 sim/png/lo22-app-sim.png create mode 100644 sim/png/lo32-app-sim.png create mode 100644 sim/profile.cpp create mode 100644 sim/profile.h create mode 100644 sim/profilemanager.cpp create mode 100644 sim/profilemanager.h create mode 100644 sim/propertyhub.cpp create mode 100644 sim/propertyhub.h create mode 100644 sim/qzip/ioapi.c create mode 100644 sim/qzip/ioapi.h create mode 100644 sim/qzip/qzip.cpp create mode 100644 sim/qzip/qzip.h create mode 100644 sim/qzip/unzip.c create mode 100644 sim/qzip/unzip.h create mode 100644 sim/sax.cpp create mode 100644 sim/sax.h create mode 100644 sim/sim-kde.menu create mode 100644 sim/sim.cpp create mode 100644 sim/sim.desktop create mode 100644 sim/sim.ico create mode 100644 sim/sim.pro.user create mode 100644 sim/sim.rc create mode 100644 sim/sim_pch.h create mode 100644 sim/simapi.cpp create mode 100644 sim/simapi.h create mode 100644 sim/simapp/kdesimapp.cpp create mode 100644 sim/simapp/kdesimapp.h create mode 100644 sim/simapp/simapp.cpp create mode 100644 sim/simapp/simapp.h create mode 100644 sim/simfs.cpp create mode 100644 sim/simfs.h create mode 100644 sim/simgui/ballonmsg.cpp create mode 100644 sim/simgui/ballonmsg.h create mode 100644 sim/simgui/datepicker.cpp create mode 100644 sim/simgui/datepicker.h create mode 100644 sim/simgui/editfile.cpp create mode 100644 sim/simgui/editfile.h create mode 100644 sim/simgui/fontedit.cpp create mode 100644 sim/simgui/fontedit.h create mode 100644 sim/simgui/intedit.cpp create mode 100644 sim/simgui/intedit.h create mode 100644 sim/simgui/linklabel.cpp create mode 100644 sim/simgui/linklabel.h create mode 100644 sim/simgui/listview.cpp create mode 100644 sim/simgui/listview.h create mode 100644 sim/simgui/logindlgbase.ui create mode 100644 sim/simgui/preview.cpp create mode 100644 sim/simgui/preview.h create mode 100644 sim/simgui/qchildwidget.cpp create mode 100644 sim/simgui/qchildwidget.h create mode 100644 sim/simgui/qcolorbutton.cpp create mode 100644 sim/simgui/qcolorbutton.h create mode 100644 sim/simgui/qkeybutton.cpp create mode 100644 sim/simgui/qkeybutton.h create mode 100644 sim/simgui/textshow.cpp create mode 100644 sim/simgui/textshow.h create mode 100644 sim/simgui/toolbtn.cpp create mode 100644 sim/simgui/toolbtn.h create mode 100644 sim/simtests.vcproj create mode 100644 sim/singleton.h create mode 100644 sim/socket/clientsocket.cpp create mode 100644 sim/socket/clientsocket.h create mode 100644 sim/socket/clientsocketnotify.h create mode 100644 sim/socket/interfacechecker.cpp create mode 100644 sim/socket/interfacechecker.h create mode 100644 sim/socket/ip.cpp create mode 100644 sim/socket/ip.h create mode 100644 sim/socket/ipresolver.cpp create mode 100644 sim/socket/ipresolver.h create mode 100644 sim/socket/iresolver.h create mode 100644 sim/socket/serversocket.cpp create mode 100644 sim/socket/serversocket.h create mode 100644 sim/socket/serversocketnotify.cpp create mode 100644 sim/socket/serversocketnotify.h create mode 100644 sim/socket/simclientsocket.cpp create mode 100644 sim/socket/simclientsocket.h create mode 100644 sim/socket/simresolver.cpp create mode 100644 sim/socket/simresolver.h create mode 100644 sim/socket/simserversocket.cpp create mode 100644 sim/socket/simserversocket.h create mode 100644 sim/socket/simsockets.cpp create mode 100644 sim/socket/simsockets.h create mode 100644 sim/socket/socket.cpp create mode 100644 sim/socket/socket.h create mode 100644 sim/socket/socketfactory.cpp create mode 100644 sim/socket/socketfactory.h create mode 100644 sim/socket/socketnotify.h create mode 100644 sim/socket/sslclient.cpp create mode 100644 sim/socket/sslclient.h create mode 100644 sim/socket/stdresolver.cpp create mode 100644 sim/socket/stdresolver.h create mode 100644 sim/socket/tcpclient.cpp create mode 100644 sim/socket/tcpclient.h create mode 100644 sim/tests/test.cpp create mode 100644 sim/tests/testbuffer.cpp create mode 100644 sim/tests/testbuffer.h create mode 100644 sim/tests/testclientmanager.cpp create mode 100644 sim/tests/testclientmanager.h create mode 100644 sim/tests/testclientsocket.cpp create mode 100644 sim/tests/testclientsocket.h create mode 100644 sim/tests/testconfig.cpp create mode 100644 sim/tests/testconfig.h create mode 100644 sim/tests/testcontact.cpp create mode 100644 sim/tests/testcontact.h create mode 100644 sim/tests/testcontactlist.cpp create mode 100644 sim/tests/testcontactlist.h create mode 100644 sim/tests/testpropertyhub.cpp create mode 100644 sim/tests/testpropertyhub.h create mode 100644 sim/tests/testprotocolmanager.cpp create mode 100644 sim/tests/testprotocolmanager.h create mode 100644 sim/tests/testsocketfactory.cpp create mode 100644 sim/tests/testsocketfactory.h create mode 100644 sim/tests/testuserdata.cpp create mode 100644 sim/tests/testuserdata.h create mode 100644 sim/translit.cpp create mode 100644 sim/translit.h create mode 100644 sim/unquot.cpp create mode 100644 sim/unquot.h create mode 100644 sim/win32/iconv.h create mode 100644 sim/win32/jconfig.h create mode 100644 sim/win32/jmorecfg.h create mode 100644 sim/win32/jpeglib.h create mode 100644 sim/win32/libeay32MD.lib create mode 100644 sim/win32/libeay32MDd.lib create mode 100644 sim/win32/libjpeg.lib create mode 100644 sim/win32/libxml.lib create mode 100644 sim/win32/libxml/SAX.h create mode 100644 sim/win32/libxml/SAX2.h create mode 100644 sim/win32/libxml/dict.h create mode 100644 sim/win32/libxml/encoding.h create mode 100644 sim/win32/libxml/entities.h create mode 100644 sim/win32/libxml/globals.h create mode 100644 sim/win32/libxml/hash.h create mode 100644 sim/win32/libxml/list.h create mode 100644 sim/win32/libxml/parser.h create mode 100644 sim/win32/libxml/threads.h create mode 100644 sim/win32/libxml/tree.h create mode 100644 sim/win32/libxml/valid.h create mode 100644 sim/win32/libxml/xlink.h create mode 100644 sim/win32/libxml/xmlIO.h create mode 100644 sim/win32/libxml/xmlautomata.h create mode 100644 sim/win32/libxml/xmlerror.h create mode 100644 sim/win32/libxml/xmlexports.h create mode 100644 sim/win32/libxml/xmlmemory.h create mode 100644 sim/win32/libxml/xmlregexp.h create mode 100644 sim/win32/libxml/xmlstring.h create mode 100644 sim/win32/libxml/xmlversion.h create mode 100644 sim/win32/libxml/xpath.h create mode 100644 sim/win32/libxml_a.lib create mode 100644 sim/win32/libxslt.lib create mode 100644 sim/win32/libxslt/numbersInternals.h create mode 100644 sim/win32/libxslt/transform.h create mode 100644 sim/win32/libxslt/win32config.h create mode 100644 sim/win32/libxslt/xslt.h create mode 100644 sim/win32/libxslt/xsltInternals.h create mode 100644 sim/win32/libxslt/xsltconfig.h create mode 100644 sim/win32/libxslt/xsltexports.h create mode 100644 sim/win32/libxslt/xsltutils.h create mode 100644 sim/win32/libxslt/xsltwin32config.h create mode 100644 sim/win32/libz.a create mode 100644 sim/win32/openssl/aes.h create mode 100644 sim/win32/openssl/applink.c create mode 100644 sim/win32/openssl/asn1.h create mode 100644 sim/win32/openssl/asn1_mac.h create mode 100644 sim/win32/openssl/asn1t.h create mode 100644 sim/win32/openssl/bio.h create mode 100644 sim/win32/openssl/blowfish.h create mode 100644 sim/win32/openssl/bn.h create mode 100644 sim/win32/openssl/buffer.h create mode 100644 sim/win32/openssl/cast.h create mode 100644 sim/win32/openssl/comp.h create mode 100644 sim/win32/openssl/conf.h create mode 100644 sim/win32/openssl/conf_api.h create mode 100644 sim/win32/openssl/crypto.h create mode 100644 sim/win32/openssl/des.h create mode 100644 sim/win32/openssl/des_old.h create mode 100644 sim/win32/openssl/dh.h create mode 100644 sim/win32/openssl/dsa.h create mode 100644 sim/win32/openssl/dso.h create mode 100644 sim/win32/openssl/dtls1.h create mode 100644 sim/win32/openssl/e_os2.h create mode 100644 sim/win32/openssl/ebcdic.h create mode 100644 sim/win32/openssl/ec.h create mode 100644 sim/win32/openssl/ecdh.h create mode 100644 sim/win32/openssl/ecdsa.h create mode 100644 sim/win32/openssl/engine.h create mode 100644 sim/win32/openssl/err.h create mode 100644 sim/win32/openssl/evp.h create mode 100644 sim/win32/openssl/hmac.h create mode 100644 sim/win32/openssl/idea.h create mode 100644 sim/win32/openssl/krb5_asn.h create mode 100644 sim/win32/openssl/kssl.h create mode 100644 sim/win32/openssl/lhash.h create mode 100644 sim/win32/openssl/md2.h create mode 100644 sim/win32/openssl/md4.h create mode 100644 sim/win32/openssl/md5.h create mode 100644 sim/win32/openssl/obj_mac.h create mode 100644 sim/win32/openssl/objects.h create mode 100644 sim/win32/openssl/ocsp.h create mode 100644 sim/win32/openssl/opensslconf.h create mode 100644 sim/win32/openssl/opensslv.h create mode 100644 sim/win32/openssl/ossl_typ.h create mode 100644 sim/win32/openssl/pem.h create mode 100644 sim/win32/openssl/pem2.h create mode 100644 sim/win32/openssl/pkcs12.h create mode 100644 sim/win32/openssl/pkcs7.h create mode 100644 sim/win32/openssl/pq_compat.h create mode 100644 sim/win32/openssl/pqueue.h create mode 100644 sim/win32/openssl/rand.h create mode 100644 sim/win32/openssl/rc2.h create mode 100644 sim/win32/openssl/rc4.h create mode 100644 sim/win32/openssl/ripemd.h create mode 100644 sim/win32/openssl/rsa.h create mode 100644 sim/win32/openssl/safestack.h create mode 100644 sim/win32/openssl/sha.h create mode 100644 sim/win32/openssl/ssl.h create mode 100644 sim/win32/openssl/ssl2.h create mode 100644 sim/win32/openssl/ssl23.h create mode 100644 sim/win32/openssl/ssl3.h create mode 100644 sim/win32/openssl/stack.h create mode 100644 sim/win32/openssl/store.h create mode 100644 sim/win32/openssl/symhacks.h create mode 100644 sim/win32/openssl/tls1.h create mode 100644 sim/win32/openssl/tmdiff.h create mode 100644 sim/win32/openssl/txt_db.h create mode 100644 sim/win32/openssl/ui.h create mode 100644 sim/win32/openssl/x509.h create mode 100644 sim/win32/openssl/x509_vfy.h create mode 100644 sim/win32/openssl/x509v3.h create mode 100644 sim/win32/sim-default.vsprops create mode 100644 sim/win32/ssleay32MD.lib create mode 100644 sim/win32/ssleay32MDd.lib create mode 100644 sim/win32/ts.rules create mode 100644 sim/win32/uic.rules create mode 100644 sim/win32/zconf.h create mode 100644 sim/win32/zlib.h create mode 100644 sim/xsl.cpp create mode 100644 sim/xsl.h create mode 100644 simall.vcproj create mode 100644 suse.spec create mode 100644 ts/bg.ts create mode 100644 ts/ca.ts create mode 100644 ts/cs.ts create mode 100644 ts/de.ts create mode 100644 ts/el.ts create mode 100644 ts/es.ts create mode 100644 ts/fr.ts create mode 100644 ts/he.ts create mode 100644 ts/hu.ts create mode 100644 ts/it.ts create mode 100644 ts/nl.ts create mode 100644 ts/pl.ts create mode 100644 ts/pt_BR.ts create mode 100644 ts/ru.ts create mode 100644 ts/sk.ts create mode 100644 ts/sv.ts create mode 100644 ts/sw.ts create mode 100644 ts/th.ts create mode 100644 ts/tr.ts create mode 100644 ts/uk.ts create mode 100644 ts/zh_TW.ts diff --git a/ALL_BUILD.vcproj b/ALL_BUILD.vcproj new file mode 100644 index 0000000..284ddd4 --- /dev/null +++ b/ALL_BUILD.vcproj @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..e69de29 diff --git a/AUTHORS.sim b/AUTHORS.sim new file mode 100644 index 0000000..2784d04 --- /dev/null +++ b/AUTHORS.sim @@ -0,0 +1,38 @@ +List of authors of original SIM: + +Maintainer: Vladimir Shutoff +Development: Christian Ehrlicher +KAddressBook sync and some art: Stanislav Klyuhin + +Translators: +Bulgarian: Atanas Mavrov +Brazilian: Carlos Tadeu Panato Jr. +Chinese: Stacker Liew +Czech: Pavel Rousar +Czech: Jiri Jurecek +German: Tobias Franz +German: Christoph Thielecke +Greek: Theodore Karkoulis +Hungarian: Kroly Barcza +French: Roméo VIU-BERGES +Italian: Lapo Luchini +Polish: Rafal Bera +Russian: Vladimir Shutoff +Slovak: Tomas Olah +Spain: Jorge Lopez Trescastro +Swabian: Robert Scheck +Thai: Narachai Sakorn +Turkish: Ismail Donmez +Ukranian: Ivan O.Krutyholova + +Currently no translator: +Catalan +Dutch - view nl.po +Hebrew - view he.po + +Bug hunter: +Christoph Thielecke +Marcel Meckel +Robert Scheck +Tobias Franz +Andrey Rahmatullin diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..06a1731 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,258 @@ +# main cmake file for SIM-IM + +PROJECT(Sim-IM) +SET(Sim-IM_VERSION 0.9.6) + +CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0) +SET(CMAKE_COLOR_MAKEFILE ON) + +# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked +SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + +if(COMMAND cmake_policy) + cmake_policy(SET CMP0003 NEW) +endif(COMMAND cmake_policy) + +SET(CMAKE_CXX_FLAGS "-g -Wall") +SET(LINK_FLAGS "-g") + +IF( APPLE ) + SET( PROGNAME Sim-IM ) + SET( MACOSX_BUNDLE_BUNDLE_NAME Sim-IM ) + SET( MACOSX_BUNDLE_ICON_FILE sim.icns ) + SET( MACOSX_BUNDLE_SHORT_VERSION_STRING 0.9.6 ) + SET( MACOSX_BUNDLE_VERSION 0.9.6 ) + SET( MACOSX_BUNDLE_LONG_VERSION_STRING Version 0.9.6 ) + SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -arch i386" ) + SET( CMAKE_C_FLAGS "-arch i386" ) +ELSE( APPLE ) + SET( PROGNAME sim ) +ENDIF( APPLE ) + +#SET(CMAKE_VERBOSE_MAKEFILE ON) + +INCLUDE(Flex) +INCLUDE(Jisp) +INCLUDE(MacroBoolTo01) +INCLUDE(Po) +INCLUDE(SimPlugins) +INCLUDE(DistTarget) +INCLUDE(CheckCXXCompilerFlag) + +OPTION(SIM_ENABLE_FPIE "Enable PIE linking") +OPTION(ENABLE_TARGET_UPDATE_MESSAGES "Enables target that allows to extract i18n messages from the code, and update *.po files with them") + +# need 4.3 for some QHttp functionality +SET(QT_MIN_VERSION 4.3.0) +FIND_PACKAGE(Qt4 REQUIRED) +IF(NOT QT_FOUND) + MESSAGE(FATAL_ERROR "Could not find Qt4 - cannot compile Sim-IM here") +ENDIF(NOT QT_FOUND) + +# needed packages +FIND_PACKAGE(LibXml2 REQUIRED) +FIND_PACKAGE(LibXslt REQUIRED) +FIND_PACKAGE(ZLIB REQUIRED) +FIND_PACKAGE(OpenSSL) +IF(WIN32) + FIND_PACKAGE(LibIconv REQUIRED) +ENDIF(WIN32) + +SET(QT_USE_QTXML 1) +SET(QT_USE_QTUITOOLS 1) +SET(QT_USE_QTNETWORK 1) +SET(QT_USE_PHONON 1) +SET(QT_USE_QTTEST 1) +SET(QT_PHONON_INCLUDE_DIR "/usr/include/phonon") +INCLUDE(${QT_USE_FILE}) + +# optional packages +FIND_PACKAGE(ASPELL) + +IF(NOT WIN32 AND NOT APPLE) + FIND_PACKAGE(KDE4) + IF(KDE4_FOUND) + OPTION(ENABLE_KDE4 "Enable KDE4 support" ON) + IF(ENABLE_KDE4) + ADD_DEFINITIONS(${KDE4_DEFINITIONS} -DUSE_KDE4) + INCLUDE_DIRECTORIES(${KDE4_INCLUDES}) + ENDIF(ENABLE_KDE4) + ENDIF(KDE4_FOUND) + + INCLUDE(FindX11) +ENDIF(NOT WIN32 AND NOT APPLE) + +# do config checks +INCLUDE(ConfigureChecks.cmake) + +MACRO_BOOL_TO_01(OPENSSL_FOUND ENABLE_OPENSSL) +MACRO_BOOL_TO_01(X11_FOUND HAVE_X) + +# development or release builds +OPTION(DEV_BUILD "Build development version" YES) +OPTION(BUILD_DROPPED "Build dropped plugins" NO) +MACRO_BOOL_TO_01(DEV_BUILD CVS_BUILD) + +# global settings for every project +ADD_DEFINITIONS(${QT_DEFINITIONS} -DHAVE_CONFIG_H) +INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/sim + ${Sim-IM_SOURCE_DIR}/sim + ${Sim-IM_SOURCE_DIR}/sim/simgui + ${Sim-IM_SOURCE_DIR}/plugins/_core) +LINK_DIRECTORIES(${QT_LIB_DIR}) + +# windows, microsoft compiler +if(MSVC) + if(CMAKE_COMPILER_2005) + add_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE ) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4661" ) + endif(CMAKE_COMPILER_2005) +else(MSVC) + add_definitions( -Wno-non-virtual-dtor ) +endif(MSVC) + +add_definitions( -DUNICODE ) + +IF(CMAKE_COMPILER_IS_GNUCXX AND SIM_ENABLE_FPIE) + CHECK_CXX_COMPILER_FLAG(-fPIE HAVE_FPIE_SUPPORT) + IF(HAVE_FPIE_SUPPORT) + SET (SIM_CXX_FPIE_FLAGS "-fPIE") + SET (SIM_PIE_LDFLAGS "-pie") + ELSE(HAVE_FPIE_SUPPORT) + MESSAGE(STATUS "Your compiler doesn't support PIE flag") + ENDIF(HAVE_FPIE_SUPPORT) +ENDIF(CMAKE_COMPILER_IS_GNUCXX AND SIM_ENABLE_FPIE) + +SET(SIM_FLAVOUR "" CACHE STRING "Additional suffix for plugin dir and executable file") +if(WIN32) + SET(LIBDIR .) + SET(BINDIR .) + SET(SIM_I18N_DIR po) + SET(SIM_ICONS_DIR icons) + SET(SIM_PICT_DIR pict) + SET(SIM_PLUGIN_DIR plugins) + SET(SIM_SOUND_DIR sounds) + SET(SIM_STYLES_DIR styles) +else(WIN32) +if(APPLE) + SET(SIMBUNDLE ${CMAKE_BINARY_DIR}/sim/${PROGNAME}.app) + SET(LIBDIR ${SIMBUNDLE}/Contents/MacOS) + SET(BINDIR ${CMAKE_BINARY_DIR}) + SET(SIM_I18N_DIR ${SIMBUNDLE}/Contents/Resources/po) + SET(SIM_ICONS_DIR ${SIMBUNDLE}/Contents/Resources/icons) + SET(SIM_PICT_DIR ${SIMBUNDLE}/Contents/Resources/pict) + SET(SIM_PLUGIN_DIR ${SIMBUNDLE}/Contents/PlugIns) + SET(SIM_SOUND_DIR ${SIMBUNDLE}/Contents/Resources/sounds) + SET(SIM_STYLES_DIR ${SIMBUNDLE}/Contents/Resources/styles) +else(APPLE) + SET(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)") + SET(LIBDIR ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX} CACHE PATH "Path to sim library") + SET(BINDIR ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "Path to sim binary") + SET(DATADIR ${CMAKE_INSTALL_PREFIX}/share/apps/sim CACHE PATH "Path to sim data") + SET(SIM_PLUGIN_DIR ${LIBDIR}/sim${SIM_FLAVOUR} CACHE PATH "Path to sim plugins") + SET(SIM_I18N_DIR ${CMAKE_INSTALL_PREFIX}/share/locale) + SET(SIM_ICONS_DIR ${DATADIR}/icons) + SET(SIM_PICT_DIR ${DATADIR}/pict) + SET(SIM_SOUND_DIR ${DATADIR}/sounds) + SET(SIM_STYLES_DIR ${DATADIR}/styles) + SET(SHARE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/share) + SET(XDG_APPS_DIR ${SHARE_INSTALL_PREFIX}/applications/kde) + SET(SERVICES_INSTALL_DIR ${SHARE_INSTALL_PREFIX}/services) +endif(APPLE) +endif(WIN32) + +IF(ENABLE_TARGET_UPDATE_MESSAGES) + MESSAGE(STATUS "Enabling target update-messages") + INCLUDE(XGetText) + + IF(XGETTEXT_EXECUTABLE AND MSGMERGE_EXECUTABLE) + MESSAGE(STATUS "Target update-messages successfuly enabled") + ELSE(XGETTEXT_EXECUTABLE AND MSGMERGE_EXECUTABLE) + MESSAGE(STATUS "Can't enable target update-messages: one or more componets are missing") + SET(ENABLE_TARGET_UPDATE_MESSAGES OFF) + ENDIF(XGETTEXT_EXECUTABLE AND MSGMERGE_EXECUTABLE) + +ENDIF(ENABLE_TARGET_UPDATE_MESSAGES) + +# subdirectories +ADD_SUBDIRECTORY(sim) +SIM_FIND_PLUGINS(${Sim-IM_SOURCE_DIR}/plugins) +SIM_INCLUDE_PLUGINS() + +# create config.h +CONFIGURE_FILE(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) +add_definitions( -DHAVE_CONFIG_H ) + +# the (win32) flex generator doesn't care about HAVE_UNISTD_H - it simply has to +# be there. So create a dummy one if none exists +IF(NOT HAVE_UNISTD_H) + WRITE_FILE( ${CMAKE_CURRENT_BINARY_DIR}/sim/unistd.h + "/* dummy unistd.h file for flex generated parsers */" ) +ENDIF(NOT HAVE_UNISTD_H) + +# for uninstall target +CONFIGURE_FILE( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY) + +# uninstall target +ADD_CUSTOM_TARGET(uninstall + "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") + + +######################################## +# update-messages target +####################################### +IF ( ENABLE_TARGET_UPDATE_MESSAGES ) + + ADD_CUSTOM_TARGET(update-messages) + + SET(new_pot "${CMAKE_CURRENT_BINARY_DIR}/new_messages") + EMPTY_PO_FILE(${new_pot}) + + ADD_CUSTOM_COMMAND(TARGET update-messages + COMMAND echo Processing simlib + ) + LIST(SORT sim_LIB_MESSAGE_SOURCES) + FOREACH(file ${sim_LIB_MESSAGE_SOURCES}) + EXTRACT_MESSAGES("${Sim-IM_SOURCE_DIR}/sim/${file}" ${new_pot}) + ENDFOREACH(file) + + LIST(SORT SIM_PLUGINS) + FOREACH(plugin ${SIM_PLUGINS}) + ADD_CUSTOM_COMMAND(TARGET update-messages + COMMAND echo Processing plugin ${plugin} + ) + IF(${plugin}_MESSAGE_SOURCES) + LIST(SORT ${plugin}_MESSAGE_SOURCES) + FOREACH(file ${${plugin}_MESSAGE_SOURCES}) + EXTRACT_MESSAGES("${Sim-IM_PLUGINS_SOURCE_DIR}/${plugin}/${file}" ${new_pot}) + ENDFOREACH(file) + ENDIF(${plugin}_MESSAGE_SOURCES) + ENDFOREACH(plugin) + + ADD_CUSTOM_COMMAND(TARGET update-messages + COMMAND echo Updating .po files + COMMAND mv ${CMAKE_SOURCE_DIR}/po/sim.pot ${CMAKE_SOURCE_DIR}/po/sim.pot.backup + COMMAND mv ${new_pot}.po ${CMAKE_SOURCE_DIR}/po/sim.pot + ) + + FILE(GLOB po_files ${CMAKE_SOURCE_DIR}/po/*.po) + FOREACH(po_file ${po_files}) + ADD_CUSTOM_COMMAND(TARGET update-messages + COMMAND mv ${po_file} ${po_file}.backup + ) + ENDFOREACH(po_file) + + FOREACH(po_file ${po_files}) + GET_FILENAME_COMPONENT(po_name ${po_file} NAME) + ADD_CUSTOM_COMMAND(TARGET update-messages + COMMAND echo ${po_name} + COMMAND ${MSGMERGE_EXECUTABLE} ${po_file}.backup ${CMAKE_SOURCE_DIR}/po/sim.pot >${po_file} + ) + ENDFOREACH(po_file) +ENDIF ( ENABLE_TARGET_UPDATE_MESSAGES ) + diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user new file mode 100644 index 0000000..c0958eb --- /dev/null +++ b/CMakeLists.txt.user @@ -0,0 +1,222 @@ + + + + RunConfiguration0-BaseEnvironmentBase + 2 + + + RunConfiguration0-CMakeRunConfiguation.Title + sim + + + RunConfiguration0-CMakeRunConfiguration.Arguments + + + + RunConfiguration0-CMakeRunConfiguration.Target + /home/todin/projects/sim-im/sim-im-incoming/qtcreator-build/sim/sim + + + RunConfiguration0-CMakeRunConfiguration.UseTerminal + false + + + RunConfiguration0-CMakeRunConfiguration.UserEnvironmentChanges + + + + RunConfiguration0-CMakeRunConfiguration.UserWorkingDirectory + + + + RunConfiguration0-CMakeRunConfiguration.WorkingDirectory + + + + RunConfiguration0-RunConfiguration.name + sim + + + RunConfiguration0-type + CMakeProjectManager.CMakeRunConfiguration + + + RunConfiguration1-BaseEnvironmentBase + 2 + + + RunConfiguration1-CMakeRunConfiguation.Title + test + + + RunConfiguration1-CMakeRunConfiguration.Arguments + + + + RunConfiguration1-CMakeRunConfiguration.Target + /home/todin/projects/sim-im/sim-im-incoming/qtcreator-build/sim/test + + + RunConfiguration1-CMakeRunConfiguration.UseTerminal + false + + + RunConfiguration1-CMakeRunConfiguration.UserEnvironmentChanges + + + + RunConfiguration1-CMakeRunConfiguration.UserWorkingDirectory + + + + RunConfiguration1-CMakeRunConfiguration.WorkingDirectory + + + + RunConfiguration1-RunConfiguration.name + test + + + RunConfiguration1-type + CMakeProjectManager.CMakeRunConfiguration + + + activeRunConfiguration + 0 + + + activebuildconfiguration + all + + + buildConfiguration-all + + all + /home/todin/projects/sim-im/sim-im-incoming/qtcreator-build + + + + + buildconfiguration-all-buildstep0 + + all + + ALSA_PLUGINS_DIR=/usr/lib/alsa-lib + ANT_HOME=/usr/share/java/apache-ant + DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-EQjaPRDk1D,guid=ee9dfdf4a0e89ac54931d68d4b91ffee + DERBY_HOME=/opt/java/db + DESKTOP_SESSION=kde + DISPLAY=:0 + DM_CONTROL=/var/run/xdmctl + ECLIM_ECLIPSE_HOME=/usr/share/eclipse + EDITOR=vim + GPG_AGENT_INFO=/tmp/gpg-JdHoIz/S.gpg-agent:3876:1 + GS_LIB=/home/todin/.fonts + GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/todin/.gtkrc-2.0::/home/todin/.kde4/share/config/gtkrc-2.0 + GTK_RC_FILES=/etc/gtk/gtkrc:/home/todin/.gtkrc::/home/todin/.kde4/share/config/gtkrc + G_BROKEN_FILENAMES=1 + HG=/usr/bin/hg + HISTCONTROL=erasedups + HISTSIZE=1000 + HOME=/home/todin + INPUTRC=/etc/inputrc + J2SDKDIR=/opt/java + JAVA_HOME=/opt/java + KDE_FULL_SESSION=true + KDE_MULTIHEAD=false + KDE_SESSION_UID=1000 + KDE_SESSION_VERSION=4 + LANG=en_US.UTF-8 + LANGUAGE= + LESS=-R + LOGNAME=todin + MOZ_PLUGIN_PATH=/usr/lib/mozilla/plugins + PATH=/opt/wine/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/share/java/apache-ant/bin:/opt/java/bin:/opt/java/jre/bin:/opt/kde/bin:/usr/bin/perlbin/site:/usr/bin/perlbin/vendor:/usr/bin/perlbin/core:/opt/qt/bin:/home/todin/x-tools/arm-unknown-eabi/bin:/home/todin/projects/arm/crosstool-ng/bin:/home/todin/bin + PKG_CONFIG_PATH=/usr/lib/pkgconfig:/opt/qt/lib/pkgconfig + PS3=> + PS4=+ + PWD=/home/todin + QTDIR=/opt/qt + QT_PLUGIN_PATH=/home/todin/.kde4/lib/kde4/plugins/:/usr/lib/kde4/plugins/ + QT_XFT=true + SESSION_MANAGER=local/hell:@/tmp/.ICE-unix/3930,unix/hell:/tmp/.ICE-unix/3930 + SHELL=/bin/bash + SHLVL=1 + SSH_AGENT_PID=3879 + SSH_AUTH_SOCK=/tmp/ssh-JqDPIk3878/agent.3878 + SVN_EDITOR=vim + USER=todin + WINDOWPATH=7 + WINELOADER=/opt/wine/bin/wine + XCURSOR_THEME=Oxygen_Black + XDG_CACHE_HOME=/home/todin/.cache + XDG_CONFIG_DIRS=/etc/xdg:/etc/xdg:/etc/xdg:/etc/xdg + XDG_CONFIG_HOME=/home/todin/.config + XDG_DATA_DIRS=/usr/share:/usr/local/share:/usr/share:/usr/local/share:/usr/share:/usr/local/share:/usr/share:/usr/local/share:/opt/kde/share:/opt/kde/share:/opt/kde/share:/opt/kde/share + XDG_DATA_HOME=/home/todin/.local/share + XDG_SESSION_COOKIE=46070e371950b58c8ac873a74ae405f7-1267859436.916749-723754984 + XDM_MANAGED=method=classic + _=/usr/lib/kde4/libexec/start_kdeinit_wrapper + + false + + -j6 + + make + true + /home/todin/projects/sim-im/sim-im-incoming/qtcreator-build + + -j6 + + + + + buildconfiguration-all-cleanstep0 + + all + + clean + + true + + + + buildconfigurations + + all + + + + buildstep0 + + + + + + buildsteps + + CMakeProjectManager.MakeStep + + + + cleanstep0 + + + true + + + + cleansteps + + CMakeProjectManager.MakeStep + + + + defaultFileEncoding + UTF-8 + + + project + + + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..45645b4 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 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. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, 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 or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +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 give any other recipients of the Program a copy of this License +along with the Program. + +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 Program or any portion +of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +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 Program, 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 Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) 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; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, 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 executable. However, as a +special exception, the source code 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. + +If distribution of executable or 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 counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program 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. + + 5. 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 Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program 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 to +this License. + + 7. 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 Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program 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 Program. + +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. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program 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. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 Program +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 Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, 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 + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), 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 Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. 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 program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..50af5ee --- /dev/null +++ b/ChangeLog @@ -0,0 +1,99 @@ +USER-VISIBLE CHANGES IN SIM INSTANT MESSENGER + +[+] New +[-] Fixed error +[*] Changes + + +=== SIM 0.9.5 (not released yet) === + + +Build system +~~~~~~~~~~~~ +[*] Update admin/ dir to KDE 3.5.3. +[+] Make 'make dist' working. +[+] Add ability to build in separate directory. +[+] Unix: do not delete .la files after installing. +[+] MacOSX: fix build with X11. +[+] Win32/MSVC: switch to MSVC8. +[+] Win32/MSVC: use precompiled headers. +[+] Unix: issue error, not warning, if openssl wasn't found. +[-] Autotools: fix SMP builds. +[-] Autotools: add AC_LANG_C. +[+] Add hidden visibility support for GCC4.1 and cmake. +[-] Autotools: fix libXss detection. + +Core +~~~~ +[+] Command line option to run SIM with specified profile. +[+] Option to show contact list title in message window title. +[+] Contact list: search in contact list by a substring in contact name. +[+] History: option to use external viewer. +[+] Contact list: search in closed contact list groups too. +[-] Contact list: fix deleting contacts by pressing Del. +[*] Remove Qt2 code. +[*] Use QLibrary for plugins instead of libltdl. +[+] Contact list: search in contact list by user protocol IDs. +[+] Add profile (re)naming feature. +[-] Fix context menu shortcuts in dialog window. +[+] Save state on system logout with Qt Session Management. +[-] Win32: fix (un)setting autostart. +[-] Fix restoring font sizes. +[-] Disable history filter when it is empty. +[+] Replace libxml2-based SAX parser with Qt-provided one. +[+] Show user avatars in the dialog window. +[-] Remove "To container" menu when separate containers are disabled. +[*] Auto scroll message view only if it is scrolled to the bottom. +[-] XFree: fix problems with Composite extension enabled. + +ICQ plugin +~~~~~~~~~~ +[*] Improve client versions detection. +[-] Do not delete contacts if group changed while offline. +[*] Accept messages in Occupied/DND modes by default. +[+] Add new icons from ICQ 5 and ICQ 5.1. +[+] Add MD5 auth support for ICQ accounts. +[-] Fix user info saving. +[-] Fix birthday flag handling. +[-] Sync language and occupation lists with ICQ server. +[*] Disable "Automatically use HTTP polling if proxy required" by + default. +[+] Send and detect SIM patchlevel in version info. +[-] Fix receiving certain messages containing TLV(5) twice. +[-] Fix playing sounds for messages from QIP. + +Jabber plugin +~~~~~~~~~~~~~ +[-] Fix crash on auth request when "Receive message only from contacts from list". +[-] Fix handling of single quotes in roster item names. +[+] Add icons for sms and gadu-gadu transports. +[*] Detect jabber transports by missing "@" symbol in jid instead of + "/registered" ending. +[+] Allow auth messages for transports. +[*] Show protocol icons for jabber transports in roster. +[*] Ignore JID letter case. +[+] Add support for XEP-0092 client version info requests/replies. +[*] Show resource as a part of JID in contact tip, not as separate line. +[*] Remove SIM version from default resource value. + +Yahoo! plugin +~~~~~~~~~~~~~ + + +MSN plugin +~~~~~~~~~~ +[+] Add password recovery URL. + +Misc plugins +~~~~~~~~~~~~ +[-] LiveJournal: security level of message was set incorrectly. +[+] LiveJournal: add optional signature to all messages. +[+] LiveJournal: option to disable message text formatting. +[-] Proxy: fix some crashes. +[*] Logger: remove dangerous 'Events' logging facility +[-] Icons: fix handling of JISP files with non-ascii paths. +[-] Icons: fix handling of JISP files containing subdirectiories. +[*] Shortcuts: fix global shortcuts on X11 Qt-only build. +[*] LiveJournal: disable formatted messages by default. +[*] LiveJournal: add password recovery URL. +[-] LiveJournal: fix posting messages longer than 4 Kb. diff --git a/ChangeLog.old b/ChangeLog.old new file mode 100644 index 0000000..ed5d7f2 --- /dev/null +++ b/ChangeLog.old @@ -0,0 +1,189 @@ +Version 0.9.4 +Change Jabber browser +MSN: Add hotmail notification +GPG: Add support passphrase +ICQ: Add packets flow control +ICQ: Fix send URL and contacts +ICQ: Fix send large messages +Redesign search window +Remove support miranda icons and smiles +Add JISP icons and smiles +Yahoo: Support new authorisation +Win32: Fix support icons with alpha channel +Add history exporting to text files +Add UV-Intesity, Moonphases to Weather Plugin +Fix to big value for temperature in Weather Plugin +Fix Loading History +Fix compile KDE3.4 + +Version 0.9.3 +Add LiveJournal plugin +Add Greek translation +Jabber: fix send rich-text messages +ICQ: Fix set birthday flag +Fix apply custom fonts +Fix communication-problem with AIM-Screennames > 13 chars +Fix not receive AuthGrant from some ICQ-users +Proxy: add support listen sockets for SOCKS4 and SOCKS5 +Add Yahoo! plugin +MSN: Fix remove contact +Add replace text plugin +Add option "Show/hide empty groups" +Add weather plugin +WIN32: Use WinInet for HTTP connection (NTLM-auth on proxy and proxy autoconfig) +Move plugins from prefix/share into prefix/lib +Fix acinclude for automake-1.8 +MSN: add HTTP polling +Jabber: add HTTP polling +OSD: add show message content +Jabber: add select resource for send + +Version 0.9.2 +Add styles plugin +Add customizable history styles +ICQ: Fix receive messages from icq2003b +Jabber: Add disco request for search agents +Add history size config +Add remote control plugin +Add spell checking +Jabber: Add jabber browser/disco +Fix bind socket for direct connection +Fix save history on win32 +Add option "Ignore this phrase" in context menu +Jabber: Fix send multiline message +Jabber: Add configure to jabber browser +Jabber: Add headline support +ICQ: Change check invisible method +ICQ: Remove check invisible +Add action plugin - for call external programs +Add zodiak plugin + +Version 0.9.1 +ICQ: Fix login +Add GPG plugin +Fix HTTPS proxy auth +Add Hungarian translation + +Version 0.9 +Rewrite code, make plugin-based structure +Add MSN & Jabber protocols +Add metacontact support +ICQ: Add typing notification +ICQ: Add support users picture +ICQ: Add check invisible +Add Miranda emoticons support +ICQ: Add support AIM buddies +ICQ: Fix send to occupied and dnd mode +MSN: Upgrade protocol to V8 +Add quick search in contact list +MacOS X compile +Add AIM protocol +Jabber: Add rich-text support +Jabber: Add typing notification +ICQ: File transfer and reverse direct connections support +MSN: File transfer support +ICQ: Fix protocol for bigendian +Jabber: File transfer support +Jabber: Picture in vCard support +Jabber: Send & receive contacts list +AIM: Send & receive contacts list +Add Portuguese translation + +Version 0.8.2 +Add Bulgarian translation +Add Hebrew translation +Add random chat +Add settings for groups +Add GKrellM2 plugin +Add French translation + +Version 0.8.1 +Add option for using simple/double click +Add background picture for mainwindow +Add option "disable all sounds" +Add change UIN +Add GNOME 2 docklet support +Add Polish translation +Add Dutch translation +Add change history sort order +Add synchronization with KAddressBook +Add Spanish translation +Redesign setup window +Add customize toolbars +Add Czech translation +Add copy messages from history to conversation +Fix works with accel +Fix receiving unicode messages from ICQ2Go! +Add external programms in template +Add network monitor +Fix rtf parser and generator for fix font size problem +Switch support HTTP and HTTPS proxy from call CONNECT method to using AIM-HTTP gate +Add saving split position in chat mode message window + +Version 0.8 +Add optional own history and user info in separate window +Add filter for history +Add alphabticaly sorting user list +Add secure channel dialog +Add recognize various clients +Fix dock window and keyboard shortcuts for QT-only version +Add loging change status +Add smiles popup +Add autoforward to cellular +Fix work protocol on bigendian +Change message window button to tolbar +Change configure for FreeBSD +Change font saving +Use KExtendedSocket on KDE +Add HTTPS proxy support +Make abstract interface for socket +Fix receive messages from ICQLite +Fix drag-and-drop files +Fix user encoding for encode/decode RTF +Add process escape for close user window +Fix set status for icq2go +Fix save options "Alert if Away" and "Require authorization" + +Version 0.7 +Sending of the messages to several users added +Add message forwarding +Add autosplit SMS messages +Add support keyboard shortcuts +Add On-Screen display notification about messages and user status +Work with a history is improved, the speed is increased, search and adjustments is added +Add message mode for user window +Is corrected batch file transfer, transfer of several files and recursive directoryes now works +Direct connection with ICQ-clones is corrected +Add support secure direct connection with SIM and Licq +Add support user encoding +Fix bug with receive bug server-side contact list +Add spam filter + +Version 0.6 +Proxy support added (SOCKS4, SOCKS5, HTTP) +Germany translation added +Add miranda icon themes support (see README for details) +Add save flag "Close on send" +Fix bug with KCmdLineArgs, SIM may crash on start +Fix bug on update timezone - SIM may crash after logon +Fix compile on gcc 3.1 + +Version 0.5 (25.06.2002) + +The chat support added. +List of attributes for search of the user is extended +And some others fixes: +- The processing of network mistakes is corrected, resulted in that that on the + broken off connection could work very long, thus loading strongly enough + processor (the very unpleasant mistake was - on windows could result in + crash of system) +- The effect "strange sound" is corrected, that is it was really started to + play twice +- Are corrected acinclude - now normally is going on KDE 2 and does not require + of a key - disable-kde if KDE is not present + +Version 0.4 (11.06.2002) + +Configure with iconv bug fixed (const keyword missed) +Owner info dialog bug fixed + diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake new file mode 100644 index 0000000..c4b74ed --- /dev/null +++ b/ConfigureChecks.cmake @@ -0,0 +1,34 @@ +INCLUDE(CheckIncludeFiles) +INCLUDE(CheckSymbolExists) +INCLUDE(CheckFunctionExists) +INCLUDE(CheckLibraryExists) +INCLUDE(CheckStructMember) + +# FIXME: Please check if this is really needed! +# HAVE_GCC_VISIBILITY missing + +# Header +CHECK_INCLUDE_FILES(Carbon/Carbon.h HAVE_CARBON_CARBON_H) # autoaway.cpp, do we support mac? +CHECK_INCLUDE_FILES(inttypes.h HAVE_INTTYPES_H) # simapi.h +CHECK_INCLUDE_FILES(stddef.h HAVE_STDDEF_H) # simapi.h +CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H) # simapi.h +CHECK_INCLUDE_FILES(stdlib.h HAVE_STDLIB_H) # simapi.h +CHECK_INCLUDE_FILES(string.h HAVE_STRING_H) # _core/libintl.cpp +CHECK_INCLUDE_FILES(sys/stat.h HAVE_SYS_STAT_H) # gpg/gpg.cpp +CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H) # simapi.h +CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H) # simapi.h +CHECK_INCLUDE_FILES(xutility HAVE_XUTILITY) # simapi.h + +# Symbols +CHECK_SYMBOL_EXISTS(strcasecmp "strings.h" HAVE_STRCASECMP) # simapi.h, various + +# Functions +IF(NOT WIN32) # there is a chmod function on win32, but not usable the way we want... + CHECK_FUNCTION_EXISTS(chmod HAVE_CHMOD) # __homedir/homedir.cpp, gpg/gpg.cpp +ENDIF(NOT WIN32) +CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP) # _core/libintl.cpp +CHECK_FUNCTION_EXISTS(munmap HAVE_MUNMAP) # _core/libintl.cpp +CHECK_FUNCTION_EXISTS(uname HAVE_UNAME) # sim/fetch.cpp + +# check for structure member +CHECK_STRUCT_MEMBER(tm tm_gmtoff time.h HAVE_TM_GMTOFF) # icqclient.cpp diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..001ec4d --- /dev/null +++ b/Doxyfile @@ -0,0 +1,1557 @@ +# Doxyfile 1.6.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = sim-im + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.9.6 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = /home/todin/projects/sim-im/local/doxy + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = /Users/dimitri/doxygen/mail/1.5.7/doxywizard/ + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. Note that for custom extensions you also need to set +# FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = /home/todin/projects/sim-im/branches/branch-playground + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +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 \ + *.f90 \ + *.f \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# When the SEARCHENGINE tag is enable doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) +# there is already a search function so this one should typically +# be disabled. + +SEARCHENGINE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..2e005e9 --- /dev/null +++ b/INSTALL @@ -0,0 +1,167 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes a while. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Type `make install' to install the programs and any data files and + documentation. + + 4. You can remove the program binaries and object files from the + source code directory by typing `make clean'. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + diff --git a/README b/README new file mode 100644 index 0000000..df7f85b --- /dev/null +++ b/README @@ -0,0 +1,46 @@ +SIM-IM - SIM Instant Messenger + +A simple ICQ client with v8 protocol support (2001) for X win system (requires QT, can be build for KDE). It also runs under MS Windows. + +Features: +- receiving and sending SMS +- server-side contact list +- receiving and the sending messages in RTF-format +- phone directory support (it is possible to specify an access to the owner phone number - public or friends only) +- file transfers +- chat +- user search +- non-ICQ contacts + +http://sim-im.org/ + +SIM supports icon themes from Miranda. +On page http://www.nortiq.com/miranda/index.php?action=display&cat=Icon +the wide range of various icon themes suffices. +Load the necessary files and unpack from them dll in the catalogue, +from which SIM takes icon libraries. + +On KDE: +${KDE_DIR}/share/apps/sim/icons +On Qt: +${PREFIX}/share/sim/icons +On MS Windows: +${install_dir}/icons + +Choose in the menu item "Setup". +In a window of adjustments choose a page "Themes" also choose a subject +in the list "Icons" + + +SOUND-Plugin with audiere +_________ +The Sound plugin can be build with mp3, ogg, flac...-support. +For this modified Sources of audiere is used. +Get them here: http://sim.gosign.de/audiere-1.9.4.rar +Additionally add + +#define USE_AUDIERE + +to the sound.h +You will need to include libaudiere.la and audiere.h to the makefiles for building sound. +audiere.so is the library needed at runtime. \ No newline at end of file diff --git a/README.SVN b/README.SVN new file mode 100644 index 0000000..b6037a2 --- /dev/null +++ b/README.SVN @@ -0,0 +1,16 @@ +Here a short overview how to compile the svn-version: +First you'll need actual automake and autoconf. Also you'll need different +packages like openssl, libxml, libxslt and more. +If you haven't installed some of them, hopefully ./configure will complain +about missing libs (If not, let us know ) + +Steps: +1. make -f admin/Makefile.common +2. ./configure +3. make +4. make install +5. Start SIM :-) + +If you want to help us, it is better you did "./configure --enable-debug" +so we get more informations and can fix bugs better. + diff --git a/TODO.CMake b/TODO.CMake new file mode 100644 index 0000000..ea6ba5c --- /dev/null +++ b/TODO.CMake @@ -0,0 +1,15 @@ +Todo: +- merge trunk changes (rev. 2471/2472) for cmake files to playground and test. + + +Needed: +- create/update sim.pot and *.po +- install mo - files +- 'make dist' +- correct directories for linux (already fine?) +- FindQt3 needs a small change for win32 (http://www.cmake.org/Bug/bug.php?op=show&bugid=3514&pos=1) + +Nice to have: +- pch support +- detect gcc visibility support (kde has a working check for) +- disallow in-source builds (I don't like in-source builds...) diff --git a/TODO.MingW b/TODO.MingW new file mode 100644 index 0000000..e3ddd8f --- /dev/null +++ b/TODO.MingW @@ -0,0 +1,5 @@ ++ compiling resources with wndres +- make install ++ installer project ++ compiling .po files +* remote plugin? diff --git a/admin/Doxyfile.am b/admin/Doxyfile.am new file mode 100644 index 0000000..7abbf32 --- /dev/null +++ b/admin/Doxyfile.am @@ -0,0 +1,102 @@ +## generate API documentation with doxygen +apidox-am-yes: + @if test \! -d "$(top_srcdir)/doc/common/" && test -z "$$DOXDATA" ; then \ + export DOXDATA=$(kde_libs_htmldir)/en/common ; \ + fi ; \ + abs_top_srcdir=`cd $(top_srcdir) && pwd` ;\ + test -d $(top_builddir)/apidocs || \ + ( cd $(top_builddir) && sh $$abs_top_srcdir/admin/doxygen.sh \ + --no-modulename --installdir=$(kde_libs_htmldir)/en \ + --no-recurse $(abs_top_srcdir) . ) ; \ + cd $(top_builddir) && sh $$abs_top_srcdir/admin/doxygen.sh \ + --recurse --no-modulename --installdir=$(kde_libs_htmldir)/en \ + $$abs_top_srcdir $(subdir) + +apidox-am-toplevel-yes: + @if test \! -d "$(top_srcdir)/doc/common/" && test -z "$$ADMIN" ; then \ + export DOXDATA=$(kde_libs_htmldir)/en/common ; \ + fi ; \ + abs_top_srcdir=`cd $(top_srcdir) && pwd` ;\ + cd $(top_builddir) && sh $$abs_top_srcdir/admin/doxygen.sh \ + --no-modulename --installdir=$(kde_libs_htmldir)/en \ + $$abs_top_srcdir + +## Don't generate API documentation without doxygen +apidox-am-no: + +apidox-am-toplevel-no: + + +apidox: + @if test "$(subdir)" != "."; then \ + $(MAKE) apidox-am-@KDE_HAS_DOXYGEN@ ;\ + else \ + $(MAKE) apidox-am-toplevel-@KDE_HAS_DOXYGEN@ ;\ + fi + + + +install-data-local: install-apidox + +## install API documentation +install-apidox: + @if test "$(subdir)" != "."; then \ + $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir)/html ; \ + if test -f $(top_builddir)/apidocs/$(subdir)/$(subdir).tag; then \ + echo $(INSTALL_DATA) $(top_builddir)/apidocs/$(subdir)/$(subdir).tag $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); \ + $(INSTALL_DATA) $(top_builddir)/apidocs/$(subdir)/$(subdir).tag $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); \ + fi; \ + if test -d $(top_builddir)/apidocs/$(subdir)/html; then \ + list=`ls $(top_builddir)/apidocs/$(subdir)/html`; \ + echo "installing $(top_builddir)/apidocs/$(subdir)/html" ;\ + for file in $$list; do \ + $(INSTALL_DATA) $(top_builddir)/apidocs/$(subdir)/html/$$file $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir)/html; \ + done; \ + fi; \ + else\ + if test -d $(top_builddir)/apidocs; then \ + $(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs ;\ + list=`cd $(top_builddir)/apidocs && ls -1`; \ + echo "installing $(top_builddir)/apidocs/$$file" ;\ + echo "target directory $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs" ; \ + for file in $$list; do \ + if test -f $(top_builddir)/apidocs/$$file; then \ + $(INSTALL_DATA) $(top_builddir)/apidocs/$$file $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs; \ + fi; \ + done ; fi; \ + fi + +uninstall-local: uninstall-apidox + +## uninstall API documentation +uninstall-apidox: + @if test "$(subdir)" != "."; then \ + if test -d $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); then \ + rm -rfv $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs/$(subdir); \ + fi \ + else \ + if test -d $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs; then \ + rm -rfv $(DESTDIR)$(kde_htmldir)/en/$(PACKAGE)-apidocs; \ + fi \ + fi + +install-apidox-recurse: install-apidox + @set fnord $(MAKEFLAGS); amf=$$2; if test -n '$(SUBDIRS)'; then \ + list='$(SUBDIRS)'; \ + for subdir in $$list; do \ + if grep '^include .*Doxyfile.am' $(srcdir)/$$subdir/Makefile.am > /dev/null ; then \ + echo "Installing apidox from $$subdir"; \ + if test "$$subdir" != "."; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) GENERATE_FLAG=no install-apidox-recurse) || exit 1; \ + fi ; fi ;\ + done; \ + fi + + + +.PHONY: apidox-am-yes apidox-am-no install-data-local install-apidox install-apidox uninstall-local uninstall-apidox uninstall-apidox apidox apidox-am-toplevel-no apidox-am-toplevel-yes + + +# Local Variables: +# mode: makefile +# End: diff --git a/admin/Doxyfile.global b/admin/Doxyfile.global new file mode 100755 index 0000000..4a06c7f --- /dev/null +++ b/admin/Doxyfile.global @@ -0,0 +1,192 @@ +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = NO +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = YES +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = YES +MULTILINE_CPP_IS_BRIEF = NO +INHERIT_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 4 +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +SUBGROUPING = YES +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = YES +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_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TESTLIST = NO +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +QUIET = YES +WARNINGS = NO +WARN_IF_UNDOCUMENTED = NO +WARN_IF_DOC_ERROR = YES +WARN_FORMAT = +WARN_LOGFILE = +INPUT = +FILE_PATTERNS = *.h \ + *.cpp \ + *.cc \ + *.hpp \ + *.dox \ + *.c++ \ + *.cxx \ + *.h++ \ + *.hh +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = *.moc.* \ + moc* \ + *.all_cpp.* \ + *unload.* \ + */test/* \ + */tests/* \ + *_p.h +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_SOURCE_FILES = NO +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = YES +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 3 +HTML_OUTPUT = +HTML_FILE_EXTENSION = .html +HTML_HEADER = ../apidocs/common/header.html +HTML_FOOTER = ../apidocs/common/footer.html +HTML_STYLESHEET = ../apidocs/common/doxygen.css +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = YES +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +GENERATE_LATEX = NO +LATEX_OUTPUT = +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 +GENERATE_RTF = NO +RTF_OUTPUT = +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +GENERATE_MAN = NO +MAN_OUTPUT = +MAN_EXTENSION = .kde3 +MAN_LINKS = YES +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = NO +GENERATE_AUTOGEN_DEF = NO +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +ENABLE_PREPROCESSING = YES +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = QT_VERSION=320 \ + __cplusplus \ + Q_WS_X11 +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = NO +PERL_PATH = +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = NO +HAVE_DOT = NO +UML_LOOK = NO +TEMPLATE_RELATIONS = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 800 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 0 +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +SEARCHENGINE = NO + +### KDE Settings +ALIASES = \ + "intern=\parInternal use only." \ + "reimp=\parReimplemented from superclass." \ + "obsolete=@deprecated" \ + "feature=\xrefitem features \"Feature(s)\" \"Features\"" \ + "maintainer=\xrefitem maintainers \"Maintainer(s)\" \"Maintainers\"" \ + "unmaintained=\xrefitem unmaintained \"Unmaintained\" \"Unmaintained\"" \ + "requirement=\xrefitem requirements \"Requirement(s)\" \"Requirements\"" \ + "faq=\xrefitem FAQ \"F.A.Q.\" \"F.A.Q.\"" \ + "authors=\xrefitem authors \"Author(s)\" \"Authors\"" \ + "FIXME=\xrefitem fixme \"Fixme\" \"Fixme\"" + +HTML_ALIGN_MEMBERS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +VERBATIM_HEADERS = NO +GENERATE_HTML = YES +SOURCE_BROWSER = YES +GENERATE_AUTOGEN_DEF = NO +DETAILS_AT_TOP = YES +SORT_MEMBER_DOCS = YES +GENERATE_TODOLIST = YES +IGNORE_PREFIX = K +GENERATE_HTML = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO + + +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES + diff --git a/admin/acinclude.m4.in b/admin/acinclude.m4.in new file mode 100644 index 0000000..46848d0 --- /dev/null +++ b/admin/acinclude.m4.in @@ -0,0 +1,6040 @@ +## -*- autoconf -*- + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) +dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +dnl IMPORTANT NOTE: +dnl Please do not modify this file unless you expect your modifications to be +dnl carried into every other module in the repository. +dnl +dnl Single-module modifications are best placed in configure.in for kdelibs +dnl and kdebase or configure.in.in if present. + +# KDE_PATH_X_DIRECT +dnl Internal subroutine of AC_PATH_X. +dnl Set ac_x_includes and/or ac_x_libraries. +AC_DEFUN([KDE_PATH_X_DIRECT], +[ +AC_REQUIRE([KDE_CHECK_LIB64]) + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +AC_TRY_CPP([#include <$x_direct_test_include>], +[# We can compile using X headers with no special include directory. +ac_x_includes=], +[# Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done]) +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +AC_TRY_LINK([#include ], [${x_direct_test_function}(1)], +[LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries=], +[LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \ + /usr/X11/lib${kdelibsuff} \ + /usr/X11R6/lib${kdelibsuff} \ + /usr/X11R5/lib${kdelibsuff} \ + /usr/X11R4/lib${kdelibsuff} \ + \ + /usr/lib${kdelibsuff}/X11 \ + /usr/lib${kdelibsuff}/X11R6 \ + /usr/lib${kdelibsuff}/X11R5 \ + /usr/lib${kdelibsuff}/X11R4 \ + \ + /usr/local/X11/lib${kdelibsuff} \ + /usr/local/X11R6/lib${kdelibsuff} \ + /usr/local/X11R5/lib${kdelibsuff} \ + /usr/local/X11R4/lib${kdelibsuff} \ + \ + /usr/local/lib${kdelibsuff}/X11 \ + /usr/local/lib${kdelibsuff}/X11R6 \ + /usr/local/lib${kdelibsuff}/X11R5 \ + /usr/local/lib${kdelibsuff}/X11R4 \ + \ + /usr/X386/lib${kdelibsuff} \ + /usr/x386/lib${kdelibsuff} \ + /usr/XFree86/lib${kdelibsuff}/X11 \ + \ + /usr/lib${kdelibsuff} \ + /usr/local/lib${kdelibsuff} \ + /usr/unsupported/lib${kdelibsuff} \ + /usr/athena/lib${kdelibsuff} \ + /usr/local/x11r5/lib${kdelibsuff} \ + /usr/lpp/Xamples/lib${kdelibsuff} \ + /lib/usr/lib${kdelibsuff}/X11 \ + \ + /usr/openwin/lib${kdelibsuff} \ + /usr/openwin/share/lib${kdelibsuff} \ + ; \ +do +dnl Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done]) +fi # $ac_x_libraries = NO +]) + + +dnl ------------------------------------------------------------------------ +dnl Find a file (or one of more files in a list of dirs) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_FIND_FILE], +[ +$3=NO +for i in $2; +do + for j in $1; + do + echo "configure: __oline__: $i/$j" >&AC_FD_CC + if test -r "$i/$j"; then + echo "taking that" >&AC_FD_CC + $3=$i + break 2 + fi + done +done +]) + +dnl KDE_FIND_PATH(program-name, variable-name, list-of-dirs, +dnl if-not-found, test-parameter, prepend-path) +dnl +dnl Look for program-name in list-of-dirs+$PATH. +dnl If prepend-path is set, look in $PATH+list-of-dirs instead. +dnl If found, $variable-name is set. If not, if-not-found is evaluated. +dnl test-parameter: if set, the program is executed with this arg, +dnl and only a successful exit code is required. +AC_DEFUN([KDE_FIND_PATH], +[ + AC_MSG_CHECKING([for $1]) + if test -n "$$2"; then + kde_cv_path="$$2"; + else + kde_cache=`echo $1 | sed 'y%./+-%__p_%'` + + AC_CACHE_VAL(kde_cv_path_$kde_cache, + [ + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + dirs="" + for dir in $PATH; do + dirs="$dirs $dir" + done + if test -z "$6"; then dnl Append dirs in PATH (default) + dirs="$3 $dirs" + else dnl Prepend dirs in PATH (if 6th arg is set) + dirs="$dirs $3" + fi + IFS=$kde_save_IFS + + for dir in $dirs; do + if test -x "$dir/$1"; then + if test -n "$5" + then + evalstr="$dir/$1 $5 2>&1 " + if eval $evalstr; then + kde_cv_path="$dir/$1" + break + fi + else + kde_cv_path="$dir/$1" + break + fi + fi + done + + eval "kde_cv_path_$kde_cache=$kde_cv_path" + + ]) + + eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" + + fi + + if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then + AC_MSG_RESULT(not found) + $4 + else + AC_MSG_RESULT($kde_cv_path) + $2=$kde_cv_path + + fi +]) + +AC_DEFUN([KDE_MOC_ERROR_MESSAGE], +[ + AC_MSG_ERROR([No Qt meta object compiler (moc) found! +Please check whether you installed Qt correctly. +You need to have a running moc binary. +configure tried to run $ac_cv_path_moc and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable MOC to the right one before running +configure. +]) +]) + +AC_DEFUN([KDE_UIC_ERROR_MESSAGE], +[ + AC_MSG_WARN([No Qt ui compiler (uic) found! +Please check whether you installed Qt correctly. +You need to have a running uic binary. +configure tried to run $ac_cv_path_uic and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable UIC to the right one before running +configure. +]) +]) + + +AC_DEFUN([KDE_CHECK_UIC_FLAG], +[ + AC_MSG_CHECKING([whether uic supports -$1 ]) + kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` + AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache, + [ + cat >conftest.ui < +EOT + ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null" + if AC_TRY_EVAL(ac_uic_testrun); then + eval "kde_cv_prog_uic_$kde_cache=yes" + else + eval "kde_cv_prog_uic_$kde_cache=no" + fi + rm -f conftest* + ]) + + if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then + AC_MSG_RESULT([yes]) + : + $3 + else + AC_MSG_RESULT([no]) + : + $4 + fi +]) + + +dnl ------------------------------------------------------------------------ +dnl Find the meta object compiler and the ui compiler in the PATH, +dnl in $QTDIR/bin, and some more usual places +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_MOC_UIC], +[ + AC_REQUIRE([KDE_CHECK_PERL]) + qt_bindirs="" + for dir in $kde_qt_dirs; do + qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" + done + qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" + if test ! "$ac_qt_bindir" = "NO"; then + qt_bindirs="$ac_qt_bindir $qt_bindirs" + fi + + KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE]) + if test -z "$UIC_NOT_NEEDED"; then + KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""]) + if test -z "$UIC_PATH" ; then + KDE_UIC_ERROR_MESSAGE + exit 1 + else + UIC=$UIC_PATH + + if test $kde_qtver = 3; then + KDE_CHECK_UIC_FLAG(L,[/nonexistent],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no) + KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no) + + if test x$ac_uic_supports_libpath = xyes; then + UIC="$UIC -L \$(kde_widgetdir)" + fi + if test x$ac_uic_supports_nounload = xyes; then + UIC="$UIC -nounload" + fi + fi + fi + else + UIC="echo uic not available: " + fi + + AC_SUBST(MOC) + AC_SUBST(UIC) + + UIC_TR="i18n" + if test "$use_kde" = "yes"; then + if test "$kde_qtver" = "3"; then + UIC_TR="tr2i18n" + fi + fi + + AC_SUBST(UIC_TR) +]) + +AC_DEFUN([KDE_1_CHECK_PATHS], +[ + KDE_1_CHECK_PATH_HEADERS + + KDE_TEST_RPATH= + + if test -n "$USE_RPATH"; then + + if test -n "$kde_libraries"; then + KDE_TEST_RPATH="-R $kde_libraries" + fi + + if test -n "$qt_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries" + fi + + if test -n "$x_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries" + fi + + KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH" + fi + +AC_MSG_CHECKING([for KDE libraries installed]) +ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5' + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + AC_MSG_RESULT(yes) +else + AC_MSG_ERROR([your system fails at linking a small KDE application! +Check, if your compiler is installed correctly and if you have used the +same compiler to compile Qt and kdelibs as you did use now. +For more details about this problem, look at the end of config.log.]) +fi + +if eval `KDEDIR= ./conftest 2>&5`; then + kde_result=done +else + kde_result=problems +fi + +KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log +kde_have_all_paths=yes + +KDE_SET_PATHS($kde_result) + +]) + +AC_DEFUN([KDE_SET_PATHS], +[ + kde_cv_all_paths="kde_have_all_paths=\"yes\" \ + kde_htmldir=\"$kde_htmldir\" \ + kde_appsdir=\"$kde_appsdir\" \ + kde_icondir=\"$kde_icondir\" \ + kde_sounddir=\"$kde_sounddir\" \ + kde_datadir=\"$kde_datadir\" \ + kde_locale=\"$kde_locale\" \ + kde_cgidir=\"$kde_cgidir\" \ + kde_confdir=\"$kde_confdir\" \ + kde_kcfgdir=\"$kde_kcfgdir\" \ + kde_mimedir=\"$kde_mimedir\" \ + kde_toolbardir=\"$kde_toolbardir\" \ + kde_wallpaperdir=\"$kde_wallpaperdir\" \ + kde_templatesdir=\"$kde_templatesdir\" \ + kde_bindir=\"$kde_bindir\" \ + kde_servicesdir=\"$kde_servicesdir\" \ + kde_servicetypesdir=\"$kde_servicetypesdir\" \ + kde_moduledir=\"$kde_moduledir\" \ + kde_styledir=\"$kde_styledir\" \ + kde_widgetdir=\"$kde_widgetdir\" \ + xdg_appsdir=\"$xdg_appsdir\" \ + xdg_menudir=\"$xdg_menudir\" \ + xdg_directorydir=\"$xdg_directorydir\" \ + kde_result=$1" +]) + +AC_DEFUN([KDE_SET_DEFAULT_PATHS], +[ +if test "$1" = "default"; then + + if test -z "$kde_htmldir"; then + kde_htmldir='${datadir}/doc/HTML' + fi + if test -z "$kde_appsdir"; then + kde_appsdir='${datadir}/applnk' + fi + if test -z "$kde_icondir"; then + kde_icondir='${datadir}/icons' + fi + if test -z "$kde_sounddir"; then + kde_sounddir='${datadir}/sounds' + fi + if test -z "$kde_datadir"; then + kde_datadir='${datadir}/apps' + fi + if test -z "$kde_locale"; then + kde_locale='${datadir}/locale' + fi + if test -z "$kde_cgidir"; then + kde_cgidir='${exec_prefix}/cgi-bin' + fi + if test -z "$kde_confdir"; then + kde_confdir='${datadir}/config' + fi + if test -z "$kde_kcfgdir"; then + kde_kcfgdir='${datadir}/config.kcfg' + fi + if test -z "$kde_mimedir"; then + kde_mimedir='${datadir}/mimelnk' + fi + if test -z "$kde_toolbardir"; then + kde_toolbardir='${datadir}/toolbar' + fi + if test -z "$kde_wallpaperdir"; then + kde_wallpaperdir='${datadir}/wallpapers' + fi + if test -z "$kde_templatesdir"; then + kde_templatesdir='${datadir}/templates' + fi + if test -z "$kde_bindir"; then + kde_bindir='\${exec_prefix}/bin' + fi + if test -z "$kde_servicesdir"; then + kde_servicesdir='${datadir}/services' + fi + if test -z "$kde_servicetypesdir"; then + kde_servicetypesdir='${datadir}/servicetypes' + fi + if test -z "$kde_moduledir"; then + if test "$kde_qtver" = "2"; then + kde_moduledir='${libdir}/kde2' + else + kde_moduledir='${libdir}/kde3' + fi + fi + if test -z "$kde_styledir"; then + kde_styledir='${libdir}/kde3/plugins/styles' + fi + if test -z "$kde_widgetdir"; then + kde_widgetdir='${libdir}/kde3/plugins/designer' + fi + if test -z "$xdg_appsdir"; then + xdg_appsdir='${datadir}/applications/kde' + fi + if test -z "$xdg_menudir"; then + xdg_menudir='${sysconfdir}/xdg/menus' + fi + if test -z "$xdg_directorydir"; then + xdg_directorydir='${datadir}/desktop-directories' + fi + + KDE_SET_PATHS(defaults) + +else + + if test $kde_qtver = 1; then + AC_MSG_RESULT([compiling]) + KDE_1_CHECK_PATHS + else + AC_MSG_ERROR([path checking not yet supported for KDE 2]) + fi + +fi +]) + +AC_DEFUN([KDE_CHECK_PATHS_FOR_COMPLETENESS], +[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" || + test -z "$kde_icondir" || test -z "$kde_sounddir" || + test -z "$kde_datadir" || test -z "$kde_locale" || + test -z "$kde_cgidir" || test -z "$kde_confdir" || + test -z "$kde_kcfgdir" || + test -z "$kde_mimedir" || test -z "$kde_toolbardir" || + test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" || + test -z "$kde_bindir" || test -z "$kde_servicesdir" || + test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" || + test -z "$kde_styledir" || test -z "kde_widgetdir" || + test -z "$xdg_appsdir" || test -z "$xdg_menudir" || test -z "$xdg_directorydir" || + test "x$kde_have_all_paths" != "xyes"; then + kde_have_all_paths=no + fi +]) + +AC_DEFUN([KDE_MISSING_PROG_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed KDE correctly. +]) +]) + +AC_DEFUN([KDE_MISSING_ARTS_ERROR], +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed aRts correctly or use +--without-arts to compile without aRts support (this will remove functionality). +]) +]) + +AC_DEFUN([KDE_SET_DEFAULT_BINDIRS], +[ + kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin" + test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs" + if test -n "$KDEDIRS"; then + kde_save_IFS=$IFS + IFS=: + for dir in $KDEDIRS; do + kde_default_bindirs="$dir/bin $kde_default_bindirs " + done + IFS=$kde_save_IFS + fi +]) + +AC_DEFUN([KDE_SUBST_PROGRAMS], +[ + AC_ARG_WITH(arts, + AC_HELP_STRING([--without-arts],[build without aRts [default=no]]), + [build_arts=$withval], + [build_arts=yes] + ) + AM_CONDITIONAL(include_ARTS, test "$build_arts" '!=' "no") + if test "$build_arts" = "no"; then + AC_DEFINE(WITHOUT_ARTS, 1, [Defined if compiling without arts]) + fi + + KDE_SET_DEFAULT_BINDIRS + kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_libs_prefix/bin $kde_default_bindirs" + KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)]) + KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)]) + if test "$build_arts" '!=' "no"; then + KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)]) + KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)]) + fi + KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs]) + + kde32ornewer=1 + kde33ornewer=1 + if test -n "$kde_qtver" && test "$kde_qtver" -lt 3; then + kde32ornewer= + kde33ornewer= + else + if test "$kde_qtver" = "3"; then + if test "$kde_qtsubver" -le 1; then + kde32ornewer= + fi + if test "$kde_qtsubver" -le 2; then + kde33ornewer= + fi + if test "$KDECONFIG" != "compiled"; then + if test `$KDECONFIG --version | grep KDE | sed 's/KDE: \(...\).*/\1/'` = 3.2; then + kde33ornewer= + fi + fi + fi + fi + + if test -n "$kde32ornewer"; then + KDE_FIND_PATH(kconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kconfig_compiler)]) + KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)]) + fi + if test -n "$kde33ornewer"; then + KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)]) + AC_SUBST(MAKEKDEWIDGETS) + fi + KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""]) + + if test -n "$MEINPROC" -a "$MEINPROC" != "compiled"; then + kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share" + test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs" + AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET) + if test "$KDE_XSL_STYLESHEET" = "NO"; then + KDE_XSL_STYLESHEET="" + else + KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl" + fi + fi + + DCOP_DEPENDENCIES='$(DCOPIDL)' + if test -n "$kde32ornewer"; then + KCFG_DEPENDENCIES='$(KCONFIG_COMPILER)' + DCOP_DEPENDENCIES='$(DCOPIDL) $(DCOPIDLNG)' + AC_SUBST(KCONFIG_COMPILER) + AC_SUBST(KCFG_DEPENDENCIES) + AC_SUBST(DCOPIDLNG) + fi + AC_SUBST(DCOPIDL) + AC_SUBST(DCOPIDL2CPP) + AC_SUBST(DCOP_DEPENDENCIES) + AC_SUBST(MCOPIDL) + AC_SUBST(ARTSCCONFIG) + AC_SUBST(MEINPROC) + AC_SUBST(KDE_XSL_STYLESHEET) + AC_SUBST(XMLLINT) +])dnl + +AC_DEFUN([AC_CREATE_KFSSTND], +[ +AC_REQUIRE([AC_CHECK_RPATH]) + +AC_MSG_CHECKING([for KDE paths]) +kde_result="" +kde_cached_paths=yes +AC_CACHE_VAL(kde_cv_all_paths, +[ + KDE_SET_DEFAULT_PATHS($1) + kde_cached_paths=no +]) +eval "$kde_cv_all_paths" +KDE_CHECK_PATHS_FOR_COMPLETENESS +if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then + # wrong values were cached, may be, we can set better ones + kde_result= + kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir= + kde_datadir= kde_locale= kde_cgidir= kde_confdir= kde_kcfgdir= + kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir= + kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir= + kde_have_all_paths= + kde_styledir= + kde_widgetdir= + xdg_appsdir = xdg_menudir= xdg_directorydir= + KDE_SET_DEFAULT_PATHS($1) + eval "$kde_cv_all_paths" + KDE_CHECK_PATHS_FOR_COMPLETENESS + kde_result="$kde_result (cache overridden)" +fi +if test "$kde_have_all_paths" = "no"; then + AC_MSG_ERROR([configure could not run a little KDE program to test the environment. +Since it had compiled and linked before, it must be a strange problem on your system. +Look at config.log for details. If you are not able to fix this, look at +http://www.kde.org/faq/installation.html or any www.kde.org mirror. +(If you're using an egcs version on Linux, you may update binutils!) +]) +else + rm -f conftest* + AC_MSG_RESULT($kde_result) +fi + +bindir=$kde_bindir + +KDE_SUBST_PROGRAMS + +]) + +AC_DEFUN([AC_SUBST_KFSSTND], +[ +AC_SUBST(kde_htmldir) +AC_SUBST(kde_appsdir) +AC_SUBST(kde_icondir) +AC_SUBST(kde_sounddir) +AC_SUBST(kde_datadir) +AC_SUBST(kde_locale) +AC_SUBST(kde_confdir) +AC_SUBST(kde_kcfgdir) +AC_SUBST(kde_mimedir) +AC_SUBST(kde_wallpaperdir) +AC_SUBST(kde_bindir) +dnl X Desktop Group standards +AC_SUBST(xdg_appsdir) +AC_SUBST(xdg_menudir) +AC_SUBST(xdg_directorydir) +dnl for KDE 2 +AC_SUBST(kde_templatesdir) +AC_SUBST(kde_servicesdir) +AC_SUBST(kde_servicetypesdir) +AC_SUBST(kde_moduledir) +AC_SUBST(kdeinitdir, '$(kde_moduledir)') +AC_SUBST(kde_styledir) +AC_SUBST(kde_widgetdir) +if test "$kde_qtver" = 1; then + kde_minidir="$kde_icondir/mini" +else +# for KDE 1 - this breaks KDE2 apps using minidir, but +# that's the plan ;-/ + kde_minidir="/dev/null" +fi +dnl AC_SUBST(kde_minidir) +dnl AC_SUBST(kde_cgidir) +dnl AC_SUBST(kde_toolbardir) +]) + +AC_DEFUN([KDE_MISC_TESTS], +[ + dnl Checks for libraries. + AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD + AC_SUBST(LIBUTIL) + AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD + AC_SUBST(LIBCOMPAT) + kde_have_crypt= + AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes], + AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [ + AC_MSG_WARN([you have no crypt in either libcrypt or libc. +You should install libcrypt from another source or configure with PAM +support]) + kde_have_crypt=no + ])) + AC_SUBST(LIBCRYPT) + if test $kde_have_crypt = yes; then + AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function]) + fi + AC_CHECK_SOCKLEN_T + AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + AC_CHECK_LIB(dnet_stub, dnet_ntoa, + [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) + fi + AC_CHECK_FUNC(inet_ntoa) + if test $ac_cv_func_inet_ntoa = no; then + AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") + fi + AC_CHECK_FUNC(connect) + if test $ac_cv_func_connect = no; then + AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , + $X_EXTRA_LIBS) + fi + + AC_CHECK_FUNC(remove) + if test $ac_cv_func_remove = no; then + AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + AC_CHECK_FUNC(shmat, , + AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc")) + + # more headers that need to be explicitly included on darwin + AC_CHECK_HEADERS(sys/types.h stdint.h) + + # sys/bitypes.h is needed for uint32_t and friends on Tru64 + AC_CHECK_HEADERS(sys/bitypes.h) + + # darwin requires a poll emulation library + AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll") + + # for some image handling on Mac OS X + AC_CHECK_HEADERS(Carbon/Carbon.h) + + # CoreAudio framework + AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ + AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API]) + FRAMEWORK_COREAUDIO="-Wl,-framework,CoreAudio" + ]) + + AC_CHECK_RES_INIT + AC_SUBST(LIB_POLL) + AC_SUBST(FRAMEWORK_COREAUDIO) + LIBSOCKET="$X_EXTRA_LIBS" + AC_SUBST(LIBSOCKET) + AC_SUBST(X_EXTRA_LIBS) + AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4 + AC_SUBST(LIBUCB) + + case $host in dnl this *is* LynxOS specific + *-*-lynxos* ) + AC_MSG_CHECKING([LynxOS header file wrappers]) + [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"] + AC_MSG_RESULT(disabled) + AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS + ;; + esac + + KDE_CHECK_TYPES + KDE_CHECK_LIBDL + KDE_CHECK_STRLCPY + KDE_CHECK_PIE_SUPPORT + +# darwin needs this to initialize the environment +AC_CHECK_HEADERS(crt_externs.h) +AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])]) + +AH_VERBATIM(_DARWIN_ENVIRON, +[ +#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H) +# include +# include +# define environ (*_NSGetEnviron()) +#endif +]) + +AH_VERBATIM(_AIX_STRINGS_H_BZERO, +[ +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif +]) + +AC_CHECK_FUNCS([vsnprintf snprintf]) + +AH_VERBATIM(_TRU64,[ +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Find the header files and libraries for X-Windows. Extended the +dnl macro AC_PATH_X +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([K_PATH_X], +[ +AC_REQUIRE([KDE_MISC_TESTS])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_ARG_ENABLE( + embedded, + AC_HELP_STRING([--enable-embedded],[link to Qt-embedded, don't use X]), + kde_use_qt_emb=$enableval, + kde_use_qt_emb=no +) + +AC_ARG_ENABLE( + qtopia, + AC_HELP_STRING([--enable-qtopia],[link to Qt-embedded, link to the Qtopia Environment]), + kde_use_qt_emb_palm=$enableval, + kde_use_qt_emb_palm=no +) + +AC_ARG_ENABLE( + mac, + AC_HELP_STRING([--enable-mac],[link to Qt/Mac (don't use X)]), + kde_use_qt_mac=$enableval, + kde_use_qt_mac=no +) + +AC_ARG_ENABLE( + win, + AC_HELP_STRING([--enable-win],[link to Qt/Win (don't use X)]), + kde_use_qt_win=$enableval, + kde_use_qt_win=no +) +# used to disable x11-specific stuff on special platforms +AM_CONDITIONAL(include_x11, test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no" && test "$kde_use_qt_win" = "no") + +if test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no" && test "$kde_use_qt_win" = "no"; then + +AC_MSG_CHECKING(for X) + +AC_CACHE_VAL(kde_cv_have_x, +[# One or both of the vars are not set, and there is no cached value. +if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then + kde_x_includes=NO +else + kde_x_includes=$x_includes +fi +if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then + kde_x_libraries=NO +else + kde_x_libraries=$x_libraries +fi + +# below we use the standard autoconf calls +ac_x_libraries=$kde_x_libraries +ac_x_includes=$kde_x_includes + +KDE_PATH_X_DIRECT +dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries. +dnl Unfortunately, if compiling with the N32 ABI, this is not the correct +dnl location. The correct location is /usr/lib32 or an undefined value +dnl (the linker is smart enough to pick the correct default library). +dnl Things work just fine if you use just AC_PATH_X_DIRECT. +dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to +dnl /usr/openwin/include, which doesn't work. /usr/include does work, so +dnl x_includes should be left alone. +case "$host" in +mips-sgi-irix6*) + ;; +*-*-solaris*) + ;; +*) + _AC_PATH_X_XMKMF + if test -z "$ac_x_includes"; then + ac_x_includes="." + fi + if test -z "$ac_x_libraries"; then + ac_x_libraries="/usr/lib${kdelibsuff}" + fi +esac +#from now on we use our own again + +# when the user already gave --x-includes, we ignore +# what the standard autoconf macros told us. +if test "$kde_x_includes" = NO; then + kde_x_includes=$ac_x_includes +fi + +# for --x-libraries too +if test "$kde_x_libraries" = NO; then + kde_x_libraries=$ac_x_libraries +fi + +if test "$kde_x_includes" = NO; then + AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!]) +fi + +if test "$kde_x_libraries" = NO; then + AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!]) +fi + +# Record where we found X for the cache. +kde_cv_have_x="have_x=yes \ + kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries" +])dnl + +eval "$kde_cv_have_x" + +if test "$have_x" != yes; then + AC_MSG_RESULT($have_x) + no_x=yes +else + AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes]) +fi + +if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then + X_INCLUDES="" + x_includes="."; dnl better than nothing :- + else + x_includes=$kde_x_includes + X_INCLUDES="-I$x_includes" +fi + +if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE; then + X_LDFLAGS="" + x_libraries="/usr/lib"; dnl better than nothing :- + else + x_libraries=$kde_x_libraries + X_LDFLAGS="-L$x_libraries" +fi +all_includes="$X_INCLUDES" +all_libraries="$X_LDFLAGS $LDFLAGS_AS_NEEDED $LDFLAGS_NEW_DTAGS" + +# Check for libraries that X11R6 Xt/Xaw programs need. +ac_save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $X_LDFLAGS" +# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to +# check for ICE first), but we must link in the order -lSM -lICE or +# we get undefined symbols. So assume we have SM if we have ICE. +# These have to be linked with before -lX11, unlike the other +# libraries we check for below, so use a different variable. +# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. +AC_CHECK_LIB(ICE, IceConnectionNumber, + [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS) +LDFLAGS="$ac_save_LDFLAGS" + +LIB_X11='-lX11 $(LIBSOCKET)' + +AC_MSG_CHECKING(for libXext) +AC_CACHE_VAL(kde_cv_have_libXext, +[ +kde_ldflags_safe="$LDFLAGS" +kde_libs_safe="$LIBS" + +LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" +LIBS="-lXext -lX11 $LIBSOCKET" + +AC_TRY_LINK([ +#include +#ifdef STDC_HEADERS +# include +#endif +], +[ +printf("hello Xext\n"); +], +kde_cv_have_libXext=yes, +kde_cv_have_libXext=no +) + +LDFLAGS=$kde_ldflags_safe +LIBS=$kde_libs_safe +]) + +AC_MSG_RESULT($kde_cv_have_libXext) + +if test "$kde_cv_have_libXext" = "no"; then + AC_MSG_ERROR([We need a working libXext to proceed. Since configure +can't find it itself, we stop here assuming that make wouldn't find +them either.]) +fi + +LIB_XEXT="-lXext" +QTE_NORTTI="" + +elif test "$kde_use_qt_emb" = "yes"; then + dnl We're using QT Embedded + CPPFLAGS=-DQWS + CXXFLAGS="$CXXFLAGS -fno-rtti" + QTE_NORTTI="-fno-rtti -DQWS" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +elif test "$kde_use_qt_mac" = "yes"; then + dnl We're using QT/Mac (I use QT_MAC so that qglobal.h doesn't *have* to + dnl be included to get the information) --Sam + CXXFLAGS="$CXXFLAGS -DQT_MAC -no-cpp-precomp" + CFLAGS="$CFLAGS -DQT_MAC -no-cpp-precomp" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +elif test "$kde_use_qt_win" = "yes"; then + CXXFLAGS="-mthreads -Wall -O2 -fno-exceptions -frtti -DUNICODE -DQT_DLL -DQT_THREAD_SUPPORT -DQT_NO_DEBUG" + CFLAGS="$CFLAGS -mthreads -Wall -O2 -fno-exceptions -DUNICODE -DQT_DLL -DQT_THREAD_SUPPORT -DQT_NO_DEBUG" + LDFLAGS="$LDFAGS -no-undefined -Wl,-export-all-symbols -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl,-s -Wl,-subsystem,windows -e __Z19QtWinMainCRTStartupv" + LIBS="$LIBS -lkernel32 -luser32 -lgdi32 -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -limm32 -lwinmm -lwsock32 -lwinspool" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIB_XRENDER="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" +fi +AC_SUBST(X_PRE_LIBS) +AC_SUBST(LIB_X11) +AC_SUBST(LIB_XRENDER) +AC_SUBST(LIBSM) +AC_SUBST(X_INCLUDES) +AC_SUBST(X_LDFLAGS) +AC_SUBST(x_includes) +AC_SUBST(x_libraries) +AC_SUBST(QTE_NORTTI) +AC_SUBST(LIB_XEXT) + +]) + +AC_DEFUN([KDE_PRINT_QT_PROGRAM], +[ +AC_REQUIRE([KDE_USE_QT]) +cat > conftest.$ac_ext < +#include +EOF +if test "$kde_qtver" = "2"; then +cat >> conftest.$ac_ext < +#include +#include +EOF + +if test $kde_qtsubver -gt 0; then +cat >> conftest.$ac_ext <> conftest.$ac_ext < +#include +#include +EOF +fi + +echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext +cat >> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC +fi + +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe" +export LD_LIBRARY_PATH +LIBRARY_PATH="$ac_LIBRARY_PATH" +export LIBRARY_PATH +AC_LANG_RESTORE +]) + +if test "$kde_cv_qt_direct" = "yes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the Qt headers and libraries. +dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed) +dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_PATH_QT_1_3], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([KDE_USE_QT]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +dnl ------------------------------------------------------------------------ +dnl Add configure flag to enable linking to MT version of Qt library. +dnl ------------------------------------------------------------------------ + +AC_ARG_ENABLE( + mt, + AC_HELP_STRING([--disable-mt],[link to non-threaded Qt (deprecated)]), + kde_use_qt_mt=$enableval, + [ + if test $kde_qtver = 3; then + kde_use_qt_mt=yes + else + kde_use_qt_mt=no + fi + ] +) + +USING_QT_MT="" + +dnl ------------------------------------------------------------------------ +dnl If we not get --disable-qt-mt then adjust some vars for the host. +dnl ------------------------------------------------------------------------ + +KDE_MT_LDFLAGS= +KDE_MT_LIBS= +if test "x$kde_use_qt_mt" = "xyes"; then + KDE_CHECK_THREADING + if test "x$kde_use_threading" = "xyes"; then + CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS" + KDE_MT_LDFLAGS="$USE_THREADS" + KDE_MT_LIBS="$LIBPTHREAD" + else + kde_use_qt_mt=no + fi +fi +AC_SUBST(KDE_MT_LDFLAGS) +AC_SUBST(KDE_MT_LIBS) + +kde_qt_was_given=yes + +dnl ------------------------------------------------------------------------ +dnl If we haven't been told how to link to Qt, we work it out for ourselves. +dnl ------------------------------------------------------------------------ +if test -z "$LIBQT_GLOB"; then + if test "x$kde_use_qt_emb" = "xyes"; then + LIBQT_GLOB="libqte.*" + else + LIBQT_GLOB="libqt.*" + fi +fi + +dnl ------------------------------------------------------------ +dnl If we got --enable-embedded then adjust the Qt library name. +dnl ------------------------------------------------------------ +if test "x$kde_use_qt_emb" = "xyes"; then + qtlib="qte" +else + qtlib="qt" +fi + +kde_int_qt="-l$qtlib" + +if test -z "$LIBQPE"; then +dnl ------------------------------------------------------------ +dnl If we got --enable-palmtop then add -lqpe to the link line +dnl ------------------------------------------------------------ + if test "x$kde_use_qt_emb" = "xyes"; then + if test "x$kde_use_qt_emb_palm" = "xyes"; then + LIB_QPE="-lqpe" + else + LIB_QPE="" + fi + else + LIB_QPE="" + fi +fi + +dnl ------------------------------------------------------------------------ +dnl If we got --enable-qt-mt then adjust the Qt library name for the host. +dnl ------------------------------------------------------------------------ + +if test "x$kde_use_qt_mt" = "xyes"; then + LIBQT="-l$qtlib-mt" + kde_int_qt="-l$qtlib-mt" + LIBQT_GLOB="lib$qtlib-mt.*" + USING_QT_MT="using -mt" +else + LIBQT="-l$qtlib" +fi + +if test $kde_qtver != 1; then + + AC_REQUIRE([AC_FIND_PNG]) + AC_REQUIRE([AC_FIND_JPEG]) + LIBQT="$LIBQT $LIBPNG $LIBJPEG" +fi + +if test $kde_qtver = 3; then + AC_REQUIRE([KDE_CHECK_LIBDL]) + LIBQT="$LIBQT $LIBDL" +fi + +AC_MSG_CHECKING([for Qt]) + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes" && test "x$kde_use_qt_win" != "xyes"; then +LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET" +fi +ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO +qt_libraries="" +qt_includes="" +AC_ARG_WITH(qt-dir, + AC_HELP_STRING([--with-qt-dir=DIR],[where the root of Qt is installed ]), + [ ac_qt_includes="$withval"/include + ac_qt_libraries="$withval"/lib${kdelibsuff} + ac_qt_bindir="$withval"/bin + ]) + +AC_ARG_WITH(qt-includes, + AC_HELP_STRING([--with-qt-includes=DIR],[where the Qt includes are. ]), + [ + ac_qt_includes="$withval" + ]) + +kde_qt_libs_given=no + +AC_ARG_WITH(qt-libraries, + AC_HELP_STRING([--with-qt-libraries=DIR],[where the Qt library is installed.]), + [ ac_qt_libraries="$withval" + kde_qt_libs_given=yes + ]) + +AC_CACHE_VAL(ac_cv_have_qt, +[#try to guess Qt locations + +qt_incdirs="" +for dir in $kde_qt_dirs; do + qt_incdirs="$qt_incdirs $dir/include $dir" +done +qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 /usr/include/qt3 $x_includes" +if test ! "$ac_qt_includes" = "NO"; then + qt_incdirs="$ac_qt_includes $qt_incdirs" +fi + +if test "$kde_qtver" != "1"; then + kde_qt_header=qstyle.h +else + kde_qt_header=qglobal.h +fi + +AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir) +ac_qt_includes="$qt_incdir" + +qt_libdirs="" +for dir in $kde_qt_dirs; do + qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir" +done +qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries" +if test ! "$ac_qt_libraries" = "NO"; then + qt_libdir=$ac_qt_libraries +else + qt_libdirs="$ac_qt_libraries $qt_libdirs" + # if the Qt was given, the chance is too big that libqt.* doesn't exist + qt_libdir=NONE + for dir in $qt_libdirs; do + try="ls -1 $dir/${LIBQT_GLOB}" + if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done +fi +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIBQT="$LIBQT ${kde_int_qt}_incremental" + break + fi +done + +ac_qt_libraries="$qt_libdir" + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +ac_cxxflags_safe="$CXXFLAGS" +ac_ldflags_safe="$LDFLAGS" +ac_libs_safe="$LIBS" + +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" +LIBS="$LIBS $LIBQT $KDE_MT_LIBS" + +KDE_PRINT_QT_PROGRAM + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* +else + echo "configure: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC + ac_qt_libraries="NO" +fi +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +AC_LANG_RESTORE +if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then + ac_cv_have_qt="have_qt=no" + ac_qt_notfound="" + missing_qt_mt="" + if test "$ac_qt_includes" = NO; then + if test "$ac_qt_libraries" = NO; then + ac_qt_notfound="(headers and libraries)"; + else + ac_qt_notfound="(headers)"; + fi + else + if test "x$kde_use_qt_mt" = "xyes"; then + missing_qt_mt=" +Make sure that you have compiled Qt with thread support!" + ac_qt_notfound="(library $qtlib-mt)"; + else + ac_qt_notfound="(library $qtlib)"; + fi + fi + + AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation! +For more details about this problem, look at the end of config.log.$missing_qt_mt]) +else + have_qt="yes" +fi +]) + +eval "$ac_cv_have_qt" + +if test "$have_qt" != yes; then + AC_MSG_RESULT([$have_qt]); +else + ac_cv_have_qt="have_qt=yes \ + ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" + AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT]) + + qt_libraries="$ac_qt_libraries" + qt_includes="$ac_qt_includes" +fi + +if test ! "$kde_qt_libs_given" = "yes" && test ! "$kde_qtver" = 3; then + KDE_CHECK_QT_DIRECT(qt_libraries= ,[]) +fi + +AC_SUBST(qt_libraries) +AC_SUBST(qt_includes) + +if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then + QT_INCLUDES="" +else + QT_INCLUDES="-I$qt_includes" + all_includes="$QT_INCLUDES $all_includes" +fi + +if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then + QT_LDFLAGS="" +else + QT_LDFLAGS="-L$qt_libraries" + all_libraries="$QT_LDFLAGS $all_libraries" +fi +test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS" + +AC_SUBST(QT_INCLUDES) +AC_SUBST(QT_LDFLAGS) +AC_PATH_QT_MOC_UIC + +KDE_CHECK_QT_JPEG + +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes" && test "x$kde_use_qt_win" != "xyes"; then +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG) -lXext $(LIB_X11) $(LIBSM)' +else +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG)' +fi +test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS" +for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do + if test -e "$a"; then + LIB_QT="$LIB_QT ${kde_int_qt}_incremental" + break + fi +done + +AC_SUBST(LIB_QT) +AC_SUBST(LIB_QPE) + +AC_SUBST(kde_qtver) +]) + +AC_DEFUN([AC_PATH_QT], +[ +AC_PATH_QT_1_3 +]) + +AC_DEFUN([KDE_CHECK_UIC_PLUGINS], +[ +AC_REQUIRE([AC_PATH_QT_MOC_UIC]) + +if test x$ac_uic_supports_libpath = xyes; then + +AC_MSG_CHECKING([if UIC has KDE plugins available]) +AC_CACHE_VAL(kde_cv_uic_plugins, +[ +cat > actest.ui << EOF + +NewConnectionDialog + + + + testInput + + + + +EOF + + + +kde_cv_uic_plugins=no +kde_line="$UIC_PATH -L $kde_widgetdir" +if test x$ac_uic_supports_nounload = xyes; then + kde_line="$kde_line -nounload" +fi +kde_line="$kde_line -impl actest.h actest.ui > actest.cpp" +if AC_TRY_EVAL(kde_line); then + # if you're trying to debug this check and think it's incorrect, + # better check your installation. The check _is_ correct - your + # installation is not. + if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then + kde_cv_uic_plugins=yes + fi +fi +rm -f actest.ui actest.cpp +]) + +AC_MSG_RESULT([$kde_cv_uic_plugins]) +if test "$kde_cv_uic_plugins" != yes; then + AC_MSG_ERROR([ +you need to install kdelibs first. + +If you did install kdelibs, then the Qt version that is picked up by +this configure is not the same version you used to compile kdelibs. +The Qt Plugin installed by kdelibs is *ONLY* loadable if it is the +_same Qt version_, compiled with the _same compiler_ and the same Qt +configuration settings. +]) +fi +fi +]) + +AC_DEFUN([KDE_CHECK_FINAL], +[ + AC_ARG_ENABLE(final, + AC_HELP_STRING([--enable-final], + [build size optimized apps (experimental - needs lots of memory)]), + kde_use_final=$enableval, kde_use_final=no) + + if test "x$kde_use_final" = "xyes"; then + KDE_USE_FINAL_TRUE="" + KDE_USE_FINAL_FALSE="#" + else + KDE_USE_FINAL_TRUE="#" + KDE_USE_FINAL_FALSE="" + fi + AC_SUBST(KDE_USE_FINAL_TRUE) + AC_SUBST(KDE_USE_FINAL_FALSE) +]) + +AC_DEFUN([KDE_CHECK_CLOSURE], +[ + AC_ARG_ENABLE(closure, + AC_HELP_STRING([--enable-closure],[delay template instantiation]), + kde_use_closure=$enableval, kde_use_closure=no) + + KDE_NO_UNDEFINED="" + if test "x$kde_use_closure" = "xyes"; then + KDE_USE_CLOSURE_TRUE="" + KDE_USE_CLOSURE_FALSE="#" +# CXXFLAGS="$CXXFLAGS $REPO" + else + KDE_USE_CLOSURE_TRUE="#" + KDE_USE_CLOSURE_FALSE="" + KDE_NO_UNDEFINED="" + case $host in + *-*-linux-gnu) + KDE_CHECK_COMPILER_FLAG([Wl,--no-undefined], + [KDE_CHECK_COMPILER_FLAG([Wl,--allow-shlib-undefined], + [KDE_NO_UNDEFINED="-Wl,--no-undefined -Wl,--allow-shlib-undefined"], + [KDE_NO_UNDEFINED=""])], + [KDE_NO_UNDEFINED=""]) + ;; + esac + fi + AC_SUBST(KDE_USE_CLOSURE_TRUE) + AC_SUBST(KDE_USE_CLOSURE_FALSE) + AC_SUBST(KDE_NO_UNDEFINED) +]) + +dnl Check if the linker supports --enable-new-dtags and --as-needed +AC_DEFUN([KDE_CHECK_NEW_LDFLAGS], +[ + AC_ARG_ENABLE(new_ldflags, + AC_HELP_STRING([--enable-new-ldflags], + [enable the new linker flags]), + kde_use_new_ldflags=$enableval, + kde_use_new_ldflags=no) + + LDFLAGS_AS_NEEDED="" + LDFLAGS_NEW_DTAGS="" + if test "x$kde_use_new_ldflags" = "xyes"; then + LDFLAGS_NEW_DTAGS="" + KDE_CHECK_COMPILER_FLAG([Wl,--enable-new-dtags], + [LDFLAGS_NEW_DTAGS="-Wl,--enable-new-dtags"],) + + KDE_CHECK_COMPILER_FLAG([Wl,--as-needed], + [LDFLAGS_AS_NEEDED="-Wl,--as-needed"],) + fi + AC_SUBST(LDFLAGS_AS_NEEDED) + AC_SUBST(LDFLAGS_NEW_DTAGS) +]) + +AC_DEFUN([KDE_CHECK_NMCHECK], +[ + AC_ARG_ENABLE(nmcheck,AC_HELP_STRING([--enable-nmcheck],[enable automatic namespace cleanness check]), + kde_use_nmcheck=$enableval, kde_use_nmcheck=no) + + if test "$kde_use_nmcheck" = "yes"; then + KDE_USE_NMCHECK_TRUE="" + KDE_USE_NMCHECK_FALSE="#" + else + KDE_USE_NMCHECK_TRUE="#" + KDE_USE_NMCHECK_FALSE="" + fi + AC_SUBST(KDE_USE_NMCHECK_TRUE) + AC_SUBST(KDE_USE_NMCHECK_FALSE) +]) + +AC_DEFUN([KDE_EXPAND_MAKEVAR], [ +savex=$exec_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +tmp=$$2 +while $1=`eval echo "$tmp"`; test "x$$1" != "x$tmp"; do tmp=$$1; done +exec_prefix=$savex +]) + +dnl ------------------------------------------------------------------------ +dnl Now, the same with KDE +dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed) +dnl and $(kde_includes) will be the kdehdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_BASE_PATH_KDE], +[ +AC_REQUIRE([KDE_CHECK_STL]) +AC_REQUIRE([AC_PATH_QT])dnl + +if test "$use_kde" = "yes"; then +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_CHECK_RPATH +AC_MSG_CHECKING([for KDE]) + +if test "${prefix}" != NONE; then + kde_includes=${includedir} + KDE_EXPAND_MAKEVAR(ac_kde_includes, includedir) + + kde_libraries=${libdir} + KDE_EXPAND_MAKEVAR(ac_kde_libraries, libdir) + +else + ac_kde_includes= + ac_kde_libraries= + kde_libraries="" + kde_includes="" +fi + +AC_CACHE_VAL(ac_cv_have_kde, +[#try to guess kde locations + +if test "$kde_qtver" = 1; then + kde_check_header="ksock.h" + kde_check_lib="libkdecore.la" +else + kde_check_header="ksharedptr.h" + kde_check_lib="libkio.la" +fi + +if test -z "$1"; then + +kde_incdirs="$kde_libs_prefix/include /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes" +test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs" +kde_incdirs="$ac_kde_includes $kde_incdirs" +AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir) +ac_kde_includes="$kde_incdir" + +if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then + AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE headers installed. This will fail. +So, check this please and use another prefix!]) +fi + +kde_libdirs="$kde_libs_prefix/lib${kdelibsuff} /usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}" +test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs" +kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs" +AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir) +ac_kde_libraries="$kde_libdir" + +kde_widgetdir=NO +dnl this might be somewhere else +AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir) + +if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then +AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE libraries installed. This will fail. +So, check this please and use another prefix!]) +fi + +dnl Not needed for SIM ... +dnl if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then +dnl AC_MSG_ERROR([ +dnl I can't find the designer plugins. These are required and should have been installed +dnl by kdelibs]) +dnl fi + +if test -n "$kde_widgetdir"; then + kde_widgetdir="$kde_widgetdir/kde3/plugins/designer" +fi + + +if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then + ac_cv_have_kde="have_kde=no" +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" +fi + +else dnl test -z $1, e.g. from kdelibs + + ac_cv_have_kde="have_kde=no" + +fi +])dnl + +eval "$ac_cv_have_kde" + +if test "$have_kde" != "yes"; then + if test "${prefix}" = NONE; then + ac_kde_prefix="$ac_default_prefix" + else + ac_kde_prefix="$prefix" + fi + if test "$exec_prefix" = NONE; then + ac_kde_exec_prefix="$ac_kde_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix]) + else + ac_kde_exec_prefix="$exec_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix]) + fi + + kde_libraries="${libdir}" + kde_includes="${includedir}" + +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" + AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes]) + + kde_libraries="$ac_kde_libraries" + kde_includes="$ac_kde_includes" +fi +AC_SUBST(kde_libraries) +AC_SUBST(kde_includes) + +if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then + KDE_INCLUDES="" +else + KDE_INCLUDES="-I$kde_includes" + all_includes="$KDE_INCLUDES $all_includes" +fi + +KDE_DEFAULT_CXXFLAGS="-DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION" + +KDE_LDFLAGS="-L$kde_libraries" +if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then + all_libraries="$KDE_LDFLAGS $all_libraries" +fi +AC_DEFINE(USE_KDE,1,[Use KDE]) +else +kde_libraries="$qt_libraries" +AC_SUBST(kde_libraries) +fi + +AC_SUBST(KDE_LDFLAGS) +AC_SUBST(KDE_INCLUDES) + +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +all_libraries="$all_libraries $USER_LDFLAGS" +all_includes="$all_includes $USER_INCLUDES" +AC_SUBST(all_includes) +AC_SUBST(all_libraries) + +if test "$use_kde" = "yes"; then + if test -z "$1"; then + KDE_CHECK_UIC_PLUGINS + fi +fi +ac_kde_libraries="$kde_libdir" + +AC_SUBST(AUTODIRS) + + +]) + +AC_DEFUN([KDE_CHECK_EXTRA_LIBS], +[ +AC_MSG_CHECKING(for extra includes) +AC_ARG_WITH(extra-includes,AC_HELP_STRING([--with-extra-includes=DIR],[adds non standard include paths]), + kde_use_extra_includes="$withval", + kde_use_extra_includes=NONE +) +kde_extra_includes= +if test -n "$kde_use_extra_includes" && \ + test "$kde_use_extra_includes" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_includes; do + kde_extra_includes="$kde_extra_includes $dir" + USER_INCLUDES="$USER_INCLUDES -I$dir" + done + IFS=$ac_save_ifs + kde_use_extra_includes="added" +else + kde_use_extra_includes="no" +fi +AC_SUBST(USER_INCLUDES) + +AC_MSG_RESULT($kde_use_extra_includes) + +kde_extra_libs= +AC_MSG_CHECKING(for extra libs) +AC_ARG_WITH(extra-libs,AC_HELP_STRING([--with-extra-libs=DIR],[adds non standard library paths]), + kde_use_extra_libs=$withval, + kde_use_extra_libs=NONE +) +if test -n "$kde_use_extra_libs" && \ + test "$kde_use_extra_libs" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_libs; do + kde_extra_libs="$kde_extra_libs $dir" + KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir" + USER_LDFLAGS="$USER_LDFLAGS -L$dir" + done + IFS=$ac_save_ifs + kde_use_extra_libs="added" +else + kde_use_extra_libs="no" +fi + +AC_SUBST(USER_LDFLAGS) + +AC_MSG_RESULT($kde_use_extra_libs) + +]) + +AC_DEFUN([KDE_1_CHECK_PATH_HEADERS], +[ + AC_MSG_CHECKING([for KDE headers installed]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS +cat > conftest.$ac_ext < +#endif +#include +#include "confdefs.h" +#include + +int main() { + printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data()); + printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data()); + printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data()); + printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data()); + printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data()); + printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data()); + printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data()); + printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data()); + printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data()); + printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data()); + printf("kde_wallpaperdir=\\"%s\\"\n", + KApplication::kde_wallpaperdir().data()); + printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data()); + printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data()); + printf("kde_servicesdir=\\"/tmp/dummy\\"\n"); + printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n"); + printf("kde_moduledir=\\"/tmp/dummy\\"\n"); + printf("kde_styledir=\\"/tmp/dummy\\"\n"); + printf("kde_widgetdir=\\"/tmp/dummy\\"\n"); + printf("xdg_appsdir=\\"/tmp/dummy\\"\n"); + printf("xdg_menudir=\\"/tmp/dummy\\"\n"); + printf("xdg_directorydir=\\"/tmp/dummy\\"\n"); + printf("kde_kcfgdir=\\"/tmp/dummy\\"\n"); + return 0; + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$all_includes $CPPFLAGS" + if AC_TRY_EVAL(ac_compile); then + AC_MSG_RESULT(yes) + else + AC_MSG_ERROR([your system is not able to compile a small KDE application! +Check, if you installed the KDE header files correctly. +For more details about this problem, look at the end of config.log.]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_CHECK_KDEQTADDON], +[ +AC_MSG_CHECKING(for kde-qt-addon) +AC_CACHE_VAL(kde_cv_have_kdeqtaddon, +[ + kde_ldflags_safe="$LDFLAGS" + kde_libs_safe="$LIBS" + kde_cxxflags_safe="$CXXFLAGS" + + LIBS="-lkde-qt-addon $LIBQT $LIBS" + CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes" + LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS" + + AC_TRY_LINK([ + #include + ], + [ + QDomDocument doc; + ], + kde_cv_have_kdeqtaddon=yes, + kde_cv_have_kdeqtaddon=no + ) + + LDFLAGS=$kde_ldflags_safe + LIBS=$kde_libs_safe + CXXFLAGS=$kde_cxxflags_safe +]) + +AC_MSG_RESULT($kde_cv_have_kdeqtaddon) + +if test "$kde_cv_have_kdeqtaddon" = "no"; then + AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first. +It is a separate package (and CVS module) named kde-qt-addon.]) +fi +]) + +AC_DEFUN([KDE_CREATE_LIBS_ALIASES], +[ + AC_REQUIRE([KDE_MISC_TESTS]) + AC_REQUIRE([KDE_CHECK_LIBDL]) + AC_REQUIRE([K_PATH_X]) + + AC_REQUIRE([KDE_USE_QT]) +if test "$use_kde" = "yes"; then +if test $kde_qtver = 3; then + case $host in + *cygwin*) lib_kded="-lkdeinit_kded" ;; + *) lib_kded="" ;; + esac + AC_SUBST(LIB_KDED, $lib_kded) + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KJS, "-lkjs") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KABC, "-lkabc") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") + AC_SUBST(LIB_KUTILS, "-lkutils") + AC_SUBST(LIB_KDEPIM, "-lkdepim") + AC_SUBST(LIB_KDEFX, "-lkdefx") + AC_SUBST(LIB_KIMPROXY, "-lkimproxy") + AC_SUBST(LIB_KNEWSTUFF, "-lknewstuff") + AC_SUBST(LIB_KDNSSD, "-lkdnssd") + AC_SUBST(LIB_KUNITTEST, "-lkunittest") +# these are for backward compatibility + AC_SUBST(LIB_KSYCOCA, "-lkio") + AC_SUBST(LIB_KFILE, "-lkio") +elif test $kde_qtver = 2; then + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KSYCOCA, "-lksycoca") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KFILE, "-lkfile") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") +else + AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)") + AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)") + AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)") + AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)") + AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)") +fi +fi +]) + +AC_DEFUN([AC_PATH_KDE], +[ + AC_BASE_PATH_KDE + AC_ARG_ENABLE(path-check,AC_HELP_STRING([--disable-path-check],[don't try to find out, where to install]), + [ + if test "$enableval" = "no"; + then ac_use_path_checking="default" + else ac_use_path_checking="" + fi + ], + [ + if test "$kde_qtver" = 1; + then ac_use_path_checking="" + else ac_use_path_checking="default" + fi + ] + ) + + if test "$use_kde" = "yes"; then + AC_CREATE_KFSSTND($ac_use_path_checking) + + AC_SUBST_KFSSTND + KDE_CREATE_LIBS_ALIASES + fi +]) + +dnl KDE_CHECK_FUNC_EXT(, [headers], [sample-use], [C prototype], [autoheader define], [call if found]) +AC_DEFUN([KDE_CHECK_FUNC_EXT], +[ +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(kde_cv_func_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +save_CXXFLAGS="$CXXFLAGS" +kde_safe_LIBS="$LIBS" +LIBS="$LIBS $X_EXTRA_LIBS" +if test "$GXX" = "yes"; then +CXXFLAGS="$CXXFLAGS -pedantic-errors" +fi +AC_TRY_COMPILE([ +$2 +], +[ +$3 +], +kde_cv_func_$1=yes, +kde_cv_func_$1=no) +CXXFLAGS="$save_CXXFLAGS" +LIBS="$kde_safe_LIBS" +AC_LANG_RESTORE +]) + +AC_MSG_RESULT($kde_cv_func_$1) + +AC_MSG_CHECKING([if $1 needs custom prototype]) +AC_CACHE_VAL(kde_cv_proto_$1, +[ +if test "x$kde_cv_func_$1" = xyes; then + kde_cv_proto_$1=no +else + case "$1" in + setenv|unsetenv|usleep|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat) + kde_cv_proto_$1="yes - in libkdefakes" + ;; + *) + kde_cv_proto_$1=unknown + ;; + esac +fi + +if test "x$kde_cv_proto_$1" = xunknown; then + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + kde_safe_libs=$LIBS + LIBS="$LIBS $X_EXTRA_LIBS" + AC_TRY_LINK([ +$2 + +extern "C" $4; +], +[ +$3 +], +[ kde_cv_func_$1=yes + kde_cv_proto_$1=yes ], + [kde_cv_proto_$1="$1 unavailable"] +) +LIBS=$kde_safe_libs +AC_LANG_RESTORE +fi +]) +AC_MSG_RESULT($kde_cv_proto_$1) + +if test "x$kde_cv_func_$1" = xyes; then + AC_DEFINE(HAVE_$5, 1, [Define if you have $1]) + $6 +fi +if test "x$kde_cv_proto_$1" = xno; then + AC_DEFINE(HAVE_$5_PROTO, 1, + [Define if you have the $1 prototype]) +fi + +AH_VERBATIM([_HAVE_$5_PROTO], +[ +#if !defined(HAVE_$5_PROTO) +#ifdef __cplusplus +extern "C" { +#endif +$4; +#ifdef __cplusplus +} +#endif +#endif +]) +]) + +AC_DEFUN([AC_CHECK_SETENV], +[ + KDE_CHECK_FUNC_EXT(setenv, [ +#include +], + [setenv("VAR", "VALUE", 1);], + [int setenv (const char *, const char *, int)], + [SETENV]) +]) + +AC_DEFUN([AC_CHECK_UNSETENV], +[ + KDE_CHECK_FUNC_EXT(unsetenv, [ +#include +], + [unsetenv("VAR");], + [void unsetenv (const char *)], + [UNSETENV]) +]) + +AC_DEFUN([AC_CHECK_GETDOMAINNAME], +[ + KDE_CHECK_FUNC_EXT(getdomainname, [ +#include +#include +#include +], + [ +char buffer[200]; +getdomainname(buffer, 200); +], + [#include + int getdomainname (char *, size_t)], + [GETDOMAINNAME]) +]) + +AC_DEFUN([AC_CHECK_GETHOSTNAME], +[ + KDE_CHECK_FUNC_EXT(gethostname, [ +#include +#include +], + [ +char buffer[200]; +gethostname(buffer, 200); +], + [int gethostname (char *, unsigned int)], + [GETHOSTNAME]) +]) + +AC_DEFUN([AC_CHECK_USLEEP], +[ + KDE_CHECK_FUNC_EXT(usleep, [ +#include +], + [ +usleep(200); +], + [int usleep (unsigned int)], + [USLEEP]) +]) + + +AC_DEFUN([AC_CHECK_RANDOM], +[ + KDE_CHECK_FUNC_EXT(random, [ +#include +], + [ +random(); +], + [long int random(void)], + [RANDOM]) + + KDE_CHECK_FUNC_EXT(srandom, [ +#include +], + [ +srandom(27); +], + [void srandom(unsigned int)], + [SRANDOM]) + +]) + +AC_DEFUN([AC_CHECK_INITGROUPS], +[ + KDE_CHECK_FUNC_EXT(initgroups, [ +#include +#include +#include +], + [ +char buffer[200]; +initgroups(buffer, 27); +], + [int initgroups(const char *, gid_t)], + [INITGROUPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMPS], +[ + KDE_CHECK_FUNC_EXT(mkstemps, [ +#include +#include +], + [ +mkstemps("/tmp/aaaXXXXXX", 6); +], + [int mkstemps(char *, int)], + [MKSTEMPS]) +]) + +AC_DEFUN([AC_CHECK_MKSTEMP], +[ + KDE_CHECK_FUNC_EXT(mkstemp, [ +#include +#include +], + [ +mkstemp("/tmp/aaaXXXXXX"); +], + [int mkstemp(char *)], + [MKSTEMP]) +]) + +AC_DEFUN([AC_CHECK_MKDTEMP], +[ + KDE_CHECK_FUNC_EXT(mkdtemp, [ +#include +#include +], + [ +mkdtemp("/tmp/aaaXXXXXX"); +], + [char *mkdtemp(char *)], + [MKDTEMP]) +]) + + +AC_DEFUN([AC_CHECK_RES_INIT], +[ + AC_MSG_CHECKING([if res_init needs -lresolv]) + kde_libs_safe="$LIBS" + LIBS="$LIBS $X_EXTRA_LIBS -lresolv" + AC_TRY_LINK( + [ +#include +#include +#include +#include + ], + [ + res_init(); + ], + [ + LIBRESOLV="-lresolv" + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) + ], + [ AC_MSG_RESULT(no) ] + ) + LIBS=$kde_libs_safe + AC_SUBST(LIBRESOLV) + + KDE_CHECK_FUNC_EXT(res_init, + [ +#include +#include +#include +#include + ], + [res_init()], + [int res_init(void)], + [RES_INIT]) +]) + +AC_DEFUN([AC_CHECK_STRLCPY], +[ + KDE_CHECK_FUNC_EXT(strlcpy, [ +#include +], +[ char buf[20]; + strlcpy(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcpy(char*, const char*, unsigned long)], + [STRLCPY]) +]) + +AC_DEFUN([AC_CHECK_STRLCAT], +[ + KDE_CHECK_FUNC_EXT(strlcat, [ +#include +], +[ char buf[20]; + buf[0]='\0'; + strlcat(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcat(char*, const char*, unsigned long)], + [STRLCAT]) +]) + +AC_DEFUN([AC_CHECK_RES_QUERY], +[ + KDE_CHECK_FUNC_EXT(res_query, [ +#include +#include +#include +#include +#include +], +[ +res_query(NULL, 0, 0, NULL, 0); +], + [int res_query(const char *, int, int, unsigned char *, int)], + [RES_QUERY]) +]) + +AC_DEFUN([AC_CHECK_DN_SKIPNAME], +[ + KDE_CHECK_FUNC_EXT(dn_skipname, [ +#include +#include +#include +#include +], +[ +dn_skipname (NULL, NULL); +], + [int dn_skipname (unsigned char *, unsigned char *)], + [DN_SKIPNAME]) +]) + + +AC_DEFUN([AC_FIND_GIF], + [AC_MSG_CHECKING([for giflib]) +AC_CACHE_VAL(ac_cv_lib_gif, +[ac_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes" && test "x$kde_use_qt_win" != "xyes"; then +LIBS="$all_libraries -lgif -lX11 $LIBSOCKET" +else +LIBS="$all_libraries -lgif" +fi +AC_TRY_LINK(dnl +[ +#ifdef __cplusplus +extern "C" { +#endif +int GifLastError(void); +#ifdef __cplusplus +} +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +], + [return GifLastError();], + eval "ac_cv_lib_gif=yes", + eval "ac_cv_lib_gif=no") +LIBS="$ac_save_LIBS" +])dnl +if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif]) +else + AC_MSG_ERROR(You need giflib30. Please install the kdesupport package) +fi +]) + +AC_DEFUN([KDE_FIND_JPEG_HELPER], +[ +AC_MSG_CHECKING([for libjpeg$2]) +AC_CACHE_VAL(ac_cv_lib_jpeg_$1, +[ +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[ +#ifdef __cplusplus +extern "C" { +#endif +void jpeg_CreateDecompress(); +#ifdef __cplusplus +} +#endif +], +[jpeg_CreateDecompress();], + eval "ac_cv_lib_jpeg_$1=-ljpeg$2", + eval "ac_cv_lib_jpeg_$1=no") +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" +]) + +if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then + LIBJPEG="$ac_cv_lib_jpeg_$1" + AC_MSG_RESULT($ac_cv_lib_jpeg_$1) +else + AC_MSG_RESULT(no) + $3 +fi + +]) + +AC_DEFUN([AC_FIND_JPEG], +[ +dnl first look for libraries +KDE_FIND_JPEG_HELPER(6b, 6b, + KDE_FIND_JPEG_HELPER(normal, [], + [ + LIBJPEG= + ] + ) +) + +dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h +dnl requires system dependent includes loaded before it) +jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes" +AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir) +test "x$jpeg_incdir" = xNO && jpeg_incdir= + +dnl if headers _and_ libraries are missing, this is no error, and we +dnl continue with a warning (the user will get no jpeg support in khtml) +dnl if only one is missing, it means a configuration error, but we still +dnl only warn +if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then + AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg]) +else + if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then + AC_MSG_WARN([ +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +]) + else + AC_MSG_WARN([libjpeg not found. disable JPEG support.]) + fi + jpeg_incdir= + LIBJPEG= +fi + +AC_SUBST(LIBJPEG) +AH_VERBATIM(_AC_CHECK_JPEG, +[/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif +]) +]) + +AC_DEFUN([KDE_CHECK_QT_JPEG], +[ +if test -n "$LIBJPEG"; then +AC_MSG_CHECKING([if Qt needs $LIBJPEG]) +AC_CACHE_VAL(kde_cv_qt_jpeg, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS $LIBQT" +LIBS=`echo $LIBS | sed "s/$LIBJPEG//"` +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[#include ], + [ + int argc; + char** argv; + QApplication app(argc, argv);], + eval "kde_cv_qt_jpeg=no", + eval "kde_cv_qt_jpeg=yes") +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +fi +]) + +if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then + AC_MSG_RESULT(yes) + LIBJPEG_QT='$(LIBJPEG)' +else + AC_MSG_RESULT(no) + LIBJPEG_QT= +fi + +]) + +AC_DEFUN([AC_FIND_ZLIB], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for libz]) +AC_CACHE_VAL(ac_cv_lib_z, +[ +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#include +], +[ + char buf[42]; + gzFile f = (gzFile) 0; + /* this would segfault.. but we only link, don't run */ + (void) gzgets(f, buf, sizeof(buf)); + + return (zlibVersion() == ZLIB_VERSION); +], + eval "ac_cv_lib_z='-lz'", + eval "ac_cv_lib_z=no") +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if test ! "$ac_cv_lib_z" = no; then + AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz]) + LIBZ="$ac_cv_lib_z" + AC_MSG_RESULT($ac_cv_lib_z) +else + AC_MSG_ERROR(not found. + Possibly configure picks up an outdated version + installed by XFree86. Remove it from your system. + + Check your installation and look into config.log) + LIBZ="" +fi +AC_SUBST(LIBZ) +]) + +AC_DEFUN([KDE_TRY_TIFFLIB], +[ +AC_MSG_CHECKING([for libtiff $1]) + +AC_CACHE_VAL(kde_cv_libtiff_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes" && test "x$kde_use_qt_win" != "xyes"; then +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm" +else +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm" +fi +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl +[ +#include +], + [return (TIFFOpen( "", "r") == 0); ], +[ + kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ" +], [ + kde_cv_libtiff_$1=no +]) + +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +]) + +if test "$kde_cv_libtiff_$1" = "no"; then + AC_MSG_RESULT(no) + LIBTIFF="" + $3 +else + LIBTIFF="$kde_cv_libtiff_$1" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff]) + $2 +fi + +]) + +AC_DEFUN([AC_FIND_TIFF], +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +KDE_TRY_TIFFLIB(tiff, [], + KDE_TRY_TIFFLIB(tiff34)) + +AC_SUBST(LIBTIFF) +]) + +AC_DEFUN([KDE_FIND_LIBEXR], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_CACHE_VAL(ac_cv_libexr, +[ + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + AC_MSG_CHECKING([for OpenEXR libraries]) + + if test "$PKG_CONFIG" = "no" ; then + AC_MSG_RESULT(no) + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + if !(`$PKG_CONFIG --exists OpenEXR`) ; then + AC_MSG_RESULT(no) + EXRSTATUS=no + else + if !(`$PKG_CONFIG --atleast-version="1.1.1" OpenEXR`) ; then + AC_MSG_RESULT(no) + EXRSTATUS=old + else + kde_save_LIBS="$LIBS" + LIBS="$LIBS $all_libraries $USER_LDFLAGS `pkg-config --libs OpenEXR` $LIBZ" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_CXXFLAGS="$CXXFLAGS" + EXR_FLAGS=`$PKG_CONFIG --cflags OpenEXR` + CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $EXR_FLAGS" + + AC_TRY_LINK(dnl + [ + #include + ], + [ + using namespace Imf; + RgbaInputFile file ("dummy"); + return 0; + ], + eval "ac_cv_libexr='`pkg-config --libs OpenEXR`'", + eval "ac_cv_libexr=no" + ) + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + if eval "test ! \"`echo $ac_cv_libexr`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_EXR, 1, [Define if you have OpenEXR]) + LIB_EXR="$ac_cv_libexr" + AC_MSG_RESULT($ac_cv_libexr) + else + AC_MSG_RESULT(no) + LIB_EXR="" + fi + fi + fi + fi + AC_SUBST(LIB_EXR) + AC_SUBST(EXR_FLAGS) +]) + + + +AC_DEFUN([AC_FIND_PNG], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_MSG_CHECKING([for libpng]) +AC_CACHE_VAL(ac_cv_lib_png, +[ +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes" && test "x$kde_use_qt_win" != "xyes"; then +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET" +else +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm" +fi +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + png_structp png_ptr = png_create_read_struct( /* image ptr */ + PNG_LIBPNG_VER_STRING, 0, 0, 0 ); + return( png_ptr != 0 ); + ], + eval "ac_cv_lib_png='-lpng $LIBZ -lm'", + eval "ac_cv_lib_png=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng]) + LIBPNG="$ac_cv_lib_png" + AC_SUBST(LIBPNG) + AC_MSG_RESULT($ac_cv_lib_png) +else + AC_MSG_RESULT(no) + LIBPNG="" + AC_SUBST(LIBPNG) +fi +]) + + +AC_DEFUN([AC_FIND_JASPER], +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_MSG_CHECKING([for jasper]) +AC_CACHE_VAL(ac_cv_jasper, +[ +kde_save_LIBS="$LIBS" +LIBS="$LIBS $all_libraries $USER_LDFLAGS -ljasper $LIBJPEG -lm" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl + [ + #include + ], + [ + return( jas_init() ); + ], + eval "ac_cv_jasper='-ljasper $LIBJPEG -lm'", + eval "ac_cv_jasper=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_jasper`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_JASPER, 1, [Define if you have jasper]) + LIB_JASPER="$ac_cv_jasper" + AC_MSG_RESULT($ac_cv_jasper) +else + AC_MSG_RESULT(no) + LIB_JASPER="" +fi +AC_SUBST(LIB_JASPER) +]) + +AC_DEFUN([AC_CHECK_BOOL], +[ + AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool]) +]) + +AC_DEFUN([AC_CHECK_GNU_EXTENSIONS], +[ +AC_MSG_CHECKING(if you need GNU extensions) +AC_CACHE_VAL(ac_cv_gnu_extensions, +[ +cat > conftest.c << EOF +#include + +#ifdef __GNU_LIBRARY__ +yes +#endif +EOF + +if (eval "$ac_cpp conftest.c") 2>&5 | + egrep "yes" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_gnu_extensions=yes +else + ac_cv_gnu_extensions=no +fi +]) + +AC_MSG_RESULT($ac_cv_gnu_extensions) +if test "$ac_cv_gnu_extensions" = "yes"; then + AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions]) +fi +]) + +AC_DEFUN([KDE_CHECK_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CXX supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], []) + CXXFLAGS="$save_CXXFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + +AC_DEFUN([KDE_CHECK_C_COMPILER_FLAG], +[ +AC_MSG_CHECKING([whether $CC supports -$1]) +kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'` +AC_CACHE_VAL(kde_cv_prog_cc_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_C + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cc_$kde_cache=yes"], []) + CFLAGS="$save_CFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cc_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + + +dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables +dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever]) +dnl it's all white-space separated +AC_DEFUN([AC_REMOVE_FORBIDDEN], +[ __val=$$1 + __forbid=" $2 " + if test -n "$__val"; then + __new="" + ac_save_IFS=$IFS + IFS=" " + for i in $__val; do + case "$__forbid" in + *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;; + *) # Careful to not add spaces, where there were none, because otherwise + # libtool gets confused, if we change e.g. CXX + if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; + esac + done + IFS=$ac_save_IFS + $1=$__new + fi +]) + + +AC_DEFUN([KDE_CHECK_FOR_BAD_COMPILER], +[ + AC_MSG_CHECKING([whether $CC is blacklisted]) + + dnl In theory we have tu run this test against $CC and $CXX + dnl in C and in C++ mode, because its perfectly legal for + dnl the user to mix compiler versions, since C has a defined + dnl ABI. + dnl + dnl For now, we assume the user is not on crack. + + AC_TRY_COMPILE([ +#ifdef __GNUC__ +#if __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 0 +choke me +#endif +#endif +], , + kde_bad_compiler=no, + kde_bad_compiler=yes +) + + AC_MSG_RESULT($kde_bad_compiler) + +if test "$kde_bad_compiler" = "yes"; then + AC_MSG_ERROR([ + +This particular compiler version is blacklisted because it +is known to miscompile KDE. Please use a newer version, or +if that is not yet available, choose an older version. + +Please do not report a bug or bother us reporting this +configure error. We know about it, and we introduced +it by intention to avoid untraceable bugs or crashes in KDE. + +]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_FOR_OPT_NOINLINE_MATCH], +[ + AC_CACHE_CHECK([whether system headers can cope with -O2 -fno-inline], + kde_cv_opt_noinline_match, + [ + kde_cv_opt_noinline_match=irrelevant + dnl if we don't use both -O2 and -fno-inline, this check is moot + if echo "$CFLAGS" | grep -e -O2 >/dev/null 2>/dev/null \ + && echo "$CFLAGS" | grep -e -fno-inline >/dev/null 2>/dev/null ; then + + ac_cflags_save="$CFLAGS" + CFLAGS="$CFLAGS -D_USE_GNU" + + AC_TRY_LINK([ + #include +], [ const char *pt, *et; + et = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p ( ";," ) && ((size_t)(const void *)(( ";," )+ 1) - (size_t)(const void *)( ";," ) == 1) ? ((__a0 =((__const char *) ( ";," ))[0], __a0 == '\0') ? ((void) ( pt ),((void *)0) ) : ((__a1 = ((__const char *) ( ";," ))[1], __a1== '\0') ? (__extension__ (__builtin_constant_p ( __a0 ) && ( __a0 ) == '\0' ? (char *) __rawmemchr ( pt , __a0) : strchr( pt , __a0 ))) : ((__a2 = ((__const char *) ( ";," ))[2], __a2 == '\0') ? __strpbrk_c2 ( pt , __a0, __a1) :(((__const char *) ( ";," ))[3] == '\0' ? __strpbrk_c3 ( pt ,__a0, __a1, __a2): strpbrk ( pt , ";," ))))) : strpbrk ( pt , ";," )); }) ; +], + kde_cv_opt_noinline_match=yes, + kde_cv_opt_noinline_match=no + ) + + CFLAGS="$ac_cflags_save" + fi + ]) +]) + + +dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given +AC_DEFUN([AC_VALIDIFY_CXXFLAGS], +[dnl +if test "x$kde_use_qt_emb" != "xyes"; then + AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath]) +else + AC_REMOVE_FORBIDDEN(CXX, [-rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath]) +fi +]) + +AC_DEFUN([AC_CHECK_COMPILERS], +[ + AC_ARG_ENABLE(debug, + AC_HELP_STRING([--enable-debug=ARG],[enables debug symbols (yes|no|full) [default=no]]), + [ + case $enableval in + yes) + kde_use_debug_code="yes" + kde_use_debug_define=no + ;; + full) + kde_use_debug_code="full" + kde_use_debug_define=no + ;; + *) + kde_use_debug_code="no" + kde_use_debug_define=yes + ;; + esac + ], + [kde_use_debug_code="no" + kde_use_debug_define=no + ]) + + dnl Just for configure --help + AC_ARG_ENABLE(dummyoption, + AC_HELP_STRING([--disable-debug], + [disables debug output and debug symbols [default=no]]), + [],[]) + + AC_ARG_ENABLE(strict, + AC_HELP_STRING([--enable-strict], + [compiles with strict compiler options (may not work!)]), + [ + if test $enableval = "no"; then + kde_use_strict_options="no" + else + kde_use_strict_options="yes" + fi + ], [kde_use_strict_options="no"]) + + AC_ARG_ENABLE(warnings,AC_HELP_STRING([--disable-warnings],[disables compilation with -Wall and similar]), + [ + if test $enableval = "no"; then + kde_use_warnings="no" + else + kde_use_warnings="yes" + fi + ], [kde_use_warnings="yes"]) + + dnl enable warnings for debug build + if test "$kde_use_debug_code" != "no"; then + kde_use_warnings=yes + fi + + AC_ARG_ENABLE(profile,AC_HELP_STRING([--enable-profile],[creates profiling infos [default=no]]), + [kde_use_profiling=$enableval], + [kde_use_profiling="no"] + ) + + dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS + CFLAGS=" $CFLAGS" + + AC_PROG_CC + + AC_PROG_CPP + + if test "$GCC" = "yes"; then + if test "$kde_use_debug_code" != "no"; then + if test $kde_use_debug_code = "full"; then + CFLAGS="-g3 -fno-inline $CFLAGS" + else + CFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CFLAGS" + fi + else + CFLAGS="-O2 $CFLAGS" + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CFLAGS="-DNDEBUG $CFLAGS" + fi + + + case "$host" in + *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";; + *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";; + esac + + if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then + LDFLAGS="" + fi + + CXXFLAGS=" $CXXFLAGS" + + AC_PROG_CXX + + KDE_CHECK_FOR_BAD_COMPILER + + if test "$GXX" = "yes" || test "$CXX" = "KCC"; then + if test "$kde_use_debug_code" != "no"; then + if test "$CXX" = "KCC"; then + CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wwrite-strings $CXXFLAGS" + else + if test "$kde_use_debug_code" = "full"; then + CXXFLAGS="-g3 -fno-inline $CXXFLAGS" + else + CXXFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CXXFLAGS" + fi + fi + KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"]) + + dnl convenience compiler flags + KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""]) + AC_SUBST(WOVERLOADED_VIRTUAL) + else + if test "$CXX" = "KCC"; then + CXXFLAGS="+K3 $CXXFLAGS" + else + CXXFLAGS="-O2 $CXXFLAGS" + fi + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS" + fi + + if test "$kde_use_profiling" = "yes"; then + KDE_CHECK_COMPILER_FLAG(pg, + [ + CFLAGS="-pg $CFLAGS" + CXXFLAGS="-pg $CXXFLAGS" + ]) + fi + + if test "$kde_use_warnings" = "yes"; then + if test "$GCC" = "yes"; then + CXXFLAGS="-Wall -W -Wpointer-arith $CXXFLAGS" + case $host in + *-*-linux-gnu) + CFLAGS="-std=iso9899:1990 -W -Wall -Wchar-subscripts -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS" + CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion -Wchar-subscripts $CXXFLAGS" + KDE_CHECK_COMPILER_FLAG(Wmissing-format-attribute, [CXXFLAGS="$CXXFLAGS -Wformat-security -Wmissing-format-attribute"]) + KDE_CHECK_C_COMPILER_FLAG(Wmissing-format-attribute, [CFLAGS="$CFLAGS -Wformat-security -Wmissing-format-attribute"]) + ;; + esac + KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"]) + KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"]) + dnl ### FIXME: revert for KDE 4 + KDE_CHECK_COMPILER_FLAG(Wno-non-virtual-dtor,[CXXFLAGS="$CXXFLAGS -Wno-non-virtual-dtor"]) + fi + fi + + if test "$GXX" = "yes" && test "$kde_use_strict_options" = "yes"; then + CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS" + fi + + AC_ARG_ENABLE(pch, + AC_HELP_STRING([--enable-pch], + [enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) [default=no]]), + [ kde_use_pch=$enableval ],[ kde_use_pch=no ]) + + HAVE_GCC_VISIBILITY=0 + AC_SUBST([HAVE_GCC_VISIBILITY]) + + if test "$GXX" = "yes"; then + gcc_no_reorder_blocks=NO + KDE_CHECK_COMPILER_FLAG(fno-reorder-blocks,[gcc_no_reorder_blocks=YES]) + if test $kde_use_debug_code != "no" && \ + test $kde_use_debug_code != "full" && \ + test "YES" = "$gcc_no_reorder_blocks" ; then + CXXFLAGS="$CXXFLAGS -fno-reorder-blocks" + CFLAGS="$CFLAGS -fno-reorder-blocks" + fi + KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"]) + KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"]) + KDE_CHECK_COMPILER_FLAG(fno-common, [CXXFLAGS="$CXXFLAGS -fno-common"]) + KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= ) + ENABLE_PERMISSIVE_FLAG="-fpermissive" + + if test "$kde_use_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c header files) + echo >conftest.h + if $CC -x c-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + if test "$kde_gcc_supports_pch" = "yes"; then + AC_MSG_CHECKING(whether gcc supports precompiling c++ header files) + if $CXX -x c++-header conftest.h >/dev/null 2>/dev/null; then + kde_gcc_supports_pch=yes + AC_MSG_RESULT(yes) + else + kde_gcc_supports_pch=no + AC_MSG_RESULT(no) + fi + fi + rm -f conftest.h conftest.h.gch + fi + + KDE_CHECK_FOR_OPT_NOINLINE_MATCH + if test "x$kde_cv_opt_noinline_match" = "xno" ; then + CFLAGS="`echo "$CFLAGS" | sed "s/ -fno-inline//"`" + fi + fi + AM_CONDITIONAL(unsermake_enable_pch, test "$kde_use_pch" = "yes" && test "$kde_gcc_supports_pch" = "yes") + if test "$CXX" = "KCC"; then + dnl unfortunately we currently cannot disable exception support in KCC + dnl because doing so is binary incompatible and Qt by default links with exceptions :-( + dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"]) + dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= ) + + if test "$kde_use_pch" = "yes"; then + dnl TODO: support --pch-dir! + KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"]) + dnl the below works (but the dir must exist), but it's + dnl useless for a whole package. + dnl The are precompiled headers for each source file, so when compiling + dnl from scratch, it doesn't make a difference, and they take up + dnl around ~5Mb _per_ sourcefile. + dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp, + dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"]) + fi + dnl this flag controls inlining. by default KCC inlines in optimisation mode + dnl all implementations that are defined inside the class {} declaration. + dnl because of templates-compatibility with broken gcc compilers, this + dnl can cause excessive inlining. This flag limits it to a sane level + KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"]) + KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"]) + KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"]) + KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"]) + dnl Some source files are shared between multiple executables + dnl (or libraries) and some of those need template instantiations. + dnl In that case KCC needs to compile those sources with + dnl --one_instantiation_per_object. To make it easy for us we compile + dnl _all_ objects with that flag (--one_per is a shorthand). + KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"]) + fi + AC_SUBST(USE_EXCEPTIONS) + dnl obsolete macro - provided to keep things going + USE_RTTI= + AC_SUBST(USE_RTTI) + + case "$host" in + *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;; + *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";; + *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";; + *-*-solaris*) + if test "$GXX" = yes; then + libstdcpp=`$CXX -print-file-name=libstdc++.so` + if test ! -f $libstdcpp; then + AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so]) + fi + fi + ;; + esac + + AC_VALIDIFY_CXXFLAGS + + AC_PROG_CXXCPP + + if test "$GCC" = yes; then + NOOPT_CFLAGS=-O0 + fi + KDE_CHECK_COMPILER_FLAG(O0,[NOOPT_CXXFLAGS=-O0]) + + AC_ARG_ENABLE(coverage, + AC_HELP_STRING([--enable-coverage],[use gcc coverage testing]), [ + if test "$am_cv_CC_dependencies_compiler_type" = "gcc3"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="-lgcc" + elif test "$am_cv_CC_dependencies_compiler_type" = "gcc"; then + ac_coverage_compiler="-fprofile-arcs -ftest-coverage" + ac_coverage_linker="" + else + AC_MSG_ERROR([coverage with your compiler is not supported]) + fi + CFLAGS="$CFLAGS $ac_coverage_compiler" + CXXFLAGS="$CXXFLAGS $ac_coverage_compiler" + LDFLAGS="$LDFLAGS $ac_coverage_linker" + ]) + + AC_SUBST(NOOPT_CXXFLAGS) + AC_SUBST(NOOPT_CFLAGS) + AC_SUBST(ENABLE_PERMISSIVE_FLAG) + + KDE_CHECK_NEW_LDFLAGS + KDE_CHECK_FINAL + KDE_CHECK_CLOSURE + KDE_CHECK_NMCHECK + + ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), []) +]) + +AC_DEFUN([KDE_CHECK_VISIBILITY_GCC_BUG], + [ + AC_CACHE_CHECK([for gcc -fvisibility-inlines-hidden bug], kde_cv_val_gcc_visibility_bug, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIC -fvisibility-inlines-hidden -O0" + LDFLAGS="$LDFLAGS -shared -fPIC" + + AC_TRY_LINK( + [ + /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 */ + #include + int some_function( void ) __attribute__ ((visibility("default"))); + int some_function( void ) + { + std::string s("blafasel"); + return 0; + } + ], [/* elvis is alive */], + kde_cv_val_gcc_visibility_bug=no, kde_cv_val_gcc_visibility_bug=yes) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_cv_val_gcc_visibility_bug = xno; then + CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden" + fi + ] +) + +AC_DEFUN([KDE_ENABLE_HIDDEN_VISIBILITY], +[ + AC_BEFORE([AC_PATH_QT_1_3], [KDE_ENABLE_HIDDEN_VISIBILITY]) + + AC_MSG_CHECKING([grepping for visibility push/pop in headers]) + + if test "x$GXX" = "xyes"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_EGREP_CPP( + [GCC visibility push], + [ #include + ], + [ + AC_MSG_RESULT(yes) + kde_stdc_visibility_patched=yes ], + [ + AC_MSG_RESULT(no) + AC_MSG_WARN([Your libstdc++ doesn't appear to be patched for + visibility support. Disabling -fvisibility=hidden]) + + kde_stdc_visibility_patched=no ]) + + AC_LANG_RESTORE + + kde_have_gcc_visibility=no + KDE_CHECK_COMPILER_FLAG(fvisibility=hidden, + [ + kde_have_gcc_visibility=yes + dnl the whole toolchain is just a mess, gcc is just too buggy + dnl to handle STL with visibility enabled. Lets reconsider + dnl when gcc 4.2 is out or when things get fixed in the compiler. + dnl Contact mueller@kde.org for details. + AC_ARG_ENABLE(gcc-hidden-visibility, + AC_HELP_STRING([--enable-gcc-hidden-visibility],[toolchain hidden visibility [default=no]]), + [kde_have_gcc_visibility=$enableval], + [kde_have_gcc_visibility=no]) + + AC_CACHE_CHECK([if Qt is patched for -fvisibility], kde_cv_val_qt_gcc_visibility_patched, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + safe_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $all_includes" + + AC_TRY_COMPILE( + [ +#include +#if Q_EXPORT - 0 != 0 +/* if this compiles, then Q_EXPORT is undefined */ +/* if Q_EXPORT is nonempty, this will break compilation */ +#endif + ], [/* elvis is alive */], + kde_cv_val_qt_gcc_visibility_patched=no, kde_cv_val_qt_gcc_visibility_patched=yes) + + CXXFLAGS=$safe_CXXFLAGS + AC_LANG_RESTORE + ] + ) + + if test x$kde_have_gcc_visibility = "xyes" && test x$kde_stdc_visibility_patched = "xyes" && test x$kde_cv_val_qt_gcc_visibility_patched = "xyes"; then + CXXFLAGS="$CXXFLAGS -fvisibility=hidden" + KDE_CHECK_VISIBILITY_GCC_BUG + HAVE_GCC_VISIBILITY=1 + AC_DEFINE_UNQUOTED(__KDE_HAVE_GCC_VISIBILITY, "$HAVE_GCC_VISIBILITY", [define to 1 if -fvisibility is supported]) + fi + ]) + fi +]) + +AC_DEFUN([KDE_ADD_DEPENDENCIES], +[ + [A]M_DEPENDENCIES(CC) + [A]M_DEPENDENCIES(CXX) +]) + +dnl just a wrapper to clean up configure.in +AC_DEFUN([KDE_PROG_LIBTOOL], +[ +AC_REQUIRE([AC_CHECK_COMPILERS]) +AC_REQUIRE([AC_ENABLE_SHARED]) +AC_REQUIRE([AC_ENABLE_STATIC]) + +AC_REQUIRE([AC_LIBTOOL_DLOPEN]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_OBJEXT +AC_EXEEXT + +AM_PROG_LIBTOOL +AC_LIBTOOL_CXX + +LIBTOOL_SHELL="/bin/sh ./libtool" +# LIBTOOL="$LIBTOOL --silent" +KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_NO_UNDEFINED) \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)" +AC_SUBST(KDE_PLUGIN) + +# This hack ensures that libtool creates shared libs for kunittest plugins. By default check_LTLIBRARIES makes static libs. +KDE_CHECK_PLUGIN="\$(KDE_PLUGIN) -rpath \$(libdir)" +AC_SUBST(KDE_CHECK_PLUGIN) + +# we patch configure quite some so we better keep that consistent for incremental runs +AC_SUBST(AUTOCONF,'$(SHELL) $(top_srcdir)/admin/cvs.sh configure || touch configure') +]) + +AC_DEFUN([KDE_CHECK_LIB64], +[ + AC_ARG_ENABLE(libsuffix, + AC_HELP_STRING([--enable-libsuffix], + [/lib directory suffix (64,32,none,auto[=default])]), + kdelibsuff=$enableval, kdelibsuff="auto") + + if test "$kdelibsuff" = "auto"; then + +cat > conftest.c << EOF +#include +int main() { + return 0; +} +EOF + kdelibsuff=`$CC conftest.c -o conftest.out; ldd conftest.out |sed -ne '/libc.so/{ + s,.*/lib\([[^\/]]*\)/.*,\1, + p +}'` + rm -rf conftest.* + fi + + if test "$kdelibsuff" = "no" || test "$kdelibsuff" = "none"; then + kdelibsuff= + fi + if test -z "$kdelibsuff"; then + AC_MSG_RESULT([not using lib directory suffix]) + AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories) + else + if test "$libdir" = '${exec_prefix}/lib'; then + libdir="$libdir${kdelibsuff}" + AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms + fi + AC_DEFINE_UNQUOTED(KDELIBSUFF, ["${kdelibsuff}"], Suffix for lib directories) + AC_MSG_RESULT([using lib directory suffix $kdelibsuff]) + fi +]) + +AC_DEFUN([KDE_CHECK_TYPES], +[ AC_CHECK_SIZEOF(int, 4)dnl + AC_CHECK_SIZEOF(short)dnl + AC_CHECK_SIZEOF(long, 4)dnl + AC_CHECK_SIZEOF(char *, 4)dnl +])dnl + +dnl Not used - kept for compat only? +AC_DEFUN([KDE_DO_IT_ALL], +[ +AC_CANONICAL_SYSTEM +AC_ARG_PROGRAM +AM_INIT_AUTOMAKE($1, $2) +AM_DISABLE_LIBRARIES +AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) +AC_CHECK_COMPILERS +KDE_PROG_LIBTOOL +AM_KDE_WITH_NLS +AC_PATH_KDE +]) + +AC_DEFUN([AC_CHECK_RPATH], +[ +AC_MSG_CHECKING(for rpath) +AC_ARG_ENABLE(rpath, + AC_HELP_STRING([--disable-rpath],[do not use the rpath feature of ld]), + USE_RPATH=$enableval, USE_RPATH=yes) + +if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then + + KDE_RPATH="-R \$(libdir)" + + if test "$kde_libraries" != "$libdir"; then + KDE_RPATH="$KDE_RPATH -R \$(kde_libraries)" + fi + + if test -n "$qt_libraries"; then + KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)" + fi + dnl $x_libraries is set to /usr/lib in case + if test -n "$X_LDFLAGS"; then + X_RPATH="-R \$(x_libraries)" + KDE_RPATH="$KDE_RPATH $X_RPATH" + fi + if test -n "$KDE_EXTRA_RPATH"; then + KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)" + fi +fi +AC_SUBST(KDE_EXTRA_RPATH) +AC_SUBST(KDE_RPATH) +AC_SUBST(X_RPATH) +AC_MSG_RESULT($USE_RPATH) +]) + +dnl Check for the type of the third argument of getsockname +AC_DEFUN([AC_CHECK_SOCKLEN_T], +[ + AC_MSG_CHECKING(for socklen_t) + AC_CACHE_VAL(kde_cv_socklen_t, + [ + AC_LANG_PUSH(C++) + kde_cv_socklen_t=no + AC_TRY_COMPILE([ + #include + #include + ], + [ + socklen_t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t=yes + kde_cv_socklen_t_equiv=socklen_t + ]) + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t) + if test $kde_cv_socklen_t = no; then + AC_MSG_CHECKING([for socklen_t equivalent for socket functions]) + AC_CACHE_VAL(kde_cv_socklen_t_equiv, + [ + kde_cv_socklen_t_equiv=int + AC_LANG_PUSH(C++) + for t in int size_t unsigned long "unsigned long"; do + AC_TRY_COMPILE([ + #include + #include + ], + [ + $t len; + getpeername(0,0,&len); + ], + [ + kde_cv_socklen_t_equiv="$t" + break + ]) + done + AC_LANG_POP(C++) + ]) + AC_MSG_RESULT($kde_cv_socklen_t_equiv) + fi + AC_DEFINE_UNQUOTED(kde_socklen_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined]) + AC_DEFINE_UNQUOTED(ksize_t, $kde_cv_socklen_t_equiv, + [type to use in place of socklen_t if not defined (deprecated, use kde_socklen_t)]) +]) + +dnl This is a merge of some macros out of the gettext aclocal.m4 +dnl since we don't need anything, I took the things we need +dnl the copyright for them is: +dnl > +dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +dnl This Makefile.in is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. +dnl > +dnl for this file it is relicensed under LGPL + +AC_DEFUN([AM_KDE_WITH_NLS], + [ + dnl If we use NLS figure out what method + + AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt, + [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then + AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + MSGFMT=$GMSGFMT + AC_SUBST(GMSGFMT) + AC_SUBST(MSGFMT) + + AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext programs is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + AC_SUBST(XGETTEXT) + + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper , 1996. + +# serial 1 +# Stephan Kulow: I appended a _KDE against name conflicts + +dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + + +# Check whether LC_MESSAGES is available in . +# Ulrich Drepper , 1995. + +# serial 1 + +AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES]) + fi + fi]) + +dnl From Jim Meyering. +dnl FIXME: migrate into libit. + +AC_DEFUN([AM_FUNC_OBSTACK], +[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack, + [AC_TRY_LINK([#include "obstack.h"], + [struct obstack *mem;obstack_free(mem,(char *) 0)], + am_cv_func_obstack=yes, + am_cv_func_obstack=no)]) + if test $am_cv_func_obstack = yes; then + AC_DEFINE(HAVE_OBSTACK) + else + LIBOBJS="$LIBOBJS obstack.o" + fi +]) + +dnl From Jim Meyering. Use this if you use the GNU error.[ch]. +dnl FIXME: Migrate into libit + +AC_DEFUN([AM_FUNC_ERROR_AT_LINE], +[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line, + [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");], + am_cv_lib_error_at_line=yes, + am_cv_lib_error_at_line=no)]) + if test $am_cv_lib_error_at_line = no; then + LIBOBJS="$LIBOBJS error.o" + fi + AC_SUBST(LIBOBJS)dnl +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995. + +# serial 1 +# Stephan Kulow: I put a KDE in it to avoid name conflicts + +AC_DEFUN([AM_KDE_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([AM_KDE_WITH_NLS])dnl + AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \ +__argz_count __argz_stringify __argz_next]) + + AC_MSG_CHECKING(for stpcpy) + AC_CACHE_VAL(kde_cv_func_stpcpy, + [ + kde_safe_cxxflags=$CXXFLAGS + CXXFLAGS="-Werror" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + #include + ], + [ + char buffer[200]; + stpcpy(buffer, buffer); + ], + kde_cv_func_stpcpy=yes, + kde_cv_func_stpcpy=no) + AC_LANG_RESTORE + CXXFLAGS=$kde_safe_cxxflags + ]) + AC_MSG_RESULT($kde_cv_func_stpcpy) + if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then + AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy]) + fi + + AM_LC_MESSAGES + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + ]) + +AC_DEFUN([AC_HAVE_XPM], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$XPM_LDFLAGS" && XPM_LDFLAGS= + test -z "$XPM_INCLUDE" && XPM_INCLUDE= + + AC_ARG_WITH(xpm,AC_HELP_STRING([--without-xpm],[disable color pixmap XPM tests]), + xpm_test=$withval, xpm_test="yes") + if test "x$xpm_test" = xno; then + ac_cv_have_xpm=no + else + AC_MSG_CHECKING(for XPM) + AC_CACHE_VAL(ac_cv_have_xpm, + [ + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET" + else + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET" + fi + CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES" + test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS" + AC_TRY_LINK([#include ],[], + ac_cv_have_xpm="yes",ac_cv_have_xpm="no") + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + ])dnl + + if test "$ac_cv_have_xpm" = no; then + AC_MSG_RESULT(no) + XPM_LDFLAGS="" + XPMINC="" + $2 + else + AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support]) + if test "$XPM_LDFLAGS" = ""; then + XPMLIB='-lXpm $(LIB_X11)' + else + XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)' + fi + if test "$XPM_INCLUDE" = ""; then + XPMINC="" + else + XPMINC="-I$XPM_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + AC_SUBST(XPMINC) + AC_SUBST(XPMLIB) +]) + +AC_DEFUN([AC_HAVE_DPMS], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS= + test -z "$DPMS_INCLUDE" && DPMS_INCLUDE= + DPMS_LIB= + + AC_ARG_WITH(dpms,AC_HELP_STRING([--without-dpms],[disable DPMS power saving]), + dpms_test=$withval, dpms_test="yes") + if test "x$dpms_test" = xno; then + ac_cv_have_dpms=no + else + AC_MSG_CHECKING(for DPMS) + dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms. + dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms". + AC_CACHE_VAL(ac_cv_have_dpms, + [ + if test "x$kde_use_qt_emb" = "xyes" || test "x$kde_use_qt_mac" = "xyes" || test "x$kde_use_qt_win" = "xyes"; then + AC_MSG_RESULT(no) + ac_cv_have_dpms="no" + else + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + ac_save_libs="$LIBS" + LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries" + LIBS="-lX11 -lXext $LIBSOCKET" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + ac_cv_have_dpms="yes", [ + LIBS="-lXdpms $LIBS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + [ + ac_cv_have_dpms="-lXdpms" + ],ac_cv_have_dpms="no") + ]) + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + LIBS="$ac_save_libs" + fi + ])dnl + + if test "$ac_cv_have_dpms" = no; then + AC_MSG_RESULT(no) + DPMS_LDFLAGS="" + DPMSINC="" + $2 + else + AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support]) + if test "$ac_cv_have_dpms" = "-lXdpms"; then + DPMS_LIB="-lXdpms" + fi + if test "$DPMS_LDFLAGS" = ""; then + DPMSLIB="$DPMS_LIB "'$(LIB_X11)' + else + DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)' + fi + if test "$DPMS_INCLUDE" = ""; then + DPMSINC="" + else + DPMSINC="-I$DPMS_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + ac_save_cflags="$CFLAGS" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AH_TEMPLATE(HAVE_DPMSCAPABLE_PROTO, + [Define if you have the DPMSCapable prototype in ]) + AC_CHECK_DECL(DPMSCapable, + AC_DEFINE(HAVE_DPMSCAPABLE_PROTO),, + [#include + #include ]) + AH_TEMPLATE(HAVE_DPMSINFO_PROTO, + [Define if you have the DPMSInfo prototype in ]) + AC_CHECK_DECL(DPMSInfo, + AC_DEFINE(HAVE_DPMSINFO_PROTO),, + [#include + #include ]) + CFLAGS="$ac_save_cflags" + AC_SUBST(DPMSINC) + AC_SUBST(DPMSLIB) +]) + +AC_DEFUN([AC_HAVE_GL], + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$GL_LDFLAGS" && GL_LDFLAGS= + test -z "$GL_INCLUDE" && GL_INCLUDE= + + AC_ARG_WITH(gl,AC_HELP_STRING([--without-gl],[disable 3D GL modes]), + gl_test=$withval, gl_test="yes") + if test "x$kde_use_qt_emb" = "xyes"; then + # GL and Qt Embedded is a no-go for now. + ac_cv_have_gl=no + elif test "x$gl_test" = xno; then + ac_cv_have_gl=no + else + AC_MSG_CHECKING(for GL) + AC_CACHE_VAL(ac_cv_have_gl, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_ldflags=$LDFLAGS + ac_save_cxxflags=$CXXFLAGS + ac_save_libs=$LIBS + LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries" + LIBS="$LIBS -lGL -lGLU" + test "x$kde_use_qt_mac" != xyes && test "x$kde_use_qt_emb" != xyes && test "x$kde_use_qt_win" != "xyes" && LIBS="$LIBS -lX11" + LIBS="$LIBS $LIB_XEXT -lm $LIBSOCKET" + CXXFLAGS="$CFLAGS $X_INCLUDES" + test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" + AC_TRY_LINK([#include +#include +], [], + ac_cv_have_gl="yes", ac_cv_have_gl="no") + AC_LANG_RESTORE + LDFLAGS=$ac_save_ldflags + CXXFLAGS=$ac_save_cxxflags + LIBS=$ac_save_libs + ])dnl + + if test "$ac_cv_have_gl" = "no"; then + AC_MSG_RESULT(no) + GL_LDFLAGS="" + GLINC="" + $2 + else + AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)]) + if test "$GL_LDFLAGS" = ""; then + GLLIB='-lGLU -lGL $(LIB_X11)' + else + GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)' + fi + if test "$GL_INCLUDE" = ""; then + GLINC="" + else + GLINC="-I$GL_INCLUDE" + fi + AC_MSG_RESULT($ac_cv_have_gl) + $1 + fi + fi + AC_SUBST(GLINC) + AC_SUBST(GLLIB) +]) + + + dnl shadow password and PAM magic - maintained by ossi@kde.org + +AC_DEFUN([KDE_PAM], [ + AC_REQUIRE([KDE_CHECK_LIBDL]) + + want_pam= + AC_ARG_WITH(pam, + AC_HELP_STRING([--with-pam[=ARG]],[enable support for PAM: ARG=[yes|no|service name]]), + [ if test "x$withval" = "xyes"; then + want_pam=yes + pam_service=kde + elif test "x$withval" = "xno"; then + want_pam=no + else + want_pam=yes + pam_service=$withval + fi + ], [ pam_service=kde ]) + + use_pam= + PAMLIBS= + if test "x$want_pam" != xno; then + AC_CHECK_LIB(pam, pam_start, [ + AC_CHECK_HEADER(security/pam_appl.h, + [ pam_header=security/pam_appl.h ], + [ AC_CHECK_HEADER(pam/pam_appl.h, + [ pam_header=pam/pam_appl.h ], + [ + AC_MSG_WARN([PAM detected, but no headers found! +Make sure you have the necessary development packages installed.]) + ] + ) + ] + ) + ], , $LIBDL) + if test -z "$pam_header"; then + if test "x$want_pam" = xyes; then + AC_MSG_ERROR([--with-pam was specified, but cannot compile with PAM!]) + fi + else + AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)]) + PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL" + use_pam=yes + + dnl darwin claims to be something special + if test "$pam_header" = "pam/pam_appl.h"; then + AC_DEFINE(HAVE_PAM_PAM_APPL_H, 1, [Define if your PAM headers are in pam/ instead of security/]) + fi + + dnl test whether struct pam_message is const (Linux) or not (Sun) + AC_MSG_CHECKING(for const pam_message) + AC_EGREP_HEADER([struct pam_message], $pam_header, + [ AC_EGREP_HEADER([const struct pam_message], $pam_header, + [AC_MSG_RESULT([const: Linux-type PAM])], + [AC_MSG_RESULT([nonconst: Sun-type PAM]) + AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])] + )], + [AC_MSG_RESULT([not found - assume const, Linux-type PAM])]) + fi + fi + + AC_SUBST(PAMLIBS) +]) + +dnl DEF_PAM_SERVICE(arg name, full name, define name) +AC_DEFUN([DEF_PAM_SERVICE], [ + AC_ARG_WITH($1-pam, + AC_HELP_STRING([--with-$1-pam=[val]],[override PAM service from --with-pam for $2]), + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE=$withval + else + AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected. +You may want to enforce it by using --with-pam.]) + fi + ], + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE="$pam_service" + fi + ]) + if test -n "$$3_PAM_SERVICE"; then + AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE]) + AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2]) + fi + AC_SUBST($3_PAM_SERVICE) +]) + +AC_DEFUN([KDE_SHADOWPASSWD], [ + AC_REQUIRE([KDE_PAM]) + + AC_CHECK_LIB(shadow, getspent, + [ LIBSHADOW="-lshadow" + ac_use_shadow=yes + ], + [ dnl for UnixWare + AC_CHECK_LIB(gen, getspent, + [ LIBGEN="-lgen" + ac_use_shadow=yes + ], + [ AC_CHECK_FUNC(getspent, + [ ac_use_shadow=yes ], + [ ac_use_shadow=no ]) + ]) + ]) + AC_SUBST(LIBSHADOW) + AC_SUBST(LIBGEN) + + AC_MSG_CHECKING([for shadow passwords]) + + AC_ARG_WITH(shadow, + AC_HELP_STRING([--with-shadow],[If you want shadow password support]), + [ if test "x$withval" != "xno"; then + use_shadow=yes + else + use_shadow=no + fi + ], [ + use_shadow="$ac_use_shadow" + ]) + + if test "x$use_shadow" = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords]) + else + AC_MSG_RESULT(no) + LIBSHADOW= + LIBGEN= + fi + + dnl finally make the relevant binaries setuid root, if we have shadow passwds. + dnl this still applies, if we could use it indirectly through pam. + if test "x$use_shadow" = xyes || + ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then + case $host in + *-*-freebsd* | *-*-netbsd* | *-*-openbsd*) + SETUIDFLAGS="-m 4755 -o root";; + *) + SETUIDFLAGS="-m 4755";; + esac + fi + AC_SUBST(SETUIDFLAGS) + +]) + +AC_DEFUN([KDE_PASSWDLIBS], [ + AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT + AC_REQUIRE([KDE_PAM]) + AC_REQUIRE([KDE_SHADOWPASSWD]) + + if test "x$use_pam" = "xyes"; then + PASSWDLIBS="$PAMLIBS" + else + PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN" + fi + + dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but + dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires + dnl root to read, so kcheckpass needs to be root (even when using pam, since pam + dnl may need to read /etc/master.passwd). + case $host in + *-*-freebsd*) + SETUIDFLAGS="-m 4755 -o root" + ;; + *) + ;; + esac + + AC_SUBST(PASSWDLIBS) +]) + +AC_DEFUN([KDE_CHECK_LIBDL], +[ +AC_CHECK_LIB(dl, dlopen, [ +LIBDL="-ldl" +ac_cv_have_dlfcn=yes +]) + +AC_CHECK_LIB(dld, shl_unload, [ +LIBDL="-ldld" +ac_cv_have_shload=yes +]) + +AC_SUBST(LIBDL) +]) + +AC_DEFUN([KDE_CHECK_DLOPEN], +[ +KDE_CHECK_LIBDL +AC_CHECK_HEADERS(dlfcn.h dl.h) +if test "$ac_cv_header_dlfcn_h" = "no"; then + ac_cv_have_dlfcn=no +fi + +if test "$ac_cv_header_dl_h" = "no"; then + ac_cv_have_shload=no +fi + +dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE +dnl (MM) +AC_ARG_ENABLE(dlopen, +AC_HELP_STRING([--disable-dlopen],[link statically [default=no]]), +enable_dlopen=$enableval, +enable_dlopen=yes) + +# override the user's opinion, if we know it better ;) +if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then + enable_dlopen=no +fi + +if test "$ac_cv_have_dlfcn" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn]) +fi + +if test "$ac_cv_have_shload" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload]) +fi + +if test "$enable_dlopen" = no ; then + test -n "$1" && eval $1 +else + test -n "$2" && eval $2 +fi + +]) + +AC_DEFUN([KDE_CHECK_DYNAMIC_LOADING], +[ +KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no) +KDE_PROG_LIBTOOL +AC_MSG_CHECKING([dynamic loading]) +eval "`egrep '^build_libtool_libs=' libtool`" +if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then + dynamic_loading=yes + AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING) +else + dynamic_loading=no +fi +AC_MSG_RESULT($dynamic_loading) +if test "$dynamic_loading" = "yes"; then + $1 +else + $2 +fi +]) + +AC_DEFUN([KDE_ADD_INCLUDES], +[ +if test -z "$1"; then + test_include="Pix.h" +else + test_include="$1" +fi + +AC_MSG_CHECKING([for libg++ ($test_include)]) + +AC_CACHE_VAL(kde_cv_libgpp_includes, +[ +kde_cv_libgpp_includes=no + + for ac_dir in \ + \ + /usr/include/g++ \ + /usr/include \ + /usr/unsupported/include \ + /opt/include \ + $extra_include \ + ; \ + do + if test -r "$ac_dir/$test_include"; then + kde_cv_libgpp_includes=$ac_dir + break + fi + done +]) + +AC_MSG_RESULT($kde_cv_libgpp_includes) +if test "$kde_cv_libgpp_includes" != "no"; then + all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES" +fi +]) +]) + +AC_DEFUN([KDE_CHECK_LIBPTHREAD], +[ + dnl This code is here specifically to handle the + dnl various flavors of threading library on FreeBSD + dnl 4-, 5-, and 6-, and the (weird) rules around it. + dnl There may be an environment PTHREAD_LIBS that + dnl specifies what to use; otherwise, search for it. + dnl -pthread is special cased and unsets LIBPTHREAD + dnl below if found. + LIBPTHREAD="" + + if test -n "$PTHREAD_LIBS"; then + if test "x$PTHREAD_LIBS" = "x-pthread" ; then + LIBPTHREAD="PTHREAD" + else + PTHREAD_LIBS_save="$PTHREAD_LIBS" + PTHREAD_LIBS=`echo "$PTHREAD_LIBS_save" | sed -e 's,^-l,,g'` + AC_MSG_CHECKING([for pthread_create in $PTHREAD_LIBS]) + KDE_CHECK_LIB($PTHREAD_LIBS, pthread_create, [ + LIBPTHREAD="$PTHREAD_LIBS_save"]) + PTHREAD_LIBS="$PTHREAD_LIBS_save" + fi + fi + + dnl Is this test really needed, in the face of the Tru64 test below? + if test -z "$LIBPTHREAD"; then + AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"]) + fi + + dnl This is a special Tru64 check, see BR 76171 issue #18. + if test -z "$LIBPTHREAD" ; then + AC_MSG_CHECKING([for pthread_create in -lpthread]) + kde_safe_libs=$LIBS + LIBS="$LIBS -lpthread" + AC_TRY_LINK([#include ],[(void)pthread_create(0,0,0,0);],[ + AC_MSG_RESULT(yes) + LIBPTHREAD="-lpthread"],[ + AC_MSG_RESULT(no)]) + LIBS=$kde_safe_libs + fi + + dnl Un-special-case for FreeBSD. + if test "x$LIBPTHREAD" = "xPTHREAD" ; then + LIBPTHREAD="" + fi + + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_PTHREAD_OPTION], +[ + USE_THREADS="" + if test -z "$LIBPTHREAD"; then + KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-D_THREAD_SAFE -pthread"]) + fi + + AH_VERBATIM(__svr_define, [ +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif +]) + case $host_os in + solaris*) + KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"]) + CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4" + ;; + freebsd*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE $PTHREAD_CFLAGS" + ;; + aix*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" + LIBPTHREAD="$LIBPTHREAD -lc_r" + ;; + linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" + if test "$CXX" = "KCC"; then + CXXFLAGS="$CXXFLAGS --thread_safe" + NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe" + fi + ;; + *) + ;; + esac + AC_SUBST(USE_THREADS) + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN([KDE_CHECK_THREADING], +[ + AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) + AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION]) + dnl default is yes if libpthread is found and no if no libpthread is available + if test -z "$LIBPTHREAD"; then + if test -z "$USE_THREADS"; then + kde_check_threading_default=no + else + kde_check_threading_default=yes + fi + else + kde_check_threading_default=yes + fi + AC_ARG_ENABLE(threading,AC_HELP_STRING([--disable-threading],[disables threading even if libpthread found]), + kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default) + if test "x$kde_use_threading" = "xyes"; then + AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)]) + fi +]) + +AC_DEFUN([KDE_TRY_LINK_PYTHON], +[ +if test "$kde_python_link_found" = no; then + +if test "$1" = normal; then + AC_MSG_CHECKING(if a Python application links) +else + AC_MSG_CHECKING(if Python depends on $2) +fi + +AC_CACHE_VAL(kde_cv_try_link_python_$1, +[ +kde_save_cflags="$CFLAGS" +CFLAGS="$CFLAGS $PYTHONINC" +kde_save_libs="$LIBS" +LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET" +kde_save_ldflags="$LDFLAGS" +LDFLAGS="$LDFLAGS $PYTHONLIB" + +AC_TRY_LINK( +[ +#include +],[ + PySys_SetArgv(1, 0); +], + [kde_cv_try_link_python_$1=yes], + [kde_cv_try_link_python_$1=no] +) +CFLAGS="$kde_save_cflags" +LIBS="$kde_save_libs" +LDFLAGS="$kde_save_ldflags" +]) + +if test "$kde_cv_try_link_python_$1" = "yes"; then + AC_MSG_RESULT(yes) + kde_python_link_found=yes + if test ! "$1" = normal; then + LIBPYTHON="$LIBPYTHON $2" + fi + $3 +else + AC_MSG_RESULT(no) + $4 +fi + +fi + +]) + +AC_DEFUN([KDE_CHECK_PYTHON_DIR], +[ +AC_MSG_CHECKING([for Python directory]) + +AC_CACHE_VAL(kde_cv_pythondir, +[ + if test -z "$PYTHONDIR"; then + kde_cv_pythondir=/usr/local + else + kde_cv_pythondir="$PYTHONDIR" + fi +]) + +AC_ARG_WITH(pythondir, +AC_HELP_STRING([--with-pythondir=pythondir],[use python installed in pythondir]), +[ + ac_python_dir=$withval +], ac_python_dir=$kde_cv_pythondir +) + +AC_MSG_RESULT($ac_python_dir) +]) + +AC_DEFUN([KDE_CHECK_PYTHON_INTERN], +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) +AC_REQUIRE([KDE_CHECK_PYTHON_DIR]) + +if test -z "$1"; then + version="1.5" +else + version="$1" +fi + +AC_MSG_CHECKING([for Python$version]) + +python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes" +AC_FIND_FILE(Python.h, $python_incdirs, python_incdir) +if test ! -r $python_incdir/Python.h; then + AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir) + python_incdir=$python_incdir/python$version + if test ! -r $python_incdir/Python.h; then + python_incdir=no + fi +fi + +PYTHONINC=-I$python_incdir + +python_libdirs="$ac_python_dir/lib$kdelibsuff /usr/lib$kdelibsuff /usr/local /usr/lib$kdelibsuff $kde_extra_libs" +AC_FIND_FILE(libpython$version.so, $python_libdirs, python_libdir) +if test ! -r $python_libdir/libpython$version.so; then + AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir) + if test ! -r $python_libdir/libpython$version.a; then + AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir) + python_libdir=$python_libdir/python$version/config + if test ! -r $python_libdir/libpython$version.a; then + python_libdir=no + fi + fi +fi + +PYTHONLIB=-L$python_libdir +kde_orig_LIBPYTHON=$LIBPYTHON +if test -z "$LIBPYTHON"; then + LIBPYTHON=-lpython$version +fi + +AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir) +python_moddir=$python_moddir/python$version +if test ! -r $python_moddir/copy.py; then + python_moddir=no +fi + +PYTHONMODDIR=$python_moddir + +AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir) + +if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then + LIBPYTHON=$kde_orig_LIBPYTHON + test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB="" + test "x$PYTHONINC" = "x-Ino" && PYTHONINC="" + $2 +else + dnl Note: this test is very weak + kde_python_link_found=no + KDE_TRY_LINK_PYTHON(normal) + KDE_TRY_LINK_PYTHON(m, -lm) + KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD) + KDE_TRY_LINK_PYTHON(tcl, -ltcl) + KDE_TRY_LINK_PYTHON(db2, -ldb2) + KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm]) + KDE_TRY_LINK_PYTHON(pthread_and_panel_curses, [$LIBPTHREAD $LIBDL -lm -lpanel -lcurses]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [], + [AC_MSG_WARN([it seems, Python depends on another library. + Please set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this + and contact the authors to let them know about this problem]) + ]) + + LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET" + AC_SUBST(PYTHONINC) + AC_SUBST(PYTHONLIB) + AC_SUBST(LIBPYTHON) + AC_SUBST(PYTHONMODDIR) + AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python]) +fi + +]) + + +AC_DEFUN([KDE_CHECK_PYTHON], +[ + KDE_CHECK_PYTHON_INTERN("2.5", + [KDE_CHECK_PYTHON_INTERN("2.4", + [KDE_CHECK_PYTHON_INTERN("2.3", + [KDE_CHECK_PYTHON_INTERN("2.2", + [KDE_CHECK_PYTHON_INTERN("2.1", + [KDE_CHECK_PYTHON_INTERN("2.0", + [KDE_CHECK_PYTHON_INTERN($1, $2) ]) + ]) + ]) + ]) + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_STL], +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`" + + AC_MSG_CHECKING([if C++ programs can be compiled]) + AC_CACHE_VAL(kde_cv_stl_works, + [ + AC_TRY_COMPILE([ +#include +using namespace std; +],[ + string astring="Hallo Welt."; + astring.erase(0, 6); // now astring is "Welt" + return 0; +], kde_cv_stl_works=yes, + kde_cv_stl_works=no) +]) + + AC_MSG_RESULT($kde_cv_stl_works) + + if test "$kde_cv_stl_works" = "yes"; then + # back compatible + AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI]) + else + AC_MSG_ERROR([Your Installation isn't able to compile simple C++ programs. +Check config.log for details - if you're using a Linux distribution you might miss +a package named similar to libstdc++-dev.]) + fi + + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE +]) + +AC_DEFUN([AC_FIND_QIMGIO], + [AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for qimgio]) +AC_CACHE_VAL(ac_cv_lib_qimgio, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +ac_save_CXXFLAGS="$CXXFLAGS" +LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT" +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +AC_TRY_RUN(dnl +[ +#include +#include +int main() { + QString t = "hallo"; + t.fill('t'); + qInitImageIO(); +} +], + ac_cv_lib_qimgio=yes, + ac_cv_lib_qimgio=no, + ac_cv_lib_qimgio=no) +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then + LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available]) + AC_SUBST(LIBQIMGIO) +else + AC_MSG_RESULT(not found) +fi +]) + +AC_DEFUN([AM_DISABLE_LIBRARIES], +[ + AC_PROVIDE([AM_ENABLE_STATIC]) + AC_PROVIDE([AM_ENABLE_SHARED]) + enable_static=no + enable_shared=yes +]) + + +AC_DEFUN([AC_CHECK_UTMP_FILE], +[ + AC_MSG_CHECKING([for utmp file]) + + AC_CACHE_VAL(kde_cv_utmp_file, + [ + kde_cv_utmp_file=no + + for ac_file in \ + \ + /var/run/utmp \ + /var/adm/utmp \ + /etc/utmp \ + ; \ + do + if test -r "$ac_file"; then + kde_cv_utmp_file=$ac_file + break + fi + done + ]) + + if test "$kde_cv_utmp_file" != "no"; then + AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries]) + $1 + AC_MSG_RESULT($kde_cv_utmp_file) + else + $2 + AC_MSG_RESULT([non found]) + fi +]) + + +AC_DEFUN([KDE_CREATE_SUBDIRSLIST], +[ + +DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin" +TOPSUBDIRS="" + +if test ! -s $srcdir/subdirs; then + dnl Note: Makefile.common creates subdirs, so this is just a fallback + files=`cd $srcdir && ls -1` + dirs=`for i in $files; do if test -d $i; then echo $i; fi; done` + for i in $dirs; do + echo $i >> $srcdir/subdirs + done +fi + +ac_topsubdirs= +if test -s $srcdir/inst-apps; then + ac_topsubdirs="`cat $srcdir/inst-apps`" +elif test -s $srcdir/subdirs; then + ac_topsubdirs="`cat $srcdir/subdirs`" +fi + +for i in $ac_topsubdirs; do + AC_MSG_CHECKING([if $i should be compiled]) + if test -d $srcdir/$i; then + install_it="yes" + for j in $DO_NOT_COMPILE; do + if test $i = $j; then + install_it="no" + fi + done + else + install_it="no" + fi + AC_MSG_RESULT($install_it) + vari=`echo $i | sed -e 's,[[-+.@\/]],_,g'` + if test $install_it = "yes"; then + TOPSUBDIRS="$TOPSUBDIRS $i" + eval "$vari""_SUBDIR_included=yes" + else + eval "$vari""_SUBDIR_included=no" + fi +done + +AC_SUBST(TOPSUBDIRS) +]) + +AC_DEFUN([KDE_CHECK_NAMESPACES], +[ +AC_MSG_CHECKING(whether C++ compiler supports namespaces) +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE([ +], +[ +namespace Foo { + extern int i; + namespace Bar { + extern int i; + } +} + +int Foo::i = 0; +int Foo::Bar::i = 1; +],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_NAMESPACES) +], [ +AC_MSG_RESULT(no) +]) +AC_LANG_RESTORE +]) + +dnl ------------------------------------------------------------------------ +dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_S_ISSOCK], +[ +AC_MSG_CHECKING(for S_ISSOCK) +AC_CACHE_VAL(ac_cv_have_s_issock, +[ +AC_TRY_LINK( +[ +#include +], +[ +struct stat buff; +int b = S_ISSOCK( buff.st_mode ); +], +ac_cv_have_s_issock=yes, +ac_cv_have_s_issock=no) +]) +AC_MSG_RESULT($ac_cv_have_s_issock) +if test "$ac_cv_have_s_issock" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.]) +fi + +AH_VERBATIM(_ISSOCK, +[ +#ifndef HAVE_S_ISSOCK +#define HAVE_S_ISSOCK +#define S_ISSOCK(mode) (1==0) +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([AC_CHECK_KDEMAXPATHLEN], +[ +AC_MSG_CHECKING(for MAXPATHLEN) +AC_CACHE_VAL(ac_cv_maxpathlen, +[ +cat > conftest.$ac_ext < +#endif +#include +#include +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +KDE_HELLO MAXPATHLEN + +EOF + +ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out" + +if AC_TRY_EVAL(ac_try) && test -s conftest.out; then + ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out` +else + ac_cv_maxpathlen=1024 +fi + +rm conftest.* + +]) +AC_MSG_RESULT($ac_cv_maxpathlen) +AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] ) +]) + +AC_DEFUN([KDE_CHECK_HEADER], +[ + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_CHECK_HEADER([$1], [$2], [$3], [$4]) + AC_LANG_RESTORE + CPPFLAGS=$kde_safe_cppflags +]) + +AC_DEFUN([KDE_CHECK_HEADERS], +[ + AH_CHECK_HEADERS([$1]) + AC_LANG_SAVE + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_CPLUSPLUS + AC_CHECK_HEADERS([$1], [$2], [$3], [$4]) + CPPFLAGS=$kde_safe_cppflags + AC_LANG_RESTORE +]) + +AC_DEFUN([KDE_FAST_CONFIGURE], +[ + dnl makes configure fast (needs perl) + AC_ARG_ENABLE(fast-perl, AC_HELP_STRING([--disable-fast-perl],[disable fast Makefile generation (needs perl)]), + with_fast_perl=$enableval, with_fast_perl=yes) +]) + +AC_DEFUN([KDE_CONF_FILES], +[ + val= + if test -f $srcdir/configure.files ; then + val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files` + fi + CONF_FILES= + if test -n "$val" ; then + for i in $val ; do + CONF_FILES="$CONF_FILES $i" + done + fi + AC_SUBST(CONF_FILES) +])dnl + +dnl This sets the prefix, for arts and kdelibs +dnl Do NOT use in any other module. +dnl It only looks at --prefix, KDEDIR and falls back to /usr/local/kde +AC_DEFUN([KDE_SET_PREFIX_CORE], +[ + unset CDPATH + dnl make $KDEDIR the default for the installation + AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) + + if test "x$prefix" = "xNONE"; then + prefix=$ac_default_prefix + ac_configure_args="$ac_configure_args --prefix=$prefix" + fi + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + kde_libs_prefix='$(prefix)' + kde_libs_htmldir='$(kde_htmldir)' + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + + +AC_DEFUN([SIM_SET_PREFIX], +[ + AC_MSG_CHECKING([where to install]) + if test "x$prefix" = "xNONE"; then + prefix=/usr/local + AC_MSG_RESULT([$prefix (default value)]) + else + dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different + given_prefix=$prefix + AC_MSG_RESULT([$prefix (as requested)]) + fi + KDE_SET_DEFAULT_PATHS(default) +]) + +AC_DEFUN([KDE_SET_PREFIX], +[ + unset CDPATH + dnl We can't give real code to that macro, only a value. + dnl It only matters for --help, since we set the prefix in this function anyway. + AC_PREFIX_DEFAULT(${KDEDIR:-the kde prefix}) + + KDE_SET_DEFAULT_BINDIRS + if test "x$prefix" = "xNONE"; then + dnl no prefix given: look for kde-config in the PATH and deduce the prefix from it + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + else + dnl prefix given: look for kde-config, preferrably in prefix, otherwise in PATH + kde_save_PATH="$PATH" + PATH="$exec_prefix/bin:$prefix/bin:$PATH" + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend) + PATH="$kde_save_PATH" + fi + + kde_libs_prefix=`$KDECONFIG --prefix` + if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then + AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs. + This means it has been moved since you installed it. + This won't work. Please recompile kdelibs for the new prefix. + ]) + fi + kde_libs_htmldir=`$KDECONFIG --install html --expandvars` + + AC_MSG_CHECKING([where to install]) + if test "x$prefix" = "xNONE"; then + prefix=$kde_libs_prefix + AC_MSG_RESULT([$prefix (as returned by kde-config)]) + else + dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different + given_prefix=$prefix + AC_MSG_RESULT([$prefix (as requested)]) + fi + + # And delete superfluous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + given_prefix=`echo "$given_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + + AC_SUBST(KDECONFIG) + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) + + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + +pushdef([AC_PROG_INSTALL], +[ + dnl our own version, testing for a -p flag + popdef([AC_PROG_INSTALL]) + dnl as AC_PROG_INSTALL works as it works we first have + dnl to save if the user didn't specify INSTALL, as the + dnl autoconf one overwrites INSTALL and we have no chance to find + dnl out afterwards + test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL + test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM + test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT + AC_PROG_INSTALL + + if test -z "$kde_save_INSTALL_given" ; then + # OK, user hasn't given any INSTALL, autoconf found one for us + # now we test, if it supports the -p flag + AC_MSG_CHECKING(for -p flag to install) + rm -f confinst.$$.* > /dev/null 2>&1 + echo "Testtest" > confinst.$$.orig + ac_res=no + if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then + if test -f confinst.$$.new ; then + # OK, -p seems to do no harm to install + INSTALL="${INSTALL} -p" + ac_res=yes + fi + fi + rm -f confinst.$$.* + AC_MSG_RESULT($ac_res) + fi + dnl the following tries to resolve some signs and wonders coming up + dnl with different autoconf/automake versions + dnl e.g.: + dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s + dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS) + dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s + dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has + dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the + dnl install-@DIR@PROGRAMS targets to explicitly use that flag + dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as + dnl INSTALL_SCRIPT, which breaks with automake <= 1.4 + dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure + dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from + dnl automake (due to broken Makefile.am or whatever) to install programs, + dnl and so does not see the -s flag in automake > 1.4 + dnl to clean up that mess we: + dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG + dnl which cleans KDE's program with automake > 1.4; + dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems + dnl with automake<=1.4 + dnl note that dues to this sometimes two '-s' flags are used (if KDE + dnl properly uses install-@DIR@PROGRAMS, but I don't care + dnl + dnl And to all this comes, that I even can't write in comments variable + dnl names used by automake, because it is so stupid to think I wanted to + dnl _use_ them, therefor I have written A_M_... instead of AM_ + dnl hmm, I wanted to say something ... ahh yes: Arghhh. + + if test -z "$kde_save_INSTALL_PROGRAM_given" ; then + INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' + fi + if test -z "$kde_save_INSTALL_SCRIPT_given" ; then + INSTALL_SCRIPT='${INSTALL}' + fi +])dnl + +AC_DEFUN([KDE_LANG_CPLUSPLUS], +[AC_LANG_CPLUSPLUS +ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' +pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS]) +]) + +pushdef([AC_LANG_CPLUSPLUS], +[popdef([AC_LANG_CPLUSPLUS]) +KDE_LANG_CPLUSPLUS +]) + +AC_DEFUN([KDE_CHECK_LONG_LONG], +[ +AC_MSG_CHECKING(for long long) +AC_CACHE_VAL(kde_cv_c_long_long, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_LINK([], [ + long long foo = 0; + foo = foo+1; + ], + kde_cv_c_long_long=yes, kde_cv_c_long_long=no) + AC_LANG_RESTORE +]) +AC_MSG_RESULT($kde_cv_c_long_long) +if test "$kde_cv_c_long_long" = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype]) +fi +]) + +AC_DEFUN([KDE_CHECK_LIB], +[ + kde_save_LDFLAGS="$LDFLAGS" + dnl AC_CHECK_LIB modifies LIBS, so save it here + kde_save_LIBS="$LIBS" + LDFLAGS="$LDFLAGS $all_libraries" + case $host_os in + aix*) LDFLAGS="-brtl $LDFLAGS" + test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS" + ;; + esac + AC_CHECK_LIB($1, $2, $3, $4, $5) + LDFLAGS="$kde_save_LDFLAGS" + LIBS="$kde_save_LIBS" +]) + +AC_DEFUN([KDE_JAVA_PREFIX], +[ + dir=`dirname "$1"` + base=`basename "$1"` + list=`ls -1 $dir 2> /dev/null` + for entry in $list; do + if test -d $dir/$entry/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/bin" + ;; + esac + elif test -d $dir/$entry/jre/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/jre/bin" + ;; + esac + fi + done +]) + +dnl KDE_CHEC_JAVA_DIR(onlyjre) +AC_DEFUN([KDE_CHECK_JAVA_DIR], +[ + +AC_ARG_WITH(java, +AC_HELP_STRING([--with-java=javadir],[use java installed in javadir, --without-java disables]), +[ ac_java_dir=$withval +], ac_java_dir="" +) + +AC_MSG_CHECKING([for Java]) + +dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH +if test "x$ac_java_dir" = "xno"; then + kde_java_bindir=no + kde_java_includedir=no + kde_java_libjvmdir=no + kde_java_libgcjdir=no + kde_java_libhpidir=no +else + if test "x$ac_java_dir" = "x"; then + + + dnl No option set -> collect list of candidate paths + if test -n "$JAVA_HOME"; then + KDE_JAVA_PREFIX($JAVA_HOME) + fi + KDE_JAVA_PREFIX(/usr/j2se) + KDE_JAVA_PREFIX(/usr/lib/j2se) + KDE_JAVA_PREFIX(/usr/j*dk*) + KDE_JAVA_PREFIX(/usr/lib/j*dk*) + KDE_JAVA_PREFIX(/opt/j*sdk*) + KDE_JAVA_PREFIX(/usr/lib/java*) + KDE_JAVA_PREFIX(/usr/java*) + KDE_JAVA_PREFIX(/usr/java/j*dk*) + KDE_JAVA_PREFIX(/usr/java/j*re*) + KDE_JAVA_PREFIX(/usr/lib/SunJava2*) + KDE_JAVA_PREFIX(/usr/lib/SunJava*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava2*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava*) + KDE_JAVA_PREFIX(/opt/java*) + + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + for dir in $PATH; do + if test -d "$dir"; then + javadirs="$javadirs $dir" + fi + done + IFS=$kde_save_IFS + jredirs= + + dnl Now javadirs contains a list of paths that exist, all ending with bin/ + for dir in $javadirs; do + dnl Check for the java executable + if test -x "$dir/java"; then + dnl And also check for a libjvm.so somewhere under there + dnl Since we have to go to the parent dir, /usr/bin is excluded, /usr is too big. + if test "$dir" != "/usr/bin"; then + libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + if test ! -f $libjvmdir/libjvm.so; then continue; fi + jredirs="$jredirs $dir" + fi + fi + done + + dnl Now jredirs contains a reduced list, of paths where both java and ../**/libjvm.so was found + JAVAC= + JAVA= + kde_java_bindir=no + for dir in $jredirs; do + JAVA="$dir/java" + kde_java_bindir=$dir + if test -x "$dir/javac"; then + JAVAC="$dir/javac" + break + fi + done + + if test -n "$JAVAC"; then + dnl this substitution might not work - well, we test for jni.h below + kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'` + else + kde_java_includedir=no + fi + else + dnl config option set + kde_java_bindir=$ac_java_dir/bin + if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then + kde_java_includedir=no + else + kde_java_includedir=$ac_java_dir/include + fi + fi +fi + +dnl At this point kde_java_bindir and kde_java_includedir are either set or "no" +if test "x$kde_java_bindir" != "xno"; then + + dnl Look for libjvm.so + kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + dnl Look for libgcj.so + kde_java_libgcjdir=`find $kde_java_bindir/.. -name libgcj.so | sed 's,libgcj.so,,'|head -n 1` + dnl Look for libhpi.so and avoid green threads + kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1` + + dnl Now check everything's fine under there + dnl the include dir is our flag for having the JDK + if test -d "$kde_java_includedir"; then + if test ! -x "$kde_java_bindir/javac"; then + AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.]) + fi + if test ! -x "$kde_java_bindir/javah"; then + AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -x "$kde_java_bindir/jar"; then + AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -r "$kde_java_includedir/jni.h"; then + AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.]) + fi + + jni_includes="-I$kde_java_includedir" + dnl Strange thing, jni.h requires jni_md.h which is under genunix here.. + dnl and under linux here.. + + dnl not needed for gcj + + if test "x$kde_java_libgcjdir" = "x"; then + test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux" + test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris" + test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix" + fi + + else + JAVAC= + jni_includes= + fi + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libjvmdir/libjvm.so"; then + AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.]) + fi + else + if test ! -r "$kde_java_libgcjdir/libgcj.so"; then + AC_MSG_ERROR([libgcj.so not found under $kde_java_libgcjdir. Use --without-java.]) + fi + fi + + if test ! -x "$kde_java_bindir/java"; then + AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + + dnl not needed for gcj compile + + if test "x$kde_java_libgcjdir" = "x"; then + if test ! -r "$kde_java_libhpidir/libhpi.so"; then + AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.]) + fi + fi + + if test -n "$jni_includes"; then + dnl Check for JNI version + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cxxflags_safe="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $all_includes $jni_includes" + + AC_TRY_COMPILE([ + #include + ], + [ + #ifndef JNI_VERSION_1_2 + Syntax Error + #endif + ],[ kde_jni_works=yes ], + [ kde_jni_works=no ]) + + if test $kde_jni_works = no; then + AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h. + You need to have Java Development Kit (JDK) version 1.2. + + Use --with-java to specify another location. + Use --without-java to configure without java support. + Or download a newer JDK and try again. + See e.g. http://java.sun.com/products/jdk/1.2 ]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + AC_LANG_RESTORE + + dnl All tests ok, inform and subst the variables + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + if test "x$kde_java_libgcjdir" = "x"; then + JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi" + else + JVMLIBS="-L$kde_java_libgcjdir -lgcj" + fi + AC_MSG_RESULT([java JDK in $kde_java_bindir]) + + else + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([java JRE in $kde_java_bindir]) + fi +elif test -d "/Library/Java/Home"; then + kde_java_bindir="/Library/Java/Home/bin" + jni_includes="-I/Library/Java/Home/include" + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + JVMLIBS="-Wl,-framework,JavaVM" + + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([Apple Java Framework]) +else + AC_MSG_RESULT([none found]) +fi + +AC_SUBST(JAVAC) +AC_SUBST(JAVAH) +AC_SUBST(JAR) +AC_SUBST(JVMLIBS) +AC_SUBST(jni_includes) + +# for backward compat +kde_cv_java_includedir=$kde_java_includedir +kde_cv_java_bindir=$kde_java_bindir +]) + +dnl this is a redefinition of autoconf 2.5x's AC_FOREACH. +dnl When the argument list becomes big, as in KDE for AC_OUTPUT in +dnl big packages, m4_foreach is dog-slow. So use our own version of +dnl it. (matz@kde.org) +m4_define([mm_foreach], +[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])]) +m4_define([mm_car], [[$1]]) +m4_define([mm_car2], [[$@]]) +m4_define([_mm_foreach], +[m4_if(m4_quote($2), [], [], + [m4_define([$1], mm_car($2))$3[]_mm_foreach([$1], + mm_car2(m4_shift($2)), + [$3])])]) +m4_define([AC_FOREACH], +[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])]) + +AC_DEFUN([KDE_NEED_FLEX], +[ +kde_libs_safe=$LIBS +LIBS="$LIBS $USER_LDFLAGS" +AM_PROG_LEX +LIBS=$kde_libs_safe +if test -z "$LEXLIB"; then + AC_MSG_ERROR([You need to have flex installed.]) +fi +AC_SUBST(LEXLIB) +]) + +AC_DEFUN([AC_PATH_QTOPIA], +[ + dnl TODO: use AC_CACHE_VAL + + if test -z "$1"; then + qtopia_minver_maj=1 + qtopia_minver_min=5 + qtopia_minver_pat=0 + else + qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"` + qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"` + qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"` + fi + + qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat" + qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat" + + AC_REQUIRE([AC_PATH_QT]) + + AC_MSG_CHECKING([for Qtopia]) + + LIB_QTOPIA="-lqpe" + AC_SUBST(LIB_QTOPIA) + + kde_qtopia_dirs="$QPEDIR /opt/Qtopia" + + ac_qtopia_incdir=NO + + AC_ARG_WITH(qtopia-dir, + AC_HELP_STRING([--with-qtopia-dir=DIR],[where the root of Qtopia is installed]), + [ ac_qtopia_incdir="$withval"/include] ) + + qtopia_incdirs="" + for dir in $kde_qtopia_dirs; do + qtopia_incdirs="$qtopia_incdirs $dir/include" + done + + if test ! "$ac_qtopia_incdir" = "NO"; then + qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs" + fi + + qtopia_incdir="" + AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir) + ac_qtopia_incdir="$qtopia_incdir" + + if test -z "$qtopia_incdir"; then + AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.]) + fi + + qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`; + qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`; + qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`; + + qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat" + qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat" + if test "$qtopia_ver" -lt "$qtopia_minver"; then + AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr +is required.]) + fi + + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + ac_cxxflags_safe="$CXXFLAGS" + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes" + LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" + LIBS="$LIBS $LIB_QTOPIA $LIBQT" + + cat > conftest.$ac_ext < +#include + +int main( int argc, char **argv ) +{ + QPEApplication app( argc, argv ); + return 0; +} +EOF + + if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* + else + rm -f conftest* + AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at +the end of config.log]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + AC_LANG_RESTORE + + QTOPIA_INCLUDES="-I$qtopia_incdir" + AC_SUBST(QTOPIA_INCLUDES) + + AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir]) +]) + + +AC_DEFUN([KDE_INIT_DOXYGEN], +[ +AC_MSG_CHECKING([for Qt docs]) +kde_qtdir= +if test "${with_qt_dir+set}" = set; then + kde_qtdir="$with_qt_dir" +fi + +AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc /usr/share/qt3/doc/html /usr/X11R6/share/doc/qt/html ], QTDOCDIR) +AC_MSG_RESULT($QTDOCDIR) + +AC_SUBST(QTDOCDIR) + +KDE_FIND_PATH(dot, DOT, [], []) +if test -n "$DOT"; then + KDE_HAVE_DOT="YES" +else + KDE_HAVE_DOT="NO" +fi +AC_SUBST(KDE_HAVE_DOT) +KDE_FIND_PATH(doxygen, DOXYGEN, [], []) +AC_SUBST(DOXYGEN) + +DOXYGEN_PROJECT_NAME="$1" +DOXYGEN_PROJECT_NUMBER="$2" +AC_SUBST(DOXYGEN_PROJECT_NAME) +AC_SUBST(DOXYGEN_PROJECT_NUMBER) + +KDE_HAS_DOXYGEN=no +if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then + KDE_HAS_DOXYGEN=yes +fi +AC_SUBST(KDE_HAS_DOXYGEN) + +]) + + +AC_DEFUN([AC_FIND_BZIP2], +[ +AC_MSG_CHECKING([for bzDecompress in libbz2]) +AC_CACHE_VAL(ac_cv_lib_bzip2, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET" +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#define BZ_NO_STDIO +#include +], + [ bz_stream s; (void) bzDecompress(&s); ], + eval "ac_cv_lib_bzip2='-lbz2'", + eval "ac_cv_lib_bzip2=no") +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +AC_MSG_RESULT($ac_cv_lib_bzip2) + +if test ! "$ac_cv_lib_bzip2" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2" + AC_SUBST(LIBBZ2) + +else + + cxx_shared_flag= + ld_shared_flag= + KDE_CHECK_COMPILER_FLAG(shared, [ + ld_shared_flag="-shared" + ]) + KDE_CHECK_COMPILER_FLAG(fPIC, [ + cxx_shared_flag="-fPIC" + ]) + + AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2]) + AC_CACHE_VAL(ac_cv_lib_bzip2_prefix, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_LIBS="$LIBS" + LIBS="$all_libraries $USER_LDFLAGS $ld_shared_flag -lbz2 $LIBSOCKET" + kde_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CFLAGS $cxx_shared_flag $all_includes $USER_INCLUDES" + + AC_TRY_LINK(dnl + [ + #define BZ_NO_STDIO + #include + ], + [ bz_stream s; (void) BZ2_bzDecompress(&s); ], + eval "ac_cv_lib_bzip2_prefix='-lbz2'", + eval "ac_cv_lib_bzip2_prefix=no") + LIBS="$kde_save_LIBS" + CXXFLAGS="$kde_save_CXXFLAGS" + AC_LANG_RESTORE + ])dnl + + AC_MSG_RESULT($ac_cv_lib_bzip2_prefix) + + if test ! "$ac_cv_lib_bzip2_prefix" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2_prefix" + AC_SUBST(LIBBZ2) + + AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix]) + dnl else, we just ignore this + fi + +fi +AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR") +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the SSL headers and libraries. +dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed) +dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN([KDE_CHECK_SSL], +[ +LIBSSL="-lssl -lcrypto" +AC_REQUIRE([KDE_CHECK_LIB64]) + +ac_ssl_includes=NO ac_ssl_libraries=NO +ssl_libraries="" +ssl_includes="" +AC_ARG_WITH(ssl-dir, + AC_HELP_STRING([--with-ssl-dir=DIR],[where the root of OpenSSL is installed]), + [ ac_ssl_includes="$withval"/include + ac_ssl_libraries="$withval"/lib$kdelibsuff + ]) + +want_ssl=yes +AC_ARG_WITH(ssl, + AC_HELP_STRING([--without-ssl],[disable SSL checks]), + [want_ssl=$withval]) + +if test $want_ssl = yes; then + +AC_MSG_CHECKING(for OpenSSL) + +AC_CACHE_VAL(ac_cv_have_ssl, +[#try to guess OpenSSL locations + + ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes" + ssl_incdirs="$ac_ssl_includes $ssl_incdirs" + AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir) + ac_ssl_includes="$ssl_incdir" + + ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs" + if test ! "$ac_ssl_libraries" = "NO"; then + ssl_libdirs="$ac_ssl_libraries $ssl_libdirs" + fi + + test=NONE + ssl_libdir=NONE + for dir in $ssl_libdirs; do + try="ls -1 $dir/libssl*" + if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done + + ac_ssl_libraries="$ssl_libdir" + + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries" + LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref" + + AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();, + ac_ssl_rsaref="yes" + , + ac_ssl_rsaref="no" + ) + + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then + have_ssl=no + else + have_ssl=yes; + fi + + ]) + + eval "$ac_cv_have_ssl" + + AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes]) + + AC_MSG_CHECKING([whether OpenSSL uses rsaref]) + AC_MSG_RESULT($ac_ssl_rsaref) + + AC_MSG_CHECKING([for easter eggs]) + AC_MSG_RESULT([none found]) + +else + have_ssl=no +fi + +if test "$have_ssl" = yes; then + AC_MSG_CHECKING(for OpenSSL version) + dnl Check for SSL version + AC_CACHE_VAL(ac_cv_ssl_version, + [ + + cat >conftest.$ac_ext < +#include + int main() { + +#ifndef OPENSSL_VERSION_NUMBER + printf("ssl_version=\\"error\\"\n"); +#else + if (OPENSSL_VERSION_NUMBER < 0x00906000) + printf("ssl_version=\\"old\\"\n"); + else + printf("ssl_version=\\"ok\\"\n"); +#endif + return (0); + } +EOF + + ac_save_CPPFLAGS=$CPPFLAGS + if test "$ac_ssl_includes" != "/usr/include"; then + CPPFLAGS="$CPPFLAGS -I$ac_ssl_includes" + fi + + if AC_TRY_EVAL(ac_link); then + + if eval `./conftest 2>&5`; then + if test $ssl_version = error; then + AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !]) + else + if test $ssl_version = old; then + AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.]) + have_ssl=no + fi + fi + ac_cv_ssl_version="ssl_version=$ssl_version" + else + AC_MSG_ERROR([Your system couldn't run a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + + else + AC_MSG_ERROR([Your system couldn't link a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + CPPFLAGS=$ac_save_CPPFLAGS + + ]) + + eval "$ac_cv_ssl_version" + AC_MSG_RESULT($ssl_version) +fi + +if test "$have_ssl" != yes; then + LIBSSL=""; +else + AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL]) + ac_cv_have_ssl="have_ssl=yes \ + ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref" + + if test "$have_ssl" = "yes"; then + AC_DEFINE(ENABLE_OPENSSL, 1, [Use OpenSSL]) + fi + + ssl_libraries="$ac_ssl_libraries" + ssl_includes="$ac_ssl_includes" + + if test "$ac_ssl_rsaref" = yes; then + LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref" + fi + + if test $ssl_version = "old"; then + AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6]) + fi +fi + +SSL_INCLUDES= + +if test "$ssl_includes" = "/usr/include"; then + if test -f /usr/kerberos/include/krb5.h; then + SSL_INCLUDES="-I/usr/kerberos/include" + fi +elif test "$ssl_includes" != "/usr/local/include" && test -n "$ssl_includes"; then + SSL_INCLUDES="-I$ssl_includes" +fi + +if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries" || test "$ssl_libraries" = "NONE"; then + SSL_LDFLAGS="" +else + SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries" +fi + +AC_SUBST(SSL_INCLUDES) +AC_SUBST(SSL_LDFLAGS) +AC_SUBST(LIBSSL) +]) + +AC_DEFUN([KDE_CHECK_STRLCPY], +[ + AC_REQUIRE([AC_CHECK_STRLCAT]) + AC_REQUIRE([AC_CHECK_STRLCPY]) + AC_CHECK_SIZEOF(size_t) + AC_CHECK_SIZEOF(unsigned long) + + AC_MSG_CHECKING([sizeof size_t == sizeof unsigned long]) + AC_TRY_COMPILE(,[ + #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG + choke me + #endif + ],AC_MSG_RESULT([yes]),[ + AC_MSG_RESULT(no) + AC_MSG_ERROR([ + Apparently on your system our assumption sizeof size_t == sizeof unsigned long + does not apply. Please mail kde-devel@kde.org with a description of your system! + ]) + ]) +]) + +AC_DEFUN([KDE_CHECK_BINUTILS], +[ + AC_MSG_CHECKING([if ld supports unversioned version maps]) + + kde_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" + echo "{ local: extern \"C++\" { foo }; };" > conftest.map + AC_TRY_LINK([int foo;], +[ +#ifdef __INTEL_COMPILER +icc apparently does not support libtools version-info and version-script +at the same time. Dunno where the bug is, but until somebody figured out, +better disable the optional version scripts. +#endif + + foo = 42; +], kde_supports_versionmaps=yes, kde_supports_versionmaps=no) + LDFLAGS="$kde_save_LDFLAGS" + rm -f conftest.map + AM_CONDITIONAL(include_VERSION_SCRIPT, + [test "$kde_supports_versionmaps" = "yes" && test "$kde_use_debug_code" = "no"]) + + AC_MSG_RESULT($kde_supports_versionmaps) +]) + +AC_DEFUN([AM_PROG_OBJC],[ +AC_CHECK_PROGS(OBJC, gcc, gcc) +test -z "$OBJC" && AC_MSG_ERROR([no acceptable objective-c gcc found in \$PATH]) +if test "x${OBJCFLAGS-unset}" = xunset; then + OBJCFLAGS="-g -O2" +fi +AC_SUBST(OBJCFLAGS) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(OBJC)]) +]) + +AC_DEFUN([KDE_CHECK_PERL], +[ + KDE_FIND_PATH(perl, PERL, [$bindir $exec_prefix/bin $prefix/bin], [ + AC_MSG_ERROR([No Perl found in your $PATH. +We need perl to generate some code.]) + ]) + AC_SUBST(PERL) +]) + +AC_DEFUN([KDE_CHECK_LARGEFILE], +[ +AC_SYS_LARGEFILE +if test "$ac_cv_sys_file_offset_bits" != no; then + CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" +fi + +if test "x$ac_cv_sys_large_files" != "xno"; then + CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=1" +fi + +]) + +dnl A small extension to PKG_CHECK_MODULES (defined in pkg.m4.in) +dnl which allows to search for libs that get installed into the KDE prefix. +dnl +dnl Syntax: KDE_PKG_CHECK_MODULES(KSTUFF, libkexif >= 0.2 glib = 1.3.4, action-if, action-not) +dnl defines KSTUFF_LIBS, KSTUFF_CFLAGS, see pkg-config man page +dnl also defines KSTUFF_PKG_ERRORS on error +AC_DEFUN([KDE_PKG_CHECK_MODULES], [ + + PKG_CONFIG_PATH="$prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + if test "$prefix" != "$kde_libs_prefix"; then + PKG_CONFIG_PATH="$kde_libs_prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH" + fi + export PKG_CONFIG_PATH + PKG_CHECK_MODULES([$1],[$2],[$3],[$4]) +]) + + +dnl Check for PIE support in the compiler and linker +AC_DEFUN([KDE_CHECK_PIE_SUPPORT], +[ + AC_CACHE_CHECK([for PIE support], kde_cv_val_pie_support, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + safe_CXXFLAGS=$CXXFLAGS + safe_LDFLAGS=$LDFLAGS + CXXFLAGS="$CXXFLAGS -fPIE" + LDFLAGS="$LDFLAGS -pie" + + AC_TRY_LINK([int foo;], [], [kde_cv_val_pie_support=yes], [kde_cv_val_pie_support=no]) + + CXXFLAGS=$safe_CXXFLAGS + LDFLAGS=$safe_LDFLAGS + AC_LANG_RESTORE + ]) + + AC_MSG_CHECKING(if enabling -pie/fPIE support) + + AC_ARG_ENABLE(pie, + AC_HELP_STRING([--enable-pie],[platform supports PIE linking [default=detect]]), + [kde_has_pie_support=$enableval], + [kde_has_pie_support=detect]) + + if test "$kde_has_pie_support" = "detect"; then + kde_has_pie_support=$kde_cv_val_pie_support + fi + + AC_MSG_RESULT([$kde_has_pie_support]) + + KDE_USE_FPIE="" + KDE_USE_PIE="" + + AC_SUBST([KDE_USE_FPIE]) + AC_SUBST([KDE_USE_PIE]) + + if test "$kde_has_pie_support" = "yes"; then + KDE_USE_FPIE="-fPIE" + KDE_USE_PIE="-pie" + fi +]) diff --git a/admin/am_edit b/admin/am_edit new file mode 100644 index 0000000..a1a9e35 --- /dev/null +++ b/admin/am_edit @@ -0,0 +1,2441 @@ +#!/usr/bin/perl -w + +# Expands the specialised KDE tags in Makefile.in to (hopefully) valid +# make syntax. +# When called without file parameters, we work recursively on all Makefile.in +# in and below the current subdirectory. When called with file parameters, +# only those Makefile.in are changed. +# The currently supported tags are +# +# {program}_METASOURCES +# where you have a choice of two styles +# {program}_METASOURCES = name1.moc name2.moc ... [\] +# {program}_METASOURCES = AUTO +# The second style requires other tags as well. +# +# To install icons : +# KDE_ICON = iconname iconname2 ... +# KDE_ICON = AUTO +# +# For documentation : +# http://developer.kde.org/documentation/other/developer-faq.html +# +# and more new tags TBD! +# +# The concept (and base code) for this program came from automoc, +# supplied by the following +# +# Matthias Ettrich (The originator) +# Kalle Dalheimer (The original implementator) +# Harri Porten +# Alex Zepeda +# David Faure +# Stephan Kulow +# Dirk Mueller + +use Cwd; +use File::Find; +use File::Basename; + +# Prototype the functions +sub initialise (); +sub processMakefile ($); +sub updateMakefile (); +sub restoreMakefile (); + +sub removeLine ($$); +sub appendLines ($); +sub substituteLine ($$); + +sub findMocCandidates (); +sub pruneMocCandidates ($); +sub checkMocCandidates (); +sub addMocRules (); +sub findKcfgFile($); + +sub tag_AUTOMAKE (); +sub tag_META_INCLUDES (); +sub tag_METASOURCES (); +sub tag_POFILES (); +sub tag_DOCFILES (); +sub tag_LOCALINSTALL(); +sub tag_IDLFILES(); +sub tag_UIFILES(); +sub tag_KCFGFILES(); +sub tag_SUBDIRS(); +sub tag_ICON(); +sub tag_CLOSURE(); +sub tag_NO_UNDEFINED(); +sub tag_NMCHECK(); +sub tag_DIST(); +sub tag_KDEINIT(); + +# Some global globals... +$verbose = 0; # a debug flag +$thisProg = "$0"; # This programs name +$topdir = cwd(); # The current directory +@makefiles = (); # Contains all the files we'll process +@foreignfiles = (); +$start = (times)[0]; # some stats for testing - comment out for release +$version = "v0.2"; +$errorflag = 0; +$cppExt = "(cpp|cc|cxx|C|c\\+\\+)"; +$hExt = "(h|H|hh|hxx|hpp|h\\+\\+)"; +$progId = "KDE tags expanded automatically by " . basename($thisProg); +$automkCall = "\n"; +$printname = ""; # used to display the directory the Makefile is in +$use_final = 1; # create code for --enable-final +$cleantarget = "clean"; +$dryrun = 0; +$pathoption = 0; +$foreign_libtool = 0; + +while (defined ($ARGV[0])) +{ + $_ = shift; + if (/^--version$/) + { + print STDOUT "\n"; + print STDOUT basename($thisProg), " $version\n", + "This is really free software, unencumbered by the GPL.\n", + "You can do anything you like with it except sueing me.\n", + "Copyright 1998 Kalle Dalheimer \n", + "Concept, design and unnecessary questions about perl\n", + " by Matthias Ettrich \n\n", + "Making it useful by Stephan Kulow and\n", + "Harri Porten \n", + "Updated (Feb-1999), John Birch \n", + "Fixes and Improvements by Dirk Mueller \n", + "Current Maintainer Stephan Kulow\n\n"; + exit 0; + } + elsif (/^--verbose$|^-v$/) + { + $verbose = 1; # Oh is there a problem...? + } + elsif (/^(?:-p|--path=)(.+)$/) + { + my $p = $1; + $thisProg = $p . "/". basename($thisProg); + warn ("$thisProg doesn't exist\n") if (!(-f $thisProg)); + $thisProg .= " -p".$p; + $pathoption=1; + } + elsif (/^--help$|^-h$/) + { + print STDOUT "Usage $thisProg [OPTION] ... [dir/Makefile.in]...\n", + "\n", + "Patches dir/Makefile.in generated by automake\n", + "(where dir can be an absolute or relative directory name)\n", + "\n", + " -v, --verbose verbosely list files processed\n", + " -h, --help print this help, then exit\n", + " --version print version number, then exit\n", + " -p, --path= use the path to am_edit if the path\n", + " called from is not the one to be used\n", + " --no-final don't patch for --enable-final\n"; + + exit 0; + } + elsif (/^--no-final$/) + { + $use_final = 0; + $thisProg .= " --no-final"; + } + elsif (/^--foreign-libtool$/) + { + $foreign_libtool = 1; + $thisProg .= " --foreign-libtool"; + } + elsif (/^-n$/) + { + $dryrun = 1; + } + else + { + # user selects what input files to check + # add full path if relative path is given + $_ = cwd()."/".$_ if (! /^\//); + print "User wants $_\n" if ($verbose); + push (@makefiles, $_); + } +} + +if ($thisProg =~ /^\// && !$pathoption ) +{ + print STDERR "Illegal full pathname call performed...\n", + "The call to \"$thisProg\"\nwould be inserted in some Makefile.in.\n", + "Please use option --path.\n"; + exit 1; +} + +# Only scan for files when the user hasn't entered data +if (!@makefiles) +{ + print STDOUT "Scanning for Makefile.in\n" if ($verbose); + find (\&add_makefile, cwd()); + #chdir('$topdir'); +} else { + print STDOUT "Using input files specified by user\n" if ($verbose); +} + +foreach $makefile (sort(@makefiles)) +{ + processMakefile ($makefile); + last if ($errorflag); +} + +# Just some debug statistics - comment out for release as it uses printf. +printf STDOUT "Time %.2f CPU sec\n", (times)[0] - $start if ($verbose); + +exit $errorflag; # causes make to fail if erroflag is set + +#----------------------------------------------------------------------------- + +# In conjunction with the "find" call, this builds the list of input files +sub add_makefile () +{ + push (@makefiles, $File::Find::name) if (/Makefile.in$/); +} + +#----------------------------------------------------------------------------- + +# Processes a single make file +# The parameter contains the full path name of the Makefile.in to use +sub processMakefile ($) +{ + # some useful globals for the subroutines called here + local ($makefile) = @_; + local @headerdirs = ('.'); + local $haveAutomocTag = 0; + local $MakefileData = ""; + + local $cxxsuffix = "KKK"; + + local @programs = (); # lists the names of programs and libraries + local $program = ""; + + local @kdeinits = (); # lists the kdeinit targets + + local %realObjs = (); # lists the objects compiled into $program + local %sources = (); # lists the sources used for $program + local %finalObjs = (); # lists the objects compiled when final + local %realname = (); # the binary name of program variable + local %idlfiles = (); # lists the idl files used for $program + local %globalmocs = ();# list of all mocfiles (in %mocFiles format) + local %important = (); # list of files to be generated asap + local %uiFiles = (); + local %kcfgFiles = (); + + local $allidls = ""; + local $idl_output = "";# lists all idl generated files for cleantarget + local $ui_output = "";# lists all uic generated files for cleantarget + local $kcfg_output = "";# lists all kcfg generated files for cleantarget + + local %dependmocs = (); + + local $metasourceTags = 0; + local $dep_files = ""; + local $dep_finals = ""; + local %target_adds = (); # the targets to add + local %rule_adds = (); + local $kdelang = ""; + local @cleanfiles = (); + local $cleanMoc = ""; + local $closure_output = ""; + + local %varcontent = (); + + $makefileDir = dirname($makefile); + chdir ($makefileDir); + $printname = $makefile; + $printname =~ s/^\Q$topdir\E\///; + $makefile = basename($makefile); + + print STDOUT "Processing makefile $printname\n" if ($verbose); + + # Setup and see if we need to do this. + return if (!initialise()); + + tag_AUTOMAKE (); # Allows a "make" to redo the Makefile.in + tag_META_INCLUDES (); # Supplies directories for src locations + + foreach $program (@programs) { + $sources_changed{$program} = 0; + $dependmocs{$program} = ""; + $important{$program} = ""; + tag_IDLFILES(); # Sorts out idl rules + tag_NO_UNDEFINED(); + tag_CLOSURE(); + tag_NMCHECK(); + tag_UIFILES(); # Sorts out ui rules + tag_KCFGFILES(); # Sorts out kcfg rules + tag_METASOURCES (); # Sorts out the moc rules + if ($sources_changed{$program}) { + my $lookup = $program . '_SOURCES\s*=[ \t]*(.*)'; + + if($program =~ /libkdeinit_(.*)/) { + my $prog = $1; + substituteLine($prog . '_SOURCES\s*=[ \t]*(.*)', + "${prog}_SOURCES = ${prog}_dummy.$cxxsuffix\n" . + "libkdeinit_${prog}_SOURCES = " . $sources{$program}); + $sources{$prog} = "${prog}_dummy.$cxxsuffix"; + } + else { + substituteLine($lookup, "$program\_SOURCES=" . $sources{$program}); + } + } + if ($important{$program}) { + local %source_dict = (); + for $source (split(/[\034\s]+/, $sources{$program})) { + $source_dict{$source} = 1; + } + for $source (@cleanfiles) { + $source_dict{$source} = 0; + } + for $source (keys %source_dict) { + next if (!$source); + if ($source_dict{$source}) { + # sanity check + if (! -f $source) { + print STDERR "Error: $source is listed in a _SOURCE line in $printname, but doesn't exist yet. Put it in DISTCLEANFILES!\n"; + } else { + $target_adds{"\$(srcdir)/$source"} .= $important{$program}; + } + } + } + } + } + if ($cleanMoc) { + # Always add dist clean tag + # Add extra *.moc.cpp files created for USE_AUTOMOC because they + # aren't included in the normal *.moc clean rules. + appendLines ("$cleantarget-metasources:\n\t-rm -f $cleanMoc\n"); + $target_adds{"$cleantarget-am"} .= "$cleantarget-metasources "; + } + + tag_DIST() unless ($kdeopts{"noautodist"}); + + if ($idl_output) { + appendLines ("$cleantarget-idl:\n\t-rm -f $idl_output\n"); + $target_adds{"$cleantarget-am"} .= "$cleantarget-idl "; + } + + if ($ui_output) { + appendLines ("$cleantarget-ui:\n\t-rm -f $ui_output\n"); + $target_adds{"$cleantarget-am"} .= "$cleantarget-ui "; + } + + if ($kcfg_output) { + appendLines ("$cleantarget-kcfg:\n\t-rm -f $kcfg_output\n"); + $target_adds{"$cleantarget-am"} .= "$cleantarget-kcfg "; + } + + if ($closure_output) { + appendLines ("$cleantarget-closures:\n\t-rm -f $closure_output\n"); + $target_adds{"$cleantarget-am"} .= "$cleantarget-closures "; + } + + if ($MakefileData =~ /\nKDE_LANG\s*=\s*(\S*)\s*\n/) { + $kdelang = '$(KDE_LANG)' + } else { + $kdelang = ''; + } + + tag_POFILES (); # language rules for po directory + tag_DOCFILES (); # language rules for doc directories + tag_LOCALINSTALL(); # add $(DESTDIR) before all kde_ dirs + tag_ICON(); + tag_SUBDIRS(); + + my $tmp = "force-reedit:\n"; + $tmp .= "\t$automkCall\n\tcd \$(top_srcdir) && perl $thisProg $printname\n\n"; + appendLines($tmp); + + make_bcheck_target(); + make_meta_classes(); + tag_COMPILE_FIRST(); + tag_FINAL() if (!$kdeopts{"nofinal"}); + + my $final_lines = "final:\n\t\$(MAKE) "; + my $final_install_lines = "final-install:\n\t\$(MAKE) "; + my $nofinal_lines = "no-final:\n\t\$(MAKE) "; + my $nofinal_install_lines = "no-final-install:\n\t\$(MAKE) "; + + foreach $program (@programs) { + my $lookup = $program . '_OBJECTS\s*=[ \t]*.*'; + my $new = ""; + my @list = split(/[\034\s]+/, $realObjs{$program}); + if (!$kdeopts{"nofinal"} && @list > 1 && $finalObjs{$program}) { + $new .= "$program\_final\_OBJECTS = " . $finalObjs{$program}; + $new .= "\n$program\_nofinal\_OBJECTS = " . $realObjs{$program}; + $new .= "\n\@KDE_USE_FINAL_FALSE\@$program\_OBJECTS = \$($program\_nofinal\_OBJECTS)"; + $new .= "\n\@KDE_USE_FINAL_TRUE\@$program\_OBJECTS = \$($program\_final\_OBJECTS)"; + + $final_lines .= "$program\_OBJECTS=\"\$($program\_final_OBJECTS)\" "; + $final_install_lines .= "$program\_OBJECTS=\"\$($program\_final_OBJECTS)\" "; + $nofinal_lines .= "$program\_OBJECTS=\"\$($program\_nofinal\_OBJECTS)\" "; + $nofinal_install_lines .= "$program\_OBJECTS=\"\$($program\_nofinal_OBJECTS)\" "; + } else { + $new = "$program\_OBJECTS = " . $realObjs{$program}; + } + if($MakefileData =~ m/\n$lookup/) { + substituteLine ($lookup, $new); + } + else { + appendLines("$new\n"); + } + } + appendLines($final_lines . "all-am\n"); + appendLines($final_install_lines . "install-am\n"); + appendLines($nofinal_lines . "all-am\n"); + appendLines($nofinal_install_lines . "install-am\n"); + + my $lookup = '(\@\S+\@)?DEP_FILES\s*=[ \t]*(.*)'; + if ($MakefileData =~ /\n$lookup/) { + my $condition = $1; + my $depfiles = $2; + my $workfiles; + + if ($dep_finals) { + # Add the conditions on every line, since + # there may be line continuations in the list. + $workfiles = "$dep_files $dep_finals $depfiles"; + $workfiles =~ s/\034/\034$condition\@KDE_USE_FINAL_TRUE\@\t/g; + $lines = "$condition\@KDE_USE_FINAL_TRUE\@DEP_FILES = $workfiles\n"; + $workfiles = "$dep_files $depfiles"; + $workfiles =~ s/\034/\034$condition\@KDE_USE_FINAL_FALSE\@\t/g; + $lines .= "$condition\@KDE_USE_FINAL_FALSE\@DEP_FILES = $workfiles"; + } else { + $workfiles = "$dep_files $depfiles"; + $workfiles =~ s/\034/\034$condition\t/g; + $lines = $condition . "DEP_FILES = $workfiles"; + } + substituteLine($lookup, $lines); + } + + # new recursive targets + $target_adds{ "nmcheck" } .= ""; # always create nmcheck target + $target_adds{ "nmcheck-am" } .= "nmcheck"; + $lookup = 'RECURSIVE_TARGETS\s*=[ \t]*(.*)'; + if ($MakefileData =~ /\n$lookup/) { + substituteLine($lookup, "RECURSIVE_TARGETS = $1 nmcheck-recursive bcheck-recursive"); + } + + $cvs_lines = "kde-rpo-clean:\n"; + $cvs_lines .= "\t-rm -f *.rpo\n"; + appendLines($cvs_lines); + $target_adds{"clean"} .= "kde-rpo-clean "; + + my %target_dels = ("install-data-am" => ""); + + # some strange people like to do a install-exec, and expect that also + # all modules are installed. automake doesn't know this, so we need to move + # this here from install-data to install-exec. + if ($MakefileData =~ m/\nkde_module_LTLIBRARIES\s*=/) { +# $target_adds{"install-exec-am"} .= "install-kde_moduleLTLIBRARIES "; +# don't use $target_adds here because we need to append the dependency, not +# prepend it. Fixes #44342 , when a module depends on a lib in the same dir +# and libtool needs it during relinking upon install (Simon) + my $lookup = "install-exec-am:([^\n]*)"; + if($MakefileData =~ /\n$lookup\n/) { + substituteLine("$lookup", "install-exec-am: $1 install-kde_moduleLTLIBRARIES"); + } + $target_dels{"install-data-am"} .= "install-kde_moduleLTLIBRARIES "; + $target_adds{"install-data-am"} .= " "; + } + + my $lines = ""; + + foreach $add (keys %target_adds) { + my $lookup = quotemeta($add) . ':([^\n]*)'; + if ($MakefileData =~ /\n$lookup\n/) { + my $newlines = $1; + my $oldlines = $lookup; + if (defined $target_dels{$add}) { + foreach $del (split(' ', $target_dels{$add})) { + $newlines =~ s/\s*$del\s*/ /g; + } + } + substituteLine($oldlines, "$add: " . $target_adds{$add} . $newlines); + } else { + $lines .= "$add: " . $target_adds{$add} . "\n"; + } + } + + appendLines($lines) if ($lines); + + $lines = join("\n", values %rule_adds); + appendLines($lines) if ($lines); + + my $found = 1; + + while ($found) { + if ($MakefileData =~ m/\n(.*)\$\(CXXFLAGS\)(.*)\n/) { + my $stuff_before = $1; + my $stuff_after = $2; + my $lookup = quotemeta("$1\$(CXXFLAGS)$2"); + my $replacement = "$1\$(KCXXFLAGS)$2"; + $MakefileData =~ s/$lookup/$replacement/; + $lookup =~ s/\\\$\\\(CXXFLAGS\\\)/\\\$\\\(KCXXFLAGS\\\)/; + $replacement = "$stuff_before\$(KCXXFLAGS) \$(KDE_CXXFLAGS)$stuff_after"; + next if ($stuff_before =~ /\$\(KDE_CXXFLAGS\)/ or $stuff_after =~ /\$\(KDE_CXXFLAGS\)/); + substituteLine($lookup, $replacement); + } else { + $found = 0; + } + } + + if($foreign_libtool == 0) { + $lookup = '(\n[^#].*\$\(LIBTOOL\) --mode=link) (\$\(CXXLD\).*\$\(KCXXFLAGS\))'; + + if ($MakefileData =~ m/$lookup/ ) { + $MakefileData =~ s/$lookup/$1 --tag=CXX $2/; + } + + $lookup = '(\n[^#].*\$\(LIBTOOL\) --mode=compile)\s+(\$\(CXX\)\s+)'; + if ($MakefileData =~ m/$lookup/ ) { + $MakefileData =~ s/$lookup/$1 --tag=CXX $2/; + } + } + + $MakefileData =~ s/\$\(KCXXFLAGS\)/\$\(CXXFLAGS\)/g; + + $lookup = '(.*)cp -pr \$\$/\$\$file \$\(distdir\)/\$\$file(.*)'; + if ($MakefileData =~ m/\n$lookup\n/) { + substituteLine($lookup, "$1cp -pr \$\$d/\$\$file \$(distdir)/\$\$file$2"); + } + + # Always update the Makefile.in + updateMakefile (); + return; +} + +#----------------------------------------------------------------------------- + +# Beware: This procedure is not complete. E.g. it also parses lines +# containing a '=' in rules (for instance setting shell vars). For our +# usage this us enough, though. +sub read_variables () +{ + while ($MakefileData =~ /\n\s*(\S+)\s*=([^\n]*)/g) { + $varcontent{$1} = $2; + } +} + +# Check to see whether we should process this make file. +# This is where we look for tags that we need to process. +# A small amount of initialising on the tags is also done here. +# And of course we open and/or create the needed make files. +sub initialise () +{ + if (! -r "Makefile.am") { + print STDOUT "found Makefile.in without Makefile.am\n" if ($verbose); + return 0; + } + + # Checking for files to process... + + open (FILEIN, $makefile) || die "Can't open $makefileDir/$makefile: $!\n"; + # perl bug in 5.8.0: in utf8 mode it badly screws up + binmode(FILEIN, ":bytes") if ($] >= 5.008); + # Read the file + # stat(FILEIN)[7] might look more elegant, but is slower as it + # requires stat'ing the file + seek(FILEIN, 0, 2); + my $fsize = tell(FILEIN); + seek(FILEIN, 0, 0); + read FILEIN, $MakefileData, $fsize; + close FILEIN; + print "DOS CRLF within $makefileDir/$makefile!\n" if($MakefileData =~ y/\r//d); + + # Remove the line continuations, but keep them marked + # Note: we lose the trailing spaces but that's ok. + # Don't mangle line-leading spaces (usually tabs) + # since they're important. + $MakefileData =~ s/\\\s*\n/\034/g; + + # If we've processed the file before... + restoreMakefile () if ($MakefileData =~ /$progId/); + + foreach $dir (@foreignfiles) { + if (substr($makefileDir,0,length($dir)) eq $dir) { + return 0; + } + } + + %kdeopts = (); + $kdeopts{"foreign"} = 0; + $kdeopts{"qtonly"} = 0; + $kdeopts{"noautodist"} = 0; + $kdeopts{"foreign-libtool"} = $foreign_libtool; + $kdeopts{"nofinal"} = !$use_final; # default + + read_variables(); + + if ($MakefileData =~ /\nKDE_OPTIONS\s*=[ \t]*([^\n]*)\n/) { + my $kde_options_str = $1; + local @kde_options = split(/[\034\s]+/, $kde_options_str); + if (grep(/^foreign$/, @kde_options)) { + push(@foreignfiles, $makefileDir . "/"); + return 0; # don't touch me + } + for $opt (@kde_options) { + if (!defined $kdeopts{$opt}) { + print STDERR "Warning: unknown option $opt in $printname\n"; + } else { + $kdeopts{$opt} = 1; + } + } + } + + # Look for the tags that mean we should process this file. + $metasourceTags = 0; + $metasourceTags++ while ($MakefileData =~ /\n[^=\#]*METASOURCES\s*=/g); + + my $pofileTag = 0; + $pofileTag++ while ($MakefileData =~ /\nPOFILES\s*=/g); + if ($pofileTag > 1) + { + print STDERR "Error: Only one POFILES tag allowed\n"; + $errorflag = 1; + } + + while ($MakefileData =~ /\n\.SUFFIXES:([^\n]+)\n/g) { + my $suffixes_str = $1; + my @list=split(' ', $suffixes_str); + foreach $ext (@list) { + if ($ext =~ /^\.$cppExt$/) { + $cxxsuffix = $ext; + $cxxsuffix =~ s/\.//g; + print STDOUT "will use suffix $cxxsuffix\n" if ($verbose); + last; + } + } + } + + tag_KDEINIT(); + + while ($MakefileData =~ /\n(\S*)_OBJECTS\s*=[\034 \t]*([^\n]*)\n/g) { + + my $program = $1; + my $objs = $2; # safe them + + my $ocv = 0; + + my @objlist = split(/[\034\s]+/, $objs); + foreach $obj (@objlist) { + if ($obj =~ /(\S*)\$\((\S+)\)/ ) { + my $pre = $1; + my $variable = $2; + if ($pre eq '' && exists($varcontent{$variable})) { + my @addlist = split(/[\034\s]+/, $varcontent{$variable}); + push(@objlist, @addlist); + } elsif ($variable !~ 'OBJEXT' && $variable !~ /am__objects_\d+/ ) { + $ocv = 1; + } + } + } + + next if ($ocv); + next if ($program =~ /^am_libkdeinit_/); + + $program =~ s/^am_// if ($program =~ /^am_/); + + my $sourceprogram = $program; + $sourceprogram =~ s/\@am_/\@/ if($sourceprogram =~ /^.*\@am_.+/); + + print STDOUT "found program $program\n" if ($verbose); + push(@programs, $program); + + $realObjs{$program} = $objs; + + if ($MakefileData =~ /\n$sourceprogram\_SOURCES\s*=[ \t]*(.*)\n/) { + $sources{$program} = $1; + } + else { + $sources{$program} = ""; + print STDERR "found program with no _SOURCES: $program\n"; + } + + my $realprogram = $program; + $realprogram =~ s/_/./g; # unmask to regexp + if ($MakefileData =~ /\n($realprogram)(\$\(EXEEXT\)?)?:.*\$\($program\_OBJECTS\)/) { + $realname{$program} = $1; + } else { + # not standard Makefile - nothing to worry about + $realname{$program} = ""; + } + } + + my $lookup = 'DEPDIR\s*=.*'; + if ($MakefileData !~ /\n$lookup/) { + $lookup = 'bindir\s*=[ \t]*.*'; + substituteLine($lookup, "DEPDIR = .deps\n$1") if ($MakefileData =~ /\n($lookup)/); + } + + my @marks = ('MAINTAINERCLEANFILES', 'CLEANFILES', 'DISTCLEANFILES'); + foreach $mark (@marks) { + while ($MakefileData =~ /\n($mark)\s*=[ \t]*([^\n]*)/g) { + my $clean_str = $2; + foreach $file (split('[\034\s]+', $clean_str)) { + $file =~ s/\.\///; + push(@cleanfiles, $file); + } + } + } + + my $localTag = 0; + $localTag++ if ($MakefileData =~ /\ninstall-\S+-local:/); + + return (!$errorflag); +} + +#----------------------------------------------------------------------------- + +# Gets the list of user defined directories - relative to $srcdir - where +# header files could be located. +sub tag_META_INCLUDES () +{ + my $lookup = '[^=\n]*META_INCLUDES\s*=[ \t]*(.*)'; + return 1 if ($MakefileData !~ /($lookup)\n/); + print STDOUT "META_INCLUDE processing <$1>\n" if ($verbose); + + my $headerStr = $2; + removeLine ($lookup, $1); + + my @headerlist = split(/[\034\s]+/, $headerStr); + + foreach $dir (@headerlist) + { + $dir =~ s#\$\(srcdir\)#.#; + if (! -d $dir) + { + print STDERR "Warning: $dir can't be found. ", + "Must be a relative path to \$(srcdir)\n"; + } + else + { + push (@headerdirs, $dir); + } + } + + return 0; +} + +#----------------------------------------------------------------------------- + +sub tag_FINAL() +{ + my @final_names = (); + + foreach $program (@programs) { + + if ($sources{$program} =~ /\(/) { + print STDOUT "found ( in $program\_SOURCES. skipping\n" if ($verbose); + next; + } + + my $mocs = ""; # Moc files (in this program) + my $moc_cpp_added = 0; # If we added some .moc.cpp files, due to + # no other .cpp file including the .moc one. + + my @progsources = split(/[\034\s]+/, $sources{$program}); + my %shash = (); + @shash{@progsources} = 1; # we are only interested in the existence + my %sourcelist = (); + my %extradeps = (); + + foreach $source (@progsources) { + my $suffix = $source; + $suffix =~ s/^.*\.([^\.]+)$/$1/; + + $sourcelist{$suffix} .= "$source "; + } + foreach my $mocFile (keys (%globalmocs)) + { + my ($dir, $hFile, $cppFile) = split ("\035", $globalmocs{$mocFile}, 3); + if (defined ($cppFile)) { + $mocs .= " $mocFile.moc" if exists $shash{$cppFile}; + } else { + $sourcelist{$cxxsuffix} .= "$mocFile.moc.$cxxsuffix "; + $moc_cpp_added = 1; + } + } + + # scan for extra given dependencies and add them to our target + while ($MakefileData =~ /\n\s*(\S+)\.(?:lo|o)\s*:([^\n]*)/g) { + $extradeps{$1} = $2; + } + + foreach $suffix (keys %sourcelist) { + # See if this file contains c++ code. (i.e., just check the file's suffix against c++ extensions) + my $suffix_is_cxx = 0; + if($suffix =~ /($cppExt)$/) { + $cxxsuffix = $1; + $suffix_is_cxx = 1; + } + + my $mocfiles_in = ($suffix eq $cxxsuffix) && $moc_cpp_added; + + my @sourcelist = split(/[\034\s]+/, $sourcelist{$suffix}); + + if ((@sourcelist == 1 && !$mocfiles_in) || $suffix_is_cxx != 1 ) { + + # we support IDL on our own + if ($suffix eq "skel" || $suffix =~ /^stub/ + || $suffix =~ /^signals/ # obsolete, remove in KDE-4 + || $suffix eq "h" || $suffix eq "ui" + || $suffix eq "kcfgc" ) { + next; + } + + foreach $file (@sourcelist) { + $file =~ s/\Q$suffix\E$//; + + $finalObjs{$program} .= $file; + if ($program =~ /_la$/) { + $finalObjs{$program} .= "lo "; + } else { + $finalObjs{$program} .= "o "; + } + } + next; # suffix + } + + my $source_deps = ""; + foreach $source (@sourcelist) { + if (-f $source) { + $source_deps .= " \$(srcdir)/$source"; + } else { + $source_deps .= " $source"; + } + my $plainsource = $source; + $plainsource =~ s/\.$cppExt$//; + $source_deps .= " " . $extradeps{$plainsource} if (exists($extradeps{$plainsource})); + } + + $handling = "$program.all_$suffix.$suffix: \$(srcdir)/Makefile.in" . $source_deps . " " . join(' ', $mocs) . "\n"; + $handling .= "\t\@echo 'creating $program.all_$suffix.$suffix ...'; \\\n"; + $handling .= "\trm -f $program.all_$suffix.files $program.all_$suffix.final; \\\n"; + $handling .= "\techo \"#define KDE_USE_FINAL 1\" >> $program.all_$suffix.final; \\\n"; + $handling .= "\tfor file in " . $sourcelist{$suffix} . "; do \\\n"; + $handling .= "\t echo \"#include \\\"\$\$file\\\"\" >> $program.all_$suffix.files; \\\n"; + $handling .= "\t test ! -f \$\(srcdir\)/\$\$file || egrep '^#pragma +implementation' \$\(srcdir\)/\$\$file >> $program.all_$suffix.final; \\\n"; + $handling .= "\tdone; \\\n"; + $handling .= "\tcat $program.all_$suffix.final $program.all_$suffix.files > $program.all_$suffix.$suffix; \\\n"; + $handling .= "\trm -f $program.all_$suffix.final $program.all_$suffix.files\n"; + + appendLines($handling); + + push(@final_names, "$program.all_$suffix.$suffix"); + my $finalObj = "$program.all_$suffix."; + if ($program =~ /_la$/) { + $finalObj .= "lo"; + } else { + $finalObj .= "o"; + } + $finalObjs{$program} .= $finalObj . " "; + } + } + + if (!$kdeopts{"nofinal"} && @final_names >= 1) { + # add clean-final target + my $lines = "$cleantarget-final:\n"; + $lines .= "\t-rm -f " . join(' ', @final_names) . "\n" if (@final_names); + appendLines($lines); + $target_adds{"$cleantarget-am"} .= "$cleantarget-final "; + + foreach $finalfile (@final_names) { + $finalfile =~ s/\.[^.]*$/.P/; + $dep_finals .= " \$(DEPDIR)/$finalfile"; + } + } +} + +sub tag_KDEINIT() +{ + my @progs = (); + my $ltlibs = ""; + my $lookup = 'kdeinit_LTLIBRARIES\s*=[ \t]*(.*)'; + + if ($MakefileData =~ m/\n$lookup/) { + @kdeinits = split(/[\034\s]+/, $1); + my $lines = ""; + foreach my $kdeinit (@kdeinits) { + if ($kdeinit =~ m/\.la$/) { + $kdeinit =~ s/\.la$//; + push(@progs, $kdeinit); + + $lines .= "\n${kdeinit}.la.$cxxsuffix:\n"; + $lines .= "\techo 'extern \"C\" int kdemain(int argc, char* argv[]);' > ${kdeinit}.la.$cxxsuffix; \\\n"; + $lines .= "\techo 'int main(int argc, char* argv[]) { return kdemain(argc,argv); }' >> ${kdeinit}.la.$cxxsuffix\n"; + + $lines .= "\n${kdeinit}_dummy.$cxxsuffix:\n"; + $lines .= "\techo '#include ' > ${kdeinit}_dummy.$cxxsuffix; \\\n"; + $lines .= "\techo 'extern \"C\" int kdemain(int argc, char* argv[]);' >> ${kdeinit}_dummy.$cxxsuffix; \\\n"; + $lines .= "\techo 'extern \"C\" KDE_EXPORT int kdeinitmain(int argc, char* argv[]) { return kdemain(argc,argv); }' >> ${kdeinit}_dummy.$cxxsuffix\n"; + + push(@cleanfiles, "${kdeinit}.la.$cxxsuffix"); + push(@cleanfiles, "${kdeinit}_dummy.$cxxsuffix"); + + # add dependency + $dep_files .= " \$(DEPDIR)/${kdeinit}.la.Po" if($dep_files !~/${kdeinit}.la.Po/ ); + $dep_files .= " \$(DEPDIR)/${kdeinit}_dummy.Plo" if($dep_files !~/${kdeinit}_dummy.Plo/ ); + + # make library + $lookup = $kdeinit . '_la_LIBADD\s*=[ \t]*(.*)'; + if($MakefileData =~ m/\n$lookup/) { + my $libadd = $1; + substituteLine($lookup, "${kdeinit}_la_LIBADD = libkdeinit_${kdeinit}.la"); + appendLines("libkdeinit_${kdeinit}_la_LIBADD = $libadd\n"); + } + appendLines("libkdeinit_${kdeinit}_la_LDFLAGS = -no-undefined -avoid-version \$(all_libraries)\n"); + + # add library dependencies + $lookup = $kdeinit . '_la_DEPENDENCIES\s*=[ \t]*(.*)'; + if($MakefileData =~ m/\n$lookup/) { + my $libdeps = $1; + substituteLine($lookup, "${kdeinit}_la_DEPENDENCIES = libkdeinit_${kdeinit}.la"); + appendLines("libkdeinit_${kdeinit}_la_DEPENDENCIES = $libdeps\n"); + } + + # make library objects + $lookup = "am_${kdeinit}_la_OBJECTS" . '\s*=[ \t]*(.*)'; + if($MakefileData =~ m/\n$lookup/) { + my $libobjects = $1; + substituteLine($lookup, "am_${kdeinit}_la_OBJECTS = ${kdeinit}_dummy.lo"); + appendLines("am_libkdeinit_${kdeinit}_la_OBJECTS = $libobjects\n"); + my $prog = "libkdeinit_${kdeinit}_la"; + push(@programs, $prog); + $realObjs{$prog} = $libobjects; + $realname{$prog} = "libkdeinit_${kdeinit}.la"; + } + $target_adds{"libkdeinit_${kdeinit}.la"} = "\$(libkdeinit_${kdeinit}_la_OBJECTS) \$(libkdeinit_${kdeinit}_la_DEPENDENCIES)\n" . + "\t\$(CXXLINK) -rpath \$(libdir) \$(libkdeinit_${kdeinit}_la_LDFLAGS) ". + "\$(libkdeinit_${kdeinit}_la_OBJECTS) " . + "\$(libkdeinit_${kdeinit}_la_LIBADD) " . + "\$(LIBS)\n"; + + # make libkdeinit sources + $lookup = $kdeinit . '_la_SOURCES\s*=[ \t]*(.*)'; + if($MakefileData =~ m/\n$lookup/) { + my $srces = $1; + $sources_changed{"libkdeinit_${kdeinit}_la"} = 1; + $sources{"libkdeinit_${kdeinit}_la"} = $srces; + } + + # make libkdeinit metasources + $lookup = $kdeinit . '_la_METASOURCES\s*=[ \t]*(.*)'; + substituteLine($lookup, "libkdeinit_${kdeinit}_la_METASOURCES = $1") + if($MakefileData =~ m/\n$lookup/); + +=cut + # make binary sources + $lookup = $kdeinit. '_SOURCES\s*=[ \t]*(.*)'; + if($MakefileData =~ m/\n$lookup/) { + substituteLine($lookup, "${kdeinit}_SOURCES = ${kdeinit}.la.$cxxsuffix"); + $lookup = 'SOURCES\s*=[ \t]*(.*)'; + if($MakefileData =~ m/\n$lookup/) { + my $srces = $1; + $srces =~ s/\b$kdeinit\.c\b/\$(${kdeinit}_SOURCES)/; + $srces =~ s/\$\(${kdeinit}_la_SOURCES\)/\$(libkdeinit_${kdeinit}_la_SOURCES)/; + substituteLine($lookup, "SOURCES = $srces"); + } + $lookup = 'DIST_SOURCES\s*=[ \t](.*)'; + if($MakefileData =~ m/\n$lookup/) { + my $srces = $1; + $srces =~ s/\b$kdeinit\.c\b/\$(${kdeinit}_SOURCES)/; + $srces =~ s/\$\(${kdeinit}_la_SOURCES\)/\$(libkdeinit_${kdeinit}_la_SOURCES)/; + substituteLine($lookup, "DIST_SOURCES = $srces"); + } + } + + # make binary objects / libs + $lookup = $kdeinit . '_OBJECTS\s*=[ \t]*.*'; + if($MakefileData =~ m/\n$lookup/) { + $realObjs{$kdeinit} = "${kdeinit}.la.\$(OBJEXT)"; + substituteLine("${kdeinit}_LDFLAGS\\s*=.*", "${kdeinit}_LDFLAGS = \$(all_libraries)"); + substituteLine("${kdeinit}_LDADD\\s*=.*", "${kdeinit}_LDADD = libkdeinit_${kdeinit}.la"); + substituteLine("${kdeinit}_DEPENDENCIES\\s*=.*", "${kdeinit}_DEPENDENCIES = libkdeinit_${kdeinit}.la"); + } +=cut + # add binary + push(@programs, $kdeinit); + $realObjs{$kdeinit} = "${kdeinit}.la.\$(OBJEXT)"; + $realname{$kdeinit} = $kdeinit; + $sources{$kdeinit} = "${kdeinit}.la.$cxxsuffix"; + + $lines .= "${kdeinit}_LDFLAGS = \$(KDE_RPATH) -no-undefined \$(all_libraries)\n"; + $lines .= "${kdeinit}_LDADD = libkdeinit_${kdeinit}.la\n"; + $lines .= "${kdeinit}_DEPENDENCIES = libkdeinit_${kdeinit}.la\n"; + + $target_adds{"${kdeinit}\$(EXEEXT)"} = + "\$(${kdeinit}_OBJECTS) \$(${kdeinit}_DEPENDENCIES)\n" . + "\t\@rm -f ${kdeinit}\$(EXEEXT)\n" . + "\t\$(CXXLINK) \$(${kdeinit}_LDFLAGS) \$(${kdeinit}_OBJECTS) \$(${kdeinit}_LDADD) \$(LIBS)\n"; + + $ltlibs .= " libkdeinit_${kdeinit}.la"; + } + } + appendLines($lines); + + # add libkdeinit target + $lookup = 'lib_LTLIBRARIES\s*=[ \t]*(.*)'; + if($MakefileData =~ m/\n$lookup/) { + substituteLine($lookup, "lib_LTLIBRARIES = $1 $ltlibs"); + } + else { + print STDERR + "Error: lib_LTLIBRARIES missing in $printname (required for kdeinit_LTLIBRARIES).\n"; + $errorflag = 1; + } + } + + if($#progs >= 0) { + if($MakefileData !~ m/\nbin_PROGRAMS\s*=/) { + print STDERR "Error: bin_PROGRAMS missing in $printname (required for kdeinit_LTLIBRARIES).\n"; + $errorflag = 1; + } + else { + # add our new progs to SOURCES, DIST_SOURCES and bin_PROGRAMS + my $progsources = ""; + my $progexes = ""; + foreach my $p (@progs) { + $progsources .= "\$(${p}_SOURCES) "; + $progexes .= "${p}\$(EXEEXT) "; + } + $lookup = 'SOURCES\s*=[ \t]*(.*)'; + if($MakefileData =~ /\n$lookup/) { + substituteLine($lookup, "SOURCES = $1 $progsources"); + } + $lookup = 'DIST_SOURCES\s*=[ \t]*(.*)'; + if($MakefileData =~ /\n$lookup/) { + substituteLine($lookup, "DIST_SOURCES = $1 $progsources"); + } + # bin_PROGRAMS is complicated, as it exists twice, so we do a little + # magic trick here + $lookup = 'PROGRAMS\s*=[ \t]*(.*)'; + if ($MakefileData =~ /\n$lookup/) { + substituteLine($lookup, "bin_PROGRAMS += $progexes\nPROGRAMS = $1"); + } + } + } +} + +#----------------------------------------------------------------------------- + +sub tag_COMPILE_FIRST() +{ + foreach $program (@programs) { + my $lookup = "$program" . '_COMPILE_FIRST\s*=[ \t]*(.*)'; + if ($MakefileData =~ m/\n$lookup\n/) { + my $compilefirst_str = $1; + my @compilefirst = split(/[\034\s]+/, $compilefirst_str); + my @progsources = split(/[\034\s]+/, $sources{$program}); + my %donesources = (); + foreach $source (@progsources) { + my @deps = (); + my $sdeps = ""; + if (-f $source) { + $sdeps = "\$(srcdir)/$source"; + } else { + $sdeps = "$source"; + } + foreach $depend (@compilefirst) { + next if ($source eq $depend); + # avoid cyclic dependencies + next if defined($donesources{$depend}); + push @deps, $depend; + } + $target_adds{$sdeps} .= join(' ', @deps) . ' ' if (@deps); + $donesources{$source} = 1; + } + } + } +} + +#----------------------------------------------------------------------------- + + +# Organises the list of headers that we'll use to produce moc files +# from. +sub tag_METASOURCES () +{ + local @newObs = (); # here we add to create object files + local @depend = (); # here we add to create moc files + local $mocExt = ".moc"; + local %mocFiles = (); + + my $line = ""; + my $postEqual = ""; + + my $lookup; + my $found = ""; + if ($metasourceTags > 1) { + $lookup = $program . '_METASOURCES\s*=\s*(.*)'; + return 1 if ($MakefileData !~ /\n($lookup)\n/); + $found = $1; + } else { + $lookup = $program . '_METASOURCES\s*=\s*(.*)'; + if ($MakefileData !~ /\n($lookup)\n/) { + $lookup = 'METASOURCES\s*=\s*(.*)'; + return 1 if ($MakefileData !~ /\n($lookup)\n/); + $found = $1; + $metasourceTags = 0; # we can use the general target only once + } else { + $found = $1; + } + } + print STDOUT "METASOURCE processing <$found>)\n" if ($verbose); + + $postEqual = $found; + $postEqual =~ s/[^=]*=//; + + removeLine ($lookup, $found); + + # Always find the header files that could be used to "moc" + return 1 if (findMocCandidates ()); + + if ($postEqual =~ /AUTO\s*(\S*)|USE_AUTOMOC\s*(\S*)/) + { + print STDERR "$printname: the argument for AUTO|USE_AUTOMOC is obsolete" if ($+); + $mocExt = ".moc.$cxxsuffix"; + $haveAutomocTag = 1; + } + else + { + # Not automoc so read the list of files supplied which + # should be .moc files. + + $postEqual =~ tr/\034/ /; + + # prune out extra headers - This also checks to make sure that + # the list is valid. + pruneMocCandidates ($postEqual); + } + + checkMocCandidates (); + + if (@newObs) { + my $ext = ($program =~ /_la$/) ? ".moc.lo " : ".moc.o "; + $realObjs{$program} .= "\034" . join ($ext, @newObs) . $ext; + $dependmocs{$program} = join (".moc.$cxxsuffix " , @newObs) . ".moc.$cxxsuffix"; + foreach $file (@newObs) { + $dep_files .= " \$(DEPDIR)/$file.moc.P" if($dep_files !~/$file.moc.P/); + } + } + if (@depend) { + $dependmocs{$program} .= " "; + $dependmocs{$program} .= join('.moc ', @depend) . ".moc"; + $dependmocs{$program} .= " "; + } + addMocRules (); + @globalmocs{keys %mocFiles}=values %mocFiles; +} + +#----------------------------------------------------------------------------- + +# Returns 0 if the line was processed - 1 otherwise. +# Errors are logged in the global $errorflags +sub tag_AUTOMAKE () +{ + my $lookup = '.*cd \$\(top_srcdir\)\s+&&[\034\s]+\$\(AUTOMAKE\)(.*)'; + return 1 if ($MakefileData !~ /\n($lookup)\n/); + print STDOUT "AUTOMAKE processing <$1>\n" if ($verbose); + + my $newLine = $1."\n\tcd \$(top_srcdir) && perl $thisProg $printname"; + + # automake 1.8.x adds another automake call. *sigh* + $newLine =~ s/;([\034\s]+cd\s+\$\(srcdir\)\s+&&[\034\s]+\$\(AUTOMAKE\).*)[\034\s]+\&\&[\034\s]+exit[\034\s]+0;([\034\s]+exit\s+1)/; \034 ( $1 ) || exit 1; echo \' cd \$(top_srcdir) && perl $thisProg \'; cd \$(top_srcdir) && perl $thisProg && exit 0; $2/; + substituteLine ($lookup, $newLine); + $automkCall = $1; + + $lookup = '.*cd \$\(srcdir\)\s+&&[\034\s]+\$\(AUTOCONF\)(.*)'; + if ($MakefileData =~ /\n($lookup)\n/) { + $newLine = "\tcd \$(srcdir) && rm -f configure\n"; + $newLine .= "\tcd \$(top_srcdir) && \$(MAKE) -f admin/Makefile.common configure"; + substituteLine ($lookup, $newLine); + } + + return 0; +} + +#----------------------------------------------------------------------------- + +sub handle_TOPLEVEL() +{ + my $pofiles = ""; + my @restfiles = (); + opendir (THISDIR, "."); + foreach $entry (readdir(THISDIR)) { + next if (-d $entry); + + next if ($entry eq "CVS" || $entry =~ /^\./ || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^\#.*\#$/ || $entry =~ /.gmo$/); + + if ($entry =~ /\.po$/) { + next; + } + push(@restfiles, $entry); + } + closedir (THISDIR); + + if (@restfiles) { + $target_adds{"install-data-am"} .= "install-nls-files "; + $lines = "install-nls-files:\n"; + $lines .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_locale)/$kdelang\n"; + for $file (@restfiles) { + $lines .= "\t\$(INSTALL_DATA) \$\(srcdir\)/$file \$(DESTDIR)\$(kde_locale)/$kdelang/$file\n"; + } + $target_adds{"uninstall"} .= "uninstall-nls-files "; + $lines .= "uninstall-nls-files:\n"; + for $file (@restfiles) { + $lines .= "\t-rm -f \$(DESTDIR)\$(kde_locale)/$kdelang/$file\n"; + } + appendLines($lines); + } + + return 0; +} + +#----------------------------------------------------------------------------- + +sub tag_SUBDIRS () +{ + if ($MakefileData !~ /\nSUBDIRS\s*=\s*\$\(AUTODIRS\)\s*\n/) { + return 1; + } + + my $subdirs = "."; + + opendir (THISDIR, "."); + foreach $entry (readdir(THISDIR)) { + next if ($entry eq "CVS" || $entry =~ /^\./); + if (-d $entry && -f $entry . "/Makefile.am") { + $subdirs .= " $entry"; + next; + } + } + closedir (THISDIR); + + substituteLine('SUBDIRS\s*=.*', "SUBDIRS =$subdirs"); + return 0; +} + +sub tag_IDLFILES () +{ + my @psources = split(/[\034\s]+/, $sources{$program}); + my $dep_lines = ""; + my @cppFiles = (); + + foreach $source (@psources) { + my $skel = ($source =~ m/\.skel$/); + my $stub = ($source =~ m/\.stub$/); + my $signals = ($source =~ m/\.signals$/); # obsolete, remove in KDE-4 + + if ($stub || $skel || $signals) { + + my $qs = quotemeta($source); + $sources{$program} =~ s/$qs//; + $sources_changed{$program} = 1; + + $source =~ s/\.(stub|skel|signals)$//; + my $sourcename; + + if ($skel) { + $sourcename = "$source\_skel"; + } elsif ($stub) { + $sourcename = "$source\_stub"; + } else { + $sourcename = "$source\_signals"; + } + + my $sourcedir = ''; + if (-f "$makefileDir/$source.h") { + $sourcedir = '$(srcdir)/'; + } else { + if ($MakefileData =~ /\n$source\_DIR\s*=\s*(\S+)\n/) { + $sourcedir = $1; + $sourcedir .= "/" if ($sourcedir !~ /\/$/); + } + } + + if ($allidls !~ /$source\_kidl/) { + + $use_ng = ($MakefileData =~ /\n$source\_DCOPIDLNG\s*=\s*(\S+)\n/); + $dcopidl = $use_ng ? "KDECONFIG=\"\$(KDECONFIG)\" \$(DCOPIDLNG)" : "\$(DCOPIDL)"; + + $dep_lines .= "$source.kidl: $sourcedir$source.h \$(DCOP_DEPENDENCIES)\n"; + $dep_lines .= "\t$dcopidl $sourcedir$source.h > $source.kidl || ( rm -f $source.kidl ; false )\n"; + + $allidls .= $source . "_kidl "; + } + + if ($allidls !~ /$sourcename/) { + + $dep_lines_tmp = ""; + + if ($skel) { + $dep_lines .= "$sourcename.$cxxsuffix: $source.kidl\n"; + $dep_lines .= "\t\$(DCOPIDL2CPP) --c++-suffix $cxxsuffix --no-signals --no-stub $source.kidl\n"; + } elsif ($stub) { + $dep_lines_tmp = "\t\$(DCOPIDL2CPP) --c++-suffix $cxxsuffix --no-signals --no-skel $source.kidl\n"; + } else { # signals - obsolete, remove in KDE 4 + $dep_lines_tmp = "\t\$(DCOPIDL2CPP) --c++-suffix $cxxsuffix --no-stub --no-skel $source.kidl\n"; + } + + if ($stub || $signals) { + $target_adds{"$sourcename.$cxxsuffix"} .= "$sourcename.h "; + $dep_lines .= "$sourcename.h: $source.kidl\n"; + $dep_lines .= $dep_lines_tmp; + } + + $allidls .= $sourcename . " "; + } + + $idlfiles{$program} .= $sourcename . " "; + + if ($program =~ /_la$/) { + $realObjs{$program} .= " $sourcename.lo"; + } else { + $realObjs{$program} .= " $sourcename.\$(OBJEXT)"; + } + $sources{$program} .= " $sourcename.$cxxsuffix"; + $sources_changed{$program} = 1; + $important{$program} .= "$sourcename.h " if (!$skel); + $idl_output .= "\\\n\t$sourcename.$cxxsuffix $sourcename.h $source.kidl "; + push(@cleanfiles, "$sourcename.$cxxsuffix"); + push(@cleanfiles, "$sourcename.h"); + push(@cleanfiles, "$sourcename.kidl"); + $dep_files .= " \$(DEPDIR)/$sourcename.P" if ($dep_files !~/$sourcename.P/); + } + } + if ($dep_lines) { + appendLines($dep_lines); + } + + if (0) { + my $lookup = "($program)"; + $lookup .= '(|\$\(EXEEXT\))'; + $lookup =~ s/\_/./g; + $lookup .= ":(.*..$program\_OBJECTS..*)"; + # $lookup = quotemeta($lookup); + if ($MakefileData =~ /\n$lookup\n/) { + + my $line = "$1$2: "; + foreach $file (split(' ', $idlfiles{$program})) { + $line .= "$file.$cxxsuffix "; + } + $line .= $3; + substituteLine($lookup, $line); + } else { + print STDERR "no built dependency found $lookup\n"; + } + } +} + +sub tag_UIFILES () +{ + my @psources = split(/[\034\s]+/, $sources{$program}); + my @depFiles = (); + + foreach $source (@psources) { + + if ($source =~ m/\.ui$/) { + + print STDERR "adding UI file $source\n" if ($verbose); + + my $qs = quotemeta($source); + $sources{$program} =~ s/$qs//; + $sources_changed{$program} = 1; + + $source =~ s/\.ui$//; + + my $sourcedir = ''; + if (-f "$makefileDir/$source.ui") { + $sourcedir = '$(srcdir)/'; + } + + if (!$uiFiles{$source}) { + + my $dep_lines = "$source.$cxxsuffix: $sourcedir$source.ui $source.h $source.moc\n"; + $dep_lines .= "\trm -f $source.$cxxsuffix\n"; + if (!$kdeopts{"qtonly"}) { +# $dep_lines .= "\techo '#include ' > $source.$cxxsuffix\n"; +# $dep_lines .= "\techo '#include ' >> $source.$cxxsuffix\n"; + $dep_lines .= "\techo '#include \"misc.h\"' > $source.$cxxsuffix\n"; + my ($mangled_source) = $source; + $mangled_source =~ s/[^A-Za-z0-9]/_/g; # get rid of garbage + $dep_lines .= "\t\$(UIC) -tr \${UIC_TR} -i $source.h $sourcedir$source.ui > $source.$cxxsuffix.temp ; ret=\$\$?; \\\n"; + $dep_lines .= "\t\$(PERL) -pe \"s,\${UIC_TR}( \\\"\\\" ),QString::null,g\" $source.$cxxsuffix.temp | \$(PERL) -pe \"s,\${UIC_TR}( \\\"\\\"\\, \\\"\\\" ),QString::null,g\" | \$(PERL) -pe \"s,image([0-9][0-9]*)_data,img\\\$\$1_" . $mangled_source . ",g\" >> $source.$cxxsuffix ;\\\n"; + $dep_lines .= "\trm -f $source.$cxxsuffix.temp ;\\\n"; + } else { + $dep_lines .= "\t\$(UIC) -i $source.h $sourcedir$source.ui > $source.$cxxsuffix; ret=\$\$?; \\\n"; + } + $dep_lines .= "\tif test \"\$\$ret\" = 0; then echo '#include \"$source.moc\"' >> $source.$cxxsuffix; else rm -f $source.$cxxsuffix ; exit \$\$ret ; fi\n\n"; + $dep_lines .= "$source.h: $sourcedir$source.ui\n"; + $dep_lines .= "\t\$(UIC) -o $source.h $sourcedir$source.ui\n\n"; + $dep_lines .= "$source.moc: $source.h\n"; + $dep_lines .= "\t\$(MOC) $source.h -o $source.moc\n"; + + $rule_adds{"$source.$cxxsuffix"} = $dep_lines; + + $uiFiles{$source} = 1; + $dependmocs{$program} .= " $source.moc"; + $globalmocs{$source} = "\035$source.h\035$source.cpp"; + } + + if ($program =~ /_la$/) { + $realObjs{$program} .= " $source.lo"; + } else { + $realObjs{$program} .= " $source.\$(OBJEXT)"; + } + $sources{$program} .= " $source.$cxxsuffix"; + $sources_changed{$program} = 1; + $important{$program} .= "$source.h "; + $ui_output .= "\\\n\t$source.$cxxsuffix $source.h $source.moc "; + push(@cleanfiles, "$source.$cxxsuffix"); + push(@cleanfiles, "$source.h"); + push(@cleanfiles, "$source.moc"); + $dep_files .= " \$(DEPDIR)/$source.P" if($dep_files !~/$source.P/ ); + } + } +} + +sub tag_KCFGFILES () +{ + my @psources = split(/[\034\s]+/, $sources{$program}); + my @depFiles = (); + + foreach $source (@psources) { + + if ($source =~ m/\.kcfgc$/) { + + print STDERR "adding KCFG file $source\n" if ($verbose); + + my $qs = quotemeta($source); + $sources{$program} =~ s/$qs//; + $sources_changed{$program} = 1; + + $source =~ s/\.kcfgc$//; + + my $sourcedir = ''; + if (-f "$makefileDir/$source.kcfgc") { + $sourcedir = '$(srcdir)/'; + } + + if (!$kcfgFiles{$source}) { + $kcfg = "$program.kcfg"; + findKcfgFile("$source.kcfgc"); + + my $fixsuffix = ""; + $fixsuffix = "else mv $source.cpp $source.$cxxsuffix ; " + unless "cpp" eq $cxxsuffix; + + my $dep_lines = "$source.$cxxsuffix: $source.h\n"; + $dep_lines .= "$source.h: $sourcedir$kcfg $sourcedir$source.kcfgc \$(KCFG_DEPENDENCIES)\n"; + $dep_lines .= "\t\$(KCONFIG_COMPILER) $sourcedir$kcfg $sourcedir$source.kcfgc; ret=\$\$?; \\\n"; + $dep_lines .= "\tif test \"\$\$ret\" != 0; then rm -f $source.h ; exit \$\$ret ; $fixsuffix fi\n\n"; + + $rule_adds{"$source.$cxxsuffix"} = $dep_lines; + + $kcfgFiles{$source} = 1; + } + + if ($program =~ /_la$/) { + $realObjs{$program} .= " $source.lo"; + } else { + $realObjs{$program} .= " $source.\$(OBJEXT)"; + } + $sources{$program} .= " $source.$cxxsuffix"; + $sources_changed{$program} = 1; + $important{$program} .= "$source.h "; + $kcfg_output .= "\\\n\t$source.$cxxsuffix $source.h "; + push(@cleanfiles, "$source.$cxxsuffix"); + push(@cleanfiles, "$source.h"); + $dep_files .= " \$(DEPDIR)/$source.P" if($dep_files !~/$source.P/ ); + } + } +} + +sub tag_ICON() +{ + my $lookup = '([^\s]*)_ICON\s*=[ \t]*(.*)'; + my $install = ""; + my $uninstall = ""; + + while ($MakefileData =~ /\n$lookup/g) { + my $destdir; + if ($1 eq "KDE") { + $destdir = "kde_icondir"; + } else { + $destdir = $1 . "dir"; + } + my $iconauto = ($2 =~ /AUTO\s*$/); + my @appnames = (); + if ( ! $iconauto ) { + my $appicon_str = $2; + my @_appnames = split(" ", $appicon_str); + print STDOUT "KDE_ICON processing <@_appnames>\n" if ($verbose); + foreach $appname (@_appnames) { + push(@appnames, quotemeta($appname)); + } + } else { + print STDOUT "KDE_ICON processing \n" if ($verbose); + } + + my @files = (); + opendir (THISDIR, "."); + foreach $entry (readdir(THISDIR)) { + next if ($entry eq "CVS" || $entry =~ /^\./ || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^\#.*\#$/); + next if (! -f $entry); + if ( $iconauto ) + { + push(@files, $entry) + if ($entry =~ /\.xpm/ || $entry =~ /\.png/ || $entry =~ /\.mng/ || $entry =~ /\.svg/); + } else { + foreach $appname (@appnames) { + push(@files, $entry) + if ($entry =~ /-$appname\.xpm/ || $entry =~ /-$appname\.png/ || $entry =~ /-$appname\.mng/ || $entry =~ /-$appname\.svg/); + } + } + } + closedir (THISDIR); + + my %directories = (); + + foreach $file (@files) { + my $newfile = $file; + my $prefix = $file; + $prefix =~ s/\.(png|xpm|mng|svg|svgz)$//; + my $appname = $prefix; + $appname =~ s/^[^-]+-// if ($appname =~ /-/) ; + $appname =~ s/^[^-]+-// if ($appname =~ /-/) ; + $appname = quotemeta($appname); + $prefix =~ s/$appname$//; + $prefix =~ s/-$//; + + $prefix = 'lo16-app' if ($prefix eq 'mini'); + $prefix = 'lo32-app' if ($prefix eq 'lo'); + $prefix = 'hi48-app' if ($prefix eq 'large'); + $prefix .= '-app' if ($prefix =~ m/^...$/); + + my $type = $prefix; + $type =~ s/^.*-([^-]+)$/$1/; + $prefix =~ s/^(.*)-[^-]+$/$1/; + + my %type_hash = + ( + 'action' => 'actions', + 'app' => 'apps', + 'device' => 'devices', + 'filesys' => 'filesystems', + 'mime' => 'mimetypes' + ); + + if (! defined $type_hash{$type} ) { + print STDERR "unknown icon type $type in $printname ($file)\n"; + next; + } + + my %dir_hash = + ( + 'los' => 'locolor/16x16', + 'lom' => 'locolor/32x32', + 'him' => 'hicolor/32x32', + 'hil' => 'hicolor/48x48', + 'lo16' => 'locolor/16x16', + 'lo22' => 'locolor/22x22', + 'lo32' => 'locolor/32x32', + 'hi16' => 'hicolor/16x16', + 'hi22' => 'hicolor/22x22', + 'hi32' => 'hicolor/32x32', + 'hi48' => 'hicolor/48x48', + 'hi64' => 'hicolor/64x64', + 'hi128' => 'hicolor/128x128', + 'hisc' => 'hicolor/scalable', + 'cr16' => 'crystalsvg/16x16', + 'cr22' => 'crystalsvg/22x22', + 'cr32' => 'crystalsvg/32x32', + 'cr48' => 'crystalsvg/48x48', + 'cr64' => 'crystalsvg/64x64', + 'cr128' => 'crystalsvg/128x128', + 'crsc' => 'crystalsvg/scalable' + ); + + $newfile =~ s@.*-($appname\.(png|xpm|mng|svgz|svg?))@$1@; + + if (! defined $dir_hash{$prefix}) { + print STDERR "unknown icon prefix $prefix in $printname\n"; + next; + } + + my $dir = $dir_hash{$prefix} . "/" . $type_hash{$type}; + if ($newfile =~ /-[^\.]/) { + my $tmp = $newfile; + $tmp =~ s/^([^-]+)-.*$/$1/; + $dir = $dir . "/" . $tmp; + $newfile =~ s/^[^-]+-//; + } + + if (!defined $directories{$dir}) { + $install .= "\t\$(mkinstalldirs) \$(DESTDIR)\$($destdir)/$dir\n"; + $directories{$dir} = 1; + } + + $install .= "\t\$(INSTALL_DATA) \$(srcdir)/$file \$(DESTDIR)\$($destdir)/$dir/$newfile\n"; + $uninstall .= "\t-rm -f \$(DESTDIR)\$($destdir)/$dir/$newfile\n"; + + } + } + + if (length($install)) { + $target_adds{"install-data-am"} .= "install-kde-icons "; + $target_adds{"uninstall-am"} .= "uninstall-kde-icons "; + appendLines("install-kde-icons:\n" . $install . "\nuninstall-kde-icons:\n" . $uninstall); + } +} + +sub handle_POFILES($$) +{ + my @pofiles = split(" ", $_[0]); + my $lang = $_[1]; + + # Build rules for creating the gmo files + my $tmp = ""; + my $allgmofiles = ""; + my $pofileLine = "POFILES ="; + foreach $pofile (@pofiles) + { + $pofile =~ /(.*)\.[^\.]*$/; # Find name minus extension + $tmp .= "$1.gmo: $pofile\n"; + $tmp .= "\trm -f $1.gmo; \$(GMSGFMT) -o $1.gmo \$(srcdir)/$pofile\n"; + $tmp .= "\ttest ! -f $1.gmo || touch $1.gmo\n"; + $allgmofiles .= " $1.gmo"; + $pofileLine .= " $1.po"; + } + appendLines ($tmp); + my $lookup = 'POFILES\s*=([^\n]*)'; + if ($MakefileData !~ /\n$lookup/) { + appendLines("$pofileLine\nGMOFILES =$allgmofiles"); + } else { + substituteLine ($lookup, "$pofileLine\nGMOFILES =$allgmofiles"); + } + + if ($allgmofiles) { + + # Add the "clean" rule so that the maintainer-clean does something + appendLines ("clean-nls:\n\t-rm -f $allgmofiles\n"); + + $target_adds{"maintainer-clean"} .= "clean-nls "; + + $lookup = 'DISTFILES\s*=[ \t]*(.*)'; + if ($MakefileData =~ /\n$lookup/) { + $tmp = "DISTFILES = \$(GMOFILES) \$(POFILES) $1"; + substituteLine ($lookup, $tmp); + } + } + + $target_adds{"install-data-am"} .= "install-nls "; + + $tmp = "install-nls:\n"; + if ($lang) { + $tmp .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES\n"; + } + $tmp .= "\t\@for base in "; + foreach $pofile (@pofiles) + { + $pofile =~ /(.*)\.[^\.]*$/; # Find name minus extension + $tmp .= "$1 "; + } + + $tmp .= "; do \\\n"; + if ($lang) { + $tmp .= "\t echo \$(INSTALL_DATA) \$\$base.gmo \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES/\$\$base.mo ;\\\n"; + $tmp .= "\t if test -f \$\$base.gmo; then \$(INSTALL_DATA) \$\$base.gmo \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES/\$\$base.mo ;\\\n"; + $tmp .= "\t elif test -f \$(srcdir)/\$\$base.gmo; then \$(INSTALL_DATA) \$(srcdir)/\$\$base.gmo \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES/\$\$base.mo ;\\\n"; + $tmp .= "\t fi ;\\\n"; + } else { + $tmp .= "\t echo \$(INSTALL_DATA) \$\$base.gmo \$(DESTDIR)\$(kde_locale)/\$\$base/LC_MESSAGES/\$(PACKAGE).mo ;\\\n"; + $tmp .= "\t \$(mkinstalldirs) \$(DESTDIR)\$(kde_locale)/\$\$base/LC_MESSAGES ; \\\n"; + $tmp .= "\t if test -f \$\$base.gmo; then \$(INSTALL_DATA) \$\$base.gmo \$(DESTDIR)\$(kde_locale)/\$\$base/LC_MESSAGES/\$(PACKAGE).mo ;\\\n"; + $tmp .= "\t elif test -f \$(srcdir)/\$\$base.gmo; then \$(INSTALL_DATA) \$(srcdir)/\$\$base.gmo \$(DESTDIR)\$(kde_locale)/\$\$base/LC_MESSAGES/\$(PACKAGE).mo ;\\\n"; + $tmp .= "\t fi ;\\\n"; + } + $tmp .= "\tdone\n\n"; + appendLines ($tmp); + + $target_adds{"uninstall"} .= "uninstall-nls "; + + $tmp = "uninstall-nls:\n"; + foreach $pofile (@pofiles) + { + $pofile =~ /(.*)\.[^\.]*$/; # Find name minus extension + if ($lang) { + $tmp .= "\trm -f \$(DESTDIR)\$(kde_locale)/$lang/LC_MESSAGES/$1.mo\n"; + } else { + $tmp .= "\trm -f \$(DESTDIR)\$(kde_locale)/$1/LC_MESSAGES/\$(PACKAGE).mo\n"; + } + } + appendLines($tmp); + + $target_adds{"all"} .= "all-nls "; + + $tmp = "all-nls: \$(GMOFILES)\n"; + + appendLines($tmp); + + $target_adds{"distdir"} .= "distdir-nls "; + + $tmp = "distdir-nls:\$(GMOFILES)\n"; + $tmp .= "\tfor file in \$(POFILES); do \\\n"; + $tmp .= "\t cp \$(srcdir)/\$\$file \$(distdir); \\\n"; + $tmp .= "\tdone\n"; + $tmp .= "\tfor file in \$(GMOFILES); do \\\n"; + $tmp .= "\t cp \$(srcdir)/\$\$file \$(distdir); \\\n"; + $tmp .= "\tdone\n"; + + appendLines ($tmp); + + if (!$lang) { + appendLines("merge:\n\t\$(MAKE) -f \$(top_srcdir)/admin/Makefile.common package-merge POFILES=\"\${POFILES}\" PACKAGE=\${PACKAGE}\n\n"); + } + +} + +#----------------------------------------------------------------------------- + +# Returns 0 if the line was processed - 1 otherwise. +# Errors are logged in the global $errorflags +sub tag_POFILES () +{ + my $lookup = 'POFILES\s*=([^\n]*)'; + return 1 if ($MakefileData !~ /\n$lookup/); + print STDOUT "POFILES processing <$1>\n" if ($verbose); + + my $tmp = $1; + + # make sure these are all gone. + if ($MakefileData =~ /\n\.po\.gmo:\n/) + { + print STDERR "Warning: Found old .po.gmo rules in $printname. New po rules not added\n"; + return 1; + } + + # Either find the pofiles in the directory (AUTO) or use + # only the specified po files. + my $pofiles = ""; + if ($tmp =~ /^\s*AUTO\s*$/) + { + opendir (THISDIR, "."); + $pofiles = join(" ", grep(/\.po$/, readdir(THISDIR))); + closedir (THISDIR); + print STDOUT "pofiles found = $pofiles\n" if ($verbose); + if (-f "charset" && -f "kdelibs/kdelibs.po") { + handle_TOPLEVEL(); + } + } + else + { + $tmp =~ s/\034/ /g; + $pofiles = $tmp; + } + return 1 if (!$pofiles); # Nothing to do + + handle_POFILES($pofiles, $kdelang); + + return 0; +} + +sub helper_LOCALINSTALL($) +{ + my $lookup = "\035" . $_[0] . " *:[^\035]*\035\t"; + my $copy = $MakefileData; + $copy =~ s/\n/\035/g; + if ($copy =~ /($lookup.*)$/) { + + $install = $1; + $install =~ s/\035$_[0] *:[^\035]*\035//; + my $emptyline = 0; + while (! $emptyline ) { + if ($install =~ /([^\035]*)\035(.*)/) { + local $line = $1; + $install = $2; + if ($line !~ /^\s*$/ && $line !~ /^(\@.*\@)*\t/) { + $emptyline = 1; + } else { + replaceDestDir($line); + } + } else { + $emptyline = 1; + } + } + } + +} + +sub tag_LOCALINSTALL () +{ + helper_LOCALINSTALL('install-exec-local'); + helper_LOCALINSTALL('install-data-local'); + helper_LOCALINSTALL('uninstall-local'); + + return 0; +} + +sub replaceDestDir($) { + local $line = $_[0]; + + if ( $line =~ /^\s*(\@.*\@)*\s*\$\(mkinstalldirs\)/ + || $line =~ /^\s*(\@.*\@)*\s*\$\(INSTALL\S*\)/ + || $line =~ /^\s*(\@.*\@)*\s*(-?rm.*) \S*$/) + { + $line =~ s/^(.*) ([^\s]+)\s*$/$1 \$(DESTDIR)$2/ if ($line !~ /\$\(DESTDIR\)/); + } + + if ($line ne $_[0]) { + $_[0] = quotemeta $_[0]; + substituteLine($_[0], $line); + } +} + +#--------------------------------------------------------------------------- +# libtool is very hard to persuade it could use -Wl,--no-undefined for making +# -no-undefined actually work +# append $(KDE_NO_UNFINED) after every -no-undefined in LDFLAGS +# this may go away if libtool ever does this on its own +sub tag_NO_UNDEFINED () { + return if ($program !~ /_la$/); + + my $lookup = quotemeta($realname{$program}) . ":.*?\n\t.*?\\((.*?)\\) .*\n"; + $MakefileData =~ m/$lookup/; + return if (!defined($1)); + return if ($1 !~ /CXXLINK/); + + if ($MakefileData !~ /\n$program\_LDFLAGS\s*=.*-no-undefined/ ) { + return; + } + + $lookup = $program . '\_LDFLAGS(\s*)=(.*)-no-undefined(.*)'; + if ($MakefileData =~ /\n$lookup\n/) { + my $replace = $program . "\_LDFLAGS$1=$2-no-undefined \$(KDE_NO_UNDEFINED)$3"; + substituteLine($lookup, $replace); + } +} + +sub tag_CLOSURE () { + return if ($program !~ /_la$/); + + my $lookup = quotemeta($realname{$program}) . ":.*?\n\t.*?\\((.*?)\\) .*\n"; + $MakefileData =~ m/$lookup/; + return if (!defined($1)); + return if ($1 !~ /CXXLINK/); + + if ($MakefileData !~ /\n$program\_LDFLAGS\s*=.*-no-undefined/ && + $MakefileData !~ /\n$program\_LDFLAGS\s*=.*KDE_PLUGIN/ ) { + print STDERR "Report: $program contains undefined in $printname\n" if ($program =~ /^lib/ && $dryrun); + return; + } + + my $closure = $realname{$program} . ".closure"; + my $lines = "$closure: \$($program\_OBJECTS) \$($program\_DEPENDENCIES)\n"; + $lines .= "\t\@echo \"int main() {return 0;}\" > $program\_closure.$cxxsuffix\n"; + $lines .= "\t\@\$\(LTCXXCOMPILE\) -c $program\_closure.$cxxsuffix\n"; + $lines .= "\t\$\(CXXLINK\) $program\_closure.lo \$($program\_LDFLAGS) \$($program\_OBJECTS) \$($program\_LIBADD) \$(LIBS)\n"; + $lines .= "\t\@rm -f $program\_closure.* $closure\n"; + $lines .= "\t\@echo \"timestamp\" > $closure\n"; + $lines .= "\n"; + appendLines($lines); + $lookup = $realname{$program} . ": (.*)"; + if ($MakefileData =~ /\n$lookup\n/) { + $lines = "\@KDE_USE_CLOSURE_TRUE@". $realname{$program} . ": $closure $1"; + $lines .= "\n\@KDE_USE_CLOSURE_FALSE@" . $realname{$program} . ": $1"; + substituteLine($lookup, $lines); + } + $closure_output .= " $closure"; +} + +sub tag_NMCHECK () { + return if ($program !~ /_la$/); + my $lookup = quotemeta($realname{$program}) . ":.*?\n\t.*?\\((.*?)\\) .*\n"; + $MakefileData =~ m/$lookup/; + my $linkcmd = $1; + return if (!defined($1)); + return if ($linkcmd !~ /CXXLINK/ && $linkcmd !~ /LINK/); + + $lookup = $program . '_NMCHECK\s*=([^\n]*)'; + if( $MakefileData !~ m/\n$lookup\n/ ) { + return; + } + my $allowed = $1; + $allowed =~ s/^ *//; + $lookup = $program . '_NMCHECKWEAK\s*=([^\n]*)'; + my $weak = ""; + my $is_weak = 0; + if( $MakefileData =~ m/\n$lookup\n/ ) { + $weak = $1; + $is_weak = 1; + } + $weak =~ s/^ *//; + + if( $is_weak ) + { + $weak = '--allowweak=\'' . $weak . '\' '; + } + my $nmline = "\@KDE_USE_NMCHECK_TRUE@\t\@\$(MAKE) \$(AM_MAKEFLAGS) nmcheck_$realname{$program} || ( rm -f $realname{$program}; exit 1 )"; + $lookup = '(\t\$\(CXXLINK\)[^\n]*' . $program . '_OBJECTS[^\n]*)'; + if( $MakefileData =~ /\n$lookup\n/ ) { + my $oldstuff = $1; + substituteLine( $lookup, $oldstuff . "\n" . $nmline ); + } + $lookup = '(\t\$\(LINK\)[^\n]*' . $program . '_OBJECTS[^\n]*)'; + if( $MakefileData =~ /\n$lookup\n/ ) { + my $oldstuff = $1; + substituteLine( $lookup, $oldstuff . "\n" . $nmline ); + } + $nmline = "\@\$(top_srcdir)/admin/nmcheck $realname{$program} \'$allowed\' $weak"; + appendLines( "\nnmcheck_$realname{$program}: $realname{$program} \n\t$nmline\n" ); + $target_adds{ "nmcheck" } .= "nmcheck_$realname{$program} "; +} + +sub tag_DIST () { + my %foundfiles = (); + opendir (THISDIR, "."); + foreach $entry (readdir(THISDIR)) { + next if ($entry eq "CVS" || $entry =~ /^\./ || $entry eq "Makefile" || $entry =~ /~$/ || $entry =~ /^\#.*\#$/); + next if (! -f $entry); + next if ($entry =~ /\.moc/ || $entry =~ /\.moc.$cppExt$/ || $entry =~ /\.lo$/ || $entry =~ /\.la$/ || $entry =~ /\.o/); + next if ($entry =~ /\.all_$cppExt\.$cppExt$/); + $foundfiles{$entry} = 1; + } + closedir (THISDIR); + + # doing this for MAINTAINERCLEANFILES would be wrong + my @marks = ("EXTRA_DIST", "DIST_COMMON", '\S*_SOURCES', '\S*_HEADERS', 'CLEANFILES', 'DISTCLEANFILES', '\S*_OBJECTS'); + foreach $mark (@marks) { + while ($MakefileData =~ /\n($mark)\s*=[ \t]*([^\n]*)/g) { + my $cleanfiles_str = $2; + foreach $file (split('[\034\s]+', $cleanfiles_str)) { + $file =~ s/\.\///; + $foundfiles{$file} = 0 if (defined $foundfiles{$file}); + } + } + } + my @files = ("Makefile", "config.cache", "config.log", "stamp-h", + "stamp-h1", "stamp-h1", "config.h", "Makefile", + "config.status", "config.h", "libtool", "core" ); + foreach $file (@files) { + $foundfiles{$file} = 0 if (defined $foundfiles{$file}); + } + + my $KDE_DIST = ""; + foreach $file (keys %foundfiles) { + if ($foundfiles{$file} == 1) { + $KDE_DIST .= "$file "; + } + } + if ($KDE_DIST) { + print "KDE_DIST $printname $KDE_DIST\n" if ($verbose); + + my $lookup = 'DISTFILES\s*=[ \t]*(.*)'; + if ($MakefileData =~ /\n$lookup/) { + substituteLine($lookup, "DISTFILES = $1 \$(KDE_DIST)"); + appendLines("KDE_DIST=$KDE_DIST\n"); + } + } +} + +#----------------------------------------------------------------------------- +# Returns 0 if the line was processed - 1 otherwise. +# Errors are logged in the global $errorflags +sub tag_DOCFILES () +{ + $target_adds{"all"} .= "docs-am "; + + my $lookup = 'KDE_DOCS\s*=[ \t]*([^\n]*)'; + goto nodocs if ($MakefileData !~ /\n$lookup/); + print STDOUT "KDE_DOCS processing <$1>\n" if ($verbose); + + my $tmp = $1; + + # Either find the files in the directory (AUTO) or use + # only the specified po files. + my $files = ""; + my $appname = $tmp; + $appname =~ s/^(\S*)\s*.*$/$1/; + if ($appname =~ /AUTO/) { + $appname = basename($makefileDir); + if ("$appname" eq "en") { + print STDERR "Error: KDE_DOCS = AUTO relies on the directory name. Yours is 'en' - you most likely want something else, e.g. KDE_DOCS = myapp\n"; + exit(1); + } + } + + if ($tmp !~ / - /) + { + opendir (THISDIR, "."); + foreach $entry (readdir(THISDIR)) { + next if ($entry eq "CVS" || $entry =~ /^\./ || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^\#.*\#$/ || $entry eq "core" || $entry eq "index.cache.bz2"); + next if (! -f $entry); + $files .= "$entry "; + } + closedir (THISDIR); + print STDOUT "docfiles found = $files\n" if ($verbose); + } + else + { + $tmp =~ s/\034/ /g; + $tmp =~ s/^\S*\s*-\s*//; + $files = $tmp; + } + goto nodocs if (!$files); # Nothing to do + + if ($files =~ /(^| )index\.docbook($| )/) { + + my $lines = ""; + my $lookup = 'MEINPROC\s*='; + if ($MakefileData !~ /\n($lookup)/) { + $lines = "MEINPROC=/\$(kde_bindir)/meinproc\n"; + } + $lookup = 'KDE_XSL_STYLESHEET\s*='; + if ($MakefileData !~ /\n($lookup)/) { + $lines .= "KDE_XSL_STYLESHEET=/\$(kde_datadir)/ksgmltools2/customization/kde-chunk.xsl\n"; + } + $lookup = '\nindex.cache.bz2:'; + if ($MakefileData !~ /\n($lookup)/) { + $lines .= "index.cache.bz2: \$(srcdir)/index.docbook \$(KDE_XSL_STYLESHEET) $files\n"; + $lines .= "\t\@if test -n \"\$(MEINPROC)\"; then echo \$(MEINPROC) --check --cache index.cache.bz2 \$(srcdir)/index.docbook; \$(MEINPROC) --check --cache index.cache.bz2 \$(srcdir)/index.docbook; fi\n"; + $lines .= "\n"; + } + + $lines .= "docs-am: index.cache.bz2\n"; + $lines .= "\n"; + $lines .= "install-docs: docs-am install-nls\n"; + $lines .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname\n"; + $lines .= "\t\@if test -f index.cache.bz2; then \\\n"; + $lines .= "\techo \$(INSTALL_DATA) index.cache.bz2 \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/; \\\n"; + $lines .= "\t\$(INSTALL_DATA) index.cache.bz2 \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/; \\\n"; + $lines .= "\telif test -f \$(srcdir)/index.cache.bz2; then \\\n"; + $lines .= "\techo \$(INSTALL_DATA) \$(srcdir)/index.cache.bz2 \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/; \\\n"; + $lines .= "\t\$(INSTALL_DATA) \$(srcdir)/index.cache.bz2 \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/; \\\n"; + $lines .= "\tfi\n"; + $lines .= "\t-rm -f \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/common\n"; + $lines .= "\t\$(LN_S) \$(kde_libs_htmldir)/$kdelang/common \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/common\n"; + + $lines .= "\n"; + $lines .= "uninstall-docs:\n"; + $lines .= "\t-rm -rf \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname\n"; + $lines .= "\n"; + $lines .= "clean-docs:\n"; + $lines .= "\t-rm -f index.cache.bz2\n"; + $lines .= "\n"; + $target_adds{"install-data-am"} .= "install-docs "; + $target_adds{"uninstall"} .= "uninstall-docs "; + $target_adds{"clean-am"} .= "clean-docs "; + appendLines ($lines); + } else { + appendLines("docs-am: $files\n"); + } + + $target_adds{"install-data-am"} .= "install-nls "; + $target_adds{"uninstall"} .= "uninstall-nls "; + + $tmp = "install-nls:\n"; + $tmp .= "\t\$(mkinstalldirs) \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname\n"; + $tmp .= "\t\@for base in $files; do \\\n"; + $tmp .= "\t echo \$(INSTALL_DATA) \$\$base \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$base ;\\\n"; + $tmp .= "\t \$(INSTALL_DATA) \$(srcdir)/\$\$base \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$base ;\\\n"; + $tmp .= "\tdone\n"; + if ($appname eq 'common') { + $tmp .= "\t\@echo \"merging common and language specific dir\" ;\\\n"; + $tmp .= "\tif test ! -f \$(kde_htmldir)/en/common/kde-common.css; then echo 'no english docs found in \$(kde_htmldir)/en/common/'; exit 1; fi \n"; + $tmp .= "\t\@com_files=`cd \$(kde_htmldir)/en/common && echo *` ;\\\n"; + $tmp .= "\tcd \$(DESTDIR)\$(kde_htmldir)/$kdelang/common ;\\\n"; + $tmp .= "\tif test -n \"\$\$com_files\"; then for p in \$\$com_files ; do \\\n"; + $tmp .= "\t case \" $files \" in \\\n"; + $tmp .= "\t *\" \$\$p \"*) ;; \\\n"; + $tmp .= "\t *) test ! -f \$\$p && echo \$(LN_S) ../../en/common/\$\$p \$(DESTDIR)\$(kde_htmldir)/$kdelang/common/\$\$p && \$(LN_S) ../../en/common/\$\$p \$\$p ;; \\\n"; + $tmp .= "\t esac ; \\\n"; + $tmp .= "\tdone ; fi ; true\n"; + } + $tmp .= "\n"; + $tmp .= "uninstall-nls:\n"; + $tmp .= "\tfor base in $files; do \\\n"; + $tmp .= "\t rm -f \$(DESTDIR)\$(kde_htmldir)/$kdelang/$appname/\$\$base ;\\\n"; + $tmp .= "\tdone\n\n"; + appendLines ($tmp); + + $target_adds{"distdir"} .= "distdir-nls "; + + $tmp = "distdir-nls:\n"; + $tmp .= "\tfor file in $files; do \\\n"; + $tmp .= "\t cp \$(srcdir)/\$\$file \$(distdir); \\\n"; + $tmp .= "\tdone\n"; + + appendLines ($tmp); + + return 0; + + nodocs: + appendLines("docs-am:\n"); + return 1; +} + +#----------------------------------------------------------------------------- +# Find headers in any of the source directories specified previously, that +# are candidates for "moc-ing". +sub findMocCandidates () +{ + foreach $dir (@headerdirs) + { + my @list = (); + opendir (SRCDIR, "$dir"); + @hFiles = grep { /.+\.$hExt$/o && !/^\./ } readdir(SRCDIR); + closedir SRCDIR; + foreach $hf (@hFiles) + { + next if ($hf =~ /^\.\#/); + $hf =~ /(.*)\.[^\.]*$/; # Find name minus extension + next if ($uiFiles{$1}); + open (HFIN, "$dir/$hf") || die "Could not open $dir/$hf: $!\n"; + my $hfsize = 0; + seek(HFIN, 0, 2); + $hfsize = tell(HFIN); + seek(HFIN, 0, 0); + read HFIN, $hfData, $hfsize; + close HFIN; + # push (@list, $hf) if(index($hfData, "Q_OBJECT") >= 0); ### fast but doesn't handle //Q_OBJECT + # handle " { friend class blah; Q_OBJECT ", but don't match antlarr_Q_OBJECT (\b). + if ( $hfData =~ /{([^}]*)\bQ_OBJECT/s ) { + push (@list, $hf) unless $1 =~ m://[^\n]*Q_OBJECT[^\n]*$:s; ## reject "// Q_OBJECT" + } + } + # The assoc array of root of headerfile and header filename + foreach $hFile (@list) + { + $hFile =~ /(.*)\.[^\.]*$/; # Find name minus extension + if ($mocFiles{$1}) + { + print STDERR "Warning: Multiple header files found for $1\n"; + next; # Use the first one + } + $mocFiles{$1} = "$dir\035$hFile"; # Add relative dir + } + } + + return 0; +} + +#----------------------------------------------------------------------------- + +# The programmer has specified a moc list. Prune out the moc candidates +# list that we found based on looking at the header files. This generates +# a warning if the programmer gets the list wrong, but this doesn't have +# to be fatal here. +sub pruneMocCandidates ($) +{ + my %prunedMoc = (); + local @mocList = split(' ', $_[0]); + + foreach $mocname (@mocList) + { + $mocname =~ s/\.moc$//; + if ($mocFiles{$mocname}) + { + $prunedMoc{$mocname} = $mocFiles{$mocname}; + } + else + { + my $print = $makefileDir; + $print =~ s/^\Q$topdir\E\\//; + # They specified a moc file but we can't find a header that + # will generate this moc file. That's possible fatal! + print STDERR "Warning: No moc-able header file for $print/$mocname\n"; + } + } + + undef %mocFiles; + %mocFiles = %prunedMoc; +} + +#----------------------------------------------------------------------------- + +# Finds the cpp files (If they exist). +# The cpp files get appended to the header file separated by \035 +sub checkMocCandidates () +{ + my @cppFiles; + my $cpp2moc; # which c++ file includes which .moc files + my $moc2cpp; # which moc file is included by which c++ files + + return unless (keys %mocFiles); + opendir(THISDIR, ".") || return; + @cppFiles = grep { /.+\.$cppExt$/o && !/.+\.moc\.$cppExt$/o + && !/.+\.all_$cppExt\.$cppExt$/o + && !/^\./ } readdir(THISDIR); + closedir THISDIR; + return unless (@cppFiles); + my $files = join (" ", @cppFiles); + $cpp2moc = {}; + $moc2cpp = {}; + foreach $cxxf (@cppFiles) + { + open (CXXFIN, $cxxf) || die "Could not open $cxxf: $!\n"; + seek(CXXFIN, 0, 2); + my $cxxfsize = tell(CXXFIN); + seek(CXXFIN, 0, 0); + read CXXFIN, $cxxfData, $cxxfsize; + close CXXFIN; + while(($cxxfData =~ m/^[ \t]*\#include\s*[<\"](.*\.moc)[>\"]/gm)) { + $cpp2moc->{$cxxf}->{$1} = 1; + $moc2cpp->{$1}->{$cxxf} = 1; + } + } + foreach my $mocFile (keys (%mocFiles)) + { + @cppFiles = keys %{$moc2cpp->{"$mocFile.moc"}}; + if (@cppFiles == 1) { + $mocFiles{$mocFile} .= "\035" . $cppFiles[0]; + push(@depend, $mocFile); + } elsif (@cppFiles == 0) { + push (@newObs, $mocFile); # Produce new object file + next if ($haveAutomocTag); # This is expected... + # But this is an error we can deal with - let them know + print STDERR + "Warning: No c++ file that includes $mocFile.moc\n"; + } else { + # We can't decide which file to use, so it's fatal. Although as a + # guess we could use the mocFile.cpp file if it's in the list??? + print STDERR + "Error: Multiple c++ files that include $mocFile.moc\n"; + print STDERR "\t",join ("\t", @cppFiles),"\n"; + $errorflag = 1; + delete $mocFiles{$mocFile}; + # Let's continue and see what happens - They have been told! + } + } +} + +#----------------------------------------------------------------------------- + +# Add the rules for generating moc source from header files +# For Automoc output *.moc.cpp but normally we'll output *.moc +# (We must compile *.moc.cpp separately. *.moc files are included +# in the appropriate *.cpp file by the programmer) +sub addMocRules () +{ + my $cppFile; + my $hFile; + + foreach $mocFile (keys (%mocFiles)) + { + undef $cppFile; + ($dir, $hFile, $cppFile) = split ("\035", $mocFiles{$mocFile}, 3); + $dir =~ s#^\.#\$(srcdir)#; + if (defined ($cppFile)) + { + $cppFile =~ s,\.[^.]*$,,; + $target_adds{"$cppFile.o"} .= "$mocFile.moc "; + $target_adds{"$cppFile.lo"} .= "$mocFile.moc "; + appendLines ("$mocFile.moc: $dir/$hFile\n\t\$(MOC) $dir/$hFile -o $mocFile.moc\n"); + $cleanMoc .= " $mocFile.moc"; + appendLines ("mocs: $mocFile.moc\n"); + } + else + { + appendLines ("$mocFile$mocExt: $dir/$hFile\n\t\$(MOC) $dir/$hFile -o $mocFile$mocExt\n"); + $cleanMoc .= " $mocFile$mocExt"; + appendLines ("mocs: $mocFile$mocExt\n"); + } + } +} + +sub make_bcheck_target() +{ + my $lookup = 'RECURSIVE_TARGETS\s*=[ \t]*(.*)'; + my $bcheckdep = "bcheck-am"; + $bcheckdep = "bcheck-recursive" if ($MakefileData =~ /\n$lookup/); + + my $headers= ""; + $headers = $1 if($MakefileData =~ /\nHEADERS\s*=[ \t]*(.+)/); + $headers =~ s/\$\((?:noinst|EXTRA)_HEADERS\)//g; + + $target_adds{"clean-am"} .= "clean-bcheck "; + + my $t = "clean-bcheck: \n" . + "\trm -f *.bchecktest.cc *.bchecktest.cc.class a.out\n\n" . + "bcheck: $bcheckdep\n\n" . + "bcheck-am:\n" . + "\t\@for i in $headers; do \\\n" . + "\t if test \$(srcdir)/\$\$i -nt \$\$i.bchecktest.cc; then \\\n" . + "\t echo \"int main() {return 0;}\" > \$\$i.bchecktest.cc ; \\\n" . + "\t echo \"#include \\\"\$\$i\\\"\" >> \$\$i.bchecktest.cc ; \\\n" . + "\t echo \"\$\$i\"; \\\n" . + "\t if ! "; + $t .= $cxxsuffix eq "KKK" ? + "\$(CXX) \$(DEFS) -I. -I\$(srcdir) -I\$(top_builddir) \$(INCLUDES) \$(AM_CPPFLAGS) \$(CPPFLAGS) \$(CXXFLAGS) \$(KDE_CXXFLAGS) " : + "\$(CXXCOMPILE) "; + $t .= " --dump-class-hierarchy -c \$\$i.bchecktest.cc; then \\\n" . + "\t rm -f \$\$i.bchecktest.cc; exit 1; \\\n" . + "\t fi ; \\\n" . + "\t echo \"\" >> \$\$i.bchecktest.cc.class; \\\n" . + "\t perl \$(top_srcdir)/admin/bcheck.pl \$\$i.bchecktest.cc.class || { rm -f \$\$i.bchecktest.cc; exit 1; }; \\\n" . + "\t rm -f a.out; \\\n" . + "\t fi ; \\\n" . + "\tdone\n"; + appendLines("$t\n"); +} + +sub make_meta_classes () +{ + return if ($kdeopts{"qtonly"}); + + my $cppFile; + my $hFile; + my $moc_class_headers = ""; + foreach $program (@programs) { + my $mocs = ""; + my @progsources = split(/[\034\s]+/, $sources{$program}); + my @depmocs = split(' ', $dependmocs{$program}); + my %shash = (), %mhash = (); + @shash{@progsources} = 1; # we are only interested in the existence + @mhash{@depmocs} = 1; + + print STDOUT "program=$program\n" if ($verbose); + print STDOUT "psources=[".join(' ', keys %shash)."]\n" if ($verbose); + print STDOUT "depmocs=[".join(' ', keys %mhash)."]\n" if ($verbose); + print STDOUT "globalmocs=[".join(' ', keys(%globalmocs))."]\n" if ($verbose); + foreach my $mocFile (keys (%globalmocs)) + { + my ($dir, $hFile, $cppFile) = split ("\035", $globalmocs{$mocFile}, 3); + if (defined ($cppFile)) + { + $mocs .= " $mocFile.moc" if exists $shash{$cppFile}; + } + else + { + # Bah. This is the case, if no C++ file includes the .moc + # file. We make a .moc.cpp file for that. Unfortunately this + # is not included in the %sources hash, but rather is mentioned + # in %dependmocs. If the user wants to use AUTO he can't just + # use an unspecific METAINCLUDES. Instead he must use + # program_METAINCLUDES. Anyway, it's not working real nicely. + # E.g. Its not clear what happens if user specifies two + # METAINCLUDES=AUTO in the same Makefile.am. + $mocs .= " $mocFile.moc.$cxxsuffix" + if exists $mhash{$mocFile.".moc.$cxxsuffix"}; + } + } + if ($mocs) { + print STDOUT "==> mocs=[".$mocs."]\n" if ($verbose); + } + print STDOUT "\n" if $verbose; + } + if ($moc_class_headers) { + appendLines ("$cleantarget-moc-classes:\n\t-rm -f $moc_class_headers\n"); + $target_adds{"$cleantarget-am"} .= "$cleantarget-moc-classes "; + } +} + +#----------------------------------------------------------------------------- + +sub updateMakefile () +{ + return if ($dryrun); + + open (FILEOUT, "> $makefile") + || die "Could not create $makefile: $!\n"; + + $MakefileData =~ s/\034/\\\n/g; # Restore continuation lines + # Append our $progId line, _below_ the "generated by automake" line + # because automake-1.6 relies on the first line to be his own. + my $progIdLine = "\# $progId - " . '$Revision: 483858 $ '."\n"; + if ( !( $MakefileData =~ s/^(.*generated .*by automake.*\n)/$1$progIdLine/ ) ) { + warn "automake line not found in $makefile\n"; + # Fallback: first line + print FILEOUT $progIdLine; + }; + print FILEOUT $MakefileData; + close FILEOUT; +} + +#----------------------------------------------------------------------------- + +# The given line needs to be removed from the makefile +# Do this by adding the special "removed line" comment at the line start. +sub removeLine ($$) +{ + my ($lookup, $old) = @_; + + $old =~ s/\034/\\\n#>- /g; # Fix continuation lines + $MakefileData =~ s/\n$lookup/\n#>\- $old/; +} + +#----------------------------------------------------------------------------- + +# Replaces the old line with the new line +# old line(s) are retained but tagged as removed. The new line(s) have the +# "added" tag placed before it. +sub substituteLine ($$) +{ + my ($lookup, $new) = @_; + + if ($MakefileData =~ /\n($lookup)/) { + $old = $1; + $old =~ s/\034/\\\n#>\- /g; # Fix continuation lines + my $newCount = ($new =~ tr/\034//) + ($new =~ tr/\n//) + 1; + $new =~ s/\\\n/\034/g; + $MakefileData =~ s/\n$lookup/\n#>- $old\n#>\+ $newCount\n$new/; + } else { + warn "Warning: substitution of \"$lookup\" in $printname failed\n"; + } +} + +#----------------------------------------------------------------------------- + +# Slap new lines on the back of the file. +sub appendLines ($) +{ + my ($new) = @_; + my $copynew = $new; + my $newCount = ($new =~ tr/\034//) + ($new =~ tr/\n//) + 1; + $new =~ s/\\\n/\034/g; # Fix continuation lines + $MakefileData .= "\n#>\+ $newCount\n$new"; +} + +#----------------------------------------------------------------------------- + +# Restore the Makefile.in to the state it was before we fiddled with it +sub restoreMakefile () +{ + $MakefileData =~ s/# $progId[^\n\034]*[\n\034]*//g; + # Restore removed lines + $MakefileData =~ s/([\n\034])#>\- /$1/g; + # Remove added lines + while ($MakefileData =~ /[\n\034]#>\+ ([^\n\034]*)/) + { + my $newCount = $1; + my $removeLines = ""; + while ($newCount--) { + $removeLines .= "[^\n\034]*([\n\034]|)"; + } + $MakefileData =~ s/[\n\034]#>\+.*[\n\034]$removeLines/\n/; + } +} + +#----------------------------------------------------------------------------- + +# find the .kcfg file listed in the .kcfgc file +sub findKcfgFile($) +{ + my ($kcfgf) = @_; + open (KCFGFIN, $kcfgf) || die "Could not open $kcfgf: $!\n"; + seek(KCFGFIN, 0, 2); + my $kcfgfsize = tell(KCFGFIN); + seek(KCFGFIN, 0, 0); + read KCFGFIN, $kcfgfData, $kcfgfsize; + close KCFGFIN; + if(($kcfgfData =~ m/^File=(.*\.kcfg)/gm)) { + $kcfg = $1; + } +} diff --git a/admin/bcheck.pl b/admin/bcheck.pl new file mode 100644 index 0000000..0cdcea9 --- /dev/null +++ b/admin/bcheck.pl @@ -0,0 +1,157 @@ +#!/usr/bin/perl -w + +use DB_File; +use Fcntl ':flock'; + +if (!defined($ARGV[0])) { + print "usage: requires .class dump as parameter!\n"; + exit; +} + +sub bailout +{ + untie %bcheckdb if(defined(%bcheckdb)); + + if(defined(MYLOCK)) { + flock MYLOCK, LOCK_UN; + close(MYLOCK); + } + + print @_; + exit 5; +} + +sub ask_user +{ + my ($dbkey, $dbchunk) = @_; + + if (defined($ENV{"BCHECK_UPDATE"})) { + $bcheckdb{$dbkey} = $dbchunk; + return; + } + + &bailout("BC problem detected") if (! -t STDIN); + + print "(I)gnore / (Q)uit / (U)pdate: "; + + my $key; + while(defined(read STDIN, $key, 1)) { + $key = lc($key); + + print "got: >$key<\n"; + + return if ($key eq 'i'); + + &bailout("BC problem. aborted") if ($key eq 'q'); + + if ($key eq 'u') { + $bcheckdb{$dbkey} = $dbchunk; + return; + } + print "\n(I)gnore / (Q)uit / (U)pdate: "; + } +} + +sub diff_chunk($$) +{ + my ($oldl, $newl) = @_; + my @old = split /^/m, $oldl; + my @new = split /^/m, $newl; + my $haschanges = 0; + my $max = $#old > $#new ? $#old : $#new; + + die "whoops. key different" if ($old[0] ne $new[0]); + + if ($#old != $#new) { + warn ("Structural difference.\n"); + print @old; + print "-----------------------------------------------\n"; + print @new; + $haschanges = 1; + return $haschanges; + } + + print $old[0]; + + my ($class) = ($old[0] =~ /^(?:Class |Vtable for )(\S+)/); + + my $c = 1; + while ($c < $max) { + my ($o, $n) = ($old[$c], $new[$c]); + chomp $o; + chomp $n; + $c++; + next if ($o eq $n); + + if(defined($class) and $n =~ /^(\d+\s+)\w+(::\S+\s*.*)$/) { + next if ($n eq "$1$class$2"); + } + + $haschanges = 1; + + print "-$o\n+$n\n\n"; + } + + return $haschanges; +} + +local $dblock = $ENV{"HOME"} . "/bcheck.lock"; +my $dbfile = $ENV{"HOME"} . "/bcheck.db"; +my $cdump = $ARGV[0]; + +die "file $cdump is not readable: $!" if (! -f $cdump); + +# make sure the advisory lock exists +open(MYLOCK, ">$dblock"); +print MYLOCK ""; + +flock MYLOCK, LOCK_EX; + +tie %bcheckdb, 'DB_File', $dbfile; + +my $chunk = ""; + +open (IN, "<$cdump") or die "cannot open $cdump: $!"; +while () { + + chop; + + s/0x[0-9a-fA-F]+/0x......../g; + s/base size=/size=/g; + s/\(\)\s*$//g; + s/base align=/align=/g; + + $chunk .= $_ . "\n"; + + if(/^\s*$/) { + my @lines = split /^/m, $chunk; + my $key = $lines[0]; + chomp $key; + + if($key !~ // && + $key !~ //) { + if(defined($bcheckdb{$key})) { + my $dbversion = $bcheckdb{$key}; + + if($dbversion ne $chunk) { + &ask_user($key, $chunk) if(&diff_chunk($dbversion, $chunk)); + } + } + else { + $bcheckdb{$key} = $chunk; + print "NEW: $key\n"; + } + } + + $chunk = ""; + next; + } + +} +close(IN); + +untie %bcheckdb; +flock MYLOCK, LOCK_UN; +close(MYLOCK); + +exit 0; diff --git a/admin/compile b/admin/compile new file mode 100755 index 0000000..09da7f0 --- /dev/null +++ b/admin/compile @@ -0,0 +1,142 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2005-05-14.22 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# 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, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand `-c -o'. +Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file `INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/admin/conf.change.pl b/admin/conf.change.pl new file mode 100644 index 0000000..94ed3b0 --- /dev/null +++ b/admin/conf.change.pl @@ -0,0 +1,191 @@ +#!/usr/bin/env perl + +# this script patches a config.status file, to use our own perl script +# in the main loop +# we do it this way to circumvent hacking (and thereby including) +# autoconf function (which are GPL) into our LGPL acinclude.m4.in +# written by Michael Matz +# adapted by Dirk Mueller +# +# This file is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# 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 +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +# we have to change two places +# 1. the splitting of the substitutions into chunks of 90 (or even 48 in +# later autoconf's +# 2. the big main loop which patches all Makefile.in's + +use strict; +use File::Basename; + +my $ac_aux_dir = dirname($0); +my ($flag); +my $ac_version = 0; +my $vpath_seen = 0; +$flag = 0; + +while (<>) { +# usage of $flag: 0 -- we have seen nothing yet +# 1 -- we are in (1) +# 2 -- we have ended (1) +# 3 -- we are in (2) +# 4 -- we ended (2) + + if ($flag == 4) { + print; + } elsif ($flag == 0) { +# 1. begins with (including): "ac_max_sed_\S+\s*=\s*[0-9]+..." +# ends with (excluding) "CONFIG_FILE=..." +# in later autoconf (2.14.1) there is no CONFIG_FILES= line, +# but instead the (2) directly follow (1) + if (/^\s*ac_max_sed_([a-z]+).*=\s*([0-9]+)/ ) { + $flag = 1; + if ($1 eq 'lines') { + # lets hope its different with 2141, + # wasn't able to verify that + if ($2 eq '48') { + $ac_version = 250; + } + else { + $ac_version = 2141; + } + } elsif ($1 eq 'cmds') { + $ac_version = 213; + } + # hmm, we don't know the autoconf version, but we try anyway + } else { + print; + } + } elsif ($flag == 1) { + if (/^\s*CONFIG_FILES=/ && ($ac_version != 250)) { + print; + $flag = 2; + } elsif (/^\s*for\s+ac_file\s+in\s+.*CONFIG_FILES/ ) { + $flag = 3; + } + } elsif ($flag == 2) { +# 2. begins with: "for ac_file in.*CONFIG_FILES" (the next 'for' after (1)) +# end with: "rm -f conftest.s\*" +# on autoconf 250, it ends with '# CONFIG_HEADER section' +# +# gg: if a post-processing commands section is found first, +# stop there and insert a new loop to honor the case/esac. +# (pattern: /^\s+#\sRun the commands associated with the file./) + + if (/^\s*for\s+ac_file\s+in\s+.*CONFIG_FILES/ ) { + $flag = 3; + } else { + print; + } + } elsif ($flag == 3) { + if (/^\s*rm\s+-f\s+conftest/ ) { + $flag = 4; + &insert_main_loop(); + } elsif (/^\s*rm\s+-f\s+.*ac_cs_root/ ) { + $flag = 4; + &insert_main_loop(); + #die "hhhhhhh"; + if ($ac_version != 2141) { + print STDERR "hmm, don't know autoconf version\n"; + } + } elsif (/^\#\s*CONFIG_(HEADER|COMMANDS) section.*|^\s+#\s(Run) the commands associated/) { + $flag = 4; + my $commands = defined $2; + &insert_main_loop(); + $commands && insert_command_loop(); + if($ac_version != 250) { + print STDERR "hmm, something went wrong :-(\n"; + } + } elsif (/VPATH/ ) { + $vpath_seen = 1; + } + } +} + +die "wrong input (flag != 4)" unless $flag == 4; +print STDERR "hmm, don't know autoconf version\n" unless $ac_version; + +sub insert_main_loop { + + if ($ac_version == 250) { + &insert_main_loop_250(); + } + else { + &insert_main_loop_213(); + } +} + +sub insert_main_loop_250 { + + print <>\$tmp/subs.sed +EOF + } + print <> \$tmp/subs.files + fi + done + if test -f \$tmp/subs.files ; then + perl $ac_aux_dir/config.pl "\$tmp/subs.sed" "\$tmp/subs.files" "\$srcdir" "\$INSTALL" + fi + rm -f \$tmp/subs.files + +fi +EOF + return; +} + +sub insert_main_loop_213 { + print <> \$ac_cs_root.subs +EOF + } + print <> \$ac_cs_root.sacfiles + fi +done +if test -f \$ac_cs_root.sacfiles ; then + perl $ac_aux_dir/config.pl "\$ac_cs_root.subs" "\$ac_cs_root.sacfiles" "\$ac_given_srcdir" "\$ac_given_INSTALL" +fi +rm -f \$ac_cs_root.s* + +EOF + return; +} + +sub insert_command_loop { + print <. +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + *86) UNAME_PROCESSOR=i686 ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/admin/config.pl b/admin/config.pl new file mode 100644 index 0000000..cfbb609 --- /dev/null +++ b/admin/config.pl @@ -0,0 +1,238 @@ +#!/usr/bin/env perl +# a script for use by autoconf to make the Makefiles +# from the Makefile.in's +# +# the original autoconf mechanism first splits all substitutions into groups +# of ca. 90, and than invokes sed for _every_ Makefile.in and every group +# (so around 2-3 times per Makefile.in). So this takes forever, as sed +# has to recompile the regexps every time. +# +# this script does better. It changes all Makefile.ins in one process. +# in kdelibs the time for building Makefile went down from 2:59 min to 13 sec! +# +# written by Michael Matz +# adapted by Dirk Mueller + +# This file is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# 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 +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +use strict; + +use File::Path; + +my $ac_subs=$ARGV[0]; +my $ac_sacfiles = $ARGV[1]; +my $ac_given_srcdir=$ARGV[2]; +my $ac_given_INSTALL=$ARGV[3]; + +my @comp_match; +my @comp_subs; + +#print "ac_subs=$ac_subs\n"; +#print "ac_sacfiles=$ac_sacfiles\n"; +#print "ac_given_srcdir=$ac_given_srcdir\n"; +#print "ac_given_INSTALL=$ac_given_INSTALL\n"; + +my $configure_input; +my ($srcdir, $top_srcdir); +my $INSTALL; +my $bad_perl = ($] < 5.005); +my $created_file_count = 0; + +open(CF, "< $ac_subs") || die "can't open $ac_subs: $!"; +my @subs = ; +my $pat; +close(CF); +chomp @subs; +@comp_match=(); +@comp_subs=(); + +if ($bad_perl) { + print "Using perl older than version 5.005\n"; + foreach $pat (@subs) { + if ( ($pat =~ m/s%([^%]*)%([^%]*)%g/ ) + || ($pat =~ m/s%([^%]*)%([^%]*)%;t/ ) + || ($pat =~ m/s,([^,]*),(.*),;t/) + || ($pat =~ m%s/([^/]*)/([^/]*)/g% ) + || ($pat =~ m%s/([^/]*)/([^/]*)/;t% ) + ) { + # form : s%bla%blubb%g + # or s%bla%blubb%;t t (autoconf > 2.13 and < 2.52 ?) + # or s,bla,blubb,;t t (autoconf 2.52) + my $srch = $1; + my $repl = $2; + $repl =~ s/\\(.)/$1/g; + push @comp_subs, make_closure($srch, $repl); + + } elsif ( ($pat =~ /%([^%]*)%d/ ) + || ($pat =~ m%/([^/]*)/d% ) + ) { + push @comp_subs, make_closure($1, ""); + } else { + die "Uhh. Malformed pattern in $ac_subs ($pat)" + unless ( $pat =~ /^\s*$/ ); # ignore white lines + } + } +} else { + foreach $pat (@subs) { + if ( ($pat =~ /s%([^%]*)%([^%]*)%g/ ) || + ($pat =~ /s%([^%]*)%([^%]*)%;t/ ) || + ($pat =~ /s,([^,]*),(.*),;t/) ) { + # form : s%bla%blubb%g + # or s%bla%blubb%;t t (autoconf > 2.13 and < 2.52 ?) + # or s,bla,blubb,;t t (autoconf 2.52) + my $srch = $1; + my $repl = $2; + push @comp_match, eval "qr/\Q$srch\E/"; # compile match pattern + $repl =~ s/\\(.)/$1/g; + push @comp_subs, $repl; + } elsif ( ($pat =~ /%([^%]*)%d/ ) + || ($pat =~ m%/([^/]*)/d% ) + ) { + push @comp_match, eval "qr/\Q$1\E/"; + push @comp_subs, ""; + } else { + die "Uhh. Malformed pattern in $ac_subs ($pat)" + unless ( $pat =~ /^\s*$/ ); # ignore white lines + } + } +} +undef @subs; + +# read the list of files to be patched, form: +# ./Makefile arts/Makefile arts/examples/Makefile arts/flow/Makefile + +open(CF, "< $ac_sacfiles") || die "can't open $ac_sacfiles: $!"; +my @ac_files = ; +close(CF); +chomp @ac_files; + + +my $ac_file; +foreach $ac_file (@ac_files) { + next if $ac_file =~ /\.\./; + next if $ac_file =~ /^\s*$/; + my $ac_file_in; + my ($ac_dir, $ac_dots, $ac_dir_suffix); + + if ($ac_file =~ /.*:.*/ ) { + ($ac_file_in = $ac_file) =~ s%[^:]*:%%; + $ac_file =~ s%:.*%%; + } else { + $ac_file_in = $ac_file.".in"; + } + +# Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + +# Remove last slash and all that follows it. Not all systems have dirname. + ($ac_dir = $ac_file) =~ s%/[^/][^/]*$%%; + if ( ($ac_dir ne $ac_file) && ($ac_dir ne ".")) { +# The file is in a subdirectory. + if (! -d "$ac_dir") { mkpath "$ac_dir", 0, 0777; } + ($ac_dir_suffix = $ac_dir) =~ s%^./%%; + $ac_dir_suffix="/".$ac_dir_suffix; +# A "../" for each directory in $ac_dir_suffix. + ($ac_dots = $ac_dir_suffix) =~ s%/[^/]*%../%g; + } else { + $ac_dir_suffix=""; + $ac_dots=""; + } + + if ($ac_given_srcdir eq ".") { + $srcdir="."; + if ($ac_dots) { + ( $top_srcdir = $ac_dots) =~ s%/$%%; + } else { $top_srcdir="."; } + } elsif ($ac_given_srcdir =~ m%^/%) { + $srcdir=$ac_given_srcdir.$ac_dir_suffix; + $top_srcdir = $ac_given_srcdir; + } else { + $srcdir = $ac_dots.$ac_given_srcdir.$ac_dir_suffix; + $top_srcdir = $ac_dots.$ac_given_srcdir; + } + + if ($ac_given_INSTALL) { + if ($ac_given_INSTALL =~ m%^/% ) { + $INSTALL = $ac_given_INSTALL; + } else { + $INSTALL = $ac_dots.$ac_given_INSTALL; + } + } + + print "fast creating $ac_file\n"; + unlink $ac_file; + my $ac_comsub=""; + my $fname=$ac_file_in; + $fname =~ s%.*/%%; + $configure_input="$ac_file. Generated from $fname by config.pl."; + + my $ac_file_inputs; + ($ac_file_inputs = $ac_file_in) =~ s%^%$ac_given_srcdir/%; + $ac_file_inputs =~ s%:% $ac_given_srcdir/%g; + + patch_file($ac_file, $ac_file_inputs); + ++$created_file_count; +} + +print "config.pl: fast created $created_file_count file(s).\n"; + +sub patch_file { + my ($outf, $infiles) = @_; + my $filedata; + my @infiles=split(' ', $infiles); + my $i=0; + my $name; + + foreach $name (@infiles) { + if (open(CF, "< $name")) { + while () { + $filedata .= $_; + } + close(CF); + } else { + print STDERR "can't open $name: $!"."\n"; + } + } + + $filedata =~ s%\@configure_input\@%$configure_input%g; + $filedata =~ s%\@srcdir\@%$srcdir%g; + $filedata =~ s%\@top_srcdir\@%$top_srcdir%g; + $filedata =~ s%\@INSTALL\@%$INSTALL%g; + + if ($bad_perl) { + while ($i <= $#comp_subs) { + my $ref = $comp_subs[$i]; + &$ref(\$filedata); + $i++; + } + } else { + while ($i <= $#comp_match) { + $filedata =~ s/$comp_match[$i]/$comp_subs[$i]/g; + $i++; + } + } + open(CF, "> $outf") || die "can't create $outf: $!"; + print CF $filedata; + close(CF); +} + +sub make_closure { + my ($pat, $sub) = @_; + my $ret = eval "return sub { my \$ref=shift; \$\$ref =~ s%\Q$pat\E%\Q$sub\E%g; }"; + if ($@) { + print "can't create CODE: $@\n"; + } + return $ret; +} diff --git a/admin/config.sub b/admin/config.sub new file mode 100755 index 0000000..292f85e --- /dev/null +++ b/admin/config.sub @@ -0,0 +1,1575 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-07-01' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | ms1 \ + | msp430 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m32c) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | ms1-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + m32c-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* | -skyos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/admin/configure.in.bot.end b/admin/configure.in.bot.end new file mode 100644 index 0000000..5b23719 --- /dev/null +++ b/admin/configure.in.bot.end @@ -0,0 +1,47 @@ +# Check if KDE_SET_PREFIX was called, and --prefix was passed to configure +if test -n "$kde_libs_prefix" -a -n "$given_prefix"; then + # And if so, warn when they don't match + if test "$kde_libs_prefix" != "$given_prefix"; then + # And if kde doesn't know about the prefix yet + echo ":"`kde-config --path exe`":" | grep ":$given_prefix/bin/:" 2>&1 >/dev/null + if test $? -ne 0; then + echo "" + echo "Warning: you chose to install this package in $given_prefix," + echo "but KDE was found in $kde_libs_prefix." + echo "For this to work, you will need to tell KDE about the new prefix, by ensuring" + echo "that KDEDIRS contains it, e.g. export KDEDIRS=$given_prefix:$kde_libs_prefix" + echo "Then restart KDE." + echo "" + fi + fi +fi + +if test x$GXX = "xyes" -a x$kde_have_gcc_visibility = "xyes" -a x$kde_cv_val_qt_gcc_visibility_patched = "xno"; then + echo "" + echo "Your GCC supports symbol visibility, but the patch for Qt supporting visibility" + echo "was not included. Therefore, GCC symbol visibility support remains disabled." + echo "" + echo "For better performance, consider including the Qt visibility supporting patch" + echo "located at:" + echo "" + echo "http://bugs.kde.org/show_bug.cgi?id=109386" + echo "" + echo "and recompile all of Qt and KDE. Note, this is entirely optional and" + echo "everything will continue to work just fine without it." + echo "" +fi + +if test "$all_tests" = "bad"; then + if test ! "$cache_file" = "/dev/null"; then + echo "" + echo "Please remove the file $cache_file after changing your setup" + echo "so that configure will find the changes next time." + echo "" + fi +else + echo "" + echo "Good - your configure finished. Start make now" + echo "" + echo "Note for non-GNU systems users: in order to compile SIM, you need to use GNU make (gmake)" + echo "" +fi diff --git a/admin/configure.in.min b/admin/configure.in.min new file mode 100644 index 0000000..370a38a --- /dev/null +++ b/admin/configure.in.min @@ -0,0 +1,70 @@ +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +dnl Boston, MA 02111-1307, USA. + +# Original Author was Kalle@kde.org +# I lifted it in some mater. (Stephan Kulow) +# I used much code from Janos Farkas + +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(acinclude.m4) dnl a source file from your sub dir + +dnl This is so we can use kde-common +AC_CONFIG_AUX_DIR(admin) + +dnl This ksh/zsh feature conflicts with `cd blah ; pwd` +unset CDPATH + +dnl Checking host/target/build systems, for make, install etc. +AC_CANONICAL_SYSTEM +dnl Perform program name transformation +AC_ARG_PROGRAM + +dnl Automake doc recommends to do this only here. (Janos) +AM_INIT_AUTOMAKE(@MODULENAME@, @VERSION@) dnl searches for some needed programs + +AC_ARG_ENABLE(kde, + AC_HELP_STRING([--disable-kde],[don't use kde]), + use_kde=$enableval, use_kde=yes) + +if test "$use_kde" = "yes"; then + KDE_SET_PREFIX +else + SIM_SET_PREFIX + KDE_FAST_CONFIGURE +fi + +dnl generate the config header +AM_CONFIG_HEADER(config.h) dnl at the distribution this done + +dnl Checks for programs. +AC_CHECK_COMPILERS +AC_ENABLE_SHARED(yes) +AC_ENABLE_STATIC(no) +AC_LIBTOOL_DLOPEN +KDE_PROG_LIBTOOL + +dnl for NLS support. Call them in this order! +dnl WITH_NLS is for the po files +AM_KDE_WITH_NLS +if test "x$use_kde" != "xyes"; then + KDE_CHECK_STL + include_ARTS_TRUE='#' + include_ARTS_FALSE= +fi +AC_PATH_KDE diff --git a/admin/debianrules b/admin/debianrules new file mode 100755 index 0000000..7aaae58 --- /dev/null +++ b/admin/debianrules @@ -0,0 +1,43 @@ +#!/usr/bin/perl -w + +use Shell qw(mv cp mkdir rm) ; +use File::Find; +use Cwd; + +$origPwd = `pwd`; +chomp $origPwd; + +$kde_prefix = "/usr"; +$sysconfdir = "/etc"; +$kde_includedir = "$kde_prefix/include/kde"; +$infodir = "$kde_prefix/share/info"; +$mandir = "$kde_prefix/share/man"; +$qtdir = "/usr/share/qt3"; + +$kde_cgidir = "$kde_prefix/lib/cgi-bin"; +$kde_confdir = "$sysconfdir/kde3"; +$kde_htmldir = "$kde_prefix/share/doc/kde/HTML"; + +if (defined $ENV{DEB_BUILD_OPTIONS} && + $ENV{DEB_BUILD_OPTIONS} =~ /\bnostrip\b/) { + $enable_debug="--enable-debug=full"; +} else { + $enable_debug="--disable-debug"; +} + +if (@ARGV && $ARGV[0] eq 'echodirs') { + print STDOUT "export kde_prefix=$kde_prefix\n"; + print STDOUT "export sysconfdir=$sysconfdir\n"; + print STDOUT "export kde_includedir=$kde_includedir\n"; + print STDOUT "export infodir=$infodir\n"; + print STDOUT "export mandir=$mandir\n"; + print STDOUT "export qtdir=$qtdir\n"; + + print STDOUT "export kde_cgidir=$kde_cgidir\n"; + print STDOUT "export kde_confdir=$kde_confdir\n"; + print STDOUT "export kde_htmldir=$kde_htmldir\n"; + + print STDOUT "configkde=$enable_debug --disable-rpath --prefix=\$(kde_prefix) --sysconfdir=\$(sysconfdir) --includedir=\$(kde_includedir) --infodir=\$(infodir) --mandir=\$(mandir) --with-qt-dir=\$(qtdir)\n"; + + exit +} diff --git a/admin/depcomp b/admin/depcomp new file mode 100755 index 0000000..3c86718 --- /dev/null +++ b/admin/depcomp @@ -0,0 +1,530 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2005-07-09.11 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. + +# 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, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mecanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/admin/deps.am b/admin/deps.am new file mode 100644 index 0000000..ce0c5d3 --- /dev/null +++ b/admin/deps.am @@ -0,0 +1,19 @@ +$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in $(top_srcdir)/admin/cvs.sh $(top_srcdir)/admin/pkg.m4.in + @cd $(top_srcdir) && $(SHELL) admin/cvs.sh acinclude_m4 + +$(top_srcdir)/configure.in: $(top_srcdir)/subdirs $(top_srcdir)/configure.files $(top_srcdir)/admin/cvs.sh + @cd $(top_srcdir) && $(SHELL) admin/cvs.sh configure_in + +$(top_srcdir)/configure.files: $(top_srcdir)/subdirs $(CONF_FILES) + @cd $(top_srcdir) && $(SHELL) admin/cvs.sh configure.files $(top_srcdir)/admin/cvs.sh + +$(top_srcdir)/Makefile.am: $(top_srcdir)/Makefile.am.in $(top_srcdir)/subdirs $(top_srcdir)/admin/cvs.sh + @cd $(top_srcdir) && $(SHELL) admin/cvs.sh Makefile_am + +$(top_srcdir)/subdirs: $(top_srcdir)/Makefile.am.in $(top_srcdir)/admin/cvs.sh + @cd $(top_srcdir) && $(SHELL) admin/cvs.sh subdirs + +# defining default rules for files that may not be present +$(top_srcdir)/Makefile.am.in: +$(CONF_FILES): + diff --git a/admin/detect-autoconf.pl b/admin/detect-autoconf.pl new file mode 100755 index 0000000..5c1d8d1 --- /dev/null +++ b/admin/detect-autoconf.pl @@ -0,0 +1,172 @@ +#!/usr/bin/env perl + +# Try to locate best version of auto* +# By Michael Pyne +# +# Copyright (c) 2005. +# This code is public domain. You may use it however you like (including +# relicensing). + +# Emulate the 'which' program. +sub which +{ + my $prog = shift; + my @paths = split(/:/, $ENV{'PATH'}); + + for $path (@paths) + { + return "$path/$prog" if -x "$path/$prog"; + } + + return ""; +} + +# Subroutine to determine the highest installed version of the given program, +# searching from the given paths. +sub findBest +{ + my ($program, @paths) = @_; + my $best_version_found = '0'; # Deliberately a string. + my %versions; + my %minimumVersions = ( + 'autoconf' => '2.5', + 'automake' => '1.6', + ); + my %ignore = map { $_ => 1 } qw(wrapper); # BSDism + + # Allow user to use environment variable to override search. + return $ENV{uc $program} if $ENV{uc $program}; + + for $prefix (@paths) + { + @files = glob "$prefix/$program*"; + for $file (@files) + { + # Don't check non-executable scripts. + next unless -x $file; + + ($version) = $file =~ /$prefix\/$program-?(.*)$/; + $version =~ s/-|\.//g; + + next if $ignore{$version}; + + # Special case some programs to make sure it has a minimum version. + if (not $version and exists $minimumVersions{$program}) + { + my $min_version = $minimumVersions{$program}; + my $versionOutput = `$program --version 2>/dev/null | head -n 1`; + + # If we can't run the script to get the version it likely won't work later. + next unless $versionOutput; + + # Use number.number for version (we don't need the excess in general). + ($versionOutput) = ($versionOutput =~ /(\d\.\d)/); + + # Use lt to do lexicographical comparison of strings (which should be + # equivalent and doesn't involve issues with floating point conversions). + if (not $versionOutput or $versionOutput lt $min_version) + { + next; + } + } + + # If no version suffix then use it in favor of a versioned autotool + # since the ever-popular WANT_AUTOFOO should then work (in theory). + return $file unless $version; + + # Emulate 'which', and abort if we've already seen this version. + next if exists $versions{$version}; + + # Save filename of program. + $versions{$version} = $file; + + # Use string comparison so that e.g. 253a will be > 253 but < 254. + if ($version gt $best_version_found) + { + $best_version_found = $version; + } + } + } + + return $versions{$best_version_found}; +} + +# Find an appropriate "which" program for later use by the shell script calling +# us. +sub findWhich +{ + for $candidate ('type -p', 'which', 'type') + { + $test = `$candidate sh 2>/dev/null`; + chomp $test; + + return $candidate if -x $test; + } +} + +# Uses which() to find a program unless the user provided its path in the +# environment (the upper case program name is searched). +sub findProgram +{ + $suffix = ""; # For use if @_ has only one param. + my ($program, $suffix) = @_; + + return $ENV{uc $program} if $ENV{uc $program}; + return which("$program$suffix"); +} + +# SCRIPT STARTS. + +# Search in path. +@paths = split(/:/, $ENV{'PATH'}); + +# Make sure at least /usr/bin and /usr/local/bin are in this search. +unshift @paths, '/usr/local/bin' unless grep $_ eq '/usr/local/bin', @paths; +unshift @paths, '/usr/bin' unless grep $_ eq '/usr/bin', @paths; + +$autoconf = findBest('autoconf', @paths); +($autoconf_suffix) = $autoconf =~ /.*autoconf(.*)$/; + +# Find matching autoconf companions. +$autoheader = findProgram('autoheader', $autoconf_suffix); +$autom4te = findProgram('autom4te', $autoconf_suffix); + +# Get best automake, and look for unsermake to possibly override it. +$automake = findBest('automake', @paths); +$unsermake = ""; +# backward compatible: if $UNSERMAKE points to a path, use it +$unsermake = findProgram('unsermake') if (defined($ENV{'UNSERMAKE'}) and $ENV{'UNSERMAKE'} =~ /\//); +# new compatible: if it says 'yes', use the one from path +$unsermake = which('unsermake') if ($ENV{'UNSERMAKE'} ne 'no'); + +($automake_suffix) = $automake =~ /.*automake(.*)$/; + +# Use unsermake if we found it. +$automake = "$unsermake -c" if $unsermake; + +# Find matching automake companions. +$aclocal = findProgram('aclocal', $automake_suffix); + +$which = findWhich(); + +# Make sure we have all of the needed programs. +for $i (qw'autoconf autoheader autom4te automake aclocal') +{ + die "# $0: Unable to find $i!!\n" unless(${$i}) +} + +# Print results in eval-able form. +print <&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +test -n "$dir_arg" || trap '(exit $?); exit' 1 2 13 15 + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dstarg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + posix_mkdir=false + if $mkdirprog -m $test_mode -p -- / >/dev/null 2>&1; then + posix_mkdir=true + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./-m "$test_mode" ./-p ./-- 2>/dev/null + fi ;; + esac + + if + $posix_mkdir && { + + # With -d, create the new directory with the user-specified mode. + # Otherwise, create it using the same intermediate mode that + # mkdir -p would use when creating intermediate directories. + # POSIX says that this mode is "$(umask -S),u+wx", so use that + # if umask -S works. + + if test -n "$dir_arg"; then + mkdir_mode=$mode + else + case $intermediate_mode in + '') + if umask_S=`(umask -S) 2>/dev/null`; then + intermediate_mode=$umask_S,u+wx + else + intermediate_mode=$test_mode + fi ;; + esac + mkdir_mode=$intermediate_mode + fi + + $mkdirprog -m "$mkdir_mode" -p -- "$dstdir" + } + then : + else + + # mkdir does not conform to POSIX, or it failed possibly due to + # a race condition. Create the directory the slow way, step by + # step, checking for races as we go. + + case $dstdir in + /*) pathcomp=/ ;; + -*) pathcomp=./ ;; + *) pathcomp= ;; + esac + + case $posix_glob in + '') + if (set -f) 2>/dev/null; then + posix_glob=true + else + posix_glob=false + fi ;; + esac + + oIFS=$IFS + IFS=/ + $posix_glob && set -f + set fnord $dstdir + shift + $posix_glob && set +f + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" + # Don't fail if two instances are running concurrently. + test -d "$pathcomp" || exit 1 + fi + pathcomp=$pathcomp/ + done + obsolete_mkdir_used=true + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd "$mode" "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + $doit $cpprog "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$mode" "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dst"; then + $doit $rmcmd -f "$dst" 2>/dev/null \ + || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ + && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ + || { + echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + } || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/admin/libtool.m4.in b/admin/libtool.m4.in new file mode 100644 index 0000000..84a5436 --- /dev/null +++ b/admin/libtool.m4.in @@ -0,0 +1,5891 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001 +## Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 1996 +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +## +## As a special exception to the GNU General Public License, if you +## distribute this file as part of a program that contains a +## configuration script generated by Autoconf, you may include it under +## the same distribution terms that you use for the rest of that program. + +# serial 47 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool --silent' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LINUX_64_MODE="32" + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + LINUX_64_MODE="64" + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + testring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$testring" 2>/dev/null` \ + = "XX$testring") >/dev/null 2>&1 && + new_result=`expr "X$testring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + testring=$testring$testring + done + testring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + # According to Tom Tromey, Ian Lance Taylor reported there are C compilers + # that will create temporary files in the current directory regardless of + # the output directory. Thus, making CWD read-only will cause this test + # to fail, enabling locking or at least warning the user not to do parallel + # builds. + chmod -w . + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* out/* + rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + libsuff= + if test "x$LINUX_64_MODE" = x64; then + # Some platforms are per default 64-bit, so there's no /lib64 + if test -d /lib64; then + libsuff=64 + fi + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha* | hppa* | i*86 | ia64* | m68* | mips* | powerpc* | sparc* | s390* | sh* | x86_64* ) + lt_cv_deplibs_check_method=pass_all ;; + # the debian people say, arm and glibc 2.3.1 works for them with pass_all + arm* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$]_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=no + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext='$shrext' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGISTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=no + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=no + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $compiler_flags $libobjs `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $libobjs $deplibs~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $libobjs $deplibs' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $compiler_flags $libobjs $deplibs$output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $compiler_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) diff --git a/admin/missing b/admin/missing new file mode 100755 index 0000000..32ba9f3 --- /dev/null +++ b/admin/missing @@ -0,0 +1,353 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2004-09-07.08 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# 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, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit 0 + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit 0 + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case "$1" in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/admin/mkinstalldirs b/admin/mkinstalldirs new file mode 100644 index 0000000..8ef092d --- /dev/null +++ b/admin/mkinstalldirs @@ -0,0 +1,158 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2005-06-29.22 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/admin/nmcheck b/admin/nmcheck new file mode 100755 index 0000000..f799186 --- /dev/null +++ b/admin/nmcheck @@ -0,0 +1,371 @@ +#!/usr/bin/perl -w + +# Check namespace cleanness of a library. +# Allowed symbols are passed as arguments. +# They may have trailing * = wildcard. +# Wildcards may be also specified as *::* (e.g. K*::* for all KDE classes) +# Symbols are listed as full function unmangled names without arguments, +# e.g. 'foo bar* nspace::*' allows foo(), foo(int), bar(), barbar() +# and all symbols in namespace/class nspace. +# If an argument has comma in it, it's a filename of a file containing +# allowed symbols, one per line. + + +$thisProg = "$0"; # This programs name + +$library = ""; +$allowed_symbols = ""; +$debug = 0; +$allowed_weak = ""; +$weak_specified = 0; + +while( defined( $ARGV[ 0 ] )) +{ + $_ = shift; + if( /^--verbose$|^-v$/ ) + { + $debug = 1; + } + elsif( /^--help$|^-h$/ ) + { + print STDOUT "Usage $thisProg [OPTION] ... library [allowed symbols] ...\n", + "\n", + "Check if the given library has only allowed public symbols.\n", + "\n", + " --allowweak=[symbol] allow only these weak symbols\n", + " -v, --verbose verbosely list files processed\n", + " -h, --help print this help, then exit\n"; + exit 0; + } + elsif( /^--allowweak=(.*)$/ ) + { + $allowed_weak .= " " . $1; + $weak_specified = 1; + } + elsif( /^--allowweak$/ ) # simply list all weak + { + $allowed_weak .= " "; + $weak_specified = 1; + } + elsif( /^--*/ ) + { + die "Invalid argument!\n"; + } + else + { + if( ! $library ) + { + $library = $_; + } + else + { + $allowed_symbols .= " " . $_; + } + } +} + +if( ! $weak_specified ) +{ + $allowed_weak = "*"; + # allow all weak symbols by default + # instances of templates and similar stuff - unfortunately includes also things from other libraries, + # so it cannot be on by default +} + +print STDERR "library:" . $library . "\n" if $debug; +print STDERR "allowed_symbols:" . $allowed_symbols . "\n" if $debug; +print STDERR "allowed_weak:" . $allowed_weak . "\n" if $debug; + +$default_symbols = "_fini _init"; # system symbols +# on my system, every .so has : +# A _DYNAMIC +# A _GLOBAL_OFFSET_TABLE_ +# A __bss_start +# A _edata +# A _end +# T _fini +# T _init +# no need to list A symbols in $default_symbols + +print STDERR "default_symbols: " . $default_symbols . "\n" if $debug; + +print STDOUT "Namespace cleanness check for " . $library . " :\n"; + +$lib_file = ""; +if( $library =~ /\.la$/ ) +{ + # get the real library file from .la + open( FILEIN, $library ) || die "Couldn't open $! !\n"; + while( $line = ) + { + if( $line =~ /library_names=\'([^ ]*).*/o ) + { + $lib_file = $1; + } + } + close( FILEIN ); + if( ! $lib_file ) + { + print STDERR "Library file not found in .la file!\n"; + exit 1; + } + my $libpath = $library; + $libpath =~ s%[^/]*$%%; + if( -e $libpath . ".libs/" . $lib_file ) + { + $lib_file = $libpath . ".libs/" . $lib_file; + } + else + { + $lib_file = $libpath . $lib_file; + } +} +else +{ + $lib_file = $library; +} + +print STDERR "libfile: ". $lib_file . "\n" if $debug; + +$allowed_symbols .= " " . $default_symbols; + +sub process_symbols($\@\%\@); + +@wildcards = (); +%exacts = (); +@regwildcards = (); +process_symbols( $allowed_symbols, @wildcards, %exacts, @regwildcards ); +@weak_wildcards = (); +%weak_exacts = (); +@weak_regwildcards = (); +process_symbols( $allowed_weak, @weak_wildcards, %weak_exacts, @weak_regwildcards ); + +# grep is for stripping not exported symbols, which don't have address (=first column) +$nm_command = "nm -BDCg " . $lib_file . " | grep -v '^ ' |"; + +# TODO how portable is this nmcheck stuff? + +print STDERR "nm command:" . $nm_command . "\n" if $debug; + +open( FILEIN, $nm_command ) || die "nm command failed\n"; + +my $exit_code = 0; + +while( $line = ) +{ + my $type; + my $symbol; + if( $line =~ /^[^ ]* (.) (.*)$/o ) + { + $type = $1; + $symbol = $2; + } + else + { + die "Invalid line: " . $line . "\n"; + } + + print STDERR "Type: " . $type . " , symbol: " . $symbol . "\n" if $debug; + if( $type eq "A" ) + { # these should be system symbols, so ignore them + next; + } + + my $orig_symbol = $symbol; + + if( $symbol =~ /\(anonymous namespace\)/o ) + { # TODO tell to prefer named namespaces? (shorter symbols) + next; + } + + # strip prefixes + # the :: appending is to make "CLASS::*" work also for "vtable for CLASS" + $symbol =~ s/^typeinfo for (.*)$/$1::/o; + $symbol =~ s/^typeinfo fn for (.*)$/$1::/o; + $symbol =~ s/^typeinfo name for (.*)$/$1::/o; + $symbol =~ s/^vtable for (.*)$/$1::/o; + $symbol =~ s/^guard variable for (.*)$/$1::/o; + $symbol =~ s/^reference temporary for (.*)$/$1::/o; + $symbol =~ s/^VTT for (.*)$/$1::/o; + $symbol =~ s/^virtual thunk \[[^\]]*\] to (.*)$/$1::/o; + $symbol =~ s/^non-virtual thunk \[[^\]]*\] to (.*)$/$1::/o; + $symbol =~ s/^covariant return thunk \[[^\]]*\] to (.*)$/$1::/o; + $symbol =~ s/^construction vtable thunk for (.*)$/$1::/o; + $symbol =~ s/^construction vtable for .*-in-(.*) [0-9]*$/$1::/o; + + # templates seem to have also return types mangled in their name, and nm prints it too + # they have also template arguments in the symbol + # get rid of both of those + while( $symbol =~ /<.*>/o ) + { + $symbol =~ s/<[^<>]*>//o; # strip innermost <> + } + if( $symbol !~ /operator\(\)/o ) + { + $symbol =~ s/ ?\(.*\).*$//o; # strip () and all after it + } + else + { + $symbol =~ s/(^|:| )operator\(\) ?\(.*\).*$//o; # strip () and all after it + } + $symbol =~ s/\[.*\] *$//o; # strip [in-charge] etc. + if( $symbol =~ /(^|:| )operator /o ) + { + $symbol =~ s/.* ([^\s]*)operator /$1/o; # strip everything before 'X::operator blah' + } + else + { + $symbol =~ s/.* ([^\s]+) *$/$1/o; # get last word (strip return type) + } + + # print STDERR "Processed symbol: " . $symbol . "\n" if $debug; + + my $found = 0; + if( $exacts{ $symbol } ) + { + $found = 1; + } + if( ! $found ) + { + for my $wild ( @wildcards ) + { + if( index( $symbol, $wild ) == 0 ) + { + $found = 1; + last; + } + } + } + if( ! $found ) + { + for my $wild ( @regwildcards ) + { + if( $symbol =~ /^$wild$/ ) + { + $found = 1; + last; + } + } + } + if( ( ! $found ) && ( $type eq "W" || $type eq "V" )) + { + if( $weak_exacts{ $symbol } ) + { + $found = 1; + } + if( ! $found ) + { + for my $wild ( @weak_wildcards ) + { + if( index( $symbol, $wild ) == 0 ) + { + $found = 1; + last; + } + } + } + if( ! $found ) + { + for my $wild ( @weak_regwildcards ) + { + if( $symbol =~ /^$wild$/ ) + { + $found = 1; + last; + } + } + } + } + + if( ! $found ) + { + print STDERR "Public symbol " . $orig_symbol . " is not allowed!\n"; + $exit_code = 1; + } +} + +close( FILEIN ); + +print STDOUT $exit_code == 0 ? "OK\n" : "FAILED\n"; + +exit $exit_code; + +sub process_symbols($\@\%\@) +{ + my $allowed_symbols = $_[ 0 ]; + my $wildcards_ref = $_[ 1 ]; + my $exacts_ref = $_[ 2 ]; + my $regwildcards_ref = $_[ 3 ]; + + $allowed_symbols =~ s/^ *//o; # strip whitespace + $allowed_symbols =~ s/ *$//o; + + if( $allowed_symbols eq "NONE" ) + { + $allowed_symbols = ""; + } + + my @symbols1 = split( ' ', $allowed_symbols ); + my $i = 0; + my @symbols2 = (); + while( defined( $symbols1[ $i ] )) + { + my $symbol = $symbols1[ $i ]; + if( $symbol =~ /\./ ) # dot in name -> file + { + open( SYMIN, $symbol ) || die ( "Cannot open file " . $symbol . "!" ); + while( $line = ) + { + $line =~ s/^\s*//o; # strip whitespace + $line =~ s/\s*$//o; + if( $line !~ /^$/o # empty line + && $line !~ /^\s*#/ ) # comment line starting with # + { + $symbols2[ $#symbols2 + 1 ] = $line; + } + } + close( SYMIN ); + } + else + { + $symbols2[ $#symbols2 + 1 ] = $symbol; + } + $i++; + } + $i = 0; + while( defined( $symbols2[ $i ] )) + { + my $symbol = $symbols2[ $i ]; + if( $symbol =~ /__/ + || $symbol =~ /^_[A-Z]/ ) + { # ISO C++ 2.10.2 + die "Symbols containing a double underscore or beginning with an underscore and an upper-case letter are reserved!\n"; + } + elsif( $symbol eq "main" + || $symbol eq "main*" ) + { + die "Symbol main is not allowed!\n"; + } + if( $symbol =~ /^([^\*]*)\*$/o # trailing * without any * before it + && $symbol !~ /operator\*$/o ) + { + print STDERR "wildcard:" . $symbol . "\n" if $debug; + $wildcards_ref->[ $#{$wildcards_ref} + 1 ] = $1; + } + elsif( $symbol =~ /\*$/o + && ( $symbol =~ /\*::/o || $symbol =~ /::\*/o ) + && $symbol !~ /^\*/o + && $symbol !~ /operator\*$/o ) + { + print STDERR "regwildcard:" . $symbol . "\n" if $debug; + $symbol =~ s/\*/\.\*/go; # change * to .* (regexp) + $regwildcards_ref->[ $#{$regwildcards_ref} + 1 ] = $symbol; + } + else + { + print STDERR "exact:" . $symbol . "\n" if $debug; + $exacts_ref->{ $symbol } = 1; + } + $i++; + } +} diff --git a/admin/oldinclude.m4.in b/admin/oldinclude.m4.in new file mode 100644 index 0000000..0b64619 --- /dev/null +++ b/admin/oldinclude.m4.in @@ -0,0 +1,192 @@ +### -*- autoconf -*- + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) +dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +AC_DEFUN([KDE_CHECK_MICO], +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_MISC_TESTS]) +AC_MSG_CHECKING(for MICO) + +if test -z "$MICODIR"; then + kde_micodir=/usr/local + else + kde_micodir="$MICODIR" +fi + +AC_ARG_WITH(micodir, + [ --with-micodir=micodir where mico is installed ], + kde_micodir=$withval, + kde_micodir=$kde_micodir +) + +AC_CACHE_VAL(kde_cv_mico_incdir, +[ + mico_incdirs="$kde_micodir/include /usr/include /usr/local/include /usr/local/include /opt/local/include $kde_extra_includes" +AC_FIND_FILE(CORBA.h, $mico_incdirs, kde_cv_mico_incdir) + +]) +kde_micodir=`echo $kde_cv_mico_incdir | sed -e 's#/include##'` + +if test ! -r $kde_micodir/include/CORBA.h; then + AC_MSG_ERROR([No CORBA.h found, specify another micodir]) +fi + +AC_MSG_RESULT($kde_micodir) + +MICO_INCLUDES=-I$kde_micodir/include +AC_SUBST(MICO_INCLUDES) +MICO_LDFLAGS=-L$kde_micodir/lib +AC_SUBST(MICO_LDFLAGS) +micodir=$kde_micodir +AC_SUBST(micodir) + +AC_MSG_CHECKING([for MICO version]) +AC_CACHE_VAL(kde_cv_mico_version, +[ +AC_LANG_C +cat >conftest.$ac_ext < +#include +int main() { + + printf("MICO_VERSION=%s\n",MICO_VERSION); + return (0); +} +EOF +ac_compile='${CC-gcc} $CFLAGS $MICO_INCLUDES conftest.$ac_ext -o conftest' +if AC_TRY_EVAL(ac_compile); then + if eval `./conftest 2>&5`; then + kde_cv_mico_version=$MICO_VERSION + else + AC_MSG_ERROR([your system is not able to execute a small application to + find MICO version! Check $kde_micodir/include/mico/version.h]) + fi +else + AC_MSG_ERROR([your system is not able to compile a small application to + find MICO version! Check $kde_micodir/include/mico/version.h]) +fi +]) + +dnl installed MICO version +mico_v_maj=`echo $kde_cv_mico_version | sed -e 's/^\(.*\)\..*\..*$/\1/'` +mico_v_mid=`echo $kde_cv_mico_version | sed -e 's/^.*\.\(.*\)\..*$/\1/'` +mico_v_min=`echo $kde_cv_mico_version | sed -e 's/^.*\..*\.\(.*\)$/\1/'` + +if test "x$1" = "x"; then + req_version="2.3.0" +else + req_version=$1 +fi + +dnl required MICO version +req_v_maj=`echo $req_version | sed -e 's/^\(.*\)\..*\..*$/\1/'` +req_v_mid=`echo $req_version | sed -e 's/^.*\.\(.*\)\..*$/\1/'` +req_v_min=`echo $req_version | sed -e 's/^.*\..*\.\(.*\)$/\1/'` + +if test "$mico_v_maj" -lt "$req_v_maj" || \ + ( test "$mico_v_maj" -eq "$req_v_maj" && \ + test "$mico_v_mid" -lt "$req_v_mid" ) || \ + ( test "$mico_v_mid" -eq "$req_v_mid" && \ + test "$mico_v_min" -lt "$req_v_min" ) + +then + AC_MSG_ERROR([found MICO version $kde_cv_mico_version but version $req_version \ +at least is required. You should upgrade MICO.]) +else + AC_MSG_RESULT([$kde_cv_mico_version (minimum version $req_version, ok)]) +fi + +LIBMICO="-lmico$kde_cv_mico_version $LIBCRYPT $LIBSOCKET $LIBDL" +AC_SUBST(LIBMICO) +if test -z "$IDL"; then + IDL='$(kde_bindir)/cuteidl' +fi +AC_SUBST(IDL) +IDL_DEPENDENCIES='$(kde_includes)/CUTE.h' +AC_SUBST(IDL_DEPENDENCIES) + +idldir="\$(includedir)/idl" +AC_SUBST(idldir) + +]) + +AC_DEFUN([KDE_CHECK_MINI_STL], +[ +AC_REQUIRE([KDE_CHECK_MICO]) + +AC_MSG_CHECKING(if we use mico's mini-STL) +AC_CACHE_VAL(kde_cv_have_mini_stl, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_cxxflags="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $MICO_INCLUDES" +AC_TRY_COMPILE( +[ +#include +], +[ +#ifdef HAVE_MINI_STL +#error "nothing" +#endif +], +kde_cv_have_mini_stl=no, +kde_cv_have_mini_stl=yes) +CXXFLAGS="$kde_save_cxxflags" +AC_LANG_RESTORE +]) + +if test "x$kde_cv_have_mini_stl" = "xyes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +]) + +AC_DEFUN([KDE_CHECK_ANSI], +[ +]) + +AC_DEFUN([KDE_CHECK_INSURE], +[ + AC_ARG_ENABLE(insure, [ --enable-insure use insure++ for debugging [default=no]], + [ + if test $enableval = "no"; dnl + then ac_use_insure="no" + else ac_use_insure="yes" + fi + ], [ac_use_insure="no"]) + + AC_MSG_CHECKING(if we will use Insure++ to debug) + AC_MSG_RESULT($ac_use_insure) + if test "$ac_use_insure" = "yes"; dnl + then CC="insure"; CXX="insure"; dnl CFLAGS="$CLAGS -fno-rtti -fno-exceptions "???? + fi +]) + +AC_DEFUN([KDE_CHECK_NEWLIBS], +[ + +]) diff --git a/admin/pkg.m4.in b/admin/pkg.m4.in new file mode 100644 index 0000000..e9c38f1 --- /dev/null +++ b/admin/pkg.m4.in @@ -0,0 +1,57 @@ + +dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) +dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page +dnl also defines GSTUFF_PKG_ERRORS on error +AC_DEFUN([PKG_CHECK_MODULES], [ + succeeded=no + + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + + if test "$PKG_CONFIG" = "no" ; then + echo "*** The pkg-config script could not be found. Make sure it is" + echo "*** in your path, or set the PKG_CONFIG environment variable" + echo "*** to the full path to pkg-config." + echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." + else + PKG_CONFIG_MIN_VERSION=0.9.0 + if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then + AC_MSG_CHECKING(for $2) + + if $PKG_CONFIG --exists "$2" ; then + AC_MSG_RESULT(yes) + succeeded=yes + + AC_MSG_CHECKING($1_CFLAGS) + $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` + AC_MSG_RESULT($$1_CFLAGS) + + AC_MSG_CHECKING($1_LIBS) + $1_LIBS=`$PKG_CONFIG --libs "$2"` + AC_MSG_RESULT($$1_LIBS) + else + $1_CFLAGS="" + $1_LIBS="" + ## If we have a custom action on failure, don't print errors, but + ## do set a variable so people can do so. + $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + ifelse([$4], ,echo $$1_PKG_ERRORS,) + fi + + AC_SUBST($1_CFLAGS) + AC_SUBST($1_LIBS) + else + echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." + echo "*** See http://www.freedesktop.org/software/pkgconfig" + fi + fi + + if test $succeeded = yes; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) + fi +]) + + diff --git a/admin/ylwrap b/admin/ylwrap new file mode 100755 index 0000000..6f5828c --- /dev/null +++ b/admin/ylwrap @@ -0,0 +1,223 @@ +#! /bin/sh +# ylwrap - wrapper for lex/yacc invocations. + +scriptversion=2005-05-14.22 + +# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# Written by Tom Tromey . +# +# 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, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case "$1" in + '') + echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 + exit 1 + ;; + --basedir) + basedir=$2 + shift 2 + ;; + -h|--h*) + cat <<\EOF +Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... + +Wrapper for lex/yacc invocations, renaming files as desired. + + INPUT is the input file + OUTPUT is one file PROG generates + DESIRED is the file we actually want instead of OUTPUT + PROGRAM is program to run + ARGS are passed to PROG + +Any number of OUTPUT,DESIRED pairs may be used. + +Report bugs to . +EOF + exit $? + ;; + -v|--v*) + echo "ylwrap $scriptversion" + exit $? + ;; +esac + + +# The input. +input="$1" +shift +case "$input" in + [\\/]* | ?:[\\/]*) + # Absolute path; do nothing. + ;; + *) + # Relative path. Make it absolute. + input="`pwd`/$input" + ;; +esac + +pairlist= +while test "$#" -ne 0; do + if test "$1" = "--"; then + shift + break + fi + pairlist="$pairlist $1" + shift +done + +# The program to run. +prog="$1" +shift +# Make any relative path in $prog absolute. +case "$prog" in + [\\/]* | ?:[\\/]*) ;; + *[\\/]*) prog="`pwd`/$prog" ;; +esac + +# FIXME: add hostname here for parallel makes that run commands on +# other machines. But that might take us over the 14-char limit. +dirname=ylwrap$$ +trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 +mkdir $dirname || exit 1 + +cd $dirname + +case $# in + 0) $prog "$input" ;; + *) $prog "$@" "$input" ;; +esac +ret=$? + +if test $ret -eq 0; then + set X $pairlist + shift + first=yes + # Since DOS filename conventions don't allow two dots, + # the DOS version of Bison writes out y_tab.c instead of y.tab.c + # and y_tab.h instead of y.tab.h. Test to see if this is the case. + y_tab_nodot="no" + if test -f y_tab.c || test -f y_tab.h; then + y_tab_nodot="yes" + fi + + # The directory holding the input. + input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` + # Quote $INPUT_DIR so we can use it in a regexp. + # FIXME: really we should care about more than `.' and `\'. + input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` + + while test "$#" -ne 0; do + from="$1" + # Handle y_tab.c and y_tab.h output by DOS + if test $y_tab_nodot = "yes"; then + if test $from = "y.tab.c"; then + from="y_tab.c" + else + if test $from = "y.tab.h"; then + from="y_tab.h" + fi + fi + fi + if test -f "$from"; then + # If $2 is an absolute path name, then just use that, + # otherwise prepend `../'. + case "$2" in + [\\/]* | ?:[\\/]*) target="$2";; + *) target="../$2";; + esac + + # We do not want to overwrite a header file if it hasn't + # changed. This avoid useless recompilations. However the + # parser itself (the first file) should always be updated, + # because it is the destination of the .y.c rule in the + # Makefile. Divert the output of all other files to a temporary + # file so we can compare them to existing versions. + if test $first = no; then + realtarget="$target" + target="tmp-`echo $target | sed s/.*[\\/]//g`" + fi + # Edit out `#line' or `#' directives. + # + # We don't want the resulting debug information to point at + # an absolute srcdir; it is better for it to just mention the + # .y file with no path. + # + # We want to use the real output file name, not yy.lex.c for + # instance. + # + # We want the include guards to be adjusted too. + FROM=`echo "$from" | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` + TARGET=`echo "$2" | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` + + sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ + -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$? + + # Check whether header files must be updated. + if test $first = no; then + if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then + echo "$2" is unchanged + rm -f "$target" + else + echo updating "$2" + mv -f "$target" "$realtarget" + fi + fi + else + # A missing file is only an error for the first file. This + # is a blatant hack to let us support using "yacc -d". If -d + # is not specified, we don't want an error when the header + # file is "missing". + if test $first = yes; then + ret=1 + fi + fi + shift + shift + first=no + done +else + ret=$? +fi + +# Remove the directory. +cd .. +rm -rf $dirname + +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/altlinux.spec b/altlinux.spec new file mode 100644 index 0000000..c23d3bb --- /dev/null +++ b/altlinux.spec @@ -0,0 +1,476 @@ +%define versuffix %nil + +%def_enable simqt +%def_enable simkde + +%if_enabled simqt +%define simqtinstalldir %_builddir/%name-%version/qtinstalldir/ +%endif + +%if_enabled simkde +%define siminstalldir %_builddir/%name-%version/installdir/ +%endif + +Name: sim +Version: 0.9.5 +Release: alt0.2 +Serial: 1 + +Group: Networking/Instant messaging +Summary: SIM - Simple Instant Messenger (with KDE support) +Summary(ru_RU.CP1251): SIM - êëèåíò ICQ/AIM/MSN/Jabber (ñ ïîääåðæêîé KDE) +License: GPL +Packager: SIM Development Team + +Url: http://sim-im.org/ + +Source: %name-%version%versuffix.tar.bz2 + +Patch0: %name-alt-play_wrapper.patch + +BuildPreReq: cmake >= 2.4.4 + +BuildPreReq: libXScrnSaver-devel + +BuildPreReq: gcc-c++ flex libqt3-devel +BuildPreReq: libssl-devel libxslt-devel zip +BuildPreReq: libpng-devel +BuildPreReq: libqt3-devel-cxx = %__gcc_version_base + +%if_enabled simkde +BuildPreReq: kdelibs-devel +BuildPreReq: kdelibs-devel-cxx = %__gcc_version_base +%endif +%if_enabled simqt +BuildPreReq: libaspell-devel +%endif + +%if_enabled simkde +Requires: %name-common >= %version-%release +Requires: sound_handler + +Obsoletes: libsim sim-plugins +#Provides: libsim sim-plugins +Conflicts: libsim-qt +Conflicts: sim-qt < 0.9.3-alt0.2 +%endif + +%description +A simple ICQ client for X win system (requires QT, +can be build for KDE). It also runs under MS Windows. +Supported protocols: ICQ v8 (2001), Jabber, MSN, AIM, YIM. + +This package contains version built with KDE support. + +%description -l ru_RU.CP1251 +Êðîññïëàòôîðìåííûé, ìíîãîïðîòîêîëüíûé êëèåíò îáìåíà ìãíîâåííûìè +ñîîáùåíèÿìè (òðåáóåò Qt, ìîæåò áûòü ñîáðàí ñ ïîääåðæêîé KDE). +Ïîääåðæèâàþòñÿ ïðîòîêîëû ICQ, Jabber, MSN, AIM, YIM, à òàêæå +LiveJournal. Êðîìå òîãî, èìååòñÿ ìíîæåñòâî ïëàãèíîâ, ðåàëèçóþùèõ +äîïîëíèòåëüíûå âîçìîæíîñòè. + +Äàííûé ïàêåò ñîäåðæèò âåðñèþ, ñîáðàííóþ ñ ïîääåðæêîé KDE. + +%if_enabled simqt +%package qt +Group: Networking/Instant messaging +Summary: SIM - Simple Instant Messenger (without KDE support) +Summary(ru_RU.CP1251): SIM - êëèåíò ICQ/AIM/MSN/Jabber (áåç ïîääåðæêè KDE) + +Requires: %name-common >= %version-%release +Requires: sound_handler + +Obsoletes: libsim-qt sim-qt-plugins +#Provides: libsim-qt sim-qt-plugins +Conflicts: libsim +Conflicts: sim < 0.9.3-alt0.2 + +%description qt +A simple ICQ client for X win system (requires QT, +can be build for KDE). It also runs under MS Windows. +Supported protocols: ICQ v8 (2001), Jabber, MSN, AIM, YIM. + +This package contains version built without KDE support. + +%description qt -l ru_RU.CP1251 +Êðîññïëàòôîðìåííûé, ìíîãîïðîòîêîëüíûé êëèåíò îáìåíà ìãíîâåííûìè +ñîîáùåíèÿìè (òðåáóåò Qt, ìîæåò áûòü ñîáðàí ñ ïîääåðæêîé KDE). +Ïîääåðæèâàþòñÿ ïðîòîêîëû ICQ, Jabber, MSN, AIM, YIM, à òàêæå +LiveJournal. Êðîìå òîãî, èìååòñÿ ìíîæåñòâî ïëàãèíîâ, ðåàëèçóþùèõ +äîïîëíèòåëüíûå âîçìîæíîñòè. + +Äàííûé ïàêåò ñîäåðæèò âåðñèþ, ñîáðàííóþ áåç ïîääåðæêè KDE. +%endif + +%package common +Group: Networking/Instant messaging +Summary: SIM - Simple Instant Messenger (data files) +Summary(ru_RU.CP1251): SIM - êëèåíò ICQ/AIM/MSN/Jabber (ôàéëû äàííûõ) + +Obsoletes: sim-data sim-qt-data +#Provides: sim-data sim-qt-data +Conflicts: sim < 0.9.0 +Conflicts: sim-qt < 0.9.0 + +%description common +A simple ICQ client for X win system (requires QT, +can be build for KDE). It also runs under MS Windows. +Supported protocols: ICQ v8 (2001), Jabber, MSN, AIM, YIM. + +This package contains common files for both sim and sim-qt. + +%description common -l ru_RU.CP1251 +Êðîññïëàòôîðìåííûé, ìíîãîïðîòîêîëüíûé êëèåíò îáìåíà ìãíîâåííûìè +ñîîáùåíèÿìè (òðåáóåò Qt, ìîæåò áûòü ñîáðàí ñ ïîääåðæêîé KDE). +Ïîääåðæèâàþòñÿ ïðîòîêîëû ICQ, Jabber, MSN, AIM, YIM, à òàêæå +LiveJournal. Êðîìå òîãî, èìååòñÿ ìíîæåñòâî ïëàãèíîâ, ðåàëèçóþùèõ +äîïîëíèòåëüíûå âîçìîæíîñòè. + +Äàííûé ïàêåò ñîäåðæèò ôàéëû äàííûõ, íåîáõîäèìûå äëÿ sim è sim-qt. + +%prep +%if_disabled simqt +%if_disabled simkde +echo "Error: one of simkde and simqt must be enabled" +exit 1 +%endif +%endif + +%setup #-n %name + +%patch0 -p1 + +%build +## Without KDE ## +%if_enabled simqt +mkdir simqt +pushd simqt +cmake %_builddir/%name-%version \ + -DCMAKE_C_FLAGS:STRING="%optflags" \ + -DCMAKE_CXX_FLAGS:STRING="%optflags" \ + -DCMAKE_INSTALL_PREFIX=%_prefix \ + -DCMAKE_SKIP_RPATH=YES \ + -DUSE_GCC_VISIBILITY=1 \ + -DENABLE_KDE3=0 \ + -DSIM_FLAVOUR="-qt" +%make_build +%makeinstall DESTDIR=%simqtinstalldir +popd +%endif + +## With KDE ## +%if_enabled simkde +mkdir simkde +pushd simkde +cmake %_builddir/%name-%version \ + -DCMAKE_C_FLAGS:STRING="%optflags" \ + -DCMAKE_CXX_FLAGS:STRING="%optflags" \ + -DCMAKE_INSTALL_PREFIX=%_prefix \ + -DCMAKE_SKIP_RPATH=YES \ + -DUSE_GCC_VISIBILITY=1 \ + -DENABLE_KDE3=1 +%make_build +%makeinstall DESTDIR=%siminstalldir +%endif + +%install +mkdir -p %buildroot/ +cp -a %siminstalldir/* %buildroot/ +cp -a %simqtinstalldir/* %buildroot/ + +%if_enabled simqt +cp %buildroot%_desktopdir/kde/%name.desktop %buildroot%_desktopdir/%name-qt.desktop +%__subst 's,^Exec=sim$,\0-qt,' %buildroot%_desktopdir/%name-qt.desktop +%__subst 's,^Name.*=Sim.*,\0 (without KDE),g' %buildroot%_desktopdir/%name-qt.desktop +%__subst '\,Categ,s,KDE;,,' %buildroot%_desktopdir/%name-qt.desktop +%endif + +rm -rf %buildroot%_libdir/libsim.so +rm -rf %buildroot%_libdir/libsim-qt.so + +%find_lang %name + +%if_enabled simkde +%post +%post_ldconfig +%update_menus +%postun +%postun_ldconfig +%clean_menus +%endif + +%if_enabled simqt +%post qt +%post_ldconfig +%update_menus +%postun qt +%postun_ldconfig +%clean_menus +%endif + +%if_enabled simkde +%files +%_bindir/%name +%_desktopdir/kde/%name.desktop +%_libdir/libsim.so.* +%dir %_libdir/%name +%_libdir/%name/*.so* +%_libdir/%name/styles/ +%endif + +%if_enabled simqt +%files qt +%_bindir/%name-qt +%_desktopdir/%name-qt.desktop +%_libdir/libsim-qt.so.* +%dir %_libdir/%name-qt +%_libdir/%name-qt/*.so* +%_libdir/%name-qt/styles/ +%endif + +%files common -f %name.lang +%_bindir/simctrl +%_datadir/apps/%name +%_datadir/services/simctrl.desktop +%_iconsdir/*/*/*/*.png + +%changelog +* Tue Feb 20 2007 Andrey Rahmatullin 1:0.9.5-alt0.2 +- 0.9.5 r1860 + +* Thu Jan 04 2007 Andrey Rahmatullin 1:0.9.5-alt0.1 +- 0.9.5 r1738 +- Daedalus build +- use CMake +- spec cleanup + +* Sat Oct 21 2006 Andrey Rahmatullin 1:0.9.4.1-alt1 +- 0.9.4.1 +- spec cleanup +- update BuildRequires + +* Thu Jul 06 2006 Andrey Rahmatullin 1:0.9.4-alt14 +- bump release + +* Thu Jun 29 2006 Andrey Rahmatullin 1:0.9.4-alt13 +- 0.9.4 release, finally :) + +* Wed May 03 2006 Andrey Rahmatullin 1:0.9.4-alt12 +- 0.9.4 RC2 + +* Sat Feb 25 2006 Andrey Rahmatullin 1:0.9.4-alt11 +- 0.9.4 RC1 +- update URL +- remove menu file + +* Mon Apr 11 2005 Andrey Rahmatullin 1:0.9.4-alt10 +- update from CVS 20050411 + +* Sat Dec 11 2004 Andrey Rahmatullin 1:0.9.4-alt9 +- update from CVS 20041211 + +* Thu Oct 07 2004 Andrey Rahmatullin 1:0.9.4-alt8.1 +- remove %_datadir/mimelnk/application/x-icq.desktop from sim-common + (#5278) + +* Tue Sep 21 2004 Andrey Rahmatullin 1:0.9.4-alt8 +- CVS 20040921 +- build autoaway plugin since it now doesn't crash +- add ability to build packages for Master 2.2 (use --enable M22) +- all fixes gone upstream + +* Sat Aug 14 2004 Andrey Rahmatullin 1:0.9.4-alt7 +- add Packager: sim@packages.a.o +- do `make clean' between two builds (fixes some segfaults in sim-kde) +- add %%{post,postun}_ldconfig +- update Russian translation for sim-qt +- some fixes + +* Fri Aug 06 2004 Andy Gorev 1:0.9.4-alt6 +- %%packager removed from spec, use ~/.rpmmacros please +- BuildPreReq and BuildReq fixed for build in hasher + +* Mon Aug 02 2004 Andrey Rahmatullin 1:0.9.4-alt5 +- fix buildreqs +- fix Patch4 +- fix Russian translation + +* Mon Jul 26 2004 Andrey Rahmatullin 1:0.9.4-alt4 +- update translations from CVS 20040726 +- add requires: sound_handler (#4314) + +* Thu Jul 22 2004 Andrey Rahmatullin 1:0.9.4-alt3.1 +- update buildreqs +- update obsoletes/conflicts + +* Fri Jul 16 2004 Andrey Rahmatullin 1:0.9.4-alt3 +- CVS 20040716 +- rebuilt without kdelibs-gcc_compiled (#4436) +- menu files fixed (#4312) +- default sound player changed from play to play_wrapper.sh (#4314) +- .so files removed (#4672) +- include all locales (see `fortune ALT -m '19 .*\?'` :)) +- Russian summaries and descriptions added +- add ability to build only sim or sim-qt + (use --disable simqt or --disable simkde) +- do not build autoaway plugin, since it segfaults on exit +- a lot of new features and bugs :( + +* Tue May 11 2004 ALT QA Team Robot 1:0.9.4-alt2.1 +- Rebuilt with openssl-0.9.7d. + +* Tue Apr 27 2004 Albert R. Valiev 1:0.9.4-alt2 +- Fixed contact list information retrieve problem + +* Fri Apr 23 2004 Albert R. Valiev 1:0.9.4-alt1 +- Change Jabber browser +- MSN: Add hotmail notification +- GPG: Add support passphrase +- ICQ: Add packets flow control +- ICQ: Fix send URL and contacts +- ICQ: Fix send large messages +- Redesign search window + +* Mon Mar 29 2004 Albert R. Valiev 1:0.9.3-alt2 +- Fixed Jabber plugin + +* Thu Mar 25 2004 Albert R. Valiev 1:0.9.3-alt1 +- Fixed build scheme +- Release build +- Add LiveJournal plugin +- Jabber: fix send rich-text messages +- ICQ: Fix set birthday flag +- Fix apply custom fonts +- Fix communication-problem with AIM-Screennames > 13 chars +- Fix not receive AuthGrant from some ICQ-users +- Proxy: add support listen sockets for SOCKS4 and SOCKS5 +- Add Yahoo! plugin +- MSN: Fix remove contact +- Add replace text plugin +- Add option "Show/hide empty groups" +- Add weather plugin +- Move plugins from prefix/share into prefix/lib +- Fix acinclude for automake-1.8 +- MSN: add HTTP polling +- Jabber: add HTTP polling +- OSD: add show message content +- Jabber: add select resource for send + +* Thu Mar 18 2004 Albert R. Valiev 1:0.9.3-alt0.2 +- Build from CVS 20040318 +- build scheme change (3 packages from 1 source RPM) +- removed kdebase from requires (#3651) +- removed /usr/share/locale/ru etc. from package (#3502) +- rename libs for kde-disabled build (to make possible installing both builds + simultaneously) +- Very big thanks to Andrey Rahmatullin for new scheme patches + +* Wed Mar 10 2004 Albert R. Valiev 1:0.9.3-alt0.1 +- Build from CVS 20040310 +- Fixed buildrequres + +* Tue Nov 04 2003 Albert R. Valiev 1:0.9.0-alt2 +- Fixed login rate bug in icq plugin + +* Mon Nov 03 2003 Albert R. Valiev 1:0.9.0-alt1 +- sim-0.9.0 release + +* Mon Oct 27 2003 Albert R. Valiev 1:0.9.0-alt0.11 +- Rebuild with 20031027 cvs snapshot + +* Tue Sep 23 2003 Albert R. Valiev 1:0.9.0-alt0.10 +- Fixed conflicts (thanks to Sergey V. Turchin for help + +* Mon Sep 22 2003 Albert R. Valiev 1:0.9.0-alt0.9 +- Now data files are in sim-common package +- Now plugins are in sim-plugins package +- Fixed conflicts and deps + +* Sun Sep 21 2003 Albert R. Valiev 1:0.9.0-alt0.8 +- Added conflicts with sim-qt, libsim-qt, sim-qt-data +- Build from cvs 20030921 + +* Fri Sep 19 2003 Albert R. Valiev 1:0.9.0-alt0.7 +- Fixed depends + +* Thu Sep 18 2003 Albert R. Valiev 1:0.9.0-alt0.6 +- Fixed buildrequires +- Enabled Jabber protocol build + +* Thu Sep 18 2003 Albert R. Valiev 1:0.9.0-alt0.5 +- Build from CVS 20030918 +- translation fixes +- Makefile fixes + +* Sun Sep 14 2003 Albert R. Valiev 1:0.9.0-alt0.4 +- Build from CVS 20030914 + +* Tue Sep 09 2003 Albert R. Valiev 1:0.9.0-alt0.3 +- Build from CVS 20030909 + +* Wed Sep 03 2003 Albert R. Valiev 1:0.9.0-alt0.2 +- Build from CVS 20030903 + +* Fri Aug 29 2003 Albert R. Valiev 1:0.9.0-alt0.1 +- Build from CVS 20030828 + +* Tue Aug 12 2003 Albert R. Valiev 1:0.8.3-alt1 +- 0.8.3 Release build + +* Sat Jun 14 2003 Albert R. Valiev 1:0.8.2-alt1 +- Release build + +* Mon Apr 21 2003 Albert R. Valiev 1:0.8.2-alt0.6 +- BuildRequires fix + +* Tue Apr 15 2003 Albert R. Valiev 1:0.8.2-alt0.5 +- Fixed crash at startup + +* Sun Apr 13 2003 Albert R. Valiev 1:0.8.2-alt0.4 +- New cvs snapshot build +- Fixed bug #0002387 + +* Fri Apr 04 2003 Albert R. Valiev 1:0.8.2-alt0.3 +- Test for bug with libqt3-3.1.2 + +* Mon Mar 17 2003 Albert R. Valiev 1:0.8.2-alt0.2 +- Build cvs snapshot for Sisyphus +- Add Bulgarian translation +- Add Hebrew translation +- Add random chat +- Add settings for groups +- Add GKrellM2 plugin +- Add French translation + +* Mon Feb 24 2003 Albert R. Valiev 1:0.8.2-alt0.1 +- Build cvs snapshot for Daedalus + +* Sun Feb 02 2003 Albert R. Valiev 1:0.8.1-alt1 +- downgrade to sim-0.8.1 + +* Mon Jan 20 2003 Albert R. Valiev 0.9-alt0.5 +- Build cvs snapshot (2003.01.20) + +* Sat Jan 04 2003 Albert R. Valiev 0.9-alt0.4 +- Build cvs snapshot (2003.01.05) + +* Thu Nov 28 2002 Albert R. Valiev 0.9-alt0.3 +- Build CVS Snaphot (fixed some bugs) + +* Sat Nov 16 2002 Albert R. Valiev 0.9-alt0.2 +- menu files attr corrections + +* Tue Nov 12 2002 Albert R. Valiev 0.9-alt0.1 +- Build CVS snapshot (because current version incompatible with glibc) + +* Sat Oct 26 2002 Albert R. Valiev 0.8-alt1 +- New version + +* Wed Oct 9 2002 Albert R. Valiev 0.7-alt3 +- Spec corrections + +* Wed Oct 9 2002 Albert R. Valiev 0.7-alt2 +- Rebuild with new KDE requirements + +* Thu Sep 12 2002 Sergey V Turchin 0.7-alt1 +- initial spec diff --git a/asp-linux.spec b/asp-linux.spec new file mode 100644 index 0000000..b2db56f --- /dev/null +++ b/asp-linux.spec @@ -0,0 +1,169 @@ +%define subversion 1 +%define date 20031105 +%define is_release 1 +%define desktop_file 1 +%define gkrellm 0 + +Summary: SIM - Simple Instant Messenger +Name: sim +Version: 0.9.1 +%if %{is_release} +Release: 1asp +%else +Release: 1.%{date}.1asp +%endif +License: GPL +Url: http://sim-im.berlios.de/ +Group: Applications/Communications +%if %{is_release} +Source: sim-%{version}.tar.bz2 +%else +Source: sim-%{date}.tar.bz2 +%endif +BuildRoot: %{_tmppath}/sim-buildroot +BuildRequires: qt-devel kdelibs-devel arts-devel /usr/bin/dos2unix /usr/bin/perl +%if %{desktop_file} +BuildRequires: desktop-file-utils +%endif + +%description +A simple ICQ client with v8 protocol support (2001) for X win system +(requires QT, can be build for KDE). It also runs under MS Windows. + +%if %{gkrellm} +%package gkrellm +Summary: sim GKrellM2 plugin +Group: Applications/Communications +Requires: gkrellm >= 2.1.0 +Requires: %{name} = %{version}-%{release} + +%description gkrellm +sim GKrellM2 plugin +%endif + +%prep + +%if %{is_release} +%setup +%else +%setup -q -n sim +%endif + +%build + +make -f admin/Makefile.common + +%if %{gkrellm} +%configure +%else +%configure --without-gkrellm_plugin +%endif + +make %{?_smp_mflags} + +%install + +rm -rf %{buildroot} +make install-strip DESTDIR=$RPM_BUILD_ROOT + +# desktop file install + +%if %{desktop_file} +mkdir -p $RPM_BUILD_ROOT/%{_datadir}/applications + +dos2unix $RPM_BUILD_ROOT%{_datadir}/applnk-redhat/Internet/sim.desktop +# perl -pi -e "s|sim.png|licq|g" $RPM_BUILD_ROOT%{_datadir}/applnk-redhat/Internet/sim.desktop + +desktop-file-install --delete-original --vendor net \ + --dir $RPM_BUILD_ROOT%{_datadir}/applications \ + --add-category X-Red-Hat-Base \ + --add-category Network \ + --add-category Application \ + $RPM_BUILD_ROOT%{_datadir}/applnk-redhat/Internet/sim.desktop +%endif + +%find_lang %{name} + +# clean unused files +rm -rf %{buildroot}%{_libdir}/menu + +%clean +rm -rf %{buildroot} + +%files -f %{name}.lang +%defattr(-, root, root, 755) +%doc AUTHORS COPYING README TODO INSTALL +%{_bindir}/sim +%{_libdir}/libsim* +%if %{desktop_file} +%{_datadir}/applications/net-sim.desktop +%else +%{_datadir}/applnk/Internet/sim.desktop +%endif +%dir %{_datadir}/apps/sim +%{_datadir}/apps/sim/COPYING +%dir %{_datadir}/apps/sim/plugins +%dir %{_datadir}/apps/sim/plugins/* +%dir %{_datadir}/apps/sim/pict +%{_datadir}/apps/sim/pict/* +%dir %{_datadir}/apps/sim/sounds +%{_datadir}/apps/sim/sounds/* +%{_datadir}/icons/*/*/*/* + +%if %{gkrellm} +%files gkrellm +%{_libdir}/gkrellm2/plugins/* +%endif + +%changelog + +* Tue Nov 11 2005 Leonid Kanter 0.9.1-1asp +- 0.9.1 + +* Wed Nov 05 2005 Leonid Kanter +- Post-release 20031105 (should fix login problem after icq servers update) + +* Wed Oct 21 2003 Leonid Kanter +- 20031021 + +* Wed Sep 24 2003 Leonid Kanter +- 20030924 + +* Wed Sep 17 2003 Leonid Kanter +- 20030917 + +* Tue Aug 26 2003 Leonid Kanter +- update to 20030826 + +* Mon Jul 28 2003 Leonid Kanter 0.9-cvs +- update to current 0.9 state + +* Sat Apr 26 2003 Leonid Kanter 0.8.2-1asp +- 0.8.2 release + +* Wed Apr 23 2003 Leonid Kanter +- build gkrellm2 plugin as separate package + +* Mon Mar 03 2003 Leonid Kanter +- cvs snapshot 20030303, more improvements in spec + +* Wed Feb 12 2003 Leonid Kanter +- new cvs snapshot, use desktop-file-utils + +* Tue Dec 17 2002 Leon Kanter +- Universal spec, included missed simctrl + +* Tue Dec 17 2002 Leon Kanter +- 0.8.1 + +* Wed Oct 23 2002 Leon Kanter +- Apply fontsize patch from cvs + +* Tue Oct 22 2002 Leon Kanter +- Built official release for asp7.3 + +* Tue Sep 24 2002 Leon Kanter +- this cvs snapshot should fix font-related problems + +* Wed Sep 11 2002 Leon Kanter +- Spec cleanup, built for asplinux%{_bindir}/sim diff --git a/cmake/COPYING-CMAKE-SCRIPTS b/cmake/COPYING-CMAKE-SCRIPTS new file mode 100644 index 0000000..ed45ca7 --- /dev/null +++ b/cmake/COPYING-CMAKE-SCRIPTS @@ -0,0 +1,27 @@ +All provided cmake scripts are distributed under the GNU Public License +version 2 or later, except for scripts that are part of KDE, which are +covered with the following license: + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cmake/CheckStructMember.cmake b/cmake/CheckStructMember.cmake new file mode 100644 index 0000000..2f0aabe --- /dev/null +++ b/cmake/CheckStructMember.cmake @@ -0,0 +1,42 @@ +# - Check if the given struct or class has the specified member variable +# CHECK_STRUCT_MEMBER (STRUCT MEMBER HEADER VARIABLE) +# +# STRUCT - the name of the struct or class you are interested in +# MEMBER - the member which existence you want to check +# HEADER - the header(s) where the prototype should be declared +# VARIABLE - variable to store the result +# +# The following variables may be set before calling this macro to +# modify the way the check is run: +# +# CMAKE_REQUIRED_FLAGS = string of compile command line flags +# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) +# CMAKE_REQUIRED_INCLUDES = list of include directories + +# Copyright (c) 2006, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +INCLUDE(CheckCXXSourceCompiles) + +MACRO (CHECK_STRUCT_MEMBER _STRUCT _MEMBER _HEADER _RESULT) + SET(_INCLUDE_FILES) + FOREACH (it ${_HEADER}) + SET(_INCLUDE_FILES "${_INCLUDE_FILES}#include <${it}>\n") + ENDFOREACH (it) + + SET(_CHECK_STRUCT_MEMBER_SOURCE_CODE " +${_INCLUDE_FILES} +int main() +{ + ${_STRUCT}* tmp; + tmp->${_MEMBER}; + return 0; +} +") + CHECK_CXX_SOURCE_COMPILES("${_CHECK_STRUCT_MEMBER_SOURCE_CODE}" ${_RESULT}) + +ENDMACRO (CHECK_STRUCT_MEMBER) + diff --git a/cmake/DistTarget.cmake b/cmake/DistTarget.cmake new file mode 100644 index 0000000..773bf22 --- /dev/null +++ b/cmake/DistTarget.cmake @@ -0,0 +1,36 @@ +# dist target +# from cmake wiki, feel free to modify + +SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sim-IM") +SET(CPACK_PACKAGE_VENDOR "Sim-IM developers") +SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README") +SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") +SET(CPACK_PACKAGE_VERSION_MAJOR "0") +SET(CPACK_PACKAGE_VERSION_MINOR "9") +SET(CPACK_PACKAGE_VERSION_PATCH "5") +#SET(CPACK_INSTALL_CMAKE_PROJECTS "sim") +SET(CPACK_PACKAGE_INSTALL_DIRECTORY "Sim-IM ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") + +IF(WIN32 AND NOT UNIX) + SET(CPACK_GENERATOR NSIS) # can be NSIS, STGZ, TBZ2, TGZ, TZ and ZIP + SET(CPACK_NSIS_COMPRESSOR "/SOLID lzma") + # There is a bug in NSI that does not handle full unix paths properly. Make + # sure there is at least one set of four (4) backlasshes. + SET(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/install_win32\\\\sim-window-small.bmp") + SET(CPACK_NSIS_INSTALLED_ICON_NAME "sim.exe") + SET(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY}") + SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.sim-im.org") + SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.sim-im.org") + SET(CPACK_NSIS_CONTACT "sim-im-main@lists.sim-im.org") + + SET(CPACK_SOURCE_GENERATOR "NSIS") + SET(CPACK_SOURCE_IGNORE_FILES "/\\\\.svn/") +ELSE(WIN32 AND NOT UNIX) + SET(CPACK_GENERATOR TBZ2) # can be STGZ, TBZ2, TGZ, TZ and ZIP + + SET(CPACK_SOURCE_GENERATOR "TBZ2;TGZ") + SET(CPACK_SOURCE_IGNORE_FILES "/install_win32/" "/sim/win32/" "/\\\\.svn/") +ENDIF(WIN32 AND NOT UNIX) +SET(CPACK_PACKAGE_EXECUTABLES "sim" "sim") + +INCLUDE(CPack) diff --git a/cmake/FindFlex.cmake b/cmake/FindFlex.cmake new file mode 100644 index 0000000..aa72e0e --- /dev/null +++ b/cmake/FindFlex.cmake @@ -0,0 +1,32 @@ +# - Try to find Flex +# Once done this will define +# +# FLEX_FOUND - system has Flex +# FLEX_EXECUTABLE - path of the flex executable +# FLEX_VERSION - the version string, like "2.5.31" +# + + +FIND_PROGRAM(FLEX_EXECUTABLE NAMES flex) + +INCLUDE(MacroEnsureVersion) + +IF(FLEX_EXECUTABLE) + SET(FLEX_FOUND TRUE) + + EXECUTE_PROCESS(COMMAND ${FLEX_EXECUTABLE} --version + OUTPUT_VARIABLE _FLEX_VERSION + ) + string (REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" FLEX_VERSION "${_FLEX_VERSION}") +ENDIF(FLEX_EXECUTABLE) + +IF(FLEX_FOUND) + IF(NOT Flex_FIND_QUIETLY) + MESSAGE(STATUS "Found Flex: ${FLEX_EXECUTABLE}") + ENDIF(NOT Flex_FIND_QUIETLY) +ELSE(FLEX_FOUND) + IF(Flex_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find Flex") + ENDIF(Flex_FIND_REQUIRED) +ENDIF(FLEX_FOUND) + diff --git a/cmake/FindLibIconv.cmake b/cmake/FindLibIconv.cmake new file mode 100644 index 0000000..85c74fa --- /dev/null +++ b/cmake/FindLibIconv.cmake @@ -0,0 +1,40 @@ +# - Try to find LibIconv +# Once done this will define +# +# LIBICONV_FOUND - system has LibIconv +# LIBICONV_INCLUDE_DIR - the LibIconv include directory +# LIBICONV_LIBRARIES - the libraries needed to use LibIconv +# LIBICONV_DEFINITIONS - Compiler switches required for using LibIconv + +if (LIBICONV_INCLUDE_DIR AND LIBICONV_LIBRARIES) + + # in cache already + SET(LIBICONV_FOUND TRUE) + +else (LIBICONV_INCLUDE_DIR AND LIBICONV_LIBRARIES) + + IF (NOT WIN32) + MESSAGE(FATAL_ERROR "Please set this to the correct values!") + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + INCLUDE(UsePkgConfig) + PKGCONFIG(libiconv-1.9 _LibIconvIncDir _LibIconvLinkDir _LibIconvLinkFlags _LiIconvCflags) + SET(LIBICONV_DEFINITIONS ${_LibIconvCflags}) + ENDIF (NOT WIN32) + + FIND_PATH(LIBICONV_INCLUDE_DIR iconv.h + PATHS + ${_LibIconvIncDir} + PATH_SUFFIXES libiconv + ) + + FIND_LIBRARY(LIBICONV_LIBRARIES NAMES iconv iconv-2 libiconv libiconv-2 + PATHS + ${_LibIconvLinkDir} + ) + + FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibIconv DEFAULT_MSG LIBICONV_INCLUDE_DIR LIBICONV_LIBRARIES) + + MARK_AS_ADVANCED(LIBICONV_INCLUDE_DIR LIBICONV_LIBRARIES) + +endif (LIBICONV_INCLUDE_DIR AND LIBICONV_LIBRARIES) diff --git a/cmake/FindLibraryWithDebug.cmake b/cmake/FindLibraryWithDebug.cmake new file mode 100644 index 0000000..07602e1 --- /dev/null +++ b/cmake/FindLibraryWithDebug.cmake @@ -0,0 +1,113 @@ +# +# FIND_LIBRARY_WITH_DEBUG +# -> enhanced FIND_LIBRARY to allow the search for an +# optional debug library with a WIN32_DEBUG_POSTFIX similar +# to CMAKE_DEBUG_POSTFIX when creating a shared lib +# it has to be the second and third argument + +# Copyright (c) 2007, Christian Ehrlicher, +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +MACRO(FIND_LIBRARY_WITH_DEBUG var_name win32_dbg_postfix_name dgb_postfix libname) + + IF(NOT "${win32_dbg_postfix_name}" STREQUAL "WIN32_DEBUG_POSTFIX") + + # no WIN32_DEBUG_POSTFIX -> simply pass all arguments to FIND_LIBRARY + FIND_LIBRARY(${var_name} + ${win32_dbg_postfix_name} + ${dgb_postfix} + ${libname} + ${ARGN} + ) + + ELSE(NOT "${win32_dbg_postfix_name}" STREQUAL "WIN32_DEBUG_POSTFIX") + + IF(NOT WIN32) + # on non-win32 we don't need to take care about WIN32_DEBUG_POSTFIX + + FIND_LIBRARY(${var_name} ${libname} ${ARGN}) + + ELSE(NOT WIN32) + + # 1. get all possible libnames + SET(args ${ARGN}) + SET(newargs "") + SET(libnames_release "") + SET(libnames_debug "") + + LIST(LENGTH args listCount) + + IF("${libname}" STREQUAL "NAMES") + SET(append_rest 0) + LIST(APPEND args " ") + + FOREACH(i RANGE ${listCount}) + LIST(GET args ${i} val) + + IF(append_rest) + LIST(APPEND newargs ${val}) + ELSE(append_rest) + IF("${val}" STREQUAL "PATHS") + LIST(APPEND newargs ${val}) + SET(append_rest 1) + ELSE("${val}" STREQUAL "PATHS") + LIST(APPEND libnames_release "${val}") + LIST(APPEND libnames_debug "${val}${dgb_postfix}") + ENDIF("${val}" STREQUAL "PATHS") + ENDIF(append_rest) + + ENDFOREACH(i) + + ELSE("${libname}" STREQUAL "NAMES") + + # just one name + LIST(APPEND libnames_release "${libname}") + LIST(APPEND libnames_debug "${libname}${dgb_postfix}") + + SET(newargs ${args}) + + ENDIF("${libname}" STREQUAL "NAMES") + + # search the release lib + FIND_LIBRARY(${var_name}_RELEASE + NAMES ${libnames_release} + ${newargs} + ) + + # search the debug lib + FIND_LIBRARY(${var_name}_DEBUG + NAMES ${libnames_debug} + ${newargs} + ) + + IF(${var_name}_RELEASE AND ${var_name}_DEBUG) + + # both libs found + SET(${var_name} optimized ${${var_name}_RELEASE} + debug ${${var_name}_DEBUG}) + + ELSE(${var_name}_RELEASE AND ${var_name}_DEBUG) + + IF(${var_name}_RELEASE) + + # only release found + SET(${var_name} ${${var_name}_RELEASE}) + + ELSE(${var_name}_RELEASE) + + # only debug (or nothing) found + SET(${var_name} ${${var_name}_DEBUG}) + + ENDIF(${var_name}_RELEASE) + + ENDIF(${var_name}_RELEASE AND ${var_name}_DEBUG) + + MARK_AS_ADVANCED(${var_name}_RELEASE) + MARK_AS_ADVANCED(${var_name}_DEBUG) + + ENDIF(NOT WIN32) + + ENDIF(NOT "${win32_dbg_postfix_name}" STREQUAL "WIN32_DEBUG_POSTFIX") + +ENDMACRO(FIND_LIBRARY_WITH_DEBUG) diff --git a/cmake/FindOpenSSL.cmake b/cmake/FindOpenSSL.cmake new file mode 100644 index 0000000..7c61fb8 --- /dev/null +++ b/cmake/FindOpenSSL.cmake @@ -0,0 +1,63 @@ +# - Try to find the OpenSSL encryption library +# Once done this will define +# +# OPENSSL_FOUND - system has the OpenSSL library +# OPENSSL_INCLUDE_DIR - the OpenSSL include directory +# OPENSSL_LIBRARIES - The libraries needed to use OpenSSL +# OPENSSL_EAY_LIBRARIES - The additional libraries needed to use OpenSSL on windows + +# Copyright (c) 2006, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +INCLUDE(FindLibraryWithDebug) + +# on win32 we additional need to link to libeay32.lib +MACRO(OPENSSL_ADD_LIB_EAY_LIBS) + FIND_LIBRARY_WITH_DEBUG(OPENSSL_EAY_LIBRARIES + WIN32_DEBUG_POSTFIX d + NAMES eay crypto libeay libeay32 libeay32MD) +ENDMACRO(OPENSSL_ADD_LIB_EAY_LIBS) + +IF(OPENSSL_LIBRARIES) + SET(OpenSSL_FIND_QUIETLY TRUE) +ENDIF(OPENSSL_LIBRARIES) + +IF(SSL_EAY_DEBUG AND SSL_EAY_RELEASE) + SET(LIB_FOUND 1) +ENDIF(SSL_EAY_DEBUG AND SSL_EAY_RELEASE) + +FIND_PATH(OPENSSL_INCLUDE_DIR openssl/ssl.h ) + +FIND_LIBRARY_WITH_DEBUG(OPENSSL_LIBRARIES + WIN32_DEBUG_POSTFIX d + NAMES ssl libssl libssl32 ssleay ssleay32 libssleay32 ssleay32MD) + +IF(WIN32 OR APPLE) + OPENSSL_ADD_LIB_EAY_LIBS() + IF(OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES AND OPENSSL_EAY_LIBRARIES) + SET(OPENSSL_FOUND TRUE) + ELSE(OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES AND OPENSSL_EAY_LIBRARIES) + SET(OPENSSL_FOUND FALSE) + ENDIF (OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES AND OPENSSL_EAY_LIBRARIES) +ELSE(WIN32 OR APPLE) + IF(OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES) + SET(OPENSSL_FOUND TRUE) + ELSE(OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES) + SET(OPENSSL_FOUND FALSE) + ENDIF (OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES) +ENDIF(WIN32 OR APPLE) + +IF (OPENSSL_FOUND) + IF (NOT OpenSSL_FIND_QUIETLY) + MESSAGE(STATUS "Found OpenSSL: ${OPENSSL_LIBRARIES}") + ENDIF (NOT OpenSSL_FIND_QUIETLY) +ELSE (OPENSSL_FOUND) + IF (OpenSSL_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could NOT find OpenSSL") + ENDIF (OpenSSL_FIND_REQUIRED) +ENDIF (OPENSSL_FOUND) + +MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES) + diff --git a/cmake/Flex.cmake b/cmake/Flex.cmake new file mode 100644 index 0000000..dbcaeb4 --- /dev/null +++ b/cmake/Flex.cmake @@ -0,0 +1,26 @@ +# flex a .ll file + +INCLUDE(FindFlex) + + +MACRO(ADD_FLEX_FILES _sources ) + FIND_PACKAGE(Flex QUIET REQUIRED) + + FOREACH (_current_FILE ${ARGN}) + GET_FILENAME_COMPONENT(_in ${_current_FILE} ABSOLUTE) + GET_FILENAME_COMPONENT(_basename ${_current_FILE} NAME_WE) + + SET(_out ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + + ADD_CUSTOM_COMMAND( + OUTPUT ${_out} + COMMAND ${FLEX_EXECUTABLE} + ARGS + -o${_out} + ${_in} + DEPENDS ${_in} + ) + + SET(${_sources} ${${_sources}} ${_out} ) + ENDFOREACH (_current_FILE) +ENDMACRO(ADD_FLEX_FILES) diff --git a/cmake/Jisp.cmake b/cmake/Jisp.cmake new file mode 100644 index 0000000..5f3661c --- /dev/null +++ b/cmake/Jisp.cmake @@ -0,0 +1,49 @@ +# a small macro to create one or more jisp archives +# ADD_JISP_ARCHIVE(jisp-subdir) + +# search zip +MACRO(FIND_ZIP) + IF(NOT ZIP_EXECUTABLE) + FIND_PROGRAM(ZIP_EXECUTABLE zip) + IF (NOT ZIP_EXECUTABLE) + MESSAGE(FATAL_ERROR "zip not found - aborting") + ENDIF (NOT ZIP_EXECUTABLE) + ENDIF(NOT ZIP_EXECUTABLE) +ENDMACRO(FIND_ZIP) + + +MACRO(ADD_JISP_ARCHIVE subdir jisp_name _sources) + FIND_ZIP() + + GET_FILENAME_COMPONENT(_in_dir ${CMAKE_CURRENT_SOURCE_DIR}/${subdir}/icondef.xml PATH) + + IF(EXISTS ${_in_dir}/icondef.xml) + FILE(GLOB _in ${_in_dir}/*.png) + SET(_in ${_in} ${_in_dir}/icondef.xml) + + IF(WIN32) + GET_FILENAME_COMPONENT(_out ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/icons/${jisp_name} ABSOLUTE) + ELSE(WIN32) + IF(APPLE) + GET_FILENAME_COMPONENT(_out ${SIM_ICONS_DIR}/${jisp_name} ABSOLUTE) + ELSE(APPLE) + GET_FILENAME_COMPONENT(_out ${CMAKE_CURRENT_BINARY_DIR}/${jisp_name} ABSOLUTE) + ENDIF(APPLE) + ENDIF(WIN32) + + FILE(WRITE ${_out}.files "") + FOREACH(_file ${_in}) + FILE(APPEND ${_out}.files "${_file}\n") + ENDFOREACH(_file ${_in}) + + ADD_CUSTOM_COMMAND( + OUTPUT ${_out} + COMMAND ${ZIP_EXECUTABLE} + -j -q -9 ${_out} -@ < ${_out}.files + DEPENDS ${_in} + ) + SET(${_sources} ${${_sources}} ${_out}) + + INSTALL(FILES ${_out} DESTINATION ${SIM_ICONS_DIR}) + ENDIF(EXISTS ${_in_dir}/icondef.xml) +ENDMACRO(ADD_JISP_ARCHIVE) diff --git a/cmake/KDE4InstallIcons.cmake b/cmake/KDE4InstallIcons.cmake new file mode 100644 index 0000000..4ea30d6 --- /dev/null +++ b/cmake/KDE4InstallIcons.cmake @@ -0,0 +1,130 @@ +# from /trunk/KDE/kdelibs/cmake/modules/KDE4Macros.cmake + +# Copyright (c) 2006, Alexander Neundorf, +# Copyright (c) 2006, Laurent Montel, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +# only used internally by KDE4_INSTALL_ICONS +MACRO (_KDE4_ADD_ICON_INSTALL_RULE _install_SCRIPT _install_PATH _group _orig_NAME _install_NAME) + + # if the string doesn't match the pattern, the result is the full string, so all three have the same content + IF (NOT ${_group} STREQUAL ${_install_NAME} ) + SET(_icon_GROUP "actions") + + IF (${_group} STREQUAL "mime") + SET(_icon_GROUP "mimetypes") + ENDIF (${_group} STREQUAL "mime") + + IF (${_group} STREQUAL "filesys") + SET(_icon_GROUP "filesystems") + ENDIF (${_group} STREQUAL "filesys") + + IF (${_group} STREQUAL "device") + SET(_icon_GROUP "devices") + ENDIF (${_group} STREQUAL "device") + + IF (${_group} STREQUAL "app") + SET(_icon_GROUP "apps") + ENDIF (${_group} STREQUAL "app") + + IF (${_group} STREQUAL "action") + SET(_icon_GROUP "actions") + ENDIF (${_group} STREQUAL "action") + +# message(STATUS "icon: ${_current_ICON} size: ${_size} group: ${_group} name: ${_name}" ) + INSTALL(FILES ${_orig_NAME} DESTINATION ${_install_PATH}/${_icon_GROUP}/ RENAME ${_install_NAME} ) + ENDIF (NOT ${_group} STREQUAL ${_install_NAME} ) + +ENDMACRO (_KDE4_ADD_ICON_INSTALL_RULE) + + +macro (KDE4_INSTALL_ICONS _defaultpath ) + + # first the png icons + file(GLOB _icons *.png) + foreach (_current_ICON ${_icons} ) + string(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\1" _type "${_current_ICON}") + string(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\2" _size "${_current_ICON}") + string(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\3" _group "${_current_ICON}") + string(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\4" _name "${_current_ICON}") + set(_theme_GROUP "nogroup") + if( ${_type} STREQUAL "cr" ) + set(_theme_GROUP "crystalsvg") + endif(${_type} STREQUAL "cr" ) + + if( ${_type} STREQUAL "lo" ) + set(_theme_GROUP "locolor") + endif(${_type} STREQUAL "lo" ) + + if( ${_type} STREQUAL "hi" ) + set(_theme_GROUP "hicolor") + endif(${_type} STREQUAL "hi" ) + + if( NOT ${_theme_GROUP} STREQUAL "nogroup") + _KDE4_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake + ${_defaultpath}/${_theme_GROUP}/${_size}x${_size} + ${_group} ${_current_ICON} ${_name}) + endif( NOT ${_theme_GROUP} STREQUAL "nogroup") + + endforeach (_current_ICON) + + # mng icons + file(GLOB _icons *.mng) + foreach (_current_ICON ${_icons} ) + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.mng)$" "\\1" _type "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.mng)$" "\\2" _size "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.mng)$" "\\3" _group "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.mng)$" "\\4" _name "${_current_ICON}") + SET(_theme_GROUP "nogroup") + if( ${_type} STREQUAL "cr" ) + SET(_theme_GROUP "crystalsvg") + endif(${_type} STREQUAL "cr" ) + + if( ${_type} STREQUAL "lo" ) + set(_theme_GROUP "locolor") + endif(${_type} STREQUAL "lo" ) + + if( ${_type} STREQUAL "hi" ) + set(_theme_GROUP "hicolor") + endif(${_type} STREQUAL "hi" ) + + if( NOT ${_theme_GROUP} STREQUAL "nogroup") + _KDE4_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake + ${_defaultpath}/${_theme_GROUP}/${_size}x${_size} + ${_group} ${_current_ICON} ${_name}) + endif( NOT ${_theme_GROUP} STREQUAL "nogroup") + + endforeach (_current_ICON) + + + # and now the svg icons + file(GLOB _icons *.svgz) + foreach (_current_ICON ${_icons} ) + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)sc\\-([a-z]+)\\-(.+\\.svgz)$" "\\1" _type "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)sc\\-([a-z]+)\\-(.+\\.svgz)$" "\\2" _group "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)sc\\-([a-z]+)\\-(.+\\.svgz)$" "\\3" _name "${_current_ICON}") + SET(_theme_GROUP "nogroup") + + if(${_type} STREQUAL "lo" ) + SET(_theme_GROUP "locolor") + endif(${_type} STREQUAL "lo" ) + + if(${_type} STREQUAL "cr" ) + SET(_theme_GROUP "crystalsvg") + endif(${_type} STREQUAL "cr" ) + + if(${_type} STREQUAL "hi" ) + SET(_theme_GROUP "hicolor") + endif(${_type} STREQUAL "hi" ) + + if( NOT ${_theme_GROUP} STREQUAL "nogroup") + _KDE4_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake + ${_defaultpath}/${_theme_GROUP}/scalable + ${_group} ${_current_ICON} ${_name}) + endif( NOT ${_theme_GROUP} STREQUAL "nogroup") + + endforeach (_current_ICON) + +endmacro (KDE4_INSTALL_ICONS) diff --git a/cmake/MacroBoolTo01.cmake b/cmake/MacroBoolTo01.cmake new file mode 100644 index 0000000..9dbbffd --- /dev/null +++ b/cmake/MacroBoolTo01.cmake @@ -0,0 +1,20 @@ +# MACRO_BOOL_TO_01( VAR RESULT0 ... RESULTN ) +# This macro evaluates its first argument +# and sets all the given vaiables either to 0 or 1 +# depending on the value of the first one + +# Copyright (c) 2006, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO(MACRO_BOOL_TO_01 FOUND_VAR ) + FOREACH (_current_VAR ${ARGN}) + IF(${FOUND_VAR}) + SET(${_current_VAR} 1) + ELSE(${FOUND_VAR}) + SET(${_current_VAR} 0) + ENDIF(${FOUND_VAR}) + ENDFOREACH(_current_VAR) +ENDMACRO(MACRO_BOOL_TO_01) diff --git a/cmake/MacroEnsureOutOfSourceBuild.cmake b/cmake/MacroEnsureOutOfSourceBuild.cmake new file mode 100644 index 0000000..ef4d525 --- /dev/null +++ b/cmake/MacroEnsureOutOfSourceBuild.cmake @@ -0,0 +1,16 @@ +# - MACRO_ENSURE_OUT_OF_SOURCE_BUILD() +# MACRO_ENSURE_OUT_OF_SOURCE_BUILD() + +# Copyright (c) 2006, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +MACRO (MACRO_ENSURE_OUT_OF_SOURCE_BUILD _errorMessage) + + STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" insource) + IF(insource) + MESSAGE(FATAL_ERROR "${_errorMessage}") + ENDIF(insource) + +ENDMACRO (MACRO_ENSURE_OUT_OF_SOURCE_BUILD) diff --git a/cmake/MacroEnsureVersion.cmake b/cmake/MacroEnsureVersion.cmake new file mode 100644 index 0000000..2d5c1a0 --- /dev/null +++ b/cmake/MacroEnsureVersion.cmake @@ -0,0 +1,35 @@ +# This macro compares version numbers of the form "x.y.z" +# MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) +# will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION +# where both have to be in a 3-part-version format, leading and trailing +# text is ok, e.g. +# MACRO_ENSURE_VERSION( "2.5.31" "flex 2.5.4a" VERSION_OK) +# which means 2.5.31 is required and "flex 2.5.4a" is what was found on the system + +# Copyright (c) 2006, David Faure, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +MACRO(MACRO_ENSURE_VERSION requested_version found_version var_too_old) + + # parse the parts of the version string + STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_major_vers "${requested_version}") + STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" req_minor_vers "${requested_version}") + STRING(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_patch_vers "${requested_version}") + + STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") + STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" found_minor_vers "${found_version}") + STRING(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_patch_vers "${found_version}") + + # compute an overall version number which can be compared at once + MATH(EXPR req_vers_num "${req_major_vers}*10000 + ${req_minor_vers}*100 + ${req_patch_vers}") + MATH(EXPR found_vers_num "${found_major_vers}*10000 + ${found_minor_vers}*100 + ${found_patch_vers}") + + if (found_vers_num LESS req_vers_num) + set( ${var_too_old} FALSE ) + else (found_vers_num LESS req_vers_num) + set( ${var_too_old} TRUE ) + endif (found_vers_num LESS req_vers_num) + +ENDMACRO(MACRO_ENSURE_VERSION) diff --git a/cmake/Po.cmake b/cmake/Po.cmake new file mode 100644 index 0000000..1904163 --- /dev/null +++ b/cmake/Po.cmake @@ -0,0 +1,98 @@ +# a small macro to create mo files out of po's + +MACRO(FIND_MSGFMT) + IF(NOT MSGFMT_EXECUTABLE) + IF(NOT MSGFMT_NOT_FOUND) + IF(WIN32) + SET(MSGFMT_NAME "msg2qm") + ELSE(WIN32) + SET(MSGFMT_NAME "msgfmt") + ENDIF(WIN32) + FIND_PROGRAM(MSGFMT_EXECUTABLE ${MSGFMT_NAME}) + + IF (NOT MSGFMT_EXECUTABLE) + SET(MSGFMT_NAME "msgfmt") + FIND_PROGRAM(MSGFMT_EXECUTABLE ${MSGFMT_NAME}) + ENDIF(NOT MSGFMT_EXECUTABLE) + + IF (NOT MSGFMT_EXECUTABLE) + MESSAGE(FATAL_ERROR "${MSGFMT_NAME} not found - po files can't be processed") + SET(MSGFMT_NOT_FOUND "1") # to avoid double checking in one cmake run + ENDIF (NOT MSGFMT_EXECUTABLE) + + MARK_AS_ADVANCED(MSGFMT_EXECUTABLE) + ENDIF(NOT MSGFMT_NOT_FOUND) + ENDIF(NOT MSGFMT_EXECUTABLE) +ENDMACRO(FIND_MSGFMT) + +MACRO(COMPILE_PO_FILES po_subdir _sources) + FIND_MSGFMT() + + IF(MSGFMT_EXECUTABLE) + FILE(GLOB po_files ${po_subdir}/*.po) + + FOREACH(po_input ${po_files}) + + GET_FILENAME_COMPONENT(_in ${po_input} ABSOLUTE) + GET_FILENAME_COMPONENT(_basename ${po_input} NAME_WE) + + IF(WIN32) + FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/po) + GET_FILENAME_COMPONENT(_out ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/po/${_basename}.qm ABSOLUTE) + FILE(TO_NATIVE_PATH ${_in} _in_native) + FILE(TO_NATIVE_PATH ${_out} _out_native) + GET_FILENAME_COMPONENT(_tmp ${MSGFMT_EXECUTABLE} NAME_WE) + + IF("${_tmp}" STREQUAL "msg2qm") + ADD_CUSTOM_COMMAND( + OUTPUT ${_out} + COMMAND ${CMAKE_COMMAND} + -E echo + "Generating" ${_out_native} "from" ${_in_native} + COMMAND ${MSGFMT_EXECUTABLE} + ${_in_native} + ${_out_native} + DEPENDS ${_in} + ) + ELSE("${_tmp}" STREQUAL "msg2qm") + ADD_CUSTOM_COMMAND( + OUTPUT ${_out} + COMMAND ${CMAKE_COMMAND} + -E echo + "Generating" ${_out_native} "from" ${_in_native} + COMMAND ${MSGFMT_EXECUTABLE} + --qt + ${_in_native} + -o + ${_out_native} + DEPENDS ${_in} + ) + ENDIF("${_tmp}" STREQUAL "msg2qm") + ELSE(WIN32) + FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/po) + GET_FILENAME_COMPONENT(_out ${CMAKE_CURRENT_BINARY_DIR}/po/${_basename}.mo ABSOLUTE) + + ADD_CUSTOM_COMMAND( + OUTPUT ${_out} + COMMAND ${CMAKE_COMMAND} + -E echo + "Generating" ${_out} "from" ${_in} + COMMAND ${MSGFMT_EXECUTABLE} + ${_in} + -o ${_out} + DEPENDS ${_in} + ) + ENDIF(WIN32) + SET(mo_files ${mo_files} ${_out}) + + IF(NOT WIN32) + INSTALL(FILES ${_out} DESTINATION ${SIM_I18N_DIR}/${_basename}/LC_MESSAGES RENAME sim.mo) + ENDIF(NOT WIN32) + ENDFOREACH(po_input ${po_files}) + + IF(WIN32) + INSTALL(FILES ${mo_files} DESTINATION ${SIM_I18N_DIR}) + ENDIF(WIN32) + SET(${_sources} ${${_sources}} ${mo_files}) + ENDIF(MSGFMT_EXECUTABLE) +ENDMACRO(COMPILE_PO_FILES po_subdir) diff --git a/cmake/SimPlugins.cmake b/cmake/SimPlugins.cmake new file mode 100644 index 0000000..2e50bef --- /dev/null +++ b/cmake/SimPlugins.cmake @@ -0,0 +1,76 @@ +# Searching and enabling plugins +MACRO(SIM_ADD_PLUGIN _name) + PROJECT(${_name}) + + SET(_srcs ${${_name}_SRCS}) + SET(_hdrs ${${_name}_HDRS}) + SET(_uics ${${_name}_UICS}) + SET(_libs ${${_name}_LIBS}) + + SET(${_name}_MESSAGE_SOURCES ${_srcs} ${_uics} PARENT_SCOPE) + + QT4_WRAP_CPP(_mocs ${_hdrs}) + QT4_WRAP_UI(_uis ${_uics}) + + SOURCE_GROUP(UI-Files FILES ${_uics}) + SOURCE_GROUP(MOC-Files FILES ${_mocs}) + + ADD_LIBRARY(${_name} SHARED ${_srcs} ${_hdrs} ${_mocs} ${_uis}) + + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + + TARGET_LINK_LIBRARIES(${_name} simlib ${_libs}) + + SET_TARGET_PROPERTIES(${_name} PROPERTIES PREFIX "") + + STRING(TOUPPER ${_name} _NAME) + SET_TARGET_PROPERTIES(${_name} PROPERTIES DEFINE_SYMBOL MAKE_${_NAME}_LIB) + + INSTALL(TARGETS ${_name} LIBRARY DESTINATION ${SIM_PLUGIN_DIR} RUNTIME DESTINATION ${SIM_PLUGIN_DIR}) + + IF(APPLE) + SET(LIBRARY_OUTPUT_PATH ${SIM_PLUGIN_DIR}) + ENDIF(APPLE) +ENDMACRO(SIM_ADD_PLUGIN) + +MACRO(SIM_FIND_PLUGINS sim_plugin_dir) + FILE(GLOB plugins_dir ${sim_plugin_dir}/* ) + FOREACH(_cur_dir ${plugins_dir}) + FILE(GLOB cmakefile ${_cur_dir}/CMakeLists.txt) + IF(cmakefile) + GET_FILENAME_COMPONENT(plugin ${_cur_dir} NAME_WE) + + STRING(TOUPPER ${plugin} uc_plugin) + OPTION(ENABLE_PLUGIN_${uc_plugin} "Enable plugin ${plugin}" ON) + + # all plugins starting with _ are *not* optional! + IF(${uc_plugin} MATCHES "^_.*$") + ## prepend + SET(SIM_PLUGINS ${plugin} ${SIM_PLUGINS}) + MARK_AS_ADVANCED(ENABLE_PLUGIN_${uc_plugin}) + ELSE(${uc_plugin} MATCHES "^_.*$") + ## append + SET(SIM_PLUGINS ${SIM_PLUGINS} ${plugin}) + ENDIF(${uc_plugin} MATCHES "^_.*$") + + LIST(SORT SIM_PLUGINS) + ENDIF(cmakefile) + ENDFOREACH(_cur_dir) +ENDMACRO(SIM_FIND_PLUGINS sim_plugin_dir) + +MACRO(SIM_INCLUDE_PLUGINS) + FOREACH(plugin ${SIM_PLUGINS}) + STRING(TOUPPER ${plugin} uc_plugin) + IF(ENABLE_PLUGIN_${uc_plugin}) + MESSAGE(STATUS "Using plugin " ${plugin}) + ADD_SUBDIRECTORY(plugins/${plugin}) + ELSE(ENABLE_PLUGIN_${uc_plugin}) + IF ( ENABLE_TARGET_UPDATE_MESSAGES ) + MESSAGE(STATUS "Using plugin " ${plugin} " for message updating purposes only...") + ADD_SUBDIRECTORY(plugins/${plugin} EXCLUDE_FROM_ALL) + ELSE( ENABLE_TARGET_UPDATE_MESSAGES) + MESSAGE(STATUS "Skipping plugin " ${plugin}) + ENDIF( ENABLE_TARGET_UPDATE_MESSAGES ) + ENDIF(ENABLE_PLUGIN_${uc_plugin}) + ENDFOREACH(plugin ${SIM_PLUGINS}) +ENDMACRO(SIM_INCLUDE_PLUGINS) diff --git a/cmake/XGetText.cmake b/cmake/XGetText.cmake new file mode 100644 index 0000000..cd63e70 --- /dev/null +++ b/cmake/XGetText.cmake @@ -0,0 +1,65 @@ +SET(XGETTEXT_OPTIONS -j --foreign-user -C -ci18n -ki18n -ktr2i18n -kI18N_NOOP -kI18N_NOOP2 -kaliasLocale) + +FIND_PROGRAM(XGETTEXT_EXECUTABLE kde-xgettext) +IF (XGETTEXT_EXECUTABLE) + MESSAGE(STATUS "Found kde-xgettext: ${XGETTEXT_EXECUTABLE}") +ELSE() + MESSAGE(SATUS "kde-xgettext not found") +ENDIF() + +FIND_PROGRAM(MSGMERGE_EXECUTABLE msgmerge) +IF (MSGMERGE_EXECUTABLE) + MESSAGE(STATUS "Found msgmerge: ${MSGMERGE_EXECUTABLE}") +ELSE() + MESSAGE(STATUS "msgmerge not found") +ENDIF() + +MACRO(EXTRACT_MESSAGES src_file po_file) + SET(PROJECT_NAME Sim-IM) # Change this if you move this file to another project + + SET(fake_ui_cpp_root "${CMAKE_CURRENT_BINARY_DIR}/fake_ui_cpp") + + IF(IS_ABSOLUTE ${src_file}) + FILE(RELATIVE_PATH relative_name ${${PROJECT_NAME}_SOURCE_DIR} ${src_file}) + ELSE(IS_ABSOLUTE ${src_file}) + SET(relative_name ${src_file}) + ENDIF(IS_ABSOLUTE ${src_file}) + + GET_FILENAME_COMPONENT(ext ${relative_name} EXT) + IF(ext STREQUAL .ui) + # creatig fake .cpp file where messages are located in the same lines as in .ui file + # and put it with the whole relative path to ${fake_ui_cpp_root} + ADD_CUSTOM_COMMAND(TARGET update-messages + COMMAND echo Extracting messages from UI-file ${relative_name} + COMMAND ${CMAKE_COMMAND} + -D IN_FILE:STRING=${${PROJECT_NAME}_SOURCE_DIR}/${relative_name} + -D OUT_FILE:STRING=${fake_ui_cpp_root}/${relative_name} + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UiToFakeCpp.cmake + ) + # parsing fake .cpp file from the ${fake_ui_cpp_root} in order to get the same path as + # path to the real .ui file + FILE(RELATIVE_PATH po_relative ${fake_ui_cpp_root} ${po_file}) # kde-xgettext do not accept full path to po-file + ADD_CUSTOM_COMMAND(TARGET update-messages + COMMAND ${XGETTEXT_EXECUTABLE} ${XGETTEXT_OPTIONS} -d${po_relative} ${relative_name} + WORKING_DIRECTORY ${fake_ui_cpp_root} + ) + ELSEIF(ext STREQUAL .cpp) + # just parse .cpp file + FILE(RELATIVE_PATH po_relative ${${PROJECT_NAME}_SOURCE_DIR} ${po_file}) # kde-xgettext do not accept full path to po-file + ADD_CUSTOM_COMMAND(TARGET update-messages + COMMAND echo Extracting messages from CPP-file ${relative_name} + COMMAND ${XGETTEXT_EXECUTABLE} ${XGETTEXT_OPTIONS} -d${po_relative} ${relative_name} + WORKING_DIRECTORY ${${PROJECT_NAME}_SOURCE_DIR} + ) + ENDIF(ext STREQUAL .ui) +ENDMACRO(EXTRACT_MESSAGES) + +MACRO(EMPTY_PO_FILE po_file) + # creating new po file with correct charset in it + # if this file is created automaticly charset will not be set + # and there would be a lot of warnings while adding new messages in it + ADD_CUSTOM_COMMAND(TARGET update-messages + COMMAND echo \"msgid \\\"\\\"\" > ${po_file}.po + COMMAND echo \"msgstr \\\"Content-Type: text/plain\; charset=UTF-8\\\"\" >> ${po_file}.po + ) +ENDMACRO(EMPTY_PO_FILE) diff --git a/cmake/cmake_uninstall.cmake.in b/cmake/cmake_uninstall.cmake.in new file mode 100644 index 0000000..559d7ce --- /dev/null +++ b/cmake/cmake_uninstall.cmake.in @@ -0,0 +1,23 @@ +# from cmake wiki +IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") +ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +STRING(REGEX REPLACE "\n" ";" files "${files}") +FOREACH(file ${files}) + MESSAGE(STATUS "Uninstalling \"${file}\"") + IF(EXISTS "${file}") + EXEC_PROGRAM( + "@CMAKE_COMMAND@" ARGS "-E remove \"${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + IF("${rm_retval}" STREQUAL 0) + ELSE("${rm_retval}" STREQUAL 0) + MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"") + ENDIF("${rm_retval}" STREQUAL 0) + ELSE(EXISTS "${file}") + MESSAGE(STATUS "File \"${file}\" does not exist.") + ENDIF(EXISTS "${file}") +ENDFOREACH(file) diff --git a/cmake/kde4uic.cmake b/cmake/kde4uic.cmake new file mode 100644 index 0000000..5a4babc --- /dev/null +++ b/cmake/kde4uic.cmake @@ -0,0 +1,53 @@ +# Copyright (c) 2006, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +#using a ui3 file with uic3 +if (KDE3_IMPL) + + EXECUTE_PROCESS(COMMAND ${KDE_UIC_EXECUTABLE} + -nounload -tr tr2i18n + -impl ${KDE_UIC_H_FILE} + ${KDE_UIC_FILE} + OUTPUT_VARIABLE _uic_CONTENTS + ERROR_QUIET + ) +endif (KDE3_IMPL) + + +if (KDE3_HEADER) + + EXECUTE_PROCESS(COMMAND ${KDE_UIC_EXECUTABLE} + -nounload -tr tr2i18n + ${KDE_UIC_FILE} + OUTPUT_VARIABLE _uic_CONTENTS + ERROR_QUIET + ) + set(KDE_UIC_CPP_FILE ${KDE_UIC_H_FILE}) +endif (KDE3_HEADER) + +# the kde4 branch +if (KDE4_HEADER) + + EXECUTE_PROCESS(COMMAND ${KDE_UIC_EXECUTABLE} + -tr tr2i18n + ${KDE_UIC_FILE} + OUTPUT_VARIABLE _uic_CONTENTS + ERROR_QUIET + ) + + set(KDE_UIC_CPP_FILE ${KDE_UIC_H_FILE}) +endif (KDE4_HEADER) + + +#replace tr218n("") with QString::null to avoid warning from KLocale +STRING(REGEX REPLACE "tr2i18n\\(\"\"\\)" "QString::null" _uic_CONTENTS "${_uic_CONTENTS}" ) +STRING(REGEX REPLACE "tr2i18n\\(\"\", \"\"\\)" "QString::null" _uic_CONTENTS "${_uic_CONTENTS}" ) +#replace image15_data with img15_filename to make enable_final work +STRING(REGEX REPLACE "image([0-9]+)_data" "img\\1_${KDE_UIC_BASENAME}" _uic_CONTENTS "${_uic_CONTENTS}") +#fixup include guard +STRING(REGEX REPLACE "#ifndef " "#ifndef UI_" _uic_CONTENTS "${_uic_CONTENTS}") +STRING(REGEX REPLACE "#define " "#define UI_" _uic_CONTENTS "${_uic_CONTENTS}") + +FILE(WRITE ${KDE_UIC_CPP_FILE} "#include \"misc.h\"\n\n${_uic_CONTENTS}\n") diff --git a/config.h.cmake b/config.h.cmake new file mode 100644 index 0000000..68e2725 --- /dev/null +++ b/config.h.cmake @@ -0,0 +1,37 @@ +// version +#define PACKAGE "sim" +#define VERSION "0.9.6" +#define PREFIX "${CMAKE_INSTALL_PREFIX}" +#define PLUGIN_PATH "${SIM_PLUGIN_DIR}" + +// header +#cmakedefine HAVE_CARBON_CARBON_H 1 +#cmakedefine HAVE_INTTYPES_H 1 +#cmakedefine HAVE_STDDEF_H 1 +#cmakedefine HAVE_STDINT_H 1 +#cmakedefine HAVE_STDLIB_H 1 +#cmakedefine HAVE_STRING_H 1 +#cmakedefine HAVE_STRCASECMP 1 +#cmakedefine HAVE_SYS_STAT_H 1 +#cmakedefine HAVE_SYS_TYPES_H 1 +#cmakedefine HAVE_UNISTD_H 1 + +// symbols +#cmakedefine HAVE_STRNCASECMP 1 + +// functions +#cmakedefine HAVE_CHMOD 1 +#cmakedefine HAVE_MMAP 1 +#cmakedefine HAVE_MUNMAP 1 +#cmakedefine HAVE_UNAME 1 + +// check for structure member +#cmakedefine HAVE_TM_GMTOFF 1 + +// libraries +#cmakedefine ENABLE_OPENSSL 1 +#cmakedefine HAVE_X 1 +#cmakedefine USE_KDE 1 + +// development builds +#cmakedefine CVS_BUILD 1 diff --git a/configure.in.in b/configure.in.in new file mode 100644 index 0000000..004bb50 --- /dev/null +++ b/configure.in.in @@ -0,0 +1,154 @@ +#MIN_CONFIG +AC_PREREQ(2.50) +AC_LANG_CPLUSPLUS +AC_LANG_C +AM_INIT_AUTOMAKE(sim,0.9.6) +AC_PROG_LIBTOOL +AC_STDC_HEADERS +AC_C_BIGENDIAN +KDE_NEED_FLEX +LFLAGS="-o${LEX_OUTPUT_ROOT}.c" +AC_SUBST(LFLAGS) +if test "$CYGWIN" = "yes"; then + LDFLAGS="$LDFLAGS --enable-auto-import" +fi +if ! echo $CXXFLAGS | fgrep '-fno-strict-aliasing' >/dev/null 2>&1 ; then + old_cxxflags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -fno-strict-aliasing" + AC_TRY_COMPILE([], [return 0;], , CXXFLAGS=$old_cxxflags) +fi +RELEASE_BUILD="no" +AC_ARG_ENABLE( + release, + [ --enable-release enable release build], + RELEASE_BUILD="$enableval") +if test "$RELEASE_BUILD" != "yes"; then + AC_DEFINE(CVS_BUILD, 1, [CVS build]) +fi + +AC_TYPE_OFF_T +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_TYPE_UID_T +AC_STRUCT_TM + +AC_PATH_X +if test $have_x = yes; then + AC_DEFINE(HAVE_X,1,[Have X Window System]) +fi + +AC_HEADER_SYS_WAIT +AC_FUNC_FORK +AC_C_INLINE +AC_C_CONST +KDE_CHECK_SSL +AC_HEADER_STDBOOL +AC_FUNC_ERROR_AT_LINE +AC_FUNC_MMAP +AC_FUNC_MKTIME +AC_FUNC_MEMCMP +AC_FUNC_MALLOC +AC_FUNC_REALLOC +AC_FUNC_STAT + +AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff, + AC_TRY_COMPILE([ + #include + ], [ + struct tm tm; + tm.tm_gmtoff = 1; + ], ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no)) +if test $ac_cv_struct_tm_gmtoff = yes; then + AC_DEFINE(HAVE_TM_GMTOFF, 1, [Define if you have a tm_gmtoff member in struct tm]) +fi + +AC_CHECK_HEADERS([arpa/inet.h netinet/in.h sys/ioctl.h sys/socket.h]) +AC_CHECK_HEADERS([fcntl.h limits.h netdb.h stddef.h termios.h]) + +AC_CHECK_FUNCS([dup2 gethostbyname gethostname inet_ntoa]) +AC_CHECK_FUNCS([memset mkdir munmap rmdir socket]) +AC_CHECK_FUNCS([strcspn strdup strerror strstr strtol strtoul]) + +AC_CHECK_FUNC(strcasecmp,[AC_DEFINE(HAVE_STRCASECMP,1,[Have strcasecmp])]) +AC_CHECK_FUNC(chmod,[AC_DEFINE(HAVE_CHMOD,1,[Have chmod])]) +AC_CHECK_FUNC(uname,[AC_DEFINE(HAVE_UNAME,1,[Have uname])]) + +AC_EGREP_HEADER(in_addr_t, netinet/in.h,, AC_DEFINE(in_addr_t,int,[defaults in_addr_t to int])) +AC_EGREP_HEADER(socklen_t, sys/socket.h,, AC_DEFINE(socklen_t,int,[defaults socklen_t to int])) + +AC_CHECK_LIB(xnet,inet_addr) +AC_CHECK_LIB(socket, socket) + +AC_MSG_CHECKING([for The Ultimate Answer]) +AC_MSG_RESULT([42]) + +EXTRA_LIBS="" +KDE_CHECK_HEADER(qsyntaxhighlighter.h,[AC_DEFINE(HAVE_QSYNTAXHIGHLIGHTER_H,1,[Have qsyntaxhighlighter.h])]) +AC_DEFINE_UNQUOTED(PREFIX, "$prefix", [Install prefix]) +AC_SUBST(EXTRA_LIBS) +if test "${exec_prefix}" = "NONE" ; then + exec_prefix=$prefix +fi +libdir=`eval echo $libdir` + +sim_plugindir="${libdir}/sim" +sim_stylesdir="\${sim_plugindir}/styles" +AC_SUBST(sim_plugindir) +AC_SUBST(sim_stylesdir) +AC_DEFINE_UNQUOTED(PLUGIN_PATH,"${sim_plugindir}",[Plugins path]) + +LIB_XML2="" +AC_PATH_PROG(XML2_CONFIG, xml2-config, no) +if test "x$XML2_CONFIG" = "xno" ; then + AC_MSG_ERROR([Executable xml2-config not found! +Seems you have no libxml2 devel files installed. +You can download it from http://xmlsoft.org/download.html +]) +fi + +LIB_XML2=`$XML2_CONFIG --libs 2>/dev/null` +CPPFLAGS="$CPPFLAGS `$XML2_CONFIG --cflags`" + +LIB_XSLT="" +AC_PATH_PROG(XSLT_CONFIG, xslt-config, no) +if test "x$XSLT_CONFIG" = "xno" ; then + AC_MSG_ERROR([Executable xslt-config not found! +Seems you have no libxslt devel files installed. +You can download it from http://xmlsoft.org/download.html +]) +fi + +LIB_XSLT=`$XSLT_CONFIG --libs 2>/dev/null` +CPPFLAGS="$CPPFLAGS `$XSLT_CONFIG --cflags`" + +AC_SUBST(LIB_XML2) +AC_SUBST(LIB_XSLT) + +ZIP_FLAGS="-j" +AC_PATH_PROG(ZIP, zip, no) +if test "x$ZIP" = "xno" ; then + AC_MSG_ERROR([Executable zip not found!]) +fi +AC_SUBST(ZIP) +AC_SUBST(ZIP_FLAGS) + +if test "$have_ssl" != "yes" -a "$want_ssl" != "no"; then + AC_MSG_ERROR([SIM requires OpenSSL library. +Please install OpenSSL (libraries and headers). +OpenSSL can be found at http://www.openssl.org +or as RPM from your local distribution site. +]) +fi + +AM_CONDITIONAL(QT_WIN, test "$kde_use_qt_win" = "yes") + +if test "$kde_use_qt_win" = "yes"; then + AC_SUBST(SIM_RC_OBJ, "sim_rc.o") + AC_SUBST(GMSGFMT, "$GMSGFMT --qt") + AC_DEFINE(SIMAPI_EXPORTS, 1, [build libsim.dll]) +fi + +AM_CONDITIONAL(ENABLE_UPDATE, false) +AM_CONDITIONAL(ENABLE_STYLES_WOOD, false) +AM_CONDITIONAL(ENABLE_STYLES_METAL, false) + diff --git a/export_nix.py b/export_nix.py new file mode 100644 index 0000000..b034024 --- /dev/null +++ b/export_nix.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# instead of non-working cpack: svn export for *nix systems +# usage: export_nix.py TARGET_DIR +# the scripts excludes windows-specific files + +import os +import sys +import subprocess +import shutil +import fnmatch +from optparse import OptionParser + +PATTERNS = [ "*.vcproj", "*.sln", "install_win32", "win32" ] +GPL_COMPATIBLE_LICENSES = [ "GPL", "LGPL", "Public Domain", "MPL", "PPL", "MIT", "BSD" ] + +parser = OptionParser() +parser.add_option("-g", "--gpl", + action="store_true", dest="gpl", + help="export only GPL files (mostly icons)") +parser.set_defaults( gpl = False ) # should be True +(options, args) = parser.parse_args() +target_dir = args[0] + +print "Exporting to target directory '%s'" % target_dir +subprocess.check_call( ["svn", "export", os.curdir, target_dir ] ) + +def remove_path( path, message ): + if os.path.isdir( relname ): + print "[%s] Deleting dir '%s'" % ( message, relname ) + shutil.rmtree( relname ) + else: + print "[%s] Deleting '%s'" % ( message, relname ) + os.remove( relname ) + +def filter_path( path ): + if not options.gpl: + return True + else: + license_path = None + if os.path.exists( path + ".license" ): + license_path = path + ".license" + elif os.path.exists( os.path.join( path, "license" ) ): + license_path = os.path.join( path, "license" ) + if not license_path: + return True + else: + license_line = open( license_path ).readlines()[0].strip() + if license_line in GPL_COMPATIBLE_LICENSES: + return True + return False + +for root, dirs, files in os.walk( target_dir ): + for relname in [ os.path.join( root, name ) for name in dirs + files ]: + for pattern in PATTERNS: + if not fnmatch.fnmatch( os.path.basename( relname ), pattern ): + continue + remove_path( relname, "pattern" ) + if not filter_path( relname ): + remove_path( relname, "license" ) + +print "Done exporting to target directory '%s'" % target_dir + +basename = os.path.basename( target_dir ) +archivename = basename + ".tar.bz2" +archivedir = os.path.dirname( os.path.abspath( target_dir ) ) +archivepath = os.path.join( archivedir, archivename ) + +print "Packing '%s' to '%s'" % ( target_dir, archivepath ) +subprocess.check_call( ["tar", "--bzip2", "-c", "-f", archivename, basename ], cwd = archivedir ) +print "Done" + diff --git a/fedora.spec b/fedora.spec new file mode 100644 index 0000000..01fb907 --- /dev/null +++ b/fedora.spec @@ -0,0 +1,122 @@ +%define rh_release %(rh_release="`rpm -q --queryformat='%{VERSION}' redhat-release | grep -v install 2>/dev/null`" ; if test $? != 0 ; then rh_release="0" ; fi ; echo "$rh_release") +%define fdr_release %(fdr_release="`rpm -q --queryformat='%{VERSION}' fedora-release | grep -v install 2>/dev/null`" ; if test $? != 0 ; then fdr_release="0" ; fi ; echo "$fdr_release") +%if %{!?_without_KDE:0}%{?_without_KDE:1} +%define with_kde 0 +%else +%define with_kde 1 +%endif +%define release 2 + +Name: sim +Version: 0.9.3 +%if %{rh_release} +Release: %{release}.rh%(dist_release="`echo "%{rh_release} * 10" | bc 2>/dev/null`" ; echo "$dist_release") +Distribution: Red Hat Linux %{rh_release} +%else +Release: %{release}.fdr%(dist_release="`echo "%{fdr_release} * 10" | bc 2>/dev/null`" ; echo "$dist_release") +Distribution: Fedora Core %{fdr_release} +%endif +Vendor: Vladimir Shutoff +Packager: Robert Scheck +Summary: SIM - Multiprotocol Instant Messenger +Summary(de): SIM - Multiprotokoll Instant Messenger +License: GPL +Group: Applications/Internet +URL: http://sim-im.berlios.de/ +Source0: %{name}-%{version}.tar.gz +BuildRequires: autoconf >= 2.52, automake >= 1.5 +BuildRequires: gcc, gcc-c++, XFree86-devel, zlib-devel, libjpeg-devel, expat-devel, flex, libart_lgpl-devel, libpng-devel, gettext +%if %{with_kde} +BuildRequires: kdelibs-devel >= 3.0.0 +Requires: kdebase >= 3.0.0, kdelibs >= 3.0.0 +%endif +BuildRequires: qt-devel >= 3.0.0, openssl-devel, pcre-devel >= 3.9, arts-devel >= 1.0, libxml2-devel, libxslt-devel +Requires: qt >= 3.0.0, openssl, arts >= 1.0, libxml2, libxslt +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +%description -l de +SIM - Multiprotokoll Instant Messenger + +SIM (Simple Instant Messenger) ist ein Plugin-basierender +open-source Instant Messenger, der verschiedene Protokolle +(ICQ, Jabber, AIM, MSN, LiveJournal, Yahoo!) unterstützt. +Dafür wird die QT-Bibliothek und X11 (mit optionaler KDE- +Unterstützung) verwendet. + +SIM hat sehr unzählige Features, viele von diesen sind +aufgelistet unter: http://sim-im.berlios.de/ + +%description +SIM - Multiprotocol Instant Messenger + +SIM (Simple Instant Messenger) is a plugins-based open- +source instant messenger that supports various protocols +(ICQ, Jabber, AIM, MSN, LiveJournal, Yahoo!). It uses the +QT library and works on X11 (with optional KDE support). + +SIM has countless features, many of them are listed at: +http://sim-im.berlios.de/ + +%prep +%setup -q +make -f admin/Makefile.common +CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" + +%configure \ +%if %{with_kde} + --enable-kde \ +%else + --disable-kde \ +%endif + $LOCALFLAGS + +%build +# Setup for parallel builds +numprocs=`egrep -c ^cpu[0-9]+ /proc/stat || :` +if [ "$numprocs" = "0" ]; then + numprocs=1 +fi + +make -j $numprocs + +%install +make install-strip DESTDIR=$RPM_BUILD_ROOT +%find_lang %{name} + +%clean +rm -rf $RPM_BUILD_ROOT +rm -rf $RPM_BUILD_DIR/%{name}-%{version} + +%files -f %{name}.lang +%defattr(-, root, root) +%doc AUTHORS COPYING ChangeLog README* TODO INSTALL +%{_bindir}/sim* +%{_libdir}/libsim* +%{_libdir}/menu/ +%{_libdir}/sim/ +%{_datadir}/applnk-redhat/Internet/sim.desktop +%{_datadir}/apps/ +%{_datadir}/icons/*/*/*/* +%{_datadir}/mimelnk/ +%{_datadir}/services/ + +%changelog +* Sat Apr 03 2004 - Robert Scheck - 0.9.3-2 +- Upgrade to 0.9.3-2 (second 0.9.3 release) + +* Wed Mar 31 2004 - Robert Scheck - 0.9.3-1 +- Upgrade to 0.9.3 +- Made the KDE support conditional +- Merged Red Hat Linux spec file into Fedora Core spec file + +* Fri Dec 26 2003 - Robert Scheck - 0.9.2-1 +- Upgrade to 0.9.2 +- Added sablotron to requirements + +* Wed Nov 05 2003 - Robert Scheck - 0.9.1-1 +- Upgrade to 0.9.1 + +* Tue Oct 28 2003 - Robert Scheck - 0.9.0-1 +- Upgrade to 0.9.0 +- Adapted spec file from Red Hat Linux + diff --git a/install_win32/VC8_deploy/Microsoft.VC80.CRT.manifest b/install_win32/VC8_deploy/Microsoft.VC80.CRT.manifest new file mode 100644 index 0000000..e949ef8 --- /dev/null +++ b/install_win32/VC8_deploy/Microsoft.VC80.CRT.manifest @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/install_win32/VC8_deploy/plugins/Microsoft.VC80.CRT.manifest b/install_win32/VC8_deploy/plugins/Microsoft.VC80.CRT.manifest new file mode 100644 index 0000000..cfa53ed --- /dev/null +++ b/install_win32/VC8_deploy/plugins/Microsoft.VC80.CRT.manifest @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/install_win32/VC8_deploy/sim.exe.intermediate.manifest b/install_win32/VC8_deploy/sim.exe.intermediate.manifest new file mode 100644 index 0000000..47be14a --- /dev/null +++ b/install_win32/VC8_deploy/sim.exe.intermediate.manifest @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/install_win32/iconv.dll b/install_win32/iconv.dll new file mode 100644 index 0000000000000000000000000000000000000000..b448e7de58e23d6496b2c4bdaee2a9be3a67e280 GIT binary patch literal 888832 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

)O<{ zt!q!$M_nIx?dv+(b-L?f*R8IvyMFF^*7dyWMHk#1(v9zq0_6oVC^3xdPV3GF&4uFb z^6tuaHHCW6OkjgH0w0tU1l>YVJLv6}fO>(tTi0y|^?`xz!ESH2zk6EujPCi}3%VC} zFX~>_y`pi(#EZ}(^2$GX4lKHYu3`)v2M?(5xmy6<=Y*!_F=AKg$- zXb-+8s)y7Q(-Yq_rYEUq5~va6^yK$c^t1rY-vqorr-uhx09`=(%YfWh0=xg#=<9ks zJu`de^sMjM(6g~;OV75R?LE7DKI}QrbFk-7&lf#sdQSJ8?YYo%vFCEnm7Z^UzU_I? z^HUE(5F!W_U<3p~f?%XzlptA;ei1wu{3>`Q_*3v& z5Guq9@xo{!Nf;-L7bXhF01clh%oXMXr``Y*dJ{0{3?T~$bFQ!(IP!j>9;op_p-(tP zI88W1I7c{7xInl_xKy}GxLUYgxIws4xJ9^2xLf$C@N?lo;Zfmn;jr+e@Rabh@T~Bh z@UrlV@VfA(@Rsmf;XUC4;d9|j;qSuN!oP(GQK$$j!im610#TGGT0|1XisD2GqLHG} zq7+dEP~%y^isy^oI`Cpq)xTQq9$>Fkz*gIUqjre~MIMn?3wULjld7Cm<)Vry7OYeuhpY(p(yRY|P@1fq~y=Qx`^j__~(fg?PdGCwf z*S&xDBE={%Rva$Ii;3cBajZBVIOPm+rZ`_*0F-f=_^l(Z5!V7O+zfm$6&T=lF-yz? z#8?7O9C#_>O=Km`oj9KeGz@peWbqFzJ$IJeWUxv^rZj;JHBrc z@UA65w3ffKtW7|nGW%FSn+ky_RRS;S?(_Bq`)2gb?_1Qjv~N}4+P?StHuZhbx2NyJ zzK{A2^&RaS?mO9cw(or3<-V(Z*ZOYvJ?(qm_oDA*-yePd^u6hWq$nvy8Yaa{Bc)N& z7-_6@lytQ8-@NI#f0d>afi=yNW&=-J3=}B^7}0uZv$R#pkW!^wpgsB0x7Je#eCJ=l zZYrfJ=>SlfX6c~R`p#rJr5>O!XG&*DXG@2q^QFtA%cU!%E2V3sYo!~cJEXg%d!!#r zKbIbo9+n=J9+M7B&q&Wo&q*&!Z%S`VA4-3cK9>G0{ZoqW5A7%PNB1Z6kL*tZf-@Ib z%er^AvbCSp&jt!o+OGnx(bRA0clLYx1O0RQ=l0L*U(mm}e`)`+{uTYZ`giy5>HoO@ z^Zxz)2m1f$Kiq$`|5*Qt{^9Ewz%Nz;ZCEF3mbC&^$d&Pc9#qOSGA(d|dSL&|U~zhf%n2-?PZp3( zkxi2=mMxVnm#vholf5U~DBCLACi_6PNA|hwglt%LMs`kiUUortNp@9sUG|Oamh6G- zq3n_DC)s1!6WLSQGucboE7@PN*RsE5A@VReR!)>h%A@76@;G1wbAkISl9vMCS0`@* zLXQh%p7@=ylLB)mm#f~XIs?(k%t5eh~niS0nD)4a(Am!LV$aN|tihhLxs5PTvK;c#R6;l*b71I?n74sA; z6sr`g6>Ah574Iu{Dt0M$D?U;jP#jboQhcE}sTfwAQJhy?R$NhBReYnkrMR#7LGf7e zRPjvlT=81*w*sL=Dnpc^$}nYwlBkSS#wkZAM*|6$4$Rv`<>Ys&tyEd5tOp*g4G1z0 z&}7{}hV=s>rcvsE^KvT(ls;upxkR}_xkkBGxnB96a*J}Sa=UVe@&n~A}?(I4KiQQ8u8WoT{K|ifXEAx@w_n zk!p!*scNNajcS)_kLn}UQPmf!uTB}Weo+0W`bqUz^|R`^ z>V*oW4pn2-1a*WuQXQ>M1ez*Mov!Xzy;W4%KunbZDaC!~m_)!W^{cgNo!X`Lsi&&v zspqQ~su!!5sF$j@skf^?Qh%!cOnpFoNPS#AtUjeat3Ic`s=ledrM|7cqrRtpp#D+) zi~6bhh5D8HwHnf(G^2qtN&{Y~0JxyH5~x;F_s;jUXlTIhFoE4+0k`wk<@5l7Bi6`( zsBvoCn%SBKnq```n$4OWnh!L)H6Lm|*BsIu)*R6s(|oBJ)|}FOr8%oPr};_qMDw%e z56xeizcnZ=MvK+rw0Lc-HeQ>k9ibfu6io*3GFk70OsTd^o2jL}vo7sGx$w0e??j78 z+pB%6R@~YFtzSD;J54)NJ4-uTJEWbjU7%g4U94TMU87yA-KgE9-K^cB{Xn}@yG#4A z_7m-X?FsFd+F|V}?G5d>+K1X7wNJG#wSQ<|YyZ|lI4;exY7(kHg0WM;KVKOie zMZh^!8LEM2r~_VsW}pMBzy@Za0|EZ%iYv8UVTR?X~|J zqt>VgSNPkFE~CfjHTsP~;}qi@3*$@UZ^l22 ze;WTX{%w3?giNprWePQ6O_8QV(+E?lX`CtDG~Se9nqZn}$}~+fO*UnjvQ5P%imAp_ zYpORjm|9G2CWeV=;+ncmy(X!t-y}0BO=^?Iq&FE%9+TG;G)*y0HBC3oH4T~OndY08 znwFWCn^v0EnAV!sncg#PGHo$!HElD!Z~DNr)3n>P$Mmu3Gt=j$L#AQVNz)nAdDA7+ zHPa2#P1Cog+ot=bho(oSpG?1)UYPzg{bhP>dSePPN10>Iapoj*vN_e9W*%?OFi$oY zn2XKj<_dGAnPRRnH<%mER5RVoG;_^8W`S8`)|&NZyV+rOnq6kMdBE&72hBs~`Q`=Y zMdoGZmFD&44d#!``^<;Ths{UK$IV}u&zR4e&zZkAe`CIFzGJ>?zHk1){Mh`n`4{su z^B-o&g0LVhC`+gXW5HT*mIzCfCE5~WiM1qHMp#B#Mp;H%$d<8|ahCCxOiPX>*OG53 zvJ_iNEM=Bv3&m1psj<{r>MTu`77N?Lw+Ji}OP@t;(O9$=y~SklT7s5Ymf4m?mKBzj zmQ|KDmbI4kmiH_hEE_GGESoJ`EZZzQEC(z{EGH}{EvGGKEN3m3E!Qn~EZ6S^luRwm{YpE7nS|Mp;SL7;Bt0!J23tX-%=FTQjYbtdp&I)_iM$wb)v2t*};G z>#X(GW^0?3YNc73R*scx?Xvb*1y-T8*DA60TNPH7RcAF=jaHM@VRc(Q)_`@Eb+&b( zb&++kb-8tob-i`7b({4A>rU%#>&MoE)??O_)(h5))+^TQ)^Dx1t#_>Vt>0T8Ssz=U zTAx{8Sbw+vWkuUUY+*LMjbMwkjj|=%Qfy>frfrff%a(5|wAI*ZZ4I_YTdR#~W7@iG zJvO0DWE0yYHknOf)7Tug0ox4QT-!q1QrkM)D%)z?8rufj7Tb2)4%;r^ys? zz02Njm)n(ggWYa-+FkYm`%L>R`#k#s`$GF7`(pc2`wII?`#Sp;`&Rq=_MP_K_K)m) z?VsC^+K=16v=7@)+0WT8+ppSh*l*dtwcoMdvp=vuvj1d%Vt;1;-TvB+a3CF_jxYz- zfpbJUVjLqJqaDePG{*!-rem@r%aP~EcN95_9VL!hN1da=(dcM(upJx+-_hmhb_g6o zN1vnLp>U`jW{1r&;P5znj-X?TV}@gtaMVGRn7({)yZ}Wof4Tq?sx?J6^9+$`^cJ;gDF11VJ(zy&SyUXQryQa9Ny5_nTx>mc^ zx;D9Xxju1y>e}b}+_m3z$aUQHrEA!A()E?=oa>V7vg?ZLYu9zx4c9H#_pTpZKe=AI zknT`7#vSI4a7VhM+|lk>_bB&hH`zVTo#D=OXS>VXq=#+%~tv?Q{>iy>6e|?+&`BxTm>ix@Wm(yXUzVyO+3ExmUY4xi`DF zxj%G&;{MeAnfs{wnESZEk8TVK2v+l3m*WJ*-J@*6m_wGmTpWIK}&)hHFuiSsQ z|8!#phy#%WF#~Y}BL_weBn_kuqz_CS$Q+nFkULN?P&rULP&d#pKpmhDFb8-8f&tM$ z??B&xazHbn9WV~q1_lPa15*a34$K&sJuq)z(ZJGy7St zb%W~%Hw|tZ+%fpk;QqlwgNFx?4Gs^U9XvO9bMW@ycY_ZG9}Yeq{CV(~!RLd24*os( z&)}QEP!Gm~_24}OPlPAZ6YU{+Vm+fgqdj9hNuE^CIL}1SBu|zn&y(*d^b~taJY}8= z55-gK5qcyZsYmV6d(0lMXPRe@XQgMgXOm~M=Y7v!&u5-t&sUyvo{OH#o-3ZOJ=Z*U zJWo77d!Blpdw%u2^8DfX)ANr9=?(YBdgHwD-jUwX-Xw3TH_bcIo8`^-mUzp&b>0SV zv$xgD^m4sIugKf)m3ie}wO8x4dcEEuZ@?S$PVvt4&hakxF7>YPuJ*3?e&F5X{mA>d z_q6wz_k{P9_pJAv_loyx?@jM5@3-E&-uvF4ypO$4z0bVQy)V75yuW+@@c!+6VQ&*XFZ z+`d7d$LIC=eF5K8-*n#$-yGjO-$LJF-%{Ul-wNMa-#XuWz74+3zAe73zHPn_e7k&m zd>{Ef_3iWR_Z{>d@_peu@4Mo=;k)Cz=ezHF=zHXQ;`_z-%J-Y^Z{I&Y$PfEN{TM&i zAMR)QNBBqiNBhV4ll>|FiT+IgB!8Aa*I(!_@t66_{nh>&f33g4-{z!2H01z@otFz^1^Kz}CRF zz|O$#z(;|7fdheqfy05LfiDBYfir<~flGmJ0zU*E1%3%U4Ll1x5BwI$3H}-QEAV#! z5kv+PBRC;AIhY&F3l;<`gY`jLkRD_NnZfoTC&&+W z1-pYiK|xR$6a{;OlAtoE4cdc_pfl(W4hFr!U~o!sdT?fNR&Z``L2zksRd7vkZE$^X zV{miuqu?jOPlJ1d`-2C92ZM)#M}uDmPX$j0&jxn{uLW-eZwK!LzYjhPJ_-IBd=-2h zd=rGG{6Cc4cYLdL{qX-JP1gbR95~=%h)voiZPJmw$CbVJ-g_tAdvVSIvf8E@ZPPYQ zdq720L_k0V6_6p~1Vn_d2!0iD3oaBzexJtk^}c`iU-$jT)vHaDG>`s~T=`t@JYUFc zd-kgAhq9-$XR=pk&tA_Nv$m`~>&SYt z{%jx{%!abzY$BV^j%R1HbJ_XqQg$<2$?j(NvIp72>>b&=vY*P{o&8+){_GdB4`v_A zelh!{?3c5TWgpKzk$p1zboTk|3)z>lFK1uP{y6(a_Gj5Qvu|bd+4r*l%)XyR=Gt?e zxhrxX%6&L@I(JR(Z0`Ep&AE@|P`TdRKyD;Anj_{&IcAQP#7C{_6ZS`Lp?R`5W>#=5Na1oc~yUAU~WR$rJLV zJT=eCbMk_`C@;y&^NPGOugYulhP)+j&D-?L~Ld zQw$U%#aMB+I9Hr6E*6)H%f+?gEyeT2TZ`G^dU2~*E>?@X#d>kScwGEc@zce7i=Quk zq4;p|i^WHaUn@RYe5Uwp@teixiq98cEdHSQQt{>DYsJ@#zb(F9{B!Xy#lIH+S^S{b zzTUBZ#rm1`o7Qh$|JeGe_2G5GI(?n9E?gI_i`OOV(slW|aox0TUU#f(*1hYY_00O* z`oj9+`pWv+`i1q|)^A^5U*BBcTHjvZSwCDqT0dTAY%n*t8@vt4hHOKzq1w=G7&c5B z<_+71eZ#fk*>G%xHo_axjrc}lBeOBRF}pFhvAnUik=@8`tZ$SzsvEV9{f)-P;l?L6 zzP$0s#?u?mYaqs`;ZOPhCXes=So&ChQ> zu=&vD7dOAW`RL~3n@?{(v-yq9XE&eQ{O;!Sn?KlmY4hdHS2lmX`R3+Zo4?(Bd-E%s z?`-~Y^Us^_Z^BE+QhTYRbVcb*>1^q`Qcnq0LYI0=m=d-`ERjpJ61~JIF-zPMR1%a_ zB~3|N(v{35SIJ%Sl)R-tDOgIB(xpskyfjgoEG?FnO3S5-rCUpdQn^$u?UW8mjZ(98 zRJybDsnVxQpDW#4`ax>6fM7m)mys|wr<|)*+OmgZuM_rw+6O`wuZMxwkTWFE!q}+ zi?s!93ARLAvMt?~VavE>+A?ohw(MJ;E$>!jtGRV)>yE8YY<+U;uC0f*9^U%W*4MTk z-+E%}nXTuxzP0t8t?zHWu=V2BOIvSj{cP*!Tff};{nk5Mf7$x$)<3rXwS_1n%U$Iw z%je2BmIum%<?(W8!E&@5E2qm7<(cwg`SxKU+vPu(|5g5=467h3?Ujy7SLLe8>B`y4b(N1) z&Q)%x+*G-_(o^ZLpewxofE0hYYLa#6@tO}>Xt%xeJioBw$m@2l4qvEW% zDuGJ4602k?GnK{4Qf0Yvp>k{G_DZ%=tduI1O0BY8*{SSRjw*Ll?yB5fxu^2E%Dt8Q zD)(0&sC=RFaOKg;S1MnvJXZO7<;lv^l@}{NsJvWxrSfX!CzYR9-mLtp^6ScPE5ED! zzVe64+m&}J?^ga^`A6mb3akpRBCGAyj%sJMyLzg6W%YFR>gqMs>#FCfH&s7c?XC7z z`>UAhKy{=#S|wD;Rce)1WmK6}R+UrbRiUb|DymAWvZ}JGscNgbs-bGHI;!rfr|Pc; zs*!4}8m}g*W7YBMM0K`0SDmjeR2Qqu)s^aM^_FVBTBsJQo7GaaTCG?2tH;$#)lXDE zS^ZS??&@c&pRYbpeYpCi>Lb-ht6!;pwfb1~@#+)RuUDU}K3#pL`i<(d)o)e5UHwk= zyVdVkU#z}VeYyIh>MPYBS6{2XUVWqb)9TNvZ&u%`{<8Yp>hG&>SN~r9NA-g$tcIv{ z)vl_YshzD|Tf3?D(b~M+Pk&C)!wW9qxOCczKz&MZg*{WZ(p_jq3sWEU%L%HLa_a@ z?UC)#ZQ?d*o4ifgW^ePix!a;`$+mo3xvk!|Y&*8y+rI6JFoA&vGentU+jEz_vT&nZr^VIE@pRVm$*yb zrSCF!nY*lA&MtRXuxs2k?^<_lyY}6{?%3|k?(*)+?%M7xyBBsZ?%uk4+iqdEvb(!` zu-n`{-u=YxCwK4K{q*j=yPx0v!tNux&+Wdj`+(<1yRYuPw)>Oa*LQ!l`-k0kcHi4Y z)Z6Oq_3ru&^&9ISt)uGbdT)K8POOvbg1V@#tZVDKx}|Qb+w0D{s~)Py>dE?8eY!qZ zpRX^}m+PzbTk7ZQh5Al?w_dOB*AMDP_2c@T^?T~~*6*)BP=BcYaQ#d5FV`Qbf2IDl z`eXGc>QB|5u79Kc&H8ioZ`Z$5|8D*J_2=t9sJ~qQQT>(rYxSSh->Cmr{ipSx*Z)v| zr~c>qyY;`-->Y}-o!Yy8@2b5I?Va7bZtteOoA-M5diOAU_`Q+6(LKT*X^*@|-Rs}u z?TPnfd&)h-o^j8#XWg^yIrf};!M)I4WG}jx+)M9$cJFh0_wL=d_u$?a_rA3E$ljxS zkL`VZ@9Di~_rAUN)4iYVy}9>`y|?y$z4xcRzwROSJNLWx&+K2jf8G8^_HWp~asQ_M zkL{!PG5gqk{62A?v`^lr>{Iud`>cKTK4%}=7wk*-W&84d&AxWuyl>xk?7Q~e``&%u zzJI^5-`qdmzia=#{rmSH*nepM%lnV)e|7({{U`Uox&Pw+5B6W#e|7)I`#;%#Yya2# zzuEuo{@eS1-v7(~-}m3&|JOd^pzQ#8aK*uu2d59t99(yB^Fhx6`k?oq?*Mx+d@yoA zKA;}Z4j2cr1Hpm#KzX1#P#w)LsGY9t^+CJb38f;e#(9JbLi8 zgU1e@IC%2lnS*B!zI*WfgBK27I{4wi%Lo5;@Z*Cw4t{>{=D}MBzdHEs!5BekhzOm3) zY~0c~-?*)Ddn4P(H42SlW4*E2*lLs;+l_-pvvJh8tMRGEryKV)?rYrNc%bpc#+Mq8 zHonsMTH~?C6OC^)o^5=$@%_fjjUP2$YrNigv+-8r*Nxva{?PbSxR*Lc72 zK?8P(IK1NU!-r=MuRA<UoGhc_MGe26~mJ;WSh4+jnh4{?XYL+T;zkbcNL6dZ~U z#fOqZ#i8<0d#F3qADRx$ht@;;q3h6d=soluh7J>l$wT*H>M(vdb~tf3bvS!Cf4F@3 zi^D%2zI*uh!z-GI=9%V4n&+A~H9y+CxjEV-G)YZzlhR~0IZa8E+Y~lMO<7afG&Rjl zUo+GUHY3eMGuccvCz^B3`Q~zSrMcF;wRu}J+blLWo26#8S!?bzcboO*Uh|ITXPWmk z?`_`Se5m>5=2x1JHJ@yLqxsF|bIl(#Uuyoa`Ev8s=1-chH{WQ!*?g<{tLAT-zi+N$ zm5#QKc8~Us8b?P*pE$bv=$@l{k3N5N-_aM29z1&J=$WHukG^&E($VWjKRA2W|x$DCvCG5=U_EIJk+OOB<-vSZV+<=A>`JGLJ?k3GlU&lEaD6x&t`|3mLk*7LNH`*nf+OP~93Lmd32=Ix5of@eadw;u zHw4B(g187SjGMv{2DO7|JPO~3$KiYNgLuK<2%dx|;wgAC9>VkSLc9Pk8r0*Bcmv*y zx8qHC^*Uwh;lp&$HKF5Y&;jo#dB~x91q_&C?1sIWOxZqf|uf?cri{gh#8a)%5ieM z0;j;s29-D^UX4@ZRX7!Xa8NNgFeo3?;52w0PKVdxw0Pwpeo%EXEQz;*l;iNAW)K9~ z@GcOb0^@ghH_nX**&aN|oZ!7UFaBf@2qZf2ql3B@6q>*#@F%Eu3Sg}OPsX1>wg6zm zpPU++#(~o<_<7tsehxQ>$KWt{5l)0Z8Ege$HGTp&fd^D39-R2ZkKxAfOgsTSiYB3H zAh}3JGtf+Q029Q7Fkws#fWc|Z943NEVkR+Dm}$%mW*M`9nZ+z&<}r(y6^sxo!iupH ztQ0H5%CQQp605?hu^OxvJB6Lb&R}P;bJ%(80(KF*gk8q2U{|qg*h%y_8bv^ZwrC%r zpMW7?2?K<|lYcy6h%ihTA&e3T1R{Y%AQLDADuG6z6F|k2zygjOhrlK92z&xW5DY2plVmN-vb zATAP@h|9zk;wo{Ch$5j$y`(-;KM6y^k_JeFBpeA(8X^q?S$mWO5x8`DBPJAPdPNvY0F(OUW{_oU9-#$ttp%tRZX3 zIx|~AK6b1kb~q9IZTd_qo83JCnv~Ba*CWL zXUJpZaqNjLW+nYrbsAKii{$s zC@4ybilPSIzLuh+=qUz@kz%5lDHfn`+9-C4gW{yPC~k^};-&Z~eoBB6q=YD8N`w-n z#3*q}f|8`9C}~Ot6sN~26O>8H6lIz+Lz$(_QRXQNlts!C1yuYfpvFc)QPI?1Y9FZp3Efoi0hsAj5#YNgt!cB+Hwq`IhXs)y>O`lxH>9j5HI?Ota9eG#kxMbI_bL z7tKxc(7ZGs%})!^g0v7VOpDN>v=}W;OVEPtYgn zQ}k*241Jb9N1vxJ&==`T^kw=AeU*-4pc%c4K1M$S!@x2I7=tG-q>LfPFk^%<${;X^ z3=)IPpfISQDo!Det6Tn3N9XFv=AL&y*@#Go55WylzEhJvAFs2FO7hM{HX z83u-qVPpU)onc{E88(KU;b1r!E{2=oVR#unhMy5&1Q{Vlm=R&b7;#2|kz}M8X-0-I z#u#TzFeVvOjA_OUW0o<;m}e|778y&7WyT6)m9fS^G11IkW*@VkiD6=y1I$4tjtPpz z%wgsTbCgM7f=C*Z%%m`>Od6BUWH6ab7L(27Fu6<~lMez!0;Z5DVv3m(rj#jT%9#qL zlBr^}@$LeQc zSXkBoYw+Z-g*C()W{t2$Sp*i5MP^Z0R2GdzXE9hL784X8*(?r=%i^*4EQlpw30WeR zm?dFJSu&QKrC=#pDwdk1VQE=9mY!u`8CfQlnPp*FSvHoP0TmY)@1 z1z90hm=$3~Sus|em0%@VDOQ@5VU4lISre>D))Z@+HN%=^&9UZL3#>)f5^I^Y!dhjm zu~2L@yO-U^?q_4zSoQ#W@Z@ldJ;WYnkFZDC1U8XPVw2evHkD0d)7cC*lg(nY*<3b< z&13V~5L>_&vPEn$Tf&yHBR2zQiA z;u5$-E}2W=Qn@rPoy*`dxhyW5%i(glJT9LLaRpo%m+RyDxdCpF8v?!X2sg@&apT+sH_1(L z)7%Vqj62Sq;7)RG;-PuHygpt(55vRq26%%f zhvvK?-Z1Z^yiVW|c_bd0N8wR-JRwiS6Z0fIDNn|e z^AtQKPsLO7G(0U&$J6r+JR{GKW^Bg=U&&6}|JUlPY$Mf?7ydW>c3-cnp zC@;o~^AfxyFU3pqGQ2U~IB$YC$(!O$^FZ&BH^-ajE$|k3OT1;?8gGTS%0uzd{9b+^ zzn_ocWBCL8K|YR;=MV9R`6K*MK7miLQPSMZg56<^KQ@U?s$U(Yx2jeHZ|%(w8Zd>h}+ckrEj7vBv+o?gC> z@8<{jL4JrI=12HZevBXIC-_Nzil646IOOB}3H~I1ia*Vt;m`8t`1AY){vv;gzsz6Z zukzRUCi2GNCSZ=1EhxxkP$LLX2=3rAsb|e9FP-oL2k$c zc_AO)fJ$PhAxEFoLS5psn*AtV$Cg+j4VB9sZ`LWNK%R0~BysZb@<2(?0;P%ktHjY5;q zEVKx%LYvSobO@b7m(VTr2)#m|&@T)KgTjz7EQ|=F!k92FObC<0lrSyK2>HS>;ka-@ zI4PVGP77y*v%)#yyl_FdC|nXQ3s;1z!ZjgEgckLR`b7OAj0h_l5DlKZDHRQghD9Ty zQ4v8z6p=(^5k*85(L{6+Q^XRnMH~@V#1rvFkVqgBibNu@NFtJoWFonUAySG|BDF{( z(uuSpy~rRkicBK2$Re_eY$ChJA##dbB8A8;@`$`5pU5u?h=QV!C@hMIqN126E=q`! zqLe5t%8159^)yTop>N9+~*#C~x=92AGd zVR1wp701MJaYCFFr^IP-Mm#1S7f*;M#Z%&G@r-y@JSUzPFNhb#OX6kmig;DLCPqon zl3q!lq+f!OU?l^R!ILEm$&h4NG9nq35F|tiNkW!TBvc7aLYFWkObJWEmT)9o2~Wb8 zKoWsOC=p4-5{X1AkxAqdg+wV)Ni-6*L@Uur^b&)_C^1RQ5{twtu}SO_hr}syN!${T z#4GVh{E~nqC<#fzl87WKiAmy;gd{0RNz#&xWK1$HnUG9MrXXf>qZmCD=mHMQ9aL^x+2BjfsSQ?Q=r7>w-3gSP~lr$~PNXMk((h2FLbV@oc zosrH;=cMz}1?i%6NxCduk*-SDq$n9$)+_6i^~*3atZYEmS}>9g$%bVkvQZg9MwF3c zWEn*ULi93*j45Nu*fNfcE91%dGDs$n31uRgSSFE4WipvurjRLRDw$fQk!fW*nO~Arl2br3Z{akU@JHZfr6{xDfkLVAykMIVueH@ zRmc=_g+ifJs1$02Mxj;c6nce0VN{qDW`#vzRoE1Eg+t*~xD;-MN8wfY6n;fO5mbZ} zVMRm{Rm2o=MM9BOq!ejIMlq%sS4=1-6;q07#f)NBF{hYUEGQNgONwR1iego<=~TLuZly=* zRr-{EWk4BJhLmAtL>X1alyPN3nN+5fX=O$^rW{vJC?}Ou%4y|{a#lH~oL4R=7nMuO zW#x);Rk;Rmd$g)o)u-xLVN_VvfNJn$;ZrrF8di;{MpXnAQAJXbK`4=`qN(UAhKi|T zsn{xximT$O_$o*xPzhBcl~^TFNmVkHT%}McRVtNQrBP{BI+b2!P#IMwm04v`SyeWb zUFA?YRW6lVXsK?af z>IwCvdP+U5o>9-L=hXA+1<-C=QZK7l)T`<>HA;il^lJJv{Thr0s~OO=7MV3enqkd| zW>iDa5J5Satf6SA8k&Z#VQ82dmWHk2Xt)}lhOdD%0*z23(ug$@jZ`Dk$TbR$QlrwS zH5!c;gtzn>gT|;afu5s9W7XI+c8x>h)VMTmjYs3v_%wb^Koiu2G+|9d6V=2taZN&# z)TA_NO-3`O8P`l`CN)!MLYDK_hk!YpBW|4zP zw^FOpsedYwcQx)~R)A-CB>2bO=;8GjCM>rt_4*G?UZ)9<-E*k=d}w!ds)&hYge?Z+BGdoht~D#`gHv|j1H?C z&<&m}?CXYf!@zSH)e(T{LIS1>1*k4G;JPq??7{-J3rEKVz6&1+F9Kk^h;(9|L?_kB zTH1@U<-KThTAfa(*BOBPVgmMy1?Vp};J-L@PMu5V)_HVZV8Qrx0bNiR(uH*qT~rs- z#dQf?QkMcgOa=%sNGCT}FZGLevkpWETpsUFdp-o~dU6wS}hV=(&2Ho`2bU5$VM(^F^kY>lHwLQ33l! z1N0Z2UVmADG3zaQD{x@!K!S1VU3$0PqxZH?mj?16{XTY~Kml5E(5P;}H zx@@}840Hp-z%;N7Yy-!@HSi3417r{wga(m8Y>7&lB9 zCJj@DX~T?R)-Y$7H!K(y4NHb)!-`=QSTZOh+SqICGxi%XMyzqbIB3Kf@x~$JuyMpV zY9ttmz=k0kDMqT1W~3V#My8QvWE(j~u90Wt8zG~>C^U+UVqnKejWVMg2r^2e%BVJK zj9R14s5csnMx)7SHd>5UOb3>zarngJhGH71NnW6GE| zW`H|0Zk#Yq8mElY#u?*WOQD$s4$YEr*|=g{HLe*^CbX&7)CZIp%w;DAXZp7kGh!MA zS_~0*F=P`3m@zaH-NZ04O)L}pvLC}YK_&rEWJD&hNn(l*vY4zUo5>Ee87J^&+$N97Yx0@=rhqAE3Yo&Dh$(7{nc}8|DQQZX(x!}Q z%rtJAFio1KOw*OHgn8eGtW#m^UaW1U>3GS8i`p7R2sQiVOE+|W;O6> zv_PoQn+;~8*TsvU$b4YF;y=ENDxwrO(oD!C0`C0n1=Zs2Q>h zTShFS7J`Kcv>LL7(h_Uv7KVjsVO^GMcox0|vIs0fi^w9jNGwty*~nX#jmn}1o{iR` zYne7ii^*cPSS(hH&0@DWTEdOn;<0!wKFf)76SRaZVN1jkwZtrOOTv=0q%3Jm#xiCZ zw@g?jEmM|h%Zz2#GH02$ELavTOO|EJie=TZW{>xO6jw{|0Jc{dWP%qj=wjS{FgQjllXShc{u z(OV5xqt#?JTdh``)o!&|9ag8+Wp!IURhur6ActjpFF>#B9liu#XegRx<41Gd(wS|HmDw`?1Njc6magd3`j zW~18}Hl~ebW7{~F#T&>bunBD;Yd3q%~qF0c#jBD>fwu}keTyBrufO1lauIog(!W3U_TCcD{gv0LpnyWQ@vJMAvJ z+wQS@fuQ3DhEC8P0*+3^9&K4V3479>vZw7C`%99oCYp?4Ts!j9QtaabKThuz_DIDxj~ zzU=Mz9RWws5pskb5l7T9G_GNL%)f!l`tsfVrb~YMff9&Z&1AoJOa~X?9wiR;SHrcRHL- zr_1SfdYoRT&*^stoIxPY};mKKC_g@z-xY8LT_IQ46>&vfF<0D`a3x(SSK5_vjkzXVlddV(v}@co1MgvZjPJl=DGQ9$SrUS-6FTxEpbcTGPm5Va4X#^x7w|7Yu!4x-feIj-6pr$ZE;)O zHn+Xy1i63|s;MDmb<83cmX9=eAC>>!qh?co4H zhzATI$RlVuLSm1^BlXCDCZqt8kjkU>Xgpev&Z7smkkMoEn1M26_1HXiAPqS^E|1&e z@p%6u4uw2nPs9`T#5{3N0_a02Pui35jCsaA6P`)WlxNyAn-eK>EchpPp61^lZ*-P?1P>s11mNbS{lbzZ&K;5B+pUbEK%j3OIQiX2|2 z_e3i4c)ebq*Y6E@gWixg?2UM%-Wbq}691cDH13@OhS8*V+B@T&_0DOANbA!9(a7L4`b@wzviPh%8_w z3FSxodx2Th@5lJD{sI5s$#9T=2pC2q{!u@{PxO<3W<&v=5zSBcGyF_H%g^?6{9HfJ z&j-elz%TTR{9?bvFTLy?Dg7#79%=kqzs|1*_L0$V0{)SuB_P@T4!_gy^1FeB6!v@l zKEEHBNI`$dAMrfU>k2 zSPP(n=wNTKFSrsI4)zBzL2Pg!I2gnQ@xh_sXpj&j21&t@AUQ}0QiHT0J;(?$gRCGs z$O&?TydXaa1qCfVNdojFaZnbN2NgkOPz596q25qms6T`WVM7BgWeFb|0@Bh*Xf#9!5ksU9IYeo>OY{%}*h{Ps z8~97y5HG|JL81R~m?S`Al7-|UMayGShcv)s(uMRP!)2Mt60(MDz-MxVoWN*uhdd!~ z$QSa50-<0i6bgq<)TUS{9!i9gp;XIn8VikwCV=8J6`Bss0Lf`CG#^?BErymt%PrGs zErbFBQ*X;)!i2HmftJLC4-bWh!y_$`i5Mn@$zckRnP_2pm=R`%Sz&gV1DqxvkeZ;d zAS?`v!s4(bEDg)T@~|ST1b&k`tO;v@;-vqN<75e2!?v(J?D&u9n;x&#A5pPR=3PggDP$V3Q zM52*+Bo;|Tl95y-9mzz-BIA*X$Yf+HG98(T%tq!S^O1$fVq__@5?PL{M%E(#BRlm+ zF;Q%EAUYTYLx<6!=x}r-IvOQJiBVFN9Hm65Q5uk*7*S@F6=g>`QErqM_ugwW6|;GM07Gb)smy;F3V9%(PbbWeSQ5;=;J7rA~=;{JFb9*l?L;dmq- zjmP5gcp{zzR#iHl`QN;%>G%vVtLEbK@rD1$Rjcu}I4Xfo^d|Ze{RvD0n;1w8o{Xv{ zh7!Yxk;G_%0Q4ym@TVw1prR${K%rtLSU{rUB)AD)f}emAf`l+3N{ADZgft;b$Pf_=fnMcKcoN=(FX2xF62Zj(SXQw_JdsEw z6RAWxkx7gt#uF2X$;4D*Ix&-&P0S_c6AOvO#EEjXl2}cwB~VFpvNze6>`!8n*yKQR z@MNquIg}hujwDBugd{OZN|J$HMNQI@^duw6OtO;fBqzyDo=8?uQjioTMM-hXw2~#| zE!RqwR3|k+x6&o`$rInolr$$#j4NBxo^&LgNmtUH^d!AWU(%lpB!kHiu&*M?DDbc1 z$pkR4Qpt2OlN?KqCntc1H3dYhndEG8E;*lENG>LqlFP}JrKrAnz=4wg2hOBqt8lsRQdSyMKkVmVUIlq=;uhdYs48ySi``=8ch?@#54(*Sd^BEMNc!*%$AMCNpsUYAY?&lL0Xs=rNwDUTAG%n z5 zmX48Cr&(VE|8ym0<%@i<{vAR}0DrGQx}~BhE-N(u^!4 z&nPm=j4GqfXfoQ2E~C#FGRBN4W6oGIR-ka%GmeZiaOfVD5(9!>% zwg12SYJ8>>2D|+f=;_`7Tl-)D>>03IK9GUE4fZ{N{Js0VDe(P8*a!SF*k1zMeXtL1 zc?{h7|FOOCb=U_V`yRObd$1nZ_rd=EZ95Np9tIozA-LWD-8S*^>oE99|Ms810QBy1nYt$!EZsM7*08T6&!i~!|-$8ycUjveFR=5LcV3{tac{8TSAqJ*&k+(h z43fe>qtw9LZ#2Qp7wqtEvj=`L7KYQTX?XLQS@3sf;kPZVz(bE_;mFf@csr~JZ@+H~ zUNi5)3yVka+n_t(!(Dg5W9EC|rHc>3zti_9ybbnMxbvx};GQ3S2i|$x3vf8*hwy#< zkKxzf|1-Gx)?dM;;@`ucUHmKj!qWTj{QYeRR$Dg$dE1qUyDywU=wa6&V9;5_Ir%vR z40QwIRL@5du$RyXXq))cHpcL*d5}Pr#l;^uV4%AYo4< zx{%*MT)h3;2omgjh`mcc0FV16#1E3MAx@uv9f9k86A>)`8u9h$JBW*=cM(wd9|#!i z9|-vN2MFlec-PVcFgA}cy?bDAq+gzUswVj3{ZMr)%Z5Y@@ z8{zudww_-sw>{3j*j9wHZ9QMxY=b{gZTsWkLEG11&9>~>JKNAhpK9a&@cy=QZ#>-Q zCp^-Iggx5!iC;b0_Ne!}ZKqB@-*(?$Uv0a1&FgJ2)KA;aSKe&v@&B^z1@!OR0zdsr z+d1+-+F;NAtL=#%1QL0%9SM7&8;Lr9C9(=Xjf7RMLEiesn~;W{9;6J>kL)--fIJ%* zMq2vF$PNSzw0r4D|2a1DrXD`>h6`e3;=BSWhpCWP{@REp zgoJh7fmFP3H}dw=_aH|$A4KXed#l0w0C_Yb=Z5z4x8K~3yo74kATjL}B(5EHYN-9Tp3!y~ zL}9-u|O5PW#n&3fk4}(suMkW&20^^zHCxEbXV-9qpW=zx_g2sQucu zcza%+Zilyxx1T{wwZqzG+As9Xw^J^xw8I6rwD&<5!TsOXE^@55!&WQpa9Fh+F5dx< zX{ViXZKM6v8<*N4`zP9I`p>lYbln3kzo-2v!Ts$p(u3_cJHFCxxclqv_xF6G{Y>|_ z+V{_Yznv0!xgB=rtL+fswf613pS8Eaf6-pP;y3LdgWhTHc=x?__1O>F&-WoZ_HOU$ zINfuqV*qw#$AxRobiB}WUB^Y(xemnRH+G06Jsr3JrUN|NblfT*?Kt~AdIurN?dXH? zJNk&?j@!=4J6<;$JCIjeI(~+5bp!#r41@d~@YBH#^`f7(C3EINQCpyj&p6)m|^jwDm{@o53=J^i))h~5;)vtBj z)cxNbe!?$0NcaD)V;lKS2T}TNhyIO!cEEbx??4OSovhOxov5>?I)~am+zIPA(|N7n zx=w2Lqn)Trs7_eExAW$&40T@7L+Cs=K6y;E|Lc35 zaK?+B?MJV6p6Pk56O;e%&a0mPRp;saZ#!X*w>x21{;~5C^q0=AtN+&74tuY&3;Jj0 zr8BTDLQh*4r0?j`cXfAN{rFW~$}2#+4+c_uj2pU!+j_cgySlGS2*Y$ejlhG;@m;6y z9PK)PKc(x6JhO{%mfQ7-ZebVfSxFc6W=)qFZs>xpwRGX6t}bMkr>mzD=u(m5T|L~f zt`K9k3+hz+|OzkuKQwFpD^2XzAN9gaLra%=f+MKyrFRs@-Yy*UK-U%LAMQf;J<@ds{?)FXXP@fwOTXC_>-t_-8TmrjDd?rH z=T7}s7vh(1boJza)^*Jrzv_an`CZo};ZI%V(|_&iB>bc6+ZW;8x5_)ZPw!vR?azO> z8|u5dTa3D{`-1$2Zj}G#?mk#g_xXHp_f^yQZg_~$eeP;XH-w~hKL@e9FJ9z#Q-YH2 z_KS+{#|_%<_=dR~c8|UL>(#r@KYq}C=lP><_~}dCx54i0{vrJCZrIt+ zbeHe^eD~?6AMA$i{!(}U#jkc7PCwCo2KHn(40;M&@0o7#4d3b}tUupT zcMZJW4eNQM`~M^DzJtdS#zEv(M@R6wexGkb?4v{r_gNy$ z^(xW*^fP!3a7q42g!KKMh#vMQF&7aF%U#tTHlqU^1_2PTT2U%29@7y9cE(_?QJJt} zdvDmo)O=U^Fl^L<_#HgMAAFFi5Ti7SmDHs2 z)zkniCME=f#MZ->qMKk)cm&oCSPDbfSHY4ytbH))SsQM{(7gMwgoHL2q~tLSoBIrA#lC`ZE$?6%koT|-v%kQ$ z_x=HcPm00<7-&+@{;;Hk40zI%hsjB;w>u|UvE7r(a&bv(E)7T$_8*$GWb5c8ZewoJ z?5rtCr(*puU zx)4a}IlnOplDs%6@!X0ew0BJsdeO$DT(G}<6tXpGp<{Pa?xO=qHF-ypst=t^iUm$5 z#hNZ9WkIea4Zz+?N`c%-Lfh{rQ7%4B0{kzM7G8Xx6dU_7X>ssJlGG3fmt-Zt`=_Je zW02|a3~MJizO6eP3(16M;c@VcU47xdaYNydjA8JsqA_rE>^OKHCJ#OdI~ATcc_w^& z8VL@4SO8b>Sa87;KK$s#Qg|?>9Nsls4aea1aE09jw;#2^vvM8qgjg56=iyp7DP#o)0_^x9ARUqrhK|XI zSa$~mHn9sLP@RRy7xY5l`VTJtDi^X2eD0UkFIMU5KIdLkRZm(+CLcETRN+ z2~iY(1Ca~8g&1ghjF``RiD);S5t$2vBQqcf zq|1gy61W|Z)3duEV-*=lTP6-Ue|Uf766hdgjCUwfK588DFn1#I5OfOiWb6!Nm4bu> zVkt;Le+H5l&ql_?aFNULBBW)D6geFzM{dqlA=_EB$et(XArtZdzf}L1_DU<$Ofb#qZt|7wj3GLvKn~=y&gF=dkYv4-i}Oc-Hn8}_9A;}kfe-f$SlYUu>JfR3CVwpJe2SO35olJge?6Vxjp6w zGKTvbIcF*qm5>mRIz&oB)uBu*l9Y6m9nukHTb_XeAekuT^j@gE8U0bv+<~Z+ zgd9}wvm;PTBx6z74!J1t@)@W^U^c2lPZBCVhKfpo(owpTY}7<_392STh(foNqMD{w zpvVXLo7x?UMxk$D^{UuhOS2~;%-I#fb2p+ zz!kG}ABvXIiW)lR6zb66^C-xniztirDk?eSCJNH-HYzvyK5C-<5h^S8DGCBSLqTGn zqn50Ei<+AL1+@kG9mU9jptB&c=>ECj(++168Y@7ftLxIx3Fr=Jz}^|{?4O19%%Y3PKd4D`wjHu~a65!ybx3=OH4qw_MA z=;?k9I)`gSx1VK2TVt!yxx?n8r$K7bXL|(E-4`rIw?UVpA(_k36H{Bzhch>z_tg1t(!J zu~RXzuo;*b$V?1mF%c8fj*Ni_XqcEPCI&g3iva*0W;sNJnb=l_;igw$T4U6hUQ??u zLaP;H@8SgSzKCl_c1eEk1@xrFEPO3x0sXDKVhb~|BBhO*o2Jk*j!3Bc5q8yEdJskEcoL7|GfA^ zuuJBT#5VTJ#TNFMij_>Cg*}u&z#=+Pv1kYl3yG&=x${|AaKj55TPMJ-Y%RmWV&zzS zLIwEP|M!(aR%0Q62Ah&;!1g#~#^#0X*cF}TV;@eb!)}cYVK<{2vFRDjSY^TrEE%#I zdjYZmd%DMVY}|`IShVgSHh$|dY#j1579M*Ji<4f(+IhFIz2Wz;O~7L;7X1thDS3&t z#lOQ=TRvl3^S)u%Rm3EJfW{}gfu!W|CCSMdkQA`({2wbLHCYAel+4ZRmOQC{cJcs7 z@8pho1Cn{u2Pdash9^T3M!;*W`p@KZ zPoOEWLlRS#AHk$N+}k+?BF;#$TeDNP)bvZ4ynjf_d;NrzHQT1AtRv;8#LTCrw970^ z8T^5hvNc|qaue(`198%n)l(`{Hm@?KFjv@8+HY{DWY6%Y6eZQCD4P6v(00lx{62Q+lVKOUYPpDFycOW=cHdc1j1x-4w|G*EQ)u z3cBJ+3Z(6M%EV4@Qu4vBb8gb#DX3?EQb>>(u!Z~|iyN0(iB3qJKLVW^3&EsbjY&(5 z&FzqizS%XkTWnV9#1*|#6^93;CO`+JLZJ9m=+oh;5bMa)Sm@}~{;}gzA^r1Gkug(J zVUTI5u%ok6mmo-~uF162lWSP1F|q8_w&TK7Xuc#>bVHfCRbxzDSY}U623)BN+Idp} zL0xJ-Ih0y@a&hW_+-0eL=*rad@#|BiDO!>FwWS^@d7g^C^DZ?8@*ce3f2@{IskxBPsl8VHOihUWo!X%w zE)D3?J}rlbNb3UDcPHhhr7h-mO_RiArY&IgP9taZ2b;|Qk98HFR(X14+RVIhX-_*$ zPTPW=nbv<5DQ$wWIBiNNep+5{aoVn)@-#@tinO-rnzXs|fV38yBkkixe;P&*Ogn^a zNORs=mS)Xcm1bGGE^UctbDC@Q&a`%}y=fEahttlsKb7_<<9yoah|khi zCcFkekNdfNyDChep%ZL!s#%fcEMAk%;ux!sPTqLC5qr zG2PQ+sXfxO7W7Vc#rIGDaCAue(wU>uJLZl{w@=PX7Z08Rwv+#h)n#`2{zKIC+!=-G z=u5@vqaY>exru`G3_z6bSCpmqvQ(tQt?Kj}wdVB69(#J|FK_w}$inm&!lrb{<0a|+ zvR8o}=+)^rayOw@hE&6J{^z7WAIxbHy~dj!?Sv2_0Ga%p|bjB^~p-e z8j;m0Yh@NLDgS&t`k2`@oj$4Xbg4>4MiW`%$Ak&{&m$@)A z8UMd_KL4w?UD-9+^RwOAo@{S+ZMHAlpIw)|AbVkUAUl{H%C652XE$UwW;bP5W~;L` z+1hMfwm#dCZOpF9o|kRPHfICbmTYUbE!&=5o$bhWW^=PkvU%D3Y(cg#Ta+!%mSmS^ z|LeLLga5N>@vqy#Lk5}PhIb~o`I-rC1!jWVQkmcuN#?)a7ZZ(*#zmh-+ePD}?V}0N z#3(G96op3-QDhVq1^>iFvC-scN;EZ^7EO4i*}D@L^GpV(H_z4 zC@$JF+AG>S+9%pK+ArEaIv_eQIw*>d=0pcaheU@)hed}+M?^G?8PS>1S<%_iIZ;BC7|oB8qU0zgN{!N@1yOpmFv^G) zMVV1nv^e@Wn)m-hKH>Z~?30TBjeKIp19%JGinrnI_-ecZ@5HH{OHy;%o6f zydPhOUw~iu|MJtZ6u%6=9KQm;62A(+8sCCngI|kZhhLB1fZvGUgx`$cg5QeYhTo3g zf&UA?6Tb_;8@~s?7rzg`AAbOU5Pt~Yia(4$f%Bnp}6|Ea9l%NV_Z|* zqPWFzk+|l#C2>pRmdCA#TN$@1ZgpHs+?xN?Ox_Z=HEvtn_P8B!f5q*L+ZDGvZcp6a zxP5W^;||0fj5`$98h0e_Xxy>5<8deAPR5=3PapqZ{f_;2Z$m>dP%JbVngUIQ#z51c z>0s==BeWB=Gqek|E3_N5J2V5D3C)7`fM!E+(4Np<(B9BK(7w=q(EiW?(1FlF|A#^| z9-0Fk3>^X;3LOR|L5D*}Ku1DHK}SQ!K*vJILB~TUKy#sa(23AV(8R1!uom1o<^`l5SO&fr^9C{}<}=v+{RAlk8^2d$ zzC*5qRo~lS*Y_9X)qmMzZkH3E(>^C5Cou<>lavF`LF6EFP&w!vOb#|DIVUA2H76}6 zJ*PuX$DB?%opZY6bj|6O(>*66C-XmPKmXnD`v1Hi1Q&yg#l_*ExOTXBTzgysE)fUA zCE?&W1P+Nq;m|k?4vS01rQlL=X}EM;2V6&7CtPP-7hG3dH(YmI1}+nqh3kRK#^G>1 zalLT8aee;9SK<2O2H*zb2I26y9Nb{s5ZqAQFx+t52;4~ADBNh=7~ELgINW&L1Y9mI z4>u7v2{#!x1veEp4L2P(12+>l3kQMBq)iANq4(yWrzX-4QR_6bHDjyaX-!tIE=L&- zdFy*iYnVTXiTrxeF4hlVx@02|D>|?FPAU+tulQ)TySC;F8K+COm2a@l=977EDZQxi z#xl|h^_SwSyfa=+{d`_WpqM_go@XAZoTs@UHfg2`6hxf&E-&3sCw!~wFHrINTP9t@00KJ0y!r0m~)RWyvv}$3Y5u^Rqqot@nX;6l{%ETsRxXK>PI39p0$sgJ1Bm>S%Jz)c+>RCNTvWz; zYkzTXW1r%$rUB}|rJ~wzzOnu>%~#7h)}k9UxG6P!(G@vZT#^Ud+Mm(1maEfUxDMedS*{`^<)@{pMjD?*`9T%B+UN*E99vj6q3VS{jr&Z{Mb+xc7ti5kd8OJuwI}LI zId^TD)#!%9l%T_1_LlpCYgU}I=2))~R!c8bpA+1w`d#{6G{Y986c|^781XFGM3$`f zGXE5%ziqhfsd&3?oZta7zq6N=tpp3`-d&OqMxY7*bC~KHDn6Ob@ zZ{V@#v)>0hlSfhKD>VGL=f_)OG`p+b$lA;# zaUt^?^NenzAX%`M-;duhI6!c~M>Y1*Pps0<@rN-J=u=3$Al4Hx2u{n(4WB_ z2OQ&#BG4$`{JZ$afoH;j(y7FE+=sIJ?opgG4hkoeUqmXg@g)#4pFh18o8QFJ>VGlu zcT*r=d5>>vRS8bzV#tIZIl?od(AsaO+XVyHV+6kGMBlt2we#4Nqqa^k`{83 zq@GyD-An2wW069{hj+ViMH;T1QpF?sW9!TfrCc~Lfiwh2VW}H(WF7+Edx=tH zCK}O1A^{S*CcUV7Ssl-wtNv+*&HbZY5Xdt`ci(oGpKujX7(=WDDQe}QC%NuXK6fnr-?)F zRAG|VRLx@iCPX>eC2Onjgc#O3ajf$LD=BzByh;6Ak>%e+>T2Hap22uRViJ2&`!Te_ z6##f9o_Cn%_f27g9XTV4c$0__%fTj_Prt>L&grLa9L6Ytio77ntIEQ{FrmP&6q z*-aBo+`d1 zjv5vN8gKWK<9hI1q1Q#~L|zsc2_m9fP4%ona<2H6(XF}J=(7aO*Q&Y+@`Do$GpSFh zv&&)x3A}NU&p?A(NiMBt+Q&+sIATJ9(3?PC0+f2oG)nRSd};he)X3g#K1`ng)JvWg zj}bPLW!%Q*CgS>9DQO)une(!kE&a&L^j4781pbhlr4Ot(l*{OL@c?gk#v zeBW*PIZ3KPkLw1?@n>3$B zGk-Ae6U^a%6dow?a$yy8@VwF>hD_YodabawV6NwN***U}Mmq47QYuqZ7t^$031g(> zfZju;5fiAFH8q~t&^GBVS(z7IBZ!RlPAIq(xu$k;+LRLRFKP>+@7xj>nXB*}rQTHN z9TOsbWjzY?F#2x#>$b^Z3iT*|b+` zo+q_pxoj2F$R^unmmH1!(9xZ}s+^h+q<^@xD<+A+GyPnoN1?#+Ykd2`!^~G5_X}Ff z0^m`}8I(4zNHoFwTi=QJQZY@s&Hc%J(c`&=rje# zJ)j29aZyectu|%z+ek3W$KnTefCrHHOe9gJpGe-tCCH944>Om#H@hDR&vK@O7BZfj z)|wIvc8W(aRK&lSOUOmG`Qh>2!RiBnY58LfUkQJSO^vNZRb`hnMf5b*Xycb4p`wbk z22faa45+!6?U3Y+c#BS}dkh{r2aIotbIBJ-`L;Wyl?(p%=6G9c1_n16{~-wT@m3PK zya6q*mamrmVE>(eml4mJD&t5UYPVe?DPU}MXHY8Y=7eTcV@qT7JuChJRuE46r^)P% z?Thvmv=e*?ywHy3Xvg`Cd~(hPV8ce23dRY4 zwpytYg;>ik)4nyt$gY?k*IZ;^d8evZT4$@f=bs_0RKIr5Wc?|gWn3Y=RCk(ylW}T# z&FdLFM(FLi<5Sho5?S<@d~Xyw**Ml#@>Cm-gtRfW8quyr>j|g12dcJJT`&a+B6qpS z6=u}i3Z+6;(9SufE~tNCxNkT_+N1~@Uhy@CC8m(-ZT%F2PEkxC*R7$DgwKV)EbXkd z)Eri$dP)6F-Yw;R^%R!A@w6?M1yEmV#}hV6i-5~KIsZkmmUPeCt#(lGBk?KaId{E6 zOwQ*|igYjPnLk3Sr93iK3;GFbK$1Eof0*)A%{I~@_dU}z`dQoRKohAm^(X5z@v)&u z_R#NZ1ZW{@31t%%!gV z)@$i^tnbBtORnka!r8XO$S+#Ww*-u;}85`+H{tNGWfKJyM*AQQG_A|$qWm58uhm}($QLz2? zRk(xXBV5%SWUVx)?F2?%6Oiv}=v88q3+VBpsr(NGZ@^iAE9{hzjed&fq-8p1T9*4n zv@JHFxWIeQKDP)ZdB%HZ#Do;2Mdf(UZ~n=e%O&yV!-}W!c9ntBU&_<$^Zs=4Tp63c zjm%TV08-*p#@xDFip8?aK!Qs15 zXA*5BwDYVH%mi-d*Q?K0JZ0|piOL-WtAHQ8&TbHA4=Hk zzrW~=><%f<+m(8rw^jAg_D{&(d?YZO*l0dWQY+M<4J=3a8RZFKkvy?-duf@@*T7JB zAZKgxWS_+{QbY4Bpn*Epc+lVo+3AmX(?V6H(4ttu6(g#AR%n%#N2w0`*)@u7d;x{% zuq;{_@#qHEzxPh`nj`FTyPn3G8XCx}Y)qxz3oIud6AHnZu~ak3F-Yp>I8{&NQPVS4 zXZ~E~Gr5{lL0G~Us+aQQzMjNOgjLeNOncm2?R%Vb^B8}R;2Pu7#&521_Rca#<6V=B zu{YABiqTme(nf1z=Yn+V8M=b7DpEi>=}WYL0fUBjj)(H(>R%#WNx$+wo(0x^wojU5 z=`GHFTR&AhTc_ZivOC)2fpSW$Z2@T<+v6GOolaP%Y7|#XGbcKlgzKAMC7JCE+j!X&dWG>hD&4^>y*!II60f`eQX` zrCprInG@NkBpKSjO+j$Z{uH@SQ9CoQ{)Y7e->$t_eOW(R4zleGOtnmbksjn7)DVT6 zxW9u)QM0p0^E<^C>3+e~TFNdyf8 z4NPayDI?SeLZ=Hd_!vtS_j~ZVj7POJRFhs7{RTENlI#2CKb4MUJ>YSP6DUSYynm0p zU-d~|CHsJGhrr1Ho717lT-QA^fkos`1m-d2w3)#gaKIh$+GL#3t!Z+HnnD*TVa*s4bUq-q>$Ts&rqCEtVuPF(T$~ z)|Jz-x>5Cd-a4L(Jgo9YnSeIlvQ@oNGm3Iw{WCw0C3T-L67#1i>l<%|W6K{^O7u>_ zO6@ORUAUjOm0Adp33KV+tq8k{{g(7kcxahXVs zEJj=Mn{NoG>+|$=jasjj#U{iM2T@53xK2`#B0cJhFt79b;qP` z?`X<#$0yOI+Ucx{#tiv&%J3q0^K$QAN&$pA>cw?krg2)-))1*G%8JZxwF}TM2sz=Qz*n ze-c)>r7PMIl@yRk~h+J%FefWoq>wKl^e zicl;Sl5jQUzJZ~c)$B@i@I!Ew?5Q<}vp|5A^|s3`M;5UQnchS~E2SHeFC(0UP4 z1dWYlyu(GDN~Lv;?49I!eyuH5mn$AcZjf#r1NF7OBSNlH`3w zBwhZYu)7+kRw}1aKAU2+cQmEsyFd?m0y~HCPPt!bmfvuXWK}rwD4(@|c>f3w5gvpA zM}&FY{fY8OYbFv{n#MB>6lb*lbzvGIDs~gz@)pkT>OV*xB)SU@9mM*t5xm6Hb&3X* zG?qPyyMlSV=9+uBa27Ar;9^FZF8)B;4N6bVJW~JaW#Vm;`DF`u3w>89SnDO3Pc0%4 zyb5M>#ir^y(JhhE3~`=|WHhr`gTx zk7;)bMuSp~vf*>FNjwsWNCmAojWE9&!85{RNeTqYEiZ4fveW_ybqKQQg&TmMhsUWokO1~=>l zvho3*1doXRzHEVOn{FBZJ7t4HAT2EHD~K&@lQdb-wChzJ^7qu9l{I@`D}4MW*;V;7 z6VyIQ66e1u(}Y^wbcSB}q}pWJr=CB5lY~mns>K8^^26cDwN*3(P~ zo>eY#%`Hn~%=Qf8nB;3z^THzuUlkr^y>1-8NEFhX;Wja66tySNEOVu9)lx!@m}CYx zKZKpdH#v4jOwqaGjhqU~v-*3!DUvS*gJ=)9qX~1$znD%~k@l;M?x1Tlp0(c8SKO&u zMJ1|_09G2YX%2CKJlT`TQk0ZYx@-E#=R2IjpTXUxG1MUj*t~bahqPAnyUMQobmvmp zVgrV^R4ArA_RYUP^A}zIUgH8Y=u^a}8PdTdNR_DHuu33>uUWLpc}DuHi1Wq%!Vu?G^78 zYvuV;Kxv=5!8L%*C2T8NM0*@am;J122%&h#O|@E+qX(s1eaPn&J!CB*zEvg>R#8xl zWGcY#9h^?OMOd_Gg=rTx+e>wguzm{G%6f9n7L6B`hBm7Pst!^Nmgz- z)K0IvMR_aqu~}*XS3b{N^vd+sRO(wzTh3h1JtMTM68(HlAMI^ZWqnh%h*@cP70Pv; zA^R%Ua^46ZxqmXt8y^$`HRBHP_5#ibTVTNf2?+nE2Ugz#TQJKI&(wM>bMw=AIz;R?lO1ATHrP z=VY^T)EoVW0=t#Fr6c7t>Jr6gD4!`L;;Fii?vs=%_F>->SuNqP#!el7a^zUMF>eSvv%v9%(w3S<{H%ly4%|7kD*TU@1?zBE#)MX3@-bq z+zQmpuasS3UUS*QWgc1MkO)k^0(7{R(=D!M$`^jn_qL#r8c&~~^2K{5gdz#$kuLfwtBdPsqQC2D%&wG?x``km zeTr&QY-Y~$c}czLTc}u}RmApA@}ewKyUhQfDoXlUyKwu@#YuOez%8t1 z+6|-gUoiJ-AC~FohpP@qFKE^X>wN=?X{?cs1PPbYfp^Qml>at$pW9|oaE6p;a6J4L zS%El#fM)mf-XI(ThH4gt?(hbPOuT(kwO3qGYMx4R0&ggCf0*})`oYoQYX_tU)2na! z7_xJ!W?^?NRNYJW)6&iB3alaq#k;=>YMwH z8}0vYxTBC)9ObRi<`j$}(Cr_^YsiNj1HIn@BqNddLRzdhHZJ7#RsQBB6Vh~2-)2FP z_qefCVrL(7IT#VayTZSe$WmPJx3AF4r9;f|p5vq${98NZgEAo8iD+@wSXT~*Mlk}~vXZ|vc;qEZ)_A9(Z#yS22 z{WdR|azR+2Kjt12I%?V*u$qPz)YL)5bImZ8+TUCBtT>-|UtE;WBIeUqv;XJ5@9(IW z04L;<(1a*^3MG{gCUheVZjv%f3wjgw=qC_TDbol87-N)j3R?Q0;0aLQaHY(oO>Z7f zXeOYWS%gx;LW0Z6WJ+nMf};d4Wie$rWhG@JMOa_#?L_$-RM-Ym##2~c5vZcYk`u^C zP>~z*ZzXOvsJ)ed>f0v!JhGK+A^XV-$yO58yq9o303u#Q+mv=Mzo6VXUq3krhki2>p>;tS#{ z;xXcF;$z}n;w9n(;x}R+PyqZ)?4OSU9l-(le~4Z3;h-?s8#MbSffC?!&<2!(ir>oo z)%k1k_vByCk0-s&f0O?#|6P82QWEJNVVtxO)C|uPmo!h6R#wSLzl%>r!VMNu3gbH& zL1{l9O?ge~$e@vy5DG}!2y)j7*A7C8<+2OV4`s%=cA3|awvhId_K{AILZoG+m82!^ zRqoa9weIci9qyg(!|o&QGwuuS^X|*;EAFfA>+YNGTkgB=2ktia6ZZ@EOZPkX2lr?9 zKko1DU+$A`t=dHQ<#c?Nn0 zc?Nric!qg~drBz=O4m?UC^M83>Khst8XKAznh~OgI3aOJ8d8EKL08Bdst;`r)q_>f z#bDcWJy`bK4mLgi^6&BQ0{fm9z@Fy;|3$FtdBT6i|IGggEPCGX-}!gT^N$}2b~?L( zrOq6%(mASbQr*-#1bHH38F@W<1Ni_sO1((FPX0iCKzUbjPWy%ZH|ZB?P}5(O7*3J; zeerDi8v0VYsc>K6vBFD*eL&5uFKC#J`nPDt0`;V)+8FNj}t;16Ib_wm~+cZJKS8jbqETrQ5h*xqLL( zEf?8@HVN1?FSSW+b8Rx4+_u@Kvu(3&w=J=)wJikeZ%;Z4YcHdz}4W&GJ{aV_?&~r~QNN zp^XLh$&0`?xytUeyX*#g4cH?eYoBT_wQKAid#ydkF0;4V&)F~9pMf3nEB4d&gJ6-o z&A!yW+rHgiZ+~ikY=>7P)FZ1u*hf`&uO1Ed#K%-e?Z51d>gm;zYC$!-+EBerJE>Y( zZLD5V-BRrY8{+!vjn#|5s`zfO9KN~wN_A`XU9bz@%hAr!$C2h3>-fV?;EV8bD7gojp1-8A1S{nFDWl5KPgyh8Z{o27ypO0 zSOA)gnV`4G0By&?R4X+A+KCmQve-y%qS`@8QAAx#y-3|aJxtwBy-ZzAT}8b@y$VW; z%c<9>d#MMhXQ{WSx2bojYp83fE2#IV7pV8CooUah8MNQj6xwI%zuZL>4Fjr+eL?xq zN816~i89brq=BwtK5Z;*1Slr{5A|>e=rFQqZrWv9GtwT= z_R|i~0<;F&E817uDO&e}OSIRtH?*s?XS92?qqO(5r?gMB&$P3&bF>$?}T3tO6Y?E62&H;dnSf zP6KBVr-ieDvxBpb!*i8zHYhhMw<~ulcPWo3Tb1XP=aiR~FO=_6 z41R;SLDEp#Ft?$sLE2E+plz7f05sSeoDK6Eybb<_x`u@ffrelMz^-Gv*&+5y_7e7P z_73&|_BJ-fdzpQSeTV&m{ffQEa+Gt5bDeX66UTkWfpQ;mo^bwf+HvE#uQ+cx-#8sX zajPe{GZ)20fF@TzE)3MRGXL#g89@PSBB*4|KPoAjgfhIFg6O?qAWL;70!PP#>UMfzU)2aFK) zlEFc%V!Euo3@Ym=LxRr598kF!ChG)B6=cw;7$U2amCGWsC7?~QP!<4{3a+dQ)G0d2 zPsonR?#qz!gR(XmM*d88Pj*X|CSNCm%QwpU$>nl_yiC4T&XGIh6ggEsSdNoVmOqeh zk%#4N@&VOhK=E6tYNHWEN9d+PBYdqB8(M` z%Z#mzO^h3i1B`Y>@kRF-2}O??HyPg<@S;RemK<7y0rkmbP>~daY9tL*C3&Fp_y$;8 z)C5|OhN1&SuZy-8T`sy>w5zDC=yB1)= z1$vDXP-Ij$Y8!QphDLMayhfnW(pcT-YMkHbZ(Pv0urbsaZft5?)VR2@xp7J3vc~0& zD;rlgHk+23mYY_ZT1;z98%&!`2TX@dt)|1KQ>HVfv!;uttEL;KJEk_%L(>b>YtuW^ zd(%hLClkW_kLic$r|FL=#vE&oGq*PQoz5%T&#(3#!AaORAl! zZK^}6Q>v4yr>a}3sxYkbrRurrzG{!^lL`fBEBjY=uIyBqSIMfR zSJEmOmD);KrKxgJWo;!;X{mHpx+^19GV2nn$BR8EGPDB-ud=2`CMN?$OZFv!%{bSLylE zno`WeEnQc-q4a9$meSVJ)1?negQaby-qL94pt)~L)8}>oWui}|lR@oh z38)z{K?kW8G>FE5Qc@wP5Y^4~&s{UOe(t)tBUEISrOaC9EVGv_C|g+OEo&@mDqC8% zwyex2^HuniK9x`H)A)2gtxxYW_^Ny+pT%eO*?mr*+voMw`h32yuhDnDHi?(c>&)v8 zx_gq~t~4plO1sjn^eTPI1REb#57vP1DWR&DAyO7U~*xPTeBi zQr&XhR^4vhO5Ii6E!`>I8{H>eJN*}3vOZhiO+QrM)cig2Gx96)Q3KT?wBI%DwF%lz z+AM8H?Er00?J(^~ZN8SIou-|nEz(M~Jgrb`)_S$`w1C#5t&D-c2x%)0cXG+m>=*2ya8Xp z9|#2M1HnLJpee8@uspCLur9DRupzKMuqm)Pur;tf@K<1GU{_#wU{7FQV1M9X;Ar4v z;8fsr;7s6b;9TH*;9}rX;Bw$v;CkRj;8x&f;7;Iv;6b1*@F?&k@HFr|@FMUk@G|f^ z@GkH^@Hy}$@OR*A;CtX#;CCPj4obuZo~&((37kLq9Qs2Z(-XxeGunsg0JgVS`-q-r{9I%~#ivNRc* zT+ILtUNb>6OfyL{UNb~9N5j@oH7remrc6_=Ic8dwz~C^r3_-&x!xF=KLyKX9 zVVgnVDs?Gc^IT?^)wRrZ+_lrS&vnZ6$aUWJ*!9%)(bcKum+OV=kL!agv!-KBa!uzN zSk2Iyel^2u@@hmi#u~T!DX>+uU2|891yTTTv=GPuvH%>=6X*r>0eS;DKoT$vm;_7( z<^W`%6sQ1fHM%emwuNiLp0GFU3kSlD;ihmT+#FsSUKU;%UKO6>pgN=uxx?%*II0{* zM~lPja68sJ7CTlumOIuu7CP2A{&F03>~NfSYoLY9yo3~E;-_y?VaBo2~L<3;Y@V)aE@_ybK;x>ot>QHoztB|ojJ}v&JoTD zPOCG^InQZw8l7CH!a3V1cev^gle5Kn*?HXQa#lMxIP0A@=Q`(8 z=X&Q3=QigV=N0FE=OyPM=V|91=PPHM^PMxzmF)WCgtng~lS|6rmGNP)|s*U#^o41;)s%8l5suou* zs)|%CtJ+$%uWEl)Yt@OWvsLG+PF5YOx>5C_N^Wft9WQ)s z(#~5oZzC9-YBKEti}ot7-5c=MdAE4QUYU2AXNG5H-Ty_~ork+|*Z1O=&%VbYDNVS) z7E7b`tfLu8Ga7B98EG^#+LzJ3@B6--JqD6AA+d==8VBcKCr~I2`&J5+l2Qs33WP#| z(w4QQP?q!-TA*q1{mQw0`rPOC{?Yr~-ya`K$C7+xKeEnfKA-pJ<-6j!;=NM5lE0F> z(!El<(z$YS<@8Gb%J9m;m4~m~cjb{Qm#$p7@`fvKyzN z;nVBCcj*V0<}b%C*Dk;R(nl}-{-qCH`uL?UU;4_WuU-23rO#dZ{H4FV^odJ9y!5k6 zKfm;yOTW1E!ll2tw0!yBF5P+g*Dk;O^7iH3%h2V$%fw~!vi`F6vgxw=GI!Z}nY!%1 z9JtJ1?p_{WKEB+!JiL70<=0$(?D8X*&n{oTy#MekAAa@2_dWc?!;d}uWa-Nfe*M9( zJ@{7-{_TT5c<}iL&99a}6ukQV$A9wp^N%lFJ$H5K>TOpyu5Mo4xe8x3U%hzaRX6Ut zasQ3qxbeV^2XDOk#=|#$d42W9`i&1h{`-%AFmvCzkT+Wv)?&;>)G4S-f{M>vv;4p=j^>_?>l?{+3%ix;Os+ZA3pp2 zvyYs8{OpgtNO`smfiuDU*xf@9Mj+z3bWsu0^l^?zInH`~7QwcTUUFdb+xc04U-@W$ywI5u2;o6U` z{o>lvleay2$CEFA5_<9@*Z<(U;q;Z)f8+WC*B`q6==CqZ_Vw3qT>s1Ke|7z@uYdFU zH?DvC`uDH@-Sxk{{`c3Pzb?74ePi#2{swl#bi;hZcB3k8iWMLO3dl#XR4Gv^m2xGa z+*WQXVdbup5^I!*Qm+&%WlDuorQA`fm5_2vxu-;xTBS~jDRHG-EE9|65;-K7%4Kr7 zTp?G=Rq{>wmV8^jBj1(p$zi!#j>u8DMy{3X1mj~oQc}OnE!}5qcDpx4P3W)+zNEI@LT%lB`6q|}I#kOKcv8&iqzzVej zQJ@NqLaWdzFa@sAD+q-_VN{qDW`#vTDy#~>BA@`_D}|s4E24^+BCbd%l8Tfft;i^{ ziku>^C@6}GlA^4rD5{E@qONEtnu?a9t>`Gaik>2(*c5Mzcg1^RfZL0AKuUI+nmquy z*_OB`=}QKZp=2Z(OD2+i$${ihawIvH9Ep#`hvE}4FLsC-u}d5kr^Q~eM+~?@F(+ol zfQu1l#ThXzc8Vk7uvies#33i~i+uokh)WWZq$DLtOEMsxoRj1wb_pYK zfV?s%;U!LxTy{%9i$da)_$2{JPy$ZLNy3tdBq~u$5D5x0%vy;KWS((}UP4F=5+let znrBP{BIu)kEReBYn zGN_Cylgg~Js7RGnMX6|&O=VXxDu;?yaVlQrRJl}cl}80y9V)*npbDx&DnS)iMO0B$ zOchrpR7q7zl~!d`SyfJzR~1x6RY_G=Ra8|~O;uMlR83V&)mC*>WARA5FP?~p;(@p; z?u&ckj<^jH%Q>-FED=LurC24_h_zzCfQxalUJQU_F(6~br(#5miUHay7E2{kNGg@e zq;jc3s+6jvo6;@mwsc3jE8UaAQneJ3qEd}iE7eIcDK6DZ38_J9l$xYwsYOaktx`%# zOKnoSl#x25tdx`TQm51zPfGO5_EWRwmi ztK^it(y4SQ-Aa$rtMn=T%78Mc3@HU=SQ$}9l`&;pnNTK`DP>xjQD&7nWnNiO7L_Gs zSqauRD{IPalvffpAdR3jIzW|?fI|@_ z`L5$gtqp`UTRMvqh%Gvk)$5mWJJB(2_9qLza1Ptm#H_|>)h*R-dM4p988h!ioi^I6 zj%w&qU^g81D1;Fq$HJtZ3D_Nuklu*~0+y)V+-Hyg4ElRDo{aXX099kR9ZqXCcpy;x zsZJb?2PYOLBr{l}CC{!|8FlzoK2x+48@qu!Y?2Y#z#)<)bhegPWtO_F)`+7Ad=w{J zi^c;8&$CTnyfD$R$<1`pMzjYU=MWpzM5!?1i#Yisr%TY`oHripMmHVp=%J=<4Fy_J zN1zjR&|`lr+y@%WDNwCFYzm{W0ka>q25KIQ@fed~DPKHn4|WVWLoX`kV9%Cj5Os3n zXoQ+X)t-asE<);|SPd>)o7~h7l*X#sEv>=h)`}y;NHAD(c?bzGUb4ZHXcwD+4%i`Z zW(qc4a0obzqiD(QBfI_t>^I6|GN8@u0&_;st75uv8db(lNEg2eEE+hb)~WP>CiYU4 z&D0dK2hkRx z%nhG)WbKCpT%#GGX3htc+9R^7jzv9slQte@!V>2mi*SH=v<&rA$*7{U8tbl!Hx-2) zK0RbgyLcvhOE)@&D`tov8r66k&qtl6B9M-b?Ij=`$*nNkgys66vF9-*g4R9VVR+jf zGfj1zeNtj}lVpP7HxVjWptt-~LLljc+G4cD9kxU@7U4Adu7?dB!vRgqSBp8*jTju= zGpN-O)D!iGP*cZZ@cN=o%pa98`wmke5G~qvd4)qBJ>e>zq@e+C8g_iJx)`xUWZEI+ zwW$ycDXEc+QBYd8DIuz+08Zw~#z~JRx=V|LkVj+Guzsp#*7*yv6u=bZ{rw09qMn4M8qLdHhDr>qAF2g?X-^ar<`8cc$fcrlygi|Ve= zZ?`8-wQ-AGUo^L@I$)?6!ah?>U|~qdS(Gj`gYki&H>wNRi7B~`Wx85TW)uve6P(C+ ziB023yX`)r2gH!1+2r}nrkH7z z6oEiSWl4lsODN;=rZT)gol(FT6U>x|j4t6m)eE6arsU!MrUS$nlVR$` zK!yab^eD2Ms2ud3PBSt0F_2??7F)!{?PtXB2~cDtz>HxrF{9%Ua+ERKZPA0w*al^% zqKwR^$rfGetlYAf)qA$G47W?}W?KYIsIub>3N)D=jXsNbSpv=;`nI!2p-HA<-^osb zQ)|YS&H0R3F3SUHW-}}0tU#h+c^dS^oF3Zg2Hp$>q#5FtLSw&W&$xh016)@i%>;lv z<1zZP6mE~!eI3dRyqXYjXd*zKiDt)P7;Q!j&Up676C-lqjNeWm4^*1iEsrJ*WSR-H z9c_flS&lDdt@w*BO(AO`Dz19=0Hlm5mNW%yQ>A9;usPe=s6iL)2Rd21JFe?x;gEv# zYZRU?uxniUL%q>G$cC6<775AOF_3H~S*u&d$3qbyS49&Q{Zy`sYNv*k7|kU14Olpv zI4~P9Ut-sVShR-yNYGNVyq+W1S}YK>|4ehiXT_$2v}A?FR-3^zvz!Uq`0Iz{%1&YB~jQvQ$Z_+NFgp89${{ zCJ&v1M$&l-DElLJGud`+C4-4QFady?kNBM=&*^O@$8HjI)qPtwK^IEI)l@f_H&k?y}X4Cr+9;C{@_Q z(urFgG2>Or&mNU{ozr;Y7nj?#w0sH<`66yBb_^U7sGPDXfnP$?X=byG*(7BnUog>n zd0Fu7c~rnLkq0(SJ3ut?ldgcms4kBK&d4bcZspWeJF%E{fpUU?egaPS zt1HsA;M6{muqGg%*qNStYM;~$W}u*8q%>$L54ov+GWMBh8%=>OgrltX4jX*gUQQcT zoYolhvSkifC{qc=Sr)V|(5Fb)7~rD>K-VG&T$KITR7MF#rXotj;tPc%WlhH!FVj&^ zMB?+(nX=hP=@VszUqX1Pt!RU9my+cXR%S;wq;zUKcA}+ip&g9!2<&kJih|GrYbG9v z>C0iIuIqLNMMX1pKF9gYL8>;7Pm9-t;zq9LS*cQqCqeBc8r3Y*sP_BxpW%00-HW@({e0X_kyW zz0fKRdD3mCIwc#`1zL^UZQ^19Wv&^lJA2GF5T&M`)LyQIY~|wk)RcmAgjNkiDLfbO z>vGy$!;0m|5CT*w9jwV6SoA=bG6P@A9=3Q*K$vn<4c&gw?I>ZV=BYO2$W_o9lh%Nj zSdIbe6rH1Tq#74&xv4tE=MFnTAWrEV9Pp=nK%VmF+`yp{a^YM0)YP65dr}ppCKX2f z2rAVNBAg>_-qlAuZN!@(jQ#-Ybi*BQA=WYl)IQ#bD4biEoQJ&oSzegV4Os0*F17U_ zTL|wVws1nbuMvm$ydC%$ths{Fsi~!=Q?w*^fO!p2&R~<~rnZ(^!{H{TZj&GZU!p=A zB0yg)=)L*9NYfEiBN~6c@7tw(`MgCQjA#S-y0%51;JbLx?!`j+V4l?-L}czLkf@G% ztwkRc@{#4n{0uq@nJs zTXtH2gHypP5zwPf^?`dLq;op+i6)av64@ML;HX@#=`*?WIa=$m7l7_{5G>_({N*vsVe=J2swPSb@zcq(c+f&c@tw1BWhqHS9{ zPy5D1EuY3v!?w%mEauC%#I4EH*a{8uJN83?vXe*$xLbQxqf@Ls$g7RLe8{H{jq+jr zI3IL?4Z#s{YdExPa(-E`?s=6*~f! zo^EP)odCT{ut^HmprT-NNWH28Mkot$0|X?mO(1#oJxtJOphJf?W$V}{D~#x!!k!u_ zP{!?oMO$;gg-vtEJup;VdqDV7cy|jbPs-5HmdpVFgX`5>1wXQ_&FHJTh8HWi3=Wp} z;e|G;Y8?V?ceAB0Gy=GB!Z%T2YGFz-v-k;9Oa zalm~|koCE7OTr>`Xu>MepH^}mztmoVb*P=q!(;5wKF|dOA8Iu2pgpr64hIUnETVJk zbb3odP~Z`JARV&^6zPx}lFK<|FB20oL!ZDrYQhvS=7Z z1mktQxRDr740;*z`%|$xt zDxGtc5ObiNZlnc|LbGKtn**j=dN-5?5~GD|rUyt3S5Q{d2NYf_CKp9yECFGejNpmrz>`-Kq4rNBt2s)=zHdchU zZ)K7pE4!WPns+jaFjm(!1pYW`1Ix4Q*r~wl6+ZXSrybI)8EcqemkF_k)k-vgOSq^G zZ)nUXJnc9V2AIvWB@EPPGXrazn9gfG9H~K~G3e=-^5_<>6HG0yPVc0ACQR2<@gch& z=tVSzHBWp*)6gtMriM|INqbnMz^b&I*%+>bcKtoyi?)=OQ1c_pp_{A|u(>WH4fPXb zLRSruz|dm>?i5{j_|PDsvC{pBUvThtU{5*fOuZ5gd7X8S;n3vaTy;Hn>gDU6kQ*3O zEjI@&su%H41n-4t|hr;ZuJHn(j74p~3-ax(0@7c9*2uM|#Az@RgGbN$k;ctmm z%+#zhgbp28;25XsN#vN?50zc*2o>@L>Bhi*iiH{&_~^=$NA5i|&Kx()HjPJRGpkQR zBfc39GDY2?A?s6f!H|-5;^wN6GgRAT&<74yG{!0`*mb7rKA*%#E)CiCTYzL{BzDwE zlc`QunOlk(=PbcnM!nuzow)hx*wYfiR$Em^AL->`wwmS3A+l-*?wQ_Ez_@D45&*`T zP)!=W#su)q;?+ZS6h>_>JkOZf9P0%RTDaQNN2{aAku6!RA^vL1NLk#~gYdq!hh(Z& zK30_qb+tk806PuV1%Z=>lM`@?Fv*O_S{3s3tM%}7R_DO)Bo6Q%9tw4Ul-8_v^#ND8 zD);m)INYmtt7N2DRk9jcgk`cAHCH+usfWI>6X}r0?$otAZrt&4ajXg(Ap9R zTieB)HCN3lK(=TtM{qSL7y>g%J|MYS9RXmsv1qW?^}1^lGz=U!jcdm%0Lv`_EH^)x zR?5_P8gqCwIs@s0nwb44I5ol&Oxq%FDw>-<+)>4qO?~)8aB56Q(Nke^?vaLcW{gt< zuI?|@4m8CY>d*5&qza~-DmCzJ{-+1G*VNlRxI5<6_@#hM4c2B=!ilPY*>6+S@ zL-&pgHBN=hxbKLGV;Kh@2z!da%j|Pjv{EQAr2^V27f`Nj*Xj*)pP-*FAzSO8H7#?S(5_HaS!|ukT@r-#;Yvu7E6>y*EdOu zHDVLUoF}?;7y&+~xY#zN+!6<8pID_u)UjZL8!^hMYwqLKS5ud$Ankiu;_oSPGsxINfmwMIuGY<1QLK2|QfnEuLVL zX6@i~oZDLr6@}s{QTAGd0B}V;#gcoIhe)|8SY+`^Q4>lOJJwpU637&@#Z7O@83*=g zshDI7#fmLo%oUH(YB8sEMaso(Lm=XH?Kg_WvEChy6_dq7DqVC^Hqu9p)QHQY?G*Qz z95X7as3w{6w~M>B7Vt-h#ZxK;Owv={CiIGj{swSL`^7Df)2?<9RK3VsbuKk}1iaEi z;FBH~Jt%=rz;=!OV$*ISt076r21}=6sZmxEmrjdAwX&qTWtVQ2V$2qBOSgerx?9TX zVPKbb4Y_8QX0!oA&Dsvx%uFO43L@sFwZ2E`G!efBMOXtk5O9Vq!0EF$%Vvu!Za12l z=Be7&R0;(x)zpDQLb{1NY4X$+u(HiE5hVLzm)~qbF@bY5^9Gme#Kf{HZ_VAX*D%hH z6I0`lG&sS*I-!nXdXuYJ_Pd(~)(@mVx1nV8HZhK%3r#`rH3#7UumGq2pM_Hb&U@RR zV8hLkr^&~G1!#t+CSb8?WF26+Mb@8ac0#EplSntW)l(f%9wF_<#x6WG`63?FFG z=(aOe*k;NwV}H?6B>j-RUq@_On};0Kt+tM*3!KJd4st|Yr=F?Txb3Zwle$Is?`mVO zzRNapI5u^MHIb=2>NVFo=(dVGh&#&BwMB!I(zCA|`cKuaY0<_J!l% ze(v~|Ok5|YF0q503dOQ~$O`3^`BOxacheN207kJC2*q1@&esYn>Fs>PyPNM2+1k!j zEjFMb7`Vl`+SDyZ^J3T3Ek5<}R4+JkPX$w}xlR>3jt|~4VTD!nF9Xlmean%|*1k&jdn1Ve8 z&gpSQu*MuGcG})@K)^Yb0qJx??1SabU3QaGRZIF)zY@r&JJsE)!a8+Nw}E-ORaFD` zbUGc20sYjg-|p^oVWtjS*o@olnF^g2hSQ++ig1v6QR?JzI5Xn9u0!sKql2IskMDLV zHD2ntxM0Ls=PFvCt)|^=?-ti3sF^O8`HEK=#fF& zPF8g7T~oeS<+(t-o9HIHjJ1V(%;~P$p6d4e*{%z4U4Z}Y?rEyvL{X^=F}ZHOOKS?< zwvccI%!m;z-|7~-V0(2K4`SwRw%(oiUEu^#>l$<#x114M8{Kxd)$MkhU9+Ln)w=p! z0S&1K-C=j!&1rhwN%ye3-yL;Nx(D6k?rB%tvwEaGs5iDAbyIv#(^IQm@}8o%-SY^l z9?D93TRmk@*4yl<;GJ7@nQ(8nC-EaawAax)v=KN4w?Z~;$iy2I-88Q3Dq&T(?cVHe zb)`%xT#JH9w8qkI4O{(IS;)|X*0==;kbl(j(UaED(lqb4Ca#3v9vKVAt)tdK z>#%jwlAHIO;syq%=@QSrwwEu7~pbN1rAu9=2p$lFf}d^deQK-w+=|LrmCNsojgcH z?0a<1spC2F23mb95_GmOwqxwt!>x{1OYOil=dL=`YPj=S0SKRw)}eN)dnQ{h_1NAv z##=^L9Z9qrHoIm7XIgQxs&U&>Et@6XlG(Dr{VcR1R)+yMnDt1y;;va6Hy#^GIAw#n4X3=T^jpkrhpvb91dB?8 z_YCfkV@J^Uh@RIW4S2(bp5Fv(Oy;D<@5xw9y+ez!XX%-HWY5|=wMwjqyjdX3dNU1gB|45P;j;ewLwzf9+U>C+r#{bS{=9T|<8) zfq90Im1DvhRPYVGL;o=D3=FLy&`QB@tHBx^ZkzL(5XdiVnZqF65E;gYCqxva8S=Qp zl^n*AAYBMymef#VuMM?c&J%S`oI{g0k|0OE`mix<4hs`C)*3bJe8g8c9XN#ciL0i*z~MyB8M1 zib@Nfn%qgQ6WB3tRt9jI&6&0;47*(^8}@OjAEfT7eKT)D-BYi-Z7%sLPM^zVgeywp z#HX(8`=)+3rO^Pv`;^=EWNEBoRrk=TkNmINw<0)l{=4|iaYE(a&2P>Wub2lBT+Lbr z-XK&sG3MqSR2ChZM-eOhIUx!MCh=o-Q|sKbDL~i+I_##LDD(AVr7OIpJSNt z5-dC9hWyYuJdB;)HG8dIyVvRUdflF2@AnRM!`^Pd zk>;IA6bw@7hqh5~+_PDatZ;Y&=JYqMIFm3R^t_tG9s(TWtTP?3I-^3K&5&ZFwITK8 z!wy{(CmSBz(vYK^ek(l0c&uVHV^c#~4|^^4#z}B$NqaB~*wSMz5_SuS&)dK~zJ^kZ zssjy~3ygLETRLO+G^D)HID!ueEL!OOyFDFlkmXpTYGDHrpiMXNXoE0CeHff-ByHQ_ ztY%E%xQTc)9~k78=1*szuGZr*Z^_mHYIWSjy8H0dtVWP5K4~=7c9+y9^B#bqp1%FC zVdpaW(}u?_ZYI=NFc~-jrnM1;>!HZjaEMyNRJbPaX2lQ;5DirzVdOMtf>|!dQG+ty zcj@vPXVsGk?|{6~-Vhm@2y|G0;h}mcF$sunhz-j+81Z^F!)=Xrh!6Ecg_{@}hQ?vQ zX&Rb`mSK8mv{sEp-Ca2Np8d1WZa}rQc)~92!=T#sY@D?655!wCr!zWM;7)b z-N`_*Y}%smq%-MBnv(&{4m*-&u-i>(Fk-GGle8og4vU{m@=0HE$3uaZ51ZtYA;g~) zoLDH4%p~Qmat{ zlrE(P`BXUNVfy4A*G%rFuv9m>m%>xqDSZk}?W8ts$`nd&SvON#DJ0c1Xj94{kuszd zbRcC+`BNsnU_LbS1fQ~}EGZ{KgM_OT5kT(M$M{mARNl&9o|HFb11VT{%J1S*REnjI z%&y0kVpG->lS)#m;ASwG8hZEHa>|j)rixT96-n)fV<11<#ltBtv!lzW4v1W+lJaTd zsUu4vl>uqmm^P70rqZcBQ!!OajZz$)clJ}csGk|8hQc7#1-aW!s+wy1qHG(aZtJPO zvz2nIb)>=AOHEQ^kjHJ?kHF|2l-^Hu=p!m8Xgwz>7gDulc(da$b(}f{W0;$;N4=ev zr*) zkvdJJ3A-^Jb8TX!kST3ROKjG(IZdVsflBZ8B?g3o?G9?MU-PAcrbZcs`|ADKZdcsx$i}+exh&e*FuKAu5am^`ue`3Z|gICzEAbZzP*1G zw)PJk8IJ8UdRR;MxxNo1t0D%WpL93Efqtmp$DMso|A0yfu09wk=?D9~M@YZF zANTkBhy6jn*FPeTw4MH>-|DyfjlO&Uft2#FA7_uixZys1(pL;r1L@$n zzctt#q^R8i4D!rskYU~%oc4DH$Urkt4$y&ifcfyjK}zpC@WLFxJ=8gSTqBM{+i_ACoz4y-?WRBZo|HJLKq*uysfck2MLq z!BzBS-E40FPJZorr8wVn_GrX!g(F1i}nJ&crVgxvb;OhGnJCPbT88@fe%mvQx<%zop?3_M?C~T zGA8t8eT)wB)jCOz%(Z&G-l#Y0t$MrOsXI(Zqm$9;=y;SjiN`XHWDJdwCO9n}la7ft zBAf=3E*nplWaB-vijl<`qe^GQy{ybAk1OI~7tJc;Cydr#3+Vg~BVsBVRPoI?>)(pE zd>vha@`6L~Do0}zvoyRN--(kh35~hp@kHEAMwnzg71ub@@l2f6 zw+wpS{_tQ}aO+3e#=vVakc2E0%MC}H>OL|WO-6oVJVNM$(f&xIt_uXN)-y;q`mIst-fydKko(Gxf9;r!pZv zlC9_J#d^M8sHZs;x9LjtI`8J(npi$>FW0ps9;wu~Bgbqo>W-#E2O%4`8w}!EG|!EP z0x=n8BE2DugLUV4m!Z-Aa2qv+CXV57Fm$@4>}XhsSnTA;Frr7)hzMIp=8$dV8hPP; zEjQvvNxOZ-j2s|0mo>AaL)VT z6&^)KIdgQBaV1790>&dp@lkS=A7w|GQEHSMrANh4X;g4oO1QQ#s*WI6c~lvhM>e%( zWY-pv=BPG`=vt%ts4Y?`N0PT!=V6||6G#ItGP5qIhpyOQfx)wbRHT4I+R&6uV zu7#-NQF39QT!u{HyHmVJ4SPC2qE!)DU&ZFw&m_ z(n?Z?>igJ^vB-O}dm)n-6QuRDAgfz_M!iE5Q>)3cx}vVCO=y+1mNIJ2+R-Q-(cl4t z`%m;EYA5In9h<0<7NbjgLtfZ7=|VEkwl#*1T};VVVoQ9;|rO1Qfl_Lfpwv)f-HbV_$oZ|D7J%-IYDN_ETwGOu8H zQYlypl~REW#i;Yal&$+qNP}g)Y=2dQo58XAr2^zDCNNmKU?ZWa;2pD z$e%A2ONCOY6b(4FnaU`>A0OXJw}Xwewl)m=4&r=plaM5Oj^p@IJi(oSz(G248jo9L ziD6KYkS3G~qlqJ-gggO-Rf(O%Zelw@5mL)mVl&|gS&+TNfgVm6P`TEqQzu3`B*CdQ z2{fSv`FLFdPv{dw!W%psjvREPXg?mF43CD4x#J6B?$D-7G7^uJ#OW~Xl#T*q9o=-x zM$kxOQjSz3w+W}gfQfT+Bp)e8UEB7^sA)wanyu09XlJxH^85U>iiJn&5i&wYnvr&d zjdUY?#37-eo9~d(FdVR0yQWQi-^h#|V|L7qdEoXq!HdN`_Ka<9dz)!D1gVZ~JK9{E zZ_6CcwyO|Cw%w}h+qp@yx4!!%%-Of(u5Z%}Bb>L3kr|uw~GG_6i z9Zg5u>9JXtu7h>(j=n>5vVx)0(rnVkj;UkrSUM*jvIB+-HM+>iiL!_FLN|ydAc~b@&eD=ylvWXUElXcNm?S_H=w5e<#rC3&GCB7V7NVgig3q#3yj1 z1IFY#@lK+X?4&yBj@F#(WIEYSzEkM9t;J5MQ|?qc)lRKb?=(8iPLu@uOReorr_=4^ zy;2mM04;zI@dZK6dr(cEbrgJF&<-$i1-`)05+Q7BfL4{WFs5Av1vbC~guCD=*h1cd zui*6iLF+152o=J9p>Tv4$Z%ncj1;1USRr0W6fis=59*3>un08XW=nAr8~R6qfef?}!{FFE`1vhy@B#0T*`Sm*T$E$1+9E6A)CkWRIZ{WhE}_!B<6f6wUF4?7GP zQJ}_0C_V0J?c;h-F$PhZv2t9nMo5Xe1zN0I#82>s1ST$N5)x)90Vf}b4lyKES3OWrd`nveqfUMeK0&xPqx7YGC?Pr3GeWlF|b8H zt)6DD^%JSb&2ABRRbM5llzABNhN58jM5e1dj(cq{>TLKrm5SS`kLgZ&McCy$?MXvB zRMTo>)MjyCFiQGRU)rYwTE^j)_0>VUCGV2=6@9_q)+zg{enz|5-|8PD+x?xsf~{aG zkoezfZZ~(Co#t+n!%!a2dqD==jrb?QNnm2gON>U4dN=1Sc`|R!>#?JN)a2o1YKN1` zAM0!^$itgX)VBOsXV1rMOdjlL(>wBFlFg41EB5Pd>uq;BBiA*B}?NnXgXBKwQ(IJp_}8@xDE2q-EnW+9}mXEvC=#mkH?eo{`inR7$1(0#>eB6 z@#$C$Qu@$DI+1~#zG9-BwAHG~=45NK4U+o_>+WQ4(zES#!c@T@Tnr6Cr$Ee>cz#c0*mE8}3HCvS6ee>k=b9RRp^Nz$SaJH9$kvCymK~ z>JB@@8kGZE1QPXO9NV_$q%~`Y|zvSi|_x zs?=9ob$uo#h9nRKRm3t#4k;idq=Gh~Eod9sfp(!i2!_-U0-=xw(n2~2gK$U>5s(2g zLMF%zSs)U!LKH+pHpmV!kON{N4&osv^f-n?;qEHNqLkTDe zrJyvFfwE8z%0mUH2!SDAr~*}?8dQfGP!noFZKwlvp&rzS2G9^1L1SnF?L!C9A#?;C zLnqMIEfe$={omEandwviuhlPaBBB>&4WeJ(*nm&ME`K}yWrpHpG7xsn>i;E{pWS_=1b1qyeR>NfTGUbyv+md`@h$$$aii{ z6gcfFrDo43#0vvl{&H*ZS8bq(Nf%`+m=|9#z@ojxCS=AnCnGe`Gi zXWnP3%?QsAXWsI{=}hV;56;jtmu6PUD>LK^ubVMndc(}mj@~)5{qXx|Zni%*^Dp1| z>jo3pcTy?K82gOA=d8~f^o*}LAV zn0-{aJ^THyV6zu4>SytfTV`MNPwXuJcmCNGdw5p#uGs9ISF^MENo`gXYR*3Jh5qb? zJ4dq@&QE5a{nYWSSbPyY(~Gljx#RxXxwQvpMHgQ^OU^w!`)v2hta9nG*=Luo&d!OR zn4J;54%~Ka_Gs(3X8U(OGb=rK_v{OXkIX92Kc4-Ym;LFi_K7dfK9B$P>=&;6?d**5 zd$V`E<;SzNkN#rz^QGCjPwcJD-QKuk?oZzNYjd}0q;o;v=G+_Zhv(*=LgyCF>E@Qd zXPmpu!pvzsRF#XDzzMQ9E<_jBhy5ueLFot^uZyfWvswdO>h>(4#&$)mX+f9bxt zZ+!ZZxewp>y160o^xTCvy?L%lzkQB;;9YYImfxHEvxlCYJGlATx#takF&F>Y-^@M# zz31mX^TG>ry2RW(x4ts}Z~yIA=0oT1p8v5PnisyhH9y+b%zyQxmid?c4m1Cip9JPV z`p=p9Z&oVvYwv5#f9#e0`8$@z^RNHXJ@XGecRyG%_V9e}{3G-KIDFmwH)BuD-+0Yi z=U?*P_sm}uy?6eZ`iJLX{Jr_`tDm12 zb^mexkvo1if9K18IZxd+vygpuVPQ$MxUh6_dEw&u)dkVq+QK70ykp^4m3J?o-<2#x z7nKX5M>ZFheugY8d+>$(eo8L9>R-8q;5&m0pSml$aC}#0VQneD@Qr$F;m&j2g|$zO z7Bs(ovT*xTuUI&*xPRe~l@BjSs7Ds=n0stNEP8z5Jp8(amsnrFaN(|}7DVLJ3tKa9 zURe9Y+rS(4I~GLe-?<g=R{rI_sM}PGz3y**1 zn+yLq|91;A(cdpbp?_HTy6hJVe@fk4z(2pVILEIol54ju-q7B?sJ#8x7DcbVu=p=` zs1{eQ>@KQikj3zMY|*-4SiCT2TD*6TT>OW7nMIL^S)5zr7DaRX;`R^E-<_J^#+d^>4m^5wU(~@!X9+Tnya*$;H0*^Na60|E0y3-2D2Y;`85Igs2}a zHlF?I;>`U&UtCcC+u|2rzPPkTtS>$D^qosDS^CwbxtY6{`mzg4=awW(e@ZHreC*cJ zb9wdB`K)H?;{S&)iByIq(KXA`c@eoZC$cVyB=nLwtRSohtf zhhFxhr4PLP=Sy$8R!`cxie6J?ED{3Ej2)+UA92$@dk@_xugAJS2$a@4Uvg zeBlXpc|+-5mdS(5XCF;3b04iP--Wc6LvI@{b00ije(Bw>T+XiDzbtwGrR6_-;p%d1 z;q}Y(ciyyo;oi3_|HaZfmPHrexhxXiyDYizyUX{U`{44^qTgQ@v4609{=&1%7w`D^ z@5zqN9w^>0@$O1`%uTKvJv`$W&Ll&ODO zIp6=6m8XA2v?|Nauij@}Sq+KSS4E)C&D^#+ckcGp3!nOx)$V70ZS}%yC9CfTme022-wkK8}JAbzNu?tVFUbMb(^*r@v@I65h&#aO&Z(Du+ zpS^$e+}?**-~E=4t&$)4lT}3exmEWUzq0Cl?(3`2Z-007?a%#q_0g4|tUf(@VfAfq zpIiI>xs|n-UEElE`Q+|3*`qIC`)^Ol)}H>x-rA=xXx3&Hu(gK=mbH5#&NYL`w{~+i zvG$xOy;i?iSbIQJTKo9ZjWw01y*9r&Sd-3A)|Sb`HRz=m*Cf^Z*5)rhuy*@}ht_U? z!y{{RqAP2U6dzyX*eBOsdB;<0e-6E64Zi#BYZq1TUVC)u{cAI!53b$*z(>~3UHItQ z+*2Q06V3h6+QnCVVr}NWPp?U`pIduG^xWFH)i13{L|z`ckufO}}@%1|vv+F{>vfh4e zcm3{HkJtaD{fhOC7am%NU;4=UFW4v6_dffE^&gzPWBt+S`_}LEd}#eC*GJcP4?ng3 z_dojL`mcxoa-I9cx7Q!J{k!YZ;1Ab{@BMWBFF!BZkiKGW?c`R0w;XP?;+iC(OkwYP69iQchsVdh;MqDS7dAtK+q zA^N=!Y~;T12ODDMk2Z$Lr#D1D|NO?Q4PW^myqyJf6Kl8kCuxA9O4W&3F zlSwj}OfpF(nM^X%QltgiSc4aLhvIrTxVyU^+}+)se!B<056->kyzjkt-Su^?-`daf z%ribs(`4`ezd}ffs}+#pH!Gan@~A?f>eC8H$>$ZgQtv7#0v{^0K|WVV)D~5Mw`3tF zTbB$eSEFo*cwmJP@qn-pL1<)1ZDCAEup%xb8A%A4qeu)vgjGTmNYxM|v04ZcSu^DJ zZ^WjSUD{OQA`gR(`j}{TEYAf(cvW_Bg?G_DY0mM zNKo45kU3R%gou!xA+EvuLj>gxg)q94A$j6+AwuMQ$n0y^VLLZMb}8;nXE7cTRMRmjx z17zY31u5cl3!90XT}T(V%2tWD)*{3?9WCN3<(=a2aoxm85!vE7!`T7#tdiDI2=X z9TD2$W?X2gl*G_;>*|I+NU0Y(*3vX|4%#a8ZerU|#M>z}AnpbD{!Ipgxx}s(C(oVMA@NLk=~)fioT&@BsWxS@`bhu>K}UW%ka%9mK4!jCQf?tO!cE1nhW`7Mu77D_Mk-=dpohpR& zq@u&h=qiTIo>nbPFO`IqP{_j;c4`<_C9z4^s^nH-`&)Gk3lnq++bu@J%GA__+0x0d z{-`-DFvS+82rywgMb0p!9~Tysm>Gs3--&75GYk>-3S0Qn6IMSx5LThrkg&N8MupuN zHz7>WZ*mw?dTJOVng;Wyg$*j01@RXYv%><&92onKLNO28|AyfCVf~SXFz+WKWKkGW zuq3Q#$HuVd_xFVr6`c*+QFJHl`SVv{MPCKsMW4mt-*!|AFDjCS=a*;{ULR>1zGhHb zc**u1!lTl%n(_+qQsy&5yB?2hz=!EB7(~` zh)_i|k3f*-5e4;IN5l~ABKjsPBO)*8A}VY%M||$gMT{Ai6@d)u8G-D|iKuwb7ZLGv zP{iOhBO`hhO^ujtpBpjm>#~UL7dJ$B3U)+{E3-G^+v$@Ls}s&g1U6lba7W*ZIMn}1 zMD&%n5ub}hk%1lpb$poEA;DiBR%|4N3)GEFU!d z+Q|)W}*1QOk7Iqhx7yqsARfjtXcRL=^}d zM>SEjh*IaKM@i~*iYf?njY2kIQMIe%QLW37Q5AyCQB~4yQAipS6)a+-T)}))NhC8$ z6xKbeUUE*<7-8S2md1WjgKi9oYFKAfRJwRQ8LiHg^( ziV}&|M3t|wDXMC@ZBc4uXH*!nI||vkH%fu*i$V$xM0G+A!-qRRd3XJMRD12UC|AMl zs9@wyR6pb%EdPPxeiR~j0R0~bA4VZ1AH%#SF!uKZkf*ThDeUhV#Gfd{FQEUEqUS|X zU*DIH&M!)c{#KL}UG%wWbWu^K=%TNN=%O7iXy-;3A%W=KVS}O*MMI)XmKz=&TxxW5 z^{5HaV!GTaa4>#FDY|C?P zW8dFa$Ifo5k1bWs6kG0&EjC%?hz-2Uj1|IPCj|NTh>`BGh@uC~1r$9Y0)k!;{{cld zEc<~d2iicOH^g5M^@&v=ePQfxP~^h+4}$ZcofmtfXkhHNZ)0PNisk^TV)OHN#NPjW zGd4jSC>#;yU))8~6Iv ziMZ;>sW`!qb8!dLF2|j|eK)QH`Y;Zu{y45gn-{RZ7ja!Wy^E_Q{2WJ!i{cV%3*(~% zCF4skE*l?#l#hr1S^i{a%ZPXv5)JKt=0;J~_@WKT@t420h<}fy!(2eoHePl>86Oa! z&<7IL@d5;caSimplZ@!%7Z+LM->=PxfBk!(_@bade4?N~EdOutVsQNDqKWbEXU>T~ z@pXCp4#E2PJ(1huYsKt|FVpWpeA?op@kp8D@xlF0#RmsY183t!F&E;u&$|^LhTMUD z{Vy=)Ui>}od3>WQALENMN+uMw2v7L%rBcGj*L4#_#UI}xNeO=vkR){9(Iny7{k93; zu4@wJQpSV}tsDtuck&4XOJ^mNo82oxfn+C$x!eTtEnh;|rhy3y1`kg_$k7RiYh1!m z;iQBTW2Pkp_*n^JWOhOjG8eWB1m-1tth_t{8MQh=fUHUQRW21+}V_F6bcmC}>~w)1m4Ae`~vDqq3!{5_$lQ89OEOO6HzSDr;fZI=;rGb_&~feb*R^fsn-l&4Q6tS|BnBof9kXoJ=@wk z*}QqvvXgQOa+c;?$Z~FH{twg;b%nu)+|N=VJcz{B(cYQ4L4gMwv$CPHs0nX;$l5HG9`oE*oB_-&ph* zx(PcoRIfWQVbX*t6HZJxJ>krRdlOP8CQMA6SZiX7iESokP0X1Xm@#n1uo>fLOqwxy z#*`UTXY81$9f87xv11FvX1&HHWu|wFhfIS0-Jf({ZarxJG&)~DSXVgEI8yY^du${$)<9a@|FsgUZw-4WuU`k zv4oKhav-^voRIw}`&o9QoX8w)&Qxcn>x1hXcdM6^#YXNKdTeMdrY}=5vsFKB#Z{b(sc%x>roKyk zpZX#7W9p~WNhzovdmB~lHkWU4XMluD(VQ$f}#l}@##+EbZSM=G1@Om(GlseEci zYG!J;)U4F*sXbB~B`+Rho|Hxe5iLQ+@_ttRLHh?bx0j&A`A_^qddYgm^pEPF+52_x z8q)(q7kURNd+7F$Eq+}IQMPiXDeLx@7;Y9~gA+7E)T7le(6Xv(svs4ua;q{_k5z9~ z_0g*6J5?`qy>hu)Y`ByGb;{UU)f8+CwiP>uUBcdD`!xqNJ@lFSRr*=_Lj89AQGErX z9Pw6PnrKe6A=-laU<*P+6c7W655(`d!k{s9Gt@OL&{otn)OFW&)lI`^;O}v9)F5g+HICX%9ip&;6_%2Q#g5jH zYr55Z#QbDp(Zsl6r6z?>il4O1xCoMSt6H8JyyPS@n=B-MCohqY$aqjk>NRb^w4u{R zP8&6C;~q;KvcG2E&aR$QA*WQ%yX;TdDUbo44%wMKb8>TR zIfHX%<;>2RlCwJJ!Q{5iSx_@~(D}^S*)`i0=Bn)CU0YqBUEN))T)SM4UE$m*S15Pd z^~9CLJ#cO3I8MQJhuUcy)NLEMt=vBD5_g3w%io1B_9yXc`K!HNnj#>VbYh0n@-6T= zC#bi{!8vMn|KRxSD9yHj>;N;H$&O@)v+9xhk#@*pU1g_jR@(sE9orsT0%(q`uz#~x zWx|-JOt>?~N%T9_@5GcdQ_fGB#7*gOrN^fp<$5OcJkqmrud6*~I@;Nytp}{9tt+h; ztr2vqOlRi6%xRh3G8bp=&s>+;v0LMAq1~ExtKALlR==ALs+#6PC6f^y+?b z-}2Jk`F#re)GCw}CKuK(>{^HwY6`W5c%h+?F0>Uo3cDBP6wd7}>J!|jVxLp)LGDrR zdG3ww?e1%RlLN!2jG8ia%DgE92A3E@3^_66){wFVX98XGJ9(6ze9w5#b5CjS3s0ms z$eZYG+JA7t(t@1@2McNr?K5<2{($~l`!DJrKHyt_WB@gw?SS+F6$dOFFm=GU0dWJr z45%}($-u<}PYj$jaQDFX1A7cwGidIh3zIeux-sZd{&N3X|5pDwf0_I?Mt)>l%rzow zM7I%9qiT+-H3}UyWz6g`+r}ImvuDhuF-2qI#+DnKI5utUy3u#W3?A`v=&Ipch94OI zXn5%nl|~3BpLCVX?l-Idto`H0PAL9;t({aescDiVscuqok}RoyQc6;jq#8-JlIkS2 zNNSlRO{$lalq63|O=^(TFsV^e)#WwhHRZMB zwdHl>b>&HNiM)%vt6V8p$x*plj>$E0tz0L^<$5_GH^@mjh>gi9xmj+JTjjLeCb!EO zxl}Hb%jL=Pdh!%`s=U6ufxMx-k-V|IiM*-2nY_8Yg}kM_m0TfjEl-oTk*CYs%G=4? z%R9(B$~(zB%d5EiNUFKL^2Y9}5}8}#t|qH4le%ljs!8PTdhTR*O<7BKiaXWa&|O{9 zz+E5Q0P-ZYWwm5AByLHPyN0E8`A8hQkh&PlXZ4? za(8rhad&km%TPBbSG!eir5khOZkJr+*1C1>dJ?@mMOIIiDl@o2ELBFjYkHcxYq(8r z3jTJm(pHj&9)+Z(thJ<-tcjU%`KPI^%$i|p8Ar8vPQDTvId?OvJ`J~Su=xyZXq;{`TTFc{? zHt{y~_K-I7Hutvlw(xe9wet3o7Aw~GlxnLA=`I@p&*G>8c7k@WP|mh|@a^=8QPygA-JUY#`Co9lIZ{a%l^iqGfudQGybK3rPeS68B!*6>lX zTE5!8YQCDjB#Bv8*H_0U0TC*xPa8~Ez`Qhg15 zdYRG7OHE#zmyl6jv)AG^$a3UriPhUqk}0LVwLNt_jU?&bw%%;HUeZD$^>&fD{c>-z zH%->w)4|h8($UiyoCG>~x_VGg8(F$c>Ct+09+gMq!949`YENg0-h+GE%0Lj;15$tB zJzxaifi58MX!ckZbrmveX%a;S`ZKTiW z)B1G2K2qG*$!C#t_I2@f_4Sr2eJWpXpTgJ5XP2e;-g3D=Th_?m#NXK8%-`JK)UWWj^0)N2 z@Td7(`*UP%{cZf|{&xQM{uGH-YLRyGckp-iXURMId&|1`yUDxyReq&k?Z^DJ+#a9T z=aTq*xl%&n_f_#%_2)^edy@SoNj*O$N%5!p>-)`;27b3(B|~LiNl(Ab)6v&g(#xOi z&++&6_wo1joBU=!NRqzTLYe|!&5-BaQN#G?*>XS-5Qjgq|>`9i?^ElhrS+u^qz$D#WsRhbrA?$wrOl+xr7fg(iOEO#%sz{c zkyw2W3GK7_>^{cl@Uar7g!MUnE+6OPeJZJ1TGQ>3VbW|#j>O~l`V~pVf7||tKaENt z<)X^K%4HzG3%5!s)22yn# zFvkJ8V=P1#5g|^9KS@Mf(EpA?z(f151P5or8FYiY)*aH5dcyMW2!pc`M3e*l?}(7z za2NYP{|CW+5i61heL&%c{d!=z7y3UDAwKB)Ap0*LmIa_4Kmv*VA$~`I41o5(CJ-0| zbAZ-EAPzx-kphT+gLo($!!S6P;jsKaAQ%B-K-_4!U1Q+9#zKEAY-K#O;SHVmd;VT= z4&UD)KqkRBpqPy8M5aRfzfU4E4c7Yy5~stm@416W;!Lb26!EejYoIo)$59a)P z1ju}t_Y*O)06`)a!Fex+@xKy4mcZB&L?HYP;(tKA3=ssD!?CPD68Elwq5p&A?MS9z4-#B`KaA~%-_HYxSa1mD9ftnjAUFcg?NNBnAwN-k z9OfK{_6fMhkb{_b3i^K~82JOn0L5wG49qzT{j+f2&q4eJ#d+B01teH}37)&lh(d7{ zL9Ewd&UNVDfO~!uxCQ+m1mA}Cci=k;IHtSM|0@CUeHi=CBq9%B91uN(V}Ar~An`H8 z$4G?u8AL$w96Ir)VM&1kfwZUpOK`9tfRq*p1!ZCE7ewWt{}VA%UVw-z2$0fZ82?G2M+EdE1R^97 z;tv8*f`A|f`oAzH4*Gvj06t@c*WrJSA^}dQA{=WaL9j3p=Ke&CRDu3aAc0Ddh*X2I z|2|exO<1ocWFOatSX%(eSpqRq7uw$mhR;IbGh7&xK>UGN3fEKy*GCRx|3DyFAVliH z@?TJ-KtBbpU8-Op(g50jC6L$%#{PlC#<1)k5H}GZ!ltks2s9HQiOmHfK}+bjgnhMw z_=D1|1p#3j=>H%w9om4Rtze+I1DtzD0pjWcWB;09!H+!KfC{cV3iDC8Pig`Dazh*F zuZ8#nfezY$0*Ck=QGkH<4}yQ>;7%~X*iQrqB@m9W!ZoA?Wf4Yz#5&-k}u`LO)2D3Ab* zeMf=xgLXebGBN<-zd$e$mJftyV-UojBqD?1IEKL34@3pf{)NP$a6H2V$j%Wk{+&SL zC}@uoj6uc-6eY$B5WxhPGf~h1nGDa_6j=5X$fXq^LDL1|5`_Y>aJHaI@H{~ZBs)M} z!2d&(xEPLW3H1Ml;H5DB3(3pi{{0Tm%5p(}#VU9`SuJRdtcCrrgWtUka4Z`IfpS}5 zou4R>t+38E7~3XL1a?5&0rPjlHg*Zb!F!;+S0EPehw&eX4?r78J_N^g7}|jN2*h6y z9fdy7`Z&a2NInVulLDdW4_N0ka7G|doP)9d0wXTMydMNEK^q8MhWMS5$W=JsYjD4= z!};6*Zo)D^a0?1jd%(gw!b2u0$y5CK6uVJPIzBZ7|5{{=-S=y!tcc82&JG13Ljw=49&lc-QZ zTLt?;g-B}*+8Ep*EyRBy9f#x7!*U=%2m^=#)+M3;9|#!XoGD?j&;sXag=3}x8_cr_ z1&IvAzoHPcF!omx5hslO6*1z1vA;pV3B@s)uq+eKx0_Hb?k+@xJ>dTJ6bcmCF#dzY z9BBU_u{X4P!?o@M@jC*fFWjFzI5#(p{S^V?fw6xNyw8VufWimy2SPt=Gavf-LXn^! z#D7MJ^oQj?Q3wV?9}o?K_zQx;aP5b{*bul61#n-6Li-mK!{C|^7X~Megz@hrBcp}z z9v}L@ARG(VY#fYzM~IAvHh@lq2#6-ZwVVu0f&LWO=TzA4G-&@|=L~rEW%lG<+a(ktyCDLiJrI8(uowFO z%ZT?0g~12lTn@sv0ns6dfbg&oQ5=Exe}Fy?W5?kfPC)$k2#}L7?>mD7XJGqhq5oe) zft(ZWMlQm>F2QTbWnpRYHMl?5Vf|l7yaE0HJ_6(>Z0i=RdkeOG8{#jB?m+*)fZ#6N z_xtdSJb-8T5uDp&xQ9>RS$Yb;lh1@m3nBBplj*MT|tiSVWMZL^QIDVc8U!T^8wbJP zeAv$4BM>wTN<^B&oEAV!nD@U&sHk<&!D{Vcn?RsLP!Q57NEF;9sPv!Dj}peeGe)5f z3Pm(Qf<#>qRn-(!D?kT{5nGS|u?Gne2Il=0A>x2BK+FcgXKg`9unYPwm<#oEzfcm% zfc{?zAVQ@`SwdM-8KMkRMk^~T6O~nz)s!`rb(AutTv<<ku$DNLRK~ zc2cU9I;CDoDve5;(ynBb4y9A+Qu4|SWu~&5GE3QA*-M$D?5*sh?5oUG<|*AukJ793 zDf5*9Wj|$qRG_7+vZ+{=OT|M5L^oBIs;8=# zs<*1IDp!>USrI-}K-EvxUo}WIST#g7Of^C^N;O6`PBmUNQ8h_5MKx75O*KPRsG6mk zQ=HSH`c3t_YNcwGYPD*OYOQL$YJ+N{YLjZSYKv;CYMW}iYNu+KYPV{?>VWE?>X7P) z>Zt0N>JQav)fv@U)j8Eg)n(NU)h*Q>)m_zn$j5l1dZBuydINbG?^N$qA61`KUsPXJ zMJo8`85N>Is0b~AmPAXT!Dwl;3|bbgfQr#jG#rgYqtIwH9<7L0LK7jQqZ(Qrt%W9` zax@vOho+#ZXnnK++7Ja@E3^sP3~hn7LKSFhG!0Eh+k%iy=ooY?WCD#xC!iD2N$6yB3OW^?hE7Lkpfk}z zbQU@rorBIr=c5bJrRZS%S0I#wO0j#nqBE2=B0E2|ULRn^th)zvlB zHPyA$wbgahb=65~iCU_bspaZqbv<>8I#pd?-9X(C)O;GNo2Z+ro2i?tTc}&A)70(N zozz{_O0^0^YB04%tydFjgW9O3)Mm9sZ3VwTyP8q6YNwi0^Xl&EUTU}6ug+HwP!CiO zRu54RQx8{apta>Iv#8>S^kk>O%D_^&Is)^+NR`$j4fuUaJ0Gy`j+~( z`mXw(`o8*s`l0%f`ic6P`lb4n`i=U%`kPvWmB314WwCNt2qwnDu?Q>@OTa2&m9Z*V zRje9T1FMPE!s=oYOpeuq+@tzf1FSjL5=+P0V(qZ@SO=^l))`Y`Dh$Ikm=4op1ZKcU z%!q-K5oX0~m>pv<7IR@4SSHpD%ffnKJ+W*o2kVXX!TMskSRUraJeU{rV*zXcHV_+x z4aSCGL$P7laBKuN5*vk$#>QgfunE{iY!WsZn}SWnreQO%`Pc$%A+`uxj;+8}Vr#K= z*m`UOwh`NeZT>SmY8$o_+lB4M_G0_6{n$b5Fm@C&rjBDLuv6G+>^}AYdx$;49%E0ir`R*>Irb8Jg}uh!U~jQ^kaP6``;2|T zzG4E6P!psPX-a8IYszTKYRYLUXhJn%ns7~oCPovlNzhc%RMu40RM*td)Y8<})X^kq zBpRtku1VI^)1+upHT5+OGz~S4G>tXQHQ=JCNdq^kcACzbE}E_yRHM}p8iU5Dp)?MS zOT%k2HQhA5G<`IA8jr@S@oD^;fTo{jfM$rMKr>7;N;6tBMl)73PBUIJK{H7+Su<5L zT{A;dsF|&qqnWQ+q*nwt+cJRY1(vcTWx!7M{O5vSFKX3(yFzj zmeQKF7OhoFYwcQx)~V&Ryf#CdsqLoC(stMO(B^;=np^AF=4<EP1?=ct=jF{J=%TR!`dU- zbJ`2q%i0^-o7!92+uA$Y$J!^_=h_$Am)bYlx7v5w_u3EIkJ``LZ(2kr)CK88x)Qoz zT^U_jT{&HOT?Jj3E?gI>i_%5wVsx>(I9-CSqOOvzvaX7*hOVZrwyusYNhj5%=<4el zKz3bYT@zhXT{B$^okEwUYpZLo>!9nb>jF7Wn%{XVzJC zR-H{}*SU0@E(7xOdgyxUdg-!tIl4TZTj$f|>jvot>qh8C>PG3t=*H>B>n7?Z=_c!@ z>89%nb+dJIbaQp{AU}42ZlP|mZi#NG?l;{s-S4{Px)r*Wy4AY1y7jt^y3M++x*fWm zx?Q^6x;?u6x&yj{y2H97y5qVNx|6!Iy7RgVx{JC?y34w2x*NJ%y8F6^x~IBlx)-{a zx;MIax(~XKx=*^#x-YsSoe&SgMR*CkBwh+HgO|n2<6=A%55vRp2s{#x!lUt6JPuF5 zE8>ZG6}&251FwnK#_Qm9@g!V^%kgA96>oqy!W-jF@#c67yd|!{TZ2Mu8$2Cvi?_qu z;~nshcqhCwuEJ4Vjbpe5l#+3r#Em$Gn{f+n#cAA*J8%|v;@$8pygS|l?}caMIe2fp zFP@9%;cncA`|*4{fcL}u;{zafcnDsA55g(U-+}MMcj3G7J@{UHAHE+yfFHyU;YaYJ_%ZxAegZ#!nP<@y_Tpyv2)JN%~^)Zmi8K;leSJYS1C+e%{tLm%kYv^n0Yw45p_4FzF`uYa? zhWbYO#`@;^7T}57THi*Wu5YVvr|+QesPC-D^cuZZuhZjtLT}L9^me^N?}Yr)EPW4s zPkk?aj=r}(SD&YM>wS8^K3^Zu_tOv27wCuThv`S^N9jlF$LPoECqVx2B>iOl6#Z1l zC7z+53Aw4W^b7Qh^-J~3^egl$AzyWkew}{3euI9KezSgyeye^PWUubf@6_+o@73?q z@7EvDAJiYxABK$9WBQZ&Q~J~TbNci8%la$&Yx$n6KOxPZQBzah+{}gy6MDh`+0?}@$`oNCtOQNiz$2Lf zhh!(=A~^5~??z-1-H9HMaovl^CUU^}yARQq$R+Z?m)k>l2_KP9^oKm&!Nd^A=N(22 zCq@t>iBZI8Vhk~sm;ia&lZeU06k<9tgP2LoCgu=xiFw3)Vga#`SVSx(ej}C0r8M{L_8&) z6EBHZ#2ex*@g6deKM|jaFT_{k8&O1nbc-R#P{L5s5Ns%IC}SvVC}*f(5F0`bVTN!+ zv?0b2Z>VUfWJokrF;q2FGt@NH1{d;V@Cr{gG%z#-2k;h#mWEc~0N%#X*3iz-$$Z<9pjNoie8O#QYfi~C;i~+p24K4#`;0+muOvr)GGIR&`?w*EThTew02Diau z@EZJvd_%x6$S~9}+%Up0$}rk6#xT|}!7$M<#W2k<-7v#2(=f|0+c3v4*RasA$gs@t zyJ4kam0^uxtzn&Ey)mEpDFjp41~o#DOV zgW;3m3sgFMGr)(^WErw7S)QywhLB=1jEo>7$tW_Kj3wj9c(Ni{iL63aC99Lg>aVpy z={1QgR&|wuhHEmJN;V)Hk;QtgP040t3$i8Iifm1$k;NLUZOQgz2T)r5uCuBlQBqBQ zS6IbKJz1=&Y9x!5REu>~tt1WVc??tmu%wIR$P6-*>_&dq!Rtx(f{gE6G7pp{y`+!y zlL4|H*`FK$6$69F!Q>FKfE-E=BZreC$dTkIax^)H97~QTp$r3Z#V3*Ou+4tbZnPdjPb?nV`XEav5K*(u^Omt)&QN& zTA;aE2h=r_KxwmBZ&PkeHrD%7QS<-mX*M%9H?}YqJEgZarWxB9(~WJ7?Tqb>9gH1~ zos6B0U5s6gN}~$gka45gXa)adC%7kP7`qv>jNOgBj5)?W;C`G7uE-wnJoX#&js1;- zjl+y1jiZcXjAM=Cj1!ELjI$tDf3b0iahdUV<8tE)<0|87;|Akq;}+vq<4)r);~wKd z<00c=;}PRA<8k8&<0<1A<5}Z5<9Xu+<3-~o<7ML&;|=32<89+T<9*{p<0Io^;}hdk z<8$Ln<16E9;~V2!<2&Pf<5%N1BVrPof=ne$rA)!5vZivT@}>$Vu_??HZi+U=n&M5B zOqETErYfdt;KW=TyqN2nl1x&Q%p^A@n^H_*mI}JFOsArpUKry`!=%(kIJW%D}Gx<#c(*V;z z(;(Ae(-6~8(=gL;(T+3(?ruusDhYfnr)h6nr~WQT4-7XbrDNV%S|gxD^06S zYfbA-n@pQcTTEL`+f6%7yP;xYpJ_kT$Q(2sG95M@H61e@H=Qt@G@XJ%AW6xTjJLK>NKB=)5;|X-DOO##fKoe6*(f_ztiH}tPEcCsscuvj)r0Cu^`f#t zk-ZPqm&&E`C^zMyyp#{r)bptT)sGrL4TL(9!PF3{fEr2-qlQx>sFBntYBV*58Vl7W znVLdPqoz|cs6uKMHJh44&86m1^Qi^YLTVAUm|8+DrGBH9QNL5msTI^p zY8ADbT0^a+)=}%JjnpP;Gqr`JREPb%r_%byVl63)DsG5_N^TPTinxQ+KFG)D!9{^@4g!y`w%*AE{5&XX*=8 zL?LF8xsm9GwZ@wGuQzOFgREcsI#KE<4B zu5WH&ZfI^|Zfb66ZUq|ft<7M;ZEkPw0FK_B%$?0$%}TS%jGEPE%&alvX1$p(Ly?== z1iqsdvlVxDdy?sndUj>x#oH1`R2vuCFZ5(-^|O*%grmyE6uCStIcc8o6TFyTg}_d zJIp)HyUe@Id(3;y`^@{z2h0bd%IB#0nEAN*g!!cTjQOnjy!nFpqWO~fiutPfn)$l< zhWV!Xmie~%j`^i}|a$gr%gV zl%=$#+@JMjVoR7M!V+bPwZvHxEEO%4ELAL3!MC)!rM4x>BC*IU$(9sLs-?cAfu*6P zk)<)nYqzkpw6wCcwxn6wSkf(RE$uArEgdW!EuAc#EnO^KElP{ZqPA!)1`BC1T1*x* zRIgbrc8kN}gi5vyOO~a(rI#hg(%aIG$}-wA)-v8Q!7|A* z%`)9G(^6=eWtnZ6Ynf-6Z&_ejXjx=gV)@Oo%(B9=(z433+Oo#7*0SER(Xz?1*|Np5 z-Lk{7)3VF5+j78i&~n&v#B$tn+H%Hn)^f>m*>c5l&2rsx%W~Ut*K*JD!1B=Y#PZzo z!t%=U+VaNo&hp;!(elai#Zt-|Y%OgqYb|FLTSKkk)@W;tHO^YeTG?9FTFqMB3W?TM znKjv3&zfRQwbr*bv^KIfwl=XgwYIRfv?{FW*0$Dm*7nv8){fRr)-G11Rb^FMHP&K7 z9KDsW8m%U)*=n&`t+dr)WvyA(p4ML09BXfDU+~ZlSo>M~TL)POTZdQ+ti!Cst)r}? ztz)cXt>di|t&^=&tW&KstcBJ&*16XC)&3=Svi=EHq;C)_?P66-p`rv!skZuGX=uN=)ycxKiw*b%c zVt4a2@H0;bSMzq@bKVgg&AWnkISPK}8gMfI?qF`9i#^Ouw3)WhR+^^m;I8eUS(>AH zI)g6uuge1Wx}J0|I-Aa+!JY0;Upf!%rG2!Y&Zh%(Ke|6XfF4K>q6gDM=mL5uJ&Ybf zkEBP_W9YH;IC?xik)A|Prl-(T>1p(IdInuc&!T73bLhGBJbFI8fL=&1rGKM;r-&y`MfnAEJ-a$LQnq3Hl^` znm$XPqtDY9=!^6v`Z9fmzDi%CuhTc^oAfREHhqV_OW&s-&=2WH^ke!7{gi%2Kc`>N zFX>nGYx)iSj($&npg+=|=+E>Q`YZj7Mr;C`&=zD9*-F?-*-G2OZ4tIuTY{~kt&%O# zRt>!OYT0W4>Aokm$!*EDVwb%JwuZLGwkEcwwq~~GwlrJ1t*xyc)bXlps7(h>>w233 z+|^As%4W7%pyrOY*=!7Wk-Ka?!C@Rc$8CLWxwh}V;QegKt-v z+RNF?+e7SPdzd}k9$}BPN84lUvG(HXz*_b?c8OhTm)VoSaXi&t-`>F9(B8=2*xt(+tcms?Hxej`v2)y+kdK7o9vX`YG>>YJ8O5@i#<>?!Kt)|y_Y@Po@4KA z&$Z{-y>_47Z_l^)vk$Njv=6cmwhypZJ3TsXK*&{3a+9m@D^1w8t@v$89ifQ zNX7{MpcGT=DoQgp#?CO{D#|i0hG&ZXKeL$b;0W3id_c3oAG9~Pg!W}T;Qi@i{7gO* zVEQown88c|Gn5&|3};3#BbiamXl4vEo|(W*W~MOHnCZ+6W+pR>na#{$<}&k`1W<9fs*}`mNwlh1JUCbV4FSDOHz#L=_F^8EW%u(h9bBa05 zoMFx~=a`GkCFU}7g}KUHXKpYzncK`==05X)dB{9s9y3p%y7U?IoO!{#WL`0^nK#T^ z<{k5%`M`W+J~5w}FU(iw8&kvx970EsL*yvoDCsEW2zHclly#JIly_8cggC^GP)E2U z!V&3+azr~~9dV9$M}niGqmrYtBN4n!s}{SQ{^@L5>~LBad`+c}Vo%c)N2;Tdqp730 zqlH7^XzfUIv~i?6+JO^7CvZFH>QI8y0rsbhfgT(SNQcQ`aabKRI1@M=PKOJsX?aIC zN0y_zqo*U=(c96-k?Y8FxE)X?=kPiFj(kVJ(a+J}F~Bj~!pQ9B>?T9C93X9CMs>oN}CYoN=6WTyR`;Tyk7?Tyb1=TytD^+;rS_+;Kc| zJa)Wtymq{CymfqVe1yv1FOIK{Z;m2|fEBSN*ivjTTbeD)mS@FmC>zE`vC(V{8^^}8 z32Y^{3R{(}##U!*vUS+HY!WMBWo$B=!ltr~*v4!Vwkg{T>WEvh3O0>RXWO#v*!FA( zwjsL zW9PFA*oEv8b}9QCyNvyvUBRwoSFx+vHS9WeJ-dP3$Zlr0uv^(}><)G(yNlh;?qT<` z``G>L0rnt!h&{|6VUM!M*yHR8_9T0X{ewNto?*|j=h*Y?1@;nqjlIs^U~jUw*xT$K z_AYy$eZW3qAG1%`r|dKKIs1}*%f4eju%Fn^>{nLc6gq>PB4-I_NoOf%IcEiDh%?j~ z<_vd6K`nKxGtQadtmI5|R&iE!R&!Q&)^OGWpFEi}*;(v&*U;I>S?qAv%-P&o>}S{7 zneJ@sZ13#k?Ck97#GG2E&Z&12PJ@$l8l9BW2JWp4IJG*#sWlTET6=GtcRU znsT2r;Oy@l;2h)}>@08&bB=J1bdGY4c8+z9bB=dTa87bgbxw!s^V!Zh&iT%T&Lz%e z&gITk&ehJf&P~qE&MnTZ&TY=^&K=I3&fU&^&i&2 zdD(g0dDD5@dB=IrdEfcK`N;X$`4sBeUpe18-#OnqKR7=+KRG`;zc{}+1umg0$R%=> zbd`6Bq1rvd73qp`#k%5L@va0{C8&N+bX9d#b5#ew*qY!NTN@l@C|F2ZF1_jjYq1pe)2mj$ZmGr@H|3+m{5xO%#Jxw64~ zJ=c}za=SdPVz+d^E8i7x^>+<)4RIB?hPsBihPy_%M!H71#<<41#5qfoq9tsp~h_GS_mb(_igc>ss&H;M(Zgdb zT-#kcpniXkYp-jcYrpG&>!9nf>!|Cv>xAp1>y+!X>x}E1>%8lt>$2;L>#FOT>$>Zv z>z3<|>#pmb>%QxO>!IrrRR2G5J#{^Iy>h*Fy>Y#By$4;2&#teoZ>}O2!U?$`PQ;bu zN^!wlX|4=cjtk*Jxo|Fmi{zrXXfB3}<>I(_E`h7aRpP2}Rk>qDi5zi%Y z67YnVbM?3sE)~=S8iEgeWAKJ=#x>_!g33T^t__#YwFSTT_FM<9Be=d7yS;Y>?{^h= zyn_uBr{Q!Q&JmzPU<6-x3rB-00mC`KiQNS{1w5C@bpx$}9$c~OO%C|p^x=w~ZhV}d z%jf!W1GqulFm5ID{AQLOzHW@g?|@d?`MdFU^Bl##kmXG7(`2@ZqUx`or)6u6oUxTm7*W&B&NxX!Y@-jY|PvKMf`g}va5#N|^ z!Z+oc@y+>Gyn=7dr}1t0wtPFj1K*MF#CPVq@LhQ&uj17_#%p*juj6rE&y&1~r+71O z;jMohd@nv5oU4l+tNZe~yqov%KHksg^Zoe#`~ZFsKbRlF7w|** zVf=7@1V54=&5z^9^Aq@qpe-?lpUO|;r}H!TnS3EXi=V^K<>&G9`33w!ei6TzU&{Z^ zFXvbAEBRIYYJLr9QLN+F^Bee${3d=gzlGn*Z{xS~JNTXaE`B$^hu_QZ24{{xW}szsg_Zuk$zfoBS>QHh+h| z%irVg^AGrk{3HG`|Ac?aKjWYCFZh@IEB-bAhJVYycT2{xkoD|H^;ki+GR_ z$`ED*Wr#9LWR%P(l@Xj#I-^WR*^F`-_LNmfL!ZRW=A~T{gqBCMLVl(10 z;xiI5DrQv5sGLzFqh?0!j5-;0Gm|^X}?5FoI2N(w$2N?$&hZu(%hZ#rch09UK z(Z(^xvBq(F&vKexsWci*Mzh|n{L`rfjCP~L=rp>FZllNOHTsN@F=z}K!$#Cd7#SmL zrk5RpWKzP2(-& zZQ~u|UE_V@1LH&EBjaP^6XR3kGviC+E8}b9TjM+9d*esrXX6*+SL1i%593c`y79L$ zgDImalPR+)iz$aGrzw{yw<(V)pQ(_kxT%b(tf`!-f~m5}@VB8-$5h|c(A31#)YRP6 z!qn2#%GAcx*3{9|NpH({Gxap}GWFJ5?|n`EO#}22{1CnDKHM}yuf$I@O*T!@^%0}V zr0XLVy@w2#9442^WAd8*X.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

=kyI&*gvR&-2CnTdbTP zU>bQT{{h1aptGK@oKEMl(@{8b z2Ao+p<2IH=x8SDToZDQ=xheO#+fZ_NGj86EdG#e->8CsI)|NCSr`J+q-9X9Z^?Q{{ zrQ-3bl~Sc#@p=Q^Ulq64=l$+KD1Gz)@TY6t{vLm(ma297leNhJRikTUt;_$Y@wD-* z@ucy*F%@{+c+(sTzHW9jUo{7V!@*cf4CaIR>z~)sbu_db;@aZ%c{>)uLsuc=P3`7F zv%r8QK-Z33>TCMC-iKcrp8>`AulREyo(x(-mRK@nC9Haiwo=yk{dG!P6V??bW(8p@ z48hCH8gmFQGONrIGmkpCFIY1#xr0tuA>=%9dJ67>w_q(DmTHx1CFl)#|7#R9>kJGZ z!7eUalY)F()|^C|@E7WpUVr`O zmnMK;8D9WO{M14w6Uk)q%t9n{)^n?Y;;gK7o7rL9+;{97c3EL+FB>l!Z<{~DFM*QA zuC?e6bfE4~R}HJ-n@B_dJ8~Dfjr@r;jbS{5$MN6BTVn)2!DIN1@qy_K590rfQM_%$ z@jK%mV*)4eQ~cW4GX6Ez;;r~Q;5AT*U&cQIuYh{|4e%bgigy4v@wdPSK#e!z*YRq+ z9B;>)@q{I8!7YS^N=7WHWZV+9(8-tupaiR#I-q!~WKAbcl!f|fHBzEAZ`CvRgHsrT zQCQ0u7#nPd-S8==W1R3lv&*<(4YQ7VxD|92T}Fdkfb(*jsGoDdC!CL4LzmDEG{kjd zH~Dt{I^T(PVWGlV;mmpJ3>Sihi1VZnb_NQkg_2u#J4#r|UV=+Vsp!6N|8gId3hv_) zT5^_brAFn{dtN*7vb9{T&p#7*)tC<4FVi$fg72CaL7^QFnQqKCipHvgbXWQ${s~B0 zF0ACC2lm4Fk&)R#@A9|#vgSxf;*U%ZO}Fv8cqW-ml9rSuZ2>9S>W6*s8Mh()&bvze z{?TAX6%_5bu=O=9y&N>6z)9=|9ss{?U}dUzlXP zhzocY|6;np-<#f=3b=&l@D$GCFHP@EPfR?{;S~PCl*eiOv*{Q9)YM^Oa1sAxdTx4U z`iXZD-M~2Th3Fs#fR{uU@RS$^J`n%n4~Zwl@A!M7pXdXg5#NZv@m`{j7$iE0SHwqR z1o#g01Jl44;2ZFmm;eTW9^wHp1&jhOh)Lib@gFe+bQ7P5AHV?doah9;6K{!L;4|?R z_!A!kBufwQhImapB7P8GiO)bKsaVuxJ}Fqr7B(p*%Sk5LOj4GsWHnh!a+Y6~LQ+oF zlf|T%JWp~-C3%sgEv%)H

Rv=l5AOU_cXl#(S&){?R0l0x#Q@yCqNp%cv7S;z>mO^wdTni4tyG*!Q#h5Pyc9%{ zl%GI%WzrFfR?!uhjUe~#$9p% zszGg3nv*$-+eNLY%7LgEjd1&Dj5|a*F3cIxJeTB5D9i1jSy`R7KgANtV?_#c8asud$C`f#$Jd&uvg-D zaTI$ZPGbGoYw@x8C;wF(!}`R(`C;s%ID$PD--#XK8?g`T6=$%w;(+)s|4AIgrmzX@ zq4-4{#|E$uVz)>Yl7(0yU*HQdXQ7ZTWSzM}qQDj?XSGl+aD{k5EL;?l&TJu7h!o;Z z+F2}QoY8_>_*sw(X{S_B3XC)5JTDN1S^+QoDkPkAAyXinxRWf9&Zx6gs1%q&q~tHT zOV{qQyY8;I@lvLwxPzrwNhriimu{}qa^JYUrKUSqIxms;M>SkZmDmzfs<~Bnv~*Sq zm9nL_n=W0s8}3BOQ}UGpC8|V}s_v6gx^!A1yie6LZ>#c9jd=f4|5VzQ7wT2zUnS{% zqP|rBR>Ix~YO|8?K38umxc7JErb2q}Dp7CT`&hlMJX0U3gZ^S|%s=iQ@XIx+c2OJg z^EI(H>=$aI{vkhC%hw9E_l-A=uZ=H_PmQ;Yg}}SUd?4oi*q94^YkX+DZv3px209vF znxC7W8)L!m&Cceh=C|g@X0r9QSqv6}M2l?2TZxt&EL_XiE1`>Pu}y@2w)1V^=F7>| z&E-wwrg`JIRW&x!hHG=z zT#JLyTW$^;6odM{CzTGIW}{Of$e; z@(4}JckW4lO@rymc(+NxhlyEWgqQ>VB&!zH!c*rIN98D%;+Z_d!ve#>Kbha$h&U>a ziC2Y2;oNyyXcqD%u_To`)U4J?lXn(M7o}27 zYS%S=VXyYF;lJntaExAR#)w5=oS?i7O$DDI9+3~pf62ee$K(U@0rU|12}{fcQ(zwQ zkN5}tU+y1=qLX5~a9wB>ZVJVcT>9<)RieGGRi)O|C|+M_{92#3$J8I*2|IM{@Qdin z=ns>MF9DOp6j8S{El2AY+!+xDh=hg*vcVVaQsllW3>H@m1==W$x^u6I@w8QW^`Z@X` z`quD1`o+*0{buMiyo$aybVolKz8ap!o*RA`J{#UdUmCs}zC`~syf8eDy^X#zbQyZ0 z@1k!E9}QK!+we8|!O&xPX806+W%w3-5}Pn>m|FO}=~ZmNG;DelyTaS}v}x9Khp(8% zOe3aI)3WJ#Y|eCx|Hfxbi>5#L%h)ooZW=Vbh`o;8;BR9OVpFCjK55!EEtnekGO=db zGChnvi|v?JP2;9s(~#*J?=!uL)$tns7r(?eO)blk=^x&2(g7W@En=6@5UYfqFcAQ; zM63XtzzgyK&=Lp4Cb38ikvqU1u|{kVT40;l2IdF@VJ0>J129dPfHlAZ7>QZJ4E!Mf zi){g`zzQ)#0DuPACyam|SSNOYd14RP2Nnn&u@3AI9pqojWAHQCMSdk;lCQ~UR zcxU-S_L5J*Ys&-h4fzOsOMWMxfMeu;){@}K1u*tUEld&prZPZg*S&^zckBvB&O1^uEvLwD43 z`U%vg>eMLollnsqLEoT3=nYh%{!!P|Tj&M!l>SRSpx;B^p+~er{ibTv6Z!}A4C;oO zRD-&rK0;MWrT&A8)HC`ebV-dt1CUJhLOsw3bVKz+AIMv(4|+&Hg<8~Cs6>5%K0zJO zE2zjkrpweH<~8&X>4d8AHS-5nm@-_1U$82C30L42{F;5jUNU!Z6aLFwz%SXy>@T>@ zwBgU}7q$TZ$KJxf8I`Frf8hpm%Um(P;U`Fq`Nfo&GNZsZ%nkeqxnn-EuUHv=&o{XeccH!f3;rd4ijMJq^auZ#KSSN<2mU|)6+g(^& z^y2-Ki7jGAaaUXrwU||e#ZA#5u495zC*Bqg#1-+0{6-d?ujTLZh4YpCR<1dp$wlV} zxn8<*Hk_a2$MO$ZbxO{!a+lmEf0kd!va{s8bXJ@l@}Bsg+$;ZbmYx0bPv;l;ccEJr zyf5Xv^Ql~L{wbKThjOR z^iXM*l+qjZu~IGlDZN)EZ^oPRepJ7!UscA-dh^~+^@Dou{i1$WyHwH3d4GC8sTW?} zTkvMR-_&<%yEgA{)~;)_{zmPpR;^u^YPC6kxi;;;sm=H+HMMqGTl6pZ>$SB&Z)3Qz z9_VhY1Qr9Mjn%+X;67BbG0+%nj5J!cp2l)us4>>)YxFcHf_=@&;8?S_+1>on9B2+V zhnl0!uI6}fusPBkZ}vA+t#m8fVp?=7)1q3X;997B{p-4Ptz55%3hj$Fc+(6W+zZr} zo7T5f_uv${Ku(g&VT(Ov8Z zdJ6hTf1x|+xAZ6aK6nuNPQRvK&|UO<`ZN8C{ttP946|>M@9Y5kjqO1C*dJ^!`w|&s zyV*|m71G1@v#*gMc8*`=*ZEzZMJIXk9^a8c_xL!v%}?_?{1ktVuJHuA&!^FOo6I;Ai+Gnnh_eh33!%y3AAP8)TEe4_M%RB8<7jfanpAF}LU!G0`a^m{)X&C=;%`Rw`Pd9Hj>-YaiC9iDf}8|8!NgYw$*#`9Kr=Xs@kQa*aVD&Le(o}#zv?N$fW zK2`CSyt4O)TJe^>zr6iwkJ_uM-c|qa+LC|S|F^c{zpLHWrW${0(~XV5WaA!A)z}P7 z1t*%5&GS~Sr3Bel^nrm^XQ3q&s&qNG6 z6&K|t`PTVe=~NaP+kyGUTw|s&+b9R8n$_#}%^!_6e5%!jA4i_t<820_{ZYU)933?b zMn?>z(V=K>%uV#fhGGY%L(_1qKQ<8Sj)A5hF^g$1))(^=F2D_h2oDh?yo3`75I({{ zYDqo$4g3mz1~sIS`~-dhb>t|$PnyU9dW0UPXV`Uij2@(?*(GQZ>Zgb3WoQAKhx+Jo z`aX7%{e-Nri|iLqqLEwx?5fLIyB#AKL z1!&@w2mml?CXY!AX(urfAZ;XaZ*N7(Ua$wWk_Y4==^!EU2S^Z|U^lo%Pt%k16un3< z(R1`Bv`jD1v-CPNL$5*`&^*0PcY$lrD!oE)K|Aa&+lS~`BfH0TB05&fb|L-90AgUj zA=~UGyU%X0y~q};VNL9JaFc$jzd1@xF# z&GpJahLkboyJuQ$c{lvm-Yf5fI;KvlGiuX2rH-nP z>QC#-jR*DF=Ck@<;7NVc|FHhJ{=B}@SZeGC78^4`HF$Yl30_^-uN&8i5OfpK&cvLg zi`<4he2+&H*bE)rM76WAzP${QCETQk+<|r>GwbJlyqBj$TFi)k>_7(Oapis)-?O03 zs&neR`l9|{eapYv;9I!%1lWTDd`#;l_n|>#2#IS6?X$>)Vcc*EFa*FRv`H-6W}m-MxK&EavD4#N5Ikhk7$?PqYt1hdWY7~`}8(#giO#e zJBdsnhwK<~#7-eFJB?V`QDhuJScnB#l0W6^=oQ*P+vqi#;*)%YkMl9Ui6(fQPxDc} zh1SqZG|cD3Q%n#~uyZklo$&C_i;QcKzpi;ezF7E>M2% z3S!6d6W5e7sVpkf%7QYh^m*o$e$RksPMJ||yi01^yQ(g$E9$NHb$!?WroQceTi@|_ z)Zf)#*7bq4h9NK;d{v(dR)a!oC)B*&4k_(c=sJYoCIOz9L1qz38__+F%txmUn27{Z zKpN1|QF0cvKw8?y&Lb#0hfw@WmqWJ6b{Uh`)c5uKV2@_&n$|AI=D-Dn=JVn!*OKy~ zzR=8Q9i|K*5Lti*C;%tt!3A&;JcRT#2-#UHw1{N*8}t?pV-c*wHRM@V20iQQo%dsX zv6A?dkS9b!B7OotiF4qB-~fV5kx4Q^rb&vV z$v7D!?}PHd3`vrQbe3ENmp~JJZ&aWG+Cm@D5RE_(bPO426tdDV1ky*4lXbHg>tH>s zkM*-I*2^v-IsPY~<?upIaW=}@pj9Ny;_Mm{V8?=Do5nct`Dw&?3F{ZU;ge2$|v$y*M!HQ>?t}0P!1HMVp8;qMw#-Ad-fHrGU+iZ z&wM6Tt3LHT_5tb>pFuUMI`u&PQh)B#s}|L)cGkbvb^fk;PrbYTt^U2f-!KJs8hefH zhNiLG*l2Dy*PHXf&E{5fr@0VZ3N8loEvY58uCI}syPI?ELey*8kNHe~(_ZX`XcIC} z0)7ESph;X4E#eoc2P7V#l{3HGrA4oT1R8GioIVR&W zAzPGb&wsu{^@R^qd+R^ydcU?|4%{!hhT7NY&GC&PtN>*oK!34u+6BYBVa}k51x*1{ z6}Th*62FNGpaQqV9|8fd$QIcoA+Sasf*^PV-pgZPgH*{Xc}dpE6Z(`6(Lve`Z6h?B zWm$F$*+4SvCc?1m$U~vc-|_$WPTL>;H-E$5^51L^gs--4TbJ#-?JxgA`cHZyWwGbd zGl{`|xJbFz)#d7Ob-KD;pfcyNDu>EbX~8q^neohe5cNoX>4Vi{6;iEgU)|(4_>F#D zL*Fc9wchOKcWsCgE!X4$+1s_9@`JwW8snTQp#a0_DbrI`dxi4L`lh%oR(n)QjV1)WzmDG zuY5MuuA2RTe>s>83EGE=zoZSsj_gMogk$%SbM~olj=h#RY$d2|Ms=qqeXIdo0*?}p z6Ax04Qg-l3>UrvE>RIY>>K}=L|D_(LQuGOQP6r^0K81Wxg68NX9j8N(A4=01ItXRy zGl-!HnxDm4??f)z0f25!oEpG?2YtJ`iXs(K1pAt0`@_A zFI`{)_E8eC?^2iaMS3eq*!X=J)h#jdfGZ~tx`ti6Ov^HME@$OF+n8&}HR2j|t#~*& zBTu+k*{e8|kh0`)DQlj9f+?tSqP+L5d;E$`S@k%TO^;o1D;pl45>%opt~%9#>QmqP z&Qy=$QN!vRpIddQr)p3=Q86{5cKAYST=lE(e6M|8)uG1JWzS%}zdl+&^bgmE>X3h; zZuL*r$LbdUczvJ_`Vai(#z=kYeiaJ}90p7cpkZuS1C{_7IJyVYnwrL@zNu>(nybO} zU_Dr9U9|45|6KpO{(JrVdOx%mN`=T!I;6HM?cX=Hn?E<-PQIT^-|n2?Iz#Mf;#uNJ z;tF`4_%HDy@gns$^*ZGMU!^)yZ&EK)VTh-r&`&x73G^=(L=?8j=IKME#C{QmY@dW- z+h<|KR>JzFA5x#BU}daV66Bxqq)U|Za{pdLi7KbcnX={C_JozMzK_0dzE8d{z7M|7 zz9T=OS{erpb8{oO8GP85TMycQZ#1_t-IBo=J2PDa9f>CJGI0yEfIHv@c$H`a9?%VT zrcS|+sqd)(_#yQz^(Ey8gW%_s3;dKi14CdKJOSUQ-le{#yr2{Gfpxk>BgikBfM_TM zF;EstLn2+EFX#j$(=|E?Npyu)X%bTC3>1SXs7T{bnXb~m*#-+Cx9l}rW!o%_)YvjR zWoxolExRt{ z1=otJE>F3B$xE)XEX#|oRaZftch%$>S5;Q!4c9_p+EtMydDErHv#yf7=h1t1JXwWM za!N{J6oY5?-V8)4=L)5;N?f6peNS4^d9&O1Z`f}aoU#QR3Z4ESF3%~&+05_nwW{X zWCUcPKkQ#tP$qnN)#1k)_QqaNZ9Q(^gkD6#re(wHL|>{a)tl-`MZq7b?$jmykA09E z7bb)m+pKL&m=s2ZY1;$GoNYtea$U;XE~7_Oekyt8LX}iebu{b&XX8oxHiX>}x~M5) zdYkwIyh#kCaIiu5r_P}keML9v9P}vnIQKBOXqy(Mgc)JMHg9XlO?k(4B}gFMO2 z3Uk7a^w{yx@yM|$ZAshGt$Zi%y4v!!d?UBy1J8wG_5dDPo%9t{Lv5qJS$Fzf{wbfk z;b~Z#`@y7+)cpf+69K+Yc#)Lu;lYQ*$Haq!M+a%$r$iDQNu|I9NP-VDKcNSifAqYt zEA6=~9$6_UMYYzVbc<0_?D4_p#8@f~j;1K^aYlq5Wu9d6(6ik0+|!&7S+XtLo;voW zJ?V+#xBN#gDs#SB-?VSWH}Bi3d;D&{w*fV^Ax((Z{Z6jh{K$&!nIoe!hO;_GXO68z zSEH+jrRa)b-LM?pG;A2wqHBhvi7*|+;--{|GLfdk7!adP3DcG#Z31JKSj^Owcz*ET zK~LgqqBAj==uf;j7)^8>3?;e~-xDu#1BoXG!-+46-o&$mR|kEGw+F8ez9n8B{7Aex zczQ6BU_lAYf;2dh;=vp^mEyq3)OczpC4xV}|8ldb=~M<}z;jRl^WdAz1@tuYJo8`X zU8W=RGV?m~K2v~7(6h|jOc9cySD6a6_$lfVNuu<)`SIN)3$Hh7FL8E+m>xdShua&)`e|b4A~NvgbmxS zZO_)>_|Ng$p_8PrLx9nT=mDGy5;8WFgUs+XD zuixk2t#8+N>i&kW;SRt}P4K8$Z#`}6LXU5s+-5_pE@S$Td*j&j)zqA>0A7F}b4}%3 z_wL|R?sM)-?yUpzaJsB%EFpt)DFynP)7aiQjyzjFzaMGxI>uB4KV;&_dxu$iS`>5y zvM+pa{M1=vNs1(v`vIG_5O`IPyRDMKn$fj(xc(C5sz-1l5(PABLEtzZze zHjVJn@v``=_@el#_+Rn){S$Jnv=!KccrMkt+EDlFd-Y%=)Ce@R!Q&>{eAceD9XEO1 zwqe^R>b_;Vat}{lMqWi;M*WIwtY-HqO3PYhepjp%xGJGx`oiB2SrW9KF$ zhQ@LxXG}0bF>mZ7CYu5=$z+dtV!jw06HS~6i(QzCro4$Yxns6iC{{8ROg~MoSOs*% zc+)S_QOq9;#s&_$4~7o<59Sj~iJpVW#FvAPTJdSWXvo!C!oCZ-Z|iQa?GgO3N_4n7@>9?T@Psjh>K#KX8D zbqB7b_EXy_C}m3Rq>QPx)K&^f{RIzFnv@D2rIu1a>JQik7gH^;3EqO{)FpTWE+o2h zy3|JMH@KPFP5lFxQ((%HI!;}Ibr4P+ru3=3)HT=uS5sBcnyP{8sUMlX%y4Es^9O1` zJ(<7IKWHp7n_12bWX3ZOj#e`ZnLFqPn#oLLx-&JXKl44)hHjye%wVPoEoLsEq0B~R zDl?g>L%*Rbs58@>naiwX9v*dNMl;iyYiKPqpIOSZps8G6E`x06^f^^r&IB+gBQv>;TnR}d3%P^bWNs)on;Xpa=MsoEH<2^s zjJYhrAq!Ua;j;}FA_5{9Z6SdXe1g@M6+D835Q0~rg+rUcW)dJFDg=ac;Y2vL zWrPD;SV#)TLPE$3R)G`*!7StuyI>PQn^SNLF@YB#+mY>1Fxy~(6<`~1Z<9rAKZTSK z7aRg6+>gu!y)7sl2z~(-a)QowB!B`XScE=DO7cs96p_9;98yT?a=4}M4p53o7Re_a zNFM1-I*~95k&Yx-I+aMtDRnwfDJu0ij-^A%EA=}*JAOE95+r?fq=hezfb_{R=;(F? zCA(ymaLFYNI1*B?gOI{fTuMrd#iinCailmNb{4-C zhl(@B@#3-TZE?DYx?Dn6@k8-*akJQ6{8)Tnd{aDh4HrSzk*lvbRy4ZSid#jq>uYhc zI9vQwTrWZ{tE;1kxE6|EiW9|m#UI7*#RHecHC5a$ZWQN>uZt$vi}Hi=PepddYd@jE&-zd+j{}j~ovizy+@w_kpRi2dpD?ciKDSs@#E89Jo z$L+aOzLs5{*X38`H|3Aj2i2$557j5t-|EBap0BCCuD-2ask^@S)fZKR?_Kp#)#STX zKa^iqpI2Mz=c>l1^|jUis-LQ_s()3zZ{OEZ{ilAZ-l&hOZ>o3dA2sT~R*k-(f5)fu zo%xUI#=53%s>5|#9j!MsgKR_^Y$MeO1cHG~Biir;e1Vfjym8jZHt5D_gJ`&$p+KUc4;q8I zV4&$}+MBK>*7P)eO;ZpEdYcD9bI{*31e?LjR=af_bT+SBe_PGg@77(*)@YPMgsU$mdM|7&-&nNXu$Z@1c4?dvuhx@$-g# zQA}e8wiKFraQNtGE3=tV5StCP*==cQr}(YhS^i!&`@UAOy7u-$7mh_@XR*^**gcZjFlsne7_ z_5AS3VJLN$!ctEUA02iaX)~{m3>kCgzoTbII~ij}pV4H1%s~ds9A>sNPmlI8yBSO7 z`O$vn#nF=^UFP-C%Og|f67k%df~rVSaOJGI3UZvQAz03qYanF=$|1Qra+GuDoH;aS z&pC1`@=K@+7lI;SwtGR@=CQeLs^GKvZIVzI0ydY;X{!i9nk&`Z@b7|B;OPA7^qbk*;%zaFGDL`@9}v8o{@62{=I7T^;A2n{ngQGcXh66@l8~F ztCQ7{>U8x-^~eYL`l>V4Z`G+P;2WwAR>!Jc)k7cb8>o&~5#Mn2zz6zH>!CVc57%RL zcm1TEtj|{cb;7SLy6Ta7uyCP&?yY<3G5=W|_s9K#I#K5vLL(eFZ=3`!8j*n9 z$Ti~iUk$Et8ju==#?MBvAvW@jvp}eM(mZQgf?zP*JZ%P>kFK9yKfJyRKEA#U-UQph zC)e-WZ`*I$53b*}pIyIh-?lUDb~_ikY2URyH+LcTjqB!jsPkmz_8#(dYq%}wObH^D zNO^P5ue~?2ZtB3Cux8#I`E$P96%w-fiUC*974rNE6?H&DHCYk|iRpu6Dw}$7NT<@N zT#8JkQZEnR9G<6MAF`=Tib}mY>^Njn?~b6%=OcgS(@`*E%X~NrWR5Z)k31Pi#+5-c z?#$aGEMw0g8E?j!fiuUM_eZ|WH4@8(bJ5&ME|d%8A~`&FmOITgkrqPaVz!2GBU}kh z;Z`7Qr?$B5QV8ZEwliB>xE8{;sI4WO*l^pmwB&en@$llewBmSh(Uxwc8ONOCuhfzj z9P^G_>7VpRT6Ek=@!YJ#Ukn#dT(M%r6)FabcroOP7EfJgu3$0jiWEL31c^Hf~UtIrB+j~GY zkvIJQfdoMT0YwD?DJCd3CJCK%}|5?z(;5_H1)k6D$Y`B!o25 z8x}-R(4YxqlxRj15{4m-kj$NZ-h0n;@Be+z``-7S^M~_2Gfd_eP7+A@&3r!}k9w_R zOr7OeW>HtX(Ejlv^vT=dF*FBg4q>gAumctIl?Ab?$DvUf0xh zl6hC#roE%>(LK>E2fKA+hNWNzxD0$G@EN>@OmMYvl`+fMZF*#SY^pL>TC1#&mGIQUL z-BX=Ww~Y5fXV7KvJls`0oldWNrd!Gz&(?=hM8u*W$uu5 z%b4a)*)v&>tjT=a+$E!%pUY~^*UdUvuk4ZJp^RnL%bv&@&5vYHWm@cI^1792#U`b# za>Wg6gH^1!WmPL`t##HW>rL}*E8Qwl(5zAg%PLbeT9t}wt3q+psvmkg^lHd7q#Np1 zJ|B9je4>0a^kS%g$T-wDWEg^mUJvys2ZziZl95dV8Y&OXFRvz}R3J(nptwQSEx9d(b z&oJ{?`K*`SFS;LVi#P{4`#6U<2RQpVYj|&UgMxLu%{+^4D{l*L8_%qRbQ^hVdFy#^ zblJR3ybU~?z$&l^h6HZ~X2Bc5ZZO-(5HUp!qOHbl#Kxm_W!-c>xnD)jdh$dF^mJ~T4atIR@HBfY9M z$TL-|TBzRQSf<(P$aOYo7@8HXWo`9!M>vN$xnLgHC=#0AN?OfAYeQXgS1I!>bD+C` zW$b>U?a_8?t-2k&L0t~drrXXd0QZ80;2!V*m=7KV_ksICmT0@NNi=L4GMObd6Kt|b zL}szML$MCofUHH*ykS8R2n$YvCqS3LEhq*N!Ew+jI0YUC zkAfqDL*Nmx1hflIgAM^(wA;AHxYM}TxWkxd+-EE_78vu5ImTS$E+Z_lN<5~e&~hjP za+yX=E1+f2m}w>CHf2IKiCuz75YvccNHSt_nCvF6$!8jt3`(4)HuFoF#5^E-EmN9h z=2tS6S#6e@@0jIgjoB!BAyb%T)-J_E#Un+hLTVLRTdfkS*t!DlS9*p}RTv~i{cJ>{ z){f{^y(1#^a?J|Oc1NaWn`4iYsVQ_eYVw_V&b`ik&XukLXPZmqQoA&++_uf`P412E zVz<=Y;6BmDtSe-V3LKKVW`lAY!f-d%S?kN0=a~CgQ1>3zo9?|VgI1?K&gs|oY4zF@ z98mj0yIj9ize2xKzfPZ}U!z~9AJeVYuhnPjSLwaFy}S&)Pq&A+kLMMf1_l>q?Z__Vg{p5vH=-ZuA9+4v7}??2>Bw=c)a-XQX%0BET&rA7b^Cc4LY~MX zGs^~4mFiU*R^5KqQsHjoW;?sCrH)hATz8|rqocFKRu9)>1@Mlc`bQmI9gjPBT`gUe zOiouVvzl4Kyw0p*(wQ_Sx9dFf2+Q0JcOPP%U>#;zyN9}uvEFtMb{DY@uq@q2S+?%u ztb?op?Q3l@=RBvBW7Jl2$~cvrQ=F5W5>6H8mG&&>9On$DoMX~fa87exYS-%z@HXlX z@ecDg=nwLa@QQe=gtg#CVKul(xI#z+*9ht0a^W)Jdf__ZTH$Kp24NMLDO@Sc5(-2j zkxV2MNkw82UnCK=inc(@rAwt-p-kyA>1JpXG$h*yS!IK=F7pbhP4>tssq>w+rhU+68q_I+SVOy`W3nCG5JztYeD0Bwezu8%$}}O{P`b z+BMwm>2`NxCt`Mwc8_(Ju$F&;J^H!4NPj7N;c#-qj}<4NOAC`-Bq-VWtJ+n~+*RnlEhHndW@TDk*z zVn$?7&04eC+NW3xuY=dac}Onua^%IxZbzL5IT`SFl)=703PU@NYxp_p^YrbpMSnpUtMZ49YxMzJ}y>D%^_A55R zo8S%b7WkF&wXy&)sW!v;$ZOTBk=G+KwQ*!%B+rqhS?#*(y5m~jme+RARpLI`Ca!bT zZx_ndlDY=w4NeKqq;%FRy5wEUdd{&*S?5`qJ>{%2*7BY@&X^VhVQ`l9HgJ5}j9#a< zp0m8ytsT|6v^P0Rdp%mO_PG9-{)m3BzC?dOe^OtnKcO$@o#pM*AJ&)giuC7r=Xpo< zr+BA%W%{%FGx~%2Q~FZg8Qy9Ae*GbRvA)&F2U(yBd;oI5JwiE{Bit!GAY_BPgt@|l z!rj9CLLt})?iC8aeBpg?pYSdy2HU_wVH0={RD_@&C)t!F|<>97#cA^Pt&cere8-L*`+#*SuW5!U8E)$bGWcW}CU+44Un-W%5y($?P=4=B4sJ^MJx_ z9y5>0%;rqFTjrA4%^tHuW;BnQUzy*UA6vE7R|=D&&-y}Pu?|>!tmw^@ z?XhAL?FzHvi50Rwx0sy7+YEfWNR>f26E33geV18}ww!TrAtuGZ1 zt%dMT_>D3f-Usi7_0|LMHW*SCz;Bhq$|2<*7*^)MJK#KcFWg}@E04g3;G=LpybCUZ zk080QRXM2awAz&W;e)V6c^KXbZ--AK`w+9L1lfaFRL77a1Xi6w_96$6H>xwpaikcr zsYX=8s>8^BWKd;Q6(Vm{kZMSE5NkI^r5psNs>fBSRy590wg6HARlq zn*EL=jt!bMnzfoj$05gh%>l}7DOc<1%y`dVHkuR>qVqw{FI z3SN=03w#K6f*s&v(G!tY^i>Ji<7ZbG}Ib@s%2!%8Sh6hZ zEH*1_9kwD0t94j0WVI=V6tH5I#jZR7AA^s>h|-}PQDQPV#GzVYUu9ouSF1N^jysMy zjygu`>+kKj|K{fQ`#bOF+;41G)G6y&?XtS2c4oW0PFmO7q3iJ0KksjrCOPc^HORmG}hF*&Pyxty%twY_Z4 zn%)Lp6Q`Ne$l-8WI4sVp-dnsXeXX9ZXYlHHw|SNNYCTPVop+O0&%43v1|NZs!6U+> z!XEIjuvhe4^h_i&ij56WJ+w-mCEsXSEq7S41Dn#^5d+#}StEBSis3V`TUi2+DqYI6ut#|sE=Qb7 zm#V|HtUzdTjZGyd!!x}o4Hl~ zQq#;_-+No%ps&~WfzQFS!cw6Q)Pr)P#@H{C85PF6MwRi7QH{MBXfql_9Ec6=lkSx^ zL;I!ME!!;F@@&hP)n{F5%doi>UMmguDyv{R>{C|2)o>+T4ri#&!!)E8p(AVTYwg7j zzJ{mS=-TAUYJ225+{R(H@a`M$8M#mkG^$u`TV}ff*TOg9>+qQBI&uTKiIg}_IUl=P zm^qeA8iJ?PMKE#7W&;jXgxd4(tt&k8pDBUUFW!Wa*ZP{trA>S_FCC`zsu&uGJ zw5_&z6g`7kwpF%F)iTuz)pAuGd>gKZSE}lf40Ro{RDBD%jrdfX?HlYH?VIeU9NRV9 zG-sTrodV5(W_4R(+YWc5yUERGGW9RO2gVNLfXFD4LPgRsMFYG_#YC2=8Av12fSh$~ zv2V4vsn0l0JI*>;ZUIxsyv54u+1M-KiFiU@qh7*m<%xOK!k6FxD2J+qG$CEsX?$pW zC3-FDGRh!GbXaN<<;oS%QRxw>64F2_NDUp6?vWSB^W}M#LV2!btu5b@CoiyUu&uML zw{5YlRc*Fq+qT*^**4m|ibj|TuTf>GR;w5=8(FSqAx%i8dWSv7zRjL(zpK8Z-f1s& z3N>Yp98IZXyS>b5)a+^7>1MlInVWjI*+k68#z)3NOO9>3ZJnwa;UM?a&F(suj3?z8 z!Pnq*;VZCKctdCcdyG$wPmI0BHzKXE+xX1*0P2JuL3f~b=q_|ZS|U9yy$9WgPDwkU zF6be2Mp`UwgN{p2O83bRTJ~G^Sq@u@EQc(6EqmpAEC($6<-2V8w%xWoTdr-Vt-!X| zR%qK}%TW3hJ8b)G9GC|SU_Q)-xiAZEhS#f_;1*bpaFG@2mFgBmh{zB=B1J?lpnhM7b z&3Q+aljf{;RyakPbIwXo9kA& zmG1Lx9q!w#Hy{MQ6`4iPjgO&Ymb20W@*|exmV@&Bwxbpyyg{Wv4%+wI57_CBT+Mao zTa8!)Y2IjhTzlKnqT(IBhTYUGgpu)WA$>$vH-?!a^bPKhSlwavBNwYF_v8_(Uq zIww6Wm%=xlYWJF+iZ%x8ltl)&A%7zmn5;fyzj07x6+MH_OUtFb&|#Y#R>BH+t7?mC zvnpRx=g8CCcGfx9wLNi3IB&rhMuQPFzJ&Uq=g{nrLbp^}j>s!4=PlKiBevtVW41H4leW{g5?itDgzczpxpJ8@Q@K=m z)^-f)u-$y><`sv?Pu%_j(P{% z!E~@3g_=f3ljF97;V96^G%e01C&$TiHai=g3Ju%Ib;>miXR)2-WIF4e4Nj?Mmn+v* z;M(mfbnSHIxXhY7*PzCt+2P7}J$J2d(_w|nr>>)!3g1g-8e_j&i}wli(_ z-4ESTPLqBRyd^Y)7VxEUzzBo&}+y9y@hB}8)Sv5q;H@>s9MUf zoRr_P9F$O-rNYhNZ!BOkQg_E@53j49tDqu5hRwdo(J? zT}PW^uSVkFIGP>%H8O|XA$GJlgbs$C>)59eIa(b&htk1!h@2Y79f#B*aEP5!r@*Py zXq+miN~3ftoUKm2Q{rrM3Y{|NVb=-Qe%B$FRddvJ$|ZLmaGi9Wb{%o;a~*dbbCtM? zu|q0FuDz~IRQ-3rbtBVEd|G+UUqZ1p4c9cQ~+$r%>aN=J}0E;+B! zw!clmyDrUAo^>gCFmy`ZV&Pg!kEq1=0XMe12cXT)&I1Xy= zI!j$;t|85Sca{5W8%xi#uxxh32C{80;TP~Z*Os;e?rQgK;V^_id`rDBPc;B{Iu2>N z91k7kt~ag*VT+ApYql9-2sXj5;a70J%7F;&-D-jTk)z#t->KHzb7B%<*LfEr5?IzN zornvos#m$*x(>R9?jHAuXoK<%>_#3ts$DmwT-#fC6!9Qqh}7O{FVaZtVtbETWPhrD zqV92YI}U4(XxcO#PK~D4b=^gG(OlVWW|ze^=-S$L$bH0p*j?oAcAu6XP|5619CtJi zolo3n(<(Er+&~wwqQ!E2QnC?WY~07155;j?qriifN~5XJ}=#bF>Ot zC9REihjt%3o#rm>9xa!)p0<&;nYM+tm6lDbqE*vqG&-%8cAfTs)!%rLAngV1 zC2bvjJ$(axHH}GIPS2t@((-8ev?f|7Z7HpbmPuPmZ=$p4Y-9y_(+e_O(!~HkD7&rp%6I>uRA`o{07lbW?u;qAc`QOWhiJ>^0|3qxu z|9yOD9L|GJ#`(~N*z!Yc?7!lVOUDhxXW?AvHXMo`z;YJnk1NIYDaA!mD{=dAH8^6{ zC)m&bz0CIi3>)+BgW@k^+y5<{_+PR0|0L=^a48$;I3WB6w%-lx9=wTD;p(yVexPuE1zlWtA+rJ&>m(hXqH$KLN;htjm-76e` zGvV;KH@FaB5GTJojO{awTY__7O9!sd-;FK*mA@Zp9BvGkijMbNR2c5(!$nX&8t ze~5h04_7?o=Z}N2@vvWb2I7~DbNGFQ`um?&1^Z_dh53iYO!H^FN$_8Xr1<0f=lBQ7 z=lkcDzvKVm{dE7*^40!X{>I<(?XbVhiu&u&P&~eC5`J_=4F1I^3GXvd z@iy5~d_(vuycykwuOBPGr`wL9*7Z8-XC7|o`oPcWdKtO8r@qp*(`G7#r#Q?bGa)7zw zN`OssDXvTR3UE?l1eLAknHZbl`&fvJuS0Ur7P`^NfDkKmciVD2FC@~PM zniDuyObtAlo*wwSB`c7#Zd2e#pKS~LE4?r<`sPjxCA`g?v%q!(MgZ!prvqWv8A5qUi&H&Kfu{;=C(RU_<9%au#|Qs|GXAaZgYhYQmyd_Gt{rb!lr!GuJuu$>&dKo~Ny^4Y>8r;}#=abH zeEh?B6s3>XrZ`P^WX|88(oerE8jWov>Ne{2o@%#j?jGos}x7P`xdL_f39?m{}B}-&Yc1jwlb=X}B2DHS^1m7U@qR zI^DGqLR3JriXoj!(=pmQL(E`SHZ~f^R0)fWJ&M_-;(pY1tEfe!_`3R57u_ z^KfDh`h21x{`Ewh%RCW9Jrlq41cp`MLc?&f$gtd+_%IYr4MPGKhg~yggqc2A8zyt^ z4AXiJhRM*gVfe!GFfaOf*r4p^Fp-TOR^wkEmf>p-^Y+QYQ18Pq_sia};G+Jpc+cCg z0gofh+k_9lel;X~&>0cD@#`%^p)J@M@hE*?1X6oEBCxYGf`9Vkh(}ky zj>xR}IbvtU)rh|C`iS?NxDi-QBcijaJ>or78v%M=M3^0e5q>Sh5h&_EY4m*PBpHAD zB%C~Uk~eJDq#E>{N%83NNn^fElhB`YC*g3pll0t!llIw4CViM*IjP3;<)j$gx07(t z50f08tCMVhHB2%Hc$2Q8>PhLi`;)pVx+kIb7n5`b>m)RNY|@Z7aIy?HadN`Nh{+OB z+~h@ul*#?*qRGe6%*jaDhRN#+w@&ut7fkk`CnkGFD<~^9g%(OwUK?ly@>qAV~MO0xg#r@0;YKSCQaFSZ~BytW27nEQDDkI)B95j zj<1}8qT8obrSF}BJ9lu34m~pk<$W{-t^RIGljq8mRDb%EKhUNrcWk05H_$uSzS=2) zxaU)FcMMZdr*#U9dZu`5#!r>`MNGx%r%n}nlcw5bsZ&ujeQFK5VJiCJ?x`ub{HZwU z{;8<@6t?Z7sh$(xOs)3*J{4`hHT5ri<5b)LXKJ5EJ{5iNV5-6K3>*7qYE8uORGiB> z)!`vbvza2MEz!nIv-wh{*$j)O1+tTIX0JFo&6`m+4Mi_aE8zb) z&4ALU0q*)~29IFcFM8!P#Me1(Sf-n1_|7y%tjPm6@cd z>Px9nlSUUsiB@DpfrG1~{wm9kns#Al)HB(EsBP6JqrT`r7j;tcQPe8JXHos%-6U;iY!CjYx=?JvJa?+&Yt z?nRrTKlzg%{jfqAZArQpjq0C9e^3fWU$U8_O$Jx=pf_MTx^dF!~-%jWE|33Z7>)Pq5!_4XC zF#dGz6UB6MQ^$1E;IrweU%!|>gbq%x+3K1;1mR--6i$dixzl0}qBCQ@GcAbu=-I-U zaOskm$}1~k6a(vH9$ncML!FfuBM#Xga~v&+;g40t@NHkl7_R*ogQB%D!7^q{g|9UR zt!;}*U)UA%V6rx*l&!J2X}id#3->SR49NEN=L>SefTmEZxVBZTdhQi;C~X z{^WQZD=g@XWg<}Qcj-th#-)jkzlM*qp_Afde$(S-mnFpo6wiuVh*IP5&); z@kwj$j7L=mXLS8}V#cM4b2CnNeli2O`rQn>>bDu8hT0iEP2&ts2zQ46C&C%!kaC8+ z@!pKnce-bUo$Q-Y<$XINef;nY7)58~_yxp!_J+lyeo^r)-kI^p`wQYHv(n<5m%kt1 zoxdU;KsUytVY}n6nh(X>d}rhF!) zI~48l3qE=j|DmrhJ|S-)-Z^ZG|MZD7UVGRt0YxLQBqjvv<|Ld%7bl?VJr+uoCL!}NkS0XmVl1+B&1tG?0SY0 z(8-v^J6XG+{M&6?Z7NzVJXk_?xclR9M5q-*Hiq>kN>lVmv~EHA#IT?mVo>X+L{#<@(R=qnyNFH=431765t;Cz5q&WpZx%XUX8kZ4% zs3dEazJKeilj#MsJgrA()fmcW**uqK#Z-Mi%d+72S>HBYpXD58%?hh%on`H8oAr;l zhqKzsdS?YzznEo5ZL>ap=9p!uATbcicIl@&PZ8-rlfcq7N+<-%Tu&(Hl(0^xhc-U z!zpOZxfE~Trzz&@?^8^jf2N@PhLkrFUds12dCJ+m`ze*$Cn-4Gf1L}X`V=erHU(}$ zQc7iLiY+yGP8o0N99h}SIkKz3950$aNA~lYIgO5ObI`MU=e%EYVvhY*`5gCzkLKWT z|7W^9U(M;8`|}*C+d|i09`9NI#zYm;0N!1G-=5 z4jZn|wVhs+@<}G|j7D&!30YSLdb6I_IVP^z%^j+j&~lHP3(s&adf=obN$r&L8}A-u!g! z;`!phjQMEe`uSnL9rK&K2jHhpZ=#%*vEMdNf^=AGGbY%Wu6>h<3ddLDaK6=4eRN?{@B`;_iShAq|&dLR!7&a}) z@#HS3vK?N4+RiOFH@Rkk-1qqcXTi@4L}`C57|5?%5bA7R;IPRS__Ple$Z*{Y{SJP5&6~3PuXIq(y!dp|ra5<^C|HoWd zlAF5Tb0{_bSxM@96&0xizDucZ(tk*;(f^g2j=PRs@BhrEo2l`3c50xsH8pNbof_kQ zm^wqOO+`xvQr#zQsnXq}ssG5q12KPu0BB7NFovc83oelXQ_}~4-Mkvuh-3p^!(M=7 zItu86PXn2G=Ydr@p8$Q{%Ru_z72tB&b)cq-4cz^b4~&kg05{SJ%t`15*4p|3)NTPf z%bh@XgCF@ua1i;tGm`wBCxI;ab`CinmrBO{uOJJ_8@w6hoatF)+~;e^jK;0x?9$z2 z=Cu7}w4;RFj8>6TM=p`;cV8x>y1&T&xU1OMe~bL|P4Zheo1DHtME-VELqzAvEM zcNI|{R-dMvud1e)?tDR!wEskD)c-}P_BK#TzvEK6zn4&u%Da?Teh(?B>z-1|247MN zYaxm*5T>~DJrrl$IO<1<6R6#6YpAV(Tc|kP ze;hD*2h}G%Ky~AfQ@Q4I)Z+smQ`_HsO-;S>Gqqnvr+#v^fhud@Q=RcD>Jzk!YT)-# zeFihN(d(qz&~a(ip2=xmTVfhoKR-=&;@vbH?%yYYm!8&9vo`H7>Gm|v-uyIp$HBBv z_(WQTw;~OG^J$t_`a_zk?f10f1vk<@K%3Lh!_u@)^g-H)r#H=`H>No^4yEA|;Iu^% zuCysQPZ|#JV!!8K@t`3K<9$&J?LN}Nnu)0kvB&zq%z1RlLKIzxC3hkE%i)DS^xQ%; z{j-JP|D4Cg0e*l#z{imik`wB1cz}tUl0ZsYf-XslN{CK~O^8c~1f~E%z<6K+5DbI> zp}<5S3QWIq@bkWq|cHrC4HRqNz$C8l%!cnvy)z;j}v=O}HkyLYLFc0L z(D~>BG!+F;`AhOw~qQt}h+ogZ+_dWgx{Ezsb@IT}Kf&T^nEB-h9@AyCPSMY!0|H5CzU&GVz zwfO7!8~B^}TlhNsZT!Ek``^~s_+~r@--74jd3ZivfEVIh@glq!FTqRkGQ1qGz^m|T zyawNfzk|PvzxRKP$C3O=A*66p6e*GvOPWU_lF~>^NPZ+dDU39k6hoRunn|LP=91ng zttBOpQc1H(i%99DI1)f2krtDdktUHMNYhEtq^YDSq=}?Z(hO2ODUp;!N+!)BrI6;3 z=93nX$RrABA?Y2`yQKF>ACNvIWssJVmXk6`D@ZFzt4LX-)uc6~|L<-3zxnxR>OZKz zP$wt;N>x*9sn@ADs5hyJ`Dx+Seeoy^@`Xlux zYI35Ss-S*J{fhcE^(j?DWl|fdO;jEAHnpDGKxI(-s9n@zP z%O(4HQ3{rHzomY?xGjFIxPIJ0zctvFLdqV>Udleoe#!yLLCPUY5#=!D2<0f{809$S z1mz^9m{LMHMLA75Lpe(+rIb<5QOYUjDHW71;v?c?VmGme_=NbBs3rCipAnxEbwoX} zkJwK%5JBP#;!ENH(MWtnd`&bFA>tciA#o3JFL57nKk)$ZAn_2fhyhfxE>BL&%b>a=;P2w$L9q~4?p4dQS5SheAViS=?WD}c-9AXQROFTn7 zODrXp5zi6JiRXzG#7bfnv6@&zyg>Yj_%Tt4YsPVKXA)`>K1%pF;gf`m2}^-xz;YlH zSOKgARsmVSYG4hp7FY+Y2Q~m3fla_>U<^1?&cLfjl4|C;$q9 zJ-}XIAFv-d02~Ak0Y$)J;0SOOI0hUCP5>u?VxR;#1)K)X0B3gfk)-lNgg3k&G#fsf=li zXvTC#3?r5i$4Foh8S@zP8L13_L1rvwyvta^$iQ4p>lxXYe;M`SB$S2ml;1Xt}y;&TxDEi&@fZMZALwV!Dzym-2#S?A!3Lb z5{80-v3(g2Fb1fW0Ww}Nj2O=lV!UNo7&gWbMzTXNqL_m*#_%$5OagNpGlUt+3}Z$x zqnNSG1ZE0z9&Yy8{Ky{R#~aeHHKW8Ocl z#CtFwaZ%%8%!OOrc&@P=^LbV_RyAI1{Iv1wMloi#lVWZ>HD_YZAb~(F}eS!Tk`*Zde?6270uzz6x$o`4_EBgxO z>3o2h)_O3jSs&ZLhA?N6g*}8BlRRuMo6sE49Ml}#9MT-wJf(SBb98e;b6WEf%s!FZ zT-aRHe7N~c^V#Og=8MgrHhr<|`jmpMOiu5oCbIu3)Q=4d!~IqjSWoQIq)P7mh^N6UG}(Q*1XAjimo zIAfgfmZ+B4mV}nsEh#N?ThdxKwQO$5ZrOoZWcOgE(gT=}^g_$$Eq}ILZ>eixv~V$Z znh^7lsax*0bYWg6eGBHMX&GoSw!Fsd7=tY~%#z`1iR4bR%}wFX z;R0MTH;ucPo55YmUCzzquHdfauH&xfZsKPDla*b-EyQ@**DxODb&MWa&u!qcxNI(m z+rs5?MHrD!!j)r`tOwi^JE*_5W#}DAo=BM!I@l*K#e=+}E{`>q)einZnKN~Zw7Gl=KB7QNy zgnt^dzg6<9_!syW`Cs$D;eW@!%>SPM1OFfVU--ZBf8$@_U*p&DZ)4Ue2A_#pcDQ^2 z{|^5iM(`fw5AjF%V|*_k<>Lf?f&&|uVsF05yRGXHcm)JulrTZKMEHR)Lzszm7&i(x3wL1cuUuiFut<0qYib-9 zo)MnK&fc#SUKD;Ryd?ZW_@(e0;kQDDkSSydTZCevL?{y~gm;Dagb#!dg`L7K;UnQ= zVXyF+P$%pY_W#p4Zxp@~{%uDe!CcW!p-bo%jtX(Deyu^RQ(70dzT3K_HKTP|YgX%O z%pJMDbwlgc)@;lLxuZ3=b${!D)<2yR`wc zeXuZtfuL2`D#AGE>ejohy{*q$$69eBf+$oJCW;V6iDE?wq7>0wQJQF>=pE5w(fgt$ zq7OtLiZVqjM5{!rF(TSV(I!#0XoqMI#wI!@`dsw2=(6a#s7}Pdda``1wWt=|#oBA# zB24`x8WW)+oY-F+Bpxpg7KeyK#bM$Iain;Pc&d1sI7%ENjupp=XNcp)L@`M`OPnH} zF9yV9ahiCsI77Ttyj+|qULjsBUMF5J-XzWwUle~T{#^W(_-paE;-ADni+>USCjMP~ zP5ieb_m;R$%o4N39C3@7isM}lH_yA7m_a}mnGjzew6$y`Azb> zej$mqtosrE$`DX{L0AG)uZpxTRte1$p3{A5A0@v1yPZ#n5CGfn6F4x01C3=9mQhByNV@>3`Le=wPLMe9Y%P~ z#z?0-6uFB1iUSx4vj`(&7Awvu&M7`se69FK@vY*r;wQyF6ju~~Dy}MM80D!>aa+Mq zuoM!7TJbkAphuxq^eRAwQ33t4^@S+L6kY{RNl=C;LzQ952xXKqS{bX1S0*TDD^rwn zmGhOUO0troOjBklHz_wOvz0rPg~|iUW6I;oV&xfSrLsy{qx?wux$+C;W#zBRKa_te z|7LvGVMJi2@^A7cUn#`e?|n*8Ie_(z%}NW_{Ie-xtYzj>x|JT~m=dQ7QjJ%Is6thf zRgtPGswh>gil`!~W~)-LR!$LSPClk8R-ICvQhzng9DSQ)-d=7)Go! z^&5$If8eFFb z&J274wLLx^_-x?9zyOqUjtmSA3_(`tk%6&+iGfLovwL~q#=uReZFC!I68tjo>%jei z2N3iA?}2|HddAa%e+TA;=Z6=D7ljvxmxPyxSBBSzH-tBaUkM|^QDJl#AC3-h3&)0c zgyX{r;iPa%I4ztV&I#v-i^Bh9)2U%vm>%Xq-Cn!V4k`BTFL7Bda58BI_a>B3mM`2qJ=x#75#GJ0b~@q)2)sBa$7- zkCa3Rk+KLeLXJ=()Ces?k1!(42rI&ih$5Boyh1^hWw42O_UU-iREG9E!XdITkq{c{lQYOi|oIki=aLM4Z!Igun245OnGq`r}mBCjBw+tc%@q^KWF@te~ z$%E;G*@H!c#e;;wvO(IQY0x}q8*~kN1}g`v25ScE2I~hK2Ac<423rSr4elM>Kls|< z;lZ&i-wjDtr&V?Xw}gA zA^cGM5NU`!L>poaiH5{O(jncDX~;I@8)_VC8fqB|4)qT84ecJ z@X*B2xYkBCNOBZ?8#h-t(=(mT>OvS;ML$l;MABS%M$jU0!J;vbBhhWz3e zAiHm5WN2h!WM<^n$la0qBlAa>j4mBrKDu&r{pg0#jiaxQB1X}p_|X)|b0dPhH@Z>% zs1dSvxJDaCca3(B_KxluJve%3^sUh&qwhlO%MpkPacA`I=>5@$qu}V{(I=w|#+HmN zA6q@PVQkA7Yz#4m9*Z4|8{09KFvc2VkMYKYW1=zfm}*QtrXACd*~aW+t})+O?O5Gd z!&uW;aI9l&*I4h^fw9-d-WWSLc4+L_*zvLRkcIp@H*x{u6QuKO6(c=8exE zUogI8eC7D6@t4NejK4CzWgIb%ACDf78IK*08&8G|vUJEj%Nv)C%g2@D>T%P!8FKQu z#w*9`##Zhnxt1Km`7O#^+5em{>Kjej<7zej;Hac_JO+ zbr(z&LbPtu1Z{#fA%bX~dWhF)gXo?9i7JTXd1&JB#4(7B@xjDL5bNRG#QBK}6N3{& z6B84Y6Vnqj6SEUnC$3H0n7B1@cjA|cdlUC3ew%nWv0^fIGHx<{GI=s}GJ7&-GH)_} zvS5-hSvEH=Ot(?M7MNh>}#ZRSAWlUv3e#j!o?kAh7oT{3toobv4PIXLmPwkmHFm(_z z?VN;MJ7=cOLKc{FQ(sICP7O_6gxngJr>;WAhuc&4A!h%BsfSbZrsq#TJH2pv`SgnE z=ciXruby5z{mS&K)0?NaOv9$5rqR=wY5a8TbnO#eGQe`d+dt25a%`7^v3(Tr?HKVzJ6&A4ZLGZizHGu1PVGfgwiGp#ebW{%8^ z%uLM8%v_zhK67X0?#%s}hcl07p3E$mT{63TcJ=I<*>$t&vl+A5v-z`x*|J&UEP0kS z%bw-Uie}}rD#$Reoz>6UAP>E3);C)_TQ}P<+c?`a8=O4^Ie&*{M+PrP-#OlOruyFrl6O&db?@IwJ;vK^ z|GF}}v$vZ|S;D%?evP+||B)b7SR!&RM4tm)g5&?O&gp4=`0Hs z?zss34LnEsjZ9=Ei8IA2afrH_P5YYQ&8}yAlY2S+cXoe4q|#GaWVV#MlXqJ5q9j-KuIi5J zZ3DsXa*Vk$Jdb_aa$ot9z-xi5mbTD^y|<`8QcGxN+9Sp!TgFY}9Tog7Ns<@HE%F19 zkmUD2+}_9V54_TFd6n5+1U6em@qs;36DZC~T9-74Jz@NoZbqK<4P@2AkXxA`QI zUi6#fEoqwkiq+$JqyF`l_MYv)P3{uO9_3ZrqB?b_KpEx4opx9*qV zLht~&mwT5h6+cpCY6+$o+hyBpUQ)$C&AFzdEmynIecLE}(Ot11`uLlYMJ`e$ZBRa`X zDcRKTsJE$YwABnd^L1u~+rXa?{3E_BAZHwSDgV z(dqD1_?K4xQ?;;qS@rd5N#l;@e_GD9tqPtD$~r&noa!s+|8dWyy?gdQ$IRvp*Bt0M z+VlRtjkI3R!HO%5qir{X^H@c^Ug>_%3GPcmx95bXt@>CSl9Wt&NO4k^F#nKPq|3Bl z>XV#@s7$M>&e1m8ovQp&V>0RkBWs(-F|uPLQ@vc0%(DL4%Du%~3J6m6P#Tb27$_mS%I#)?K^(=rg*^&D}S z8YMDIEV`Hd3V$ykAzyXAQ#qgbJkdd}BwwYg7-`H$%zv1x*@f&b_62T`_dNeMez{;o zSSh(A|4zP1xmhVtUQ}IB2{ozOtvbK1S{KpxT9G!at=jg6&1J8!SGn%Fa@>XPBDcrg z?VacU*xy*Os4}{;rE-0M*j&`&Y=w0py1wlt_dVbLLchGfbKkJvL0n4vRYFrub{wUr zlAi;YgRgMD7q0-vCI3pE2VVeJf~&w6!I!`{f~&zb;977UxE_2O*Z{r^ZUkQeLyA{H zhItdX8T>A^1tdy6QYIA!wkt(ys{sxs*|&lSFbZ7ZM}jEO(m2dm&q0G25DVf!JeUVW zgGzD{`@V8zvv|WZQOt@n8a& z2quBa;ACG4m0kz!31)%WU=ElI=7C=t^T7h}^Q!mSe-r)36IN9H$L-AGl|bxH z0{9=@kO(o_$l#BhsDM|w(oX@Y5C?`1GC(Hyq>=@)!F1kjT^99Y!^`Z%niSweU?=ee zeLZyaVF*8xe=o1pe4s5e{NlXl+2s4if3d!^aeD{1>l4{$MvwKhofc%!%a|XFXJiq@ zO+DA3H=Z%xx933vnVh;B=y1eo-rUutgKl%)7uxv2mGoy=ES5yDSh7!cL*=l~`A#+5 z+4mjL$TTof>=nF|yhK5rFkW&~cFOvws=4uWOCa?1zB=wl!c(FbN%JVNl(ozR7L)Zn zPsIC+*UW!Y&?!7CS|x3gu9M}dK-CwT%X*k$#&FB{)O^+9cAj*nc^1?jY5Jw*kJh5L zXM?MQ)Zmj~S(hVpwP#AZ$i%X|Zc$mK&d=Sqyt~UQn~$&}B8B{k{4+(1Zj*V)%xQV4 zR}WNqt^vo$qvTo2a@t#Bvy!B`uG*yc8PD2JId6L&R7z{>I(g(CIZxT8yljtntTh~P zXUn=^bgz+juByK}Cuj_==%-`B$2!My&g4-PXqA-I9Jyf6ug3Fnry=k^4}^CVm4TaCr$CfftQvGUhiWc$`&N!O?3b(A+K%k_h%FB*pg z)$$YCFN~Q!yY&{3NCX)|5E_8;UlF}$jrR6ej8*Kc+!T!O{3}${v%XinznS=!@r3*R zj*mj$P()y(?1F4sBQUNvt+f2$m|wZ5o>zabbz%GV9^>vud+qyLTovvE{-K%$T^0Mf z_RR&Zvla+ZN|b5bCi0b6!pLZo#4_yqqUEcW2Q7bx>VdCFzjEgUeeyALuH(3~r1GCy zUl6ssb^m2n4oAX!N%NKd1!I~c#-CKasV=$cR#$1Li83YsL;1csN59ALf@!HuWMe~% zW~~d~Ea=sfw@F-~5D`b(!2d~q+K+8-7UqlBsl;G?Xo}KYd6hgu7N}qGeCGeH#vb~L zh@tdSU!Xltm-F5d0m{QFoxaNQ(6Y!@W0Qd2+I2p6#p#Nsn(@Y)jUycs9p8qAcE3t1 zH%^#)ZI9~SZhIrd+_QgQkMg2^hwV<)+8(^?qGyY@)2EhcY`@#jy6(7+_0e{JvhN!% zU9iQtr|M`;V{kE0M#XTZ_<&F%&XB4V|0w=7;EYn!J}18RrMk4nm)Z;Z()PSUKO?~@ zkLs4zXqr4duK~5}%fc(djmr1@w2IDZT+OF7o7($=7a@RJCuf3-QuHh9RO4Ei*JeM0U_x{cP~9oHSpYu_e!HI- zMk@PijnpnyAN#ssTpF*iDpL(ODMt5DI{LDWgz9?QMiAavhZphhch4!KrX8zmC zx9=?9RQ*hirtXcv=Pjrn@!rF%%llT5o~NYIi1Y@zL$}QToL^8GsITn47y6gdty5d9 zw0=$|uar*^o)BV{AF8D4bVI&jsnhCft7xcuzWMKVanFN&AMrjEtq>m-6XlQP|HxPA z?&Q%59t**tlN{7dz(I+pPlE6omf+;aTmm~cII;oUp^`05)CGwm<--s}C6 zG9x)8Lm0?LpW|Zd$qq^9ul;$uw~|^(CCtNYG_O$L6lO^>ep&p>al@!&2I*`hl2Z8kp3V_L6F%iyejFG8kKp54dyQ$Bb8rOK4|>2 zaYNIM7EF6thb9z5G!Zun#+7iD-%;+!-z^p_)2PieW{q72=9K5v{aAOkcO{YNHB}ty zzDZsr_&}AZ19V^O-mzTpK3g-ZOSL^FHB!#AF3Wl}Z`l}*w_NM$zwJ)xk%I#2d|{yZ zaQi#$fnXHnkh6HtlKmTiXGnH3m**60Qlu&_CMcM z^%vKmkZV`zJqEw=mKA6JvF2*yOHI7y)$K13XGtrmJZcyBh;W6n-R-W5saajOxT(G= zr9G|vP~VGt@Ja{pkXX!~&%4LF&r?dLR8LH=n{hT=`Q6%Q8sNdH&Oi3704@Xfh;<|e z#YjQYg0ve<99zNRaP8a??jC^xbV!`?x8w%>Aw!}C>CN&bR*-Mez`bcZ2SSp!X!}VRyrbpme>1Kz@h!)#Z?#Ofr1f@)lXR@g`Tb=;Gq4+& z1yYIW#0uhdDE{|5^&xc;{X0m3^D|4rUd8#D`-r=M_Xi&*=o7vwQc3s7-;w{Ne5^dK z@@o5ZmvmbVOHBpVXIz=?Y`4gL-utDN zJNQrU^}fCPN+@b@wNeB2lCTsrPb#PDhOJxed+j~mJ+-cm*d8a)Df?I}FdwN~3TVM% z<*%xBhW*v+>$Hu3ORJ18cD~cQ4ETsNPTEY~Nq?KZj*-pXz`Maq76b$b1YZdL5Rp}4 z4a<;W$+n!cJaow2C%rQje>6U5vIfL0-?Y5aBVc`Md(sl2>p-yw?zdE1ESv37c0IVk zTgQ6LI?Hbtd?*MC>7q_ag|tlGp}3-Ws93A|T~%oj*bH8Sf6i~IxLx^T^*ePHOaH_x}_+Zt@2+jNe%-Cz0X<%cUgRi~;_s$Z_Z+h7lT*Xjy(bVlte>pQVqMJ4lS z>I*uI9%ooyy}K^0DLU|W;HQvsznF4H@t!tR{M4Fm#Ohm$FIao)F7}d-ttS>l?+@rj6yePqZ@d`<)q*3~c zEK%-~r)UD&c-;nlobdXtH~9_1w}rW)yYd%RMm1H_q)pKOq5sbM)N#yN=3VXITJ=hGcFluYX`Li+ zA<)pVscTX1`+dtL)W-Ym^3KJ46kp93+V)nd8fJ}8B~ulNO_ruj01Nnmbd6F-t&l8M zsLK~N3PP>K4b()&MfO2XG7sRD@tzT^66T3MmB%P@6`v^|C||LD>r8bIRP3r9tqnCP z0_woc0KLW2@_;$ReL-jx{UTYR4rzIYTJw~b-oR>p+IGG7X>T&Iig=UgrETGy=BA6^ zm8%s0n0MF(?j3%h>bt7mnz!r5>Yi;_7C73ryWI>9w8yaza=+&`iGJih$NN%PrL%y) z>7O&bY=5WvufRDVhiV0{gkI3?11=CLWC1;jbBDJ|!nS-`{dUdMdUoThfvnI#=%v1; zd-;2pu}<+m<>w1-iq?p4N}th08J_8&bpgFA_c-@AaZmG>N{NahRl4(hsI`aIyMOm< z^7+jd+s<|;(2wxu_#X&*6a>eEnn?FF>#StVg5G-{*v5WAl%}ZB{@_OL?V_HeeaT$Q z-zc6_yrXY*l~?zM@_TBjK1oRWo_<+*X;oS8V-2C=oxLyb69Q?Z56Q2vLD65*Saqr; zvC;;Pb;JqnpaWdszg=yt{iODGU2B^YG!k79h3gh8kINQ)C0#Gq%X<|butdF8^PGOZ zNoSt2uW+1ln>=1HP~ijfoBUu`^SKUxs2p6@w}APY@T`2kah~H%_rAdKKF)64{srU@ z#T}AXO}HwL6w6Wwmzw7V9tC{dwe^pP>E!nr`RpT7Q2#bxudXLI0&HRhSP52v)$D4p z1{7-fx?1o9+gf)WxVXBYI;AG7o!?#$uJ3CA8^I>|J1KGc7oSUiDtIB3;fbN zYu*JCT}D?oX!m~S4}me|Jz!bm^|oHH59|lIox8!m_Ur-og8RTaQJsE2c+z|Td<{I= zeVqC__y%|ooK_wJ+x`n!+8otW)o+5Ibl>jx@4KLQ3p{Twu00GM0ZUnLLp1W!e6#Qv zxJA*XaH~(KlXZXS5)C=VuZ$Z_F(#7vy4hqs4svZLz!}@11MqZ}zXQGt{#GptjJ2Nx zi@M$eH}sqW-v@I6Ea?Mq3FRjB4~1SgY+Pooa7sKUs;|{OQ~x12(^0?A-;dAPy1VBNb6IX*+0N(Iu>pSxWXs&MoeK(HU@9%#i;pmnq&-adfAQ<4{15 zV)c8MG#m_U-?MmsDX&JCZ*8)sb{;jzZJQlx&zkaO_1WYB7NmZ$t+AUN=PSB{qaj)! z((t|Qi05t3?W!yFu7-_)VonQpH}^HwJhfDR#QKsAZ|iaW=>NH5eHFcGUk#yUTWD49 zeMP14k-SN%(KTD6NzZaL+FzY(**g9xKgvq9e++&C-iF2mF|25Ii2W7&Huo&#C3>BI zNwQYfC3`CS47{rN94ykD1OGM4Z0Es7&pV#NazXjLN>kMr;Jt>brY+6v;Fn-!kkVH! z-mbOjHoot^Z9w+tuw^C&`vCeQ$3v$KX>K47y@S$OsSz<%m@pfxva?McfvbJ4a z-*jC7+W<1rLBf&;sTZk#P#d_@TmaGwwzHPb-?MXX^y@ zU$hqn{|x@rQ5U)s`Y|*|Q3`*N$0=e|JaeMwd~jKB2QUCqH2btcW0QG(<>_i_U1_j8 z^n2)W&&zdjyMsW$d?A!a-cP+rdx`lX^9|;1&IQhwT(l@l{6Jc#OVL{lK|`!1%gVG( zR#!C^w2OjaP!eMGZrr;>8E6%BmJy3d-;m7I70em-e9lsyNgPx}8@5|YZTI|NRz6>= zsLiSqHgFr)H$Br#4_@pc?zRFQ#23jLas-T_AEA4=hqyk0U+|gWfatntiFm2_f;3sa zR5=LFD8Et;fnv2peMX1U4}-~ui{MRTqBY4n0`hEe_EC`H7z4+_^1aGwh=G%Uh;}b;5Sg;|`msegkHK@c1T)D$}R^XeHOm2#Li#Qv8};xf5B zu2fVczG&z(8O-(8zil7b&%1E`g_S>5p=;LF4b}Y`h_sA^c*IAPvy7v1w8CdPZA!3w z>Tj(kbes!W_L{jrsCu;?<2Q~D-cbeD_`VnGOKiLvS^``Gwov0)pRn$+bnL~v9fDdx zg0MyUo`Rv=ta(GTT$^RwX?X;atj)F?p0|9is_RuhR0V2uwOi|U)s5F(YkaBoSckKF zPpB1I=%bnMa?2znWrnItm0_4R_)W0#^Np{yENw5{5A2V&w0lPbFLxCZ0pfOYC2fM; zE%-oUR~ppoG$(W~8?IQe)=%xHy$Svwpc@9W_U}4w;GLF+whh74!Lg8V|96ySw40nS zxGb4n{=jg-@))djlzBFK%Y2#T*DJg=xaQ#&S?kSKVcSpbV7odv*_B815Koa*WEZ)N zqM?XcK9-2Rgh%InE!ZuJmAs_-T)RYf(g>KhKq2~MJK1h=5WLOag?)-cj0zD4sm+5y_@s!^+w)>lXhol~v zqhUVK4IBq}Bs-~y_9eTYn=Lpl_*+mV91x{Sv*b4Uh}@xYDV{1->L!g;o2@&izoXx5 z5EwR@UNf~>pIB4vTxWx;&HbFm@A=Hv<}a*%Ch${WUrTgHNyp_5MdwK8maauTj2>Rk zGriC6Po#8Ed~^isRl#Oqi)cdnj_SHm@5Xyat3IxK()cit-`3h83+)bN^bmSW_Ky*F zk}r~vP_{Ex3$?WO-d(O^`XZ=11}w{59ThMVKQ?%v|* z_VoC!`||y!@`lRCbqDKdfzJbdtyOJXg8JZh9ciK2(Ct0r^2NSWtzUMrxXXAH>J`bW zRurj+yHEJ8NGqOIUD0o|ZS&;%_dr!AZ56gHp{=}Y{Vo!b#QdKBmH;Q!RHOk!VmpyT zy2idxsiCQ8Pw7NtGWZ#Qc4W1#*a)ltPOU8?-@Vd|GIy3_1E=j zfx3XHH2~Fb;(|a2r6YgWL?7rmH2ke<85b@tJuwSZ}7if`ApRxReP&Hs$SpF z68HyP(E3@cCHTOx!IR{nl{+gJ(`V>*R*V!bD^`>$^s3$JT5Xj6q+!&mvb|>G+RxZ; zIyO0*o!`5cmcLs5xGJWur!h4!+46JSyY1V9$GfBTo@_*&S zv@-2QSHJfuSll+;W(XEbGiBM%T2D+@#V*bMcV+Jwzc(MYePz4gdC^y0{+_S5yuW!_ ztAE$ZK0;p#`0ysj8kUw{fmYppOxmnWr)T|HNGw)O+kedamt9j;pVniT2!z<;#{Ru}2`vm-$M zQ_1iiYq>!Fg#D?AUjGW|Uyw#g<@v=gOQt2i%MQs$3|kz_szhzV&?lkmKpwT1j$vQp z56FgekMz5&6`qaNZ`R#vS=r_c{?Ku=8x{)pJS6{4tEZn49+Wj2-}i5BFKbWOHAGs= z`%L#(ztR4QGs7qIxdUGWHnBcquN63@6idLabzTjeZF#Z%4}nebQ17oiUvn`)?wQ*? z?@=D*Uq!e6p5cc7`@puKAUMQ zPpHyWJzHH|Q(RZwQr9Z!Xzn=C@g;GR@r(JAb6&&4ria`)Az67i_$`&g`jdN5R3#S4 zGRjSrQFS$)CuGM+tNHVkdsv@J4oja`yVRRBTEoYVi|$XVF}34?!>v!+U+gID*weAH zYkgOL*Vm!M{uO&x0X#e3{m4W14tckgU#Mlb+1ehqtqevfvebFDN91kFtNRMbH-sVG z?+yG$XXE>#52~K6UD!HDO`*jz5;<|afayjBr*cu%FI8`}HgyR5f8T2(T>uVHAB*q? z8LyFuAl;&0;RywD(Js{|x(oWx%ro`}cCq7SPq8QBf9y9@Jg7QS|4RE%=u{tNe<5Xn z@=NdAP0s>T%0~ux{o>k5liySqi9M_ zOzCxznCxThZpjNl>~6l;ZJFy9Gk0^Y|9&bss#k-sp$E&|?UDu1C zLX<2@VtKWx!3t%7%zD{AS1Ewr^rfzPi zh`5ltg8Blrp7x0LEc02xTG4LFNeNxL=+RA`LVwb}-StgnOw~8l;@bCWTN__&dM@}= z=ab%!-35a871tE2Op7dwAN@)6Q#3-Vn5x{MdB*syP32ZKx?3W>7kcyh&(k)0sOrB1 zB`t@0PxSeOMW0G;?I^#%5z zAXafoN4Gg^6bgMCG+Zq*;`p6TX=UI&&Ee`SBq z`I}D>^+@!}996w8#*kdGyAoTy*-vNBvuIn@Ju}1yJf!fUn5+0%chppCJ!5@p#W>5Hd47q1Yk5*NrE%G# zZ(E8xjlE>9&6C|YzjuUlgGi%hvY+rWrEWcFSy;8W>h+rO&e-0=Kt6dDrI{%aexVyP zEHsf!@0dExKU&qclA6~W#EnaWuLs}gI^1Ut!OK`QhF|@?Yd7)I|Nm z%E^6e6kD~urdj*5G&gUte{EokHbc8pn@lr_GW4?*ORDEc-;npvwTw~5UG`G$azUTC zR~#o1D85(pna`L%Hos+g%RSHYUWF;J4I&^gVJO&EGzO-G?}TN-oER4-3Zfn$V0gF# zgGam34zvdy1BapE=qwl(9gW6gV3@6#Y#0_3je%njXapt-gG3`SC=42n#$ceoSWFB$ z27^Q6Fx$}EFerE|#67@41cYdafsg|=y8rKHc4-tLsw@hKB1Vy-$WfFiY7{Ms9>s`a zMzNyAQIaTWlq^afrHE2SsiM?Tnka3QE=nI|h%!c*qRdg2C~K50${yv2f*!u2P&&Bibe7pcJ#EbA^yaX@BLkn`e0|F$#DwECG%{ zi69b%1kOg4z?^6o+Kcv~{pfOZ?EgCLJD{%of4%l3s0p9)zt;O!s6QX|zwSHwf9?1G z+Wrct@2`Q;;Vd`<&W1DLFgP5(6;6dA;I#h{19rf-!woPKEFVUKI2S&cALfO5{>KxD zgBL(#foPZ!#(?F(=&)Q^9!v+*|Bo;5A7>y3PKHrnO0){CMr+Vov<|ID8_-6y32jDO z&{i}wW>04+p|&|03=NBiCBPD4Nw8#C3M>_t21|!!z_hUKFbL>@g=4p3 z5!fg!5{ts3u^22Ci^Jlv(b#R+7;G#y4!a$@0~?P`z$Rjou*ujIY$`Sln~u%EW@59j z+1MOxE;bLFk1fFN#1>+Uu*KLCY$=w2EyDs>A{H8*VJTQDmWHKc8CWRNiDhFsST2@_ zh6#=p z`tKrv!{Tr_JT4ly4Htup#l_*a<96WUaS6CYToNuBmx4>hrQyxShB{ToJAqSAr|W5pZQV00#voaAX_>N5#=_bQ}Z6#IbN}90$k6@o>-@5GTZm zaAKSUC&fXx7n}m8#Hny2T0$3TMQbaAuqZXN4B8cANtT{e%!(5eP&S0*OHV zcd0{Q5jX@M5slb}h(W|6;t<;rI}q`R1Vkbt36YFQL8Kzm5b1~vL?$8&k&Vbf;_J zP`Ri)R6eQzwG&l{DnbD$B8r3}qbMjUii6^!q;MSyi4viVC^0-8rAH;8QcxO{79~W< z;4+i}rADcBrACTlJBzE|F3c3Bxotd|9cdNukzyAR%fm|5W=~m+4@SkA$x1xM4fxGj zf>dvcn*!jZBCQ8-mPX0NB?OvSBjrU4wWTq1JHsW<7Hrj(sZkn-I?bzA5{wE`jsPzs zu*_~DfbeWrcs&`OB0`ywPKQ&;I+To}i*tAZGAXMRp-1a;1ri5OZ|9|m09t~LOHE)P zbPAcqtSikfwdgb?i#tjuBx#gd5}Bvw68ucAn3Kp5O7jHy0$7R8u$7u*Ai9b)$p*YR z$_%K}-EO%?$KdDcqg<(S78hPpM%Ej&x&nbnT3n*G0Q5vhE>Osbmqwcy*M$~>mYAy6UZO8M3j6ros?=!)`e zGXq9_X{>{2B&r2YD&XXyxvo-}P|Po}C#rQygTZ9Y5|$EjNEBPDC|f83C_Ihd!6?zF zRd^}MiYRe$3k4=E!z_^#2;NeuCP%1ekkly#DV<6-$>UXdTCB$BaoE#MG=G{X4@f1Y zI<2fS=Qf#;rX=}w+bBi@lP=T1UD~oNW}H`7wwATXqn2(U#AHceNm$tsDZ ztBHCuk>HZ)Wh^GjkJD^-n1~r}n}STICN!}9ZrlX+e(Zr zD>rW?#fZ1MkR@qOjipFHRTm2c{_GNs8z9pR6xvoc+RtVJ&P)%3Xkv=B1uhRSk1uo^ zm2&@9hmVc%83Vfx6!M0Z#CdG=n{{OQReU!+h{JNt3mK;QN(;(5J^OWW}7BjW2Qz?iB5z8L4sRMq^%a0a|a2-O{3~ckY;+R(kUoIII~@RDv5w3 zS{+U?k6P|QdDvPMF-BvQrKnkE7Rw@vSNM2lD@p3L?BtqB77~w0rp6IiPIPIyHdDs4 zLbY=yo=t5V7HcmlnJ>LkzroHDO8PQ2Y|rBbNbcD~SRFe~HzMHY(HW}r&Q1dT9N z&19F^E#^Xxi=9i8I|}#~rBGj5;^8K!kkkZ!v0Ea`@FJK603A>;GUR0ft4^fX=`y`q zp-Y_Uwvwu=W`Ku^2r{d z6Ya4Z0D)DBcjjxwdYq_`zk`xRA(Ui!{c<_KjAhf=NqQB9#9}KPSgy#)W^J|cZDeBt z8>df_rWxYPtfDfFU1v~XN@L7rB^aI7V)R?xISLl^U=L`7Dxv^Mu_+nkT!j=u^Te~F z90F?;Q{~*LQg{{oavq0;=frA~rPva;I8LLp7(8@?&8?$&y(WK#NDAz9Z4(p-Gv(2G zjmJ=i)Nj-4O)!3p-sRJ>+=PTOjE66#ONe?nzr?N5=;c}}P3;jAWHND~iVM(r2~gV4 zYKj38%oJmh%B-c8W{O-=wPw4|CK3^&3|LQ|V!IeuB9o@684`0%9St5E27l4yEtDOctd!%IcfELpZUlT#*3VPqS9;uJ@rFixiAsdx;JgUT^m zJbnq0?ji}xO6?{Yt~8%nF5&REaSSCXbeL4C!dWpyC)G@o0Tz{AzD=3R&omr5;k0VO%EcuG7k#X~IF;nQfe8V^aPSMrO6 zdSN=W`KJ&N{1TyyiZ&;e(TseVL5MF+SL-yT!Yp?TV<#O;!~iZvlG$ZovxU|o*G@n| zSJ(;^bfd9U=tJ?8jA9o>njsYvvrQZwlW+3kbr=)VljF^%#LDIR=+anslyh5Y3@4F= zqHg!*`=fO*uUc+U+pJbsjwwbE>k?UGl+oM-1=`KxvsDbEgbEEcd_~M?zfnjfxTz*u zA(Y;=nMicDywJzsi6pU{tyUei)K=j4OXJ*L5?7aQM_2$Bk>!M@wn-G7w}`Kjxpp4YZc_2}RG&SI<0W{g2piLwN0WN>-e{3Qv%{M! zQ#$w*g0R?!kvl{?9OYtDsZnFnWOL$O7Hysk>SD=^B}|~iC${F7%B2OR@tO>EF_Wu} z)8`Q~ouxjTD~V0D(yTHk*_p(O19D5^y*o=CCMBJup%G$Av9=g>o}Hyu^Q~qtJx$=X zS)uG7(pk)>($It)4xJ!lmw2S|bgHQ&pF}Fbd9+%WQqE?Q5mqlv>SKB6Rvgi)_0efm zUzvjKmcS%5ty8pJ<|D|wI9mqET#{_eW_k=Zzm%HmRnfO`6U9lcEK#0U!-q?d2B@Uq zDB(*;NWPZumc>YYB%dvvpmECNW}(>Wbf*|uE{vP)$}sF?No9bY%~!HhD0y@_hs0r% zS%9DvZ}W204yy`JG@1OiB5pQ7lM=~xv!zT+OfEx8Ipin{(gMi5RE)XU!ZH>sl37+y zf)(Mil8Y1^mzu{E2upQDq0L54rC5YX;;j-NRiQ8DdSn73382#L)@{xrqqU4^x5{%( z3C#5{rVf!&&A}v@#9(b_5G$ zNoJ?8i;V!I)VWP)S0zyBRD#XNQL(koVtcxk!bzYes)&qKTd@;M$TKkrR8j`j%N3Q% zs7^;Jz04{uwP~YmSf9@6P$@YCXO7$;^3xRn&X-0Wfo0gsjV!A%QmK#xqVil z63FF56WvO*OJcQ@AcXleCLvdzR>m>13@AQQk}Zm5l(;;;a(1jh$5(MgG&h4;#uB(J z3|Rqbn+?q`&@-%TfkKL=#&S9GENL89P0tZ=jcU_&rk|u{my`55Xry7uH%TN$HQCKp zb5wbpd`TrFG=$k`nM~|8k5 zKg_)clw((!F1n?XR4SE9B~__{v4JY7a#Sg29Z5&hDdn7V&N+voy4|+h9)la3F~+1e zc))~V8Vnu}Fwiyz44AB9wZ65(|L=eA zb9$A|Is5L_&F9sOR9slWt#k;EVVtmi?x}qUj$r4~<90Bbz2A3I{{7 zK+EXr_OqR0w>an?+g!$DBgZLi@O;|Tq!o;YqS0C^IjZ(zMql0<3dtIcf@r9>@0)k3 zL(^a|F`v2Y>1xyCw#39^yTj6S_T0vRC+ZJacB}Gk$b4EKk5BVw?Qt&Z3r7#?XXb=O zny7`i!A*xa-1Tobl9pn)S2xy`_He}O_PXqqb&DX@kFC48R%5+&4O20|>NtFTN542I@`ABits_CT4elT=&csXUk+T@3<<7$MT>*lzly@Fz-6dk+T%s ze##4r!+|;L?;6~ufHPon_58cRekU3|ZtnImzq+a(v?9ZzqAN?NEbg`?Ya6ph;kc~r z333O`Q8yHeHbdclwU;jqo$^L-SPbfe>YgxX$Q*bL;a#|awdL`-?M?U-9dC^kjaAwn$DLj<;JXZK55V9NBMR;BX4`! z!kA>NsdkK+TGF)Pjz=d!eOj51#`#@maWv4x(?(HlQj7%n!M$o>WC{s_%Ep1~bYzPm zE?+8JvyYL2s}nAZdg9{1frTZ-XhY}|*meTd@?L~xIm#;%j;6XWb_znd)|uZi=2ni| z?2&rBU)^*!+kvWal(NYDp-ivu?(X_dO^&R&e&lxz&OCBIr@5cZw=}hKMVvbeD$V0& zDd`!w9}$zq!=OIy`A=?@F0k;mvB7<-sEKUTEPs%JTk zOXxZ@54&8i-|5e7rX;z;x_Pu-+HzY)3Qr7Xweh1R50=>&N!*DjJ1z26`+}&`>lsLM zo>I?~t0@yl!-BW!mE}xjo`-MU990uLJ?lu}pNtA)q0Im{=OgCr?l8O22~T*HQ)|Aa zN`!_f({68TBncx8tfH+QdaaZ7e0#L*={8*1sF~X@g@u!1Cf+cIED_9I32b&oS$7tj ztb0`x*Lb}q&s80sY_q_L#r@LpG2A#vgibU3iZ<>~jo^m4XtF)h6nc|DvK(gR>)HNf zFi~~4bG~fLed->1n?59w4EeK)oUN{G9VA7adR#oor?%bWymMIVyS#jly-kGG|6UOHG1MpXeMQ1hDMrfepb>2b}2SllOb4<|fx zE98tBt-)$KZ5xSf+G^2ym`wOO!&A>eKaeZ5DtasB>xtR?m zqcKCg)=Zd-UQJGDMOtST=cwNw^;CILURaTa`Q~0jobMVp(%yD9wjImG)Csg;3hN5& z+E$5eDx^k^jasS3x3ewT{ASJUssyDzPczf01^5HE$2LiY5)EPbY~*u6I%yNv!8K_b ziMC*%O=uFm(oW21l4PU(y+O|?s)$|QX27kh)|*_TEZlF1%Ek=RjZ9MRq}koe__VGq zzq;FvAeL~(ltB}aDz;s0Rf96$NpjCO^2X9$<4)-;r0L3P6E_x@;jc9Y`a(Q4jjpI9RSEc6nHT%X|(CxJZs(y9T6{`n} z$w|ELKkf;GKBK=m@W+NVnfYnlrlk?w@u$svhu_!?Zg+M%TiLRw z?`Z|~sdO|G6*z0H(_K%S+#~pUk;+Ehu|fZ+E_TGcKKuH(TJwivg-B*J zIgOus_uS@8yx_O9#xU+WnTyK9LZ_#*Zr$w+BEyKM9_t31FlDhRDUT<6iGZ`+jaU_18;p;k9S)IZFAqvGj3V5mY~HJK)aDDn&T&vu@EE+KN?#yrJ>xGv~?}@ znzC(ii(Bi3X0z1t)qS>@4auwXDI2S>XIHoO?P<5Xw(gGwd@V&dV{TNEjgVWA%o>ke zS+lE=>jaI}kuFh)MXQ<~%YP6#t}DFz3E`mQKDBSx%E@BLY|VE(J&WtCC9t2xN3lqD zBX2S7)c93@P~zB)aayQZWZkX7M_ff;Rn)xWc4)6A=@&YIls=(y=cC2CrgiKJ8GU1a z#gOo~dEUc_(xYv}swHoro%M-=qlhiS_6LIgI$HB5+>K@>O51#vu!!BOC4x~m+6cWh4@51W(C>7b(rN=Nfx4EtDu>-J0e&@6iUS;6qK zN-0D2G%+-e>WN{no-?q!nXc5f+G9>=`BVw7)E)&ypStyvQ#^X73q?$tNM z$^DYR1V5qLy_Vi5bL{nu6_;=5*LBT~abyz942g9ZAZn?vj5t_t7 z)S~oClYW~yJ}6Bld7s~uEJ*W)lm%urs=V7NZ!AAaRCl_Qh^+6(`vz63t-M+Acy$(O zMd47|WaSfQ!HfpR1*Jn?KFn}>MKkI`yc6$wLJ{5VLbsDw-(e;61zoeyE_+=iMLC=- zMZM%n`aS`SsW_ZBUYrunwa|DBBx;uX?wQNhAH0njf|!BxWyWF z`zKwesM#Ivb$i3C|D^5A>x?CHH7QFT_7eSaYdtzims7_PPDEsK<=Kh2^Q^vAXqsA; zK-dxw_9USrb0}!AoJ5ZO>{QL#YV!Kl_@q-V>0IS;$XRl;qS*|mj(XaaN=lRORK`A8 zWxp$KV%@AO(p1?FN{DSITbQVAv3NPkimTeSWFuf`h)rh$X{Zw{cf-N-&=%)LcC)Qo zr8O*N2N7e`6E&t|lk7pKlTH;(m9)*}=S9kHNmCTFn*5`H-5F{3!nw^fdn^k{o0Edk z?(OIT{PcE3Q9R3{y~9pCz&9rQ8k@4r&tMj;iseo%qCvjV40J*Qqdss7os#m3+aCgU@q7Hmw#1t7 zI&DHb%UW&qTjsFIzA-jh+&*?Ro<6Ncl4qR*x5HESYx};UucPuKlf%-UXD4T@=8UO+ z#O*HzM!kw4b7*fg6iF=Q3GBt>p>%)P5N2wv;3%Fr2$VX)I99NkPE*yWGFc06LPyJ) zcRhgkLt#Zl9NR1&`Ub6j#n3S(Ql)6q+z%A>u59SIQ@5TKgrjD%X_NF?0aGFplmtg5 ziD^)Y$C0*tauTbh*m23^q;9e(D~P9_8dlPUiYJomx<#2>NR>2I+i)9f-x|$%z2*cj zU(K+>_PD^a?g@=dgO+KtjSYR?Od&k7Pr9Scpdyqk_bk!+X}1sIuv6e-2)p>{ioxk_z8)!&JEGG0z8)wZPCZSJsBiy2Q!s>gJ41x(wXgLnW+`sD`0_CRpCQz7W>wC)NoGJj!^2u7`U)>f(I?W?@%PWrPY_XWKx!yIE#tlQO6dzYYiA=Q#;)JrqtN!!R>>pE52#b*7mcJfvR{^v$tE;gKQMK z3)(5WMeLdMcEjE19yG=;gq_(!H)YIO?Y*Gfn6E~Iz2+#nWtIgC)nF&wD<;%dcs$BP zkv$yc`qo6USL+yTTzAc!ciXDI-d0@g4JT6dbfXd8_IBFVM!Lzd*UHj?pj2_A$y|Y7 zS})4`TUPxbIOe$}u4r+;kVx2E-8NFRC8XwJHC^Yos&1s2X=vN-xUjVD%bN}dhlRAC zH`FB+W3+tY-w$ti3MCnQNFI$64kV=P^r9o9zK7ZD3466&Xj?6wkWCgju;vSVw;>(s zsE51JzPnfBxkROYE!;6zphCmm;C7Az2OfQrJ;{vrW1Zw-m)8;0HxrQ#t30XjJK_;L zWb_71?#!?yE{Wo0U%7FdNq8zghohMo)Z~$HH&aL3g~F&+bF<86J$cMh64^E0!~Ah= z(^N3!hkA1^Ybb7nPHp4luof+0ov7Or=hO_z<3MhZ$r){q1eP4t2E%4}JD%?sO>$Gx z8|}n8!fH2Zbd77MgzHF@`m-%gP1Pi8MN{4cfMBPj1z<*H?hU~}gQmwPbms?ZpC?l+n0*D;X)-iEv~bL0*EvLoQ%{J5(dEQaY)y>JhbfOciRDBIcsZcJY z7T1TKUK;h5+h?`)`d(BX z9Q)nFOnGOVEt~w3kt;p0xNJqE+otFn+OcA2AaZ9)&csGhGfa#sLsq?EW)FKwYqC=) zCGt66z8^HXyFHz^;2sW}=15N(-LXpQXX(?lJFPA9Yf4{o00f>mRXrS>ef9*hjQHT6fAx;yZ+QX}ws{aJx;h<0E$C7Nck;(!cHLvyjUPm%^^+>M zYUw(wdT%B!Yb7$KG~1^Mof&PmbqXfN1S60hjYT= za(Em*N5BzsL>w_k!jW=h963k9QF2rqg!BL9nJ?=ntP}Rh#>wW%*2(tC&dKh{-pT&S z!O7vt(aG@%=j8v-=U%OISzI=EgS*My;%;+yxVzjv?mqW`d&oWF9&*e~mer|vp5hCm@Zv6Yd!dxMcCzybazaZ;Q9h+u`l<_IUfe z1KuI;hC+8`6N}h^`@YFmFPs>AjI-Z_q;9H^8E>7>;L;ex}n9t##@VR^*pU)TYg?tfT%$M+`d>LQPSMZg56(8ZN`5L~K zkMebVJ>S5`_@{g$-^4fbEqp8A#<%kw&|U80yZIiz7rHn6e7H@`5AnnN2tUe?@#Fji zKgmz=)BFrS3mqVNet}=)Loy70g!~@`VDSP$&|L zg%Y7uC=<$s3ZYV{5+XviP$Sd|QK3$#7aD|^@Kk6NnuKPdMFLvugmGa)m=vajkbXp%73PF_VL@0FmV{+tMOYQqgpf!<*c7&e zZDB{)750RE;XpVPj)Y_3M0f^6j#(nMXhXCq+7fMxc0{|PJ<-1CKy)ZN5*>>;q7xBU z#1rvF0+CQ85{X3;kyIoT$wdm0Qlt_gBDF{((uz=#PNWwZM40GQWE7c1W|2i?71=~~ zkwfGZxkPS}N8}axM1D~~6cmL-VNpaB6~#nxQ9_gyr9^2_MwAuhM0rs`R1}p&Wl=>` z71cy_QA5-ewM1=EN7NPdM19dfG!%_QV-ciWgTc})FDvuVu@HPmWkzJg;*(8i4n0{tPyL)s8}b~iw$B-d@44I zO=7dyBDRWcV!PNOc8XnMx7Z{0ihW|gI3Ny+L*lSFB94k<;2S?Qi)V5l}Y7Ng;Xh3 zNfD`9s*!4?s8lD_OAS&?dMY(aO;WSeB89Y1Fq{*HEl6Ebx6~u`N_|qlG$0L1L(;G` zB89ZU(zrAsO-fVJv@|2lN^{b@v>=6)pVG3lBCSem(z>)EZAx3xwzMPdN_*12bRZo{ zN7Au$B0Ynl^(+}%wjtY;ZOOJ}JF;Ebo@`%sAUl*D$&O_l*@=uRP1aa*13jm&xUFg(o`BDczIa=Y9i zcgkIIx7;K5%6)RbJRlFsL-MdZB9F>r^0+)9Ps&sBv^*ov%5(C(ydW>iOY*Y3BCpD8 z^18esZ^~Qpw!9|jnNAj_JB0q!a3@im(v7y*hY$>)CJBnS!o?>5dpg2?< zDUKB!#fgHe;3@bDfkLPdDZ~niLaLA{(NHuMEk#?=QFIkOMPD&c3>72ASTRwYDb|%NC0n_n+*EEUx0O4} zUFDu~UwNQBR30ghl^o@XlB?t?`AUIOs1zy1N{Ldclquy(g;J?hDG{YwsZnZ`s8XlY zD-B9ad8#xjO-i%UqO>Y)O1sjbbSfeJi_)X?Dt$`7GN249L&~r+qKqnI%D6J2gkf3A zv@)a2Ds#%bvY;#~OG=n-s;nw&%DS?lY${vIwz8w_Dtk&ue5M>KN6N8sqC8Wst5_xRDM-J6;y>(VO2yG zRmD`06h)O(rBrDcOqNyURC!fFRaBK!WmQF0Rn=5=RYL`-QdDhKN7YsJRDIPzHB>>8 zJJm#Wrdmf>2piczHjyo48`(j2kv(J|IY17PBjgz2ASVbH;URoPfCv#0B1R;L6pX$b5eEY4nh`hRLA;0$@go5wh=h9v#I?_Oz2&9-nI!G6R;kn2F86qQO zj7*R-1SVOj+3F4Trg}@gt=>`Zs`u3U>I3zm`bd4O=BQ89Ts2S4R}0iawMZ>iOVm=e zOf6R{)JnBVji}XXjasWl)jG9aZBS$CQ?*fTQk&HlwN-6X+tm)WQ|(f_)gHB1?Nj^J z0d-IvQis(MbyOWw$JGgSQk_z#)sPHA4U=Kj1$9wfQkT^g7*0`B*VPSmQ{7Ux)g5(L z-BUwaWHk&-RFBmY^_d!`F=^PE4b7%zOS7%n(d=sWH2azZ&7tNktw<}@O0-g~Oe@zav`Vc?i)htajaI8gwK}a{YtUlaQ>{^J(wemv ztyOE&+O-a?Q|r>YwH~ck>(lzR0c}tl(!#)XZBz>>(X71MN^d(vGzg?U@#)jiGFG1KmWo&~0=F-9`7% zee?i5M32y8l!Kn2T$G3MQ2{DMMW`5+pi)$Z%25TXL{%t)s!QMuVp{J-3 zHKAtIf?81T~Xb=sdVH6Ufp)oX$CeS3BLeppl&7wIpj~37( zT0+Zc1+Ahrw2nge7urJGXb0`0J+zMw&>=cPA&CfjhOX;aI<{^@x2fCGZR>V)yShEy zzV1MGs5{af>o~d-9aqQG@pS^7P$$xfbrPLaC)3Gw3Y}7?(jhvvPNUQ6P@PVv*BNw} z?o?;gnRI5IMQ7F7batIX=hV4$Zk+$ELHYeEKB$LO{rZSLs*ma8 z`h-5IPwCV8j6SQ+>GS%6zNjzh%X;Xf)z|cOeM8^WxAbj&N8i==^nLw6Kh%%(WBo*b zre8O(3~a-OVbic>*f#7Kb`5)meZzs_&~RipHgF6l2Cji;;2Q)6p+RI28zcs)L1vH} z6b7Y1Wk3vSgT|mWpaz{mZ!j1z!>Pe&Fd57Si@|DuhfWwA21o>Ga2q@ZFQk6=8v=%) zA!G;}B8I2|238mnhNK~7NE z8wQ40*U zCc&hb43lFDOo^#51XE)gOpBqI4%1@>48u+_BWA+P&^c$tY#5}r#GIH5b7LONi}^4= z7Qlj72n%BoEQ-Z2NWp|bCmEK;GFTSNVR@{86|oXl#wyUcSHtR918ZU}tc`WBF4n{P z*Z>=1BW#RKurthV@|tocn?mG{iT&L2hacZ5YQ|~l5 zG3Tk%=rlPkPOH=Av^yP6r_<$hJ3UUX)8`C0gU+Zk=1e$~&a^Y*%sO+#Y+?dJA! z2f4!>C#TA(bNZYiXUbV}wwyiZ%EfZ&TsGIsSUpATh-#f0o}a92Crj9(=TA zitS>rI4+*S$!TNe!agwWDT>!-SIk`#b&cN*qiJv_BMNmz02NX@3RlshwLNvF`L6aVRP9$ zHlHnE3)v#Jm@Q#T*)q1AtzawJDmKDavo&lj8)fU*dbWX$u}|4XwuxK?Phz}Ubc_zX9w6pc8Gnj9$`n>F?O5{gT2`)cAA}GXW2P+o(<_C+3+|7c7#fsY(TrP1Ey(5fC@OU&4sf6{Wu3afIF5z+yC?U z!wn4le#!y57c=NSmRv-DeyrsM}8c({|x&1 zhrui0spsIog8p$>{`Vl`p8y#61kjT|4ds8tYX9@##?)6Kz61Nd1Ir)7^3Py`pTPDX z@#;H&3GnIPf`?)_9EU^10YJnN013yVQemBndj`;P0MEd!fd$z9zXky;LfQXb+;|lW z_u`Es+%!1Bffoh18#i<~6)?ehOt2op-I&V2dImTDVgT*t)L$H5m}+V-Pl2^NrwFsJo;rBpbyLXq9-IO@Z<=}p_}74-*(DOd^=U%NCe;_k(IcENFdxvd=_~%5l6p=2+pq%S;&1v`}zGu z40!{Q3?3u``WuN~Bt1j~qIVF_qwj^|-b=g+-bbXr?gPYC@IfMoKSo6Gj}xze55w^v zA-ciGpw7qO*pCyz%oA|!PZAOE3E1}u;+p+aL^}OxBG~vW5pVtnxTY@gX&JCcYtAjw4t|$Je)fX!I%qP7K z5tH^lp(4>A(2~HBfdtMmQhnJWU$E+T%?l}|)Tj}p?P+s0+m>Uy1Y3!zPV8s8_a zF-9a{JR@P0i=>-{caad!JtT1Fy(9{F9SQ%2H;~rxZz3V|w~#dWhe&|%HWCURCV@YJ zKz%2P4jzH+M@Y*He+|pOhI-dvd5yI8vJa9F@F6(nG1z{LGy@(dJ^G<1Nvo7kk=RSm zkgmS*OQaWG`AyQ;{yoy*)*q8zqW^;Q=Ig&B{rVfE={S)xeeb_9r#1MMX*%wvY5YH} zPbUgH(=77-wBX9gG#<~J27os`1q9Rhmr17ItwW}9Ks^ocnrYkx-LzxJIDHWSU5bPXj?3)-%&+yfFQP)5i2$;{9neeLSt% zyD+`Bb7>lT=+5c)(_b^ac7A1=2JV}F)9B69S1vs?eUt0?V@4UT5e$(lY{6zd!WDLH7WIXzQvg`Wal5gGr7@3T_P6o&mWX-*wA~Q&zCBI|lSu!Ahk<8+Lg?#DJZ;`)s z^AE}3#UGRJy8a^hBK{X-JoqIUT>do~lz&GC_r6442RF#)YW&QlyQgQ!i?cK6%>2wd zr&neGSebF0-#nwHzH$a1XU#kdHfO-q?U`rk`!fX2(F{O2PzM5cGK0Iwp8?Y%SQpRG zP{j-SzZfsJJCwD2PXE_vbl}mZg(^AU$T}sNk_&N$W*Hb>D zHdE;5R>~_kJQQ%RpEAPY6aeCsXF!@lx|F8?UYRnlZc=UrT?$z1QIPWig>^orJaF{_ z<@Sf}pp?Mf6wcmjDG%TFddda$8z}_RTPW-Cw^0b-?UZxyFa>w@ofJTLgz~ulZz%Ks z@;K${)JLKHk5blFKTf%dJV~LGpQ2F2pP}HuXDNXA3klY+@(Xb63lv83CzNygzfq{*XB0B|7qI*lg-rb|l>L^1kbg&^Ghd>h z;09$D;Ai2_&g^wNWfpf%ojoHg&R)86b=FUM`7EMdn+4Zdvk$*+XEyoB(d;*81hZgO zGz$R41<5Q0$Y#kvK6^!t%uXZd>_gu-&Ehs~v%0ir_NR=b;-eqcY=1R9u@!T}X(juLUyd1J@BMMT1i338&PxOJ?fggDxr_@lca@g{Z8T z($vcr^3-#rNCor~b!xpvC6gOe+)0PJhW4q1=`nTT@r%^UQ@2yWop(~f+h0uu;MG(- z>k5^=a32-u@26_O15`D5kb3TYD^=}$nEImgJyfvvUMl_eYgFdN4^j#A$EbMyhp80p z$Ekwzr>M`zKSKr2eIAba0u@L8A{FqzOwE+PNqvIx9V+2HKcwD{|1p)o`YCk^ya?xd zk$UOMFJbvh>Jsu>>IMAosd)TLRKUZ{0RnywK9c6vXq36@*J*PcK%ct}EY1Pq(%k0U z&2!Hh*XN$Sur+ti+MT1~59WxE@#c`EXl}5jnmbQw=YE7gogl{pLYmviUf{<#J4z#Qw< zZ<)*A^zht0#P`gdUwPl$%cLKgOJDl%T;jItbJw5w)Es{8>A5xXXXlPuUz&S(?W=SA z*>BAez_;g?nBSYjt^M;HxcI|4ANbcfK>o=b!T#bL3VuGfu<+|S;^3vZXAvB2229Za zLZE?5B$}BxOGBSy&>lpVX-vn>w1wFv^UeXF1(HQEdCvEZSSP5@4lCI<^B)QaL5N~Pd@$; znmT!%b`GAPktm;}Io|OMZ2|WM+QEe{)4->mqXEL#XxFIUrk%g-yR_YhU!Wnk|0@lg z|AdA&{*0#P{E7zfzosD{{tucD;O235!u;AAY5x53%>1opUme=!Upw!epMEYfze`Hak3nu8hZN@Zy4t+;VrL#)@6D6x zgLxunGB5ne9rNeZyXKM1J@d2o-9Jw!KQIqS56-W>@YZ?C(+|&Ij6X8}S@7O@K5}gy zfApbw+`{AYgexDJ$8Nd~*YrOILj1%$pg%Q#0zN$t%%7eAEBqJc*F0aIr=wq;r%!!- zp1}V0Jj?yPdH(qi=cgz?hW39tUt0Lp{6n~Zp9gEdo5!yHVICvk=!g!!dY+T$uYP`x z{^HA+bYy3RzIFS{>C1$5`l@}C4$M1rF4(6ptRK_APZZF>oS06&OHKzGB^_W0od-~Q zoNS;^-C?2QZgbE9-%X#v`RF^}kI;2%2|BotqCc`(ps$8&^s9mno$%a{j=$xM{yhF7 z{ULB09pG=L+pph6*Q@WLgZ#a8!aH71kN^BF^t(RtPC5YZq(Aob-_XAc9;M^skI|L* zkJ8V<-_yaJ*XhlvPth;j{y91cd>-n3o_?A9EFI{-L`T$Lp%Z9dr-QX`&{@mR(=qz@ z=-{p&&{tUhN?&dN9O^C8c zWErdY0<>3PoRdoo`du{!eXRj?n~XVJmjRXrQ1&MvL&nwf2?N2sieblHWDwRaLA$px z2;g=GnQ)l_ZxqzMlYzT(H-lij!dL^Zh4OnDRPZ{6hWvVln)61+-Fpu)Xfy9%+;;sv z4ASm3##6`#8G!sDIQB6H>HO~)oDY1QfyX_;5U+mN6FTiX17X}^oW5%54=ZvS{_3w!&MExhg#&H}p1UwE=CTX<5Z zURXi&3tv34F5qr*E|Br=1^ko#1+WxaK(0g=Ub~iDz!B057D55q{U77}ytJTMsxPb& znhSVpX919U3k2qH0mR1(cf9rXg|GeHm4&wwA6THc-@FjnczA&>eq`a==KB^fa1Gl3 z&#;ppU3dfdTWIU=76AUk3uN3!7s%+x7mx=&u>f{Hxj?z_nFTWV>;ky-%mNPihXp|R z!ooWE;==2uzq$Y}ehqE_eH|W$`OSrk8_z@A5Vw2}mfu^z$zNC?od0M6kbk@YPJg2azlc4=T$~0giyO$x7NN0496L4=%2O4=sYV#}@BEJ_6VJkwyBYk1ej_pIAJ{o?2{! zr(xgIi@V@+i$=z?u>S1g)A%nhf-7Hv_P@GFCwy%YFut)!2j5)8eeyetzR&y!>OdU+ zbdgSe5w7uPi);2@E&}?m7VU)JE?(yR2i!P&X^{;6u!u(h6aJ?#5irH10|FD^h|D$e zG;<9%1KSiPi9E-I_l^m!&cpJ59p`|~oVja>`3l_2nBw(UGV!Y{<~d=5S*PzXNnj7! z{uAi?OgwtTBwRjWE{R1<+;0`kTL^0AzpP`-c-hM2-0WsvCi~m`T@tjCu9)lThcs!G))oc<@Q) z74T^$c;K^4((_+n((7Mhl9#{AoKb&+iNk#h>VJ#5CjBn+e((cW|1%KQzcAMtKV`lQ z|8r>L7tHOq{SMCednW$;B_{p}+!Da!mjHQc=?Oqu+Fhe8UA=pLX@j)51ot}s3>91T;o^LME3ENBHdv<0U%o1hyg8xJ#Qru(Sq*O9Zlb=^QUzItMZ+`+vq&ymHA8)X<&=u3fu?;B>Im z!*Tj0{2I12MK>)GfEl*`gp1ZCI<=y7eKii( zmssLpnI&>OzqAmj!h2DJw(3jg>edn&w3l$81LyB90rOyqa6VeP$b1!?=Nw+&g{5`+ zrKS6(|6=Ke@_{ABwKp$KExv6DxARv^bjBml{v%8G5#P5odd1^V_V-IuuYYO@C;RNu z0^=W+u7YQm?)%H#sYUlP*!3;b8NucA^~f>~M3(_4zPxlTyG)xZ!TGAo98g~d z_{K5=*Is7R`_Kl&;%NCo>Ebe-erXv@-454s*YYC$HOmany~_Z1AJn;Tnd5oG^5d+x z!a4-!AvoVVmhrED@ACBTA6u3(KDvBu>IpdRlgsPi(@+QE=Fct9$-cBKW;_RF--5F5 zEb|yYgll>M&iCVG;{MN;Z(;lz+W!sIhoJu!+I$JhzzS}Uu)?`%X5|`wZUqNuD|9-2 z1v(m50ApbVH?_3Fp|7rR@Hek4POq<&m^&*Bu(tvh4_Ao$yp{I9D^?!AN58U&Gp@+! zb~x_OsDI7Ba?KcpvLuw{;ke?;6r&1tswS3Y~HP%2oUu;J7!ftaGle1g^bv1&@0d)Oi=Y zhWD*poBkji_xOrTe0_y+?UO50;L}j{XDrTr9?Jd;lzn|=3imBI_qU<^k66TgcV&(K zeK`L=uK?T+VE+$R=(rbP`6qCGw8B{Z=?WhF8|?cxsP`f)UxaJ<#R?nz8rC81`yIT7 zKfrb3Rykm5m4PFz?sKTCjBAY5PcPoIij%!^m4jogp5r%G0f69aLD~N5t&1nCxP9R& zhap|PHllA|C<&RIZUhA^YRC?FzWPN-l46ayF#%vsD?0dw{-2fB6U ze^GazrZ$QfNq*0gTu z%U&gUv|njA^)ToFs>hYc1_Me|^qdkxyZ|x)^&<4;D)jS)5<2F#Qf|ourLMKlpr0?5 z#!z2F8364q^zEGzmG)7o0r?C%TuBP~3OYa&s!Z;cQhqz4pxnh&R+dNAmF>*f$|zk& z89}~-6Jey>MKM!uLamhTIFprWEzZg;ng{4Tlyhl5%3Xv2c-ak7rcy&d7NU&GPgO>V z)0C-bG~}a|nA6~(}zk_}FsLXi%MfpY-NySBej0$Q;RpHPSRJw@DDl}A0g`P`S3GC8VVagk* zpmZY@DvhJkfSQBOQe`a1PKDOxs6uFRQ$gFOs7yfoRNy>Qkw=477@Tm>MX3;oF)FBD zf(pkpRi%rNse&K?PPU5j?m`u3Rh|lJ&R4OfRjF`@b3r#(g^tuf3Xq?tLN;%L?Ja`* zuRxK-DoE3E6*8+ug@dkx?X{|)NSg|kx^!GH><=!(kjghAMcyDD~^Cn^iNeoAF{%c+G}Q~Ql~wQ4=&GnHTa}Y%pt@&_8R#rk?KqQE(FR9Vg1oCLYT%{H zq4}zI5du}^CBjt=IMJ#!PMj)HK3NrIrGqXTbTgpdOx1QynJR7PY*i7hP8F4!4{a_~ z-R-eb^%A*NmB;B&rFCsnB?j+OMHzclskA;-1nE*;KtxBznSfdt*)~hj) z1}FoNZ-Ra<1>H)uF2Wi$8nRA}N^Mg^k@c{>&9Hx4)u^=Xun#++Jb=0r`nd;=OD}A5 zAJjVl^^QRKqfqZSq$ku6+9{}a4(eT0qY^H|F}tp2fZT@qfTlZYM1x0A?-|tl1$1xK z>^LK!8&M-57^IjQM_CO0B&ox(RyUxIQ>S&wsT0xh>hK<@&Y>x*cM;S<$53ZbwLqq& zPC&KQQA9_bis(XK7j%YD&s3d;n1jwj9idx7JzJ9o*1TX$BBmR#l!ZJpk6ZQzeAp!0lFEWD^e%WxatU%r%px7Kwk#i6Q~;~2%!&i z)Dd(p$mW8sR-I3n2eNu~gwp`^7D8VZL%k)?&!tdiDb!o3&Z4eSr%_wg2~C^S$z!*u zQ)%1OImiys?NT?$?N<-%I-<^!Kc$Y^od@|vsP_Y$%h2Wxb)x)`I%;qq>OE5D5TB`| z=nM5RoY$cH0NeWn`|ug+d9(B~ODuE6_m46hS?n zMkAp@gNDx1U~sB6XviGcUY!PNumE%mH5v#@G%gWWYZ%D2Y0x;EK-USn?HXe7A;3kz zJ-}N4K~pT2126$*0B1lDARaISFbmKKSPR&$DVFWm6p06b9|XJvdb+(8$>2>sOAc znK_h$`a}|$A|W+qtn@e;St{+ToWf{JziEj0l}!2i^@kp+DEy{*G4i9nUPO+8jCPAgt3K`T)!Nh?_^MJrV+O$!Xpv@*4_z;*Mlp8I1NaS$5<%;y+j zAjcSu<&nntD)us0fVG9b=1Q=xkO->>17ZE&I9O%Kg7t;ou!eAj`AYLu=Jn?D&5xL` zG5;$5J@L%dIhvdai~$G;(Q4Law%%-m*~V`xDQ(QkVfA0Bc@Q%W;;|SrX-pMn8*z#FU>R|fV6z6cy2v?6GI(1D;^K}fJfuvYMl z;HKd1!Gpmv*ou&vkWC?Ch{6^To)q2@ej@yMxGYA+R!!YLb!EqxVFgk7mS71W#PMVuoU(W2<6oVuxa{ z#M0y5#?s=f;y4ibMm~Oh{D*|t#FdF>6aA8qC-Y_|DNC4@leH+T10pAV&U%~m1(rueW$R?yXYbFRlhd8^A%~nRk*k|qmD`>x zn@7rv%5%^2$QzFx%oF8po6!$p9425z`F;5(^RMRL&%X%Kz(3?`7w8x06&M%97tAeK zU4Rzm6waEtV&^XN8 zPaX3tiz?ey)&f!AgUUTB)>LR<=91fAD^f3cWXQ?5!YN_9{8_RAlD_lNf`TXVEmiI14R^+bCSZRbQuez{m z^vcME2sbkr`QIYpjK;JnW|T1Qi64k1#Dt&fes)d%t-Pt(1O@{Zp#Hz>0ag?Yk4VS#YAFcnL~(y&A{@oI4mEVi4|dmSOLbxim?)m zhm~QaSUJYW1lTNWHdcvMVbxd>F2v?wbFmt%7OTVNVfEO2tPxv)HDS%zLTnMX7+ZoZ z!?n2wJBA&{PGBdoQ`l+j3^stB#V%myuuIrw>>`$c zoyV?X*RU(t4eTa%3%iXCVnbLmHjLfH?qLtGhu9=pJ4_8NPG zy~W;P@39ZqN9;592^+yM>CcoLq1r{Sr1I-Y?;s8l=~--zYl zxp+RFhtI$Z@R@iqUV?LR9$tzI@Y#4J4&k}+Id~0Ti_gRB@Opec9)&gF3-Bhq8DEG) zpmcl*z7&temf_3s75FNA4ZaqS#@6AjcpJVR-+*t#H{0ar`8H0zZup;Aim|>1tUHl$?AAf*9#2?|0@hA9m{006J{{?@AzsBF- zZ}E5dd;A0b8OLxO|AISyasJ};#pR3Z7q>6&Up&8feDVG=<;xxHDc*oB$5vq5u=`x{pN<#eWq3Kx$7kWy_*}dZUx}~ATkuWzHhc%Z6W@hj!f)cw@Q?T>d<6IU5{`vo zAy_B|FPMM-b40*I8wlP{{|+%x8tlGd$QSJB{}l+8FudibfzT06D65H(fE%^7M}7l3 z!h|6*7RY`MvDh4uMXW#%Xt9CxS5OG{kpDSeqhK+H{27vT7qC2cL(WKgBaV_j2%_ze z%t8X8ETA|P%nrg4BsUWJISpjf5GoxKB>GpN(}Dl%ARsX?^c{;xA@NY}2M7tkCm@bU zBBVb+N4yV`FezpHbDAs!f^rASpfUl2{>{D9*s;Qu)sk=3xh7AW^C=*Sw#e+M5~3;bHxr*+WR zR`~7OApZvtH-KydoEsY<{SE@M3C@YlaD3ZA){gLz4oH6wKGF#?fa4ZO{|V?@LH`|e z(l+3K54z(HknMmz?u2wFT;tu)mmWAPcSHUsK=*+BA43w^3;KT!N2C|Z{C7b|_CcFJ z2h0V4?g!}o!2f{be&GKJ91np0uLC6YhOOgj4W4o`&E54CDcX z0XV*A5fcAAJ@fZ!JB z{sPe3Q0@oNLEwK6uww+-?|~x2a4)|Da)9JrMAGp-@IQwF@(^_YGdLoTpzcq=e++T} z^$CLTp923B`tuCZKY;WcWZywWUI70S@Lz)bC0vKUKpU^1&DW3z@ZUiC9VFU&;J<^9 ze1PR!pCAvQeunfX;E#a(-vo+5o$sI{IPkxMj(kB{5D~}#s2I{egAN){pok<2AOQb+ zQ28W~{fYyyHVvV|QU>JbAV5R#<9>&u6r_J01jn&Z{^y{=TDZ~maK8l~83*~_fDR_8 z1XH!?JA=O5yhz^R7bb7L|1n621?Yc( zWC{FV2OqJ5@_z;aE;g74K?#Tr=>H57VhiV*9q4`!K4K5D?{GvW0sjY}lR@@#P!R{v z0jQ3U{$ofIoZ%ke0%d*=6mf-P<_7Zr8R&>R)CEvIApM^MY|^2=C-lV&(%*pK4f*fj zkFHU5^npBp?+d9f{LX%m{uz>pKga?607(D$0QM2keh^ARf+77g9FY)^|ChlZJ3@blH&4f%H2z5eiTNG808=O5m7rQLwW`nMgV40cZu3U0uMl|ApI2tq#C88b3pdr1qqo8ZT<(K*T6Yg3vK*!NJ`E_C0iQcSTsV} z|2g&{x5>s24#QXzy??+zY7&R97QXU;~@X{ zp@5v4ihM&|7@V8HPv*Qfd1La{2k9mRd zcS)sjKKLb_V_XaQRTe6iGM075i;c5wlx)6=&)E#yt3KnKKKnd^97g#>N&iqc z+Q)>yYm5KR75$z2Pxs>Y^|`-mx9oSh-?V18Y=`l*b1=4JikbnL15E_70I~$K z0ok0_oBV1CV>vbAQ%yh2@ePlfgTZF5MBcPLeL_ziDpDFKOs&ezR`HA z@lNAC&gKvJ6HG-Wi)G|M$FXm>38V&==bT5=}+kI=^yAH>7VFd=wIm!29u%1U^7e@9EK;ui?NKcobj0Xg!zW~ zmO1M2Xw=)$s9&Q|uSTO@jApYcS+%S>Ruik4wTQKtwS={lwVBn|c4I?X!6LbV7$ zL@h@{CqrjL7ehBgcS8?DPs2dNAj4S0IKz0u1j8i5WWzMWbi)k8Ov7x$9K%w>GQ%}S zYmM5B)&p%YYB%aI>NMJ7bkOLK(P5(_MyHHU8=Wy4FuGuL(de4db)x~}v&NT=uYj97 zcau@C@_+LnAH#`-;B8=B!pY!dars!qL-xb=k0w2y)aTIeVCrc0&C_M9W1QotzsCXRv(9&& z?>Vn^S?99BWuwc83+5u_I>z;o+hMo&ZXet}x_xrP++cdp?TeeNJJnszUH+SIyT_hS zJY~FO;YnBSMe~;Pj`vRR-Zx8T_T{E4P4s3)vt6@&b6xYi=7r6RnzuH00c``?-n_H9 zyLoSOFVMc`zUKbs!%L0;9bIx_$w{D7K&OGuEQwtjxAgAPdrR@9d>E~6L)OC>^yrz~ z17pBfVH|N7xd)?Z&w+k{5wG{iM;O!k4C7BY@)bsu2&f#YfU2Nss6J|lx}a{T2kM3T zpnhmNnu!je=YTE%T>`oSbPebR&@G@r^fQW~0fZnzEFqq7jBoB013PGR~o1DV0h7-l>(ftkw8V&*cNnTwc9n9G>0%=OHE<^d*+ zCC`chTeEzv64c@jT;2#!HOX8*en;WZZ7tX}r~VyYWur zZsXm?dyV%QpEN#g{L18uiP(h1A#s#AYG8jxhX@LjzQsmp<}Bl^=Cp7=ad3{9LxSi8 zn&9Q11D^fYnzfqEGjA|oZob;Q#eA*#Ve_Nr1Lo(<&zoN|zifUL94UH&ANYcaD=k)A zjI)%rRJK&LRJ2hB&(k?JXKgOn4B6bVnE~FLeZik{7Wfq&w!dp13jSHAgI7~a@Yvbz z(&^IWvfbsj%aF?z*K4j*z|UeVcu-`57erm~e#isgf^{DC9`0VAUL{^UuTnVA1zwdv zLa$|BE4)^DwRm-V?e?1KQ|zke}Oc89dG%zL*8`H-0F%yv)kekR;6bv*KC9rU(-N3vS_U&mD`3WG70d*+AZuW*XC2J* zj9xt(U@m9$dC-R(L9W2q`5=rZYM`1Z3uU7^sNT2h#0WJ;OrzMerv05PS)Kgh;}4LLMQXP)aBx zoF`l+=o5{ILBuFxG;umHmY6_HBqkA)iK)aiVmdK{m`ThcW)pLWxx^X7d}0BykT{cA zL@Xwj5V=Giv6NUwEGJeF`9uM67I8MQl2}EoCJKpjiM7N!;ymJfVgqp@aRqTD(IqrI zX=+kLQe@J!q^P9Wq`0Jnq{O6@q_m{Wr0gVqQcY5Q(u$;(BvBG6`P);TBP~Wb1dfbY zhpsAC5o?N3F-N3LXVU{jfubPME_j0v6@`hyMNwjTx~WKkZZ0ZdPZar!B*ju<3z4O0 znmAf)C9)PNaK>|NM7AO-hsLoJ*^9<-#&RZ!CW|CFQXB`7qez-Fj^iY97RhjAIW8hs zQG_T`G))u*Uj)-dN_1tq8eN^P&e7ml(9P&XF-1H^Y)9XK5ILvW=h!>g+u3K?6m7Eh zarQCx8g>i2kG+q*&Wz01irg1FhzAH>B5#qe$WJsyKIcgOeFG>(4!dr8)Xu5dR9`tY4p%=|Bn2%bFS}-Rv9krdc7c!SJ z7ciO_4U9&{BF19IQpOSno5^CzitWYYnW-X@_@P*ib4PqvOcv9{M1~Y2O_VOm5MB9U zyLuMvR=?Y?b|Deq1#>!h!Hfg{mybiA7Mv{=uxGJnvn$zE>}s}G?UC*A!u4C7- zYuIzy_UwslL$(%Mjor*f*aY@Mwltf{R$wc!v)I|}Ty_pSfIXd^&W>Z>W8Y^#WItf% zv1hRJ*;Fx2EGL#1D~QL7Cx{irN@8X4&usk|e~Ja;6zm%87R(Sc#VoOwm@U>8>xgy5 zdSZRCf!I)NBsLbCh&f_Yv6bSR5h_6^D&ZogjkZJ&ot)^iB_;p|v;COd&0 z$xdTOvxC@)?9d;3Hge1<#J ztC2ytOT8Hx9(ghHVdVbEFC(8u9*#VPyVjkN=Ogb&?u|T#d)Uy(%aM;G4@RDiyc@YY zf{oxKUq`--h(>OV+#b0(a&_d^$n}wHqmxKK{S%9+;QNq{pa=u>448vtLi%q&aH5fR&0IIs@LgxG<+xf=ob_zP(|U zB9-O)3DxBX3F$~2T2o$I-Y57!gVLVeg}$D$9PRB_&1lE^tkv1Z#q_H~(H}$gWw>e_Nwv}

R;Ar!cMGozDZQ)07Y7r2%B`TA4rynG(B{&u{4 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 ^+;LK4XfS6@FTua} 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 literal 0 HcmV?d00001 diff --git a/install_win32/libeay32.dll b/install_win32/libeay32.dll new file mode 100644 index 0000000000000000000000000000000000000000..a6e4a1fa68f13cd7a2d0e050801434d380290ee5 GIT binary patch literal 1073152 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 z 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

|n?!kd13i%S* zZ$c`{NtTNXUVBzc5NfR=!F!VRhd58`g}m-5zCfI3$?sN(C$O;to=@xY>~x3R*)C}G%DG{=~#)4Au^^g zuTN~e903MITdE-MuNmwk3i3p>VhZyH7357@X$)ohg0|^tJ>2;z%MWGhhqleO-;6ZB z|IhZDndbMn?KdmU?_0KCWt!ie^dmWhAP;~7-&)m24ztjEvf%LH!G@X=u7nVAP_!M) zMauor)?bkK5(0S)&tC0>c19Q`Xw{=IIeLe^;22Pl*P+nHatYd$AdlrG+FrHL)=!X! zlqs-NV&f9fzc8v?lsXARn%5`DyNbn=O^Wk~jjuE-saQW@{M05zsvz&=C#5ZFQ-mug zlz0XDffO=Oppq&ChB3%}(=s=UNkWwn*>JKGgXw)CJN}_iIEP6m?%`%KcH7EYzcLrA!6- z$RfSn3Uw@(wp*rPmX(NmO%RuT1|P9^hpr59X0=(rk0#Rl5zhByZf0gDJxBc!)^ZO?K zFxIS@^{@M8)*$*3GiwfhguE$YN9pShz11i}#6eMaa;)l*6xOf5NN<}8^pQn+`xWX~ zHlcM&q{k8ydB3x0-5)E`(@?xYXV!6MCDUkKsz}eHg8h*qy@7-)Ng}1`H>8lgOgTUW%;sImMdFj+d5in7mTzILARTMfh&U+LE@jFo zSOdEH3-XR$DS$g?&r%oS^r4DUX3#hSRnLeKqaJ^eG=?}0SGsO|TyG{3Lgeh;Sk z&9MExo#yvB+pj*&Zw&poMQE;Am-Nl6h3GrXt3~)xE7n|_$YI60KX?Ju{SyMDp{~Cm z??DwPMUaQ$R3xof2NdM>0Ahd_%a$a_V~GjCvlfN>V+DEpE=MH?Te0p%fB`97svz$_ zRIot=dC>TL3}PAgCX6O7C(a|&!&nN+q2Yk@boP7DfjYXH#{@y_YC*bZL%6e?!ksql zaO5qozT)K<@D^V#KhV%x7_ayM8bwbt$P^b&hCoAck-q9xhSFbnwOInIHy%{3itV3t8GOdMtAiICKf4UAw%21|3i0FYRreKm z@U4L{z6^amPU!A4o<;z+8ibI3a3sq@OW}uwWak>u-`=IYXMCAK>O+gHjjRvU6wlD`lv+{)|-8DWZM-$+gW)ewoxan}&IE^dfAa?}!%Zi(J{qWQ;@? zxo|aOt5TbJ9?7TDXWnm7-=|@?*veliY1LyXN)5wQwV4VP=pzarF*p>kzyVa8#n`Cr zfh7V}coe-Nn>+uNx?7*`0<_AZT38+`Glh{`;8g+`l;IoC;Rn!)B5;H@A?$lWbVF^z z_2?B_mvDo27%xw;ff8fa_Y*#DfN=;@__#iC&}BRnuwhb9m<$0-<||>4g2@sDK;G>A zdSP5^i4jw|N4HD??^B6ugZ13~IerWWR^85lNgwr7PphWI$jzQC6iL)_r=|rLU49rN8iU zGZKWyqWCgY-5P>&^&eUEoF%G8zJR=BZPEDMo8HOM#u`J zo;pJ2VT8=@8zHl-?9~XFFC(PC^z%9u=p#x$WrVP#7$LbFATH+#{HRd_Ld<>b0(5#A z2M7eCN-kjY$%WY`$swcVsMJXIlgG0Q(D^}PfItQnav9&h)b8;47TD({gZ(iCU<Yuwc9bcz;rc!q^S4RV84jE-e9$T>>cfXs@8806H`o zyR%P5T6oeJfG9%Qi}mG#bQACZHC5dg!hWGiFVH26^aA|>*Lji6s$OjT+@D%iVtZaP zwtt2INmU&P+h1W23)?iNcRuoeQ*vg+_Pl=B4lt!Uv@6W{%XZ;HX|P2y1yFQpyq_(_ zxoZIO9|pLc<{W1deh>j*n)-uIIj=a-?p+=xSl7t?k{JpR)IdE z!elb#pYJBHvjAYfXyoQwcqZT>Nlim_i9$6xj)b4=Eia-jPDAy7Ut)LlJPXx#C8PQ` z2!O6;56%-*7Y%^w$5o(OPY;Kf?B>2}s;`lL&(=?AqM!>3K08!7md~}&(S;9e&k)od zK&W8+6sY=1K{(Of>_qpW{P}=IE-3eM#jLE589csB-Ux9JY_d2=gmi!~SCm^}J(YOl zYJ-Cp>${A^$kdt>SR5d znL4v+ARnoUQ!gN&F9e(|Mjj{9e5M}_FR^GiXaKLB0eb!gfbLR2r|GPm!GSKkKj=Vz zln>0N>>H6DFnXeiZ$e2#^N!{?g=SD$qxiCZ_;BK%fUfvPijvsFzz< zFB7cW`k}zJ+BB=Qu}*zao|K_^w2CyWAIeJYbiq10T~7Cap)uY@fTT{B15atJO0x=- zBUr~^fKIX^>iNQyhfJ&&2~jT=qMjpI4_yH3LlxG`f%US%unv%u4tzMEANQozIgOkj zLx8?Ib8MsSm!j?amaM;KkPid&#^lTf0{UG{X;7fws*1zKYDuV05p_Km%&R$xk*;IG zN;aiZfL$>tqms=Mr5u8*L%ZG8$Ea)@F4eD-Is7hRQE80kFxZgkWoG4-RzXYdy4GWy`8h zn@dbcNojE;n9aZe;lC5ZxUS?eD46d6m`#C=xt3JuU5NFj61`xVX%2Xk4Ih|jUyC9p zSCm+;vq?58dX1_>ovNsbV?w$Q%Lm*SWoXAW17#E83(7Z7e?vPgj0wap$QeinEm(tq zc4owKT|d_32?Rh!bqIggz^uuA41s07FeO|$3!LXEIFn`V!*a1;d2n&dWR@ri%W5?a zIM?;T*~u)I%QD^MNa_UB{e|NDGLaVfDaDmywE)$Ia)1nXJDYlj18BFV5NcUd<|7Hk zdY4#m4hx)ZfjAmkQR#de&eU|JiU93S<)*D8BSxt6<4BmnP z_!2+Em4^y!P+PRRT!39@(&`+c)ghtP1wyL}FF>m^6|F7-F2XjgCd;iDY{iM2qn(6$ zP+U(NmRjR0a1@$wNrv`q2$Ndlfmjk3Ls^u19-78lUEbA?@!mHyDa$u-s94}hv7(J~ zv;cmqP}A&968eGYv_kl<#+PVm5&WK`Uwgxb zrT8t2;%t7O%>{4ccVDuMDY1IV#ynsZWHqB0>m9HMBxV~Z?$VlT8sD$;nR2exh?Ei4 zx-T)`br1F{p29bshvX>$qy2~J2&F$1Zs=W#4-fh0FWfxbw_xV{O8gjsW9MjN1pUd> z$A7S-5RJ}NQvBPlnbkGM15u|X8K|nLF;>Q$Fh^7vzrCm$cLnOY6Q+hj-Ct-tT<=!q zP>_5+lb@}UUvpF?ze;J{Zq~QPzg=XSSrM}=NGy7tenZ1KmaXn`%ec{&c>R?{${-7j z8;RW_pyerq!J*x9XVKDQH#C*IeBsYCTK!=ZUzM3glZ>@ZD06iLS${g zia0wtV*J}7#`r;MjQ>zE;rOxt7~lIEqIs( z4En1v41F|j<3m4P-MFvr%J^h|h4I`YXt?R28OFcxp~f}S_(wdjWX!5SDYC@g zi+}E%I}{M$MLfGOHr*94uZJtJ#z@IblQ65pD2nm(UU!Dr(rh^;8PVSR)m%heeU{}vbk3bI zi&jaf76fqP{dQjZd}EU%;b6@S<8fG60qA9~ep!gS_%q>?j~kbM#l8Z;h%b}V zVfh^#LcvV~?vc>j#*nMN(+LM5fb zn6?~Gpt`uPjZZLnI@7orPk^ev9vEm?%jQXLU*aqI{?V_n1+cBh`$zMS!uXMO|7gu@ zT*&zizjdG4^niC6sZe}+(7w-XC&m=-iaL$^N2wVDC(KOWu|WjzJ(6wUt*u8Q*ATO=l|;`!gn!&W*>_c~+uIws<}PxG!% z`vy{8XNu3!NoS`l-pO2Xn^}$V7B?>@4|?n9O9&#@nPoX&&pUy^_0>Uc9X0dbsB-u4 zCRCI=G11PPw~lVX?V4{)sq;^%8$M<6rLl>g-<6kwU4hNkZlft5_XusMsahiTg?i|%Tr{%)Yi>yY(T@)!1jzBd*nAKhoZJp68g| zkJeKF-=g=Qow|4j@1^qa=FxWTedpdOb)%=$T|8xR;C6IqHq6K$GMncZ-e>hfAq697 zZnUtW&z99U#yNZs!ZpC@aA!4#FB9b-0T+Nvrk9{^srQfW!)67BD6g{2nqh1<-|Q&X zeSR;l#td_T`$x-fK>nX+z!%rxkGg*p)&F{i=hP&Wz6!UW`8=m5;nUO%7#a7RiWW!Y z&NE!==UbAw!4<)Xfn~T^)kcXbNXm_85yBjX_p1H4@oZL+UK*HH9i3Qg$bJj;Xh)FN zY;AIfX==@0_lJ%;h4~0Ghq|wHxgzDR3gaIEtH@ecWAoynm}k=O zE4}iJShwMN)o_51+D@${ali$u{v8bmwD&--5b%q8-NtMC(o8W9h!y7X7Hcwc$_|{%!4QIKW>f>)ggvF*NmKyd|+W zgGlMkfLD9sfLm+Pw{GnMd?dVz-4}~dycros6GyTd4jsi4DCAak*J8t4NCb*xa_jSP z&#^T`&o$^vDj@~*k$M~K7+#Wi>oQEr`c6+Gao{rCK;1ne@z&*A4fWyjtw$sR67A4? zP>S}3cQP`XGmvyf1}r>zUcuK+e)DBC9L&fVmccK0-|xt1IFP~OoIz!fW#Zk76P;@?$g|6{DbY1de|Q5$Fx(z2D(ElX&-17)E3+JCMdX-T(Lt+lTuS?|LKed;#I` z{Z)Rq-?riHlxI6gHCjsFiv%-zdlLtJNa>X;VZ}1Kq{q{q*mzlV>RCWNfNRYgPCbKG zWCMDauff0|gPw%=KmYia(4%o@~#SyUamDhPt9A!!g;D zz@?|!z6B0-1uEb81Y*SR>tf#6!w9r#vbGNi1i-WhVpkE4{KBUIpD0i$m|208Lq-<$ z)iL*D=7(L?wo;H0vG&UL8l@Ys1{=V4q*JQ5(PtP!z%*-{GSO;#=Zb;XTyNtHj8*WF z1(7p7-eoPAfa2v>xg)R&-it-lnaumA^oD-CJB&FTOIwHDgWJ{R2~4b~hfkkSKMwOJ zu^;~XVq;i`RzBV2X~o|!_IfyVt@VEg=s=1WZXmz@$*&5E^%^&=EA%! zD$Kf$YASVLL<&boITyO3vw(GCZ|{>14oF|(DkFAlnM??K!|Vfmvin-^@^s=AGO|Lz zTM(NI#73HXJY9{=5U%nZWr273zp&@a+{h=C=yU=AIp~($lY8P>ZPN4G&?ci|Uv-os zLBpDGsujRW1z@EpR&(r1hVkr12$VEmrX>|>4?`{Bsx9EzTQLJU=aiyUA>$INm}51F zcFX}FLRtb(K~!98Z_3m=CX>?}jbFqlBpOCfX8UAL))N?5Uc9&w3@Dw9)Nn_G1OV&i zolHBeK*9vG)x-)oZqfxFctLgA%(@^WZC)jIQKw-t^Tuw7-8}>oFJ@ihmTRIm0^0=e z?bHq@^NQYrgcD}DScN0;`b>AEIWy9esc*jj^SzO#PpF>0X*!J$d-d%I3a_TQLZJl@=p%NJ;9=G+4qrLkt#CKPX>j>)SHlJ1nvvaV zxaZ)00rxYwAHzKk7l*TW4n+@tc%+XWR>uY-h=3G0#uy0Lada{WP;CAX&vC#ojH-v& zI9uibUkFooIhreouL1O{e|1e@n%zkKt|T0 zwUSl>>|kplfW!x(pYBxpDfIsN!>FG+CPEsjk85m3335P5-v%Tao4w1(mSYg)gLVYb z{h`M9y^TMFU;G;mk~n>xwhctD;QZ5sAHfEgCh}#P0Qyl)OcXiBlU_tDVjYeawwAnAmnYl2?HQHj`KUM zO0$yNQKA2lO5UK9*Z%~SMAhtivW^owik^YtZ=f^|g!uA4u;5m{D=3qdlYM6a6x`p&$I{n_K~X0H8N*faRogIv2Pfw$qEy z=}0jcbKMdfGp=<4a^U#MIdA9Zrgi>))%pKJHQs###xe@{$Jf{)l?C2yC^R_+LPBbd zZTc2MwT;oAil^UW?=)dYtgkJ z`&4$q!as_+D2r4G+t%yjUGT^GA=2)z=esBJ9=drRX+fU3m1tP$MD_z%3_ z8O!wRpx~(NsBPmPe;z9nOXaE%u}EAw8;ncmIg&g!A zv=-!pyIfB&3(QfEXO(k~nkIJm<(E7d-(mQE8n~_w(~H0K;;(oObDqGi92F_Tk#jkV zX{(~7liN~}bK%7veK+7*(#g#qeR~t;e#WW{U4zS}kW6LhS`?`y(H(#n%(W%D-FWyE zzUS(Dn=pV`oXSw1EHLr#89tC#N^~>wbqMlVMEJDu1z=Wj35?-ph|WO6!OV<|r3i36 z0*-4c4{6^TdV6G3&qVGtWq2QN#yY)1U%xVPAk*1``6)NiP#!3o9u}$0dH}SW;@EW9D6l;&+uJ~zX;Et$6e!lVR@VCSpS&ju&=g&p-BqfjLr;6J%z3$VK{-Le`!SnoOGb!DRqI z(8WX$K9zJn&<{o2$@~k7{wyd03jE1PVt=HO3!7M!Uw~M&O`{}L5e*UxzT+N`X|kNd zuD^n56lB92`6{3aR8qk(pl@Qh%Mf!r7e%}g1f=0gtpBj`gz8&E%OY((VVOVt-tV1of_|RD1oeA7U`TU<0{u6a ze@G>0t@rvZ0x1>jOb z=i4w43){biPd9kvXOw7Cg=7*5qpfmfeky@r@k9i9U}}2tHRSQ}rY7L3j8j|=n!jZ6 zNOTJ?@es1txfGp+?Yzaq*eBiJL{NS&LYN@QAbJA)Hv9?~Uyk+&EO29zD8LL+kTgSd zUngrQ%nzi^fp~pZe$0O(lZef}(Xs77tZiHO@a>oq@?}amh=lUt%Va5rqsEBb^o(!i zr2v1lsZx+cIpn zC6r!J2w&$vuq{u87hg=gA+hq#D88^(C@pJRfajnzDa|mF4=qBoa?8REpcTYR`~?*= z?1{JgW_sC8i_pG!y+0q*FP_W>X5+?MVwGs-uHh}1i&Yc9j*RjVy8uCJSvE8ojY;tO z*APx00tecgXw^P+1!n+VgAlCkCgamOP2Enk$)aUfCifm`8bRibl%o$(08yCMTjx?% zaT(}dKY~U<21pq^LDqy}0YRJQxML3JSw865Po_G2KZ1JX*i*0 zesrR7-y1^D3T9Pd7(1%t-^8LA=QcslV%K393;(Na#IRR#5;Dwce*)8ZIC+OcACEl> z^kpzM3T&CoHfrafsWNn_Fm`wVW2tz)(Q3c1GBkz{Y8>>|Ojf=#*k$fE;(B#akPtpT;18VgfvHzF%)qeC9PsD}-xO*FuD3a+Jsw{NyN$ z6NS}tgrOgEo{b`aHDL)R5mK?rV*j{Nc*@5V2M)6IRum$ag_|73$H+UGx3N^-#=Ec} z!}Ufi6G@z}X^3KIQCVx6qo}h~*w_J35go5q@~PtC$5yX~v^z=S@sn2}^v04GQ^ot^ zTWc17V!?v>#T1ph!sy3ecZh1y_|~5?n0MJ*;0kZLVlAE#@Eb`18|{Gfgm?r2f6|7> z@vR71mlX02J0!im%f3fO^WqK$-BfoUY8xEizT|rS(wFfC<1Y{|9D*4y>5{3RFznnp z(JS~Hy@KJm+xj^xg5K^tni@mDn0^w^*`C)jcg{~4_0Fh#)>~w!FZkOGRCxS`hg?xA z1}p@Py_8j1;{s0dwm5grm|4|(=_52b7~j3*?xzTa1sT6^)KR=f42CMC&t}eo0*-Sy^5?`sp-5<^ekr@FV%E$V z#!74+>7U~(`lmqO99bJkZtuL;-+Nkh&fMr{q*Gq!mXYK({@o>a{KByyqwcb#gb6K4 z__2$S<>IlJN%Y*!B4%kZc5#oLT!nd!RoBIpF7ZqYO1#@A#98^A>z%ekBKrJB)$SxcMCR zM=_s{KN*!ki#=vCl%?JD`4`aCb;F|a%k^Eu8N%(MIT&^h~banz#P* z;yH9Re^AqPC+3ea>m_M>sUgg+BpccH4arevo&P~h2m0P>w8bf%Y#19 z!-b)MvGx*bO}SqZSY8TPqO3V4OL{bM&Y3vmG@gQX!TTAGx;!K=$ z9SF1E+*aQJW&#n?w*X|PrEhCp-;L>tV_leAOdXzfOa)`Gsl1zF`x4AY2~OlCp)2^{ z!vk4^Ld;Jg%uhki9-RU3-GC_P5PZ7|+jz(sUB=sNI4y-RF&1O~`YX;|vay8axY0$W zY&1H+sJH0tDwi>szpzbEj@bzD&R+zSg{8X+W$}eMjj=G~rD7$;fpN~#iIba3xwlk| ziHc(5VsGQOfky_%rt3uf`qeyGmC+Q?vCRaTO8`|}Id$me}@!4UG6IS-A+K<3Aikh`8d zdsg@Lk;HycsoB1t<P97cyR(vf-1y49ROn4o2v{b&R#(NRJD}l3HX;id7)nquv;#c&13@DCK^i^&Ar~ z&v8qfVoC$S$t#fyqjl-@8!2#e#%Ukbrh#>`|P>!TD_Gu_??L z!o~P(WNb6QWQ2MDWy*>@4Az%hvFJ|I8|mR2nAaG;HH~oAp|(8sjU_#0IKu#IU-uk} z0Nwgtc4T)IzCZLSeiuF5__Y0b>$i97$Mv@DhmdkHI&*uM-sX8@``ex!-D6R7p8zCp zJwm*#Z$a2L)WNs?0Gz)oYGcTuYOq6h!sARYvC?kY@~h zQ0lw)iGEqIYDP`fEaNd;UdILSeAa2EF|z$!Zo+o(@@`e>nf3yp#J-zf8|>e z<~Qi+pq=pTD0Q;*_9d65w3Bm7$NmCG_kF1!H_68@$J)-*YO%JZZ|y(}y@eKP(_5}l znLtEyl$vsS%MxF*)J8wjJtF13JI^SXni-#zi8|7j_O0W0d6yS)vhQ_2JX{|U_2|{E z=q%`kKd`&Ecb0Jv{-W6fxU};mdjKmNoENCBGR9mi&0aWjmhpz_n&Md%HM6RW40uGK zCXE%Ybjb|kp|*3q)kdzQcQyV-)`GK6=@^;Ejh}bO{Fp-?2&0w+F~|+VzbE+u!Rpf^ zP&y;-1mx19J%Xoz`4ko%=UnO;*n42I1KcSJ2B3x;K(^y$y`ZkaZa0P_cY{M{yLyxQ z#{LG%BD<+M(hSX!$)Z)TXR;7o>mx!ywZ*VrRhUi*V@&R@boOY6A?`5AXT?{{EfT#m z@pd2iG!*&l6uRlbn^Hxw$>$z=eA2U9k{mC6SfcGz3C7W{gmG}7%>(gZY0 zX#{%~6qlBw?eLCdg5F0rf|9AZ61*R~B~`K)8%SL#2c0p%K6FTAaw7Oc$6SYgCdCX2 zPb8W>y5Z@ZjDBy9jb=|^66`WtS)`6viT2MPgg{kulS1ufDCl=ULgm>#VDH8n->iI~khCt8ii!h&X^@}|uYZWZNyarmyM#O8YS|IEErB^piqJoXK zwyhSS+dsB!FsQ9Fr;ZT%K-(1Qas#jVW;Y-g@1whtx*>m_!*>nb<#5?>S#U$)&dhcA zj=^1yvSh<~;GA$7a6Mmk_>RIEaA*yma3$m0mbi#4^s8Un2GMS8kuz57h*b=!g3hF8 zJ3dfx0$r?LYH?|)wyiq0D6=M3F^mJ&_Hm)WP)B39X8kzfGai$nH%@8{%=s~))JA$8 z5BX%Ed18NsLk4XVr*{tpR6G-%oAsS~!u#w_@3RSKi?;1Wkf?{JpF9!&?q}{j>%zx1 z{J_jl9&7B?k3YPMnWJbF5r-N#){TgM3VMZ6aAHyr5Jy%lkVubX@fFp^y6q%ZP;{>I)AM=Tv+khQJg2qVs8j)@>5>o7pbVreuKBNF zd4XjvSv+9O&T#cp_+UK030PEC>0*v$&5JWvPr&DHr}w4iS(uJ_&_ml+)#R+khnm=9 z3$YHw0$=Y+ygei}bkjsgz7QzZ#4vJVjOW-AhlYV`b4*y)TsNWvn}Ysa&e!)G?#{u_ zy_d@oQAjUy^V-ova%Hx4LJMRC0%eNX4acj!z10{;#Z~+WeVFHHXc1CUER?{*gFn+d zUIInU03$|eSV<_GJ-`i-%Frd)94QY$C062piD0vNaPw=|j8 z@z$~uzpu`@bfcrgSnRy@xuw$=cOw*gHmJ59A+NqT7X3Xc+EjjJ?>#tRvwq^mxCVj~ z%2P;!jf@h=c`J&XHiDHsT+>vR*;F>HscdLdnX9SH*;F>9sm#&j&g;ct?cElyV`0GbYgEK^lKWtQzO1tAtyseh?;PV@W z7Ky&(tfak>s_K}pMkr&L`BI;)J&e(G9%Y^q35t-592{~&Y0sk(Bx{NiTTjY!oEeyk zcx6oHI4BInfZk>E(4}Z|m~cf13YD~t@F;_3frwQZ7HbaC^tPm`NfK3iDMH1Q!uXeZ zD0Rx zpg!kzXm6sUq06Zm)PywOi(^++P^EJ_h)j;Ql`z(}&)^Ke{0fYMlhW#>{uNpaMx~H@ zLKFmFDR83VA&cZAn6DI*g9ycw2|wlnA^ZpsE~Pj%>}@OpZ9%q$qUYHGFvcq_Jgrdm_K?q7zR5;w+hjXa9`^6bR%CsOi5xS zYF(&Y4wfYW?UXF&LfQw|AcNSYQwG;JQQL9480HGDUwu3l}2f)Vlhg|>=~uFKnojG+E(BkDd(V| zDd;CMFxW;ckW)vAQYJ1OS}~q-K`o&>W3>DM9iVuP0Ye$!8n^H7O zNh$}@DuwDPJkVwZlfjcAi!h#p)GXCs$6L_b7$W-k9rZ)u3L~d`yvz0ig&()F_w^|e z2~*dyAVVt2T{#MDi!r!Dm?K_SitD`Or-1E^%vCkR8t+C9#p}Iptm|0Uz1n*6#n?QJ zuf{;oJ51fvHdDcr@1lE}If(8l8$l|~stO+U?KqU>ZW;rYZIh*ht@h_T$P6oPjvf>j zjIgwsfk(=gQQ}VQ7xe1ApP!F?DY$&NtKlw(^TQ2?%YZ9JkqhDS;X-hqfExoh67C{6 zlf0Yq+?}m5_=0HujkA)J-Ko*#uCW#`C_)a1e=XJ-T*GkLl1rs&wR&NwJ&nEOUA^Bs zfWAa&165e8)#KI*gt1TKK>t04t!{{209QV#tu7Gdhaex?1bt}kp+e`~e1gt z8@LZ;$+k{I2DfM&o%j=^=1hdsbT># zW%AnkcDc$ahJLeLWKzHE%$nGySI2PC?l z-Iyr@5XgagjKFj$T}XX%?!yeIp(j&s3np2NE8LtO!(=P+;GiiFPE!RZqVSOiv4lE- zTgQv)f3Er{>GQ?E)f4H(*;LTP<(s&KChf&62m*+2LMX5UttJf7r%>~w?pf^_;f65JsKW1YGI2IK$JTK6w(D=E!qEB)-@&$)b|x( zaMXyWKa)e9l2E57p&ne@__fno0u8}~3q@$-98?Lu;rV37qs&N_&kzv)Vj56%rD3E*R3&YewT^xYFE5g0Rp1#?WmR%O#jJiDRL z+Jax%V0JXkaLD{!54fYLG1$FOLf6-U^9T&0l-#F~ybqemSUaMbgjYiXwo+>_b}dmx znRfCtyjP}S`y)?sbU*@*BOMfh`#c?NHXI#6T))*)%l}&eol_85<{Y+(>TMB|6d2c2 z>E4`>p;C)3<%x=odJje%te<#Jr556}6r#subt!A-nI;qi8I*uIpfWBP02Ie41E3)B!`(0X#=rnN}uf;@KjEQsw1A{NcrxFyh3|%+HJQlfX#v z;TJR!s1`Aln#-wcr_NegvpK?)sPRCA5!G&PLSn{nV{<5g%^|)04mqiTZArbIK5PJY zQ-z@VG5aGl*7QVfW& z5U8#nUE^bC`exwGH&b5Gb60GpTp`f6Dnt-YlhlFDV)!hE&zcED{QF4;?WbPx*agzR zvn@US!OC+H494{@4@XWApf}y z>FIBR@vOe|)BRt8F|j`X57!=lCoMTpdr;Y0I3Ct7$o2@bJ%asTQM)YykC0tEk!O6k z{15IuUw@>u-)l!0ET#RE>BJ}rNdmjO`;@k-u22c*zs zgW-4T0VbC^o(2maho(pW@aL(|fv)q^$F;y+VZ3^jr+Y;V4!a1?clY*w(ZX{|eQAoO zUwfzH?GXuN;T`F{|58$Vc)#JdEQ<>{pgpYi`m%gXZ!gO~(ZWdQ_dj-UVE>fzzx+D} zO2Nwo$9G^ON@c4F*l>zttH~h%$coJSMnhp)5S>%R_GbR6|c>MJNk=_k58i zfoy8P$>(fUJ50+iiBVx3`?qtw@#TGK%rM@>7mRb*rD#~o ze9^ut|4}M`pUR)b7&!koUg^vK3gj;ZULggx4iV~7jx0>`svI+nudy6Sb(v|@q?bcc zQw@&P+Y5r^M_Xl}QEx()=CH#G&D~$E z;-ejVL_#jLtLLv#2Ex`uFKOsYOSzy0U2NR=kh|d&8~>r9YxvXn{zKW|3W9n^UXOkx z798Dl*{xF-pVYRg*s;oj-X$TuC+}P=c%u{2S#@}&)b#zkwf{8&dYQv|>-WdMnfV*$ za&iyUhazuf{+6dx@^)_T1?QGEWb7&YJj&4e>87k9x54(*mGR;s@deoVg*Go%0~@DK zkHsXp>5j(3_Z#u&Xv=BM!}udyaHXR+R_wsh7o;0G;__^dbPj>NyKfyx5&NqCTmK)@ zf85`c^hNc83SzrmlLXu!+?0$$*TWmS2^@Q~m<*W%?8jGmh zc*8CmzhD%P)lG`U-_+CeNy50lGK>87u9Rqx@F9%yFw;yZ#z4rhw^Dt=p! zoI1(J3L@lPeu`Z_fkpuY(sg~1raY36P7;SH0ZFQ18ie8~pcxxzQE@G2?_ro?8Z0>| zU0~xPU=AEjZ|9bRKz@oX3?^8FxIq!(76RY>gtr*ZK{nYy0$ik&GZ{%z@v6WKgm#4h z7axJ~@x(a2QQOEVh;FG~^08}$=FEjmXr?I?L>5%!;{p{{0B4i(;0;;PFmF(nj)k_E z*4-zhoyS2$;VcR&!dl9p`HnT(bjYn~5P-G=XefZT1869K%eT24t~qQDOf~s>OVgbh z`ld-ZTM6H(8IxH3D*Rw=c4x*U0oEkE+Ma|~RmR+=Ny_X5I4tx!OWJt=>&3_N9&-4u zgv*5c!xD$@09+f~PvO1>_tsK}Zx7s7xQ%e@;a-A!9`4t0iXPwaYc-#WK4zd=FR0<2 zFk4^;=Pi<+k$88A=S}_8$z5Z6^4`?XjXj0GOWb*Hnt{&fdlCn|TRU;& zb<4@EV_(U`@7Ol{o$AWlqr%*#Z}K*NNzF+aUA3o z{s>}^gI}Q0Ca@o_A4!`_1LPI|NE%)lOUldo5yJab19kQQ>uhsre+liOdEX$q!gDlw zQ}mmIw}17o(Ec2SC82)yB@Uv2sadrOBo!ko#l8f!!jkMuoL9I9qRj2D0knE((#6A# zSI$sa;u>+<vk`(OVe{pS{~m74e>chns%b8)vt-x(b~0Vf); zM#6}_=Q#Q|Cq9kJ7B7&7=$^owU1YUJR7#z;!8!2^BK#ZVxSk%S_Y-o|Md zqntOCs6-lMHIF+OKmWPZKi66xeNFAJQ8R?RT~!8nNAPEpAZ?F*-Qnq&n&d?sb! z1)L`KjHcq;6GCtwl*}YHpX67VN)LD5sSHpU|DtH5oFPXk2F7yLB8gZm;v%UP5BZXI zW^6i>gszDs3YAajyekW1%Dh+$ltkxp^L8?-Ss*)&rlGOe7l5lmu`)I@b`^hVqA6HG zcGj4}H4@NHh`00H1l24pfp<`E$9^Y|l^(~UqcDS_dOaLg9$NgEb{vOhpGDcs?DWJyKD(e&CuH? z&7q)Qo=gT3+XPr)b%4tx7YVjfy!r0NJD5tYSbS7QVP!*|FJqo1$z+FPX^;#fY(fG- zeH)GfCv=I=TGjw;nC;rRoWUwkeyg~G5t}>tT#=(|pqhf@$q9Rx4*{yVGDk}*^%R26 zZ>`LgHZ8Y}p~u{eH6nJNkO4NmuJ1K3iNP>ERe5G>ZfQc&?F7miBX1z461VWn`=gB6m>)j{<{w9Z(u z^`?k`I=MGNBv1g@)2taSo}pgyi@K`i4VN?K%Ensha2Yb0i!xrO#wB49mMX1!2iC_# z79b`IWD{%z*CaI6BwQLhiBY+vk%f-DyYY?#(q}YxK?fIq$RW zV7H+g>xV5<#nX5B@}Sy=Al;dA5lG%<9EQtlS9~gv8`OC^&be3poMtQFPK++^vqx}h zc$B`Q;cZzOAekb~ejbV){DSKblC)K6;1bhk=Q-wJhJ*hU?Nvk@XM!??`b zinC+<>AvVU5^ZbVPTo*@LVJ(-9#=8F&u&4fN5LqoD)kXx-WL5B)(v@EAhQgplJnjO z`R?4Roy6!0A_1*S+m4$;i}bxJroPMj>{b-PpI(ISOjUqgSOX#^{^xB~wR4`-VKmR> z+(TYgcS{@W@jm-HjPQ)ox2pvKtG<^zkiNV<-4}5aIwNmS9*_Lbb-Yfbk^r_u@7<>GNEYS*kkpOJy9%Bn=C-kn5 z*9Nk@vf7~2Yy)JYcY2@gPDjCJwn3+bg3i3|kKYEk1ndK=4K{t~Hc&XQ+Mp}B4c_|; z4*r4zjD^48;4k!mH1RJu__#Q5et_9g3Epx+VVy_x486_!>?WC}6Xx_}`10E1+<9JG z_eE-wZp+(5u0%~|WSmc%Vc+&ei#(lkqw`&&_ zObe{0l7fpp7-c~d7F5H~HKGy_3h%?0>QM^W7f`e=D|AA*+XmU5Y9qr6Fh(YU3xJK}_mlIsFoZN+NWv4+O$Z z<)P7{ix|eLwFn=HRi0_`TgDPDLi<^pB(FTRt@1@R2)AxnXXqQcJ(cG`l+qqAF+pLUj)Mawuj|betUL@bma*@!V*E^#&!zxzX#*H`Q}y|E=mL z?~?KS{0iw$OP`_ts7o1|8CX2J&pR~zGBlybfIiAHjvSYUcB6E#;4`e}Z<&86RiJ6CFAZqKnW4vgI6isi=d zafhQL^jjF*bBbSYk)T=ngQ&Fi?ZGVh=+hq*`lA9q=#!6r{XsePWq$O_$AJDNIprm% z1fpLGz;gbn#5*Wl^uZu(UdM0E@w@_4_qX9-zW%MVxRK(d-W56YaOA+l3GA#Mx=1Z+ zK(;+6qKnSz-*o9m;7z{+Nq#$`6=(GsZbUs_ysSauVUc*=cz(odb|vTM*%3K2RPyUt zGF}RsQqlttdrm|WIk>?#T3}5b7qR@iqFkO%jGP(fT|N@nwv;Z^{!{f26u#8{-q2;RO41SLZ+zz{{Jbx+2M&5riS&Uj)&Ag$X z%xeSGeBFB*H!d00kYH?JBp8Jhs?2?IPh_1-&1?Kn;X1jOA7srNg{)vv7GD1hIb*It z!Z0;Z_es5?Ct?JU89wM0epXt&;6UR=nCbl9<-HVoLH7o2ro+O)40m*fOaFcwnk9-& zcBn$(;rsHpfgk0}gf*sB`@a7e>?d&5U0t*05{NTjYQ`wn&%jy|1P75*Wzgj*V=F`M zSA`AJ?s(x%8&Hr-@Qvul^;Y)`(KldFV@ihUnh*J|OQkgS1nP8_qR-&sXSHViJ=Bsi z8vk!$h$-Vvh`_RDRT!V(VH3{66n&3?Y7WS6WW9U(;y2^>mi^Y$B4fZFo_iQDAdGJy zQj$96W2*~~rONMxo*jDhPespg5NH4$t!k7oMMrC%I$UNFI+F`Y<1-YkbDfV35n7j0 zJ4@ee6zlW9h2Q$3I;kOhh-OX25FgCbTMX6zU-+%N)mf82QB^-azcnf@c>ceY-}>ZX z8PNYv@>^jngp6vP_qVN*`*3UIQb(;BHrVPT=X~$|3fhgg zXEEW5`HRBQ8E40@uZNYv;SXo)%OsHvOP3-Fg_}@PTdqDe@Du-mcGe@EWqe#EwuHpC zP!rxk-t`r7i7?C>JdF>Y%`iXngz~}VQ!mJswTVMKp659MuV)yh9l1WmFo)dwcF#$K z`UT%$QDPUKSE*-sdUim8M%~Vfs4tjdI`C;VpWksqH)dI=*?j&$eQ-6F4E6Xl*T0oq z?C~KQgYwNGZ%mwT7vU}c$Na(W#X2nk7K<#m5i1W}0xk-nF#GV5U=}#`8a#7w1s9Xl zvLt0N*jm<)nHBsBw5&$S06ThoWU}p0s!YUoh$VG!6lJms-4=uC1U!ZCr35V}_3jMd z-YrIlM;MJ=rukKB$dFapitkkDD$$_A%Yq{qA6b}<+OF6ZGAsyFi@6uY$6Ky`8t;{0 zkg)@avrk~HRE;XEoT$FCLJU#x3v=+` zTiXSG0~LQ!QZD|n{LBu`L$p^J4F|96x=03KU{HMNWIZTduHj0v|77CWpqZ!bLQHCu zBIbOngc5+jff|Df%~qzxfkHDWM0!n1DLB(zaq0N1|CE|_fL9FbL8&GlRm@yy8+Tv_ z5;j((r*NZhY&I-tw8y9~g|ygDN0F|KFqc3Y6VbU%S4k3xI>rh+!X<5qOjfXB!N*w@6om) zz_Cl@shXlU{c=oSm4Ji{#oo_w%gjzNiAZu9j7;d5#lag=WKCG|RwVE{l>o`01%YK! zZ;}LJ3M?{?PPgGVfWPQy7J0ecTdZdZtTo_>$+e*%(iz1HWy_>9v{y_zgGj$;F6s_* z3xms5JE8u}3}lL>tp^CH9kB?#xDQxKm`#fvVAY~%vmESwo>6FlP(fi5d-{cXzKL-) zm`#$?!U4*vV+gW0TQuIl{s5@xHf@91ZP4J4y~JKFhG6C;UoMj7Jj(_z`rm!E%9w^|9B`K;6tvuI3Yh*Vj_dD2s$= zkfx$}s;O+M03yxSD3Z$6iPwjM{`=NR~;bt8hc;Obx#WCVOAS#z>|oK zP<|6^eU%HTVIX+IeVa0>QG-_O1_uZ)RR>ZxJUw7S%pz#JO~9IDY5x$^=w%jjDH{n9 zf^2QJ4q(7$1IvJ#B@PUcL76XqgP^r*8R-Yo>>qs=+Dh<{t zUTj5fW@Hn%eGp-!b^5cC*gAA6@j$F0l`NzZUnaA8cP5zBrA#0y==@g+zZvlue=|lk z_mLNATO!S2P~&~%PvCN3C29wBwV+zJ6?J5Pm~$I@9s+$NhXnL|fu^=u&zEt)2N|6h zwhsU@g%*M~Ynwnqi^vAXb_fqdBU7AoPm#KrbF`Xk!HE$x=z}t=g9HkQ79zjHj$H_o zYn=g&XQ}J)J#2BK+W|!u7Cgp2Z3oy`@Pc|5;cAjWFhTg1%W|RhV_V2j~rwkT46qBs< z6!DqNY6T7hSXqK!!>zJ1BG?T@WEIgjn3hnNPNgWdP60AqqAYRaOiv9(cyx zocY)sg={0HqPSGh!ICJ{8BixCL8{1Wb0q|)Uc3nBfn;E;O4|iy9vvjzv?#VkKdtRE zk$`q%_mGJKE6s6e@`ES{Q&#*S6rdFUi@qb!bzgD&FP>HoFOxVh7jr|%MQdR z3lLnG5?z2$>>qfIR9#G$8#F zBv@vm&`wu1D@J}wM*$G5O1;(|d)=%=F7}3S8yl_$7id(NP)EA8q}FUjS*{3xYw;PR z;ooGG3U+*MgMKF^CkUGuN>_K12M~+`LKMOr6 z;y2<2<1Jbnu*eT7kwU07;1+@snWJU+#(IQF;M z35(e4=mxzDw8t7cNLc~EtW4D81oK~%rdG^3DVd;&9feABOoFz7Ahr?d%w)3(s1?H1 zm|Qt%9=ZdAAMyIS18W5g31NQhCh!vxDYb;bHq;)p6n_JXqOu;+CFZ`~_ z8omp1M|!SxN9PwL-Wh^41vx4yP4SJ20W{gaBk@H&(fNh(XGC;_%f*(RqfWzek$T<< zmXMs`ZzvDFLtlgwaR6b$f2uli+=O$;zM&`AAoXI+6QnWsPX>dKkt6e z&-eG+@44}9k!b(9_Is{neg3!X_x$orsq3F;6U4r)_dK@}rz)LLmFRy^zvd-%kJX>3 zsvm#9=h}M(&;PgX_uT)wAm;zc{hk#gJ;~?EAkrbK zqwrZgH{-trS2j2&0)tF$60XJemQlX3cvJLxQO!`gZV()&(YdL6JoFv(0X zJv~#uD2Md;tBaIALILb+?5pv9?`9C|hBHgy<$aX4<&kd*^bp*_-Bh?Rd-0WKdxo$Tu{X}9hJCrY2!c=(~kppu1Xk)k*x>v_BKPU^4Zy%}>2 zALp1bwW(x8Z&Qh3C_X95+bhrQn9X?`PZ8`q;3-~S zm=p86V?j^T$Z=do7L|@a(G(nBe*nJ4dUwOy>c)(zk0!Rj+eN6 zsG1k*Cea!f>owhtYDH_Z*zOV7=n{M1xDawPgCf&nv4mR;TPluNuwYx4zIoe0TnXvF z1s1k_^}n;Cv4z$7l40MF`2p%4Xi0zkwoDvQ>U82D25!jumA(bnIlcFsGIB8UMHDL$8MR+!&~I8crrFbYwteRA&_?tp~W&+6)X$+Z(QJ>S#3OvYhRH= z>FtYcBQECn$db`fcRQ2IVp2Jh3IT49iK;5&B~;cL6DXu}9BUWEF{+7u_ zn9~Y%IofmLx*CJDM!$)J?sEVu^MKk6h8&9Edeq-%Ef1kpzesB|_8{SF`HsZWRpL z<+dy!kZeqXBH-Is?YdgEny6S z)>%^owZbBo{e8~NH_4*5|M&U-{?Fg%k^N?_XU?2+=FFKhXWG4E&(*;q>LhrE1TFBV z-!)Rj-PR*cOgKD3;ymuu$&*gnO(!Zib0ymLxmzDGmkoW8W$T0T&A#0Th2%*q4z30V z$>F?{2F8xdwugeO@WlF`wlU?Ba%vTV@%R<~33HjJ;ES9V&QR`=)Sa6hoc^|@IFw9I5CQ1l3ZJ}?Cq z9a`}=6-uz_Mh@}MaLlliT=L72ndGV2l!ApSyJ;w;H+P+w)cNFm3UC zF6f!b9;?OsxmgCenaNxs`~@IBt49?fY6bGx-iEh#rMn7an%Hkl@9Hsi6MJ?~eoPAw zaVpS%SlZfO)BQPP^44s^{f#lm*qk++RvcL?W18g8L;~*Ct7O@j^IbnGJUSB zp1xW=RG3)i?;m=s8#%RoKR?z*hd7DpKUQt>s@Z6d^?56Ni2WCvIt&7sg&G{0u-uRg zJ8L$t=vysgZK%kEE0aqt+rEQ59l_z2bS_qD>9ddHc0(VAC_dC~wdUkOa-c5(7doO> zp|B6FuzfJW{l5m6`~$sYZmi0LtEF=`jJ0Af7@uAp=s5z@Em|m#MlM=t-b93@b^JP! ze>?^oQ9&X|AmF}DjK*vBu`g`fl4zNdz4*J%>@=r!X|Hu#Z)RR^W^u1| z=^^X3Lz#JpGC08=Z;j9RG83#z9o+B36q{M>fSl6rana9{?(u{^T(Z_`lSZFqR!Tx$ z?z`XRLt1R$@}C?}A)?#g&^ClI7`5^UmmzE7vaP88XC6KsWE>EzoJ!tXVqJnTZS-L2 zHH2w0OjRtw51$0G#R~lJnbdALq`d&by?P%{_$RwVW@e0Ch3188^W7Cl-<}iGi48=4 zY77%>wTpbZQ>W?k(Ep!(65U`c&uW2M8?k0sn7g%A4s)?Vqdop2x-^bu&>Fu5tR6Me zqsEDMh@e)C>-9Y2Wo2cqLm#;B^5=e!gAWacoqgoO$x6e(mD9y7joQ^h&PPTBnT((X#Xoe zZa}2APpueX(rJU9FfF#}7CLHjn4@*|TfN#NsU}xbr56$WQg%>p6ddrrtSdr$E(3(< zvl4!tv!@EHHmj>+^5j(f17ly3HU$EP;nTyA=L)Lw)x}0Sh9hig5+vfVA_KI+Ku(2fc2bAA++P&+&94@N&}a9sOetcgY}fhuWPLSgV!q~HkV z6%0uzAHfhmWtALLBf$&a;55$PAGEV<($fa)3SngUMykt|T&WIV&*%nP9NPBwGP5MZ zmy_2~_C)2G-`um;m=*A(8F8F>Ip3Jw6m2dfuo&P-Q*x+NnC%nt;JgYsdi#OX;u7&; z=86ZGsJjk4oP{^k#5SqTJaedRa3LY&{1ODbfQ#1+F4A3rJUSNc)%bYRHkzUYdP@I?i2iQWPQzky~JICZ}#h+RKFP~iba)NVr{`bU()(I%_E_bmHFfnBMqc~#^1AwS<+T-c4qg9gku9Rxme|lq0FP2Fwbv9R zvIwTa7HW-^aH216ElP8?xlO(S*wIrP8P2~*w>HzJzc~*YJ~_xsh5N;k;XJ=i%C3EBu|uxTX9~)BWDLp zVuU`zTkm73AWhH`^_U{OC91NzIZmJL1$CWugHMFHESVz7juqb?QBP#yr5KG?>y<>$ zalXZTD*?NePU_s?&$rW65ZX2C5ZN?Q>2AFUv5mjLYWg^b0iKcX!*25V8s6UqP5GAd zN+qK-s?snm7+6AV=iC4d6|jW6fRLRG6Imxmb$XbWS5({Fs*?m+Fwsla^;+nPm@q!8 z?QcqL!4+gmBPgyC;RnwMWR9R8TaitvtODQF$da?E;mGcnBteix8CsP4S{GNGD|Jni zvTo!XVMQ~|*o_F)%L%s8$17#hX!VSuHe{xbHC$vkLc2IHuRSoW2k3$A#ofauBq1VA zj{Oki6}q$$q$|m|@=K#Wn4>e@(7#MWG$PvqWPAHx%}QpV$RCqg}KYY^s8&kk^VhJ{OL`~44} z1N?*(@$rD|j`lywPu=G^dJ!_&qOZJ*2(w|^Vb>a_6T$ld>*eBBz97F}<}R0RYK&c8 zmS#GkuY5l>2isqy*L*LWO?|ePIgbCwZn%-gfJPMC`D`~E3*D^O&GAouG>8?u<{WyL z;n>9WZwAG^K_N|3hwoo%6dpu}H~>QqC;ZU6&i0iWk*nM9(0>nLb&_s-{~f9pWo8@c zYzK}v`gGT2+J0E6)ejE&u{NhaDNW${`I@^;cDCtWkNb|Td?46#WTp<~V4|z6jYMed z4!+FoF@43i-CKUHJRDxCV**S3#fnspR;$DDxT=$Dw)i*_RdKB=z1x%S_N2RXD9ozV zAK;~0VwPNT%Sl}A+Zd!xQCr)+gU&r}`pQe({o6|)_S}4&bx?yIJd$;t6j8_S?mzNEZo%gSaD}|dTB5hTC>byb>)Wf`t#zGz&)Cg z9z<$@KFrY*g?)2^b)Hqi>(6oJ-t5G?Q@b)i^yMFvAK=L3G&s&{4VsNnt1dGTvrF6R z)JV=O{z-jr_dpqLU!8*);U`6hhxR9rvD}o-45RSu)JKaJcGro)wPb;f8*?6UOWf#t zUTr3~W-+p9gqYpSxIDoRAOrv6K$CbmHHn$B`O4;-o6FS)KbI#Pyfv$31eZ!&VP9yv zlVNt}hJ+L9TLF8XQUmP*(@Lx$Mq|I_uGzwrUS~-FJij%bu)jD8q`Aqvg;ShB(i7S_ zdQ19+z92s)mmkbILkCB1+5dX*AXX=14;wj_mDy zn5x>gq~vmNkA`f0@{88CIn)?$376>4Gv$Z}Ce=Rz81h8a=pQ3F@WEIG&ti(zNvZW9 z)zdv)V-LIkbVmyV$xdByh=^Va&{N02P&2LPIWub8uO>J)PMn~=+wo3Djj);!#gT+(Z&3c*|f6n{D;57Y%<_;N-# zg6G68$pi0hy<5&2c-e`Zq0J>>wZRZp0l~Vh>nfUJ>PM9&CA@EcI{(UIr*`sXZI3}z zAY>;(A`xgj+;rv6MaFM;rE9zD2QkEbs=HyX}gc<_Xhl2ZYMx952leplVI z^js3$D~-fK@ah>-mxkP}Z;8!>m!nW2EwM(jeooE0o|GT5l$ML(mgc`J|-0 zyZ%@&xjt)TcF7%wfbB}nRr(zE3M|Ii`ci$ZYaYamU0w^K4g^s|?e*J0i!^2IfJY!? zYjAcNZwx*m{=ES@yD~IMn7RX|j;Lp-qUDym^*tz(-aM?5b>w`6RMR<2#<3oFVpdt0 z+=ejkguJA^36g>~(A8b4Nm=3@&g&yUT?6cr8f=TD+<^3T6<0duaNcxx1?52DJj9uZ zi9x{QwQfBW>PR^e4n21=dUUcaLp!5Gw?)E@YDJ^&hdWsA$B=(DyMudUkyupqM4WOH zq1u|>TO-pvo?DC?YgP|kAKHA=g|`lzfLGluUjQ2Ktn$5~y*Hh~r@SXn9TaLA4>GH* zjiXD&4yECSB>)7f_VtAw2O8lpQ3`Q4k_xAWwdrA@30n%QzmPg)q_~J6j$k z3|pgkjVY{ly(n)g1)%2>$@j!&S+b-|jgWOb4_RxHN|yBrhOSI^ACl?J_-KVDt|V=q z_yNpA&x3str&%Y-Y==pZA3*!K|OLuX)133tTklD^<2-svQm~% zsTfsz;BQT{$t!d2=F+ITK2P4ssMOO!H`Lv7K@4s9!>>qT!Bma(kccQxp5&9BSUeh4 zo2sRRgoKgzU@E4EdY5#85K%j1e7?}ZyZS zXqE0ODJ2{_>IMrH3cfH_>MWvOu&SLFZNJR3uhTIWqlEy$Elk;ytY z8dHN%>1?UBlEMje_=;F#_cT2a^%}Kk7!i1PGr76r5@^2_#Iaai%!rU--K8(0CZdtJ zdh%SUqecIDlBL(Yv6i{t+Fa78D$LNpmS3j7$0Mbng$sYgM~jGW??BRX=UupmKPF*- zB%GS=oojwN-gnN{4j??5Vgauv#v6va$_xLe<#L`?XTG{d;9 zf0RlllmUB2sA~j*_KG}ZE|opWs92P3)uFRA2-4y0Qm4!4AIH(-;|xIb%WGIUn1-H4 z$!8K{k?djz%*J3QswG7hxxnQ6Rvaksv|sb|`6~|Wp)JkDew(Qe7^e2yOuagN0H$8u zkls~Rhg%`z^0$0VI)k>ou}D1Ls74ff+9b?M5xpL1R>(H=ZGAU%P_uS*Ozj&ZAlt0{ z6DeJ2%9?YiF%nj5^Hl9_y@Pzs+B;!w37#y!iQN0{RsHjn#? zJTBA=kN+q?p_<2Eu-@GIZu({6aeslwS5uNsz1b{Vbf;c3^AUA#Rr`F$_%0OU+Nsa>M1>o>6(01A+!XYS1d~)?H1>{J6=e zazED1Q$l=Ib7M8EE}I~a8oDG$x_>~po}Ga8a{8?=2IUbMZa<~Fc?h=*B>HgQd|tb6 z%A}HcaU`6b=ZLBb+=XpUnsA*>dG6NP(wH0%LOm4rHzI#9IR1iUO`Go4pp;lradAS8 z0F9Vr)DWZX0uQe=x?6`(K;V*K_!O)&;%`_iq5ccH2it9{mz*qUqz`XnED>%lQPcOz z#$T_u`Z;qBzy(xFd8AaNF$&Fo>)HYkKL@oG@S^zq*=;xKZoNlRWe0Q#z+cWTh^jHD z0LlChvg{6;P2C1mmzIm41IUulo|Y*`cNa&AKc(26nDZ#$izOl$IUXpsHHOdWp~FkW z%GN-)wb`k|`|jU=z*6qVdS<&YbrpZMPf3($S$+YQ0q!Uv93;5b~$*7MVC-`3u&l z_TyLj%Rod$UHJ>4?wj7HEkCqeFNUIl*(Ku-VTs#g_GWV&Gpvrx9JKsp@7Z(1^P5zt zi~}V4y1`zu8e47l4DpXEPESB|{5pBj_(okWFIB2Rj?GT}Maq1=Z4rwgN>@?@eI=US z7cMv=rv2KmIyhdFH$R{UkwHWB470~d4vwqCECBGibRSUxpY8ysVf(eD%FcUa*XIG_4eNHS07!gg9h3C&Es*brX#3K zZwt$xw?@^qUsBe$a(MYmVDp0oTE_;J!;ZGO#q~BfuD7|1G(Q*iF52JPLx1YtNoIc< zNYwPT*Ngeb`AY}?dXpzL?SUrqJD3zQ?}TsVcQE+S$#H{l_#{WD+kLlwxo)sE7~$z| z^&^2;x>I6W57cbg{{gm=KwRw@q%juKkvUQli_|ZY(W?=OWRxZ`IRsc6p%3`%6GK+^ zZdjf&2(C<4x_f70W<;~zA-!b2r6u?uI6*!^%cmAg;5`H)NFA-w$tj| zzdzKS{94j(@#GU}5wV<{Q*1^1vA#3{1s|)>T86tuSu?@XnrBzwY zyICPXIaFm3uQ7-Z7{u)qtHl~C18L6FuDkU^DcXM^EyWH**7O_5zb+^YL=<5BJi2QTmVP`%j+C^KM2rtUwQHR8@LJc^RVjsYXF=g%&H_;l`xrrrW$UEM5<)p572teA?%9=_@xMyU2( zsP{KN;5!OZg=b5&f#H;G-8?-vdpZ3IAh`P6>F z+p^dOD1km3Qy-mTlYzVS3E>s?5!w!5whJ@+v?X9NmVkSo|fp|J#{rL;XX7$y<1 zcMLx%HrUS?u!aRri~$b=@T~r(fXgujoIP0MTF`MOts*X@@OSi$`e>utl@}4I8YqV4 zDCM`6UV+Wm%kGPhl(pui0B_8*Fw5Ve8^QS5jKtTqt}N zkct6B+Dkv*$K11Sa&EA-d<|TVO+XB{d5X}+07H%)kUdp}xr_-wQ@3H0!oL8{Qn$pP zJ}{P`uW({pTuPVCIaHGA9v0{eQrY~ zQfSvt_nI<1a`QP2IqimeDb&x|7bqEk9RCb_NZ{#|^>N@s(k-85d`jb;V$v#qNZN3J zw`0aB9sOHaRr1H9ntaGbF&aF%InZ3!G_@8}vZv{vwB0>Ga-gyjwX#YJmQ|A6zb!$U z!1D;FqJ7Cz_*2rC9EMki``P8*nxOKKe zPrqBL>L?>CNZ%q+?aEC4QQFcyMxUeo8r{AdJAPRTrSO%rbYoV%=a;3)p>eg&{9f3( z{Ke(nvI8s0)O+mvR}P%)N^w5G@d3vJ?zr?HLz7$|YzoUfdR1TW2u??At~k>f-6RUE z$(hvrRV4j4vDLErgX8WxJ<&YjM{EybgJg<9cFhGcbC0fOcW9BbWeJv_aWo|-1x~r3 zE_ILUb|u|Pr|VLcpXtK`h%MFa9x;&OH1t3@GmzPffH2hSntuQ*(g4~c<^UEB{cQRj@vzVeqGCLY7t4oh(k+n{SrTN1d zzmOe9NsGU!p)dnCHQ&Yzxbtx7V+5xVL(<WN9t-xST~Hc!$uA1l_hhM`C_MsXkPI9S%Uqvf<%0tXAOV_Az`*6Eo_ZW?5G#_={e zmFGx)R_ZM_9^OR@thi%-`t9fhv;`{I&ow!$}DsW-UMH=IdQh_j;982&1S*TlU#keJ;@x; zocNhZUelIG(}K=eyt`hLba%a2Cra>GF@K!;k7g(p;oHpkg-0`EgMo|bC`}HFs|n_3 z&FX~Hc%Z1dzhi^_w^GF!QEflisQP zA15y1$V72aa%HCA)nIjMYBlm));IP@O-!=~CmT+OTvn4S&R?%}Iu9emoYy$48$CRM zVqN2eTdiy0S(o-6@n(2ObFsV`=*vJ^pWxf}Zdv-B()8P_R);>4;QgM|6-UXauZ}Zfu`?C;4Dk*~ z8{*xEvCxzA2qAsh{rV4$COVP|g8FZ$_2@)b`nEash z7cDfN3C~E`TFdnLH7Oo zy&Xr&t@o{sb3j)}O93{c8_6s$Ut^8z=q+3E7K6g!Wk!0#p-GnGj*hp=x2oy70uMN* zHrp#lVf_&PKooP~ns+9nP6fz59`RgH2a z!!~I5xe4~@_+)^19|ZWp6A6HtSqQmEPF*|7I|Pzo{(utNGWFbnBx+PH^h9pBy@&UbOpDhc53D zaP$i6vXXe@Tzu!D&0Lt>#6jFlGF&pZ_7T) zjmXnBe>J|L@~Mvj+^-LX)+dMBz%6K)-!PRih`z{(66$L_iNrdR z?)J`NLsjn#Bus%z2wxca_nE3bpv@jrsb-`0iCTd`<~ivt&_qSyTL>^{FOc8=9@H+x)(q*5zE754-^>$FHVF`nMeiHKro! z=VJf_@q*WOvYv(z_QzN^dlS}S{IQX$i)dAkHtKCu2LgJunQOh7oBh@lpEXO|!Ceb8 z-WB|+TacOJW8H2N&BIK@SDIGPH5lK+5jya*Nvm6!nNp#bcR0mrsG!3EGeCAH7u4f3 z6PYlt=mu~cCtTvh_Rx`=zkp+6a6ghcxRDu3zwI_F(wOX=QdZZIJh}TPjv-2{Kh)7{ z=0-=ZbmolI-!r!b7IoLj31>+jpZ57fy+)#vD)p6u&o|_A4%6ugt#`KxyiND#2cY*k z>W&k^5t^2(t$7cFj)f^%$F4i zF^v??T*PZKbDS9htWiKGS#v!2_Oex}%gpg)>Rq`Yg2`cx$_?As;pWhQ9{Od zR!4f5dlJD!vX151iFdU1r7D`v$ivG~Z?d_(yS`E&P`5AEWUd88v)C^s{#rd&BVNd= z4_MtStOe>e`UTFI*Wv%p#2d$Y?FcddVN9+V($knPH@I6*rR}Wuw=%%;56eF(f1Nes zCR_?9mhIn(TlPiC0a|KIa%T=w1n0thPK%?MwM%C?3t7%$);gW#DrC8eS-&DH-6>Z~ za(6?NS6IhcuLrl&>6j!ZY%_rFZt?Y$&4x)|=&&VzpXkabHkdmR zOxcgyHndz|9Y?#FQ7z}ts(i&AE#qiQe>!m!Ot|!?i})J}``(MLu2<@3O9Q!B4guoh|FVtY-E8 z*UGoCLCH@1o`mF-9f~=P&bO>P?Fx2hy-$P_jS&P)H9N9O^<8eskT=!Zj`4;g6H&sg zb(9KrkzWyxMH)$(s=h+GtZP1-$Sc!p1KFugb~aA;onof#t7!YHtIWgDs%gn*y&Bwx z>q8`}7R!#3qfJs9tZl(pIM46-o=m7g0D(V(U17}W_@|qa<8?{EqT8(F_l@D)8KeXl zwjAeFM-q+rZk{4#DMLyF4qq=tVvSkX?>QA6LI%zU1q16uzVu!@cP`}vl$R6RY6IIF zvfYwcs?rLFLco^w{+=0GtHWeerjIz>Z4U^ryw4|chMwp5a@}lPB?ae0G*6 z63te%QCvK@FD}o;)cZfzGn?~EFFI~iw(7fffvM#=7S6*=Ql1>d)rLv_Bb6v02BJD7 zNY-%yzb2;FcyQ9w({P_|)z>o(2+~KKM}v5`0at@~hxzUYV&F3%9)74lh#~<07a*>u zQW3;J0YseW42Zwbt@?U?Vjz$?MbKm?c5>`mkvb(| zD(u+i5F~_|tva4K;fMRvG|W+8B-zPSOIvZl-A~%0RvV+3|F579 zg(O|O{?%F%$$EU&@l+(nk^UsIC2KnuJ?N_ZL(B10cH&dzouSUmpqqzsMLI24dIlvw z&U0#ZM#(n^mw8SZQs#Nu{wv?||GW0@Gx=U6I;i@?$xhCQujBkVeb|{;dM1#IYypMB zA5}8sigG2x=hUxJy^4Ve;Xzjj9q|yZ0)6m%G}x7OJr<5f#5_;|+H2JkSzQ>f42Hyj z)fq%AJQ9vZ8sV$)bS_@j67f8&!sd0;YLN`C83p0+DrFE36NhWzP$4a8F%U;OsLMt0 zAX!MAXuT5LiuXv5@P~j(`gqOSaX4O`YebazeTZYnR2ft_+6ccs(wLJo7dbT*XO!_W zfJRl87im&{U9dAu5x~y6e%TmNf7g1c2nio7#7Q*u#4B7w*U06Lh*~3CG>M7~=hO03 zAmiseB+{?K>Sv}tdE>!&_Tn>3QmJg1VXs6=gSdeD#Sb9}!`HaaMb!7?H}og~W~ZJ> zh^Ig_lJ16c?f?tf~W4II^KzCm!63<2Mt=8{-MnB|g$nj|^v(rd@xA6&!D(XP#h zLmzSPhzUlZMS)Y6C{OSWL3CyCW5YwW(Rj@84*q`902nIYUA{$NPOtR`Un+l33}l>QKaQ(*ME5Vlv99bPJ@6NYdX+(QN&Fb>OcS_cX?_gX6S z{?dV=+>#-o_m|~xoUX|Iomw7hX>JO>Av82T_%S#Tcj@KGj$A;GiKBM1Dh#qr3GvW* zQ{SER!mp_emGBuoSGnH-Zc zPAy?H+xIjeLoZ(ZuVEVwD$3aSc0dYmo!0^@g_dugl%~ zCC(>8%H4Vye?`@-%6fxwDAT6~%hg_x!?p-liyok=!umSVZ6G7(`8m zUMc3DgI0tPX~DxN&Z!0zsMHj6aJ{j_Whn1uRIRkZkfpd)yRnHjzyym`q|6!~);Dni z-`9&kqWha#zCV(Nd2 zDfWa{&CsXOja%PUw=zN*-A<{ntSPi-*_B)-%(}iUyWFg)s-?PQX;$RVt@N64(w8Xnvkvz$@9^SL&pzAeHP5{4mgDeHMqs9yI0Q}pY^ z|M{H^_}_K%s1X)+C%F)l?FI4uoZ$Za4;$yn`2wrVEBKasPfp-uRZzDB8C>>PW~V{RepXp;WW zk)?uc6in-g*2V)OnVBP>wj1jxtZn<2jbIlQj;UL|tvN{6Us2)%)^JqBm|A3#xsjHc z`b>%YZrQB>R3Ll#GtTrnBARJ~wXPs@8#$DneModmb<;O>ds1=Ap_W^OSv4?atOhZ4 zNiny)<yWuZ!~eLr$^IoJ9rQ6h&*%J`)1~s-r~3j)pW@WU_R0=du(0#a^{Z_v{UJ-$6qh? zqz0_o^lGUm5s&w6VnUAIY|;_!%Plg~ei-r&u90@7wKA-Oj6fTm8)<+}pI!HV+v!pL zf%dq%tk9wO9zwxB?5(jLOx`E>!iWf~ZXe z)E=O%?+JAX7~ogS9Ge^aX@S;!+@eswI?o2d5E>4j;=n|QPw0`OmG;|S3q9Gi6jyum zo_U&-q@u{Dh#{q$P3`{==-1{AKwVbo&?Y4bHgK5{Re4gf>HBj?Ns|=ti(cxq}i9V2&_A#ci$YumBxJIF3g=eSY~XJu|$E=J(%n{UPNcnf}c2rEhmPV&4ffA#r1 zR_JMt=9x{up+?QVtZN;bMM*^6Gq_;!Lr3(aMmNvaMes(rhDJ{^jfw@0L-T1a>s25b z*fr?PY@(F*z=xx&ta@_PTHu&<+uY~G@FO=XUbY#DW24uQ5pSfo7c&% zAS$=0JpAuu)_m+5)b%?s$JExX+B*A7p8fAz&#(IO)mLBLabTdex%rlk_r{h#zyEy> z=dCs6n>*B4J=W}Xp0ZUF?tW+d{@t5Dk?=la%Qt7e-xV)}MsQYIC(jWqNtC(2DV7g02&ng*F?-{ZZ&_omat7LGk`y=dJ-mdcMt|_JBC#$zvJQrwCxsW`!e~q=p8khdN8mWyk6M0~B$2Q-d zCyyq`qwGpea~w=^3a}1R5;3O-oy0?8?dyiQ7%7Bu92_??s(xfjnKNg^E(eU_$RJ;N znzi4*7-8&(-dN4v<(Ya$bfa>5-5<9g-$U2@BheJXVm;+Ca;X)nw{C5%>AgX?X zK%j40I&Q+*sb`|P@*oy7#~2=hgD_k=*cf?i*+kMkDuTI)ZC(y#tl)Lu>k4Hzcdw&u*BK^*+a)#KGAm zkxi-NHBZLXv50ckz83Ay?5XLK8m${ra;huC;J7R9Y6;-7u{wM4ibE}=5qIRI$Z$Yh{b_3{j?#bmLuvkQzh2#^a;rql70q!q7}Y|Hnz-Vc zBb&=!we6`=c90)$l+cN^e8aZLTHrG>iO zQIz~mwR;?k zyJszaj^Wztm|j{WHgj>=65;~@eP%4%J|~6+bRjH3vcM5v0mO5EV3^r|Lv{Q_0&n2X z9m8T*`LvmD-Gc}gTs@-V>k%tolf9Hfz&MXBtayh@Dfo2EO25!Mg`1A6`e=h|Z(rw6 z({{!!3rj%VScafyH!k4?PHD>IGg%&&iTqo{VIRc+OCM9v71o?Yr0>{W$Qo^YV&l>5 zXjDzpDTxt=l5Kslc(P8N*C4XfneJuf=%C$nUs)>3?Cfrton@;le)=ORLXu7RblbBJ@hb0Frzxb>^@&Boa#Nuj|mhGa)$Ocu*VNySI9O>geTsb&{tihU)wah?X zwClg*eRh6J6`mfjB=h^Z`DJQAzkDZfIKmOALXJc~)dTe%;*YXA@yw4;E@ON4%<2Gk zR^&UNdatB{))?Jw*P%jTW|k%TzxYh3bGMp(f+KyTR9{Bo+F4j#r-ioM;IwHrJLd=% z^;7jCFB8zVnl`iX!;J~$DJK3}5*LKeZ|$OW^q7iu9f}Q zzCXzD!Kl0SpVXv)qflU^6nLdr-~|dWO0Qgz@g~Pnc6(mL5yG53E~HoNG4(B(hR!DG zSCclb#J5AeQ!m%6w~>LJY;_oIb6-4a1Db5=-$hiVid}rbR2)?{^%v8{iJ$7?t@-`C zXp$=o27;S41Zzw-b^GhAbeo^wQiVshprtNbQ^k;o67YrR$p1O>K$BHF08%d zUXh9-^vm&5<$7IamctrKA&KIQ0|QPW)iG-j%9I4hswx@!9{OPBnnRWd@F}6~OWtYQ zvH%wWh}DGWA&OWb$dkzUS^usn1Hm}R} z?c(rRbsQd$oq9%TF^G~xMEW&sWKb`@T6}e`_y^1L^626LbJ81k)x*5RE_ym3R6HE- zwDOmNZ?^60cC?dFVlC5e=cLBWy{#$hIy>uFmA$nz>uR^g;|`RWzzFB0KFZCWd)rLO za-A*jc2s1iw#(f`4+~F)^+I~}A!~&7$<{rn(nDXy?Zw)NGZ>ONqYK~}Gy{W>9OigZ zFUeYEy@c)dlll78(Jz`h;xBvM>7{5*O`m zz$XYN;^4OIy5x)X|2riy1cJ>_4{t zKTy-3C#t=3UqH)u666Y3M4=}p&4Y90jN8t(M&KQpt!)?IR06})>>es{bOS@zaSRqw z9}L3a_&%}mnB>$>!H?8Fx;r~w)7R-wYf5;O?Pj46C8H$eH13c1=w8m4H46{Y((2OA znEL&TeSOacC>Gosw>Czj?ENdZ{$2g~kdQy3zF0e9ea$iVwjfTd&|J)_T@{b0GnO;J zP1aENV=N4=;D;H^2>SN7W+@lhR_^*3<)JNhzgGO@@{KXs5j$izs0Ff0w(2l z0!wK95)N|f9hwZN^(p)_DEu*3Cy3UQho5WU8&Uy;;NHzpxb6ErRGh(=8NsR5Two@6 z;plK-NFVCO!pR6(htR1zxnWO`mSNWL(59P52GSiur3Jo-aIPUJ1K*Q zu1?1vE9-6NnWy&{l>QF(k~uIvab*b?iRv8FsUqR@<>A&eNM&Gm-CAPUj zJ-YvJL4)--i6ex`nbdqWIzSx{o}}eM(ZbGz-U1;Ak7zmQg8Y*1uo|NQ&=(^)^N0RO zCW6HvJ6Tg2*KbH=%fI<~fz|w7&B@`)5oelGOVXlM@rm$Qa)y05$9@GgQ zIF(?MuPG#tHFbSWzc0+hwM2s~SAQVT2s44RC9FHhM#v(o^V8Y{_G39q(AG1nl#Whk zZGa6VpoPbp;ex0HXgd9uJ`s}U%GmmWSK~OU>Ec=fmX@o@rcarLemtpFtAyrXarc~R zX7fT3T_A?=zv_7epU4eq*__|uR%lck_G)2ud%vFhG^>85>u$n_X~O%gJh0>4O5YPq z-{*>Q3XY?CY<_z1(SvXeyQw9^m>h007>JT%q(8J>xu|X^{o3ZM7;D^gXiUcaM$7(K z2JB5pe+{O;NsQG?pZ>ND(c~aB%y1+(fc^{J-!Er}{knfdJ6H+%{k!g84eRlKPWQII zFsn{Nt3;{rQT+S(zJcv+TNA4@ER3CKjom~tztyALZs zW}tC#)I&~rRLZ2*JKU{u>I+%>5J?j7gJHqDAM4XFM?$#_du8gKI?vs@6I4TU6_i6N z2KcNrpMG$rPikjq4`CW|xBgBF%Yiw(J`7U`2ULyf8dh7gWJc6sChF8a_I2sr>)dT= zDc(7Y_D)dWX0Z7d_iIm7T1@>R_ob%kvhUD@{ne)B)L_1^o~sd_n`XrWu*a#^9A=a0 z8OUXBm=!LEVf%2V5RMMm2o#>>(Yk^70YYTy$AqYafhH4B_##9QivXoThSH~WMM1Yc z|Jz2^dh?t2{{CeI9So?|Gbqp4(?%T`q@UsQqQ69CV+sZL)$CL6vtmcpcvPe)R-J18 zTB>FT8bT2|*&=t#|Q_yNo)$ zpar<6-~o0*{%7(7ar`>?F9Vv(2JJFx?dvQ}o~bw6sS(5-+BL{>wK>1Qi!DeMe8vV@ zC7((w*cC8ZfpcHC2~B7YdxnUx+y6RhoyXq5i^^QHgL|%b7ZyxFOQ>b}pMb`B$`zji z?K!FmXs3W5=9vWvM&|^hA2jaA08zlyUDI811SJRJSh^|a#WA;xzd)$#I%FW$Y|&nb zvrkjAORT}Ctl!sBmh2BQCZliyMBO0=R?MMCBP#U;b_|CtWnZG`IT?aTFLji1vubup zdO~SxkU_;Ts6`uJa}EguAnIDNDx?4||JQS-DY$YxzMImZH zvvjwPAUUSa-o#m$S`0MCfOdoZRjIC$FKfG6p#S!&n4NR6n#C8UODM2PB*c8v9pWT4 zT0JbI^t#91XAyr zV#a1W0|;35d!ENREUI48hu~V4KS90?IEb%AIB7ab_l{b60$UsA6BM1P*9~2M1?6)~ z#V#6GUC%-L_&uTpGLuS&wb4VnTsp-GoJcIcTW_O&$*KA{So>MvZXsS5f|YnAqFpXz z;HMf`t2B|O1ZkDlCdT=wmc+XIGP{TbO1xDc@?-SI+vz>VB_c+sp&FWNL_%V$b_RhLlOy6f%v1|711*a(`Fm3Brk zbAhSp(|YoRc@Bc^cqW`skTMe)42>p`eB;&cbT!@KII5+WfwW=R^u~*pu&txdYJgkIdP5us83PZD!$r5rGg7dIvA7X?sX7Tk#^qulm$w;cmDP!eo~RZM$V zIAh9>Od;_oY(bm|fS+_oLwZKOE)Ahk(pY8i^;tL%91puC)Slvu{5M6&SoW?^zhpM5 zbBbV!Upu|nOzJCURGADB5#$T1#UH_@C%0t63anrLo}Zy&=)o`o7}HUNPTvxO3be6r zJT5--ieSAcT#e9U2YXYIm*jdw(`~eF2=WF^^&d_%d~v^I%Br7xixYU;Wn5Emw~12Sm^bv%E*PLl*I$QbTWuTX0>JxZtzW<4am5TZ1I*c1VsP=KN4P z)r*=;B`JQrxz$vDhjbWMGYegOLE?H@y}2_JiQG16%GNB`Q}1tjmq@+j92j9+;aA-h z0}=4F-3WGZ9B|`SrLNTd2v?6m6+b~}k~QL@XKf_tlPGQY0X>1RY6F)t*IJ16Gnd_C z?kC;*A^3;OpuzDqtHrxt+#reX$~GvWR>?&0+piv#FDB#Xc1o4{flg8CJNoZ-b(ft} ztM1?{y;irQFUVFQa#(z!lL2bfpKKoR7gu&U$i42M>@^cIU3!1Wk(0@p3MGaciD!mdH}bnIs4tscmOkT-qypEmU6( ziu;Ueceeyn)$!ontu1_pRbZ8X;kd8__XPJhbl^&{?cnSpD~#BI*(RcQ$JMC(oTnDB ztW3dnImS@Uar9psVTS*5zqF+(r;(MIl(+NFPVUw^QfOrp>YkRE$v+_?N6NJSRu!s^ zmIa*g(qW_eS-xoMYHOPAa4ed;(5dMW{rXGA9tB=fZY=h=QAR*xG-doFg%Y2nS1loA zU9Kti{E!qz*#^WDSKA;isT2>bBli`+TS6g$_~~M|*N~JOC%XQ&V!2C5l;HT^E|!}l z?Q6`oJ&Kg>Ss|;S!SpSB#?|*Y{nKvo+`_c-ojRLvW9mgM3^hS~BGs5~9^6nr zd!PWA#EQ&}ntC)9aYrLb>+zjHp)qB=45GuOc#0Nm{$I4P;O+6p=e4PDW z`Az|EH&G?mB1_Q%UDm;EINgUxEnjmPrSH{P*4!X>UUOk7eKyFJ&HXihEHou@pEktx zTK%LbY30bBeY0E#VzWVTHu~4QaLwLg{F2eg=HQv{7Dl4?CiDO$iw9;k0#2OLSs8u% zUt^a=lDqAm!%#>E%Y$4Gkqtv_7-b<*Bwu|ONd&9ts5hIH`#Q67UnQMdlNps(q-(7Y z5k>#ZlgiQno%%WYXxCCj_)P-r`o%jtmk=WyzvRxDh&q2G7gE#}`uu`1Y5S%rd1jML zXj7f&(9fT$M>jq$SU{ zoHLTX8A%<%Ebo32Y3vK*O3sb22C)i{wCcpU$2<_x81CClmR44Zt+BrQ0&@TLpMy$> zi5K7-*PFfzC5oXSn*Y5^jzR7^A={E3iF0>hBiwJ&_$cZ5v81(=ZPE~WB|UdZnkczT zhDco+E6IKB!ZjemB(VK0$u(biPay&KmXh417cML$h=WR5V}bpxhc1Z`x$fn@U~kR7nhh%sNb1t_t*Ndmoanmt zKOvQQD&&>{ob=~*rMt>P`)_&G?&}-HzCHo@xo@#Y|8-FS{)4ohuYq=^vev-edM6kZ z4yxH5Rdrw?s@fTK6dmCX{kK=$&R=m4^@w}uMN-_1THaULS>WtbCF3qV{^rsd+(A=i zMPMYffG`trr-@|wh~{A}%=Uma**J84r@+?QzqGYtqJ}SZtZe^PQ5HQ*g03Q|`bnFr>VUWVD|JGu&+ zz>D6_S2@-ih$uU&@OuEWmV1#A3jqL+%(!g+{Q2IKqr^maOyTFC-2Enijo?8&saFMu zJk^ICxTNRr0x23u4fdu#q7%hbIg_DHqM|Q9DcP+@Q&)ls_~B~;pC+zvNf851jIi1X zHCf{nG$(JD_4&WQZKEZ5t&KjU%W!!VCsP}aa^MM;v%p_N0WP9bY38oHx zHj2{QL&meZ^eHK7u%UMXU|@7ZN=~SJV4y6I zfn;!cPpU6JijO3w1SJ?rnI6gXo_S;}<4jU3zVb-d+`s7bkV#|k&k(jBV}CwZlS-N{ z>3M^Hpm#e{uPd@9RSM8Ot99n7cBWoqbf&B^Jt8v_%4uin^+spPdeifDote`%Oh<9; zsnl!Fb-cG@=M)y9O1%i7+B{|F6jq~3y&8>As0Zzw!m?DUm!&bhzhQDdZ++s%q$9M> zefK^Q-N)&(3wcb1sj5bF*W&j*UGu3HQC5+J|3)EL)CjgEZ-w6A>S%dG^2_j-L@16n z^VUyaR2YobTkn!4FR!S=KisXZLa7l~ad&GAZd4NJxL-RqMSvYJxsVjmpogNp)u&J z8affCzk4KU;9>Cgf)Ei)hO9N?ij%UB!ZI}7J63nLSiO4Vz|oz%bvwD~7H#<(W==`; z4Y36@yXJRxv&p&C_v^<~+^x3$%5zo{AbsNoDWjKGagO+$mYQhkwn9q-W+xN5)eNr| zeeeXUv>|zRLn=Y@)e&S>U&ILCyyxTzQT6mwR03(x4hs<1mM+thLe6(&t-^+tfmz5ULBjTFqmyhWju%^K zS!%?D8(b;z4%4ct&h2lUdT7_5hKYuKYLkzPIL#&910+EJQIpOtBmOME@U;B`-)XUC zty(Er@wY^tp}*b7FC8JpWi4=owlDJ`#KkhSU_JqFb&o67N{vozEq~TQvJ+}B13-ZP zm}Fsy_fta?Y8s=IG3-sK3+zvA_!3zmOQD?Wa5$TFjMk6Rc+ATRC^Qqb7|{E}63V0x zI#OP7PM22)-@aOIoH~1SPu!XI%2rD54*%l6O@@Tgk-P8%vygV~+NgT-=YX~zKxSyz zx9$pU&$>!dgiIT3&2?%AQ}dYXx?dG&HbWzv{7KUi1wv`l=b17aM_2h)zDn}4{>87= zXz+2UH5})i;Gh1_949cnL6` zWbwR9BRZm%YyPz(P1^Hd$G_ak{)E=-+X0M`hs?B_XZO_XAzI?vg`9eJPm}MG>;eZd zfW%#vcL<{D@`S$0n{kMLc_7`%rQai%d`?3y`Sk0$bBOXERV!kI4bf#-OSzBh6pv*e zfg#zZ>zBnQUW)gV2xScB0A4HCORMLRh6%hej@e{11=4G)gsSuRBMki8-h}={4YxYu zget&9Ct-yg`VxScyu9cpf4fpoGX5Z!5v$q6 z@mU@+Q(WG=fFQ3ZWaS@OFJ~RUvub}=zVUMcC={m0#LJGW0YBp+o`jA&^sr_WWJG;s zroQ?pUn5bZ;?1*~N-kwHU#m(t7oA#~?{`84%8JT-_?$`(k zk7$iwgzy*`7z+WV!^{L<27l&0Oc$@L*!Jvdh|DVh zbKmrF8OeLpL9U`>_|=>8y`A=}pkI!~SVL3X-s`rTy$-)Ii&Kd-eDFyu`JQ7)>9*8>=tg;gX-h=p`Z z6$_7CYOv;13U^V+Bf9(|a$?H$sBg8O5c98g{qT_Q$yKA%L z=!#u-Mf+TaJKIt9P_g1KB%3ayV5~V^s3rUJnjP_2W`Rq68#0xla)ZR`oPztovhzh` zPRy51UM;HM8+mX1q*xLbk{+mHtvg`GQI^vr5F4}M7GI^F<_vgF}En1VKetNjTb?Q{mVA2QZv*@_0DR$id zhV?4pHC4Y|^B-JLo#4hQny^outiicXz>&d!n`hh^7a?^it*M*P z`&M%uOWl7{yvp29=0*)ms{65*cx^hWzBQY*M6MQ;Zvt~fKkCHyJCitc^EhizU1ksl z^Xd34Pj{q7p%-PRJBhs`2m6IEJb+v!8bVd-r~2^YKi^q_ZYsr#FeX7$F+qvQyhSdL z__F>Lp}k=Z%~%9cQ^vwn;C z=(ioRd`w@p)zmBR-Cy&s%;H{1yo#`MGc%VD+AHLqS-dy3RRbWEM5~}THjczs;c7(I z@u%SP!TpxEG$Xey=A=G`ECO)fTdawOW8K23-&&TZMbQhq%#6%hE$;)P(eYK}C2uF# zhu*b(M1#kyQ1~z2BvCM%e6oZ#sAo4EwS;Et9VYsHSS251EuG_wsB7gTUe&0+#D{1x z^>PAXucr2U7yar@%-5^Q*E^$7Pw@8X1wFqWpG6yC_3RJqUZ0c?>Gd~!wAW9iW3x8j z^+IuNmO-rw(5Tw?mpng>=gtDyk*?GxghX7OAn558L?WKKOfQ@8T4rN>EIY-Qz1bmp z&qP)6;{rd(p?R!(N`-FY;_s8bdTeuvT+WG?uYtunb`8jst28T3bAb3PdY1H-@E_Db zA+On;MI6;^u}V;h#Zk>0k|%&Cl1l6yBFx8S_go28$%<49H%qj`@#>q}@~4fBqOUgx zux~zSPW5H^lx-1P@gz3Ig!*`+4Q?`-b2lR-|CNV7`QK33L^dd#i6q#Re_xZ0$itb` zZW(B~ty1xph{ZEg>eMq-vqo-yn?vL;p#>QcCczkGEfxhEI=r;dLSd^ZT{NmN_@!vk z_aSi9dv^Pib8!{O&JmZbbw9M>HJVexm#ydIOg(yZ@?6-giY?Lij!L!$5wm_SVPNaT zEw&#m>-l$r7PW6nL7xdU{UA@^iRJ+yI6#3C)%s^B9i@X2;@9kM>n5@3N5zr@)t4yI z^y6a6VC;L;Av6No3+?DVw!2MVis;Wnw|5nJ$O&TnnX=q<*%q6V66%ZxAm!_QoL|bv z!m6n9@d4iC;HnxF+Z=_$Ri(~6EO-(%3k&n(9QhK@k$4zC7vZ;@OVuCFeU>20}uCv#@;0k(p!p9LMtP)Imrud(i||;;XPmrh6TUrT*qG zHC2n~YR0*)oOsb%>&Rb9MHS}$*9O8ie6f9QS^J{W_C&cnI`Eo)c_2HB^(Ev~smcw9NZ*Vos;8vZyU13^}F?iTqaq@>QE4gB+)~&D(a^%gON@z)&Yc8Q+OszyR#MBl9UH(bxF8SUbW7Qn5{=|1I(^~PO zu-R`VdY&Q-2BB4=JLgPx|#lHBp>BXjwt zSV`^}9OIAh2wdl^^gCr!psN7jR}|lqH*Zg$Q+!X}JUt!Azb9{=o*sVGd-5XSx~gNltnA~f6uwkGnoYK`~E(k-{<#lKbU9kdhWUBo_p>&=bjslk@P5VN#v#-m&uTH z5BYD@@e~*5X*3Y)bXG;IEtP!;-PAA1&nyV=v?~O44Fl5|j*OjFXUN-$41D*>Y_zx zuuB>GZ>0ps+_q*+v!b_XU}LEqg6KB#Q%G3(okHA)=m<*FHp62(J4zNvir18ikuo@kUcFqlud1hAQ7fNkW}>$b5rb5zIiz z{XW(a1w=all~;U%(Ok0Ua?HKe&rb&B=UV?~;(dw|>`x<7Rw(Z6Ija&A4q&rb&B=UD%z*Z&6X zzeW|5+P~DJ|9_cREW48a8|lBs_CJ`Y(ebmHqA`&OmO}sKn+MyP-J2d-&m_n#v%m-5 zoF!H=Cv1LfQ%8CAYN$6oTW>e@7XFq8f}`fy_x(z9s^#S#*=oh@B-C_@oh&&&1TzbF z!>*WonkWZf>UAvE(h}{n#HR(;#Uh5nj80%)NFze#5YbC5i}(mA<}>n7ve(yQFc zD|zDRMR|?jR0(>}@#d1+xdGIT`*RE`y-Ly-X!<+cribTt+V_?ldj5^KjuAd&gU~!7 zL1=iWBpcU2#4rE;|KrGC);~3MVjg=8yNxW}rFQ%A6g3=05J1>th0bcX>19D8Bjm(k z`2IIN3X>?7+mu2!2OQ>0jmVE+|e0N^?CN3e|y z+)Y{;jlYl2IKsTlCi+pV&?m+R;)z3ms#Yc1J3FjvFY43l={qGlEuf|3F=zlB8(Umk`+Z()Y-$5vd#TM+oNC!E|7GdnKFASjN za=d0(LgT1j_QGo~yp=A!n#YFl>3t!+pS}Y17{QE-AhO=ntJ8YTs2AQurCfY<^|OFo ze6?-hi5K4GnjA7+B5+j4)dBZQfz)FVhx=IaF&RAWb-=;AEI|RFaip&NoH$ZGF$rbl z(9g~?Y7>y1k9(Pjojb!(C9=J_CTH0pr98p}6BkN79p@yh> zil2HpKG)Z7gT?5PH#wD_<;ix9^3B4B!KDN|0lLtTbPR4LV zY_aPBNLJJQKqgVd+i|>Uhr$R87Kf3->$8}=m0~F9FAbm}3A+2&*KQbkQi1`zMS zQ1DuLs}j}EVnCXhsmuU*UgpdBZq4Dac(`eDEO2{9Ot;~1U7TQ#=jZJWifjKw1qM@6 z{fuB)hLvf}uYJzl%dNYWJ9FDailc0Bg4d*PS4%Q?_F;LzQ`{-U2}q zBjwiIx-GJWtcWaxpX-td=7z}Fn@2WIai2)HEB~eCD2+6r>^GghEUfI%mu%=$dtPO$yJb3XohbL+iZi9+cqixSJof`QR7o|@Ann6w^$jlf z{b~utTvolwn~NFM@43CbrqJEYWlREQQ84T#x_HdK;ih5&iN7_P#7x~s(jItRNaDx6 z?@Z}^Yf|+GlD!w%y>E_|46;A&eQST4&TBTL?=_TOYSV+7j%L{}Kf$K&qv^qH`kVXo zzBRsgU~2V7o4+slk||w`vq>SXvTwG^TSYc~vZgaVeix%``qbVxCubAioQfh)8keh} z;~B|oQy~@xR3J$OFjkVLZSIF^-e;a9@_Eg&^ifOG1uQ`{B*Xt_L_EZVF^bcZj*Jj@DpJdrNa6C^7}nF-zSXA=X~8j4(EG)g2(yp8Bu%$zGTUn z(Y@LI0mn+TXC>zKn?+6X1&-RDt$-Is^+BciP$Z`UR@UZMRMfDsNvho}Kl@P7xFB$H z@R}dX*BBlTy`o&GG2iD~cx$D(NxocT)=4hfXwi*u2;iy~{fn1q4n3BV#0WSj zK7%n!g`P~YEE5Z;zB*(If1{c`8dt}rSM2sS1OI1x@md9-sQKA-*$EH<2;|IgFApqO zx!9M1#CkjfNnhk3+@K?&99byvEB5Xg?&R*`2UQv>LmFC)asRLBkS`6rOoE)bO0(Rd zbk)x}TTN#&%2rR4NubY~W(<>?Ik?J7RDo#VVBNk!!DopASE$W4zLxMuXtZ+I{#0_?02vg=~z zWtJ02!9T_`n}$d3C+g+GO|{nQt>!sIwpKIgMoV!btuMeJ@C1mX4Q@9SamNmq;P>1- zESq0j=l4fY8y*}KaehPcpYlRl6Ino924vw@iLJjw#oCZ-TFpFN;6w4st$)E;59<05 z##>drU3>{j&1|4)H|s1zsNEoh8|;!d+Q5^%u2SAk#1?a#Hmybw2`tiTp1hJJAp2mZ zbZ7~*PVm9ibG^k0tjZ+Cog9EzxK4ab0H)A%76?2y-u*b%d&U*&wpKKRmDkNN!Y zS0339Ma{%M&vK^eA(M-5H}`i*i~oP!Z~1q`ql69D3MG^<16fPh&7c%&cnH=`gEbyC z9OO|$+uH1kSs_z2L=mqDMI1|ZE5f2M!#v|?>%UP>Bh;=8Nz@lIs}M}oY*0B>XSIZM z>{qKlcUBModG4;ltiCK0$N6--EO4FIcJty8d^)eo2r1s;_Ss`yC9Y?6-`;axkL;fJ zJ$tPCPxE@J9P3^}$o*f;>-nr-$amPh;%M?&^IEuI6}=1Wz_RI}e5xinA*+EPRO~ zoJ?yh$C9^Vm+aW`3{$Cv67v8SbK z^Kh(y7I66Jv3OT49ZoV{+Gl)tGi)~xq|%(=Bctlo7oD9$J2cZ71b5u}wc@SGMBb+mi7mWlw(H zJ8_KWsMF} zDP$?Kbf1053P-LLESPq4A3f@=c=I#)B5=>0{2iv7`!5k{ML~|bMB;z+^-Gf~a$RfX z-BN4%5rH%!%HsoVr~PM>y?u0kVl~cktKc}GRR~~_)EW;1tb{7^xNW#QwW}a_)n8

rZj^AlN1o-3EsNDgJaB3T}WEPjGlUnp{`2)zJ5n`sog z2!?}scy;YMdewo$P;!de*JNbfTVZnjaxSzpKgHRST`CtkvahpLp3K*!GO$8Uy$rd{ z?0VN5a$=FZDEZfac~B=#X7r_u{U?@iWOH#|&9<2ETfEF`QLa}7=jCm@c0y3RVOp(ZK&>erf>w z-KsyF=5FL+vp$}3&OZC1n-@1wh!?@8Leq#;!_GNZu+HpkPs@>N^_;WZW_i{sX_l9w z3>R8*WR9M^2Z#R-jrd(P;&;=C-!vDE>D}|Yrr?r1_Zci*Pd*^7 z7H(aBTD0D$BtOC!`7&#%B!k~$X7qfal5kLH#ulD9-4s^ZXC!@n8kBp!!WR;cS!tii(OW-#s=%E_B_ zR>k@ zw3s4!=0;0BK0Pgrn)P;$bLgqg(o?i{1How63GpBq2XBMua_Om#`!Qpbo}xtLGP@S$ z&{LhzQ?&LSrKd3-J&kEIk0!O5A$p=9^z^LK(-`1$Yx2_)Ufj~tKZKsDx2HCSGqZOw zS5-<+JKRmsQ&nbRSJk$=peLyZJryCfe7x&-dF#v@*gS^lOI)6WV&wSJq(mu}jS&CB{3`>!4ML;|2($wNq!CuEOhTTyE!$9F zkX1~d5^qBd0CZ$2d<<}jyLvq}#TR&D5t&J0fXAqou6qaiVT3B8V?%WzBe zphxE%QAx0HNYxIiK1x+!Jj0{U`L#Pb!|^fBbCz;{oNYLtoaDa-!mB0?<^JtpzuWvq z$+dJXNKUN}eFj}Wt8~2xx<1x29WECfGt}Hn0mahw#{WduG?PQubvewI{iJ7wV0OR% z8k2WN^wwaB9A8#SAf_t4vz0-uD$WoL9M6g zNY1@qtXmJi4Kn^%@~vP=kNjubT@P3B=a1qr7B7lAl1pqMUW9fxP%X8gY(er(2%>c3 zD1ku8!+9#Fm$9atUMPt}mne{l`g3TOc}|Vu^&#LzO^aOtIje0&U+1A@uOXY*sa-n| z9tbx0os0Kaa4Y(F^eH*XU8iMZt<9#pIcLqS=%Z_GWm}>))mc=;vfBU~FN&EjT{L3Z zQFf~Pw5~eA#qd@4_sra#)z8;H!Xm57B+C-Ty58!Pf7dDQa=7PnhGp*@idaKpF|t4~&8p$OCVTrT`n}xXtbpfKVbYbc|&S5)t4L0^*Yd zJf+FM;%Yc%(9Vi95igP>z$;~b7k(ZUb*G@M23fw<>*GbOnyR*-hq@J=>xUYDp-ZI)O@B;ocwGnc>h$ zUzXtskCFj2nV)3QIA(C2VwP6aTYw^r&w~pFD&wOC-s~RYbSsoyTDX?(*^(V!oni~d zGz1atL@gwiTdh#8S1B4r^oH-kR7nnH_QL<_rE>2lp* zd@G$al*9j4jNpF`9hm*@^!E3aF^LFKN*b&+&s`EoTmEs!LRb_05J$1(N=M$39%6#& z3`|h+0fhZ`&i%#Iez+JO`N!vk3Ce$9f_dMD2@1217e^h*jhQE>WSL+UOmO2UX+;^J zoXPzj#+pOv!QxF=9k+`Pu{=y<4JNPy4fw(f6hS%M&#|&bhr~vZ_Y*l~{@{Eqlq+jE z$Qs4S8Ve&GJe+Pa^Q46LRFoqomJY%$G^DO5Du(Ix!SsrWuX3I?Q@xe9^u~f(jjTxF zYL9`s8!Dc8K#-6t!|vtr(CV!aY>8JAM%a{zewdk6Rr_LM3N$UW*iq5z7SBirWn^4m zIvM)wNN!cERy^SexA=~bouH`;s1cG?s;hMc!sZHu%@r_5Az>B+t%jV@w|6s>qUt7MjZ3-UQ=dn>vp4BI6NsvCT9}KyEPyuLNy;*3i%l{#jPLf=kb@ zPs#yXkj1`5rx#FIWJm!AR!izi8LU5dp8Uw~dj8qHYei%p-%O8NBS7f@0YaWG@w&Q4lPS6|!^6Nl8(mLlS7@_#^Pi7L~x&ndlm+DF zj)m8sys^ksdt)i5yBcW_n6nt+yNQ28V>vIkRmjM~A^ql3vz*BOrei6r*qAebB2FSBrUp)x1lsjMJOWz5tbVEJ?5#yJ65zp3?=Lt?4_ zJZ0_EFy@1KLNAER6ZF&-YK1hH@CQqm0?wU#|ZC7;FRB zc3HNtE|x9VL3U0EuB(7M5`ulqj{5pMlv`YcCPD9=mS9n&?1&g6Hxwm=h48b<`*#&4RcF>i6_Fm+$|DE z;X@GEY6kh;YEDL!617#0Igu}5;5*!6ekhHvALDGGUA)#g^8-4L>pUk{7&CuDM8mHe zp&K$2=5jVI@>4Agr|~V38Cq>xB{qh_;5WX=ufa(7&%VWbn6iO#a%m>aiaF;H{9#U@ zuI#C0V(7rpxXoO2IIQf^(7>S-lzpv?RYknnLn%CASpCZmlY-LmwGzOKqUBQZ#v;P&)?n5JIeh9=rf;4y;`{K9*%CM1BW=`vtViGl7V99@$9cz zI@LRjPIappuM^s{LI5r5-kK-@4}ZPxQ+%`UyjDc&V!D>sVwVZQU4O_e1tqQgJBxoa z`6oQ5r;@hK_HS`Mh_w^evic6>qfN zNXjBQRGAO?0x666QKsbEx>OP2NOam{GDo zD|`!)Nt8L#q9-T5lzQ}lxKV{HI2Pg& z@pLGu&ZnoLq%R+orKdI00`SPA4YQR`%l392^Nv~Q1|=||qbbhyJ_t%j3dQLbih&a$ zs5Qav$7l+cOVn`U&B2}|L}xL6A*kq+3mkEQw?k;q%F}IS&Li`%k1LK}gDs#U;l?q6 zE0!cA8uTEGFlHWK=TB`&FS%68HYlzTL5Vg({LY({ZU>HYPR;gmKzx+xUCk0^u6PEb z&2&-7`BF~)XpF8uphW7?Dz{H?4{s3PlzHylx}THZHrSf+$uWSJiKhz?gk?nPvBhn6YKDkf_* z9Bpg%*JyHT|97PnoQtJQ6r|{23nm_2T48u+Gj5%d$5)j zJj?JMTr8Yq7BG33FJSKer(Hl-lBqA6r5>&HHhH*$BLbKm?_TjyT;yK4igBRJ25oL* zl(S=_BT|T8WVC6gfHNT{X)n_tbsD3r_wMz2tzx6npFTUOB!eJ+P=;SjtWpJtE}jM)E2H6-{<3HJF}bW z{gT{HBsFu5N+xzgmGgj3yxmZ*;iu();;F(>JWNn2gGau!0_?1<9>x61G7i)uly?@A>kdIZ}9+WGwUfhoQKiF3iFrCDaVJm$gtMKxazj| z!o);oa_1tyz{KW4i7>Ib5&rDs&MoK9ICpL(sOc8ht?iHHCqMEO~33^x00t4uOhkio_c-F}&|%Ls$9cEP6WVe_~VZ0p|36iZb+ z!_;QZ5=;(fS3AuOl#tzEqfpC(f;qHV7~~&c3Mry0V9}nO+EsYzg@cjIKW|6KgTc2( z+wq9_;uQAXV??rRl>^d3eD+NBL9(2~8sSNc;jcH9V&jLZ<&{Yh_#JpFSrv5_X369t zUR4a3JWSN&4;<@AOlC_!muSwv{$X>%&Q6eFb7pDIQ#MCHkC}hKP-7+yo0Ls;P&UW zm`vuWT-eL$LV+H8iSaE2Ghfo6L~PO%oSU++t>~X6ee1cI`;A|b0jSJ=tdv(d>#!x> z_>tG;PJRx18AYKz1OeGIMG!dZ0jZ}udB0HWf_g^7CB$aVPOUA?-hzr+Sv}Y#0vgx- zD@S1%Ys2)z)tS0tE@UkrKmh(vUsTATn{r70&$9I*>*E6DSCFs=rp9E%mF*bBC&}U%PivarY`zjwsu!9k(800JgV`o8(s>-~ zH5qm!0!vp3y8f!O`Xjoj;_L09pnJ`6svHxGdkI22E1?yT`hx63@hD>9Fo}lK3 z2_(pj{Gca0BL>)|*g@|6rc7g#7K@d&>%^@bD%MM}?TvaMn_r)4vc6CT*W1WbhGu%dT?y%fDWVv_Pa_=&vPG#xJy~}gC zclkh}#NdnZLTeGBD*#i($OKYkmU==8K-la2lA+EAg^shGi~6@xw~k8NIkK*79W}P| z8FuTa%k8{QI*+)q1_rmt0zfy-ZLLF{e^>e-o~9V0DvnV?m2r1T@*Fv_?8gJ7VvsuG z=xnB**JG6eu(_L4owrh=3T~K9fU|@7g*K*0l+*k0#$G)t+n8u26)!aQm7&JGJF;ic zn7MbT^xIGqFCNRm?l1D$sB2U&Tc2O=#)@QRhIk9DHM`vfyLzM`8vZC3Uz%#N9p9l% zK@V**=YyJ|;9esc`grF)ZcM_xnxlOHcy3vp$(9dIONeQy*J-J@)6!t4rO8gqJUcDX z+-Zr*w1nJPy`2&snGu>;(VU%@+-nw>$QH?=4DOExm|dj7Uvi`d+@`wJ zbL_67@yuKZUqdZVy;nxg%dZXg_jvF3B~4bBxcfJnukF~#R-XRv8taeCgDc!0uA%ZI zfGvY5h4nzx(j1eh^d>aUXzKJw`Hy|8T8F;U8+!G2^X!ZHBDAt?m-hdAH}UrJWtf)@)!#s3b};$=U{>*# zI^p;APSl)%w^9IF()$Sg8~K$h?OuO9&B@6QreygRodtfh z2(!M&#_o`B=wYmR#0(DR<_zO+a3xtZqm>Q8-(=H5gMI?<`qH!?oV+1I#59V^amFi} z!|Jp_(NBmf*C}@(`$eYmQjRt6Rm*b01#PPOY}>q91bqvbhhDJjVZEH<6HhDi{r%A@um6Si_Z$B2 zdG>dALWUXOJpky9k8D^;Sr3jpg=uMJuhjY(a-r^+a}_NT{4GEDgI>4S-}NakAwA^q zY#;iP{h14P%^;=fn^Gy~@h~W!@`SKJhQJaSO+8X2_KlmQm}gQWU95#gsa`@un)#r0 zxV$g$xlJX_=H5m|xPA<GR|%nO6AARP~>RzeJfKmR((BNAa3;V_kOouGjK% z|DZ9-O4%=J25@_(Ab5)GU~y@2nK16LRnZ36m6aV$z^&_+t$A&=GN{xOMJ&9fszdN+ z8f5W58^8JLPVQeyR}q|yKEem0C^^yGAOgmFwI3ymmU1CMM#gho=G0cvS=`KV9JX8~ zR)iv6fGKmXkoBibZd~>4#CWTjdiG;Ub(O5Em9ODrmfpI0FcxpEe=;h=Z}`&)jO$WtDUJG}marsb?p z2iftz`%fi;n7K-(4;z5MOO*SVIj~uQ$66@ATg`zD_ICsCrku7^Cm4E&Fc@=5hxJFm z(<2(nG==aK9Jf>{iL*nbPo^x>6wXBDvVvGc!kMN>CR&dF3JK~o%k-3M1x_}l_JYMx zIDELr;>cgvcS`boM{+ZP?hZko&`s3Te_a^|Rb|IM*m)p3+*vj*d%$F#^0rISiADOP z@wWDiGtJ#X$LcpL*A|%Q5(0jWb@S5)+&@YZ-rIK9#yKUNk@M0OT+VW<2wX-OuusL* zd6)Y{RBWAhl95@F$umEht+XQYG0K?$-nOZ}(k6x}mg&;u9i;2EHssZ&x^#42>eXFK z{nL|zWtWy+UuawM%pq4~^%)BZ>AH0zLu7EGJE|va-&|NjWo=*LP)IKd@blV*>qf<^ zB5J?%sdvn4a&}Yu8n3ipgf;;etcPXBxK40Tyxpk>k4}o;@g(bS`I8>9vh}#y-7gzH z_AlJ4SPtgxeztoik#VN;`6zYsYx|PZ;$PLaXhs^^e`G^57Zp?HEL$d_Wwt#rqBHss zcLa?(ify3`-F0QUSvCs2iU2A@B$c*`n^zsM)R>aL$~~+ic?9Q;UBnh{`Ut3M-=}0l z=d}1Gwzmtkx9*X>p*gF+C^0{NdA$~kntRVf$YAvp^P0o7_$pg@mR4>WSs73l3M?(+ z=(gBggGoZ*_&c!9BRVzD z-Bi#GgDGRM1lz)eNe%_6!HbfIGSae0qRjcJU&B(Gz_xvp!q%_h$Q!usnjdT9cI&e; zr1u1E+k@903c*V|^{L$v;<|D3%{n*BZll49jat5+3+L1lDQBl`wW-}5X zg9OSsh~9a=(9!uq#H=C6SVEuSJ!bdoKVOpd#|n#{6awb$mKJarl5Y50CUnNi5r_JS z8U5u#2}{!8?j$}c5e;-{71!=!S+zLV%Sq(|0x<{75f&I5fSP&h%Q*S*HZ9R+z8VJ@ zX0w*ZBPUqfx1-SB{g|S&&Aj}r zLZJ!b0^9^bTFp|#c8?w;s4DbuN7=*P`(?M|7$)zRNdoQVnJam`(0T45eZMTpH)2Mg z$kQ5smHqpp+P`!j5I@=Z$=8|x^Lb5}`L`Y8U@n2xiz@osQl>Drp&)NIaa5jZ-%yZ0 z+wI4K<9=NDXX_>OvC6T=+G zGpFq5&4}}Gw$iy;>ExVBc0CN6k1$JOycIi00OOp(MJvt`fIvM;UA0qk=YjY{{n(uG>-$2pbam)e|jHD_H;j*zI*Cp@io zQ)ejN=xnhQcPok*}1qE*Tq|i`t#S=02{dTVJ>cQftTrbaZ$0yuRD?WC63qSGtar;KH zMqP0|SYNS!o^SVe_IB@K!Wo(Q|E>G=7o7L(7%u~a&Oa)0{rx)Bm)d>Us%i0RTV`ck z%6w&HnM~u`@h@tLs0auqeY$__LX>1@KhD;krL`rhJUn)&2gHcVc;1G>yv(`zslI)U z%WJM6sX-3i4LDe!zU}!KHuX&P`if^WSCppu4~v(&n~7&VZ z8?N$YoVVkbSL{&awxu?dnh9SW5nQd+JYT)vaQ&?)kD{( zYl}y(Eult9{et8+)D90&UM5H;bh*fJ68NRryuMRF3h8m0Yh>l_Hj&$d-4eM)m=YS+ zZaI0XfLd$Vy6ZxD$x%F})$tLZ`N?y5ySw)3Rj1Q-Lxth%2y~2eAkadYtyQ zI=lWBQP*5@uAJAwbxC^^2gCihLD1ZaV~Jk?WnheI#=BV*0>Nu#cZuOe`DE|TQ17mi zYp4S{I8_kLUyZN6q4GBh$<&(wM!^<90>XP`!mh<)C;uUhyEj zJRYFu8Wz$566kkE>d{E1W@bFE_9Gsc7k6miZu7rIlQH|4h_)YQd(nS*!d-t#WK+`Eb_I4HlEU1ajU<0 zP)--7>1ZVFoo1H&(HB_oBN1Vt5xz@MmmJi+-rW-Hew{M$g-+20 z=spCU@hezCXP`V{ePHXdRhvzVt%t(fuXvACTxu&`=~t}qDym75V28Zdi}jEW;f+PS z;@7XwZOkue#y&YyGLXO$`^Oz^Ccaua=Pk@P?$_?k@tC^A28+}6KBZC`dxC97VmO(p zlFjyv;R~Cbd3WNlB1BHKsw|Fmyc82PtFhkYK=Kx|A+;fia9eYGi}^ufSUzeFL9|?J z5V9%7fs(aszN~Ur;r!57l#K1=xV7+gFG?XoJB}G!J^_6MfRL&=0=v=XjOtR9n zAf92{fxpfEDR^(h&=KrvlC~Sm~ zX=`ucpl|M0ykx=ofVmQv6xJWq{#W&kl3AGKTu+Xjhz<{)#TFj(+b^h1w2b*o5ARMi zBjQOxYZ7>j?q&?{E+qvTb^B!D`*u^GC-#(cob;IiiShHDN?B-E3DDo* zKLEH>b=V@)_gx=P=Hz$V{4Kfp9Xa`3Hoqq)-w|x*6uH_KxjCnZ51QrI5KCSTd_Bs) z?>kfX=QAX{#szJdUSh;v`2>HFgr~z@2Dj=UvjgU`!eup^>PqNwXKX?0%`xWeH~9Wp zWDQL}AnGXhS(f<=udV%3Uf1SCYy50yo}fTS*D2%wo$^~W52bdyUc@Eu-O16&1RVq4 zS#?`{nXRBId#SLI3PL4bRJ}!V8?WG`CMc{lv+#g|+DBF$$T?Oz;XEi6ZrQVkH67)H z4<#a~MHLvulN3F7&!QE*@hh6NnEPHV6F7pguQcCWG$egYig()HW@&Hb7QFs5WFg9} zZ}IY#o6+2W;(b>R2mr5dCG=GcxX&O!S$PWzEzzhNJ%Th|5ZPH)xVEr*YZrbjnMPdZ zSM9ZSUPb;%U5_WWtu3xNY0a*D)QPJ6&@m`E$r$ebt>UNub-_Io#TA!w_sr1 zYe}?Y&f@b@ul&7av6~TN`OE>`Iajg)t0vU^i3ILWql0!Dz-!cOdz%ts!CDttM>SEQ z&48QyjpWp$A&z^W#JI}rz5h0{kB|m zeu;yubfc5#C|Wn)tD_RBkPe4GbdOwe)t6Q5l$GsM5fpCE1OGZ*=^4eKoLFYKi;6G_ zrglrn?Na`gB%9oA^j_)WuxidZ4C*!QUrN0(1{G3wj#htc%8cB*bOJ; z<(;%ZzEit*C%@?KsMwZzr(obK@~dFr-c`T0$7Y=u#q%oWC1^+BYvn?y`Kk+QKVB7a zo?}3kgwBsk$v1e0kCBL&Z3h$TgJ70BFZ$(TW}ldU?2xVXi;kY{6yxn^%NPit~d2w|0u9BgilX6A|k?g5m86}u7H z)-FDBH#xi4Y|FnURL}4a;Mlz#v74P{ZD?)j1kN0x`dPKlbV!H>cE-d6FD8wyA6Cyv z0%D!IzHDeXZ1AD}ZMfSEV}JUdVW}QtbpkJ&9FIC@2;(>(Sp@&zUn>$tMaChuAyV9q z^0sJ0UOW@cANWFQcm9UFbNTF?nwd}F@BW?#`Jel7X5rC;_PqA=5)l{g*--GnY$hV) zKI!)I?u4qma!<+|0+XJyJ{dAN`YEk_Bo^#`l-XtkC2RBR;)$ZVbA#Q#A*JqIbP>t3 zGqXRfejYW%K5NG}uG#fKV(gk-4&+_5>t+dDT zm}n-x#Hz;0BAqYSv{SDX5DK{v`?^ulqu z`+3i=hW{2Ck#3mBfFota!EEDnQA2Ar^5w?2pJ(Pxk}S{JgZ78jm$s$;H$J1j%`?S& z)(=D-$uzHiL(Oo*;TL>F6)@BLS^3uA^u8tbykh?T7vY8G7G8yc`|V7e&mMIt`+lT) zyCTPZ=7m?f`x4{Pryi|Rk;suJH>P%%b^L>2N)V57*1F!l=QrYGa~ll2Or#FZf8{3p zqM%*4)5Lc3Y((e4K0hH?u`*kaO}6sZsmvoB46dkQT!t_wv#H5BG!pYA)r;GdL%iu{zO%j;FohEcZj!8QAF0>Pe%8?KDxGd)wt^I>EA}=%*`bu z`+@p=OnRLbtKE?(ooPRl<9zKwV%uHjXuL38BZs`7jsm3WtJVD#+y=WYCxQ2(DbQvr zI7qf3vDBLby{~y@fA4FC+1vZ7F@@gOO0(-ITVuI-*Zb-)Z}0_6K9%$8VxA+ATg~Q< z1341J%-9ym;yh#D^<=1M;)`@dmiJ7gwQY9|r9Gt4mbTrsc3xol?%r$oZ?drIviCWG9E+=h z=xpY3Ud!0fUZT8O_NMf~OLS&mEwC;k2OchiQuG4UJLUvipnCnT$vD7s>8_h7E}Wc0mk#d$!_(^A!=V<=5O^^8NiftG4}o|f3if@CqrXn1!s zbG)EajQK;Tn)omFZmtuvx)-+!a$loKNJQx1W2nBJ>k9AcF<43CO_Jy^(i)8#CqFyX z=WOzf#w$184g|ID1+QI+PDQ|E7*(9~POXr_uoXglOW_1JL}I2}S%Ri!B$Zv0;4^0Y zP|I@DiVo$)jT#QEf%(~H7E8|JNIl9=aT8h_kQ^o@*fpCR^TbrhntNnFEX+cAxUI2> z3dS8uo+!y|&o~3$tS(W&(^2M6c|4yv=RM<#yyjO=3wFOMCjz)k{qcFou&l~Za9txL z(7)l|>dg!t{8X=BD9(@;^Gq$^Fld65#Y}LhZ*gT3p2oATGM|rWjt*iKIYLk$4527) zyDgJz@Go7J9agI(!<4y;LMYw@kD!^q7fY_Hla3)b)rr!g)!i?3Tt2~@#j7`YlKHPG zq6$DpVJg2jxSR3{t=#1zwG5~vrb-EyM%rgLODw1cbM;WOFEh;pcf0o0Uvc2ZA3B}| zX+60h@OJ*dMN4TC)d9`R!Ti@?0?x13P2~3-{%`N#euMqpN?bd%X?W}c4Dn<50XPlm zMnwB-<;Q%y7>m0fPdAowL3BRx2@)b9h_+eO*?9ve;;2!c-?^XrkTPZVAdm0DhtRKg zMSevoK;o$~oVQ9y_^qG7j+ZWKGjll$x0&}3r!$q|p$h@H>`FTTIufD&%131{8NNMx z{t3s%y!(glT(+`Gs*h_IXOzIQ6ix-YgHkom93frk9uNRkG51n=t~zMmWQHWj4Noak zibIXO)KGA;^sY-rFXJ@IsP~f_z%lbLb(bYCY5GN}>@Evo(GQyMOGA3YP!8+c=av^F z8(8oh|IUz{@$%%R_&m**J5YG2OPDS^?d58%&_P6kuycp@2_WZ&jMSt+8IgB3xC@Hi z_R_Xy@h4m~S|F2I9G|{4oL(j|kIQB1Q8;tq4{8*5yWfNrd)?bllSEW8;*B zu(0&?QBrhcV?A|*`tfh4s3?v;-@jc{JQs1oXfO+!&>>`<+b82zp&7HdCpgx;hGG${ zh~)^+b^%*G+h4*#Pr-(T;n`kiJ=;%uO#xwG5i8ScLx*TXx6)9|eC-rD`DH!Z>+x)_ z-#!Y@_IgHx*AAZTd0Yx+G~)kShiAK3CM-aOgdI>Zo}(R-Er|{4*|w7Uv`0ub+hwT9h_7#^UfCc zmRnAi!Ho1}ml@Rg63UnO7B;4iqJpq*RpQUyalF(NMtPk`T)^$l6186T=0ZI`=(EfA znTgfFV8@sj6-;Fun*G=TN^V(R^gI8z$BXXre|tK_oBiLO3bEV&je$`VU@IfC;8Uz`lM=T<-z1 z)QZ{0@(Le8jtS#5&ZZ=4o+5E?EZx9r8Z_4&U6{A|m3T=so^OgTl=Dh?mTLje=lHvi zG4*E%P&vjw=10~DoWb{Z=OHlDf2I`k1bJAs=kHD=9CB;o^IBa59oChOF2I|EcM!XubJT*vt4{$4W7LneumYy6V3!5m?Ij7dJnPnKf) zE2~LNC0?(eEc|GE%(NV$t3{*2i$28yDf2^qBewKS2^M*gi8nyuFiD2E5s=x~>XCnC z2TA8AM(atlFMg^mJqsKCSYvMYR{m!kKox)f`SKdrh@214-ha>YrOh*Mj~jlzbR^xx zK2={iKo)p4Eoyp4Nzq(n+xe35Of;{548#8q=jRj>421eWou7xnKjUHx|K0oT3BS!V zl_TIER{vLC{j)!#zRfdlj~zb#o-$@7hn|MDw}w2y=l-A3p3O72jcAYhVm~Uz*|bws@>ixEsz{7N+tD+3nN;GbL)tWX0gB zH`Y|&rn=k+`Vvsc`_O{ON5j@<;9t|^M?goZ_CuiNIm^}ifJ0hmnz|7qmYgPAUz|kB zk`4*Y$RP#U-mkasUGI0Qci*NC-3t+V8;jA@b3adX`N6IQY-lq(`DoM+X8U+P=#nv; zpVB;-tZFuQNbie@zr+oke<19>I@O<1h%wLnP_nr?9qd}iPf$n$au4`{;{`qd4t8BE z8Nd&NoCMMto;=lat6w1bdVjN&Xe|FpL2^_I#Yo^M`H9Iui>`ZqWxS}_eCbkYOiAGo zif(U2!tRiE=&X{?zPE3-v(eI&c2e0)ZWX!HKFFTF4Aa7}Dx1wcCBPjkaSirtK4o-f z^;9NZvW3f30plC*XKUUg6S_jlvvMFnp^%8XvC5WKw_d1>`}f7%jh|oI+^+Ww!vp&; z0`65viuu`YX-K4;bLg}cGDCv?;zyDwl^4=)D{W#6ApMUqKr=Glt%>7UpYz<&lwr;< zQ9uLfBjgmye0s^tyyO!gK|Ko&94nAIlRl1+KQ+i6ZYx>U;S~FW zNorz}I7KX;A}9%TZ-v&{%t%e-)q*tcoP=e4*aB8z<&h9^wGHoE6a0=#884M@!7W04|RzuYM ziZ3|0*@+}$DI1-e%>82gto6wy9!!;#CXUBMh?7rPNfh})DhkPGekX}1apjQrK!aWQ znE9ny{<27*%9%r@zafdRn=b|0ead@qp|qtGzrW;)E1P$HM7G}BV9C1u1-o{F1uD1u zbQ>13CyJz5bcB?Fynu<&-C^3g=R8puI5V^6PUD5zSsA$gml{-xYLmb zz--%R;?O(Rth8;bkt_9ReU_GmrfG%AE>At4pKh`j(uQT*eAQ5}j3xdkaOIj!tUckZ zlaPPR?e77V286mi2NBDgQtkJT1q8facW?WtIrntA@|bQ6EW?%bqTCvrZ<2HTcaPIUmDB@P z)?{*&!r*R7^FBclQ=8|`68hUWdn2lw3R=5)IA z0CY06YC#ES8jIu{U2}whA#3nDu?wOKnguM0L$aNQ9dT^8mCn@$Ck!>n18}n=BZ~hp zTl_37{@ORQ{S(MKYW6ux)DLCM6cr)18)pgxr~{=TeqUvO$INB+V}zh8lgIyLe!-dC zCsvu*`#sr_YZDgQIUK^Ko3HuZ_gP6tF%wR$FOuW-v0u>9=MuVY-jnw)nXU3F8vuSD z*=Q`u+4P1=aubrYP(=W$D6<~^+WIU6sp;k|B~8y`nDYVrN7k-PY8aTzPA%zL&V}9|bw9FjH`2?JghrSs{`usA53oit@pltj5`asMP0m(zE zs-+m-I6FLhGfV-yVBiZv4>B#|op-bKR}AczC8nbs5x#9pa_?lidGrRT0nVW`C}Fs( zK`NkFyC7&&4+ljbJ5@rCB}LuOCr)wmnRt4d?2OIAwgNAq>EE zwp3h8&C8Z@MB(iXPP2~6W_h%r^aj5e*}w3M$MOWAG~Ik~{b%(rQlaf6uBD#J zmU6<`tT~$X>ulB@{j+;i3I)6K=wbg}m}%dR)Y2gCnLwv9RX7*99b zuJeb_v{%Y#qJ5;~EY>36_t9r$;?yc>?uB&8S zBruL`Ph9SvBy3~&`nb^D{h90ICr7hByjyO=*T;!o4P74?hpzo6J)AVOKHjO(^|36y zq-^OD9Rs08KVwmBzt$VP9D;^`XC7Jp_!M_P9!pdLI{Qc>vVB%@ezMkW4&&spmpj32 z;UiH2VoIX1=E3J#oJ^;2gE5Z7vCQT#3J`(F-Y#+8Xep$e2@6Y$wfXd!c#w& z7u6j#v|~0()Sgh?zvN)=J&-n{%qBAw3|-4f# zDKVyXaNh=?v|P0>y(+?&N5>W^zCM;)PS0i=pTpIc>E=M&xEzuC+_~)FYnDoH+#SyE zSizGL&E^My=5K^kod3?&ceMViZg#T!@X)c4FpNX(=BL;?S4;k$lJvk}pI$6=)F^>y z_;rYh4wos!mg+ru2X637y2ChJA}9PG$+rj@e^+D)h}?DjC=1XzT%w+CqPYOg2mW6Q z{INh2PHn%{in6mzaX!h`lPk*8O(?e>Z*mUqyBM5O^kgSrs8UA~*P>h3X6L=b&ij*C zdQ*=^6pPM#*_P*M@rNm{dzP<$_U#{^H@;65Ki>G{NNqbmhg-_BF@fK>cd6v@N z`2M67?f52T>p5C)MsB^~;}fynAD?uw_a5UL(8Gr}KHY5<9doqhm(wH1XFWJYs!ARJ zLlk@Gg$`GHyk6$?zaUeo!cegLF8TI&`k|CjnMay$Hh-!dl6l5D6=e3`I8<5+R_wx8 zZ-*b^Vw3xrUi{Ft>$iFI@HW@vv^mB(mdt@!IU58GK1R%pY?Jn)mTj;@?w{jCwKvL4 z|G;pNGm9p?_3T^?bRh7lYqA(&r{F$#yO99UFh1z1+-cgg#&@U@GiRv0uI4}LrMT@o z1*h;xwaQ!K)D^BRC^#v3`OD4@u)C!5cxwp5dnuJ93l2W_!2wpcz{7?nesRph4?HbxK^iQeL2=t5pu*vzkbMHv3chYw9~#1XZI zkI8RXOkRa@Le|b!>ux4ENt|+)yZ1HFhx^!B>7up!uI2NZXn~Aid^FQmKtzar-xj9b zDP9QRJhia^w2!w@564*9JhCBhH z9~9sivV3vji|%6^0>|a)s*oLKXuZ4d5NTZW_jVq?-d`=>CuS4MP2OQl`E#^_U^KxI zoxeBb{cuk2R)e7pp0cniqxoQ{+GxrS3DD zSn+gY`jmiX4V+8WWNBkM9?E8taY}fg#l1Y-=sr{NwEIrsuJq;MfmvM7dL}uh;%Vv* z)Komp6C+2kVTI9bPLW2&(#FQwN;FiJnzr6v>3CWCl*mASW7kWGL;GvcJ=$2{%2+S9 zk&mXEtGaSIiF*oSCO6It(gibT7bgqTvx{cV4$I%r%-Iq7TgIHYk05ppuKT2*{?JU(Dn@?_acMbm8 zN;^k8w~^NB|2)|FcJ9wo4aNNj=)w|7YU8MZy{or6m-!5IZoB!_AW#~jPbZphj)s{2gMIaN)Jw=R z|3~)Kyeq6dbM7uN_o`S+f7bul=9#CqN>4lp9 zOPh|COXWHVkopjyw41X45UTK%0;$~v$%En{;%R>>h6-WS_r}MynLlQK-pQ5F*3|A% z$wT5}8DBPiUA(Z(eB1vS?7B=8`@09qiR@~w97-mjHo-}WKQolHKuapeq6E9}9~F;KoImfFqd1d9Oi_bwE81%l9%_-VK^xW+ZLfc=LFft7 zZiB}5L#N5_tUb6vepu6NcEWou7=E7VDFdhGz9UtCrN%YpFC?DL+{*kTUWSaI216UC z&0tp^%g62Hk%Hv@=HeZ@J)?rCfY{AMy3BKz%Aql6+9X%4rB9K%y)m4hI1p$`*#D!= znOIqTQj3|jnAWXzDA=W<8;vkEhp4$Exi>p%)I6o8r9hM1O2z8AH&$5akW!b@sCcKL zYsdbJrPJM?Gln{%wacS45j@WLRW1?n#W5WdVCuEqyiGH1vz$qu5brd3vbYlOw2kDJ zv=Oo!BUe!~I{sq3F9%!Ly+!rBcY3J=?o{3}5Vps>g+iQ#xLb`fhoeBlrc#M)q5f+c z`WVa82NrS`K#7$XxQ+O-O_T1LO>cpWC3|DrDlzPP1cw~q>l4e`Q%_?`DiSOB3Y@SX zQnPR1cr^zd=!j>ZqrjZaOE9C%_c{TFx4;3WUpz0(zw<$|S~bON&HA9zb~73uSf-Rq zmtyl`6;5#avMrs_|82f?&JG11?f!h-K-6J(%i2b)3?&#i5r0CdrV@htaYJB*8m0+o z8#5n|^2F0b6Elw1C5b$TOI?Tn^TK07+)-@PzG)YeQqMe`vo+i zJAy#{ISbrbI?Vf4DMJ9aEcwTENEb6uS@Kj6VS>-TW$t6%*U+XSOCq%rFV~~!D6oB2 zxPT~fVjtJQ+99_bAfu-TWazY&8&K42uHN{2C_wNdDRxN`ewH&toDzWev z;@b3!2RwhpCJ^ZPD^gU}&*%6nVjr>hA3XaAx}x~ko!f=n=b7uK$p+~M=benXLNjLZ zK;9^GP)Bxu#D7u1R{up8Cj$kWsmFh@0sqD7R@04FKO<*g2gW;WD~D(+f4f3XFF!s| z4)R&&#U`8=fAp+4FE+W2@}4u!i!X3|qXltZY`}R@uNo;dww;@3hqBoJ=_zK~w85rn3yk97f^2plvPig#MiB3AAU!(a$VpAKF-C>ruAJgv}b%>@BPEnHErBeYGVvE88f3795!asa^SKLrYS}6(l)3%h}}sW-87l+^PeW zg{5|mLn%L|xM<)QDJxIh&K!jzR;=^{0*n>K$F`V&U$!tYfe?F~&!qy-wiXA{aAqQ= za@Qeh2s8zXgn^7EE1$<1+2GpDE$S5^auDGjDA;Ds7*?<#J%$~^)T#!A5g&iPt}9CAWbHi;7uKHRRKA8v|+UP8;v@W+2w%qho;)@e#ocNeqcMoQGX2hiVh*^dQw-aC0 zbY~p_$p>2l%0H69nAtb1%h+@N&QZDRc*LhdyvN-_LI*%pqxG~9Xv>`2(7iR5D0hY zjFrSp=<{K%;(g|(N@+4ilj8w;Z+jKdgFW65Gkbx%n0aB647fORD!k>=0mjhEo2}>b zku!$<+*9juzu7{6ZfhO>T(*u*a;xbjnfpjK%{O`I__*a>*p9C^{9&3S{x3e+#38G- zO6s0{xla~n?U=+g=e}$)Ib)TWuMH~(bxIg1l}t|S(|JrBZl@8U(PD;K+zsJnXHlB= zC-Tw;Ch}NODi6lkh1lqM0fYm!II7L(>E#%%uiX9a#1X>oZe973do1eRC(!Im@qOj6 zF-JaCugkF_Y~NP$mds@U{R?bs)URGYa2d4M6afKYXT2QUwa{#=1tlh(Ews>)xAAOV zgX!JRTQzhVb~a{nB#>8$Y0cJ}>K4Y*qX(nttAHlCcg&2@VWU8in=Nvh4J1dY220|Z zwg=oQcYc-5#Ru6&XX9j0Vs>AYUE=>AXKw;uXHotCr%h->3B9)vAV69I1PnAlpb=VA zG;Py1Y$Xf1Vd;X}!eb~<;0BPTK$8^0!(|h2ML`sC1@)@}3bYNhETWcO5d;*S7{R(w zszCF9f6hG5b8k}Mqh(g)#gRqUWfx#w z%a#Q$@1Eluu~~A&|G;_IfoH~@RAHP)%yfplD0h5mu3d)5hcWFvSdV*dekJpYMRE60 z8DVD~Yg~I>IKRGsPJMX%^!{U}^G>N@J)E088_%&!y|;E#8+5)g_;buyZEndf)^fx8 z{y8(dW3P*f>vh4*a0`c#&qpugIce{E>R;c;7r_<}FSA?1=ElzU{$m=4+c;j4X&yAQ z=2l0|?M(K0GyBggEHP5x#`ixAkeSeo!~cOS+qY;ihr5fpNZ~-^rzWx?ajMU51ybI+ zWt@M6)sZ_JIhKgAcCJXmDQzak-h+oU0saMhx>FMFFIi-AY}^Q0ka54Z(j^Q*t9$w{ z$be2{z~g*CP8$l5@;kmzr@P&M`1>>#I@?HSzL#--t1DT%Y>8&W*>KlwD-!PF*p4F+ zKa={t!HCe;ZKu!KaRsK&_z#*sM<<0wPM=k%Z1HK?w$rCPsWl}WKWh3sYHX38KJ!bu zvEu;c`6X<{j@Hzf5{#ZY17{a>u3={!K98O`w~r_>kWK0S*>kuD4_6_ecY*wH`83&Ws|?^oXR*Zx^`1|!yI`)AdU`rDgQ zNB7kz9O2xVY)(=w?kL+*l=NRZv;WdYX=H54=14!~>3KsSmwYCV+TCrF{Pf+>Keu4| zKB1|bpSb_}2G$OZnwt6bBJLc&4L@vf*e77b@#PqJ*KAHz)9%ePqd}G7h{dcZ{9$G} zc~`~;HHODX!X$U*;hBdeKz{lE4P*>Y_(etze(A7lci)oHWa{z|R-X9!9oQ>cVJqxY$| z?5X_@r##iB-q(c374hbOyk24OKh3PgIdOK!gacTU2g2j)8lE6J#N0Yu&rRg2A@NH| z9-bx}{?)yQTVz{=hJR@b)x87tu}|Xcrku zFcmH`1!7jfaP1L%gcUp1WX@r%AEG(XVi$KHF+ckDq)NloRNv10&R~jfNAz05%u1Rg zNhWuV7MpfA_w`5)rFxMtXqS>iPa%oa#pji>5MNpyrM%AFBVY8vZHj(RDUb+d0crL3 zKP6B2~;A^>+%J6N_K7^hf(zDoMa zR_$5#e9+56^^PORj^Ja74p;8ZC^Ml+{zrt!KyYZ1xjc}u z0*JgFL^8liz(19GdP88zpsfGIbU3lUw0|5~k@lU;Wqr`Wk_>q54PNEclxNqn87oS` zu0_~2r?V3byCG9|8uKSF9*nIuI5px%MvpE&4j8-Uk-9MB!a^`R@ZyXj-GegcVV6@9 zPA7h*`OXS|DcbX4`he4&cq0=*F!@r3 zwlaAeWq&OufN;Ophaz=l@;2K3mkUabQ1_pjkk?lxZ=>!nEvPn9Vd3fLZiYBhMxEu*!hTQQn88i6SG z^_}62h7C&yg+5wW>du#gv&S2!Egrz$L6@n8{j>2jeG`r}Klhh#Ni)n^VsUN@_G0_Q zAWfBv#%Ibl2)SR zN0Voz2QqX}!wz`A98Hu{quf-(zp@8#L&1%w^usBFSHomU&LhT;XszHhBzljo=~8cd z(aA7*EWs~h=D)WzKR%esc7`AG56sggZiWPCI&qToYDQcD#=-9aYsSs)c>K8q(2G)T^ZbzK$(q^MA}U*08!YV zFDB)dS-H19neX@i)*rPuG5BTzXLNtQljJP3w;dpJ{r}KN(w}3kKR->N%*K~&+8tK_ zqOd=5*%Y7JsN8-9<^DJRZn5?@ByeV96`yu5otmdhVSB$!$}O{UKPf2pq4bO7ceq1% z&Izm-Q-bFcNV9oZk#=XqkW6eN+{5wc>NQA@if{tKSf*%#c7!zzPcG_~N>+snmrk>? z!Kn=r{PzjGWd?80LU^(N22K}RPUNOza`2a=`0TFpX#Q_Yq7G|mWfKriq|Hj&EN>4h z8lE_%TX(Y+tu2{OS-NwzI}rRW0kON0!i2_8#hARdhjOJU1G&TC^i5i2+eznp60H$G7@XJfz${}+HM9KW)p+%hZomYGJQ z%Pb!76F6RU6ZlIF{%%RV*%$yL|MK-l$oI;m+%hY7b3r-oR$6=`^v3H~8jrxnWAqkd zVO;TlACJ*$_U;8B^6STP>(3Dhp0hDXNB)@^wb5Zje`Y4-mRY$+3d)V>51djWo58xy zaODd0l8M1lN!8hy;qRQ8w~qVo+i8Q_p3i?*<@=8KxOHODLo{1^MBv+H%-jR(TW#^8fI z6z0Ll@z2U4e=f`g&YPR6Wj2aCD=r?!->)6f(Aa5D(Qv8WUSy&4e)Np@vzj{mC{0Wj zs@k|;aMKKplPtJqRVJ6^QjQ;G8DY!gSN*V~vr6w{q5z%vJf|fK_oUP!-KuF6yi#6O zT!@xr=11{4LZNAcfdQ`)-eg(*39asdCRHt=>LpYiA01&3gCuVA-g~$pOa6-VtDG+O zpL$C7S1VfGWBRzI7b>*52l!^zZdff77X6Df+ZdeZN2~wOjZytUKCW1=`uIcRd&I2Q zd_;{RbP<(u$2Zg6|2!M*dhPT$msydUzk> z9*}TD>^}N?YRH<3hrF`iasRdpSeP-@d$Ryc46l%PGX`;|PDp~Ay67|_``MvMxp^z_ zb+PuDh;G@_)Rw??=Dz9))b8#ufU-H*{Wna z9&vWUKGFEBF17iX_SVV_(y;lWFyGSI-E#|?nPpEs9d)!BR3i*QJd1l!FuLu{Mn>2OQFGImzGhU4IP#aHC~f;tE+=x_pe6V2hSxz!?N zCni|KH|8^sV6XFs>?BQ;cK3-GrR<>%f6tajOyA)?lBDk*lTic$Hun*GfDQB$872Eh zlH+=kOM2EY9ryi}6)PZ>5zW5`&y0`wxzgNePJ59PKkhMd^P9!j@MwAWA+Ghsh+*+{ z!#mk(_&Ts*nH9)7kYRbK(}rb`a~#6&x=mEbxQ{WSneYX7n0^DQ&ecR;)7=!yb8c6D z_jr5Dy)<1?;T0kg9c;*TuE?~tCue89=D(ixARM2&P6S00=q#Xis#j)p3{}<8q0D=N zHvZK_1`L_%9U$w94K@svsK(wjpZ6_Q({(1d9Njy{^JefWlJ&>s%H}+YnZX%rd#fu> z=EDjJWYXF?+yXo0;^Z-V3WTrj8q2i0$V@Y2*E3(!Duc&ex8BNW0H<~B+2KAv#tcjN zQ^u&k>foI3M!UZdtd!wp$7^Y*!(Ba7CF9P4ynf&{RVW8D?D)Gl4d##@(ZjQ7Txz{9$qV1N5Qx zs(ksVJ+HZ`d@R4Ycq>7E&oC*Y4tsG{T^1qC!eCZ4D^m@1wck)bSvk76LL`AUU^eQe<5xvRMh3s*jMRmr+%= zU1$5MwW?YbSIvI1=hC_{-MfT4%Ms|raPD-7HU0td28ssmTEeRgrN^=dAbTpp%WonF zU=usNuog2;8S?FI^g>FyLREjzSSVi>^{p`vK=*P0?HR3X2~Hgf#cizr6q~&jwBr3v zXE+X1*mQW6P2tC~mqB+4&YfKfKr*=s-|N=-Dc0(0Rr((Y?GaAQwU@AXWrlA^3L&(tx@yI6ler6 zqvIY-G7gTQP7;azp1*Gy6Rmf~j8IJpj-g&kOypQ2WZxC^;6+Kg_aTNC!4yrPnKHbdIf#XxKA;d zK5F@i`a;6D*l*{W`Q7tyIkO6yr+WWAQljsVh?DVFZO^*ejIMI@a6#pMsd92eLjKTr z{mjj-l`U|pPcMFCX2<8Z_30hrC|nIYrOTtGLJ>-_Fu_gzx{?uqu@uoIP?aCjRPQN< zP|v!G434@Am?hPF6gh*Yuz9xF9Z>Mgx1LakAR*5IM#0hxNgz>ZRld+zfzfMK6w-`l zZiW{D)=SpS1<4o`$766Mmr)RG@Nw%#vMxlb!re0Lpz!9}Ieg>gR$c4JS)Ksd#T?HjZR{q>v=feL`1*XwrlH-`h(NZp zgkA7w8&E(@rL=bcRbk3@BXvD%2tf}K^L6Ew%#81_r$D2maDjSvrfD)#R$}$8keT`R z{xR2Y9alswI%(Er(m>oYCM zIEtlP_s3`#zu4^~#_2&7@;-Iy!<{pD*>5ixh*a-a$sekxg*piD?zI~|n*)6X6$v@b z_1ZgjF~{(wdgYWV?9r;hNE{{nRQo_197KAmcfPNkreddCm&aL-s6eN_qq7BnZU)d= z+l}<0vkQ8YJvi6CLdQpbRY>)|C3a`9giEJ8JCDon$spP<5{w$CVDvv>fmH8nQ)%tb@~EhjE#iUSwED2XDP})J zo2kuXwrO*6@MZ$CDF!(u0=c)C2ZU-etfuYmBj(0QB0`h50!p&g-U;29BHXj16fd#O z+18mxH`Bh~uRpuK!+f<^K0FT_D+fE}z$nVr_G~T5exzsXIKl_vI5eVfKoIn_ zyO9xN>gm$X?^7W&*6WI72;XK62xk80$w}jynO;(fkt4K8kl27gIUj>J-(Zj zveL7mnfPRD!Mwm)JalW{E7r5K?Q_SC;jAV-RGK^CpfS8RN`pd;d=LzYp;dz6JhfVW{eu_C}`RrA|Hd;(tZ=KEYK9QcHPm zmUcgH9>Ep3+_81(>M;!RD`R^8ycL#6XZM8nco@L!;Kw-Vd7~(ECJEg;G(5uJpV!}u z8s6&Ozvmt1cJMX*eH>k=rjv5IH|>u$Mf~KkR;qHdn(;r2QOF2R-?DaCoSvIMCQBU7 zPmF1JfywyY1nbib>+QC|ny?}bFLm$kPC>0{cm$-&!x!=1E8ko zfz-Dd$kfr^7^9rlOq<)4fOgSrklpxTr2o`(;GA&$m{#}afuu2+QK@2Xwhp5XN*Wp; zJRy?SK>qIO;ap_g$`o!3Ij0*bz0+JoKQ)S4&(E_l=83rUgc!39VfOpiBFwTM)j+kg zcX-UEEpr`Cr2;7JLwb>2%0Yk4vI9H~!B;(l#tT4_6Jq*!8^SSZk?hxgA)A zHC4}Safke&fXAvB@~_54*oy%$)9T7b7GZJERyQ@g9o}`h=x(}eZcekFeZnL4@Y4>D z!B2XxTFWU?Vsci6LD^bzGHwUDFCDE|zbRJZ{zL!$!O`ENuZ8aQ=&RPf7=6{djeOA^ z>ae3r^;VUD09qeL%4`Z|g6~WSP=Q_y1)i0V@*4dXhD6<^0Pf@}IDoh}pZTJAyR`hi{6t*%Ks*J>oT$mEoL{Ecf zF&(@2&A4k>b|M63vRP|)$C=dAvRX5EtSa)BmOysLv+msJsjy*wBb-+>xO=|oCVMGb zg}(R$j(egJwD$}ieQ833KqUX#eEzFmNNI!{!`4PzdhOS9VPg@VLN$}Xw`XlFoxSFP zgpuy1#?T@P?gqc0#GI4Qx=C64g)IUzj*6{AuZX7%L;-(b$|`!xT5)=&jS`&&{J{=L znbm4PgTlRGmUXm%DGyc&Q4-F`;Muw$OD2d^R!?<=*#t4kj~P~5RdT13gM-!Ca;Vv? z_`ILUljA8BVFs)9mfWlo`u9T{LzC#XKS#PyqKS%~Zo7OW(+Tui ztfd`MTP<I_Ll+M;=r){E70rtSyrigY>+Ep9HX7Rq@8s*&wsb(=)9nJvX0Jj^!4tK9 z7ueyB&1e0AtU=bdqA;{QEB=Y)n$(18hnO>N@~48~d8-zrTG?v~DOZ$-^*I&s>V!6( z)A7yT>Tb*DpXc*6F${DK-Ikm_#e){wZcM&6O-h!w+A&C^9rUI5qlCSOqD@ia5j*BH zN|fe7cDhA&eqfZ?q@FT?G^>f=RM5ZY$jNk!NE#psl4aU_a*Xcx1cR=(bar&OF?raM zA4VZt8}^jg7l~%N9q&uT&kD*6P02M^7=byFfPI?5B8F}9L;4DR(1X717e{xe58%;ibO>>PUv+$U7o{d!-nP-Wbd4t1%d?Oz!~>OHo$)HiuVTPGPT| z!6kCDQHr2h!3rAPYf8|_|Fmkcv3L8?A^i8zQSDhzx8Ke!(Qo*$(RJ|UC5=tHXFR{w zXgrDCRxqBjhJaQzCWBIaI&1X;p|B9Hm~DDyhyq_wccqfO5Gcn}3x}JGWHiySYby%v z!X7eyMm(ScOs?8?upu)Z|9DhiIZQlvn_V3lZ|+N$k~@f!ca&WUT5`niQ9rCBafAPW zg0>;6%^kmj*}_R}9-C*#jKO^@--E`CgjfU%n|d}d*SRY zD9UgDVb9_DJYVN{CgZlS#iR;;Mp$=!kcgX2*D;0{%j6Gr?=1&)x7o$#Lp62_ml4O- zkRy&IE*=~^=XWv3?g{KVbcjQJ%G)n2S-j_(MU6}(9;VD|q~pzK0(IdWeIA)Rri4o! zRLZY|tEu$el|2I$J?n7@;jT^6qC5Wb{3|E}rwLKdgz(!Hzxpzlc=_^aR&1LLRjj%r zU%ph(S?)ief@l5{qpxbWAo*$%jb0FQ^7fjCZyMaXa268@N zyS09l5M87*(asK4re7ZGm~3X_L2yaLQw}$Q2w&4HyJy)vBAK;;QH(+V3nEK|(Z005 za%unQx_R)X*}-{3#WYNbns8%V3sRxVwfroiXm&>l7SJdf{D#0WJ~n^5>#a?3S*%Km zQ>_OjaDKy6z-cpHB@C>^7ac52`+7804e6Bvb4H?+^;g~V)6tfKEKTTd0dgU&*ccz zxs8#vNEzx}I@R~2?{Nk9AYXev;?Y#!&yFmg-!TnAz1DtTXhkm~?K?U@$h;n%AJk#`F~p5a zRdn-G%J1s#9ipc$IxLv6uzEV%_$I*Gt%>&A)4NN3^k25|n%|9`?%(8hx{nK;O`RNU z*0{s?rt4UiFes_s@1syQ4B%Lb-=-5cxbw$te5Ju%@ZXKEP^3KA4-af>Um0sXZgD?; z;a#gPi>Y*~_bln7a4q3`|FiM$GSfvuUNGDzXCD>kPs)}2IDBq{5{r6V$3O5HZ&=NzuDlq@ zNpf26+O>Vo9svV2VlsdkVT*fZlNv<8aO=1jVtU>wHeWoj&!l=|pTT_vJ8#9HCr6Fp zDJ89W%dS-Kuw;<-j}vhWuQu2%bI*Q_VQnJpC6y2=knaH?7BxJQTCKymo`JHkSh~0h z8L-mk-&0-ES%ck4ac=&8^kV)dt+>@E*E%D zw8b95%5cuRP;T@06H?0#FWiBPwAb=!lBjsHf|0^!H~uv&yB^T2AZzj^bgiqN^gJ@Q zXMlh`sa4ZOYFHgfSWmM>^l0^~{3dNCEaT6YW`y(W)YZFuMk55N#`5cI_8(YY+$iB_ z1Cr|ffl64nbMs5uh{8Lv&(|qieICbFLgr+bTUE)33oM;W;EGnOR&c?)P{Vi=B`GFb z@Wxh*&A3=Y`^h#ArQ`u``41w>WDnUezmZ<513JS|2c|bNA8ZEHv#!ict&;OQI$Uez zH0thM1T8i2rpDSYsru!g2w;hZ9(LDxZ}~>ooZTZ=-@`*>yDc{G)Fh%KZ^l zy7wu>?LnZ8Af7pSDBRHa`@`p6j`hO|%$KZju2;&qcUaD432)-NJ)r&{2pK;DT$7Md z>pR&017QRc)^KT2;qLqqtCKD*%DA-HJ_=1=I?(BECG-;!=H81YATyl9B-d%snI&Ar zz6P9Ni>ytH1L^AsO2@$(VrFQin?h?cV9K7;j;$I(<)CkD9p+kLp82!X>^u=hl!m5b zx++wb*8T^Da%S4FN74PlgAEA4Ywc))iJ_}E#CVyzs_{lWFK8xg%@N$8pwJAPEhV}03poc_yH^KJ~n{H6H zd8heS)*^tKbY1u&r1#Mr8U=3>lEG8!>_E~Dc=vOGNqG-X^HLrgfz`r2&y*3cv`ZKT zZ*l>=)gE5gXm~hq*0$2)=bkWo;~2fs@D3<|*XQBw@jmc?rAS%B2CGn9MDT8-s?qPG z1@Ja{c#k6;lm3=Mu+N%MumDnTzfd50Y*Tb^dgTatM9b#?mH2JfOSkU7K|kGo8*Q=; zTyK}^1X+9o=iQsTC%Ipu6Ubj=__lmz2uy{FcK0%YuUp*o z??zcT`eq?f_rFW3QlX8YLv&nEfio1^bMo&cDn6NZ7MPEk^|l!-1)y7r**EBql{^rr@hg)Mk;AK zd#d)c=;9}mSH&MI4Gp!$VW6Ty&O}fFX+;P~c z(S@7E8NLe#`7Rt7yd;Vn?KL5T$9ylIVP?VgBYN>-7PqRQDN!HT3r3*Ry^TAc7I(vs z5P6$4ZkuEGOqgvm1eNT>bO>3_MhG7*C;i+Qf%$ii`#wWH!jLE3eXJSs94W@gjz3cN z+TAnUMf=Qfl zd(2X3z-NA#M_#UDz!vs3HKc_!tS}};m>2M7up@} zso|syH_=!suhX!e$o~`g-^Bmv{IBMJ3;!GWU&sG?{#Wt8hX2R%zk>he{BP#}!t8{A z_kKl#x6=w!YX#KJHayq8Ys1UkJ8?Mn<~nsYIvY7*VA^91FQ2~?J_QpF|^jslEpF-Y) ze8FJN{kuuA=YKj^vU|fiD%Pe}Z>Bj=zGUiqQy&T6BJC3Xs+ubO=~Sj-x?$+N2@vg) zu;j3oq3r;(f_NQYHj#VeZ^joDojd+sz!weG9a&Xue{oKMt=^H^Hjt;@43+n6na4Nz z#I5bwQoiRJB2eU-hmF3Fm+NQZ_%l19S2wx)1m`}RR8JtNffy=~7yx+T|zv)&~Wb_-5 z3LlkFeGL4W4)cUp)(BeDu<3%SxjAF{%f3eQx|FNjP$H?NmaF>fzre4Gur=LZ{)ItQ z6s1;!>-5y!8yYs9w|B1T;|w=kir8wHU5WwMRw43ZeiZ9WL{_=wG-@w)!axgjWy1@p zp5LkgEv#(wrs{CxRK6;vuFX|`kw2=TtkB~u3Rk53N@MD_Dd)>>dl%U8@1=TeE?t?G!q#-{&u;`8q8>Q~%yy ze@K{`_To_yhhns*bMgRx)3#ic^s~23^)3Tsn1aRT#049Eckc7T8vNkB4H561dynvK z_(%3M9}~tzVN)#XRzm@a!rg!tq#*Fn%f5R@K5E??+$y5)A5*?7sdyX}!<(vm!M)9; zt#HNQM#_0q7euHcMXdimqgEPFYV|8rf^HRb`9ju(x~W?cQ!A#v+_1bld)}TLC6pb} z8jfvo2iPjc#xK=-0RV>fAdBFtmbYU*PgkuyGpCI?|6=m5slFWO+DJ5;%kJee`nY~= zB!^SI2Md$3X?BrzRJh^kR~j~){|OG4ZnAou1l{*;uH-(eZcuo@+3J3?M)jGbsopom zF=f-{Cq)16xohdi3c6i8R}-ES8wJ`3dkr9fj)fg(YH41sk74q zd0^-M7pAV6tt^re3;RZ>2>@qb{K~ethYTSU!Bp=eU$hb^#z`XZ-+)HJdWb8-){4+g zePQa~!R0~@8fTPMq*lwHG|su!rXH*xt4NVw=Wm`uZ%%z>4XfGMw_k4HaxFU}!eO6? ztn@@y5`jAMJwpK{&U>gPxpCTK{B_e>_`A_p#Dn^7w7Pub*0AJ9(DB6k)Oj1wJ84iI z=T{MKtHwvY+_+VTamz#I3YnZGwz>9)BI0MeNfUQh=D9nyYJU;Csro`q&%GS) zD97_7NJjC1mRA}-(sH(LXn)ch`I=HdSryYrKWB|eHI=ExLJbS0PvmcQzX#l5OAiS! zwGt}s6>3@{>U_fZN4!w*T0JE;KkO3_{iyrZ^z&^>a=P;p8F)Z~V*tP~ztQO)Ps$!U zvh1rrql+WUel;qKMD;D_l7xkRGk!vW?x+o*o!{V6-R6Ha*S!i~dcnOy4`rIzvoH$B zyEv`tr_*t<`4x)s+Tx4#t-0)oOn3o4v9kNw0UQ0;Wi)Q#@#$7KJYe1KbesLh;w1_E zAh>NC_?v!aXaN7{2tHnrJe^+u>8QQ~zl(@uPl|q>Y0fXKg|e=aPIn(^ovz0x(4_5q z;~)Ng$De;`=RI~8sI?dOm+{15=`K%Qi~3&FGdwcR{tJbJD(hO~a+C7+w>9sFJTNBP*!NO6z#BDAcXG!bRK)suEZL8rTbgS+Xn5n6 zeFws4-~L_0x|K^B9=Y@sqRMwpeIZ+>k`2GjmT)H3xS4(dwxak~^R6nQ@n$8?|nqHN|wG1hCVYn0o~OV#)9j z&l#*^oz#mo?y%~$_hNPL-o@SX)#%Dr*QCd$dgo|uUS54H`;o709qw@V+{V_0J6XbY zrF!25TnEwGhQ2G|VFGkei;|uI6K-QWt;9A-&mCMxdb@k=dJ{YM30qTprEHz&b>8## zGG+I?1!%eF9VPYlsh)LX8#bPQq*sZ{;qGSBifi>{+OpS=&)ZFk@dTyPB15XmkM*n_ zE9eYfGq&7oUGY&r7hRtIV=yJgi!RpKCD7e3(XsLRMkBy~>+_NKz% zf2iH}V(2!M$P!Bu-}Wo#A4)NvL4QP>V_4o~U_a__tPh79?M6WQWjWec^|?=Xy8p8C z_2YuYN~)JIm^fQ~JxR35)=MHRHk}1(2-wkL)2~!ya@@Su$k#!KrnNe29?A?8`!ZXg z3{r>cXk$GW1-s{w68Ggiycr%|tr65fAXIlq>oxM#mwzDQ(z$FMNm60B(}Rol3Cs|9yWp^xUAkrk5_SlNJ(yzD zp*?1et*1yJ29$(4pYW*P+er-u^BNAs+DEKL?W{(;SN&nUT6{D-Z^UAB)jgvZi#hDn z&o#y@X?LITAAN6}!umD0D13`nS;E>z*XnSe@FhhWkJ-VL@u)Ikh5O_rp^o)d(jZ=F zqTkdl8FgqtG^SQ}f>AE*4F(D--G1BpC_X_caS0TkKnYN;$c^ESJqRALc=c~#P}?Iz z7jF-`>w4BRE$!7Zy?^_%yp?9S%QvXcyTs>HtL1F&zN@~pLwd%c*&T6lQ;Lh5e-Dl) zHLQQ+8q#@P!Z6B9g-#4A`LB_dS!tDf`il}?EKU=GGnws!2f~l;+FT^@%2U1NO1Lym zV9#HygynGpuN(gfZ@5$91TN8KZV?kMtsf5b^Uj9`2G-Zr~wPjIPe&j9slL^m*j<)W-+@FTv8B8Mx z|Jq#_^w7iL`oD5olpf?|N|EdPTRwYI5Ef)}4vG9(_I>gltU<{1Nx_W;`8Mh2rRhPM z9-NuSN5`?me540>({U%{Gc=h&Q_oG(7~)_#dVxtdrWvp$YGc%NEKT4fU{?WqQVb&d zDaCR`OaS*?TQ#Kd9tTXF4^|n-XYLRuBLVP;^sPL|p+!Du<%)1YHLrKwOW#y6n7w;( z@PmS4hX-Fz{wf}-3BFM9*B-&e1%H(V+2pTTf%=9F*cDbr1_1w7n^0UX*b(%vzGr{- zy@(ZKyIb@5STIOZG20%xI!=(tA>ju}LNq~dO%i0zNQrBbglNWIoFwSPof2I>fpPyx z@KTIwa0Q44x+DkNz$Tl$6f|o}h**PUzu_A~wsfSCrRFxhQS+~1f~kujya$ZugKcyf|DtaJyppr*G!bP1G`VYjaF>{OR`4CN>A{^l8NCM&fmz$RetnMO8CUg% z0)1pVve5mp{&CI*9i9PFtA})c3~6Bm={W$K-8*GY^kvS8%S?~TXm^QmtZO!o^l4+E^Aj3lS z;CQs|UjIMU6I0aj*Xi+^-MvTGnI3_Q;<{l}R~x-FG$>kfinq$Y5gLt<^@o~8Y!u_B z8ccm|skds%%X_;|GgGq2q>BJLgwSDz-hDUSLlMOfLv#tybyTp1k;=Fe{tq41n`Y(j z2ka7ph&eiMJde88qwaL4yOV$fv>sm)F#lT_w-pG^&Tx~v%5u~GZlqvs5sLnmY&kq| z<7)a>_$2j(weJ)sPL8`iZHTqIpZ|C?V${9!TG2)v0y4XgM21ZRD>o6DyZ7pF$KB<7 ztUDHpzWI|8c%%QIjc`If&N?RnCnG7QZa2>&{y|+j$@}yXwL0Bh{_pqi9~y%cxv~z# z9f1&F>8eiS3auY3x+Ccy+$=WoL$L8j^b{Fhh73=xX#71;rbBOFHzDMsA?R@XjzB7q zFNoZ+hmSQ_t*%e7Q1#0!GH*q9y2JgG5zdbpS9(u`@11{eIQcGHpRXQ2pHQ{0q}Kko zWY*Q?dtB8z9PXl=SqrW%NnbTYu}s~}}`l2T;86j+~lKlq+VM0z>>?bRsjSRj7~XcR3Yygm0x#hh@K z@e@usQWp~4hlIy3%*|hj9T?H5aQjp;56jB8^r*CS$-Uo29aub|N0t2X9s9$qF`|hR z{j&23CLq^hKl~AwIL$I8yy8DAzEqs_PF^iORq46jRU_JP+!J0t@g5=XpyUf77^sTs9nVAQAo z?dQHOU?UHoR{4Us@~V7g1sEInijbjkc$O$@JmciJsjz>01?Jq-fTUv}M-~9#s%>Q< zkg?f4gPjtRoEKM_kgq}?{rS|q`=k4HmSaWc&|M+11o>&9SNV-PeIncV8Pij}E&6?7 z3GO%e2#+gm_;srHqxu}vup!kuRbTk0f1Veq`aG&c`MdBrg1gyr&o=o$i{zbHHm7MQ+sSOI!W!lquP_L zc1bv?&3%<~Hs-fUk5r#L;nUY}MM*gB$eZ~?rvoeZ4R(rQ1+o{3k$DQu8de(o6}fJ^ zE2PRa{DBjRG_6;}HBf;f-0z5r>mfU*Z>?^hsBMX&R9{Y8()^U3=P@bA@!gZMJy z`i*Ub<8Z0((mSAZq~v9)&(82yav}>}jjDdSsCRfcA2$f8YriY3kLQXfWd?+D&6~Pb zPCYo88EJsrihPltJ;X zqE>fQK6$p1{kkH{c(Qex-u#E*;lUDwb1*OIcCV-qb-Og`b_unQ{5C%r!S=Xh*UGrq ztK&U&UJ|4eMT=ATVH>$rUp1d$M+w%!HiWts8=T1xUNZgX1=V9{VJ9)i86uw`IN!zpYFy`*67rCht&2EXUO?XcJyRi=dcpN^<*>C>mt^JNQC1m& zv=EMyg3ra-U9$$I;!q{LcqX<9IDlPI8gBGAqL0hV#y5OJ;iUfd#&9l6TB`R>$Pms& zVNdmbS)W29)q6dk?e5~QdO3;>(e(I2*n><2>zYsunpK;8;CY;I!Df1I}8Z*qCA$t(kQWGRF~2Z)(raJi1k=BwL% zva`4C4FO*G>~u>nM!>M|1MqB)*(U|RNGe`5I87DjN_~~n1vIB!Jw6utvm9+0G2YSc zPQ6KpiNbv{Y&N$JgPU|y#qkCft}Vij?Ey;^q%H4WAN(?DWXHi@Q84&fl5o-B14_6x zNjPti#{k2@IZ49lF<0Hi+>@llR&+SHV%z+yqI}f7;Xse^IngH!d_&`w^wM%rG%vhZe zXqI~GR(IVRWtI%>(evLict32^PJdz`4Xed{ z4)0i0fp6L8?7HhX6(qZ!{n7O8w6m_TgjDZEG}^LZJk1rk2f1DnLKe}mubZ5~=*4h3 z8?_BZ%sB1x{rTVC7e#ygO6dFX0@T0kQC~aO5A$EBWk|WpmOxpCM7ys^fxL4?y&e3z zruBl74a_{Q$$2kNo)}NExNQqAO7CtBP=U<;n z^3NHZZuz^QaA+3>qjc!yaGks3HuxS{s4z^Ef-{mD=|SNXoE0auyBXi~qRr$0Wmm*m z$hP09>qYG?uwj+nSRV&ezeSrAh@3H&cF{f0jv(A;c;EtG%qs(y1|z14)=Tkam?`7f z&9yx(a;nPsK+j)>y3kjN?8d3Y5jUz8WlaoLClJ!OdYqTWNyJ?nRkM_Ha;toeDj#GO z4~{G1_;G;@!E{FX*|@lv@{r(`1mKQAG_rqz5nxKTEuPzW4||$%+qBJe9Jwm(`Rf;$ zbR;1Xmsi~BR||H)2$Ty-*e!PN5~-gN94gtqP7wDx~8I{ZR!u0zpdu_18kN6cp!|r2352+mcE<#+6Qp zD$UVoX^-Z1TF7LBp}B4CUs8g)b}F?7TglJ34C9{ZFP=8+et(C^@f<%PgWokTW!srM zYayd}a`=efH_x|y^KeP`%!i}~cDkD<8-0l+N-s_hWGFI zAm~b}Bpttg+bUNKdv#cfWyT!>nj?1LRkD}j7TPx8JBPLb*C9hCYD!JGX{ctKy?5=l zZLqvox~13JB%DJ;DYMNStN}lq70rCosIN8h6>tc86SNc3|MtCYdV0mM$du~SThffX z@av<{ZZ@=MhYJYGkZlN8E=7f?_xt*T!pw4H{QkNx;AO>Ays2lo=1^YRioG{h4kx)a z;Xml!=q>$m+v1|`1=`iSqLXbB^v{u8#l;p~8EWdU3Fnj&&MQ2owEr9(I&u_l{fTDn zi|57DIGF(Mi0fiv{W`ckA;_$l7ax6h8-hfa)1?FcerWS|qxoE|`OH+-&AFzuc@bOR zRJ}tHw=s}VQ;&ypz0dMJqbAk+q<#nNEft6f|4Sej&py0qkmf>??5PV^K&wc|xc}TH z7XKGNnMS6bci>+D9SoRHvx7gx z;4|)bU*)KdMH1@(DYVFl*Wyfek5SvpqPE#HYEO0NXQ2Z}g{2%7Rt2`;niwmN%YQT~ zZ;JfOC^kXvlIoq!q`gDu9@9hAiQhaS{*b=e`*GkBbPsok?*4qL<^=3i8_t{Aw+6OJ z^=<)unCT2x&8os8#{5|lOoHr@5FGk!AeWi;SEn1kH95OQ-K}D^+7f4W%^F&uF=2o7 z+Y9N8SKLy4i=~*pmz3gehbQmhf|+4EPfOa|k-s$gt?79Ms08xh>6_j$?)t~*Gt!n$ z>UgmdhI?d*)~A1d%`Zo!`8DEIpV07TBG2|d`>7Pf9AuWUDY-j*qMkJ`DR*7xbbHwx;O z1=l2hT^f`8%WoT{{2kA=5ETNL8YR3YMgy^)wVc_l8;1PRx9xenest%Zv3_Lt?MyCR zl%pTj!-O+dA}^=f2PymT(QaVfrgk(0q((`@-x?kEiVKlI-H4DdF4_ zyp_A7H>j@~yq4gVB!9;kr!zcGoYOK(5B`eHVVO>NQgyg5qale@O?HlK1`SIV@4MDC zx6Sj?V+b|F*@Jn=IQ5@mx6=N(9+|GP##4FzA;Eib71Z(1eo;tE7oQXqv5SdB<=`Fyg)Ykz z{yab^0=RJ=oK=~SR7ns1g{?1V8zS4z>tnJ_2qsZv@L}a~6K7-1+m=B-&hTOkdl1m}2KbIIo%%2v3f|<(1q4eX>?&1)FXMz~EYnE7-(SHcYV%mC(L9*%D0*K9!VD z4^{Kz;3+%FL$HS9dD$^uLXenOnWWU5Kt_BpXbS@fA%t~u4~ZV9m5Y5NO3%dL+xEfn-Fb=@dr#}Ibj)8m@AmPMT zH|z6itzrW=B(jRPp+VmpJ7$VMTC^)EF7T^#*;wUnyovWvkAWTm>h|n9)+f&je(Eu+ zjxihXr#k)3CH>8%{mo_l&FKw|<;?z~4UH9&2mQ^J@nskDM)b_LaWHL!o2I>}R{qt! z*EX#@xT&!J@J@MdWkv3+$`*gn)4#Z+e{pI5;RMoS3S&HBCXMOIvQCieHv{n6iL{_h{3W(pngm#!Kf z?yAbTeIRGX{mq6@4@)grEW9<6;p6+?WeEbZQOEfF>HZjpqx}>Bhp&A$#=%d#>u8GQ z)$Fu|;~^f0+=9wh*K?&uUZ%L!*ucno1$T(6Ob37P8sI|N2~r{WwBaVEDn9?Z)iC4}2i zg7)#>{mP4?w;aRMb$6h3$`Ze6kXRIngP?Qj?zAhTi|hmDqiI~J-1ahZ;PLEdM1D1M zUheG54%fSyiFTg3%-WniSQlW!nNr`KwlISS?=pU&wc<=*`#vGXXyZKQaOCJy;hc2; z{B(Fsc|S90=l%ZTR=B8$O(Wx4!WK{G0h782C`u zN$c_`?)~DGG3VsDci9D=@G9!7%P!%FN5SgFh!wAI!bppMY7# zN7DxvQF>vqi^l=^uw_i@YiqIaiq=HG|HynLvfoS-&kYMsi++{rl}(mnxb?EZ=T&Rf zQtdkX-bnSn#@}uh8zej5#@6yWjr~e3)+zTNaMu%kRtz?H=*ze?biKAFiFHorm~`BA zF?XC~w;b4~bh>{eMmTTz0ZWjEl_nPED#v}wh%IaZ!@S*acASu2#M*MwKp<5i zX0;#l4XZtcn}JByQzBL|BKwywk1LWSDT~!}w$3kzm{QGkv@l~ODeL)YcmF*La&dKx zODO*CaQB0ar}Ag{o36IFE7>>M9k8Utr>Tcg_@PJgAdloA zJ}v}G!A$;palS@VQsbhy#yfwtZVhV4X@;};1B_%$Wsb^@qJlXmNBi|=WtkxIk-^bE8@{N; zR$5%0v^Y5sJ$$dzakV3&Y7GoK9E8t;R(FRXqeHIA!Do^x7spjfqACgd;1B#v;{tCP z`tYg#k6|oBv42~op2=jqj8kIxqb`9sCx-Z=!Gu5Z>=F6bi8sWH&r9IopUukzd%kw_ zT5XEgnoeB8)-&NRTc45z=2uH%MlEY`vpl;e^~>`0^Da@M`V!1A`pZ}N_GydL11>1P zZyjU9%NlU=IyS`Ny2SLwSe!0{Px4&mdg_S`rTw#fn$J(%k=XqlWzaOr{e9I0mXx<` z^)jR=ZzmTz6VNRROF-Dna`}Ik2{UuP*%`a)h{?6RPIQ z+=@!`CU=q5tb*$%Nmh6l2R~UUaOJ^30i+2o1tc#{6aCTSuT^%U&<5F$<&lK~Nq+Yj z`HNA3e$VE9i0++^HkOQ55`V54|3QltKW;^T3C(&-^Rz{f40Tt zk18mCq%WTzlYIGg+>3hn`iSCZ{bc37Y*aSpc>N0&hMlMOXHE_0 z)AZ8t_<-An{slqUxx8o1Uj3Qn;erb}RM@L{-P$eNHLP7ZferI?n``VB7KYbe17r%0 zEYjh2iHl^Z->~-5ox&X&H#A)#p@q~U<&rnU)w((N5Gb)L4`L{?$`>)Xl=>^0f)PJv z0I^_9la^_3SiI4@d}Hv$5xJEMySC%-_b0C#U3<1{mp!m&OL2C;;9(jIe#77gJ^C8p z2aCk_UpFCOzF1BX!&E{@q9M7Zxc4`?o&6)PF&A98O&{Ccp*Fc8L(<2c^Bsu#$hD&n zQHrN@mrh__2h8^;UAz08u~6wK^6XMbz?eEiqp4&3UurzZ$_7Eo;TfjDYL6-mQ|$Ng z(%uL*$FpVE73XEmYo#hh+~49BBzfCuju%O@E0{dde6#qSpFUXxD`_5??fnCxwRrzP z2fFW_?v)Sx15FMlXtrxi*r9#R4@l*oY(R#N;a;vKkQMruScRlrpl|R{xQQ)G^TO@K z&?+m3iHHJKNOtZN}41#{C@tUYTG`xRI9m!@J!vS*ah<{A3YdM+Yqa@u}c-r15{iLLUxHsK}S z=c7_hSw@>HE4VWLlcj6rONbdsK8WwXrU#70Y*?6 zSLVyulQ|4@fSC-HeX!ScVwkzXH+=I$uSR|J1^xN!{x_I?hm0hMLL_ItW+IX5#bT6z zR^xoEGDQa3FSsx1QV`tkVSYY_seKF>>*T9SXmjw@;8$SqZ6dWs1Li|NAz~6pOJhjK zjfTY8R5ED=Ipa>wvh=MP53|(j^cEK7>~<43Redk!nhqbM^FgnA&fwMXdE?E$$Ius8 zRO>iw*v*{+!A#57MM7N^JkWKxonfI4w}|auxTS-`XX4-R-9e%0Zoch%VYXB+&nslq zP{UGOMSm*sXpKzRY`X!3M5>o_iK44{ZPaTz+f;+Msr! zJY}g2AJ1JpCLD}oC_S0$N}@IqKxryABbOoSiXAa#phSZsijXY)h63nWUDBNqTCHw} z4{UCHu%n94psn3#Yv$B~2vLgH^jG3FF+yqz`!_FDiyhu0%CmEVJ*nzNPg6WrxBmfB zEGMGL!{r_B{~#;1y`x&GV(nggWAH4VA3R}Uovs;OZmKV*x-s_z_auxlH*Tz+#%RbN z8;KDjHuv$IPP^9LpTlxB#4EKMSs%}7k~i!znYnaO_Hm-pv^9ip+M@7He~H644J&-p zu);SDD|}P4DAh$m6u#*={e5!7dxUS=s_;!6`uk{@pc=##zA5XqD&GYkzKQoK=NPNP zqT*E8R8K;%BEV~mVmIwMhR|F41)oevdzwAsXPKS%@`&C7k25{)Tz7Y0LAdzqVIC$W z;daWH7j5jbGVUvoGZQ*@lYYazGu_ojVB>c2r#-;M@UCMvcNy1uiLLY_#n|*ki&KYt zHkL93aFX56;7=f(>>u`rehR6k*K}2x)($o=kJ$#ym|xeagFla`47A#o_S^|OjA?WG zAXWiy6b)5BxNY&L?WMwA2t8Q}JE({=3Reuy(b?>_x?T zkqH`QyQT1(6GC?IZ?nD=ZUpb*NQK{CVp&v>Re++~&VRqccpI}guqU(rdQZ=>b8CBq zhrK`=bdj(0LY!0STB5INH!u2XbTgx`6Wn3?g3}I6@~SN51y{lEo`JH_~efZVld?p5oMMIORXWlIFCdd-sYv+W<2Sc6#JXvW|Fj9SQvXRR)K+v@sJuOB0v`kA5N5wdx` z|D*)!kHmqI=LK?kIos-f{*bacz)1D}P!(xVol>x)+wxiVT2?1Ngk6<`^cxEJ+H3^J zXGX`0)wuwn30ets(3uBx9I5RjHRY2&=9{fhNQ8s($@`M*Z$iCyV?6+V6Me~#Kp*D? z8YOm~_?=GmzNkNU%V-PRq=*lN6YsamgDvqW?SA=S(%p5witsMWC!iP=M7z zN~Xywn-rSjl|wtxErld_(9SC~*EEgIBR>Az(89>Cv1!cl2|bbm+M2MnuJ5VTO>20+t{1E>b0zWxf|cub(2S+kJ?>|9 zOIksRB6o)|xVpY0vdQlm;akNpLLwDL6v16R&MP>8z+(hQqc2gLbJ0EAq*G!|idgIU zhze!ATUt+6r%OXf8K>5}aU!W~g5(tGD*(vNS<&-INee9{%Vga2q>$uEH6*C%#9?<5L?JtwM%+$Gsfir# z<((`kxHsFMKhgy_K;sLIV1iY)gef6XRO}GT>(77gi|B1zm-Y-)E~hhQYb>g}kJ?$7 zsJ%M?q!;h&Q{=EqH zbWAIXoCex88K@||yWMSP6GxLt&)}=z{%Qq1=REpc<9sqidu)i^?@kaQ>3a7b6s_Ut z@=>1xk!+Vi+2oXR$s%?->_nF(#AZ&2`XwfHMg3CW+gSfAh0N}>-kAQKP;q3uhhI~G zYD5`xcl&h_+1z)ZQlXN?dzgQ#?2S0AkruJ9bMvQ8PV?l{93&V`ykC@+~YR9iCJM8|4Z4;<}15GRi;@rysYVz-M(jd zOzO%{umYmPrmj4k4@B6cjC%>cOeW`3eS4G0eQH<1)r9tP#>E+T)0rv=7pHokB9*h1 zV>pTLAnZ%V@!TrbNp(9N&e6c_9PY|28*W<|DFc#vf)!3w)b7l1>j}m(ghTKdHLyWF zpV+pYe+Ky1QMh)hJoR{QnRQ`#MOdsTNg1cxdCzc1;g)fhnoEsnE_>+vG?kSP3+aFPWq8 zDm~SEzE=zDb8||_tjT2-5@o54Ppb~!y6JoIp)egg zHLC|<`KrE+T8i=hjZ3DDgGcj+6x)ivjoCNiB(za{mXguEdowV!=3maBRR}^16C|$@ zGvhOq9MwdLxaOOMDRrIUPJLyo2)F77T^cx&6!k3QZZA<+vFpbDW7HomFf;Cp#R&;^ zC4J~)KvzA*lBi(D$dmH2d|h2dQX<_+yj`~_Usq323@<3Kaj+Q`M96D$C09BRIPbX;)%4f7i5wNR&_R(A%1UJZTP z1ilPntCWpC+72T&Sv(_M%8KthU9L^s`aD_U)+YC4^wsDF_ySS&Q4|-G=puZ1+;FP* zS0vHubnzRsEKrnFy+2Z36aCs1O^6^OH(m}7CPD~W@9U+tvv|)O{}{7hR!~JDOA4!K zF9JAmeG5ZABD~9d<;kN9iue!m;B=!1W}~8?qIK7>OZ;)mPk?7xXo| z#AvWx|2{x z>e3AfmZ@Gj`-B3DizfMRv6l)quJYMm4<+OezmREoUWI+_-Er^cK?YGKKOwTy)J5Z= zk?gjo@es6WNNN|*W>dfd z_;!86s}tO7tigpjzP?nk(oC@FUb%VKk1Bq&yJue!KrNGfFF>k5N>I=!rJ%xnak-3| zwB&B)=uIrzeAOK4z>ixQcXdN|;AsNsI!<^Z3`JM3Ebsyq$#qypn7~i#ynw z#Xuhk$J^Lj64?72>|a01sL4R(&*Qd37rg!~U8h%0+dPDCl(HOe5i`6F@7l3HQ|g*R z<$+>$?@^s&jo8haDIXeZ4-B?LE#!m%_g(rVAn3c1vTH~82g-Ld9CQ|}*V6p4Ai z_j1BNuV@ep`RAmrJf*hfpCN9Ppw#>F&t7OBqe=DMJqt+n=1U(+s_TGl{BviCNYw%( ze-QtanE9nxd^_{nGpdIi2|Z`>HrS|e~aWn%z zfPNhY{Qc+O?w|QE`hEA252oKASj$J#?~FYP==X!)e<=Nq2e#4gv|`aO4avv~k6U}zr&%?hFD91%0likf_@VUL3)n`l!^etVuP|^QM6a7xEAIp7b-FdP4ZYHk3Y~n0k&2)q zBGtY3M2_?#g8BQ5Kc8#&$5pJYrKsP-NAmwN{xA`Ier4Ci!E(v=SzSw!;GbbxWd?E< zC1&k(kIiFo!oHGASF8z_qlim2ajWKQb^c{DnJ?&eq|U9;w*sf=C@QkAmO@;Gz?|$O z30X5st(mdDnZYeEWyXEubeSA;Uw#UT6Wc#t8uDCoIwpYEG6;k5P9H9*@08OfPA31s z+ZZqe`1s%^3Jo2Tac2Ui#huPiK-gQ%PTpdo0kwfM{sB~jQ!yS+X}`}~Olc3wdM3%5 zY&Y?qAj=HX6VX;Bl4cpE7j*z+&G`1{%1}4k?(pfT1iC|x-(cz@k=QPi11TdOR+GUh zi(tK_^n2pWjB8qE;}5lj-ej{cE*z9+)_NQspi1~0d*|}0PjjyPcsMB6Cf^O8lxvgk zC>;`27eC+D>i+QwQ;8a0$nFtnuj;`S8ybBc+|Xwr0B&2l z0!l^IPP1wYqH2dh(mL&Nc`k|0+_3)qaiJpA)P;|RZ-Yc_;&Fw<3h#A=H)CjH)4h4) zvnSca>2#Ga7w6GUrvG5BjRuEusI!e9ohFLtY@=*RUTWF_ZpQWf$LfQmf&uy6F`k*q zbn2Hj?{4L-ZNn`Xu$PaNAh&N}e$e6lf;D`|->eeoW|6xA+6FIJs_Ww$BKY2K%z+rhKIes!R`aLNv5yxaxCNK8TXCS zq|#kw(xm=tMvGoDjqDbh)RWJtUx{QIsYx{g8yr4Blk)UpcoTgpPnE+zm8Z(?BdPKP zkH2WKK$A*{vO?;m{wg5Ka^9*X>gBJqA4-%JfHtCB`L2j^=u$7PM`%(JQC`2?rfZ=l z<@+Q4)XO7S3?BYCfS`car^?)QkW%{8c*vb`8yR{SdnA8G>)S{|bN}>g!aq89$y2KA zlX*&w;-A}%hev2q3905v=^RC>S?K~&edD|jCDmMD8>tq)BT|jCuDn10+<%#oDz8b6 z>>De|RnHg`jnbq%J-vUp{g-?DCp_VGc8^=KSW^>w?@zL3aQ}gIeVpk2HVsLlXTwn` zY_RYre4H9!Pm$pT$plJJM~9gL<1RYPWH(+N$|Taeii+2@VgV#cj9Y{ne(ON4Vk~4| z&)>uDv&W7t+W1OWx}|H3dk+(aOt{7UL_i*{ls%z|4UarO;qMR72g_X5N@IW#8qNoe z|I^9%kCY!}OFnq~G4x=j6l&7>@uxf6jQ_;K@yD+cREjqpqvgk3VEgg^kBvWExQ%8L zO_lpEjmDpy*fv9-d&-7B-if`RCiu8fDb@r(fIj;focEEhe_Ql{^ts~x52nw4W45Kw z-a8i1r+3AN(q}(l8+~SO5qKC0q+{G041 zS(1faWP?!yuDWV8QPH3UH?%=Q2#T;t$ObDA+A6(WsaoB|R|wEeDmRz3w6(u#e|>1R zt$qFa_}dm+s|f+ZLjkcWidvuTjj0y3@(^|Z-!pS}vjP15`g{HVe7M0bG=ae;$wR?7s{B%If+Df#plQn1De;POQ(^PlZbX!YzcUkbAYU#N!E^_IL7@^% z$wy2r6q+bA?bqh3ekSi{hUC!Da@l&X6-iU=TeeA!KiA)8^Sg&;Al6N?W`bgw@_u@bVy{etRm!uOq&uA?V26_`D-L}9&5sXN$8T{u zIsRD$o_&-m?N$5xpBes07u=Lhs8|FH_*SjESXZT17*h9FvRM$KCE?n6f{d_<>be5`_hBybPJUE z@+aNwf$p(?|ESdIi@X3qhB%Q9>WyqB;)(oz=~fav4}@yHNc4av?T1WauOH;jU=>+{XxBg15}MQ4ri+f z42mIP%;b93{jD)VDuP6z_p8)CkaX*%6soqlFa&F{=cxS^`Lvcsi+(kmahf$#2F2$G(X^+H z69IK-njy+)4e{AS7a6jr?7&Y@|1)x)PBg?jHuKJBsP&o}5~Aij+pc?n*1{^F*QovU zdy34e_p(#B5K>bF{PxE()ael8SI^EQ2v2|*SLp<8QSn6fE&E6E_R~5c6V@@Z;X3U+~Vz~UB`ysNJeZc~lFe`1faq)^u z`ouQX4hR9eOBT4; zv|ZxC3e9_+Kr4)|*bw8tK^5&(FFIw@v_c5q5$MalQ% zvvSInJ!VWOIo~z=_C$4ps)j{(P?d%S#R8g|STl`!R_)9PKH923f}Vpy&oO(?g+g~?<0=%lVDVlEdh}0xU4T!T~ z8EfDH+T(Kdqqzy9G(CAgq7D0cF*DDe!9Db-Y|e6)m{M0bW`84FPgp*nqVf#1Wdbc0 zxM)v?YXh%~*=OJ%8z1oPAbQ7Ny{q;(sV(1rlKW%S=J+EKzcEvvgU<|pl)eU?Q#$Hp zgaN0(2Oi$tHxmC!pPqp*(A1cY`gDHB|9LU~`0dm3=4nbDIhlulKls>)l{OaqcI zb+VuRhXNHQI~`3`nEJffpJeMR1>xT6{ZTt#HAx+;O(}XH<5TKuW!}-%t8)XqQG1Un z(aGt^!I__XZbm+)uG5V&ZbaWC34%!b6n49fT9s;-a!-T$*AWh<<{eZ(KKp{k;rJS5 z@p_#slTVR7fL0MYpesxqUHLDPy8b8lBc5*J{8mm}W+FNnpKA1kDgg3NEfoOyCu(8R z+$_ruPt3kl-#D6f(O>zb5R78SN1pKad=*fqF7~#UP@c8Da$9xp&=-0xbFYsPYx2OL zwV}^G*}aPr`(DoP>b2fW9v8n>f!b<+A*vQOLt`-{k~U#y_kv0aSi1;3I3a#xrcGDT zrgwg(+q750#$4HNc6hCiTieZ;r*da?ulv1`EifmxS^X*qi_*8X#H?{bH<71W+XL2Z z9&20W4nF#Da2>!~*LWju0zSz*6!`5ubB_dnMi%^1bPG!Lu^Fln_>mt} ztq7`CoT7rmWE%208gjPNko}_1z){V-&1*%h9cJ^fTT<<0bNWxUhe!nICvZP&wGOAY zrmK6EkN4aEcHr^Zs-~VV5U~F^4IC_LqJc1?VMcXm0K*RzIVs8DN{*n&v$iY`T8AqS zb|W9|PK;VJcKTdWZ$hF>xQPlN2+z=u7=%e&1-`7Iw>%E?Ozcp8{S7jzTvfgut z>vgIU8L}HB%p2Vy$&n$hObPsf^8(Y$HEQBl~{hi~>m4+R4esBcgme^epTX ze&)e2QCb!t9>wyp-Tuz4iIO$Nm&~efAmOIJGeF%E-%4<;(A;MAxj6|zt$$@b?P(St z5KRAktEO`7{fvg`UA;H`g93xq`*o4WgV+)fJEBN}2Od$RyFZI+h4FjVXZXV^hd)RH zE#>?(7G=ius53dD;@uxQ{DJ5=^~TSHL)6-V%SE?QEsPg4*%NUkR4=B-ml2-l-X9NR zr@3eG6j{9lo7HrHGt0Rq=dpKqC4vQ~+jRuZjxw{O-0TRM9TjFr*sQNIJ0_VOlkN9q zTYDyoc@9cQOo++WfC$y&h|y&CvVR)0ixnLPs`oFtQfcrULUMi_dsjv$PP1uMJ;0df z^8G&x!Y#QVlxIOWPC%HZws7$`S3`|Is)igCJM<;viIY;28bhVngh`B@>n;&eM$B0` z0}cie1mk%+#u_JLNK+AaNJt-SSa&uZ0GXc(OA*ds%|(uKlfvYt{POP*QQ?Q^LMwZM6*9KAkvD z8rs|v&yS^_*3IM~G!b6M7~hv+rU>cgp^sUG6sTr9UUsL>B>1yT7{1^LNVw|R# z=C~&d*bg>Ib=~%pva_d?r4t z0Q?jIi~;bI$L{ZfER3-XjA{+vW?7;y6H5`Eo#ngH8Lg~)tT>M?8K@%IrMpQLI(^FtxI^PJ;AZziw zb$Zwkra>n!9s!(;JBOcVR4rWPnU?nDIVQVuzG0N&wU6MS2u!I)I zYzQaZ=5(>G1VM8&f@bC-NDwlNpi3MCk&;2sd4eEvn;KN+2Lt4g^DGM^%5ZQ++*pGNKpH4byh3KCB*M z6=t-;+SE2sABLb@1N9a1vnV@TBVQt0{@QExbv6cx0MuvA7P>CrDfu?9G=|{4Ce=JGqg*qjz zqz>n;lug^7oP~!2qP7RVXl~XXSORK);6!fc2;JX_;_u{P8Q6yiCu$0!nfp6M&!?m? zbE1f~^;JFfQ_O2|)NJA4bMsmsC!U+vmYLUtf2Z2)nZ+)shd`ckP;@IM5kwrM>;PdlP0qAvEjKxQR*r?ZajH><(ACC) z2qIs##L?Rnwn|xLkxd<^;Uh~@tEO+V1c>44iz(X5Wb${8p#?qjrT}*%inhNm5p*Ha z_&Y^$H5Cayc_y0<0j{8mOK}u6{_HzyFbw@3&KHP0nOJFE8n!k>9&<)$pYcAFI#|m*PwVIsdo`_#+1r&29vDiFT)w=DeHPQg&|=Q8|74aFdt%7#P4@3D z%24AcklSg;SYQXtVWIs@r;Z8Kp(v3|BD3?OW%l{1T8Z5f99hF$YG|}u{)rl5Q<`YS zA7lewX#L0<-c|xWo3q&f8+94a)SNw3HJ)Le*7ZTFF_?PUU-Gue?d&qML0N|I{v+%M zT=t9XZ9`l+quW`pvfdTu5lwBFg2KyGo6k;2H{myw=}q-b!N2@N^(qG(wciVSA?Dho ze)LN@&y&^jdKZLf|I4L}PwU%Z9}nWD@K9Jn_wVmtr9!GC@~yvH4=ATeX4*i^u>V1r zD)}&KS4|V=V!#ee6S2~N`~4(WZ|z?5&|lqwbhu|NKgeZs!V^XJZagPnie9^M@GE3w zso>qeDKBx3HMiVCKiR3Abx^-I8XL*UXBX()_Qo2apYp*^$yeE&d?tB+DS79I&sBMw z>^oK7vcU_FtfAIp-JxrUHZ>Y|$X9hv4eZZ2H7Ew$kjaVPIN%toG&H(~M*AYCh9`ts z54Y}mayhL-ZO$8Ot*VZu1Kva+U6RSsWWOCzBVthb!4x`xv7G@(6C0b1XeMXW-lB63 z8LdW*hT{xf%h23bqe4>VhjmKRP)(~5BxUGq&chs;_taM7Z;0kOc>~SH7D=gdzK+_9 zRZRhFxu_h^=E#S@u)d>_-Vil$u~Loum<16(S8o(D=(kEA?Jbsq0;vtPD7H&|eZ{gc z8j)#T=WFi3cez}DaR)xl)z0-puE)6k%yo$CEv^!1W&)QhFW>DcDEa^Qudv8Fs(5&= zmAiY^Z_U^nX7oEG(AnsJzk$5DWs5rBzLa~$1pCdsyv`ZXjy^Dkdgs%|!Gq|1Zj5&z znQp|#6#mHMj_U$EHuWK)P*E3_p!jq&SZ^6pmc8wbj4ItNc^g9J6&~|^&SGJqxazU| z#Y9RRs4W+WM836e8x#$?jyCA|J)Pw;r-#hOfZ6C9m|iYhiPnZ3_(sZGasm{CQ#1() zPOlXe2@2@o{!RIbqJdhER1&qXpa$mGf%=dYw0)qEaskJ##oEP_Ks_M5c<=}&^ z-kzGXI^L)})a~)tugSCWr$_d+zvILlOI_@e=)bZ7`&er0sJ6xCWx?#qPWNkue-emm z2ZvAJLKD%yDsu>@carqZ8ULbsN2zxEt?9x28}kzrjX%&_-G?1<$>kc6i+!Z{9Hn)oucqWxaljC6ReeJuVu1AFZn@ka~V|V%h~E!q&r1;yHWx98d|MbXxeJ( zR7}}_yD)3vwBf%gPWz7`IPI;7VgAm4kcl$^1j-->Wmv_PTg-g-PQi+Ksb>+GlRbpD zw59P5Woaz$IJJO(ye_WpW#jdZUdtA6Kv7wn34`7w4=e+%vqgeYe5=XRW(L#?7zRN$ zgkH|p^l}=94sq16f}&_Zj>U7in(Qi~(+?91rHM0Mxkz_&L#o$Q4U|%C2At<>GdC%;9Zxt@|ZS@=acio$>y91NKMwDv<*LJQwTrYABaea>K*IYB4XZVcp7`U)P~xLnMIdHj

LUARHx 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�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%0DMxVI2vs8VxhVTm5 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 W|NYWe%IR1GfD7r&hPzw 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 Rb=$}e;y3Z%fB!cQ{13p}ZM6UZ literal 0 HcmV?d00001 diff --git a/install_win32/mingw/sim.nsi b/install_win32/mingw/sim.nsi new file mode 100644 index 0000000..3cece56 --- /dev/null +++ b/install_win32/mingw/sim.nsi @@ -0,0 +1,364 @@ +;Multilingular NSIS installer script for SIM Instant Messenger with Modern UI +;Written by Serhiy Kachanuk (c) 2006 + +;-------------------------------- +;Includes + + !include "MUI.nsh" + !include "Sections.nsh" + +;-------------------------------- +;Set compression settings + SetCompress auto + SetCompressor /SOLID /FINAL lzma + +;-------------------------------- +;General + + ;Name and file + Name "SIM Instant Messenger" + OutFile "sim-install.exe" + + ;Default installation folder + InstallDir "$PROGRAMFILES\SIM" + + ;Get installation folder from registry if available + InstallDirRegKey HKCU "Software\SIM" "" + +;-------------------------------- +;Interface Settings + + !define MUI_ABORTWARNING + +;-------------------------------- +;Variables + + Var STARTMENU_FOLDER + +;-------------------------------- +;Language Selection Dialog Settings + + ;Remember the installer language + !define MUI_LANGDLL_REGISTRY_ROOT "HKCU" + !define MUI_LANGDLL_REGISTRY_KEY "Software\SIM" + !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language" + +;-------------------------------- +;Pages + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_LICENSE ..\..\COPYING + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_DIRECTORY + +;Start Menu Folder Page Configuration + !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" + !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\SIM" + !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" + + !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER + + !insertmacro MUI_PAGE_INSTFILES + !define MUI_FINISHPAGE_RUN + !define MUI_FINISHPAGE_RUN_TEXT "Run SIM on Windows startup" + !define MUI_FINISHPAGE_RUN_FUNCTION RegStartOnBoot + !define MUI_FINISHPAGE_BUTTON "Next >" + !insertmacro MUI_PAGE_FINISH + !define MUI_FINISHPAGE_RUN "$INSTDIR\sim.exe" + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" # first language is the default language + !insertmacro MUI_LANGUAGE "French" + !insertmacro MUI_LANGUAGE "German" + !insertmacro MUI_LANGUAGE "Spanish" + !insertmacro MUI_LANGUAGE "SimpChinese" + !insertmacro MUI_LANGUAGE "TradChinese" + !insertmacro MUI_LANGUAGE "Japanese" + !insertmacro MUI_LANGUAGE "Korean" + !insertmacro MUI_LANGUAGE "Italian" + !insertmacro MUI_LANGUAGE "Dutch" + !insertmacro MUI_LANGUAGE "Danish" + !insertmacro MUI_LANGUAGE "Swedish" + !insertmacro MUI_LANGUAGE "Norwegian" + !insertmacro MUI_LANGUAGE "Finnish" + !insertmacro MUI_LANGUAGE "Greek" + !insertmacro MUI_LANGUAGE "Russian" + !insertmacro MUI_LANGUAGE "Portuguese" + !insertmacro MUI_LANGUAGE "PortugueseBR" + !insertmacro MUI_LANGUAGE "Polish" + !insertmacro MUI_LANGUAGE "Ukrainian" + !insertmacro MUI_LANGUAGE "Czech" + !insertmacro MUI_LANGUAGE "Slovak" + !insertmacro MUI_LANGUAGE "Croatian" + !insertmacro MUI_LANGUAGE "Bulgarian" + !insertmacro MUI_LANGUAGE "Hungarian" + !insertmacro MUI_LANGUAGE "Thai" + !insertmacro MUI_LANGUAGE "Romanian" + !insertmacro MUI_LANGUAGE "Latvian" + !insertmacro MUI_LANGUAGE "Macedonian" + !insertmacro MUI_LANGUAGE "Estonian" + !insertmacro MUI_LANGUAGE "Turkish" + !insertmacro MUI_LANGUAGE "Lithuanian" + !insertmacro MUI_LANGUAGE "Catalan" + !insertmacro MUI_LANGUAGE "Slovenian" + !insertmacro MUI_LANGUAGE "Serbian" + !insertmacro MUI_LANGUAGE "SerbianLatin" + !insertmacro MUI_LANGUAGE "Arabic" + !insertmacro MUI_LANGUAGE "Farsi" + !insertmacro MUI_LANGUAGE "Hebrew" + !insertmacro MUI_LANGUAGE "Indonesian" + !insertmacro MUI_LANGUAGE "Mongolian" + !insertmacro MUI_LANGUAGE "Luxembourgish" + !insertmacro MUI_LANGUAGE "Albanian" + !insertmacro MUI_LANGUAGE "Breton" + !insertmacro MUI_LANGUAGE "Belarusian" + !insertmacro MUI_LANGUAGE "Icelandic" + !insertmacro MUI_LANGUAGE "Malay" + !insertmacro MUI_LANGUAGE "Bosnian" + !insertmacro MUI_LANGUAGE "Kurdish" + +;-------------------------------- +;Reserve Files + + ;These files should be inserted before other files in the data block + ;Keep these lines before any File command + ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA) + + !insertmacro MUI_RESERVEFILE_LANGDLL + +;-------------------------------- +;Installer Sections + +Section "!SIM program files" SecSIM + SectionIn RO + + ;SIM program + SetOutPath "$INSTDIR" + File ..\..\sim\.libs\sim.exe + File ..\..\sim\.libs\libsim-0.dll + + ;Plugins + SetOutPath "$INSTDIR\plugins" + File ..\..\plugins\__homedir\.libs\__homedir.dll + File ..\..\plugins\__migrate\.libs\__migrate.dll + File ..\..\plugins\_core\.libs\_core.dll + File ..\..\plugins\about\.libs\about.dll + File ..\..\plugins\action\.libs\action.dll + File ..\..\plugins\autoaway\.libs\autoaway.dll + File ..\..\plugins\background\.libs\background.dll + File ..\..\plugins\dock\.libs\dock.dll + File ..\..\plugins\filter\.libs\filter.dll + File ..\..\plugins\floaty\.libs\floaty.dll + File ..\..\plugins\forward\.libs\forward.dll + File ..\..\plugins\gpg\.libs\gpg.dll + File ..\..\plugins\icons\.libs\icons.dll + File ..\..\plugins\icq\.libs\icq.dll + File ..\..\plugins\jabber\.libs\jabber.dll + File ..\..\plugins\livejournal\.libs\livejournal.dll + File ..\..\plugins\logger\.libs\logger.dll + File ..\..\plugins\msn\.libs\msn.dll + File ..\..\plugins\navigate\.libs\navigate.dll + File ..\..\plugins\netmonitor\.libs\netmonitor.dll + File ..\..\plugins\ontop\.libs\ontop.dll + File ..\..\plugins\osd\.libs\osd.dll + File ..\..\plugins\proxy\.libs\proxy.dll + File ..\..\plugins\replace\.libs\replace.dll + File ..\..\plugins\shortcuts\.libs\shortcuts.dll + File ..\..\plugins\sms\.libs\sms.dll + File ..\..\plugins\sound\.libs\sound.dll + File ..\..\plugins\spell\.libs\spell.dll + File ..\..\plugins\splash\.libs\splash.dll + File ..\..\plugins\styles\.libs\styles.dll + File ..\..\plugins\transparent\.libs\transparent.dll + File ..\..\plugins\weather\.libs\weather.dll + File ..\..\plugins\windock\.libs\windock.dll + File ..\..\plugins\yahoo\.libs\yahoo.dll + File ..\..\plugins\zodiak\.libs\zodiak.dll + + ;Icons + SetOutPath "$INSTDIR\icons" + File ..\..\plugins\_core\additional\additional.jisp + File ..\..\plugins\_core\icq5\icq5.jisp + File ..\..\plugins\_core\icq5.1\icq5.1.jisp + File ..\..\plugins\_core\icqlite\icqlite.jisp + File ..\..\plugins\_core\jisp\sim.jisp + File ..\..\plugins\_core\smiles\smiles.jisp + File ..\..\plugins\weather\jisp\weather.jisp + + ;Pictures + SetOutPath "$INSTDIR\pict" + File ..\..\plugins\_core\pict\*.gif + + ;Locales + SetOutPath "$INSTDIR\po" + File /oname=bg.qm ..\..\po\bg.gmo + File /oname=ca.qm ..\..\po\ca.gmo + File /oname=cs.qm ..\..\po\cs.gmo + File /oname=de.qm ..\..\po\de.gmo + File /oname=el.qm ..\..\po\el.gmo + File /oname=es.qm ..\..\po\es.gmo + File /oname=fr.qm ..\..\po\fr.gmo + File /oname=he.qm ..\..\po\he.gmo + File /oname=hu.qm ..\..\po\hu.gmo + File /oname=it.qm ..\..\po\it.gmo + File /oname=nl.qm ..\..\po\nl.gmo + File /oname=pl.qm ..\..\po\pl.gmo + File /oname=pt_BR.qm ..\..\po\pt_BR.gmo + File /oname=ru.qm ..\..\po\ru.gmo + File /oname=sk.qm ..\..\po\sk.gmo + File /oname=sw.qm ..\..\po\sw.gmo + File /oname=th.qm ..\..\po\th.gmo + File /oname=tr.qm ..\..\po\tr.gmo + File /oname=uk.qm ..\..\po\uk.gmo + File /oname=zh_TW.qm ..\..\po\zh_TW.gmo + + ;Sounds + SetOutPath "$INSTDIR\sounds" + File ..\..\plugins\sound\sounds\*.wav + File ..\..\plugins\jabber\sounds\*.wav + File ..\..\plugins\icq\sounds\*.wav + File ..\..\plugins\sms\sounds\*.wav + + ;Styles + SetOutPath "$INSTDIR\styles" + File ..\..\plugins\_core\styles\*.xsl + + ;Store installation folder + WriteRegStr HKCU "Software\SIM" "" $INSTDIR + + ;Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" + + ; write uninstall strings + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\SIM" "DisplayName" "SIM Instant messenger" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\SIM" "UninstallString" '"$INSTDIR\Uninstall.exe"' + + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + + ;Create shortcuts + CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" + CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\SIM.lnk" "$INSTDIR\sim.exe" + + !insertmacro MUI_STARTMENU_WRITE_END + +SectionEnd + +SectionGroup /e "Runtime libraries" + + Section "Qt library files" SecQt + + SetOutPath "$INSTDIR" + File "$%QTDIR%\bin\qt-mt3.dll" + + SectionEnd + + Section "Xml2 library files" SecXml + + SetOutPath "$INSTDIR" + File "$%MINGW%\bin\libxml2-2.dll" + + SectionEnd + + Section "Xslt library files" SecXslt + + SetOutPath "$INSTDIR" + File "$%MINGW%\bin\libxslt-1.dll" + + SectionEnd + + Section "OpenSSL library files" SecSSL + + SetOutPath "$INSTDIR" + File "$%MINGW%\bin\libeay32.dll" + File "$%MINGW%\bin\libssl32.dll" + + SectionEnd + + Section "Mingw runtime" SecMingw + + SetOutPath "$INSTDIR" + File "$%MINGW%\bin\mingwm10.dll" + + SectionEnd + +SectionGroupEnd + +;-------------------------------- +;Installer Functions + +Function .onInit + + !insertmacro MUI_LANGDLL_DISPLAY + +FunctionEnd + +;-------------------------------- +;Descriptions + ;Assign language strings to sections + !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecSIM} "Main program, plugins and needed data files." + !insertmacro MUI_DESCRIPTION_TEXT ${SecQt} "Qt library. You can disable its installation if you have already installed it somewhere in yor system." + !insertmacro MUI_DESCRIPTION_TEXT ${SecXml} "Xml processing library. You can disable its installation if you have already installed it somewhere in yor system." + !insertmacro MUI_DESCRIPTION_TEXT ${SecXslt} "Xslt transfornation library. You can disable its installation if you have already installed it somewhere in yor system." + !insertmacro MUI_DESCRIPTION_TEXT ${SecSSL} "OpenSSL library. You can disable its installation if you have already installed it somewhere in yor system." + !insertmacro MUI_DESCRIPTION_TEXT ${SecMingw} "Mingw runtime. You can disable its installation if you have already installed Mingw somewhere in yor system." + !insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + + Delete "$INSTDIR\plugins\*" + RMDir "$INSTDIR\plugins" + + Delete "$INSTDIR\icons\*" + RMDir "$INSTDIR\icons" + + Delete "$INSTDIR\pict\*" + RMDir "$INSTDIR\pict" + Delete "$INSTDIR\po\*" + RMDir "$INSTDIR\po" + + Delete "$INSTDIR\sounds\*" + RMDir "$INSTDIR\sounds" + + Delete "$INSTDIR\styles\*" + RMDir "$INSTDIR\styles" + + Delete "$INSTDIR\*.exe" + Delete "$INSTDIR\*.dll" + Delete "$INSTDIR\Uninstall.exe" + + RMDir "$INSTDIR" + + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + Delete "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" + Delete "$SMPROGRAMS\$STARTMENU_FOLDER\SIM.lnk" + RMDir "$SMPROGRAMS\$STARTMENU_FOLDER" + !insertmacro MUI_STARTMENU_WRITE_END + + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\SIM" + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\SIM" + DeleteRegKey /ifempty HKCU "Software\SIM" + +SectionEnd + +;-------------------------------- +;Uninstaller Functions +Function un.onInit + + !insertmacro MUI_UNGETLANGUAGE + +FunctionEnd + +;Function to register startup on boot +Function RegStartOnBoot + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "SIM" '"$INSTDIR\sim.exe"' +FunctionEnd diff --git a/install_win32/nsis_installer_full.nsi b/install_win32/nsis_installer_full.nsi new file mode 100644 index 0000000..67e0086 --- /dev/null +++ b/install_win32/nsis_installer_full.nsi @@ -0,0 +1,268 @@ +; SIMINSTALL.nsi +; +; Installer written by Tobias Franz (noragen@gmx.net), 2002 - 2006 +; +; SetCompressing Options: +SetCompress auto +SetCompressor lzma + +BGGradient topc + +!include "MUI.nsh" +!include "LogicLib.nsh" +!include "WordFunc.nsh" + +!macro BIMAGE IMAGE PARMS + Push $0 + GetTempFileName $0 + File /oname=$0 "${IMAGE}" + SetBrandingImage ${PARMS} $0 + Delete $0 + Pop $0 +!macroend + +!macro Print text + DetailPrint "${text}" +!macroend + +;Languages + + !insertmacro MUI_LANGUAGE "English" + !insertmacro MUI_LANGUAGE "German" + !insertmacro MUI_LANGUAGE "Russian" + ;!insertmacro MUI_LANGUAGE "French" + ;!insertmacro MUI_LANGUAGE "French" + ;!insertmacro MUI_LANGUAGE "Spanish" + ;!insertmacro MUI_LANGUAGE "SimpChinese" + ;!insertmacro MUI_LANGUAGE "TradChinese" + ;!insertmacro MUI_LANGUAGE "Japanese" + ;!insertmacro MUI_LANGUAGE "Korean" + ;!insertmacro MUI_LANGUAGE "Italian" + ;!insertmacro MUI_LANGUAGE "Dutch" + ;!insertmacro MUI_LANGUAGE "Danish" + ;!insertmacro MUI_LANGUAGE "Swedish" + ;!insertmacro MUI_LANGUAGE "Norwegian" + ;!insertmacro MUI_LANGUAGE "Finnish" + ;!insertmacro MUI_LANGUAGE "Greek" + ;!insertmacro MUI_LANGUAGE "Portuguese" + ;!insertmacro MUI_LANGUAGE "PortugueseBR" + ;!insertmacro MUI_LANGUAGE "Polish" + ;!insertmacro MUI_LANGUAGE "Ukrainian" + ;!insertmacro MUI_LANGUAGE "Czech" + ;!insertmacro MUI_LANGUAGE "Slovak" + ;!insertmacro MUI_LANGUAGE "Croatian" + ;!insertmacro MUI_LANGUAGE "Bulgarian" + ;!insertmacro MUI_LANGUAGE "Hungarian" + ;!insertmacro MUI_LANGUAGE "Thai" + ;!insertmacro MUI_LANGUAGE "Romanian" + ;!insertmacro MUI_LANGUAGE "Latvian" + ;!insertmacro MUI_LANGUAGE "Macedonian" + ;!insertmacro MUI_LANGUAGE "Estonian" + ;!insertmacro MUI_LANGUAGE "Turkish" + ;!insertmacro MUI_LANGUAGE "Lithuanian" + ;!insertmacro MUI_LANGUAGE "Catalan" + ;!insertmacro MUI_LANGUAGE "Slovenian" + ;!insertmacro MUI_LANGUAGE "Serbian" + ;!insertmacro MUI_LANGUAGE "SerbianLatin" + ;!insertmacro MUI_LANGUAGE "Arabic" + ;!insertmacro MUI_LANGUAGE "Farsi" + ;!insertmacro MUI_LANGUAGE "Hebrew" + ;!insertmacro MUI_LANGUAGE "Indonesian" + ;!insertmacro MUI_LANGUAGE "Mongolian" + ;!insertmacro MUI_LANGUAGE "Luxembourgish" + + +; The name of the installer +Name "SIM CVS/SVN VC8 FULL-Version ${__DATE__}, ${__TIME__}" + + +Function .onInit + + SetSilent silent + !insertmacro MUI_LANGDLL_DISPLAY + SetSilent normal + +FunctionEnd + +; The file to write +OutFile "SIM-IM_SVN_${__DATE__}.exe" + +; The default installation directory +InstallDir $PROGRAMFILES\SIM + +; The text to prompt the user to enter a directory +LangString welcome ${LANG_ENGLISH} "SIM-ICQ - Simple Instant Messenger, written by Vladimir Shutoff, continued by SIM-IM Development Team, is licensed under the Terms of the GPL.$\nThis SIM-IM - SVN Setup was created by Tobias Franz.$\nIt is a full-functional setup and it should contain all you need to run SIM-IM.$\n$\nPlease choose your SIM-IM - Rootdirectory now, where your sim.exe is stored:" +LangString welcome ${LANG_GERMAN} "SIM-ICQ - Simple Instant Messenger, geschrieben von Vladimir Shutoff, weitergeführt vom SIM-IM Development Team, wird unter den Bedingungen der GPL lizensiert.$\nDieses SIM-IM - SVN Setup wurde von Tobias Franz erstellt.$\nEs handelt sich um ein vollständig funktionsfähiges Setup und es sollte alles Nötige enthalten, um SIM-IM auszuführen$\n$\nBitte wählen Sie jetzt das SIM-IM-Installationsverzeichnis aus, wo die sim.exe liegen soll:" +LangString welcome ${LANG_RUSSIAN} "SIM-ICQ - Simple Instant Messenger, ñîçäàí Âëàäèìèðîì Øóòîâûì è ðàçâèâàåìûé SIM-IM Development Team ïîä ëèöåíçèåé GNU GPL.$\nÄàííàÿ ñáîðêà SIM - SVN Setup âûïîëíåíà Tobias Franz.$\nÝòî âåðñèÿ ñîäåðæèò âñ¸ íåîáõîäèìîå äëÿ èñïîëüçîâàíèÿ SIM-IM.$\n$\nÏîæàëóéñòà, âûáåðèòå ïàïêó, êóäà ñëåäóåò óñòàíîâèòü SIM:" +DirText "$(welcome)" + +; SetXP Style +XPStyle On +;BGGradient 000000 8000A0 FFFFFF +BGGradient 000000 B400E1 FFFFFF +InstallColors FF8080 000030 +AddBrandingImage left 100 +Page directory dirImage +Page instfiles + +LangString message ${LANG_ENGLISH} "I can run SIM for you now.$\nShould I do this for you?" +LangString message ${LANG_GERMAN} "Ich kann SIM für Sie ausführen.$\nSoll ich das für Sie übernehmen?" +LangString message ${LANG_RUSSIAN} "SIM-IM óñòàíîâëåí è ãîòîâ ê ðàáîòe.$\nÇàïóñòèòü SIM-IM?" +; The stuff to install + + +Section "Install" + ;Page instfiles instImage + + ;SetBrandingImage /RESIZETOFIT ..\Release\sim-window-small.bmp + ; Set output path to the installation directory. + SetOutPath $INSTDIR + ; Put file there + SetOverwrite on + + File ..\Release\sim.exe + File ..\Release\simctrl.exe + File VC8_deploy\Microsoft.VC80.CRT.manifest + File VC8_deploy\sim.exe.intermediate.manifest + + ;VC8DLL's + File $%WINDIR%\system32\msvcm80.dll + File $%WINDIR%\system32\msvcp80.dll + File $%WINDIR%\system32\msvcr80.dll + + UnRegDLL $INSTDIR\simremote.dll + UnRegDLL $INSTDIR\simext.dll + + File ..\Release\*.dll + + SetOutPath $INSTDIR\po + File ..\Release\po\*.qm + + SetOutPath $INSTDIR\plugins + + File ..\Release\plugins\*.dll + File VC8_deploy\plugins\Microsoft.VC80.CRT.manifest + + SetOutPath $INSTDIR\plugins\styles + + ;File ..\Release\plugins\styles\*.dll + + SetOutPath $INSTDIR\styles + File ..\Release\styles\*.xsl + + SetOutPath $INSTDIR\icons + File ..\Release\icons\*.jisp + + SetOutPath $INSTDIR\pict + File ..\Release\pict\*.gif + File ..\Release\pict\*.png + + SetOutPath $INSTDIR\copyright + File ..\Release\copyright\COPYING + + SetOutPath $INSTDIR\sounds + + File ..\Release\sounds\*.wav + +;Currently not working: + Delete $INSTDIR\plugins\styles\wood.dll + Delete $INSTDIR\plugins\styles\metal.dll + ;Delete $INSTDIR\plugins\styles.dll + Delete $INSTDIR\simremote.dll + Delete $INSTDIR\simext.dll + Delete $INSTDIR\sounds\*.dll + ;RegDLL ..\Release\simremote.dll + ;RegDLL ..\Release\simext.dll + +;System: +SetOutPath $SYSDIR + +File $%QTDIR%\lib\$%DLLQT% + +File $%WINDIR%\system32\libeay32.dll +File $%WINDIR%\system32\ssleay32.dll + + +SectionEnd ; end the section + +Section "Verknüpfungen" +CreateDirectory "$SMPROGRAMS\SIM" + WriteIniStr "$INSTDIR\SIM.url" "InternetShortcut" "URL" "http://sim-im.org" + WriteIniStr "$INSTDIR\Updates.url" "InternetShortcut" "URL" "http://www.sim-icq.de" + CreateShortCut "$SMPROGRAMS\SIM\SIM-IM.lnk" "$INSTDIR\SIM.url" "" "$INSTDIR\SIM.url" 0 + CreateShortCut "$SMPROGRAMS\SIM\Updates.lnk" "$INSTDIR\Updates.url" "" "$INSTDIR\Updates.url" 0 + + CreateShortCut "$SMPROGRAMS\SIM\SIM.lnk" "$INSTDIR\sim.exe" \ + "" "$INSTDIR\sim.exe" 0 SW_SHOWNORMAL + ;CreateShortCut "$SMPROGRAMS\RERSVC\Readme.lnk" "$INSTDIR\Readme.txt" \ + ; "" "%SystemRoot%\notepad.exe" 1 SW_SHOWMAXIMIZED + CreateShortCut "$SMPROGRAMS\SIM\Uninstaller.lnk" "$INSTDIR\uninst.exe" \ + "" "$INSTDIR\uninst.exe" 0 SW_SHOWNORMAL + +WriteUninstaller "$INSTDIR\Uninst.exe" +SectionEnd ; end the section + + +Function un.onUninstSuccess + HideWindow + MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) wurde erfolgreich deinstalliert.." +FunctionEnd + +Function un.onInit + MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Möchten Sie $(^Name) und alle seinen Komponenten deinstallieren?" IDYES +2 + Abort +FunctionEnd + +Section "Uninstall" + +Delete $INSTDIR\Uninst.exe ; delete self (temporarily copying in temp directory ;)) +Delete "$INSTDIR\sim.exe" +Delete "$INSTDIR\simctrl.exe" + +UnRegDLL "$INSTDIR\simremote.dll" +UnRegDLL "$INSTDIR\simext.dll" + +Delete "$INSTDIR\*.dll" +Delete "$INSTDIR\po\*.qm" +Delete "$INSTDIR\plugins\*.dll" +Delete "$INSTDIR\plugins\styles\*.dll" +Delete "$INSTDIR\styles\*.xsl" +Delete "$INSTDIR\icons\*.jisp" +Delete "$INSTDIR\copyright\COPYING" +Delete "$INSTDIR\SIM.url" +Delete "$INSTDIR\Updates.url" +Delete "$INSTDIR\pict\*.gif" +Delete "$INSTDIR\pict\*.png" +Delete "$INSTDIR\sounds\*.wav" + +Delete "$SMPROGRAMS\SIM\SIM.lnk" +Delete "$SMPROGRAMS\SIM\SIM-IM.lnk" +Delete "$SMPROGRAMS\SIM\Updates.lnk" +Delete "$SMPROGRAMS\SIM\Uninstaller.lnk" +Delete "$SMPROGRAMS\SIM" + +RMDir $INSTDIR\po +RMDir $INSTDIR\plugins\styles +RMDir $INSTDIR\plugins +RMDir $INSTDIR\styles +RMDir $INSTDIR\icons +RMDir $INSTDIR\copyright +RMDir $INSTDIR\sounds +RMDir $INSTDIR\pict +RMDir $INSTDIR + +Quit +SectionEnd + +Section Start + MessageBox MB_YESNO "$(message)" IDNO done + Exec '"$INSTDIR\sim.exe"' + + done: + Quit +SectionEnd ; end the section + +Function dirImage + !insertmacro BIMAGE "sim-window-small.bmp" /RESIZETOFIT +FunctionEnd +; eof \ No newline at end of file diff --git a/install_win32/sim-window-small.bmp b/install_win32/sim-window-small.bmp new file mode 100644 index 0000000000000000000000000000000000000000..71419c3c85056ee168c988f2e19c619576531dc6 GIT binary patch literal 185274 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

buiT`h2#ldmz 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�h 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 literal 0 HcmV?d00001 diff --git a/jisp-resources.txt b/jisp-resources.txt new file mode 100644 index 0000000..483c337 --- /dev/null +++ b/jisp-resources.txt @@ -0,0 +1,7 @@ +http://tsrh.crackz.ws/nitro/gants.jisp +http://www.cs.kuleuven.ac.be/~remko/psi/crystal/ +http://ftp.roedu.net/pub/mirrors/gentoo.org/distfiles/amibulb.jisp +http://www.kde-look.org/content/download.php?content=18306&id=1 +http://www.kde-look.org/content/download.php?content=18309&id=1 +http://www.kde-look.org/content/download.php?content=18310&id=1 + diff --git a/ltdl.m4 b/ltdl.m4 new file mode 100644 index 0000000..c5e2082 --- /dev/null +++ b/ltdl.m4 @@ -0,0 +1,421 @@ +## ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- +## Copyright (C) 1999-2000 Free Software Foundation, Inc. +## +## This file is free software; the Free Software Foundation gives +## unlimited permission to copy and/or distribute it, with or without +## modifications, as long as this notice is preserved. + +# serial 7 AC_LIB_LTDL + +# AC_WITH_LTDL +# ------------ +# Clients of libltdl can use this macro to allow the installer to +# choose between a shipped copy of the ltdl sources or a preinstalled +# version of the library. +AC_DEFUN([AC_WITH_LTDL], +[AC_REQUIRE([AC_LIB_LTDL]) +AC_SUBST([LIBLTDL]) +AC_SUBST([INCLTDL]) + +# Unless the user asks us to check, assume no installed ltdl exists. +use_installed_libltdl=no + +AC_ARG_WITH([included_ltdl], + [ --with-included-ltdl use the GNU ltdl sources included here]) + +if test "x$with_included_ltdl" != xyes; then + # We are not being forced to use the included libltdl sources, so + # decide whether there is a useful installed version we can use. + AC_CHECK_HEADER([ltdl.h], + [AC_CHECK_LIB([ltdl], [lt_dlcaller_register], + [with_included_ltdl=no], + [with_included_ltdl=yes]) + ]) +fi + +if test "x$enable_ltdl_install" != xyes; then + # If the user did not specify an installable libltdl, then default + # to a convenience lib. + AC_LIBLTDL_CONVENIENCE +fi + +if test "x$with_included_ltdl" = xno; then + # If the included ltdl is not to be used. then Use the + # preinstalled libltdl we found. + AC_DEFINE([HAVE_LTDL], [1], + [Define this if a modern libltdl is already installed]) + LIBLTDL=-lltdl +fi + +# Report our decision... +AC_MSG_CHECKING([whether to use included libltdl]) +AC_MSG_RESULT([$with_included_ltdl]) + +AC_CONFIG_SUBDIRS([libltdl]) +])# AC_WITH_LTDL + + +# AC_LIB_LTDL +# ----------- +# Perform all the checks necessary for compilation of the ltdl objects +# -- including compiler checks and header checks. +AC_DEFUN([AC_LIB_LTDL], +[AC_PREREQ(2.50) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_C_CONST]) +AC_REQUIRE([AC_HEADER_STDC]) +AC_REQUIRE([AC_HEADER_DIRENT]) +AC_REQUIRE([_LT_AC_CHECK_DLFCN]) +AC_REQUIRE([AC_LTDL_ENABLE_INSTALL]) +AC_REQUIRE([AC_LTDL_SHLIBEXT]) +AC_REQUIRE([AC_LTDL_SHLIBPATH]) +AC_REQUIRE([AC_LTDL_SYSSEARCHPATH]) +AC_REQUIRE([AC_LTDL_OBJDIR]) +AC_REQUIRE([AC_LTDL_DLPREOPEN]) +AC_REQUIRE([AC_LTDL_DLLIB]) +AC_REQUIRE([AC_LTDL_SYMBOL_USCORE]) +AC_REQUIRE([AC_LTDL_DLSYM_USCORE]) +AC_REQUIRE([AC_LTDL_SYS_DLOPEN_DEPLIBS]) +AC_REQUIRE([AC_LTDL_FUNC_ARGZ]) + +AC_CHECK_HEADERS([assert.h ctype.h errno.h malloc.h memory.h stdlib.h \ + stdio.h unistd.h]) +AC_CHECK_HEADERS([dl.h sys/dl.h dld.h mach-o/dyld.h]) +AC_CHECK_HEADERS([string.h strings.h], [break]) + +AC_CHECK_FUNCS([strchr index], [break]) +AC_CHECK_FUNCS([strrchr rindex], [break]) +AC_CHECK_FUNCS([memcpy bcopy], [break]) +AC_CHECK_FUNCS([memmove strcmp]) +AC_CHECK_FUNCS([closedir opendir readdir]) +])# AC_LIB_LTDL + + +# AC_LTDL_ENABLE_INSTALL +# ---------------------- +AC_DEFUN([AC_LTDL_ENABLE_INSTALL], +[AC_ARG_ENABLE([ltdl-install], + [AC_HELP_STRING([--enable-ltdl-install], [install libltdl])]) + +AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno) +AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno) +])# AC_LTDL_ENABLE_INSTALL + + +# AC_LTDL_SYS_DLOPEN_DEPLIBS +# -------------------------- +AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_CACHE_CHECK([whether deplibs are loaded by dlopen], + [libltdl_cv_sys_dlopen_deplibs], + [# PORTME does your system automatically load deplibs for dlopen? + # or its logical equivalent (e.g. shl_load for HP-UX < 11) + # For now, we just catch OSes we know something about -- in the + # future, we'll try test this programmatically. + libltdl_cv_sys_dlopen_deplibs=unknown + case "$host_os" in + aix3*|aix4.1.*|aix4.2.*) + # Unknown whether this is true for these versions of AIX, but + # we want this `case' here to explicitly catch those versions. + libltdl_cv_sys_dlopen_deplibs=unknown + ;; + aix[[45]]*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + darwin*) + # Assuming the user has installed a libdl from somewhere, this is true + # If you are looking for one http://www.opendarwin.org/projects/dlcompat + libltdl_cv_sys_dlopen_deplibs=yes + ;; + gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu) + # GNU and its variants, using gnu ld.so (Glibc) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + hpux10*|hpux11*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + interix*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + irix[[12345]]*|irix6.[[01]]*) + # Catch all versions of IRIX before 6.2, and indicate that we don't + # know how it worked for any of those versions. + libltdl_cv_sys_dlopen_deplibs=unknown + ;; + irix*) + # The case above catches anything before 6.2, and it's known that + # at 6.2 and later dlopen does load deplibs. + libltdl_cv_sys_dlopen_deplibs=yes + ;; + netbsd*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + openbsd*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + osf[[1234]]*) + # dlopen did load deplibs (at least at 4.x), but until the 5.x series, + # it did *not* use an RPATH in a shared library to find objects the + # library depends on, so we explictly say `no'. + libltdl_cv_sys_dlopen_deplibs=no + ;; + osf5.0|osf5.0a|osf5.1) + # dlopen *does* load deplibs and with the right loader patch applied + # it even uses RPATH in a shared library to search for shared objects + # that the library depends on, but there's no easy way to know if that + # patch is installed. Since this is the case, all we can really + # say is unknown -- it depends on the patch being installed. If + # it is, this changes to `yes'. Without it, it would be `no'. + libltdl_cv_sys_dlopen_deplibs=unknown + ;; + osf*) + # the two cases above should catch all versions of osf <= 5.1. Read + # the comments above for what we know about them. + # At > 5.1, deplibs are loaded *and* any RPATH in a shared library + # is used to find them so we can finally say `yes'. + libltdl_cv_sys_dlopen_deplibs=yes + ;; + solaris*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + esac + ]) +if test "$libltdl_cv_sys_dlopen_deplibs" != yes; then + AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], + [Define if the OS needs help to load dependent libraries for dlopen().]) +fi +])# AC_LTDL_SYS_DLOPEN_DEPLIBS + + +# AC_LTDL_SHLIBEXT +# ---------------- +AC_DEFUN([AC_LTDL_SHLIBEXT], +[AC_REQUIRE([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) +AC_CACHE_CHECK([which extension is used for loadable modules], + [libltdl_cv_shlibext], +[ +module=yes +eval libltdl_cv_shlibext=$shrext_cmds + ]) +if test -n "$libltdl_cv_shlibext"; then + AC_DEFINE_UNQUOTED([LTDL_SHLIB_EXT], ["$libltdl_cv_shlibext"], + [Define to the extension used for shared libraries, say, ".so".]) +fi +])# AC_LTDL_SHLIBEXT + + +# AC_LTDL_SHLIBPATH +# ----------------- +AC_DEFUN([AC_LTDL_SHLIBPATH], +[AC_REQUIRE([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) +AC_CACHE_CHECK([which variable specifies run-time library path], + [libltdl_cv_shlibpath_var], [libltdl_cv_shlibpath_var="$shlibpath_var"]) +if test -n "$libltdl_cv_shlibpath_var"; then + AC_DEFINE_UNQUOTED([LTDL_SHLIBPATH_VAR], ["$libltdl_cv_shlibpath_var"], + [Define to the name of the environment variable that determines the dynamic library search path.]) +fi +])# AC_LTDL_SHLIBPATH + + +# AC_LTDL_SYSSEARCHPATH +# --------------------- +AC_DEFUN([AC_LTDL_SYSSEARCHPATH], +[AC_REQUIRE([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) +AC_CACHE_CHECK([for the default library search path], + [libltdl_cv_sys_search_path], + [libltdl_cv_sys_search_path="$sys_lib_dlsearch_path_spec"]) +if test -n "$libltdl_cv_sys_search_path"; then + sys_search_path= + for dir in $libltdl_cv_sys_search_path; do + if test -z "$sys_search_path"; then + sys_search_path="$dir" + else + sys_search_path="$sys_search_path$PATH_SEPARATOR$dir" + fi + done + AC_DEFINE_UNQUOTED([LTDL_SYSSEARCHPATH], ["$sys_search_path"], + [Define to the system default library search path.]) +fi +])# AC_LTDL_SYSSEARCHPATH + + +# AC_LTDL_OBJDIR +# -------------- +AC_DEFUN([AC_LTDL_OBJDIR], +[AC_CACHE_CHECK([for objdir], + [libltdl_cv_objdir], + [libltdl_cv_objdir="$objdir" + if test -n "$objdir"; then + : + else + rm -f .libs 2>/dev/null + mkdir .libs 2>/dev/null + if test -d .libs; then + libltdl_cv_objdir=.libs + else + # MS-DOS does not allow filenames that begin with a dot. + libltdl_cv_objdir=_libs + fi + rmdir .libs 2>/dev/null + fi + ]) +AC_DEFINE_UNQUOTED([LTDL_OBJDIR], ["$libltdl_cv_objdir/"], + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# AC_LTDL_OBJDIR + + +# AC_LTDL_DLPREOPEN +# ----------------- +AC_DEFUN([AC_LTDL_DLPREOPEN], +[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) +AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen], + [libltdl_cv_preloaded_symbols], + [if test -n "$lt_cv_sys_global_symbol_pipe"; then + libltdl_cv_preloaded_symbols=yes + else + libltdl_cv_preloaded_symbols=no + fi + ]) +if test x"$libltdl_cv_preloaded_symbols" = xyes; then + AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1], + [Define if libtool can extract symbol lists from object files.]) +fi +])# AC_LTDL_DLPREOPEN + + +# AC_LTDL_DLLIB +# ------------- +AC_DEFUN([AC_LTDL_DLLIB], +[LIBADD_DL= +AC_SUBST(LIBADD_DL) +AC_LANG_PUSH([C]) + +AC_CHECK_FUNC([shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.])], + [AC_CHECK_LIB([dld], [shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LIBADD_DL="$LIBADD_DL -ldld"], + [AC_CHECK_LIB([dl], [dlopen], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + LIBADD_DL="-ldl" libltdl_cv_lib_dl_dlopen="yes"], + [AC_TRY_LINK([#if HAVE_DLFCN_H +# include +#endif + ], + [dlopen(0, 0);], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) libltdl_cv_func_dlopen="yes"], + [AC_CHECK_LIB([svld], [dlopen], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + LIBADD_DL="-lsvld" libltdl_cv_func_dlopen="yes"], + [AC_CHECK_LIB([dld], [dld_link], + [AC_DEFINE([HAVE_DLD], [1], + [Define if you have the GNU dld library.]) + LIBADD_DL="$LIBADD_DL -ldld"], + [AC_CHECK_FUNC([_dyld_func_lookup], + [AC_DEFINE([HAVE_DYLD], [1], + [Define if you have the _dyld_func_lookup function.])]) + ]) + ]) + ]) + ]) + ]) +]) + +if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes +then + lt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBADD_DL" + AC_CHECK_FUNCS([dlerror]) + LIBS="$lt_save_LIBS" +fi +AC_LANG_POP +])# AC_LTDL_DLLIB + + +# AC_LTDL_SYMBOL_USCORE +# --------------------- +# does the compiler prefix global symbols with an underscore? +AC_DEFUN([AC_LTDL_SYMBOL_USCORE], +[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) +AC_CACHE_CHECK([for _ prefix in compiled symbols], + [ac_cv_sys_symbol_underscore], + [ac_cv_sys_symbol_underscore=no + cat > conftest.$ac_ext < $ac_nlist) && test -s "$ac_nlist"; then + # See whether the symbols have a leading underscore. + if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then + ac_cv_sys_symbol_underscore=yes + else + if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then + : + else + echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC + fi + fi + else + echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC + fi + else + echo "configure: failed program was:" >&AC_FD_CC + cat conftest.c >&AC_FD_CC + fi + rm -rf conftest* + ]) +])# AC_LTDL_SYMBOL_USCORE + + +# AC_LTDL_DLSYM_USCORE +# -------------------- +AC_DEFUN([AC_LTDL_DLSYM_USCORE], +[AC_REQUIRE([AC_LTDL_SYMBOL_USCORE]) +if test x"$ac_cv_sys_symbol_underscore" = xyes; then + if test x"$libltdl_cv_func_dlopen" = xyes || + test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then + AC_CACHE_CHECK([whether we have to add an underscore for dlsym], + [libltdl_cv_need_uscore], + [libltdl_cv_need_uscore=unknown + save_LIBS="$LIBS" + LIBS="$LIBS $LIBADD_DL" + _LT_AC_TRY_DLOPEN_SELF( + [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], + [], [libltdl_cv_need_uscore=cross]) + LIBS="$save_LIBS" + ]) + fi +fi + +if test x"$libltdl_cv_need_uscore" = xyes; then + AC_DEFINE([NEED_USCORE], [1], + [Define if dlsym() requires a leading underscore in symbol names.]) +fi +])# AC_LTDL_DLSYM_USCORE + +# AC_LTDL_FUNC_ARGZ +# ----------------- +AC_DEFUN([AC_LTDL_FUNC_ARGZ], +[AC_CHECK_HEADERS([argz.h]) + +AC_CHECK_TYPES([error_t], + [], + [AC_DEFINE([error_t], [int], + [Define to a type to use for `error_t' if it is not otherwise available.])], + [#if HAVE_ARGZ_H +# include +#endif]) + +AC_CHECK_FUNCS([argz_append argz_create_sep argz_insert argz_next argz_stringify]) +])# AC_LTDL_FUNC_ARGZ diff --git a/mandrake.spec b/mandrake.spec new file mode 100644 index 0000000..1edec69 --- /dev/null +++ b/mandrake.spec @@ -0,0 +1,133 @@ +%define name sim +%define version 0.9.3 +%define release 1mdk + +%define major 0 +%define libname %mklibname %name %major +%define libnamedev %mklibname %name %major -d + +Name: %name +Summary: SIM - Multiprotocol Instant Messenger +Version: %version +Release: %release +Source: %{name}-%{version}.tar.bz2 +License: GPL +Group: Networking/Instant messaging +Url: http://sim-im.berlios.de/ +BuildRoot: %{_tmppath}/%{name}-buildroot +Requires: libqt3 > 3.0.4, kdelibs > 3.0, sablotron +BuildRequires: kdelibs-devel > 3.0 +BuildRequires: autoconf2.5, automake1.7 +BuildRequires: libfam-devel +BuildRequires: flex, sablotron-devel + +%description +SIM - Multiprotocol Instant Messenger + +SIM (Simple Instant Messenger) is a plugins-based open- +source instant messenger that supports various protocols +(ICQ, Jabber, AIM, MSN). It uses the QT library and works +on X11 (with optional KDE-support). + +SIM has a lot of features, many of them are listed +at: http://sim-im.berlios.de/ + +%package -n %libname +Summary: SIM library +Group: System/Libraries + +%description -n %libname +SIM (Simple Instant Messenger) is a plugins-based open- +source instant messenger that supports various protocols +(ICQ, Jabber, AIM, MSN). It uses the QT library and works +on X11 (with optional KDE-support). + +Libraries + +%package -n %libnamedev +Summary: SIM library +Group: System/Libraries +Requires: %libname = %version +Provides: libsim-devel + +%description -n %libnamedev +SIM (Simple Instant Messenger) is a plugins-based open- +source instant messenger that supports various protocols +(ICQ, Jabber, AIM, MSN). It uses the QT library and works +on X11 (with optional KDE-support). + +Devel files + +%prep +rm -rf $RPM_BUILD_ROOT + +%setup -q + +%build +WANT_AUTOCONF_2_5=1 gmake -f admin/Makefile.common + +# mdk libtool doesn't know the --tag option :-( +for i in `find sim/ -name Makefile.in`; do perl -pi -e 's/^(LTCXXCOMPILE.*?)\s*--tag=CXX/$1/' "$i"; done +for i in `find sim/ -name Makefile.in`; do perl -pi -e 's/^(CXXLINK.*?)\s*--tag=CXX/$1/' "$i"; done +for i in `find plugins/ -name Makefile.in`; do perl -pi -e 's/^(LTCXXCOMPILE.*?)\s*--tag=CXX/$1/' "$i"; done +for i in `find plugins/ -name Makefile.in`; do perl -pi -e 's/^(CXXLINK.*?)\s*--tag=CXX/$1/' "$i"; done + +%configure --disable-rpath +%make + +%install +%makeinstall + +# Menu +mkdir -p %buildroot/%_menudir +cat > %buildroot/%_menudir/%name < 0.9.3-1mdk +- Upgrade to 0.9.3 +- Added sablotron and flex to requirements + +* Sun Nov 23 2003 Robert Scheck 0.9.2-1mdk +- Upgrade to 0.9.2 + +* Wed Nov 05 2003 Robert Scheck 0.9.1-1mdk +- Upgrade to 0.9.1 +- Initial spec file based on the official one from Mandrake diff --git a/plugins/__homedir/CMakeLists.txt b/plugins/__homedir/CMakeLists.txt new file mode 100644 index 0000000..b316fab --- /dev/null +++ b/plugins/__homedir/CMakeLists.txt @@ -0,0 +1,25 @@ +##################### +# __homedir library # +##################### + +#conditional sources +IF(WIN32) + SET (__homedir_SRCS homedircfg.cpp) + SET (__homedir_HDRS homedircfg.h) + SET (__homedir_UICS homedircfgbase.ui) +ENDIF(WIN32) + +SET(__homedir_SRCS + homedir.cpp + ${__homedir_SRCS} +) + +SET(__homedir_HDRS + homedir.h + ${__homedir_HDRS} +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(__homedir) diff --git a/plugins/__homedir/__homedir.vcproj b/plugins/__homedir/__homedir.vcproj new file mode 100644 index 0000000..edc4700 --- /dev/null +++ b/plugins/__homedir/__homedir.vcproj @@ -0,0 +1,369 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/__homedir/configure.in.in b/plugins/__homedir/configure.in.in new file mode 100644 index 0000000..27c8e1f --- /dev/null +++ b/plugins/__homedir/configure.in.in @@ -0,0 +1,5 @@ +if test "$kde_use_qt_win" = "yes"; then + __HOMEDIR_OBJ=homedircfg.lo + AC_SUBST([__HOMEDIR_OBJ]) +fi + diff --git a/plugins/__homedir/homedir.cpp b/plugins/__homedir/homedir.cpp new file mode 100644 index 0000000..91c7d00 --- /dev/null +++ b/plugins/__homedir/homedir.cpp @@ -0,0 +1,249 @@ +/*************************************************************************** + homedir.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "homedir.h" + +#ifdef WIN32 +#include +#include + +#include +#include + +#include "homedircfg.h" + +static BOOL (WINAPI *_SHGetSpecialFolderPathA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate) = NULL; +static BOOL (WINAPI *_SHGetSpecialFolderPathW)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate) = NULL; + +#else +#include +#include +#include +#endif + +#include +#include + +#include "log.h" +#include "misc.h" + +using namespace std; +using namespace SIM; + +Plugin *createHomeDirPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new HomeDirPlugin(base); + return plugin; +} + +static PluginInfo info = + { +#ifdef WIN32 + I18N_NOOP("Home directory"), + I18N_NOOP("Plugin provides select directory for store config files"), +#else + NULL, + NULL, +#endif + VERSION, + createHomeDirPlugin, + PLUGIN_NO_CONFIG_PATH | PLUGIN_NODISABLE + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +#ifdef WIN32 + +static const char key_name[] = "SIM"; +static const char path_value[] = "Path"; + +#endif + +HomeDirPlugin::HomeDirPlugin(unsigned base) + : Plugin(base) +{ +#ifdef WIN32 + m_bSave = true; + QSettings setting( QSettings::NativeFormat, QSettings::UserScope, key_name ); + m_homeDir = setting.value( path_value, QString("%APPDATA%") ).toString(); + m_bDefault = m_homeDir.isNull(); +#endif + QString d; + EventArg e("-b:", I18N_NOOP("Set home directory")); + if (e.process() && !e.value().isEmpty()){ + d = e.value(); +#ifdef WIN32 + m_bSave = false; +#endif + } else { + d = m_homeDir; + } + QDir dir( d ); + if ( d.isEmpty() || !dir.exists() ) { + m_homeDir = defaultPath(); +#ifdef WIN32 + m_bDefault = true; + m_bSave = false; +#endif + } +} + +QString HomeDirPlugin::defaultPath() +{ + QString s; +#ifndef WIN32 + struct passwd *pwd = getpwuid(getuid()); + if (pwd){ + s = QFile::decodeName(pwd->pw_dir); + }else{ + log(L_ERROR, "Can't get pwd"); + } + if (!s.endsWith("/")) + s += '/'; +#ifdef USE_KDE + char *kdehome = getenv("KDEHOME"); + if (kdehome){ + s = kdehome; + }else{ + s += ".kde/"; + } + if (!s.endsWith("/")) + s += '/'; + s += "share/apps/sim"; +#else // USE_KDE + +#ifdef __OS2__ + char *os2home = getenv("HOME"); + if (os2home) { + s = os2home; + s += "\\"; + } + s += ".sim-qt4"; + if ( access( s, F_OK ) != 0 ) { + mkdir( s, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH ); + } +#else // __OS2__ + +#ifdef Q_OS_MAC + s += "Library/Sim-IM"; +#else // Q_OS_MAC + s += ".sim-qt4"; +#endif // Q_OS_MAC + +#endif // __OS2__ + +#endif // USE_KDE +#else + char szPath[1024]; + szPath[0] = 0; + QString defPath; + + //Fixme: + //FOLDERID_RoamingAppData <<== this is used in Vista.. should be fixed + //otherwise the config is stored in "Downloads" per default :-/ + //Windows 2008 Server tested, simply works... + + (DWORD&)_SHGetSpecialFolderPathW = (DWORD)QLibrary::resolve("Shell32.dll","SHGetSpecialFolderPathW"); + (DWORD&)_SHGetSpecialFolderPathA = (DWORD)QLibrary::resolve("Shell32.dll","SHGetSpecialFolderPathA"); + //(DWORD&)_SHGetKnownFolderPath = (DWORD)QLibrary::resolve("Shell32.dll","SHGetKnownFolderPath"); //for Vista :-/ + + if (_SHGetSpecialFolderPathW && _SHGetSpecialFolderPathW(NULL, szPath, CSIDL_APPDATA, true)){ + defPath = QString::fromUtf16((unsigned short*)szPath); + }else if (_SHGetSpecialFolderPathA && _SHGetSpecialFolderPathA(NULL, szPath, CSIDL_APPDATA, true)){ + defPath = QFile::decodeName(szPath); + } + //}else if (_SHGetKnownFolderPath && _SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0x00008000, NULL, szPath)){ + // defPath = QFile::decodeName(szPath); + + /*HRESULT SHGetKnownFolderPath( REFKNOWNFOLDERID rfid, + DWORD dwFlags, + HANDLE hToken, + PWSTR *ppszPath );*/ + + if (!defPath.isEmpty()){ + if (!defPath.endsWith("\\")) + defPath += '\\'; + defPath += "sim"; + makedir(defPath + '\\'); + QString lockTest = defPath + "\\.lock"; + QFile f(lockTest); + if (!f.open(QIODevice::ReadWrite|QIODevice::Truncate)) + defPath.clear(); + f.close(); + QFile::remove(lockTest); + } + if (!defPath.isEmpty()){ + s = defPath; + }else{ + s = app_file(QString()); + } +#endif +#ifdef HAVE_CHMOD + chmod(QFile::encodeName(s), 0700); +#endif + return QDir::convertSeparators(s); +} + +#ifdef WIN32 + +QWidget *HomeDirPlugin::createConfigWindow(QWidget *parent) +{ + return new HomeDirConfig(parent, this); +} + +QByteArray HomeDirPlugin::getConfig() +{ + if (!m_bSave) + return QByteArray(); + QSettings setting( QSettings::NativeFormat, QSettings::UserScope, key_name ); + + if (!m_bDefault){ + setting.setValue( path_value, m_homeDir ); + }else{ + setting.remove( path_value ); + } + return QByteArray(); +} + +#endif + +QString HomeDirPlugin::buildFileName(const QString &name) +{ + QString s; + QString fname = name; + if(QDir(fname).isRelative()) { + s += m_homeDir; + s += '/'; + } + s += fname; + return QDir::convertSeparators(s); +} + +bool HomeDirPlugin::processEvent(Event *e) +{ + if (e->type() == eEventHomeDir){ + EventHomeDir *homedir = static_cast(e); + homedir->setHomeDir(buildFileName(homedir->homeDir())); + return true; + } + return false; +} diff --git a/plugins/__homedir/homedir.h b/plugins/__homedir/homedir.h new file mode 100644 index 0000000..3bbcaac --- /dev/null +++ b/plugins/__homedir/homedir.h @@ -0,0 +1,44 @@ +/*************************************************************************** + homedir.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _HOMEDIR_H +#define _HOMEDIR_H + +#include "event.h" +#include "plugins.h" + +class HomeDirPlugin : public SIM::Plugin, public SIM::EventReceiver +{ +public: + HomeDirPlugin(unsigned base); + QString defaultPath(); +protected: + bool processEvent(SIM::Event *e); + QString buildFileName(const QString &name); +#ifdef WIN32 + virtual QWidget *createConfigWindow(QWidget *parent); + virtual QByteArray getConfig(); + friend class HomeDirConfig; + + bool m_bDefault; + bool m_bSave; +#endif + QString m_homeDir; +}; + +#endif + diff --git a/plugins/__homedir/homedir.rc b/plugins/__homedir/homedir.rc new file mode 100644 index 0000000..4a77162 --- /dev/null +++ b/plugins/__homedir/homedir.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Home directory plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "__homedir\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "__homedir.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/__homedir/homedircfg.cpp b/plugins/__homedir/homedircfg.cpp new file mode 100644 index 0000000..c164652 --- /dev/null +++ b/plugins/__homedir/homedircfg.cpp @@ -0,0 +1,81 @@ +/*************************************************************************** + homedircfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "homedircfg.h" +#include "homedir.h" + +#include "simgui/editfile.h" + +#include +#include +#include + +HomeDirConfig::HomeDirConfig(QWidget *parent, HomeDirPlugin *plugin) + : QWidget(parent) + , m_plugin(plugin) +{ + setupUi(this); +#ifdef WIN32 // ER + chkDefault->setChecked(plugin->m_bDefault); +#endif + connect(chkDefault, SIGNAL(toggled(bool)), this, SLOT(defaultToggled(bool))); + defaultToggled(chkDefault->isChecked()); + edtPath->setText(QDir::convertSeparators(plugin->m_homeDir)); + edtPath->setDirMode(true); +#ifdef WIN32 // ER + chkDefault->setChecked(m_plugin->m_bDefault); +#endif +} + +void HomeDirConfig::apply() +{ + bool bDefault; + QString d; + QString defPath = m_plugin->defaultPath(); + + if (chkDefault->isChecked()){ + bDefault = true; + d = defPath; + }else{ + bDefault = false; + d = edtPath->text(); + } + if (d.isEmpty()) { + d = defPath; + } + QDir dir(d); + if (!dir.exists()) { + d = defPath; + bDefault = true; + } + + if (d.endsWith("/") || d.endsWith("\\")) + d = d.left(d.length() - 1); + + edtPath->setText(QDir::convertSeparators(d)); + m_plugin->m_bDefault = bDefault; + m_plugin->m_homeDir = d; + m_plugin->m_bSave = true; +} + +void HomeDirConfig::defaultToggled(bool bState) +{ + edtPath->setEnabled(!bState); + if (bState) + edtPath->setText(m_plugin->defaultPath()); +} + diff --git a/plugins/__homedir/homedircfg.h b/plugins/__homedir/homedircfg.h new file mode 100644 index 0000000..57eae32 --- /dev/null +++ b/plugins/__homedir/homedircfg.h @@ -0,0 +1,39 @@ +/*************************************************************************** + homedircfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _HOMEDIRCFG_H +#define _HOMEDIRCFG_H + +#include "ui_homedircfgbase.h" + +class HomeDirPlugin; + +class HomeDirConfig : public QWidget, public Ui::HomeDirConfigBase +{ + Q_OBJECT +public: + HomeDirConfig(QWidget *parent, HomeDirPlugin *plugin); +public slots: + void apply(); +protected slots: + void defaultToggled(bool); +protected: + HomeDirPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/__homedir/homedircfgbase.ui b/plugins/__homedir/homedircfgbase.ui new file mode 100644 index 0000000..bb8c0a9 --- /dev/null +++ b/plugins/__homedir/homedircfgbase.ui @@ -0,0 +1,70 @@ + + + HomeDirConfigBase + + + + 0 + 0 + 213 + 134 + + + + Form1 + + + + 6 + + + 11 + + + + + Use &default path + + + + + + + Path for config files: + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + EditFile + QWidget +

simgui/editfile.h
+ + + + + diff --git a/plugins/__migrate/CMakeLists.txt b/plugins/__migrate/CMakeLists.txt new file mode 100644 index 0000000..2a35378 --- /dev/null +++ b/plugins/__migrate/CMakeLists.txt @@ -0,0 +1,23 @@ +##################### +# __migrate library # +##################### +IF(BUILD_DROPPED) +SET(__migrate_SRCS + migrate.cpp + migratedlg.cpp +) + +SET(__migrate_HDRS + migrate.h + migratedlg.h +) + +SET(__migrate_UICS + migratedlgbase.ui +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(__migrate) +ENDIF(BUILD_DROPPED) diff --git a/plugins/__migrate/__migrate.vcproj b/plugins/__migrate/__migrate.vcproj new file mode 100644 index 0000000..ddf96d5 --- /dev/null +++ b/plugins/__migrate/__migrate.vcproj @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/__migrate/migrate.cpp b/plugins/__migrate/migrate.cpp new file mode 100644 index 0000000..0562c60 --- /dev/null +++ b/plugins/__migrate/migrate.cpp @@ -0,0 +1,86 @@ +/*************************************************************************** + migrate.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include "misc.h" + +#include "migrate.h" +#include "migratedlg.h" + +using namespace SIM; + +Plugin *createMigratePlugin(unsigned base, bool, Buffer*) +{ + MigratePlugin *plugin = new MigratePlugin(base); + if (!plugin->init()){ + delete plugin; + return NULL; + } + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Migrate"), + I18N_NOOP("Plugin provides convert configuration and history from SIM 0.8"), + VERSION, + createMigratePlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +MigratePlugin::MigratePlugin(unsigned base) + : Plugin(base) +{ +} + +MigratePlugin::~MigratePlugin() +{ +} + +bool MigratePlugin::init() +{ + QString dir = user_file(QString::null); + QDir d(dir); + if (!d.exists()) + return false; + QStringList cnvDirs; + QStringList dirs = d.entryList(QDir::Dirs); + QStringList::Iterator it; + for (it = dirs.begin(); it != dirs.end(); ++it){ + if ((*it)[0] == '.') + continue; + QString p = dir + (*it); + p += '/'; + QFile icqConf(p + "icq.conf"); + QFile clientsConf(p + "clients.conf"); + if (icqConf.exists() && !clientsConf.exists()){ + cnvDirs.append(*it); + } + } + if (cnvDirs.count() == 0) + return false; + MigrateDialog dlg(dir, cnvDirs); + dlg.exec(); + return true; +} + diff --git a/plugins/__migrate/migrate.h b/plugins/__migrate/migrate.h new file mode 100644 index 0000000..a81f764 --- /dev/null +++ b/plugins/__migrate/migrate.h @@ -0,0 +1,32 @@ +/*************************************************************************** + migrate.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MIGRATE_H +#define _MIGRATE_H + +#include "plugins.h" + +class MigratePlugin : public SIM::Plugin +{ +public: + MigratePlugin(unsigned); + ~MigratePlugin(); + bool init(); +}; + +#endif + diff --git a/plugins/__migrate/migrate.rc b/plugins/__migrate/migrate.rc new file mode 100644 index 0000000..7dbca9b --- /dev/null +++ b/plugins/__migrate/migrate.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Migrate plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "__migrate\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "__migrate.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/__migrate/migratedlg.cpp b/plugins/__migrate/migratedlg.cpp new file mode 100644 index 0000000..ad4d60c --- /dev/null +++ b/plugins/__migrate/migratedlg.cpp @@ -0,0 +1,401 @@ +/*************************************************************************** + migratedlg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "buffer.h" +#include "unquot.h" +#include "misc.h" + +#include "migratedlg.h" + +#include "simgui/ballonmsg.h" + + + +using namespace std; +using namespace SIM; + +MigrateDialog::MigrateDialog(const QString &dir, const QStringList &cnvDirs) : QWizard(NULL) + //: MigrateDialogBase(NULL, "migrate", true) +{ + setupUi(this); + m_dir = dir; + m_cnvDirs = cnvDirs; + m_bProcess = false; + QVBoxLayout *lay = (QVBoxLayout*)(page1->layout()); + for (QStringList::Iterator it = m_cnvDirs.begin(); it != m_cnvDirs.end(); ++it){ + QCheckBox *chk = new QCheckBox(*it, page1); + lay->insertWidget(1, chk); + chk->show(); + chk->setChecked(true); + m_boxes.push_back(chk); + } + chkRemove->setChecked(true); + connect(this, SIGNAL(selected(const QString&)), this, SLOT(pageSelected(const QString&))); + button( QWizard::HelpButton )->hide(); +} + +void MigrateDialog::closeEvent(QCloseEvent *e) +{ + if (!m_bProcess){ + QWizard::closeEvent(e); + return; + } + e->ignore(); + ask(); +} + +void MigrateDialog::reject() +{ + if (!m_bProcess){ + QWizard::reject(); + return; + } + ask(); +} + +void MigrateDialog::ask() +{ + QAbstractButton *btn = button( QWizard::CancelButton ); + QPoint p = btn->mapToGlobal(QPoint(0, 0)); + QRect rc(p.x(), p.y(), btn->width(), btn->height()); + BalloonMsg::ask(NULL, i18n("Cancel convert?"), this, SLOT(cancel(void*)), NULL, &rc); +} + +void MigrateDialog::cancel(void*) +{ + m_bProcess = false; + reject(); +} + +void MigrateDialog::pageSelected(const QString&) +{ + if (currentPage() != page2) + return; + button( QWizard::BackButton )->hide(); + button( QWizard::FinishButton )->setEnabled(false); + list::iterator it; + for (it = m_boxes.begin(); it != m_boxes.end(); ++it){ + if ((*it)->isChecked()){ + m_bProcess = true; + break; + } + } + if (!m_bProcess){ + reject(); + return; + } + unsigned totalSize = 0; + for (it = m_boxes.begin(); it != m_boxes.end(); ++it){ + if (!(*it)->isChecked()) + continue; + QString path = user_file((*it)->text()); + path += '/'; + QFile icq_conf(path + "icq.conf"); + totalSize += icq_conf.size(); + QString history_path = path + "history"; + history_path += '/'; + QDir history(history_path); + QStringList l = history.entryList(QStringList("*.history"), QDir::Files); + for (QStringList::Iterator it = l.begin(); it != l.end(); ++it){ + QFile hf(history_path + (*it)); + totalSize += hf.size(); + } + } + barCnv->setMaximum(totalSize); + QTimer::singleShot(0, this, SLOT(process())); +} + +void MigrateDialog::error(const QString &str) +{ + lblStatus->setText(str); + barCnv->hide(); + button( QWizard::FinishButton )->setEnabled(true); + m_bProcess = false; +} + +void MigrateDialog::process() +{ + unsigned size = 0; + for (list::iterator it = m_boxes.begin(); it != m_boxes.end(); ++it){ + if (!(*it)->isChecked()) + continue; + QString path = user_file((*it)->text()); + path += '/'; + icqConf.close(); + clientsConf.close(); + contactsConf.close(); + icqConf.setFileName(path + "icq.conf"); + clientsConf.setFileName(path + "clients.conf"); + contactsConf.setFileName(path + "contacts.conf"); + lblStatus->setText(path + "icq.conf"); + if (!icqConf.open(QIODevice::ReadOnly)){ + error(i18n("Can't open %1") .arg(path + "icq.conf")); + return; + } + if (!clientsConf.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + error(i18n("Can't open %1") .arg(path + "clients.conf")); + return; + } + if (!contactsConf.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + error(i18n("Can't open %1") .arg(path + "contacts.conf")); + return; + } + m_uin = 0; + m_passwd = ""; + m_state = 0; + m_grpId = 0; + m_contactId = 0; + Buffer cfg; + cfg.init(icqConf.size()); + icqConf.read(cfg.data(), icqConf.size()); + for (;;){ + QByteArray section = cfg.getSection(); + if (section.isEmpty()) + break; + m_state = 3; + if (section == "Group") + m_state = 1; + if (section == "User") + m_state = 2; + if (!m_bProcess) + return; + for (;;){ + QByteArray l = cfg.getLine(); + if (l.isEmpty()) + break; + QByteArray line = l; + QByteArray name = getToken(line, '='); + if (name == "UIN") + m_uin = line.toUInt(); + if (name == "EncryptPassword") + m_passwd = line; + if (name == "Name") + m_name = line; + if (name == "Alias") + m_name = line; + } + flush(); + barCnv->setValue(cfg.readPos()); + qApp->processEvents(); + } + icqConf.close(); + clientsConf.close(); + contactsConf.close(); + m_state = 3; + size += icqConf.size(); + if (!m_bProcess) + return; + barCnv->setValue(size); + qApp->processEvents(); + QString h_path = path; +#ifdef WIN32 + h_path += "history\\"; +#else + h_path += "history/"; +#endif + QDir history(h_path); + QStringList l = history.entryList(QStringList("*.history"), QDir::Files); + for (QStringList::Iterator it = l.begin(); it != l.end(); ++it){ + hFrom.close(); + hTo.close(); + hFrom.setFileName(h_path + (*it)); + lblStatus->setText(h_path + (*it)); + hTo.setFileName(h_path + QString(m_owner) + '.' + it->left(it->indexOf('.'))); + if (!hFrom.open(QIODevice::ReadOnly)){ + error(i18n("Can't open %1") .arg(hFrom.fileName())); + return; + } + if (!hTo.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + error(i18n("Can't open %1") .arg(hTo.fileName())); + return; + } + cfg.init(hFrom.size()); + hFrom.read(cfg.data(), hFrom.size()); + for (;;){ + QByteArray section = cfg.getSection(); + if (section.isEmpty()) + break; + m_state = 3; + if (section == "Message") + m_state = 4; + if (!m_bProcess) + return; + for (;;){ + QByteArray l = cfg.getLine(); + if (l.isEmpty()) + break; + QByteArray line = l; + QByteArray name = getToken(line, '='); + if (name == "Message") + m_message = line; + if (name == "Time") + m_time = line; + if (name == "Direction") + m_direction = line; + if (name == "Charset") + m_charset = line; + } + flush(); + barCnv->setValue(cfg.readPos()); + qApp->processEvents(); + } + hFrom.close(); + hTo.close(); + m_state = 3; + size += hFrom.size(); + if (!m_bProcess) + return; + barCnv->setValue(size); + qApp->processEvents(); + } + if (chkRemove->isChecked()){ + icqConf.remove(); + icqConf.setFileName(path + "sim.conf"); + icqConf.remove(); + for (QStringList::Iterator it = l.begin(); it != l.end(); ++it){ + hFrom.setFileName(h_path + (*it)); + hFrom.remove(); + } + } + } + m_bProcess = false; + accept(); +} + +void MigrateDialog::flush() +{ + QByteArray output; + switch (m_state){ + case 0: + output = "[icq/ICQ]\n"; + clientsConf.write(output, output.length()); + output = "Uin="; + output += QByteArray::number(m_uin); + output += "\n"; + if (!m_passwd.isEmpty()){ + m_passwd = unquoteString(m_passwd).toUtf8(); + unsigned char xor_table[] = + { + 0xf3, 0x26, 0x81, 0xc4, 0x39, 0x86, 0xdb, 0x92, + 0x71, 0xa3, 0xb9, 0xe6, 0x53, 0x7a, 0x95, 0x7c + }; + for (int i = 0; i < (int)m_passwd.length(); i++) + m_passwd[i] = (char)(m_passwd[i] ^ xor_table[i]); + QByteArray new_passwd; + unsigned short temp = 0x4345; + for (int i = 0; i < (int)m_passwd.length(); i++) { + temp ^= m_passwd[i]; + new_passwd += '$'; + char buff[8]; + sprintf(buff, "%x", temp); + new_passwd += buff; + } + output += "Password=\""; + output += new_passwd; + output += "\"\n"; + } + clientsConf.write(output, output.length()); + m_owner = "ICQ."; + m_owner += QByteArray::number(m_uin); + break; + case 1: + if (!m_name.isEmpty()){ + output = "[Group="; + output += QByteArray::number(++m_grpId); + output += "]\n"; + output += "Name=\""; + output += m_name; + output += "\"\n"; + contactsConf.write(output, output.length()); + } + break; + case 2: + output = "[Contact="; + output += QByteArray::number(++m_contactId); + output += "]\n"; + if (m_uin >= 0x80000000) + m_uin = 0; + if (m_name.isEmpty()) + m_name = QByteArray::number(m_uin); + if (!m_name.isEmpty()){ + output += "Name=\""; + output += m_name; + output += "\"\n"; + } + if (m_uin){ + output += "["; + output += m_owner; + output += "]\n"; + output += "Uin="; + output += QByteArray::number(m_uin); + output += "\n"; + } + contactsConf.write(output, output.length()); + break; + case 4: + if (!m_message.isEmpty()){ + QString msg = QString::fromLocal8Bit(m_message); + if (!m_charset.isEmpty()){ + QTextCodec *codec = QTextCodec::codecForName(m_charset); + if (codec) + msg = codec->toUnicode(m_message); + } + output = "[Message]\n"; + output += "Text=\""; + output += quoteChars(msg, "\"", false).toLocal8Bit(); + output += "\"\n"; + if (m_direction.isEmpty()){ + output += "Flags=2\n"; + }else{ + output += "Flags=3\n"; + } + output += "Time="; + output += m_time; + output += "\n"; + hTo.write(output, output.length()); + } + break; + } + m_uin = 0; + m_passwd = ""; + m_name = ""; + m_message = ""; + m_time = ""; + m_direction = ""; + m_charset = ""; +} + +/* +#ifndef NO_MOC_INCLUDES +#include "migratedlg.moc" +#endif +*/ + diff --git a/plugins/__migrate/migratedlg.h b/plugins/__migrate/migratedlg.h new file mode 100644 index 0000000..0ac2369 --- /dev/null +++ b/plugins/__migrate/migratedlg.h @@ -0,0 +1,72 @@ +/*************************************************************************** + migratedlg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MIGRATEDLG_H +#define _MIGRATEDLG_H + +#include "ui_migratedlgbase.h" + +#include +#include +#include +#include +#include "simapi.h" + +class MigrateDialog : public QWizard, public Ui::MigrateDialogBase +{ + Q_OBJECT +public: + MigrateDialog(const QString &dir, const QStringList &cnvDirs); +protected slots: + void cancel(void*); + void pageSelected(const QString&); + void process(); +protected: + void closeEvent(QCloseEvent *e); + void reject(); + void ask(); + void error(const QString&); + void flush(); + + QByteArray m_owner; + + unsigned m_uin; + QByteArray m_passwd; + QByteArray m_name; + int m_state; + QByteArray m_message; + QByteArray m_time; + QByteArray m_direction; + QByteArray m_charset; + + unsigned m_grpId; + unsigned m_contactId; + + QFile icqConf; + QFile clientsConf; + QFile contactsConf; + QFile hFrom; + QFile hTo; + + bool m_bProcess; + std::list m_boxes; + QString m_dir; + QStringList m_cnvDirs; +}; + +#endif + diff --git a/plugins/__migrate/migratedlgbase.ui b/plugins/__migrate/migratedlgbase.ui new file mode 100644 index 0000000..474b6c6 --- /dev/null +++ b/plugins/__migrate/migratedlgbase.ui @@ -0,0 +1,142 @@ + + + MigrateDialogBase + + + + 0 + 0 + 507 + 316 + + + + Convert configuration from old version + + + + Select directories for convert + + + + 11 + + + + + Directories for convert: + + + false + + + + + + + + 0 + 0 + + + + + + + + &Remove old files + + + + + + + Note! +If you select an option " Remove old files ", you can not use the old version + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + Convert configuration + + + + 11 + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + qPixmapFromMimeSource + + + diff --git a/plugins/_core/CMakeLists.txt b/plugins/_core/CMakeLists.txt new file mode 100644 index 0000000..40e8c0a --- /dev/null +++ b/plugins/_core/CMakeLists.txt @@ -0,0 +1,203 @@ +################# +# _core library # +################# +ADD_SUBDIRECTORY(pict) +ADD_SUBDIRECTORY(styles) + +SET(_core_SRCS + arcfg.cpp + autoreply.cpp + cfgdlg.cpp + cmenu.cpp + commands.cpp + connectionsettings.cpp + connectwnd.cpp + container.cpp + core.cpp + declinedlg.cpp + editmail.cpp + editphone.cpp + filecfg.cpp + filetransfer.cpp + history.cpp + historycfg.cpp + historywnd.cpp + interfacecfg.cpp + logindlg.cpp + maininfo.cpp + mainwin.cpp + manager.cpp + msgauth.cpp + msgcfg.cpp + msgcontacts.cpp + msgedit.cpp + msgfile.cpp + msggen.cpp + msgrecv.cpp + msgsms.cpp + msgurl.cpp + msgview.cpp + msgview_menu.cpp + newprotocol.cpp + nonim.cpp + pagerdetails.cpp + phonedetails.cpp + plugincfg.cpp + prefcfg.cpp + search.cpp + searchall.cpp + smscfg.cpp + status.cpp + statuswnd.cpp + textedit_menu.cpp + tmpl.cpp + toolbar_container.cpp + toolbar_history.cpp + toolbar_main.cpp + toolbar_msgedit.cpp + toolbar_textedit.cpp + toolbarcfg.cpp + toolsetup.cpp + usercfg.cpp + userhistorycfg.cpp + userlist.cpp + userview.cpp + userviewcfg.cpp + userviewdelegate.cpp + userwnd.cpp +) + +# is this really needed? +IF(NOT WIN32) +SET(_core_SRCS + ${_core_SRCS} + libintl.cpp + ) +ENDIF(NOT WIN32) + +SET(_core_HDRS + arcfg.h + autoreply.h + cfgdlg.h + cmenu.h + commands.h + connectionsettings.h + connectwnd.h + container.h + core.h + core_consts.h + core_events.h + declinedlg.h + editmail.h + editphone.h + filecfg.h + filetransfer.h + history.h + historycfg.h + historywnd.h + interfacecfg.h + logindlg.h + maininfo.h + mainwin.h + manager.h + msgauth.h + msgcfg.h + msgcontacts.h + msgedit.h + msgfile.h + msggen.h + msgrecv.h + msgsms.h + msgurl.h + msgview.h + newprotocol.h + nonim.h + pagerdetails.h + phonedetails.h + plugincfg.h + prefcfg.h + search.h + searchall.h + smscfg.h + status.h + statuswnd.h + tmpl.h + toolbarcfg.h + toolsetup.h + usercfg.h + userhistorycfg.h + userlist.h + userview.h + userviewcfg.h + userviewdelegate.h + userwnd.h +) + +SET(_core_UICS + arcfgbase.ui + autoreplybase.ui + cfgdlgbase.ui + connectionsettingsbase.ui + connectwndbase.ui + declinedlgbase.ui + editmailbase.ui + editphonebase.ui + filecfgbase.ui + filetransferbase.ui + fontconfigbase.ui + historycfgbase.ui + interfacecfgbase.ui + logindlgbase.ui + maininfobase.ui + managerbase.ui + msgcfgbase.ui + newprotocolbase.ui + nonimbase.ui + pagerbase.ui + phonebase.ui + plugincfgbase.ui + prefcfgbase.ui + searchallbase.ui + searchbase.ui + smscfgbase.ui + toolsetupbase.ui + userhistorycfgbase.ui + userviewcfgbase.ui +) + +# so we don't need an extra CMakeLists.txt in every subdirectory +ADD_JISP_ARCHIVE(jisp sim.jisp _core_SRCS) + +IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/jisp/icondef.xml) + message( "Using non-GPL icons" ) + ADD_JISP_ARCHIVE(GPL-Icons GPL-Icons.jisp _core_SRCS) +ELSE (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/jisp/icondef.xml) + message( "Using GPL icons" ) + # substitute with gpl icons + ADD_JISP_ARCHIVE(GPL-Icons sim.jisp _core_SRCS) +ENDIF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/jisp/icondef.xml) + +ADD_JISP_ARCHIVE(smiles smiles.jisp _core_SRCS) +ADD_JISP_ARCHIVE(additional additional.jisp _core_SRCS) +ADD_JISP_ARCHIVE(icq5 icq5.jisp _core_SRCS) +ADD_JISP_ARCHIVE(icq5.1 icq5.1.jisp _core_SRCS) +ADD_JISP_ARCHIVE(icqlite icqlite.jisp _core_SRCS) +ADD_JISP_ARCHIVE(qip-icons qip-icons.jisp _core_SRCS) +ADD_JISP_ARCHIVE(lovenmoney lovenmoney.jisp _core_SRCS) +ADD_JISP_ARCHIVE(yahoo yahoo.jisp _core_SRCS) +ADD_JISP_ARCHIVE(msn msn.jisp _core_SRCS) + +FILE(GLOB _prebuilt emoticons_prebuilt/*.jisp) + +IF(APPLE) + FOREACH(FILE ${_prebuilt}) + GET_FILENAME_COMPONENT(FILENAME ${FILE} NAME) + CONFIGURE_FILE(${FILE} ${SIM_ICONS_DIR}/${NAME} COPYONLY) + ENDFOREACH(FILE) +ENDIF(APPLE) + +INSTALL(FILES ${_prebuilt} DESTINATION ${SIM_ICONS_DIR}) + +SIM_ADD_PLUGIN(_core) + +SET_TARGET_PROPERTIES(_core PROPERTIES DEFINE_SYMBOL CORE_EXPORTS) diff --git a/plugins/_core/GPL-Icons/1downarrow.png b/plugins/_core/GPL-Icons/1downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a966b093516736561a76499a1bc2e3b93143bc2b GIT binary patch literal 716 zcmV;-0yF)IP)*qh_?!SNkGyVVlhvDDv-wgkL{bBg~>o*YpVfYWH zfns3!Uts$0htK~QK71$z2p~rJlp`sDQ1`2XzDWq<%;Vg2)?`u?FaYnQRw zaoFkb15IFH_>bmnkf9e}GceqE!@%$zXb|h0w+tU_LcM1 zt1ou%1?3nRn3x#e0&RNtoq^%)cL;sz1p~u{mkbQw{xC57{{DyI$MO{n3@`6@GBB{s z1PCBzUX@UW|9}7QV|@Km>D`B)`tO8g8Q%Y51RL@Oi0^-7V0iKc6aXOS0G+aFJun1M zE&^)K19=W0fLIX0%TT~{?SlLpW_J5O`X&tjfwuhzst3mmBQ(YAI{X*P26%AB$8(9lL0AVI&X67@$ z-@VU%yJpQ#{`apK_}{){c)fhZ&%a+kWdpTLV;E{1>q y8Gd~HPzLnGT5M_o0*H~)+z1dr6z4{O00RJ%((lDo{_fQP0000&&j~d&B4gb%Ix=ti>IDJL{yLc@2@v(|9>^z zn&&hPqz@o~m>39vzdwJqd}82OZ{lodIIY}_S;Jai{QE!VZkRkk0I}fI`TxJ*&+k7c z{8vaU-FX7ico*+(Tm6zYzui1P}{CD^TL+&)`2?LQ@q&e8l|&wHU;?85pj=25N??;Q$%%3&{WV7j6JR z0I?uk{U`UYkW{x~LKwT9vjW3kpu+3lP~FGI%)sy&?1JBLF@OLOEfi}UDZ&W z;q_YvhUfngE`tyd>cv-J5d1=T0U&@_ki5_E>mLKdgO9+d`wmqNG~_Q3|N9T&egwMe z15mFZQXm2Z5W;{jAId(?oZJ01ID(x?ONoI2=+yr}ul@mQ{{IijA1tVW2oOL>35j_! z!@K9vf0oRB`RnKfuxmi-{)4>x7YY9X1vbI}fB-^^Mz*yK-#&JI$Tuu&P zJ1|`E7hwQE0AWeWtY;Yh{`2|0d-K76o7ORiu>E0>5M*Ew;{jq|w2A|1CZsR`2p}AJ zf$=tw2>g8f;G#G4<}q--e!(CKG(;4rS%M#E0Fny;0tioLVgjZ=*7%QCFSXw2o&Mwd zxho7(BEXP(`kdkS$1iYC0R#{uJUcTM$ zc`KJPym~GL6rK!{0|+3v0e}DeVfgq9V!)q&@PGw7m>K9!79iF#muL9O8qfZ+Z+aKZ z0Du5OxZoGi0AS$V1^WFT)P-Q05n>Q9h=5K3M)w~Elwbe|AQnUz{9*V4G~gEy!+Z!z zW554F@P9U-z=eAZ4C`0?Wcc!-45kktfLM@Y;rB0yVu)@i20EP)7zPZdE-)}`UHy{b z`=@LM2DY^@eE@4=6Sueq;jL`uF=EhF5DgF#JA#^dL|$m4SivHhMw=2q3rtj6ee<_<;@ph5-xE zC75P)i@rgO&HOX0|XG70smFM|7BXL zXsjik;2_BG=p6&Y!?z3!$?jqd8m^Y&-+wbKW%&0`m4Ojq3_t)u3;^;O|Nj^K^XK1e zE+u6(FG~rAuiqFLuD*ugFJBoL0z8!%ge^?ee*OMCn*pd6W&l6{F$){Tg98s3Xfywa z$oQLBsxXLfGBP~<#K7?CI|IX;ZxGA^w2D(kg5my?uL{2&JdgysWW#@8fCB^&3pCVP zzVV92NocAAUBbw4`2{3GK=|)Jh~_^)`qzIZ22Lj@hR;u5$1z>K@c2J7YYjjEu>b?j z>n9_7@iz%IhHw9v7%sg;3K5X+fW(jAK-U1h@%1NAfR%-T(Z-eG-^2UG|KGhn1`t5Z zf<{TJzDQ`w{N)i~`2353;r$N?{tQ(7^%q3bN1#_g36`Cifq@NVh9EZsGrtha-`h8| z0Ro7Hk&{@qYjPijSvY45fyFr%y{rMM|Jby9#{q=|8 z9|->j(Z7NG-w-}n>^InuUthle`}yfhDL?=*Qkok90*K<=2oPWZm=Xmo49sE%00000 LNkvXXu0mjf5z9$i literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/SMS-protocol.png b/plugins/_core/GPL-Icons/SMS-protocol.png new file mode 100644 index 0000000000000000000000000000000000000000..9de696e1a7c774e3cccbef772b2dc31b699e65b2 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`O#Nn6W-3ej-qiy~NYkmHh^Xq>!NA{!+W|KvSGNT^vI!PM@8$ z-|KLK$kFrDYr=AuW;#shYVKagHs9fj_y^H9K`gEUg@P=#f`a9;T%{Tv-5g2Q5z|+N zY`GAY*C(8ajOX7l` z`}i-4-kM=$^WlL0fp5oJ)2z#$R;TqmeDg(Y;?(n^C;k<@yjyaztmB@}qG^5~weHyN zb@*PgWuA3`wc-qk{y0X4U75^ZkC=At>1exs;L%w=234yCht_Ynf2a8as}tA8IcXn- z&TO5&Au8~|3?Bc&1)khHTr8~;>e9r7PwI52F3^&>TCE?)booci<1ZKLOcPfs8>~H8 zukh7)Z^J?E6po9{@(goMe-v60#F_F_AVn`(%epJgGL2Pz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;0ZBwbRCwBrl21rfVHCxG-+MEola_xPr_n$}Y~fJG zFt|yL#1dN7sx*w0HbHJ}bJ9$oby^)!v2+Dtax2o+K6MlRS-=1=KCpd2q+uswYInL*XmB2Y43iRts?-@Ch<|fcCUGT^24d#v z&snevN&#wskAUld+{BtZhNt28tYPRz+)ERmO&~$HO*KYoEbw# zv=Z4?iq8WvCE{(8##}Q1wwS`m+pH_2%IlYMx_>GEskE+FvUav5fCI}uBUsJ&H{3K^ zTc+$2U*)?k*+&ONaqTy=zf;~DlIL1dW^+>$Bb6Voipzs&J1WLhN zWOtXC=gpA`kx}q!nG2{TdPW?c5mg<+7rGAw7kU=nK#c8oL`lOqmalc$pNMyTjI8qK lKr>)3$)*T61(Yr3{{U=hx&f$>i+BJ4002ovPDHLkV1ka{8l(UK literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/auth.png b/plugins/_core/GPL-Icons/auth.png new file mode 100644 index 0000000000000000000000000000000000000000..96a06501ccdd16c959c782ac7722bcb3e8d1eda9 GIT binary patch literal 577 zcmV-H0>1r;P)!6o$V$12Ya# zsE7_=rZa@nfJ)NVwJvxA7bZS|E=+s|-^7($m%1aYOd2;-lhy=lZE3M8>7cd}jB~FG zU}QvV;#uDN-~W97xkmsro6V7w(g05RLn)3YRVDJsojAL2x z2!-brq7mwK4}g;|ecBsOS*hQ^aa#0@(CPFhb5R&Z zj6}kqR4PUdKKqBfdHsk&{*=mX&I#yQc5&UW438%(Ccoom^LUn zH!-bc+}I*YzU27RKFPF8zyCGzL+k66D8YqGWxBf?^t#WuXpaecN9QS5ibyHRW|Kg2 zeg;7h0B|mmqjL2D{>K)btyc_#Yt*mb2H@b}cy1punG8V?%nvcKutu+Y!ews_DJ4P( z^7-^!=czt4$mMdAi!64*4F$8}+0u1=Oa!>LZQq>;Y5 literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/birthday.png b/plugins/_core/GPL-Icons/birthday.png new file mode 100644 index 0000000000000000000000000000000000000000..5567dff552c02dcdb8890343ea4f557f82f32e3f GIT binary patch literal 854 zcmV-c1F8IpP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOQ1 z6bBIz2HLLx00P!YL_t(I%axK@NK|nc#ee_1%s7p?W;1FfTA`_>W~*9FsDx&VNKrux zJro%f)I(4`L}d|0z12f65wtuOE!rMsL5mMfMz%OEsZFJ3GwRHpJ9BRjVH82pc{+R? zejgkT{6mi+hW}A7SXv}90fM=xf%)9omxvR<1KDc?(q9330VTmw+5y=tVwYJh%snaO z56?t4OS$%DI-7pY|3OpIIcjFe8URZREnim7ds)|m+vcR4JWFMtpTJ)ML(4V|y-upU z3Pe2qW%k}zH`%k%x3`4$LC0Bz?g)G;$QoSnMjaJfZ|LKp@RA#PeGv5Q=Qff?4&gE|>=D&^W$ zu2X;muqXggF>!_^(J7;S!daCK1i||N)vAJ3fcFuJX;xTY42F+UF|qN$c)%|KBrmxT z>GyW{u{wxIQ4Do9gCrm@0Kox}Wqj?=F-E6=lt4$TCkWU9B{1afpdN@6CqwE2kC5>B4E z(ti42?Zt@ZYZw{QC?GvyTxNCtyo%x}g+=L()bx0}-EK8a81(zJo{rXU?kD%V+>P}w ghx@yl058z?9Rvvts4j)UyZ`_I07*qoM6N<$f`;#IiU0rr literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/button_cancel.png b/plugins/_core/GPL-Icons/button_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..62c742b2bb6aa0dc0b30c9becc3c41733c8c0385 GIT binary patch literal 702 zcmV;v0zv(WP){N5c7ukShM^W{LP^ecp71B?QK zBWk6Y!NmYA<+Ui|2DNS3J2>)jshh{OntW~MUa+TQN%gwFOgaezC}rIAd^Rp@_%hXjddRmDd}@?rg<%mzmTY?cD;)#Hn@)mzmavQwjZ!?UZK z6XOPje%eV z*1{YzE<0eeBduMkF-8`d+r=x%0EsdNP!7)dU|<+o*fH=4A%Zz8a@i`Zf3WvQtQ?&4 z!L-vGN$C?pu${%1FA9fQ&<1Su1@@XKN8#Dk&589)ZZVj%BEEc4uw~L@N#T%a1MD@a zUuoucu&3itTna1^_?yc}Q8#ruFBK$&L9ty)1SntWgcmv}= zTUE$nrjD^+P_RMfKrVwm0ucZvorJ%&IAW`31Bc@9w+H5s?;xm6%kA31@OFn;tkfGWR9sI$=z3|@i@(%B3oO5g?9$Snx(`Jy2 z543=v;+M#T6`=^|)m8+cx)SC%k`WuranI{`X%Gc> zNg4g8m{0&N^_Tl=#d7hQwp^jj81T$dhbbxpU_h#QGF?v-h9k9Uj%FG-kS4-;m@42K6pnva{bs;vk3OcBxK zPYja`=*KGOIY1ql;jLEu!ch)!7}z0Z#XQsGxyp9F5dx9qJXpHY-tdH18ZZQ$q=F}k zKq_vMse6MQm+|SWzk@dLgC(A;SqE}rn|Lp7iJC;m#lOiYmhYg}B2TsUeg+7DRWVD< zGUqhx_D1JsB_m!-dch|RNPv01vcd)O%xre6mK5lUHZ>L*R07*qoM6N<$f~leTO8@`> literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/cell.png b/plugins/_core/GPL-Icons/cell.png new file mode 100644 index 0000000000000000000000000000000000000000..d46981ff913610e83be67649a4ab5ad38c7ada6d GIT binary patch literal 1022 zcmX9-3ox8l6#jPC`t6EABOallEu$VgY?PoV!m?hKT^**SD9g58kM+#P#IBw3SdyTf zbW9SY8YwANZH7#{iPEOgs(56BNJ%?s5)!s5gKBhd|LU3VeCIoN=G<@Y%(k#x87tJpc!=1grrE+JE#FF9ELsE`UGqBH#=J0ExgWK*}y?uW%p(I1I>uC?Fk32Hpbd84UTZXk{{K-OSpvRoVqBO>=fSVi<|CweY!jOR-bfspnP>q@#jSK`fT&$H_Z>m+m@%#k6!&`FXs{$ zy)CEvN3UL{aM=_CUwk~sgw~$Ywx1qa)O}CkdQ`yJ#CPLXxJ5z7f{wzh8D_=exyP$nTZFMoQL~3kD>*SQj?Zktd>Ifj|ci!{QXyo3iVc2dM_`%kB?p? z(q~EZa=BhnvgZE6n)b?iq+q@2)Kg#I4I8VCfPhU;*G;K(%fn--i^juHG_ zS^4bb$sHbVCnIA=nq%wOKLTwu8!1c2<>>Pk(@nCx-Y4l_s!EABPbCih{0sB*lfy#Yr4nWZoj>Q zv$Ko)p};VKP#6;v`(|cdX<50lrlz6cMB@jopZ0vMy>{)}ksCjaO-;?;U;SfkV{2!} zKnMR<));-`U&4s6BwIW7Fe{wiOAL<>#$2ot@k?dnCR z?y5j0MlNcC9rr8`|#vzSK20dSU4H#h}9$rRjn8Zo>Fz*%b%RVoQomqK2og z-$;D6keb%zcV7Io%q1u|Bp^MX_a){1glH{)G3`sAcR&6H&gJOas~go@A5F{lV&(Dd zkYn51)Ozu`PDayLo1dLAZ1Zle9Wh4Y!3}O-g1L@Of0+%>@!JfQvg5;8KZ{o@7wJbs M7?}|9d3c8UUy<3Ns{jB1 literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/collapsed.png b/plugins/_core/GPL-Icons/collapsed.png new file mode 100644 index 0000000000000000000000000000000000000000..28012f009a1f921015b61bb4eab84dd3c6e127b9 GIT binary patch literal 296 zcmV+@0oVSCP)Nn6T?(Ipjxt4Pfes182`ogkqTvn{kSMl7Fq&Q4yV;l` zvgMy-1@Ws!GxLq!jD~T}aj2Yw$+qxOJ>hwyERO}PDz(Y=4ciNQ-YDbz6`ReLcN|tR zcY1Q1l?OCz81kXq6yI6~s?yhjaD&y+-`>c>f1jt?@E_ z!&(ytgERR4Gh#uY=o=)-4lknxw3bMv0sw@w52R^x-`#NViRf#)-}veh!TfzE2mq}9 up2Lgt;@l(&ZpSU`-rYVhEBqg|de2`JqHF#l_R;tN00006 z*UeO`7jlip(^IpvwGTy6_yFK3k{FWp&whw-<;u$`*Y%jLn@pBd-|X$Rv^b6$rP5h> zXlMYGVs?A`&+X)*P2Z0Yh9L~YMzNU3QN0Pn^^vxx0lfY|u)F)$LB0M|ZDnPl*6W?rrl!i!G#vl~Ap&|m4VJ@-%gU{p zA==+$B!UF<-w+FhYQ#CNRx0N)JUjr$3BVXf7{)j}Y@=@h=as#Q5pw%#9I(iB`41$M zM|t6m6aXqzD$o72v$G#}yIMUFiH_r;+dW1y8A!?ignQp&v~?Y$Uh517^6EThx8 zt+#hL5fx6ZU3&+XWhD*%ilU^SSJh0#w*7X#Fnam57Y1g>yG@LR`xpk`C@CBgHTvUs z;ceUYnx+#&L;@icsg!slN%@9hI0_@wEwEe9@}GCVoT%w}RnFj)EC(j3C&pY^+uV{M z$!H4G)ARQ~2V)GJ1Dr_Fh|p5^zQak|M+$XEOn1RCwubk90)* z2OI=JOg~!RfD~}7&b^o-IPri33nb#WG!&9MgW2~*{11Wv#4*;sT1Vu&-df}FSU{Qr zS_tZg$kI4}U+^di=V;zs2mB+xwpbSh$Q)V+*gO<|5rIcTDZoe~`Axxo$9pfIgS@ZF ezaD$^t-k^9VR)z!(E)J)0000w3FFSu3v_t>^03CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00QetL_t(I%Y~C)Xj^3% zho6(2Bwe%A#Pr`dYd9<0*yxN}ht|z0;=GZSZX)zT5#|t;-MO+Gz4CIeu}BZzp2c=&uO03w2-04R;K&eYTbDm#eBA0iT}l3&hJDy-Aibr8MhIJR8_1QEe? zJw$|1C_p@J>=sl?MHX(4v#(2|R{D$dwJ|P?e8tjI4iPAqtJt=Kh;Zac0su9Yy4Bv@ ztxZLv;jY5UBJ-1H@$Dg;YzdT&Sg0|3iR~o0Qd$5PMM}z$!CB11~s74cJduk%g6X=M(6kF zAbTSb5{V9Uy^}L@kE83IBoZAoH#gM%+py^UdPWZi1%uqP^}1w#`mbG0@cgi6KcN_&=};uG5!-EpZ2 zW7y`;3!6+&&!gn?MJYV^5hs|Sxh2MpUmS{Mmpwi~sx|r!G%*-^jOUV1GRx$)$QZWy z{OBy|{QT0#UhcQI&DsjB2T$?*p)lY_RRkXaoLar=8(iG^;>=!}Ym?=7zy2fz>>A$1&6_h%-_5Q`-^i*AUVR|bcXG0{oR@Su^TXxKFdgVnVEx6Upb-w6E{%ECcr1e6-e9K+B!QshlGZNM~275#Kb4ZCnP4MWu|52WEB?| zZ{NOs@7}$K4<9~r=FH{Gmv7y=_4x7QSFc`u{P^+zr}kW+e#Vj@zhDN3XE)M7oFs2| z7lsa2Sq~s5(9^{+L_(7F;7LX%1D*p0OIwovr&b0kGXmup7!u_4jb2&RmEV^aQMzwx zqI^I}Xp-n9kq8dOTP-do>@1GjN*mZJ&tDnm{ Hr-UW|?-N(p literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/def_status_dnd.png b/plugins/_core/GPL-Icons/def_status_dnd.png new file mode 100644 index 0000000000000000000000000000000000000000..c741e8a29d22d1247f88b61e81d31c1feb52875d GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMsm#F#`j)5C}6~x?A@LD9B#o z>FdgVnVEynOi{Ga${r{*Ilw2x6-fICa0W{XMsTu6NQoqIaU=}MS31D??PeW)ddA>b=5cV@N72J+oP|)*W2Zwo7=(kgu{Mb$Hl}>C&ivE z%)B5YbJ^DR_LM2lyuDw=#=bT(e4Uo|wXE!$g2K0oitmdS{V+26>F@t*_3Ga$D!)TQ z{yIDV&CdS2efvKhoqrJ#8YkxN0XmDZB*-tA!Qt7BG!Q4r+uensgH_f8$Vu{aaSV}| znw+peYQiKT(I>8tytT7etkx(}{;{fxEy^k@NydP&FgMnh*|gHLY(_)Nu6^s4HT4Kc z`#3~+y9ayvwe(A>9az0WOFVdQ&MBb@0E9@RJpcdz literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/def_status_na.png b/plugins/_core/GPL-Icons/def_status_na.png new file mode 100644 index 0000000000000000000000000000000000000000..5039a3039b4747e6588ea53ad33ee0aab56d2555 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMsm#F#`j)5C}6~x?A@LD9B#o z>FdgVnVEy1#~?atT{BR~FTf|n6-evq>KghO+S=MWJ3D)Mc?Aathew9T#KgoW$0sHw zre&sOC2Zd-@0|{$&)9qUcLJG@#FQr zb&fz28B2ovf*Bm1-ADs*lDyqr7&=&GJ%F4tPZ!6Kid$3L82OqUcv#ZC8Abp94?4)Q zbKT#@!Zh{Bf9|K5+yYz!($`7vSo(S|Q{W`7s}3#)N@L`X|JW11T+xtSJA7~c>vd~b z&R4eCuGw_*+~#kK%Gd<%9;ul>LoS-h(|)7REhqn(3pUGs5!Op}Q)Cu>`#?SZ>2e40 UBh7z9fG%M0boFyt=akR{02p3;UH||9 literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/def_status_occupied.png b/plugins/_core/GPL-Icons/def_status_occupied.png new file mode 100644 index 0000000000000000000000000000000000000000..b75ad8033fea753b7b8a8903c357fc544a7c752b GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMsm#F#`j)5C}6~x?A@LD9B#o z>FdgVnVEy1U;CGk$r_+gZ-7sTE07M-6^XW#in9<-GT}+Kkj%0b%lDEkcGD>dRw?z> zuJG2W@KLFXR;l(es_~Yt4b*B()@}|lZVt0*i85*n)$WMY>5MY%jkD=b@|cw3JS{YBwLdoe_EoWy`T%6Z=ZRv!YE2i99+~bp9zag9r;B5VgkEO}F1Yy8T0#uEP3KG9oR9By_mT69ui!gt@)b>1u|izVjXR`Oah d&pND0**;U zK~y-)b(2eI6Hyd~zdMi4B(Z6QP{ayV#ENb#6e?KPQUpB4n!;a;mn5J3uVyLIUU zQ4rmVNKz~=x~O6mo2t>&CQX`|n3-hm%yE%uec*wAa}MV_m&^Yv5#je*nN_2%%e0$u zj;Dt9?*a%mK9s}n?R*$AfAE^T`(r^w5D^xpP|N4JnmjwzkpEQj{8VH4JXaT{P(Sw& z5f)FQO0z78tZNYw(OV+z&+_=;eR=rcj)=c1lKkYZ>(VR>i>JE~3n06T%flBQjpJ2K zT5rIH55*cUUajCdHbWWBv7^Hf3Z#e3;R}z(n^(?U2CiFcb82*CjEl&i&9|3eX|OE< zuTHtVLE5z`uWK+m5Jb={LUzABGRDQVId#u+GfcaO_T*?TK~jboh)u$#&)UbYq+NsB zJ|A=oVhsW`ecVHPa_;NWwB__ONxKB$3P>Gv0+C6}_bIMb*^x4-*L;XPXeWRHh6iB@ zr=LlyZ-5+qK>Z1%c7vfIF=z(?rPUfv#$>CS0b>(1ASSd5kb=Gea+Y#{KA`gn%raOh z(29CJ1ZmT5!k2Xm;xuRlQ4697EKm+uaZCk+eK>#_bp=cu+4jnT5e94Bo-P;z&s+t=51zVgGk;YQbfc@Zd^iox8&SeM1tPzJt7sN&D+fUvU2q%s#zc} z0Ui0=1tisNz;Ygu4kBL>3F$QRp38ftjr5_HZ zArPk{5~m~+rzaSwD;cUTAgnPUtT7_2G$E`sBCIqctTiRBI4Q3+Ca*Xtus<)cKrpgC z7`Rd_xKl2l$l5WqGY0#8t(3fq|m21(P za?+i4(~)!2nRnBka@3xG)S-RVlXlgff7POc)undTrgzt$dDozS*QJ8jrG?j~h1i*U z*qeUYp@rF~i`uD;+oFZru#()Oh}^7@+_aM2wUgnomEpCT;;WP5vzp_um*cgY<+YyW z$gb(YsqDqE?Z>k2#d-BxQC(pjf`_g(Q zU+QJfb$;&Wx~>Y=zI5r9({iJBHd?^M65n%^!9~2vciImOA>YiF179W{cN+?bB~3T+ zOr$#7-djQt)e$q1GP&vs64P(jVkTm(yU!GYQ2f=7Uqa9huQWg){CIlUn){Oq3aXe0 zb1^(hQ|Er)7F&U2+WgSPFgu`krCK%$5^wS~7!yiEneSdrY}T(D004%KZTT2F{F?$2XDOT$((u4}@DhTACK>^i+M}Lnb z2@nNw;YE?q`s?6f2mj=1g;lZY$_@Ix;vXp>m`$^YIGxN{E%>SazpFQbJYD;FnK>^2 O0000IML#8*AedOioTdcU^bDaU2+i0n;?KF;c12eLBA@gg5}f zLImyXotvAR$Y!(er>Cb=?RFc!??VV5QVRWIN=zIc9-cIt&2JYM7s6UzUVgo}xcH6^ z>|8Fl@cGlnFOF@ds@1Ylt5#62d8m18RnQsAB@emzTuv%^b7yB~-N@(jg{i5jG_8oo zy10{4IBpg&pL~L`@v)3eJt|TgLP|KUi#Lz2;?)E0S!!b)s67(X zB0V}#!8mSV45BR{LmA@&AO;-Fic>;|h0>x0GC-rzLW2r~VMuhHBK!^%xhx}W_C)#?If`g;t%#e%noZPO$yCx%!La6|P& z5DTRg8*9@|#Qy$1X!N^wp-{+YGMU?SsLp8`br597=x<-qI@D!7N@VIhm9@3CuUlJN zA3V=n=Z_~nJUsktXlN))_LTOIR#sLvc)X;IqD!StPft~`SX8xIP3`UNsnOBV7tv*+ zipS(U#y?0T5+{6-*kZ9*BqFzwOeR4W&HV3e+}zyUCVKsyPN#(kT0Dc>DVNJXx@Ug? XFJjCU`?I&M00000NkvXXu0mjf!eCXR literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/file.png b/plugins/_core/GPL-Icons/file.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e317505552d11778e5074b0aaa699ea14e3fb2 GIT binary patch literal 641 zcmV-{0)G98P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-_en%SRCwBi(mhTiF&M`2za38|iIrpuM8Q2$q~tKP z(RL|vf^@q*SKtO5U?nQ(5TYRwADJLo%Ix@KGUIKQVbQYTY3=vXPxdP&lS%*V?5xc5 zoag6f%ChAA{2cE+d7kt5_{e&_Cd)FEQrz6!ptWYXTzP7d$*X(ChWE)?$odHk*B)PN%67LJ&eAgn+dc?>*b?mY0_oUSD4U z2q7>S4A5HRoFhpRs;WW=p%j2~j;gBKg3V?_p63jQL$uZuMM0XTD5Y@D(KHQGN&u7) z0`EP}If|lSzu&XjY#5D3oSd9sjKMiar_-UXYrOZw7!g7sgrF5jDH#j~)OF4E^)<)G z$2>hfF&qwAEEdEVxxBojs;YklZ>*!EBLMF2@436X10cr8TcngoDM`~5DdoGsT8osD z`Fu{(G#rYQlI3#Q-cv#dthHoWMvRf7C=M2Atx1vuW6Z}l2q9pMVYk~Mg!ptg#>jrZ zCxn1=?xVna&v-m0P1A#dUa!|KT`Tb36GEUY%l6=Zf~IK*A>h4#7Z_tmlB8YbLy0lA zo2!&U0kPljGaipoO403h4;FO0-BzKLif`6wr_<3{mc_sS{j>ZLi@L6Vot~cl6kiQ| bmEQvZ`vN;p(1iba00000NkvXXu0mjfw+tMl literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/fileopen.png b/plugins/_core/GPL-Icons/fileopen.png new file mode 100644 index 0000000000000000000000000000000000000000..a7b926afd7bb54ed308c4a9843f0e63d8a4c42b6 GIT binary patch literal 875 zcmV-x1C;!UP)VF_eB}iMOktQZ-wJB+4l1V0+@662odOy5v)~-BoIM4IIIh@Bb#_)e2#;>e% z>3p89YfuL6+^cYDxW!0D;``tRDx2z$-Re)o7PfcV7Y$U}E(jYIS3(5;0c{Mf8_rI= zl>c(!t?`SQOq`ov{C=}q?_K+4$pRm6G(v0rZ4jDx7#=kU1Km|h-*7DF+Wg$uC-av_ zGs%QQ5NIyXj(zaM&#ONQVJ}K;0U%CK3|zf>B~PslT?tdCJ4yR1D3`Pix{-BF&~9s0a@@0(CbC)YWxd=o~!9}O|+*8f&`y`=eh?) zy@X>S!j8|IGpQppJl90Z#&HBjhmk>{G;9s4fqG43ZU|IkG002ovPDHLkV1kVs BlSTjl literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/filesave.png b/plugins/_core/GPL-Icons/filesave.png new file mode 100644 index 0000000000000000000000000000000000000000..9a2c1e81b4e6511996d872fba0cc82a113536858 GIT binary patch literal 667 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 T*mb+-00000NkvXXu0mjfp(J{T literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/gadu_away.png b/plugins/_core/GPL-Icons/gadu_away.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ecf05664b05a75516322467128cd39d31b472e GIT binary patch literal 895 zcmV-_1AzRAP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;^+`lQRCwBA{Qv(y10?_;fC!@h7Z?iuA7}Xge<#Cv zZ1MmB#DZ1RbA|$juM7eVUl=AZd}i=x_yiRE%wPbPYh?&v_zq-$X4t?uk>LVB0AU#L z|0#n5P;)=SM-F zC&T|W%nbhl0*D!8b9H0meg$P^fj@u#Fo4npJ3BiA4<8=`6N@r~%(e3j?=Q$Qus;)J z(ERq7fmPr&!~InZAKu(&I03YK13&1|#EEhR2T| zGn_hhjNu%M5`(}OH-^L($m+2ECmQ4CV2&gg74qIGXM<$V~`8J zeEGug?clR!Xw5)8xZ=mVd&Yxev!Oblo zBqAbk^Xk=uygWP%*7o-HA3lD3aN@|3gX)@^3a?(hdeAdv$^wu900G2EX?6w(FaUg$ Vb}#Qn(VPGP002ovPDHLkV1j6Vhjjn| literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/gadu_dnd.png b/plugins/_core/GPL-Icons/gadu_dnd.png new file mode 100644 index 0000000000000000000000000000000000000000..78f481c9317083b8fc9b79e61424d486deb0ad8f GIT binary patch literal 763 zcmVhBCsbJCI)?w1(h`sWmv%*u!wLmf<;uTXp@nyqE)*#Mw^Hr z2qK7T(PE5T^dY>cj7+Ox3NtE1%hA-Fr%k^1?)$hcavmmm;KDuU{{Q#fd(Qd80;c-5 zCe{1RO7*T+s%uShAzUORjO@|Ww_SR8BHdOjhuPH{;%=4b>PAE>_)!2gT&Lmt14vI( zeOuDlGJzw(alw}0NYw3^Mi3ZCFYa1_Io-yZ(sP(m09-GQ>uESHcwU^vl{u;op`wBy z7=d5?x_I+=Kuu0*o~>|Z&|FCzcq+oDWj4LT^W!W(02OCYVw^w>5{My`7zB3&`QQak z-w%9Ay5a)c{;2`BOc1Lwsc1n7lR#uqVgx0!;Ey5fNfz%eCvO*-u1g{;qIzAOR4>;W z*fK>~gQi5DiTpIpHx3erEM`8>)rVJzSd$1VM{He0`#DUi_b^6R1IY-km%?^*q^nc1 z0wuCc&gAI$?xEBu!XD>hPYJ>vM_E(E%3Q2Gy8Rp7bx1|A9B?F75aYy?BjJxu*S)3a z+ZVK%G4zcZMK^~jjZQPTX(^5cf&UjLR7ZIdN4B=OnH^X9S1p-4B(uA@JDLk) z-PbbQPaf+j%@6+uE{9z>de`m0^C`NaK%8&g*D?TM3835`SOwJ~ zxj>k2JC}7w00ZWrte6}VwKU+vz{Vv>}t+@mcH|o*D3#3ijnQ+Xn6N2>ho}d7( zZu-pgMxFG~M!#6d_RjtLGWZI>1k(Rx`P_{5@g$*`ZXe(N;n}H5Wi%A4M@=hV72-xc tx=~LkCb5uAje3$mYSwK`bkhDm+#dt#Ir@>9G*bWo002ovPDHLkV1nxtQilKl literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/gadu_invisible.png b/plugins/_core/GPL-Icons/gadu_invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..6be766ebaaf7ef6ece9db4fc35d7b74984cecda4 GIT binary patch literal 777 zcmV+k1NQuhP)R8bVhe{X!HX4x|Yt)!Y@T9nk-$|PbQ2)PlIXyd-MwQAX>jhmo?R#A(x z?F3Pf49vq&`eQm&XhAeWS(%d0ah&(=pZ9JH$FYSTxQoO6&f%Qz`wr|7X7=aD+Cg4i#OkZit=Zv&uo8l@eC03hbH;i< zRy2QC9UU4(1xHEJfM?Z4`*3Oo9i`*eKGs@>vFnyF)(>J9Q2fMFi>R05*mGZrB!#w{ zbOCHNc$;$Ad!)FSdg8QC%xz1UO~iC=sB}Or9_<*x2e8cB)BrjfMn{mknz6ogZJ<4m z=6XYSUy8BS4)8qA9$4aDYmvqmFFYkdRJd)UbQU2YHn6)L*(134_!E=nINz^%lvlpc zkv&Iy(>l*DOww4K;d7acR-h#rn?SJHAT~=R>O#i)zhPt^>-S%pLLYr;9839Fi3&a- z0*IqcAB1v{Pg(orCHEX_Xbp&@#{UY7Q_QOh z$Np2*b#r(&fD9>w>-eIABSH%CYUGyY*0M^Fsgkw1ZyrbkK2WF~Q|k@00009a7bBm000XQ z000XQ0h0Lxr2qf`1ZP1_K>z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-S4l)cRCwBL&`T=?VI0Tt|4VpwUV@#*J9u8gc?suH zVugjWv6$?Lq>hx-WJ4CmSSgnpm)s9?bSO$DMJ{1n%kJx+bLcR>zs)Q@&GXF2|CNVJ zZ2Iym|7Y5nIkm?|WRDG25ScSYJ7cPl+EUR@<0B5@lDA330-;xorwJmd5AbnoA`CyULbmPclgI5;Y`^G}BMzi_Ox3!$p6g zFI3kQ`t;I`9*HiIYz>jZP^1L~h`5{!oR@XJvRI6Qr0&Q}IYAdHx6U}5`H1Wt^(oUQ Xyn6q0Lc+Se00000NkvXXu0mjfAK1}E literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/gadu_online.png b/plugins/_core/GPL-Icons/gadu_online.png new file mode 100644 index 0000000000000000000000000000000000000000..46f062c3d12fe52e06c9f1cd621b7c1098477f45 GIT binary patch literal 944 zcmV;h15f;kP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZh< z{$l{d0$>e)fNW05_YBgZ4F6defqI@ZFnqq@z<74o{r~Si3jF!;pW){>27%wd7z}_q z4*&!ZBiw11w9hmA`D?%+>cPMup3Cr`@ioIg#)m-s2*`d2wB$L%ugymoeqMXY@b?$P z1@RUJLy$gz0D^}B*x4M?9~i{*fEqpkH9iB<&w=qRoFnsyJ{NeX+ z21l4SfB<6pe@Zpr|1qWgKm*n@2>J;8XZ*tO=F2CBta)BwLq2@@!Z3BmWCo`1?-&@r zzh~f3VG?-zlwtjuFoyj{eHa1&0*DFd_w@`vemVd{-GPBk0&L^EZ|@nlJo&@$|NjfH z&9z5Gz%&SR2>xdH{)NHe$5#f2-#;1F0|XEYIGR8q{_j5!y#^ZagF%_?48w!;c?^t? z-!TaN_`vWfQkH@7%?AcXwjT`tfzJN<9jN>-#0vlc!~}GDAP^s5`1a!f!-w+_XP^7Y z@Z{$thEKek89s|2Wq2xhg5mv_D6ob%m%*A3fMNiM0|5dE9)>?BGYI@$%6I?gkJSG^ zFIfG5b!GkkFJHd=|Ni~^|2Geg{{MSg>i_SP4F3=NGQ8jK!T?W5009J##;<)0=Yf7Q zV3iVJVDZplVEOQd;r|bQ1_mY$2IfC!8212h6}(@ z{Qyc~KY{FjAOAXjy8d}R&`<|xV8Q&mABaII@B_#dAPIl~0w*MqdWH|cs8IwODM0mO(an*sw0l!ezrxq(0p8?dPZ2rvL#*mnWh SaTXc?0000|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8pdfpRr>`sfH7<|{Lo7}wCoB*ZD2V(Xe<1a4 z{U+WEGd{fizoz*A!Zs1k2SLZ1yql)apWN6zweewdutGBf^Woq8)eo?ZA#;8(Y=LUTj++3J$_0wxX`#N7_ z{QNrk;lXQfdE~#b7*5JLFuQ-hM1^1O;R`+?Iyt+(OnrF&UTlQv|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8pdfpRr>`sfH7sf(9+dW+zLo7}wCrGgNoRDFhUiyFP zp&H2m^7&@BY$C&^C0{cls zK~y-)jZ<4llVKQs{(s-^4(_1an$xv8>||&*a8Y#7l8lZQNk`NURCEz`Q5O|OVK+fY zRuq9y7eNQ`rUM}b5jh0Iw5e23R$@)3b91ME{qEoYeO=U`D9GpXec$JK-9$rzbR*MD}M~Qg!vVYaksQd;1_-x^v z*_ivR-T0{AkDlgcoXqCt+OT1DO|5nP!7KPOuEEG~DA&8dy!Wq8cTbxivwjC-fqKT6 zhcz^y9su+NRsQx985Zqgu@6t!v+H}A$4O3RdD#i{PD_p_I#LS89S6Q&z@D{+1^`HA z&^Z;Oegp?#6r!-%ia+|lX0B!h$ge%E_JT5NUde7CH3G;A)Dcb9xou+Sv?}kN?^XA} zl2T)ZP8$*0?swb+kje_E90trgwgzo>wLIVMssJx1FfsH3!(T=Ooi@MNnK$jV6`7qz z*G55|zmW6>xcA{mVk#60P5@9;i8Lf+`& z0+0+r{5*)AcY)4Nw|sFqMTbHni^nJ%&Mz!? zl&zc9m7B)tho?Z5egGn!$7DV&X%VAQ-08hEozzX0|K&uo@<>xtYimo1QOJ=b5jP%G zpte2&K!HYJh>L1aMjP=>M4pAskQB|fia+Xr)1(ljxduG%PErYM6a8wFdrg+IVhMB^= z)%>*SEn(+lJagm@IvJfzPLcos03CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00SXOL_t(I%cWCWXj69> z|DBVZq^HfTX-@9xB~5FkjYQf>5p^}2I&t_Q4yMgi&^KA9^+7>U`Y^_jc>@sz9c=Rg zbyHeJ?4+`YSV^U6m6mC0Yiydh&LpR4Pfl`9^54s{hxK6tzt`X8`#!$!2fSw~{twA* zf&a61WzTA_)}IlJi9h*bqJ&ZZCDyA^d+c*vh%OXNrm8YjIoyj~r^9O_v(g9v&?REM z6P|%yUEgRJp`IQbDPbNnHh1_pm_FHe22*d#5S^Z@Xj^97y`L4W6NeJZ< z(yb_Glg!2Icdr2u{<(rfi-zv?xM)>Njn?WFprs7{h&;gbRFo-aD{IUuvCYidJd)^P z_;(d_I;qIdC;8M&Iu!*VQvk~MtipxuUhMR)-$C1&TQSgorO4Sl6j$k^gpoKnjRoqt z6d=neI9*7qS%eDIOxKBTw<=gvaZavlBaHi-4K_RNZYtpCYwd7pB+5A>LL1NE$;dFK zB_$G5ld#S6aIEyf7=5jar3J0xquPV#eU3n9BCDb)MINgf1oZw;O<5O)uuK*)u82Vl zbfdAtfJPMstvzw4Y??uU5CU)@Pi~T!>K*IU7A=j36v` zMIs+Q8ytN0{p92qOVgNJi0ApaiI}hususojYFRdEYHExQPkn7gCgY=rhqYsagTMYV fJA2@iEKmFen?pe*!I+QH00000NkvXXu0mjfj(D?l literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/grp_on.png b/plugins/_core/GPL-Icons/grp_on.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/plugins/_core/GPL-Icons/grp_rename.png b/plugins/_core/GPL-Icons/grp_rename.png new file mode 100644 index 0000000000000000000000000000000000000000..d11a1c990fbc907111a49584910098a3d60fd29f GIT binary patch literal 661 zcmV;G0&4wm^IxW7w1bzSj0wPI7 zK~y-)rIA}mQ*j)}zh^sZ7u|7}(>7ewG0hBZ4OtM8%VxtGJ!)1P`Eb^25A~oF6niRq zs-PD+^wbT6h(ZD*mK#AL;T&a9hB8^L&D~mC+AjZII(sSbM4z`Gzu))!yGbDen-T7j z{dDla9<{r;QBSTH>PaC-Z6$7z!+QB7GcT#tSXQrq-fSzKyAkbQ{#;oA0Etl8u>+km zQ_PdaDCUDfObEG71C9;2J?zoIO{{!XAikPza_-WN{n6?ECEZi9XeK1#BZN4J-wz)E zG}CZJr^c%!|B4hoOp}@0W5i*hCj^}^L9<1_&5@6HgHRWMA6Ieah}sVT->V4c3iT+G zF)*?`42JfP(Y5L=!GQj~Cu=hHuo~Mbpd1G(HOR9H*OlQ?cvGrbip;%^?dxXjDrHtS z`S95T0A;~IYF1FB2mMkHYSywe_J+z{- z9bJQ7=g9CV=k|C{gd*VxrG&n9$Pu{S*Ryx@P=Aqj4VDqO_7-BHhO8IwIy+AL($XC4 zy$LK7o`dIkQQ|-#0Lho~QX>56PGs)gz1c^h>6c=KjW5JfkH;HP0^s^Mf`34Q|AZDZ vCeQPYc+2~697n{$aU7xkV!!|>h+W|q++yvErRHAR00000NkvXXu0mjfCB`Kc literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/home.png b/plugins/_core/GPL-Icons/home.png new file mode 100644 index 0000000000000000000000000000000000000000..611b814ee4f267cfc476b0c58e1f87faef0281cd GIT binary patch literal 3562 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 + + + SIM smiles + 0.9.6 + GPL Sim-IM icons + Nikolay Shplov + 2004-06-11 + http://www.sim-im.org + + + + sim.png + + + + + + jabber.png + + + + + jabber_offline.png + + + + + + icq_online.png + + + + + + msn_online.png + + + + + + aim_online.png + + + + + + yahoo_online.png + + + + + yahoo_offline.png + + + + + + yahoo_away.png + + + + + + + yahoo_na.png + + + + + + + yahoo_dnd.png + + + + + + + yahoo_invisible.png + + + + + + + + gadu_online.png + + + + + gadu_away.png + + + + + + gadu_dnd.png + + + + + + + gadu_invisible.png + + + + + + + gadu_offline.png + + + + + + def_status_away.png + + + + + + def_status_na.png + + + + + def_status_dnd.png + + + + + def_status_occupied.png + + + + + def_status_ffc.png + + + + + + exit.png + + + + + + button_ok.png + + + + + button_cancel.png + + + + + + + 1downarrow.png + + + + + 1uparrow.png + + + + + 1leftarrow.png + + + + + 1rightarrow.png + + + + + + configure.png + + + + + + fileopen.png + + + + + filesave.png + + + + + + remove.png + + + + + error.png + + + + + + + group_collapsed.png + + + + + group_expanded.png + + + + + + mail_generic.png + + + + + info.png + + + + + fonts.png + + + + + + phone.png + + + + + + fax.png + + + + + cell.png + + + + + pager.png + + + + + + + no_phone.png + + + + + + webpress.png + + + + + + find_user.png + + + + + + + + non-im-contact.png + + + + + + online_on.png + + + + + online_off.png + + + + + + grp_on.png + + + + + grp_off.png + + + + + + + grp_create.png + + + + + + + + grp_rename.png + + + + + + + + home.png + + + + + work.png + + + + + security.png + + + + + run.png + + + + + + + + network.png + + + + + + + message.png + + + + + file.png + + + + + + sms.png + + + + + + + + url.png + + + + + contacts.png + + + + + + + auth.png + + + + + + + empty.png + + + + + + floating.png + + + + + + + unknown_icon_1.png + + + + + + + SMS-protocol.png + + + + + birthday.png + + + + + + + + + + + + diff --git a/plugins/_core/GPL-Icons/icq_online.png b/plugins/_core/GPL-Icons/icq_online.png new file mode 100644 index 0000000000000000000000000000000000000000..8a9dac284688f433e7f012257e338cd395defbea GIT binary patch literal 1005 zcmVz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ$ z7y|=49|Hs1e-4JvZ-0PY^uOc(2Y>)#g1ChtK~tZT;l9WrhOd0j81$VP7`_4>`v<7` zHxR#j#K0h`%D|utbfc>KKL!DQE&~Q8plg8uAb=nS{A1W~_3Ar@-#>xOe+&#j=QDhI z0Wsj~JD}Ka1_pUcpkYAzC*v;$4gp36uvdTpAb>#TBmn9C-##)h99_l0@Z&2)Bfl5} z!;4!$=O1EVkkEx_2H{VS85myO1uFW*a1dkwKmalFOy_)`mZ&3eljStS-7^dfPcJht zm^v{tlw6QyFkoR|IQ*1>q0{U!!^@X{8Qucre!Kzd`U4Ea3BWJ_1|mQJF)0g4fi;6{ zmDXWkP;+2lFxex_U~lx6LDKI5gQ?DY2C=1r4By`a15tv3fmf4(ftiEBfgy`wJ;((B z0mO3g-rWyh4*|nPl7ZnP(BH3t&bI%~z`(){bnj~hhHv-(GW`6*!oVp93~P3XHyDH& z7(Q_*R0I>j_6L{wk!+v%i1_ntz1_os}V3d9S#IUeKfUogDb z%D}*5z`(!=bj9zlU~hl{Kmf5Y{ATc%R%c_7cl`x69pshc*M2aZ(0Ifk&B4KNpYuHf zyE-uHWEmJfYzOLK21dXKaLj=d6F>kl0ZlT{QI~~>^5^Hkcn1a+hv7el*V^A0KEL?~ zF&LYY z7ceYDfN9}6gbngOg9_OB3Jmig`2rw-Sb!<2@Xp=m3U_V-Ll&5EfCgS*=4CYa{rf-I z=D$Gy{=N-#IWXY<{s7wk44iV|nF=6)7%_5TDnkJi4?{nvIViI*Fnr$)q=AM4EdnK9 zU_tGK00M{!!vHph1;9W$@O2w73W50lKcIgXG8h5_EfJXd3V|vVL7HL8 b0RjvF3}7^p@*JBT00000NkvXXu0mjfQb3j$ literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/jabber.png b/plugins/_core/GPL-Icons/jabber.png new file mode 100644 index 0000000000000000000000000000000000000000..4395d5d8f8bb34d7490d32a9b5ad78e4a8e6eb9b GIT binary patch literal 308 zcmV-40n7f0P)>YzoW=2okva zpZ|_LB_gC?tqlMoqEb0}iR`_nyZi}d3k>92*N0tWk|Ie5*|_&0#LIghx(k!#8WZMu zB7(XTM!~`MB7XX9y^Tt^b^2fA!>$BCi-^)%b3Pi*N0UviYKMp@4gEWp?=7eODlPPc z3{eRpqN>_)+OM+701w$OA6JUkc0ydj=)hVVTw^FUZBLvv3*hb3@%>d!KGme{#ikw4 zhh52f3svnNM4mc`Z;NXkdK1TDsCXJ9 literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/jabber_offline.png b/plugins/_core/GPL-Icons/jabber_offline.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a7e3132557e860c5e003189caf5a3b259c0802 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+Ah4nJ za0`PlBg3pY5H=O_G{dtBAmv#GllK~g}Oam978nDw@%nCctnB6WxhoCLoSc? zGOu>bdy{3eWYvM(2M$cp#Xb4LcKNEh4k3$=c8h#GHa){rP~L%a+7Wrq!}(ts)PFy4 zy3N40ryG0DIS;7T2{*nK5xa9Fau9YvANNwO@n0fW#dt=*H&y)M2`k%fG tTUFlt=J%D0D?ZvtxqZ1mXa2oXMu`l)RliFt;(*R#@O1TaS?83{1OPcNTi^fy literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/mail_generic.png b/plugins/_core/GPL-Icons/mail_generic.png new file mode 100644 index 0000000000000000000000000000000000000000..27187d79a608ac02edbd8d03b5ec7c3f188a0d54 GIT binary patch literal 536 zcmV+z0_XjSP)s!E zanXVmtgR_hqe-WCZsuO^nZeK!7v1%PKj(0AzB4ckSB|%}_3U-G+l;g}VU}5pDUxMO z)qnq6>ml@dKlXxlyMBLj^A<}>3tSeZG$$uRj4|ter4mxDhV1Vja~YB(rQaXqj<|uf zxTehFVvU`h1MaNeWISdH&x2Gcj*fn^veH273~_z=k%VD|<>l-2-hast42S13g2AtZ z-QDlBS`FEs#5aaq&@N%M%I($--o5>d1%BtUi)-RfUs+pg%AO>5#Pu@+sSI?HXm*af z_Zqx<`H^xNM#BLgw)g0CR-NQc_QVl4kW1)i|2imGH7jG&D?dVmNd0)CXqgKk!oCUGueO4 a)$2BR0pdd@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&`Yz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;!bwCyRCwB@&s}I!XBfco|NEYkrin`pN!zF+HM-h0 z1({esST9Nyb%QZTFT`DpnO-T3fzk_cAhis?P!PRQ5SBu#Ll{)Xl&W=hjH+v8q)589 zD$R%`{n(PMNt=(8bB>kV6@`L7`14*p56>%1)8u`qLI_ssM*H!gug=@?;rc4y{L6_{ z--AS}$_iY$kac>JM?%eCYzercf56YbLOSalOnh{4MGM@?!=cai`UAGdXCNAfA^_B= zi7hhJlQ$!y#bn?8eDCSg*&xeYKD0mB+`Kkm8}EU194vqW2q??_hpbtz()}>&y!|8> z&~1g#wI3HJ4}SA+3zXD&MMrgE2y%0vP)Y?PY^w93jz6c%UuOwMMm7GK));wK@Ksju z@XLLXw*9*wv&r4%BNfFoOLq%J0Y!iW;cy}2Q=(JmRGglrs#Gc}6{gbjq#Z+{%Gy9E zGb_=Pvl#g_Mlpk)OJNk!APwS~BJzh5G8&uEJ6)?J&T19KJ;PJS*Mu#XxHB|N|Eq7I zTwvHG#?t#HQ_<12G;G`!l>pzjTTjl7Wd|G%!L;i(`Wg-4u@cEXV!_zRV0=5Km8D@Y zEds*=!v6`Z`#3D2#J-SgogPjO*t9YfH>hrtG2=JNtmQnL`Ly)sH`&Tj{M%tiJsEw_ zsX|Hn$u%ip*ZH3w^g60{1@7kVp=TBuUAT`o)rfFcfF0!K228sNRWW32bxLKK$%)vd z#wJ%FBJ&j2>ilnBr{S+t(6|+;O3)3^G>n|VqEp~Dk{cW)XD$=17Jx+ zK~y-)b&+jM)CB;>fB%DS)%KfR;7 zfG$}S1*1kIF)%nues%`Ik!IZP_lYbj^xclq*5#+WZ-S>>c8Z-@+?||dcq}N!6vY4_ z3!)H8)aqE8U*Wd5g}07=fL3oLMV?_XDzhA!CiFlh8uAmF%4Au{BvG#=EQ%2T8G&xS zUj9UoL?i)h)>J$<+VPD>5rq_rTm_g?bvQPqVNEwuf2|8t`V#fh1b`e*eLKl<iKFgi)AcizMHcJNP4UZAHdw-z4>D!BCyGj#^w-xO;a`dw< z8IV!J!gT-lr~ioF61B?9`}XcF-|TYcN{X_^{a^@x;7;gTbIV}BbL9(3nB9?KHknt~ z)Qv`?Q6m5{paUd801ET6^Ie;Aae)GRk9n!6y~mdg<6wWr0VDxw$;n9vD=Xjp#q0G>tE#GcJf111)43ZE z7@pfrp4EV&(J&B>#ZDai>Qw8G=gumM64Yw7N?Zn1d8~IWUNB}e-kfm1&~K?} z)JeLxUm>`(ve^7{+h48qbti!^|3&5D192`q|6+yidP7s0t!PV0$53RntLgWK=1Yf8 zi-M@|2;~3eGkf+QSS_ub9v$|21FkajMc|P#z`qaXSerP?UKIcU002ovPDHLkV1oS) B)F=P| literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/no_phone.png b/plugins/_core/GPL-Icons/no_phone.png new file mode 100644 index 0000000000000000000000000000000000000000..b357f2ab7f167135e1b4f332ecad67a6f0f7b64c GIT binary patch literal 877 zcmV-z1CsoSP)gqOg#GB zk++WICaef%f2#4|{sEL~vs4R6^;twx;rJZ}vjfzx9eR5+K;N}%$HR$KZfDa6FN9`S zQT9NSE=MPpFpU%nMLTerTHcS|m+l8J05X}(zSWzndVkaxlv*G{*yzBzC&?y;Idfwe zsczTkMj&FKEISLJ0gR1}z2F7G-|Z-Flv}Xc1lJ4MTAX9_&lz4BZISQQId*rzJ+jIh z24}Lw2C$BqDZ^KX!pgKPJ@i7iw`H}O527B@ewimu)t0`FYJW)~l zb^}PFqyWMov@FMkqzT{Zk3coe$@=$<4B9-kI0r?SEphl~#o>7JCHcGd!mg3`)5s_rtGMw;%nJ0*3E6)9MH#-=1J1(<185fth1X2e-0S=P8n6Q3 zI$T@0yjWh17@l?f)2#^S|K(jNLU|D~r{L_JzM203O@dniY%iRG00000NkvXXu0mjf D%dMPN literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/non-im-contact.png b/plugins/_core/GPL-Icons/non-im-contact.png new file mode 100644 index 0000000000000000000000000000000000000000..d31e63f394fdf876ea62030a466d50ea06e10132 GIT binary patch literal 897 zcmV-{1AhF8P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;_en%SRCwB?(@|_w1r)~df4kDPSx4tKMqFy|Mtg_2 zVz-&hf;DbHMndA=AV#s6VH^oj3?{}06A2GIkjPA&xR8a!OpR_TOUMW~N5Ueh#df4P z8A{mJj(90;*RAb3TRM+V!+@HY_&uNV`(Dn`i3tBE2EYFrckj+)Hd{y}Qs{IBES55& z(L0osloF3GkjdoBDl02aH8dzM4h($WGCX|z>V4qf()(JttJ3gR#upwUtq@$Z(CpAdh+?$UqGQy zV0k(H^ka%Lpw!i>&iY60qp?_$si|2~sT@wHou(!`?d|&yoG{TsIk>@ zT=&7lxV&~4y)vDTA2cW+bOLZ@0bEIyKGScf~ zP39g4nr2wc!?&X$B9Y&4IBc}FJ%vsOV`Bkau4+`(`!0Y!nM|IFr~Y8@_$SO?pJvb7 zyU3eN7!AnqV;3kQiMmTsR6X&msi5*WP5 ztKYvwF}X}`F@dJVak(70-3@43fndb~^*IJmI2)({})2=hKp05}y z1>Y-R?Ye>g;2Iot)r7;pP+o4v<9PzJ*+?W(Da$yuw_^A=F^z~x<^&_=%YCxq^dG#|Pmqh}^WL?n|I z>F*E8_U(s9z_JY}`Nz}!@{2&#>~vhT>4b=gXmeRPdi0w`Rqc2OSid@FGFcv6?CBYz zr)P-0dk+%|YVuQ9ldi5~7uK!Y_&i{IxaeWPFgG_1fTGm%#-Z1YmoJ~K2Y&sp@BHTg Xj*duNCo(n^00000NkvXXu0mjf&6KZK literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/online_off.png b/plugins/_core/GPL-Icons/online_off.png new file mode 100644 index 0000000000000000000000000000000000000000..1d956644c586cd6c1e23199eff129fea46e4bf33 GIT binary patch literal 2896 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/run.png b/plugins/_core/GPL-Icons/run.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ed6e07151d4a641bdab8869e7dffc1026e097c GIT binary patch literal 1139 zcmV-(1dRKMP)KLZ*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$00086Nklq}Ds7{;Ho%VC@6IJY^?C6(9O zG%ZClXBp^3Mf*??LW1%>UQV5wnUm>L3~^TLG(5b(*)-hJ_&imA^tf@uBZ&$NJD8yi(4>jBJ5!dm_4M>~4AQhZB_u2=uCBgw z(z)#3y~erGKhV{?v@ricxWkJOENc&>eHG#15n9FSnp;jvB!t;C=xA=Ls^nZN{RI92 zjVAQAT%nB6AIm;D^s%GcHa}~&%~|i`{}Cksp#JRq8UWtQ5yL2k?)m@#002ovPDHLk FV1k(!2E_mX literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/security.png b/plugins/_core/GPL-Icons/security.png new file mode 100644 index 0000000000000000000000000000000000000000..5294896a37f203c7c9d4026956c1d3812413eaf1 GIT binary patch literal 963 zcmV;!13dhRP)KLZ*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$00060NklF(6o`@luIZDytNx(%M?A1j#=jXeoiDu@ccz2*e<$C`3;J3YWvX%iZ4I&Wyz* zip^mjykZ{j`p^_&uzVaMtbmxxH299CWcNE0ORs30K5e}c50f5^7<;-t0!>q z5ljN56xTTn0PhMYI-oqboKkHrT>J9z-;T{(C7E7?##_)HT21`-4*{UWf$M-M@_q{j zU1FfyYvNG=RDojH#~%Hp7KD;*m^t8Y6!A|e)oA>QU>iB#f lI0v}@&9d5CTKW z>1fOzAIW6Kv$M05){1XbE0xnih*7Qe7T4$ZBZl{xlQC z7E)`SZOdh0hd2Q3x2|H|pCh;E^3`uKwBA0gwP5CN6Cp(2NF`Iza_-KvmZfl>IDi(C zNcLyCCf=kw(m`lX2VeZSPOlv#J+OhNB_I7{^YIULVzzxroIQ8m_xrV9KU*&rUl4Xb zp1l`&cZU8*JCj$wK`F({FTO->evZtLBEJmx79B#N(AUo#KJtn=b^V$vr7QvjOGSFB z4f3vosk%@~VVWjNDcrhdZq1-tZ2+1;TN_@pi8wIwL%J3Bz4q4 z2))DZnx3Q&&+`VP)*gn~?Wax4qoB)_S6v#l-F+eDwvl$3#DEV5{$#-|QZ3b(`eXy` ziN{e}Vd|ruQLi7+G_*(7C~(_(fIkqp91QJYb!B<1D-j|-)P`XR1hDj%!`l5irqAbR z!7Z^MOIvZ)TK^G^#U|Q2Bjf4eVP<s>BML9_#sdHV03CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00HVrL_t(I%bk;7NK;`L z#(&41&2f-3#}?Cw{#*ogk?ta*F2Yl3K`0eoxf@C9CQ+gx-nr;1h|yIS?IPOEMqT)dRHgp3- zr;9ZmG!1SKjv-DBDdy?E2>6xl0j`bl>Dv$TTAs!4E3B><2&&&wfM0AxH!)I>O5!P4+0*`#KdbzPF7qIpsNFt&wv`(cL1{DEAA{rP<0iH0RFIll3474m3}RV2#2{G8RC`tqoQj8?edYikkBfKibaS!x{mp z5mRvC^@x0&)$9sJo>=&~D8bX0k8-3J7K2Kqm|qlezVo--3p(;Yp+>?xIn%%&BlBWHkPl{N!9 z;i7rTmeWT(pcE_fwD~vBr*la4d$*6WZ$`EyGu{;EYU~P~Z$@o>`NGoU|NaBtjBM_C gh{T2A+w{vIv(=GS%!CEUhH8nAO>9YIJ;6<=gk2C*i*P*vQ z_~_e_}4WR^PfurUDW#M$zHG_g zZl+}aL`Gh|laYNlQu1cpl%A9_k@4ig*G_%`1OQZk?qfY4{`}>~?}Y;Jcgo_|(KKbD zB2*RIl{g-3i5iS2O!BtF8%JK=-#2v6PAA3&6^K09bLztAiK8z>uFa&$+GT{HqbLdh zzJ%@dK{{G1@XL~vS)@8_(0grW<@K(8&k1d7XLnAGM!vqffaR14C=yL5n66;W6<8&x zHWX9=x+Z9;3lmVGv8ky(*xGSO3r6bO6g^DZ^|5n4?;dOI|M@kU4TG03@l#|e<1ko&cjg7D$zgZ^1xNFe3iT!WX<*fm`vJqv{m7G zpxK$UX=s9QNJk3=*;rSB?Rfk+W@4!kqOEn<#WDe@GiK#E{YR3%S%*|k;+V^6QJNpQ zo}FJLQd5O)1gH&^xe_mssiT={#&})Y)94&`=4{5Y&VrsH>cKF^Vin;sa-X$IIPN0oPAX&nDfb z!)?2EhF*O(L{Jxme3#v|D)m7HuUNufvw3Bk!KtAF*Uz23pF01^amuAR_2H6>bH#XU z^45Z~_tt7d-GLo7v{Y*tLZAVLP^i>YKI>m1_R}{Lvu95pm(J<{fU@or?N!gb^!Ap{ z!`)9jwWnp{h7GDBAeT42^up~#eBj*qrIFsxfxjLB>kA%vN73{q)d)oeNY^Q3@k)!p cnf2j+0Zf;AmN@};zW@LL07*qoM6N<$g7&DmD*ylh literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/webpress.png b/plugins/_core/GPL-Icons/webpress.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb9feb7c16fe03d607ae4777dc0e047cd3228ee GIT binary patch literal 761 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 KMNUMnLSTX?EV1DL literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/yahoo_dnd.png b/plugins/_core/GPL-Icons/yahoo_dnd.png new file mode 100644 index 0000000000000000000000000000000000000000..36c3a83e7952f8d020161d7aa0ad70abb18b0e13 GIT binary patch literal 936 zcmV;Z16TZsP)Mj*&AxC4Lr4!+6bq!X4*l<_4c>F zzCRF2U(f}fzxSk+Y*ghLz9&l@O{M))fw2U=09x-%Y#?mjQlG7_XsWIY7Ek9f&zp~imYw+10yDt`VC?fKfVdq=!-u-P?tzKWl|u2v>=C}gt~ z(dlQPE5IEUcKp-9zYR`BDrbJUv^-L2Xf*-F!Knh!nUNK}14m>Sl?Y1>9trU95x zg1+!8??&a&kd$Z6NNKf7X|rvr#UlHi4tee40%@8yX_|^O<2KnBat{{m(gFaC=RX$8 zeAgpoM~9ScZBiB%N?A}KWq!Vtxw%prhWu)`O(w(0lc5)6SN9{*Tvg@JdG~d@E^^hk z_8<6Wr&~Zg4%sY}l|gy=rk0g~u9JOCJkF}MgL%tIx^J|@ zyd8n5h%38Grd##}ec0`w>!4{M1ehjdGO)JB&wq@O3{PVh7JkVnXsvFJzLVj(H=-w$ zyX(nwql*#nc)&2WaYa|Ty*$f-2a5>U;BYe>J)WVzFEQOSoc%(*xRxBOPse;&n^xKFKj-|LRwq8A(ryh40#<8NJ zQlH1OlgY_Z79$Ited}B-X%tPRUQwP*iS)pTIovlYzuYic1o#VIc2QiYNx`iE0000< KMNUMnLSTY?OTmo* literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/yahoo_invisible.png b/plugins/_core/GPL-Icons/yahoo_invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..d3248b2144e852020d730a72ad114c5d6f617b25 GIT binary patch literal 999 zcmV#_xrn3fG2>B0CZ0PIQ+lJrP!gwWOq|4=ptwKhV)9T;pz+Rfi6`u72Vp^oiN1s zPjes5Jk-Av2ZIT z`8;yD9Cp%6XeeiA=hE3P9~fBrxTWr5vrX?fb&L78EZnUf7l}mr$HvB3wOVD0qOj%V zWwx@i!e(b@Sx-+7i$o&*96%B+n3)J5#{=#?FCU3SItB*^f9&h)!{+8DG))7~^PrSM zk|cC=bYO07?wsA>xYkxtx|S>0_^pJ?djL+B<#z@K2B4}c%H?v+OeuxUW`o=9Mm!#e zTeQA8J?Qc8KUSwxo;YfNa5#KURaLC5ts$9AVt#%eJkMiwbrqwdqgY>Ghu`nVQ@-%Q zr{e|jt*_bXU%wEOPs%g^0Gw%>C>D#b+wB-1AII?UFgT7wDwV>}&=97kreL$#;Pd(L z!B^+;eX1R?^W_sieE!%(oj~?+*=!b!F)S`FBArg7t*s4&5KK=`qp7J0KA#ViQg}Qb z6bw5`1_d5kIChdf`^pKSmk)(P@5f>>G&VLumSuEycEaoRA`l2bk|gx@_M%#?B9qDB zy{<<%D#|F{ccP9{ky$l1C;(WN1$hsBakEs(P$LGU=V~57={5wQK0KO2qADfooI0Y2cHLg?;5zC+|K-R)B2VQg7BiM zstb0z{qVxV!c|F<+Pz*cDwPTfn~KsVU)e7?+`LU50DpNO+y}~-{CVs48=vgFshjwl z{P$lIiG;hpzP{h%@thJx@me?>{_H?K+RsMGg(D55siF~mW^wms@((s{?jjEW{{a6# VY@&I`g)0C6002ovPDHLkV1gvQ)ENK( literal 0 HcmV?d00001 diff --git a/plugins/_core/GPL-Icons/yahoo_na.png b/plugins/_core/GPL-Icons/yahoo_na.png new file mode 100644 index 0000000000000000000000000000000000000000..7a47c709665ecfeb90118dcc7a30aafe196a3390 GIT binary patch literal 936 zcmV;Z16TZsP)6WH8wQ2S-v)#;{x%dA6K1@@Dc;MrM!}-2* z_~4*`ra+zo`YHgGwWSEEA)Rz9b0;O%WsUL3%b~bGdJswTlv!)|VAC~|9AO84c zXwf|7QYgANC#A%$EiKvjSf#Id)8JpB@e~mNJ#srXG%F^xJ&o1Pbq(PS*MIMi-i&9i zZ4bD1ckSE$HUG@3`8RG9e0-PBVoS^ESZam|Ltb5TU$s|hnti#!m_Af*h5c$k&8Ul{G&o44?uDx{;pcxk}B{)OFT2ZBLS)#^*t{xX~%(PvG!?MUUeBj>^pDhkXxvJ#(5q7{_yGo~kF}^jvPF$P=fb@HQ2du5}mBGp)!E zpU?2_mo8E%$YddHKq?6 zrWzg~fyy~cMQ#vp|2Fvf zv>=-SA#)-raz?g;uq`!_%#R=M9y_~|R?MM4#Yo?nJZ%dW0R9C^l8LBczrWqP&FN-owXI~+X|iONNw#v<^rfT+iNf+BqNt3X>aC}uhkA%2 zYeWxGpowHyBO-`OB*;HgBQY>coniQAZspbOI(OIo-TUjI7L+@1UVfbOIfu{r!Rz(b z5kN}-K9vA8SRKUYwY9vdD|%mQB(GJr@sWN%1NmJ|0B$bI1PIjlv z^tRfBa|IdjJSj808>%48#KDPlQE%lh#E#~%fY&thcnf--mukjzz$W~bLRy>%bhr@a zfVHWfe`GzIr@lM=v#t3*#k@)rs_s+Utw-&xn+0LcH9b3-$8Rh&j9JSUE?v3o7KAwt z0LcGa9LT}hyT!OaPYlW7<2Ry(g*G!|Kr|{MnM@)hBMaeh2n`K~PU`jg$2?=qObCgj z07(^eSp~vHyGSf1nq98#u-o(h4v=LTe!m}WZBJXOt1Hi>Zj^22k#n~Q&tH@x_@NBU z=ku{>G|FPJ7;A2BW|UIa-rmkSJ3ASrl==OB_VD2YmU6HxDv8yhh=I0&tlPwxN#1Yu4y@j1}1a2t0T3z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;?^3?6I zdnO(3pH2^RY9ad;KI^y);DICx{`d=50d9jnAZmA{))?J17z@AzFVyta()^PRh&c%x zjd44+MSN;7Pkx?ueM||G_V=CKbstl|1WkXx?$Qrjw@mzYSY}4hXXm|GfIj+SD*;fl zStq8NbI0m@IrGer3I*bv1){{8dI*`qV_ykjjY>8G}$*JmdfIv@ zjJKrw4p$k_SQ96FQUjs$cLG2vHlw*Z7QaMbwNitn%eokedm|~}LrLHXTI4BlNzatHRF|tUpt9F7kH9@im6vL?5SGB}&UiP|Wbh zvA2ofCIjq6`5W#`45#+|z@Kcal zweE2bTyzI83s__gtTF|>vBWgKb#Jmdm(0Jul&BDCOK+S0jqKD(L`;KkkQSJs06g&6 zT(A!HAVA-ZYi0IIiWQ*5Lp8FMylgN6fdw!oZGx!MKoEgR=M2mrtC8>i3<8_5VuSBv zo`LT7j=r$aSKBHJoWkSU|J%hRPSahVzM$YsM4pSl~&M-38Z z$x(bN+J_J1XgOmbhNcdWhsJ%2doW@GU32c~hf8YRWG^8f$<07*qoM6N<$ Eg7z$h)&Kwi literal 0 HcmV?d00001 diff --git a/plugins/_core/_core.vcproj b/plugins/_core/_core.vcproj new file mode 100644 index 0000000..3ae6853 --- /dev/null +++ b/plugins/_core/_core.vcproj @@ -0,0 +1,4408 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/_core/additional/0.png b/plugins/_core/additional/0.png new file mode 100644 index 0000000000000000000000000000000000000000..59937860b0d61cc06007f43acd5aae4e035f1fec GIT binary patch literal 2856 zcmZ`*d2o}*75_>4blbWm+mhu&w!!fQgp|}cgu^&sOli|3fSHCNX{SsxbO+2IHboxhEv%C6s_wC#F z-tYHz4}NdUhD?cG0wA+~n+ApZ>%UVc9OMbLa;<64`|ANobN%|Y&%eRpoRqvU$7yM4M{VsY7z_r^ z?%jJ1ip7}+Mn;CW@=ue)3}_R^(xaOf-#N?qN?%{ra#b){1CluoCHNF+i$5{Ap= z!i?9Cs7M9< z&!!dd3JMB2Pdu@5vqq!+Whxb~HX03N;aaR*`E6ur)tIqc(Q*A6ZuJdgK4&px6{|7F zNYQoeYuso)0dCld<;yCt{+T*dlZ-~Aro+v^;c(?iB+`nho*Lu5{q}o@0)fEx za5z|9S67S1#_g!6sDMJDfWerDMTLck_&u;%Ent;8FgdxHiv;27YlqZ3imeT`*!`0q zo_OioTgBoshMv6Aa@AmXGjU>?PduIuny#;`=M#Ey*{ zuxxcLDd8YI7s8l%oGgh$CX+!RVBjWj2!-MY-`rpz2)SI2VpAa)n!J7cHump-9XogJ z!dt)o4MKkJgVUCkRY1n@5E&i8?C1cbTpmhG%NCS`0{HFk-o?%rU&g+D2hh>c35F4% zxY$H{XTtCI6G{{F5YV7hA_WgzI2~>b3=E*Rw+}|W9{xZGnF`9%evcOdnys#0fxUb8z+$nY zYUxrK^Yb5U=5RO>jT5dZX6celv4kuqREAt+=jLK3#j32V4EpRWJhigsf$Ks+FTp)R z;gErekih+kNqC)8SiPzSD&oUSFTDho#yQ-FG^0~?bao;bjl)z`1umbD*;oQMXso!P z5PX#q4Go*nu&JI*U62Wf$TRnP;BbeLZz>1Z6G>orVglDXZ=&~ZI^`^sM@s1P^0|vR zbEX+FQoLr%W~^ywK!VRh^SKMSeEz~WB9D}$2L^h((AIVx-Mwa5oKY|#z8D@>i1D!r zoH%j>S`i=RYw8{e-)(Khr^k+>v!@5^UfzZ08n==Ex%j8cfs5xaL5vg75wVxo{a41) z--hEyj^f&_`;Z%!LhqA+VKd}VE~*62?nKM&J|rT4#4|&ql>79sPC3v@2LF;X|a!!qPQQV@qQr8Ysmm9@^@r{>+VAICJ6{`meSk z>2rdciea8*5rPsaRSgvRn^BZ+f>FzY(MUz$Q7|bhLY|umYp)Sr^ANa^2((HKO3N$o z1cAgwFZSts!+=V-f!k_FUtb@3$c>Z3!{8FKjOArm^7JY! zs;Y#{phXY@IATe-Z7GE80!)u{;GYDFWj<6IiLe>mWHK3;Wdg|n#9A#hL^K0YH;Y_D z)I`_N5Uw6SiMGovF!$ag0>u`bcj*G|w0(`5hG+29ju$BTJ_e1D51R=Xj{?&~xftV|1W9bTUBsF{KU9$Xe+vLEnTY)AzM=4`{K-@J0-SHEXm zv_nNGIAl_a6E5F0rbhOdr2zMQC#7k&ZOy^QmE}pG-Foi+6k)=DSV^=^i$y;EpY0vDdo z0alZP=SkTWGjRGFL+2&%I8(5W0`YJhyznF;&4a}`vz<{z+?LkCu!MUKhvSgQ6$gsG zwKhY*7q6Na@1uu^40G`~AR|}=TzHmF`_l@brjn#c@nZUpTm#Ohu^}x$V2*)n>ORD5 z0E@H)0O3sg=$+3G968hJNOOz3|GkfKHOS&0pMNiq04ZiMCXQHdcWOeKL6UEKW!d3-oxURUz`H3 zsH7B=gF`slat<#(_xyB8mh#q;vhqS94_c?wIZruPASN_vrIfj4VdM(P9KwCKM}XFN zAzaEQA%UmH>#hF)YT(%A literal 0 HcmV?d00001 diff --git a/plugins/_core/additional/1.png b/plugins/_core/additional/1.png new file mode 100644 index 0000000000000000000000000000000000000000..9034cc0b187593ba6c1ca7e0594a7eb1c2c23dd8 GIT binary patch literal 2856 zcmaJ@c~F$u5&zA>3^NP^12Y2-APley1QC#%5GCRwO4ii~qOJvHD%QrBtm3+oislb% zqp?h?;#KY@Chn?uWLI#FM-Vl-1~0^G6%P;zhn&M9=P*a7zmI^psm*Vy=Y6mHz1RJ^ zU-x_4-+d?3U2ReWaL<~Xv4~rfK&}e@KRz$}4mXOG^D{F*!tb+-M|U$vwRY~(^?;kV zKob0Ezb`YDA7=e%jN8mx>5GdblE0~Q2H@}SkEp09q@|@{#flXm zBA)dIwi)$$o2SNI5R8(PTb+hv-db|;(vm{&K`uJ?R+i@pGk-}o1id#8-U*R#3o=3O z?gqKhXoOy`7Zt8uyA~3OL>TMCyXeu=n=)v|OyrZZE&_V3)+DI(c^ytc`83Nu`j%gg_#h}K2z&SLg_N0$2(?nkGP-8TMC{q1M`ibkh{18$+Ry%i$0L z@1}x7F2${?N*p{=jLx3!VqWmHEHE(eLVkXJ^0H;iLM|Y zM93wuw6wue+WJ!yuakz5kP!N0 z-zQX4Q$yRfZl&ny)5*)ri!>SyEnK)z7vDy_wJABTKOeWG}7HiKg(Z9 z-Wn~<{=rOoc>jUOZ*FR$RjXE!N~I!rXtlH?CzsZJ@B#U@PBF*sl z`xWSV9GEjR9a@7ou3Y;UZr{0srluxv-Gj+wLS$qlY&IJV1_O5P+zG8#3z+4JL z@$pnySvhWXXJ;pE+O&zd(u>x5@D-xxqdn#YxJW5r)gp>M{Rf(~aXG(E*X&>ny zlshf2;I!J|!;>y{Nfsv0jED0@D+V6DxM{caR>++_gTH!t;N)_6YGOH& z-1?ob6*bh>p}(gWHmg-sC{v8?R9MwvvqPm&!p|t&k)zNV_0R_fut(f5Q1uMW#pj;X z|Mk>X433-tr}|=n%9H8BUazpuY7brc9j*ayrM>8*PQ)b5!hu z!(zX!x)xVE>fxFkfxeb5Jl}onY3t`_3t4!MgFBi>+-Zid*L7X;w5;bk3AUGgfv%c= zqvh5EaS<1}403kUL?~rkAqECfeg7L=K6w@=?^ocKo?k0jiRd|T5v-(~$DezjS`e`z zAM%{aWB4LIuMID|Hgr`z)<{yOr731dK|Y(Wkq~#_XazJv8IlS&%4=x&F!aHJLr05I z>uN*a%y1}YO@oqmE*TmT1`3ZATv@*XJ&&G4`t`c)NZztW;5~ZvkDGG>Ly=BB_sGypOePqvn8eD||@gs;v;bJ_I{TZ`p_y`ilX zebyU1-ryJ+3GCr2UsuPq>+W6r^TI`(FDt{-x>_iVI=CrR=)Y5g#^dEjI?hyV<~h}G zU)hg)zuAYO=63LX#jj420orggyy7C@`*so*Jp58HW+Jw6$L8g!BTinCg!_nV_h=>H zx0cM`K#BmP5EJnM`4OM8&{d1zlO6|cm>CK$4_uynw_?YU+&#j=S##dWDEVQ*mj3`r ClkTkm literal 0 HcmV?d00001 diff --git a/plugins/_core/additional/icondef.xml b/plugins/_core/additional/icondef.xml new file mode 100644 index 0000000..15b291e --- /dev/null +++ b/plugins/_core/additional/icondef.xml @@ -0,0 +1,19 @@ + + + + SIM smiles + 0.9.6 + SIM smiles. + Vladimir Shutoff + 2004-06-11 + http://sim-im.berlios.de/ + + + *EYES OPEN* + 0.png + + + *UGLY* + 1.png + + diff --git a/plugins/_core/arcfg.cpp b/plugins/_core/arcfg.cpp new file mode 100644 index 0000000..41329c9 --- /dev/null +++ b/plugins/_core/arcfg.cpp @@ -0,0 +1,121 @@ +/*************************************************************************** + arcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "arcfg.h" +#include "core.h" +#include "simgui/ballonmsg.h" +#include "simgui/editfile.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +#include +#include + +using namespace SIM; + +ARConfig::ARConfig(QWidget *p, unsigned status, const QString &name, Contact *contact) + : QWidget(p) + , m_status(status) + , m_contact(contact) +{ + setupUi(this); + setButtonsPict(this); + tabAR->setTabText(tabAR->indexOf(tab), name); + SIM::PropertyHubPtr ar; + QString text; + SIM::PropertyHubPtr core = CorePlugin::instance()->propertyHub(); + QString noShow = core->stringMapValue("NoShowAutoReply", m_status); + if (m_contact) + { + chkNoShow->hide(); + connect(chkOverride, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); + ar = m_contact->getUserData()->getUserData("AR"); + if (ar) + text = ar->stringMapValue("AutoReply", m_status); + if (!text.isEmpty()) + chkOverride->setChecked(true); + else + { + ar.clear(); + Group *grp = getContacts()->group(m_contact->getGroup()); + if (grp) + ar = grp->getUserData()->getUserData("AR"); + if (!ar.isNull()) + text = ar->stringMapValue("AutoReply", m_status); + } + toggled(chkOverride->isChecked()); + } + else + chkOverride->hide(); + if (text.isEmpty()) + { + ar = getContacts()->getUserData("AR"); + if (!noShow.isEmpty()) + chkNoShow->setChecked(true); + text = ar->stringMapValue("AutoReply", m_status); + if (text.isEmpty()) + text = ar->stringMapValue("AutoReply", STATUS_AWAY); + } + edtAutoReply->setText(text); + EventTmplHelpList e; + e.process(); + edtAutoReply->setHelpList(e.helpList()); + connect(btnHelp, SIGNAL(clicked()), this, SLOT(help())); +} + +void ARConfig::apply() +{ + if (m_contact) + applyForSpecialUser(); + else + applyGlobal(); +} + +void ARConfig::applyForSpecialUser() +{ + SIM::PropertyHubPtr ar = m_contact->getUserData()->getUserData("AR"); + if (chkOverride->isChecked()) + { + if(ar.isNull()) + ar = m_contact->getUserData()->createUserData("AR"); + ar->setStringMapValue("AutoReply", m_status, edtAutoReply->toPlainText()); + } + else if (!ar.isNull()) + ar->setStringMapValue("AutoReply", m_status, QString::null); +} +void ARConfig::applyGlobal() +{ + SIM::PropertyHubPtr ar = getContacts()->getUserData("AR"); + ar->setStringMapValue("AutoReply", m_status, edtAutoReply->toPlainText()); + SIM::PropertyHubPtr core = CorePlugin::instance()->propertyHub(); + core->setStringMapValue("NoShowAutoReply", m_status, chkNoShow->isChecked() ? "1" : ""); +} +void ARConfig::toggled(bool bState) +{ + edtAutoReply->setEnabled(bState); +} + +void ARConfig::help() +{ + QString helpString = i18n("In text you can use:") + '\n'; + EventTmplHelp e(helpString); + e.process(); + BalloonMsg::message(e.help(), btnHelp, false, 400); +} + +// vim: set expandtab: + diff --git a/plugins/_core/arcfg.h b/plugins/_core/arcfg.h new file mode 100644 index 0000000..6b07243 --- /dev/null +++ b/plugins/_core/arcfg.h @@ -0,0 +1,45 @@ +/*************************************************************************** + arcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ARCFG_H +#define _ARCFG_H + +#include +#include "contacts.h" + +#include "ui_arcfgbase.h" + +class ARConfig : public QWidget, public Ui::ARConfigBase +{ + Q_OBJECT +public: + ARConfig(QWidget *parent, unsigned status, const QString &name, SIM::Contact *contact); +public slots: + void apply(); + void applyGlobal(); + + void applyForSpecialUser(); + + void toggled(bool); + void help(); +protected: + unsigned m_status; + SIM::Contact *m_contact; +}; + +#endif + diff --git a/plugins/_core/arcfgbase.ui b/plugins/_core/arcfgbase.ui new file mode 100644 index 0000000..8d5156e --- /dev/null +++ b/plugins/_core/arcfgbase.ui @@ -0,0 +1,133 @@ + + + + + ARConfigBase + + + + 0 + 0 + 421 + 314 + + + + Form1 + + + + 11 + + + 6 + + + + + + + + + + 11 + + + 6 + + + + + &Override global settings + + + + + + + &Help + + + + + + + + 7 + 0 + + + + Don't show autoreply dialog + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + + + + + + + QWidget + QWidget +
QWidget
+ + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
+ + MultiLineEdit + QWidget +
simgui/editfile.h
+ + -1 + -1 + + 0 + + 7 + 7 + + image1 +
+
+ + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + +
diff --git a/plugins/_core/autoreply.cpp b/plugins/_core/autoreply.cpp new file mode 100644 index 0000000..340987a --- /dev/null +++ b/plugins/_core/autoreply.cpp @@ -0,0 +1,204 @@ +/*************************************************************************** + autoreply.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" + +#include "autoreply.h" +#include "core.h" +#include "simgui/ballonmsg.h" +#include "simgui/editfile.h" +#include "contacts/client.h" + +#include +#include +#include +#include + +using namespace SIM; + +AutoReplyDialog::AutoReplyDialog(unsigned status) + : QDialog(NULL) + , m_status(status) + , m_time(15) + , m_timer(new QTimer(this)) +{ + setupUi(this); + SET_WNDPROC("mainwnd"); + QString text, icon; + if (!loadIconAndIconText(status, text, icon)) + return; + setWindowTitle(i18n("Autoreply message") + ' ' + i18n(text)); + setWindowIcon(Icon(icon)); + lblTime->setText(i18n("Close after %n second", "Close after %n seconds", m_time)); + connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); + m_timer->start(1000); + SIM::PropertyHubPtr ar = getContacts()->getUserData("AR"); + text = ar->stringMapValue("AutoReply", m_status); + edtAutoResponse->setText(text); + connect(edtAutoResponse, SIGNAL(textChanged()), this, SLOT(textChanged())); + connect(chkNoShow, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); + connect(btnHelp, SIGNAL(clicked()), this, SLOT(help())); + EventTmplHelpList e; + e.process(); + edtAutoResponse->setHelpList(e.helpList()); +} + +AutoReplyDialog::AutoReplyDialog(const SIM::IMStatusPtr& status) + : QDialog(NULL) + , m_time(15) + , m_timer(new QTimer(this)) + , m_imstatus(status) +{ + setupUi(this); + initIconMap(); + QString text = status->text(); + QIcon icon = Icon(statusIcon(status)); + setWindowTitle(i18n("Autoreply message") + ' ' + i18n(text)); + setWindowIcon(icon); + lblTime->setText(i18n("Close after %n second", "Close after %n seconds", m_time)); + connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); + m_timer->start(1000); + SIM::PropertyHubPtr ar = getContacts()->getUserData("AR"); + text = ar->value("AutoReply" + m_imstatus->id()).toString(); + edtAutoResponse->setText(text); + connect(edtAutoResponse, SIGNAL(textChanged()), this, SLOT(textChanged())); + connect(chkNoShow, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); + connect(btnHelp, SIGNAL(clicked()), this, SLOT(help())); + EventTmplHelpList e; + e.process(); + edtAutoResponse->setHelpList(e.helpList()); +} + +AutoReplyDialog::~AutoReplyDialog() +{ +} + +void AutoReplyDialog::initIconMap() +{ + m_iconmap.insert("online", "SIM_online"); + m_iconmap.insert("away", "SIM_away"); + m_iconmap.insert("n/a", "SIM_na"); + m_iconmap.insert("dnd", "SIM_dnd"); + m_iconmap.insert("occupied", "SIM_occupied"); + m_iconmap.insert("free_for_chat", "SIM_ffc"); + m_iconmap.insert("offline", "SIM_offline"); +} + +QString AutoReplyDialog::statusIcon(const SIM::IMStatusPtr& status) +{ + return m_iconmap.value(status->id()); +} + +bool AutoReplyDialog::loadIconAndIconText(unsigned status, QString &text, QString &icon) +{ + bool btextFound = true; + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + for (const CommandDef *d = getContacts()->getClient(i)->protocol()->statusList(); !d->text.isEmpty(); d++) + { + if (d->id == status) + { + text = d->text; + switch (d->id){ + case STATUS_ONLINE: + icon="SIM_online"; + break; + case STATUS_AWAY: + icon="SIM_away"; + break; + case STATUS_NA: + icon="SIM_na"; + break; + case STATUS_DND: + icon="SIM_dnd"; + break; + case STATUS_OCCUPIED: + icon="SIM_occupied"; + break; + case STATUS_FFC: + icon="SIM_ffc"; + break; + case STATUS_OFFLINE: + icon="SIM_offline"; + break; + default: + icon=d->icon; + break; + } + break; + } + } + if (!text.isEmpty()) + break; + } + if (text.isEmpty()) + return !btextFound; + return btextFound; +} + +void AutoReplyDialog::textChanged() +{ + stopTimer(); +} + +void AutoReplyDialog::toggled(bool) +{ + stopTimer(); +} + +void AutoReplyDialog::stopTimer() +{ + if (m_timer == NULL) + return; + delete m_timer; + m_timer = NULL; + lblTime->hide(); +} + +void AutoReplyDialog::timeout() +{ + if (--m_time <= 0) + { + accept(); + return; + } + lblTime->setText(i18n("Close after %n second", "Close after %n seconds", m_time)); +} + +void AutoReplyDialog::accept() +{ + SIM::PropertyHubPtr core = CorePlugin::instance()->propertyHub(); + core->setStringMapValue("NoShowAutoReply", m_status, chkNoShow->isChecked() ? "1" : ""); + core->setValue("NoShowAutoReply" + m_imstatus->id(), chkNoShow->isChecked()); + + SIM::PropertyHubPtr ar = getContacts()->getUserData("AR"); + ar->setStringMapValue("AutoReply", m_status, edtAutoResponse->toPlainText()); + core->setValue("AutoReply" + m_imstatus->id(), edtAutoResponse->toPlainText()); + m_imstatus->setText(edtAutoResponse->toPlainText()); + QDialog::accept(); +} + +void AutoReplyDialog::help() +{ + stopTimer(); + QString helpString = i18n("In text you can use:") + '\n'; + EventTmplHelp e(helpString); + e.process(); + BalloonMsg::message(e.help(), btnHelp, false, 400); +} + + diff --git a/plugins/_core/autoreply.h b/plugins/_core/autoreply.h new file mode 100644 index 0000000..64871fe --- /dev/null +++ b/plugins/_core/autoreply.h @@ -0,0 +1,55 @@ +/*************************************************************************** + autoreply.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _AUTOREPLY_H +#define _AUTOREPLY_H + +#include "contacts/imstatus.h" +#include "ui_autoreplybase.h" + +class AutoReplyDialog : public QDialog, public Ui::AutoReplyBase +{ + Q_OBJECT +public: + AutoReplyDialog(unsigned status); + AutoReplyDialog(const SIM::IMStatusPtr& status); + ~AutoReplyDialog(); + +protected slots: + void timeout(); + void textChanged(); + void toggled(bool); + void help(); + +protected: + void accept(); + void stopTimer(); + bool loadIconAndIconText(unsigned status, QString &text, QString &icon); + +private: + void initIconMap(); + QString statusIcon(const SIM::IMStatusPtr& status); + + unsigned m_status; + unsigned m_time; + QTimer *m_timer; + SIM::IMStatusPtr m_imstatus; + QMap m_iconmap; +}; + +#endif + diff --git a/plugins/_core/autoreplybase.ui b/plugins/_core/autoreplybase.ui new file mode 100644 index 0000000..c2cec07 --- /dev/null +++ b/plugins/_core/autoreplybase.ui @@ -0,0 +1,151 @@ + + + + + AutoReplyBase + + + + 0 + 0 + 351 + 247 + + + + MyDialog + + + true + + + + 11 + + + 6 + + + + + + + + Don't show this dialog + + + + + + + 0 + + + 6 + + + + + &Help + + + 4144 + + + + + + + + 7 + 1 + + + + + + + false + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + + + MultiLineEdit + QWidget +
simgui/editfile.h
+ + -1 + -1 + + 0 + + 7 + 7 + + image0 +
+
+ + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + + + + buttonOk + clicked() + AutoReply + accept() + + + buttonCancel + clicked() + AutoReply + reject() + + +
diff --git a/plugins/_core/cfgdlg.cpp b/plugins/_core/cfgdlg.cpp new file mode 100644 index 0000000..54f6042 --- /dev/null +++ b/plugins/_core/cfgdlg.cpp @@ -0,0 +1,642 @@ +/*************************************************************************** + cfgdlg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "cfgdlg.h" +#include "plugincfg.h" +#include "maininfo.h" +#include "arcfg.h" +#include "buffer.h" +#include "core.h" +#include "contacts/client.h" +#include "profilemanager.h" +#include "log.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + + + + +using namespace ConfigDlg; + +//unsigned ConfigItem::defId = 0x10000; //obsoleted? +unsigned ConfigItem::curIndex; + +ConfigItem::ConfigItem(QTreeWidget *view, unsigned id) + : QTreeWidgetItem(view) +{ + init(id); +} + +ConfigItem::ConfigItem(QTreeWidgetItem *item, unsigned id) + : QTreeWidgetItem(item) +{ + init(id); +} + +ConfigItem::~ConfigItem() +{ + //deleteWidget(); //obsolete? +} + + +void ConfigItem::deleteWidget()//obsolete? +{ + /*if (m_widget){ + delete m_widget; + m_widget = NULL; + }*/ +} + +void ConfigItem::init(unsigned id) +{ + m_widget = NULL; + m_id = id; + QString key = QString::number(++curIndex); + while (key.length() < 4) + key = '0' + key; + setText(1, key); +} + +bool ConfigItem::raisePage(QWidget *w) +{ + if (m_widget == w) + { + treeWidget()->setCurrentItem(this); + return true; + } + for(int i = 0; i < childCount(); i++) + { + QTreeWidgetItem* item = child(i); + if (static_cast(item)->raisePage(w)) + return true; + } + return false; +} + +void ConfigItem::show() +{ + ConfigureDialog *dlg = static_cast(treeWidget()->topLevelWidget()); + if (m_widget == NULL) + { + m_widget = getWidget(dlg); + if (m_widget == NULL) + return; + m_id = dlg->wnd->addWidget(m_widget/*, id() ? id() : defId++*/); + dlg->wnd->setMinimumSize(dlg->wnd->sizeHint()); + QObject::connect(dlg, SIGNAL(applyChanges()), m_widget, SLOT(apply())); + QTimer::singleShot(50, dlg, SLOT(repaintCurrent())); + } + dlg->showUpdate(type() == CLIENT_ITEM); + dlg->wnd->setCurrentWidget(m_widget); +} + +void ConfigItem::apply() +{ +} + +QWidget *ConfigItem::getWidget(ConfigureDialog*) +{ + return NULL; +} + +class PluginItem : public ConfigItem +{ +public: + PluginItem(QTreeWidgetItem *view, const QString& name, const QString& title, unsigned id); + virtual void apply(); + virtual unsigned type() { return PLUGIN_ITEM; } +private: + virtual QWidget *getWidget(ConfigureDialog *dlg); + QString m_name; +}; + +PluginItem::PluginItem(QTreeWidgetItem *item, const QString& name, const QString& title, unsigned id) + : ConfigItem(item, id), m_name(name) +{ + setText(0, title); + setText(1, title); +} + +void PluginItem::apply() +{ + if (getPluginManager()->isPluginAlwaysEnabled(m_name)) + return; + if (m_widget) { + PluginCfg *w = static_cast(m_widget); + if (w->chkEnable->isChecked()) + ProfileManager::instance()->currentProfile()->enablePlugin(m_name); + else + ProfileManager::instance()->currentProfile()->disablePlugin(m_name); + delete m_widget; + m_widget = 0; + } +} + +QWidget *PluginItem::getWidget(ConfigureDialog *dlg) +{ + return new PluginCfg(dlg->wnd, m_name); +} + +class ClientItem : public ConfigItem +{ +public: + ClientItem(QTreeWidgetItem *item, Client *client, CommandDef *cmd); + ClientItem(QTreeWidget *view, Client *client, CommandDef *cmd); + Client *client() { return m_client; } + virtual unsigned type() { return CLIENT_ITEM; } +private: + void init(); + virtual QWidget *getWidget(ConfigureDialog *dlg); + CommandDef *m_cmd; + Client *m_client; +}; + +ClientItem::ClientItem(QTreeWidgetItem *item, Client *client, CommandDef *cmd) + : ConfigItem(item, 0) +{ + m_client = client; + m_cmd = cmd; + init(); +} + +ClientItem::ClientItem(QTreeWidget *view, Client *client, CommandDef *cmd) + : ConfigItem(view, 0) +{ + m_client = client; + m_cmd = cmd; + init(); +} + +void ClientItem::init() +{ + if (!m_cmd->text_wrk.isEmpty()){ + setText(0, m_cmd->text_wrk); + m_cmd->text_wrk = QString::null; + }else{ + setText(0, i18n(m_cmd->text)); + } + if (!m_cmd->icon.isEmpty()) + setIcon(0, Pict(m_cmd->icon)); +} + +QWidget *ClientItem::getWidget(ConfigureDialog *dlg) +{ + QWidget *res = m_client->configWindow(dlg, m_cmd->id); + if (res) + QObject::connect(dlg, SIGNAL(applyChanges(SIM::Client*, void*)), res, SLOT(apply(SIM::Client*, void*))); + return res; +} + +ARItem::ARItem(QTreeWidgetItem *item, const CommandDef *d) + : ConfigItem(item, 0) +{ + QString icon; + + m_status = d->id; + setText(0, i18n(d->text)); + switch (d->id){ + case STATUS_ONLINE: + icon="SIM_online"; + break; + case STATUS_AWAY: + icon="SIM_away"; + break; + case STATUS_NA: + icon="SIM_na"; + break; + case STATUS_DND: + icon="SIM_dnd"; + break; + case STATUS_OCCUPIED: + icon="SIM_occupied"; + break; + case STATUS_FFC: + icon="SIM_ffc"; + break; + case STATUS_OFFLINE: + icon="SIM_offline"; + break; + default: + icon=d->icon; + break; + } + setIcon(0, Pict(icon)); +} + +QWidget *ARItem::getWidget(ConfigureDialog *dlg) +{ + return new ARConfig(dlg, m_status, text(0), NULL); +} + +MainInfoItem::MainInfoItem(QTreeWidget *view, unsigned id) + : ConfigItem(view, id) +{ + setText(0, i18n("User info")); + setIcon(0, Pict("info")); +} + +QWidget *MainInfoItem::getWidget(ConfigureDialog *dlg) +{ + return new MainInfo(dlg, NULL); +} + + +using namespace ConfigDlg; + +ConfigureDialog::ConfigureDialog() + : QDialog(NULL) + , m_nUpdates(0) + , m_parentItem(NULL) +{ + setupUi(this); + setWindowIcon(Icon("configure")); + setButtonsPict(this); + setTitle(); + lstBox->header()->hide(); + QIcon iconSet = Icon("webpress"); + if (!iconSet.pixmap(QSize(16,16), QIcon::Normal).isNull()) + btnUpdate->setIcon(iconSet); + btnUpdate->hide(); + lstBox->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + fill(0); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(apply())); + connect(btnUpdate, SIGNAL(clicked()), this, SLOT(updateInfo())); + connect(lstBox, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), + this, SLOT(itemSelected(QTreeWidgetItem*, QTreeWidgetItem*))); + lstBox->setCurrentItem(lstBox->topLevelItem(0)); + itemSelected(lstBox->topLevelItem(0), 0); +} + +ConfigureDialog::~ConfigureDialog() +{ + lstBox->clear(); +} + +static unsigned itemWidth(QTreeWidgetItem *item, QFontMetrics &fm) +{ + unsigned w = fm.width(item->text(0)) + 64; + for(int i = 0; i < item->childCount(); i++) + { + QTreeWidgetItem *child = item->child(i); + w = qMax(w, itemWidth(child, fm)); + } + return w; +} + +void ConfigureDialog::fill(unsigned id) +{ + lstBox->clear(); + lstBox->sortItems(1, Qt::AscendingOrder); + + m_parentItem = new MainInfoItem(lstBox, 0); + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + CommandDef *cmds = client->configWindows(); + if (cmds){ + m_parentItem = NULL; + for (; !cmds->text.isEmpty(); cmds++){ + if (m_parentItem){ + new ClientItem(m_parentItem, client, cmds); + }else{ + m_parentItem = new ClientItem(lstBox, client, cmds); + m_parentItem->setExpanded(true); + } + } + } + } + + unsigned long n; + m_parentItem = NULL; + list st; + for (n = 0; n < getContacts()->nClients(); n++){ + Protocol *protocol = getContacts()->getClient(n)->protocol(); + if ((protocol->description()->flags & (PROTOCOL_AR | PROTOCOL_AR_USER)) == 0) + continue; + if (m_parentItem == NULL){ + m_parentItem = new ConfigItem(lstBox, 0); + m_parentItem->setText(0, i18n("Autoreply")); + m_parentItem->setExpanded(true); + } + for (const CommandDef *d = protocol->statusList(); !d->text.isEmpty(); d++){ + if (((protocol->description()->flags & PROTOCOL_AR_OFFLINE) == 0) && + ((d->id == STATUS_ONLINE) || (d->id == STATUS_OFFLINE))) + continue; + list::iterator it; + for (it = st.begin(); it != st.end(); ++it) + if ((*it) == d->id) + break; + if (it != st.end()) + continue; + st.push_back(d->id); + new ARItem(m_parentItem, d); + } + } + + m_parentItem = new ConfigItem(lstBox, 0); + m_parentItem->setText(0, i18n("Plugins")); + m_parentItem->setIcon(0, Pict("run")); + m_parentItem->setExpanded(true); + + QStringList plugins = getPluginManager()->enumPlugins(); + foreach(QString plugin, plugins) + { + log(L_DEBUG, "plugin: %s", qPrintable(plugin)); + QString title = getPluginManager()->pluginTitle(plugin); + if(title.isEmpty()) + continue; + new PluginItem(m_parentItem, plugin, title, n); + } + + QFontMetrics fm(lstBox->font()); + unsigned w = 0; + for(int i = 0; i < lstBox->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = lstBox->topLevelItem(i); + w = qMax(w, itemWidth(item, fm)); + } + lstBox->setFixedWidth(w); + lstBox->setColumnWidth(0, w - 2); + + if (id) + { + for(int i = 0; i < lstBox->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = lstBox->topLevelItem(i); + if (setCurrentItem(item, id)) + return; + } + } + lstBox->setCurrentItem(lstBox->topLevelItem(0)); +} + +bool ConfigureDialog::setCurrentItem(QTreeWidgetItem *parent, unsigned id) +{ + if (static_cast(parent)->id() == id){ + lstBox->setCurrentItem(parent); + return true; + } + for(int i = 0; i < parent->childCount(); i++) + { + QTreeWidgetItem *item = parent->child(i); + if (setCurrentItem(item, id)) + return true; + } + return false; +} + +void ConfigureDialog::closeEvent(QCloseEvent *e) +{ + QDialog::closeEvent(e); + emit finished(); +} + +void ConfigureDialog::itemSelected(QTreeWidgetItem *item, QTreeWidgetItem* /* previous */) +{ + if (item) + { + static_cast(item)->show(); + lstBox->setCurrentItem(item); + } +} + +void ConfigureDialog::apply(QTreeWidgetItem *item) +{ + static_cast(item)->apply(); + for(int i = 0; i < item->childCount(); i++) + { + QTreeWidgetItem* it = item->child(i); + apply(it); + } +} + +void ConfigureDialog::reject() +{ + QDialog::reject(); + emit finished(); +} + +void ConfigureDialog::apply() +{ + bLanguageChanged = false; + m_bAccept = true; + emit applyChanges(); + if (!m_bAccept) + return; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + const DataDef *def = client->protocol()->userDataDef(); + if (def == NULL) + continue; + size_t size = 0; + for (const DataDef *d = def; d->name; ++d) + size += d->n_values; + Data *data = new Data[size]; + QByteArray cfg = client->getConfig(); + if (cfg.isEmpty()){ + load_data(def, data, NULL); + }else{ + Buffer config; + config = "[Title]\n" + cfg; + config.setWritePos(0); + config.getSection(); + load_data(def, data, &config); + } + emit applyChanges(client, data); + client->setClientInfo(data); + free_data(def, data); + delete[] data; + } + for(int i = 0; i < lstBox->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = lstBox->topLevelItem(i); + apply(item); + } + if (bLanguageChanged){ + unsigned id = 0; + if (lstBox->currentItem()) + id = static_cast(lstBox->currentItem())->id(); + disconnect(lstBox, SIGNAL(currentChanged(QTreeWidgetItem*)), this, SLOT(itemSelected(QTreeWidgetItem*))); + fill(id); + connect(lstBox, SIGNAL(currentChanged(QTreeWidgetItem*)), this, SLOT(itemSelected(QTreeWidgetItem*))); + itemSelected(lstBox->currentItem(), 0); + buttonApply->setText(i18n("&Apply")); + buttonOk->setText(i18n("&OK")); + buttonCancel->setText(i18n("&Cancel")); + setWindowTitle(i18n("Setup")); + } + if (lstBox->currentItem()) + static_cast(lstBox->currentItem())->show(); + EventSaveState e; + e.process(); +} + +bool ConfigureDialog::processEvent(Event *e) +{ + if (e->type() == eEventLanguageChanged) + bLanguageChanged = true; + if (e->type() == eEventClientsChanged){ + unsigned id = 0; + if (lstBox->currentItem()) + id = static_cast(lstBox->currentItem())->id(); + fill(id); + } + if (e->type() == eEventClientChanged){ + if (m_nUpdates){ + if (--m_nUpdates == 0){ + setTitle(); + btnUpdate->setEnabled(true); + } + } + } + return false; +} + +void ConfigureDialog::setTitle() +{ + QString title = i18n("Configure"); + if (m_nUpdates){ + title += " ["; + title += i18n("Update info"); + title += ']'; + } + setWindowTitle(title); +} + +void ConfigureDialog::accept() +{ + apply(); + if (m_bAccept){ + QDialog::accept(); + emit finished(); + } +} + +void ConfigureDialog::showUpdate(bool bShow) +{ + if (bShow){ + btnUpdate->show(); + }else{ + btnUpdate->hide(); + } +} + +void ConfigureDialog::updateInfo() +{ + if (m_nUpdates) + return; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + m_nUpdates++; + getContacts()->getClient(i)->updateInfo(NULL, NULL); + } + btnUpdate->setEnabled(!m_nUpdates); + setTitle(); +} + +void ConfigureDialog::raisePage(Client *client) +{ + for(int i = 0; i < lstBox->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = lstBox->topLevelItem(i); + if (static_cast(item)->type() != CLIENT_ITEM) + continue; + if (static_cast(item)->client() == client){ + lstBox->setCurrentItem(item); + //lstBox->ensureItemVisible(item); //FIXME + return; + } + } +} + +void ConfigureDialog::raisePage(QWidget *widget) +{ + if (!m_bAccept) + return; + for(int i = 0; i < lstBox->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = lstBox->topLevelItem(i); + if (static_cast(item)->raisePage(widget)){ + m_bAccept = false; + break; + } + } +} + +void ConfigureDialog::raisePhoneBook() +{ + lstBox->setCurrentItem(lstBox->topLevelItem(0)); + QWidget *w = static_cast(lstBox->currentItem())->widget(); + if (w == NULL) + return; + QList l = topLevelWidget()->findChildren(); + if(l.isEmpty()) + return; + QTabWidget *tab = l.first(); + if(tab == NULL) + return; + tab->setCurrentIndex(2); +} + +void ConfigureDialog::repaintCurrent() +{ + QWidget *active = wnd->currentWidget(); + if (active == NULL) + return; + active->repaint(); + QTreeWidgetItem *item = findItem(active); + if (item) + lstBox->setCurrentItem(item); + lstBox->repaint(); +} + +QTreeWidgetItem *ConfigureDialog::findItem(QWidget *w) +{ + for(int i = 0; i < lstBox->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = lstBox->topLevelItem(0); + QTreeWidgetItem *res = findItem(w, item); + if (res) + return res; + } + return NULL; +} + +QTreeWidgetItem *ConfigureDialog::findItem(QWidget *w, QTreeWidgetItem *parent) +{ + if (static_cast(parent)->m_widget == w) + return parent; + for(int i = 0; i < parent->childCount(); i++) + { + QTreeWidgetItem *item = parent->child(i); + QTreeWidgetItem *res = findItem(w, item); + if (res) + return res; + } + return NULL; +} + +// vim: set expandtab: diff --git a/plugins/_core/cfgdlg.h b/plugins/_core/cfgdlg.h new file mode 100644 index 0000000..865e7f1 --- /dev/null +++ b/plugins/_core/cfgdlg.h @@ -0,0 +1,120 @@ +/*************************************************************************** + cfgdlg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _CFGDLG_H +#define _CFGDLG_H + +#include "ui_cfgdlgbase.h" +#include +#include "event.h" + +namespace ConfigDlg +{ + +using namespace std; +using namespace SIM; + +const unsigned CONFIG_ITEM = 1; +const unsigned PLUGIN_ITEM = 2; +const unsigned CLIENT_ITEM = 3; +const unsigned MAIN_ITEM = 4; +const unsigned AR_ITEM = 5; + +class ConfigItem; + +class ConfigureDialog : public QDialog, public Ui::ConfigureDialogBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + ConfigureDialog(); + ~ConfigureDialog(); + void raisePage(SIM::Client *client); + void raisePhoneBook(); + void showUpdate(bool bShow); +signals: + void applyChanges(); + void applyChanges(SIM::Client*, void*); + void finished(); +protected slots: + void apply(); + void updateInfo(); + void itemSelected(QTreeWidgetItem*, QTreeWidgetItem*); + void raisePage(QWidget*); + void repaintCurrent(); +protected: + void accept(); + void reject(); + void apply(QTreeWidgetItem *item); + virtual bool processEvent(SIM::Event*); + void fill(unsigned id); + void setTitle(); + bool setCurrentItem(QTreeWidgetItem *parent, unsigned id); + QTreeWidgetItem *findItem(QWidget *w); + QTreeWidgetItem *findItem(QWidget *w, QTreeWidgetItem *parent); + unsigned m_nUpdates; + bool m_bAccept; + void closeEvent(QCloseEvent*); + bool bLanguageChanged; +private: + ConfigItem *m_parentItem; +}; + +class ConfigItem : public QTreeWidgetItem +{ +public: + ConfigItem(QTreeWidgetItem *item, unsigned id); + ConfigItem(QTreeWidget *view, unsigned id); + ~ConfigItem(); + void show(); + void deleteWidget(); + virtual void apply(); + virtual unsigned type() { return CONFIG_ITEM; } + unsigned id() { return m_id; } + static unsigned curIndex; + bool raisePage(QWidget *w); + QWidget *widget() { return m_widget; } + QWidget *m_widget; +protected: + unsigned m_id; + static unsigned defId; + void init(unsigned id); + virtual QWidget *getWidget(ConfigureDialog *dlg); +}; + +class MainInfoItem : public ConfigItem +{ +public: + MainInfoItem(QTreeWidget *view, unsigned id); + unsigned type() { return MAIN_ITEM; } +protected: + virtual QWidget *getWidget(ConfigureDialog *dlg); +}; + +class ARItem : public ConfigItem +{ +public: + ARItem(QTreeWidgetItem *view, const CommandDef *d); + virtual unsigned type() { return AR_ITEM; } +private: + virtual QWidget *getWidget(ConfigureDialog *dlg); + unsigned m_status; +}; + + +} +#endif + diff --git a/plugins/_core/cfgdlgbase.ui b/plugins/_core/cfgdlgbase.ui new file mode 100644 index 0000000..7ea144a --- /dev/null +++ b/plugins/_core/cfgdlgbase.ui @@ -0,0 +1,177 @@ + + + ConfigureDialogBase + + + + 0 + 0 + 577 + 416 + + + + Setup + + + true + + + + 6 + + + 11 + + + + + 6 + + + 0 + + + + + + 0 + 0 + + + + 1 + + + false + + + false + + + + 1 + + + + + + + + + 0 + 0 + + + + 0 + + + + + + + + + + 6 + + + 0 + + + + + &Update + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Apply + + + true + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + + + + buttonOk + clicked() + ConfigureDialogBase + accept() + + + 20 + 20 + + + 20 + 20 + + + + + buttonCancel + clicked() + ConfigureDialogBase + reject() + + + 20 + 20 + + + 20 + 20 + + + + + diff --git a/plugins/_core/cmenu.cpp b/plugins/_core/cmenu.cpp new file mode 100644 index 0000000..85e954f --- /dev/null +++ b/plugins/_core/cmenu.cpp @@ -0,0 +1,249 @@ +/*************************************************************************** + cmenu.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "cmddef.h" +#include "misc.h" +#include "icons.h" +#include "cmenu.h" +#include "commands.h" + +#include +#include +#include +#include + +using namespace SIM; + +CMenu::CMenu(CommandsDef *def) + : QMenu(NULL) + , m_def(def) + , m_param(NULL) + , m_bInit(false) +{ + connect(this, SIGNAL(aboutToShow()), this, SLOT(showMenu())); + connect(this, SIGNAL(aboutToHide()), this, SLOT(hideMenu())); + connect(this, SIGNAL(triggered(QAction*)), this, SLOT(menuActivated(QAction*))); +} + +CMenu::~CMenu() +{ +} + +void CMenu::setParam(void *param) +{ + m_param = param; +} + +void CMenu::processItem(CommandDef *s, bool &bSeparator, bool &bFirst, unsigned base_id) +{ + if (s->id == 0) + { + bSeparator = true; + return; + } + s->param = m_param; + if (s->flags & COMMAND_CHECK_STATE) + { + s->flags &= ~COMMAND_DISABLED; + s->text_wrk = QString::null; + s->flags |= COMMAND_CHECK_STATE; // FIXME: What for? COMMAND_CHECK_STATE BIT is already 1 if this code is execued, because of "if" above + if(!EventCheckCommandState(s).process()) + return; + if (s->flags & COMMAND_RECURSIVE) + { + CommandDef *cmds = (CommandDef*)(s->param); + for (CommandDef *cmd = cmds; !cmd->text.isEmpty(); cmd++) + { + processItem(cmd, bSeparator, bFirst, s->id); + } + delete[] cmds; + s->param = NULL; + return; + } + } + if(s->flags & BTN_HIDE) + return; + if (m_wrk->actions().count()) + { + QSize s = m_wrk->sizeHint(); + QWidget *desktop = qApp->desktop(); + int nHeight = (s.height() - 2 * 2) / m_wrk->actions().count(); + if (s.height() + nHeight * 2 + 2 * 2 >= desktop->height()){ + QAction *pAction = m_wrk->addAction(i18n("More...")); + QMenu *more = new QMenu(m_wrk); + pAction->setMenu(more); + m_wrk = more; + connect(m_wrk, SIGNAL(triggered(QAction*)), this, SLOT(menuActivated(QAction*))); + } + } + if (bFirst) + { + bFirst = false; + bSeparator = false; + } + else if (bSeparator) + { + m_wrk->addSeparator(); + bSeparator = false; + } + QIcon icons; + if ((s->flags & COMMAND_CHECKED) && !s->icon_on.isEmpty()) + icons = Icon(s->icon_on); + if (icons.isNull() && !s->icon.isEmpty()) + icons = Icon(s->icon); + QString title = i18n(s->text); + if (!s->text_wrk.isEmpty()) + { + title = s->text_wrk; + s->text_wrk = QString::null; + } + if (!s->accel.isEmpty()) + { + title += '\t'; + title += i18n(s->accel); + } + if (s->flags & COMMAND_TITLE) + { + if (!icons.isNull()) + { +// m_wrk->insertTitle(icons.pixmap(QIcon::Automatic, QIcon::Normal), title); + } + else + { +// m_wrk->insertTitle(title); + } + bFirst = true; + bSeparator = false; + return; + } + QMenu *popup = NULL; + if (s->popup_id) + { + EventMenuProcess e(s->popup_id, s->param, 0); + e.process(); + popup = e.menu(); + } + unsigned id = 0; + QAction *pAction = m_wrk->addAction(icons, title); + if (popup) + { + pAction->setMenu(popup); + } + else + { + CMD c; + c.id = s->id; + c.base_id = base_id; + m_cmds.push_back(c); + id = m_cmds.size(); + pAction->setData(QVariant(id)); + } + if (id) + { + if (s->flags & COMMAND_DISABLED) + pAction->setEnabled(false); + if (!s->accel.isEmpty()) + pAction->setShortcut(QKeySequence::fromString(i18n(s->accel))); + if ((s->flags & COMMAND_CHECKED) != 0) + { + pAction->setCheckable(true); + pAction->setChecked((s->flags & COMMAND_CHECKED) != 0); + } + } + bSeparator = false; +} + +void CMenu::showMenu() +{ + initMenu(); +} + +void CMenu::hideMenu() +{ + m_bInit = false; +} + +void CMenu::clearMenu() +{ + clear(); +} + +QSize CMenu::sizeHint() const +{ + ((CMenu*)this)->initMenu(); + return QMenu::sizeHint(); +} + +void CMenu::initMenu() +{ + if (m_bInit) + return; + m_bInit = true; + m_wrk = this; + clear(); + m_cmds.clear(); + bool bSeparator = false; + bool bFirst = true; + CommandsList list(*m_def); + CommandDef *s; + while ((s = ++list) != NULL) + { + processItem(s, bSeparator, bFirst, 0); + } +} + +void CMenu::menuActivated(QAction *pAction) +{ + int n = pAction->data().toInt(); + + if ((n < 1) || (n > (int)(m_cmds.size()))) + return; + + CMD c = m_cmds[n - 1]; + unsigned id = c.id; + if (c.base_id) + id = c.base_id; + + CommandsList list(*m_def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + if (s->id == id){ + s->text_wrk = QString::null; + if (s->flags & COMMAND_CHECK_STATE){ + s->param = m_param; + s->flags |= COMMAND_CHECK_STATE; + if(!EventCheckCommandState(s).process()){ + s->text_wrk = QString::null; + return; + } + s->flags ^= COMMAND_CHECKED; + if (s->flags & COMMAND_RECURSIVE){ + CommandDef *cmds = (CommandDef*)(s->param); + delete[] cmds; + } + } + if (c.base_id) + s->id = c.id; + s->param = m_param; + EventCommandExec(s).process(); + s->text_wrk = QString::null; + s->id = id; + break; + } + } +} + diff --git a/plugins/_core/cmenu.h b/plugins/_core/cmenu.h new file mode 100644 index 0000000..1af6c64 --- /dev/null +++ b/plugins/_core/cmenu.h @@ -0,0 +1,58 @@ +/*************************************************************************** + cmenu.h - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _CMENU_H +#define _CMENU_H + +#include "simapi.h" + +#include + +#include "event.h" +#include + +struct CMD +{ + unsigned id; + unsigned base_id; +}; + +class CMenu : public QMenu +{ + Q_OBJECT +public: + CMenu(SIM::CommandsDef *def); + ~CMenu(); + void setParam(void *param); +protected slots: + void showMenu(); + void hideMenu(); + void menuActivated(QAction *action); + void clearMenu(); +protected: + void processItem(SIM::CommandDef *s, bool &bSeparator, bool &bFirst, unsigned base_id); + QSize sizeHint() const; + void initMenu(); + std::vector m_cmds; + SIM::CommandsDef *m_def; + QMenu *m_wrk; + void *m_param; + bool m_bInit; +}; + +#endif + diff --git a/plugins/_core/commands.cpp b/plugins/_core/commands.cpp new file mode 100644 index 0000000..2b3a306 --- /dev/null +++ b/plugins/_core/commands.cpp @@ -0,0 +1,343 @@ +/*************************************************************************** + commands.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "commands.h" +#include "simgui/toolbtn.h" +#include "toolsetup.h" +#include "core.h" +#include "cmenu.h" +#include "log.h" + +#include +#include +#include + +using namespace SIM; + +Commands::Commands() +{ + qApp->installEventFilter(this); +} + +Commands::~Commands() +{ + CMDS_MAP::iterator it; + for (it = bars.begin(); it != bars.end(); ++it) + delete it->second; + + MENU_MAP::iterator itm; + for (itm = menus.begin(); itm != menus.end(); ++itm) + { + MenuDef &def = itm->second; + delete def.menu; + delete def.def; + } +} + +CommandsDef *Commands::createBar(unsigned id) +{ + CMDS_MAP::iterator it = bars.find(id); + if (it != bars.end()) + return it->second; + CommandsDef *def = new CommandsDef(id, false); + bars.insert(CMDS_MAP::value_type(id, def)); + return def; +} + +void Commands::removeBar(unsigned id) +{ + CMDS_MAP::iterator it = bars.find(id); + if (it == bars.end()) + return; + delete it->second; + bars.erase(it); +} + +void Commands::clear() +{ + for (MENU_MAP::iterator it = menus.begin(); it != menus.end(); ++it) + if (it->second.menu) + { + delete it->second.menu; + it->second.menu = NULL; + } +} + +CommandsDef *Commands::createMenu(unsigned id) +{ + MENU_MAP::iterator it = menus.find(id); + if (it != menus.end()) + return it->second.def; + MenuDef def; + def.def = new CommandsDef(id, true); + def.menu = NULL; + def.param = NULL; + menus.insert(MENU_MAP::value_type(id, def)); + return def.def; +} + +void Commands::removeMenu(unsigned id) +{ + MENU_MAP::iterator it = menus.find(id); + if (it == menus.end()) + return; + if (it->second.menu) + delete it->second.menu; + delete it->second.def; + menus.erase(it); +} + +CToolBar *Commands::show(unsigned id, QMainWindow *parent) +{ + CMDS_MAP::iterator it = bars.find(id); + if (it == bars.end()) + return NULL; + QString sName = QString("Button") + QString::number(id); + it->second->setConfig(CorePlugin::instance()->value(sName.toLatin1().data())); + return new CToolBar(it->second, parent); +} + +CMenu *Commands::get(CommandDef *cmd) +{ + MENU_MAP::iterator it = menus.find(cmd->popup_id); + if (it == menus.end()) + return NULL; + MenuDef &d = it->second; + if (d.menu && (cmd->flags & COMMAND_NEW_POPUP) == 0) + { + d.menu->setParam(cmd->param); + return d.menu; + } + QString sName = QString("Menu") + QString::number(cmd->popup_id); + d.def->setConfig(CorePlugin::instance()->value(sName.toLatin1().data())); + CMenu *menu = new CMenu(d.def); + menu->setParam(cmd->param); + if ((cmd->flags & COMMAND_NEW_POPUP) != 0) + return menu; + + d.menu = menu; + return menu; +} + +CMenu *Commands::processMenu(unsigned id, void *param, int key) +{ + QKeySequence Key( key ); + MENU_MAP::iterator it = menus.find(id); + if (it == menus.end()) + return NULL; + MenuDef &d = it->second; + if (key) + { + CommandsList list(*d.def, true); + CommandDef *cmd; + while ((cmd = ++list) != NULL) + { + QKeySequence cmdKey; + if (key & Qt::ALT && (key & ~Qt::MODIFIER_MASK) != Qt::Key_Alt) + { + if (cmd->text.isEmpty()) + continue; + cmdKey = QKeySequence::mnemonic(i18n(cmd->text)); + if((cmdKey & ~Qt::UNICODE_ACCEL) == key) + { + cmd->param = param; + EventCommandExec eCmd(cmd); + if (eCmd.process()) + break; + } + } + if (cmd->accel.isEmpty()) + continue; + cmdKey = QKeySequence::fromString(i18n(cmd->accel)); + if (cmdKey == Key) + { + cmd->param = param; + EventCommandExec eCmd(cmd); + if (eCmd.process()) + break; + } + } + if (cmd == NULL) + return NULL; + } + if (d.menu) + { + d.menu->setParam(param); + return d.menu; + } + QString sName = QString("Menu") + QString::number(id); + d.def->setConfig(CorePlugin::instance()->value(sName.toLatin1().data())); + d.menu = new CMenu(d.def); + d.menu->setParam(param); + return d.menu; +} + +CommandsDef *Commands::getDef(unsigned id) +{ + MENU_MAP::iterator it = menus.find(id); + if (it == menus.end()) + return NULL; + return it->second.def; +} + +bool Commands::processEvent(Event *e) +{ + switch (e->type()) + { +// case eEventPluginsUnload: +// clear(); +// break; + case eEventToolbar: + { + EventToolbar *et = static_cast(e); + switch(et->action()) + { + case EventToolbar::eAdd: + createBar(et->id()); + break; + case EventToolbar::eShow: + et->setToolbar(show(et->id(), et->parent())); + break; + case EventToolbar::eRemove: + removeBar(et->id()); + break; + } + return true; + } + case eEventMenu: + { + EventMenu *em = static_cast(e); + switch(em->action()) + { + case EventMenu::eAdd: + createMenu(em->id()); + break; + case EventMenu::eRemove: + removeMenu(em->id()); + break; + case EventMenu::eCustomize: + customizeMenu(em->id()); + break; + } + return true; + } + case eEventMenuGet: + { + EventMenuGet *egm = static_cast(e); + egm->setMenu(get(egm->def())); + return true; + } + case eEventMenuGetDef: + { + EventMenuGetDef *mgd = static_cast(e); + mgd->setCommandsDef(getDef(mgd->id())); + return true; + } + case eEventMenuProcess: + { + EventMenuProcess *emp = static_cast(e); + emp->setMenu(processMenu(emp->id(), emp->param(), emp->key())); + return true; + } + default: + break; + } + return false; +} + +QObject* Commands::getParent(QObject *o) +{ + return o->parent(); +} + +bool Commands::eventFilter(QObject *o, QEvent *e) +{ + if (e->type() == QEvent::Show && o->inherits("QMenu") && !o->inherits("CMenu") && getParent(o)) + { + unsigned id = 0; + if (getParent(o)->inherits("MainWindow")) + id = ToolBarMain; + else if (getParent(o)->inherits("CToolBar")) + { + CToolBar *bar = static_cast(getParent(o)); + id = bar->m_def->id(); + } + if (id) + { + QMenu *popup = static_cast(o); + popup->addAction(i18n("Customize toolbar..."), this, SLOT(popupActivated())); + cur_id = id; + } + } + return QObject::eventFilter(o, e); +} + +void Commands::popupActivated() +{ + CMDS_MAP::iterator it = bars.find(cur_id); + if (it == bars.end()) + return; + customize(it->second); +} + +void Commands::customize(CommandsDef *def) +{ + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + ToolBarSetup *wnd = NULL; + foreach (w,list) + { + if(!w->inherits("ToolBarSetup")) + continue; + ToolBarSetup *swnd = static_cast(w); + if (swnd->m_def != def) + continue; + wnd = swnd; + break; + } + if (wnd == NULL) + wnd = new ToolBarSetup(this, def); + raiseWindow(wnd); +} + +void Commands::customizeMenu(unsigned long id) +{ + MENU_MAP::iterator it = menus.find(id); + if (it == menus.end()) + return; + MenuDef &d = it->second; + QString sName = QString("Menu") + QString::number(id); + d.def->setConfig(CorePlugin::instance()->value(sName.toLatin1().data())); + customize(d.def); +} + +void Commands::set(CommandsDef *def, const char *str) +{ + if (def->isMenu()) + { + QString sName = QString("Menu") + QString::number(def->id()); + CorePlugin::instance()->setValue(sName.toLatin1().data(), str); + } + else + { + QString sName = QString("Button") + QString::number(def->id()); + CorePlugin::instance()->setValue(sName.toLatin1().data(), str); + EventToolbarChanged(def).process(); + } +} + +// vim: set expandtab: diff --git a/plugins/_core/commands.h b/plugins/_core/commands.h new file mode 100644 index 0000000..e884d7b --- /dev/null +++ b/plugins/_core/commands.h @@ -0,0 +1,71 @@ +/*************************************************************************** + commands.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _COMMANDS_H +#define _COMMANDS_H + +#include +#include + +#include "event.h" + +#include + +class CorePlugin; +class CMenu; + +struct MenuDef +{ + SIM::CommandsDef *def; + CMenu *menu; + void *param; +}; + +typedef std::map CMDS_MAP; +typedef std::map MENU_MAP; + +class Commands : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + Commands(); + ~Commands(); + void set(SIM::CommandsDef*, const char *str); + void clear(); +protected slots: + void popupActivated(); +protected: + bool eventFilter(QObject *o, QEvent *e); + virtual bool processEvent(SIM::Event*); + SIM::CommandsDef *createBar(unsigned id); + void removeBar(unsigned id); + SIM::CommandsDef *createMenu(unsigned id); + void removeMenu(unsigned id); + CToolBar *show(unsigned id, QMainWindow *parent); + CMenu *get(SIM::CommandDef *cmd); + SIM::CommandsDef *getDef(unsigned id); + CMenu *processMenu(unsigned id, void *param, int key); + void customize(SIM::CommandsDef *def); + void customizeMenu(unsigned long id); + QObject* getParent(QObject *o); + unsigned cur_id; + CMDS_MAP bars; + MENU_MAP menus; +}; + +#endif + diff --git a/plugins/_core/connectionsettings.cpp b/plugins/_core/connectionsettings.cpp new file mode 100644 index 0000000..177f814 --- /dev/null +++ b/plugins/_core/connectionsettings.cpp @@ -0,0 +1,55 @@ +/*************************************************************************** + connectionsetting.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "misc.h" +#include "connectionsettings.h" +#include "contacts/client.h" + +#include + +using namespace SIM; + +ConnectionSettings::ConnectionSettings(Client *client) : QDialog(NULL) + //: ConnectionSettingsBase(NULL, NULL, true) +{ + setupUi(this); + SET_WNDPROC("client") + setButtonsPict(this); + m_client = client; + Protocol *protocol = client->protocol(); + const CommandDef *cmd = protocol->description(); + setWindowIcon(Icon(cmd->icon)); + setWindowTitle(i18n("Configure %1 client") .arg(i18n(cmd->text))); + QVBoxLayout *lay = new QVBoxLayout(addWnd); + QWidget *setupWnd = client->setupWnd(); + setupWnd->setParent(addWnd); + setupWnd->move(QPoint()); + lay->addWidget(setupWnd); + setupWnd->show(); +} + +void ConnectionSettings::apply() +{ +} + +/* +#ifndef NO_MOC_INCLUDES +#include "connectionsettings.moc" +#endif +*/ + diff --git a/plugins/_core/connectionsettings.h b/plugins/_core/connectionsettings.h new file mode 100644 index 0000000..48091ac --- /dev/null +++ b/plugins/_core/connectionsettings.h @@ -0,0 +1,36 @@ +/*************************************************************************** + connectionsetting.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _CONNECTIONSETTINGS_H +#define _CONNECTIONSETTINGS_H + +#include "ui_connectionsettingsbase.h" +#include "event.h" + +class ConnectionSettings : public QDialog, public Ui::ConnectionSettingsBase +{ + Q_OBJECT +public: + ConnectionSettings(SIM::Client *client); +protected slots: + void apply(); +protected: + SIM::Client *m_client; +}; + +#endif + diff --git a/plugins/_core/connectionsettingsbase.ui b/plugins/_core/connectionsettingsbase.ui new file mode 100644 index 0000000..efccbc5 --- /dev/null +++ b/plugins/_core/connectionsettingsbase.ui @@ -0,0 +1,121 @@ + + + + + ConnectionSettingsBase + + + + 0 + 0 + 390 + 276 + + + + MyDialog + + + true + + + + 11 + + + 6 + + + + + + + + 0 + + + 6 + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + + + QWidget + QWidget +
QWidget
+ + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
+
+ + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + + + buttonOk + clicked() + MyDialog + accept() + + + buttonCancel + clicked() + MyDialog + reject() + + +
diff --git a/plugins/_core/connectwnd.cpp b/plugins/_core/connectwnd.cpp new file mode 100644 index 0000000..8903dd5 --- /dev/null +++ b/plugins/_core/connectwnd.cpp @@ -0,0 +1,95 @@ +/*************************************************************************** + connectwnd.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" +#include "connectwnd.h" +#include "simgui/linklabel.h" + +#include +#include +#include + +ConnectWnd::ConnectWnd(bool bStart) : QWizardPage(NULL) +{ + setupUi(this); + using SIM::app_file; + m_bStart = bStart; + setConnecting(true); + QMovie movie(app_file("pict/connect.gif")); + if (!movie.isValid()) + movie.setFileName(app_file("pict/connect.mng")); + if (movie.isValid()){ + lblMovie->setMovie(&movie); + connect(this, SIGNAL(updated()), this, SLOT(updateMovie())); + movie.stop(); + movie.start(); + updateMovie(); + } + setConnecting(true); +} + +void ConnectWnd::updateMovie() +{ + lblMovie->repaint(); +} + +void ConnectWnd::setConnecting(bool bState) +{ + lnkPass->hide(); + if (bState){ + lblConnect->show(); + QMovie *pMovie = lblMovie->movie(); + if(pMovie){ + pMovie->start(); + } + lblMovie->show(); + lblComplete->hide(); + lblNext->hide(); + frmError->hide(); + }else{ + lblConnect->hide(); + QMovie *pMovie = lblMovie->movie(); + if(pMovie){ + pMovie->stop(); + } + lblMovie->hide(); + lblComplete->show(); + if (m_bStart){ + lblNext->show(); + }else{ + lblNext->hide(); + } + frmError->hide(); + } +} + +void ConnectWnd::setErr(const QString &text, const QString &url) +{ + lblConnect->hide(); + lblMovie->hide(); + lblComplete->hide(); + lblNext->hide(); + lblError->setText(text); + frmError->show(); + if (!url.isEmpty()){ + lnkPass->setUrl(url); + lnkPass->setText(i18n("Forgot password?")); + lnkPass->show(); + }else{ + lnkPass->hide(); + } +} diff --git a/plugins/_core/connectwnd.h b/plugins/_core/connectwnd.h new file mode 100644 index 0000000..a50a44d --- /dev/null +++ b/plugins/_core/connectwnd.h @@ -0,0 +1,38 @@ +/*************************************************************************** + connectwnd.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _CONNECTWND_H +#define _CONNECTWND_H + +#include +#include "ui_connectwndbase.h" + +class ConnectWnd : public QWizardPage, public Ui::ConnectWndBase +{ + Q_OBJECT +public: + ConnectWnd(bool bStart); + void setConnecting(bool bState); + void setErr(const QString &text, const QString &url); +protected slots: + void updateMovie(); +protected: + bool m_bStart; +}; + +#endif + diff --git a/plugins/_core/connectwndbase.ui b/plugins/_core/connectwndbase.ui new file mode 100644 index 0000000..7fe3f8c --- /dev/null +++ b/plugins/_core/connectwndbase.ui @@ -0,0 +1,195 @@ + + + ConnectWndBase + + + + 0 + 0 + 300 + 268 + + + + + + + Form3 + + + + 11 + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Connecting + + + Qt::AlignCenter + + + false + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + 0 + 0 + + + + + 60 + 60 + + + + + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + Complete + + + Qt::AlignCenter + + + false + + + + + + + If you want to add connection press button " Next". +You can add connection later using connection manager + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + + 11 + + + + + + 75 + true + + + + + + + Qt::AlignCenter + + + true + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + LinkLabel + QWidget +
simgui/linklabel.h
+
+
+ + +
diff --git a/plugins/_core/container.cpp b/plugins/_core/container.cpp new file mode 100644 index 0000000..363514b --- /dev/null +++ b/plugins/_core/container.cpp @@ -0,0 +1,1119 @@ +/*************************************************************************** + container.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "log.h" + +#include "container.h" +#include "userwnd.h" +#include "core.h" +#include "buffer.h" +#include "icons.h" +#include "contacts/contact.h" +#include "contacts/client.h" +#include "simgui/toolbtn.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +const unsigned ACCEL_MESSAGE = 0x1000; + + +class Splitter : public QSplitter +{ +public: + Splitter(QWidget *p) : QSplitter(Qt::Vertical, p) {} +protected: + virtual QSizePolicy sizePolicy() const; +}; + +//FIXME: Obsolete? +//static void copyData(SIM::Data *dest, const SIM::Data *src, unsigned count) +//{ +// for(unsigned i = 0; i < count; i++) +// dest[i] = src[i]; +//} + +ContainerStatus::ContainerStatus(QWidget *parent) + : QStatusBar(parent) +{ + QSize s; + { + QProgressBar p(this); + addWidget(&p); + s = minimumSizeHint(); + } + setMinimumSize(QSize(0, s.height())); +} + +void ContainerStatus::resizeEvent(QResizeEvent *e) +{ + QStatusBar::resizeEvent(e); + emit sizeChanged(width()); +} + +QSizePolicy Splitter::sizePolicy() const +{ + return QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); +} + +static DataDef containerData[] = + { + { "Id" , DATA_ULONG, 1, 0 }, + { "Windows" , DATA_STRING, 1, 0 }, + { "ActiveWindow", DATA_ULONG, 1, 0 }, + { "Geometry" , DATA_LONG, 5, 0 }, + { "BarState" , DATA_LONG, 7, 0 }, + { "StatusSize" , DATA_ULONG, 1, 0 }, + { "WndConfig" , DATA_STRLIST, 1, 0 }, + { NULL , DATA_UNKNOWN, 0, 0 } + }; + +Container::Container(unsigned id, const char *cfg) + : QMainWindow() + , m_bNoRead (false) + , m_bInit (false) + , m_bInSize (false) + , m_bStatusSize (false) + , m_bBarChanged (false) + , m_bReceived (false) + , m_bNoSwitch (false) + , m_avatar_window(this) + , m_avatar_label(&m_avatar_window) + , m_tabBar (NULL) + , m_wnds (NULL) +{ + + + m_avatar_window.setWidget(&m_avatar_label); + //m_avatar_window.setOrientation(Qt::Vertical); + m_avatar_window.setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + m_avatar_window.setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ); + addDockWidget(Qt::LeftDockWidgetArea, &m_avatar_window); + setAttribute(Qt::WA_DeleteOnClose, true); + + setIconSize(QSize(16,16)); + + if(cfg && *cfg) + { + Buffer config; + config << "[Title]\n" << cfg; + config.setWritePos(0); + config.getSection(); + load_data(containerData, &data, &config); + } + else + load_data(containerData, &data, NULL); + + + if (cfg != NULL) + return; + + setId(id); + setContainerGeometry(); +} + +void Container::setContainerGeometry() +{ + + //copyData(data.barState, CorePlugin::instance()->data.ContainerBar, 7); + //copyData(data.geometry, CorePlugin::instance()->data.ContainerGeometry, 5); + if(data.geometry[WIDTH].toLong() == -1 || data.geometry[HEIGHT].toLong() == -1) + { + QWidget *desktop = QApplication::desktop(); + data.geometry[WIDTH].asLong() = desktop->width() / 3; + data.geometry[HEIGHT].asLong() = desktop->height() / 3; + } + if(data.geometry[TOP].toLong() != -1 || data.geometry[LEFT].toLong() != -1) + { + QWidgetList list = QApplication::topLevelWidgets(); + for(int i = 0; i < 2; i++) + { + QWidget *w; + bool bOK = true; + foreach(w,list) + { + if(w == this) + continue; + if(w->inherits("Container")) + { + int dw = w->pos().x() - data.geometry[LEFT].toLong(); + int dh = w->pos().y() - data.geometry[TOP].toLong(); + if (dw < 0) + dw = -dw; + if (dh < 0) + dh = -dh; + if (dw < 3 && dh < 3) + { + long nl = data.geometry[LEFT].toLong(); + long nt = data.geometry[TOP].toLong(); + nl += 21; + nt += 20; + QWidget *desktop = QApplication::desktop(); + if (nl + data.geometry[WIDTH].toLong() > desktop->width()) + nl = 0; + if (nt + data.geometry[WIDTH].toLong() > desktop->width()) + nt = 0; + if (nl != data.geometry[LEFT].toLong() && nt != data.geometry[TOP].toLong()) + { + data.geometry[LEFT].asLong() = nl; + data.geometry[TOP].asLong() = nt; + bOK = false; + } + } + } + } + if (bOK) + break; + } + } + setStatusSize(CorePlugin::instance()->value("ContainerStatusSize").toUInt()); + /* + m_bInSize = true; + ::restoreGeometry(this, data.geometry, bPos, true); + m_bInSize = false; + */ +} +Container::~Container() +{ + if( NULL != m_tabBar ) + { + list wnds = m_tabBar->windows(); + list::iterator it; + for (it = wnds.begin(); it != wnds.end(); ++it) + disconnect(*it, SIGNAL(closed(UserWnd*)), this, SLOT(removeUserWnd(UserWnd*))); + } + list::iterator it; + for (it = m_childs.begin(); it != m_childs.end(); ++it) + delete (*it); + free_data(containerData, &data); +} + +void Container::init() +{ + if (m_bInit) + return; + + frm = new QFrame(this); + setCentralWidget(frm); + + QObject::connect(CorePlugin::instance(), SIGNAL(modeChanged()), this, SLOT(modeChanged())); + + lay = new QVBoxLayout(frm); + m_wnds = new QStackedWidget(frm); + m_wnds->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + lay->addWidget(m_wnds); + + m_tabSplitter = new Splitter(frm); + m_tabSplitter->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum)); + m_tabBar = new UserTabBar(m_tabSplitter); + m_tabBar->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding)); + m_tabBar->hide(); + + m_bInit = true; + + m_status = new ContainerStatus(m_tabSplitter); + lay->addWidget(m_tabSplitter); + connect(m_tabBar, SIGNAL(selected(int)), this, SLOT(contactSelected(int))); + //connect(this, SIGNAL(toolBarPositionChanged(QToolBar*)), this, SLOT(toolbarChanged(QToolBar*))); + connect(m_status, SIGNAL(sizeChanged(int)), this, SLOT(statusChanged(int))); + setupAccel(); + showBar(); + setStatusBar(m_status); + + for (list::iterator it = m_childs.begin(); it != m_childs.end(); ++it) + addUserWnd((*it), false); + + m_childs.clear(); + + QStringList windows = getWindows().split(','); + Q_FOREACH(const QString &win, windows) + { + unsigned long id = win.toULong(); + Contact *contact = getContacts()->contact(id); + if (contact == NULL) + continue; + Buffer config; + QString cfg = getWndConfig(id); + if (!cfg.isEmpty()) + { + config << "[Title]\n" << (const char*)cfg.toLocal8Bit(); + config.setWritePos(0); + config.getSection(); + } + addUserWnd(new UserWnd(id, &config, false, true), true); + } + + if (m_tabBar->count() == 0) + QTimer::singleShot(0, this, SLOT(close())); + setWindows(QString::null); + clearWndConfig(); + m_tabBar->raiseTab(getActiveWindow()); + show(); +} + +QShortcut* Container::makeShortcut(unsigned int key, unsigned int id) +{ + QShortcut* shortcut = new QShortcut(QKeySequence(key), this); + shortcut->setProperty("id", id); + connect(shortcut, SIGNAL(activated()), this, SLOT(accelActivated())); + return shortcut; +} + +void Container::setupAccel() +{ + m_shortcuts.clear(); + m_shortcuts.append(makeShortcut(Qt::Key_1 + Qt::ALT, 1)); + m_shortcuts.append(makeShortcut(Qt::Key_2 + Qt::ALT, 2)); + m_shortcuts.append(makeShortcut(Qt::Key_3 + Qt::ALT, 3)); + m_shortcuts.append(makeShortcut(Qt::Key_4 + Qt::ALT, 4)); + m_shortcuts.append(makeShortcut(Qt::Key_5 + Qt::ALT, 5)); + m_shortcuts.append(makeShortcut(Qt::Key_6 + Qt::ALT, 6)); + m_shortcuts.append(makeShortcut(Qt::Key_7 + Qt::ALT, 7)); + m_shortcuts.append(makeShortcut(Qt::Key_8 + Qt::ALT, 8)); + m_shortcuts.append(makeShortcut(Qt::Key_9 + Qt::ALT, 9)); + m_shortcuts.append(makeShortcut(Qt::Key_0 + Qt::ALT, 10)); + m_shortcuts.append(makeShortcut(Qt::Key_Left + Qt::ALT, 11)); + m_shortcuts.append(makeShortcut(Qt::Key_Right + Qt::ALT, 12)); + m_shortcuts.append(makeShortcut(Qt::Key_Home + Qt::ALT, 13)); + m_shortcuts.append(makeShortcut(Qt::Key_End + Qt::ALT, 14)); + + EventMenuGetDef eMenu(MenuMessage); + eMenu.process(); + CommandsDef *cmdsMsg = eMenu.defs(); + CommandsList it(*cmdsMsg, true); + CommandDef *c; + while ((c = ++it) != NULL) + { + if (c->accel.isEmpty()) + continue; + m_shortcuts.append(makeShortcut(QKeySequence::fromString(c->accel), ACCEL_MESSAGE + c->id)); + } +} + +void Container::setNoSwitch(bool bState) +{ + m_bNoSwitch = bState; +} + +list Container::windows() +{ + return m_tabBar->windows(); +} + +QByteArray Container::getState() +{ + clearWndConfig(); + QString windows; + if (m_tabBar == NULL) + return save_data(containerData, &data); + list userWnds = m_tabBar->windows(); + for(list::iterator it = userWnds.begin(); it != userWnds.end(); ++it) + { + if(!windows.isEmpty()) + windows += ','; + windows += QString::number((*it)->id()); + setWndConfig((*it)->id(), (*it)->getConfig()); + } + setWindows(windows); + UserWnd *userWnd = m_tabBar->currentWnd(); + if(userWnd) + setActiveWindow(userWnd->id()); + ::saveGeometry(this, data.geometry); + saveToolbar(m_bar, data.barState); + if(m_tabBar->isVisible()) + setStatusSize(m_status->width()); + return save_data(containerData, &data); +} + +QString Container::name() +{ + UserWnd *wnd = m_tabBar ? m_tabBar->currentWnd() : 0; + if (wnd) + return wnd->getName(); + return i18n("Container"); +} + +Q_DECLARE_METATYPE( UserWnd* ) + +void Container::addUserWnd(UserWnd *wnd, bool bRaise) +{ + if(m_wnds == NULL) + { + m_childs.push_back(wnd); + if(m_childs.size() == 1) + { + setWindowIcon(Icon(wnd->getIcon())); + setWindowTitle(wnd->getLongName()); + } + return; + } + connect(wnd, SIGNAL(closed(UserWnd*)), this, SLOT(removeUserWnd(UserWnd*))); + connect(wnd, SIGNAL(statusChanged(UserWnd*)), this, SLOT(statusChanged(UserWnd*))); + m_wnds->addWidget(wnd); +// m_tabSplitter->addWidget(m_wnds); + bool bHighlight = false; + for(list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it) + { + if(it->contact == wnd->id()) + { + bHighlight = true; + break; + } + } + + int tab = m_tabBar->addTab(Icon(wnd->getIcon()),wnd->getName()); + m_tabBar->setTabData(tab,QVariant::fromValue(wnd)); + if (bRaise) + m_tabBar->setCurrentIndex(tab); + else + m_tabBar->repaint(); + contactSelected(0); + if ((m_tabBar->count() > 1) && !m_tabBar->isVisible()) + { + m_tabBar->show(); + if (getStatusSize()){ + QList s; + s.append(1); + s.append(getStatusSize()); + m_bStatusSize = true; + m_tabSplitter->setSizes(s); + m_bStatusSize = false; + } + m_tabSplitter->setStretchFactor(m_tabSplitter->indexOf(m_status), 0); + } +} + +void Container::raiseUserWnd(int id/*UserWnd *wnd*/) +{ + if (m_tabBar == NULL) + return; + m_tabBar->raiseTab(id); + contactSelected(0); +} + +void Container::removeUserWnd(UserWnd *wnd) +{ + disconnect(wnd, SIGNAL(closed(UserWnd*)), this, SLOT(removeUserWnd(UserWnd*))); + disconnect(wnd, SIGNAL(statusChanged(UserWnd*)), this, SLOT(statusChanged(UserWnd*))); + m_wnds->removeWidget(wnd); + m_tabBar->removeTab(wnd->id()); + if (m_tabBar->count() == 0) + QTimer::singleShot(0, this, SLOT(close())); + if (m_tabBar->count() == 1) + m_tabBar->hide(); + contactSelected(0); +} + +UserWnd *Container::wnd(unsigned id) +{ + if (m_tabBar == NULL){ + for (list::iterator it = m_childs.begin(); it != m_childs.end(); ++it){ + if ((*it)->id() == id) + return (*it); + } + return NULL; + } + return m_tabBar->wnd(id); +} + +UserWnd *Container::wnd() +{ + if(m_tabBar == NULL) + { + if (m_childs.empty()) + return NULL; + return m_childs.front(); + } + return m_tabBar->currentWnd(); +} + +void Container::showBar() +{ + EventToolbar e(ToolBarContainer, this); + e.process(); + m_bar = e.toolBar(); + m_bBarChanged = true; + restoreToolbar(m_bar, data.barState); + m_bar->show(); + addToolBar(m_bar); + m_bBarChanged = false; + contactSelected(0); + //m_avatar_window.area()->moveDockWindow(&m_avatar_window, 0); +} + +void Container::contactSelected(int) +{ + UserWnd *userWnd = m_tabBar ? m_tabBar->currentWnd() : 0; + if (userWnd == NULL) + return; + m_wnds->setCurrentWidget(userWnd); + userWnd->setFocus(); + m_bar->setParam((void*)userWnd->id()); + Command cmd; + cmd->id = CmdContainerContact; + cmd->text_wrk = userWnd->getName(); + cmd->icon = userWnd->getIcon(); + cmd->param = (void*)(userWnd->id()); + cmd->popup_id = MenuContainerContact; + cmd->flags = BTN_PICT; + EventCommandChange e(cmd); + e.setNoProcess(); + m_bar->processEvent(&e); + setMessageType(userWnd->type()); + setWindowIcon(Icon(cmd->icon)); + setWindowTitle(userWnd->getLongName()); + m_bar->checkState(); + m_status->showMessage(userWnd->status()); + if (isActiveWindow()) + userWnd->markAsRead(); + + if(CorePlugin::instance()->value("ShowAvatarInContainer").toBool()) + { + Client *client = NULL; + unsigned j=0; + QImage img; + while (j < getContacts()->nClients()) + { + client = getContacts()->getClient(j++); + img = client->userPicture(userWnd->id()); + if (!img.isNull()) + break; + } + + if(!img.isNull()) + { + m_avatar_label.setPixmap(QPixmap::fromImage(img)); + if (!m_avatar_label.isVisible()) + m_avatar_window.show(); + } + else + { + m_avatar_label.clear(); + m_avatar_window.hide(); + } + } + else + { + m_avatar_label.clear(); + m_avatar_window.hide(); + } +} + +void Container::setMessageType(unsigned type) +{ + CommandDef *def; + def = CorePlugin::instance()->messageTypes.find(type); + if (def == NULL) + return; + Command cmd; + cmd->id = CmdMessageType; + cmd->text = def->text; + cmd->icon = def->icon; + cmd->bar_id = ToolBarContainer; + cmd->bar_grp = 0x2000; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->popup_id = MenuMessage; + cmd->flags = BTN_PICT; + EventCommandChange eCmd(cmd); + eCmd.setNoProcess(); + m_bar->processEvent(&eCmd); +} + +void Container::resizeEvent(QResizeEvent *e) +{ + QMainWindow::resizeEvent(e); + if (m_bInSize) + return; + ::saveGeometry(this, data.geometry); + //CorePlugin::instance()->data.ContainerGeometry[WIDTH] = data.geometry[WIDTH]; + //CorePlugin::instance()->data.ContainerGeometry[HEIGHT] = data.geometry[HEIGHT]; +} + +void Container::moveEvent(QMoveEvent *e) +{ + QMainWindow::moveEvent(e); + if (m_bInSize) + return; + ::saveGeometry(this, data.geometry); + //CorePlugin::instance()->data.ContainerGeometry[LEFT] = data.geometry[LEFT]; + //CorePlugin::instance()->data.ContainerGeometry[TOP] = data.geometry[TOP]; +} + +void Container::toolbarChanged(QToolBar*) +{ + if (m_bBarChanged) + return; + saveToolbar(m_bar, data.barState); + //copyData(CorePlugin::instance()->data.ContainerBar, data.barState, 7); +} + +void Container::statusChanged(int width) +{ + if (m_tabBar->isVisible() && !m_bStatusSize){ + setStatusSize(width); + CorePlugin::instance()->setValue("ContainerStatusSize", width); + } +} + +void Container::statusChanged(UserWnd *wnd) +{ + if (wnd == m_tabBar->currentWnd()) + m_status->showMessage(wnd->status()); +} + +void Container::accelActivated() +{ + QShortcut* sender = dynamic_cast(QObject::sender()); + unsigned int id = 0; + if(sender) + id = sender->property("id").toUInt(); + if ((unsigned)id >= ACCEL_MESSAGE){ + Command cmd; + cmd->id = id - ACCEL_MESSAGE; + cmd->menu_id = MenuMessage; + cmd->param = (void*)(m_tabBar->currentWnd()->id()); + EventCommandExec(cmd).process(); + return; + } + switch (id){ + case 11: + if (m_tabBar->current() == 0) + m_tabBar->setCurrent(m_tabBar->count() - 1); + else + m_tabBar->setCurrent(m_tabBar->current() - 1); + break; + case 12: + if (m_tabBar->current() == (unsigned)m_tabBar->count() - 1) + m_tabBar->setCurrent(0); + else + m_tabBar->setCurrent(m_tabBar->current() + 1); + break; + case 13: + m_tabBar->setCurrent(0); + break; + case 14: + m_tabBar->setCurrent(m_tabBar->count() - 1); + break; + default: + m_tabBar->setCurrent(id - 1); + } +} + +static const char *accels[] = + { + "Alt+1", + "Alt+2", + "Alt+3", + "Alt+4", + "Alt+5", + "Alt+6", + "Alt+7", + "Alt+8", + "Alt+9", + "Alt+0" + }; + +#if 0 +i18n("male", "%1 is typing") +i18n("female", "%1 is typing") +#endif + +void Container::flash() +{ + QApplication::alert( this ); +} + +bool Container::processEvent(Event *e) +{ + if (m_tabBar == NULL) + return false; + switch (e->type()){ + case eEventMessageReceived: + { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->type() == MessageStatus){ + Contact *contact = getContacts()->contact(msg->contact()); + if (contact) + contactChanged(contact); + return false; + } + if (msg->getFlags() & MESSAGE_NOVIEW) + return false; + if (CorePlugin::instance()->getContainerMode()) + { + if (isActiveWindow() && !isMinimized()) + { + UserWnd *userWnd = m_tabBar->currentWnd(); + if (userWnd && (userWnd->id() == msg->contact())) + userWnd->markAsRead(); + } + else + { + UserWnd *userWnd = wnd(msg->contact()); + if (userWnd) + QTimer::singleShot(0, this, SLOT(flash())); + } + } + // no break here - otherwise we have to duplicate the code below... + } + case eEventMessageRead: + { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + UserWnd *userWnd = wnd(msg->contact()); + if (userWnd){ + bool bHighlight = false; + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + if (it->contact != msg->contact()) + continue; + bHighlight = true; + break; + } + m_tabBar->setHighlighted(msg->contact(), bHighlight); + } + break; + } + case eEventActiveContact: + { + EventActiveContact *eac = static_cast(e); + if (!isActiveWindow()) + return false; + UserWnd *userWnd = m_tabBar->currentWnd(); + if (userWnd) { + eac->setContactID(userWnd->id()); + return true; + } + break; + } + case eEventContact: + { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + UserWnd *userWnd = wnd(contact->id()); + if(!userWnd) + break; + switch(ec->action()) + { + case EventContact::eDeleted: + { + removeUserWnd(userWnd); + break; + } + case EventContact::eChanged: + { + if (contact->getIgnore()){ + removeUserWnd(userWnd); + break; + } + m_tabBar->changeTab(contact->id()); + contactChanged(contact); + break; + } + case EventContact::eStatus: + { + unsigned style = 0; + QSet wrkIcons; + QString statusIcon; + contact->contactInfo(style, statusIcon, &wrkIcons); + bool bTyping = wrkIcons.contains("typing"); + if (userWnd->m_bTyping != bTyping) + { + userWnd->m_bTyping = bTyping; + if (bTyping){ + userWnd->setStatus(g_i18n("%1 is typing", contact) .arg(contact->getName())); + }else{ + userWnd->setStatus(""); + } + userWnd = m_tabBar->currentWnd(); + if (userWnd && (contact->id() == userWnd->id())) + m_status->showMessage(userWnd->status()); + } + } + default: + break; + } + break; + } + case eEventClientsChanged: + setupAccel(); + break; + case eEventContactClient: + { + EventContactClient *ecc = static_cast(e); + contactChanged(ecc->contact()); + break; + } + case eEventInit: + init(); + break; + case eEventCommandExec: + { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + UserWnd *userWnd = m_tabBar->currentWnd(); + if (userWnd && ((unsigned long)(cmd->param) == userWnd->id())){ + if (cmd->menu_id == MenuContainerContact){ + m_tabBar->raiseTab(cmd->id); + return true; + } + if (cmd->id == CmdClose){ + delete userWnd; + return true; + } + if (cmd->id == CmdInfo && cmd->menu_id != MenuContact){ + CommandDef c = *cmd; + c.menu_id = MenuContact; + c.param = (void*)userWnd->id(); + EventCommandExec(&c).process(); + return true; + } + } + break; + } + case eEventCheckCommandState: + { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + UserWnd *userWnd = m_tabBar->currentWnd(); + if (userWnd && ((unsigned long)(cmd->param) == userWnd->id()) && + (cmd->menu_id == MenuContainerContact) && + (cmd->id == CmdContainerContacts)){ + list userWnds = m_tabBar->windows(); + CommandDef *cmds = new CommandDef[userWnds.size() + 1]; + unsigned n = 0; + for (list::iterator it = userWnds.begin(); it != userWnds.end(); ++it){ + cmds[n].id = (*it)->id(); + cmds[n].flags = COMMAND_DEFAULT; + cmds[n].text_wrk = (*it)->getName(); + cmds[n].icon = (*it)->getIcon(); + cmds[n].text = "_"; + cmds[n].menu_id = n + 1; + if (n < sizeof(accels) / sizeof(const char*)) + cmds[n].accel = accels[n]; + if (*it == m_tabBar->currentWnd()) + cmds[n].flags |= COMMAND_CHECKED; + n++; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + break; + } + default: + break; + } + return false; +} + +void Container::modeChanged() +{ + if (isReceived() && CorePlugin::instance()->getContainerMode()) + QTimer::singleShot(0, this, SLOT(close())); + if (CorePlugin::instance()->getContainerMode() == 0){ + list wnds = m_tabBar->windows(); + for (list::iterator it = wnds.begin(); it != wnds.end(); ++it){ + if ((*it) != m_tabBar->currentWnd()) + delete (*it); + } + } +} + +void Container::wndClosed() +{ + list wnds = m_tabBar->windows(); + for (list::iterator it = wnds.begin(); it != wnds.end(); ++it){ + if ((*it)->isClosed()) + delete (*it); + } +} + +bool Container::event(QEvent *e) +{ +#ifdef WIN32 + if (e->type() == QEvent::WindowActivate) + init(); +#endif + if ((e->type() == QEvent::WindowActivate)/* || + (((e->type() == QEvent::ShowNormal) || + (e->type() == QEvent::ShowMaximized)) && isActiveWindow())*/){ + UserWnd *userWnd = m_tabBar->currentWnd(); + if (m_bNoRead) + m_bNoRead = false; + if (userWnd) + userWnd->markAsRead(); + + if (m_bNoSwitch) + m_bNoSwitch = false; + else if ((userWnd == NULL) || !m_tabBar->isHighlighted(m_tabBar->current())) + { + list wnds = m_tabBar->windows(); + for (int i=0; icount();++i) //list::iterator it = wnds.begin(); it != wnds.end(); ++it){ + { + if (m_tabBar->isHighlighted(i)) + { + raiseUserWnd(i); + break; + } + } + } + } + return QMainWindow::event(e); +} + +void Container::contactChanged(Contact *contact) +{ + UserWnd *userWnd = NULL; + if (m_tabBar){ + userWnd = m_tabBar->currentWnd(); + }else if (!m_childs.empty()){ + userWnd = m_childs.front(); + } + if (userWnd && contact && (contact->id() == userWnd->id())){ + Command cmd; + cmd->id = CmdContainerContact; + cmd->text_wrk = userWnd->getName(); + cmd->icon = userWnd->getIcon(); + cmd->param = (void*)(contact->id()); + cmd->popup_id = MenuContainerContact; + cmd->flags = BTN_PICT; + EventCommandChange e(cmd); + m_bar->processEvent(&e); + e.setNoProcess(); + setWindowIcon(Icon(cmd->icon)); + setWindowTitle(userWnd->getLongName()); + } +} + +void Container::setReadMode() +{ + log(L_DEBUG, "Set read mode"); + m_bNoRead = false; +} + +UserTabBar::UserTabBar(QWidget *parent) : QTabBar(parent) +{ + setShape(QTabBar::TriangularSouth); +} + +UserWnd *UserTabBar::wnd(unsigned id) +{ + UserWnd *res = NULL; + for (int t = 0; t < count(); t++) + { + UserWnd *wnd = wndForTab(t); + if (wnd && wnd->id() == id) + { + res = wnd; + break; + } + } + return res; +} + +int UserTabBar::tab(unsigned contactid) +{ + UserWnd *res = NULL; + for (int t = 0; t < count(); t++) + { + UserWnd *wnd = wndForTab(t); + if (wnd && wnd->id() == contactid) + { + res = wnd; + return t; + } + } + return -1; +} + +void UserTabBar::raiseTab(unsigned id) +{ + for (int t = 0; t < count(); t++) + { + UserWnd *wnd = wndForTab(t); + if (wnd && wnd->id() == id) + { + setCurrent(t); + break; + } + } +} + +list UserTabBar::windows() +{ + list res; + for (int i = 0; i < count(); i++) + { + res.push_back(wndForTab(i)); + } + return res; +} + +void UserTabBar::setCurrent(unsigned n) +{ + setCurrentIndex(n); +} + +unsigned UserTabBar::current() +{ + return currentIndex(); +} + +void UserTabBar::slotRepaint() +{ + repaint(); +} + +void UserTabBar::removeTab(unsigned id) +{ + layoutTabs(); + for (int t = 0; t < count(); t++) + { + UserWnd *wnd = wndForTab(t); + if (wnd && wnd->id() == id) + { + QTabBar::removeTab(t); + QTimer::singleShot(0, this, SLOT(slotRepaint())); + break; + } + } +} + +void UserTabBar::changeTab(unsigned id) +{ + layoutTabs(); + for (int t = 0; t < count(); t++) + { + UserWnd *wnd = wndForTab(t); + if (wnd && wnd->id() == id) + { + setTabText(t,wnd->getName()); + QTimer::singleShot(0, this, SLOT(slotRepaint())); + break; + } + } +} + +void UserTabBar::setHighlighted(unsigned contactid, bool bHighlight) //bHighlight +{ + int index = tab(contactid); + if (index == -1) return; //corresponding contact not found + + QColor c; + if (bHighlight) + c = QColor ( 255, 0, 0 ); //red + else + c = QColor ( 0, 0, 0 ); //black + + this->setTabTextColor(index,c); + +// for(std::list::iterator it = m_tabs.begin(); it != m_tabs.end(); ++it) +// { +// UserTab *tab = *it; +// if (tab->wnd()->id() == id) +// { +// repaint(); +// break; +// } +// } +} + +bool UserTabBar::isHighlighted(int id /*UserWnd *wnd*/) +{ +// for(std::list::iterator it = m_tabs.begin(); it != m_tabs.end(); ++it) +// { +// UserTab* tab = *it; +// if (tab->wnd() == wnd) +// return tab->isHighlighted(); +// } + return this->tabTextColor(id)==QColor(255,0,0); +} + +void UserTabBar::resizeEvent(QResizeEvent *e) +{ + QTabBar::resizeEvent(e); + QTimer::singleShot(0, this, SLOT(slotRepaint())); +} + +void UserTabBar::mousePressEvent(QMouseEvent *e) +{ + if (e->button() == Qt::RightButton) + { + int id = tabAt(e->pos()); + if(id == -1) + return; + setCurrentIndex(id); + UserWnd* wnd = wndForTab(id); + if(NULL == wnd) + return; + + EventMenuProcess eMenu(MenuContact, (void*)wnd->id()); + eMenu.process(); + QMenu *menu = eMenu.menu(); + if(menu) + menu->popup(e->globalPos()); + return; + } + QTabBar::mousePressEvent(e); +} + +UserWnd *UserTabBar::currentWnd() +{ + return wndForTab(currentIndex()); +} + +void UserTabBar::layoutTabs() +{ + //QTabBar::layoutTabs(); +} + +UserWnd* UserTabBar::wndForTab(int tab) { + QVariant v = tabData(tab); + if(!v.isValid()) + return NULL; + if(!v.canConvert()) + return NULL; + + return v.value(); +} + diff --git a/plugins/_core/container.h b/plugins/_core/container.h new file mode 100644 index 0000000..6d34659 --- /dev/null +++ b/plugins/_core/container.h @@ -0,0 +1,169 @@ +/*************************************************************************** + container.h - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _CONTAINER_H +#define _CONTAINER_H + +#include "cfg.h" +#include "event.h" +#include "message.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const unsigned NEW_CONTAINER = (unsigned)(-1); +const unsigned GRP_CONTAINER = 0x80000000; + +class UserWnd; +class UserTabBar; +class QSplitter; +class CToolBar; +class QWidgetStack; +class CorePlugin; +class Container; + +struct ContainerData +{ + SIM::Data Id; + SIM::Data Windows; + SIM::Data ActiveWindow; + SIM::Data geometry[5]; + SIM::Data barState[7]; + SIM::Data StatusSize; + SIM::Data WndConfig; +}; + +class ContainerStatus : public QStatusBar +{ + Q_OBJECT +public: + ContainerStatus(QWidget *parent); +signals: + void sizeChanged(int); +protected: + void resizeEvent(QResizeEvent*); +}; + +class UserTabBar : public QTabBar +{ + Q_OBJECT +public: + UserTabBar(QWidget *parent); + void raiseTab(unsigned id); + UserWnd *wnd(unsigned id); + int tab(unsigned contactid); + UserWnd *currentWnd(); + std::list windows(); + void removeTab(unsigned id); + void changeTab(unsigned id); + void setHighlighted(unsigned id, bool bState); + void setCurrent(unsigned i); + unsigned current(); + bool isHighlighted(int /*UserWnd *wnd*/); +public slots: + void slotRepaint(); +protected: + virtual void layoutTabs(); + virtual void mousePressEvent(QMouseEvent *e); + virtual void resizeEvent(QResizeEvent *e); + UserWnd* wndForTab(int tab); +}; + +class Container : public QMainWindow, public SIM::EventReceiver +{ + Q_OBJECT +public: + static const int WndType = QVariant::UserType + 1; + + Container(unsigned id, const char *cfg = NULL); + ~Container(); + QString name(); + UserWnd *wnd(unsigned id); + UserWnd *wnd(); + std::list windows(); + QByteArray getState(); + bool isReceived() { return m_bReceived; } + void setReceived(bool bReceived) { m_bReceived = bReceived; } + void setNoSwitch(bool bState); + void setMessageType(unsigned id); + void contactChanged(SIM::Contact *contact); + PROP_ULONG(Id); + PROP_STR(Windows); + PROP_ULONG(ActiveWindow); + PROP_ULONG(StatusSize); + PROP_STRLIST(WndConfig); + bool m_bNoRead; + void init(); + void setContainerGeometry(); +public slots: + void addUserWnd(UserWnd*, bool bRaise); + void removeUserWnd(UserWnd*); + void raiseUserWnd(int /*UserWnd**/); + void contactSelected(int); + void toolbarChanged(QToolBar*); + void statusChanged(int); + void accelActivated(); + void statusChanged(UserWnd*); + void modeChanged(); + void wndClosed(); + void flash(); + void setReadMode(); +protected: + virtual void resizeEvent(QResizeEvent*); + virtual void moveEvent(QMoveEvent*); + virtual bool event(QEvent*); + virtual bool processEvent(SIM::Event*); + void showBar(); + void setupAccel(); + QShortcut* makeShortcut(unsigned int key, unsigned int id); + ContainerData data; + bool m_bInit; + bool m_bInSize; + bool m_bStatusSize; + bool m_bBarChanged; + bool m_bReceived; + bool m_bNoSwitch; + CToolBar *m_bar; + QDockWidget m_avatar_window; + QLabel m_avatar_label; + QSplitter *m_tabSplitter; + UserTabBar *m_tabBar; + ContainerStatus *m_status; + QStackedWidget *m_wnds; + QList m_shortcuts; + std::list m_childs; + QFrame *frm; + QVBoxLayout *lay; +}; + +#endif + diff --git a/plugins/_core/core.cpp b/plugins/_core/core.cpp new file mode 100644 index 0000000..6963ad3 --- /dev/null +++ b/plugins/_core/core.cpp @@ -0,0 +1,4123 @@ +/*************************************************************************** + core.cpp - description + ------------------- +begin : Sun Mar 17 2002 +copyright : (C) 2002 by Vladimir Shutoff +email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#ifdef WIN32 +#include +#include +#else +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// simlib + +#include "buffer.h" +#include "icons.h" +#include "log.h" +#include "kdeisversion.h" +#include "unquot.h" +#include "xsl.h" + +#include "simgui/textshow.h" +#include "simgui/toolbtn.h" +#include "simgui/ballonmsg.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/group.h" +#include "contacts/client.h" +#include "contacts/protocolmanager.h" +// _core +#include "core.h" +#include "cfgdlg.h" +#include "mainwin.h" +#include "userview.h" +#include "commands.h" +#include "usercfg.h" +#include "interfacecfg.h" +#include "search.h" +#include "logindlg.h" +#include "newprotocol.h" +#include "status.h" +#include "statuswnd.h" +#include "manager.h" +#include "connectionsettings.h" +#include "container.h" +#include "userwnd.h" +#include "msgedit.h" +#include "simgui/fontedit.h" +#include "clientlist.h" +#include "history.h" +#include "historywnd.h" +#include "msgcfg.h" +#include "smscfg.h" +#include "tmpl.h" +#include "autoreply.h" +#include "filetransfer.h" +#include "declinedlg.h" +#include "userhistorycfg.h" +#include "profilemanager.h" + +using namespace std; +using namespace SIM; + +#ifdef WIN32 + +class LockThread : public QThread +{ + public: + LockThread(Qt::HANDLE hEvent); + Qt::HANDLE hEvent; + protected: + void run(); +}; + +#endif + +class FileLock : public QFile +{ + public: + FileLock(const QString &name); + ~FileLock(); + bool lock(bool bSend); + protected: +#ifdef WIN32 + LockThread *m_thread; +#else + bool m_bLock; +#endif +}; + +Plugin *createCorePlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new CorePlugin(base, config); + return plugin; +} + +static PluginInfo info = +{ + I18N_NOOP("Interface"), + I18N_NOOP("System interface"), + VERSION, + createCorePlugin, + PLUGIN_DEFAULT | PLUGIN_NODISABLE | PLUGIN_RELOAD +}; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +#if !defined(WIN32) && !defined(USE_KDE) + +struct loaded_domain; + +struct loaded_l10nfile +{ + const char *filename; + int decided; + const void *data; + loaded_l10nfile() : filename(0), decided(0), data(0) {} +}; + + +void k_nl_load_domain (loaded_l10nfile *domain_file); +void k_nl_unload_domain (loaded_domain *domain); +char *k_nl_find_msg (loaded_l10nfile *domain_file, const char *msgid); + +#endif + +static CorePlugin* g_plugin = 0; + +static QWidget *getInterfaceSetup(QWidget *parent, SIM::PropertyHubPtr data) +{ + return new MessageConfig(parent, data); +} + +static QWidget *getSMSSetup(QWidget *parent, SIM::PropertyHubPtr data) +{ + return new SMSConfig(parent, data); +} + +static QWidget *getHistorySetup(QWidget *parent, SIM::PropertyHubPtr data) +{ + return new UserHistoryCfg(parent, data); +} + +struct autoReply +{ + unsigned status; + const char *text; +}; + +static autoReply autoReplies[] = +{ + { STATUS_AWAY, I18N_NOOP( + "I am currently away from the computer,\n" + "please leave your message and I will get back to you as soon as I return!" + ) }, + { STATUS_NA, I18N_NOOP( + "I am out'a here.\n" + "See you tomorrow!" + ) }, + { STATUS_DND, I18N_NOOP( + "Please do not disturb me now. Disturb me later." + ) }, + { STATUS_OCCUPIED, I18N_NOOP( + "I'm occupied at the moment. Please only urgent messages." + ) }, + { STATUS_FFC, I18N_NOOP( + "We'd love to hear what you have to say. Join our chat." + ) }, + { STATUS_ONLINE, I18N_NOOP( + "I'm here." + ) }, + { STATUS_OFFLINE, I18N_NOOP( + "I'm offline." + ) }, + { 0, NULL } +}; + +CorePlugin::CorePlugin(unsigned base, Buffer* /*config*/) + : QObject() + //, PropertyHub ("_core") + , Plugin (base) + , EventReceiver (HighPriority) + , historyXSL (NULL) + , m_bInit (false) + , m_cfg (NULL) + , m_focus (NULL) + , m_view (NULL) + , m_search (NULL) + , m_translator (NULL) + , m_manager (NULL) + , m_status (NULL) + , m_statusWnd (NULL) + , m_nClients (0) + , m_nClientsMenu (0) + , m_nResourceMenu (0) + , m_main (NULL) + , m_alert (NULL) + , m_lock (NULL) + , m_RegNew (false) + , m_tmpl (new Tmpl(this)) + , m_cmds (new Commands()) + , m_HistoryThread (NULL) + , m_bIgnoreEvents (false) + , m_propertyHub (SIM::PropertyHub::create("_core")) +{ + g_plugin= this; + setValue("StatusTime", QDateTime::currentDateTime().toTime_t()); + + //loadDir(); + boundTypes(); + + EventMenu(MenuFileDecline, EventMenu::eAdd).process(); + EventMenu(MenuMailList, EventMenu::eAdd).process(); + EventMenu(MenuPhoneList, EventMenu::eAdd).process(); + EventMenu(MenuStatusWnd, EventMenu::eAdd).process(); + EventMenu(MenuEncoding, EventMenu::eAdd).process(); + EventMenu(MenuSearchItem, EventMenu::eAdd).process(); + EventMenu(MenuSearchGroups, EventMenu::eAdd).process(); + EventMenu(MenuSearchOptions, EventMenu::eAdd).process(); + + createMainToolbar(); + createHistoryToolbar(); + createContainerToolbar(); + createMsgEditToolbar(); + createTextEditToolbar(); + createMenuMsgView(); + createMenuTextEdit(); + + MsgEdit::setupMessages(); // Make sure this function is called after createContainerToolbar and createMsgEditToolbar + // because setupMessages() adds items to MenuMessage and to ToolBatMsgEdit, witch are + // created by createContainerToolbar and createMsgEditToolbar + // If menu or toolbar were not created, items can't be added, and will be just missing + Command cmd; + + EventMenu(MenuGroup, EventMenu::eAdd).process(); + EventMenu(MenuContact, EventMenu::eAdd).process(); + EventMenu(MenuContactGroup, EventMenu::eAdd).process(); + EventMenu(MenuMsgCommand, EventMenu::eAdd).process(); + + createEventCmds(); +} + +void CorePlugin::createCommand(int id, const QString& text, const QString& icon, int menu_id, + int menu_grp, int bar_id, int bar_grp, int flags, const QString& accel) +{ + Command cmd; + cmd->id = id; + cmd->text = text; + cmd->icon = icon; + cmd->menu_id = menu_id; + cmd->menu_grp = menu_grp; + cmd->bar_id = bar_id; + cmd->bar_grp = bar_grp; + cmd->flags = flags; + cmd->accel = accel; + EventCommandCreate(cmd).process(); +} + +void CorePlugin::createEventCmds() +{ + Command cmd; + createCommand(CmdMsgQuote, I18N_NOOP("&Quote"), QString::null, MenuMsgCommand, 0x1002, + 0, 0, COMMAND_CHECK_STATE, QString::null); + + createCommand(CmdMsgQuote + CmdReceived, I18N_NOOP("&Quote"), QString::null, MenuMsgCommand, 0x1002, + ToolBarMsgEdit, 0x1041, COMMAND_CHECK_STATE | BTN_PICT, QString::null); + + createCommand(CmdMsgForward, I18N_NOOP("&Forward"), QString::null, MenuMsgCommand, 0x1003, + 0, 0, COMMAND_CHECK_STATE, QString::null); + + createCommand(CmdMsgForward + CmdReceived, I18N_NOOP("&Forward"), QString::null, MenuMsgCommand, 0x1003, + ToolBarMsgEdit, 0x1042, COMMAND_CHECK_STATE | BTN_PICT, QString::null); + + createCommand(CmdMsgAnswer, I18N_NOOP("&Answer"), "mail_generic", MenuMsgCommand, 0x1003, + ToolBarMsgEdit, 0x8000, COMMAND_CHECK_STATE | BTN_PICT, QString::null); + + + EventMenu(MenuContainer, EventMenu::eAdd).process(); + + createCommand(0, I18N_NOOP("&Messages"), "message", MenuMsgCommand, 0x1003, 0, 0x8000, COMMAND_CHECK_STATE | BTN_PICT, "_core"); + + cmd->id = 0; + cmd->text = I18N_NOOP("SMS"); + cmd->icon = "cell"; + cmd->icon_on = QString::null; + cmd->param = (void*)getSMSSetup; + cmd->accel = "SMS"; + EventAddPreferences(cmd).process(); + + cmd->id = 0; + cmd->text = I18N_NOOP("&History setup"); + cmd->icon = "history"; + cmd->icon_on = QString::null; + cmd->param = (void*)getHistorySetup; + cmd->accel = "history"; + EventAddPreferences(cmd).process(); + + cmd->id = CmdGrpCreate; + cmd->text = I18N_NOOP("&Create group"); + cmd->icon = "grp_create"; + cmd->icon_on = QString::null; + cmd->menu_id = MenuGroup; + cmd->menu_grp = 0x4000; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGrpRename; + cmd->text = I18N_NOOP("&Rename group"); + cmd->icon = "grp_rename"; + cmd->accel = "F2"; + cmd->menu_grp = 0x4001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGrpDelete; + cmd->text = I18N_NOOP("&Delete group"); + cmd->icon = "remove"; + cmd->accel = "Del"; + cmd->menu_grp = 0x4002; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGrpUp; + cmd->text = I18N_NOOP("Up"); + cmd->icon = "1uparrow"; + cmd->accel = "Ctrl+Up"; + cmd->menu_grp = 0x6000; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGrpDown; + cmd->text = I18N_NOOP("Down"); + cmd->icon = "1downarrow"; + cmd->accel = "Ctrl+Down"; + cmd->menu_grp = 0x6001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGrpTitle; + cmd->text = "_"; + cmd->icon = "grp_on"; + cmd->accel = QString::null; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE | COMMAND_TITLE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdConfigure; + cmd->text = I18N_NOOP("Setup"); + cmd->icon = "configure"; + cmd->menu_grp = 0xB000; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContactTitle; + cmd->text = "_"; + cmd->icon = QString::null; + cmd->accel = QString::null; + cmd->menu_id = MenuContact; + cmd->menu_grp = 0x1000; + cmd->popup_id = 0; + cmd->flags = COMMAND_CHECK_STATE | COMMAND_TITLE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdUnread; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSendMessage; + cmd->menu_grp = 0x2000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdClose; + cmd->text = "&Close"; + cmd->icon = "exit"; + cmd->menu_id = MenuContact; + cmd->menu_grp = 0xF000; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContactGroup; + cmd->text = I18N_NOOP("Group"); + cmd->icon = "grp_on"; + cmd->menu_grp = 0x8000; + cmd->popup_id = MenuContactGroup; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContactRename; + cmd->text = I18N_NOOP("&Rename"); + cmd->icon = QString::null; + cmd->menu_grp = 0x8001; + cmd->popup_id = 0; + cmd->accel = "F2"; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContactDelete; + cmd->text = I18N_NOOP("&Delete"); + cmd->icon = "remove"; + cmd->menu_grp = 0x8002; + cmd->accel = "Del"; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdShowAlways; + cmd->text = I18N_NOOP("Show &always"); + cmd->icon = QString::null; + cmd->menu_grp = 0x8003; + cmd->accel = QString::null; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdFetchAway; + cmd->text = I18N_NOOP("&Fetch away message"); + cmd->icon = "message"; + cmd->menu_grp = 0x8020; + cmd->flags = COMMAND_CHECK_STATE | BTN_HIDE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdInfo; + cmd->text = I18N_NOOP("User &info"); + cmd->icon = "info"; + cmd->menu_grp = 0x7010; + cmd->accel = QString::null; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdHistory; + cmd->text = I18N_NOOP("&History"); + cmd->icon = "history"; + cmd->menu_grp = 0x7020; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdConfigure; + cmd->text = I18N_NOOP("Setup"); + cmd->icon = "configure"; + cmd->menu_grp = 0x7020; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContainer; + cmd->text = I18N_NOOP("To container"); + cmd->icon = QString::null; + cmd->popup_id = MenuContainer; + cmd->menu_grp = 0x8010; + cmd->accel = QString::null; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContainer; + cmd->text = "_"; + cmd->popup_id = 0; + cmd->menu_id = MenuContainer; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContactGroup; + cmd->text = "_"; + cmd->icon = QString::null; + cmd->accel = QString::null; + cmd->menu_id = MenuContactGroup; + cmd->menu_grp = 0x2000; + EventCommandCreate(cmd).process(); + + cmd->id = CmdDeclineWithoutReason; + cmd->text = I18N_NOOP("Decline file without reason"); + cmd->icon = QString::null; + cmd->menu_id = MenuFileDecline; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdDeclineReasonBusy; + cmd->text = I18N_NOOP("Sorry, I'm busy right now, and can not respond to your request"); + cmd->menu_grp = 0x1001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdDeclineReasonLater; + cmd->text = I18N_NOOP("Sorry, I'm busy right now, but I'll be able to respond to you later"); + cmd->menu_grp = 0x1002; + EventCommandCreate(cmd).process(); + + cmd->id = CmdDeclineReasonInput; + cmd->text = I18N_NOOP("Enter a decline reason"); + cmd->menu_grp = 0x1004; + EventCommandCreate(cmd).process(); + + cmd->id = CmdEditList; + cmd->text = I18N_NOOP("&Edit"); + cmd->icon = "mail_generic"; + cmd->menu_id = MenuMailList; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdRemoveList; + cmd->text = I18N_NOOP("&Delete"); + cmd->icon = "remove"; + cmd->menu_grp = 0x1001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdEditList; + cmd->text = I18N_NOOP("&Edit"); + cmd->icon = "phone"; + cmd->menu_id = MenuPhoneList; + cmd->menu_grp = 0x1000; + EventCommandCreate(cmd).process(); + + cmd->id = CmdRemoveList; + cmd->text = I18N_NOOP("&Delete"); + cmd->icon = "remove"; + cmd->menu_grp = 0x1001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdStatusWnd; + cmd->text = "_"; + cmd->icon = QString::null; + cmd->menu_id = MenuStatusWnd; + EventCommandCreate(cmd).process(); + + cmd->id = CmdChangeEncoding; + cmd->text = "_"; + cmd->menu_id = MenuEncoding; + cmd->menu_grp = 0x1000; + EventCommandCreate(cmd).process(); + + cmd->id = CmdAllEncodings; + cmd->text = I18N_NOOP("&Show all encodings"); + cmd->menu_id = MenuEncoding; + cmd->menu_grp = 0x8000; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContactGroup; + cmd->text = I18N_NOOP("Add to &group"); + cmd->icon = QString::null; + cmd->menu_id = MenuSearchItem; + cmd->menu_grp = 0x2000; + cmd->bar_id = 0; + cmd->bar_grp = 0; + cmd->popup_id = MenuSearchGroups; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSearchOptions; + cmd->text = "_"; + cmd->icon = QString::null; + cmd->menu_id = MenuSearchItem; + cmd->menu_grp = 0x3000; + cmd->popup_id = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSearchInfo; + cmd->text = I18N_NOOP("&Info"); + cmd->icon = "info"; + cmd->menu_id = MenuSearchOptions; + cmd->menu_grp = 0x3000; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSearchMsg; + cmd->text = I18N_NOOP("Send &message"); + cmd->icon = "message"; + cmd->menu_id = MenuSearchOptions; + cmd->menu_grp = 0x3001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContactGroup; + cmd->text = "_"; + cmd->flags = COMMAND_CHECK_STATE; + cmd->menu_id = MenuSearchGroups; + cmd->menu_grp = 0x1000; + EventCommandCreate(cmd).process(); +} + +void CorePlugin::initData() +{ + delete historyXSL; + + historyXSL = new XSL(value("HistoryStyle").toString()); + if (value("EditBackground").toUInt() == 0 && value("EditForeground").toUInt() == 0) + { + QPalette pal = QApplication::palette(); + setValue("EditBackground", pal.color(QPalette::Base).rgb() & 0xFFFFFF); + setValue("EditForeground", pal.color(QPalette::Text).rgb() & 0xFFFFFF); + } + editFont = FontEdit::str2font(value("EditFont").toString(), QApplication::font()); + setAutoReplies(); +} + +void CorePlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr CorePlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant CorePlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void CorePlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} + +void CorePlugin::setAutoReplies() +{ + SIM::PropertyHubPtr data = getContacts()->getUserData("AR"); + for (autoReply *a = autoReplies; a->text; a++) + { + const QString &t = data->stringMapValue("AutoReply", a->status); + if (!t.isEmpty()) + continue; + + data->setStringMapValue("AutoReply", a->status, i18n(a->text)); + } +} + +CorePlugin::~CorePlugin() +{ + prepareConfig(); + //PropertyHub::save(); + destroy(); + delete m_lock; + delete m_cmds; + delete m_tmpl; + delete m_status; + delete historyXSL; + delete m_HistoryThread; + + removeTranslator(); +} + +QString CorePlugin::tsFile(const QString &lang) +{ +#if defined( WIN32 ) || defined( __OS2__ ) + // lang is ascii, so this works fine + QString s = "ts\\" + lang.toLower() + ".qm"; + QFile f(app_file(s)); + if (!f.exists()) + return QString(); +#else + QString s = PREFIX "/share/locale/"; + QString l = lang; + int idx = l.indexOf('.'); + if(idx != -1) + l = l.left(idx); + s += l; + s += "/LC_MESSAGES/sim.mo"; + QFile f(s); + if (!f.exists()) + { + QString l = lang; + int idx = l.indexOf('_'); + if(idx != -1) + l = l.left(idx); + + s = PREFIX "/share/locale/"; + s += l; + s += "/LC_MESSAGES/sim.mo"; + f.setFileName(s); + if (!f.exists()) + return QString(); + } +#endif + return f.fileName(); +} + +void CorePlugin::installTranslator() +{ + m_translator = NULL; + QString lang = value("Lang").toString(); + if (lang == "-") + return; + if (lang.isEmpty()) + { +#ifdef WIN32 + char buff[256]; + int res = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, buff, sizeof(buff)); + if (res){ + lang += (char)tolower(buff[0]); + lang += (char)tolower(buff[1]); + } +#else + #ifdef USE_KDE + return; + #else + char *p = getenv("LANG"); + if (p) + { + for (; *p; p++) + { + if (*p == '.') break; + lang += *p; + } + } + #endif +#endif + } + QString ts = tsFile(lang); + if (ts.isEmpty()) + return; + /* +#if !defined(WIN32) && !defined(USE_KDE) +m_translator = new SIMTranslator(NULL, po); +#else +*/ + m_translator = new QTranslator(NULL); + m_translator->load(ts); + //#endif + qApp->installTranslator(m_translator); +#if !defined(WIN32) && !defined(USE_KDE) + resetPlural(); +#endif + EventLanguageChanged e(m_translator); + e.process(); +} + +void CorePlugin::removeTranslator() +{ + if (m_translator) + { + qApp->removeTranslator(m_translator); + delete m_translator; + m_translator = NULL; +#if !defined(WIN32) && !defined(USE_KDE) + resetPlural(); +#endif + EventLanguageChanged e(NULL); + e.process(); + } +} + +struct msgIndex +{ + unsigned contact; + unsigned type; +}; + +struct msgCount +{ + unsigned count; + unsigned index; +}; + +bool operator < (const msgIndex &a, const msgIndex &b) +{ + if (a.contact < b.contact) + return true; + if (a.contact > b.contact) + return false; + return a.type < b.type; +} + + +Client* CorePlugin::getClient(unsigned i) +{ + return getContacts()->getClient(i); +} + +typedef map MAP_COUNT; + +void CorePlugin::getWays(vector &ways, Contact *contact) +{ + clientData *data; + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL) + { + clientData *data1; + ClientDataIterator it1(contact->clientData); + bool bOK = true; + while ((data1 = ++it1) != NULL) + { + if (data1 == data) + break; + if (data->Sign.toULong() != data1->Sign.toULong()) + continue; + if (it.client()->compareData(data, data1)) + { + bOK = false; + break; + } + } + if (!bOK) + continue; + clientContact c; + c.client = it.client(); + c.data = data; + c.bNew = false; + ways.push_back(c); + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Contact *clContact; + clientData *data2 = data; + if (getClient(i) == it.client() || !getClient(i)->isMyData(data2, clContact) || clContact != contact) + continue; + + clientContact c; + c.client = getClient(i); + c.data = data2; + c.bNew = false; + ways.push_back(c); + } + } +} + +void CorePlugin::changeClientStatus(SIM::Client* client, const SIM::IMStatusPtr& status) +{ + if (status->hasText()) { + bool noShow = propertyHub()->value("NoShowAutoReply" + status->id()).toBool(); + if (!noShow) { + AutoReplyDialog dlg(status); + if (!dlg.exec()) + return; + } + } + client->changeStatus(status); +} + +static const char *helpList[] = +{ + "&IP;", + I18N_NOOP("ip-address"), + "&Mail;", + I18N_NOOP("e-mail"), + "&Phone;", + I18N_NOOP("phone"), + "&Nick;", + I18N_NOOP("contact nick"), + "&Unread;", + I18N_NOOP("number of unread messages from this contact"), + "&Status;", + I18N_NOOP("contact status"), + "&TimeStatus;", + I18N_NOOP("time of set status"), + "&IntervalStatus;", + I18N_NOOP("time from set status"), + NULL, +}; + +#if 0 +I18N_NOOP("male", "%1 wrote:" ) +I18N_NOOP("female", "%1 wrote:" ) +#endif + +bool CorePlugin::processEventIconChanged() +{ + QStringList smiles; + getIcons()->getSmiles(smiles); + unsigned flags = 0; + QString smile_icon; + if (smiles.empty()) + flags = BTN_HIDE; + else + smile_icon = smiles.front(); + Command cmd; + cmd->id = CmdSmile; + cmd->text = I18N_NOOP("I&nsert smile"); + cmd->icon = smile_icon; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x7000; + cmd->flags = COMMAND_CHECK_STATE | flags; + EventCommandChange(cmd).process(); + return false; +} + +bool CorePlugin::processEventJoinAlert() +{ + if (!value("NoJoinAlert").toBool() && (m_alert == NULL)) + { + Command cmd; + cmd->id = CmdStatusBar; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *widget = eWidget.widget(); + if (widget == NULL) + return true; + raiseWindow(widget->topLevelWidget()); + QStringList l; + l.append(i18n("OK")); + m_alert = new BalloonMsg(NULL, + quoteString( + i18n("At loading contact list contacts with identical names were automatically joined.\n" + "If it is wrong, you can separate them. " + "For this purpose in contact menu choose the necessary name and choose a command \"Separate\".")), + l, widget, NULL, false, true, 150, i18n("Don't show this message in next time")); + connect(m_alert, SIGNAL(finished()), this, SLOT(alertFinished())); + } + return true; +} + +bool CorePlugin::processEventGroup(Event* e) +{ + EventGroup *ev = static_cast(e); + if (ev->action() != EventGroup::eChanged) + return false; + if (m_bIgnoreEvents) + return true; + return false; +} + +bool CorePlugin::processEventDeleteMessage(SIM::Event* e) +{ + EventMessage *em = static_cast(e); + History::del(em->msg()); + return true; +} + +bool CorePlugin::processEventRewriteMessage(SIM::Event* e) +{ + EventMessage *em = static_cast(e); + History::rewrite(em->msg()); + return false; +} + +bool CorePlugin::processEventTmplHelp(SIM::Event* e) +{ + EventTmplHelp *eth = static_cast(e); + QString str = eth->help(); + for (const char **p = helpList; *p;) + { + str += *(p++); + str += " - "; + str += i18n(*(p++)); + str += '\n'; + } + str += '\n'; + str += i18n("`` - call and substitute command output\n"); + eth->setHelp(str); + return true; +} + +bool CorePlugin::processEventTmplHelpList(SIM::Event* e) +{ + EventTmplHelpList *ethl = static_cast(e); + ethl->setHelpList(helpList); + return true; +} + +bool CorePlugin::processEventARRequest(SIM::Event* e) +{ + EventARRequest *ear = static_cast(e); + ARRequest *r = ear->request(); + SIM::PropertyHubPtr ar; + QString tmpl; + if (r->contact) { + ar = r->contact->getUserData()->getUserData("AR"); + if (ar) + tmpl = ar->stringMapValue("AutoReply", r->status); + if (tmpl.isEmpty()) { + ar.clear(); + Group *grp = getContacts()->group(r->contact->getGroup()); + if (grp) + ar = r->contact->getUserData()->getUserData("AR"); + if (ar) + tmpl = ar->stringMapValue("AutoReply", r->status); + } + } + if (tmpl.isEmpty()) { + ar = getContacts()->getUserData("AR"); + tmpl = ar->stringMapValue("AutoReply", r->status); + if (tmpl.isEmpty()) + tmpl = ar->stringMapValue("AutoReply", STATUS_AWAY); + } + EventTemplate::TemplateExpand t; + t.contact = r->contact; + t.param = r->param; + t.receiver = r->receiver; + t.tmpl = tmpl; + EventTemplateExpand(&t).process(); + return true; +} + +bool CorePlugin::processEventSaveState(SIM::Event* e) +{ + SIM::PropertyHubPtr ar = getContacts()->getUserData("AR"); + for (autoReply *a = autoReplies; a->text; a++) + { + QString t = ar->stringMapValue("AutoReply", a->status); + if (t == i18n(a->text)) + ar->setStringMapValue("AutoReply", a->status, QString::null); + } + e->process(this); + setAutoReplies(); + return true; +} + +bool CorePlugin::processEventPluginChanged(SIM::Event* e) +{ + EventPluginChanged *p = static_cast(e); + if (p->pluginName() == "_core") + { + QString profile = ProfileManager::instance()->currentProfileName(); + setValue("StatusTime", (unsigned int)QDateTime::currentDateTime().toTime_t()); + removeTranslator(); + installTranslator(); + initData(); + EventUpdateCommandState(CmdOnline).process(); + } + return false; +} + +bool CorePlugin::processEventInit(SIM::Event* e) +{ + EventInit *i = static_cast(e); + if (!m_bInit && !init(true)) { + i->setAbortLoading(); + return true; + } + QTimer::singleShot(0, this, SLOT(checkHistory())); + QTimer::singleShot(0, this, SLOT(postInit())); + return false; +} + +bool CorePlugin::processEventHomeDir(SIM::Event* e) +{ + EventHomeDir *homedir = static_cast(e); + QString fname = homedir->homeDir(); + QString profile; + if(QDir(fname).isRelative()) + profile = ProfileManager::instance()->currentProfileName(); + if (profile.length()) + profile += '/'; + profile += fname; + homedir->setHomeDir(profile); + // dunno know if this is correct... :( + EventHomeDir eProfile(homedir->homeDir()); + if (!eProfile.process(this)) + homedir->setHomeDir(app_file(homedir->homeDir())); + else + homedir->setHomeDir(eProfile.homeDir()); + makedir(homedir->homeDir()); + return true; +} + +bool CorePlugin::processEventGetProfile(SIM::Event* e) +{ + EventGetProfile *e_get_profile = static_cast(e); + e_get_profile->setProfileValue(ProfileManager::instance()->currentProfileName()); + return true; +} + +bool CorePlugin::processEventAddPreferences(SIM::Event* e) +{ + EventAddPreferences *ap = static_cast(e); + CommandDef *cmd = ap->def(); + cmd->menu_id = MenuGroup; + EventCommandCreate(cmd).process(); + cmd->menu_id = MenuContact; + EventCommandCreate(cmd).process(); + preferences.add(cmd); + return true; +} + +bool CorePlugin::processEventRemovePreferences(SIM::Event* e) +{ + EventRemovePreferences *rm = static_cast(e); + unsigned long id = rm->id(); + EventCommandRemove(id).process(); + preferences.erase(id); + return true; +} + +bool CorePlugin::processEventClientChanged(SIM::Event* e) +{ + if(e->type() == eEventClientsChanged) + { + if (m_bInit) + loadMenu(); + } + if (getContacts()->nClients()){ + unsigned i; + for (i = 0; i < getContacts()->nClients(); i++) + if (getContacts()->getClient(i)->getCommonStatus()) + break; + if (i >= getContacts()->nClients()){ + Client *client = getContacts()->getClient(0); + //setManualStatus(client->getManualStatus()); + client->setCommonStatus(true); + EventClientChanged(client).process(); + } + } + return false; +} + +bool CorePlugin::processEventCreateMessageType(SIM::Event* e) +{ + EventCreateMessageType *ecmt = static_cast(e); + CommandDef *cmd = ecmt->def(); + if (cmd->menu_grp){ + cmd->menu_id = MenuMessage; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + } + if (cmd->param){ + MessageDef *mdef = (MessageDef*)(cmd->param); + if (mdef->cmdReceived){ + for (const CommandDef *c = mdef->cmdReceived; !c->text.isEmpty(); c++){ + CommandDef cmd = *c; + if(cmd.icon.isEmpty()){ + cmd.icon = "empty"; + cmd.flags |= BTN_PICT; + } + cmd.id += CmdReceived; + cmd.menu_id = 0; + cmd.menu_grp = 0; + cmd.flags |= COMMAND_CHECK_STATE; + EventCommandCreate(&cmd).process(); + } + } + if (mdef->cmdSent){ + for (const CommandDef *c = mdef->cmdSent; !c->text.isEmpty(); c++){ + CommandDef cmd = *c; + if(cmd.icon.isEmpty()){ + cmd.icon = "empty"; + cmd.flags |= BTN_PICT; + } + cmd.id += CmdReceived; + cmd.menu_id = 0; + cmd.menu_grp = 0; + cmd.flags |= COMMAND_CHECK_STATE; + EventCommandCreate(&cmd).process(); + } + } + } + messageTypes.add(cmd); + QString name = typeName(cmd->text); + MAP_TYPES::iterator itt = types.find(name); + if (itt == types.end()){ + types.insert(MAP_TYPES::value_type(name, cmd->id)); + }else{ + (*itt).second = cmd->id; + } + return true; +} + +bool CorePlugin::processEventRemoveMessageType(SIM::Event* e) +{ + EventRemoveMessageType *ermt = static_cast(e); + unsigned long id = ermt->id(); + CommandDef *def; + def = CorePlugin::instance()->messageTypes.find(id); + if (def){ + MessageDef *mdef = (MessageDef*)(def->param); + if (mdef->cmdReceived){ + for (const CommandDef *c = mdef->cmdReceived; !c->text.isEmpty(); c++){ + EventCommandRemove(c->id + CmdReceived).process(); + } + } + if (mdef->cmdSent){ + for (const CommandDef *c = mdef->cmdSent; !c->text.isEmpty(); c++){ + EventCommandRemove(c->id + CmdReceived).process(); + } + } + } + for (MAP_TYPES::iterator itt = types.begin(); itt != types.end(); ++itt){ + if ((*itt).second == id){ + types.erase(itt); + break; + } + } + EventCommandRemove(id).process(); + messageTypes.erase(id); + return true; +} + +bool CorePlugin::processEventContact(SIM::Event* e) +{ + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + switch(ec->action()) { + case EventContact::eDeleted: + clearUnread(contact->id()); + History::remove(contact); + break; + case EventContact::eChanged: + if (m_bIgnoreEvents) + return true; + if (contact->getIgnore()) + clearUnread(contact->id()); + break; + case EventContact::eOnline: + { + SIM::PropertyHubPtr data = contact->getUserData("_core"); + if (!data.isNull() && data->value("OpenOnOnline").toBool()){ + Message *msg = new Message(MessageGeneric); + msg->setContact(contact->id()); + EventOpenMessage(msg).process(); + delete msg; // wasn't here before event changes... + } + break; + } + default: + break; + } + return false; +} + +bool CorePlugin::processEventMessageAcked(SIM::Event* e) +{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->baseType() == MessageFile){ + QWidget *w = new FileTransferDlg(static_cast(msg)); + raiseWindow(w); + } + return false; +} + +bool CorePlugin::processEventMessageDeleted(SIM::Event* e) +{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + History::del(msg->id()); + for (list::iterator it = unread.begin(); it != unread.end(); ++it){ + msg_id &m = *it; + if (m.id == msg->id()){ + unread.erase(it); + break; + } + } + return false; +} + +bool CorePlugin::processEventMessageReceived(SIM::Event* e) +{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + Contact *contact = getContacts()->contact(msg->contact()); + if (contact){ + if (msg->getTime() == 0){ + msg->setTime(QDateTime::currentDateTime().toTime_t()); + } + unsigned type = msg->baseType(); + if (type == MessageStatus){ + SIM::PropertyHubPtr data = contact->getUserData("_core"); + if ((data.isNull()) || !data->value("LogStatus").toBool()) + return false; + }else if (type == MessageFile){ + SIM::PropertyHubPtr data = contact->getUserData("_core"); + if(!data.isNull()){ + if (data->value("AcceptMode").toUInt() == 1){ + QString dir = data->value("IncomingPath").toString(); + if (!dir.isEmpty() && !dir.endsWith("/") && !dir.endsWith("\\")) + dir += '/'; + dir = user_file(dir); + EventMessageAccept(msg, dir, + data->value("OverwriteFiles").toBool() ? + Replace : Ask).process(); + return msg; + } + if (data->value("AcceptMode").toUInt() == 2){ + EventMessageDecline(msg, data->value("DeclineMessage").toString()).process(); + return msg; + } + } + }else{ + contact->setLastActive(QDateTime::currentDateTime().toTime_t()); + EventContact(contact, EventContact::eStatus).process(); + } + } + return processEventSent(e); +} + +bool CorePlugin::processEventSent(SIM::Event* e) +{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + CommandDef *def = messageTypes.find(msg->type()); + if (def){ + History::add(msg, typeName(def->text)); + if ((e->type() == eEventMessageReceived) && (msg->type() != MessageStatus)){ + msg_id m; + m.id = msg->id(); + m.contact = msg->contact(); + m.client = msg->client(); + m.type = msg->baseType(); + unread.push_back(m); + if (msg->getFlags() & MESSAGE_NOVIEW) + return false; + Contact *contact = getContacts()->contact(msg->contact()); + if (contact && (contact->getFlags() & CONTACT_TEMPORARY)){ + contact->setFlags(contact->getFlags() & ~CONTACT_TEMPORARY); + EventContact(contact, EventContact::eChanged).process(); + } + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("_core"); + if (!data.isNull() && data->value("OpenNewMessage").toUInt()){ + if (data->value("OpenNewMessage").toUInt() == NEW_MSG_MINIMIZE) + msg->setFlags(msg->getFlags() | MESSAGE_NORAISE); + EventOpenMessage(msg).process(); + } + } + } + } + else + { + log(L_WARN,"No CommandDef for message %u found!",msg->type()); + } + return false; +} + +bool CorePlugin::processEventDefaultAction(SIM::Event* e) +{ + EventDefaultAction *eda = static_cast(e); + unsigned long contact_id = eda->id(); + unsigned index = 0; + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it, index++){ + if (it->contact != contact_id) + continue; + Command cmd; + cmd->id = CmdUnread + index; + cmd->menu_id = MenuMain; + return EventCommandExec(cmd).process(); + } + EventMenuGetDef eMenu(MenuMessage); + eMenu.process(); + CommandsDef *cmdsMsg = eMenu.defs(); + CommandsList itc(*cmdsMsg, true); + CommandDef *c; + while ((c = ++itc) != NULL){ + c->param = (void*)(contact_id); + if(EventCheckCommandState(c).process()) { + return EventCommandExec(c).process(); + } + } + return false; +} + +bool CorePlugin::processEventLoadMessage(SIM::Event* e) +{ + EventLoadMessage *elm = static_cast(e); + Message *msg = History::load(elm->id(), elm->client(), elm->contact()); + elm->setMessage(msg); + return true; +} + +bool CorePlugin::processEventOpenMessage(SIM::Event* e) +{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->getFlags() & MESSAGE_NOVIEW) + return false; + Contact *contact = getContacts()->contact(msg->contact()); + m_focus = qApp->focusWidget(); + if (m_focus) + connect(m_focus, SIGNAL(destroyed()), this, SLOT(focusDestroyed())); + if (contact == NULL) + return false; + UserWnd *userWnd = NULL; + Container *container = NULL; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + bool bNew = false; + log(L_DEBUG, "contactID: %ld", contact->id()); + foreach (w,list) + { + if (w->inherits("Container")) + { + log(L_DEBUG, "ContainerFound"); + container = static_cast(w); + if(getContainerMode() == 0) + { + log(L_DEBUG, "Mode0"); + if(container->isReceived() != ((msg->getFlags() & MESSAGE_RECEIVED) != 0)) + { + container = NULL; + continue; + } + } + userWnd = container->wnd(contact->id()); + if (userWnd) + { + log(L_DEBUG, "found"); + break; + } + container = NULL; + } + } + if(userWnd == NULL) + { + log(L_DEBUG, "notfound"); + if (contact->getFlags() & CONTACT_TEMP) + { + contact->setFlags(contact->getFlags() & ~CONTACT_TEMP); + EventContact(contact, EventContact::eChanged).process(); + } + userWnd = new UserWnd(contact->id(), NULL, msg->getFlags() & MESSAGE_RECEIVED, msg->getFlags() & MESSAGE_RECEIVED); + if(getContainerMode() == 3) + { + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach (w,list) + { + if (w->inherits("Container")){ + container = static_cast(w); + break; + } + } + if (container == NULL){ + container = new Container(1); + bNew = true; + } + } + else if (getContainerMode() == 2) + { + unsigned id = contact->getGroup() + CONTAINER_GRP; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach (w,list) + { + if(w->inherits("Container")) + { + container = static_cast(w); + if (container->getId() == id) + break; + container = NULL; + } + } + if(container == NULL) + { + container = new Container(id); + bNew = true; + } + } + else + { + unsigned max_id = 0; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach (w,list) + { + if (w->inherits("Container")) + { + container = static_cast(w); + if(!(container->getId() & CONTAINER_GRP)) + { + if(max_id < container->getId()) + max_id = container->getId(); + } + } + } + container = new Container(max_id + 1); + bNew = true; + if (getContainerMode() == 0) + container->setReceived(msg->getFlags() & MESSAGE_RECEIVED); + } + container->addUserWnd(userWnd, (msg->getFlags() & MESSAGE_NORAISE) == 0); + } + else + { + if ((msg->getFlags() & MESSAGE_NORAISE) == 0) + container->raiseUserWnd(userWnd->id()); + } + container->setNoSwitch(true); + userWnd->setMessage(msg); + if (msg->getFlags() & MESSAGE_NORAISE){ + if (bNew){ + container->m_bNoRead = true; +#ifdef WIN32 + ShowWindow(container->winId(), SW_SHOWMINNOACTIVE); +#else + container->init(); + container->showMinimized(); +#endif + } + if (m_focus) + m_focus->setFocus(); + }else{ + container->init(); + container->show(); + raiseWindow(container); + } + container->setNoSwitch(false); + if (m_focus) + disconnect(m_focus, SIGNAL(destroyed()), this, SLOT(focusDestroyed())); + m_focus = NULL; + return true; +} + +bool CorePlugin::processCheckCmdChangeEncoding(SIM::CommandDef* cmd) +{ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + QTextCodec *codec = getContacts()->getCodec(contact); + unsigned nEncoding = 3; + QStringList main; + QStringList nomain; + QStringList::Iterator it; + const ENCODING *enc; + for (enc = getContacts()->getEncodings(); enc->language; enc++){ + if (enc->bMain){ + main.append(i18n(enc->language) + " (" + enc->codec + ')'); + nEncoding++; + continue; + } + if (!value("ShowAllEncodings").toBool()) + continue; + nomain.append(i18n(enc->language) + " (" + enc->codec + ')'); + nEncoding++; + } + CommandDef *cmds = new CommandDef[nEncoding]; + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + nEncoding = 0; + cmds[nEncoding].id = 1; + cmds[nEncoding].text = I18N_NOOP("System"); + if (!strcmp(codec->name(), "System")) + cmds[nEncoding].flags = COMMAND_CHECKED; + nEncoding++; + main.sort(); + for (it = main.begin(); it != main.end(); ++it){ + QString str = *it; + int n = str.indexOf('('); + str = str.mid(n + 1); + n = str.indexOf(')'); + str = str.left(n); + if (str == codec->name()) + cmds[nEncoding].flags = COMMAND_CHECKED; + cmds[nEncoding].id = nEncoding + 1; + cmds[nEncoding].text = "_"; + cmds[nEncoding].text_wrk = (*it); + nEncoding++; + } + if (!value("ShowAllEncodings").toBool()) + return true; + cmds[nEncoding++].text = "_"; + nomain.sort(); + for (it = nomain.begin(); it != nomain.end(); ++it){ + QString str = *it; + int n = str.indexOf('('); + str = str.mid(n + 1); + n = str.indexOf(')'); + str = str.left(n); + if (str == codec->name()) + cmds[nEncoding].flags = COMMAND_CHECKED; + cmds[nEncoding].id = nEncoding; + cmds[nEncoding].text = "_"; + cmds[nEncoding].text_wrk = (*it); + nEncoding++; + } + return true; +} + +bool CorePlugin::processCheckCmdAllEncodings(SIM::CommandDef* cmd) +{ + cmd->flags &= ~COMMAND_CHECKED; + if (value("ShowAllEncodings").toBool()) + cmd->flags |= COMMAND_CHECKED; + return true; +} + +bool CorePlugin::processCheckCmdEnableSpell(SIM::CommandDef* cmd) +{ + cmd->flags &= ~COMMAND_CHECKED; + if (value("EnableSpell").toBool()) + cmd->flags |= COMMAND_CHECKED; + return true; +} + +bool CorePlugin::processCheckCmdSendClose(SIM::CommandDef* cmd) +{ + cmd->flags &= ~COMMAND_CHECKED; + if (value("CloseSend").toBool()) + cmd->flags |= COMMAND_CHECKED; + return false; +} + +bool CorePlugin::processCheckCmdContactClients(SIM::CommandDef* cmd) +{ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + vector ways; + getWays(ways, contact); + if (cmd->menu_id == MenuMessage){ + unsigned n = ways.size(); + if (n < 1) + return false; + if (n == 1){ + QString resources = ways[0].client->resources(ways[0].data); + if (resources.isEmpty()) + return false; + QString wrk = resources; + unsigned n = 0; + while (!wrk.isEmpty()){ + getToken(wrk, ';'); + n++; + } + CommandDef *cmds = new CommandDef[n + 2]; + cmds[0].text = "_"; + n = 1; + while (!resources.isEmpty()){ + unsigned long id = CmdContactResource + n; + if (n > m_nResourceMenu){ + m_nResourceMenu = n; + EventMenu(id, EventMenu::eAdd).process(); + Command cmd; + cmd->id = CmdContactClients; + cmd->text = "_"; + cmd->menu_id = id; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + } + cmds[n].id = id; + cmds[n].text = "_"; + cmds[n].popup_id = id; + QString res = getToken(resources, ';'); + cmds[n].icon = (const char*)(getToken(res, ',').toULong()); + QString t = ways[0].client->contactName(ways[0].data); + t += '/' + res; + cmds[n].text_wrk = t; + n++; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + CommandDef *cmds = new CommandDef[n + 2]; + cmds[0].text = "_"; + n = 1; + for (vector::iterator itw = ways.begin(); itw != ways.end(); ++itw, n++){ + unsigned long id = CmdContactClients + n; + if (n > m_nClientsMenu){ + m_nClientsMenu = n; + EventMenu(id, EventMenu::eAdd).process(); + + Command cmd; + cmd->id = CmdContactClients; + cmd->text = "_"; + cmd->menu_id = id; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSeparate; + cmd->text = I18N_NOOP("&Separate"); + cmd->menu_grp = 0x2000; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + } + cmds[n].id = id; + cmds[n].text = "_"; + cmds[n].popup_id = id; + unsigned long status = STATUS_UNKNOWN; + unsigned style = 0; + QString statusIcon; + if (itw->bNew){ + void *data = itw->data; + Client *client = contact->clientData.activeClient(data, itw->client); + if (client == NULL){ + client = itw->client; + data = itw->data; + } + client->contactInfo(data, status, style, statusIcon); + }else{ + itw->client->contactInfo(itw->data, status, style, statusIcon); + } + cmds[n].icon = statusIcon; + QString t = itw->client->contactName(itw->data); + bool bFrom = false; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (client == itw->client) + continue; + Contact *contact; + clientData *data = itw->data; + if (client->isMyData(data, contact)){ + bFrom = true; + break; + } + } + if (bFrom){ + t += ' '; + t += i18n("from %1") .arg(itw->client->name()); + } + cmds[n].text_wrk = t; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + if (cmd->menu_id > CmdContactResource){ + unsigned nRes = cmd->menu_id - CmdContactResource - 1; + unsigned n; + for (n = 0; n < ways.size(); n++){ + QString resources = ways[n].client->resources(ways[n].data); + while (!resources.isEmpty()){ + getToken(resources, ';'); + if (nRes-- == 0){ + clientContact &cc = ways[n]; + EventMenuGetDef eMenu(MenuMessage); + eMenu.process(); + CommandsDef *cmdsMsg = eMenu.defs(); + unsigned nCmds = 0; + { + CommandsList it(*cmdsMsg, true); + while (++it) + nCmds++; + } + CommandDef *cmds = new CommandDef[nCmds]; + nCmds = 0; + + CommandsList it(*cmdsMsg, true); + CommandDef *c; + while ((c = ++it) != NULL){ + if ((c->id == MessageSMS) && (cc.client->protocol()->description()->flags & PROTOCOL_NOSMS)) + continue; + if (!cc.client->canSend(c->id, cc.data)){ + EventCheckSend e(c->id, cc.client, cc.data); + if (!e.process()) + continue; + } + cmds[nCmds] = *c; + cmds[nCmds].id = c->id; + cmds[nCmds].flags = COMMAND_DEFAULT; + cmds[nCmds].menu_id = cmd->menu_id; + nCmds++; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + } + } + return false; + } + unsigned n = cmd->menu_id - CmdContactClients - 1; + if (n >= ways.size()) + return false; + clientContact &cc = ways[n]; + + EventMenuGetDef eMenu(MenuMessage); + eMenu.process(); + CommandsDef *cmdsMsg = eMenu.defs(); + unsigned nCmds = 0; + { + CommandsList it(*cmdsMsg, true); + while (++it) + nCmds++; + } + QString resources = cc.client->resources(cc.data); + if (!resources.isEmpty()){ + nCmds++; + while (!resources.isEmpty()){ + getToken(resources, ';'); + nCmds++; + } + } + + CommandDef *cmds = new CommandDef[nCmds]; + nCmds = 0; + + CommandsList it(*cmdsMsg, true); + CommandDef *c; + while ((c = ++it) != NULL){ + if ((c->id == MessageSMS) && (cc.client->protocol()->description()->flags & PROTOCOL_NOSMS)) + continue; + if (!cc.client->canSend(c->id, cc.data)){ + EventCheckSend e(c->id, cc.client, cc.data); + if (!e.process()) + continue; + } + cmds[nCmds] = *c; + cmds[nCmds].id = c->id; + cmds[nCmds].flags = COMMAND_DEFAULT; + cmds[nCmds].menu_id = cmd->menu_id; + nCmds++; + } + resources = cc.client->resources(cc.data); + if (!resources.isEmpty()){ + cmds[nCmds++].text = "_"; + unsigned nRes = 1; + for (unsigned i = 0; i < n; i++){ + QString resources = ways[i].client->resources(ways[i].data); + while (!resources.isEmpty()){ + getToken(resources, ';'); + unsigned long id = CmdContactResource + nRes; + if (nRes > m_nResourceMenu){ + m_nResourceMenu = nRes; + EventMenu(id, EventMenu::eAdd).process(); + Command cmd; + cmd->id = CmdContactClients; + cmd->text = "_"; + cmd->menu_id = id; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + } + nRes++; + } + } + QString resources = cc.client->resources(cc.data); + while (!resources.isEmpty()){ + unsigned long id = CmdContactResource + nRes; + if (nRes > m_nResourceMenu){ + m_nResourceMenu = nRes; + EventMenu(id, EventMenu::eAdd).process(); + Command cmd; + cmd->id = CmdContactClients; + cmd->text = "_"; + cmd->menu_id = id; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + } + cmds[nCmds].id = id; + cmds[nCmds].text = "_"; + cmds[nCmds].popup_id = id; + QString res = getToken(resources, ';'); + cmds[nCmds].icon = (const char*)getToken(res, ',').toULong(); + QString t = cc.client->contactName(ways[0].data); + t += '/' + res; + cmds[nCmds++].text_wrk = t; + nRes++; + } + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + + return true; +} + +bool CorePlugin::processCheckMenuContainer(SIM::CommandDef* cmd) +{ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + unsigned nContainers = 1; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach(w,list) + { + if (w->inherits("Container")) + nContainers++; + } + CommandDef *cmds = new CommandDef[nContainers + 1]; + unsigned n = 0; + foreach(w,list) + { + if (w->inherits("Container")){ + Container *c = static_cast(w); + cmds[n] = *cmd; + cmds[n].icon = QString::null; + cmds[n].id = c->getId(); + cmds[n].flags = COMMAND_DEFAULT; + cmds[n].text_wrk = c->name(); + if (c->wnd(contact->id())) + cmds[n].flags |= COMMAND_CHECKED; + n++; + } + } + cmds[n].icon = QString::null; + cmds[n].id = NEW_CONTAINER; + cmds[n].flags = COMMAND_DEFAULT; + cmds[n].text = I18N_NOOP("&New"); + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + return false; +} + +bool CorePlugin::processCheckMenuMessage(SIM::CommandDef* cmd) +{ + cmd->flags &= ~COMMAND_CHECKED; + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + vector ways; + getWays(ways, contact); + for (vector::iterator it = ways.begin(); it != ways.end(); ++it){ + if ((cmd->id == MessageSMS) && (it->client->protocol()->description()->flags & PROTOCOL_NOSMS)) + return false; + if (it->client->canSend(cmd->id, it->data)){ + return true; + } + } + if ((cmd->id == MessageSMS) && !ways.empty()){ + vector::iterator it; + for (it = ways.begin(); it != ways.end(); ++it){ + if ((it->client->protocol()->description()->flags & PROTOCOL_NOSMS) == 0) + break; + } + if (it == ways.end()) + return false; + } + } + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + if (getContacts()->getClient(i)->canSend(cmd->id, NULL)) + return true; + } + return false; +} + +bool CorePlugin::processCheckMenuMsgCommand(SIM::CommandDef* cmd) +{ + Message *msg = (Message*)(cmd->param); + switch (cmd->id){ + case CmdMsgQuote: + case CmdMsgForward: + if ((msg->getFlags() & MESSAGE_RECEIVED) == 0) + return false; + QString p = msg->presentation(); + if (!p.isEmpty()){ + unsigned type = msg->baseType(); + switch (type){ + case MessageFile: + return false; + } + cmd->flags &= ~COMMAND_CHECKED; + return true; + } + break; + } + return false; +} + +bool CorePlugin::processCheckCmdPhoneLocation(SIM::CommandDef* cmd) +{ + unsigned n = 2; + QString phones = getContacts()->owner()->getPhones(); + while (!phones.isEmpty()){ + getToken(phones, ';'); + n++; + } + CommandDef *cmds = new CommandDef[n]; + n = 0; + cmds[n].id = CmdPhoneLocation; + cmds[n].text = I18N_NOOP("Not available"); + cmds[n].menu_id = MenuPhoneLocation; + phones = getContacts()->owner()->getPhones(); + bool bActive = false; + while (!phones.isEmpty()){ + n++; + QString item = getToken(phones, ';', false); + item = getToken(item, '/', false); + QString number = getToken(item, ','); + getToken(item, ','); + unsigned long icon = getToken(item, ',').toULong(); + cmds[n].id = CmdPhoneLocation + n; + cmds[n].text = "_"; + cmds[n].menu_id = MenuPhoneLocation; + cmds[n].text_wrk = number; + if (!item.isEmpty()){ + cmds[n].flags = COMMAND_CHECKED; + bActive = true; + } + switch (icon){ + case PHONE: + cmds[n].icon = "phone"; + break; + case FAX: + cmds[n].icon = "fax"; + break; + case CELLULAR: + cmds[n].icon = "cell"; + break; + case PAGER: + cmds[n].icon = "pager"; + break; + } + } + if (!bActive) + cmds[0].flags = COMMAND_CHECKED; + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; +} + +bool CorePlugin::processCheckCmdUnread(SIM::CommandDef* cmd) +{ + unsigned long contact_id = 0; + if (cmd->menu_id == MenuContact) + contact_id = (unsigned long)cmd->param; + MAP_COUNT count; + MAP_COUNT::iterator itc; + CommandDef *def; + unsigned n = 0; + for (list::iterator it = unread.begin(); it != unread.end(); ++it, n++){ + if (contact_id && (it->contact != contact_id)) + continue; + msgIndex m; + m.contact = it->contact; + m.type = it->type; + itc = count.find(m); + if (itc == count.end()){ + msgCount c; + c.index = n; + c.count = 1; + count.insert(MAP_COUNT::value_type(m, c)); + }else{ + msgCount &c = (*itc).second; + c.index = n; + c.count++; + } + } + if (count.empty()) + return false; + CommandDef *cmds = new CommandDef[count.size() + 1]; + n = 0; + for (itc = count.begin(); itc != count.end(); ++itc, n++){ + cmds[n].id = CmdUnread + (*itc).second.index; + def = messageTypes.find((*itc).first.type); + if (def == NULL) + continue; + MessageDef *mdef = (MessageDef*)(def->param); + cmds[n].icon = def->icon; + QString msg = i18n(mdef->singular, mdef->plural, (*itc).second.count); + if(msg.isEmpty()) + { + log(L_ERROR, "Message is missing some definitions! Text: %s, ID: %lu", + qPrintable(def->text), def->id); + int cnt = (*itc).second.count; + msg = QString("%1").arg(cnt); + } + if ((*itc).second.count == 1){ + int n = msg.indexOf("1 "); + if (n == 0){ + msg = msg.left(1).toUpper() + msg.mid(1); + }else{ + msg = msg.left(n - 1); + } + } + if (contact_id == 0){ + Contact *contact = getContacts()->contact((*itc).first.contact); + if (contact == NULL) + continue; + msg = i18n("%1 from %2") + .arg(msg) + .arg(contact->getName()); + } + cmds[n].text_wrk = msg; + cmds[n].text = "_"; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; +} + +bool CorePlugin::processCheckCmdSendSMS(SIM::CommandDef* cmd) +{ + cmd->flags &= COMMAND_CHECKED; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (client->canSend(MessageSMS, NULL)) + return true; + } + return false; +} + +bool CorePlugin::processCheckCmdShowPanel(SIM::CommandDef* cmd) +{ + cmd->flags &= ~COMMAND_CHECKED; + if (m_statusWnd) + cmd->flags |= COMMAND_CHECKED; + return true; +} + +bool CorePlugin::processCheckCmdCommonStatus(SIM::CommandDef* cmd) +{ + unsigned n = cmd->menu_id - CmdClient; + if (n >= getContacts()->nClients()) + return false; + Client *client = getContacts()->getClient(n); + cmd->flags &= ~COMMAND_CHECKED; + if (client->getCommonStatus()) + cmd->flags |= COMMAND_CHECKED; + return true; +} + +bool CorePlugin::processEventCheckCommandState(SIM::Event* e) +{ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->menu_id == MenuEncoding){ + if (cmd->id == CmdChangeEncoding) { + return processCheckCmdChangeEncoding(cmd); + } + if (cmd->id == CmdAllEncodings) { + return processCheckCmdAllEncodings(cmd); + } + } + if (cmd->id == CmdEnableSpell) { + return processCheckCmdEnableSpell(cmd); + } + if (cmd->id == CmdSendClose) { + return processCheckCmdSendClose(cmd); + } + if ((cmd->id == CmdFileAccept) || (cmd->id == CmdFileDecline)) { + Message *msg = (Message*)(cmd->param); + if (msg->getFlags() & MESSAGE_TEMP) + return true; + return false; + } + if (cmd->id == CmdContactClients) { + return processCheckCmdContactClients(cmd); + } + if (cmd->menu_id == MenuContainer) { + return processCheckMenuContainer(cmd); + } + if (cmd->menu_id == MenuMessage) { + return processCheckMenuMessage(cmd); + } + if (cmd->menu_id == MenuMsgCommand){ + return processCheckMenuMsgCommand(cmd); + } + if (cmd->menu_id == MenuPhoneState){ + cmd->flags &= ~COMMAND_CHECKED; + if (cmd->id == CmdPhoneNoShow + getContacts()->owner()->getPhoneStatus()) + cmd->flags |= COMMAND_CHECKED; + return true; + } + if ((cmd->menu_id == MenuPhoneLocation) && (cmd->id == CmdPhoneLocation)){ + return processCheckCmdPhoneLocation(cmd); + } + if (cmd->id == CmdUnread){ + return processCheckCmdUnread(cmd); + } + if (cmd->id == CmdSendSMS){ + return processCheckCmdSendSMS(cmd); + } + if (cmd->id == CmdShowPanel){ + return processCheckCmdShowPanel(cmd); + } + if ((cmd->id == CmdContainer) && (cmd->menu_id == MenuContact)){ + if (getContainerMode() && getContainerMode() != 3) + return true; + return false; + } + if (cmd->id == CmdCommonStatus){ + return processCheckCmdCommonStatus(cmd); + } + if (cmd->id == CmdTitle) { + if (cmd->param && adjustClientItem(cmd->menu_id, cmd)) + return true; + return false; + } + if (adjustClientItem(cmd->id, cmd)) + return true; + unsigned n = cmd->menu_id - CmdClient; + if (n > getContacts()->nClients()) + return false; + Client *client = getContacts()->getClient(n); + if (cmd->id == CmdInvisible){ + if (client->getInvisible()){ + cmd->flags |= COMMAND_CHECKED; + }else{ + cmd->flags &= ~COMMAND_CHECKED; + } + return true; + } + const CommandDef *curStatus = NULL; + const CommandDef *d; + for (d = client->protocol()->statusList(); !d->text.isEmpty(); d++){ + if (d->id == cmd->id) + curStatus = d; + } + if (curStatus == NULL) + return 0; + bool bChecked = false; + unsigned status = client->getManualStatus(); + bChecked = (status == curStatus->id); + if (bChecked){ + cmd->flags |= COMMAND_CHECKED; + }else{ + cmd->flags &= ~COMMAND_CHECKED; + } + return true; +} + +bool CorePlugin::processExecMenuEncoding(SIM::CommandDef* cmd) +{ + if (cmd->id == CmdAllEncodings) + { + Command c; + c->id = CmdChangeEncoding; + c->param = cmd->param; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QToolButton *btn = qobject_cast(eWidget.widget()); + if (btn) + QTimer::singleShot(0, btn, SLOT(animateClick())); + setValue("ShowAllEncodings", !value("ShowAllEncodings").toBool()); + return true; + } + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + QByteArray codecStr; + const char *codec = NULL; + if (cmd->id == 1) + { + codec = "-"; + } + else + { + QStringList main; + QStringList nomain; + QStringList::Iterator it; + const ENCODING *enc; + for (enc = getContacts()->getEncodings(); enc->language; enc++){ + if (enc->bMain){ + main.append(i18n(enc->language) + " (" + enc->codec + ')'); + continue; + } + if (!value("ShowAllEncodings").toBool()) + continue; + nomain.append(i18n(enc->language) + " (" + enc->codec + ')'); + } + QString str; + main.sort(); + int n = cmd->id - 1; + for (it = main.begin(); it != main.end(); ++it){ + if (--n == 0){ + str = *it; + break; + } + } + if (n >= 0){ + nomain.sort(); + for (it = nomain.begin(); it != nomain.end(); ++it){ + if (--n == 0){ + str = *it; + break; + } + } + } + if (!str.isEmpty()){ + int n = str.indexOf('('); + str = str.mid(n + 1); + n = str.indexOf(')'); + codecStr = str.left(n).toLatin1(); + codec = codecStr; + } + } + if (codec == NULL) + return false; + QString oldCodec = contact->getEncoding(); + if (oldCodec != codec){ + contact->setEncoding(codec); + EventContact(contact, EventContact::eChanged).process(); + EventHistoryConfig(contact->id()).process(); + } + return false; +} + +bool CorePlugin::processExecMenuMessage(SIM::CommandDef* cmd) +{ + Message *msg; + CommandDef *def = messageTypes.find(cmd->id); + if (def == NULL) + return false; + MessageDef *mdef = (MessageDef*)(def->param); + if (mdef->create == NULL) + return false; + msg = mdef->create(NULL); + msg->setContact((unsigned long)(cmd->param)); + if (mdef->flags & MESSAGE_SILENT){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + ClientDataIterator it(contact->clientData); + void *data; + while ((data = ++it) != NULL){ + Client *client = it.client(); + if (client->canSend(msg->type(), data) && client->send(msg, data)) + break; + } + } + return true; + } + EventOpenMessage(msg).process(); + delete msg; + return true; +} + +bool CorePlugin::processExecMenuMsgCommand(SIM::CommandDef* cmd) +{ + Message *msg = (Message*)(cmd->param); + QString p; + switch (cmd->id){ + case CmdMsgQuote: + case CmdMsgForward: + p = msg->presentation(); + if (p.isEmpty()) + return false; + p = unquoteText(p); + QStringList l = p.split('\n'); + QStringList::Iterator it; + if (l.count() && l.last().isEmpty()){ + it = l.end(); + --it; + l.removeLast(); + } + for (it = l.begin(); it != l.end(); ++it) + (*it) = QLatin1String(">") + (*it); + p = l.join("\n"); + Message *m = new Message(MessageGeneric); + m->setContact(msg->contact()); + m->setClient(msg->client()); + if (cmd->id == CmdMsgForward){ + QString name; + Contact *contact = getContacts()->contact(msg->contact()); + if (contact) + name = contact->getName(); + p = g_i18n("%1 wrote:", contact) .arg(name) + '\n' + p; + m->setFlags(MESSAGE_FORWARD); + }else{ + m->setFlags(MESSAGE_INSERT); + } + m->setText(p); + EventOpenMessage(m).process(); + delete m; + return true; + } + return false; +} + +bool CorePlugin::processExecCmdGrantAuth(SIM::CommandDef* cmd) +{ + Message *from = (Message*)(cmd->param); + Message *msg = new AuthMessage(MessageAuthGranted); + msg->setContact(from->contact()); + msg->setClient(from->client()); + Contact *contact = getContacts()->contact(msg->contact()); + if (contact){ + void *data; + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL){ + Client *client = it.client(); + if (!from->client().isEmpty()){ + if ((client->dataName(data) == from->client()) && client->send(msg, data)) + return true; + }else{ + if (client->canSend(MessageAuthGranted, data) && client->send(msg, data)) + return true; + } + } + } + delete msg; + return true; +} + +bool CorePlugin::processExecCmdRefuseAuth(SIM::CommandDef* cmd) +{ + Message *from = (Message*)(cmd->param); + Message *msg = new AuthMessage(MessageAuthRefused); + msg->setContact(from->contact()); + msg->setClient(from->client()); + EventOpenMessage(msg).process(); + delete msg; + return true; +} + +bool CorePlugin::processExecCmdSeparate(SIM::CommandDef* cmd) +{ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + unsigned n = cmd->menu_id - CmdContactClients - 1; + vector ways; + getWays(ways, contact); + if (n >= ways.size()) + return false; + clientContact &cc = ways[n]; + clientData *data; + ClientDataIterator it(contact->clientData, cc.client); + while ((data = ++it) != NULL){ + if (data == cc.data) + break; + } + if (data == NULL){ + data = cc.data; + cc.client->createData(data, contact); + } + Contact *newContact = getContacts()->contact(0, true); + newContact->setGroup(contact->getGroup()); + newContact->clientData.join(data, contact->clientData); + contact->setup(); + newContact->setup(); + EventContact e1(contact, EventContact::eChanged); + e1.process(); + EventContact e2(newContact, EventContact::eChanged); + e2.process(); + return true; +} + +bool CorePlugin::processExecCmdSendSMS(SIM::CommandDef* /*cmd*/) +{ + Contact *contact = getContacts()->contact(0, true); + contact->setFlags(CONTACT_TEMP); + contact->setName(i18n("Send SMS")); + EventContact eChanged(contact, EventContact::eChanged); + eChanged.process(); + Command com; + com->id = MessageSMS; + com->menu_id = MenuMessage; + com->param = (void*)(contact->id()); + EventCommandExec(com).process(); + return true; +} + +bool CorePlugin::processExecCmdHistory(SIM::CommandDef* cmd) +{ + unsigned long id = (unsigned long)(cmd->param); + if (!value("UseExtViewer").toBool()){ + HistoryWindow *wnd = NULL; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach(w,list) + { + if(w->inherits("HistoryWindow")) + { + wnd = static_cast(w); + if (wnd->id() == id) + break; + wnd = NULL; + } + } + if (wnd == NULL){ + wnd = new HistoryWindow(id); + unsigned int historySizeX = value("HistorySizeX").toUInt(); + unsigned int historySizeY = value("HistorySizeY").toUInt(); + if(historySizeX && historySizeY) + wnd->resize(historySizeX, historySizeY); + } + raiseWindow(wnd); + } + else + { + if (!m_HistoryThread) + m_HistoryThread = new HistoryThread(); + m_HistoryThread->set_id(id); + m_HistoryThread->set_Viewer(value("ExtViewer").toString()); + m_HistoryThread->start(); + } + return true; +} + +bool CorePlugin::processExecCmdConfigure(SIM::CommandDef* cmd) +{ + if ((cmd->menu_id == MenuContact) || (cmd->menu_id == MenuGroup)){ + showInfo(cmd); + return true; + } + if (m_cfg == NULL){ + m_cfg = new ConfigDlg::ConfigureDialog(); + connect(m_cfg, SIGNAL(finished()), this, SLOT(dialogFinished())); + + unsigned int cfgGeometryWidth = value("CfgGeometryWidth").toUInt(); + unsigned int cfgGeometryHeight = value("CfgGeometryHeight").toUInt(); + if(cfgGeometryWidth == 0 || cfgGeometryHeight == 0) + { + cfgGeometryWidth = 500; + cfgGeometryHeight = 380; + } + m_cfg->resize(cfgGeometryWidth, cfgGeometryHeight); + } + raiseWindow(m_cfg); + return true; +} + +bool CorePlugin::processExecCmdSearch(SIM::CommandDef* /*cmd*/) +{ + if (m_search == NULL){ + m_search = new SearchDialog; + connect(m_search, SIGNAL(finished()), this, SLOT(dialogFinished())); + unsigned int searchGeometryWidth = value("SearchGeometryWidth").toUInt(); + unsigned int searchGeometryHeight = value("SearchGeometryHeight").toUInt(); + if(searchGeometryWidth == 0 || searchGeometryHeight == 0) + { + searchGeometryWidth = 500; + searchGeometryHeight = 380; + } + m_search->resize(searchGeometryWidth, searchGeometryHeight); + } + raiseWindow(m_search); + return false; +} + +bool CorePlugin::processExecMenuPhoneState(SIM::CommandDef* cmd) +{ + Contact *owner = getContacts()->owner(); + if ((unsigned long)owner->getPhoneStatus() != cmd->id - CmdPhoneNoShow){ + owner->setPhoneStatus(cmd->id - CmdPhoneNoShow); + EventContact(owner, EventContact::eChanged).process(); + } + return true; +} + +bool CorePlugin::processExecMenuPhoneLocation(SIM::CommandDef* cmd) +{ + Contact *owner = getContacts()->owner(); + unsigned n = cmd->id - CmdPhoneLocation; + QString res; + QString phones = owner->getPhones(); + while (!phones.isEmpty()){ + QString item = getToken(phones, ';', false); + QString v = getToken(item, '/', false); + QString number = getToken(v, ',', false); + QString type = getToken(v, ',', false); + QString icon = getToken(v, ',', false); + v = number + ',' + type + ',' + icon; + if (--n == 0) + v += ",1"; + if (!res.isEmpty()) + res += ';'; + res += v; + } + if (res != owner->getPhones()){ + owner->setPhones(res); + EventContact(owner, EventContact::eChanged).process(); + } + return true; +} + +bool CorePlugin::processExecCmdSetup(SIM::CommandDef* cmd) +{ + unsigned n = cmd->menu_id - CmdClient; + if (n >= getContacts()->nClients()) + return false; + Client *client = getContacts()->getClient(n); + if (m_cfg == NULL){ + m_cfg = new ConfigDlg::ConfigureDialog(); + connect(m_cfg, SIGNAL(finished()), this, SLOT(dialogFinished())); + } + static_cast(m_cfg)->raisePage(client); + raiseWindow(m_cfg); + return true; +} + +bool CorePlugin::processExecCmdPhoneBook(SIM::CommandDef* /*cmd*/) +{ + if (m_cfg == NULL){ + m_cfg = new ConfigDlg::ConfigureDialog; + connect(m_cfg, SIGNAL(finished()), this, SLOT(dialogFinished())); + } + static_cast(m_cfg)->raisePhoneBook(); + raiseWindow(m_cfg); + return true; +} + +bool CorePlugin::processExecCmdCommonStatus(SIM::CommandDef* cmd) +{ + unsigned n = cmd->menu_id - CmdClient; + if (n >= getContacts()->nClients()) + return false; + Client *client = getContacts()->getClient(n); + if (cmd->flags & COMMAND_CHECKED){ + client->setStatus(getManualStatus(), true); + }else{ + client->setStatus(client->getManualStatus(), false); + } + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + if (getContacts()->getClient(i)->getCommonStatus()) + return true; + } + client = getContacts()->getClient(0); + if (client){ + client->setCommonStatus(true); + EventClientChanged(client).process(); + } + return true; +} + +bool CorePlugin::processStatusChange(int clientnum, SIM::CommandDef* cmd) +{ + Client *client = getContacts()->getClient(clientnum); + if (cmd->id == CmdInvisible){ + client->setInvisible(!client->getInvisible()); + return true; + } + const CommandDef *d; + const CommandDef *curStatus = NULL; + for (d = client->protocol()->statusList(); !d->text.isEmpty(); d++){ + if (d->id == cmd->id) + curStatus = d; + } + if (curStatus == NULL) + return false; + if ((((cmd->id != STATUS_ONLINE) && (cmd->id != STATUS_OFFLINE)) || + (client->protocol()->description()->flags & PROTOCOL_AR_OFFLINE))&& + (client->protocol()->description()->flags & (PROTOCOL_AR | PROTOCOL_AR_USER))){ + QString noShow = propertyHub()->stringMapValue("NoShowAutoReply", cmd->id); + if (noShow.isEmpty()){ + AutoReplyDialog dlg(cmd->id); + if (!dlg.exec()) + return true; + } + } + client->setStatus(cmd->id, false); + return true; +} + +bool CorePlugin::processEventCommandExec(SIM::Event* e) +{ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->menu_id == MenuEncoding) { + return processExecMenuEncoding(cmd); + } + if (cmd->id == CmdEnableSpell) { + setValue("EnableSpell", cmd->flags & COMMAND_CHECKED); + return false; + } + if (cmd->menu_id == MenuMessage){ + return processExecMenuMessage(cmd); + } + if (cmd->menu_id == MenuMsgCommand){ + return processExecMenuMsgCommand(cmd); + } + if (cmd->id == CmdGrantAuth){ + return processExecCmdGrantAuth(cmd); + } + if (cmd->id == CmdRefuseAuth){ + return processExecCmdRefuseAuth(cmd); + } + + if (cmd->id == CmdSeparate){ + return processExecCmdSeparate(cmd); + } + if (cmd->id == CmdSendClose){ + setValue("CloseSend", (cmd->flags & COMMAND_CHECKED) != 0); + return true; + } + if (cmd->id == CmdSendSMS){ + return processExecCmdSendSMS(cmd); + } + if (cmd->id == CmdHistory){ + return processExecCmdHistory(cmd); + } + if (cmd->id == CmdConfigure){ + return processExecCmdConfigure(cmd); + } + if (cmd->id == CmdSearch){ + return processExecCmdSearch(cmd); + } + if ((cmd->menu_id == MenuContact) || (cmd->menu_id == MenuGroup)){ + if (cmd->id == CmdInfo){ + showInfo(cmd); + return true; + } + CommandDef *def = preferences.find(cmd->id); + if (def){ + showInfo(cmd); + return true; + } + } + if (cmd->menu_id == MenuPhoneState){ + return processExecMenuPhoneState(cmd); + } + if (cmd->menu_id == MenuPhoneLocation){ + return processExecMenuPhoneLocation(cmd); + } + if (cmd->id == CmdSetup){ + return processExecCmdSetup(cmd); + } + if (cmd->id == CmdPhoneBook){ + return processExecCmdPhoneBook(cmd); + } + if (cmd->id == CmdCommonStatus){ + return processExecCmdCommonStatus(cmd); + } + if (cmd->id == CmdProfileChange){ + QTimer::singleShot(0, this, SLOT(selectProfile())); + return true; + } + unsigned n = cmd->menu_id - CmdClient; + if (n < getContacts()->nClients()){ + return processStatusChange(n, cmd); + } + if ((cmd->id == CmdCM) || (cmd->id == CmdConnections)){ + if (m_manager == NULL){ + m_manager = new ConnectionManager(false); + connect(m_manager, SIGNAL(finished()), this, SLOT(managerFinished())); + } + raiseWindow(m_manager); + return true; + } + Message *msg = (Message*)(cmd->param); + if (cmd->id == CmdFileAccept){ + Contact *contact = getContacts()->contact(msg->contact()); + SIM::PropertyHubPtr data = contact->getUserData("_core"); + QString dir; + if(!data.isNull()) + dir = data->value("IncomingPath").toString(); + if (!dir.isEmpty() && (!dir.endsWith("/")) && (!dir.endsWith("\\"))) + dir += '/'; + dir = user_file(dir); + EventMessageAccept(msg, dir, Ask).process(); + } + if (cmd->id == CmdDeclineWithoutReason){ + EventMessageDecline(msg).process(); + } + if (cmd->id == CmdDeclineReasonBusy){ + QString reason = i18n("Sorry, I'm busy right now, and can not respond to your request"); + EventMessageDecline(msg, reason).process(); + } + if (cmd->id == CmdDeclineReasonLater){ + QString reason = i18n("Sorry, I'm busy right now, but I'll be able to respond to you later"); + EventMessageDecline(msg, reason).process(); + } + if(cmd->id == CmdDeclineReasonInput) + { + Message *msg = (Message*)(cmd->param); + QWidgetList list = QApplication::topLevelWidgets(); + DeclineDlg *dlg = NULL; + QWidget *w; + foreach(w,list) + { + if(w->inherits("DeclineDlg")) + { + dlg = static_cast(w); + if (dlg->message()->id() == msg->id()) + break; + dlg = NULL; + } + } + if (dlg == NULL) + dlg = new DeclineDlg(msg); + raiseWindow(dlg); + } + if((cmd->id >= CmdUnread) && (cmd->id < CmdUnread + unread.size())) + { + unsigned n = cmd->id - CmdUnread; + for (list::iterator it = unread.begin(); it != unread.end(); ++it){ + if (n-- == 0){ + Message *msg = History::load(it->id, it->client, it->contact); + if (msg){ + msg->setFlags(msg->getFlags() & ~MESSAGE_NORAISE); + EventOpenMessage(msg).process(); + delete msg; + break; + } + } + } + return true; + } + if ((cmd->menu_id > CmdContactResource) && (cmd->menu_id <= CmdContactResource + 0x100)){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + CommandDef *def = messageTypes.find(cmd->id); + if (def && contact){ + unsigned nRes = cmd->menu_id - CmdContactResource - 1; + vector ways; + getWays(ways, contact); + for (unsigned n = 0; n < ways.size(); n++){ + QString resources = ways[n].client->resources(ways[n].data); + while (!resources.isEmpty()){ + QString res = getToken(resources, ';'); + if (nRes-- == 0){ + clientContact &cc = ways[n]; + clientData *data; + ClientDataIterator it(contact->clientData, cc.client); + while ((data = ++it) != NULL){ + if (data == cc.data) + break; + } + if (data == NULL){ + data = cc.data; + cc.client->createData(data, contact); + EventContact(contact, EventContact::eChanged).process(); + } + getToken(res, ','); + MessageDef *mdef = (MessageDef*)(def->param); + Message *msg = mdef->create(NULL); + msg->setContact((unsigned long)(cmd->param)); + msg->setClient(cc.client->dataName(data)); + msg->setResource(res); + EventOpenMessage(msg).process(); + delete msg; + return true; + } + } + } + } + return false; + } + if ((cmd->menu_id > CmdContactClients) && (cmd->menu_id <= CmdContactClients + 0x100)){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + CommandDef *def = messageTypes.find(cmd->id); + if (def && contact){ + unsigned n = cmd->menu_id - CmdContactClients - 1; + vector ways; + getWays(ways, contact); + if (n < ways.size()){ + clientContact &cc = ways[n]; + + clientData *data; + ClientDataIterator it(contact->clientData, cc.client); + while ((data = ++it) != NULL){ + if (data == cc.data) + break; + } + if (data == NULL){ + data = cc.data; + cc.client->createData(data, contact); + EventContact(contact, EventContact::eChanged).process(); + } + + MessageDef *mdef = (MessageDef*)(def->param); + Message *msg = mdef->create(NULL); + msg->setContact((unsigned long)(cmd->param)); + msg->setClient(cc.client->dataName(data)); + EventOpenMessage(msg).process(); + delete msg; + return true; + } + } + } + if (cmd->id == CmdShowPanel) + { + setValue("ShowPanel", ((cmd->flags & COMMAND_CHECKED) != 0)); + //setShowPanel((cmd->flags & COMMAND_CHECKED) != 0); + showPanel(); + } + return false; +} + +bool CorePlugin::processEventGoURL(SIM::Event* e) +{ + EventGoURL *u = static_cast(e); + QString url = u->url(); + QString proto; + int n = url.indexOf(':'); + if (n < 0) + return false; + proto = url.left(n); + url = url.mid(n + 1 ); + if (proto == "sms"){ + while (url[0] == '/') + url = url.mid(1); + Contact *contact = getContacts()->contactByPhone(url); + if (contact){ + Command cmd; + cmd->id = MessageSMS; + cmd->menu_id = MenuMessage; + cmd->param = (void*)(contact->id()); + EventCommandExec(cmd).process(); + } + return true; + } + if (proto != "sim") + return false; + unsigned long contact_id = url.toULong(); + Contact *contact = getContacts()->contact(contact_id); + if (contact){ + Command cmd; + cmd->id = MessageGeneric; + cmd->menu_id = MenuMessage; + cmd->param = (void*)contact_id; + EventCommandExec(cmd).process(); + } + return false; +} + +bool CorePlugin::processEvent(Event *e) +{ + switch (e->type()) + { + case eEventIconChanged: + return processEventIconChanged(); + + case eEventJoinAlert: + return processEventJoinAlert(); + + case eEventGroup: + return processEventGroup(e); + + case eEventDeleteMessage: + return processEventDeleteMessage(e); + + case eEventRewriteMessage: + return processEventRewriteMessage(e); + + case eEventTmplHelp: + return processEventTmplHelp(e); + + case eEventTmplHelpList: + return processEventTmplHelpList(e); + + case eEventARRequest: + return processEventARRequest(e); + + case eEventSaveState: + return processEventSaveState(e); + + case eEventPluginChanged: + return processEventPluginChanged(e); + + case eEventInit: + return processEventInit(e); + + case eEventQuit: + destroy(); + m_cmds->clear(); + return false; + + case eEventHomeDir: + return processEventHomeDir(e); + + case eEventGetProfile: + return processEventGetProfile(e); + + case eEventAddPreferences: + return processEventAddPreferences(e); + + case eEventRemovePreferences: + return processEventRemovePreferences(e); + + case eEventClientsChanged: + case eEventClientChanged: + return processEventClientChanged(e); + + case eEventCreateMessageType: + return processEventCreateMessageType(e); + + case eEventRemoveMessageType: + return processEventRemoveMessageType(e); + + case eEventContact: + return processEventContact(e); + + case eEventMessageAcked: + return processEventMessageAcked(e); + + case eEventMessageDeleted: + return processEventMessageDeleted(e); + + case eEventMessageReceived: + return processEventMessageReceived(e); + + case eEventSent: + return processEventSent(e); + + case eEventDefaultAction: + return processEventDefaultAction(e); + + case eEventLoadMessage: + return processEventLoadMessage(e); + + case eEventOpenMessage: + return processEventOpenMessage(e); + + case eEventCheckCommandState: + return processEventCheckCommandState(e); + + case eEventUpdateCommandState: + { + EventUpdateCommandState *eucs = static_cast(e); + return updateMainToolbar(eucs->commandID()); + } + case eEventCommandExec: + return processEventCommandExec(e); + + case eEventGoURL: + return processEventGoURL(e); + default: + break; + } + return false; +} + +void CorePlugin::showInfo(CommandDef *cmd) +{ + UserConfig *cfg = NULL; + Contact *contact = NULL; + Group *group = NULL; + unsigned long id = (unsigned long)(cmd->param); + if (cmd->menu_id == MenuContact) + { + contact = getContacts()->contact(id); + if (contact == NULL) + return; + } + if (cmd->menu_id == MenuGroup){ + group = getContacts()->group(id); + if (group == NULL) + return; + } + if ((contact == NULL) && (group == NULL)) + return; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget *w; + foreach(w,list) + { + if (w->inherits("UserConfig")) + { + cfg = static_cast(w); + if ((contact && (cfg->m_contact == contact)) || + (group && (cfg->m_group == group))) + break; + cfg = NULL; + } + } + if (cfg == NULL){ + cfg = new UserConfig(contact, group); + unsigned int cfgGeometryWidth = value("CfgGeometryWidth").toUInt(); + unsigned int cfgGeometryHeight = value("CfgGeometryHeight").toUInt(); + if(cfgGeometryWidth == 0 || cfgGeometryHeight == 0) + { + cfgGeometryWidth = 500; + cfgGeometryHeight = 380; + } + cfg->resize(cfgGeometryWidth, cfgGeometryHeight); + } + raiseWindow(cfg); + if (!cfg->raisePage(cmd->id)) + cfg->raiseDefaultPage(); +} + +void CorePlugin::dialogFinished() +{ + QTimer::singleShot(0, this, SLOT(dialogDestroy())); +} + +void CorePlugin::dialogDestroy() +{ + if (m_cfg && !m_cfg->isVisible()){ + delete m_cfg; + m_cfg = NULL; + } + if (m_search && !m_search->isVisible()){ + delete m_search; + m_search = NULL; + } +} + +QWidget *CorePlugin::createConfigWindow(QWidget *parent) +{ + return new InterfaceConfig(parent); +} + +void CorePlugin::hideWindows() +{ + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach(w,list) + { + w->hide(); + } +} + +void CorePlugin::ignoreEvents(bool i) +{ + m_bIgnoreEvents = i; +} + +void CorePlugin::changeProfile(const QString& profilename) +{ + log(L_DEBUG, "CorePlugin::changeProfile()"); + destroy(); + getContacts()->clearClients(); + getContacts()->clear(); + setValue("StatusTime", (unsigned int)QDateTime::currentDateTime().toTime_t()); + ProfileManager::instance()->selectProfile(profilename); + removeTranslator(); + installTranslator(); + initData(); +} + +void CorePlugin::selectProfile() +{ + log(L_DEBUG, "CorePlugin::selectProfile()"); + EventSaveState e; + e.process(); + bool changed = init(false); + if (changed){ + EventInit e2; + e2.process(); + } +} + +bool CorePlugin::init(bool bInit) +{ + m_bInit = bInit; + bool bLoaded = false; + bool bRes = true; + bool bNew = false; + bool bCmdLineProfile = false; + QSettings settings; + + // FIXME: + /* + EventArg e1("-profile:", I18N_NOOP("Use specified profile")); + e1.process(); + QString cmd_line_profile = e1.value(); + if (!cmd_line_profile.isEmpty()){ + bCmdLineProfile = true; + setProfile(QString::null); + QString profileDir = user_file(cmd_line_profile); + QDir d(profileDir); + if (d.exists()) { + bCmdLineProfile = false; + setProfile(cmd_line_profile); + } + } + */ + + QStringList profiles = ProfileManager::instance()->enumProfiles(); + QString profile; + bool newProfile = false; + + if(settings.value("Profile").toString().isEmpty() && settings.value("NoShow", false).toBool()) + { + settings.setValue("NoShow", false); + } + + QString sNewProfileName; + + if((!bInit || + settings.value("Profile").toString().isEmpty() || + !settings.value("NoShow", false).toBool() || + !settings.value("SavePasswd", false).toBool())) + { + LoginDialog dlg(bInit, ClientPtr(), "", bInit ? QString() : settings.value("Profile").toString()); + if (dlg.exec() == 0) + { + return false; + } + newProfile = dlg.isNewProfile(); + sNewProfileName = dlg.newProfileName(); + profile = dlg.profile(); + if (dlg.isChanged()) + bRes = false; + bLoaded = true; + } + else if(bInit && !profile.isEmpty()) + { + log(L_DEBUG, "profile = %s", profile.toUtf8().data()); + ProfileManager::instance()->selectProfile(profile); + } + else if(settings.value("NoShow", false).toBool()) + { + profile = settings.value("Profile").toString(); + ProfileManager::instance()->selectProfile(profile); + changeProfile(profile); + //bLoaded = true; + } + if(newProfile) + { + hideWindows(); + getContacts()->clearClients(); + + QDir d(ProfileManager::instance()->rootPath()); + settings.setValue("Profile", sNewProfileName); + + NewProtocol *pDlg = NULL; + if (bCmdLineProfile) + { + settings.setValue("SavePasswd", true); + settings.setValue("NoShow", true); + pDlg = new NewProtocol(NULL,1,getRegNew()); + } else { + pDlg = new NewProtocol(NULL); + } + if (!pDlg->exec() && !pDlg->connected()){ + delete(pDlg); + if (d.exists(sNewProfileName)) + d.rmdir(sNewProfileName); + return false; + } + delete(pDlg); + + bLoaded = true; + bRes = false; + bNew = true; + } + + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("_core"); + if(!hub.isNull()) + setPropertyHub(hub); + // Defaults: + if(!value("ShowPanel").isValid()) + setValue("ShowPanel", true); // Show status panel by default + if(!value("HistoryStyle").isValid()) + setValue("HistoryStyle", "SIM"); + if(value("HistoryPage").toUInt() == 0) + setValue("HistoryPage", 100); + historyXSL = new XSL(value("HistoryStyle").toString()); + EventPluginLoadConfig eplc; + eplc.process(); + if (!bLoaded) + { + SIM::ClientList clients; + connect(&clients, SIGNAL(ignoreEvents(bool)), this, SLOT(ignoreEvents(bool))); + loadClients(clients); + clients.addToContacts(); + } + if (!bNew) + { + getContacts()->load(); + } + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + // "Emulate" contactsLoaded() when we're dealing with a new contact list + if (bNew) + client->contactsLoaded(); + if (client->getCommonStatus()) + client->setManualStatus(getManualStatus()); + client->setStatus(client->getManualStatus(), client->getCommonStatus()); + } + if (getRegNew()&&!bCmdLineProfile){ + hideWindows(); + NewProtocol pDlg(NULL,1,true); + pDlg.exec(); + } + if (!m_main) + m_main = new MainWindow(/*data.geometry*/); + + loadUnread(); + + log(L_DEBUG, "geometry: %s", value("geometry").toByteArray().toHex().data()); + m_main->restoreGeometry(value("geometry").toByteArray()); + m_view = new UserView; + + EventLoginStart e; + e.process(); + + if (!bNew) + { + QString containers = value("Containers").toString(); + QVariantMap containerMap = value("Container").toMap(); + while (!containers.isEmpty()) + { + Container *c = new Container(0, containerMap.value(getToken(containers, ',')).toString().toUtf8().constData()); + c->init(); + } + } + //clearContainer(); + setValue("Containers", QString()); + setValue("Container", QVariantMap()); + + m_bInit = true; + loadMenu(); + if (!bRes) + { + EventSaveState eSave; + eSave.process(); + return true; + } + return bRes || bNew; +} + +void CorePlugin::destroy() +{ + QWidgetList l = QApplication::topLevelWidgets(); + QWidget *w; + list forRemove; + foreach(w,l) + { + if (w->inherits("Container") || + w->inherits("HistoryWindow") || + w->inherits("UserConfig")) + forRemove.push_back(w); + } + for(list::iterator itr = forRemove.begin(); itr != forRemove.end(); ++itr) + delete *itr; + + if (m_statusWnd) + { + delete m_statusWnd; + m_statusWnd = NULL; + } + if (m_view) + { + delete m_view; + m_view = NULL; + } + if (m_cfg) + { + delete m_cfg; + m_cfg = NULL; + } + if (m_main) + { + delete m_main; + m_main = NULL; + } + if (m_view) + { + delete m_view; + m_view = NULL; + } + if (m_search) + { + delete m_search; + m_search = NULL; + } + if (m_manager) +{ + delete m_manager; + m_manager = NULL; + } +} + +static char CLIENTS_CONF[] = "clients.conf"; + +void CorePlugin::loadDir() +{ + //QString saveProfile = getProfile(); + //setProfile(QString::null); + //bool bOK = false; + QString baseName = user_file(QString::null); + QDir dir(baseName); + dir.setFilter(QDir::Dirs); + QStringList list = dir.entryList(); + for (QStringList::Iterator it = list.begin(); it != list.end(); ++it) + { + QString entry = *it; + if (entry[0] == '.') + continue; + QString fname = QString(baseName).append("/").append(entry).append("/").append(CLIENTS_CONF); + QFile f(fname); + if (f.exists()){ + m_profiles.append(entry); + /* + if (entry == saveProfile) + bOK = true; + */ + } + } + /* + if (bOK) + setProfile(saveProfile); + */ +} + +void CorePlugin::prepareConfig() +{ + QString unread_str; + for(list::iterator itUnread = unread.begin(); itUnread != unread.end(); ++itUnread) + { + msg_id &m = (*itUnread); + if (!unread_str.isEmpty()) + unread_str += ';'; + unread_str += QString::number(m.contact); + unread_str += ','; + unread_str += QString::number(m.id); + unread_str += ','; + unread_str += m.client; + } + setValue("Unread", unread_str); + +// unsigned editBgColor = value("EditBackground").toUInt(); +// unsigned editFgColor = value("EditForeground").toUInt(); + + QPalette pal = QApplication::palette(); + if (((pal.color(QPalette::Base).rgb() & 0xFFFFFF) == value("EditBackground").toUInt()) && + ((pal.color(QPalette::Text).rgb() & 0xFFFFFF) == value("EditForeground").toUInt())) + { + setValue("EditBackground", 0xffffff); + setValue("EditForeground", 0xffffff); + } + + QString ef = FontEdit::font2str(editFont, false); + QString def_ef = FontEdit::font2str(QApplication::font(), false); + setValue("EditFont", ef); + if ((ef == def_ef) || !value("EditSaveFont").toBool()) + setValue("EditFont", QString()); + + //clearContainer(); + QString containers; + + QWidgetList list = QApplication::topLevelWidgets(); + QWidget* w; + QVariantMap containerMap; + foreach(w,list) + { + if (w->inherits("Container")) + { + Container *c = static_cast(w); + if (c->isReceived()) + continue; + if (!containers.isEmpty()) + containers += ','; + containers += QString::number(c->getId()); + containerMap.insert(QString::number(c->getId()), c->getState()); + } + } + setValue("Containers", containers); + if (m_main) + { + log(L_DEBUG, "Saving geometry"); + setValue("geometry", m_main->saveGeometry()); + setValue("toolbar_state", m_main->saveState()); + } + +} + +static char BACKUP_SUFFIX[] = "~"; +QByteArray CorePlugin::getConfig() +{ + QString unread_str; + for(list::iterator itUnread = unread.begin(); itUnread != unread.end(); ++itUnread) + { + msg_id &m = (*itUnread); + if (!unread_str.isEmpty()) + unread_str += ';'; + unread_str += QString::number(m.contact); + unread_str += ','; + unread_str += QString::number(m.id); + unread_str += ','; + unread_str += m.client; + } + setValue("Unread", unread_str); + + unsigned editBgColor = value("EditBackground").toUInt(); + unsigned editFgColor = value("EditForeground").toUInt(); + + QPalette pal = QApplication::palette(); + if (((pal.color(QPalette::Base).rgb() & 0xFFFFFF) == value("EditBackground").toUInt()) && + ((pal.color(QPalette::Text).rgb() & 0xFFFFFF) == value("EditForeground").toUInt())) + { + setValue("EditBackground", 0); + setValue("EditForeground", 0); + } + + QString ef = FontEdit::font2str(editFont, false); + QString def_ef = FontEdit::font2str(QApplication::font(), false); + setValue("EditFont", ef); + if ((ef == def_ef) || !value("EditSaveFont").toBool()) + setValue("EditFont", QString()); + + //clearContainer(); + QString containers; + + QWidgetList list = QApplication::topLevelWidgets(); + QWidget* w; + QVariantMap containerMap;// = value("Container").toMap(); + foreach(w,list) + { + if (w->inherits("Container")) + { + Container *c = static_cast(w); + if (c->isReceived()) + continue; + if (!containers.isEmpty()) + containers += ','; + containers += QString::number(c->getId()); + containerMap.insert(QString::number(c->getId()), c->getState()); + } + } + setValue("Containers", containers); + if (m_main) + { + log(L_DEBUG, "Saving geometry"); + setValue("geometry", m_main->saveGeometry()); + setValue("toolbar_state", m_main->saveState()); + /* + if (m_main->m_bar) + { + // Should update main toolbar pos only when toolbar is really exist... + saveToolbar(m_main->m_bar, data.toolBarState); + } + */ + } + + // We should save profile and noshow values in profile-independent _core config, and + // all other values in profile-dependent config. + // FIXME: This is a nasty hack, profile management should be rewritten + + //Saving profile-independent config: + static DataDef generalCoreDataDef[] = + { + { "Profile", DATA_STRING, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + struct TGeneralCoreData + { + SIM::Data Profile; + } GeneralCoreData; + + + QString saveProfile = ProfileManager::instance()->currentProfileName(); + //setProfile(QString::null); + + load_data(generalCoreDataDef, &GeneralCoreData, NULL); // This will just init data + GeneralCoreData.Profile.str() = saveProfile; + //GeneralCoreData.NoShow.asBool() = getNoShow(); + + QByteArray cfg = save_data(generalCoreDataDef, &GeneralCoreData); + + QString cfgName = user_file("plugins.conf"); + QFile fCFG(QString(cfgName).append(BACKUP_SUFFIX)); // use backup file for this ... + if(!fCFG.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + log(L_ERROR, "Can't create %s", qPrintable(cfgName)); + } + else + { + QByteArray write = "[_core]\n"; + write += "enable,"; + write += QByteArray::number(m_base); + write += '\n'; + write += cfg; + fCFG.write(write); + + fCFG.flush(); // Make sure that file is fully written and we will not get "Disk Full" error on fCFG.close + const QFile::FileError status = fCFG.error(); + const QString errorMessage = fCFG.errorString(); + fCFG.close(); + if (status != QFile::NoError) { + log(L_ERROR, "IO error writing to file %s : %s", qPrintable(fCFG.fileName()), qPrintable(errorMessage)); + } + else + { + // rename to normal file + QFileInfo fileInfo(fCFG.fileName()); + QString desiredFileName = fileInfo.fileName(); + desiredFileName = desiredFileName.left(desiredFileName.length() - strlen(BACKUP_SUFFIX)); +//#if defined( WIN32 ) || defined( __OS2__ ) + fileInfo.dir().remove(desiredFileName); +//#endif + if (!fileInfo.dir().rename(fileInfo.fileName(), desiredFileName)) + { + log(L_ERROR, "Can't rename file %s to %s (%s)", (const char*)fileInfo.fileName().toUtf8().data(), (const char*)desiredFileName.toUtf8().data(), fileInfo.dir().path().toUtf8().data()); + } + } + } + + // Saving profile-dependent config: + //setProfile(saveProfile); + cfgName = user_file(CLIENTS_CONF); + QFile f(QString(cfgName).append(BACKUP_SUFFIX)); // use backup file for this ... + if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + log(L_ERROR, "Can't create %s", qPrintable(cfgName)); + }else{ + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + Protocol *protocol = client->protocol(); + QByteArray line = "["; + line += QFile::encodeName(protocol->plugin()->name()).data(); + line += '/'; + line += protocol->description()->text.toUtf8(); + line += "]\n"; + f.write(line); + line = client->getConfig(); + if (line.length()){ + line += '\n'; + f.write(line); + } + } + f.flush(); // Make shure that file is fully written and we will not get "Disk Full" error on f.close + const QFile::FileError status = f.error(); + const QString errorMessage = f.errorString(); + f.close(); + if (status != QFile::NoError) { + log(L_ERROR, "IO error writing to file %s : %s", qPrintable(f.fileName()), qPrintable(errorMessage)); + } else { + // rename to normal file + QFileInfo fileInfo(f.fileName()); + QString desiredFileName = fileInfo.fileName(); + desiredFileName = desiredFileName.left(desiredFileName.length() - strlen(BACKUP_SUFFIX)); +//#if defined( WIN32 ) || defined( __OS2__ ) + fileInfo.dir().remove(desiredFileName); +//#endif + if (!fileInfo.dir().rename(fileInfo.fileName(), desiredFileName)) + { + log(L_ERROR, "Can't rename file %s to %s (%s)", (const char*)fileInfo.fileName().toUtf8().data(), (const char*)desiredFileName.toUtf8().data(), fileInfo.dir().path().toUtf8().data()); + } + } + } + +#ifndef WIN32 + QString dir = user_file(""); + chmod(QFile::encodeName(dir),S_IRUSR | S_IWUSR | S_IXUSR); +#endif + setValue("EditBackground", editBgColor); + setValue("EditForeground", editFgColor); + return QByteArray(); +} + +void CorePlugin::loadUnread() +{ + unread.clear(); + QString unread_str = value("Unread").toString(); + while (!unread_str.isEmpty()){ + QString item = getToken(unread_str, ';'); + unsigned long contact = getToken(item, ',').toULong(); + unsigned long id = getToken(item, ',').toULong(); + Message *msg = History::load(id, item, contact); + if (msg == NULL) + continue; + msg_id m; + m.id = id; + m.contact = contact; + m.client = item; + m.type = msg->baseType(); + unread.push_back(m); + } + setValue("Unread", QString()); +} + +void CorePlugin::clearUnread(unsigned contact_id) +{ + for (list::iterator it = unread.begin(); it != unread.end();) + { + if (it->contact != contact_id) + { + ++it; + continue; + } + unread.erase(it); + it = unread.begin(); + } +} + +Message *CorePlugin::createMessage(const char *type, Buffer *cfg) +{ + MAP_TYPES::iterator itt = types.find(type); + if (itt == types.end()) + return new Message(MessageGeneric, cfg); + + CommandDef *def = messageTypes.find(itt->second); + if (!def) + return new Message(MessageGeneric, cfg); + + MessageDef *mdef = (MessageDef*)(def->param); + if (!mdef->create) + return new Message(MessageGeneric, cfg); + + Message *msg = (mdef->create)(cfg); + if (msg) + return msg; + return new Message(MessageGeneric, cfg); +} + +void CorePlugin::loadClients(const QString& profilename, SIM::ClientList& clients) +{ + QString cfgName = ProfileManager::instance()->rootPath() + QDir::separator() + profilename + QDir::separator() + "clients.conf"; + QFile f(cfgName); + if (!f.open(QIODevice::ReadOnly)) + { + log(L_ERROR, "[1]Can't open %s", qPrintable(cfgName)); + return; + } + Buffer cfg = f.readAll(); + for (;;) + { + QByteArray section = cfg.getSection(); + if (section.isEmpty()) + break; + QString s = section; // ? + ClientPtr client = loadClient(s, &cfg); + if (client) + clients.push_back(client); + } +} + +void CorePlugin::loadClients(SIM::ClientList &clients) +{ + loadClients(ProfileManager::instance()->currentProfileName(), clients); +} + +ClientPtr CorePlugin::loadClient(const QString &name, Buffer *cfg) +{ + if (name.isEmpty()) + return ClientPtr(); + QString clientName = name; + QString pluginName = getToken(clientName, '/'); + if (pluginName.isEmpty() || clientName.length() == 0) + return ClientPtr(); + if(!getPluginManager()->isPluginProtocol(pluginName)) + { + log(L_DEBUG, "Plugin %s is not a protocol plugin", qPrintable(pluginName)); + return ClientPtr(); + } + PluginPtr plugin = getPluginManager()->plugin(pluginName); + if(plugin.isNull()) + { + log(L_WARN, "Plugin %s not found", qPrintable(pluginName)); + return ClientPtr(); + } + ProfileManager::instance()->currentProfile()->enablePlugin(pluginName); + ProtocolPtr protocol; + ProtocolIterator it; + while ((protocol = ++it) != NULL) + if (protocol->description()->text == clientName) + return protocol->createClient(cfg); + log(L_DEBUG, "Protocol %s not found", qPrintable(clientName)); + return ClientPtr(); +} + +bool CorePlugin::adjustClientItem(unsigned id, CommandDef *cmd) +{ + unsigned n = id - CmdClient; + if (n >= getContacts()->nClients()) + return false; + Client *client = getContacts()->getClient(n); + Protocol *protocol = client->protocol(); + const CommandDef *descr = protocol->description(); + cmd->icon = descr->icon; + cmd->text_wrk = clientName(client); + return true; +} + +void CorePlugin::managerFinished() +{ + QTimer::singleShot(0, this, SLOT(destroyManager())); +} + +void CorePlugin::destroyManager() +{ + if (m_manager){ + delete m_manager; + m_manager = NULL; + } +} + +QString CorePlugin::typeName(const QString &name) +{ + QString text = name; + + text.remove('&'); + if (!text.length()) + log(L_DEBUG,"defText is empty!"); + return text; +} + +void CorePlugin::postInit() +{ + m_main->restoreGeometry(value("geometry").toByteArray()); + m_main->restoreState(value("toolbar_state").toByteArray()); +} + +void CorePlugin::loadMenu() +{ + EventMenu(MenuConnections, EventMenu::eRemove).process(); + + unsigned nClients = getContacts()->nClients(); + + EventMenu(MenuConnections, EventMenu::eAdd).process(); + + Command cmd; + cmd->id = CmdCM; + cmd->text = I18N_NOOP("Connection manager"); + cmd->menu_id = MenuConnections; + cmd->menu_grp = 0x8000; + + EventCommandCreate(cmd).process(); + + cmd->id = CmdShowPanel; + cmd->text = I18N_NOOP("Show status panel"); + cmd->menu_grp = 0x8001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + if (nClients >= 2) + { + cmd->id = CmdConnections; + cmd->text = I18N_NOOP("Connections"); + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x8040; + cmd->popup_id = MenuConnections; + cmd->flags = COMMAND_DEFAULT; + } + else + { + cmd->id = CmdConnections; + cmd->text = I18N_NOOP("Connection manager"); + cmd->menu_grp = 0x8040; + cmd->menu_id = MenuMain; + cmd->flags = COMMAND_DEFAULT; + } + EventCommandCreate(cmd).process(); + + if (m_status == NULL) + m_status = new CommonStatus; + + for (unsigned i = 0; i < m_nClients; i++) + EventMenu(CmdClient + i, EventMenu::eRemove).process(); + + for (m_nClients = 0; m_nClients < getContacts()->nClients(); m_nClients++){ + unsigned long menu_id = CmdClient + m_nClients; + EventMenu(menu_id, EventMenu::eAdd).process(); + Client *client = getContacts()->getClient(m_nClients); + Protocol *protocol = client->protocol(); // FIXME there is no protocol, nirvana pointer :( + + CommandDef *cmd = const_cast(protocol->statusList()); + if (cmd){ + Command c; + c->id = CmdTitle; + c->text = "_"; + c->menu_id = menu_id; + c->menu_grp = 0x0001; + c->flags = COMMAND_CHECK_STATE | COMMAND_TITLE; + EventCommandCreate(c).process(); + c->id = CmdCommonStatus; + c->text = I18N_NOOP("Common status"); + c->menu_id = menu_id; + c->menu_grp = 0x3000; + c->flags = COMMAND_CHECK_STATE; + EventCommandCreate(c).process(); + c->id = CmdSetup; + c->text = I18N_NOOP("Configure client"); + c->icon = "configure"; + c->menu_id = menu_id; + c->menu_grp = 0x3001; + c->flags = COMMAND_DEFAULT; + EventCommandCreate(c).process(); + c->id = menu_id; + c->text = "_"; + c->icon = QString::null; + c->menu_id = MenuConnections; + c->menu_grp = 0x1000 + menu_id; + c->popup_id = menu_id; + c->flags = COMMAND_CHECK_STATE; + EventCommandCreate(c).process(); + unsigned id = 0x100; + // for (; cmd->id; cmd++){ + for (; !cmd->text.isEmpty(); cmd++){ + c = *cmd; + c->menu_id = menu_id; + c->menu_grp = id++; + c->flags = COMMAND_CHECK_STATE; + EventCommandCreate(c).process(); + } + if (protocol->description()->flags & PROTOCOL_INVISIBLE){ + c->id = CmdInvisible; + c->text = I18N_NOOP("&Invisible"); + c->icon = protocol->description()->icon_on; + c->menu_grp = 0x1000; + c->flags = COMMAND_CHECK_STATE; + EventCommandCreate(c).process(); + } + } + } + showPanel(); +} + +void CorePlugin::showPanel() +{ + if (m_main == NULL) + return; + bool bShow = value("ShowPanel").toBool(); + if (bShow){ + if (getContacts()->nClients() < 2) + bShow = false; + } + if (bShow){ + if (m_statusWnd == NULL) + m_statusWnd = new StatusWnd; + m_statusWnd->show(); + return; + } + if (m_statusWnd){ + delete m_statusWnd; + m_statusWnd = NULL; + } +} + + +unsigned CorePlugin::getContainerMode() +{ + return value("ContainerMode").toUInt(); //data.ContainerMode.toULong(); +} + +void CorePlugin::setContainerMode(unsigned value) +{ + setValue("ContainerMode", value); + emit modeChanged(value); +} + +QString CorePlugin::clientName(Client *client) +{ + QString s = client->name(); + QString res = i18n(getToken(s, '.')); + res += ' '; + return res + s; +} + +void CorePlugin::checkHistory() +{ + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL) + { + SIM::PropertyHubPtr data = contact->getUserData("history"); + if (data.isNull() || !data->value("CutDays").toBool()) + continue; + QDateTime now(QDateTime::currentDateTime()); + now = now.addSecs(-data->value("Days").toUInt() * 24 * 60 * 60); + History::cut(NULL, contact->id(), now.toTime_t()); + } + QTimer::singleShot(24 * 60 * 60 * 1000, this, SLOT(checkHistory())); +} + +void CorePlugin::setManualStatus(unsigned long status) +{ + if (status == getManualStatus()) + return; + setValue("StatusTime", (unsigned int)QDateTime::currentDateTime().toTime_t()); + //data.ManualStatus.asULong() = status; + setValue("ManualStatus", (uint)status); +} + +void CorePlugin::alertFinished() +{ + if (m_alert) + setValue("NoJoinAlert", m_alert->isChecked()); + m_alert = NULL; +} + +void CorePlugin::focusDestroyed() +{ + m_focus = NULL; +} + +bool CorePlugin::lockProfile(const QString &profile, bool bSend) +{ + if (profile.isEmpty()) + { + if (!m_lock) + return true; + + delete m_lock; + m_lock = NULL; + return true; + } + FileLock *lock = new FileLock(user_file(".lock")); + if (!lock->lock(bSend)) + { + delete lock; + return false; + } + if (m_lock) + delete m_lock; + m_lock = lock; + return true; +} + +void CorePlugin::showMain() +{ + if (m_main) + { + m_main->show(); + raiseWindow(m_main); + } +} + +#ifdef WIN32 + +LockThread::LockThread(Qt::HANDLE _hEvent) +{ + hEvent = _hEvent; +} + +void LockThread::run() +{ + for (;;) + { + DWORD res = WaitForSingleObject(hEvent, INFINITE); + if (res == WAIT_ABANDONED) + break; + QTimer::singleShot(0, CorePlugin::instance(), SLOT(showMain())); + } +} + +// From zlib +// Copyright (C) 1995-2002 Mark Adler + +#define BASE 65521L +#define NMAX 5552 + +#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +unsigned adler32(const char *buf, unsigned len) +{ + unsigned long s1 = 0; + unsigned long s2 = 0; + int k; + while (len > 0) { + k = len < NMAX ? len : NMAX; + len -= k; + while (k >= 16) { + DO16(buf); + buf += 16; + k -= 16; + } + if (k != 0) do { + s1 += *buf++; + s2 += s1; + } while (--k); + s1 %= BASE; + s2 %= BASE; + } + return (s2 << 16) | s1; +} + +#endif + + FileLock::FileLock(const QString &name) +: QFile(name) +{ +#ifdef WIN32 + m_thread = NULL; +#else + m_bLock = false; +#endif +} + +FileLock::~FileLock() +{ +#ifdef WIN32 + if (m_thread) + { + CloseHandle(m_thread->hEvent); + m_thread->wait(1000); + m_thread->terminate(); + delete m_thread; + } +#else + close(); + if (m_bLock) + QFile::remove(fileName()); +#endif +} + +#ifdef WIN32 +bool FileLock::lock(bool bSend) +{ + QString event = "SIM."; + const QByteArray s = fileName().toLocal8Bit(); + event += QString::number(adler32(s.data(), s.length())); + Qt::HANDLE hEvent = OpenEventA(EVENT_MODIFY_STATE, FALSE, event.toLatin1()); + if (hEvent) + { + if (bSend) + SetEvent(hEvent); + CloseHandle(hEvent); + return false; + } + hEvent = CreateEventA(NULL, false, false, event.toLatin1()); + if (hEvent == NULL) + return false; + m_thread = new LockThread(hEvent); + m_thread->start(); +#else + bool FileLock::lock(bool) + { + if (!open(QIODevice::ReadWrite | QIODevice::Truncate)) + { + log(L_WARN, "Can't create %s", qPrintable(fileName())); + return false; + } + struct flock fl; + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 1; + if (fcntl(handle(), F_SETLK, &fl) == -1) + //QFile::remove(name()); + return false; + m_bLock = true; +#endif + return true; + } + +void HistoryThread::run() +{ + QString str = user_file(".history_file"); + History::save(m_id, str); + QProcess *m_ex; + m_ex = new QProcess(); + m_ex->start(m_Viewer, QStringList(str)); +} + +CorePlugin* CorePlugin::instance() +{ + return g_plugin; +} + +unsigned long CorePlugin::getManualStatus() +{ + return value("ManualStatus").toUInt(); +} + +// vim: set expandtab: + diff --git a/plugins/_core/core.h b/plugins/_core/core.h new file mode 100644 index 0000000..7f00514 --- /dev/null +++ b/plugins/_core/core.h @@ -0,0 +1,345 @@ +/*************************************************************************** + core.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _CORE_H +#define _CORE_H + +#include +#include +#include + +#include +#include +#include +#include + +#include "cmddef.h" +#include "event.h" +#include "misc.h" +#include "plugins.h" +#include "propertyhub.h" +#include "core_consts.h" +#include "clientlist.h" +#include "simapi.h" + +using namespace std; + +typedef map MAP_TYPES; + +struct msg_id +{ + unsigned id; + unsigned contact; + unsigned type; + QString client; +}; + +class FileLock; +class QWidget; +class QTranslator; +class QMimeSource; +class Commands; +class MainWindow; +class UserView; +class SearchDialog; +class CommonStatus; +class StatusWnd; +class ConnectionManager; + +const unsigned CONTAINER_SIMPLE = 0; +const unsigned CONTAINER_NEW = 1; +const unsigned CONTAINER_GROUP = 2; +const unsigned CONTAINER_ALL = 3; + +const unsigned CONTAINER_GRP = 0x80000000; + +const unsigned char SORT_NONE = 0; +const unsigned char SORT_STATUS = 1; +const unsigned char SORT_ACTIVE = 2; +const unsigned char SORT_NAME = 3; + +const unsigned NEW_MSG_NOOPEN = 0; +const unsigned NEW_MSG_MINIMIZE = 1; +const unsigned NEW_MSG_RAISE = 2; + +#include "core_events.h" + +const unsigned MESSAGE_DEFAULT = 0x0000; +const unsigned MESSAGE_SILENT = 0x0001; +const unsigned MESSAGE_HIDDEN = 0x0002; +const unsigned MESSAGE_SENDONLY = 0x0004; +const unsigned MESSAGE_INFO = 0x0008; +const unsigned MESSAGE_SYSTEM = 0x0010; +const unsigned MESSAGE_ERROR = 0x0020; +const unsigned MESSAGE_CHILD = 0x0040; + +const unsigned MIN_INPUT_BAR_ID = 0x1010; +const unsigned MAX_INPUT_BAR_ID = 0x1500; + +const unsigned STYLE_UNDER = 1; +const unsigned STYLE_ITALIC = 2; +const unsigned STYLE_STRIKE = 4; + +class MsgEdit; + +struct MessageDef +{ + const SIM::CommandDef *cmdReceived; + const SIM::CommandDef *cmdSent; + unsigned flags; + const char *singular; + const char *plural; + SIM::Message* (*create)(Buffer *cfg); + QObject* (*generate)(MsgEdit *edit, SIM::Message *msg); + SIM::Message* (*drag)(QMimeSource*); +}; + +struct clientContact +{ + SIM::clientData *data; + SIM::Client *client; + bool bNew; +}; + + +class Tmpl; +class XSL; +class BalloonMsg; + +class HistoryThread : public QThread +{ +public: + virtual void run(); + void set_id(unsigned id) {m_id=id;} + void set_Viewer(const QString &Viewer) {m_Viewer=Viewer;} +protected: + unsigned m_id; + QString m_Viewer; +}; + +// Lets do this later whole in one, because at the moment it only breaks linking of all other plugins... +#ifndef CORE_EXPORT +# ifdef CORE_EXPORTS +# define CORE_EXPORT Q_DECL_EXPORT +# else // CORE_EXPORTS +# define CORE_EXPORT Q_DECL_IMPORT +# endif // CORE_EXPORTS +#endif // CORE_EXPORT + +class CORE_EXPORT CorePlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + CorePlugin(unsigned, Buffer*); + virtual ~CorePlugin(); + void setManualStatus(unsigned long status); + unsigned long getManualStatus(); + unsigned getContainerMode(); + void setContainerMode(unsigned); + void setRegNew(bool p_new) {m_RegNew=p_new;} + bool getRegNew() const {return m_RegNew;} + MainWindow *getMainWindow() { return m_main; }; + + SIM::CommandsMap preferences; + SIM::CommandsMap messageTypes; + MAP_TYPES types; + + list unread; + + QFont editFont; + SIM::Message *createMessage(const char *type, Buffer *cfg); + QString clientName(SIM::Client *client); + + XSL *historyXSL; + static CorePlugin* instance(); + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); + + void changeClientStatus(SIM::Client* client, const SIM::IMStatusPtr& status); + +signals: + void modeChanged(int); +protected slots: + void dialogFinished(); + void dialogDestroy(); + void managerFinished(); + void destroyManager(); + void selectProfile(); + void checkHistory(); + void alertFinished(); + void focusDestroyed(); + void showMain(); + void postInit(); + void ignoreEvents(bool i); +protected: + + virtual bool processEvent(SIM::Event*); + virtual QByteArray getConfig(); + virtual QWidget *createConfigWindow(QWidget *parent); + void createEventCmds(); + void showInfo(SIM::CommandDef *cmd); + bool init(bool bFirst); + void destroy(); + void loadDir(); + void loadClients(SIM::ClientList&); + void loadClients(const QString& profilename, SIM::ClientList&); + void loadMenu(); + QString tsFile(const QString &lang); + SIM::ClientPtr loadClient(const QString &name, Buffer *cfg); + bool adjustClientItem(unsigned id, SIM::CommandDef *cmd); + void showPanel(); + void hideWindows(); + void changeProfile(const QString& profilename); + void installTranslator(); + void removeTranslator(); + void initData(); + void loadUnread(); + void clearUnread(unsigned contact_id); + SIM::Client* getClient(unsigned i); + void getWays(vector &ways, SIM::Contact *contact); + QString typeName(const QString &name); + void setAutoReplies(); + bool lockProfile(const QString &profile, bool bSend = false); + + void createMainToolbar(); + bool updateMainToolbar(unsigned long commandID); + void createHistoryToolbar(); + void createContainerToolbar(); + void createMsgEditToolbar(); + void createTextEditToolbar(); + void createMenuMsgView(); // in msgview_menu.cpp + void createMenuTextEdit(); // in textedit_menu.cpp + + void prepareConfig(); + + bool m_bInit; + QStringList m_profiles; + QWidget *m_cfg; + QWidget *m_focus; + UserView *m_view; + SearchDialog *m_search; + QTranslator *m_translator; + ConnectionManager *m_manager; + CommonStatus *m_status; + StatusWnd *m_statusWnd; + unsigned m_nClients; + unsigned m_nClientsMenu; + unsigned m_nResourceMenu; + MainWindow *m_main; + BalloonMsg *m_alert; + FileLock *m_lock; + bool m_RegNew; + Tmpl *m_tmpl; + Commands *m_cmds; + HistoryThread *m_HistoryThread; + +private: + bool m_bIgnoreEvents; + SIM::PropertyHubPtr m_propertyHub; + + // Event handlers: + bool processEventIconChanged(); + bool processEventJoinAlert(); + bool processEventGroup(SIM::Event* e); + bool processEventDeleteMessage(SIM::Event* e); + bool processEventRewriteMessage(SIM::Event* e); + bool processEventTmplHelp(SIM::Event* e); + bool processEventTmplHelpList(SIM::Event* e); + bool processEventARRequest(SIM::Event* e); + bool processEventSaveState(SIM::Event* e); + bool processEventPluginChanged(SIM::Event* e); + bool processEventInit(SIM::Event* e); + bool processEventHomeDir(SIM::Event* e); + bool processEventGetProfile(SIM::Event* e); + bool processEventAddPreferences(SIM::Event* e); + bool processEventRemovePreferences(SIM::Event* e); + bool processEventClientChanged(SIM::Event* e); + bool processEventCreateMessageType(SIM::Event* e); + bool processEventRemoveMessageType(SIM::Event* e); + bool processEventContact(SIM::Event* e); + bool processEventMessageAcked(SIM::Event* e); + bool processEventMessageDeleted(SIM::Event* e); + bool processEventMessageReceived(SIM::Event* e); + bool processEventSent(SIM::Event* e); + bool processEventDefaultAction(SIM::Event* e); + bool processEventLoadMessage(SIM::Event* e); + bool processEventOpenMessage(SIM::Event* e); + bool processEventCheckCommandState(SIM::Event* e); + bool processEventCommandExec(SIM::Event* e); + bool processEventGoURL(SIM::Event* e); + + bool processCheckCmdChangeEncoding(SIM::CommandDef* cmd); + bool processCheckCmdAllEncodings(SIM::CommandDef* cmd); + bool processCheckCmdEnableSpell(SIM::CommandDef* cmd); + bool processCheckCmdSendClose(SIM::CommandDef* cmd); + bool processCheckCmdContactClients(SIM::CommandDef* cmd); + bool processCheckMenuContainer(SIM::CommandDef* cmd); + bool processCheckMenuMessage(SIM::CommandDef* cmd); + bool processCheckMenuMsgCommand(SIM::CommandDef* cmd); + bool processCheckCmdPhoneLocation(SIM::CommandDef* cmd); + bool processCheckCmdUnread(SIM::CommandDef* cmd); + bool processCheckCmdSendSMS(SIM::CommandDef* cmd); + bool processCheckCmdShowPanel(SIM::CommandDef* cmd); + bool processCheckCmdCommonStatus(SIM::CommandDef* cmd); + + bool processExecMenuEncoding(SIM::CommandDef* cmd); + bool processExecMenuMessage(SIM::CommandDef* cmd); + bool processExecMenuMsgCommand(SIM::CommandDef* cmd); + bool processExecCmdGrantAuth(SIM::CommandDef* cmd); + bool processExecCmdRefuseAuth(SIM::CommandDef* cmd); + bool processExecCmdSeparate(SIM::CommandDef* cmd); + bool processExecCmdSendSMS(SIM::CommandDef* cmd); + bool processExecCmdHistory(SIM::CommandDef* cmd); + bool processExecCmdConfigure(SIM::CommandDef* cmd); + bool processExecCmdSearch(SIM::CommandDef* cmd); + bool processExecMenuPhoneState(SIM::CommandDef* cmd); + bool processExecMenuPhoneLocation(SIM::CommandDef* cmd); + bool processExecCmdSetup(SIM::CommandDef* cmd); + bool processExecCmdPhoneBook(SIM::CommandDef* cmd); + bool processExecCmdCommonStatus(SIM::CommandDef* cmd); + + bool processStatusChange(int clientnum, SIM::CommandDef* cmd); + + void createCommand(int id, const QString& text, const QString& icon, int menu_id, + int menu_grp, int bar_id, int bar_grp, int flags, const QString& accel); + + friend class MainWindow; + friend class UserView; + friend class UserConfig; + friend class SearchDialog; + friend class LangConfig; + friend class CommonStatus; + friend class LoginDialog; + friend class StatusWnd; + friend class InterfaceConfig; + friend class ConnectionManager; + friend class Container; + friend class UserWnd; + friend class MsgEdit; + friend class HistoryWindow; + friend class Tmpl; +}; + +#define GET_CorePlugin() ( static_cast(SIM::getPluginManager()->plugin("_core").data()) ) + +#endif + +// vim: set expandtab: + diff --git a/plugins/_core/core.rc b/plugins/_core/core.rc new file mode 100644 index 0000000..a687f4c --- /dev/null +++ b/plugins/_core/core.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Core plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "_core\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "_core.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/_core/core_consts.h b/plugins/_core/core_consts.h new file mode 100644 index 0000000..f98b40c --- /dev/null +++ b/plugins/_core/core_consts.h @@ -0,0 +1,198 @@ +/*************************************************************************** + core_consts.h + + This file defines constants for Command IDs, Menu IDs and ToolBar + IDs. + + Command ID (const named CmdXXXXX) is an unic int number which is + associated with certain command. In most cases commands are + associtated with menu(or toolbar) items, so one may say that CmdXXXXXX + is an unique id of menu(or toolbar) item. + + Menu ID (const named MenuXXXXX) is a unique number which is + associated with each menu(main menu, context menu, etc... any menu in + Sim-IM has it's own Menu ID). It is used for creating and showing + certain menu, and, as well, to specify pull down menu for certain menu + item. + + ToolBar ID (const namedToolBarXXXXXX) - an unique number that + identifies certain toolbar. + + ------------------- + begin : Tue Nov 30 2008 + based on : core.h of Sim-IM by Vladimir Shutoff + and Sim-IM team + copyright : (C) 2002 - 2004 Vladimir Shutoff + (C) 2004 - 2008 Sim-IM Development Team + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _CORE_CONSTS_H +#define _CORE_CONSTS_H + +const unsigned long CmdBase = 0x00020000; +const unsigned long CmdInfo = (CmdBase + 0x001); +const unsigned long CmdSearch = (CmdBase + 0x002); +const unsigned long CmdConnections = (CmdBase + 0x003); +const unsigned long CmdCM = (CmdBase + 0x004); +const unsigned long CmdProfileChange = (CmdBase + 0x005); +const unsigned long CmdShowPanel = (CmdBase + 0x006); +const unsigned long CmdCommonStatus = (CmdBase + 0x007); +const unsigned long CmdTitle = (CmdBase + 0x008); +const unsigned long CmdSetup = (CmdBase + 0x009); +const unsigned long CmdMainWindow = (CmdBase + 0x00B); // 11 +const unsigned long CmdUserView = (CmdBase + 0x00C); // 12 +const unsigned long CmdContainer = (CmdBase + 0x00D); // 13 +const unsigned long CmdClose = (CmdBase + 0x00E); // 14 +const unsigned long CmdContainerContact = (CmdBase + 0x00F); // 15 +const unsigned long CmdContainerContacts = (CmdBase + 0x010); // 16 +const unsigned long CmdSendMessage = (CmdBase + 0x011); // 17 +const unsigned long CmdSend = (CmdBase + 0x012); // 18 +const unsigned long CmdStatusMenu = (CmdBase + 0x014); // 20 +const unsigned long CmdStatusBar = (CmdBase + 0x015); // 21 +const unsigned long CmdMenu = (CmdBase + 0x017); // 23 +const unsigned long CmdOnline = (CmdBase + 0x018); // 24 //FIXME: Rename to CmdShowOfflineContacts to make code more sensible +const unsigned long CmdGroup = (CmdBase + 0x019); // 25 +const unsigned long CmdGrpOff = (CmdBase + 0x01A); // 26 +const unsigned long CmdGrpMode1 = (CmdBase + 0x01B); // 27 +const unsigned long CmdGrpMode2 = (CmdBase + 0x01C); // 28 +const unsigned long CmdGrpCreate = (CmdBase + 0x01D); // 29 +const unsigned long CmdGrpRename = (CmdBase + 0x01E); // 30 +const unsigned long CmdGrpDelete = (CmdBase + 0x01F); // 31 +const unsigned long CmdGrpTitle = (CmdBase + 0x020); // 32 +const unsigned long CmdGrpUp = (CmdBase + 0x021); // 33 +const unsigned long CmdGrpDown = (CmdBase + 0x022); // 34 +const unsigned long CmdContactTitle = (CmdBase + 0x023); // 35 +const unsigned long CmdContactRename = (CmdBase + 0x024); // 36 +const unsigned long CmdContactDelete = (CmdBase + 0x025); // 37 +const unsigned long CmdConfigure = (CmdBase + 0x026); // 38 +const unsigned long CmdMessageType = (CmdBase + 0x027); // 39 +const unsigned long CmdSendClose = (CmdBase + 0x028); // 40 +const unsigned long CmdSmile = (CmdBase + 0x029); // 41 +const unsigned long CmdMultiply = (CmdBase + 0x02A); // 42 +const unsigned long CmdSendSMS = (CmdBase + 0x02B); // 43 +const unsigned long CmdInvisible = (CmdBase + 0x02C); // 44 +const unsigned long CmdHistory = (CmdBase + 0x02D); // 45 +const unsigned long CmdHistorySave = (CmdBase + 0x02E); // 46 +const unsigned long CmdHistoryDirection = (CmdBase + 0x02F); // 47 +const unsigned long CmdHistoryNext = (CmdBase + 0x030); // 48 +const unsigned long CmdHistoryPrev = (CmdBase + 0x031); // 49 +const unsigned long CmdMsgOpen = (CmdBase + 0x033); // 51 +const unsigned long CmdMsgQuote = (CmdBase + 0x035); // 53 +const unsigned long CmdMsgAnswer = (CmdBase + 0x036); // 54 +const unsigned long CmdMsgForward = (CmdBase + 0x037); // 55 +const unsigned long CmdCopy = (CmdBase + 0x038); // 56 +const unsigned long CmdCut = (CmdBase + 0x039); // 57 +const unsigned long CmdPaste = (CmdBase + 0x03A); // 58 +const unsigned long CmdSelectAll = (CmdBase + 0x03B); // 59 +const unsigned long CmdUndo = (CmdBase + 0x03C); // 60 +const unsigned long CmdRedo = (CmdBase + 0x03D); // 61 +const unsigned long CmdClear = (CmdBase + 0x03E); // 62 +const unsigned long CmdSeparate = (CmdBase + 0x03F); // 63 +const unsigned long CmdNextMessage = (CmdBase + 0x041); // 65 +const unsigned long CmdGrantAuth = (CmdBase + 0x042); // 66 +const unsigned long CmdRefuseAuth = (CmdBase + 0x043); // 67 +const unsigned long CmdPhones = (CmdBase + 0x047); // 71 +const unsigned long CmdPhoneLocation = (CmdBase + 0x048); // 72 +const unsigned long CmdPhoneState = (CmdBase + 0x049); // 73 +const unsigned long CmdPhoneNoShow = (CmdBase + 0x04A); // 74 +const unsigned long CmdPhoneAvailable = (CmdBase + 0x04B); // 75 +const unsigned long CmdPhoneBusy = (CmdBase + 0x04C); // 76 +const unsigned long CmdPhoneBook = (CmdBase + 0x04D); // 77 +const unsigned long CmdShowAlways = (CmdBase + 0x04E); // 78 +const unsigned long CmdFileAccept = (CmdBase + 0x04F); // 79 +const unsigned long CmdFileDecline = (CmdBase + 0x050); // 80 +const unsigned long CmdDeclineWithoutReason = (CmdBase + 0x051); // 81 +const unsigned long CmdDeclineReasonInput = (CmdBase + 0x052); // 82 +const unsigned long CmdDeclineReasonBusy = (CmdBase + 0x053); // 83 +const unsigned long CmdDeclineReasonLater = (CmdBase + 0x054); // 84 +const unsigned long CmdHistoryFind = (CmdBase + 0x055); // 85 +const unsigned long CmdFileName = (CmdBase + 0x056); // 86 +const unsigned long CmdPhoneNumber = (CmdBase + 0x057); // 87 +const unsigned long CmdTranslit = (CmdBase + 0x058); // 88 +const unsigned long CmdUrlInput = (CmdBase + 0x059); // 89 +const unsigned long CmdCutHistory = (CmdBase + 0x05A); // 90 +const unsigned long CmdDeleteMessage = (CmdBase + 0x05B); // 91 +const unsigned long CmdEditList = (CmdBase + 0x05C); // 92 +const unsigned long CmdRemoveList = (CmdBase + 0x05D); // 93 +const unsigned long CmdStatusWnd = (CmdBase + 0x05E); // 94 +const unsigned long CmdEmptyGroup = (CmdBase + 0x05F); // 95 +const unsigned long CmdEnableSpell = (CmdBase + 0x060); // 96 +const unsigned long CmdSpell = (CmdBase + 0x061); // 97 +const unsigned long CmdChangeEncoding = (CmdBase + 0x062); // 98 +const unsigned long CmdAllEncodings = (CmdBase + 0x063); // 99 +const unsigned long CmdSearchInfo = (CmdBase + 0x065); // 101 +const unsigned long CmdSearchMsg = (CmdBase + 0x066); // 102 +const unsigned long CmdSearchOptions = (CmdBase + 0x067); // 103 +const unsigned long CmdFetchAway = (CmdBase + 0x068); // 104 +const unsigned long CmdHistoryAvatar = (CmdBase + 0x069); // 105 +const unsigned long CmdQuit = (CmdBase + 0x070); // 106 +const unsigned long CmdGroupToolbarButton = (CmdBase + 0x071); // 107 + +const unsigned long CmdContactGroup = (CmdBase + 0x100); +const unsigned long CmdUnread = (CmdBase + 0x200); +const unsigned long CmdContactClients = (CmdBase + 0x300); +const unsigned long CmdMsgSpecial = (CmdBase + 0x400); +const unsigned long CmdClient = (CmdBase + 0x500); +const unsigned long CmdContactResource = (CmdBase + 0x600); +const unsigned long CmdReceived = 0x600; //FIXME: Why it does not have CmdBase in it? + +// These consts are really defined at textshow.h, but listed here +// as a comments, in order to have a full comand list in one file: +// +//const unsigned TextCmdBase = 0x00030000; +//const unsigned CmdBgColor = TextCmdBase; +//const unsigned CmdFgColor = TextCmdBase + 1; +//const unsigned CmdBold = TextCmdBase + 2; +//const unsigned CmdItalic = TextCmdBase + 3; +//const unsigned CmdUnderline = TextCmdBase + 4; +//const unsigned CmdFont = TextCmdBase + 5; + +// *** Here we defines ids for all menus used in _core plugin *** + +// Main menu and it's submenus +const unsigned MenuMain = 0x0001; +const unsigned MenuStatus = 0x0002; +const unsigned MenuGroups = 0x0003; +const unsigned MenuPhones = 0x0004; +const unsigned MenuPhoneLocation = 0x0005; +const unsigned MenuPhoneState = 0x0006; +const unsigned MenuConnections = 0x0007; +// other menus +const unsigned MenuGroup = 0x1001; // Context menu for Group item in userlist +const unsigned MenuContact = 0x1002; // Context menu for Contact item in userlist +const unsigned MenuContactGroup = 0x1003; +const unsigned MenuContainer = 0x1004; +const unsigned MenuMessage = 0x1005; +const unsigned MenuContainerContact = 0x1006; +const unsigned MenuMsgView = 0x1007; +const unsigned MenuTextEdit = 0x1008; +const unsigned MenuMsgCommand = 0x1009; +const unsigned MenuFileDecline = 0x100A; +const unsigned MenuMailList = 0x100B; +const unsigned MenuPhoneList = 0x100C; +const unsigned MenuStatusWnd = 0x100D; +const unsigned MenuEncoding = 0x100E; +const unsigned MenuSearchItem = 0x100F; +const unsigned MenuSearchGroups = 0x1010; +const unsigned MenuSearchOptions = 0x1011; + +// *** Here we defines ids for all toolbars used in _core plugin *** + +const unsigned ToolBarMain = 1; +const unsigned ToolBarContainer = 2; +const unsigned ToolBarTextEdit = 3; +const unsigned ToolBarMsgEdit = 4; +const unsigned ToolBarHistory = 5; +const unsigned ToolBarHistoryAvatar = 6; + + +#endif diff --git a/plugins/_core/core_events.h b/plugins/_core/core_events.h new file mode 100644 index 0000000..9d371c3 --- /dev/null +++ b/plugins/_core/core_events.h @@ -0,0 +1,269 @@ +#ifndef _CORE_EVENTS_H +#define _CORE_EVENTS_H + +#include "event.h" + +class Tmpl; +class MsgEdit; + +struct CutHistory; + +// EventARRequest +struct ARRequest +{ + SIM::Contact *contact; + unsigned status; + SIM::EventReceiver *receiver; + void *param; +}; + +class EventCreateMessageType : public SIM::Event +{ +public: + EventCreateMessageType(SIM::CommandDef *def) + : Event(SIM::eEventCreateMessageType), m_def(def) {}; + + SIM::CommandDef *def() const { return m_def; } +protected: + SIM::CommandDef *m_def; +}; + +class EventRemoveMessageType : public SIM::Event +{ +public: + EventRemoveMessageType(unsigned long id) + : Event(SIM::eEventRemoveMessageType), m_id(id) {}; + + unsigned long id() const { return m_id; } +protected: + unsigned long m_id; +}; + +class EventRealSendMessage : public SIM::EventMessage +{ +public: + EventRealSendMessage(SIM::Message *msg, MsgEdit *edit) + : EventMessage(SIM::eEventRealSendMessage, msg), m_edit(edit) {} + + MsgEdit *edit() const { return m_edit; } +protected: + MsgEdit *m_edit; +}; + +class EventHistoryConfig : public SIM::Event +{ +public: + EventHistoryConfig(unsigned long contact_id) + : Event(SIM::eEventHistoryConfig), m_id(contact_id) {} + + unsigned long id() const { return m_id; } +protected: + unsigned long m_id; +}; + +class EventHistoryColors : public SIM::Event +{ +public: + EventHistoryColors() : Event(SIM::eEventHistoryColors) {} +}; + +class EventTemplate : public SIM::Event +{ +public: + struct TemplateExpand { + QString tmpl; + SIM::Contact *contact; + SIM::EventReceiver *receiver; + void *param; + }; +public: + EventTemplate(SIM::SIMEvent e, TemplateExpand *te) + : Event(e), m_te(te) {} + + TemplateExpand *templateExpand() const { return m_te; } +protected: + TemplateExpand *m_te; +}; + +class EventTemplateExpand : public EventTemplate +{ +public: + EventTemplateExpand(TemplateExpand *te) + : EventTemplate(SIM::eEventTemplateExpand, te) {} +}; + +class EventTemplateExpanded : public EventTemplate +{ +public: + EventTemplateExpanded(TemplateExpand *te) + : EventTemplate(SIM::eEventTemplateExpanded, te) {} +}; + +class EventARRequest : public SIM::Event +{ +public: + EventARRequest(ARRequest *ar) + : Event(SIM::eEventARRequest), m_ar(ar){} + + ARRequest *request() const { return m_ar; } +protected: + ARRequest *m_ar; +}; + +class EventClientStatus : public SIM::Event +{ +public: + EventClientStatus() : Event(SIM::eEventClientStatus) {} +}; + +class EventLoadMessage : public SIM::Event +{ +public: + EventLoadMessage(unsigned long id, const QString &client, unsigned long contact) + : Event(SIM::eEventLoadMessage), m_id(id), m_client(client), + m_contact(contact), m_msg(NULL) {} + + unsigned long id() const { return m_id; } + const QString client() const { return m_client; } + unsigned long contact() const { return m_contact; } + // out + void setMessage(SIM::Message *msg) { m_msg = msg; } + SIM::Message *message() const { return m_msg; } +protected: + unsigned long m_id; + QString m_client; + unsigned long m_contact; + SIM::Message *m_msg; +}; + +class EventDefaultAction : public SIM::Event +{ +public: + EventDefaultAction(unsigned long contact_id) + : Event(SIM::eEventDefaultAction), m_id(contact_id) {} + + unsigned long id() const { return m_id; } +protected: + unsigned long m_id; +}; + +class EventContactClient : public SIM::Event +{ +public: + EventContactClient(SIM::Contact *contact) + : Event(SIM::eEventContactClient), m_contact(contact) {} + + SIM::Contact *contact() const { return m_contact; } +protected: + SIM::Contact *m_contact; +}; + +class EventActiveContact : public SIM::Event +{ +public: + EventActiveContact() + : Event(SIM::eEventActiveContact), m_id(0) {} + + // out + void setContactID(unsigned long id) { m_id = id; } + unsigned long contactID() const { return m_id; } +protected: + unsigned long m_id; +}; + +class EventMessageRetry : public SIM::Event +{ +public: + struct MsgSend + { + SIM::Message *msg; + MsgEdit *edit; + }; +public: + EventMessageRetry(MsgSend *msgRetry) + : Event(SIM::eEventMessageRetry), m_msgRetry(msgRetry) {} + + MsgSend *msgRetry() const { return m_msgRetry; } +protected: + MsgSend *m_msgRetry; +}; + +class EventCheckSend : public SIM::Event +{ +public: + // FIXME: void *data + EventCheckSend(unsigned long id, SIM::Client *client, void *data) + : Event(SIM::eEventCheckSend), m_id(id), m_client(client), m_data(data) {} + + unsigned long id() const { return m_id; } + SIM::Client *client() const { return m_client; } + void *data() const { return m_data; } +protected: + unsigned long m_id; + SIM::Client *m_client; + void *m_data; +}; + +class EventCutHistory : public SIM::Event +{ +public: + EventCutHistory(CutHistory *cut) + : Event(SIM::eEventCutHistory), m_cut(cut) {} + + CutHistory *cut() const { return m_cut; } +protected: + CutHistory *m_cut; +}; + +class EventTmplHelp : public SIM::Event +{ +public: + EventTmplHelp(const QString &helpString) + : Event(SIM::eEventTmplHelp), m_help(helpString) {} + + // in & out + void setHelp(const QString &help) { m_help = help; } + const QString &help() const { return m_help; } +protected: + QString m_help; +}; + +class EventTmplHelpList : public SIM::Event +{ +public: + EventTmplHelpList() : Event(SIM::eEventTmplHelpList) {} + + // out, fixme - use QStringList + void setHelpList(const char **helpList) { m_helpList = helpList; } + const char **helpList() const { return m_helpList; } +protected: + const char **m_helpList; +}; + +class EventJoinAlert : public SIM::Event +{ +public: + EventJoinAlert(SIM::Client *client) + : Event(SIM::eEventJoinAlert), m_client(client) {} + + SIM::Client *client() const { return m_client; } +protected: + SIM::Client *m_client; +}; + +class EventDeleteMessage : public SIM::EventMessage +{ +public: + EventDeleteMessage(SIM::Message *msg) + : EventMessage(SIM::eEventDeleteMessage, msg) {} +}; + +class EventRewriteMessage : public SIM::EventMessage +{ +public: + EventRewriteMessage(SIM::Message *msg) + : EventMessage(SIM::eEventRewriteMessage, msg) {} +}; + +#endif + diff --git a/plugins/_core/core_pch.h b/plugins/_core/core_pch.h new file mode 100644 index 0000000..f6fdce7 --- /dev/null +++ b/plugins/_core/core_pch.h @@ -0,0 +1,119 @@ +#pragma once + +#include +#include + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//Fixme: +//#ifndef NO_QT_MOC_HEADER +#include +/*#include +#include +#endif*/ + +#include "arcfg.h" +#include "ui_arcfgbase.h" +#include "autoreply.h" +#include "ui_autoreplybase.h" +#include "cfgdlg.h" +#include "ui_cfgdlgbase.h" +#include "cmenu.h" +#include "commands.h" +#include "connectionsettings.h" +#include "ui_connectionsettingsbase.h" +#include "connectwnd.h" +#include "ui_connectwndbase.h" +#include "container.h" +#include "core.h" +#include "declinedlg.h" +#include "ui_declinedlgbase.h" +#include "editmail.h" +#include "ui_editmailbase.h" +#include "editphone.h" +#include "ui_editphonebase.h" +#include "filecfg.h" +#include "ui_filecfgbase.h" +#include "filetransfer.h" +#include "ui_filetransferbase.h" +#include "history.h" +#include "historycfg.h" +#include "ui_historycfgbase.h" +#include "historywnd.h" +#include "interfacecfg.h" +#include "ui_interfacecfgbase.h" +#include "maininfo.h" +#include "ui_maininfobase.h" +#include "mainwin.h" +#include "manager.h" +#include "ui_managerbase.h" +#include "msgauth.h" +#include "msgcfg.h" +#include "ui_msgcfgbase.h" +#include "msgcontacts.h" +#include "msgedit.h" +#include "msgfile.h" +#include "msggen.h" +#include "msgrecv.h" +#include "msgsms.h" +#include "msgurl.h" +#include "msgview.h" +#include "newprotocol.h" +#include "ui_newprotocolbase.h" +#include "nonim.h" +#include "ui_nonimbase.h" +#include "ui_pagerbase.h" +#include "pagerdetails.h" +#include "ui_phonebase.h" +#include "phonedetails.h" +#include "plugincfg.h" +#include "ui_plugincfgbase.h" +#include "prefcfg.h" +#include "ui_prefcfgbase.h" +#include "search.h" +#include "searchall.h" +#include "ui_searchallbase.h" +#include "ui_searchbase.h" +#include "smscfg.h" +#include "ui_smscfgbase.h" +#include "status.h" +#include "statuswnd.h" +#include "tmpl.h" +#include "toolbarcfg.h" +#include "toolsetup.h" +#include "ui_toolsetupbase.h" +#include "usercfg.h" +#include "userhistorycfg.h" +#include "ui_userhistorycfgbase.h" +#include "userlist.h" +#include "userview.h" +#include "userviewcfg.h" +#include "ui_userviewcfgbase.h" +#include "userwnd.h" +#include "logindlg.h" +#include "ui_logindlgbase.h" \ No newline at end of file diff --git a/plugins/_core/declinedlg.cpp b/plugins/_core/declinedlg.cpp new file mode 100644 index 0000000..3d56a10 --- /dev/null +++ b/plugins/_core/declinedlg.cpp @@ -0,0 +1,66 @@ +/*************************************************************************** + declinedlg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "misc.h" +#include "declinedlg.h" + +#include +#include + +using namespace SIM; + +DeclineDlg::DeclineDlg(Message *msg) + : QDialog(NULL) + , m_msg (msg) + //: DeclineDlgBase(NULL, NULL, false, Qt::WDestructiveClose) +{ + setupUi(this); + + SET_WNDPROC("decline") + setWindowIcon(Icon("file")); + setButtonsPict(this); +} + +DeclineDlg::~DeclineDlg() +{ +} + +void DeclineDlg::accept() +{ + EventMessageDecline(m_msg, edtReason->text()); + QDialog::accept(); +} + +bool DeclineDlg::processEvent(Event *e) +{ + if (e->type() == eEventMessageDeleted) + { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->id() == m_msg->id()) + close(); + } + return false; +} + +/* +#ifndef NO_MOC_INCLUDES +#include "declinedlg.moc" +#endif +*/ + diff --git a/plugins/_core/declinedlg.h b/plugins/_core/declinedlg.h new file mode 100644 index 0000000..11763ba --- /dev/null +++ b/plugins/_core/declinedlg.h @@ -0,0 +1,38 @@ +/*************************************************************************** + declinedlg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _DECLINEDLG_H +#define _DECLINEDLG_H + +#include "ui_declinedlgbase.h" +#include "event.h" + +class DeclineDlg : public QDialog, public Ui::DeclineDlgBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + DeclineDlg(SIM::Message *msg); + ~DeclineDlg(); + SIM::Message *message() { return m_msg; } +protected: + virtual bool processEvent(SIM::Event*); + void accept(); + SIM::Message *m_msg; +}; + +#endif + diff --git a/plugins/_core/declinedlgbase.ui b/plugins/_core/declinedlgbase.ui new file mode 100644 index 0000000..4251781 --- /dev/null +++ b/plugins/_core/declinedlgbase.ui @@ -0,0 +1,123 @@ + + + + + DeclineDlgBase + + + + 0 + 0 + 438 + 112 + + + + Decline reason + + + true + + + + 11 + + + 6 + + + + + Enter decline reason: + + + false + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + 0 + + + 6 + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + qPixmapFromMimeSource + + + buttonOk + clicked() + DeclineDlg + accept() + + + buttonCancel + clicked() + DeclineDlg + reject() + + + diff --git a/plugins/_core/editmail.cpp b/plugins/_core/editmail.cpp new file mode 100644 index 0000000..f47a0ac --- /dev/null +++ b/plugins/_core/editmail.cpp @@ -0,0 +1,61 @@ +/*************************************************************************** + editmail.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "misc.h" +#include "editmail.h" + +#include +#include +#include +#include + +using namespace SIM; + +EditMail::EditMail(QWidget *parent, const QString &mail, bool bPublish, bool bShowPublish) + : QDialog(parent) +{ + setupUi(this); + setObjectName("editmail"); + SET_WNDPROC("editmail") + setWindowIcon(Icon("mail_generic")); + setButtonsPict(this); + setWindowTitle(mail.isEmpty() ? i18n("Add mail address") : i18n("Edit mail address")); + edtMail->setText(mail); + connect(edtMail, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + textChanged(mail); + edtMail->setFocus(); + publish = bPublish; + if (bShowPublish) + { + chkPublish->setChecked(publish); + return; + } + chkPublish->hide(); +} + +void EditMail::textChanged(const QString &text) +{ + buttonOk->setEnabled(!text.isEmpty()); +} + +void EditMail::accept() +{ + res = edtMail->text(); + publish = chkPublish->isChecked(); + QDialog::accept(); +} diff --git a/plugins/_core/editmail.h b/plugins/_core/editmail.h new file mode 100644 index 0000000..7143ab0 --- /dev/null +++ b/plugins/_core/editmail.h @@ -0,0 +1,37 @@ +/*************************************************************************** + editmail.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _EDITMAIL_H +#define _EDITMAIL_H + +#include "ui_editmailbase.h" + +class EditMail : public QDialog, public Ui::EditMailBase +{ + Q_OBJECT +public: + EditMail(QWidget *parent, const QString &mail, bool bPublish, bool bShowPublish); + QString res; + bool publish; +protected slots: + void textChanged(const QString&); +protected: + void accept(); +}; + +#endif + diff --git a/plugins/_core/editmailbase.ui b/plugins/_core/editmailbase.ui new file mode 100644 index 0000000..eb4330b --- /dev/null +++ b/plugins/_core/editmailbase.ui @@ -0,0 +1,152 @@ + + + + + EditMailBase + + + + 0 + 0 + 315 + 174 + + + + + 5 + 5 + + + + EditMail + + + true + + + + 11 + + + 6 + + + + + Enter Email address: + + + Qt::AlignVCenter|Qt::AlignLeft + + + false + + + + + + + + + + &Publish + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + QFrame::HLine + + + + + + + 0 + + + 6 + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + qPixmapFromMimeSource + + + buttonOk + clicked() + EditMail + accept() + + + buttonCancel + clicked() + EditMail + reject() + + + diff --git a/plugins/_core/editphone.cpp b/plugins/_core/editphone.cpp new file mode 100644 index 0000000..80efc8d --- /dev/null +++ b/plugins/_core/editphone.cpp @@ -0,0 +1,161 @@ +/*************************************************************************** + editphone.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "country.h" +#include "icons.h" +#include "misc.h" + +#include "editphone.h" +#include "phonedetails.h" +#include "pagerdetails.h" + +#include +#include +#include +#include +#include + +using namespace SIM; + +extern ext_info phoneIcons[]; +extern const char *phoneTypeNames[]; + +EditPhone::EditPhone(QWidget *parent, const QString &number, const QString &type, unsigned icon, bool bPublish, bool bShowPublish) + : QDialog(parent) + , m_ok (false) + , m_phone (new PhoneDetails(wndDetails, (icon == PAGER) ? QString() : number ) ) + , m_pager (new PagerDetails(wndDetails, (icon == PAGER) ? number : QString() ) ) +{ + setObjectName("editphone"); + setupUi(this); + SET_WNDPROC("editphone") + setWindowIcon(Icon("phone")); + setButtonsPict(this); + setWindowTitle(number.isEmpty() ? i18n("Add phone number") : i18n("Edit phone number")); + wndDetails->addWidget(m_phone); + wndDetails->addWidget(m_pager); + connect(m_phone, SIGNAL(numberChanged(const QString&, bool)), this, SLOT(numberChanged(const QString&, bool))); + connect(m_pager, SIGNAL(numberChanged(const QString&, bool)), this, SLOT(numberChanged(const QString&, bool))); + edtDetails->setReadOnly(true); + for (const ext_info *icons = phoneIcons; icons->szName; icons++) + cmbType->insertItem(INT_MAX,Icon(icons->szName),QString()); + + for (const char **names = phoneTypeNames; *names; names++) + cmbName->insertItem(INT_MAX,i18n(*names)); + + cmbName->setEditable(true); + cmbName->lineEdit()->setText(type); + connect(cmbType, SIGNAL(activated(int)), this, SLOT(typeChanged(int))); + connect(cmbName, SIGNAL(textChanged(const QString&)), this, SLOT(nameChanged(const QString&))); + cmbType->setCurrentIndex(icon); + typeChanged(icon); + publish = bPublish; + if (bShowPublish) + chkPublish->setChecked(publish); + else + chkPublish->hide(); +} + +void EditPhone::typeChanged(int) +{ + switch (cmbType->currentIndex()) + { + case 0: + wndDetails->setCurrentWidget(m_phone); + m_phone->setExtensionShow(true); + m_phone->getNumber(); + break; + case 1: + case 2: + wndDetails->setCurrentWidget(m_phone); + m_phone->setExtensionShow(false); + m_phone->getNumber(); + break; + case 3: + wndDetails->setCurrentWidget(m_pager); + m_pager->getNumber(); + break; + } +} + +void EditPhone::numberChanged(const QString &number, bool isOK) +{ + edtDetails->setText(number); + m_ok = isOK; + changed(); +} + +void EditPhone::nameChanged(const QString &name) +{ + unsigned i = 0; + for (const char **p = phoneTypeNames; *p; p++, i++) + if (name == i18n(*p)) + break; + switch (i) + { + case 0: + case 2: + cmbType->setCurrentIndex(0); + typeChanged(0); + break; + case 1: + case 3: + cmbType->setCurrentIndex(1); + typeChanged(1); + break; + case 4: + cmbType->setCurrentIndex(2); + typeChanged(2); + break; + case 5: + cmbType->setCurrentIndex(3); + typeChanged(3); + break; + } + changed(); +} + +void EditPhone::changed() +{ + buttonOk->setEnabled(m_ok && !cmbName->lineEdit()->text().isEmpty()); +} + +void EditPhone::accept() +{ + number = edtDetails->text(); + type = cmbName->lineEdit()->text(); + for (const char **names = phoneTypeNames; *names; names++) + { + if (type != i18n(*names)) + continue; + + type = *names; + break; + } + icon = cmbType->currentIndex(); + publish = chkPublish->isChecked(); + QDialog::accept(); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "editphone.moc" +#endif +*/ + +// vim: set expandtab: + diff --git a/plugins/_core/editphone.h b/plugins/_core/editphone.h new file mode 100644 index 0000000..6647501 --- /dev/null +++ b/plugins/_core/editphone.h @@ -0,0 +1,48 @@ +/*************************************************************************** + editphone.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _EDITPHONE_H +#define _EDITPHONE_H + +#include "ui_editphonebase.h" + +class PhoneDetails; +class PagerDetails; + +class EditPhone : public QDialog, public Ui::EditPhone +{ + Q_OBJECT +public: + EditPhone(QWidget *parent, const QString &number, const QString &type, unsigned icon, bool bPublish, bool bShowPublish); + QString number; + QString type; + unsigned icon; + bool publish; +protected slots: + void numberChanged(const QString&, bool); + void nameChanged(const QString&); + void typeChanged(int); +protected: + void accept(); + void changed(); + bool m_ok; + PhoneDetails *m_phone; + PagerDetails *m_pager; +}; + +#endif + diff --git a/plugins/_core/editphonebase.ui b/plugins/_core/editphonebase.ui new file mode 100644 index 0000000..0fe87df --- /dev/null +++ b/plugins/_core/editphonebase.ui @@ -0,0 +1,182 @@ + + + EditPhone + + + + 0 + 0 + 402 + 242 + + + + EditPhone + + + true + + + + 6 + + + 11 + + + + + Number details: + + + false + + + + + + + + + + 6 + + + 0 + + + + + Type: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + + &Publish + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + + edtDetails + cmbType + cmbName + chkPublish + buttonOk + buttonCancel + + + + + buttonOk + clicked() + EditPhone + accept() + + + 20 + 20 + + + 20 + 20 + + + + + buttonCancel + clicked() + EditPhone + reject() + + + 20 + 20 + + + 20 + 20 + + + + + diff --git a/plugins/_core/emoticons_prebuilt/SIM-icons-Crystal-full.jisp b/plugins/_core/emoticons_prebuilt/SIM-icons-Crystal-full.jisp new file mode 100644 index 0000000000000000000000000000000000000000..e5aa1086ea979155cc19cc81df6a4ede31cbcfc9 GIT binary patch literal 251987 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�Ux^ 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 M(uAT?a2KBXA7Z{o*Z=?k literal 0 HcmV?d00001 diff --git a/plugins/_core/emoticons_prebuilt/SIM-icons-Crystal-full.jisp.license b/plugins/_core/emoticons_prebuilt/SIM-icons-Crystal-full.jisp.license new file mode 100644 index 0000000..0b4c764 --- /dev/null +++ b/plugins/_core/emoticons_prebuilt/SIM-icons-Crystal-full.jisp.license @@ -0,0 +1,4 @@ +LGPL + +http://www.everaldo.com/crystal/?action=license +The Crystal Project are released under LGPL diff --git a/plugins/_core/emoticons_prebuilt/SIM-icons-Nuvola-full.jisp b/plugins/_core/emoticons_prebuilt/SIM-icons-Nuvola-full.jisp new file mode 100644 index 0000000000000000000000000000000000000000..a5f33b00e17079b57bc9a8e157c50701c5033666 GIT binary patch literal 258805 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%0DIC#+9%-np~;-a*)k>+ZcbmXrpUD@M-%Ru&r z9Kx;Hj@Vx~8Y|+rFM|%0SyW$JPfjOIfWpBbz8zcL*!ac&33r@q656k@Kr!>+@K?g_ zOfu|EO6=&jEX6mZ6cIv-7L+s99nj+AU$bX06UpQ~?O zKZ`T95f4K&~1iv zBIn-ZJ(+47MU&FF3z3g;wgp8B0sB9;7fu(xjC|>FP3qa}!ZxdYacQmJKd?Lbe-U+0 zly*^}8`l>e<%g|WaEwKrD4Fs0t0+nSu<^2U(|gT#WBX;?IOx?ExEm3B4}2UkEAQlD z{%d1b`2E%XQj@l0_`z~#R{dC`7%SJwKKji1Ox-HDqA6(4L9B|Y1 z-F_}rF!EgAYv7a#+%`a=Mn%e4BRvR0R4>SiYnJZ#>nm>hwX*B;yZ(~>b)de_DNump zMfAlp&GANLyWd!ROa@Uw@6H;wRdw*!-QHZ}C1P2au`aOqO;F)$nw4Kz?3mGJhOBWw zdA!W#FG4u-zT_SGI{xOX`IL_1XKhg{r#XunB|jYr`^pzq(WZ$FGB>eO9g{xNQ?Bbop*%_6xgl5u%e(BxyA|tNU zmV*zQN)Ib8M@|1ap#M6UYCq?2^4fIh5#i#Ap4X%^65_(TnN3+)VV!M+FVCc}M+_7tYom($(_hUTMg}!}SjQ&i~7{Bf^KkFZctRCTif93v>jxxb|J%*TuvTx~m z=hb2flafUuxTj|B)oIe(SL!Aoz<6Hs0ST|WVvgXFbgzs(2+Dn>(yO)8ZY(?f?W2UO zK#@2*#|4z7E?@nVKILZNj?+4FVxla5#`;^szHRkcF(&2_r#rdCB_hmz{}z8Q{Tof3 znCFhTzzh^P-ozUw*gcsm;8m4wD;2*bfJM$>BaBz7XuZQOL@obCdc#s-*xG!4AoV7N+m43)M^yfXxm~%Br;;#+)>Q7nRtdMcM$yzv` zIA}9%H$A9WdLPYgsp`7GQ<_hR*cbcpDI%vIPIurq@GM_iyUT08{neH6)JUADjW&#v*!RQkXvo$OT~Ar`m-r3K*E2h! z8)5lg@5&A+DL-1a<86$5Nj=DYsPQKIT1dxPzinY|GvT&3u&)Yw?)w7ZI(H_`BdszB zT#Dyl>Dn@^u0YpwwVb7g3+|5<-vD6eUxqQM2sLWYako zm!oA{Gm&Ly!o#m+z7Z2<4A4rEXI)LUk?mhBx$`q#(DnSsH;=DSj>})ZA|%w_gi|rx z%=jWO`g+M-bZStV%DNF7OBwuC_Mvl*?iXsn{Kb)R<7vkSmXlBWBfksUB=A;;C}Fkp zfBw9~`<4%Gz=!YlSB@gzcuB3kYH6sr#PM>>a^T4mZk_a{3=;A!f_-Xn#vyH^%EIK) z^xb`D6N7{EHB_z-&J6rwi>KWbQaD^o6F5ETWt4bTbA)lI7Vgw?q#9kRtP*hJM!u#W zFXw5}?9ZcuL&v{Hgu1pG+cuM*{dRI!kN*5TNN<4=xHT^kWT8JXl{zQxA62RLf!eD@ z(qh}9!@MurWgh^ZhRMnTl-+R;`!^#L{`#BJW)F(Wp8fTCPlSwf`s)vo1JGIDqdnbb zYvbTy?c(~+kupn=WxhxMZtEQG^f&9=rYj0cPY2UUq%iG~nij{@7YT)ZdpNc{0R~z! zh#(M(yo%jVt|oRM_Dt~$i_sP+Cm$a@+m*B{Y3CGB^#Lubhi~ke4$Un!WMLa&-fj?A z1zH(WIB(74GE#8hp#>b?)>IIMF9Siwy$mhv%*R4``tJ5_({dG�tLpZO34FE_eh# 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
;i{4>qvJo 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≧@sGC;deDZ7lMj=B{!)3< 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

  • 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/emoticons_prebuilt/SIM-icons-XP-full.jisp.license b/plugins/_core/emoticons_prebuilt/SIM-icons-XP-full.jisp.license new file mode 100644 index 0000000..72c3cae --- /dev/null +++ b/plugins/_core/emoticons_prebuilt/SIM-icons-XP-full.jisp.license @@ -0,0 +1 @@ +Unknown-proprietary diff --git a/plugins/_core/emoticons_prebuilt/additional.jisp b/plugins/_core/emoticons_prebuilt/additional.jisp new file mode 100644 index 0000000000000000000000000000000000000000..21ae443ae36d6ba5b69f941dc70acfe3e54a41bb GIT binary patch literal 4957 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 Re=kY?OyQrsi2m>Ce*l8I9@qc? literal 0 HcmV?d00001 diff --git a/plugins/_core/emoticons_prebuilt/additional.jisp.license b/plugins/_core/emoticons_prebuilt/additional.jisp.license new file mode 100644 index 0000000..72c3cae --- /dev/null +++ b/plugins/_core/emoticons_prebuilt/additional.jisp.license @@ -0,0 +1 @@ +Unknown-proprietary diff --git a/plugins/_core/emoticons_prebuilt/amibulb.jisp b/plugins/_core/emoticons_prebuilt/amibulb.jisp new file mode 100644 index 0000000000000000000000000000000000000000..135c88b2d143e95cefd5e810e6e4249b06e6cb24 GIT binary patch literal 5505 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 z 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/)2u zL{pii>>rf~;)Di=Z1$KmFjrK5Lm9iFe3MjC3AMLhG@9RI zimg>JpM=lXT4%p4#BSx6cjfq(iuhS)v03vrZDJt0-PpqSYdZK}Z2EBc?Yy~6COHWi;J)cSx+=PoY-)zX&!iw8JQ#Amscr=#l(i~i^(O= zeV!9{0TE|o|FY&z?pFe59=2Bbdu;2zHMsQQbvm-9{*xa@TN2*U_9RV_8a8r7LQqF* z+dKogh5XFk+*+1=%da|R_sOMG=clsVDFfEJyq|J}@UHkCucEOq(vHe(d7$KudpKDV z|Dwp{hs2+-CAE0;A0Y8q6(njfSk?Ymb5o(yaXG%ot-Ilzx)XT5ndobC?!f@CmX}w= z`}hENQ!qh|tt+->cM`qqh!Sx-ayk+;p=LU-1_RSXh3@>ew>6#xgA2l^4>Jdgn6&*% z)rywOWzQ?~+s!4vk4bxPI*}_6m!V{Nd)?`Iv%`ix(t-Md(kKyma`cRtxuc_;)8*@J z{coMFmTY9y)wj3xA6K0SLoW6Kwrh-E$KjOm1QSP1NoZ5Eai$aPYW$6z(inptG)0y# zgDx)jyW4I4_j>Q|K9hpT;b>H}Yae&|pr`yvJA+VxC@PB8wH9ieeC&+`IG1!o~{zP+=`h8Fq?I81^1-%3Io}>KlXJ$_A29MY)!?Ho}Ju zgD%4o76K9=vslQ*Kp<}lf-X@8+WHK8r=*w!YNOQ`eHf8hGBvobZTdYB@Rtx|F4JX# z1lEFkMC415iztA6C#L{_0T}OO_r8jX3TMtFXw$%GQtRzN14LY$pATRg?PCL~sHv%` zt52N@BO4grkSR-*l$7*&^AgCDq2N1%M5?C^o;r5# zmJZLz<@u|Y{uymt)u5aaS_^SFwQSVfJTVN3Py~1Z+kb8n2j5hLKpUOLg8Oecs2D~6 zX2^u^^Q{s~0Z<%pp=^VZ$+9?vH;I+;=ffSF){`9ehc~ixDDctfxl0XOe?eNlZso1d zcLbi6a;dH$6s0$UvkwxVmgg@t1a+k>t~dn?QT?k!zW5wdE#YL*Fr}#Px^r{N!4Oys zh=@K;2UhG^sO020ReE(+rc>r#pj{LtZ2#^E7DV>j^Ld>}czF0os;f(-X4fBLHB<)s zbnLgY=i|}dmkDLdGE2#~&64hw7T>ooq*}VOlr+8fk2k{e(&pbww&U7`+NU)-M!~wI;yxL*I71U z!C~VlW?4DmQ_L>sJklsp%6mig5SSIcwx#6{y~* zU3Ap|j;zjJq593hSb_S=P@^pURgm$xIT9Zi^N`+VmDKo=rz9BPnqc+m?Bgp3?Xmie z1DP;tB)t1>-Yb(oFp?g+qD`bI@6bMP1E z+iD<0z9Dn({rr3%M2+vqjd&$}|G%O&tYJVMLxpc7OZT9@Jq2ki>k zP(8t!j>Eke4LzDGjs0EGpV=@)Q%m>!N+1QKM~0}@i)6)9FZ^pDUE&bciefNgDA*)k zde$EvZlO_ZcoGKV*q;Cs->>!!E}Ifo#<|JXI^*tWG6i~&am1Qd)Fh^Jf$_pSnbv{; z#b&PWyKyG0#B#muMkD>2^T#L(_|_=-Hk8+q$l+fi^eRDAIDMSX`#iwsmeTIwuaXTi z&b`Q#FmfK9z~_@j$UtLY7>Ub>-suDe*YXhZ;PjrRy-(`Ln?fkrcAQ&rISCUpzaCD4 z)CPr^8ZEc{WxYp6E6ySk4hm3!n-09oZwV0QHFzV?jmt1wtFAuuXe*qUprDFwvL{B7 z6E=DqX1}aL{uB25|^(e5v0Bmf7)j9@=Dg#`1)FOCOX@$Ia;L)*no4eO4JeD`s$TxW-*pvrE=4 z#9gLjXp+B4N5lF@&pptlo626sEQZqPm%>)~9kN{7DGf!BG5^fo8=6PlQFgY`Sy{^R#f+e=oh!VRi>(D@T9 z#$Idvj-t`nmIEp*HoUtvb#NG7&LeZa%C1tOM3&Xt+$%@ zK+q)|V5zl*Mu(%fTQi^g84fu`fx=5Jfc^Pk%rWRM6lB4m3bUr#QXJ>azPEUZ{h7j> z{@XD6Q@RCV4i^$S65GY{-GS_y8x9jeNzEI8$YXFSSAdMORQDe$&Y9Kr<2OoVWS!1o z>Ap?+_|NkL{dI4OtF5Qgx`A*!8~f+;fwi9dg|J081-p|>Lkt^bbB)|U26NBj`jf~V zfi7R8V=rNq`OM7IrTClxvv!VN*9|Pc>-UUge`eW2&{m=E0hgV()AON(W4u0z7Q@iS z7^z`%&547P& zs;XTbQ2+xVvE?UEkx&%L|Czjbj)z0CF3bA}sd3fMA-70o*7ww6uLeAXZf?6s6z~4~Vtz z6(mfo-sVF6u{;QXYm^w>S}YX+5gsyQf*^Hin7V_m!$-Ft2stIhNCpjgrH?SlxZItO zu`#k*dw+bL{86aw+h#v8x#>>mxm)rD`QI0dBRbWD|DFQ=FX=(e8YC>k?0%Y@G&av$ z?$~@-g*G-OfQG1olP52lCleAzDVMU$63i@MKdt$BTGOnQ++2!OHZPzmG7J4vN~H;I zyil~f0E0Y07Kf=BfgNfOt9j|s=*rp6P48**WTk0d#lm`Z@5amgaQ*6SlItn^Y)>A~ zgD#&!B}BnsYfl$M8U1&lAKFV9TQWtouisO1HlgqRuDpIuxKw-AZXubKn+ek1EiJ9_ zco;Kf$>|pe7y9pr2bBjIHalnfl5}z zAk(QMu^~l%BtBepsdvAU(ByhFAn-XB?OM0|B~{BL@U=c;@66D7z5bXo!!KtaZN;hK zFBr=^R+;E?n-=;4HDaPQ=_F&ng>-iASwT^ExJ2nUH$DAq0Is_f&+nXW@bXevVRGjy zuVy>7&F7Nj3;|Vq4?b82Y z{6={5eRGGM^~F0(XNZu}C?~NkLK!)`#X)>;|N8X0uEir~3W&gI#b< zkkP$`*5z{Q=+m#woH}SLhqKQ3C>6H5(h^&S?3Ad1vmqg~%Y&H9gRjgy3=hGP0;S;Z zFAt0bepzneP3q90AJtH5V&v$<`kI#>bSAl8{F+MRj zNJF?qg>dcE0UaG0!%O%WR1pr*8CN_x9V|Scd*DJdwy?vQunCxeUa{842gCwg(im5b z-$VpP1Qk4i6fbyPf^9~zA$Rix-XE+;d2&3qJtxDRS?PH;-qb$2Xx3pqsoLUU0X{BM z&F?V@Z_2->Ol|ls6w;WNSTsE|{t4pj=4Ym$YQA9pgw}@L=Is2lJ?5GttdVZO0QnQ_ z$azJWU%v>t*f2tBnkf|iyAfg_gO#$VSTmAt0OUFMFNoBMjer_F_`=b;@fHVWDY_Aa z03yQnCU`JZNSGHyZFX5HTRkeJK~$9{3JIc~@*u7Qvq;5~zjbtE9+>rXKXn|0^8>J( zM-_TQ7a7Bc%jW^@I!jPd@8n%no*vDB+)|2jxRDlGKH<0dxanH}cAoB8nugTx!DLpBgN zK`G-mVBCZmPKR^N@(<-R3mWi8@NP_?=CrUXtXhp`&JtDfX^~)IHS1r^PPJAps|^Cy zyG#gIv&LD%Uy2eDLM7&vo4=J9?3cv5HZ{U=G&3Zz>N8adYe2DaRi*o($;srJFE{@1 zMK=3MIgG~sY(^sXCGRlG3ze`ih#)c}$iw!qlfzpX4$D!-Dx2!Nr6%e`*KD|!@Jo$f zmD*cz%+TB!3cf%3G_p!V__@8!Tv#qpi)sWO8mXeB zb1cli?nlz%KV(viM7DT4ecjcG`I2+7MLp`WfFuc|!l0x*TwrqJOFf}S zSDSN>hgjt#GQMpYzZ-FZ=d(8F>>2Uy*@xrbl(=e*fac%U4w`0g=wQHFqSoxGxUHAt zjTUJ8IH^rRDhzJNTNP>Rv*2&O15Djt{dW-RH9)bl=4P{r#~dDll`hXU22c$Xs;boT zs*9Vx6|z~`h0bQMpPB5yNFn52PZ5@VCy%Rah$S(5McDk{Ov zT`s2fQt13m4McP}?H#4rcYf&{MscZ3Ls?(1KV7-Fpfb1pH3i8NBB?EfhHwr zsn}9ZULGN6dTwsRc}LjIkU)piJOMpqLV&3W)DqzBbMVj=7hl>G2g6cnX>1gXR@H;+ zGr0cLh0Fl6APR>-8#OaGckOB{aK-#yG{27bQ;A@uv=UlOR#|!O_JDTVU*eh&7Z;+{ zf=!Bc4jvXmw5(n>kT>h!_h?Zf034B(dzy4 zmX7+=x?c9wZaVv1ia<8oUj6i|}hi0koRmjt%|C_Jjv5dM=};D1^# zxv(C&!gAZ?j5IzHf|aBS6c)kN>W4mqXikA|vawmM$hUG))wVUtX|^gY=O#`O14w0tZ#tx}2AcDFvR5Su!eN zjh#P-Tq&C{6Dl*uOQsiL$BXVlhwoNXF)s7H()%arsA2esG=20)vmcN{cz zGUgPJQ%rpC#UjB)?$0f0t-yEK(EhafN<%IMF@+zlP4|&J!PE# zHqike!LnM(69?NfxGq<$Ek#cJV8N$XZFvPJJM&>qYz=$FcpC6vPK^ugm-%5;qz9>3 zxw}8)Zud$?3idO#Hj=$o3y9-Cou$ui+pow#xUvE&D#0)g{?#5aZF7#5Sc58&@18(ve<2x>5r$CNRkTk5;emsX{!yKAzMmBSZ_y zh9I{*Um^j9RWoOrv0CN~x9iv=;-L*CzctE)%3C}_}?>0Of+|(0?qC(n%Xs>@}k5cV+5hr zH!r8?Wf&+BB0&xlRDLmG4?=#=#}8u(wXamLAfj@rR*xNUK)UXsj#>(p6k1p$AbJ=} z$$3xMWIP)Qf1_iq+$i^ToKFr@0CQJLiQ*q7I#k@=OA^r{wk5F#+JK{e1L1E~MJ69# z3Gk@sG6|N%y@?m4j6q@%R_B=*^0bArd2WV|?oE_D;H3F(=b!ze?6u8pHsCu{WHV<1VXoUoFO!Bi77MALjl@%IDPytNc1d*mR zR!p7fPO{Yp?v=Fod(MKdx;kNndkbhk43u44OFBWsT4vX)&+&ajNy}CHDI{hG#ayK% zHYYNttg1vNNit~XnH)oApuwMqldFaIacpFEwAazoY;R@8sp{4>azox+x2Sql_LME) z_dcjy<3$(H&&;N%Vxki!y%?4anu`XQpmJ+UV>%Q1h<-}4Bne6fv0i<;?Y~>D>uF2x zdo8V3mH*k~z5Om!n^=~W0BMG^-AXdfg8Z9koL9^M0F*7Jfux8g&-n-Y3pqJT@H;ai z@JH`hAQemf&sIIemPJ%=ufK`7$;Kvbbl-ol0%9F&1x1Aso2L6|rE(1v2ac?(l_1=0 z@yCsVl8LOv7Nz!DQ~TG&wu^;W5!&&7riD}74M5v=>y@-N1_T0hvoQiKCD6bTsgw}Y zqgf7ZZG>B7F@sbqI*1?<3dBe>g$K}3n%NCv*?VVu2aPCx*fvNgQHKTxDc4vv?^ft) z=zlB6Zp6Wep#8I%#O|fYe0h3N)h+wRVK2sgGy$^E-`i>DXuD~dQYp}G{49($g7tBm z^m?5gpZmH-=loqljUa6)x!fXFAUV5ns`B<4Mr!%1BHZ1ti97J0oqmfUsXC3=?_wj( zJsZtLIZJB|v8e3Fzad*+mXI;^;4&%71tN@qOQ3em)T{Q!2ALKC7sz zs*(%X^?rLSZ16huQDAxT98v3YptC7Kp`2Kw^X78>x@iV5D{&JP27E`!2MD1WU&9qH{ir0BNJh(3! zLz2JQTRyp`D?6KhGT!MX)Q2Gw877pPra7#v4j^H1+Cdh3vM>-nTNctX_B2b|BdpIR zG2%}yc;Uk@z{={pf4xJS2dOBxrta$RIkJ@XK|f>@HB~fiOB}^3RF+7As1C!J`!;a3 z`O9?7%ANOP{SF@=U#qIQJm>%glK6WxC`9>jG8h^E^-8QyS3nRvw!AWTW^LKPqXQ{) z=v0+-LH@wEmDCB6q9tJ24?4`Q+;|ppNRukk()&EB+LcolZV?bwq?@SLr~~)BdVhaE z|0@IfGNk-$Wg9rQzOQcQhCF@nf(Q&4*vYqibv{1mh%^o=( z(VdS79lT)W%AND$$B$C;vAAx|zT0kLnbK9*%p=cvu^d>06A|IEwYtvhuh4w%6*TV5 zpp7_27HhKk1&8{UPkMkk=n0{|r7YF}xGnmE@i8E|uz867SXaw0%XDL;B)WTE|2<{47%i|VREfQ2V?m%j)7zsLs0LjRbfD*le?CCOQNq;}heC;>yq0b$u=Qo`<|MGmjeO+}ty@AX! zJvV*ici5Vlh(ajEMt#|)*Y?=nWWaZL=qE5pMGTd{)cW1q((?t!2nAy%Xl>z+cu$(X zx}Xt5SG~GbXMie7v;mrN*EzIGh$frODPhS;C)xLUbW;_@AR`SV9yO!BM`iBfV zF2p+CcmKF2kUZ37uC-~3x5wcoDbGyeGp+04usB1xM&$c8NWwbAq`uz1l1TKWK_-U3hf~C`Hgh`{E^{*H)7<&DyyrO33 zzNCo|kE-2YN$zv-4ylA&i}6%5lwFkHf2Utmny}sL!HNxU@#Gm zCM`VWhPw7g-=lvwy*kypT*<^i_DgTj2tj6UwLC2I9d5sq97N$Z>UL&{vEFEM?K^>>4WS8C2NnuBq zUy0;D{ibiZ@6UV8K~GQJX_^}4(hJ5B5qs%NQ`8o-smUu_0@LeGk`)WaWWUuK$l^qW zLG(^vy{l@zE9%&TiChi(L3DFDf0liq)4d+^DVwPBL|Wzh#?9$Jv&D(=A?1gMWp#Qi z(Ol{8tXUqPSkskOg6 zJ`S(a$LQr#SG#jFQGv;T#X=r`Woz9zNr|8eA)-c2l!y}BA1v!^0Y6 zwpmb4Nkj?XeO{=ZOifjbDmFruD_bOmOioLS)}EE65ecJ2iEzkP8r!B4o=Y-ddbS+U zOd?B?RNUUXR6N=rGX;j-c2b!uO@|Og!KFwgC)<0Uq%0-Fb(ft~sukj&cMabuwuKzN zq*r;|(!Y()rKCU(Pzl!mBteZAKjY^qQEUMDS2%UiA~A+gfG})nYby%=J~Ol7w#~wC zpn}}4M$xKK9Yz|4zMZ|V@l%Is1MRu*Rx5Ar`VECd12wCeXj`pb33c}sKgoi@A9A#$ zKYi4YqCTI~*Ae10X@QwL3S|9I$*|>W6?}T~0~xP))(rRj!NWh5(V_&)znU68O*Wp- z-z(3v7w^nthS?gLmf2k?LZia@Hy!g2uQh&~YC3bqmwNVm7y9%O4y=F zoN*%FQ}tSuGNYGgUEMZAHFq|ll*kuv$J^bmQ&sxfFLX|85qT+czDFAy(dw#Fe{MbK z!t#0PQ&{0C!1zfdsBlD+jNyjrt&)nF5reCdXYzsNi^spLn&e7a4o$>KiKB*Fy0sSk zemkD6@z8vy7ydL3Q7f6FK6t#G6esZBO-3gS9Fr;zl$J; zi0IIvg`R^A0Wgy=o$yW(nsZcxwq8{V;c(J)`YJhuXa{f7?tu)%ceP(J2_PqV> zx!nm*YCR9_v3ornjwSu^<5CeTh|J+vK&<*GCg+dh4zUV(Nkd``I9VYWy2gVQibGou zzki`q@_Ck4(Bz*>Rp46xIArKG+Z9ldo1+$SmoavPDz_jkiLX~zxM6plqVbuICV#*!Yj0XAX8n#^RiZ=euN=c?qz!ya$ad) z{nXUtix2N8CW3iP0uS zlkyn=xYS74_z{l$c~B%^M8)Mk#z?5IongovO=3ci7K;$`%YYiP*iFa1v%}W;<7Pmo zm&bo+*YggmS2)!a2^wM_*vj}nXsj3?alo-&4HkcIOr}V<+tupK<|eUm`pLmvePtVl zB&bLD2&PXoiV*pjiV*w=7HzqHf4hPcYv$s@MovCt)g*kBAVDSwG0i3$oW4~|%?ql@ zOcs?E7D5Qkz@*VX!H7)j%lkT2Uj77s$?cN@&{I!LZBLNz93v{K4L;2!XPAR{Tj4J?NqPh6nE=V5zt5I z(zX|A+QDK#Mu8A*zj|)-?}-m`&W$$&xEizjSoSw_fzQ*P|25kQ)#a^f|JUN_e^6dk zpb&}*D8jl`H?sD2aWaG@?PFvU!#vza0Sy7IV`B_UMqaA=3nNircN+XR37^pnduVFZ zAUzVjCFW1s)#(sYC~)Ta!&>U)!~4LRrmn~8CGRflC;YcKeuYq_2FRvU^~@(TvCOR_ zj=MSg!|DLYLQ&*UOdHGK$3K?c}r~V0x-dPqEF=mFIZ2LsB7$Y?~Sl z^7qB*0`Ah9`1)nyj?h(zdIDLKR?!l!jhnZXl$Dy?vJfl=TvP=N%VIrjGi0Hl!B=~CCsbV5?nt4)Bvlhe~A z{?b}?9i1{~jl;@qdG>o7^$A0)8q9*OXV&!>OTHt+bv$PcN7A;uBj$|JuloPT- zMT;IW5M1OIPu$rt>5qpX7b|OriJxDR+_{zY%V!)u-o)ifhy6x0E*gMez;pM)*1oD* z^X{`xgdeAMev!lPDM}A&%nyv@n;?rYZ6r7mTrIpJco6WYVCGnb2)H*`{*YBJ)u7Gz z!`}De2MAdr3W80V^^yw3EB?cpL?~!|(cYr)*nW$VV&L zL)C&;%Kla&?xS32Op1uQ`wmeeu=;h-bV)v;HgCTkVECLEk30cg0qIeYelaZih(`d$4Xt@xgJONL zo2||^V@oqHdxgjP0J97VdFBDW*G2Di{(_yfv>5%e1dfc>JVna4Gzr$iSy(nW17eZU z8ccFNp##n2m-EW%Iuru9QdelfKq9M$!B$EzfDjv#kk@LOxj5WR!7ZhrPhxYY|JS+E=`QtABlnsL!yCE!Wj-lucK@JgU0@= z(31`b1(>mFAP4Lp9&B7bA6+Zx>uqM|9)8ESs(3czBDjv_J4Og6;T;(~__^%~2e1r7 z^%SaF`0ZxC6J@2Y=$Spp&7i;ZSJ&&zEDId`?iQ3)8z0wyK2PphZ(r4UyFC-UtdIP} zo$uO=>3=bOAt#Y`#v?t#jtun_n$4nj@<3`PlPLOTpjg8g5HCKPYIlEoz40i0tLR_Y z%np`cP>=Q_gOW0gaQ%!*S8dOcOm^J{+szvePLY@!DxWQj%`}BJ1?S?|2s)ghT?+>= zvX5IuPDI_Yjh*jq`LPNdmzIh~U$2S9k-~rZzAwDzMbN(a>;9TrrQ-amowy_g8eCJ% zO@IG7e=O(}ks>Y)m6rtFkN{)O}YI2 zxq^^-zUr>gZ8f|hf>sJ3V~#QoAREI+3E3y2ou_GnXVz9kw@NS&o$G#*^IbP#*WUbC znX*1z1lLcw&pU1PEVS`6RFj%*e_+%ngnjWWbI)$&L9@GX(LcrO=8M`Oq|~h7=y!;&whMYAWUZJtzsHhld4dAR!4~pG4UY zZA>yOnfwbQjZ7;^&d<@)RaI53ys(w%s<-A*IuepB8=sJnkugJn!+KGsql}5ed+kxz zJ**SRC@VHpmd=Kq%+Kd;da?TI(!n)nshc3s@uxPws*3(Mb!%N6s)z8=WUj5XZ4tH> zK(!%yB6+qx5-5OrxLTt_9t=h!6)tR8v67vuO-9{_`jrkI)WhrEY@(Pkcam*J1Ge4& za`*PgrUYpwJ+a*NWZ?S|eZyI!I-n?by?&)6-KbS)z8i#c)WE_zuD*zaf5NA`G*5Hz z$G_a`U#8_^zNK;Q(U-?_0@XEaX5-U#V*PIa8%NE!eB-83sy%Zo>cVOgCbTn<^3BWZ zeZY5F!+)sURr7A#NbyuioB?oGY4Mv=0w8PtePy~ z{*z;ngQDOU_@r!_lt2x^FxO?b)e4IqynZp2X2bdO<<2>WlveH8U_v%AY0V2YbSNqKst1BrhABYPO8?D5jaEPJuPR(JEA3;J2 zNu}U~VScM2Q{3i~t5}+V${-4AI$K(rUo0*uDWuADfQdYK@RHBrU2&@Ov~UoF8$fxc zlG!bs9)mzJY4dPADOi1d4GIE}9x9kS5k&E!Fld)ZI={N=aeu0gxq16Ql$}Vnf|Qh% z_WxZV%w9EP(Wq6`+4EKK{E_MPmiUGO`{})-uKOtf_=GvQYM<^t{?_9FQD0ths^-&t zzQFgt4_}>GTP-E6DQoTn&jRyS3mJ zKBs(pKBY|qkrU+r$Lg&^{u|*N@Noi)6i1$uygsj>Gt;! zesZhfiym*poUHeg!|Su{h%Dv#!1(Ssu_~xQBZoMf&P?gbk~=OjWo22DdqS$9e7wDy zI)WjxUQH*ck#VAgvT(}&9h1lhT}a;j>C;!7gSS~K`?;hvpQ7K!-P2Jem7H}7b}W%2 z{XU-r#5*T0MOHMXvLbebE$YOu*FNNI{Tf}FoU~6m-XW}V=id0%C?_A^bN21KBsY#c z_9wVI=O4+=QquC@i9ov%2bJvuk*mR)*t>(G;@1~5QN@hP+gF}ThYR{IkBcjPa-wZ1 zvfT|VnB12!*}7xqmZ=4vQ9{2wL+mj#k)9p~jgH>3>(ap8_G;3oZfE(*Gqjq~aX}RY z6>;UN1uJE1DQCj$GaOv}s?y4Ap@OeYe-hf*xpEQ)402?=A`LMS zCM87|&F{O8?O&ug1M`PsYn5oq=HL7+VK@B#&SN)a!dXsL>#`ng3oi{R0FIP`$qYM| zCvc%(r@J=u_;gx#Q-csg|IC(?NP<&Z)u&6r7g%6;L^RRzy8d`1JLB{DZ6G(m_phZf zGU@iQyNgwt&F>*|>licI;;%`jj6@1C%k}_q3mJ`2s;C;uzYrQ+vN*?r$r~+^99sj8 zE%)J;>%(FRQBzk}(TUhtf_UqrI1ckTA}+ov2W-VzOsL=3IbWb4e@hBq`W*t#ys^ z)Gf_`DU%bSP#)S9S-mcB`3q;(jEuyKEpKuUn%`U2zn51U-ObM)7O(t301RF^<^$d8 zI;^3=5l2+!$F2|Q$kUz`YY^rzM3Rt1mPkz@N36hW#)Bv%an^a+49TlL+sP;DRaUPY zQ>SQhV)P7^>Ox(c`18J&a5>7OZV&K0cGhtjt zDg%dzkfUdQ5UKvnJ96k?y{X%kK$@66v0;}qorsF&@q2sU((`L7E_XT@UmE~zbcE&^ zwS01jbOiX_cTJ42#MRzxV51M)N!Oc{_9zE>oU@A7PoP@olT7$%$k$ScCCiXz)% zjywVf(~mmV3YF&7{^L$3IV%c< zFf>ZW*Z6de5|{<$>aF9uXHnaD&w(GWCQf4#$g{N&`_?}oq8>z${Ld;QH@CRd=1U?* z@Rtg=CVPd=L3s-Og#FrWc$^FOLY?V^Yf#v5vHIt&6K~;Ejh&QUu>-Z=9MU4LSr)YT z!zHtJsg>MF>Oa|sA7PdG-{0y}D)!LPwT%k{3qWHOovb{CrL>Sna;rs*A*xy|oVfef z*=U{c(W| zW+8>^Ke~&H*Eb~>Nojpn;T6Z=?hK_sKY4r=XZ&{Qa}Xc)(|)Uq5lHvh7^Q&GWxnBi z^E@B!i(cex-vG)I>LhaFMieD@BGHHPb4;=}qWTQYnMwaCI?%(81PJdgsdrFoU zK(e)cdgNgE_R~78X3qq{(*H6VHU}`ucLWi9C?|=r&@jYq_4X3?0 zzBm5X={xfKDN=y7zPr9ZC=TNLANWCDHIhE62f+Xn-pEg+31>WFc(n$kNu&iLL|Jm? zc@q}rHXUw}m7GUe{GL2jwMTk-bQ|T7tM3eUjhYu%1iT3oCd)pHGAMukrH$@u=>72& zQvU%VB#Ca>qUnGrONREMWA{NC56-<0%|5tcz*uE=^g7HV8;p2o&&iPGsfzB$AT6EtbzR1CS=89!`rw06c6DJNp zq{Gwi3~bsL=*h`4?9te(ryWa4ZvHkblXDm*IB__7A&@}NOi&^Eczv~9P!Y8fp8)2Y zS(BD5#T*vwEg^2)UICSytZZytoEZyt#~joU*Yuod{@`s&i&r!$i`4;8Xa;fqT*h=I zxWj#@*a$@V4Cb7c-Ps4@l)(Lk{p&9ltV9x|qed!}U)-Jnz-PPbQ#jz5$K9&5XUU2s zEsUnKk3~(PaDY_Yy~oqDmV?EepYD5ZP!6O4Zpo_1EFUl6>xQ2OFEo+GD?gbFt~bA zn(w>O!vy~4iIF!q2e#39{+DoTgZt&xV{^GkDj!RAcd;krwcGnQ{NN*Zm<>AVOpQrw zY4lUF73JMmH{p+M*%`5C)4@FppJ5A7D-d`(si^Sm0 z-7SCA(#KJa(_(jsO`Vh!_cL@p&kYzbA_uLL5j=?3WXO_zOTxw*xY~YkRA9Do@}&K< z)oJ0!G@!-2St-fuERO<3^z^;#1f1%4Jo|+_ZvG~q?4D_{EbEM=rjRC~m0274RGtyl z&^WA%$x-Jy+bF%a#$q3Tk{YmY-w zk1DsFk6NHoKHM1nZ@-w}ebH`r7StthYTqey(}A6LL=CV!fo73aRpV%3OpfooGS}GW zY%d7n9F-jljkQ)c&?)6+^ujYCMjU+bbNFkk*AcoGl5ui!bK_XgtZBYNg()}x>S&<_ z!v(vE`hU1O=l8hdZe7Q=8aGK}+l}4Ww(T^w?Z(!`Zk)!}#I|kc%-MTi=Q{8H2j<7` zJfF4hbw7VaMU-}-3R0s8xN5%;;#?Y1aQ+|#Zvnea&)Of`L@IaJV|cn7&bZq6cxklvIPvpNnXb;%oHcx^~v6tU_F%ouPyALuOV%4J_0B5`&f9N~cQ`$&?1U z9CQ$iFrQ@@wJXtWjfR+35_b8I3bOGe2$uvqQ3?~=x+={)J=}s2u_imUkIWiHGJ)Sa zNaW@Va$HJE37YhR$;sF>&Z4EhSHP7`!Rc=nCLEn+Ms+!}q-Xomm+<1sJ^G`g=JN7s>*D2lqsM;bGggRRrcrloN-s3}s99NfOyTU#`>DA{QHNyWH@Am5O4pWOxl7z_ehjf16>g|Cn(3n-Pgh&0 zfxp#`jf>Km^!Porap-bd?LZB-sNpP05ZMesGRyDKdJIs8ig4i>0o!}f{>&pwVj-67 zx&+ZweS%)Mvw=XW4?>Txnhg+B6dM~G5MlvFj0S6}vJflccQ|)+B&TQKat0%X^&R0E z0zBzR`p-Z^(|1Occ zXuJJd+NBuZb90Lej=XcJTM|`Jh|v}BJx@MaCnv{uHA`dcIJ@l7sL|CjFhGs?z1rh* z4G{~{)dhnRGbH3knSz3xJay_zs1w>Ty8}4=;0@icuATrz+OEGY8|??<=^%3p7)}&y zSgm&hq!JcI`Zy>722pSyn>B)lQsos5Mt@L5>P7?2du7oeqLnKi<3P`tjrn=3=s}W` zfO)sLI1NN{f{BPiIGBLX?QF=}UJ$i`m_^ploNypU20pBRow@h7Qhs=e%kiQDgC6`d z;k&Ci|88dzwIVEM09)??^bky2ci>mqa(&I=H~;q$BP7$c!;7rVZr|ysHdg;VNZ+_0M_hpk(;=h~5XLPA0(rOsd@=hL-T z{+HN`^p&XW8!Q_woJLz&Il0FN{jSwDJ|8>k#E3PbnxLS**RbX+;*I$hzphDh9lvMi zfJ?e`1;Ur@q1fxw)z!n&u?FQHu3B5(_m_*TqOPBi$t;rP4TlF^TUJ|bcV95a?Vm%_ zs2>OS8G0Qp0v$yFcK<$7`L<|%!*iScNCRn?rK2(vE{EuE-c^-9EN#5s6!gC;hR;3> zzyXDw?N_N4C&%&Kt!)DAVv}c_Wy3n}F_qhE1GvehTM0!<#h4V4imS65WqGHpl{Py5 zAB$OS0$Uo8%tL~kPcr1JZ>vu_{EJpoVV!}_3Vw8RuezRDnp26Hf<hz)C~@zOS1@#sqx1!DvGT%I12W_&U+?&vr*||CbAe-FAuubt9&VVg zZq&L04=}AGwYVRGMI;6z3TL5JD9#f{nor$~n+6TT;I!%JQh_-fCy16`tb8=(Zf^}w zFR#B1^{t-zAJSm?+xXz6Ux=Ixnk1YJ8RChhHLve}N|8l`!5pEFX%}$|fZ6TSM}wbu z8U?qV6D|rW2iRU3xH~{jZ}N!j((^mr_pO*>vt0}B%j&X**?@GAfuS4otsqrHM;6-rpPBHQXXEHey}^F}tsgNH!` zR}1`mz7aUz^!PrnqQAjc7ub$q^+=91U~_iAoCE<5JOZmND93%IYyxU3vvjUV-IW{yxdSl)};eO9t4G|BubwbgF3qrIjI&oEj2Z+0WQZ1AwZflQ0O54 zHcVS>R;wrca2b9`k!A2#iNH!RjEfSrf#e9;vItDG?hB(rB47|?laa$}1g+y_YV{5@ zEzr|&ko8P7rwl9Pm_1r3gy| ziRQHnEwIX^s+Z@d(tig>&$M%+Mqz`5=_i9w`!KT%ab{+*xvza!KXgOaI5~^L@Vf0o z{g?Vf#nKq#C_Yztsw!W99MBo+nSxi@*+M;;7nV2ID~TkPt_N=Hxd!Oa!`dq%5(=)J zX<0R1_*<=weACdoLyWhxsaad^Yme^#Hucklj4k``RJ08NexpNE)Yw?q(2&j!4Lw$S z^b*TuRMXTi)>IW)nIQ@M@E@gB+)qs*`~_$dC*hfNzMedHCW%=&7W?9Oq>Zyv++r+> ziU~wucV3S#M`l{YxP+)xJ_C9Uflul>#%PFx5ljmaOr6`b-xxYbsN4S?VlVi(#H%Ut zvazD)M2VN}&AveWs!Knzu&`)!V2>zU^Kd2nxw^HcqpQBy;$&f5O3CBB(Pu^Z1C=8* z!hpH>uj-~^53MSwdt*7YP4H`y5&@8;jx0l@Uv@mF`Va^f-hXrY`Ef15_q0-W{ct@H zw~@JypVQt9Rp+y(CvloaRw*OGiMF6Tci)Q)X@qICV4Bg3@RfsAXYDQZkvAtJ^S`;@4-TeH*w9;n`f82sEj2s)qj6F1 zBJ6zW?%Y3eHi*k|oL;Nm6TAm${q=y7J$&yQ-_LEVt#>_%2`6voB;iVwY5st-ZwmT6 z&%Ma&0g*(%aZ_q4XP!O8#41$L>$O$er`AxP9MktB#sGi(zN^e#_Ioe#xP$bBMI~yd zYaTyn{|*v*uCEi8V3`m`iseUb=H}Mi<=nh@{td@SIw{1ex$?Z!Iq(Fxa-P7jMRK6i zX}xjw_joFq>K~3fIyf+k!G?+-cKKq34k)!sfF4sQ1MWC-C(728Yo0JM4tC}n72-;9 zjT+0m04?%_NDt!e8Om)?s{MWRQ>Xl1Z=#v54!BWdz?}?XwA9gM$3U8R(4lt<*we z2%*OHxNy)E&mVqDSiS<^bpuV9aYIf?prxR?zzB%&@GiI^An9zZ3GnfaK$spHn8D2n zoEc>r1kzF(1XghLx$<%vgilbQM9knBi!T*20U}yfnmtV2! zo}l}0qFfgXbC1W{%hisv;K65YALo<-u}ItS;`}Bws)!%e*7$0634l)}?Go!sS~+bI z#9{Os>EERvAVMsorWT@I4zs!#5m8EH}a( z5h0aUHg#p6cQLzuv=dLmQWIB%qH+`u(O?xuLy}X2f^d6y03A`vMlMCuV<2Ms%=sQ( zQGEdb)_Q1UP?gpInj}Nqu@KA`cBYYt6j&FRli7N2-!9T%D23+c%jY4wslvixOpqJy z<88Cs`%V3*<-%^-JtgIDAb^@|*o>`^{I)Y>8_8-$eIOjjt}iP?%f-)qpKdZNCh!p5 z>W5e5(93MA1Ol)hyI&-J8*ayTIdHLaIAxe}<^kQ9(`Ba*u!GDgw6JfjR8y@pSBa_y z_X-q|N~BGFSZ^xxKG-?%R{W1aSN#Y5Q1Nx4HM*Cd$3;usU%_FAI2qI6YVO?U{8aaw zQKjU(sS|%#kg*W~^jd_!m3Qr9$X~C>->xRK^m2)|R$`Opdld2(*)NP_cXy(rkES&i z=4)(iLrk&@87Q^)5$m7HQTFQz3fg}EDYa~Et#a~RlQLx|&LWwNBMT1~Qw@-EYffcs zE&F=q00WELLqzL^U0C2)^77_p3@0&Dbd=sFuTWICZ}bMMRSs>^5Y-IgoIH?(h9G5* zQRbnjg^Z$Ma7xHz=k-Z%UJ)r!6cr5~KM+y6M~@`Az^txbk-ePx_n~sb0>uIq_{|Kw z6(SjtOEbvr4-t~_EaEs(O1!w8IJHaxl$n**#;$3F2Pz>hO1RP-sGxGEo3V4Wy`~@H z=X-~TkN(kOb&lFU-k3h<)Z_qgRpeA;5=clT)5!#Q3777*?WosAuW3Y{lY+Ij)HB;a4Q^h=f>&oIxWCX<)Yt~N3 zXW@pgK?fveXV7CgWA33da-}no`!aSG&hw?ZeV#nuyx{9KMPZ493dKUUu0WQ&C@*KT zW*cfi-us{N2{`>XOL25&u@p>2)QaIl(BeBYV=l`k=fY;jIP7hW;{CaP&*9?ZK^Y3D zqLR)Oy1MuWvGMC4_2Gp0o-NafYx=pTucWWI?DTtZdXugCFS87xy)?OiF85{+c7DQ) ziMO**e1jcp1qIebM{oXUjP>&#@aW+%kjqmNeZlzV@_hBPZz;FZKueIF+0mg2R%r-I z-iXk^N`EP1TE0~f2s$Q2Wli)SrQP)i)VbMj?(RO~vJZi7t4jv;e@QX?I3yDiN6%+p z^z^V@OUlf7c?a5S;ixT`QewkKV-z#wL_F#8XN{Wz($h6wokSt&e>Jkhg@=QK{gNIi zAtTHCQI%4I8@jS`=9^BDJM2iFmxGQ#6He5xXzKNDEkW<=tT#TP%FgPVoT{28%(6N< zGca+FMV?P>Z4~6n8(R1WuuaP>g#;XY+hW?1fUuJV}=t;mz#Uo`TUDSUB)B5BCh2{ zQj;^7)>fGK98z$~$Q6(hbe|teKwT>}r;H&SPi|antLan_K;}i}z+D9x#`%W5VfDi) zMHO3*3#~i}7zH~XSaSk|H=(8bmY$|nYg)2MHjyfU5^|9Qeye z*$4-r4?l`TjRiIhDG!!W#fzWX&b0pu`*LugZeWJFr_aKdjDuZNSeQ)` zAx;761`V=%{KRVAJyFA>$(oF3q8q}77F-(7>HiHIolG8;FBJ$Gl>fFadzP8h0LUNR zD5jQpmWQG^IaI4GfXA8aHPBvNoJEh7H-l;{JMXuOdkDUu|Ma=4o8T36s}+w;Ilkz`@=$!h!dcL8n)u9q7q z{^_sxhwlc@yLW)q?dV!p=qznlqU#qzgArOlh!L~GoEQtWEdy6=-<^srubFwZw|_@Z zb=Th4&)oTfnjwaSDdL9xlNey0=z}VxE>)%(AsxRxKeuH}=X+bR;HrI!?97ME zKjRJhWXhLm8YC>&on5@K)zZQf1341hJBWgMS;iX>HPA!C2+`m$Oj$EPr|X%r*r^LQ zn)F$6zY3wgK?=%;Hv-!67n@dWA(gbC0ki!1wb`Qgz2f6YM{aeG5Q z|0AdTx9j%*=9DAsJQs_{&1R3K;a5#tlwcZo4|;h>WHb~iO85{}b_OYG{}~Cj6pT4B zIJH##Q~*M;T4t#fbgB$>NRi!NUFLM;7M5qITBexzE{~(lwl^>uMx4+`;MDm7%gVGibGG6^V7rL?IDTh?vQkvU>d^mulvRJ70UfX{Dc9s|6_E) z?k-_j$FcCU@>N%E){?`z0yp91I;wk5tKZ(x7XeAuA77jdlKo9mGNpicz%rv_M@nSoyG<_XRFHC6N&1Tw&t zpoqVwkIT-J&$aCbTT^_rBnLFQmX?~X+~j*A8^Q^#fcty-^pUp!Sm$Duo`narz$ypP z(Wh}fU|euvC#&e1>*5m`j?5*|;RUI3tQ|nYUwK@(yvFohz{2G~gILfLY4`>nY&qmf z;qg3?WA`J6ZMi$Rp>$2Jgj=h3km(pEF462HQG#=FJgJm6te~=-)TUHPH>SHjMj9zx zaOI9g^EZx=&9CuMObho5-5)=>i*d_eX3EFs8ym!=vvDu@`UX2xrDxgomXP&k)v$Sd zbMf#NN<*$6ei8W#KG>Ov_BVo|__-Snj+KC)J5yqpP_NY|kD3^4EgmRwj3dehMQGPLKJ%3~GE~lVIT4v@N_SQ?L>WI27phqaUbu z_*{zI4^%KmLV}vZlfokDq6$no#8Sf~o7(AOV*9GFN>3stqvTP|Gws z*mQJ?gvGxvCsw|oNV>hPt-IAQdfPO=Ma?$YVjU!}wf>&g#exm52U@UoeOQ}8^YDnl zW&0gFM4DMOQ)R zyf`x%tpPpZng-jIX>=N9g-a=%A7n|c0vOp#G8Nji%38bf2)laV{~4soe%eCS*bt}! zSC>s83yG1e$gx1rSgfyO!bD#ekcAucnZLL;Yw@|4X>|w#1Lfa9CAp);IgTFEduL3U zJSBr+*DMbOW)7dHqYlK;4fm|GA!|?Jz*=xzo;gur2(pyXk_)$7J@)PoRP#&&bgu6b z@?E(8phrI`$GqZw^JYR{V{oTP|xy$0j@j9w3 z*lutTw%B@UNcr8=@d5p(?uHR@y*3+mbX=x7%d`L7o>1Yuq7G*l!8%BI+{kW1& z&+%{d%27AIzfU?mJv}@MfTPhe7&Vgb(5I=%C=o{ml3SXEKF=pmOoy8_YHv}`x@@U$ zE>YF5r1S?z5Dt|z7A3YAT>N6^#E-u32cP=m1PE=qnmYIw>{P~?bn*wCuegG#4M5^yHW8ML|c zP;iz%I4uM&Xh=3*sMlQ(sJ&67+ZaOG#)E-n@YI3mIFyq@PiDw0*U4OkTUv=aEbvW{jG9h30Z_RV=@bmwt`nv@zG01a);AvzMc5Nk#XIlSWc6L1+NtY_#NR}c5nU8M-z+o}rI5g0p{soy)H zlUZC$2HopdPyG#Lt#R9|U|_$txf5WR9m7Y5%ZLO(^i)8)6gdnmEUEf3dOju(4^J|c zLJa_r$!UjwUr~3ki^7H*Ir$oo}QTJ=gUnf zA7{Bl@y=b3Zv+}d1~*gP{*eDU%5j^^!)pGIi1a@~UwF_c2XA<*ljkurL$49m+{3pz z)~=3pXn9DNk`${B4vN${rLuG2R*#@^`3kA#&RMfB< z@)=#br5+)}AXrZT)(-Go(92qCF&?}}i_a*9xA%6+kUcvAUR2u=fi6|Z&?^^+sp&zz zB|CZ^47JsjkX!B>C^KHC^EDps`UKhK4&?@lD!Piy!A>y4FmVPKJIj5>P z^9<`R9XafB{u*G@P6SIE{eRz?1e)3RZPW&%XLgN0p4Kb`O2^ZIMYT67N^;;L66$J? z=WXY?IH9J90-J9I!+S68VAh*!om2l_^*1?Tj|7>SQyc5^c`dfy#?|bv-;~6O ziU$t|Sm3#+X{ZKjE_e2R(mGe1%&-@-=y8z@FiW#X2S2w{zV?1Ht!e8xz%D;z<Cc7MBU7Dvcq903&-pqAJ&EnkJImSCAGAgq+IdGdS*l(L@bVHw2U8fYLv3 z3G0{NfufOCOci6HvT7&>WRe)66@Jf$+h7hf`jceZuDO1ZkeHVRKA_Q@xT6&BDShkA zOCDI5oKj(23Mh}Ng2a^SOzLfpvv2ko!Hvgol3$SRjdt9ExAu$NF_9etXkWK^$iRC4Nm*#XtR3w)pcZB>yDFhryM8IS*c{<`Ttkv)GdKlVO4(~@l`*bz7ZK{s{ zDrP_*VM|Z3pcA1-nFI|gM4DG^TOq_qC4Xl(WEMISJ=jD^WAL6ai$QBsKlBGX16Ql3 z-`^{O46prR0u}xlE{QdJcvL?0t9O+otAWD@#DV|pH!B4fBDALb5m9Jm9*8{#WzM!; zC{ynclB8AuFy0(j`25qXHT=r7V#{nXvm9!v&wto>nw7+vg#0;)7VmKY2zCc5&I)8p zfIu3Wa(L{bSi*SWje)u*_$c4q-L~ufgfrL@zb7E-)2oQDM@{riVTUCrE^^XNA)W>> z4Kp#6l=2YuosBkT7&`#GV^Uy}mX?urpFGJB!E~XJ8edyH6JYV%h1q;6_at|k!g)t? zjmn!3wR!4Kt89_wd)&i(lE!O8vyn(+@F;JOMd@1lu2~eBo~I{JOz~&W>ux9tP+OX3 zw)+B_G9aN44(%Jm_??|QBS&s(n4WkeLE4>3*VWe}!+oduY*ebk`#kq3=JLud-^W4q zWpeoNQ3|#ZE~gxn+XJ$QJOUMxhcu+bv;1B5?pbuh|9^fAZ4S6og(S7J$SYRoUP=}?TIR3^k-o9L@EQ8Jed+EI` z%wB$XtC@dm-=05OEP4>?9*>NKD7{>TT~&6>zrOddKS>YrP#?l!&FH@ zfStNFn0^qlUXJrJsp}AHa9V@!#l`H+4g=~>*ACYUSKd6|9cZu#|93Y9gC`+3Af(Hc zPiKu)EIHm=``t_EbgPHk*Y2p~EKHS7H)UUa+4OyFZ3U2&kFmHfebrHlol(mR5o`<8 z7dm;-wy=;mI@+CkiFi@=Y}$DnC;mW}IZjI_$T#n_yIk-8oma8d^(8IuonBFSVQqtL zc}YiE&A@XDHQ20MmXZS}I$Y-0(bBxnTgC2dwT^cOFHhW^*Lrk%t)=$Hxnmpb8&kT* z5^GK8fa<->(hJ+LHZNa?GvISXWm-*b%KPfVpe(7rfyYH=e2m!p+^Ke&3t31_E%yjM z2qdU+=y@?;^OwiXWQ60v2>&$f9c^e2Y-moAE}Nr4xp3o~1OpC`nAfkU$+faF{>)-g ziJU1MTJnF8Ai;gd7eWhh*0hOI`32>$4+gMkP_L^b z6p5tPh00iiqodN{p=45X^YewfNkU3azM}mNX5+N9w53|&)LB0~q$seEF_4WEBl|=s zGMSuXam$04>Bm8J#kj8cHBzVe*CW`74Cc~&D(z@oBxp%|Bs%~YU}LG!j{Spnh!n( zjU)t3s-RBEus5K|Ca~gySX^%qfIP2ccdA{TMQaCal3Rt*87>9r1;d0!N&bTMRUD)H z2V!E-NXVTqhRNmY_J+G2eY4+|3#3fysxIR8U24C)Kd(SCps(rKmxmv6mDN>w&|sQN zHCiv!USSSj6Wo~#4X$ipx|6G^<6JdXgMI5H@pxh20uK8wZHsAXmS-=BL`0aQ#VZpq zV`U2qOQ5jm`WXbBck#vpRedyd@%k|pxI7saitKjRSCBAnjT(3FJGbRsR87H~z02)A z8gKC1-d6?qB}XDX7iYJ&x?0PBGtf`KCD!>!XYLI5yA_=I8>PVrWyg>trNcdts&Ki@ zzQkVmV@kurnea&*{@Ld<(e11nqc!>O2Z$GYR$zbc>Gyvb{AQNw<9Al|-pi;Ih@>H}D6q2# zzme|U=I@p+{aQ6RGTE*QH{ki-%~KhrCFmCP3FCc0jgX6gH$YL+`J1PB z3QbsnRAxvLIgU8COocS^NgrZ4810Ped`!E&RMJizIt32ij;tIrKUTVOda;Opn2X!$p`R~Td< z6LUgp%kaH%qC9gpR06SHO>l1&Y6;4XfgviYwLT(Ws?iYd$rt*!0kgwG2yQ zuLrb;Nk`#C(W6CnG32&8mXdftp?q<;->B`5YAKag>_W;JNrc42 zNoVji>gCTiC9ZPxrZJ({IX}hr4l5sAXqblX*I%W|V@+~$fM*0#qX#4~?qmz=Pkh+fdS_+@3;8)~P4*$9QnBzB z;QHAV_@{6xfe@3DK1+TcP9@cQG)aagm2wQWcd{@%1}^@OdJ&!#x!I<+rcHhARQx>I zgZ;5F1f>2;^O=T9x9R|FF3vEtJZ zqnwHvHC&aJ)5_RxM-JiD)xvbKSVmN6f^SUS;Q?k^gJ6RqPOQmK?SCK6(!BVm#?xzd zrdHV%!mNVPD8vG+^U=(=5x^HEGOC)qQBKO6QWjPrAF})XZ#Vk8>Yb7^J|97E!Msuz zo1-!E97tD67GlTM?x$b}=y!dA={#Piq=l4x^@)gfTX*BlIyZAjt`3%>KF8uQbnW8` z&E34_zFmawp07z4hHrA_Hg(R`s98|0Ofv-5^RW7TJq>*g53^!;So`y!zN{j!yT+o3b*W5d0dfMce*> z0wJ;3i6Fp*jw3e!gW#mg&BvB3c8@#MNFZIOzC)UAI4v!GDjT>6T*3MI5PQY1!qWAs zt)X+2f!e{h>Ittoi;wVi;NbraDfD-4nboQ(>js68X1v|%y|aczt-U_hwb`3}J{#W3 zhq`wp6&UzV+yv4h125*s{`2fdE{4W9YI|Ie&Z8<-(y^^V~CSI9NLzeNQF;C3|o zSr5`me|&zus9wR7??41HtY7(nT3aHvRoa$-K*kkX|?uUzdv(Yvz!7-RFZG9 z_JYb)aI!}Gv}_;4D1NnG{U#=A0@W>0zw@CN_1}Kl{31(yJ}e#P?)a5BFfcN+8#egs zkbU_>*ncwHWEiFUZjnGlX%5^TOcXYtKyD{$Op5&c#w!sYw8d&J9Nw#_sd4Aci2(Z$ z7uoPWoFaw>}nYGB04^HiNO+09Q{B($&?xk004+E zjSx+mnVEr5AY3G`u1!8@kc0NgB0zrz93xhuRj?zKZ1i-c+2xGDtDP~M@59N~)O8%F zaMm8Tn17rgh;Sz#BW3BDb@%o`?PE#>2XRCCL)%>t{8qA07%nm8?eX%b+ieI6_WkSy zqOGO12s$ZO)@0Z_O_T@|Qa_0qAquRq2u?`Et|*(fBdlW-lHzL+Niooh9Tf#7E+&RV zCWRwN6g({@g*gvJ%$*A4feynL;P1SrvqKLUS_M_cf~>CdbpQK`y|OSz+yJCT{C|c- z_W#m1$ENw(Vjd9<3wrqR@cAha!ir#ohgi;l5wR<7Mj;^2G~xSd8QIX0wpZi;>}{>N zA&8$7}vyw1f+IW+o)MU66dI>UM>@jj^L`tw%FTmD8Y{h%FOR%%QEyqKxx+LxH})m zz&JmN*9eb%9hM6z1f?8APZZN-J{c(X$T61`0y%Dh!vy!l}WQ z^r}GApi`E>I~kUs%iOb+&uH0Bp@gN8Lp;1)b5wUktJHsIF{L*_rWC8wE10JJgaR@s zrbMusvV;P(>qk=tjFCo|IjQR3ogfMBd zxDnx1@0+&-`vTp;rovzQx>A&X>cu+Y0tac6p9(2icEQ|36~A|N;K8F$skmdBs$#;E z6R5CJ=O9V_M%Kj$Qxa;0NeCIQDm@V=LwNPAaK-5?mas1hP!N_b&=adiYckPfmP1PD zwJwn;l?9bJ$f_dS@ND8I9kDp2r(nIv5?I?rtSMQK(Co9bWA>U*9MdzOU}%lt#^|xk zB5+|S{>g4u;qBTslxkk7{wI_V_b)pmR?K;1;qRFgypor2ru&-=ez{0hpncG2g0R>( zsMZ1((~t;QIQarWMzm7S`Cmz@A=^7`E_joUqULkK%ajQt$@8Q5e_&SlH@t+K2aA^s z6^rJD#uJlg$7l?sEK$N_kHlGT-?g5;ZAGU|=6%2RK7L0k$(<3UPL}!?@sC*w#*EjZ z;e3ue@dxz`a-^>l+nXx4zF~<^AS#8tm9pNB=+W0gpg}A_jw(zeiBgQ z|9TCx>-Y?-xe-I0uBKR56#5>^#w$x1YTIwkpo^h`@=6Y@ zO0&`Yt7jTbfw?}WBwA~+FL;s~BT^~JDGcUBKzvPjRX!1_cG{}>-1{g!`Wpl2?eE^9 zrmXRuT#tNS&tihgZ;Tu$5HFNSH!%81H&_JK*&b$42c z_>Eqw3>aX98`Qsdvo1}dzt!&cix9D4#n#`y=a1|5OhNVcs}8Ja((!#aS4bg@leGk~ z45K{%m#UR%frk_@?2p&iR~FrybC4EyJsL`wGTDin5Hvja{rk6}AxRk^o?X87?4-@> zZpe`{9e8Ibv&|k;;r5_HwG<{onkb>6p&>0T?djPDCp403rsW!K>n@PTgcD7H0nef! z3o&r+BVeGVb>iLug2*H!C81m4>e}1A#!_f@jgXWgs>{pE0RZPVU6S*akhfhMl5B(> zGU|WiXet$|MF2pY5&V^iGYJ|R{%{ZqOt45`0@ILqXOJ2ag72QMczX>ZL}HTT z4-riELhN9Z9fUyr+NBd$gkg~mLyR8~N}U+hB+s2?HY|+lIzrJYA&o4?ffQ)N1Gg{M zLx-rfRcnpj#6sf@sgr!^H6Nq@8&IjAGqTtIj~T^(S&CEB{tKiXK3dPn*;rY5AntZw zvLS#JsAJ)51$Uy+M3X|>&&RM%QZM)aYgLg_9Eo2bRXs12SQz9*4xmj{l_N+ED#uc> z$In~F<-@IuwX-$x_UJmAIM;QE6ELlas)`i_-RL}Rc0RrN_-}dM0pA`FVe?EfFkpny zTHLmB`>zFW?@K#pD08SG#`A-mvJm)OUdy%;@%8< zfjf_%l_mdm*#tcCQ4i?7V>%b?ZU5!>xmS%H$Vjp^NZnewPf>ae8|KBt_7PZz2ILSM z1AzUte~Qd&wkf8&A8hM+_36HX>Afsi{6Nvz?rO2teQu0|NcS%Rw#s9A6MY_`i(wZU zMBx#a!_1&1E(N4y;Vw<-o9l`$~v&qdhNXgBT<0X@eE{Q>LP%O~9@!zh5 zDtuiJJ3xyS-FIRnfGKyzog)h*DFtrmA{ZS{}|I3S_7%)O1Oj>sezufL*`rz(m;=c^8P9 zO#}bk*1J=);LMsQXTy`5FO!6)Jqa%(zuT<**U`t;w7e&)NhzQTBD02?@~E#11$*d) zGT_<3=Jcj%8ejRnGcpm^NCqKdN`Vb2F=qH(T>NHPHg39&2D84-)!FY@Uec;UBb7p5 zm5pZBt9=wHYUkb0-PV*{kc2qeDXzFMlRMO!7GWO*dwvPab@lFL;(BxQ@$A-%_4guU z{&k5~0s`5LeS%zyr~@)Av zl;}+|c=VR;H22+IFr*;ntq!5E*wBzlXx0EEs^5vC>yK*r)YXc-mjJxR8~CQg{H|f+ zk?n?a!q#B8LUXdK<6c2Q*%FE&^=zK*O2zaObmafSRE7Rc)>xI6;?LZ4uwDL(&TvDV zJEig8g0wXz&bvs{*9ROStGqVy?*tY0-Kkmc!cE)wTkG;RIZ!fWx zRC@4@wHVn_^g?9OKG3L>_dIzGoM1U-qe{$-oQ8zn5UMC1d*G<^`J|E`oL=B1A?t8s ztv8vCx2gm8YI}B!S9COLarNB`F%>-j}D+= z!K$uMrli&wWfplD+mPc#m9(lmrG?gc|I|p7<3W>YXKBgpb6-LM_C8;svUR>RzaV~e zNWA%-`1k}(IdTD+0M_ej5j*u8@&gUDcujSOiM^x(r4}`<7j3S-%F@@uK~1jk>PZ3K z>;09WlhZm|4(%ql-}}F%VE*Yh-_5zP)am9XFK8!WWpj+#II5z^<7_IrQdY#Y;R^5+ zHz%mbkJF-f9c^tW;kp%DEb#--gL4}xh@@fVT=Ki$^2dUl3Kvx160`9}OIP3h{J{NR zK!hW56*WqD(aceJG9*Qbo#4+lvvC~hBttYHJ87`lN(tEWZ$CfcVJ9`UqFL%}*N@d^ zy7bi-RT*%hH1eQc>1-jVlmY2JiM~+ADZQ<~mow2!eff@ZUO^u~pZwzfqFA-vlh=>^c zkAxk$hD;j6JnxIBSGK^>5{vv_1StL(8Ifkljx}`RA|9epfU2F#on|e6X9gqW`*5RN zgsO7GJutLJ8*+q$9b-(uWWumqqriTf421x-Fl^X|kJ;QC1ZfhwlITCi; z;o`SLvFSkdYclT^YVNPp(Cs^LX-ihrmt8D&!9HcLJ$#^kBK{}*abnOuE%5*QSJ?ks zWS8dYi1~y)?C)*uQIcw^vuGwgLd8j$9R@~;6@ljn7Op5VCySrNo=Wr2~;f`Zh_1PUM0-3ml$&Ab}kPv7ROqR+@LvSzLS4_D{Z zU0D}y>$qau=87t|ZQHhOR&3igD^4nvq+;8)?X%i$`{I22C(N5M$9Uh~pU1=f$#3iZ z%m13EkE3nT&J>3V9K_IuW6}24_ZFi+I&6ItpEo{;h?(7FCqZ@{ss5lL>MSdQuO0c` zZ8fmN-RE7~T1tTruZ*s;liBQfI_GwN1>6ln_R{nsIzHYVw)?v@1Q`0R-kC*Xd2L?l zE*;<^_--BFZ~u1o^Bgl|I_!D4i`F?i`*ILu&;Fd<>fy-h0`33@2z20T%NSsZz?OPI z013g2E(1?9CoO&Pw%tJ84+TS=w)f5R4+N;eZ&*o6)OB_Tqsb`^e@(rd0JQ^$BJSqd zj^swZVradMe_scxk|=`QBo#@w-Zp1{sleII~Tkv#R*oYLq+!}Sy$=!yrf+I$bach$vXg-9?xD4+InfS*U( z&ua?3g&|K%OM3AF_v87O?*AO}`V#rp`e!Jo$0&x638PPNM3?Y+J>Z1gno96Jb@*IR zW>}+&3Q7dGy7-oeoQVX;@VP&_Fz7V=&3-uacsYK4+T{El8YrB3&&LtVG#s57IUYvL zkCE{u=USwUqK-^#_dZ>+_a3CZ3|id#FzyIQvbDA7E(=VR>UBA}(U3-mmv3v^)Mqw; zL&zh5&m?1ZT~xl9@h`QvD>{urj|Gz(Qo{&2Y~NC+NTUbwcH$6Z34W~w9uzYGPm3|m zIJ(7X3jX4fxxg}2mTHo$63~(v2390)|7iZ>3#i94tYx~kIBg7FGDG-z}NJzY_a0y~xldTUlD ztXvdfR*IA|N>DwLS6!P)L!uyX-&iZJ+|rveaJmGChX);<5s6b0RYVaU6t~nwREz>) zk15^Q7)Bpm1v<0M3nZ>gDj6UZN=PP)t%%GpJ9rN!sES^3E9#305>*&nm9AD=Rn^p8 zgDr$iW@CyC9%WL_&lz&S-D;b(AQ;E&VeEWTdYm_N3T@9#3acfSR^FkyUW%eb!Kym5 z&;l55mNaG0M)k!650yubrA%H|OR#7>rG^~@vj4_7kO(nRz{F4}m>>7z4IH^`p}}H? zbr~>~Oe@rMC1z#w*j8uDNdgNqwLt2?BrM()?d!DmDYe%WQqnp(9P0G^wyjr!1|+Z7 zpPfD8ktpdI8HbcO5x`snEm_wVToe153qVyR3|rWS-IB4Sd>fv-7mfP?gt$1B)$4z7)u`JCt&<>_dAXnv=rLp4THIS&w#HgD-+e)o1gkYX zNq0qANzl{Ng}ko8`fs_s_OJmKqeX1?IWeiLXCUFQCO688$p){#ZkcTU5#i-= z-;C8qcZc-`8chGholy+)dp^mZ!};2ka9^uQo1LA#Kb|HEcsBJK{S#|L1k3tMdmpqX zQV4{L3+3?AEi{~~{It0|H;f^A+fT1nlxdENQits$ZuO?L%1cCF z^NLA6Pdh#$>_alFy;kwHDK~3rW-Z^cHn6^t>B!Qi&`N#hdboOUYn4hjco;mZvE3q}3(gGiv;Zu|j$X%nMV7GC7ePrj8nd3EpM7 zQaI`FXMNw-=}39)m2d&|zQ_&u`JXD<-%?4H=qXw1C#bO%VB@&cYoC;5Jael4FS%=vhB={OQdHphb-o zgk#2y1!h~*z~m@-`JZMR+j02xG?j5K;Gllk+pqVUTz;}KF}hP(X5}5~LW~35*$?l& z)m7CpGBUfX=ylit{4HOl-^9LFx5x#wW0lYHF@M4u*Y2DrfX4L>4>h(4I0GT40+mVs zo2;B1TWf1;OUs-0Ph>?UB_&PG6ZbBfsNmo^53rwxq|K}FNSpy&uf5c;JVc*UA3j&0 z26#Vk`Co_L4(YC6R4&6iv)&#RuD*Z#_liY*#JH37pDWh?AnsCu6(syajPG79cZ()pq?=Q|9dNS76P=%5*Vi1I)#h%g8Un#wT)AfK@+uqvhKDV|iVHmjhjO0haTs!b^f z!V(cR37IF3fXB&~qK%_>ucv2u;$n(#ej1_@10lt~i>H{t@BY2#+26!axCC?b-n z8dW44r0D4!75l@se>ccImJkIq^5=TCuP90K<5cG<;krJ>usy>nak zTFHVx5lyCDynlQAgh}lN$gX?$-MhXyKs))H-i4Yc-}k}kIo~Z1#@H2-hkAtepeFNv zfg-OiIMx08S41llXhPnq961^FOCi&?x6LD-aKPzf9J*n>UBkdjOf`b2cV%pYmz=h0 z6?1qLm)%Eu(J`im?k^)Vr2GMf)*P!^cvi)UHWPGycYRAY>-`y>fDp8Sn4_EL%gH+x zV)x4A_FHj@kRRkiS#|I~Jg>H--dFbQ+!QY)hK}f%Ps1B zq62=;@dKQmC0v*J3nKsTrF7I1<_Jx(#&{-6gwIUJsdQJT=~8L+wi}Ms2QZm zS#dH+lrXRfucg18kAz1}|5}ojRrHGvrU~BO_0McvToAzA)FBXzihkrBv8EdoSgI73 z3}cExM^xf$+5W*hvjhQt0)`ekBy%#xm%A-jZsOIJBU(m zxDY3PYoaV0S8x-I@$Yr9I;+yOd)&c+m7Io_(9rZ8_S%UthffL@qd+4rj1WgZJhlBH zF7aKlT++uObfqLYzW9yZ6BM}nXnQ}^8zx$DFr^`>orXl#O6j74%D2_6pJh7d;PPVg zYI4i0xx|JYMTd9JVS`@!B2MM9?(rksENp%fkrA@ob{xkLN`tW=l>p>UC_!s2byL0* z4*n&(r)BJfOzgmE{wn}xDj5+bwi*_MA1Nh0Ik|d2G3ea5Y!x*CF!5_Jkx}}<%?r$a z(+q>8Or!(_k&Pfm7M4Oib^-UQYrUq5JBmqK5$p#!C__9f7v>RXRYmLXqAvWx$r6`T z#)UmM9)*1FJb4RsHV(Yl;Q$}tz^6!uj<^0Czko?A2qGvDSV9(@kA{Q{bD~%$R&*jB z_wEkl`K;z{yI@*VigjER8}toRC}SBChB>(#+5$?AdeaR)X^LJqLKbUlA&@uR3nBpW zf*=J0fsJN%*81AZvXE5>O+{pjs(KQ>BMcQKcAr_3>(RE5k{eI8**e*0J@PgtmP|Hhww9LGny?j0o4A@YpE~eaBPmp1!dT&Kt#*vBfp9ZL^ssB6 zuMQdT!AW{KPGkxO1ZMId;z|vrQ#Qe=v7mhwF_w2_1b*3xQgqcUa^*CfU!G{T~7Bx5>-lxks} z{NKNQ{;D7Ew{wwj7ZQG8MhF_{d4&(ilOQ7A(wVQmRatd( zF>tXVDk=qnw@crjo39Uq)$7@MQ_)RHQ>HTGnQ!6VU?4XeaPQk(zAy7E7K%C!eHIFD z<}9tOm{7c-RW%?L;P@xF%<*_JvJ75&H3cjkWz3u`JU)f(9-p0y_V|>ZM*A$&FW^Bh z%Ep$ixX@y9Vh+X_y-jWR}j0a`F?j zfzaZ3=jTfDP(`zEWo5&X9y!T^edXCv3-5!5NngHLBo8~HP6zPnn&9B38wfcR1wH*|y zeXwj61(m`5>2$nf8qjX6Igv@cD?aYbnR2>)O@~|b0`ISk5z?hevXoBv5;Q=@Yu;Md z^7(x(zn8F%6_O@x559tV!*mo1<5*;6b<3*z=bM|W=9$i#-&ema05eoOdy?IkdzO`A?t+4%*MB`K8Po!jlpFw64Szc*XYmq-SQ|A=WGI^)2E z@d|DM7#Pf(wZxRL!)Y+1@ka{zB>RbRNvo^G>k&<|mR9`J2Q}b`-zEbEObQVAusB7olFea?4SoMJ@eH z-96aD55n_J45zIp!oaM{u(;D|OF#%6oW5G$o}Ul-`?_}$AuA3cNny%~iZEM1=l#10 zMmUMwjvY^Ko;ok$Vy)FC1U%hdHm13hG_-;0kbz`Y=6ZY8C-urt;;QzfR}H7kPN(i{(nO< zQ5iI5mH!FJ{4Yt*Cq`9+U}U=EInU>MBXf1t>*{J^ivO416AAjE5sguF9i%mh90h`< z9j={JHM6jYOiW}E1+5gDw2IEmTv=>F#?l@Ugk&PISn0SA7EQfg7X6=z-Xp$euc_O1 z9+<-9)2P0Q4IZxe>*MG5+-)ukpmox{R3q9Nn&kRS?K6I$%j~Th_Qv&$YFp^vd~;{O zP^a4WANo8zuL&-Re3MF5Yg126(vqGYK4j<=Jc5zeo0r@Dk+?km*F+=SSxwvBBu0U^ z6^^}IPqoCeKoxNC`ktoyxf#O_B(jBtxw)*2ea@$j`SR#6Fxeu@PL)9Y7%?HucK^X6 zdPeBrn?BHhm7eq1W&df;a{SSlpD`80TbUAER5291$`&)V(3Y&l2K0?I+0odKQ`vns z)7eSnlTe;E(|OAtUrW0cpxNWT!YaQh(`ocOQgIfo2xY!-TgwaGPlMwOMP>l#cl#!7 zVk~H-;3CE8krJXW17BYRjNeE01Jg6W0+2z#p+~_MNfsXFU$V=|(*sj>9^DYlerkZV zjpl=(LW@n@9;#oD0RbNVj0;z&Ea)oTv3QtFaXR{UBbfvu5%+KB#WS9)e5utq1KVE{ zp&hR;-In{^9rSd)@}@9KSu|(&SLeFFOR6bVqcbKWsqSwBQ{`AFH7R70%tmIgIKqSD zU{+U}eXu0eKtJ~XM%tt^x(vS$l4Hkv4T7@GnW8(#+*;N!%o1Wo26DDWm5!b-+XKg2 zM7_!rW%SX?>m;J8kr_MaAo(#dzOHws82vwfAqjc#{p3bvR!ZxiPYm&?6yf7naN*s_ zU=NEIdo0Q%Qb;GR=(bM>j5En@vbw5F9|u>R49o`;eSK=CvSIUjq&Y2I{fSyPIk->O zkP)t^Rc&DwuIn8Bmwv>v-`>Q*?}Y7UXhuIWmz!iS=sV;KQ-;@B3;mZdLM-~r$Fc%d z5rFBi**%JE?HbvT`rGO?o$n%Vn`hVELO##I$C?j?OX)b^W2twe^}LA`56aVyc}#9F z6kUtGm5b6oeIyOLNqKZV6=bEwm)l@Mj9h1##Jbi-o+P{4&L(zyS%d&i$@UED^ok~j zFoi9O(;{ZI%tR~BP9=)sSCA2miQ>FWsdS(f_90Qjzcl-wF>syoc2%8fC3WVN4?tU~~W?S&c6d7HmRLNp>tYlG0gC1gf ztR6ujJjR_OHT)lE{H$qo@wgmfY?d+GadugWAKx4Ps5UO`&z;#vFKgcRTW{zlIVUGI z5ECu#g2*PCCV%OCti=`dWRC|lMxC)oz-q=`+qc!sw3ONA8v@5nIjk%-$drZ*jw4&W zP3$1GdYOH3O40;=7me|soScRCW-D$`VyV)z{N#SjFR|l+PA-c4;r=Z}o5m_;UKEOf zbO$vg8GTZR!V9XXVJ-3{I%4pAjUn3D^$dqptE&asVCzLB%4DCRg-F{JaeEUal4;A3 zOryIJ&@xPL^8%iMER@i|I039^UMBZ|*7j<-dYyCoAQJiuWM?X>JyJ2+)%&l|U!TKC zkdB((8FzXH07@h=N0iSN#LB9uv$4!DOrlJ&j#rerpjN?=DOoxxFm zDUvf|z1uwXG@>mKot*3R?PfRYah58dCjNSJS-mKNd}g$_N9|zKV+zYjCFGDJ7-uN? zO`(ON790H+BQ9(Wb)fC&;7?sM;ZUYS+FeFuu*vj;mrUDRHs3l*HcfHI$R zfqXPoiDb?T-ojc#Nhh-sq?n2b!j>iP+G5Y~BEe}SI>|vg<9BBbKOV?MBvt;!*(C2*Htf^$pfY-Z z7GFPZ-rTGG%`$D58k1CuwHu5MU6>LXRRuXXFg(0qYCRIqAr;EoZGNdRp6U`0(g1Yv zeB7+YHsq?NKW$$3t*p-KWn}$~O)}9gs`3sI5~9$_e`j~Yf2qEG+VXRRg${PC2a%>> z&ExTTlF-SUK6Y+1^K%-VV>|C%WN!cEA|7G8wscg!Y%yf8_WGv|x&fpFJpE-H9O}mpou{z@KNDy{ z_S)>$X+d0v13@psqOl~3W=(&Vo^zKF=TFPa$p?az_*-p94SRmXT^sIzsv1HHR@Kl7 z{bm7Ua_n+*pF-gKoLE^|+1Uw;Y;+oFj4Wd1XlLc%7#siz8P^Z7z))TUWkSc^ftC$? z?Wa~D`B0>W;Gk>i$36+B`^#dIfbU4egmE>kE;ge%1>CG5zVMp34!^{JqN0O>&)vMs zN14|bok0b54Kjj{8Eq2W*1Ye0vt}qO#WiD_kMc#`Vtd#`iu-~Ep_T&6VooJ3NEj^~W9%{BY%C(U0Ne?RX-d(uwb3YcUl zcKT0N)t)o#LJ9|fNkAKYD-<5B;1LpDonMw(b~ZH3ShxE3`q!Oayp}Z+wYQX&wv1nX z&CQwNaX0`y49(n`xk5fV>t7uD*JsehHK^gQA731Jh+2R&4@9D^&unidJZ= zDP$cRqRrP2I0zx$jDhQIZb!#&egqN>qnI*l&N9@4&4Ga+9+VK`?)NDaUA0SIHT!uy z8eUW^A7yRTr7!0LM-7YPpl|`@g@D%_7|)8r-JRZ^sBrv@mQ8?w4mp5j&(Me!+wj@i z2ae5uncNY3JT?6l^GD4hT&@Dd#E>)?v|D)n*8>$}@R}be_n%#k?UiC;fTXm7z(H+| zcA*QWxT)@7!yiK?#%YZ6-x24JMMd|DgX%<^q^6-p}GWg4HCX`g?vk1e}lj` zgGC|J3(2+KnL{m2-G(Y}X)#CkIFn`d+GEbTS7R4bz-|+c24`I(zpm{3togzi($*81cNQ{M##AJP=v_ zXoE2lMSgsvk(!jnRZYV4x6Zl-J`jFPShQ# zl7FV+JxjC9XvCSaTLjpFrrw@F-XytM=v`Eh%rbKltyaT~eS36e1-~j~`*tS*#voY) z1v66YDU7UOlN=CHpNb-X?j=;l3Si-VSd|5#)^=so$5l{iq6V|69^v6#sIj8XmFLLi zGMOCp`t9r@&J2{Hd{*~tTC+9d+y<`d`Fc~(3xuD@S)D&mgQ7R|&rxlvcQm>IPZESp2&I8S1gV1}!PeO(p`u^dfWH}Nn-ypu*-c4)-g;TQs3CJpfK znY(Du%@6U^4l{fw!yL`+3!=|ALvupN}==TByNRZ*IEYy6p z5HWM`IqO7HNW$xZ@5WWV5@Y+rAeU$SU@pPm7Rfal>C z_AnWEJ~+b|WS zgoFuJJez_P>c}l#yDdrT#Ns(0?GSdXde3T|%bVoZ4mB;G|K5qHFZ|l*cwa?!k6KMl zMZ@utFpcYQQbc=`IL|l`M#$5p!;h0CT~!6!Y&JSqN<`@ApsM~M-aKSjH0eHU+KL6` zfbbCDdkYXsnC5Mtzkc3sU#)!?M~I2TD<*4Nl)WS3G)fdvv|o(fxMRuyk}LmwFuzSD z)$}Pno-&Z6sH79{ZTb_YqBY(R&O9zHF_*G=d3TnF7b<;O4b^%@hX@ZZe9ZfBak>8k z6oh!&|Km2P>1S~Nw$JyalBn3eQn-<{aOq(*(OXHW8zx&x=U~KT`k`h~#H=A6uqurRm?T)XQP_YvLsp>ro#H_QH$qmXjb_4)ajr}(%}mom3lkMFdh$5S|0TqtK#NPyUWn;o z>r99#j^=EYh|fS>efYlHUz>O|5CX)78KloqAK?Oq^qk<}U^E$i1hjQ`8tT_f4~wv4 zT73-!&~%BIrPyx>t$yPR0%B>ww)3)@DoWaDy6U{${m1d;Y~^1?(LdJlH(yBpe58+H z=ck38Pq;%6RZwu-9RL$gkQ^&+SR%{=@R={Gt_e!uh(IQqfeDQ$N+cVIY&+@1k&8q9 z4^tFP| zi=y)d6M8v&oRnj%=?eGuGyq$4Bk&6S*Tnnt0*{CwI|G{tkDz0Fn#Dlgq6z3M zYjiq)B5-Oc5J)M2BpU@OD#O!EGgm~1ksldMTv_;=fsdopu|h#yIp{z%Rl>qL4mKij zyw>l)C3`{gCQ$DY7awcYNf;f<(f2X;P9$wN&PkD_NLNbm$>l>ETwB$jH>T40D(J3{^dYD`E^-Ev;L;&Lxhqh?ZwlmA-`CN!UrE}o?R_;N@h zCFaOXX0F0w%uZIV%pE%3#9*FOY5FmD2|S+ewzl#d$#Z@Y<3>^^wX_uW*6!Q$VoJ#) zKIxtaIsFp^v!9$Ph@>bol1qhX=1Wd><|?vIaB4Di$>v)u{!*kFFo{UZ$Q%_(kfuZt zErqkq89w-GQL?lYo>ov zBIFpbc%op9tyS^W`A9LbO?0TH6k;9Y!geiH`_czFt&-GSKe1%M}S2B`*d4VI$DJ5;p#n)4HZ)^u14)uJ=yWwSW7fV#H*IK?SeBMe#*g4oygt7X7n<(=6txcb`t1Sd2_;}K+6bu6%$NQ@kf^tYnFkGwvA8q#(b*)Lv zq<$1R3oUk}pdsrprkM==0|rKS4cXEQhmVuwWA>EEn9YWc?q!E?{&RV`cl*kyrQ`9B zRz7`QExh0Jy-u;83mr47blOI*%KFrXR^YBf!C)qN*qpgx)S=vHEZK4pMTXR6Y^uy#FYt4*z1{DfqZf}V zD~ORREx1972To}xL>hpI6m%-(+Xid`{f6#UfwO%$^yo=x!{0@;C${e3P26<-p=hD= zr&U#TA+tx+uEBm-3ccB~!#MI46*UtgGYz&}EzW-gpZva_F%;?nUU!kAq=g~#1wX{f z2lTa+`UMKW2QAz~jQ}G!lZHKNY9;4D1@!)WGx|{ApQ!S@F#$(l>vJ-hieHf&Wsq4y zifd4?+~nf0bsophd#>J^djb%{6oIs+lSLdc*K`Latq>M|y?F)uL)r21OR`s;Ac=FPT`+U95mwK=Ls8FJ_Y~v7k5JQulSOgucj)syFGeI0Y5&~rThYHyz?{uF3_2lg?=zyuc{&thw zy1SRU`8qr-^o?&xv>|;Isik1AMYERXvG|Xi@2}pTL__2+)PGITuY+*n8cw720na{B zMg8cU(Af>c7G?}T*wYalcL^$jF9ktPMos6A?-7uY>NPuHqXPH60x@A_afA84Yq17* z9jVd52o%G~xXN;dUSVdmKoOX5S_U*40-f>j@kI+=wd7MM<_sgI$uR+yh!UhgwGS7W zAP)R=HlvF%(}*7z;{a&LK*D;cjg}od1Qog5vnoSHWu+4^klUWU&uKX|b0!3u5(E{6 zA2$&_(A_hO6LbsCUd6jd}+ks4JcC<#WL01{L}ZY@MF zfy@di1QQen0t(jEU#C^S+&(fg;dzzGZy8+`rMTdmv>kK#{NDS_^T-a+XH72@VFd}y zT;}qj@m<<{Us3vf7PO%cl2d#%nb%Qs4_7jUvx_p`)W2_Z+_i46%TEJ`uk-o0Q)8J2 z|G^|vD;`t}6>BQ9%VIG3xlgK3Yn|8X1E94>G=d2kAH+8O?YJ$Rr-B*%y@kN>Oj%(cQ+$ zJ1nz>GWe+`>pS{~0_ZPz6M*FB`C3Mk;J0@mvM4@T0is>l)wF2Ljdl0bDGSpkI}21M zETGcqwY$ykb%Kd`Qx0~`*5>_OM%pf^;)!bNS(iTF=8);vDadkz!XQQG5sC+*A`*#Wb!cA8Em}D9KlI47SPN-_zYeB_LW`9v+z{3^CDrb4de*GA;sE<+*cqUDn zK}s3Tl6-F_-!N?dCU?$OC}#NcTrXIXKrGXJ8D!B7=k zm^$vcgMgxrgkd%*`B^IIN2-3qf!h-++Orl8YN-g7N*qsw2YB+R9i>d)leeHiK zq{%NkF{{V0)Fv)nV{IRzZ<}?wjWWZ@K^T~+Vbw|WCJ@O(lgu-@XT0E>714(jMHAU# z1iJysI4$ec%JZ&zm>8pTs&bem#`3@CQV+bMVC8w-3TNilq9*h1dxSr-I2KUj(ISJu z^7jEMDy2=d11Y$q_2@25W?=Xdrc%dVgG`s$@+*>X1=JHAfRj!mO=^a8A!{a_4z(DH z%SC!PGMuM}Q$~*NTc3-UM)0n!fPA-3-^E?sAY5!kHvUUz@OeSCAy(qB8VpV`Wn{H- zvrTZtaAJ6fS#XvHR=2B-UcL>^k1#fy0YAg@ z<@#Sp3SxdPA)iP@M3oNshjq}tZbza&vsmFp(OKn!P$-!tjcLLsKzl0wCFnH4uZG)j zmZ`WG`%T%T7E+E+ZCxr5e2x#$^K6-5F9%E)!LVoueA^y}-RIxG0%~I4duj(+|6~

    =No#9DLy?@d2HzJAAC@r9Xz;ba-S7yeL+k{3ol$nQxOLnx>G?Pc8_+FJM^BQGH zvJSgVV1LKXFPJxnRsGWA3fLO=w*K?jz_kl{$!d=+URdGcr8Q?cvAI|8P)>J7A4r!3 zkYZOWz4szMnzAar5^kEleB!m%?n z0NOrH6$GotCT#{;TW;g10W|^=mg`-pZ0YhOf#bYZ*DwxCl$g8Q5k;YvH;Gud0eiziH|eviw;-+G*uo zA!?{4AsRD@73XHKAk{hXAAy-F_0GNdwYWDCML$yv z%#ChQ`yV{X;r;FjPwU||`lVeMh;wmOh$^>nN3UN@_En(;i)>UK{EJ&>ckxc1!h~ru|nz^*7u2P_p7be^LY~sBqF}zQ>b7RRx_P; z)73!-j2jBvSZ@3{<;s?~RW-iN&4IP>pf5@G^jZS$7Qc%XpiWC}-Vj1|UKClh3n`cw zxP(_wP$*P%?9ioCuQ@q6$q)$OpEwk$qX#;xlf8NKfD;s}`Len?1|j6(jUTLmB{Kr$ z^Dt6{KW30#;Lt;S3i@|;4CUnHfNCHgOn@dxJKu*s1Ol*))R^>*kVIan;~3`Z7`8A2 z(L4AWw9g5@AW&=gD)MW`KoL7{2Xwa|?sUk-Azu@Q_-Im#^}WA_sP7Buzhe@?FzMTc z|J+&rm!)O}1nJ}C`FI?!<@WTPn+&k87|Oep83sFnkyFU2#34sSp|>j66R9n-7b(l& zQdqy2E0a>3l>W+cs%9!l+}a7ijl&+mSn!VTO4^E z`EA|DGxj!Q7mKh0WyxE7dW-{XO`a>voaX}zw$sdB*A}an>-2F5aitmlj+de$GXeG=A+N--_7mi&$;w&inU5#vYpAKxM4(~E4Q0LM+IqP%%h7QO>J9!P}VhyRqy z=U)+^#lwGX``^a`GYW$JeO@{vcZ+zM3NwOC5M(Z|-DOqosKqdJTrStchcd+;*WqX9 z0bkY2JUl%45j%fg?*lydJ(>V+uI}_Yz?otFa9L4kDG*Lo#*R*l2{-EcHnroZw3N=; z&KmlWdD^J(?S%Oia48}1daDrd#0GIZmFsuUF=7?&<^R1~B)@_4TMl<|E%11y(FBOi zDOFZVB9HS(8$XPn%I(_n=_)Y_aC2xnwWt=ih=+<3kj zt`c7e*}cop%*E8)J*}j|lb4^#(ZbqYNVuY)|H0sEfi*^;?>k*Cn|<@wP;UXZ+nuSc zbCJK+xvus?)sPzfWNYiLVntaYi7^?B%Ca!1fr+2o%zo8v2dkJdzI$3>IzuEYgWlST zqKt`nTg?KaPNCJ=`*pVo_Ar@O!uTQo1;3rk3@4pw(x_YQIQT%p$mDysz5qTUQrtdt z)E~kTW=Tjfb?T@jH8o|^_H`O5e=Vi*WUt`Io8afG9lMAW2Vm)BCO8_4!4wsS1RFED z)UkiMD~Hp1QvyquA*&ELz7$IeH?q#E!-I+#yy>o^X5q`Qvuthg`XCf+6Hm`w2Tg%r{h#{K|o`A}ZI7F2J{@FkSh9SH5h0EU5 zwx+#3z3|kLa{)P$m7T+4SRCs6ar$TQlH29hN+W@9QRdOg!NP*>@c75|{d4+zApHe^*5)3GMY^ggG_Ve3-M;vGI{xuV9( zj>?V>Z5k0V+*o-e1Z_SRO1gmDbCMn&Mfsu91>)+(1nF+_edy6lJ2IEZGR2R|{8 zyPc4ez>^cJ&KAL^<>=$JWJGESlq(C$DnkghwX~Rj3>bG@plsY=M*yi0metm{lg=c= zG)F_Sw4m*RU`(W%Xug8Th`$PJ7$+t{W2`k5CAi9EM4-V)|1lAp)2fA$W975TE(kS8 zmF;6gaYC=yWk5lt6<2`~Q67q+3_9x72~G$F0**jAF|`fXvs%OJXiD*gcvv!1GN!F? z3s9oW|5cHkSCo)6nO9QM+LV=KU}*jD6=N||`+++sjIKtHH6+|2Z5+X%@i~ADu|qoW zxzyS0f)#9>x$0Bk!)`zw<#hvVRxZUOw}KtqRLmK+gD%gFUo$?;O`|SIy(Z`+372(f zwNyIh48VlMqBX`9N^HHnEch6d-Rd?Qze}~tQk7ST-;1Hjj5uzhQJkN0bk8#K%G>4q zF=+^)m8ymYA_x{7$U_*gG5{0i>+WtXD|T5kNm+JOQ0B(hg*Vvn3xZXS$p29-xCk{_ z#JaR%=iy)OR;G{1jxn_hIjb?A)cn(K;_Ugd12X54tFwLkFSkxPi2VGxSj3GOi@#Z& z!z(*%{hOUV#kIAUC}5hoxm|hw<{bU8`rp{RR*F*tz11Q;8hiKmm=!~vp6y8G7oB0V zIsM#x)b<7uBNA5+2v46>iHu@t^>|&kQXL6y?_i9V0w4zPdjdb(1j&3Ze+Yyc#>d4z z1vq=(=cPM25MvV1Msx@>5Y)tmo{_SKNv(2CHUKFKu&b)h{B6kj$6$$Ok6+nX0+O-{ zD>zR)??|ld?7|xYWmF<6c-Yu4^Xm>n7RHMF%eL$D4aPkgGFbC28CEyJczMGf@;Fjob!_K6-igl4orKKv<3is3h0$fodf-tJpi9BB& zeSEssFT*kK*j!K?`&E-B%^fy7-8#xGjBQ0HObeC;w}T`K>H2jV437<0I{ziv5%6$x za~I(E!^1G&i6#?RLaG4UvcSo*;?l^-2-V04%PFfVk9@+6kkJQ1xOG-mmJtx7q{o2u zplbLD)l37(fG_CpS44ms&_y_Y$G`@|uY!Xw4jgBKw+#00&9h|pt6{r|xqS`h`vB(# zq0Y%S4gNkKYA>U5Cl6@+z5PA`r?;6q;{Pr1-;0k+9$QD>e-b1A14+vTnv_+JaYm*; z_e|b7YKhRkxVl(uB9&s~5 zq}T27oTeSr_qyToOaF!N!BPn$VbZj$e9&UL`|*@29VU2XVU=}Z{j4=IQu4y#`?pS` z1OIDRGIls0C2FG@TKDbB><;*W=#CC2N=8bHtGC z+f<=QHAwFZY~zhwBHa_DFG*j5UL?$rFX=Bp=(RPja^(qAD2LYVO>Sktrx}g1U|X1Q zt({$b6)>XE>-ys8`=$S#wp6OKoc}q%qUc1~n-PxOQdE^y2HyWix0{?;1Xvd!@q1|P zOP(y`n9iw#68!o;e5h3E@_5W{S&$LHU+qA#aWAa@cv^5KR3WD!lwuH@cWI7{XV^f+ zaJJaifE}Oju)RAcVdMzde`!RsDL<*ay-f}C*}imxhkwb?_IcT2lj!Mb#1?oT{uR>au~S5vru4X^+e)zGh`EFZCbeu?aE^s!b+b> z<<&qXS90Q7b!~fi@L0MmW6Dw z-~CB+x}C13BPdg(h4YfzN zHA2fLj#ZrSpUqHWfGJ;Z%%eX8TXGS0pRMn{RmSDD_L>aBoz?~a7Oj~&J%C-hZDrQa zc#C?(>#JU`)9uc(C&+9Vd^CvCDSNghZqK;nF-Wnz4))Z18EE_X<-qESvB44)+GvQN zdh>bU2z*6X|BtPf{Gmekn>)LP^&?k|xN@2rzK9`uG6jmdOgB`Y%jtkJ%JohA!cGxG zDhYuwjC7)C67llML7w4B{`jo7f*gX4I5le?V4u_06dU>^-AnHXmFw`Wd+)JrB{S-8 zsS18yN@7+HB?~r<@#>kaR`KkcI}!|c)Gqnp(m&)n;|rjyC)E=@=pl-|uSm>mB$)tD zS2a&@9-Y?Z)z;OWVMGc#98{)}4X9gO!GzbgW7kr%#MfY>XiOqucBRnqFRDzd$3`!k zwFzu_U=6Z@0xw0wwjqTP)o6h&IcJJVf-*;dBp!acNJEJ#h#@x#Ml%c>o z;>XNz3jOn)HDnFJLKikIO`1w`_?3=8E{{eX+5csJ>Daby+qP}n?2c{QX2-T||8>sQcm937 z$G)gBYONP@J`XA3E2t?%a|#`Uz0(?L@AQH z?9=z&Du7uG9Gt^MDbuht11p&(*~ltd2ag?Knl(*j+mxD|ym2>0apb(T;%J1pR!7e? zezLL1LZdTh)z|NGP&{t;9UIN-Qa3^HU0VyLbW7{4$8yaATGvVa5Q*lkeME59GjJBn zv59bwMyE8sM)LOT^t>E0iJt<<7@;wu`{-aOA|MizM~>K>Y&xGWK}-Czs@Dd%c=9%w zt+UqDDy6T5$)l2(AWn;Hh|%y(ZqK00KJH&WSp$o6bGx_h@V)&gz$9K!3JA6IsL33! z@0^%**VZf_G_fF>b7re$W_hc5Q-kKPcCRootqv%IXz%;y8ZxCaeu7#ciWC6gEN5L4 z0_;TnF>hJd^ScDMs^h)?fb-^MWAccp=ainru`Ddcy1BXO z_Ida8^yK$dJvT-X!T0nxS#>#I0-+p<`+$evEkVMgGEItv#NM2umt0wD^3?Q3)!==K z%JX$}GPDPZ_r5+0yu9X}g7at1@aW`!6 z%UWJ`7uW0EjNjerWdG>sXfBUev+X8qV#AZJ@Pa-p{SMS<-10euB49s~0Eg$!(0%VN z4iW#+&6Q?aZ0mjD-0bT{l4c?%E-o%6#>LeY$kh_tjN(V=r5`)KPY@^h51=gq_`spl zp*V8rDczs2A#Sxfyv`3HRoWu4dzzbgW0+&|t-&!2;zYyc`@JUmveU zL#3*7l$lq+=lU86GU)R1QnuutAx$rKpI;6@8At$tPY2N%wx9?E5YxbZ=vhX=I!eV<7_1YRiDy)pZVtLc*u)oF6pXQ*! z$ky^A1k5U+F?{kC68 zK4-V35Y0l27p;r)o^(yxA3JZ61wqGtZy&R}HNK#ronfE8&dyR+BP~6T8{>B*jdB9d z=*ZoOyW0ev;JdGDYxuse_chliS9rYM!VApqb{$+nO60Q9x$Lj=cCmc3dA+qRl@D~G zJvNJ;2yWy8whw zHInRvKgiD^{fxf&i;kXQ`f_O%mW1B+4B86eaj_!ETRt5w|lV*tCHyp{EBQb-ILCf?2rO^u9W3^FR7opc_y-?3V@Gd|Be?%$tC z&)2JoV_TzX4kwD8(Cr;YWrxl}fK%o2BGQ0e5b;pPiXvfcPR|p4F*CcN6F(zCZS6pC znR%4$<>%R_+?mRaOeSg62IJHs=*V_zfX6Y9z;3nC;<#iN*3TiHE-eIXYBZ@#5G$-2 z%|fHhavStJj-F-e7l;wjfIX~s2|yh$mgU(r6XFWXB`}`a=`hbuCDDRg3sij41 zqQL+^p-lZpe7BGs8PPP=Dbmu3djXlhkTO|^7LZs%L4;u{tuj$n{j<@HRu2)<2U#9l zWnyN)f3OVeN7SIns{4CCsBq?+4+2PIbBpQxJ=5|6ZK8QC+X1$fwGh*P z*FT?f94Vh11Cb5ffASb96|UX#pOvPBlB(5Oy8#DE-&`(000vRtrXR{)7*`(|EZl6W zOa&qD#Q|@nxhq4sly&jkMfZV@CWWFHJv=3|Q+e6~ulL=XK`*~bUfcdc5}9+hK;9Y? zpjL#e{TE|83I%9;1&Z+m#TEW-VwRS-*VPfe4W&32#n0(WDZ=D0N^ee{sun1>7pG&& z%z#2eqsX!6!phTQsa4R=ZJn|sdg9XVwO{d&3eL=Ss!Nw!9sLW@+EUNEiuwsYQ=fQ_ zoC=0PCRmp!0AUsQk|4e)*lpf;{VBBoJki5B=b;uWro4OWX|R4w6^p;DJ!ET}a<)SO zP{HvYZoOJf1uhIj4#c)@1Su@-_j130qa9lx`g;T5rS{Q6n80=qGC)reNg}b<<@NlM zWtYqGI9?+c=kaRqX#tzUC}3SIK5rDN%<2E@VaWyx7UE@oraLUs#L01_nmP`3@)a%-ZvYbx}DWaep2y7}9y^aF5Sc z`(qbwJ1vmNlara*`D&x>^z_uSY0X@ZWP&j>N4CVw%xor?C#qN8om>+%K|GwmVt`(O zLrbe-AI0b3Bw=@Vx4ODooFs4%1i<_cJ)=0nJH)VBnF=*(Xd>-5@B;q*`}be^WfxqN z-}46Vv6oOth*#?^H6E0Nt>9OoMdq=G^CxBdIhTR0(GELeuOHdp^Yt(R z;wQO$q^lK5S^ZH+zVDUZ^Y*Bv? zVte`2n)?JY)WL+|{-lSo5yCDkEnkx_3X6Y}Q&ds?rjq%`m!$e9STF$^97;YKM)<)| z5Pr9o!@8#HMf-Zq3%{X*iK}BF43}d^UD#tS$Ajq}NW3_H?k3*!axH81Mif9+Q9FK0 z+ts~$nbEgTsq9OF{!@9nwpG`2&#Cz*JNj=u4e?B2951)e?*0}q-uTCmvnIcBh5=?* zpS+Tm+fGwZ$oUeF)(00**8ei1_vI~&B7!r*0I%f>gJCEN&Jnx6#phXBP&fhVJiW1D&5h^x*jw?tb9T%@GLS%CSQf7T-@kt$aOhAqer0SJ=h)aWWD9Xf zc#SD)l>r2NGG=mlu1hP_QjtsOH5F8pR8uXkjjS`WZ42JoJHMoQ)QPZuE=0_|yX9Hg z2Ai-PnmpD2jBj`UGJ4e#=7w3ie{b=e$%O!Gv9{Q(FQUbZlWo<0%G8uCfQI};5&1nr z5q99{C|e+JySWx>=odTb76=clGvVV zovxK0Q=Gt1^oRmnbHLC%pghscy^B0E&X>{RJ+=k~%x|Bi5~;*k^np`56& zi|hu5A5yTA9iWk$(I@wE2xZuGdG)&--W>|rsd7W)FPx&Gc`rEerff;`kNpCd-P_>+ zp|3AgMc+k+$_z~*q5P2@DsYQ3Q<6A`kOJA&=I-EY$lFimKBie~yTNjXg{yHXa0wZ9 zeYX*`Yp`vIfu&NybmnYXq$$)uGcXGuIkqFkDfE*f)(|7W3|s)kQ6m{aIH3?FJh-mz zcFaSMAOXc5CB#(&VaMA1WqI*SojING!FCw|UZfF=Wx!FhO0{O$5SombPsNEZLRl?Mnoz(k71 ze+0;P52;^osH^EB_(kJvk+r;pE->5Rv@mMk`?tGxB<1c%_gLRIH?hcY}ur#iA3U{ zHQi6$k5wx#q|XObFOeT~QKiY&Hq{*S_gT#{vAbL?7^(&T%*|t!&L57rrAE18eib$p zIN12dOnZ*X+50M%ENWG%u0-z7nLl6Ibhz2U1q&`LIDz=hUL&;+lMD6j%;Tf>!CsPkzZTura+Aj36;eoD zMcK3tZ8Cc6isx1>bpN6Wdyw=G#Tg|){ItJ6aLSbF02T7+m@e1*x^L>+)!Buboi!*=JRiWFN_awv zFl&mnsnK3DN3aO--RCA$;Zz6?uZXv2PnsaW(2L=MN1oV%kHJ^G-*<>0KicB6q=OKs`no2E})C$w(^OS`%{OdrA+^eMxur3xhP_-d!O zIOqM2D(ifoFm5@DsWn<(#PyK#TouUs8aBrHaPy0llZWr9Fv=R(oi%6n?85UzYphB* zI7FJLX3x^%J?}WlaD2?;cuLai(s|sNI3HkwWI0HWB?%UfHEn|w z56^DjJI|Ahl7~`W9YELuSUxANxma5BdDDzYuMkHcAzgxa>*iHY*LSYh0WY_?^YB~M zI-KOVM5657ZCTyB8`O7_L=?D;+vVo-_}3?F2q-rIQ0qg=TLGd<&zK=?9nqXH?=E(d$AX;~dewZw&Qr{@;+^9VmAuF0S{X z-riO#nx7H9;bHQ<@a2`wTsYXfy`XXW9ew%$a#f;xYkxZ|>_#v}*9d=*Ja7U3pMV&B z8tA~f8|Wdh9EgnftuQ@v%vop+kUW0$O6_hsCV!A0dZw!D-B>#rjTe1M2|Cjx`Jg>i zC)>q*pQUFp{Z0?_@mFhgW?t9L%ik}4|68J@*N=+g{!fYWU;JrKDvbTVCCm}hD%Fav zPOF;bEuHoA%@~FkK#*0eB0T#_pDmd*=w$r7Jf{p}Sy*zh&6K=0*xeabPP z)Q;Cuj$_)VT~J{n>8^$aSaA2Ioyp!Ou}0GI7fJ#;3Py;m?jDh0Dvo~FU%tIMqw!) zjr04>gtWvl_;}pSyz`bu3tz$a+Nx*izNyeL-1IY5@I51v#${!~pYo%za1<8K)?(X3-W!orGLGXZb(HV95LiELtj$)8p>SUn;G7X#`eEQk;O^eoJNnP@jKnK_F31 z6QMzsS3rvv?YySH#9_&uAzlW_U+Dd>`uQoh4GfUSJ0U{Gt zp}5!yg|;>uL^|OYgle*IB&q_oL~GD)KH_xVc@J0bsWV1-c@z$)5Q@4^f^>dXXf-vX zoC&IcFoSdoNrnjm?x?x~UOse@+S20df%NmM7eG09VtzF$F#lIN=u0JC1^)uGhN_3` z5vfeV5Kct|qv>;IGf{*919#XO0}*|UxVZ9NAdN)frf&(3bVWw0kq8xKFBKSxfT;y< zRtl!75;FikU>D+te#nnL#Y8ph>_W`Yg3Q7prDE7Xi$G;6moyS!FXKfsfT)c*Vjouk zok@}r3R3g8wCv79KVMZ3Vk*O9XuJZ$vI#bjC|@_({_bBXYH5Y4&!t@$(l$(OZCeIu zC;69eWKj<6zh$z9 z-__cypOgH-{gjQ(_i~+_=ldyy+MfFywAqXGc#<(3EBD?BBh;^t|R~ z;e+9WEzdUQh8Mcb@HM(|RQ<1n!c=RtZ{L<|ARr);{IlN1fNC2Wo_3%0bF177=T|D| zMCjr2OFFh$RKM7O2D_Fd(!Tsy!%e96^nVlvZYpfdFU8Ch>ISTCWd=vmDoXMwpOwca zcVS%3)_!bQQ5vka8}48`kDe7Ji=E%Q-Ap6xEV*ItGBI3SZJH$rh$>AWQ(C?bNt_xhsj>R|KzlPZ|D_aP?7)SXY9uCM=dRF9c9p>%PN9qLOw*0O9wt=dnUBK`FI$N-NJ zg+~Kf%Xqy}H}JGJfjglFN6G@>Do3x#!^!P`BAU6tL*iNA(o;`E&*_LORJXUc2h)qI zf(6}sIZXL6e!bqnWwlaSaOM~`p>@LGEHv2wF+|vs)QZ=0Vc%Z%k6q;0pu9v`F2^0| zN-RdtGIQ}?GDho1+H*5yJv{!gM|XKMAqH%n^z<$qDk>UQaF{8Fj#3snZMz-d-x6*| zCORGOR@e7po-eR2=q_t|EILF@q=D*J5w>gM+xM}8AA>Jv+*gUpvs#W&}vH(S9jn>hNsos znEzUgEib2xKXdI6Dwv&80q^S7XORhFjonA)w&*>lnE=wGBvdO<>3A_lnyi+8Mt~o1 zY(lUbIJIf-+P4A+@waiH+!@)b|`fz$`=DiNR@r01|1t40X20O?L zr_PKS!P|^0|`yVl!m03XfR4GehsUmK0{FeKmm<8R3StswgNsVA!br-Jw|-LvUG zbWb(RJTKGZwE?S|uC1nJ2kV+k_OxG$dxeA%6=Z?zjZ`vPz<^(sQWRlQaSLiH$)N&8 zkaA^0LPBKH800|VKYs!nrxtNY9IQ#}lzw+Fx!Ra5d*M5EalE)TMH(BEehjoQHP~%+ zzWQEw_-=Q;9u|m^@{Sr|kl}LEzp#IZQIU)FE?P@}{}>qD3JUVdW4DKh3vUqFaKO3v zru_GbKQlA6iGz#T;p63MN|rNSS`M33Pt(-c{9t>sUf;yGwlF|H>BC%U6JUU0#`kq% zS0Wn|9cvki7)7yO%n;VE&k{?&(dz(54vk}HWwYAicM~Nfl+f(*P2Ed=JoA0D41{8Z z?>1k8wET4S@BgG3N@AB#)}5o}GFy`v&|t1h7CK?4Y}XD8MfCY>v-`)!yn)m!d~&Jx zwKo{?E8PZ)0mY<_Kq?aca;FyAO+Ubd2_?b^G1dr0f?z>cVK&)R4nsX7UofDzPEBvK z!EJjDu#<}4`7tkspZA02pPbeY^oadni}g&4vQcO28wAl_lvofP3I82?^7_U!vwE!d zY@nx7Btfwls>F^90 z=OFkM{%AODGRv~+K9$^!OkxAwky{UB6HTxq)Qj67NNulkth~cyw=e#)L z=u&bZstclxzlJ)_fESdv7SI@D*Ye1vJ4KgU&^ESL9n>@?%Yw6dWM((1ko%5D%O z9K?jCB(g|P8_eC+wT{n)6Ddp*kS5Z1=s3r0qlGpI&@~_}?`QxUx7jVg&HH%#cXvq5 zD8&TdlulQ_55;U|UOTZ|7zH9G`i_BLpS`w|IRxGyL_%n1z#A~i z;mQUXO3I9pW`Itxk%hM1%gxc?PP$5WI1-se$Kb7QZOw1Q)0|-u3lznZ zC^Y16UF)Ui(C$YYaDtoI+1$EWWW0>Fy$F^zc2{87{xE6lo+fw5k9VP2;4fAFhcYlL zec#~Djom@K9U~@@bR)h12Qz{_{wun;th@b@#UHo=t5~k7s5k(rbnPH z>gh^?jX!gHXVw|KKr`S_>or-Q;vFl}o+R`0RG3_>t+TV7B1F)_knS{T{dhq`NUg)m z(+U8F#P@O4;g?QBvEDC}tl95UxI-m4N_vK%>sCP{Z;R9y6}q$JBBYnw63H?CuMbOy zL|I$5xZbT8y;+#p=X1`vfIE{)`UFNivg`eM89?Rpm-_8`Ww3;_V*z)#DLMuPjVVUE zAfB3k8AMmVkFP##k9}j-IvD=fp)@Rj=ec5K>@~Q8tk`nPjKd*gZ&%U;$>Z^i!~`~+ zp<$`e9C7q4tTQsD@sRUE7f8fz1_Yw zxA^(Ke+|M{4eI|kdFTk_ZkNdBa(_NQ6V`NOX|;p(DH9p|DAdM}|L~1;$p}?g6?Yw? zJYomN=%j#Y@m(KVh+mu|1WRycxl43r<|)`X@%NY`O`ullk}Z>U(lNM$5}vL_1$0&AbK4Nx|rZi7$` zJBUBb0;dXBT0K9#_LG+r=b8s=TNxAI+t~c(pu48)7XN=M8qKPYHLd^4D`)vH@UltO z0>~@J%ypW{(3#oVYRY*DPh!{Qf?^N@h2`)EIKV0g0?nu*e~FquDnY z7+}B;tXQ*V7Hgyqkw1FkMjbIyME3u+OX~G@vUvDcwwpwLM5jG!!W1G1!U??)Y#y~J zse}@XTy@@V!R+gvM^ttszJd>5bsl5ebvry=UHzT<)P$RjhwF1RMsCQ&lv!=GO5CbL zms^ZEP`b~e6Sf+IFOZ0qN?HS|sd%a^qk!RWy7c(S^R{C2`FZ}W*5@?C`#vu9+cJ}t zz4bVD-R)WUuWT&w4GJR#EP89@Io6d%6olz7@GAry7Zu=&AV)ejo7>^w8 z&)aHNi`}ZG9(tb`XwZuIo1<+)vV3G zUFyn31ISpVW3oMTBfqzM-@bDW_lH*C0M!0wQb{i7@S;o zr4<&=--U@@o~IHzFdTInG@2#s*dQ<38ap~PKKGZEYrp5g{hk-nUr|H4 zeupNx`%gR{K+>iiXKs4>(z#(kl@wkc66kMfxr)rbdTA$i_+=~3+4%6OK9lgekb^&k zrSc6H3!z0tpxE$RjuX`dzli<(-m7fZ-DaoydfOVz`o2$IoL?%8zK*=kL+ zCdQ|mo0oPI7QWfNgX@3>ZQfjQ9Z3@4I%@wuqHJtT1`O={jm_EFC9r^Le}7lJVyN%9 zo&(6+$v)p03^r4 znH@4@Nc*YTj$8OAE779-CcM~+r%OS=Tu{^98zen%#?;KH&YLcdyF^9?J*`laW47MV z^eoALrozcK%S*}S$-78-!*hYa<#?+DBbDRs?W_9ai2peB$;x%J(ZEcf#yZsMO#u%og$;pn@HO`9M+`)d&+my?)-Zn+O9QWhH z=CdzSfcHht@>vLkP|DHo;Vfd>-FUvAH;45a8p)ihm9xp2B$0D06-RsbhAPTdj5D`= z;!-k+)~;T)V+>C*WCtg>0l|<>v zL#K{;Ihi5}0+MEo83joL6cgpeCiAB)NPYwpiXzELWs};BCE|v}6%lX4GUp0>tlPDR z33)tNh+zp&2oMxNRMbEiVnDmsRmZYH3mqNFMj%uI-t7&(AE#xxm+yDxmCAYxV)mD@bTUkkv0&9DYnYGK&Y=j4&ZpAsr{?-;!s|>9JLh=aW+=L^Y+Rbf^LQIaCP5lD~5h9J?n_19n}n z#Z#8M*@*ID7)OE*xrOHJl4>Ymu8GE`H@8)@^&>FvDAipR5#%$fDZI zdjmx$$YEfI;|muKlgBj@o3NOr>MBDT7%CCWvXWXj+?!N|oS_4u+72Dtuwe6Hzbx-O zjTZ7+T3U#VsY@$ebP@_JJtPuHgIPhUSyBcgKwQYK5%Qr0DLUax3RIYwhuR?02+|!v zNORme7%p~%Ao;0*h$!8+ILz^mo>`haA62)r=yGefD$aCvqu-M&L)@J zWu)leQW4vh_i=4-#Q5!e2n6a3>0-q)cc7oMWL6R70NTBR5+gLf{1!y0Pdc$1G~J>> zGixBB`sxZeT0S~5?b)9B4JPVsQx8U-HiCx(VuE?cm@m`=YlImeRRHVDFTau&VC9NA z$ymEt6BD}~?18E$JEwOveHcYeqW6e*ORKJW^F3JQ$5nehI(*cF+8XTS&ax-#$ z7lUfN81IHBjlZv|%g)NbddjcAd&*y@-15F$f9Ar%5RMf^p?8OEPd(jYN`ChCUBg85 zIG*;i`PtuIJ2QRFgmWH`GOV|G+%NZd?>=2>1;X8Zi*^Jm?rCf7{i*DL*~s2v|7^(n z-YZxr8Dr?c-+9gZI2p&bv!9lDRydCK)+A@Tb~i;ZyL^b5Tf=br8Y9>HxV(<#LK(qc zuF>&2A4erSSYpFNSL86{u=*X!(T{D^$utS$(n&Wlf8W_&4ML9@SN-wW#MaWXy}ruf z^mO6vpZ5JRQeKU}y0M~p9T)1RVHM2K>eP?anmld3ZZ4S3g3$0!g1n6o1d1{0?b_`2 zs&8j;;`jGU$;=c8M%;*B+ec){!7r)1e^*VSSx-#7Md9>x6hTedJ7$s>UG(&+g>yr{ z?K&HIyn*?G*L?RE05-dgmz$-ku(SpyJ#YKxrxBCfAcO*L1julq99TTlvL-q{ z&XZCzCHvF&pTb2GS!S$hU$0kJVffxR+t0@U`+z9i4cu>=_eSTrMZAC_Pl3q`&G6J@&7k~J z1LKDNh@HW~*$T<9r&dxvGiv-Wi-iUNa~v7LuU^;=uH^SM%_=DZEihZFvr^)TJfXR} zGs%`fSHp3QZMbNYRH6?>aa0L|j@uAc?R-S`h>M@|$VzOBzlV4~sbY(EQ#PJnDYGAb17%UMW~ z$NM|U83<2HmQ+sVAb=cjP>}B?z7FB*-;NCM`TV*A9%w7^RZ0<`f>$w;1&%|ZvO#}( z3CYw0Nr<^hZB9vZOPkizy{<1`a#(w9v35fM^dy)sr5P9qkk{HhSWazCU-n+TCuDpZ zyN@hrl8_Dsl@=)$&~FN#N==w#ezUo$2jtkD{LPIvK z{C#Hb>vi>@L6G1m6(wz~t+`!p=lQC2r$+vk$w}iLUZ8ZUIpj2fwX;9JeU8lJ@wr{$ z$o9^>-)o@&^Mba33AQRKN*cTGUVqJwIJ0n%E*}PL@ud>MUEtNB?Y&(as*|eL1x_}q z(Z3#4ZdW?Kw7^|Y%SwKK>}v6SECLtlQefaHz{?04V5T3ySW^9?ALIWnJy`$C%#2Yz zx5H6G&CB4r&dAAGeeCW$*WrrIVXjFmq_o^a`&snIq6nI>TOnUCzkKgj45cibi0~GI z*MAU-1er3JpC5q)m10(uq0~Y-v+&dtcfCW`Yx~}J#(vnA*yLO|`!@P|qsz(nxzqRf z>n6&qCw`CI1Aai!ESKw(^o1{Hg9cqbxO#VCuReCfA^MUe?YGX` zCw9-JONRjlQLsG@Idq_OaKAnLj|kpnmpTluuZz_h@5}QQA!9TDd%NuSzGuCVJn_sv zeyGYIxS)tju0W_xP*app`j_DrUEjlw?RP&A+wHfVEIpsO`_DF`8GFj1XYEiEi9m2- zL+;o=$kn~ieT<>|I706?Z`%T6a=vd3`*3o8SpGO(NP#UNq2%kZpZ>e zOw2*#SE9@V^xRX9G!Q@{_5!nrLO#zcZ|pOkhorpYGuC5|_Q$VDZrI+s|EyJx6;M!* z5tU2KXobS!VGSjBAaZ{}2uM#zY9?xg8vT?;vt4(o|MjcsQ><^{*!SMbe)BJ&TKh}O z$!0OeB5*IWBF1ZCBKAB`j36_-P+fQQ*r^jZ$QDwdi72Iy{x?_K&(&fFTLhHXh9x9~`O4k}_y+`(%$l zX0*;u`d_zk_0(4|^}80mzmL51-@1k3C?(hGr6YT3XPj+D;Jrt`>7hFmpxeNWh<<>} z{*e$=QK{9h*VdSCa{KadaWN^qdmgsbF+;zPfe!D>d$3XqWBVhj(X9Cl91FJp6JAr>n3;)9n3cZijZo55%LNj?j zEYA1nvf}&1<*mRdGgYNR6`5#xX{i@CKC|7_A9p8-0BFY(cp!%@Qr67P$RgZBb_CHr z@W3m)1Jf|h6s=hfSbP=ys%y)bT{4x7Oq`g&^zgmjlB^nrA)1Q9073nuZ0efijrA9t zuuA%RjfF*HXH@;*)VnU2qIvxk9xBKI4re_;-!Oa+;>Qz*Ms7J;L#hpNreb}_(2$5m zf`|g}Uyw8=41)_{*j8$s>{xc7Rc`8FfD?!dKZ4ZsWzI~45{0A=fCoVVGqFrJ^`qZV znn-gx)qybB9R$T&sV;NCky3PSf>c9&fxZ((I7;DH4z2_{sN2%D`Rhh_O z?PuXZ3JJn7Mo>-Y=f^BHoTysG79NfT>>uA zkL;Pj($%Z#7ENxc^&gj^FMY&fC1$4QY+HTJ6h1ioYAmCk99h3eR_{L?o0e8DHoCOL zNTLo5W6@=4viaRRo4W(V6?b0V6ua8mLFr)ZYa^#5ElOP{9Q^GBvW`9TK5bt5mTAjkU-c<8!wIWRBn;K>X1-*b;+ z!K^dD4er8c6BvKVBTKUKVLhA%v#!!Z`~S@+r^vv0fLNI2Z>lci_v7D*ufplIM}abk z{BxO%3AN*ahrx8{M!xCEGJwq;>og=IGoM4BL;ELKLS&?l2Z~usUor+4nka8=3Z}sCGx%K1+Oq((Ra2h%0s0v@-JGrW9Qe@&*MkcFSYy^OYbA-BIfXEN(Rb;S>&&C$4*Brx5&r&vijUY}cHxMY0QK5p0!_e7G z<52!dZ0OFGx69xbZt!M(iNe5Ku|YFGlCls)rMsqO6R zmn-rQLs*f?GtnNq7H63#@ADn$J~If}jHuE-W~K2tx}%!S6SJkGQq?xL6%e^{fW)mn zGfakkH&$R+%}fUgs_A9?qO;H?Gfgr>$J;C-!D6F;+H#Y&rn;Wpb1GCDb5)`I^c26= zC2N}JWvYRPx2~y&12?2$_b~eN&nnl7CPbJ(pOq8%$*)m!W+clUDBSA5!ZX&kX&(YHxD_~x~n z8!P5u>HDn;JNwWH+2AxCI=sDVwRpJ!*HF!88tv$!D8LjgnS;Ak?=p54Fz@O53)f(L zfPdczz7Sy>oiizhwHWl<=9BkJ1c}}rKPh1Vax&_}Z&#^&p&(0dsbP?-feok*zHUB@ zEU1f1+zs^E_t}B#zlR1BKV#yO)vB}IPlt9k6d8H%FIE?h<+>iu{{P~EQPg2{;D7qt z|I#n3Qgy6x7E%3={Y<~RI-b7V+0Gw(jDBI4ut&&fQ^*h&B>zGC@h_79?O*pJY8jHn z4;2rJDt`H*f|N|wQqf>>e?nv>ddbc@p+D>joAE9egRVC-o~CZ5X2;LdIk}HuNT`}z z3UQ5Yu1C{6+im}e;OKl9+>ZnAjL{7w0EK$Ge*dA}u$af+7yff^8>WBTNq^fdcO#Fu z;p>(0w4JUFB4bML`y6|uxV!aa_caXP_h5E+pg`W78m*ii2Yqvf?m&!;IC$12fbr3B!twZLBD94KEHA zueXIdhS@ENKY4Cut_YV8O)bTcZ+YJOJ7tjDdoineJl~xbnQlnxIyxS=Ex%30k4vg< zo$pzP_Z<)>TxyYH;N48S&&`U9$@D%4Cftx-Cg%R$osGvaJ?^#>Ofig#rV?2V5efWE zo_XJCcE=aP;d3BzyV}?U?5t#SyI4|OtfJiz)>9SRrk9(Za|*{ELL}}#lm9h9?|M3; zZnoKG*vVzd&P`Hc)lDJeAl@%1FM5<`GiVadzOf)XBaHL1DMYp&E7`{YRCfRs%CS{T% z=UZI2&ZUZii%q%HTH+0`Ly4_WM1H~taS%Fx2YorG#wF*;UL^~V`S(g;Bv>5Z`$@PoLS*6OSkkFHs z-CS5b^Vc6?lo3hRUU+ctq8X{9iJ}!#LD5mDMX=C+0qq+Wwq{HdYM!dSIAXx?dDf9g z%w)8XVbhk@UnYfVZ4a%+&V(#qtp9V)DG@NMsv^&=o7a;&BO`5%cThAm#P@yr=)RF9 zOHPdnMhHbHtVp6B7GHIWe40ptI#C{42L?YuNIOZUq!237<97<=e=URhOAYgWjW#z; zUwMKd@{Iqk`dn|0xA4!?uXSD#X!|3?+W}4{u0KPY^LyN*XJ&crho*KbL_#Tqx`uAI z_o*ZMBzAs`W@S3{>uaZpT2s(xss*OK5f_~+!%AFjCBGq!p`)zgeKx-nx5wk1Gp#>G zHTsgO&U{tetHsvnVYLQpln$tSCgcx#n~F0=c|`gq?Io8a!!z40Dw0Ir+!6!XRH-I_ zK325m(8;N7x1))!icI2>%fy^ap=x<>Ow|gqYAa=`WV;E}`9ix$b(EzOYlL-JafarI zvPvJtCjO0iW?d~wh#{sQvjGR42_fh@iiLvmBEd?4fhMw?G*du(Y5Bh@w8%@^n84o5 zPz5-9BUjhgij-Ko?=#IG2JO6=w$dgt6T|5NR5D4UF4>lU48#@;sObcfBAn5|1-0o6 zmSGleot*BovWaRDrISfQ3_^~Yc>@rP5}R-w|%WOgxHeJnj~uJ zoJ+{i!9)@Zfh+7dGs}(&O3fT-aTaU!HL?3VeMoY-f#7@9KBYb?_~xr=7FJBwnZ*ZN+k+2$`(#u#7cs&%F~*ijKv zi?Zr>!5}lTaCcAq>iK@r?9&zB^0i@*X~6c~2fEELOTf+5)_3&$UdDH?2rtDRsni`) z)^=m+Bk*NTI@P+qqs_?KcB8AX*$xB3dV6Y+n9t=Zck00=(owo7Ve=LR2|3_6e=I!% z<#5Q+TOK6LEJOb7!O<*q2i{V)GARODz&+Y9ZA_rUcCF3hU{h#Nl_(P_bO#(_I6XK3 zuX(=mfgo?7HK1s8sWGv!v8e_I>6L>&_6lA-3`x*ouXJp&vYGl_ozxHN`NfdyT72#7 z?7Vd6#YKV&Dz*$pO+tX^Nm@AWOyf~cfj=mic)2pq^QoY}o^%Ss(rmrUO+SCXh`77E zvtUJ7E<+9&f`I{~{GOoiLy%3UKkQNxlo0!XGJ1TQD|c5`d| z{&G`SeVkFed;clYQr>*OaN~(xb|ysM98sX_>d_B{_fgcu^XYD`0w82y5n7BkB+B$~ z&EcCO0m|XOkui*>ky0l=zKpK0WEM9i`dFy~{ zD<@v>H|~3az>fDM5bE76SAUE*va-`PHx?%q^t&HpWw#_$X6m>HLJj@l3aIhhe2e$b zgGBlQdJGo2UMISp0XnUe{=Gdt#&Nt^QXrJq&7PF`c@1l-ZxAc+8ZoHULUf1$Mh3Mj zr@Vtiufw$hIZsaF>I-qP9duIDEL>>_AvvDgmnOWvfBN?`GBShmY3M5)3B{*iHO3rx zsrNL#{PCzknl@BQO4aumHfrox^FfDtSUw)a3#9?r-wghciH#HRdWiSik5#b$4T=&) zM>6s+iX{JxBuyrYhLB|diAA{W0sOhOpBvKhdiHCWhuvz4H2gH0qBg9! z1Vs0cr51n%xG5#Q@Ui)5vW^27DaG~WUr~RnYtPm?J;zv4M3~h5*470=B(xTHZ87>i zkz&WBB(-3a&6*qbStbav^#?kNI#crm#S>z)h2>2V;1i^l6=3I{ zcP5@kBO$A)tN*x5iT&!NmIzgA1|Y7JoFu1D2y$}K z9Bj>C-iIkKH3N<1rA^!93J+0?sz>Chqs$IK6V);$fRF-KxE~=aUdo*G+G$y*Xy%VS zCxh-;x_rsXi|=GjG#u%Q+lfRGIt4``v72S<%;;~mB_j;e&x~n+Ve%ofXbnA<5i_1a zNBuH}5_d|}mLpn*ueO(K=$Y)5R;)Bs5?WTr^No}&M6nmRiXKwT)ZeFDe|}{Bv&`^a zO>M4!pCy0z(lKuEYyBF!|B_KH58*;6+&*w+{b&V0&Pdpi@ZPjS0f-IwG`6^!jKioa zH~I@!sZ1K@nS;HVj-=q)d_qoMJ}hYGl_Z}yL17m<$_H@dt|Pb(}6`aU_8 z`##N<^#(8k6f>kL3%AOuJG0%+-=6}&v5XP@*W%))rg%6Ufk!|_UjM>$Yjb^<1CcD# zc=?q5#gCG85?taDg>4!9T&|g!4L7}sa?E*aZ1D3m*yTgy;7m-`>9Se4j(EAGDU?uKErO`NF#GVj@|(8^C2UMvbE{_e&xU$6 zug``3efzlx$0{Mj-m}R4+VxK-0cWgsRu{d&FM8P-W3lowD1a~I-++^jn&~ATJE7%~ zj{V;ym_T`uT#%Q%Vuj))o{M0Y!}haIH~2P`5RH@>cs3#wXfy~mQ?~4V4NbKU)#P>B zAH@}+)k5i4gcuPrV#b6D?Ae9FC<8R3U(+0n7k-$t;HAlNKvLhj{{aaw#=x&9hv~6zxPK_Ut zHliacO<<5CXYf@u1*;d77W1*#d{0Q7HpuXePC;Oj^kz_4T98SV4IBA~rG|Rx)RC<= zUIuQ3eS1x@$UV7NwAkKOEww05p(WFiY+aIKJ#IXFqOp5QU}nz-Q}$0~LrKivpJ)-1 z4{a*cM5562rs5@VzmYP0lR3;9Q&cNy>A*DB0?ZVnV0q;&du2YoW@? zf~!sfmBqthC1dp-_o=Bz)Hf(Cs8r&$aV1X8(wXPG|Iw?3Ee-~DwMtJY4>yIMz>RIcifkY5e|ftaU!A3{+AJZc!*y^ z*QA(e&5kym6Z=6@A;{9M;F)OCm>N^6NXg(WRelT9T>zuWv@v8>{}kB6HE}H_CdS6b z=5d|+{-FE)$?rTUMa&B~G$1qThVb#`)Q^qC`&taaWFgz@<=pmp0P&x5wC0r(i5tRy z##;Y|`?>rtqQL7eBYSD2{rI-F%eC_XU<_x3PQV06Op8~bL6Aj!rHELTu$*bIR8@T~ zRC>1{5Gzs*iA;#c_5^_fSOvqO0TTAnkjC|k20s?s@7C|PvibH-z-Hmo)bbfi+2_xD zogC+#8{nZhTfYSsm8%J%iXxxmdZNE9t24qtodr_500LQU`b09j8+Q;Ft1qj-m<*Bk zWDQo&%|`Xq)D%&nN|oPCfRV{HT}^CCyvj=AH&{sRWF<{=CTrs5r=L**KbcO}pVX0F zPIgnrV`A0R7pRjE4$inE3s9qbHiZpvzw{6ZDb}D6tDWD&KoJ<=3^M<4Bg2n)*>meA z@x7^i=V0P-vO3SbDUvEuD+3Z@f%Fn6^RzL=E)Yhr zF(OpTRQ7&nQ47I#3Kh=2-t^}>J3Dte+#K*VE~cJ!dmNw!=EX%L#pLjG{khM_U0#}l z=|xSR-ULWl(I`nmjBSp9&;k`TpN=7zq*x&^jC1zA~rB3w_PP%YRMdu=A#`;b2tLxczJhioi??B4o1f5p<# zt*1A?9eXym2N^b^7q64=#`KjVDQ@)mc$*^H_^#8;bz<*gLclbSb~cK6l$(QIegK%1 z+_R=Z=ef}{Rz?%Q0!O^sGyG}GzNWohyG(VrKT!CGNjWlgNZ8C)(XJr*x8d*gWh%d$ zakFwV1m1@qlA}IHojp{p;2;g4V!Co_3Fhqcax`0SWR020`#o&E5_Y_$25}165)c#S z@**arj}-^#mXTX3Ae{6O{!WRE($i-jD`3)NKy^x#Y(c-l;Ftpy2ge(UaernjpC{1b zIpHSS(ZA#Eaw=T1=DS>P_v*gZwZ2-O15Y?8HXGw2)|}`{s7Ds80}h1RCR}pVVE1>% zN-DK&R)pVtXo^5^LcB|7RixPszLW^MMy(2zQ2UN-OkAuYwv$skbArwZ7-oHGJShMA z44ovpWkUY=Gp?INo^b{oerNp_T%c4Y$P$PFD1(SsU`B#Q(kIa_RYlBPQ0K}VrAJO# zkEudwmqIR~2~jbgT0SmE(qbi)fbC1ZJ1eekT*F8O*VL1`n%^~P6?XZ$)U7X-&MkB0 zgqbL&sDC0NMe4T)=qBICc4&)X!g*Sq&Mni*mRWW-VrIvMVQhk+$dE)18%l-Ltyq*k zj(ZL;(x(yI&05TE*#mvfmdt-d$6!f+LLO^`;7kBTvd~FG_~rfSO@tWP-hTP{(25xM zL4{+Uxv>o)k~BYLH~iywwxjI`s6aHP*s4kuiH6F81MZ5a(Z`j1d*`L*+4=QYWZR{y zABEx$P!m`}Ok9)Lf|Lf-u?69D@O5OLI&$g5D=`9 zJ&!uWCiy0KYFpmYPRVP8uJRjdn+JVCnYEr?K~hBsP+{1C2u1jP@I?sDw38?xiBL*B z`nrAvrYWA50UaBWPrSe3B{XHC5(Ea0oDn|BDqtg4tJDqGG!CR;%>hgc)8l*glNwxC zVhw*;*Zy@BrliR{*hUybi=-Lx(Wt9mg&M-4@|&Wf6hOo0|iu@~^%Av~Fg5s&^ z`C^Ug(ku3w!FyGsYAGMSuW%Haf1??jDi|!0zo7BjEk4 zzM;0iYb^yJmqa#lO=#1BR3D(l!o|X(d>^GpZ3zpMJ}0Gqn_ait;IKbkon)L;{Cm}Te#3j@Z~5y$~Wnq(WIZ1t{(f&{&^&bPw?bKk)s zW7h>OblM0)MCk%_b+Uw??Ma+oo44N1ww)tCjpkRS;2)ZwU=WEve4(xw#ona*2o&Ve z=yxETtsXOj?xK-EhjFPWaF|+L5MvlXwCi?>S71`pCK8+3v}eeS2~F`}Sg@dMTV`|7 z%^cUUuRrx_IfE^MFpt$a03MHq? zu2i#vh*(&*zS2FTuPG|BC-3@MV%*z9e*E?P#KYe2W3!=@NxNr{d)6$Gz61|1-;!>MfQ#jh-(SEE1|NE-vRY`CA6LnEBe(3Mgx5P^@o|#{BFzHx(nT3Oww24$o zqg4l6RC7~Zj+l?L<=7H0jJ&my)ZXBOP%;)Cx5tBgbm%Hmjm`G-;9P_I{?W&?;ZHI2 z3|_|2g%vQIV`7ePwKV51M505ki!FE6{C?n+avNo*&qJSKuOzoyDy;a(QUy4@1+5xp z7c+&F>1snHdQyRp*>dLR#Q{qmB#dM}BJD&u*Hb3k>6rxG&YAl#@m~T3@sO8Sq^6k^ zRhx544+S0vwumSw8XGJ2m<6e9h)(m}zs}5`#*EQ#8IYnQ6xE{%vSnLo;eQD=#iggn zu-KeY;dR_8HorgHx7rsN`-n}JgepoLDhef%r-UEKsXXGk*zrbU_bO}0%G+xGp|tNg zXd#AxL(k(dEK@wEX^z8yT)U{m)H2yd?dsF;3Bs@j-xRXh8*{c61IfRWyn>DJRzLREto+$wXyLo01csEBA@-VWA)<>Y-m0`hlqf= zdCgFmUqHIv_LS~sc9pFEh9E;=Y-}u!(tVhnYv7v>Rf&1qUu@o3P=)f5k84=@|(6_g)E`A94m@m+fk53nfZG%Yh+GnD?D4S-r zTG>?$ll3>AuY9Y}kVVJ{AENp4$O5l>K0~Ok>E=@-yojI64eB#r+zP#{TO-B>vOMg0 zyms}t?PkicXvlYZ{FxO34qY_qik#amy&wNGPQp<#b_@E?It=!|p_CzN9x5vPSbone z&k)d`dwPJ8q-WdMsS>(^ze4gvjoAifjK5Ad)Or^1eTy^<|@EiBK%^2iyNS6aOdN3o#M+xtUY_gckTnmPqv@Gb$R)LH)6hRwzBCeNnp~Z zL|dKr(x=Tbf>s(pbmj8v2Ver`4;{6(t{3*o#I&FqQsAUhQF}$j%;ePiylcs2%F1p6 z_{~r&L6tbgS|v51p{Ca4{200K{pJTr7Zj9B@_7ANZ|y z+`p+oXItAIm`^$}(2$OwhNBT6;CpgzK9Q9y0V6+zO)C7F&gM*5e)>qzZcwQT~(1YvhJa8>MDN*GcgZ~xcu z&i?ouwoI0WwjW+!&3DZc=GlGmHIO$$E(^G$5dh z+XG#!wl2~!u-L>gWNFp!Qb}ZH%+F=Lb$;okFZ-O4AcpT!BE09a;F61O!jO6oukKU7 zgw|ICMj)qTBxt(vSPcVkxjT%(Uf~iAS2cEz8!D+>RAg>qME$eIx`|yplfm}HvWOaO z#G!R5Bcr_0wY{pd)8~GD14}k%dU?7)u|nU^m?u=24#@~PACQw=1hbL;JbH`6c;bG1 z`VQ5S1x|)yP6$;5h%oW@2F9E$HQx{1a;Zg8s+VYMwXrfXo_F$fS5;KB+dt;=tiSBW zkL}&KFW+S6+lyv1Oc0dx0feg+WN2wwUGXwAGX~uKx7-uZO!mma^>RJ$77YiZeT1BBlD_=4zkKN`@aDb1NSa_Lspn~#B!2Xx8>Yia@mLE8?g97yAsBQZKk5#MJP7py)2TM~kYbMAco zg6SECpuLdbe2`1tsgflnGEm$JZ%blPl1BAgA3h)nBee$^g!zv$L*!WpU>X^b6?)kB zRvH1eVE_)E-c`l<#C@-4^DEZmIiI^w(Nm&F#?VnMo<=QquCA-t3Fx8lJ~%-k&C?__ zglT53$t8YgSLc8w#g4k{fRKRD+^}&NV;DsUC1*m?f86_lvI0Sm9Yx*tqi}eAqrTP= zO+qRVwDEpX_|*2ao3VNaa~&J243nX!KcHYM|KC>QiJ7wIpZdhuZh!)=;@5Zdu z8MG^1ZQ88YU&H|PcSzbolgcyG3BBU?=NlhTn8NF(W_O(0WkQ=;rPV9uj>1Q*ojluR zea75;>-bo|0m^4~sdv%gWfjtxCRbGTpXYFLiN4w`M1iiLV!SVHnLUuV(mDOhb{&yBiExqF-9x%Bv*VSw;v0MNu~BzCI+bPObJArkh~DAX=8hg z^4V=lZr`E?sW9bV$IjytK$c(I%-CInjlHvi!m?4M%4I56+wWj*~+7 zOWDP?`Fe9jo6amzqk8pry^B&hWoXwCQ%oEp!IS|L;qdkeV=!)`-6tw;aJt@cozK41 zWJ>3}hVc(!k4LB=TD)5x)d&_1D1ax6ScV*@#H7HerGCxXx+ z7Z;c@{(%@0^jfoW3LCUFT?DR*)d>>n#CT9|K6O7G(=VZ+felOp{$f$gD3Czd%R_@K z9K`DOyj;N$7eIu2uIu{zi)@pUq? z@mP;Ro6Yjd1S-g%{ezILdTITR?@SemUx()s_eFex7$?1+np#&~0l6j7#nZ{aC-eya z4Rb#~KRdhg+v9~B`mqQNR^pgIpAst;r@>uC)?G(V;*7B^gLuPjkfac`ngXxKV`QCX zy_sdB*5pmV^4rNcgCs0xa1U18pmD8+;4iI=Op?31Hl02?>Tp81SwmD!+~Qx`NR3}o zQw2t4K^vT2GpLs4-xGULV~raV4)%?2^S?uLX2gA*q}*DN}AbAsDOa2Kl#E>53zZf zMU*`FbWjR0V|>yD-0V-7^|QVSVX^dp)Zz+Kj~!KK(66t&Ghab@gZuA5+=kBa_pbj6 z#Qn`71>3Fu%^~%21=Cj+)P6qL9bMm>lFn^r!jXD5U_JogLgb|3&H@?^;x*T%i? z`E#e0-s9epsc&^O7^u;0^q4@!DgJ(ak80l_t>pKM$@h08CE@~uK$!TWHbN}wPh!3C z9Dbi0M)7Jr%a4*@WtC?>Z|J_8X3X|wyq&xVfS26;nH<|$6Z_;cs>x>?E&-_%)$i** zwgU}G{t0H594b|?&D5Y+u!?<+lhiTV88DbK_BJIp5M_=m3UH%G7bk`~%3 zL(Q?@M{50l$|l(6y1R`(%Q=b5XLXzlZ$tXLUtUk>c6qZYaq0JpNcQ8R?H;Ta1+-R- zUVM+da-^XM94~}^c`6#i8TZpt;^R23DF8$W@y^$v$CRC=I;mq=W|^2M5)$Kkiuz0A ztgQ1mld_tTV^L#?F_)N7$!8bCjfkT|fBAYalZi*ABWHBC<@SCP4&mj-fdRn7;}9Fy z@|42@3 znw{kG5#emCx34&$jn!=Wuwu6(8oZONd%iYqR79Taw@m+x&zf^lCHvMNHaL|2J%f0Y zw*i%Ae6>YyvoO?jCM7I>XF9-W0hlx7UKo(^aZk=?R9uJCM+WZ%Wa$ci?Ylv^cGcP} zWUe@7)LQR0&-1^IE@>}yB@xHDu}Ik+E=G==s=J8b1c!fZ@np~Zt(iinisOYuzcS^9 zypL$fk3JFK>@_?%2qVm|_Qk@?<`l7e@d2i%wwuUi{f+x)X@ z4mwXC^J^R-?3qK=m?-;%JNeRFw)Q4IS(5fyqKjHEss$Gu!IQ2h7ExsIy(vVty7!*` zoFzd@zox-aR@x9Tf9YHIvj#`57N%xgMg#VS|t{^x-Hx}|HoTSpnK(%eZ=Xg3pP zgihDup*iZV)=)pwCT<^0Msw%tACH)XK4fI%rDEn

    G?JEl*^fGGYM4wYsoEUQ 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 +#include + +using namespace SIM; + +FileConfig::FileConfig(QWidget *parent, SIM::PropertyHubPtr data) + : QWidget(parent) +{ + setupUi(this); + edtPath->setDirMode(true); + edtPath->setText(user_file(data->value("IncomingPath").toString())); + switch (data->value("AcceptMode").toUInt()) + { + case 0: + btnDialog->setChecked(true); + break; + case 1: + btnAccept->setChecked(true); + chkOverwrite->setEnabled(true); + break; + case 2: + btnDecline->setChecked(true); + edtDecline->setEnabled(true); + break; + } + chkOverwrite->setChecked(data->value("OverwriteFiles").toBool()); + edtDecline->setPlainText(data->value("DeclineMessage").toString()); +} + +void FileConfig::apply(SIM::PropertyHubPtr data) +{ + QString def = edtPath->text().isEmpty() ? "Incoming Files" : edtPath->text(); + data->setValue("IncomingPath", def); + edtPath->setText(user_file(data->value("IncomingPath").toString())); + data->setValue("AcceptMode", 0); + if (btnAccept->isChecked()) + { + data->setValue("AcceptMode", 1); + data->setValue("OverwriteFiles", chkOverwrite->isChecked()); + } + if (btnDecline->isChecked()) + { + data->setValue("AcceptMode", 2); + data->setValue("DeclineMessage", edtDecline->toPlainText()); + } +} + +// vim: set expandtab: + diff --git a/plugins/_core/filecfg.h b/plugins/_core/filecfg.h new file mode 100644 index 0000000..4666fe9 --- /dev/null +++ b/plugins/_core/filecfg.h @@ -0,0 +1,36 @@ +/*************************************************************************** + filecfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FILECFG_H +#define _FILECFG_H + +#include "propertyhub.h" +#include "ui_filecfgbase.h" + +class QCheckBox; + +class FileConfig : public QWidget, public Ui::FileConfigBase +{ + Q_OBJECT +public: + FileConfig(QWidget *parent, SIM::PropertyHubPtr data); +public slots: + void apply(SIM::PropertyHubPtr); +}; + +#endif + diff --git a/plugins/_core/filecfgbase.ui b/plugins/_core/filecfgbase.ui new file mode 100644 index 0000000..7e44c98 --- /dev/null +++ b/plugins/_core/filecfgbase.ui @@ -0,0 +1,140 @@ + + + FileConfigBase + + + + 0 + 0 + 553 + 363 + + + + Form1 + + + + + + Path for incoming files: + + + false + + + + + + + + + + Accept mode + + + + + + Show response + + + + + + + Auto accept + + + + + + + false + + + Overwrite files + + + 100 + + + + + + + Auto decline + + + 2 + + + + + + + false + + + + + + + + + + Qt::Vertical + + + + 20 + 50 + + + + + + + + + EditFile + QWidget +

    simgui/editfile.h
    + + + + + + btnAccept + toggled(bool) + chkOverwrite + setEnabled(bool) + + + 131 + 92 + + + 316 + 89 + + + + + btnDecline + toggled(bool) + edtDecline + setEnabled(bool) + + + 85 + 119 + + + 86 + 167 + + + + + diff --git a/plugins/_core/filetransfer.cpp b/plugins/_core/filetransfer.cpp new file mode 100644 index 0000000..f6fcbe6 --- /dev/null +++ b/plugins/_core/filetransfer.cpp @@ -0,0 +1,554 @@ +/*************************************************************************** + filetransfer.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "simgui/ballonmsg.h" +#include "icons.h" +#include "unquot.h" +#include "contacts/contact.h" + +#include "filetransfer.h" +#include "core.h" + +using namespace SIM; + +const unsigned MAX_AVERAGE = 40; +const unsigned SHOW_AVERAGE = 5; + +class FileTransferDlgNotify : public FileTransferNotify +{ +public: + FileTransferDlgNotify(FileTransferDlg *dlg); + ~FileTransferDlgNotify(); + void skip(); + void replace(); + void resume(); +protected: + void process(); + void transfer(bool); + void createFile(const QString &name, unsigned size, bool bCanResume); + QString m_name; + QString m_fn; + unsigned m_size; + FileTransferDlg *m_dlg; +}; + +FileTransferDlgNotify::FileTransferDlgNotify(FileTransferDlg *dlg) + : m_dlg (dlg) +{ +} + +FileTransferDlgNotify::~FileTransferDlgNotify() +{ + m_dlg->notifyDestroyed(); +} + +void FileTransferDlgNotify::process() +{ + m_dlg->process(); +} + +void FileTransferDlgNotify::transfer(bool bState) +{ + m_dlg->transfer(bState); +} + +void FileTransferDlgNotify::createFile(const QString &name, unsigned size, bool bCanResume) +{ + m_name = name; + m_size = size; + m_name = m_name.replace('\\', '/'); + + + FileTransfer *ft = m_dlg->m_msg->m_transfer; + int n = m_name.lastIndexOf('/'); + if (n >= 0) + { + QString path; + QString p(m_name.left(n)); + m_fn = m_name.right(m_name.length()-n); + m_fn = m_fn.replace(QRegExp("/"), ""); + + while (!p.isEmpty()) + { + QString pp = getToken(p, '/'); + if (!path.isEmpty()) + path += '/'; + if (pp == "..") + { + QString errMsg = i18n("Bad path: %1") .arg(m_name); + m_dlg->m_msg->setError(errMsg); + ft->setError(); + return; + } + path += pp; + QDir dd(ft->dir() /* + '/' + path */); + QDir d(ft->dir()); + if (dd.exists() || d.mkdir(path)) + continue; + + QString errMsg = i18n("Can't create: %1") .arg(path); + m_dlg->m_msg->setError(errMsg); + ft->setError(); + return; + } + } + m_dlg->m_msg->addFile(m_name, size); + if (m_name.isEmpty() || m_name[(int)(m_name.length() - 1)] == '/') + { + ft->startReceive(0); + return; + } + + QString shortName = m_name; + //m_name = ft->dir() + m_name; Quickfix, noragen + if (m_fn.isEmpty()) + m_fn=m_name; + + m_name = ft->dir() + m_fn; + + if (ft->m_file) + delete ft->m_file; + m_dlg->process(); + ft->m_file = new QFile(m_name); + if (!ft->m_file->exists()) + { + if (ft->m_file->open(QIODevice::WriteOnly)) + { + ft->startReceive(0); + return; + } + } + else switch (ft->overwrite()) + { + case Skip: + skip(); + return; + case Replace: + if (ft->m_file->open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + ft->startReceive(0); + return; + } + break; + case Resume: + if (ft->m_file->open(QIODevice::WriteOnly | QIODevice::Append)) + { + resume(); + return; + } + break; + default: + if (ft->m_file->open(QIODevice::WriteOnly | QIODevice::Append)) + { + QStringList buttons; + QString forAll; + if (ft->files()) + forAll = i18n("For all files"); + buttons.append(i18n("&Replace")); + buttons.append(i18n("&Skip")); + if (bCanResume && (ft->m_file->size() < size)) + buttons.append(i18n("Resu&me")); + m_dlg->m_ask = new BalloonMsg(NULL, quoteString(i18n("File %1 exists") .arg(shortName)), + buttons, m_dlg->lblState, NULL, false, true, 150, forAll); + QObject::connect(m_dlg->m_ask, SIGNAL(action(int, void*)), m_dlg, SLOT(action(int, void*))); + raiseWindow(m_dlg); + m_dlg->m_ask->show(); + return; + } + } + QString errMsg = i18n("Can't create: %1") .arg(m_name); + m_dlg->m_msg->setError(errMsg); + ft->setError(); +} + +void FileTransferDlgNotify::skip() +{ + FileTransfer *ft = m_dlg->m_msg->m_transfer; + delete ft->m_file; + ft->m_file = NULL; + ft->startReceive(NO_FILE); +} + +void FileTransferDlgNotify::replace() +{ + FileTransfer *ft = m_dlg->m_msg->m_transfer; + ft->m_file->close(); + ft->m_file->open(QIODevice::WriteOnly | QIODevice::Truncate); + ft->startReceive(0); +} + +void FileTransferDlgNotify::resume() +{ + FileTransfer *ft = m_dlg->m_msg->m_transfer; + if (ft->m_file->size() < m_size) + { + ft->m_file->seek(ft->m_file->size()); + ft->startReceive(ft->m_file->size()); + return; + } + delete ft->m_file; + ft->m_file = NULL; + ft->startReceive(NO_FILE); + return; +} + +FileTransferDlg::FileTransferDlg(FileMessage *msg) + : QDialog (NULL) + , m_msg (msg) + , m_bTransfer (false) + , m_file (0) + , m_transferTime(0) + , m_displayTime (0) + , m_speed (0) + , m_nAverage (0) + , m_files (0) + , m_bytes (0) + , m_fileSize (0) + , m_totalBytes (0) + , m_totalSize (0) + , m_time (0) + , m_timer (new QTimer(this)) + , m_state (FileTransfer::Unknown) + , m_dir (msg->getFlags() & MESSAGE_RECEIVED ? m_msg->m_transfer->dir() : QString() ) +{ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + setWindowIcon(Icon("file")); + setButtonsPict(this); + QString name; + Contact *contact = getContacts()->contact(m_msg->contact()); + if (contact) + { + name = contact->getName(); + name = getToken(name, '/'); + } + setWindowTitle((msg->getFlags() & MESSAGE_RECEIVED) ? + i18n("Receive file from %1") .arg(name) : + i18n("Send file to %1") .arg(name)); + + disableWidget(edtTime); + disableWidget(edtEstimated); + disableWidget(edtSpeed); + btnGo->hide(); + btnGo->setIcon(Icon("file")); + msg->m_transfer->setNotify(new FileTransferDlgNotify(this)); + sldSpeed->setValue(m_msg->m_transfer->speed()); + connect(sldSpeed, SIGNAL(valueChanged(int)), this, SLOT(speedChanged(int))); + + connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); + m_timer->start(1000); + printTime(); + + connect(btnCancel, SIGNAL(clicked()), this, SLOT(close())); + chkClose->setChecked(CorePlugin::instance()->value("CloseTransfer").toBool()); + connect(chkClose, SIGNAL(toggled(bool)), this, SLOT(closeToggled(bool))); + connect(btnGo, SIGNAL(clicked()), this, SLOT(goDir())); +} + +FileTransferDlg::~FileTransferDlg() +{ + if (m_msg == NULL) + return; + if (m_msg->m_transfer) + m_msg->m_transfer->setNotify(NULL); + EventMessageCancel(m_msg).process(); +} + +void FileTransferDlg::process() +{ + if (m_msg->m_transfer == NULL) + return; + if (m_msg->m_transfer->state() != m_state || m_msg->m_transfer->file() != m_file) + { + m_state = m_msg->m_transfer->state(); + m_file = m_msg->m_transfer->file(); + QString status; + switch (m_state) + { + case FileTransfer::Listen: + status = i18n("Listen"); + break; + case FileTransfer::Connect: + status = i18n("Connect"); + break; + case FileTransfer::Negotiation: + status = i18n("Negotiation"); + break; + case FileTransfer::Read: + { + m_fn = m_msg->getDescription(); + //const QString *n = it[m_file]; + //if (n) + // m_fn = *n; + status = i18n(QString("Receiving file: %1").arg(m_fn)); + break; + } + case FileTransfer::Write: + m_fn = m_msg->m_transfer->filename(); + status = i18n("Sending file: %1").arg(m_fn); + break; + case FileTransfer::Done: + status = i18n(QString("Transfer done: %1").arg(m_fn)); + edtEstimated->setText("0:00:00"); + if (!m_dir.isEmpty()) + btnGo->show(); + break; + case FileTransfer::Error: + if (!m_msg->getError().isEmpty()) + status = i18n(m_msg->getError()); + break; + default: + break; + } + if (!m_fn.isEmpty()) + { + status += ' '; + status += QDir::convertSeparators(m_fn); + if (m_files > 1) + status += QString(" %1/%2") + .arg(m_file + 1) + .arg(m_msg->m_transfer->files()); + } + lblState->setText(status); + setBars(); + } + calcSpeed(false); + if ((int)m_msg->m_transfer->speed() != sldSpeed->value()) + sldSpeed->setValue(m_msg->m_transfer->speed()); + + if (m_msg->m_transfer->files() == m_files) + return; + + m_files = m_msg->m_transfer->files(); + if (m_files <= 1) + { + if (barFile->isVisible()) + barFile->hide(); + } + else if (!barFile->isVisible()) + barFile->show(); +} + +void FileTransferDlg::transfer(bool bState) +{ + bool bTransfer = m_bTransfer; + m_bTransfer = bState; + if (bState && m_msg->m_transfer) + { + m_transferBytes = m_msg->m_transfer->transferBytes(); + m_transferTime = time(NULL); + } + if (!m_bTransfer && bTransfer) + calcSpeed(true); +} + +void FileTransferDlg::notifyDestroyed() +{ + sldSpeed->hide(); + m_timer->stop(); + btnCancel->setText(i18n("&Close")); + if (m_state == FileTransfer::Done) + { + // EventSent shouldn't be processed here + // Protocol plugin should decide itself when to send it + //EventSent(m_msg).process(); + if (chkClose->isChecked()) + close(); + return; + } + if (!m_msg->getError().isEmpty()) + lblState->setText(i18n(m_msg->getError())); + else + lblState->setText(i18n("Transfer failed")); +} + +void FileTransferDlg::speedChanged(int value) +{ + if (m_msg->m_transfer) + m_msg->m_transfer->setSpeed(value); +} + +void FileTransferDlg::timeout() +{ + m_time++; + printTime(); + calcSpeed(false); + setBars(); +} + +void FileTransferDlg::setBars() +{ + if (m_msg->m_transfer == NULL) + return; + if (m_totalBytes != m_msg->m_transfer->totalBytes() + || m_totalSize != m_msg->m_transfer->totalSize()) + { + m_totalBytes = m_msg->m_transfer->totalBytes(); + m_totalSize = m_msg->m_transfer->totalSize(); + setProgress(barTotal, m_totalBytes, m_totalSize); + } + if (m_files <= 1 || + m_fileSize == m_msg->m_transfer->fileSize() && + m_bytes == m_msg->m_transfer->bytes() ) + return; + + m_fileSize = m_msg->m_transfer->fileSize(); + m_bytes = m_msg->m_transfer->bytes(); + setProgress(barFile, m_bytes, m_fileSize); +} + +void FileTransferDlg::setProgress(QProgressBar *bar, unsigned bytes, unsigned size) +{ + while (size > 0x1000000) + { + size = size >> 1; + bytes = bytes >> 1; + } + if (size == 0) + { + bar->setValue(0); + return; + } + bar->setValue(bytes * 100 / size); +} + +void FileTransferDlg::calcSpeed(bool bTransfer) +{ + if (!m_bTransfer && !bTransfer) + return; + time_t now = time(NULL); + if ((unsigned)now == m_transferTime && !bTransfer) + return; + if (m_nAverage < MAX_AVERAGE) + m_nAverage++; + m_speed = (m_speed * (m_nAverage - 1) + m_msg->m_transfer->transferBytes() - m_transferBytes) / m_nAverage; + if ((unsigned)now == m_displayTime) + return; + m_transferBytes = m_msg->m_transfer->transferBytes(); + m_transferTime = now; + m_displayTime = now; + unsigned n_speed = 0; + double speed = m_speed; + if (speed >= 1024) + { + speed = speed / 1024; + n_speed++; + } + if (m_nAverage < SHOW_AVERAGE) + return; + if (speed == 0) + { + edtEstimated->setText(""); + edtSpeed->setText(i18n("Stalled")); + return; + } + QString speedText; + if (speed >= 100) + speedText = QString::number((unsigned)speed); + else + speedText = QString::number(speed, 'f', 3); + speedText += ' '; + switch (n_speed) + { + case 1: + speedText += i18n("Kb/s"); + break; + case 2: + speedText += i18n("Mb/s"); + break; + default: + speedText += i18n("B/s"); + } + if (edtSpeed->text() != speedText) + edtSpeed->setText(speedText); + unsigned estimate = (m_msg->m_transfer->totalSize() - m_msg->m_transfer->totalBytes()) / m_speed; + unsigned m = estimate / 60; + unsigned h = m / 60; + m = m % 60; + char b[64]; + sprintf(b, "%u:%02u:%02u", h, m, estimate % 60); + edtEstimated->setText(b); +} + +void FileTransferDlg::printTime() +{ + unsigned m = m_time / 60; + unsigned h = m / 60; + m = m % 60; + char b[64]; + sprintf(b, "%u:%02u:%02u", h, m, m_time % 60); + edtTime->setText(b); +} + +void FileTransferDlg::closeToggled(bool bState) +{ + CorePlugin::instance()->setValue("CloseTransfer", bState); +} + +void FileTransferDlg::action(int nAct, void*) +{ + if(!m_msg->m_transfer) + return; + FileTransferDlgNotify *notify = static_cast(m_msg->m_transfer->notify()); + FileTransfer *ft = m_msg->m_transfer; + switch (nAct) + { + case 1: + notify->skip(); + if (m_ask->isChecked()) + ft->setOverwrite(Skip); + break; + case 2: + notify->resume(); + if (m_ask->isChecked()) + ft->setOverwrite(Resume); + break; + default: + notify->replace(); + if (m_ask->isChecked()) + ft->setOverwrite(Replace); + break; + } +} + +void FileTransferDlg::goDir() +{ + if (m_dir.isEmpty()) + return; + QString path = QString("file:") + m_dir; + /* Now replace spaces with %20 so the path isn't truncated + are there any other separators we need to care of ?*/ + //path.replace(' ',"%20"); + + EventGoURL e(path); + e.process(); +} diff --git a/plugins/_core/filetransfer.h b/plugins/_core/filetransfer.h new file mode 100644 index 0000000..e4c8c86 --- /dev/null +++ b/plugins/_core/filetransfer.h @@ -0,0 +1,71 @@ +/*************************************************************************** + filetransfer.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FILETRANSFER_H +#define _FILETRANSFER_H + +#include "message.h" +#include "ui_filetransferbase.h" + +class QTimer; +class QProgressBar; +class BalloonMsg; + +class FileTransferDlg : public QDialog, public Ui::FileTransferBase +{ + Q_OBJECT +public: + FileTransferDlg(SIM::FileMessage*); + ~FileTransferDlg(); +protected slots: + void speedChanged(int); + void closeToggled(bool); + void timeout(); + void action(int, void*); + void goDir(); +protected: + void setProgress(QProgressBar *bar, unsigned bytes, unsigned size); + void process(); + void notifyDestroyed(); + void printTime(); + void transfer(bool); + void calcSpeed(bool); + void setBars(); + SIM::FileMessage *m_msg; + QTimer *m_timer; + unsigned m_time; + unsigned m_file; + bool m_bTransfer; + unsigned m_displayTime; + unsigned m_transferTime; + unsigned m_transferBytes; + unsigned m_speed; + unsigned m_nAverage; + unsigned m_files; + unsigned m_bytes; + unsigned m_fileSize; + unsigned m_totalBytes; + unsigned m_totalSize; + QString m_dir; + QString m_fn; + BalloonMsg *m_ask; + SIM::FileTransfer::State m_state; + friend class FileTransferDlgNotify; +}; + +#endif + diff --git a/plugins/_core/filetransferbase.ui b/plugins/_core/filetransferbase.ui new file mode 100644 index 0000000..eb53aa8 --- /dev/null +++ b/plugins/_core/filetransferbase.ui @@ -0,0 +1,212 @@ + + FileTransferBase + + + + 0 + 0 + 351 + 270 + + + + File transfer + + + + 11 + + + 6 + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + false + + + + + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Time: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Estimated time: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 0 + 0 + + + + + + + + 1 + + + 100 + + + Qt::Horizontal + + + + + + + Speed: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 0 + 0 + + + + + + + + 6 + + + 0 + + + + + &Go to dir + + + + + + + Close after &transfer + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Cancel + + + + + + + + qPixmapFromMimeSource + + btnCancel + sldSpeed + edtTime + edtEstimated + edtSpeed + chkClose + + + + diff --git a/plugins/_core/fontconfigbase.ui b/plugins/_core/fontconfigbase.ui new file mode 100644 index 0000000..e3c6b8f --- /dev/null +++ b/plugins/_core/fontconfigbase.ui @@ -0,0 +1,122 @@ + + + + + FontConfigBase + + + + 0 + 0 + 377 + 233 + + + + Form1 + + + + 11 + + + 6 + + + + + Use &system fonts + + + + + + + Base font: + + + Qt::AlignVCenter|Qt::AlignLeft + + + false + + + + + + + + + + Menu font: + + + false + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + FontEdit + QWidget +
    simgui/fontedit.h
    + + -1 + -1 + + 0 + + 7 + 5 + + image0 +
    + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image1 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/_core/history.cpp b/plugins/_core/history.cpp new file mode 100644 index 0000000..eb53b44 --- /dev/null +++ b/plugins/_core/history.cpp @@ -0,0 +1,927 @@ +/*************************************************************************** +history.cpp - description +------------------- +begin : Sun Mar 17 2002 +copyright : (C) 2002 by Vladimir Shutoff +email : vovan@shutoff.ru +***************************************************************************/ + +/*************************************************************************** +* * +* 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. * +* * +***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "simapi.h" +#include "buffer.h" +#include "log.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/client.h" + +#include "history.h" +#include "core.h" +#include "msgview.h" + +using namespace std; +using namespace SIM; + +static char HISTORY_PATH[] = "history/"; +static char REMOVED[] = ".removed"; + +const unsigned CUT_BLOCK = 0x4000; +const unsigned LOAD_BLOCK_SIZE = 0x1000; +const unsigned BLOCK_SIZE = 0x4000; +const unsigned TEMP_BASE = 0x80000000; + +unsigned History::s_tempId = TEMP_BASE; +MAP_MSG *History::s_tempMsg = NULL; + +class HistoryFile : public QFile +{ +public: + HistoryFile(const QString &name, unsigned contact); + bool isOpen() { return handle() != -1; } + QString m_name; + unsigned m_contact; + Message *load(unsigned id); +private: + HistoryFile(const HistoryFile&); + void operator = (const HistoryFile&); +}; + +class HistoryFileIterator +{ +public: + HistoryFileIterator(HistoryFile&, unsigned contact); + ~HistoryFileIterator(); + void createMessage(unsigned id, const char *type, Buffer *cfg); + void begin(); + void end(); + void clear(); + Message *operator++(); + Message *operator--(); + Message *message(); + HistoryFile &file; + list msgs; + int m_block; + Message *m_msg; + bool loadBlock(bool bUp); + QString m_filter; +private: + unsigned m_contact; + QTextCodec *m_codec; + HistoryFileIterator(const HistoryFileIterator&); + void operator = (const HistoryFileIterator&); +}; + +static Message *createMessage(unsigned id, const char *type, Buffer *cfg) +{ + if (type == NULL || *type == 0) + return NULL; + Message *msg = CorePlugin::instance()->createMessage(type, cfg); + if (!msg) + return NULL; + + msg->setId(id); + return msg; +} + +HistoryFile::HistoryFile(const QString &file_name, unsigned contact) + : m_name (file_name) + , m_contact (contact) +{ + QString f_name = HISTORY_PATH; + f_name += file_name.isEmpty() ? QString::number(contact) : file_name; + f_name = user_file(f_name); + log(L_DEBUG, "FNAME: %s", f_name.toUtf8().data()); + setFileName(f_name); + QFileInfo fi(*this); + if (!fi.exists()) + // make sure directory exists + makedir(fi.absolutePath() + '/'); + else if (!fi.isFile()) + // FIXME! + log(L_ERROR, "%s is not a file!", qPrintable(fi.filePath())); + QFile bak(fileName().append(REMOVED)); + if (!exists() && bak.exists()) + { + QFileInfo fInfo(fileName()); + fInfo.dir().rename(bak.fileName(), fileName()); + } + open(QIODevice::ReadOnly); +} + +Message *HistoryFile::load(unsigned id) +{ + if (!seek(id)) + return NULL; + Buffer cfg; + cfg = readAll(); + QByteArray type = cfg.getSection(); + Message *msg = CorePlugin::instance()->createMessage(type, &cfg); + if (msg == NULL) + return NULL; + msg->setId(id); + msg->setClient(m_name); + msg->setContact(m_contact); + return msg; +} + +HistoryFileIterator::HistoryFileIterator(HistoryFile &f, unsigned contact) +: file(f) +, m_block(0) +, m_msg(NULL) +, m_contact(contact) +, m_codec(NULL) +{ +} + +HistoryFileIterator::~HistoryFileIterator() +{ + clear(); +} + +void HistoryFileIterator::createMessage(unsigned id, const char *type, Buffer *cfg) +{ + Message m(MessageGeneric, cfg); + QString text = m.data.Text.str(); + if (!m_filter.isEmpty()) + { + if (text.isEmpty()) + { + QByteArray serverText = m.getServerText(); + if (serverText.isEmpty()) + return; + if (m_codec == NULL) + m_codec = getContacts()->getCodec(getContacts()->contact(m_contact)); + text = m_codec->toUnicode(serverText); + } + if (text.isEmpty()) + return; + text = text.toLower(); + if (m.getFlags() & MESSAGE_RICHTEXT) + text = text.replace(QRegExp("<[^>]+>"), " "); + text = text.replace(QRegExp(" +"), " "); + if (text.indexOf(m_filter) < 0) + return; + } + Message *msg = ::createMessage(id, type, cfg); + if (msg) + { + msg->setClient(file.m_name); + msg->setContact(file.m_contact); + msgs.push_back(msg); + } +} + +void HistoryFileIterator::begin() +{ + clear(); + m_block = 0; +} + +void HistoryFileIterator::end() +{ + clear(); + m_block = file.size(); +} + +void HistoryFileIterator::clear() +{ + if (m_msg) + { + delete m_msg; + m_msg = NULL; + } + for (list::iterator it = msgs.begin(); it != msgs.end(); ++it) + delete *it; + msgs.clear(); +} + +Message *HistoryFileIterator::operator ++() +{ + if (m_msg) + { + delete m_msg; + m_msg = NULL; + } + while (msgs.empty()) + if (loadBlock(true)) + break; + if (!msgs.empty()) + { + m_msg = msgs.front(); + msgs.pop_front(); + return m_msg; + } + return NULL; +} + +Message *HistoryFileIterator::operator --() +{ + if (m_msg) + { + delete m_msg; + m_msg = NULL; + } + while (msgs.empty()) + if (loadBlock(false)) + break; + if (msgs.empty()) + return NULL; + + m_msg = msgs.back(); + msgs.pop_back(); + return m_msg; +} + +bool HistoryFileIterator::loadBlock(bool bUp) +{ + unsigned blockEnd = m_block; + if (bUp && !file.seek(m_block)) + { + clear(); + return true; + } + Buffer config; + for (;;) + { + int block = m_block; + if (bUp) + { + if (blockEnd >= file.size()) + return true; + blockEnd += BLOCK_SIZE; + unsigned size = config.size(); + config.resize(BLOCK_SIZE); + int readn = file.read((char*)config.data(size), BLOCK_SIZE); + if (readn < 0) + { + log(L_WARN, "Can't read %s", qPrintable(file.fileName())); + clear(); + return true; + } + config.resize(size + readn); + } + else + { + if (m_block == 0) + return true; + block -= BLOCK_SIZE; + if (block < 0) + block = 0; + if (!file.seek(block)) + { + m_block = 0; + clear(); + return true; + } + unsigned size = m_block - block; + m_block = block; + config.resize(size); + if ((unsigned)file.read(config.data(), size) != size) + { + log(L_WARN, "Can't read %s", qPrintable(file.fileName())); + clear(); + return true; + } + config.setWritePos(0); + } + QByteArray type = config.getSection(!bUp && (m_block != 0)); + if (type.isEmpty() || + ((config.writePos() == (unsigned)config.size()) && + (file.pos() < file.size())) + ) + continue; + unsigned id = m_block; + if (!bUp) + m_block += config.startSection(); + createMessage(id + config.startSection(), type, &config); + unsigned pos = config.writePos(); + for (;;) + { + type = config.getSection(); + if ((!bUp) && (id + config.writePos() > blockEnd) || + type.isEmpty() || + (((config.writePos() == (unsigned)config.size()) && + (file.pos() < file.size())))) + break; + createMessage(id + config.startSection(), type, &config); + pos = config.writePos(); + } + if (bUp) + m_block += pos; + break; + } + return false; +} + +Message *HistoryFileIterator::message() +{ + return m_msg; +} + +History::History(unsigned id) + : m_contact (id) +{ + Contact *contact = getContacts()->contact(id); + if (contact == NULL) + return; + HistoryFile *f = new HistoryFile(QString::number(id), id); + if (f->isOpen()) + files.push_back(f); + else + delete f; + void *data; + ClientDataIterator it(contact->clientData); + QStringList fnames; + while ((data = ++it) != NULL) + { + QString name = it.client()->dataName(data); + if(fnames.contains(name)) + continue; + fnames.append(name); + HistoryFile *f = new HistoryFile(name, id); + f->m_name = name; + if (f->isOpen()) + files.push_back(f); + else delete f; + } +} + +History::~History() +{ + for (list::iterator it = files.begin(); it != files.end(); ++it) + delete *it; +} + +HistoryIterator::HistoryIterator(unsigned contact_id) + : m_bUp (false) + , m_bDown (false) + , m_temp_id (0) + , m_history (contact_id) + , m_it (NULL) +{ + for (list::iterator it = m_history.files.begin(); it != m_history.files.end(); ++it) + iters.push_back(new HistoryFileIterator(**it, contact_id)); +} + +HistoryIterator::~HistoryIterator() +{ + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + delete *it; +} + +void HistoryIterator::begin() +{ + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + (*it)->begin(); + m_temp_id = 0; + m_bUp = m_bDown = false; +} + +void HistoryIterator::end() +{ + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + (*it)->end(); + m_temp_id = 0xFFFFFFFF; + m_bUp = m_bDown = false; +} + +QString HistoryIterator::state() +{ + QString res; + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + { + if (!res.isEmpty()) + res += ';'; + Message *msg = (*it)->message(); + res += msg ? QString::number(msg->id()) : QString::number((*it)->m_block); + res += ','; + res += (*it)->file.m_name; + } + if (!res.isEmpty()) + res += ';'; + res += QString::number(m_temp_id); + res += ",temp"; + return res; +} + +void HistoryIterator::setState(const QString &str) +{ + QString s = str; + while (!s.isEmpty()) + { + QString item = getToken(s, ';'); + unsigned pos = getToken(item, ',').toUInt(); + if (item == "temp") + { + m_temp_id = item.toULong(); + continue; + } + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + { + if ((*it)->file.m_name == item) + { + (*it)->clear(); + (*it)->m_block = pos; + break; + } + } + } + m_bUp = m_bDown = false; +} + +Message *HistoryIterator::operator ++() +{ + if (!m_bUp) + { + m_bUp = true; + m_bDown = false; + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + { + (*it)->clear(); + ++(**it); + } + m_it = NULL; + } + if (m_it) + ++(*m_it); + m_it = NULL; + Message *msg = NULL; + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + { + Message *m = (**it).message(); + if (m == NULL || + (msg != NULL && msg->getTime() <= m->getTime())) + continue; + + msg = m; + m_it = *it; + } + if (msg) + return msg; + if (History::s_tempMsg) + { + MAP_MSG::iterator itm; + for (itm = History::s_tempMsg->begin(); itm != History::s_tempMsg->end(); ++itm) + if (itm->first > m_temp_id) + break; + for (; itm != History::s_tempMsg->end(); ++itm) + { + if (itm->second.contact != m_history.m_contact) + continue; + + m_temp_id = (*itm).first; + Message *msg = History::load(m_temp_id, QString::null, m_history.m_contact); + if (msg) + return msg; + } + m_temp_id = 0xFFFFFFFF; + } + return NULL; +} + +Message *HistoryIterator::operator --() +{ + if (m_temp_id && History::s_tempMsg) + { + MAP_MSG::iterator itm = History::s_tempMsg->end(); + if (itm != History::s_tempMsg->begin()) + { + for (--itm;;--itm) + { + if (itm->first < m_temp_id) + break; + if (itm != History::s_tempMsg->begin()) + continue; + + m_temp_id = 0; + break; + } + if (m_temp_id) + { + for (;; --itm) + { + if (itm->second.contact == m_history.m_contact) + { + m_temp_id = itm->first; + Message *msg = History::load(m_temp_id, QString::null, m_history.m_contact); + if (msg) + return msg; + } + if (itm == History::s_tempMsg->begin()) + break; + } + } + } + } + m_temp_id = 0; + if (!m_bDown) + { + m_bDown = true; + m_bUp = false; + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + { + (*it)->clear(); + --(**it); + } + m_it = NULL; + } + if (m_it) + --(*m_it); + m_it = NULL; + Message *msg = NULL; + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + { + Message *m = (**it).message(); + if (m == NULL || + (msg != NULL && msg->getTime() > m->getTime())) + continue; + msg = m; + m_it = *it; + } + return msg; +} + +void HistoryIterator::setFilter(const QString &filter) +{ + QString f = filter.toLower(); + f = f.replace(QRegExp(" +"), " "); + for (list::iterator it = iters.begin(); it != iters.end(); ++it) + (*it)->m_filter = f; +} + +Message *History::load(unsigned id, const QString &client, unsigned contact) +{ + if (id >= TEMP_BASE) + { + if (s_tempMsg == NULL) + return NULL; + MAP_MSG::iterator it = s_tempMsg->find(id); + if (it == s_tempMsg->end()) + return NULL; + msg_save &ms = it->second; + Buffer config; + config = ms.msg; + config.setWritePos(0); + QByteArray type = config.getSection(); + Message *msg = createMessage(id, type, &config); + if (!msg) + return NULL; + msg->setClient(ms.client); + msg->setContact(ms.contact); + msg->setFlags(msg->getFlags() | MESSAGE_TEMP); + return msg; + } + HistoryFile f(client, contact); + if (!f.isOpen()) + return NULL; + return f.load(id); +} + +void History::add(Message *msg, const QString &type) +{ + QByteArray line = "["; + line += type.toUtf8(); + line += "]\n"; + line += msg->save(); + line += '\n'; + + if (msg->getFlags() & MESSAGE_TEMP) + { + if (s_tempMsg == NULL) + s_tempMsg = new MAP_MSG; + msg_save ms; + ms.msg = line; + ms.contact = msg->contact(); + ms.client = msg->client(); + s_tempMsg->insert(MAP_MSG::value_type(++s_tempId, ms)); + msg->setId(s_tempId); + return; + } + + if (!line.isEmpty() && line.at(line.length() - 1) != '\n') + line += '\n'; + + QString name = msg->client(); + if (name.isEmpty()) + name = QString::number(msg->contact()); + QString f_name = QString(HISTORY_PATH).append(name); + + f_name = user_file(f_name); + + Contact *contact = getContacts()->contact(msg->contact()); + SIM::PropertyHubPtr data; + if (contact) + data = contact->getUserData("history"); + if (!data.isNull() && data->value("CutSize").toBool()) + { + QFileInfo fInfo(f_name); + if (fInfo.exists() && (fInfo.size() >= data->value("MaxSize").toInt() * 0x100000 + CUT_BLOCK)) + { + int pos = fInfo.size() - data->value("MaxSize").toUInt() * 0x100000 + line.size(); + if (pos < 0) + pos = 0; + del(f_name, msg->contact(), pos, false); + } + } + + QFile f(f_name); + if (!f.open(QIODevice::ReadWrite | QIODevice::Append)) + { + log(L_ERROR, "Can't open %s", qPrintable(f_name)); + return; + } + qint64 id = f.pos(); + f.write(line); + + msg->setId(id); +} + +void History::del(Message *msg) +{ + QString name = msg->client(); + if (name.isEmpty()) + name = QString::number(msg->contact()); + del(name, msg->contact(), msg->id(), true); +} + +void History::rewrite(Message *msg) +{ + QString name = msg->client(); + if (name.isEmpty()) + name = QString::number(msg->contact()); + del(name, msg->contact(), msg->id(), true, msg); +} + +typedef map CLIENTS_MAP; + +void History::cut(Message *msg, unsigned contact_id, unsigned date) +{ + QString client; + if (msg) + client = msg->client(); + CLIENTS_MAP clients; + { + HistoryIterator it(msg ? msg->contact() : contact_id); + Message *m; + while ((m = ++it) != NULL) + { + if (date && m->getTime() > date) + break; + CLIENTS_MAP::iterator itm = clients.find(m->client()); + if (itm == clients.end()) + clients.insert(CLIENTS_MAP::value_type(m->client(), m->id())); + else + itm->second = m->id(); + if (!msg || + client != m->client() || + m->id() < msg->id()) + continue; + + break; + } + } + for (CLIENTS_MAP::iterator it = clients.begin(); it != clients.end(); ++it) + del(it->first.str(), msg ? msg->contact() : contact_id, it->second + 1, false); +} + +void History::del(const QString &name, unsigned contact, unsigned id, bool bCopy, Message *msg) +{ + QFile f(user_file(QString(HISTORY_PATH).append(name))); + if (!f.open(QIODevice::ReadOnly)) + { + log(L_ERROR, "Can't open %s", qPrintable(f.fileName())); + return; + } + QFile t(f.fileName() + '~'); + if (!t.open(QIODevice::ReadWrite | QIODevice::Truncate)) + { + log(L_ERROR, "Can't open %s", qPrintable(t.fileName())); + return; + } + unsigned tail = id; + for (; tail > 0; ) + { + char b[LOAD_BLOCK_SIZE]; + int size = sizeof(b); + if (tail < (unsigned)size) + size = tail; + size = f.read(b, size); + if (size == -1) + { + log(L_ERROR, "Read history error"); + return; + } + if (bCopy && t.write(b, size) != size) + { + log(L_ERROR, "Write history error"); + return; + } + tail -= size; + } + Buffer config; + unsigned skip_start = id; + for (;;) + { + unsigned size = config.size(); + config.resize(LOAD_BLOCK_SIZE); + int readn = f.read(config.data(size), LOAD_BLOCK_SIZE); + if (readn < 0) + { + log(L_ERROR, "Read history error"); + return; + } + config.resize(size + readn); + QByteArray section = config.getSection(); + if (section.isEmpty()) + { + if (readn == 0) + return; + continue; + } + if (config.writePos() == (unsigned)config.size() && + readn != 0) + continue; + + break; + } + if (config.startSection()) + { + skip_start += config.startSection(); + if ((unsigned)t.write(config.data(), config.startSection()) != config.startSection()) + { + log(L_ERROR, "Write history error"); + return; + } + } + unsigned skip_size = config.writePos() - config.startSection(); + QByteArray line = "\n"; + if (msg) + { + line += msg->save(); + line += '\n'; + skip_start++; + } + int size = line.length(); + int written = t.write(line, size); + if (written != size) + { + log(L_DEBUG, "Write history error"); + return; + } + skip_size -= line.length(); + if (config.writePos() < (unsigned)config.size()) + { + size = config.size() - config.writePos(); + written = t.write(config.data(config.writePos()), size); + if (written != size) + { + log(L_DEBUG, "Write history error"); + return; + } + } + tail = f.size() - f.pos(); + for (; tail > 0; ) + { + char b[2048]; + size = f.read(b, sizeof(b)); + if (size == -1) + { + log(L_ERROR, "Read history error"); + return; + } + written = t.write(b, size); + if (written != size) + { + log(L_DEBUG, "Write history error"); + return; + } + tail -= size; + } + f.close(); + t.close(); + QFileInfo fInfo(f.fileName()); + QFileInfo tInfo(t.fileName()); + fInfo.dir().remove(fInfo.fileName()); + if (!tInfo.dir().rename(tInfo.fileName(), fInfo.fileName())) + { + log(L_ERROR, "Can't rename file %s to %s", qPrintable(fInfo.fileName()), qPrintable(tInfo.fileName())); + return; + } + CutHistory ch; + ch.contact = contact; + ch.client = name; + if (bCopy) + { + ch.from = skip_start; + ch.size = skip_size; + } + else + { + ch.from = skip_start; + ch.size = skip_start + skip_size; + } + EventCutHistory(&ch).process(); +} + +void History::del(unsigned msg_id) +{ + if (s_tempMsg == NULL) + return; + MAP_MSG::iterator it = s_tempMsg->find(msg_id); + if (it == s_tempMsg->end()) + { + log(L_WARN, "Message %X for remove not found", msg_id); + return; + } + s_tempMsg->erase(it); +} + +void History::remove(Contact *contact) +{ + bool bRename = (contact->getFlags() & CONTACT_NOREMOVE_HISTORY); + QString name = QString::number(contact->id()); + QString f_name = HISTORY_PATH; + f_name += name; + name = user_file(f_name); + QFile f(name); + f.remove(); + + void *data; + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL) + { + name = it.client()->dataName(data); + f_name = HISTORY_PATH; + f_name += name; + name = user_file(f_name); + QFile f(name); + if (!f.exists()) + continue; + if (bRename) + { + QFileInfo fInfo(f.fileName()); + fInfo.dir().rename(fInfo.fileName(), QString(fInfo.fileName()).append(REMOVED)); + continue; + } + f.remove(); + } +} + +bool History::save(unsigned id, const QString& file_name, bool bAppend) +{ + QFile f(file_name); + QIODevice::OpenMode mode = QIODevice::WriteOnly | QIODevice::Text; + if (bAppend) + mode |= QIODevice::Append; + if(f.open(mode)) + { + QTextStream stream(&f); + HistoryIterator it(id); + it.begin(); + const QString owner = getContacts()->owner()->getName(), + contact = getContacts()->contact(id)->getName(); + for (;;) + { + Message *msg = ++it; + if (msg == NULL) + break; + QDateTime t = QDateTime::fromTime_t(msg->getTime()); + QString time; + time = t.toString("hh:mm:ss"); + stream << (msg->getFlags() & MESSAGE_RECEIVED ? contact : owner) + << " (" << formatDate(t.date()) << " " << time << "):\n" + << msg->getPlainText() + << "\n\n"; + } + const QFile::FileError status = f.error(); + const QString errorMessage = f.errorString(); + f.close(); + if (status != QFile::NoError) + { + log(L_ERROR, "I/O error during write to file %s : %s", qPrintable(file_name), qPrintable(errorMessage)); + return false; + } + return true; + } + //else deleted: unreachable Code + log(L_ERROR, "Can't open %s for writing", qPrintable(file_name)); + return false; + +} diff --git a/plugins/_core/history.h b/plugins/_core/history.h new file mode 100644 index 0000000..82bf405 --- /dev/null +++ b/plugins/_core/history.h @@ -0,0 +1,89 @@ +/*************************************************************************** + history.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _HISTORY_H +#define _HISTORY_H + +#include +#include +#include +#include + +#include "message.h" + +class CorePlugin; +class QFile; + +class HistoryFile; +class HistoryFileIterator; + +using namespace std; + +struct msg_save +{ + QByteArray msg; + QString client; + unsigned contact; +}; + +typedef map MAP_MSG; + +class History +{ +public: + History(unsigned contact_id); + ~History(); + static void add(SIM::Message*, const QString &type); + static void del(SIM::Message*); + static void rewrite(SIM::Message*); + static void cut(SIM::Message*, unsigned contact_id, unsigned date); + static void del(unsigned msg_id); + static void remove(SIM::Contact *contact); + static bool save(unsigned id, const QString& file_name, bool bAppend = false); + static SIM::Message *load(unsigned id, const QString &client, unsigned contact); +protected: + static void del(const QString &name, unsigned contact, unsigned id, bool bCopy, SIM::Message *msg=NULL); + static unsigned s_tempId; + static MAP_MSG *s_tempMsg; + unsigned m_contact; + list files; + friend class HistoryIterator; +}; + +class HistoryIterator +{ +public: + HistoryIterator(unsigned contact_id); + ~HistoryIterator(); + SIM::Message *operator++(); + SIM::Message *operator--(); + void begin(); + void end(); + QString state(); + void setState(const QString &); + void setFilter(const QString &filter); +protected: + bool m_bUp; + bool m_bDown; + unsigned m_temp_id; + History m_history; + HistoryFileIterator *m_it; + list iters; +}; + +#endif + diff --git a/plugins/_core/historycfg.cpp b/plugins/_core/historycfg.cpp new file mode 100644 index 0000000..bb3abab --- /dev/null +++ b/plugins/_core/historycfg.cpp @@ -0,0 +1,748 @@ +/*************************************************************************** +historycfg.cpp - description +------------------- +begin : Sun Mar 17 2002 +copyright : (C) 2002 by Vladimir Shutoff +email : vovan@shutoff.ru +***************************************************************************/ + +/*************************************************************************** +* * +* 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. * +* * +***************************************************************************/ + +#include "simapi.h" + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef USE_KDE +# include +# include +# include +#endif + + +#include "log.h" +#include "unquot.h" +#include "xsl.h" + +#include "historycfg.h" +#include "core.h" +#include "msgview.h" + +#include "simgui/ballonmsg.h" +#include "simgui/textshow.h" +#include "contacts/contact.h" +#include "contacts/client.h" + +#ifdef __OS2__ +#undef COMMENT +#endif + +static char STYLES[] = "styles/"; +static char EXT[] = ".xsl"; + +//#undef QTextEdit + +using namespace std; +using namespace SIM; + +class XmlHighlighter : public QSyntaxHighlighter +{ +public: + XmlHighlighter(QTextEdit *textEdit) : QSyntaxHighlighter(textEdit) {} + virtual int highlightParagraph( const QString &text, int endStateOfLastPara ) ; + void highlightBlock( const QString &text ) //FIXME whole Method!!! + { + QTextCharFormat myClassFormat; + myClassFormat.setFontWeight(QFont::Bold); + myClassFormat.setForeground(Qt::darkMagenta); + QString pattern = "\\bMy[A-Za-z]+\\b"; + + QRegExp expression(pattern); + int index = text.indexOf(expression); + while (index >= 0) + { + int length = expression.matchedLength(); + setFormat(index, length, myClassFormat); + index = text.indexOf(expression, index + length); + } + } +}; + +const int TEXT = -2; +const int COMMENT = 1; +const int TAG = 2; +const int XML_TAG = 3; +const int XSL_TAG = 4; +const int STRING = 5; +const int XML_STRING = 6; +const int XSL_STRING = 7; + +const unsigned COLOR_COMMENT = 0x808080; +const unsigned COLOR_TAG = 0x008000; +const unsigned COLOR_STRING = 0x000080; +const unsigned COLOR_XSL_TAG = 0x800000; +const unsigned COLOR_XML_TAG = 0x808080; + +int XmlHighlighter::highlightParagraph(const QString &s, int state) +{ + int pos = 0; + for (; pos < (int)(s.length());) + { + int n = pos; + int n1; + QColor c; + switch (state) + { + case TEXT: + n = s.indexOf('<', pos); + if (n == -1) + n = s.length(); + else + { + state = TAG; + if (s.mid(n + 1, 2) == "--") + state = COMMENT; + else if (s.mid(n + 1, 4) == "?xml") + state = XML_TAG; + else if (s.mid(n + 1, 4) == "xsl:") + state = XSL_TAG; + else if (s.mid(n + 1, 5) == "/xsl:") + state = XSL_TAG; + } + break; + case COMMENT: + n = s.indexOf("-->", pos); + if (n == -1) + n = s.length(); + else + state = TEXT; + c = QColor(COLOR_COMMENT); + break; + case TAG: + case XSL_TAG: + case XML_TAG: + switch (state) + { + case XSL_TAG: + c = QColor(COLOR_XSL_TAG); + break; + case XML_TAG: + c = QColor(COLOR_XML_TAG); + break; + default: + c = QColor(COLOR_TAG); + } + n = s.indexOf('>', pos); + n1 = s.indexOf('\"', pos); + if (n >= 0 && (n < n1 || n1 == -1)) + { + state = TEXT; + n++; + } + else if (n1 >= 0 && (n1 < n || n == -1)) + { + switch (state) + { + case XSL_TAG: + state = XSL_STRING; + break; + case XML_TAG: + state = XML_STRING; + break; + default: + state = STRING; + } + n = n1; + } + else n = s.length(); + break; + case STRING: + case XML_STRING: + case XSL_STRING: + n = s.indexOf('\"', pos + 1); + if (n >= 0) + { + switch (state) + { + case XML_STRING: + state = XML_TAG; + break; + case XSL_STRING: + state = XSL_TAG; + break; + default: + state = TAG; + } + n++; + } + else + n = s.length(); + c = QColor(COLOR_STRING); + break; + } + if (n - pos > 0) + setFormat(pos, n - pos, c); + pos = n; + } + return state; +} + + +HistoryConfig::HistoryConfig(QWidget *parent) +: QWidget (parent) +, m_cur (-1) +, m_bDirty (false) +{ + setupUi(this); + chkOwn->setChecked(CorePlugin::instance()->value("OwnColors").toBool()); + chkSmile->setChecked(CorePlugin::instance()->value("UseSmiles").toBool()); + chkExtViewer->setChecked(CorePlugin::instance()->value("UseExtViewer").toBool()); + edtExtViewer->setText(CorePlugin::instance()->value("ExtViewer").toString()); + chkAvatar->setChecked(CorePlugin::instance()->value("ShowAvatarInHistory").toBool()); + cmbPage->setEditable(true); + QLineEdit *edit = cmbPage->lineEdit(); + edit->setValidator(new QIntValidator(1, 10000, edit)); + edit->setText(QString::number(CorePlugin::instance()->value("HistoryPage").toUInt())); + QString str1 = i18n("Show %1 messages per page"); + QString str2; + int n = str1.indexOf("%1"); + if (n >= 0) + { + str2 = str1.mid(n + 2); + str1 = str1.left(n); + } + lblPage1->setText(str1); + lblPage2->setText(str2); + //edtStyle->setWordWrap(QTextEdit::NoWrap); + edtStyle->setWordWrapMode(QTextOption::NoWrap); + highlighter = new XmlHighlighter(edtStyle); + addStyles(user_file(STYLES), true); + str1 = i18n("Use external viewer"); + chkExtViewer->setText(str1); + str1 = i18n("Show user avatar"); + chkAvatar->setText(str1); +#ifdef USE_KDE + QStringList lst = KGlobal::dirs()->findDirs("data", "sim"); + for (QStringList::Iterator it = lst.begin(); it != lst.end(); ++it){ + QFile fi(*it + STYLES); + if (!fi.exists()) + continue; + addStyles(fi.name(), false); + } +#else + addStyles(app_file(STYLES), false); +#endif + fillCombo(CorePlugin::instance()->value("HistoryStyle").toString()); + connect(cmbStyle, SIGNAL(activated(int)), this, SLOT(styleSelected(int))); + connect(btnCopy, SIGNAL(clicked()), this, SLOT(copy())); + connect(btnRename, SIGNAL(clicked()), this, SLOT(rename())); + connect(btnDelete, SIGNAL(clicked()), this, SLOT(del())); + connect(tabStyle, SIGNAL(currentChanged(QWidget*)), this, SLOT(viewChanged(QWidget*))); + connect(edtStyle, SIGNAL(textChanged()), this, SLOT(textChanged())); + connect(chkOwn, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); + connect(chkSmile, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); + connect(chkDays, SIGNAL(toggled(bool)), this, SLOT(toggledDays(bool))); + connect(chkSize, SIGNAL(toggled(bool)), this, SLOT(toggledSize(bool))); + connect(chkExtViewer, SIGNAL(toggled(bool)), this, SLOT(toggledExtViewer(bool))); + SIM::PropertyHubPtr data = getContacts()->getUserData("history"); + chkDays->setChecked(data->value("CutDays").toBool()); + chkSize->setChecked(data->value("CutSize").toBool()); + edtDays->setValue(data->value("Days").toUInt()); + edtSize->setValue(data->value("MaxSize").toUInt()); + toggledDays(chkDays->isChecked()); + toggledSize(chkSize->isChecked()); + toggledExtViewer(chkExtViewer->isChecked()); +} + +HistoryConfig::~HistoryConfig() +{ + delete highlighter; +} + +static char BACKUP_SUFFIX[] = "~"; + +void HistoryConfig::apply() +{ + bool bChanged = false; + int idxStyle = cmbStyle->currentIndex(); + if (tabStyle->currentWidget() == source && m_bDirty && idxStyle >= 0) + m_styles[idxStyle].text = unquoteText(edtStyle->toHtml()); + for (unsigned i = 0; i < m_styles.size(); i++) + { + if (m_styles[i].text.isEmpty() || !m_styles[i].bCustom) + continue; + if ((int)i == cmbStyle->currentIndex()) + bChanged = true; + QString name = STYLES; + name += m_styles[i].name; + name += EXT; + name = user_file(name); + QFile f(QString(name).append(BACKUP_SUFFIX)); // use backup file for this ... + if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + QString s; + s = m_styles[i].text; + f.write(s.toUtf8()); + + const QFile::FileError status = f.error(); + const QString errorMessage = f.errorString(); + f.close(); + if (status != QFile::NoError) + { + log(L_ERROR, "IO error writing to file %s : %s", qPrintable(f.fileName()), qPrintable(errorMessage)); + continue; + } + // rename to normal file + QFileInfo fileInfo(f.fileName()); + QString desiredFileName = fileInfo.fileName(); + desiredFileName = desiredFileName.left(desiredFileName.length() - strlen(BACKUP_SUFFIX)); + fileInfo.dir().remove(desiredFileName); + if (fileInfo.dir().rename(fileInfo.fileName(), desiredFileName)) + continue; + + log(L_ERROR, "Can't rename file %s to %s", qPrintable(fileInfo.fileName()), qPrintable(desiredFileName)); + continue; + } + log(L_WARN, "[1]Can't create %s", qPrintable(name)); + } + int cur = cmbStyle->currentIndex(); + if ((cur >= 0) && m_styles.size() && + (m_styles[cur].bChanged || + (m_styles[cur].name != CorePlugin::instance()->value("HistoryStyle").toString()))){ + CorePlugin::instance()->setValue("HistoryStyle", m_styles[cur].name); + bChanged = true; + delete CorePlugin::instance()->historyXSL; + CorePlugin::instance()->historyXSL = new XSL(m_styles[cur].name); + } + + if (chkOwn->isChecked() != CorePlugin::instance()->value("OwnColors").toBool()){ + bChanged = true; + CorePlugin::instance()->setValue("OwnColors", chkOwn->isChecked()); + } + if (chkSmile->isChecked() != CorePlugin::instance()->value("UseSmiles").toBool()){ + bChanged = true; + CorePlugin::instance()->setValue("UseSmiles", chkSmile->isChecked()); + } + if (chkExtViewer->isChecked() != CorePlugin::instance()->value("UseExtViewer").toBool()){ + bChanged = true; + CorePlugin::instance()->setValue("UseExtViewer", chkExtViewer->isChecked()); + } + if (chkAvatar->isChecked() != CorePlugin::instance()->value("ShowAvatarInHistory").toBool()){ + bChanged = true; + CorePlugin::instance()->setValue("ShowAvatarInHistory", chkAvatar->isChecked()); + } + CorePlugin::instance()->setValue("ExtViewer", edtExtViewer->text().toLocal8Bit()); + CorePlugin::instance()->setValue("HistoryPage", (uint)cmbPage->lineEdit()->text().toULong()); + if (bChanged){ + EventHistoryConfig(0).process(); + } + fillPreview(); + SIM::PropertyHubPtr data = getContacts()->getUserData("history"); + data->setValue("CutDays", chkDays->isChecked()); + data->setValue("CutSize", chkSize->isChecked()); + data->setValue("Days", edtDays->text().toUInt()); + data->setValue("MaxSize", edtSize->text().toUInt()); +} + +void HistoryConfig::addStyles(const QString &dir, bool bCustom) +{ + QDir d(dir); + QStringList files = d.entryList(QStringList("*.xsl"), QDir::Files, QDir::Name); + for (QStringList::Iterator it = files.begin(); it != files.end(); ++it){ + QString name = *it; + int n = name.lastIndexOf('.'); + name = name.left(n); + vector::iterator its; + for (its = m_styles.begin(); its != m_styles.end(); ++its){ + if (name == (*its).name) + break; + } + if (its == m_styles.end()){ + StyleDef s; + s.name = name; + s.bCustom = bCustom; + s.bChanged = false; + m_styles.push_back(s); + } + } +} + +void HistoryConfig::toggled(bool) +{ + if (tabStyle->currentWidget() == preview) + fillPreview(); +} + +void HistoryConfig::styleSelected(int n) +{ + if (n == m_cur) + return; + if (m_styles.size() == 0) return; + if (m_bDirty && (m_cur >= 0)) + m_styles[m_cur].text = unquoteText(edtStyle->toHtml()); + m_cur = n; + bool bCustom = m_styles[n].bCustom; + btnRename->setEnabled(bCustom); + btnDelete->setEnabled(bCustom); + edtStyle->setReadOnly(!bCustom); + fillPreview(); + if (tabStyle->currentWidget() == source) + viewChanged(source); +} + +void HistoryConfig::copy() +{ + int cur = cmbStyle->currentIndex(); + if ((cur < 0) || (!m_styles.size())) + return; + QString name = m_styles[cur].name; + QString newName; + QRegExp re("\\.[0-9]+$"); + unsigned next = 0; + for (vector::iterator it = m_styles.begin(); it != m_styles.end(); ++it){ + QString nn = it->name; + int n = nn.indexOf(re); + if (n < 0) + continue; + nn = nn.mid(n + 1); + next = qMax(next, nn.toUInt()); + } + int nn = name.indexOf(re); + if (nn >= 0){ + newName = name.left(nn); + }else{ + newName = name; + } + newName += '.'; + newName += QString::number(next + 1); + QString n; + n = STYLES; + n += name; + n += EXT; + if (m_styles[cur].bCustom){ + n = user_file(n); + }else{ + n = app_file(n); + } + QFile from(n); + if (!from.open(QIODevice::ReadOnly)){ + log(L_WARN, "Can't open %s", qPrintable(n)); + return; + } + n = STYLES; + n += newName; + n += EXT; + n = user_file(n); + QFile to(QString(n).append(BACKUP_SUFFIX)); + if (!to.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + log(L_WARN, "Cam't create %s", qPrintable(n)); + return; + } + QDataStream ds1(&from); + QDataStream ds2(&to); + ds2 << ds1; + from.close(); + + const QFile::FileError status = to.error(); + const QString errorMessage = to.errorString(); + to.close(); + if (status != QFile::NoError) { + log(L_ERROR, "IO error writing to file %s : %s", qPrintable(to.fileName()), qPrintable(errorMessage)); + return; + } + + // rename to normal file + QFileInfo fileInfo(to.fileName()); + QString desiredFileName = fileInfo.fileName(); + desiredFileName = desiredFileName.left(desiredFileName.length() - strlen(BACKUP_SUFFIX)); + fileInfo.dir().remove(desiredFileName); + if (!fileInfo.dir().rename(fileInfo.fileName(), desiredFileName)) { + log(L_ERROR, "Can't rename file %s to %s", qPrintable(fileInfo.fileName()), qPrintable(desiredFileName)); + return; + } + + StyleDef d; + d.name = newName; + d.bCustom = true; + m_styles.push_back(d); + fillCombo(newName); +} + +void HistoryConfig::fillCombo(const QString ¤t) +{ + sort(m_styles.begin(), m_styles.end()); + unsigned cur = 0; + cmbStyle->clear(); + for (unsigned i = 0; i < m_styles.size(); i++){ + QString name = m_styles[i].name; + cmbStyle->insertItem(INT_MAX,name); + if (name == current) + cur = i; + } + cmbStyle->setCurrentIndex(cur); + styleSelected(cur); +} + +void HistoryConfig::del() +{ + int cur = cmbStyle->currentIndex(); + if ((cur < 0) || (!m_styles.size())) + return; + if (!m_styles[cur].bCustom) + return; + BalloonMsg::ask(NULL, i18n("Remove style '%1'?") .arg(m_styles[cur].name), + btnDelete, SLOT(realDelete()), NULL, NULL, this); +} + +void HistoryConfig::realDelete() +{ + int cur = cmbStyle->currentIndex(); + if ((cur < 0) || (!m_styles.size())) + return; + if (!m_styles[cur].bCustom) + return; + QString name = m_styles[cur].name; + vector::iterator it; + for (it = m_styles.begin(); it != m_styles.end(); ++it) + if (cur-- == 0) + break; + m_styles.erase(it); + QString n; + n = STYLES; + n += name; + n += EXT; + n = user_file(n); + QFile::remove(n); + fillCombo(CorePlugin::instance()->value("HistoryStyle").toString()); +} + +void HistoryConfig::rename() +{ + int cur = cmbStyle->currentIndex(); + if ((cur < 0) || (!m_styles.size())) + return; + if (!m_styles[cur].bCustom) + return; + m_edit = cur; + cmbStyle->setEditable(true); + cmbStyle->lineEdit()->setText(m_styles[cur].name); + cmbStyle->lineEdit()->setFocus(); + cmbStyle->lineEdit()->installEventFilter(this); +} + +void HistoryConfig::cancelRename() +{ + cmbStyle->lineEdit()->removeEventFilter(this); + cmbStyle->setEditable(false); +} + +void HistoryConfig::realRename() +{ + QString newName = cmbStyle->lineEdit()->text(); + cmbStyle->lineEdit()->removeEventFilter(this); + cmbStyle->setEditable(false); + if (newName != m_styles[m_edit].name){ + int n = 0; + vector::iterator it; + for (it = m_styles.begin(); it != m_styles.end(); ++it, n++){ + if (it->name == newName){ + if (n < m_edit) + m_edit--; + m_styles.erase(it); + break; + } + } + QString nn; + nn = STYLES; + nn += m_styles[m_edit].name; + nn += EXT; + nn = user_file(nn); + if (m_styles[m_edit].text.isEmpty()){ + QFile f(nn); + if (f.open(QIODevice::ReadOnly)){ + QTextStream ts(&f); + m_styles[m_edit].text = ts.readAll(); + } + } + QFile::remove(nn); + m_styles[m_edit].name = newName; + } + fillCombo(newName); +} + +bool HistoryConfig::eventFilter(QObject *o, QEvent *e) +{ + if(e->type() == QEvent::FocusOut) + { + QTimer::singleShot(0, this, SLOT(realRename())); + } + if (e->type() == QEvent::KeyPress) + { + QKeyEvent *ke = static_cast(e); + switch (ke->key()){ + case Qt::Key_Enter: + case Qt::Key_Return: + QTimer::singleShot(0, this, SLOT(realRename())); + return true; + case Qt::Key_Escape: + QTimer::singleShot(0, this, SLOT(cancelRename())); + return true; + } + } + return QWidget::eventFilter(o, e); +} + +void HistoryConfig::viewChanged(QWidget *w) +{ + int cur = cmbStyle->currentIndex(); + if ((cur < 0) || (!m_styles.size())) + return; + if (w == preview){ + if (!m_styles[cur].bCustom) + return; + if (m_bDirty){ + m_styles[cur].text = unquoteText(edtStyle->toHtml()); + fillPreview(); + } + }else{ + QString xsl; + if (m_styles[cur].text.isEmpty()){ + QString name = STYLES; + name += m_styles[cur].name; + name += EXT; + name = m_styles[cur].bCustom ? user_file(name) : app_file(name); + QFile f(name); + if (f.open(QIODevice::ReadOnly)){ + QTextStream ts(&f); + xsl = ts.readAll(); + }else{ + log(L_WARN, "Can't open %s", qPrintable(name)); + } + }else{ + xsl = m_styles[cur].text; + } + edtStyle->setText(quoteString(xsl)); + QTimer::singleShot(0, this, SLOT(sync())); + } +} + +void HistoryConfig::textChanged() +{ + m_bDirty = true; + int cur = cmbStyle->currentIndex(); + if ((cur < 0) || (!m_styles.size())) + return; + m_styles[cur].bChanged = true; +} + +void HistoryConfig::fillPreview() +{ + m_bDirty = false; + int cur = cmbStyle->currentIndex(); + if ((cur < 0) || (cur >= (int)m_styles.size())) + return; + XSL *xsl = new XSL(m_styles[cur].name); + if (!m_styles[cur].text.isEmpty()) + xsl->setXSL(m_styles[cur].text); + Contact *contact = getContacts()->contact(0, true); + contact->setName("Buddy"); + contact->setFlags(CONTACT_TEMP); + edtPreview->clear(); + edtPreview->setXSL(xsl); + time_t now = time(NULL); + bool saveSmiles = CorePlugin::instance()->value("UseSmiles").toBool(); + bool saveOwn = CorePlugin::instance()->value("OwnColors").toBool(); + CorePlugin::instance()->setValue("UseSmiles", chkSmile->isChecked()); + CorePlugin::instance()->setValue("OwnColors", chkOwn->isChecked()); + Message m1; + m1.setId((unsigned)(-1)); + m1.setFlags(MESSAGE_RECEIVED | MESSAGE_LIST); + m1.setText(i18n("Hi! ;)")); + m1.setTime(now - 360); + m1.setContact(contact->id()); + edtPreview->addMessage(&m1); + Message m2; + m2.setId((unsigned)(-2)); + m2.setText(i18n("Hi!")); + m2.setTime(now - 300); + m2.setContact(contact->id()); + edtPreview->addMessage(&m2); + Message m3; + m3.setId((unsigned)(-3)); + m3.setText(i18n("Colored message")); + m3.setTime(now - 120); + m3.setFlags(MESSAGE_SECURE | MESSAGE_URGENT | MESSAGE_RICHTEXT); + m3.setBackground(0xC0C0C0); + m3.setForeground(0x008000); + m3.setContact(contact->id()); + edtPreview->addMessage(&m3); + Message m4; + m4.setId((unsigned)(-4)); + m4.setText(i18n("New message")); + m4.setFlags(MESSAGE_RECEIVED); + m4.setTime(now - 60); + m4.setContact(contact->id()); + edtPreview->addMessage(&m4, true); + StatusMessage m5; + m5.setId((unsigned)(-5)); + m5.setStatus(STATUS_OFFLINE); + m5.setTime(now); + m5.setContact(contact->id()); + if (getContacts()->nClients()) + m5.setClient((getContacts()->getClient(0)->name() + '.')); + edtPreview->addMessage(&m5); + delete contact; + CorePlugin::instance()->setValue("UseSmiles", saveSmiles); + CorePlugin::instance()->setValue("OwnColors", saveOwn); +} + +void HistoryConfig::toggledDays(bool bState) +{ + lblDays->setEnabled(bState); + lblDays1->setEnabled(bState); + edtDays->setEnabled(bState); +} + +void HistoryConfig::toggledSize(bool bState) +{ + lblSize->setEnabled(bState); + lblSize1->setEnabled(bState); + edtSize->setEnabled(bState); +} + +void HistoryConfig::toggledExtViewer(bool bState) +{ + edtExtViewer->setEnabled(bState); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "historycfg.moc" +#endif +*/ + diff --git a/plugins/_core/historycfg.h b/plugins/_core/historycfg.h new file mode 100644 index 0000000..6c4b77e --- /dev/null +++ b/plugins/_core/historycfg.h @@ -0,0 +1,73 @@ +/*************************************************************************** + historycfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _HISTORYCFG_H +#define _HISTORYCFG_H + +#include + +#include "simgui/qcolorbutton.h" +#include +#include "ui_historycfgbase.h" + +class CorePlugin; +class QSyntaxHighlighter; + +struct StyleDef +{ + QString name; + QString text; + bool bCustom; + bool bChanged; + bool operator < (const StyleDef &s) const { return name < s.name; } +}; + +class HistoryConfig : public QWidget, public Ui::HistoryConfigBase +{ + Q_OBJECT +public: + HistoryConfig(QWidget *parent); + ~HistoryConfig(); +public slots: + void apply(); + void styleSelected(int); + void copy(); + void rename(); + void del(); + void realDelete(); + void realRename(); + void cancelRename(); + void viewChanged(QWidget*); + void textChanged(); + void toggled(bool); + void toggledDays(bool); + void toggledSize(bool); + void toggledExtViewer(bool); +protected: + void fillPreview(); + bool eventFilter(QObject *o, QEvent *e); + void addStyles(const QString &dir, bool bName); + void fillCombo(const QString ¤t); + bool m_bDirty; + int m_cur; + int m_edit; + std::vector m_styles; + QSyntaxHighlighter* highlighter; +}; + +#endif + diff --git a/plugins/_core/historycfgbase.ui b/plugins/_core/historycfgbase.ui new file mode 100644 index 0000000..16fa904 --- /dev/null +++ b/plugins/_core/historycfgbase.ui @@ -0,0 +1,372 @@ + + + + + HistoryConfigBase + + + + 0 + 0 + 587 + 340 + + + + Form1 + + + + 11 + + + 6 + + + + + + + + + + + + 1000 + + + + + + + Mb + + + false + + + + + + + + + + + + + + 1000 + + + + + + + days + + + false + + + + + + + 0 + + + 6 + + + + + + 7 + 0 + + + + true + + + + + + + &Copy + + + + + + + &Rename + + + + + + + &Delete + + + + + + + + + + &Preview + + + + 11 + + + 6 + + + + + + + + + &Source + + + + 0 + + + 0 + + + + + + + + + + + + Keep history + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + Use &own colors and fonts settings + + + + + + + Max history file size + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + 0 + + + 6 + + + + + Use external viewer + + + + + + + + 3 + 0 + + + + + + + + + + 0 + + + 6 + + + + + + + + false + + + + + + + + 100 + + + + + 50 + + + + + 20 + + + + + + + + + 7 + 1 + + + + + + + false + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + Use emotional &icons + + + + + + + Show user avatar + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    + + TextEdit + QWidget +
    simgui/textshow.h
    + + -1 + -1 + + 0 + + 7 + 7 + + image1 +
    + + MsgViewBase + QWidget +
    msgview.h
    + + -1 + -1 + + 0 + + 7 + 7 + + image1 +
    +
    + + chkOwn + chkSmile + chkSize + chkDays + edtSize + edtDays + cmbPage + cmbStyle + btnCopy + btnRename + btnDelete + tabStyle + + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + +
    diff --git a/plugins/_core/historywnd.cpp b/plugins/_core/historywnd.cpp new file mode 100644 index 0000000..f1af2f5 --- /dev/null +++ b/plugins/_core/historywnd.cpp @@ -0,0 +1,464 @@ +/*************************************************************************** +historywnd.cpp - description +------------------- +begin : Sun Mar 17 2002 +copyright : (C) 2002 by Vladimir Shutoff +email : vovan@shutoff.ru +***************************************************************************/ + +/*************************************************************************** +* * +* 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. * +* * +***************************************************************************/ + +#include "simapi.h" + +#include "icons.h" +#include "log.h" + +#include "historywnd.h" +#include "core.h" +#include "msgview.h" +#include "history.h" +#include "contacts/contact.h" +#include "contacts/client.h" +#include "simgui/toolbtn.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef USE_KDE +#include +#define QFileDialog KFileDialog +#else +#include +#endif + +#include + +using namespace SIM; + +class HistoryProgressBar : public QWidget +{ +public: + HistoryProgressBar(QWidget *parent); + void setTotalSteps(unsigned); + void setProgress(unsigned); +protected: + QProgressBar *m_bar; + QHBoxLayout *m_lay; + QLabel *m_label; +}; + +HistoryProgressBar::HistoryProgressBar(QWidget *parent) +: QWidget(parent) +, m_bar (new QProgressBar(this)) +, m_lay (new QHBoxLayout(this)) +, m_label (new QLabel(i18n("Loading"), this)) +{ + m_lay->setSpacing(4); + m_lay->addSpacing(4); + m_lay->addWidget(m_label); + m_lay->addWidget(m_bar); +} + +void HistoryProgressBar::setTotalSteps(unsigned n) +{ + m_bar->setMaximum(n); +} + +void HistoryProgressBar::setProgress(unsigned n) +{ + m_bar->setValue(n); +} + +HistoryWindow::HistoryWindow(unsigned long id) +: m_status(statusBar()) +, m_view(new MsgViewBase(this, NULL, id)) +, m_avatar_bar(NULL) +, m_progress(NULL) +, m_it(NULL) +, m_id(id) +, m_page(0) + +{ + m_history_page_count=CorePlugin::instance()->value("HistoryPage").toUInt(); + + setAttribute(Qt::WA_DeleteOnClose, true); + setWindowIcon(Icon("history")); + setName(); + setCentralWidget(m_view); + + setIconSize(QSize(16,16)); + + EventToolbar eHistoryBar(ToolBarHistory, this); + eHistoryBar.process(); + + m_bar=eHistoryBar.toolBar(); + m_bar->setParam((void*)m_id); //UAAARGH turns my stomach, Fixme + + //restoreToolbar(m_bar, CorePlugin::instance()->data.HistoryBar); + connect(m_bar, SIGNAL(movableChanged(bool)), this, SLOT(toolbarChanged(bool))); + addToolBar(m_bar); + + Command cmdHistory; + cmdHistory->id = CmdHistoryFind; + cmdHistory->param = (void*)m_id; //Fixme ... + EventCommandWidget eHistoryWidget(cmdHistory); + eHistoryWidget.process(); + + CToolCombo *cmbFind = qobject_cast(eHistoryWidget.widget()); + if(cmbFind) + { + const QStringList history = CorePlugin::instance()->value("HistorySearch").toString().split(';'); + cmbFind->addItems(history); + cmbFind->setText(QString()); + } + + m_bDirection = CorePlugin::instance()->value("HistoryDirection").toBool(); + m_bar->checkState(); + m_bar->show(); + + if(CorePlugin::instance()->value("ShowAvatarInHistory").toBool()) + { + unsigned j = 0; + QImage img; + while(j < getContacts()->nClients()) + { + Client *client = getContacts()->getClient(j++); + img = client->userPicture(id); + if (!img.isNull()) + break; + } + + if(!img.isNull()) + { + EventToolbar(ToolBarHistoryAvatar, EventToolbar::eAdd).process(); + EventToolbar e(ToolBarHistoryAvatar, this); + e.process(); + m_avatar_bar = e.toolBar(); + m_avatar_bar->setOrientation(Qt::Vertical); + addToolBar(m_avatar_bar); + + //m_avatar_bar->setHorizontalStretchable(false); + //m_avatar_bar->setVerticalStretchable(false); + m_avatar_bar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + //restoreToolbar(m_avatar_bar, CorePlugin::instance()->data.HistoryAvatarBar); + + Command cmd; + cmd->id = CmdHistoryAvatar; + cmd->bar_id = ToolBarHistoryAvatar; + cmd->bar_grp = 0x2000; + cmd->text = QString::null; + cmd->icon = "empty"; + cmd->flags = BTN_LABEL; + + EventCommandCreate(cmd).process(); + + Command cmdw; + cmdw->id = CmdHistoryAvatar; + EventCommandWidget eWidget(cmdw); + eWidget.process(); + CToolLabel *lblAvatar = qobject_cast(eWidget.widget()); + + if(lblAvatar) + { + lblAvatar->setPixmap(QPixmap::fromImage(img)); + } + m_avatar_bar->checkState(); + m_avatar_bar->show(); + //m_avatar_bar->area()->moveDockWindow(m_avatar_bar, 0); + } + } + + fill(); +} + +HistoryWindow::~HistoryWindow() +{ + delete m_avatar_bar; + delete m_it; + delete m_progress; //?? + delete m_bar; //?? + delete m_view; //?? +} + +void HistoryWindow::setName() +{ + QString name; + Contact *contact = getContacts()->contact(m_id); + if (contact) + name = contact->getName(); + setWindowTitle(i18n("History") + ' ' + name); +} + +bool HistoryWindow::processEvent(Event *e) +{ + switch(e->type()) { +case eEventContact: + { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + if (contact->id() != m_id) + break; + switch(ec->action()) + { + case EventContact::eDeleted: + QTimer::singleShot(0, this, SLOT(close())); + break; + case EventContact::eChanged: + setName(); + break; + default: + break; + } + break; + } +case eEventCheckCommandState: + { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->id == CmdHistoryDirection && (unsigned long)(cmd->param) == m_id) + { + cmd->flags &= ~COMMAND_CHECKED; + if (m_bDirection) + cmd->flags |= COMMAND_CHECKED; + return true; + } + if (cmd->id != CmdDeleteMessage && cmd->id != CmdCutHistory || cmd->param != m_view || !m_view->currentMessage()) + return false; + + cmd->flags &= ~COMMAND_CHECKED; + return true; + } +case eEventCommandExec: + { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((unsigned long)(cmd->param) != m_id) + return false; + if (cmd->id == CmdHistoryDirection) + { + bool bDirection = ((cmd->flags & COMMAND_CHECKED) != 0); + CorePlugin::instance()->setValue("HistoryDirection", bDirection); + if (bDirection != m_bDirection) + { + m_bDirection = bDirection; + m_page = 0; + m_states.clear(); + fill(); + } + return true; + } + if (cmd->id == CmdHistoryNext) + { + if (m_page + 1 < m_states.size()) + { + m_page++; + fill(); + } + return true; + } + if (cmd->id == CmdHistoryPrev) + { + if (m_page > 0) + { + m_page--; + fill(); + } + return true; + } + if (cmd->id == CmdHistorySave) + { + QString str = QFileDialog::getSaveFileName(this, QString::null, QString::null, i18n("Textfile (*.txt)")); + if(!str.isEmpty()) + { + bool res = true; + if (QFile::exists(str)) + { + QMessageBox mb(i18n("Error"), i18n("File already exists. Overwrite?"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::No, + QMessageBox::Cancel | QMessageBox::Escape); + mb.setButtonText(QMessageBox::Yes, i18n("&Overwrite")); + mb.setButtonText(QMessageBox::No, i18n("&Append")); + switch (mb.exec()) + { + case QMessageBox::Yes: + res = History::save(m_id, str, false); + break; + case QMessageBox::No: + res = History::save(m_id, str, true); + break; + case QMessageBox::Cancel: + break; + } + }else + res = History::save(m_id, str); + if (!res) + QMessageBox::critical(this, i18n("Error"), i18n("Save failed"), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); + } + return true; + } + if (cmd->id == CmdHistoryFind) + { + m_filter.clear(); + if (cmd->flags & COMMAND_CHECKED) + { + Command cmd; + cmd->id = CmdHistoryFind; + cmd->param = (void*)m_id; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolCombo *cmbFind = qobject_cast(eWidget.widget()); + QString text = cmbFind->lineEdit()->text(); + if (cmbFind && !text.isEmpty()) + { + addHistory(text); + m_filter = text; + } + } + m_page = 0; + m_states.clear(); + m_view->setSelect(m_filter); + fill(); + return true; + } + break; + } + default: + break; + } + return false; +} + +void HistoryWindow::resizeEvent(QResizeEvent *e) +{ + QMainWindow::resizeEvent(e); + //CorePlugin::instance()->data.HistorySize[0].asULong() = width(); + //CorePlugin::instance()->data.HistorySize[1].asULong() = height(); +} + +void HistoryWindow::toolbarChanged(QToolBar*) +{ + //saveToolbar(m_bar, CorePlugin::instance()->data.HistoryBar); + //saveToolbar(m_avatar_bar, CorePlugin::instance()->data.HistoryAvatarBar); +} + +void HistoryWindow::fill() +{ + log(L_DEBUG, "Fill"); + if (m_it == NULL) + m_it = new HistoryIterator(m_id); + if (m_progress == NULL) + { + m_progress = new HistoryProgressBar(m_status); + m_status->addWidget(m_progress, 1); + } + m_it->setFilter(m_filter); + m_progress->setTotalSteps(m_history_page_count); + m_progress->setProgress(0); + m_progress->show(); + m_nMessages = 0; + if (m_bDirection) + m_it->end(); + else + m_it->begin(); + if (m_states.size()) + m_it->setState(m_states[m_page]); + else + m_states.push_back(m_it->state()); + m_view->setText(QString::null); + QTimer::singleShot(0, this, SLOT(next())); + Command cmd; + cmd->id = CmdHistoryNext; + cmd->flags = COMMAND_DISABLED; + cmd->param = (void*)m_id; + EventCommandDisabled(cmd).process(); + cmd->id = CmdHistoryPrev; + cmd->flags = (m_page > 0) ? 0 : COMMAND_DISABLED; + EventCommandDisabled(cmd).process(); +} + +void HistoryWindow::next() +{ + if ( m_it == NULL ) + return; + + //Quickfix Noragen, Stop at 1000 Messages, if there are Problems with storing the size. + if (m_history_page_count > 1000) + m_history_page_count=1000; + + m_progress->setTotalSteps(m_history_page_count); + + for (;;) + { + QString state = m_it->state(); + Message *msg = NULL; + if (m_bDirection) + msg = --(*m_it); + else + msg = ++(*m_it); + + if (++m_nMessages > m_history_page_count && msg) + { + Command cmd; + cmd->id = CmdHistoryNext; + cmd->flags = 0; + cmd->param = (void*)m_id; + EventCommandDisabled(cmd).process(); + msg = NULL; + if (m_page+1>=m_states.size()) + m_states.push_back(state); + } + + if (msg == NULL) + break; + + m_view->addMessage(msg, false, false); + m_progress->setProgress(m_nMessages); + } + + delete m_progress; + delete m_it; + m_it = NULL; + m_progress = NULL; + log(L_DEBUG, "Stop"); +} + +const unsigned MAX_HISTORY = 10; + +void HistoryWindow::addHistory(const QString &str) +{ + QStringList l = CorePlugin::instance()->value("HistorySearch").toString().split(';'); + l.removeAll(str); + l.prepend(str); + + QString res; + unsigned i = 0; + Q_FOREACH(const QString &str, l) + { + if (i++ > MAX_HISTORY) + break; + if (!res.isEmpty()) + res += ';'; + res += quoteChars(str, ";"); + } + CorePlugin::instance()->setValue("HistorySearch", res); +} + diff --git a/plugins/_core/historywnd.h b/plugins/_core/historywnd.h new file mode 100644 index 0000000..18668c6 --- /dev/null +++ b/plugins/_core/historywnd.h @@ -0,0 +1,67 @@ +/*************************************************************************** + historywnd.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _HISTORYWND_H +#define _HISTORYWND_H + +#include +#include "event.h" + +#include +#include +#include +#include + +class MsgViewBase; +class CToolBar; +class QToolButton; +class QComboBox; +class HistoryProgressBar; +class HistoryIterator; + +class HistoryWindow : public QMainWindow, public SIM::EventReceiver +{ + Q_OBJECT +public: + HistoryWindow(unsigned long id); + ~HistoryWindow(); + unsigned long id() { return m_id; } +protected slots: + void toolbarChanged(QToolBar*); + void fill(); + void next(); +protected: + virtual bool processEvent(SIM::Event*); + void resizeEvent(QResizeEvent*); + void setName(); + void addHistory(const QString &str); + QStatusBar *m_status; + MsgViewBase *m_view; + CToolBar *m_bar; + CToolBar *m_avatar_bar; + QString m_filter; + HistoryProgressBar *m_progress; + HistoryIterator *m_it; + bool m_bDirection; + unsigned m_nMessages; + unsigned long m_id; + unsigned m_page; + std::vector m_states; + unsigned m_history_page_count; +}; + +#endif diff --git a/plugins/_core/icq5.1/0.png b/plugins/_core/icq5.1/0.png new file mode 100644 index 0000000000000000000000000000000000000000..070f91a423ddd9190d90c002b9f5dc819913a4a0 GIT binary patch literal 4426 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 Q^#A|>07*qoM6N<$f<)3@761SM literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/1.png b/plugins/_core/icq5.1/1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac3a8e03b65d1ab72c0194810fd4bb3fb19768f GIT binary patch literal 4221 zcmV-@5Q6WCP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}000G;NklwA4|#|b#DA*q`N zf)ddJbsGpE6%|FI&^9hb1tA`)N<};%p(6G6ftM7-1LA=`fJ(~)NC<)W2o#9|ZA{}f zY5L)|QJh{UHO6*qUtizvyL6e(U(3PKj~6eu zPrUg24QqXED}t>iZuWmuU)iMIHhQpl+vvgKX5;_K=gP`fApehg%@B5ix`ti?;iX%~>FRwp5DDuXmm;A!| zRRsE#VcFJhW9<71SOXB%Ah-zaSx9{Hdv2mS`Fp~Z3m}THx&T9Wrjx@mG|zM3_D42^ zH*-0-8)Ud{1n~BNKMQdaqB?|C2y5uJOEw49SAT~)xDUqzy7xjbpDv<4P1db#ID*XO zhSsQ)-JJ)21~e1GS_=S`ljJ*q3W_ zrtWUsfn!@(eeW2xlh7$c6hNnzetre~C9EzD-4KX7m^M(IfaV3_Mo4|?ZNv{SGv=ib zjTbx_8gxngg!}-Y0l@-vR#BlrSP7A!m69c3I~tBF5C_!C&=WN%onEE7GJtmDmyn!7 zEl%Ohz0P>SlMFyM=MejTdM^}IixHKnChZ`H^xuGppppcYD2&PsP$6knL7?=e(CWRH zp8Fm~*L9Rq#8HG)%d~#=sWe2cXLE5SqB=7`b80)*&;feyyO+W1KTMnmjYflR&tbK6 zkw$4AW9nHdXD5j39{JsOkvsedre$MfOnl#`)$Y(Y@Lo!g-h-u=BmAaI(7hM?$amQ` z_9))20|+`#KJ_#1IWoper(YqL@29J08}a_bD0IwEe+&1HZ(~|Emfb}Z#XRxTC%OBc zBb<8aWmqF=I7GD%|MC?c5nB|EffoE{w~tI;ez&GJv0WN&`} z-Lz4DljhSuq@%x;+Q=##KC%Il1&#}o4+hliIDNwA?5=qHa+D>^XG$xWlz;d(Y&EQm^XFt;4?qu;FJhl*SFbkUpD zL1_%+GzRk-k|bj03h-;@MQdj=up>uC(?JR6X9J3}9d5bNp|4v@L#`l+6H4Ve)AP-% z1%Io=YfbishP%n;96Z;?%49$kogk*&3TV`Q<`(_Uvx#?;*}a?eKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}000OqNkliV zo0ifPOR2U4wGKBO$3ajS5X2eA2WK)e%s5pa6a_{^r`S>}X{RZr zG);3kIU)Cxb3gm+y_XLsO)2dl>t(Hny}sZ2{%igBx0WK2e4f_Zs(`y;&4#b*LWDRHfp<3qJrE$fZiUzT(fEy?mz!baT(BgD-)=ECLSoc;uS)JBk1O50nPLECwuKc@0$WEUaK+KMV|$ zNkYz6iKR`XA`mL50qE~ba!o5(T^l(Ud7tjxDPBVCM;hDWPsK- zsN4c>9?m^OVo)cVEGM(}Hte#dMFs5VdWcPDXjua8=Ia@a97DShd{b$fqsO4M2!wklx@eG@W4>2ly z1pq*#4@?7+IfIFDm8yD(rzO+*9Ci{)Q-33!_u$6E78?1T+hgVx*Qmz#oVj>HTM!z9AHKEI{p#U zD{rEBX*;IJgU9Pf({=28eo-d5YBTwf`Q-jQoS|kFsI7MaXhRJjL_Vdi1y*zO5ecXT7ZKzg33|ZHTjfUeEf~x>i2@`gG zA1a#AG@Zt!E2*kqN+?`I$>y&y+q{vf508?~qyWfUIezln=QtCM@x)Vmu=9Cb$1bE$ zT#hSM%o}`k?@lQyfGss-eJcQ!H4PYs$yaXw4rOI+q|zDOk}C2$9z-T%Fg;2lKF94h zc2gD5*}8oz*-VODHha;no{K~6)4v2w(-E4ES>Ykj7$lL+VcS;0l~x7`WHV_Vy!#Gz z?bu3nO)c|tGbG}3h56Ix(5nTpPXb(FqeeeK*0f^VdGc0{y+7McA`!<>UE+=dfSHNm z&W(`^*At(PP$VEZahBvlF#Y2*cs_iC@@0NvlbMSECz!*x|L3rJJCn{%Xl_B%bPUyH zB02(q@8p}5wX8w-G-9tm1xS$YLhpcU6Q~VSd`$y>YXBxck%6zmVMTg|O@CA?#efCsITsUNc>6=$_#(pC|I^b}|&XgcGuEYJUEh>ax~YVUXu z%~yiew~t@<4)fTJDufU?gMFm?-{yr8 zFKT9vFJ9$mRb7BcQnL5mS?+2v@N9bsMO9ISKvh)8C3*STA8~)@yP&B^UFFcf&!fFM z-p##jI!<^AmSrJ?Ks2tQXvtdc*95uuUSi+T2&bcyoJ@GRrz3=R{Wox37Zq>;1gK_! zDYuTki5jl0n^=@dY*^p*SmzDfkwyS1U0mrRr9?^>>AGmOt+aNo!KYZ%=Eiv8bc%-Y zckos=pm>9qc&J^Ca%6Ctj@l^{p)xWwSJ(r~SB9{12vRW(t! zVF#;Y<3tba;pyMM$c?osE7xvBTh;}@JN@Sgc`~4aRF#XHoVTn(Fvr2s3J@V2gwU|# z(^&Bs-sPQ~?mxvZAN17A1S+FFbwVC@sZ(T(`QJXmW~&)((N9EFL7WVSU#< zzVQ=gQB}PrRlOjMlt?MbCuYdaMDf)vN9ZP@(o&?93=Rx{Swu3OPzi-Xs6vpehwFj zS-BM3cCoBnAtNh?EUIMnH-CtocP_67`qeu~d4lX}9OmGOb0iMD$9@!3yudLH;^m^QFcS z`sYH7&Ih=y(IUTcE2^&;Ar^e233S6;0BZc^SHBv0{D~(UFU#QZC!TBsc!Y)hIfYR8F=k2wuO@vwO)r)xdPz|Kq(kD5t;tX>-*<@8@!zS*2snN zoo&H7*}h#BLK}JhkAGTRsPcIqApfsjkoJ=*0Q_$NW~q{Lh5oVy00000NkvXXu0mjf D{dE*9 literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/11.png b/plugins/_core/icq5.1/11.png new file mode 100644 index 0000000000000000000000000000000000000000..115a11227fb5d8057c1de7f541edde13370815b6 GIT binary patch literal 4482 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 UyVbtXPXGV_07*qoM6N<$f|R~|lmGw# literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/12.png b/plugins/_core/icq5.1/12.png new file mode 100644 index 0000000000000000000000000000000000000000..63aa14e5017f9d623bdb67670d0b03efe47e256c GIT binary patch literal 4436 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 q6VI*bER+IhE literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/14.png b/plugins/_core/icq5.1/14.png new file mode 100644 index 0000000000000000000000000000000000000000..ee0606beca6afb6dbb9786d004c50413552ef3fc GIT binary patch literal 4636 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 O0000OD literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/21.png b/plugins/_core/icq5.1/21.png new file mode 100644 index 0000000000000000000000000000000000000000..eeac0e97bd55c7ec50b0c12f4174ad7f0ee5a2ee GIT binary patch literal 4137 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 bUjGgNWW(K9gNJ|z00000NkvXXu0mjfd0}}C literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/24.png b/plugins/_core/icq5.1/24.png new file mode 100644 index 0000000000000000000000000000000000000000..e834d583d1015cf1304c8f272452ca4ce9a3bd9a GIT binary patch literal 4368 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 KMNUMnLSTY1vQ3`= literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/25.png b/plugins/_core/icq5.1/25.png new file mode 100644 index 0000000000000000000000000000000000000000..f2166c69448e8a92de0396bf7dbd272897440356 GIT binary patch literal 4092 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/3.png b/plugins/_core/icq5.1/3.png new file mode 100644 index 0000000000000000000000000000000000000000..909288a7cc537b2cad528497d214e51c10bc0cd6 GIT binary patch literal 4377 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 T7meZS00000NkvXXu0mjf!8bXZ literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/4.png b/plugins/_core/icq5.1/4.png new file mode 100644 index 0000000000000000000000000000000000000000..f075a9d7a00fffc7a72f6a5bdbe6bf3daf41602e GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/8.png b/plugins/_core/icq5.1/8.png new file mode 100644 index 0000000000000000000000000000000000000000..70010e2be6b354989a456e677c2541d79ffc40fd GIT binary patch literal 4555 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/9.png b/plugins/_core/icq5.1/9.png new file mode 100644 index 0000000000000000000000000000000000000000..e5cea65a2380da898765e81292a809789af09bd0 GIT binary patch literal 4574 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 IM6N<$f+5su)&Kwi literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5.1/icondef.xml b/plugins/_core/icq5.1/icondef.xml new file mode 100644 index 0000000..8b06544 --- /dev/null +++ b/plugins/_core/icq5.1/icondef.xml @@ -0,0 +1,149 @@ + + + + SIM smiles + 0.9.6 + SIM smiles. + Vladimir Shutoff + 2004-06-11 + http://sim-im.org/ + + + :-) + :) + =) + 0.png + + + :-( + :( + 1.png + + + ;-) + ;) + 2.png + + + :-P + 3.png + + + *JOKINGLY* + 4.png + + + :'-( + :'( + 5.png + + + *KISSED* + 6.png + + + :-{} + :-* + :{} + 7.png + + + :-") + :-[ + :-< + :< + 8.png + + + 0:-) + O:-) + 0-) + O-) + 9.png + + + :-X + :-x + 10.png + + + :-| + :-! + :-$ + 11.png + + + :-@ + >:0 + >:O + >:o + 12.png + + + :-D + :D + 13.png + + + :-/ + :-\ + 14.png + + + :-0 + :-O + :=0 + :=O + =-0 + =-O + 15.png + + + 8-) + 16.png + + + [:-} + 17.png + + + *TIRED* + 18.png + + + :*) + 19.png + + + *STOP* + 20.png + + + *KISSING* + 21.png + + + ]:-> + 22.png + + + @}->-- + 23.png + + + @= + 24.png + + + *THUMBS UP* + 25.png + + + *DRINK* + 26.png + + + *IN LOVE* + 27.png + + diff --git a/plugins/_core/icq5/00.png b/plugins/_core/icq5/00.png new file mode 100644 index 0000000000000000000000000000000000000000..1730ff324f73b7c79d44b861c7a73465f4895332 GIT binary patch literal 745 zcmVP000>X0{{R3^EY)-00004XF*Lt006O% z3;baP0003IP)t-s0RRB3hBUOAoaDkJ%*KrW|Nr#fEYzwTbVf9kZZ!1fM8v900002& z(k$GzB>d_$gjO`%&dmJwT#RO9{Pujzo*eATEcD_$+^!tFo_NoO(30l04+TB>eI;gkC)S_H1M_G_;O1+`=@hj*P5^Ox(I8 z?B?X0eti7)jJ%#SJ~FH1y^)0002IrljP?B($Dfd`diwW=sG80KBSHtcFDN z)-3$)Gynhqb--WR~W)@#xg&3SA*|=IiZ=F=-EV zJ%4Tt@)+9*8T+q|%5bP-hS_Wu_bEB?^+u&);k7dI`SQ^aHd{5fht-5o%Rf35zNH@W zJqA-U8e6RC-p8A8XSGGaZ`YUnfo00000NkvXXu0mjfu9H-p literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/01.png b/plugins/_core/icq5/01.png new file mode 100644 index 0000000000000000000000000000000000000000..92ae6120429bf30d289159c9d256c0110e8df51a GIT binary patch literal 832 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+SzC{oH>NSs54@BLjRw zTp1Y{)->sCnKkFkKAkW3bk=l*99g7N<7M*XoKH(s%$H{&Z_epVNi#XJ%4AKO%biUs zU!J*~nJ4q)n9BeE|F5i)>4`F#Q)Kexn$DebXU^<1`SQr7#?R-^r;wgBpE+GRB|$oS z=GnZtWdpSR&8?6rc_w#usce~Ka%Ppzn`HPU*^5PfaH`sn=89?-rO<)vcEhtd2>o{+&CO;-(2yvEC>CoSd8C7mf* zK!3TcY4f?WP36x!lRN8VdXh}$RM~vFrSs(0oh$oHrsTQonFq292%hXxIkHaY&%ZxU z4yiyy{(Q1o)2EYTXY%Hj4^ZUKC!ashZ2o+UX$dmjx)3%w(BB|eRys=BWIHU%Z4S6sW*-&CWRFiCPZ0V$h=al)EBF*EqA+TVH-D9 zBfdPhP7 literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/02.png b/plugins/_core/icq5/02.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ebf260557272168f2b3f6a3b926338e8bdd21e GIT binary patch literal 793 zcmWlVdrXp17{(8j<^|R&TU6S`SgZDRv7MDQbWxBJ7Zs_rh^Z0QMpg?d8(DLWs3@|` z6=UhLn_xN_vzxM}#7dc&nJKX@M3l;E!%r$ZMd$nD{k_lg>^<}5 zAe$$}eKu8blQ75DYV&ZLT*?)50cbHLqT(0;Xz95k8J`BgtxD)HTLK+ypIbw|CtOXk zervKuO1P}>^bR>0l!d$;6qbkj2s8q#%b>57?YWVRB067>C)7odevVEeB1hD|resem zbXML<8g8t_0VN^1l(-WPvssv z&!|#{ydo5llLG|$jyLDDnF%y;I@CiL6(XOVjmO9^i5YORLj!6Q7GYgoMzP;XUD9u* zW&)2Xq96y;QbDb!&g7IGe+?v00@6EX>rfE5&@pF33jV?yfhf-JVzC(r| zH8rWOH2<=02$*NKGwZ*69n2TZYk@6y6_-3uwR!S%)mBsIi;vF-$E}TN)nCrpI^En% zTOCcR`}ueO3GTydiS&z!Zq}7r;Y_}fpXV$1S@|q-rkRW{c)MOc>ni;f{%9cJOL$Ei Hiz@#EZ(w23 literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/03.png b/plugins/_core/icq5/03.png new file mode 100644 index 0000000000000000000000000000000000000000..32a1fcb47f0394cba01cc78bda91b76c16848b8a GIT binary patch literal 790 zcmV+x1L^#UP)P000>X0{{R3^EY)-00004XF*Lt006O% z3;baP0003vP)t-s0RRB3hBUOAoXox~^xiD2id=M3EdT%i#G)kp@>Jx`TNMQ4B>ei6ymDmp)-2@4B!pT_^x{0ksx-8cJk+Wj^y+Nv+B~d| zjErVv+|JDG)-;4#RLq_n#Im&9!ZiHmEC2uijAAtW_GJ9>M7)Aj{PHva007*6eB8z? zd}2hjYFza4^kgzLT008{*T-?TV0001-dOUniOss}XoPK=t<~#rZ00000?AkQ+ z<}~ceER14Iv}RL;#2d9Y_EG010qNS#tmY z3ljhU3ljkVnw%H_000McNliru)&>j@1{i}+XJ-Ha0Y^zhK~#9!rIKq;!Y~wu*~G?) zSF{tEI%KfS*??>dMi`0Lsi=h^f(n-5jsO1->_(YWzL@y-+xztGIc-lY_AddZX@6#U z$smLn;FsU+t{m~i7av8y-`qA0+q4PELkvoL!q>Gaj z(CA?m(`*l@Z{%JUMj=V(=ovC^AI@gwyQ-igI7VRm=B(rQ^f)XJ*Mw(;kju!sP_Aa> z4Gtr^D8OMRCG2gz-s@;A9Lc1f%JUz!AQAWoPcl#!(#_H)W*N?1O)!$E=_RMoyzToL zj?16KJx1o>ZozS!H%-$PFOCsb>kW1xAokZC=iJ5l;wY$Mg*R1BA1?Rvtd0u3>+nrM zQiLiFI#%NeuN8f4sV71={;9&c*ptA|pKCQN%k!+HH1*v8D3YWo(_=81kiU%57r3-T U4tb_x3IG5A07*qoM6N<$f`O@YjsO4v literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/04.png b/plugins/_core/icq5/04.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0b62773c5bee13754f43eefb7ead9316dbd4ac GIT binary patch literal 871 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+SzC{oH>NSs54@vjcoW zTp1Y{{{R2KW!9W0`&4S&bnYCA`EpBV%e0s&c_vp@$^7}`lB1;q)O%!=OOKz=muE3O zX)$-sojJ2F9Q(&FYaCC?_u&SXwq z&6h_uXEvFfnJ4q)n97@5Hb+*O{P`5KB`xL4r!PR0zf77^5~TCymdTxUGATwtDU&nX zY`#1)0ZR2GnS8mX^XFSljg-umNhWs=fdtp|^-L+#xw1^<&!>w^$>FimQ^5>IJj-Jk+ zcP3w6TEs-o?Ay~4WHTktCCAR@&oi4d+dvNZ z^DX8`QOTcwf6na6`7>({Py{6S$p%P1*`?Bx1hl=SMotFEol^x;4+K+y>Ytggu$%$K z31dl+UoeBivm0q3PLj8~3quF1tOt<8S>O>_%)r1c48n{Iv*t(u1=&kHeO=kFvGMS; z@xGhX+ym5;>gnPbQgLhPq-g&`4g#&5N0YMmga|kWb}QW2u!(yk2cz~jm#0B%BN!bI zMi&?wW;iR^-xtet{dn+*G5=)Sc(uuMC1<~lXLA1gEUorW(tmXpo?|!m`|X$7Y1`Hi zUq5~4nb2sR*Ju8Fopp}PGleb2(lKoJif0tga#c8&bS8A?9n0?3 zGRNM}KEN_{vU6MJ^Ib>RO%#8m^}qALvopHr{k!_0-nODw%uRle$Pv2)U! zT)}2C$s|8}{ne=4a}%_Jo(Qh2{vx)#GC#Qg&xR#=bsY}`t88{$+`4G##8bl8cr<2) zT)n&eMRAFBE8Ctu`Mn}LoO#2OGIQT;dlDp7lvBeSqJLzvmy@FHLbPi`^M&{8dEfWp;cYYM3l=A>OacHb zF4PfaFsIFU;v5(!vW}I)G`Ct?q6Of=rG@f=c>o|<18K}h0C2V9rZaXvfJWY0q>q@! zY8c002V4|90A?-6%d?nDJ;pKA5|<$Q6yM5I?~~du8`0gPq4jje(D38Rf_#4 zeb_L5@SZ}oGz~MFuC3irfGDf4mYfSLYq_j5Xn(~M)Rrwv;?wn7k=owA?jitVOH!JedX&qQrEQzi=H&X2t>U@70rsu%v+o*e3ws`km?dymIK zOh(IppM0w7uivr#Yi7vL`Sx8O{gEn$oWoZe>May;cdvXj^!!atOZnK!$KTqlgQ>xZ znw_D}Fe`Mn3_o(a*|~hQ_xKv;!}5(iqxk*1t;!Q&n>i~rdEk!XgL`T6(+p1htlN`S zRnur=mM0BOhlSRGuBx!-@%@x+&(!G9Z8U?92v-KLC92ma79Tszzy4F^M+}|CpL%=S QZ^Ji(!hAi^m$(1SKir#gBme*a literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/06.png b/plugins/_core/icq5/06.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbf0afc0ffb2055199d3673f2840668546206e5 GIT binary patch literal 801 zcmWkqdq`7p6uy>^@FuU9!{%+F{b>F6$2o^{zVm&2=iHQt(t`ZM{V@y+ z67b1PRJV9y-CC5F6U#GD@jjI#Ou{fjZ2&Cr!7#4_5=xrlg<rY{1?Xp-3gU55y>%sDR};Z8w9?nyRUG96ABK#6xtG&LhIj@}Nu3 zIXQVe=u`n_QmH)3Qx{PPqLH9e2F;{NM{z7r7lNiMO6XF0SS)F(!AwY#tk`lq(fN}o<%r~CU08r#QX7X!YOKWd!bH>PS>y%)Aj3FzrM(~{r)Tdm#Ke;lb? zr#ksDKiReNhk6>d7OU>B(EZ&dD*s(zF;t2VFK!a9GR(o0X-Q~7S&veUkI{caI{78Y{4oa2bfHACSfRSZm1Qboi z0Jn~83ByK^5m!nb9jgTykkWKY3UQ@rkab-_0*YS}OdSs1Fq=2Q_qloZ+;?uyy}9q* zi#fWC_}CX>DT<2E)NpzdcZj|%is0HCXLCuAeyrB2DXRZU9Gr-zsAnWOydhmeQG*S% zFh&oW4MCe?V`Br)Gu3*=Z{c8!k4!W5S%}mUYf;Jw;tAANjszDyr;>WjG%Ol$hy@D^ ze<80dp2EYuXjL7BH$!7CMFw_+3=LY*}z;u8B0nvwf5 z9r20f?lhX9ppzN*p*e>FmXHuAgb?FRmPT9*_*k&>U}o!;aw7A)DuZ?!p0>d}k#Ug_ z)2K(n5Ytj-5ISfeuUJLi59HwC@g8ZP3E>GgGR9z2J*-#z9USRkO_o73*H*>NrAo1l zg@-Ij!Yl$G0uKic7CXcVaY)3LQVtIw>lY~4B~ln-BOV4iI0$f!de(gzxf_r$LAx!+ zpj`p$m3WZ}T6j@8fviyd{!6%|TCdBa4lRYtL{gfa!BH2YU(yf~b4pWihN9vUMVC+= zozIix*6K`c`qt1E*|X8FJaMBgQgbGgQyXe$KP>q+!FgV?Kli8Qo_kjxhkx;|wHJ-N zo~@?Rn~RF`^75u`1>eh=S~wn+Y5IKc(SEb%PQ^0TZ`3!+M=N@7+RA!uTQp<$wdxmD z0q`L5qH9X!nQk0!NgHo~@ zDmu$8-@W=M_RG8Yw9xZkMNHa*`*pi29%zS~C;7mi_~f2@E!UE7EKDusFZ}T4WKwEk z!rS9zrk2~5Cg-a3#P2^RNzT>fv_B~*K5*dl-=={?)jz#wQGuq<+2FJ86!_cM@_W;E z`*pXv7s9`Oww+g{>@By~9zJIo{ixg57}Gl6Qo*i2uQ&1${kRjM*-f9xOq{<)m${a0_St(!}Z-8GsNVcX2p-96!O*g6v1 zWXes^7<&^E6AbN1mz>=hL&dD*VHEzQ~#4BO9SI({-HVa7n}e DTp-AP literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/08.png b/plugins/_core/icq5/08.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6e61fcebdf0a0761201ab330ff07121e58f26e GIT binary patch literal 961 zcmW+#4NMzl7(Rl)U|S#qf7WzrmK#aqVHCdvFgFBpK#R8u>~M4II)0i?Sw$#aH87f3 znSlyjs13TVsYY30P;S^A-Ga56QtMWmW@u9pPh#{W3pPu@OP7#O@jKt-ec$JK^Zw*} zl5ezG-MGI%R)AsHewC7HMfsrQd$LjdyW&C%N{^hYJywfhUtHb`J902A>+5Eksn5bN z&I&k}QwZUlU6Y)Zi|d4`l^8q4@KGk6AUG?%ySvLdNT_9|dT4h6VO6ID=l<05eFV$GPx}px0y%4Z)FHz?E}@pI6s zLjalh8O=H9bP9;uB4jD(V4z+XnFLNFErx)u9PobpqMD9$Gr}yH?$n?WehC+10B!@Q zXPib8s=xrn*+9@cg>Z5f7uUgUbd*SM2%?9CRwnL|a|0wF1|kd6 zS{mAD=%)?UXq(1uF>x-p5XL#1foJ8zuL7qeh{Z=09t7A zeThO=#~CR;1mb@5YN>)u2!MDfhydIGVghiJjF;Lf>1wE2D zhHBDnxd?v;2y=ERLc7!;c4~wrTmox^zoiT!lx1pFAIEAoR`n9;e7TXrMsf}*5y|gW zzSfUndy6H{!d&hrP%+P>I#!>T%H3C(BWp0Uji8zHDyo)wXRWLK(>)9CVdjp$#KIJA zQe_+^-Wu)rYOLv>10@RcHD+aJr}DAooq^@bv$(?i%)^2C+wv85=bOs;fo1h@$)ILv zX!=rryXLEgAbCq89utK4jp|y0J`b+gl=F zf88dt AHUIzs literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/09.png b/plugins/_core/icq5/09.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b61779d2e14fdf294d602c7bad1fe018777af4 GIT binary patch literal 735 zcmV<50wDc~P)P000>X0{{R3^EY)-00004XF*Lt006O% z3;baP0003RP)t-s0RRB3hBUOAoaDkJ+{R?|-Yj%>{B%+*w3b|iT3pnwB>(^a{PINH z&dii(k$GzB>eVV+}4bQhV<;(T>R!dgjPhno;3XCER=F&%(gVNjx_Af zEZov$^z!taepK|@Eabifs@=WB~+>~xS{O&XW008XXWVDhr0002o(ro!^wuoox+IKdOaK4?oPK<4K0G`Q`QQKm00DGTPE!Ct=GbNc z0004EOGiWihy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF-Xf3=ahlE3vU- z0003lNkl=0QhaRz4rXO^_E9qUg_b<#1-@>I?E#Hlc_KIVSlBs=yIMSXxT&`L^{zP5seZ8 zKc7*6?9h%J?Q;JJY6q(*vKTKSXBvZq+gy?L=BDot z%DRtbDN#FB$~+GQFPtCGQMepfBeAS5HBDQpO|kF|q7*a(NdzeTJ#19ku0Q6;IX;Q{ R{^I}u002ovPDHLkV1g%FP}Beb literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/10.png b/plugins/_core/icq5/10.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb66bab4475184d7b02bb2c83ad75f2b36b719a GIT binary patch literal 892 zcmWkre@q*76u%-TWnI}1r5R0^C@ITe2Wq`JNiNzhS83_3silIFI=Awr8a!*$9m%X6 zA*6Od&ym$;KvS27U_-E(ur(yIO17hH0WV9?2DP~m8KvmfnNd&v@giQo$$KxK_x*g{ z%O`KhVs4S|Q|^NxNNzOXRBpy_E;c!Wj=Fw*1WZmPKlEXNSyv_cjuJV25m zjCR_AC!D*dX0NMK@k!c&3Pl^~Bs0@0K944b33dUEdI_P3bMtCpm-Mw_g)GX>i8JxA zhvJJoumb)e214oFf|_=UOcZ#dsR$zM0=vV}(_jlU)Jf33^n|CsG9Zg1}i7PZ{C)v1~ zUq`|&RQOAzVU)+u&8c%)&SxeHSzMIUPEc4u(l?X-vl!V!aW_;#$&rm?Q1MqN61kEi zA78Rl;z#>@!hZtUX&3Ssh_E?EEfg`a51c;o4J;Wdsl+Gj+No9?^i5Jw-KdBql-1k@ zY4g82OTb}j!J$F;s6hmkZo_*QAV~IHDI`!NdPHniP{uR*inV9=AAlunWfX{-kBqp^ zb}`#^E+(DP_ABEv6PIf{Ci?qN$Rhr!sjojJ`y>aYFPLVfkpA!|KOEI*V1ou3g5lLw zSf_w>J60Ipk=83>%#onBC0Hg4UX0PN5X1V;+uGYq?FV<5>cstlil$A~yO!S@zIoDB z7nf%mtIz*Ye${d4+D?@Ranl{{AK#Jf&pd3EZ~IrCUmlyOuQ^_MO&R#MqdiiiR5F0- z?y=qa*-^$UF1CI4)e~m%kY?O4Y4Uf8sJ zXBp`etD^Wb$hf6+#Pfoo12Zsw-gF{y?=1B9C}sX_UPEieYbc9$f!5t JH%^}$_#Z_Ie)#|Z literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/11.png b/plugins/_core/icq5/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9f4d2fea218c5e9064510a58f182416dddbeb1 GIT binary patch literal 762 zcmVP000>X0{{R3^EY)-00004XF*Lt006O% z3;baP0003jP)t-s0RRBRk{q;}oaDkJ^xiDAmUPsr9DGVN^yXZIT3nQ79L%;f!!{OUC9(kzT(G~CY2^x{0+t{i+yMC{5eyq-kNo*ewG;= zMC8&u^z!s%GBm`pwA{ip%%&uCQY_TAEd25`^x7-{006|UEQD4>w31Bx_GFxjEZoK{ z?A|oQu3Vgce4KhT?AlZS008Xfv%w30mh@?4yL zO#J@*%)Yz;004wmH2m^B^x8CxVnoEUEPPf>{Pt|Lk~H+L;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru)&>j@1TcimtsejY0XIoRK~#9!rIP(mf>vj zsb8%H1Sf8nzuF>%SQ?S$5Ue@8@^RN9fu!>v1f84X`&acc0Q(QZ8AY&}Cz`7E`vGb0 z2pciU&x~d5sBQV@t|FK?L@-whFJE+|c4jm|2vsApH`aVm8o4Gi(M%>KoBZ=iJ7a** zoza+dpHAN0zzZ`-j0hH#Ri{`k*J%b&GWZlc!}Dsl=}MSknTR}MRId9TXrzs6KLf;U zR1nlz`i^J#C${5C1BCpEP)P000>X0{{R3^EY)-00004XF*Lt006O% z3;baP0004ZP)t-s0RRA`ek{zsEZo9e+!+^yWnD z&MfrmT#RBg{OUB+zC661G`x-+?B0Cz<}`FVEVO21lmZ0g#w5hDEYzwTw30-edOU;{ z6#VjBw30N;zBJs%bi}S?bW$wLvOL_jB$Os3ImCGynhqyow~;#$@D% zgv_EG^xiCdN;KTEB&>>D?9wds>THZ+JpAr70002=>V*8}G=w%Z%zAvB0tC#mEVPnL z0002|_FUAyH008J{FR9vrliJmk70{N_CHS5Axo0004WQchCZAnByRCwB@ zlI=4BQ543LLTTNSl#*RJUM4&3tZgS`tX7R#%AhuB2WN- zLB zYh4igMnjOwq55{o;=NRPidB?^-t9EoNSd^?w2i!0)ZnxDMupYVH0KaSk4DP@m`T*~OP?g@s Ro7?~Z002ovPDHLkV1jdFi%$Rm literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/13.png b/plugins/_core/icq5/13.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a838cb870dbc755ff53fd356199c9c8381c3e0 GIT binary patch literal 920 zcmWkrVN6?96n-roFb3jkhmJj1ATNmQN;13~rq%_PS4OexSb5eBJI0{0Q5s-fQPWf+ zO=&E?!PdM8mS@$j5Wt2BJTNh}n5H2tb|iBhS?Y6fq@p7YCajrR@*>{;IQN|Iocn$G z&b_Wi&8fVc!W<04@>KPt7UhHK$j(6L)9SvnC`m5Yp035PxsiRsr9BuX@;0g|r3k|~ zJHdI_M2KKd;(S=2ii6$VU38z*QI=AIZiA^f$+^ko8i+2zpqoG=OBG(FHSzOp5Em}Yu$+Yq?h|F`zxFR-5_>F{3 zPS82IevR611-3#w;styNB;%0oFgPmk)H)Eh4E&EoBF?8a6j7^9*tQ5e6w?h^t0Lfp zf`_%#!H5r}HYv_aA^q4A8TH~!ro^EmWAi|GhP)~KRghmnmedX%G|3Sc(#3etllC95 zgD84|Fu^nssYf6%Ob1%@mNHaRfgvjSD_UG(I}TZ~ghngxKz@nf!_ZM6SxUP<}$H7!*zAlWzMh- zb#>0Gg@GK_rnE61Yq5zxlZrnd#)#q`P1d|u8aqh{!fXfis0R`$0r_W4F%$%j>5mi zc?bR-iP^K*2CF~BTwLt?O>+@{;LP{osO}H1Y3Cd!f#inO$zh_m`bT3XHT};{|BrwfwKSr literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/14.png b/plugins/_core/icq5/14.png new file mode 100644 index 0000000000000000000000000000000000000000..c9528763bb680058054e2e86f973d9506c385b49 GIT binary patch literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+SzC{oH>NS%LhY0X`wF zj0_BG+Dx|0n)Bq4%AZd$U+(Gr|Nph1MkZVOO#XaJ=}Gee8ujMclP!~M{(S41Q&;ok9MC$GKc7N+l0cU3 zS+?ZKF_k~xV!k{wS<}~3<7M;Zna`hhCP1k#*L0rTy0fOu=g+s6KhJDhqC)O$Qkhaz za%7Rpn{z;Cl>GVR(-LR%=ii?*`}WiX*?`>q2}I`D*=(6)GNs7p$u5=i4y$eeg&0eM z{DK)Ap4~_Tagw~FdgVjg5z&h0k^E zhAlun+MX_sAr-flPI~LtY#`ER?xj2{H|3RsT}#x8SvxgPU(nPnp8e=ek6`(K@nmh* zz>m}OFVETHf3Nt~ylqkcg@m&1)G~_L{9ke+xo7Fzy`3F#yoz(z2d9;YOeeXmZowb(3a>E-mCxi46$n)ykrY{%WX?_30sZ%K`i=OWe z5GvUd_S`$!a)0>ZZwm`=AG6RAh;m5}tG^Py@q+ezPtR}4S6|s%a*8o`M^4svLY`_uC?a9 z(fQ)QmZr(C9$wH|w#|m=%z*{>*m9*W3*0+k(7pZE_iGCs%{dr2!fvhaQ%=d6m1*{; fWq+MVvmJxrREySWoA#9eLz2PM)z4*}Q$iB}B%M3W literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/15.png b/plugins/_core/icq5/15.png new file mode 100644 index 0000000000000000000000000000000000000000..1e71f2e5018755315572c436dc84293da162cba3 GIT binary patch literal 692 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+SzC{oH>NS%LgN0X`wF zj0_B0CYfxRHRs78l{3eBzTDH9(-u?XWpZVeOiNVElsuC+w?e)=b9r+~XV0pTo+Ohk zlYIXF|9@wj%9(jGcg~%8b4sVi&*jZ68<2UQV!k}GnNn2p<(3YRdt}p=GrM9+f^_a| zQt3(a`SZ!8B??HIJlUsmW|_*DPhb9g%SkaZxpTTk_F$+P)#P3O!um!2e>KkrPAEK+&%?8%#RK$rL&S*G*n zTg;zlHgoD~&g|RM5@zz}lTS~Q3&g-b|Ni9InE=^6X(>;3sVs`o^#gJkOM?7@862M7 zNCR<_yxm;OkH}&M25w;xW@MN(M*=9wUgGKN%6^TFho9L>JL1wYpdLj} z7srr_TXQGn`!^d19NVsV>X`s@sIlT_fz>@5Pt5*%aBY`?Y_Xc@r@#BVbwwmzaX+5; zDQ15BI^XKtt^Z^XEK+4NIl!XG($21apk!lz!>1kZ{gc-nmTH_mxnk-wuZPi`OXL1X zd(Qmp`LgQlC%?`Gr_)Z9+%2BIOzpI~Xr$i#cAl7|aGs@mYS;etuO2xFoGRt@K9O4*^!Uu9bywv+b1B^o6=yH=_`~sikMf(- zom=i?3ur`otl>Xj9eCI$(@b<)l^DyxJ7Kf#o}0N)qwV8i{dmqlPc3U1cl0`aQxbZX Q2Mj+3Pgg&ebxsLQ07`r@t^fc4 literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/16.png b/plugins/_core/icq5/16.png new file mode 100644 index 0000000000000000000000000000000000000000..83f5d0615f6e52bb968345668ef95d1870689284 GIT binary patch literal 782 zcmV+p1M&QcP)P000>X0{{R3^EY)-00004XF*Lt006O% z3;baP0003jP)t-s0RRA;iY&~=jLg0)^xiC_j!aZebi|@0WJ)yDzEu43RP4?yyrwk# z@U7M$G*m`R{N^lNZme`t zEX=kveVd16fZnUX;9|EX=}O#Huv>@=V;eB>e6)Og>zUay0D9EcDte0001_iagw| z9Q@`y+`=?;RxHf6JnY&uOfo$D`jq6tBme*aL;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru)&>j@11dJ}!lD2G0ZU0lK~#9!rIKk=!axj$QEQRK4FeSG(XNX1U;fp#w8Uunik5*WFF+>w2ozePJa42ncu{Ko(%>=oR=&7%Mb+-Yt0c z_(k@U_$)-A;q`ft$U{q)kBrj@|==c0b0tM2-KVhw&0*!8b3&37 zFft$(t0=k6a6l~2MUIPH(eFZuCdbrv$K0$~*7HjB042fMi)YF*c|qbV%c`TqrJdfd zJup#eyB+RY65RZ!II%m{>opa{ag>ZGPA`?Iswk?eI`a}{U&vqm04PU2hZa|W^8f$< M07*qoM6N<$f?}FvlK=n! literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/17.png b/plugins/_core/icq5/17.png new file mode 100644 index 0000000000000000000000000000000000000000..c5c2528bc1799be282c5067b0f7b11c508a618c1 GIT binary patch literal 838 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 C-%UIK literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/20.png b/plugins/_core/icq5/20.png new file mode 100644 index 0000000000000000000000000000000000000000..767c1ab45a777f37411ea929362ac712057c959c GIT binary patch literal 759 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+SzC{oH>NSs54@)dGA% zTp1Y{*0h;ynKkFhA(b!pQoh{Nsqr#d)0NT^6?5m1%avs+Z|=FwNz-|AN$1Wsl|Qdc zYW#fm%+k4Y?#!EWIz3@PahpG%T;^28JlUtRrp@NgA(KDfV!k{xxw1)RN}kJ?PhbB3 z|39UuB*n<2BuHmXSIw7aE?;f|jnet^$)qLB2I#6k-$M5Eshruj=gBdhFON*_9Pn&o_QuuZryov$pt9*WFJ)a&$kk=Duy{#Hh=#8nNwHO5(G4% z=F6*)H@8f#>;k&V=F2UcEt5>19P@c{&IG9V&nKT8JDVWQH#>nG#*!evUYh7ML)4NSq-T2Phh!?AL`)s4klrd0;0ehqENpSnjcw@%`AxH|j3S9O{h z5e!ymCAO|B)Rg;nw3UfdSCex}(BBsm`FgmP`ZQj3Se@wfZ>9ddmb3%BKNe2(x$%aj zmtuo8_ z%-J)UQ+Hfc~*tX;hgOva)NJC)e_o@y1u{EtjTJ-Z)a=1ZBLLu zkxAOO#nnfuw4yaq9;e%?AN#IFla mFK$_u`E>rh-_z?i98(W*cZoH5*C!7QSO!m5KbLh*2~7Y4?o+n_ literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/21.png b/plugins/_core/icq5/21.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb6003b988802aabb1c284a759a14ffcb3e43fe GIT binary patch literal 885 zcmW+y3rtg27(R_qYFh*%5~iXS?|k6#fjMd%cQW8&TP+RLYAjR)X^?2+y4jJ%WQ(9O z72=~pVbFB0n8vWmgj7rrNvsziwJ8>xW@#!hSewn=nOSa#i6_BxJ<0$6|L^`_7lKF@5Iwu&hbm%Hj+RuE05Eh}hU-%S5cO4R^yMM|JU>&haSD$c zStrFu;h0ks7=-u{-KnLxAcd2R=c0*s)3GDjxHTKUB@M`X31T1QXJ9;t0>j9$PFW$G&-75cpPz26tmO#9nJYEeg=iB8P*B8(v)}*h6$z} zaS?>)%xp8_?X;&2#vf4xiXAj@qht-#QH$`_6q0eAqHz>y)=)7YS%CIxm*b>fUZPh{64a06URv`CWM0kY8b0)_r#Q7ngK-?6>5hRQO5cg35^8IPZ4(P+f zFy_;6Q-oAQO4v=aF66Z#JOgnM@o&u}={OwBX<*%~jL9a6K4v zp|Rf2`^;IrZ7|@X0;6Vb6yndF?1AO@9rA3-KC466hr%N$;1*zcKg0?2q~8!Cfyk=U z?gQT>{%RD0BYTw$IG>uQBEdq7%5V|@*cKm6;ln`EX; z&6MbWj5gHeN?xUkdh%zI>+|#X44sgy-&`n?$z+#%qGGrDajjvO6uz0r`*WS5QE~k@^S<1No7S%A z@2-Ek$o5{>p0Q=ii{xTHVtIY3U~j|mtdJ_S;F)E^Qq_SpDUz(aS1s{wkJqf3_`Buh zt0gNd6^5%_=FN@&gzBm$CLz~f6P4S)({;*kXJ%I9$i-jX9|-L!Qf@2Eaw!Y1XU6lE zw2Nh;jYWpT%Cgm~&wm}uS@k@t=V<*^-$5hW-H_6iB`Qc&FZ5Dtmz_Ko`Q`f$v!y>t zbHxA7)(xP$w<>N`o%Wl~lrK9yW$bv6zT)@)w*7B;mIE%-+^`Hab=~Y^^onzL)Xn3ZntHAo-|BjSnFH$0`3964K`f&4U=W@}?Y4H(;1#Ym}h$5)6YJ z&Fj>02iP?cdwYA(#b#|pd1pIpp`e$77P_1WRT#Qvp-_>O4$nlxf{iK%*qR%pZ^UC> zU)qWzSA`2B9wLdXi-I~jWx`WdidOXt4ytUU1qTRg)aBVw#p{D!I+OSSx@Z)SUWyTc z;GzTv4M|Y8fm*d9SU^mNZx4a2oq$0Q8^F^#LI|?Z1u}L5#q%VQGKl~^=w)FvR3V9N zE1DTVD+`zT%n+W6@}hSxmJRqsz=gAJ08MPl27Ckkkf8(y#5Fh!hPF2{Fd9y|XjY>Z zBN-b03!xRjfG9X0I@|Zm$FqUg^TN@kn90*82f59z(v?%)nIG?-?K$1`MWkm8Th8mhH*Ki5?&kBu zo!>sKzWJoGie2mGRn6^=o(;2NF8S8ZzyRa9wM;ity!Kb2aQJcIx!_vBzqz_u^!q3BtzZ60`2x3dk>urUj-yLI z^NOY=Rj|WdYksNyZ8MQHzb9R&fA~Z~yEwV?UDsTjOwwGhPJ%Z)d&j;0lMycan7rov zRd?+7hOdqoX1M83l(I{|WQ{8;XACV%+Qlp5ljnbG`=&VF8$Kb4)oDv}^0!+bwH73s z9V%>yaYsj@@=s5XCcvPi<&IKSlHOFUTMj3r*ggOGlP@Gj=FwR&qn^ZNS%LgT0X`wF zj0_BWrs?R!v9w6BJUOOvM2^KIjpfTDofbWvCvq$~YAkm)sVtFV`EpIiB}=77Pvy!g zl`DEOB|$nfV1%m4rXfu;h%6*-nauS{a}SneD$$-${T81aPRJO>m0NEi$CPx;T02wYtGHcXCa*T9(l1%<6 zv6!<8TL48FOM?7@862M7NCR<_yxm;OkH}&M25w;xW@MN(M*=9wUgGKN z%6^TFho8~1A^qV$pwM1V7srr_TcsCr`I{63*b79OYrJ;Pd*_R caiOz@VX>fKzgSXs1<)f5p00i_>zopr0K}88!2kdN literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/24.png b/plugins/_core/icq5/24.png new file mode 100644 index 0000000000000000000000000000000000000000..aba0c4872f0c0f4becdf5b33f21ee1fb60f725df GIT binary patch literal 568 zcmV-80>}M{P)P000>X0{{R3^EY)-00004XF*Lt006O% z3;baP0001xP)t-s0RRAeY9wT4WX!T;G&VGReteXcluS-ctgfv5ngr~gOmuQ|L_$Q2 zij1V9q+D8Dyt=&nvIP8c9BgiEJU%>xhJ>7+oK#j+w6?U&sziKxd`wDAl#-OJs;p#U zWcL;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru)&>j@0WF%nHG=>E0TD?=K~#9!h0$SGgCGttyJl~^_?H$=|-@gS;xuTczJ7Y{TwzBg?d=JPN6eL^d z^X&)-ab+uvoe5;2$A<)jan+P%Lqjp|^bbJ_sZum6+qRvD$#S^}05a7u*Y&2Z=b>`z zp@5rmUvCbFeMyy(mrcNJ*6ue?lwYcbQejoE+zyvYQHKRgeIemO-o6NS%LhD0G|+7 zMh1p8O*&8ZseHMmb7qms|NsC0yfV47Nu?x62dL!BBb_U&ROaOAe7UBxXA(#R2<{v* z0g`_{nOxar(vxKJ<`hW$%sQPVWgy0rLn=V>$TE{RmvsKTGkLO0r6o+~%_)%JmPtTC zklr~}CSo^DMSv{Ek|4ie28U-i(mj|4DSLJlv46n&pMzm7|O8CM-UD%};Yfs>4y%nEU6slGR$HjF=u@ z&z&!JD^GofiJJGi&XcWczR%~oXK8!xoyl`PDZT5dlH2_hFPo{&dUT0x?|IH6@88b) zIMdrr%;T6ip_L8#5eSbZhL3FCV*mE;P=%{;ho7H1ov&f?s6UzTN?J OHiM_DpUXO@geCyazNB9O literal 0 HcmV?d00001 diff --git a/plugins/_core/icq5/26.png b/plugins/_core/icq5/26.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc1ad0ca1421300fb378ec94a5e61405c225cbc GIT binary patch literal 780 zcmW+yYfO@16n>encbr*h+DJF@M;F?>ty0OvP$3bFSWPV~bma1$8A} zTIQn}h#R(TBaR9o8ONN6D1E2I)(4SAqHPu% z+lXk9X4662wgGzpjiXJ-j+r$?+bA@?R-rAmzM8DROR^3?NfK4UW2o!$jh)V!R*M0d zsAy_u{`xo`!Nt6+Ms~Bc6E;=kpj9!NC7Y|E`Z~$h3$1HfLp>3%k!7%VYJs-Qc@Hl6 zF;s&_f!3O^W{8}7wSgk~5S}22d7N_~-m)NaI>MA>29Ue%XX1`$F*Cgs0Pj6cB><%= z5D&VGS*eNcCO4ul!R;8qIEMGISPVM<=3?uE0`6!S>CVUpk9V?>c-QH}k%QqPPWf34 z`xz`^$G4nL5K3blj$6+U@B{t|X$Ai}xLj`K5@Yo(D|kdh82Dsk$Y@{YmF{zm98GFx-jk0 zYFvLWjZP1Lk@whtER3gYUYvUsV5e+(9_@~*>HL<}-=~q%LPD~Gf+v|Pl$1-cU2nuc zDEEZrrrl$Kx!Hvu)7B^Fn10I9?2gR^a$1Gb@Aq&27ejJGZ7*>(Zng^6lu+bPZyz}s z$FKC}m303kEW-%*jx|t67Uy=EHojwbTT#RQ4juwxs$5n~F|+7O3L6Pw0l-O**{CG0iXFZsRS`+eW< z_j~V?cg3JTP`GvbRs=x`wHnF#>3v5k!lE@5UT&8!p+(Kb&L0SAHv z9=v2uE#YvVT6J$}D*vAM` zP?~ifa@}7B#ayTMkScd2hyMnmI6tv>81{5(sRnaT^uyMQ9pj4e+n=B6%Gp&Q{d1({ z%w!Qt3X{neN#5>tuX;4tFI!i3wJ#TqzLsI4JF<#L_w1+Bjp+1OHf2nW3J%M=Zlw5ncnaA3ZIt@gig;?ef`nlzNVDtH^JTXjh>okHMO;u zwTYk7yKg*I1|oO+j<35vE14PS%?#8P(ljkL3|fbT7jEe)G%Sn%+FY409r^YJJ#L)v z+j88rJiU6hUZ%Pj?0+!aDj81oi)nh$AllJ3)bxo+c;BEn^KXafyh2g@4Rdt*ocA8T zS*h$%s+fyL?=g$OyznIFBy(HZtm8K`(xV6KBJU+TI<@rdkCnwdd)&=}PiznhYb(hrN + + + ICQ5 smiles for SIM + 1 + ICQ5 smiles for SIM + yrtimiD + 2005-10-12 + + + + :-) + :) + =) + 00.png + + + :-( + :( + 01.png + + + ;-) + ;) + 02.png + + + :-P + 03.png + + + *JOKINGLY* + 04.png + + + :'-( + :'( + 05.png + + + *KISSED* + 06.png + + + :-{} + :-* + :{} + 07.png + + + :-") + :-[ + :-< + :< + 08.png + + + 0:-) + O:-) + 0-) + O-) + 09.png + + + :-X + :-x + 10.png + + + :-| + :-! + :-$ + 11.png + + + :-@ + >:0 + >:O + >:o + 12.png + + + :-D + :D + 13.png + + + :-/ + :-\ + 14.png + + + :-0 + :-O + :=0 + :=O + =-0 + =-O + 15.png + + + 8-) + 16.png + + + [:-} + 17.png + + + *TIRED* + 18.png + + + :*) + 19.png + + + *STOP* + 20.png + + + *KISSING* + 21.png + + + ]:-> + 22.png + + + @}->-- + 23.png + + + @= + 24.png + + + *THUMBS UP* + 25.png + + + *DRINK* + 26.png + + + *IN LOVE* + 27.png + + diff --git a/plugins/_core/icqlite/0.png b/plugins/_core/icqlite/0.png new file mode 100644 index 0000000000000000000000000000000000000000..f773dc352c2565a6f7eb21230aa0d98569be6e5f GIT binary patch literal 1656 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 LNkvXXu0mjf#xp2U literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/10.png b/plugins/_core/icqlite/10.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ea4c65fc94d42717cfa95d7a78bc00154f51b8 GIT binary patch literal 1973 zcmV;m2TJ&fP)+snxr+p3jWG!%CL#CBcj*rmq_Exd>&%(+ ze$RWJ^PKOz1S?oqR~G=Fy}ccYM1nF5lUY{2#{Y{CKg<+)p5&YIy5>~=nOV`YY!qI(7LxEeZH9SYyB@jXus$2$i>eMMjA`wVf zhK3?>-SwM&I+avBLzBUZ$}~59e|r`3o}C9x_`!(;?zkMba5^5vbi$*s)}^)7co~)9 z=Mz!GcwJsXG?`4;y?gf(Aoi70S+SmuPfQkvg0pAjT)?=NozAJwd_q^}>5-qo08b(S z0VG6(Ng0Dl8AHA3rV*aWyBhH2PO`hcsxQiEsoSyV;ndK#!iqgQfBrlgcI-5S!{Kuy z_ij|ZqZ&xBNOMp*!$Zg{g-((J^-nIRg8))0qEO}|sYt*;3pQ=_MuiLAfBJo>s;CG9 zGc$|1Jv}`DfY1N&&m1)qyStIxFQ`yH1_ciQ$gKP+3PSfGkJ!IgQ6hk+u{8W;rpEIu zq23YH=!VVC8Bq%0uh*_EQdd#Aftqf7t9>%uN6HFa3m_m2*fbqDKab0^MofgXhzk@7 zhKDEuDwacrGyyfk;mXq-lubU?5rgq`FcxWXYc%6|gop}=9$eT7>d9T@gR&KX9b#!z%7J%Hdv*4qCQARl^7=p)96)wz`!JSHnu~dp{J|A{E zonS=q2Z53Rw80>eOipI8E*HB*-qBbLBoT*{5L^qa#ubkVxw+~1?31@KI_iM_w;S-u z-|nNJe+qBT&A}K9LIFVX@&g1w9KZ~K7yyA%q$!nRN~KylM_P>~k-&9=eJaOU#4jw!Rdf~zaSS%LL@W|Lc zPn5VC8!MOa9&tMB1_xc9*JDa0gW3&BI2?AwssF9b?-thl>a$IFue}bL4LWEGa(Ss# zHRqd{;FnN0Iy@*``q$Mtt2HlWHX8sWURKipAa<**Edy}Nfd25u0SxFhfFJ^&4#IZEf#mNV0s#() z@L=TJiwp4_2&3i)M;^~j*+%&l*Tj}BH3G|ufvZpN}XES#omj>==sf*&*k7 z%pI%7If)zr0+c$#a5ZG(&zD3oyP#%Duh02l!-k6KWHKSPwzjVPIO*!@LNb|zUazBW zx5xPP*PVKeMs`}EKsiNVEfn@|R6c7awYK@+( zDJu`yUC;N|ZmMyYS&CglBSU;N8bw=M+xI`WUbnq__oBGC7>5oWrXwRGx!14vvI7Hy zVqiW7fd?cK21Ugtvaxm(Z!Il#PLGf9Sy@>CfR>h)73clG%zh&G)?^X~00000NkvXX Hu0mjf_{o&U literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/11.png b/plugins/_core/icqlite/11.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbaabccb5fa7db65eeaa1606527947bbdd384b2 GIT binary patch literal 1984 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 RmvI09002ovPDHLkV1jNua%%tp literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/14.png b/plugins/_core/icqlite/14.png new file mode 100644 index 0000000000000000000000000000000000000000..5e03f7b4897e4b16a72d475278b31f5e2320b3aa GIT binary patch literal 1649 zcmV-%29EiOP)Z5J_x3-}v5AQZoIH8*$3ZPEEijo(uv#57 zk%(ERqxY;#VXZ>=ZlR;dxF*-aStylBEGA0h!NjyV$Dw#Ub=M-%g`@ogqvQFxi!7O( z$GLNF|1jwM`SXZIqv-wgOR{r^+i5V6cjlubrM_3T=WlX42$%+FA*jhgFj0i4%D6GI zh`#G;YF;e7GnYWa)d3-}tJ=&A1|v?NKD}(4e&3^titTjY-W^U^UT812NtG|>-L`3c ze~CF<%jC) zUmY3#_ZOPa=gahH!-i+**7&7#kl20Jy8l0f;Mtr`U72gR`0dTm(QtQYJV{ zRa+{nx-~j;=Y@KoZz=FWWjYg>!zuF%tb`;xb_L}T8;C>h_hu;JM?ESe5uQa*~`#^c7vn3^v$4#9tDGlzcl;d zbmwB{0`!I1-o8%JXP`0uMWSIT6OF0-JQ_(?%5lT$77L;mp)%- z&Zfjwz7dof0is_X_uD_!0!)OONQXM%WyI7N-s_+&JFim6;w@i233(JZY3b?dK~qx` zTrSsAG#cw$lGvVW*M@ERc`C8yY2c^^usNiYR!;wA1&mMO!F&R3mlzXf*N^G-ISmB` zj?voPJ6U&kcP0n`8X6i93{EmpT#6VB#w)zuT-VukLoY2Q^;WA&bUHN+U@}xqhNw#T z;`Soi-X}~YWn)=c=0n1aG^nYw8qf215|r`qojP?2I-L$1H*KPVFztxU%qWHJ>=0Emi3Jne2Qq5*F0Kn_@ v{&yvn-|vUt@BhL6wzf93wYB~4)PUatV#u*w-%F_>00000NkvXXu0mjf*Z2^< literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/15.png b/plugins/_core/icqlite/15.png new file mode 100644 index 0000000000000000000000000000000000000000..484dce0a589bcb1e50b8981ba64fa24e70a8dcba GIT binary patch literal 1689 zcmV;K24?w*P)(yrMm+N~r%rZ8#IRB2My zNn5mODpIselOjb^N>^1;#t32~)zUd}@J2?*sFKjeA>17ZA+h-|2H&vx{P{a)KO)d5 zpj7)Y?frGmdtSZIdEWD04)8w`vYB$C;{*Vp^v(Czt-mNYZrnh2^fpq3htIT?Z+!yonh^j@ zUOth-7#n8G{NdqAAMaQ&E9?!gHY9|^+mup`TB8}bb^G=&zp~OB+GjCjA~koA5VCvM z8}H9<=5GU|*49=40M$nQ{wKZ$b=cRJqEAmFzL5Xk=hu{38H#j55@cy7e<;!-%pW+9V3l4za_`OI_=*mvV7Fo|J)_(?(Rl+clSm{eSM$EMn;B>)q6{2 ztGd)IU4|$m7yy**PS0M|oATra01yPq%+=W$+lzFdku;>I5^T$QO!ic2^qIzLZqsBq zTxZMOVcItE!F%uQczTdP|Alv8*i~IIE+{pPb=uoN9AGhk#o_D^Sxw6kzjq=y@j^o( zATf}PSvUqHnot}c<`nt%Z@*@HyrGWLv`T1G6zkBfKX?~_c)wKg0@A~EwQ;0M*-w|U zP_jD{pzNtqR3bGc#?1z!#w1;mZ(6W2nG7-+2Y`MtssIz={LNKpLLLA>Twj7CKQwRX z0F)AlA_3tzCL`SDSr-f~BOHkV5H~n*{`vwmArBlq92`9yG$9XqemAzkE=eio7GzYb z)dh{lENN39LX=1*LFRZLfTy9DzkdM$)pq1|0We$G)*Fg#v0|1O&y1wqlE{6jyhhv>?&4!aO{4mL=%oOrWh36hl z-<3AJ(U~)6VA@gS9~kI=Yii1WZGTOEUPXC1%*`)7bEuh{Ujhh)pz-4)mnvf1Ui6ba z)m8J2jW2KBy&ug?(L*mDnhORO7cTzc)9pY0k(}g~e{b#a?MFPwYg+^WJZZ^9TwekJ z$kZ|{a{;tn=2(VdpHHFG4<38#<;1!~TMLQHg_9>w!eX(k1OkhFD*}75_aAOU(N2zJ z>XRs`-H)+59>go+i0som&AJvdph|#`h4JB^7@H67^r%$nZ{+0UO&+Y>&w6@#Ht*h7 zu3SMh8igQ;M3N*+G#b7XzoR4Jt% zK;7gIi0<4R1=VV`ICbjO))V&JxpR=q+`;2z*+ j-rnAh_V#xC-^jlKfhWaTrkWkE00000NkvXXu0mjfC_Who literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/16.png b/plugins/_core/icqlite/16.png new file mode 100644 index 0000000000000000000000000000000000000000..3633cea20998b68069a7abd35852ab133fac402a GIT binary patch literal 1668 zcmV-~27CF5P)1`$a_ zK~#9!wU%vcQ`a5FpL5^r*uL>=LLi1Db(}X*U_i*i)@Wf~r4|YCqN*)R(fH7=jV7e^ zLqC8fWnZFwsF3IfDpqMjqN=)8tV2}GQnXO3V?v`iB#WJzK{7fLCvhAbzufEla_-p& z7H?UcZtJwabfv4KqyO)o=XvzMhu|yL`Sa%i0Cu~b<2cSA3gbHk)k^ zfKkh`uF108nM$QdQ&SU(#bT|hs{VRxY;4#4`}ckMe4d+_n6RBYcdmYPbW~0x5@gMZ zPMtah0AP&qq9_I$8X6D`2Gf0geQb1eG?Y%KFHuU{D5cEn_5R}S-McSjG8x_P_x~~) zjdn1`Fh4*4lcAxZyLzW0SKZf=9-(E_n$p`_H(=4&MF`P7#tjg zs;ZkQr8iTl)HVQ$EX&1Wu~^R-`>%q+7)w)1yN8E|AN2P2t__2#st`pH>>phng+jsc zRT4=Eu>?WDDr8Li`ssE&|9mI5 zZj}J208}h5=P)>U2WQS~#?GBwWgSp4H>cu_H+ZDeoJ8pcAWhSd&1O+9mjM9Vw{Jl% zSHhJmarE@mWA|HSwJeKL6!}KLJZ5x4$UyQ>Y!{k zi^au7P)fmZKrHqbP)b25#idIWJ~xl=zu1Uxc6$I=_`_rgKmQ<&CH&$28yofM*2 zLv1!v-Lz0Bgj8xt<~Zw>{{Ala^z>f=0FoquF@{{ejOZUTP~gYp48gk}%)>N!Se6CD zFko30D5dD{2Moim3Ig}j>FJqA>*AeCEuo~S5CtN<`br;|Wq{*2$g&Jk6rt-n%4HqD zyFQ2C-^hRv0;kgnQ50bq26SDAuIuRNVDNe^I2^S4P%SAcd_FfMo4`gs{1}=}p=lcO z`8*UwseG{{NfmIhScIyo73rK#hUcD>!1II^3Z%M6KA#(^YCv{!W@AGQ_J7TVhf5|3 ziUEg1#FI}pqOWf=1_oNdn1c7;C%ADVjhPt@j~+etCm7@)Nd%@TQ$-Q0gH+XkVORio zY;D?%Gp{zo=4*tzxpPf~A3q!h2DV^ez*||?)wtur@reSv}S(DP|fL;KPZusG($O2Q3EdMwrT>oyh+@5uG{_tL5-+TXhm;c#pE zb}TmV@QbC9Z|rJm3`h&e&;ALXa2Gy(eYh%U`^(S3*Y!ADv$H@v?#l!M4_`Wd{M++u z1}y*#4Gp2Ou?e?hF+?H<>T=o4wL7usjvs!{OI&;&&Mi%FHu$lU7+(kSb?E?9tgMvq z)>}5#(sDRiTf6ByfcEg{(WC37o11%pNaO(8+d>(iKk(gfdv{{^?M3s>tb}4}?(a=I zF!jy|rrsHWuge8r7Y|AqCMGD}eACWEarZr*w;$iJqbs%U*RlF?`SNA7wT1ELdoys< z*odZ?t))`&$I(xI`z@EPw5fZyo2%OJb4luO1E0kXtXk9 z_wMb+RXCa2(by8!?vPMoNk&c6ZCqSmgHMW(<2 O0000cl`*TUE=3ilChsqV3>Y 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 b|H}RY&6oEvpPZ1?00000NkvXXu0mjf=%QuT literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/19.png b/plugins/_core/icqlite/19.png new file mode 100644 index 0000000000000000000000000000000000000000..bbccc877752f7b5ac98eab3b818a806ef5cb2bf8 GIT binary patch literal 1889 zcmV-n2cGzeP)mI(vH?~s)?NjC6St#ikW%~-oRlI#S7>P2<*bLm&3B>y#1gMP}1=~ zbG|(9bKc+kf8OVPBp%U`BS&a%Zf4Kk59Gq4eEY6ny{--p_@jH>0a;Nj*b)>H6K9}E zv7G*@h0jl%62wbwdtT}hv57fz>>va&J^lOa2Hyh&GA z7qzw9C0&HGo4>l$?7nUO!s7`Q5A>N8MK%%i%ThQLmQ7|4x;iAs7}Vq|7tbi}wk9N5 z;8o2tSFBiZFefvsYQu)_Tt9!lSpZ1mklNZ>BuPS;u1a&WE3>UpDM$bM$Cm8g+gbQM zX=q~>KmY>!>@%cfpP<}%k8h>)VKWAagmn}}AR8{%@7NYA$kePEDDJgE^rGgv8C;>E0py@ECK|lrB zpi-T6Q~L14(d9mICVG5t1HjImI|1Bvk8x_ee{d?O!{sJ0Vu_A~Gag1HmR5ZVKp?2{w`;kqeKwx= zYvOR&4G3KzbOE{mX$*ta$M;_~@p+G+I5+8r)92qb@0kVnjvhVAx^?Tm1`YcM2&5%F`R?!TT&L<@)s-il16=HPh+zO=$)IT?0u%j6=3=eHw!$4aF3PteE)6M?GwOYZ-ouHbkeq zjUM;A2}sY_o5W?l!^)T5BP%mjQPq(x?d@0NCm&?O(a4BOLV}gwzxyKD*>OND zTQY$V=P#xiFje*#Nxp#!uM3eLI?_l9Uj_>-Cs@eo3Ad1YkBB!cM2d2&0dT z+NcR|W#yMZh}A2dg!&(>9{O`8LO+5Kg2T6hsDLgcrUhB87Gh(gG)0kl5*aM|A>1PDL?IO%ID8?tz%V?OPpN zW~FD}Yiw+M+>sOP?FqzyE@`aN*7rM-|ocIcy)HwY!tn?hee|ZkF!b$F7zk`uYO& z^hNZAi`ES+TD+>ax3~SVyH)_2nwr?QZ5uf`IjX9vUmA_kD-It%n>aW)BIoAXFqs64 z%QA3X?&6ak4_BfEWqm4lKK_`c`}UFXmjj%(iUHjg|9tfeuU_~2ykhg_&3xlKa=Bc3 ze0;nsBg47T;c)!=`0-<9=gyr>E+~kT3kzeYex;P}zP6A+AjHpq@Go|?42^dZQbdm& zKmO7E(v=&h?c51ab#*m+_wHqQcv!4ozrNGuYJc73>X?Ec z1_K5~RmsZYVp?5Y9e(g&h&~4efZe-yFAGF|E;xPqGyotF2p}ODxReyO=<=v>&z?QM zi^XDZQc5*Oqe=YX?vDpXMkm7`fAj%!Y}^pObm=1X`~5g^;>7<3I(qad37>1Xr$pPg=IUvR0?#KbNJ6l3hFNN>`N@@q)m>BLpTrfSQaWt*RKE zNMY~}W6^}wFGg9XYcS+*Z80;QPLETkPAv~qQBlizy+5oG#hKn$>;(;5n%8ocB0V^w z04xL0DbSb)EGB^}6qG1P@lg!8Wp?d$p+A;1c0L@}`rqDD#%wklIyyQQ1NHXy0st}! zTL~tArPD;4-rU{DnesING60hoKE(s3J_DT<;dOtXRl)$w=nC1@J8S(#7F%b>zW0WG zL$~RRK-}|AP0f04e0Nz$_MDXvgXcJ?ikh3&ER!qab48RAWE29zaf~O6nES~`Vl;vIcoK3Z z4FGU|@mrjEw*~Hhd@ALC0ZmvSXrkd>L7Dqk6 zXYfpYhQIf7%vjj;L`t!9jScH#H*em=_U+qqZ-&0UKG^Mc&g1dg$HpG@&PB%RyY}0N z-Chcv01!6$pYTosOahHdU`)o7$UM$pRN2g2)kAYZNoPrEwO2~c(nE(1Eghs?U0nzS z0!&J!XLUOLHEo{xSI&QVOmZrwu@p0Cv=jsi7|TGV8KjwvZ#{9G?E_Oe`$LV!+!+d| zyk~PXx4*8=_UG1Dw>^6Lbb_W*DI7U+`l);OJgV7j1^~3TxBq`nEvM57 nr_;IYd{0jgdU|^Bi)#M{ITXUw__~tY00000NkvXXu0mjfy#5&N literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/20.png b/plugins/_core/icqlite/20.png new file mode 100644 index 0000000000000000000000000000000000000000..90a4d5a8a499e9e60b4ab1166c5d2310618d81a7 GIT binary patch literal 1893 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/22.png b/plugins/_core/icqlite/22.png new file mode 100644 index 0000000000000000000000000000000000000000..c60b2b98698a3cab8880a6dbc85e48dc137a2dbb GIT binary patch literal 1775 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/26.png b/plugins/_core/icqlite/26.png new file mode 100644 index 0000000000000000000000000000000000000000..59d948b5a2f7af0a8ea2e5da348399d7865771e5 GIT binary patch literal 1750 zcmV;{1}XW8P)oA#DHv24hJ? zK~#9!m6m@@)aM$p zy|3MlHavue4$MqD;ZB}dwN}^N+GOdduZvB4 zY{CBC_U0KurxQt0K+vI?j6!tEEU&A(^JT--#J-qm(>;LdcQ_FBVdQW5^?e}y*u|xj zM`>%e2{#)qq-(PLd1w8Ftd>9SG(5Adh-jl3>x^{tqKF2xINE2PudTY2p7*1+fDl%Y zV6`?!MaQcB%}tNa$kpr6wO%}%?z-9fdH==pISW!Vg_9rbK?{u%mz<1V6#r*dWK>O~ zf5^xD-@kP|Dmi&2(DPhj5dhU))c`D+xnz7sb;m2{y3uISM&-}GZ>Z0CGR-Oo0z{-v zW3;^&y(m&#Qu0H10!VuB4sxd99Mu=9Qp0nz66O`ImmPzSfF;u62ef);{hhn7)uJ1l zk^N##d~MmM>GP(~5(EKGm6!9g%|*l|B~e^b!ruRa($XL^3u0r54hv_%?=t#w%*Wc@ zZRcuwYIdwYynfcQ(q)ORey6d#u8esxj|q1{xzDdHt4)HkaVf$oFI7vghog1s~*MgW6|AvRp>}5F& z1p{=tdKr;NY3yjh7b$aJNyYUr~l+d&T+AnEC5tgB)6WY%CkMJTf*uVw=YHn8(+|#cuVzJ$zMr_Qo&g%mR3L#eI zuN~hR+`SG3=vlM%x6bbx8}fYvE-@HqG!M@-{HtzZW2%e-SAn^ZC*|=PuOT6Ebf5zN z{$6diJHu|65>X%yVyit?sSZblh>K60xT&7}WDfw(ZTb~?dtMM?I{n$2pd9&j@#Wcm zEr2=A%7t7xO=Tn;G-_!>sdlq|N`XbO*Z_4XI)Kq+;?1|VPYfEX6@SQO(ZzX! zJL7h?Y)}u^OINa#1riI>b7`rxX_mGr?j>_pcyx-e@mA-64NymnqX>e)j`#LFd`#S{ z4cne&@wHq*&J(l6SgGR7$>SLaFw2_RCVNIU=03gDnKmc04^V1rPUGc=nEM}|lGs%lSYimDJ9Y2-I=zdO0X zH<9-5{eZZ5^W2K^BaHy6s-^&4DJf|Hyt8B1glBb=h5Y@)_mJgLL{YpOoFqv|lEgbZ zc40I{@s~fp{r`>fv8pKl41mPMB;ECES1gH1aZlP?+m8o>K~!ZlPt;5H*_l>1ptiL( zle;kQP7yu3dh(#JPke#NWYW3aE=!~Ba)QwmRbGAe)a;Q^NB|H;adiHIr|h9%uwYgG zPy6HJ6Fh+8boSf_(mxCo6JybNJg!W?-&b~};gU5J3W|k4-!j$`cCd7x)nJIcFyQKI zQ&r^!z;Q3+k)V;0P^>J=d%r#Nb%vtIDj*&#-FKfa5EwT6^U%j>rl_b1U+AGAP1C%< zCRJ6?G)+U(7!C}hY1*Cs_>0XmZr{EgIQHe29-q&v40^wJ0<2rJoWn<}CJ!1O9+D*~ syyK$-hadcTtlHLj@7}sK%OB|d4+rwU%naCl@c;k-07*qoM6N<$g3$_CF#rGn literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/27.png b/plugins/_core/icqlite/27.png new file mode 100644 index 0000000000000000000000000000000000000000..599645d3e09d41f901324e317f5cac0ca084a842 GIT binary patch literal 1724 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 j-QC^j?(Y8S%!dC4b7#==$WlyY1~o}U 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 M07*qoM6N<$f`iHN*#H0l literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/8.png b/plugins/_core/icqlite/8.png new file mode 100644 index 0000000000000000000000000000000000000000..19fc0c0b816908eb4089901cbfa7e9ce68ab055f GIT binary patch literal 1741 zcmV;;1~U1HP)8K(;L`$V5%7<1RX}xI4DoU$BHW~=Yl28f+n>U!J&BKnL7-RqMe;-KFWstSn zr(Wqw=bn4@``vTTIrkjk`!qT`JJH$Mxk2C7)`qsWw(o=?`d^zTPMmloTdg}uZ?97^ zHRVc4@I29KG%Pzidue!hfITDyfU2shO|i&k%5&$=0RUVs7b1e3u7*8osVE_@u73Xa zp-`xr@w`|rm-~DA`wowc&n*4o^&^6H`}U>JT0UiigM(;nZ2WejQ>RWLB_#zKjgk6; zi)zpOh?+9VM@!zhG(%d7dW(WcDR}ro2{u0JomZ+d_f&0PGYt2`?oSABg5Dtg% z;fEhRnds7`OYnNVXm9T(rKLsYWGQ!X&F@O9F&AZ+%4-P59UwtJh}Q#h;2>iE{5$SU zyU}rfN(jbPPJbj`f5SQ8+?}5%BqvL8_Uze5*z~_Gve}AhMddT*csyb^YS|Bex&KFo zyy}C5n;Zm3DJZ2NgaFr@A*p-`dvXkTtEhyODw4J(C8G9Xvw7RlQh@07dR)GI`4KMn zP_WzW5Cj3sKA$E@OfIWsYqo>AHb}NTO)zqA-FSfjOKyO%^|fmhVclS=?BeL1lV##Py5>#42@T`I)=&+ z4FicdKnSkSxcB#Qk!L%uoxn8pmUA43{W%8gP$q9Prs+QJ>+emktE=1GM}PUmuA}j_ z&y|6t0<$r*CV9);qSrq>#4>(`=PJwLzjz*42?GG0I{G_Y`$s!`{SDA1>8v(cNwSbg z+@1-9$k|?pXC@dfedVQ}P60q&UESk()N!Me)5>MqU+*tXNz-XN06o0%dHBZPUq29C z0mwIZ^Nqg`jWHWGe?dQZ9)u96WGT>7j;OOtTT~`9^-YYi4Hi|rSfe*6m0x}E@{jez zy#NRTpi}~Rxq!d}p4rDECl~@|=7CrYND>3tM#Ll%TpgccYoh$C0}|0QbOs9uE)<0y`{^--~BJcOQ^Qe4`7mfIhtwa*2e_L?XIGoEL2x-kgX7 zM=1m2AAmlXlmZDJAQZt^9K3*a9i{6}`EVw95XvFW3m}9F97i|LBfl?*a5%aqXjA|p z@W$hKdu$T*t?l^pwdft)M|9EB$wVluhhuhVGx zO^HZ?fDtjKQ&TZnV8JoxFwE6bEQbQf+#ABti+{tOsxA0zU>tni&Va|R-j2qsew@%zI$@p$a$-Mj6FMWSfNyYJ>vu~b{QUXz5R1h)bm$O9M<*3muC!#^Z23(y zGef%R=_wWpMIn=^NYRe%e%I{mkcj00000NkvXXu0mjf03bIS literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/9.png b/plugins/_core/icqlite/9.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6876a0fd8e4d346da4d54ab0df052b806e1e95 GIT binary patch literal 1882 zcmV-g2c`IlP)1avx5D5PB@fdC=oLbAE-Zua)x9zSeI2n5fk zXU?2C|M#5pKj;4nZnM$Yn*c->Jw3y3r2Dkoa4am12?ZoV)luBVj;na?NPZ;d1nM4{ zijALn34qdjzB}a;w!uRrDN3F+4KU0yGl{KMT*C-E1K?h z9LsjB{D9*ah9YxALR0&MASM)TIN5plH&%AYkG~vZhEKFQH^bI>V?#x;dKz{s_Q~k$(yaqJ^ z0u*7OD@Sx)4H{ij|IybWFx#d!k0-GLDf1ps3~nqRXCnO;I9WzZrW+MM86b z>?vtj6KvUh(H(9=^@JJi_+AtL$2`&chvuw)=?`YAhvcP$QDgiXz>-^I?f{zTJ-0Km z^zkKwCx5vH)kO7%a0ln270p3)2N9}173-Ku95aoX>^;_d>}l-u7)XUc(>A1(XJ!;| z^Ks?F7qK%5qIHidLZd<0xi-}sdcN=dAGK<@5JDgUDXpmysY08|;7E(|^*`tpn*Nc? zS2mjJzqTVX|8wT7K%Sxs1u5&z{P_N!kAJm5+BskA`n`AWnFLHxcxW(i=`HfPR60Cw z%LSJ{=kvM2fAj$~uiae$y7J+R1yn^VHFKlK1}^+@X(nMK9q@%f2oNZ!nj6c?P2u?5 zeloEnH~sM1&7~`xjqc;>_>B)5{2?jaUhw!p^9I}c2aQi1Ja~Zz zA3Owr>T%&YvK8rUzPnOz~m)m2hy81>oJ^WaKYnqBD@JO!EDc}ntt zcXCd*nnQVc=gD$km~tzCWlx}KZXD?V63a|Tk=Ld#gAjrn7vH>r10tc}@r9v14rfz^ zd?5i_?y^hmbCGB32qUocG`WU2NC~Qt-oX5%UQ%Pvn2}+O45AC#hQj%dztD>pOy#D+XrVy0N~04yjrZwm(Jh=_535d>on-7|5bT z9Zr7hr?Ubr`r1bF>8rSsVN73&+}Pv-hhga2yWK6mUt2SPvWXr;^MtV76ZFR3r=(#q zk;Xa*r~tIR{C!3{&dmUcw5lYoW-&~G9UVZZ20ia~fm=f9B-L*bF96KkI7W7)pg{_} z{<8y&UGBUs@d9Fdj}qH^lt`d)z#FjU4=HO4s9<#3uMT|$H)v8E_tcxr}s=diM}*ywSXR3C_>DpM`H4P zIDiVPTZei5Up4FuISib6#f-KzxI*=n=n)+&lfll}0NAF7s9b z6qvvH5yf#DuGlSW&kuRbFWom#kP|gvN{=S7lnKn~<_Un4Z_Fc^>Q!oMpKOVgtbTjK zid7GG9|?AjEWemB0}t$aVNc)G&r5Px&BU+FaRsX4{?aP*x4(O%%*(*>DzR^|B2#gX zw{BY`a{ntM!$&=)G5pZIU+KC&11K0;LG#j|E2*(_6{8a;%Z=RF+XJJn?WbbVGZn$O z{oHr<+|l=U_P>U$%~R^j`WJ?MBS$jh7gfj3tqce5w+DLmsrhVwzpDDIRol<;KWn7u U!E49M&j0`b07*qoM6N<$g2Atm5dZ)H literal 0 HcmV?d00001 diff --git a/plugins/_core/icqlite/icondef.xml b/plugins/_core/icqlite/icondef.xml new file mode 100644 index 0000000..8b06544 --- /dev/null +++ b/plugins/_core/icqlite/icondef.xml @@ -0,0 +1,149 @@ + + + + SIM smiles + 0.9.6 + SIM smiles. + Vladimir Shutoff + 2004-06-11 + http://sim-im.org/ + + + :-) + :) + =) + 0.png + + + :-( + :( + 1.png + + + ;-) + ;) + 2.png + + + :-P + 3.png + + + *JOKINGLY* + 4.png + + + :'-( + :'( + 5.png + + + *KISSED* + 6.png + + + :-{} + :-* + :{} + 7.png + + + :-") + :-[ + :-< + :< + 8.png + + + 0:-) + O:-) + 0-) + O-) + 9.png + + + :-X + :-x + 10.png + + + :-| + :-! + :-$ + 11.png + + + :-@ + >:0 + >:O + >:o + 12.png + + + :-D + :D + 13.png + + + :-/ + :-\ + 14.png + + + :-0 + :-O + :=0 + :=O + =-0 + =-O + 15.png + + + 8-) + 16.png + + + [:-} + 17.png + + + *TIRED* + 18.png + + + :*) + 19.png + + + *STOP* + 20.png + + + *KISSING* + 21.png + + + ]:-> + 22.png + + + @}->-- + 23.png + + + @= + 24.png + + + *THUMBS UP* + 25.png + + + *DRINK* + 26.png + + + *IN LOVE* + 27.png + + diff --git a/plugins/_core/interfacecfg.cpp b/plugins/_core/interfacecfg.cpp new file mode 100644 index 0000000..35f2374 --- /dev/null +++ b/plugins/_core/interfacecfg.cpp @@ -0,0 +1,351 @@ +/*************************************************************************** + interfacecfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#ifdef WIN32 +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" + +#include "interfacecfg.h" +#include "userviewcfg.h" +#include "historycfg.h" +#include "msgcfg.h" +#include "smscfg.h" +#include "core.h" + +#ifdef WIN32 +static WCHAR key_name[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run"; +static WCHAR value_name[] = L"SIM"; +#endif + +using namespace std; +using namespace SIM; + +#ifndef USE_KDE + +struct language +{ + const char *code; + const char *name; +}; + +static language langs[] = + { + { "-", I18N_NOOP("English") }, + { "bg", I18N_NOOP("Bulgarian") }, + { "ca", I18N_NOOP("Catalan") }, + { "cs", I18N_NOOP("Czech") }, + { "de", I18N_NOOP("German") }, + { "el", I18N_NOOP("Greek") }, + { "es", I18N_NOOP("Spanish") }, + { "fr", I18N_NOOP("French") }, + { "he", I18N_NOOP("Hebrew") }, + { "hu", I18N_NOOP("Hungarian") }, + { "it", I18N_NOOP("Italian") }, + { "nl", I18N_NOOP("Dutch") }, + { "pl", I18N_NOOP("Polish") }, + { "pt_BR", I18N_NOOP("Portuguese") }, + { "ru", I18N_NOOP("Russian") }, + { "sk", I18N_NOOP("Slovak") }, + { "sw", I18N_NOOP("Swabian") }, + { "th", I18N_NOOP("Thai") }, + { "tr", I18N_NOOP("Turkish") }, + { "uk", I18N_NOOP("Ukrainian") }, + { "zh_TW", I18N_NOOP("Chinese") }, + { NULL, NULL } + }; +#endif + +InterfaceConfig::InterfaceConfig(QWidget *parent) + : QWidget(parent) +{ + setupUi(this); + connectControls(); + + for(QObject *p = parent; p != NULL; p = p->parent()) + { + if (!p->inherits("QTabWidget")) + continue; + QTabWidget *tab = static_cast(p); + userview_cfg = new UserViewConfig(tab); + tab->addTab(userview_cfg, i18n("Contact list")); + history_cfg = new HistoryConfig(tab); + tab->addTab(history_cfg, i18n("History")); + SIM::PropertyHubPtr data = getContacts()->getUserData("_core"); + msg_cfg = new MessageConfig(tab, data); + tab->addTab(msg_cfg, i18n("Messages")); + data = getContacts()->getUserData("SMS"); + sms_cfg = new SMSConfig(tab, data); + tab->addTab(sms_cfg, i18n("SMS")); + break; + } +#ifndef USE_KDE + QString cur = CorePlugin::instance()->value("Lang").toString(); + cmbLang->insertItem(INT_MAX,i18n("System")); + cmbLang->addItems(getLangItems()); + int nCurrent = 0; + if(!cur.isEmpty()) + { + const language *l; + for (l = langs; l->code; l++) + if (cur == l->code) + break; + if (l->code) + nCurrent = cmbLang->findText(i18n(l->name)); + } + cmbLang->setCurrentIndex(nCurrent); +#else + TextLabel1_2->hide(); + cmbLang->hide(); +#endif + + if (CorePlugin::instance()->getContainerMode()) + { + optChat->setChecked(true); + if (CorePlugin::instance()->getContainerMode()==1) + optNew->setChecked(true); + if (CorePlugin::instance()->getContainerMode()==2) + optGroup->setChecked(true); + if (CorePlugin::instance()->getContainerMode()==3) + optOne->setChecked(true); + chkEnter->setChecked(CorePlugin::instance()->value("SendOnEnter").toBool()); + } + else + { + optSimple->setChecked(true); + grpContainer->setEnabled(false); + } + chkSaveFont->setChecked(CorePlugin::instance()->value("EditSaveFont").toBool()); + QString copy2; + QString copy1 = i18n("Copy %1 messages from history"); + int n = copy1.indexOf("%1"); + if (n >= 0) + { + copy2 = copy1.mid(n + 2); + copy1 = copy1.left(n); + } + lblCopy1->setText(copy1); + lblCopy2->setText(copy2); + spnCopy->setValue(CorePlugin::instance()->value("CopyMessages").toUInt()); + chkOwnerName->setText(i18n("Show own nickname in window title")); + chkOwnerName->setChecked(CorePlugin::instance()->value("ShowOwnerName").toBool()); + chkAvatar->setText(i18n("Show user avatar")); + chkAvatar->setChecked(CorePlugin::instance()->value("ShowAvatarInContainer").toBool()); +#ifdef WIN32 + HKEY subKey; + if (RegOpenKeyExW(HKEY_CURRENT_USER, key_name, 0, + KEY_READ | KEY_QUERY_VALUE, &subKey) == ERROR_SUCCESS){ + DWORD vType = REG_SZ; + DWORD vCount = 0; + if (RegQueryValueExW(subKey, value_name, NULL, &vType, NULL, &vCount) == ERROR_SUCCESS) + chkStart->setChecked(true); + RegCloseKey(subKey); + } +#else + chkStart->hide(); +#endif +} + +InterfaceConfig::~InterfaceConfig() +{ +} + +#ifndef USE_KDE + +QStringList InterfaceConfig::getLangItems() +{ + QStringList items; + const language *l; + for (l = langs; l->code; l++) + { + if (strcmp(l->code, "-") == 0) + { + items.append(i18n(l->name)); + continue; + } + QString ts = CorePlugin::instance()->tsFile(l->code); + if (ts.isEmpty()) + continue; + items.append(i18n(l->name)); + } + items.sort(); + return items; +} + +#endif + +void InterfaceConfig::modeChanged(int mode) +{ + if (mode==1) + setOpenEachContactInContainer(true); + if (mode==2) + setOpenGroupInContainer(true); + if (mode==3) + setOpenAllContactsInOneContainer(true); +} + +void InterfaceConfig::setSimpleMode(bool) +{ + disconnectControls(); + grpContainer->setEnabled(false); + connectControls(); +} + +void InterfaceConfig::setChatMode(bool) +{ + disconnectControls(); + grpContainer->setEnabled(true); + chkEnter->setChecked(false); + connectControls(); + setOpenAllContactsInOneContainer(true); +} + +void InterfaceConfig::setOpenEachContactInContainer(bool) +{ + disconnectControls(); + grpContainer->setEnabled(true); + optNew->setChecked(true); + chkEnter->setChecked(false); + connectControls(); +} + +void InterfaceConfig::setOpenGroupInContainer(bool) +{ + disconnectControls(); + optGroup->setChecked(true); + chkEnter->setChecked(false); + connectControls(); + +} + +void InterfaceConfig::setOpenAllContactsInOneContainer(bool) +{ + disconnectControls(); + optOne->setChecked(true); + chkEnter->setChecked(false); + connectControls(); +} + +void InterfaceConfig::connectControls() +{ + connect(optSimple, SIGNAL(toggled(bool)), this, SLOT(setSimpleMode (bool))); + connect(optChat, SIGNAL(toggled(bool)), this, SLOT(setChatMode (bool))); + connect(optNew, SIGNAL(toggled(bool)), this, SLOT(setOpenEachContactInContainer (bool))); + connect(optGroup, SIGNAL(toggled(bool)), this, SLOT(setOpenGroupInContainer (bool))); + connect(optOne, SIGNAL(toggled(bool)), this, SLOT(setOpenAllContactsInOneContainer(bool))); + connect(CorePlugin::instance(),SIGNAL(modeChanged(int)), this, SLOT( modeChanged(int))); +} + +void InterfaceConfig::disconnectControls() +{ + disconnect(optSimple, SIGNAL(toggled(bool)), this, SLOT(setSimpleMode (bool))); + disconnect(optChat, SIGNAL(toggled(bool)), this, SLOT(setChatMode (bool))); + disconnect(optNew, SIGNAL(toggled(bool)), this, SLOT(setOpenEachContactInContainer (bool))); + disconnect(optGroup, SIGNAL(toggled(bool)), this, SLOT(setOpenGroupInContainer (bool))); + disconnect(optOne, SIGNAL(toggled(bool)), this, SLOT(setOpenAllContactsInOneContainer(bool))); + disconnect(CorePlugin::instance(),SIGNAL(modeChanged(int)), this, SLOT( modeChanged(int))); +} + +void InterfaceConfig::apply() +{ + userview_cfg->apply(); + history_cfg->apply(); + SIM::PropertyHubPtr data = getContacts()->getUserData("_core"); + msg_cfg->apply(data); + data = getContacts()->getUserData("SMS"); + sms_cfg->apply(data); + CorePlugin::instance()->setValue("EditSaveFont", chkSaveFont->isChecked()); +#ifndef USE_KDE + int res = cmbLang->currentIndex(); + const char *lang = ""; + if (res > 0) + { + QStringList items = getLangItems(); + QString name = items[res - 1]; + const language *l; + for (l = langs; l->code; l++) + { + if (name == i18n(l->name)) + { + lang = l->code; + break; + } + } + } +#endif + int mode = 0; + if (optSimple->isChecked()) + { + CorePlugin::instance()->setContainerMode(mode); + CorePlugin::instance()->setValue("SendOnEnter", false); + } + else + { + + if (optNew->isChecked()) + mode = 1; + if (optGroup->isChecked()) + mode = 2; + if (optOne->isChecked()) + mode = 3; + CorePlugin::instance()->setContainerMode(mode); + CorePlugin::instance()->setValue("SendOnEnter", chkEnter->isChecked()); + CorePlugin::instance()->setValue("CopyMessages", (uint)spnCopy->text().toULong()); + } + + CorePlugin::instance()->setValue("ShowOwnerName", chkOwnerName->isChecked()); + CorePlugin::instance()->setValue("ShowAvatarInContainer", chkAvatar->isChecked()); +#ifndef USE_KDE + if (lang != CorePlugin::instance()->value("Lang").toString()) + { + CorePlugin::instance()->removeTranslator(); + CorePlugin::instance()->setValue("Lang", lang); + CorePlugin::instance()->installTranslator(); + } +#endif +#ifdef WIN32 + HKEY subKey; + if (RegOpenKeyExW(HKEY_CURRENT_USER, key_name, 0, + KEY_WRITE | KEY_QUERY_VALUE, &subKey) == ERROR_SUCCESS){ + if (chkStart->isChecked()) + { + QString path = app_file("sim.exe"); + DWORD res = RegSetValueExW(subKey, value_name, 0, REG_SZ, (BYTE*)path.utf16(), (path.length() + 1) * 2); + if (res != ERROR_SUCCESS) + log(L_WARN, "RegSetValue fail %u", (unsigned int)res); + } + else + { + DWORD res = RegDeleteValueW(subKey, value_name); + if (res!=ERROR_SUCCESS && res!=ERROR_FILE_NOT_FOUND) + log(L_WARN, "RegDeleteValue fail %u", (unsigned int)res); + } + } + RegCloseKey(subKey); +#endif +} diff --git a/plugins/_core/interfacecfg.h b/plugins/_core/interfacecfg.h new file mode 100644 index 0000000..10c681f --- /dev/null +++ b/plugins/_core/interfacecfg.h @@ -0,0 +1,58 @@ +/*************************************************************************** + interfacecfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _INTERFACECFG_H +#define _INTERFACECFG_H + +#include "simapi.h" + +#include "ui_interfacecfgbase.h" + +class UserViewConfig; +class HistoryConfig; +class MessageConfig; +class SMSConfig; + +class InterfaceConfig : public QWidget, public Ui_Interface +{ + Q_OBJECT +public: + InterfaceConfig(QWidget *parent); + ~InterfaceConfig(); +public slots: + void apply(); + void modeChanged(int); + void setSimpleMode(bool); + void setChatMode(bool); + void setOpenEachContactInContainer(bool); + void setOpenGroupInContainer(bool); + void setOpenAllContactsInOneContainer(bool); + void connectControls(); + void disconnectControls(); + +protected: +#ifndef USE_KDE + QStringList getLangItems(); +#endif + UserViewConfig *userview_cfg; + HistoryConfig *history_cfg; + MessageConfig *msg_cfg; + SMSConfig *sms_cfg; +}; + +#endif + diff --git a/plugins/_core/interfacecfgbase.ui b/plugins/_core/interfacecfgbase.ui new file mode 100644 index 0000000..8a68b36 --- /dev/null +++ b/plugins/_core/interfacecfgbase.ui @@ -0,0 +1,229 @@ + + + Interface + + + + 0 + 0 + 355 + 447 + + + + Form1 + + + + 6 + + + 11 + + + + + Language: + + + false + + + + + + + + 0 + 0 + + + + + + + + Message window + + + + 6 + + + 11 + + + + + &Simple mode + + + + + + + &Chat mode + + + + + + + &Using last selected font + + + + + + + + + + Container mode + + + + 6 + + + 11 + + + + + Open each contact in &new container + + + + + + + Open one container for &group + + + + + + + Open all contacts in &one container + + + + + + + Use "&Enter" for send message + + + + + + + 6 + + + 0 + + + + + + + + false + + + + + + + 20 + + + + + + + + 0 + 0 + + + + + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + Show own nickname in window title + + + + + + + Show user avatar + + + + + + + + + + Start SIM on every &windows startup + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + setSimpleMode(bool) + setChatMode(bool) + setOpenEachContactInContainer(bool) + setOpenGroupInContainer(bool) + setOpenAllContactsInOneContainer(bool) + + diff --git a/plugins/_core/jisp/1downarrow.png b/plugins/_core/jisp/1downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..31722b468721545c14a5a7667025dbaf6ddcd22d GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`KAtX)Ar*6yZOYzAFsn9nD&0MN zm_bb9@TpU;>@}tOWv!2OJYt%`pgAj$N8y@4iK#?l!+C+6q6lWe*-kNRk9$~Ccz?tk gwU{+U)0}~!`HTYdgoI~1f#x!Jy85}Sb4q9e0GBH%SO5S3 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/1leftarrow.png b/plugins/_core/jisp/1leftarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b894b42c4c90145e08810757846d7aa3b29777b2 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ex5FlAr*6uUOvdnpupo4_&VaQ z{hFo192)F<|4-l6$(o>&@Aj4V!rj-B7DvSnByp~o!Q@xNa%YC003(CeyaTQ;xcHRv j7YMxW;92>8e<8DXkyOE@SK`J%lNmf+{an^LB{Ts5XiO|z literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/1rightarrow.png b/plugins/_core/jisp/1rightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..2a1430f649a9fe63be638f0e645c9f9036c51e6c GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar*6uUcSxgV93FI;l{>0 z^VgK_b}(I7wDP~@j{^#wo@)blF&TZ9E`Ol(mV-~Je1SlAr)*OELZ^S0k5_seGYx3f nUBK<_&>DS!li9)M|1n;fZ&C#pgTe~DWM4f6>~9f literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/1uparrow.png b/plugins/_core/jisp/1uparrow.png new file mode 100644 index 0000000000000000000000000000000000000000..06d2a9c8155f49f382aa0a697396cff5a72f89f5 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr*6yZOYzAFsn9nD&18+ zz@V+Y`hQqh*#DD843Wxq&Ksl}e3|u}4R{WuOPg7$IdO4F9%}J!ig1>2pKSCLXju9^ WiTm@|wVwmcWAJqKb6Mw<&;$U#?;}b8 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/add.png b/plugins/_core/jisp/add.png new file mode 100644 index 0000000000000000000000000000000000000000..db0da7c1f54cbc89c3ced8327764d7de4fe910bc GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr*6yZOYzAFsnAO&Q7?( zI`#jHq|-d_43dIRyR7kjdye0bNA)B_OhXd0M8B+c+tu?e3_3n1${2Ng*z9;T%oS literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/aim.png b/plugins/_core/jisp/aim.png new file mode 100644 index 0000000000000000000000000000000000000000..91ed6a8452b6e3da80f23fc0525e3d7768f9e880 GIT binary patch literal 478 zcmV<40U`d0P)K4@NXIwx-m|;8+^ zU7%QsSzp>>RMq++F8BMxRV>Arc&^M`<DK0EP$dek> zWoD4+pb$Hd2$KjC&(88~<{pe>2Acw?svT6O4jp)Q_FI^E?%lb>^1`hY#3zO4&Ujj% zrZI`AE`DWfb{jJ|eaiEzGQ;GJL7vauL=z+J047y!^>LY>Z>K9#Bza)MQCGIHYPwGb$qZXMM7RQi{h~L};un8EhNd81_Ar zUIZHqfX)qPl9S*L&Lq2_l+sWsg~w)a6JoXmv|9?PcpBmxcw4UpBmDiY2kRgmU&|hL zWBbe2+G-KeGw`0Pk;L{n>s)Ies%5=}dho(FdI6s@m`R@CONgW735LlWG)Zx-y_UfM g%6{kLxMncG4{WK48cF%W(*OVf07*qoM6N<$f-&}AHUIzs literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/auth.png b/plugins/_core/jisp/auth.png new file mode 100644 index 0000000000000000000000000000000000000000..bcff06211e0e021d8bcc7daae27642a4ae98af90 GIT binary patch literal 242 zcmVt=01_B{y+iQUq=NRIyMx9(wVOTB1`JJoy0hyA3&(24~YybcN07*qoM6N<$f^VW>kpKVy literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/away.png b/plugins/_core/jisp/away.png new file mode 100644 index 0000000000000000000000000000000000000000..22910b9633359ff93245c1761f8a642ee8a4552b GIT binary patch literal 341 zcmV-b0jmCqP)FI+PDH6le+>M3knPTNuUr3KXcB^ zSd2hO)R@p%IQ2Z|e3>s}ilShXQ`$)Xi2)Yi?Bpf_>>fAi*#-c6I-+MAuomePSH0rY zLl{8}s75RbB}G;7Dh&Ji>J3_DyN11wX_HSl1VvR)Rh$zTuS41~v3rEIwl-au}|4VoT_6PT5ACRXkOC8Uq=^D0oiAqv)~$=FUvRq;f8JVO09 zFf$u7+pS<`HdUpxz73p!B9hm)fkgz)IZ{;$A-n~zf|F9`9HqUk>o5$%W%%bAbe`v5 zpi+6N!KvaS=s1pOnkMI(9s9mfd;|?4le8;@UYF#~`VI!yxa zJwyb3pA>K5hXbOjL$KhW yBEiZ6(sJ)rp#VTvo~GJ_9gXv4@L%Gwr|AdqX7TE z+sX=@?HvlwDqCcoF0BtLVE5*QZj=xYoRScV4!pA<&r& Mp00i_>zopr0DY}i6#xJL literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/button_cancel.png b/plugins/_core/jisp/button_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc23e37294cc1a35fb26ed109b57b999656db75 GIT binary patch literal 686 zcmV;f0#W^mP)Ew&V?wYvU zA-6~Kc(sgLdjhL_46Q!SV4v`GHJ+pHdmE?G!m2xnTEK1p1(ph0U5_X?s2fJ$B!UfoE;Gl?_Uht^?+YfbWNMD)#P`+P_O4~l35x)ugV^2tI{;_Nz^t$T9=T&~mdn&uy|OcUX1R8P{Wtv*Cc@VYt;?-a>H z1YrcR#@d2yGs0hkS689=i7IwqWxKC#Aem^0HE3{VAoOayx`-|%^%cQ$Nr@jr{6~{; zqTxwH3{DKI-XWqqalH|31cA65C;%ZmfUmQQm?RWs6W^1 zilpU|x{jw6F&d(_Y{G?gH5($cDEEqXGgU_tw-%shdhLlSmab-`{((e1H=Ur<<=tq= z)p)$3SG1eyZC}E@+F1MrZW^iIlb8)Lhc3Z6P84zVIN696&%17lZO@@A;eR#$0Km+a U_ol%Cga7~l07*qoM6N<$g6oPy0{{R3 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/button_ok.png b/plugins/_core/jisp/button_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..5908dc9047d5c5a65f00d88dba7c7381a09383e6 GIT binary patch literal 632 zcmV-;0*C#HP)ZwHgqlGa9xL!l2G@BMiB@Vw8x&z<3U9=8#Z zTT%ZRIDX&M?}ekM16xP(DzCeTy7k|HX3Eq~)X{y51C(kX_&DZb$ahi`1$WXV^h4vi zV4+%|bW}o}DdMp>OAnR^{m_VH`ZI_w!9;n2?!nG7H&do|l%tc2Ne+7sNyHLZcPzG_ zY`2n&*mrG+LjPz#6U$fQX3EsgnWK{nNjAg=_A{HE-5sQoxQ|@?O~18b1Kkr)EO-ohT!_om79Vf$In7Q<%4oE;;y7vjFfb;Zf6dDau z_v=PH8iyL78i#DmXkKrEEK9atZv7E$!2nZ}mvedQ9?I@{|lI6auY zSn7ELYmQ~GY8D4?4hWAsZ=h)Nq)+u3GLSkr4lc@|E;6;Sa9_LlRsULD`O`;eJT(qS zKmaU5HlDo^+6LQ}4OO5F*}*Ki;hb?3v<=RTWFUaK$8+SYUvK&?hSZ literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/cancel.png b/plugins/_core/jisp/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..b8cda9b0f627f8266b153fe0cb9d9d4420f516a1 GIT binary patch literal 659 zcmV;E0&M+>P)sBREJ6`2#Skt?U*`M z1hH=Eb{wU&i`Z-lG;l9+^nHedb4U~Or_b{84)=L~Joi4Y)o!;LuhvE*Gl|B@7l?aZ zNI_Bo;PcrZqSMG?s_gO2-m^y5JUGM=jS++Ndx#k1Qq%r^z*4zP>mjK!3>leCaAyNwcM|*OaLVUDHH)m6)Da66mGk? zC>|j!RRTQE%SK3Rqmh05c8K@mXQq@wiBQ_wMta>rFLaFmya7E;$yN9$9w01?K{=BO z^fhs!0Vr*40}lS1CM0IC;xPYZ4+I3Eh(Zv;D5QF)n&li@VRVcm2C?Dd#X4ZXcJOza zU^{@}Y;z3?MM@|@P$(o3Bo%UTuZxH#7D1&zzR1PqI-~}0AT@+f*U){9@_oz@K=|L- z6cB^5K~f-zClX*g1n)mkm~+v;j*zh=BSca`YmF8Gn^6x)4dKf2DAD|@<|u*8BmvHj z+o(i{f1eYsJO&Km>M|IiUAqSuj>=`a*FZd##Jc)>l|3w%sUx^3N_jvjBy~W?7z773 z0?rYRP^|8}#x1$j7Hj09)5zLC3E4-{L+Bm!f0mG|rjZd-XdD%iGfa?#Z*OxZ{GgI8@bgcGCn1xY@B*Jv5 tydtPh0yD@Esx8*C;Ttl6*y_gjjiKyUC{bKkdppa^t0gQu&X%Q~loCIDf3TRZ>& literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/chat.png b/plugins/_core/jisp/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..1d4307b0756293a2e241823a474ca6630f3f5ed6 GIT binary patch literal 482 zcmV<80UiE{P)!DTz?!!1U0*DQ^D6w;ng|TxN0Smg@JkbP!Nn6T?(Ipjxt4Pfes182`ogkqTvn{kSMl7Fq&Q4yV;l` zvgMy-1@Ws!GxLq!jD~T}aj2Yw$+qxOJ>hwyERO}PDz(Y=4ciNQ-YDbz6`ReLcN|tR zcY1Q1l?OCz81kXq6yI6~s?yhjaD&y+-`>c>f1jt?@E_ z!&(ytgERR4Gh#uY=o=)-4lknxw3bMv0sw@w52R^x-`#NViRf#)-}veh!TfzE2mq}9 up2Lgt;@l(&ZpSU`-rYVhEBqg|de2`JqHF#l_R;tN0000m85=xy0rJ}Z==Ll3NMREs9Iu1dT1JEL+L`vkA3&b5#gcRZe_uk?u z*5f5;cc-++pC^;CP)gBe!sKd?`fI_t+j{8Ao0C|zKWtK zxL&WcZTki#NiskL;LGke`x}d*;Cw!NWW8PwfL{R4Im)s`O6jDOPAMgnQev~&_{1;_ z$@6^BC*OlOj;ZUKrfHB;y6tvLnx^b_JD)tC&j(EufJ@Vq)9FOlbr@p?NdS|{gu1SM zFZxdw%jMGDZa1F}z+cthHEcc|0Cpzp-yj4>e8Wk;~;m+qQ4jeTT%SNzC({)oSH2tu<9u z4WPjwjbQ-K=M!TLRaLz~AAwKcPw1b4Ptf2o{Vn=Yp3P3)mdzV9^JUT3@UFz7Jfz zmbtDv>D)ab#z)4vqy=m?nEU0WtFxEn_z*5N6yq$*;!6Gd6%aWy=V!tN$^@$wED|=@!8PONar-MW zvf|i(C=)|L)$wd9s&`OVH?RbeW22L3+7vD~CCG*3w7D_7wJ%Y{R32PY0h5 zDl4)%cfOd0hCu}&&z?yZ9S@%}&_50mzJGJ^;9ehDd1>q{+=|Bwh7P6~0C;sMbEXp; z8@{}Six<+w&8BBc8AXhbxyZ~-Cnqlj??S)}LxN#|utBgjpwzSI1wd$;wq(fl#vzrE z6vM%zMa0I1p?e@W1VU_q)O|kQ4GiWfTId6u`Z)^SvpZxYS7d+^N76BPmWU`ULC$;qG0OdEtp$I#sysn!Jm z)SO5Zx0-rboSP*s+MuI-kQdKClbdUZeI-KJLM*F2SS#+_{i>oOH&R}nu;QWGdz30K a72-E!P4#mPP0oJ+0000FR=6g+Ru{@EiLM-DCFa4d%0IyyE%JEjKAFYpS#W=e5cXQJWLh=k1O>e|=x?RAH}= m!@9#JY(KuAldJK1#J$b4|CO)sE@Pkv7(8A5T-G@yGywpR1Ye&3 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/dnd.png b/plugins/_core/jisp/dnd.png new file mode 100644 index 0000000000000000000000000000000000000000..8f357ac077d9f7c7f09c3eb8f714f0505efa7fee GIT binary patch literal 318 zcmV-E0m1%>P)~gG{pxgW|O}2!*%X7~15N7&bcC{Ksp+6DCH6pO;QC z-1YBcV7lD~*Zfblis8!LI~cCT>IIn1|5U3`G(Y~&z;NonIDRLW zhSq~?83`J|z`($;(ZS}w;-CKv_gNSjPW=~WU|?Xt(2UmrV!^=Y1&R#-0J;cf-K6W5@MOhu}WoOBiTxj zjY)Rr+#QSjxSGk&z%a$-oO|ZuSav9T2et@kEAR0o>h&|Vi{8v%QO*M_DKMS`S}jZG5eQVC=bs`1}SQ~C)^Z0t<# z!dTU-{Fy#HIzcoVg;EM6jcn{m4U4a>AdyHQwkT8COf;C6%|wHF+57<38oFQmYtgm< O0000pfi@Ln`Jhopg}*r~;4k+*QT~ zjKKyB!3I2+E4kDXIRABawXuZ$+R0d1wn0hdqyJro2|-e?RXr^oH_umdKI;Vst0GX~=ZvX%Q literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/editpaste.png b/plugins/_core/jisp/editpaste.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f8eefd2101590d84a571b45977e3f762059d02 GIT binary patch literal 731 zcmV<10wn#3P)+n{Pg5ltdx{z=~CM zl6=Lg%Gt6xO2v#E$=7`xZGKEeWf|dcnBsc&uRQCN&|p%y&q9k)nAvy8|!8F)y9J0)@`=#y}^e!_vOIAS8V$e+WeWA{NVha zwM42`0U^gRC_@Ml(4|r--<1z?92bCX zwX@k)JDWSnYJ}$@goi5xLU>#@M&~2z(g0YNg=JYmkZtDz8Mwk@|FKhlg?sUI6PF&8 z|J9!aBml@{GD@KD3fa-w!@+$!0{SWb)oeE~Tz3>?7={dmLeek{36K+l1N(O13c=l; zn^=~GrfKq@j&xmDgb?VuPTi6kx$N3?27Zn3;Z2hG)i~K~7R#~svw71Jp zC?s1iw(;s+n$C_k`27u62tV-ua@5>(TuNtz7o`sbu}q8UA4bP_d(2Uep!8fUt*gogu1s*CV#Cz;i6jt?lCwxGNGfht!?!8_j73fF5bU-#+QMgD5cZbP*WOobguU!Ee%nMOH>FlpG`Kc zUCzcei^2I$Y~d_o^QIwl!$@Z&kdczjW@S2^CY4J0&mEw*`vyV?T;UaFZ){!YH8r0^ z(=?PsB7vr9a{Rx6(SJ1dMkcFBBtkeG9?i%!O{G{c5qzRjRTWiL`2%{nk8-OhRA2xA N002ovPDHLkV1kcvR~-NV literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/empty.png b/plugins/_core/jisp/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..f14457625d33c8a9f5962538718f2b8c4efb4b20 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`GM+AuAr*6yZOYzAFsn9nD&1Yo h)+1$*bwI(0fnl96Q_*$J-k(5q44$rjF6*2Ung9<26~O=i literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/encoding.png b/plugins/_core/jisp/encoding.png new file mode 100644 index 0000000000000000000000000000000000000000..677da856b275a39839f5932d7eff56850c4f3bae GIT binary patch literal 268 zcmV+n0rUQeP)TJxara>cmxs_avnEG;UFd~X9EF`zzy^Ub-^cqtwM;iY5HdR=FLop zm>Fwqv+6Z~tqF`%M*~1|JB)BSz@S0Dy{gdp15PNl!_vB?#9C5rK%nMQJU; zN>Du#Ff%bTW%u)Pf}!nqC##RTF?NlUo&Xmms{GmqxyP_k)nc7GVA4eC3HSlv2LgZ^ zWl|AP<(~?SWAp=i(`FG!PZ)z|EBH3H|0__@G6gi;#_$qrQ_%C3p|0!xKK#zKcAeh< W!BJ(sp9FgV0000+}rLn`Ln4Zh9Wpun?7Xn7LD zwV-Q74eLVfS(s}V+&5EHT>713r;xGp^_iPzs5Kn&*|oj$!ChzO6_(v<3*RkRZI|$N z;lWi!laI~xs5G5?FUMWwyuECLN6C`85B@T!tevv&3O|R>gk?rMi)BR8R$W|ufNfRi zQQ2iJWriw3ci0UU{8K2|G(&N3Z?M+xPaD`D8f6Ok-;I9G&B7iT&mUcU2k1lwPgg&e IbxsLQ0KSA#rT_o{ literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/exit.png b/plugins/_core/jisp/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..6233a1693fd49efc88d94897c565eb4ee1cede69 GIT binary patch literal 252 zcmV_Nls>Fn@=JlT2F{F?$2XDOT$((u4}@DhTACK>^i+M}Lnb z2@nNw;YE?q`s?6f2mj=1g;lZY$_@Ix;vXp>m`$^YIGxN{E%>SazpFQbJYD;FnK>^2 O0000eX4Aln^D}%+4x$X1?{Bs8%t3P;uVE477^UVvMecy-upH;#y}DgVKw)@ z0|7Gg0QTNDv1M6u6N!lJ`*N8{&U_C^haAX=-~zjQy8Erj8IA~EWvLvyH{2WR>SThM zF~)eT0Z==U((a)0a#A}>b6hUo01}u%CXCSlXw7kNd_H`g2x;zE|E=JXHsz{=v=?-D zv5$Y8)WlKb8JtCFroP0iw*8FmHzwpJu)ky;!XtywcJw0dGTikvc_uR&Rx6@V% Tn^Y1g00000NkvXXu0mjfM;MPG literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/ffc.png b/plugins/_core/jisp/ffc.png new file mode 100644 index 0000000000000000000000000000000000000000..223c0f2fa4838f0271244f08b348b4896023fe2b GIT binary patch literal 283 zcmV+$0p$LPP)d%9KT hAQg~R|NjfQ0S_*^NJHn0o6Gc0ekKE5!sd6HC>PJ#DHtyZLs!aW;?RQ z1rC9&6s20L5dpPUYeoKoyR2wX5kbxwA_6m5DN1H+L~MI&+=>BoXwDhyn!(Jrt{Efc z?gKKJ+-EPSMr4ZO2)whn`f}39{rJiuVFDNBa z2wVFNI?qk;f}yNZk zZ?b}7&mkC!xglMW{Z-o%@q)ZM1xM?@oG%t`3<0o9wS77hjvRTwk%6sAqFm2Qfp)yBqmT8 z|1W|3OgHfF1(z3|T0F+2Cin|vt(d{^eL(G?L?;O6VW#-OH;?RW?^3T{17O>$5uZ4T z&E^w>=Qk#&hV1Xv5))*Oa=9G7rU`YmM1y%VY`16{NcqJ`N+qWQ938HS)3ZiI^!rPg p3*p|ma>nQY0M8GiBa!zz{{ZB@PO@;Tn{5C9002ovPDHLkV1kiOl8yiX literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/fileclose.png b/plugins/_core/jisp/fileclose.png new file mode 100644 index 0000000000000000000000000000000000000000..edf1f27642f6e25943abc9b0ab0bdceb4115f630 GIT binary patch literal 606 zcmV-k0-^nhP)^T7 zty)VK6FYAqAW5O20bx0*K(Mm3(tO*Tt=6j7zph8WN497oun(<>m^s5aM)#ws+R(^7 z84L!301ayAErqT3EkE*m-}iD10F8~tSjXpQ=Q*1OEojhx+yN_^e_75#d4A)<;C*q)74^J^f&(K#}VfULG&OxIXfw6&eJu5WCpn1LNq(33r|WK)`6CCh6!9P(T0#xu={vpY4a< z69Qzxe9cR6hp7-7r-P-dt6B&}07K(zZ=CgC8;ni@; zefsm%-*^O2$cPXCklZmN8k*i=??3MTMW3XNtfA47j>EVxxEw4cOS#4AT{%xibk^C( zT5C;Yk|fCvGea|TkR5bBc3SURe&q98<~@#Xx{0_HcfNGG-@5HjZK3H-T(jq07*qoM6N<$g8sM|1poj5 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/fileopen.png b/plugins/_core/jisp/fileopen.png new file mode 100644 index 0000000000000000000000000000000000000000..055785c60cae23fedf1fba17ebbf47870106bb93 GIT binary patch literal 528 zcmV+r0`L8aP){d)~j2 zCzFC8aO3?+xR_NC1c586Hc!!C3g$`uuNI1IR>9ar7=}Dqzd3dI;Kg=fwL-wkrPJ=^ z{c9{PEyF>NAK$y&dD@zrFbnqq7MGTB2fq-;aB4xb_3-LkKzZhoeE^a^!VI~7?-eJ` zUIf7NJQm7jQYrHoVD-kz)O#EOR7&{q3;vl4yxDvUfRvInO>>u0l4TibnsV#*8rE8B zwb}>(Jl_7yv#lNW_kU8URIt`C94ZbE6Otq$j^o@1g8{8pi$j$3&CuFa#@E&Bc6RI62#QW&FAYM8e&h9yZtx7%f7 zV^idSljpA>gkUg;Q7XgpN*H6%TIT>MC0c8uC}MZ_)AShE?yj@9_YL1KQ7V-XLST$V zYmHKB)W(s5D2iw{o5y4P+AmYD*8w*gl>i*hIjpr9V==~Hts#zMdcEG%zxV@%#UPs- S%iTu+00001v~)dMy*$x6UTAS(zFE|&u_h=r)c^H-!#6OuoWf09nDu875f2oq6k61Gcq z3l@i*WN|0CGc%us*}ZHM4T3K$d^_(qFVD`-m(yAUaCr1kSSc-l&mX_!HvM&dTKNab zLh;UB07|9OW^X27I-LSA8jVm&-56SH3Wb97`+aFN8lttvF0W;IW#p%c_9wHAOViin~p8<>nfMa`-z-$RI62-b2#S^k+e?Ut+hDk{!Wx^7>~z) zBq|n*h-}}@43UU1nM@cA2E=iUF$QA{-ENm=vx&8q)6-M(`TTw&fH;n6wORo5dOZN< z^Lgs;J);EK7z6wsm!w`S7HQDlzm_x_W9apI7-NXzcq?ev8RfLrc%CQqdOcm-9Nc73 z*VS&fsZ=WXzE2p2xdQ;D6vN?=FbvZxzfVdjJkQI{S`Y*|-}gl+^-n=cDS{x#rJwdc Z^b5DnQqXHl+B*OM002ovPDHLkV1iN2_A>wg literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/filter.png b/plugins/_core/jisp/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..bdaef68284f7611d66a38b569ee2551b6247f1c1 GIT binary patch literal 695 zcmV;o0!aOdP)AcmKENG9A--nJK!OK6f)964L#VNN{`}2Z;dCvgWxCd*00fviXMb`5YmH? z2$r;qfdrLB!E z?1@FL2`W@5QMjpt?{G1@fEl=11v}>m2yjzJ9LMOoCL3qCnZrB(cwX+m*vFpQ`Hu|z z0I5}Qs6v`i6MV3zmeKnW_RNA0H(EC^D~8Qmn|S57vb3qC_o_!W&QMA*J{wnUfUp+M zPbr_|#7T^b6rI%$&6OsmWzdnvyFC7ElF@tFLxqalcWzhplbHA1W$MNyDXa_os^XM1NM z@<-^hnTQb8BMMi*3{}mJg#2~ayiSv@HBgsD*YoPl-wT7 z9xto;9|XhGM58g)y0o6$RO`u21t6r9`2BwM?Pry)t}c$PGjer{4+kZ7iibSDb%V&D z4=JT^mW^cUkAk_mIrZxESE{z)*gB(nYEwB?C{H(Tmy6WycV2(VF*`fkrUJk;3%G`c zh8XMZrc|$!t6St67KOTnSwEqCqUd$m4EnBO+cp4^@Qg6c0;X9Ykw^%4KA-3PL7C3p zK6Wh|H&3I{pyBG^ z=%C0+y+&x_0igkJGlReWLLd-iYh{^7h#b^#*JH_`9+E04#6Wm#l08KGI0A{bQnM|8k>G22+R5qIhAe~O5X_|5%F6W}IF9`>9UZ#{%7)FY0 zHp}Yj%O<3$z^P>H3mz?EDYXmI3^(W~-flDKU%`QcCd) X_{J%?1jo@f00000NkvXXu0mjfu5u-L literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/floating.png b/plugins/_core/jisp/floating.png new file mode 100644 index 0000000000000000000000000000000000000000..5f63bde533988d93c40268a3a9e423cda4b23074 GIT binary patch literal 251 zcmVVR76NZ?k;y%X{E1&cSM8$U4;37 zYaiP~z~wJ@@S0%6b`Mt%NzyLC0Q_0P2%MR`Z=uQVJir!6~MXw#<%;es8Rc21r zZSy>HTr)HEZ(yGQU|E)Fo2t6;3p+W5wG{e6d(bBurdhO)?TfP$A_Xm-*8^tY|6&xi>ypk z3+0w1

    xHYsq9@ZMo^l&-S}wv4aWIZ1Vwci&nx;r#mVsqiI25dcQ{Vp`VO(v5-7K z26vOAbxd`rOu)vFC=QGOwpAzi3?pf<@(DUcI7YU^cBlm)A?OAm66mUh<5nHyJ|y*}8=LAij@=Q-AK>|urR?i2A!oqCBpBMNWM<@w!$F{3&|NMTejAVo zSZ8c-U#kP+F(i^XRFnXc2qcn#U;!Q{kQac&0H90@FeN+e8BN<~%jeA$wH+>9zYc2& z>5K)h2fz}5Ea0sMtQ4@k1lUc$%*olGvgdTUBbO|m5*VQ^vQY{1V-+8dxOizmVEh%B ze-FOCD{%O%z=a8rSHOtVHNLV}%mDyQqo&^<_;p*k<-ooBNxXOtl$8>KCE(mCqFE%2 zL3z>0wszNtrzTcK@>_RzWwg5HfdQH6UWt4LE>D5;;~*zM-T;65CB`9fPSc7xC?d9Z z?+q#nXWj0h58hoDBAWU#y4{|gZwI4IayBG8pMFxC`o5KxK3bF{h8r5%RtbFX?QIDA z{YU@reS&;UhsZCeI#&FJ#zrlss>k{F7uLlru=9r`6~biK!Qa=D=1tB3b{pNHpre}MnQ7fA{$RaKO1Yz+Ua#`Zq}nwrX6xg4}?Hvg|0b`DIe zT)A}A=i65xXQ&L2f(8Mcxp2u`J{F0%zg1QqcmwbNz|1`){Qk>aIET*a=TExl1;T^+8~$U?t&lm5=k{ohe47sqJnu?uUqy z+sI1qB#Lh$x)Y#mvqUmD8fDqG0e~y|LQqxHDpfp2n1y3tEx0{(01+5P1y};M`Qf-8 zfUudL$yYQ)4+3V9K!k`ZEmOK3msY_Pymkob@1TP>AI06 zcauj^`V?71-&G%?F%u$Rg7&>1P`euV`~lF)fyFMs(1d(O@E&qHv~*#Nkpbem+r`At znTAER8_#1|&n`8lzVb zyf)qjUDpeu48!6_DpkPw869I|W6(4WmT9oSyklY$@naWHpX#bw)5z7Vs99XSqS`+> z@%<;$f1^s>y=Pbq`s;_^4`*JzeDQXXWeJ1v`0c-Y001rk%K>Z+g+je`cKfa8Hk;ML l^Sw@ovmL-z0G|2Ie*>mqW`u2BVv+y=002ovPDHLkV1mk^dfEU0 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/gadu_dnd.png b/plugins/_core/jisp/gadu_dnd.png new file mode 100644 index 0000000000000000000000000000000000000000..df49dcc470b9939b4001b4f06ed7c984ec0ed3c7 GIT binary patch literal 859 zcmV-h1EliK!Qa=D=1tB3b{pNHpre}MnQ7fA{$RaKO1Yz+Ua#`Zq}nwrX6xg4}?Hvg|0b`DIe zT)A}A=i65xXQ&L2f(8Mcxp2u`J{F0%zg1QqcmwbNz|1`){Qk>aIET*a=TExl1;T^+8~$U?t&lm5=k{ohe47sqJnu?uUqy z+sI1qB#Lh$x)Y#mvqUmD8fDqG0e~y|LQqxHDpfp2n1y3tEx0{(01+5P1y};M`Qf-8 zfUudL$yYQ)4+3V9K!k`ZEmOK3msY_Pymkob@1TP>AI06 zcauj^`V?71-&G%?F%u$Rg7&>1P`euV`~lF)fyFMs(1d(O@E&qHv~*#Nkpbem+r`At znTAER8_#1|&n`8lzVb zyf)qjUDpeu48!6_DpkPw869I|W6(4WmT9oSyklY$@naWHpX#bw)5z7Vs99XSqS`+> z@%<;$f1^s>y=Pbq`s;_^4`*JzeDQXXWeJ1v`0c-Y001rk%K>Z+g+je`cKfa8Hk;ML l^Sw@ovmL-z0G|2Ie*>mqW`u2BVv+y=002ovPDHLkV1mk^dfEU0 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/gadu_invisible.png b/plugins/_core/jisp/gadu_invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..53e62ce709f8e7fa2ce75f6295c4ef8709db9007 GIT binary patch literal 839 zcmV-N1GxN&P)Z)G-G^0hS{2TEu(Y&v)YsQ{p;RitFbwFrj&L}PYPE`D zv54{UafHKRh@$v)VPRpq%S1_%n5wETD5V%49!4w{!`|K=3WWlS#Ue&WM?naI@B4IY zZ0uR5uN|1CspfLIo1W)^F@}+m5v0@UE;)=bc%CPh%jHY1>*l-mpin40cU^Z*)3itN zc>IAN2;W@SbpW8%YB`+qFUe$bE)t1+GEMW{{{H^uuA?vvBeS)&b^9!~zP>)YxVXqS zHa2G4m}ObfY&JXRI8INOgj6bZ1mNf_L4SY$FT*gns;a-+*x=w`9l*zS{s+ToOJyTF RW9t9_002ovPDHLkV1np6er^B& literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/gadu_na.png b/plugins/_core/jisp/gadu_na.png new file mode 100644 index 0000000000000000000000000000000000000000..df49dcc470b9939b4001b4f06ed7c984ec0ed3c7 GIT binary patch literal 859 zcmV-h1EliK!Qa=D=1tB3b{pNHpre}MnQ7fA{$RaKO1Yz+Ua#`Zq}nwrX6xg4}?Hvg|0b`DIe zT)A}A=i65xXQ&L2f(8Mcxp2u`J{F0%zg1QqcmwbNz|1`){Qk>aIET*a=TExl1;T^+8~$U?t&lm5=k{ohe47sqJnu?uUqy z+sI1qB#Lh$x)Y#mvqUmD8fDqG0e~y|LQqxHDpfp2n1y3tEx0{(01+5P1y};M`Qf-8 zfUudL$yYQ)4+3V9K!k`ZEmOK3msY_Pymkob@1TP>AI06 zcauj^`V?71-&G%?F%u$Rg7&>1P`euV`~lF)fyFMs(1d(O@E&qHv~*#Nkpbem+r`At znTAER8_#1|&n`8lzVb zyf)qjUDpeu48!6_DpkPw869I|W6(4WmT9oSyklY$@naWHpX#bw)5z7Vs99XSqS`+> z@%<;$f1^s>y=Pbq`s;_^4`*JzeDQXXWeJ1v`0c-Y001rk%K>Z+g+je`cKfa8Hk;ML l^Sw@ovmL-z0G|2Ie*>mqW`u2BVv+y=002ovPDHLkV1mk^dfEU0 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/gadu_offline.png b/plugins/_core/jisp/gadu_offline.png new file mode 100644 index 0000000000000000000000000000000000000000..2d467feb76d7a21096b6ba7c7d645e122d3cf2f4 GIT binary patch literal 859 zcmV-h1ElWq+yYQc3(nwWg&_Ng8zaGY2OTlB;A*mDzp`<$i5V;qM%*a z+1Z)7GjnJ9peqX2^K^cE=Yw;;a|mv+d_Mm$l}i20IiJku^VOR$%54Nf2p0fs+jjpC zL)%WVSo~;laq-i3?0H@XfNUJc0MOgcudlCvu&}W3`OM6W3IL>CC=?3M8DmcfA$dhn zqA(1fwpy*8BuP}pSVSrPRZ)}|jIpo6FnsJd&i&=(f9l)Z|glnui`M@I*; z*(?Yl2*XgZZF{28XiPMlO+-=j_2J>+@7G2sl}dHr_ur_hiflHE?(S|RNrE5N~I#N5o~O1FkRQbvn&gyX`)uE;q>$r&1MtF$HzE2I)aoEnx^TD zu^-xfWPX1Bfe=D6#zr+wTOJ%7M7>@|xm?E7)D-&q`mnjV3Dl)`n-Rpgu_j$=5E165Ve?|@P|Nhyt@D7vTX z`brc<5JG@+eyKI*97&QuN(o9SD5b9FdDE#>s!p!%V0(M}@2;+{JGEL3`}_MC8ykaZ znm9Q*!S3!Z#>dBDnkIx0)l#W62>`53P^nas;o)Ih)3i@|dV0`kG_bR?gM)(uoSmIv zWMl;CbQ)n8`ns-vS*=$8xkj+Iw)P<*u|703 zbQietOr~kB*tY$CX=&-Fi`2{6+1bxH=dXO<|6+A@^~Z~oe;WkBBSOd@*M8w9o12>( lH4Ni7#@JY~Slqe^^B;(1J{8*WixvO?002ovPDHLkV1oDqkhK5+ literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/grp_collapse.png b/plugins/_core/jisp/grp_collapse.png new file mode 100644 index 0000000000000000000000000000000000000000..da6193a8b478e84735b3cc8e218233ca4db432fb GIT binary patch literal 244 zcmVZ zwU*G(8naE{iN}$t)-ud|1wg~VPfiJRo;i%IJZ2)g4a7gC6cLH5?%&*J(v#_AunH^G zYEFUsI}wqXPZ{+rUUs1*75x%V29e2=7y#v*=Zmz8)*6Qi{A6~QSSKsK5_qvl?=gRR uI(cZQAIVZ|0F%L{8!NEUM}p{g{s(WaozG#sG=QG~0000GVaw6z6~7wh6t5SX6142;oXveZ zIT@1D)@+?LuaS#}( zwPMVKnL%{M@hGrzHPQucLmKd4J7$JuLW@8FG*u1#=d?+WjadMk;W;0ltTisI5Rv{1 zLBM$vncnXLIcIWfPa-MplY{V$E}|MYJ-MN4HE!EB)x#S!mh->-0Kgu&JgxNM@Bjb+ M07*qoM6N<$f?JAdrT_o{ literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/grp_off.png b/plugins/_core/jisp/grp_off.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae57b2b696f50078ddb1e8ae224ea642b2a687e GIT binary patch literal 260 zcmV+f0sH=mP)i8X>}l_lAI7d=`;5guLz?T%(ECCl2~IldY?W9JPJW z?#_=6A`BveysoHOP-{iaEmzfe@PuYNEryZ}C~uT(NK11z1nk2i4P*l#%?Bhc2Bi5O z0IZ0R;{fP7mu$z)Ziw#AX&P_hxpM+gNI(R9`WHqk?(TdHxQky>IA16^FSODApQJ)pqD@>8RG z<23C{8^l7^JQWe-ViSJyLH0y_U2~vUp|#a-Zly>1&OL&`41$GTD>uhHdSYA1Eh!Yj zxM*TBU)Ef%70<4*u!t6&5&B}JGQpU6{l{>o%u{6tytEdSu{KFKUj8C2?-8fwu>aIG gUm1q5T>D472BP{`?(XM326PC6r>mdKI;Vst0K~LCdH?_b literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/grp_rename.png b/plugins/_core/jisp/grp_rename.png new file mode 100644 index 0000000000000000000000000000000000000000..9c77ed95c68514f5c6bc63e4264e6e6dc645afd6 GIT binary patch literal 233 zcmVd zVA}#xiuJ3ib|)bbsm(1ZMZ_3~&CE;?5&H%aF#zUHAAv~jA_D--1c01(a6KH;4!H<= zMKkeZHqA_G<0#%#utGON;eG0VBkcQ*l;X@a#4$5@?_ckrKc$7}taSj8b0z@r{`sKV jyzRc!SHY)!?Jo)k@DhTa(rV%r00000NkvXXu0mjfm(yVi literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/help.png b/plugins/_core/jisp/help.png new file mode 100644 index 0000000000000000000000000000000000000000..1257e8d3c9eed1bb569ac45332f7d00bfe94ef1b GIT binary patch literal 986 zcmV<0110>4P)JY^ijd1e=;gu3qU}S;i&Uh4LB;+h>03)dgtXMY zh}f5cE!e~`no707AezRI(I(bpW^(47nR8ivIFm^xF%=43uwb+H+TZ@xxAxj!la$V0`hqE2f5lo`h5Hz|n5l<3Q0%NJIeKtx40p&!naZbBk3h%OJrdHy3dEra^u!!#87_;0=sT z4er~*`vWElVZB^s@KBb!Gt+8$p|P@_{vladi8#^c;8%UV{yA>g*IP9`v_E0!ErlN{ zo)@Yddou++cEXiCJ+5RsUFq&~Wn|QqhkxW$*It8C0DZkSLxuHBD~(I>DsF(K84$l5`LIg1fj0yt6FX)pst190PrdhMi9k97(q3H zFic;GRvN?53>j4vT4|zEU#CJ=Xj( z3yaUwn6=GCgo2lF<$O-nrJ%;RToF3k6>6(+0&yHtC`D+cX|`=*X;fAO{#r{|4>lWA zpS&+WzNPZ32`Z`3l!fM+H)Vz62SYv_b~ruiaPo+v#ooFPaTu_$9P#a^Ikf{Apy-?Y z{zMapK6XZMY6ml!EK#Bf<5W*4o4TD5!m3a1k+4>7tYXK1d~U*(j^--;y~5#6jb&Mw z2E4HkEEE1*h9HEnT463P+?|hEE?HbTe`oh^bE|#!-LQ1FMI7n$InZumI}QN8UuNlf z$m~;_rB#E=XJ=me(eDbpVPltENhEEMNNvGp_jj{b0{>V02W=j#Sv4v)&;S4c07*qo IM6N<$f-P#&_5c6? literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/history.png b/plugins/_core/jisp/history.png new file mode 100644 index 0000000000000000000000000000000000000000..8f748ab6a9f6421c228ae34b2e5a99d283d702bf GIT binary patch literal 328 zcmV-O0k{5%P)$7yK7xhO36k60Qz_WWk8UZK#r-5O?Pp3HIN>_-PIO1^D97gvECm+ z!m5A_6?BW6Z>e7E?vFhof36PMbg$*U-U49NLC=R@6=*R7Eqe;O29^Odx9@juzYZS? zqo5#6)8ZjuO&3%KOiBu@I>f4@){Cukq8oovKt^wOwdCl8=9hGxF9MnbT6H{p)%>DX zGXijTX>ni3KqS$&uh7fcnkUre^#Zg?BBKf>5WTg{lQ=w30eU{gc5Vh4=qU)u_@7uR a2KWZvx~dU4VoKfs0000KT literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/home.png b/plugins/_core/jisp/home.png new file mode 100644 index 0000000000000000000000000000000000000000..b496db6abd7079919cf2a0a406e8123a51a1a481 GIT binary patch literal 292 zcmV+<0o(qGP)IQuNAqL_X7tEgf>#-c%m7P9gtcp0I!q`;HOprNS*^! z$9n6l2R5?$j$)SrxkIKX6n!glYlkU-jhx2;FeX5s11TjtwsUIXNCqK~`PzvO(X{QN zW`>!Wxx$)jQB%iit&O_?NAgN2>RDezJUQ9Eiqo$y)}O<^g{?BDimdJyJhl*q=oJJe zX_bV*-7WQ+lkO{o%c4OP7<0(?ALYrxu0MqN{$T#A%=bsv!EHN+fdvQYyEo8J4tk=y q_{KptVfizzpRy|;Lb&`CxAhOtIm`Mn?3IZC0000 + + + SIM Icons + 0.9.6 + SIM icons. + Vladimir Shutoff + 2004-06-11 + http://sim-im.org/ + + + sim.png + + + + + icq.png + + + msn.png + + + aim.png + + + yahoo.png + + + yahoo_offline.png + + + yahoo_away.png + + + yahoo_na.png + + + yahoo_dnd.png + + + gadu.png + + + gadu_away.png + + + gadu_na.png + + + gadu_dnd.png + + + gadu_invisible.png + + + gadu_offline.png + + + away.png + + + na.png + + + dnd.png + + + occupied.png + + + ffc.png + + + exit.png + + + button_ok.png + + + button_cancel.png + + + 1downarrow.png + + + 1uparrow.png + + + 1leftarrow.png + + + 1rightarrow.png + + + configure.png + + + fileopen.png + + + filesave.png + + + remove.png + + + error.png + + + collapsed.png + + + expanded.png + + + mail_generic.png + + + info.png + + + text.png + + + phone.png + + + fax.png + + + cell.png + + + pager.png + + + nophone.png + + + webpress.png + + + find.png + + + nonim.png + + + online_on.png + + + online_off.png + + + grp_on.png + + + grp_off.png + + + grp_create.png + + + grp_rename.png + + + home.png + + + work.png + + + security.png + + + run.png + + + network.png + + + message.png + + + file.png + + + sms.png + + + url.png + + + contacts.png + + + auth.png + + + empty.png + + + translit.png + + + bgcolor.png + + + fgcolor.png + + + pict.png + + + text_bold.png + + + text_italic.png + + + text_under.png + + + text_strike.png + + + cancel.png + + + filter.png + + + history.png + + + editcut.png + + + editcopy.png + + + editpaste.png + + + undo.png + + + redo.png + + + typing.png + + + fileclose.png + + + encrypted.png + + + listmsg.png + + + urgentmsg.png + + + help.png + + + btn_more.png + ; + + chat.png + ; + + encoding.png + + + add.png + + + new.png + + + ignorelist.png + + + floating.png + + + + + cell.png + + + birthday.png + + + more.png + + + interest.png + + + past.png + + + useronline.png + + + useroffline.png + + + userunknown.png + + + web.png + + + mailpager.png + + + icqphone.png + + + icqphonebusy.png + + + sharedfiles.png + + + jabber.png + + + register.png + + + connect.png + + + lunch.png + + + onback.png + + + onphone.png + + + alert.png + + + sound.png + + + nosound.png + + + livejournal.png + + + simcard.png + + diff --git a/plugins/_core/jisp/icq.png b/plugins/_core/jisp/icq.png new file mode 100644 index 0000000000000000000000000000000000000000..7d56cfd78973268020a093faebbaeba8604cff88 GIT binary patch literal 369 zcmV-%0gnEOP)FWzzat=A$#tK3cgciD%Er1pn@AD$Xn0<1skjwzO zOt{QWx8Mp~W(7>13Vhr~$bBk$xQVXDaITra%)lIicb)VMDIQ2LhwS!K+3lzD@_8kB z3?5TVGI2df>Ircr-b!CyB)xa4u;`PIrAe_CA_S;_LmNH$^=;r;YLN)>7KoYMc{ggU zEOF(xr^x`Q)7!A~Z?{05P5_!*4fsNt?JOVefowChRYvLn!Jupj$ZtGw#x4~#W~sDz z?tv??*A^w2GA*I*L8|3#KAhbq+gQ;4k9~sh70>(L%ki P00000NkvXXu0mjfxA~+J literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/icqphone.png b/plugins/_core/jisp/icqphone.png new file mode 100644 index 0000000000000000000000000000000000000000..bef07ff7d265b9f937b086082f916829ec4a9e8f GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp@KrFz)1|-ie{%Q%N3OrpLLn`L%ofOD-K!L;g<)+}m z|6iisr04Kld}-(Av}jp>n6k&ItlZN_!ZXgZugcn|*10ENA=K1b^+0gMv2F)Bk-MiV z8a!Is{Ul2Y%U(Ja{@QXmdTK!FPsNn7a{fIElN=`39Xjdw{*|DM%ZJE;o`}ZS<#AL{1PCJePO8 zLS@3yZoY@wmeZ9^$i1#CxRJgskzpE3x%2IBo!-BW>{fW5`gX~Y-`_sSp3afa(a6q9WBVu!345l0=FG7QPGWRXl=lm) z7Xgxmh)Zz0zO+X?pIZ_UKT|8>TUcSO_B18;9MmBmEUzD}yYby!9{`{WA%#@9JwJfD zF=AV?7-u?xT(>;3M5LI56PV4-vM>xpvN%GQz>4JX@+fP3zb~Cam*0OfiR?MM v1QvElR`BZ#a@dM!?<9-(0KmQ9`Jeg#Wf6Du=Kxd?00000NkvXXu0mjfvr~FL literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/info.png b/plugins/_core/jisp/info.png new file mode 100644 index 0000000000000000000000000000000000000000..a3808beb1be02362b8d7ea84642b20d4adb6d656 GIT binary patch literal 512 zcmV+b0{{JqP)^C~)x0~*hniXfNm5|)nO_+*Upi*b6l={pm`4nypA zF12W)P{2&4vqVrc*x0CnR9y8PoE0zw=XMs1Or{_ruz5lvxD|Li3_gAS zIRR&COobB*LV|X}e)esQ&fD+keY}Q>PE~f6V3Lk?%7VKoC1n7iK&V9ni)JQ7l_d+x zGFWiGRl&okiuS4xq2l?|B^-Yl;Plj{3M?TkSvc77%y4j4REq9Zu=ONJn@7R+vlXnZ z`o)AAch2$t%_9QrNPaoWYO9_A0000NRjux?CjZh%haYeXZ?>ADARfm5#I$2G4jsvk2!Lo`sZ> z<8$#JvYjocr{@JCS=B1Ndnk~%8p)Y$ON#R z?Lz@(W&lh*@e6~uZXzm_5cZ4$uv+*;Xb*6)Kj`=4(cg*>YzoW=2okva zpZ|_LB_gC?tqlMoqEb0}iR`_nyZi}d3k>92*N0tWk|Ie5*|_&0#LIghx(k!#8WZMu zB7(XTM!~`MB7XX9y^Tt^b^2fA!>$BCi-^)%b3Pi*N0UviYKMp@4gEWp?=7eODlPPc z3{eRpqN>_)+OM+701w$OA6JUkc0ydj=)hVVTw^FUZBLvv3*hb3@%>d!KGme{#ikw4 zhh52f3svnNM4mc`Z;NXkdK1TDsCXJ9 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/license b/plugins/_core/jisp/license new file mode 100644 index 0000000..72c3cae --- /dev/null +++ b/plugins/_core/jisp/license @@ -0,0 +1 @@ +Unknown-proprietary diff --git a/plugins/_core/jisp/listmsg.png b/plugins/_core/jisp/listmsg.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc311ebfed968992a5a941cd6b638961f82685e GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar*6uPQJ){K!L-B|4|6v zgQ(u@Qif|;`#n}HIuZVU@&^k&79qi&UD>tE9yuLtUhlkTvgCqwk~=yDZa>n@Ir?f| z<5gLPu2$=}j^~%S@J_U2uDjXrc-r1R1q2S~ zDv1a^f>WjS9#?^TXkc4~SPKN+kUgcS1 z%)<<3BEkW~OtiM!Ey0*%P7@(&HQ+PHN5G|m)NiCaC*+?BPjyD9BwoKHSPgdDjvjx& WKX!_}^Egfb0000q^7@C|k!c~) UWo_AvK<6@ey85}Sb4q9e0CS&Iod5s; literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/mail_generic.png b/plugins/_core/jisp/mail_generic.png new file mode 100644 index 0000000000000000000000000000000000000000..47715c4faed09b278815f866a0b4316ada1d3d83 GIT binary patch literal 575 zcmV-F0>J%=P);D3v?%cW=?gyX& z?v0HBAfAUPL5CnpP~w^?5fm=+cdNG!!0o&D4M4m#8XB8-yRwJ(J#(d81dXN$zDE$m z$!D_QivcXYevf{;Oy6J|6}u57z5!_sN)XZLummaq@tA%%h2#7}M2v}j{lg@W#+VwP zWOMa9NO8|35i|mUPdfFI@dpz`qcJXZw-bq2Mgf-4da;iWk#{W4&7)+Cu7MFEmIXk` z-DY<3F`MfS^~dUIIeQ8KyILDSxm+ejku&F8$)>khUfSW=#3LGxpQN&#A(Q^X&$R+W zqn#uUH)7j1ffP_m?V9L&P?KP3A;pgshn^cl>=f6Tn|)4UZG-lXW~^irZ)Tp*bi(6w zTMNGnAzJS$aJNG?S6;B1%hP^!5M5m&QFoBufhz>A3tAJg6g}5^cs2c$1GP4Xj>L)T zs4+30TOj*6PuKMkYU2vS&T58`L!B*L-W~xvC0000WGo$KT%-Q0xC6{R@3h=N0Ki69OR84GPg zg+P}e6xs}}i@D8fsY?YfJP7aI^S#4)H=6JJY*YGH>c0T&0Nj2!i%kvDU`F9!muN6k z_FGj?1JIi8-U6U`at=VwC@@JPX^f|#e2?Rh-pHdL=tP4Vt*WQ#so3qbiN}Wm$r%Lz zEYrp^Z2%D$OLKur2K8El?!&Qid)CEka7{nZsW@fjOaPW?b9Q=#+iCOp^(LU-#PAbh zJPol-n@JK;EY0cO-6%Fwao(~S$Dslc2k|uI@%=)Y`++X2;*@!QdQrs2Fj+bP6q|X= zre13(>8Fqsp6nY-z^XVa%vK6n%OHK4-pHdjTFYsr)Zx{9-{+PlDybV$zn;Zqz7?uSZ_GV4amgB9uD41g0)csDi{CI(Yxu4L3UF{22ty^>}hcz^I zVVkJV@B6hv58Nx`cdv4+J-Ep}@PYJ=y(-t3melUdNfJ9?ZWvM=d2r^eSmDF%Ti9>0 tKKUiU=<+4ji1F=a(E|_jd9oOPFzngl?RG;!Ob+M|22WQ%mvv4FO#tD7Ug-b; literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/msn.png b/plugins/_core/jisp/msn.png new file mode 100644 index 0000000000000000000000000000000000000000..f70d3418cfaf66440b831a0f85623d6d0b2fd321 GIT binary patch literal 589 zcmV-T0Ol3i$<)$F-0kd#tC8}gZ~MLWdfbpYJ(42%=9BonAyrsR5G7 zq@J>1GU5kCt=Oet2dV;58)7NyD8#30NGY{p7~CJ+`R{Iw#)l_&P5&4E=}XO27~&HU zwVB!}bLGqrxB#4L20#^7faR)5$aP(Dp|FKNa+*)8fIZv*fLSc0S zELgMYbkKrqJv~oPKHD+IOJFHps2FXA1;jedcKt-haYQmB^|5uEa9lH<_{}Qwl+{2m zds7t!tECVw;QM~}2rYS@CpPYUXKm?oJNL4>&5fL3 zr2>!VLOh%`aa~sci2bfnN~y;m^##yU4;wS<2qD^|wtV|uqvJSY@>W_8BzlQ1ZSku4 b;@|oMiQL0jsCR_G00000NkvXXu0mjfzaI?{ literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/na.png b/plugins/_core/jisp/na.png new file mode 100644 index 0000000000000000000000000000000000000000..e82efcfd0333a6a3217b72c4c9005f83e12c4d97 GIT binary patch literal 370 zcmV-&0ge8NP)fqB%iCW3*+(lBa2FDI2>|*eo^&Q5Hq^T38&q*x32HW-`-G-Q`@Re zO8V{3pUPr}$b{3ufcfXcqrg_jAAxf8z-E}OYcqUb+t(Upf$igy5dLq0cO9|3M45jd Qa{vGU07*qoM6N<$g5%t#0RR91 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/network.png b/plugins/_core/jisp/network.png new file mode 100644 index 0000000000000000000000000000000000000000..43b91a8637d57737a3b7b2341b64ff367af4bf89 GIT binary patch literal 232 zcmVP)RWzK9Yk41mj`CkLL^=Ty5P-PFfdhfr+Ah>)V8JARAH%Kf8C-sa7#y>jhFF@HH6H@- zS$ob@pfr~-NxDeGI~~D-RiWwUrmi+bU<^sJVAXlDNTX#bBe;v@z&QxS?QEc)_j>0M i0uDOm9ctSX^C0BjnyQjs7iN|QFCH?cj# z;@*UmhM!s4W9!T}{ycJg^2zu2`j|VbFo&jDkd}$@WJXTL;{z48M7USiJbU`&R?^*R zmPW}iJiDOZ+hutE)%SLrI}qJQ6%kZH)X++K_-MeZmq!%c_uub^Z2$)ZsO!Ml`32uc zBkuQh$f@x8bnMR$2Wur;6#$3|DsV7(z%n_bZjTvCB~YQkH`OL!JSf!Okq0x!F=AZSS+byB*s8hReuL$bFSx0a?V(B>N+9{ zW=0GV+3?~HAQj{0CQ+im@VA8jkgwWwh&fl{a#!r4O$l*a(0S2xfCoFLac8;;_T{**KgjU8oDBeptu|E l;N4`nJGdjF%&)H3fS>bd$N1Q*joCAJ_Dy4kh%4Pbq(I z)3Pj~eLm-!-0TJA>@|t9^O~fSv%ZzAci7+9SHqpSzH({3ug}5kXOkXFC^u|b@YP!? cuSbqwl1caY6V+MKKu0imy85}Sb4q9e0E;n0cmMzZ literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/nophone.png b/plugins/_core/jisp/nophone.png new file mode 100644 index 0000000000000000000000000000000000000000..f91c6b205cf0fc98f6b51ecbed3a00fc47f43fb2 GIT binary patch literal 336 zcmV-W0k8gvP)>{&qdAZn@(abdnY%SA2;3=l<0av<{{ zwv|_O75H|$(RE#6VsQ!p=-y5Z-kG~odXiv_QPo4slqHSXx9VYFL9h!d!H&a|Nq88E zAlDwN*2X>}N%x=zs|MZrKS>jTXT!3nNKOP>-zP9o+`=?cf$@Bd!!XDvs2>I~=Buus iLICgI3lZ|{bN&UEe`@Kt>3V{**LF#kUx~mCDzcKW*bHNP=P6wG>$n&Uid=5HmwA#dkBo7pt}UvMg^o zQ!d2;p!>V!T)fumB=LH^Moz6qzH|otLu8V3OAei9=-Gn6Oc}7Y}fRhPZ&QI)D!eI!I{i;h!NxBXlU@#y7Gn2no zA=2u!pKOXj7Y(7VH`?XHElp3G`)(3Jejga{9e~)jqgu|z?;!W`ZvZ5R-!=@8csozS zc4=W<`~9CF01$<}xAUmMx^jS!gsNU9)I$p}Gqh>+r$ruKRb5rx50dVHo7p)?w?*i00000NkvXXu0mjfSiO`P literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/occupied.png b/plugins/_core/jisp/occupied.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5928eb0843f7a2d8da9adbcc36342e617a8b02 GIT binary patch literal 377 zcmV-<0fzpGP)A!*3CT4T{~+WLxV6^MD$xh9At)Nej0SN@yCAv+c15wt99kUWPA!do0q@=y zXo-YS1OLD^h;D=288up_lE=U43Wm&{Ab8pf~hVs-^+R?7NAdb}cVi`MsdzW4hlbaunQR zBYOgXR7lJZfXM@PbT=>n!0!{OpYQ1&rwf4Ns|UeW0U#(0C{@!)g#;JLG9IUkO0hv- z8~vD@3NZYiUS5%<8-PCtEfwk?9a3+TJ`xU*x{L#0#9!^M+b3w1Tc%$wTjTcno=7-E zrPx3!Bp3(UvlaT<$kZ@E0PoLk6o+Q70H8QDl8?)rWe&{P<3O9wfs@wVcR~PR(eL~P XVFX`;!rp>O00000NkvXXu0mjfH>aa} literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/onback.png b/plugins/_core/jisp/onback.png new file mode 100644 index 0000000000000000000000000000000000000000..976fe19d9f82ab486122477f9d4681b53cab8640 GIT binary patch literal 191 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 RvKasX002ovPDHLkV1hc1ajpOW literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/phone.png b/plugins/_core/jisp/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee6f4b75d65021ba8fa07b7e0a33d8fa805478d GIT binary patch literal 229 zcmV^P)QJ8?FxG*_q*g#6N66@bzDD3;U`Xa?f zF~?;KZL+K07U{QeE8-Juvq0N77sA5%;Cm~hC(&@G$3HTlxV7r0gZ`2q_!nRHB_c~8)zX+`@ zE~H{jfUGqlGU=1^CP)CiGe*8Rv8h=Tn7ON|C1H#P0`*R9Piq%plQg>q?E4N`Pi^V( z$Wbu6Cfyv1%Xey&is?ZjB9zHMEIe$IE-*yI9x(vu1}v319E7vDT2(~k=VQ{GYR}pv m=Dw-ZL%BmeTgSRS{^38;1|R($qPvU$0000G;Em^B-PJUPshCcN2JL2`mi_NDZOnJ4}JXKdhmbESr5P2klnQ|B|(XE_KR_{rY4 ipvY%cl>IWJ2du80+ON%m6gz=VVeoYIb6Mw<&;$U{nnmdV literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/remove.png b/plugins/_core/jisp/remove.png new file mode 100644 index 0000000000000000000000000000000000000000..4809fc6565009d8eb8910bca1dd67a2040e9841f GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|+dN$yLn`L<25l5PqQDdUZxb`G zsPcskPS;MGI5;2XGFdZ0uwbJ89A%mF#VaP|rbL$KT#M3qY|$rsVAnH228;8>|E^db zul{~(*ShSZPl6={1t$tLNnI&Y&{*oB$>^c!tr=@scEZv)+)H!mjOTNX^X1G9%F_4K zELGpTF#5jd=JE?s+mqLR)!Aa$R@q~C?8F_3&*mi@j1C-)+qXScU@qVL{p}9z_{QRQ n<{t(66aN0s{a&kYms-O($9{%VAq$re&<6~ju6{1-oD!M<&;VUC literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/run.png b/plugins/_core/jisp/run.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c7b4ff975c6f129f7da1273ea3d4a4af4a26e0 GIT binary patch literal 878 zcmV-!1CjiRP)EUh$afzFp7?fc!yEhc`>&*!;4((>{$pW4DgS|kz& zOiq4ITbs$VXIY|AlZlBTc6N5851jNV!TfwitghDZ`E+F2g<*II1iVBd0rvMZOizDL zKA)EWN3;}Uaoi#Qe*(jt?Q=;}I8M@JhgD>>5X4E_Bs zW@hek@7|Au!zPNN;P>kohDNbi!|Ak1CeM&lDVspROJ`?@YSkj0-sZ{`n|OSTo}M1o z*8arfX(t@kQ4|M-LY1wpw-k$2EUS*(-VQ>jG@CXD2k)s?YxMShiDg+*GMN&qt2G7( z`_MGO(a{N+%v;vibCgO2ZrnJJeDmhl%+8i@yLC=an}k9pwc0=I?d63eonvU|8{ibf z@Zj}o93H->Sj-cTcXIvu5OTTvH-5hxRh7|oh4Jxg?C$2cdi7g^K@E>bLeo6>{W{I2 zKvg9M23i;y86*;kAeYN0M5FBlgF3ctqpC6&F2wM9WgHHPdi?~`)HyzG@bcwf1Ofq; zmTU~ez%UHtiHYxc{CF0xcK}s&(AwI9qJYyWvAz9{SFiSvB#F+>5S2=uWHLvg@Q!-D zj&0k>*=$z2e}7y&eE18;#|G2WqxAM(Vso=VHoM3AdX6`5azvvh)oK;XI^p*1FHjWa zFmZdTUcJ+B9%%JkGB(x^&`tNLI~V$H{o!Yjg1ZIqZ<4A`b4AA z;OW!fSX?}yUO!}b*vIJTFyU|*kH-Um!{H#2NJs$x0_$T#Bn!-ZX8-^I07*qoM6N<$ Ef-HQjN&o-= literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/security.png b/plugins/_core/jisp/security.png new file mode 100644 index 0000000000000000000000000000000000000000..6f58c92c767e4688c3fd10dfc0f36d75b461a5a3 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+dW+zLn`JRoxEGL*?`A&ebI}_ z^O|g9GW$*B&ayHaFim~_f#YScMQfo#f=rRdBCo1x^Y)3ow@rUiq$QQ%wZKqqTEY9h zHL3>3T+$hRx2?LgmDwcRMP;35mncKT?5%=31d}(e_{B5lb>X`8I~6Lqt83qT<~?1^ zny&7e?xVhVH$SJx=8FCK=^HrwiX}K5&GRDp?mAvSck?yN@6NjQ4%c&9--I$X2u%4= o6QVugX}Z;}Q%_A#-LHSlon2~d>mS{`8|VcFPgg&ebxsLQ02t_A4*&oF literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/sharedfiles.png b/plugins/_core/jisp/sharedfiles.png new file mode 100644 index 0000000000000000000000000000000000000000..5730419b5ef545c8556f1fb615a4a3ce5b82c3c8 GIT binary patch literal 213 zcmV;`04o29P)D8Z#D`WM1A z7OLv$g_+4AK~>%T6F-kn0GducM-srl4^LAH^)rabT0^9gL)}));|oY$sp%fei2bU3 zr*5k)0bm;XjdDubIpi=6{X)t*q>2#~uHhhnyZf%_C^Vf#Zsq?VfA7{e!EHYqcgU2q P00000NkvXXu0mjfzU5TU literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/sim.png b/plugins/_core/jisp/sim.png new file mode 100644 index 0000000000000000000000000000000000000000..d774a633a4a980e1ca2891882cde4c885565bd33 GIT binary patch literal 832 zcmV-G1Hb%9d5CTKW z>1fOzAIW6Kv$M05){1XbE0xnih*7Qe7T4$ZBZl{xlQC z7E)`SZOdh0hd2Q3x2|H|pCh;E^3`uKwBA0gwP5CN6Cp(2NF`Iza_-KvmZfl>IDi(C zNcLyCCf=kw(m`lX2VeZSPOlv#J+OhNB_I7{^YIULVzzxroIQ8m_xrV9KU*&rUl4Xb zp1l`&cZU8*JCj$wK`F({FTO->evZtLBEJmx79B#N(AUo#KJtn=b^V$vr7QvjOGSFB z4f3vosk%@~VVWjNDcrhdZq1-tZ2+1;TN_@pi8wIwL%J3Bz4q4 z2))DZnx3Q&&+`VP)*gn~?Wax4qoB)_S6v#l-F+eDwvl$3#DEV5{$#-|QZ3b(`eXy` ziN{e}Vd|ruQLi7+G_*(7C~(_(fIkqp91QJYb!B<1D-j|-)P`XR1hDj%!`l5irqAbR z!7Z^MOIvZ)TK^G^#U|Q2Bjf4eVP<Xp5sZ+o9?@{z2Dxl^zHzyJT^>-5wVmxsm^7fDJdD6L_!KfuAv#>UpR`?{#%ktwF{ zh4UGhnVAo-=0E*lo~Urgp_k@!*dAOqVTozbKCpqYYjNQNUI$L*FC~6F2}?|@nHgfF W6caA+ZRiEs&*16m=d#Wzp$PyhS3FMu literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/sms.png b/plugins/_core/jisp/sms.png new file mode 100644 index 0000000000000000000000000000000000000000..7beec5b0edb5db9c9642351d3d5d908f4ba108d0 GIT binary patch literal 414 zcmV;P0b%}$P)1uKB7!0=iY7=l7>SEcZeb`G{Q)rqmm1ugq@lsBEpT!$Drsy9f*`Bm3Juo; zv8D>)f|7&;LKtX+UG3U6B;VzObI$vG@A)`K5Ji!Br2nt6-EI%6)hfEV+RvKcp zL2|?(3=^GxD!qhLzJ>g)JvkSD%RK-NG;Fq>VS*J$NXAKKhEK6=n~MmJ<4CucW(I!@ zI7tWKsv0N>H#2-apIr|m2~`bLB!O-J9i?ej=iZA6^1^#vVBG?MNuGPnN9n5Ss_Fn7 zD+?(lh$NH(03H^4?E4=3E+7a|(&zps5kXDOC3{wnI!_Dj( wWwNr4EAW=6>XZXO`p@tD`gu7)nAxoMJ6T1CM6{%WhG{1 zW$(7V zdw1ba{|FI~NN?cTjx_kiHpy=U+4y?gfP*}F&Y zo;`c^?%BISFNswPKgTu2MX&_FLx4R2N2dk_H zki%Kv5n0T@z%2~Ij105pNB{-dOFVsD*>AEli->C!Wp1tn3eEF$aSV~T?Ar5M%qc*? z?RFf8JC7*d@w*Fp9QOupwpTqhT8|Mb@Y?_>G z=Em9~Z25ydEUfuyQp;SyOWz+B=SUaN5VZY!&4WSV>}T)W7aBzN3M3}qnQ}6nXPt#< zuck{9bMqG+UinvVV{SS)#7ci-FVdQ&MBb@091d}(f|Me literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/text_bold.png b/plugins/_core/jisp/text_bold.png new file mode 100644 index 0000000000000000000000000000000000000000..da866f478beed9155640dab0db29b375a2afa07e GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;V{wqX6T`Z5GB1G~wg8_HSB4Et zK&Jf4$^ejbNswPKgTu2MX&_FLx4R2N2dk_Hki%Kv5n0T@z%2~Ij105pNB{-dOFVsD z*>AEli*SpcDO+R;6jJtdaSY+Oo}AFY_>Y+l zKxVz?yGtPHk|4ie28U-i(mgTe~DWM4fNlq#i literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/text_strike.png b/plugins/_core/jisp/text_strike.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ca3fe946f2eb8b6e8d2c5f4fd0b7e83b39595b GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;V{wqX6T`Z5GB1G~wg8_HSB3>l zKxVz?yGtPHk|4ie28U-i(m_<`!5*`4NXTk$}hHzGf Yiao5#AKay!fI1jFUHx3vIVCg!0E{9mjsO4v literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/text_under.png b/plugins/_core/jisp/text_under.png new file mode 100644 index 0000000000000000000000000000000000000000..3c9e0e8777fa1a9091fd95512497134602fc2920 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggac4iSVU1^E3?LeV$PZ!4!i_^(A zWp5;yRU0}Roenge*|=%bul_UkKp|x_%alU37^w+2Pt=qYcI`FDIx5Y6job_t(OO##e(`<+TEXDy>gTe~DWM4f>yJgp literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/translit.png b/plugins/_core/jisp/translit.png new file mode 100644 index 0000000000000000000000000000000000000000..7f87a273188db94868a30e8c88c2a8e7e78bb58e GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln`KM4LU8_puodz_q~8` z+lLowMol?~E{g6sAmbOrzb|WTedRNk%*oT)e0l^eH8$M{I>6>`X0gla|LX_ZJ$!+; zeSOpAEFZ+GDw@vScyQwPZ~J+?BCkAVs1PtXBQAF(JbV7!ExA!K?~EoKwpr1+seDJ1 zOu~y<8-*>D;uDoWOylVgsPzAvQr@&&(a!ao{R{>X%b>MY`_t|NoyXwm>gTe~DWM4f Dv&Bxq literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/typing.png b/plugins/_core/jisp/typing.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ac4f468f29a294426f0408f639b22f091014c2 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8$4YcLn`L9PWBdSQQ%?OU0bXb zcF$+e%)DPww%wAVCI{CXTHYlfH>E|xOVh5%lgFI#M@qrktAC^v9j{D?F!9ryE|1b-#)2w-e&R-x#KZg(r(}0CfT6c$Z%+xYdAwg?fvsL^PcbP ze7);lwMmO=;iMzq&PIDySFtevSL;(z{vpz%qP#=cWs;fF55*HIk~}Q+4?BXoa+lXD htX;772`^iN{!)o;ztuXgas%DY;OXk;vd$@?2>|2cT0fhdEP)f`7wV9~A%p4QU!ZWsA(^FnI%IIjkbX30q7WclTlZ6B_qGy|G z+~~?_AwpXnCCIoVJ=;V)Niq5sh{kCyu)VR4FrMJ#te58#+UiKpHgRBdk=+`+epYn` z066dU;afV%TQEkej&W89IN)`q6F z!MG#yXH1e5QItT47(&FQec$3N5}hRlU>AY}m&*~d=*0-DR<>FVdQ&MBb@0Edey4FCWD literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/url.png b/plugins/_core/jisp/url.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3fc34811ef93692a582d0bfd2e9007b927c271 GIT binary patch literal 644 zcmV-~0(hxjdJ%jO zONy8TwisJB4JyS*ZLE-)Q#Y=&boZ*ahuC$~qKD4w`JHpVKfd21c)ec!2jbs|*4Hhn zVh#Y15-=mV&*NyT7XE2qf7+mySc+&peUZSP2>mloz6VDL8!a^6JgfpdzGV{rXwWfe zSGzCY#V1VC%@d-%3rG=(4E7<~?8vSP0Ias_s(ZLe0MI2SU#Po+PncwU;WN?R1*UTE zuv+S2wbaAzv~n#drRFGBTaTJF!TPd5yYnGb8sKe|aO5_JimjSxUXlQiGku7LeiROD zeWAXqSZ%pBfM+bm^m_-3{&S>Tk0gmVhf$FUnLh@Y2%Qwk z`qDv`g&oOX_rIYmZ;)fvG80oL*qq&*>I5KYB2~fSLGx) z(#9vh2~ppyJ$$hI2;+D}6K8+RAR3>by}DEAbUFYi(4~`8xXm zSrhMlrrH3{lZyMVz=Mu}cgK)fr1-*nVGjCf=S9%RN^}l-*iZGapX&GPjg~o2j5!Wq zYcvKCHbFCeH(X_ktuY&_aUSH$L zqUz~AtKCaH02^a~iPSQ_mF6I#CF`tHFMviyYoOKtX0}d!0hl^Awj|}uE?ppQSSlJS zfuNlF7dI>=B|#S6OJ}j2`#ZE;`Z3B5=VAaq??bItDf?ar00000NkvXXu0mjfgy@_( literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/useronline.png b/plugins/_core/jisp/useronline.png new file mode 100644 index 0000000000000000000000000000000000000000..ac936272c244d9a325e781a32b1717fc6e7e4cc9 GIT binary patch literal 355 zcmV-p0i6DcP)L%kXDA3NGx7l%90gXzp#es|K-99TctL1Tpw-HT0g)mZG*d8Z zd+oX%X{8;{{P};r*5bV<4wpM^?>_V5a;Ka_zVs6JN(^?nQ+WzW3A%$pUJM7^FcCWc zKOZo+Qe^?U2e~)au4!Sc6hIoUkfAhoRDqk6j**tBlv*45Cg^Io!~f%P+h{nCruL_4noupB8$LAPcU*v<*`uf}bhcA((s zIQOf+Uf9K&q=xH<4b|;XY8>+G$9S<7Vuq=206%0oq+hWC6xsj)002ovPDHLkV1o4V Bo$CMq literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/userunknown.png b/plugins/_core/jisp/userunknown.png new file mode 100644 index 0000000000000000000000000000000000000000..a44b5ea4839cfba1780b4a8a468524c078ec1c9b GIT binary patch literal 363 zcmV-x0hIoUP)5xo;%Iw!)0PvJzla@KD8rK#cYA|0vu-%jIf_qiE-gI+<3!b5xX4pTNHbgO zS@8!@ttN{q2SW2KH%y@sjK!;%X1?|NwwVT?vD@q}Y1-}p;0G~T zOBTc+2utSmQuTCrIj+Sl6hBC(lTCdBA%sd*MTSy}sVdXpg3Ay0eOpFic3cnCN_^fr zkhzFj30W0{G5~<}6G=2B1YjF!qJX^=gT(L2U6Dvi;GNkb#CIZ#<+!6 z*ZQ_5A>SWU+=NJ^-XU=W5gA1;&l7)r`ShIs#TT`JQ>Du5rLq73002ovPDHLkV1goo BXs!SN literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/webpress.png b/plugins/_core/jisp/webpress.png new file mode 100644 index 0000000000000000000000000000000000000000..b6e184244231dbf956c316f289610f2f2dfaa043 GIT binary patch literal 293 zcmV+=0owkFP)7282 z7DA9_FhN#$0?vtD!G}kVn1LCeWdTT64443|w?BXzCVdMh7*^*5J$@7u zm|2(5|Mf5zPp6yXz2Bh;Ozm2tpsGI_<{5r$pcAlfc?6|Es_2}sGWCWfQbTo!>lXOU zBylw)f$>L`4JzT3IcwSaQEp}&$F$=POf65};o44zYP)K~4b7+DKOJC?^$_| rTdhGpE3r#3hs#+Fx(&AG@e}(W>$7bK0Zdr500000NkvXXu0mjfFm8I1 literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/work.png b/plugins/_core/jisp/work.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca47cb5242d293b0e29c8486d7c70100b502b84 GIT binary patch literal 275 zcmV+u0qp*XP)xE^W-9-;E{5K1uu|s>)KgtILfOIDDxr zeIHhG*JniLvFV<;U0q&68UVoMETnsy`TW)sLmN8*>SrHM0E5Mz;*KX!RY6sWfxJdB zkYgYNSz;h}eMTS3FnaUWTKiqXeLD1^_^oGC4u;XQ-=!(&nH@&Y<@{I22~Z&K*jh~& zy51ZCfZ5GY0i_n@xwW-4`+}A93bI*~Y(bhXykl$0??9|pnM6@loU^y@KdJsKm00V% ZM&I#5!4}U7-@^a^002ovPDHLkV1gkndJ6ym literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/yahoo.png b/plugins/_core/jisp/yahoo.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b87cd15fbd4f7b03352fe126676cbe0e7d0f05 GIT binary patch literal 541 zcmV+&0^I0;UA?cXOvBW+C0w|6n6iRgr-;mT{XuGrBcU$`sCH4=d=hL;i z8Ud`VMX!30EaLPKVn_aR8D6@Jn4V7r@I60KzgDSHshq*xa(S`Q!nVQPa{ERq_8!s7 zT8Wm6w_?ZBz(oeEnRR;|^qVtm7l-&Ffa&GgTwg`POJxlq;pYSb1aK#i()9e^2<`N1 z=~`AoiE`{z9@0=dosoe>3c6SXNGJk=6N*wO)xoO)ndBx0>si#z^;Mc#3z0%JxNQfC frsvZPs{{N4jnS%q9?3z{00000NkvXXu0mjfKuP*c literal 0 HcmV?d00001 diff --git a/plugins/_core/jisp/yahoo_away.png b/plugins/_core/jisp/yahoo_away.png new file mode 100644 index 0000000000000000000000000000000000000000..f5110e83702ad67c47ca485255a9c7c2a4a18735 GIT binary patch literal 527 zcmV+q0`UEbP)~DoSXeq>7UjEjoy329qLoa1>hygINR>ag`R8_Z}+vXLGR`3Qe0V zjUDaal(&RX!9`I-2Qd{iCbk4iQ>y(OUedhx(ufBxT+VmTx%WHYRr!3L|HZ5Ei!!)d zr*~pjHMqc=@llB!J4|KmH?=>T^sqt4l_zRDgTc@q&hG1>;NrBQhgmiM`V)J1b~1AM zI6<|sRqRjSlK!U&IdC%~>GKg;DKE3~?xV*v05I}6t$qRDr*25EY_eQ0hE{)&eE*FT z&+;k`e7Sx`K6lny4czEZ8oSm{2|#!10|4gBhycXqbLhn=)jnJFlCHKjsKh5YGVDYk z;;mU$41fz!0kTr<3M=KF!sNn|N0Pc7@;dB@Le0i{6eSkVp_gat@Z26FSS+DUE-Z;({34z4m?ZAbVVYon^@YM{ zYl!V&7-kDs99dS&*DmaK>246(dK{|=WCE(&B;wtTw`?ji^i#RxlnGD^e zgAV2`4?%EI6wx6uR5T{G1VbX#9*3Lgd#{h`2Y0yV&v(xG&QZSa^S^kpbV=s+SxhcJ zR6|?x)zYHmP8_A(`$_-THa1&~T)C~{25wm0v6_}j1{1U2x}o^`!SjZw-3^lf zQ;jCA*=fP|eQGIN#B?101OYA5^F+k_wMJe)dnAeULP4UHqo^OS(Hgwyyq~@V;ur8Ue@`alHfy`V)b9$p&p$Z# z)Daf&?d~P{wQsXipcOqLhN`L(;J~vl0Ayd85+E~IBq5Jd6J@FRis&k^YRxcW7yx|t zyhtpU*8!NCS|SJ*WG$W+qICYu8ZTkYy<(0>qg$h(__scYPuE) zp1(XExtrtBJ3v{Kn;o>HwdMV|a0{xc%AmBs$i>NU4zsq+iJ>6?mRDA|VOhY=7Di7M zIH|Vypi-%bx~@ew(MZ_q3$=J!bQo!IzQBOKW0<{+l(C8=J)atFPE>qF#M5JPalSxR k*FqtHY_^$L-K`Gr4~H?i41@##^#A|>07*qoM6N<$f{}vy6aWAK literal 0 HcmV?d00001 diff --git a/plugins/_core/libintl.cpp b/plugins/_core/libintl.cpp new file mode 100644 index 0000000..498a787 --- /dev/null +++ b/plugins/_core/libintl.cpp @@ -0,0 +1,423 @@ +/* libintl.cpp -- gettext related functions from glibc-2.0.5 + Copyright (C) 1995 Software Foundation, Inc. + +This file is part of the KDE libraries, but it's derived work out +of glibc. The master sources can be found in + + bindtextdom.c + dcgettext.c + dgettext.c + explodename.c + finddomain.c + gettext.c + gettext.h + gettextP.h + hash-string.h + l10nflist.c + libintl.h + loadinfo.h + loadmsgcat.c + localealias.c + textdomain.c + +which are part of glibc. The license is the same as in GLIBC, which +is the GNU Library General Public License. See COPYING.LIB for more +details. + +*/ + +/* gettext.c -- implementation of gettext(3) function + Copyright (C) 1995 Software Foundation, Inc. + +This file is part of the GNU C Library. Its master source is NOT part of +the C library, however. The master source lives in /gd/gnu/lib. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include "config.h" +#include "qglobal.h" + +#if !defined(USE_KDE) + +#include + +#if defined HAVE_STRING_H +# include +#else +# include +#endif + +#include +#include +#include +#include + +#if defined HAVE_UNISTD_H +# include +#endif + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP) +# include +#endif + +#ifndef W +# define W(flag, data) ((flag) ? SWAP (data) : (data)) +#endif + +typedef quint32 nls_uint32; + +struct loaded_domain +{ + const char *data; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) + int use_mmap; + size_t mmap_size; +#endif + int must_swap; + nls_uint32 nstrings; + struct string_desc *orig_tab; + struct string_desc *trans_tab; + nls_uint32 hash_size; + nls_uint32 *hash_tab; +}; + +struct loaded_l10nfile +{ + const char *filename; + int decided; + + const void *data; + + loaded_l10nfile() : filename(0), decided(0), data(0) {} +}; + +void k_nl_load_domain(struct loaded_l10nfile *__domain); + +static inline nls_uint32 +SWAP (nls_uint32 i) +{ + return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); +} + +/* @@ end of prolog @@ */ + +/* The magic number of the GNU message catalog format. */ +#define _MAGIC 0x950412de +#define _MAGIC_SWAPPED 0xde120495 + +/* Revision number of the currently used .mo (binary) file format. */ +#define MO_REVISION_NUMBER 0 + + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static inline unsigned long hash_string (const char *__str_param); + +/* @@ end of prolog @@ */ + +/* Header for binary .mo file format. */ +struct mo_file_header +{ + /* The magic number. */ + nls_uint32 magic; + /* The revision number of the file format. */ + nls_uint32 revision; + /* The number of strings pairs. */ + nls_uint32 nstrings; + /* Offset of table with start offsets of original strings. */ + nls_uint32 orig_tab_offset; + /* Offset of table with start offsets of translation strings. */ + nls_uint32 trans_tab_offset; + /* Size of hashing table. */ + nls_uint32 hash_tab_size; + /* Offset of first hashing entry. */ + nls_uint32 hash_tab_offset; +}; + +struct string_desc +{ + /* Length of addressed string. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* Prototypes for local functions. */ +char *k_nl_find_msg (struct loaded_l10nfile *domain_file, + const char *msgid); + +char * +k_nl_find_msg (struct loaded_l10nfile *domain_file, const char *msgid) +{ + size_t top, act, bottom; + struct loaded_domain *domain; + + if (domain_file->decided == 0) + k_nl_load_domain (domain_file); + + if (domain_file->data == NULL) + return NULL; + + domain = (struct loaded_domain *) domain_file->data; + + /* Locate the MSGID and its translation. */ + if (domain->hash_size > 2 && domain->hash_tab != NULL) + { + /* Use the hashing table. */ + nls_uint32 len = strlen (msgid); + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); + + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) == 0) + return (char *) domain->data + W (domain->must_swap, + domain->trans_tab[nstr - 1].offset); + + while (1) + { + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + + nstr = W (domain->must_swap, domain->hash_tab[idx]); + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len + && strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr - 1].offset)) + == 0) + return (char *) domain->data + + W (domain->must_swap, domain->trans_tab[nstr - 1].offset); + } + /* NOTREACHED */ + } + + /* Now we try the default method: binary search in the sorted + array of messages. */ + bottom = 0; + top = domain->nstrings; + act = top; + while (bottom < top) + { + int cmp_val; + + act = (bottom + top) / 2; + cmp_val = strcmp (msgid, domain->data + + W (domain->must_swap, + domain->orig_tab[act].offset)); + if (cmp_val < 0) + top = act; + else if (cmp_val > 0) + bottom = act + 1; + else + break; + } + + /* If an translation is found return this. */ + return bottom >= top ? NULL : (char *) domain->data + + W (domain->must_swap, + domain->trans_tab[act].offset); +} + +/* @@ begin of epilog @@ */ +/* We assume to have `unsigned long int' value with at least 32 bits. */ +#define HASHWORDBITS 32 + +static inline unsigned long +hash_string (const char *str_param) +{ + unsigned long int hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (unsigned long) *str++; + g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} + +/* Load the message catalogs specified by FILENAME. If it is no valid + message catalog do nothing. */ +void +k_nl_load_domain (struct loaded_l10nfile *domain_file) +{ + int fd; + struct stat st; + struct mo_file_header *data = (struct mo_file_header *) -1; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) + int use_mmap = 0; +#endif + struct loaded_domain *domain; + + domain_file->decided = 1; + domain_file->data = NULL; + + /* If the record does not represent a valid locale the FILENAME + might be NULL. This can happen when according to the given + specification the locale file name is different for XPG and CEN + syntax. */ + if (domain_file->filename == NULL) + return; + + /* Try to open the addressed file. */ + fd = open (domain_file->filename, O_RDONLY); + if (fd == -1) + return; + + /* We must know about the size of the file. */ + if (fstat (fd, &st) != 0 + && st.st_size < (off_t) sizeof (struct mo_file_header)) + { + /* Something went wrong. */ + close (fd); + return; + } + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) + /* Now we are ready to load the file. If mmap() is available we try + this first. If not available or it failed we try to load it. */ + data = (struct mo_file_header *) mmap (NULL, st.st_size, PROT_READ, + MAP_PRIVATE, fd, 0); + + if (data != (struct mo_file_header *) -1) + { + /* mmap() call was successful. */ + close (fd); + use_mmap = 1; + } +#endif + + /* If the data is not yet available (i.e. mmap'ed) we try to load + it manually. */ + if (data == (struct mo_file_header *) -1) + { + off_t to_read; + char *read_ptr; + + data = (struct mo_file_header *) malloc (st.st_size); + if (data == NULL) + return; + + to_read = st.st_size; + read_ptr = (char *) data; + do + { + long int nb = (long int) read (fd, read_ptr, to_read); + if (nb == -1) + { + close (fd); + return; + } + + read_ptr += nb; + to_read -= nb; + } + while (to_read > 0); + + close (fd); + } + + /* Using the magic number we can test whether it really is a message + catalog file. */ + if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED) + { + /* The magic number is wrong: not a message catalog file. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) + if (use_mmap) + munmap ((char *) data, st.st_size); + else +#endif + free (data); + return; + } + + domain_file->data + = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); + if (domain_file->data == NULL) + return; + + domain = (struct loaded_domain *) domain_file->data; + domain->data = (char *) data; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) + domain->use_mmap = use_mmap; + domain->mmap_size = st.st_size; +#endif + domain->must_swap = data->magic != _MAGIC; + + /* Fill in the information about the available tables. */ + switch (W (domain->must_swap, data->revision)) + { + case 0: + domain->nstrings = W (domain->must_swap, data->nstrings); + domain->orig_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->orig_tab_offset)); + domain->trans_tab = (struct string_desc *) + ((char *) data + W (domain->must_swap, data->trans_tab_offset)); + domain->hash_size = W (domain->must_swap, data->hash_tab_size); + domain->hash_tab = (nls_uint32 *) + ((char *) data + W (domain->must_swap, data->hash_tab_offset)); + break; + default: + /* This is an illegal revision. */ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) + if (use_mmap) + munmap ((char *) data, st.st_size); + else +#endif + free (data); + free (domain); + domain_file->data = NULL; + return; + } +} + +void +k_nl_unload_domain (struct loaded_domain *domain) +{ +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) + if (domain->use_mmap) + munmap ((caddr_t) domain->data, domain->mmap_size); + else +# endif + free ((void *) domain->data); + + free (domain); +} + +#endif + diff --git a/plugins/_core/logindlg.cpp b/plugins/_core/logindlg.cpp new file mode 100644 index 0000000..ba599cd --- /dev/null +++ b/plugins/_core/logindlg.cpp @@ -0,0 +1,650 @@ +/*************************************************************************** +logindlg.cpp - description +------------------- +begin : Sun Mar 17 2002 +copyright : (C) 2002 by Vladimir Shutoff +email : vovan@shutoff.ru +***************************************************************************/ + +/*************************************************************************** +* * +* 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. * +* * +***************************************************************************/ + +#include "contacts/client.h" +#include "contacts/protocolmanager.h" +#include "core.h" +#include "icons.h" +#include "log.h" +#include "profilemanager.h" +#include "simgui/ballonmsg.h" +#include "simgui/linklabel.h" +#include "logindlg.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace SIM; + +LoginDialog::LoginDialog(bool bInit, ClientPtr client, const QString &text, const QString &loginProfile) + : QDialog(NULL) + , m_loginProfile(loginProfile) + , m_newProfile(false) + , m_bLogin(false) + , m_bInit(bInit) + , m_bProfileChanged(false) + , m_client(client) + , m_pict(NULL) + , m_vboxlayout(NULL) + , m_hboxlayout(NULL) + , m_txt(NULL) + , m_edt(NULL) + , m_line(NULL) + , m_lnkHelp(NULL) +{ + setupUi(this); + setObjectName("logindlg"); + setModal(client ? false : true); + //setAttribute(Qt::WA_DeleteOnClose, true); + QSettings settings; + m_profile = settings.value("Profile").toString(); + + if(m_loginProfile.isEmpty()) + btnDelete->hide(); + SET_WNDPROC("login") + setButtonsPict(this); + lblMessage->setText(text); + if( text.isEmpty() ) + lblMessage->hide(); + if (m_client) + { + setWindowTitle(windowTitle() + ' ' + client->name()); + setWindowIcon(Icon(m_client->protocol()->description()->icon)); + chkSave->hide(); + chkNoShow->hide(); + btnDelete->hide(); + btnRename->hide(); + cmbProfile->hide(); + lblProfile->hide(); + } + else + { + setWindowTitle(i18n("Select profile")); + setWindowIcon(Icon("SIM")); + } + for(int i = 0; i < cmbProfile->count(); i++) + { + if(cmbProfile->itemText(i) == m_profile) + { + cmbProfile->setCurrentIndex(i); + break; + } + } + + chkSave->setChecked(settings.value("SavePasswd").toBool()); + chkNoShow->setChecked(settings.value("NoShow").toBool()); + connect(chkSave, SIGNAL(toggled(bool)), this, SLOT(saveToggled(bool))); + saveToggled(settings.value("SavePasswd").toBool()); + fill(); + connect(cmbProfile, SIGNAL(activated(int)), this, SLOT(profileChanged(int))); + connect(btnDelete, SIGNAL(clicked()), this, SLOT(profileDelete())); + connect(btnRename, SIGNAL(clicked()), this, SLOT(profileRename())); + + labelNew->hide(); + e_newName->hide(); + profileChanged(cmbProfile->currentIndex()); + connect(e_newName,SIGNAL(textChanged(const QString&)),SLOT(newNameChanged(const QString&))); + + cmbProfile->setFocus(); + + //CorePlugin::m_plugin->setProfile(CorePlugin::m_plugin->getProfile()); //This was a temporary testfix ;) + //init setProfile with QString::null is here a bad idea because f.e. on icq-disconnect or any bad login/password combination this dialog comes up, + //the profile-name is still the same, but get lost if empty initialized, and SIM saves all content, history, styles, pictures not in Profile but in GLOBAL Folder, this has to be prevented. + + //log(L_WARN, QString("PROFILE SET TO QString::null in File: %1 Function: %2 Line: %3").arg(__FILE__).arg(__FUNCTION__).arg(__LINE__)); +} + +LoginDialog::~LoginDialog() +{ +} + +void LoginDialog::saveToggled(bool bState) +{ + if (!bState) + chkNoShow->setChecked(false); + chkNoShow->setEnabled(bState); +} + +void LoginDialog::closeEvent(QCloseEvent *e) +{ + if (m_bLogin) + { + e->ignore(); + stopLogin(); + return; + } + QDialog::closeEvent(e); +} + +void LoginDialog::accept() +{ + if(m_bLogin) + { + stopLogin(); + return; + } + QSettings settings; + if (m_client) + { + startLogin(); + QString prev = m_client->getPreviousPassword(); + if (prev.isEmpty()) + m_client->setPreviousPassword(m_client->getPassword()); + m_client->setPassword(passwords[0]->text()); + unsigned status = m_client->getStatus(); + if (status == STATUS_OFFLINE) + status = STATUS_ONLINE; + m_client->setStatus(status, m_client->getCommonStatus()); + QDialog::accept(); + return; + } + + getContacts()->clearClients(); + int n = cmbProfile->currentIndex(); + if(n == cmbProfile->count() - 1) + { + m_profile = QString::null; + m_newProfile = true; + m_newProfileName = e_newName->text(); + if(!ProfileManager::instance()->newProfile(m_newProfileName)) + { + QMessageBox::information(NULL, i18n("Create Profile"), i18n("Error while creating a new profile"), QMessageBox::Ok); + return; + } + ProfileManager::instance()->selectProfile(m_newProfileName); + QDialog::accept(); + return; + } + if (n < 0) + { + settings.setValue("SavePasswd", chkSave->isChecked()); + settings.setValue("NoShow", chkNoShow->isChecked()); + m_profile = QString::null; + emit changeProfile(QString::null); + QDialog::accept(); + return; + } + + m_profile = cmbProfile->currentText(); + log(L_DEBUG, "Profile: %s", qPrintable(m_profile)); + settings.setValue("Profile", m_profile); + settings.setValue("SavePasswd", chkSave->isChecked()); + settings.setValue("NoShow", chkNoShow->isChecked()); + + // Probably, it shouldn't be here + ProfileManager::instance()->selectProfile(m_profile); + emit changeProfile(m_profile); + + ClientList clients; + loadClients(m_profile, clients); + clients.addToContacts(); + getContacts()->load(); + + m_bLogin = false; + unsigned j = 0; + for (int i = 0; i < passwords.size(); i++) + { + Client *client = NULL; + while (j < getContacts()->nClients()) + { + client = getContacts()->getClient(j++); + if ((client->protocol()->description()->flags & PROTOCOL_NO_AUTH) == 0) + break; + client = NULL; + } + if (client == NULL) + break; + client->setSavePassword(chkSave->isChecked()); + QString pswd = client->getPassword(); + QString new_pswd = passwords[i]->text(); + if (pswd != new_pswd) + { + QString prev = client->getPreviousPassword(); + if (!prev.isEmpty()) + client->setPreviousPassword(pswd); + client->setPassword(new_pswd); + m_bLogin = true; + } + } + if(m_bLogin) + { + startLogin(); + for (int i = 0; i < passwords.size(); i++) + { + Client *client = getContacts()->getClient(i); + unsigned status = client->getStatus(); + if (status == STATUS_OFFLINE) + status = STATUS_ONLINE; + client->setStatus(status, client->getCommonStatus()); + } + QDialog::accept(); + return; + } + QDialog::accept(); + +} + +void LoginDialog::reject() +{ + if (m_bLogin) + { + stopLogin(); + return; + } + QDialog::reject(); +} + +void LoginDialog::profileChanged(int) +{ + if (m_client) + return; + int n = cmbProfile->currentIndex(); + if (n < 0) + { + clearInputs(); + buttonOk->setEnabled(false); + btnDelete->setEnabled(false); + btnRename->hide(); + return; + } + buttonOk->setEnabled(true); + if (n >= (int)cmbProfile->count() - 1) + { + groupBoxPasswords->hide(); + clearInputs(); + buttonOk->setEnabled(true); + btnDelete->setEnabled(false); + btnRename->hide(); + labelNew->show(); + e_newName->show(); + newNameChanged(e_newName->text()); + } + else + { + btnRename->show(); + labelNew->hide(); + e_newName->hide(); + clearInputs(); + ProfileManager::instance()->selectProfile(cmbProfile->currentText()); + ClientList clients; + loadClients(cmbProfile->currentText(), clients); + unsigned nClients = 0; + unsigned i; + for (i = 0; i < clients.size(); i++) + { + if (clients[i]->protocol()->description()->flags & PROTOCOL_NO_AUTH) + continue; + nClients++; + } + groupBoxPasswords->show(); + + unsigned row = 2; + for (unsigned i = 0; i < clients.size(); i++) + { + if (clients[i]->protocol()->description()->flags & PROTOCOL_NO_AUTH) + continue; + makeInputs(row, clients[i]); + } + btnDelete->setEnabled(m_loginProfile == cmbProfile->currentText()); + buttonOk->setEnabled(false); + pswdChanged(""); + // is pressed otherwise sim will overwrite wrong config file on + // exit. + } + QTimer::singleShot(0, this, SLOT(adjust())); +} + +void LoginDialog::adjust() +{ + int h = minimumSizeHint().height(); + resize(width(), h); + move(x(), (qApp->desktop()->height() - h) / 2); +} + +static void rmDir(const QString &path) +{ + QDir d(path); + QStringList l = d.entryList(QDir::Dirs); + QStringList::Iterator it; + for (it = l.begin(); it != l.end(); ++it) + { + if ((*it) == "." || (*it) == "..") continue; + QString p = path; + p += '/'; + p += *it; + rmDir(p); + } + l = d.entryList(); + for (it = l.begin(); it != l.end(); ++it) + { + if ((*it) == "." || (*it) == "..") continue; + QString p = path; + p += '/'; + p += *it; + d.remove(p); + } + d.rmdir(path); +} + +void LoginDialog::makeInputs(unsigned &row, ClientPtr client) +{ + m_pict = new QLabel(groupBoxPasswords); + m_pict->setPixmap(Pict(client->protocol()->description()->icon)); + picts.push_back(m_pict); + + m_vboxlayout = new QVBoxLayout; + verticalLayout->addLayout(m_vboxlayout); + m_hboxlayout = new QHBoxLayout; + m_vboxlayout->addLayout(m_hboxlayout); + m_hboxlayout->addWidget(m_pict); + m_pict->show(); + + m_txt = new QLabel(groupBoxPasswords); + m_txt->setText(client->name()); + m_txt->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); + m_edt = new QLineEdit(groupBoxPasswords); + m_edt->setText(client->getPassword()); + m_edt->setEchoMode(QLineEdit::Password); + connect(m_edt, SIGNAL(textChanged(const QString&)), this, SLOT(pswdChanged(const QString&))); + passwords.push_back(m_edt); + texts.push_back(m_txt); + m_hboxlayout->addWidget(m_txt); + m_vboxlayout->addWidget(m_edt); + m_txt->show(); + m_edt->show(); + QString helpUrl = client->protocol()->description()->accel; + if (!helpUrl.isEmpty()) + { + m_lnkHelp = new LinkLabel(groupBoxPasswords); + m_vboxlayout->addWidget(m_lnkHelp); + m_lnkHelp->setText(i18n("Forgot password?")); + m_lnkHelp->setUrl(i18n(helpUrl)); + m_lnkHelp->show(); + links.push_back(m_lnkHelp); + } + + m_line = new QFrame(groupBoxPasswords); + m_line->setFrameShape(QFrame::HLine); + m_line->setFrameShadow(QFrame::Sunken); + m_vboxlayout->addWidget(m_line); + lines.push_back(m_line); + + row++; +} + +void LoginDialog::fill() +{ + if(m_client) + { + unsigned row = 2; + makeInputs(row, m_client); + return; + } + cmbProfile->clear(); + QSettings settings; + QString profile = settings.value("Profile").toString(); + + int newCur = -1; + cmbProfile->addItems(ProfileManager::instance()->enumProfiles()); + for(int i = 0; i < cmbProfile->count(); i++) + { + if(cmbProfile->itemText(i) == profile) + newCur = i; + } + cmbProfile->insertItem(INT_MAX, i18n("New profile")); + if (newCur != - 1) + { + cmbProfile->setCurrentIndex(newCur); + } + else + { + cmbProfile->setCurrentIndex(cmbProfile->count() - 1); + } +} + +void LoginDialog::clearInputs() +{ + qDeleteAll(picts); + picts.clear(); + qDeleteAll(texts); + texts.clear(); + qDeleteAll(passwords); + passwords.clear(); + qDeleteAll(links); + links.clear(); + qDeleteAll(lines); + lines.clear(); +} + +void LoginDialog::pswdChanged(const QString&) +{ + int i; + for (i = 0; i < passwords.size(); i++) + if (passwords[i]->text().isEmpty()) + break; + buttonOk->setEnabled(i >= passwords.size()); +} + +void LoginDialog::profileDelete() +{ + /* + int n = cmbProfile->currentItem(); + if ((n < 0) || (n >= (int)(CorePlugin::m_plugin->m_profiles.size()))) + return; + */ + QString curProfile = cmbProfile->currentText(); + ProfileManager::instance()->removeProfile(curProfile); + clearInputs(); + btnDelete->setEnabled(false); + fill(); +} + +void LoginDialog::profileRename() +{ + QString old_name = cmbProfile->currentText(); + + QString name = old_name; + QDir d(ProfileManager::instance()->rootPath()); + while(1) { + bool ok = false; + name = QInputDialog::getText(this,i18n("Rename Profile"), i18n("Please enter a new name for the profile."), + QLineEdit::Normal, name, &ok); + if(!ok) + return; + if(d.exists(name)) { + QMessageBox::information(this, i18n("Rename Profile"), i18n("There is already another profile with this name. Please choose another."), QMessageBox::Ok); + continue; + } + /* + else if(!d.rename(CorePlugin::m_plugin->m_profiles[cmbProfile->currentIndex()], name)) { + QMessageBox::information(this, i18n("Rename Profile"), i18n("Unable to rename the profile. Please do not use any special characters."), QMessageBox::Ok); + continue; + } + */ + break; + } + ProfileManager::instance()->renameProfile(old_name, name); + fill(); +} + +void LoginDialog::startLogin() +{ + m_bLogin = true; + cmbProfile->setEnabled(false); + buttonOk->setEnabled(false); + btnDelete->setEnabled(false); + btnRename->setEnabled(false); + chkNoShow->setEnabled(false); + chkSave->setEnabled(false); + for (int i = 0; i < passwords.size(); i++) + passwords[i]->setEnabled(false); +} + +void LoginDialog::stopLogin() +{ + m_bLogin = false; + cmbProfile->setEnabled(true); + buttonOk->setEnabled(true); + btnDelete->setEnabled(true); + btnRename->setEnabled(true); + chkSave->setEnabled(true); + saveToggled(chkSave->isChecked()); + for (int i = 0; i < passwords.size(); i++) + passwords[i]->setEnabled(true); +} + +void LoginDialog::loginComplete() +{ + if (!m_bLogin) + return; + if (m_client) + m_client->setStatus(m_client->getManualStatus(), m_client->getCommonStatus()); + else + for (int i = 0; i < passwords.size(); i++) + { + Client *client = getContacts()->getClient(i); + client->setStatus(client->getManualStatus(), client->getCommonStatus()); + } + m_bLogin = false; + hide(); + close(); + setResult(true); +} + +bool LoginDialog::processEvent(Event *e) +{ + switch (e->type()) + { + case eEventClientChanged: + { + EventClientChanged *ecc = static_cast(e); + if (m_bLogin && (m_client == NULL || ecc->client() == m_client)){ + if (ecc->client()->getState() == Client::Connected) + { + QTimer::singleShot(0, this, SLOT(loginComplete())); + return false; + } + } + break; + } + case eEventClientNotification: + if (m_bLogin) + { + EventClientNotification *ee = static_cast(e); + const EventNotification::ClientNotificationData &client_notification_data = ee->data(); + if (!m_client) + { + for (int i = 0; i < passwords.size(); i++){ + Client *client = getContacts()->getClient(i); + if (client->getState() != Client::Error) + return true; + } + } + else if (client_notification_data.client != m_client) + return false; + stopLogin(); + QString msg; + if (!client_notification_data.text.isEmpty()) + msg = i18n(client_notification_data.text).arg(client_notification_data.args); + else + msg = i18n("Login failed"); + if (msg.length()) + { + raiseWindow(this); + BalloonMsg::message(msg, buttonOk); + } + return true; + } + break; + default: + break; + } + return false; +} + +void LoginDialog::newNameChanged( const QString &text ) { + if( text.isEmpty() ) { + buttonOk->setEnabled( false ); + return; + } + + QDir d(ProfileManager::instance()->rootPath()); + buttonOk->setEnabled( !d.exists( text ) ); +} + +void LoginDialog::loadClients(const QString& profilename, SIM::ClientList& clients) +{ + QString cfgName = ProfileManager::instance()->rootPath() + QDir::separator() + profilename + QDir::separator() + "clients.conf"; + QFile f(cfgName); + if (!f.open(QIODevice::ReadOnly)) + { + log(L_ERROR, "[1]Can't open %s", qPrintable(cfgName)); + return; + } + Buffer cfg = f.readAll(); + for (;;) + { + QByteArray section = cfg.getSection(); + if (section.isEmpty()) + break; + QString s = section; // ? + ClientPtr client = loadClient(s, &cfg); + if (client) + clients.push_back(client); + } +} + +ClientPtr LoginDialog::loadClient(const QString &name, Buffer *cfg) +{ + if (name.isEmpty()) + return ClientPtr(); + QString clientName = name; + QString pluginName = getToken(clientName, '/'); + if (pluginName.isEmpty() || clientName.length() == 0) + return ClientPtr(); + if(!getPluginManager()->isPluginProtocol(pluginName)) + { + log(L_DEBUG, "Plugin %s is not a protocol plugin", qPrintable(pluginName)); + return ClientPtr(); + } + PluginPtr plugin = getPluginManager()->plugin(pluginName); + if(plugin.isNull()) + { + log(L_WARN, "Plugin %s not found", qPrintable(pluginName)); + return ClientPtr(); + } + m_protocolPlugins.append(plugin); + ProfileManager::instance()->currentProfile()->enablePlugin(pluginName); + ProtocolPtr protocol; + ProtocolIterator it; + while ((protocol = ++it) != NULL) + if (protocol->description()->text == clientName) + return protocol->createClient(cfg); + log(L_DEBUG, "Protocol %s not found", qPrintable(clientName)); + return ClientPtr(); +} + diff --git a/plugins/_core/logindlg.h b/plugins/_core/logindlg.h new file mode 100644 index 0000000..364ba1f --- /dev/null +++ b/plugins/_core/logindlg.h @@ -0,0 +1,101 @@ +/*************************************************************************** + logindlg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _LOGINDLG_H +#define _LOGINDLG_H + +#include "buffer.h" +#include "clientlist.h" +#include "contacts/client.h" +#include "event.h" +#include "plugins.h" +#include "ui_logindlgbase.h" +#include +#include +#include + +class QLabel; +class QLineEdit; +class LinkLabel; + +class LoginDialog : public QDialog, public Ui::LoginDialogBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + LoginDialog(bool bInit, SIM::ClientPtr client, const QString &msg, const QString &loginProfile); + ~LoginDialog(); + bool isChanged() { return m_bProfileChanged; } + SIM::ClientPtr client() { return m_client; } + QString profile() { return m_profile; } + bool isNewProfile() { return m_newProfile; } + QString newProfileName() { return m_newProfileName; } + +signals: + void changeProfile(const QString& profilename); + void loadClients(); + +protected slots: + void saveToggled(bool); + void profileChanged(int); + void pswdChanged(const QString&); + void profileDelete(); + void profileRename(); + void loginComplete(); + void adjust(); + void newNameChanged( const QString &text ); + +protected: + virtual bool processEvent(SIM::Event*); + virtual void closeEvent(QCloseEvent *e); + virtual void accept(); + virtual void reject(); + void makeInputs(unsigned &row, SIM::ClientPtr client); + void clearInputs(); + void fill(); + void startLogin(); + void stopLogin(); + void loadClients(const QString& profilename, SIM::ClientList&); + SIM::ClientPtr loadClient(const QString &name, Buffer *cfg); + +private: + QString m_profile; + QString m_loginProfile; + bool m_newProfile; + bool m_bLogin; + bool m_bInit; + bool m_bProfileChanged; + QList picts; + QList texts; + QList passwords; + QList links; + QList lines; + SIM::ClientPtr m_client; + QString m_newProfileName; + QList m_protocolPlugins; + QLabel *m_pict; + QVBoxLayout *m_vboxlayout; + QHBoxLayout *m_hboxlayout; + QLabel *m_txt; + QLineEdit *m_edt; + QFrame *m_line; + LinkLabel *m_lnkHelp; +}; + +#endif + +// vim: set expandtab: + diff --git a/plugins/_core/logindlgbase.ui b/plugins/_core/logindlgbase.ui new file mode 100644 index 0000000..ab43987 --- /dev/null +++ b/plugins/_core/logindlgbase.ui @@ -0,0 +1,224 @@ + + + LoginDialogBase + + + + 0 + 0 + 468 + 256 + + + + Login + + + true + + + + + + + 75 + true + + + + + + + Qt::AlignCenter + + + false + + + + + + + + + Profile: + + + + + + + + 0 + 0 + + + + + 200 + 0 + + + + + + + + &Rename + + + + + + + &Delete + + + + + + + + + New profile name: + + + + + + + + + + + 0 + 0 + + + + Passwords: + + + + + + + + + &Save passwords + + + + + + + + + + &Do not show this window on startup + + + + + + + Qt::Vertical + + + + 20 + 12 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + + chkNoShow + buttonOk + buttonCancel + cmbProfile + btnRename + btnDelete + chkSave + + + + + buttonOk + clicked() + LoginDialogBase + accept() + + + 20 + 20 + + + 20 + 20 + + + + + buttonCancel + clicked() + LoginDialogBase + reject() + + + 20 + 20 + + + 20 + 20 + + + + + diff --git a/plugins/_core/maininfo.cpp b/plugins/_core/maininfo.cpp new file mode 100644 index 0000000..50cbbd6 --- /dev/null +++ b/plugins/_core/maininfo.cpp @@ -0,0 +1,620 @@ +/*************************************************************************** + maininfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "maininfo.h" +#include "editmail.h" +#include "editphone.h" +#include "simgui/listview.h" +#include "core.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "contacts/contact.h" + + +using namespace std; +using namespace SIM; + +const unsigned PHONE_TYPE = 0; +const unsigned PHONE_NUMBER = 1; +const unsigned PHONE_PUBLISH = 2; +const unsigned PHONE_ICON = 0x10; +const unsigned PHONE_PROTO = 0x11; +const unsigned PHONE_TYPE_ASIS = 0x12; +const unsigned PHONE_ACTIVE = 0x13; + +const unsigned MAIL_ADDRESS = 0; +const unsigned MAIL_PUBLISH = 1; +const unsigned MAIL_PROTO = 0x10; + +const char *phoneTypeNames[] = + { + I18N_NOOP("Home Phone"), + I18N_NOOP("Home Fax"), + I18N_NOOP("Work Phone"), + I18N_NOOP("Work Fax"), + I18N_NOOP("Private Cellular"), + I18N_NOOP("Wireless Pager"), + NULL + }; + +ext_info phoneIcons[] = + { + { "phone", PHONE }, + { "fax", FAX }, + { "cell", CELLULAR }, + { "pager", PAGER }, + { NULL, 0 } + }; + +MainInfo::MainInfo(QWidget *parent, Contact *contact) : QWidget(parent) +{ + setupUi(this); + m_contact = contact; + m_bInit = false; + cmbDisplay->setEditable(true); + lstMails->addColumn(i18n("EMail")); + lstPhones->addColumn(i18n("Type")); + lstPhones->addColumn(i18n("Phone")); + lstMails->setMenu(MenuMailList); + lstPhones->setMenu(MenuPhoneList); + if (m_contact == NULL){ + lstMails->addColumn(i18n("Publish")); + lstPhones->addColumn(i18n("Publish")); + lblCurrent->setText(i18n("I'm currently available at:")); + cmbStatus->addItem(i18n("Don't show")); + cmbStatus->addItem(Icon("phone"), i18n("Available")); + cmbStatus->addItem(Icon("nophone"), i18n("Busy")); + cmbStatus->setCurrentIndex(getContacts()->owner()->getPhoneStatus()); + }else{ + lblCurrent->setText(i18n("User is crrently available at:")); + disableWidget(cmbCurrent); + lblStatus->hide(); + cmbStatus->hide(); + } + Command cmd; + cmd->id = CmdPhones; + if (!EventCheckCommandState(cmd).process()){ + lblCurrent->hide(); + cmbCurrent->hide(); + lblStatus->hide(); + cmbStatus->hide(); + } + lstMails->setExpandingColumn(0); + lstPhones->setExpandingColumn(PHONE_NUMBER); + if (m_contact == NULL) + tabMain->removeTab(tabMain->indexOf(tabNotes)); + fill(); + connect(lstMails, SIGNAL(itemSelectionChanged()), this, SLOT(mailSelectionChanged())); + connect(lstPhones, SIGNAL(itemSelectionChanged()), this, SLOT(phoneSelectionChanged())); + connect(lstMails, SIGNAL(deleteItem(ListViewItem*)), this, SLOT(deleteMail(ListViewItem*))); + connect(lstPhones, SIGNAL(deleteItem(ListViewItem*)), this, SLOT(deletePhone(ListViewItem*))); + connect(btnMailAdd, SIGNAL(clicked()), this, SLOT(addMail())); + connect(btnMailEdit, SIGNAL(clicked()), this, SLOT(editMail())); + connect(btnMailDelete, SIGNAL(clicked()), this, SLOT(deleteMail())); + connect(btnPhoneAdd, SIGNAL(clicked()), this, SLOT(addPhone())); + connect(btnPhoneEdit, SIGNAL(clicked()), this, SLOT(editPhone())); + connect(btnPhoneDelete, SIGNAL(clicked()), this, SLOT(deletePhone())); +} + +bool MainInfo::processEvent(Event *e) +{ + switch (e->type()) { + case eEventContact: { + EventContact *ec = static_cast(e); + if(ec->action() == EventContact::eChanged) { + Contact *contact = ec->contact(); + if (contact == m_contact) + fill(); + } + break; + } + case eEventCheckCommandState: { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->menu_id == MenuMailList){ + if ((cmd->id != CmdEditList) && (cmd->id != CmdRemoveList)) + return false; + ListViewItem *item = (ListViewItem*)(cmd->param); + if (item->listView() != lstMails) + return false; + cmd->flags &= ~(COMMAND_CHECKED | COMMAND_DISABLED); + bool bEnable = ((item != NULL) && (item->text(MAIL_PROTO).isEmpty() || (item->text(MAIL_PROTO) == "-"))); + if (!bEnable) + cmd->flags |= COMMAND_DISABLED; + return true; + } + if (cmd->menu_id == MenuPhoneList){ + if ((cmd->id != CmdEditList) && (cmd->id != CmdRemoveList)) + return false; + ListViewItem *item = (ListViewItem*)(cmd->param); + if (item->listView() != lstPhones) + return false; + cmd->flags &= ~(COMMAND_CHECKED | COMMAND_DISABLED); + bool bEnable = ((item != NULL) && (item->text(PHONE_PROTO).isEmpty() || (item->text(PHONE_PROTO) == "-"))); + if (!bEnable) + cmd->flags |= COMMAND_DISABLED; + return true; + } + break; + } + case eEventCommandExec: { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->menu_id == MenuMailList){ + ListViewItem *item = (ListViewItem*)(cmd->param); + if (item->listView() != lstMails) + return false; + bool bEnable = ((item != NULL) && (item->text(MAIL_PROTO).isEmpty() || (item->text(MAIL_PROTO) == "-"))); + if (!bEnable) + return false; + if (cmd->id == CmdEditList){ + editMail(item); + return true; + } + if (cmd->id == CmdRemoveList){ + deleteMail(item); + return true; + } + } + if (cmd->menu_id == MenuPhoneList){ + ListViewItem *item = (ListViewItem*)(cmd->param); + if (item->listView() != lstPhones) + return false; + bool bEnable = ((item != NULL) && (item->text(PHONE_PROTO).isEmpty() || (item->text(PHONE_PROTO) == "-"))); + if (!bEnable) + return false; + if (cmd->id == CmdEditList){ + editPhone(item); + return true; + } + if (cmd->id == CmdRemoveList){ + deletePhone(item); + return true; + } + } + break; + } + default: + break; + } + return false; +} + +void MainInfo::fill() +{ + Contact *contact = m_contact; + if (contact == NULL) + contact = getContacts()->owner(); + + QString firstName = contact->getFirstName(); + firstName = getToken(firstName, '/'); + edtFirstName->setText(firstName); + QString lastName = contact->getLastName(); + lastName = getToken(lastName, '/'); + edtLastName->setText(lastName); + + cmbDisplay->clear(); + QString name = contact->getName(); + if (name.length()) + cmbDisplay->insertItem(INT_MAX,name); + if (firstName.length() && lastName.length()){ + cmbDisplay->insertItem(INT_MAX,firstName + ' ' + lastName); + cmbDisplay->insertItem(INT_MAX,lastName + ' ' + firstName); + } + if (firstName.length()) + cmbDisplay->insertItem(INT_MAX,firstName); + if (lastName.length()) + cmbDisplay->insertItem(INT_MAX,lastName); + cmbDisplay->lineEdit()->setText(contact->getName()); + + edtNotes->setPlainText(contact->getNotes()); + QString mails = contact->getEMails(); + lstMails->clear(); + while (mails.length()){ + QString mailItem = getToken(mails, ';', false); + QString mail = getToken(mailItem, '/'); + ListViewItem *item = new ListViewItem(lstMails); + item->setText(MAIL_ADDRESS, mail); + item->setText(MAIL_PROTO, mailItem); + item->setPixmap(MAIL_ADDRESS, Pict("mail_generic")); + if ((m_contact == NULL) && mailItem.isEmpty()) + item->setText(MAIL_PUBLISH, i18n("Yes")); + } + mailSelectionChanged(); + QString phones = contact->getPhones(); + lstPhones->clear(); + unsigned n = 1; + cmbCurrent->clear(); + cmbCurrent->insertItem(INT_MAX,""); + while (phones.length()){ + unsigned icon = 0; + QString phone = getToken(phones, ';', false); + QString phoneItem = getToken(phone, '/', false); + QString number = getToken(phoneItem, ','); + QString type = getToken(phoneItem, ','); + QString proto = phone; + + if (!phoneItem.isEmpty()) + icon = getToken(phoneItem, ',').toULong(); + ListViewItem *item = new ListViewItem(lstPhones); + fillPhoneItem(item, number, type, icon, proto); + cmbCurrent->insertItem(INT_MAX,number); + if (!phoneItem.isEmpty()){ + item->setText(PHONE_ACTIVE, "1"); + cmbCurrent->setCurrentIndex(n); + } + n++; + } + connect(lstPhones, SIGNAL(selectionChanged()), this, SLOT(phoneSelectionChanged())); + phoneSelectionChanged(); + if (!m_bInit) + fillEncoding(); +} + +void MainInfo::apply() +{ + getEncoding(false); /* EventContactChanged kills all our settings ... + and we send event also :) */ + Contact *contact = m_contact; + if (contact == NULL){ + contact = getContacts()->owner(); + contact->setPhoneStatus(cmbStatus->currentIndex()); + } + contact->setNotes(edtNotes->toPlainText()); + ListViewItem *item; + QString mails; + for (int i = 0; i topLevelItemCount(); i++) + { + item = static_cast(lstMails->topLevelItem(i)); + if (mails.length()) + mails += ';'; + mails += quoteChars(item->text(MAIL_ADDRESS), ";/"); + mails += '/'; + mails += item->text(MAIL_PROTO); + } + contact->setEMails(mails); + QString phones; + for (int i = 0; i < lstPhones->topLevelItemCount(); i++) + { + item = static_cast(lstPhones->topLevelItem(i)); + if (phones.length()) + phones += ';'; + phones += quoteChars(item->text(PHONE_NUMBER), ";/,"); + phones += ','; + phones += quoteChars(item->text(PHONE_TYPE_ASIS), ";/,"); + phones += ','; + phones += item->text(PHONE_ICON); + if (m_contact){ + if (!item->text(PHONE_ACTIVE).isEmpty()) + phones += ",1"; + }else{ + if (item->text(PHONE_NUMBER) == cmbCurrent->currentText()) + phones += ",1"; + } + phones += '/'; + phones += item->text(PHONE_PROTO); + } + contact->setPhones(phones); + /* Christian: The checks if the name has changed took longer + than setting the new value directly */ + contact->setFirstName(edtFirstName->text(), QString::null); + contact->setLastName(edtLastName->text(), QString::null); + + QString name = cmbDisplay->lineEdit()->text(); + if (name.isEmpty()){ + name = edtFirstName->text(); + if (!edtLastName->text().isEmpty()){ + if (!name.isEmpty()){ + name += ' '; + name += edtLastName->text(); + } + } + } + contact->setName(name); + + EventContact(contact, EventContact::eChanged).process(); +} + +void MainInfo::mailSelectionChanged() +{ + ListViewItem *item = lstMails->currentItem(); + bool bEnable = ((item != NULL) && (item->text(MAIL_PROTO).isEmpty() || (item->text(MAIL_PROTO) == "-"))); + btnMailEdit->setEnabled(bEnable); + btnMailDelete->setEnabled(bEnable); +} + +void MainInfo::phoneSelectionChanged() +{ + ListViewItem *item = lstPhones->currentItem(); + bool bEnable = ((item != NULL) && (item->text(PHONE_PROTO).isEmpty() || (item->text(PHONE_PROTO) == "-"))); + btnPhoneEdit->setEnabled(bEnable); + btnPhoneDelete->setEnabled(bEnable); +} + +void MainInfo::addMail() +{ + EditMail dlg(this, "", false, m_contact == NULL); + if (dlg.exec() && !dlg.res.isEmpty()){ + ListViewItem *item = new ListViewItem(lstMails); + QString proto = "-"; + if ((m_contact == NULL) && dlg.publish){ + item->setText(MAIL_PUBLISH, i18n("Yes")); + proto = QString::null; + } + item->setText(MAIL_ADDRESS, dlg.res); + item->setText(MAIL_PROTO, proto); + item->setPixmap(MAIL_ADDRESS, Pict("mail_generic")); + lstMails->setCurrentItem(item); + } +} + +void MainInfo::editMail() +{ + ListViewItem *item = lstMails->currentItem(); + editMail(item); +} + +void MainInfo::editMail(ListViewItem *item) +{ + if ((item == NULL) || (!item->text(MAIL_PROTO).isEmpty() && (item->text(MAIL_PROTO) != "-"))) + return; + EditMail dlg(this, item->text(MAIL_ADDRESS), item->text(MAIL_PROTO).isEmpty(), m_contact == NULL); + if (dlg.exec() && !dlg.res.isEmpty()){ + QString proto = "-"; + if ((m_contact == NULL) && dlg.publish){ + item->setText(MAIL_PUBLISH, i18n("Yes")); + proto = QString::null; + } + item->setText(MAIL_ADDRESS, dlg.res); + item->setText(MAIL_PROTO, proto); + item->setPixmap(MAIL_ADDRESS, Pict("mail_generic")); + lstMails->setCurrentItem(item); + } +} + +void MainInfo::deleteMail() +{ + deleteMail(lstMails->currentItem()); +} + +void MainInfo::deleteMail(ListViewItem *item) +{ + if ((item == NULL) || (!item->text(MAIL_PROTO).isEmpty() && (item->text(MAIL_PROTO) != "-"))) + return; + delete item; +} + +void MainInfo::addPhone() +{ + EditPhone dlg(this, "", "", PHONE, false, m_contact == NULL); + if (dlg.exec() && !dlg.number.isEmpty() && !dlg.type.isEmpty()){ + QString proto = "-"; + if ((m_contact == NULL) && dlg.publish) + proto = QString::null; + fillPhoneItem(new ListViewItem(lstPhones), dlg.number, dlg.type, dlg.icon, proto); + fillCurrentCombo(); + } +} + +void MainInfo::editPhone() +{ + ListViewItem *item = lstPhones->currentItem(); + editPhone(item); +} + +void MainInfo::editPhone(ListViewItem *item) +{ + if (item == NULL) + return; + QString proto = item->text(PHONE_PROTO); + if (!proto.isEmpty() && (proto != "-")) + return; + EditPhone dlg(this, item->text(PHONE_NUMBER), item->text(PHONE_TYPE_ASIS), item->text(PHONE_ICON).toULong(), item->text(PHONE_PROTO).isEmpty(), m_contact == NULL); + if (dlg.exec() && !dlg.number.isEmpty() && !dlg.type.isEmpty()){ + QString proto = "-"; + if ((m_contact == NULL) && dlg.publish) + proto = QString::null; + fillPhoneItem(item, dlg.number, dlg.type, dlg.icon, proto); + fillCurrentCombo(); + } +} + +void MainInfo::deletePhone() +{ + deletePhone(lstPhones->currentItem()); +} + +void MainInfo::deletePhone(ListViewItem *item) +{ + if (item == NULL) + return; + QString proto = item->text(PHONE_PROTO); + if (!proto.isEmpty() && (proto != "-")) + return; + delete item; + fillCurrentCombo(); +} + +void MainInfo::fillPhoneItem(ListViewItem *item, const QString &number, const QString &type, unsigned icon, const QString &proto) +{ + item->setText(PHONE_PROTO, proto); + item->setText(PHONE_NUMBER, number); + item->setText(PHONE_TYPE_ASIS, type); + if (!type.isEmpty()){ + const QByteArray t = type.toLatin1(); + const char **p; + for (p = phoneTypeNames; *p; p++){ + if (!strcmp(*p, t.constData())) + break; + } + if (*p){ + item->setText(PHONE_TYPE, i18n(type)); + }else{ + item->setText(PHONE_TYPE, type); + } + } + item->setText(PHONE_ICON, QString::number(icon)); + for (const ext_info *info = phoneIcons; info->szName; info++){ + if (info->nCode == icon){ + item->setPixmap(PHONE_TYPE, Pict(info->szName)); + break; + } + } + if (m_contact == NULL) + item->setText(PHONE_PUBLISH, proto.isEmpty() ? i18n("Yes") : QString("")); + lstPhones->adjustColumn(); +} + +void MainInfo::fillCurrentCombo() +{ + if (m_contact) + return; + QString current = cmbCurrent->currentText(); + cmbCurrent->clear(); + cmbCurrent->insertItem(INT_MAX,""); + int n = 1; + int cur = 0; + for (n = 1; n < lstPhones->topLevelItemCount(); n++){ + ListViewItem* item = static_cast(lstPhones->topLevelItem(n)); + QString phone = item->text(PHONE_NUMBER); + if (phone == current) + cur = n; + cmbCurrent->insertItem(INT_MAX,phone); + } + cmbCurrent->setCurrentIndex(cur); +} + +void MainInfo::fillEncoding() +{ + m_bInit = true; + int current = 0; + int n_item = 1; + cmbEncoding->clear(); + cmbEncoding->insertItem(INT_MAX,"Default"); + const ENCODING *e; + QStringList main; + QStringList::Iterator it; + for (e = getContacts()->getEncodings(); e->language; e++){ + if (!e->bMain) + continue; + main.append(i18n(e->language) + " (" + e->codec + ')'); + } + main.sort(); + Contact *contact = m_contact; + if (contact == NULL) + contact = getContacts()->owner(); + for (it = main.begin(); it != main.end(); ++it, n_item++){ + QString str = *it; + int n = str.indexOf('('); + str = str.mid(n + 1); + n = str.indexOf(')'); + str = str.left(n); + if (str == contact->getEncoding()) + current = n_item; + cmbEncoding->insertItem(INT_MAX,*it); + } + QStringList noMain; + for (e = getContacts()->getEncodings(); e->language; e++){ + if (e->bMain) + continue; + noMain.append(i18n(e->language) + " (" + e->codec + ')'); + } + noMain.sort(); + for (it = noMain.begin(); it != noMain.end(); ++it, n_item++){ + QString str = *it; + int n = str.indexOf('('); + str = str.mid(n + 1); + n = str.indexOf(')'); + str = str.left(n); + if (str == contact->getEncoding()) + current = n_item; + cmbEncoding->insertItem(INT_MAX,*it); + } + cmbEncoding->setCurrentIndex(current); +} + +void MainInfo::getEncoding(bool SendContactChangedEvent) +{ + QString encoding; + int n = cmbEncoding->currentIndex(); + Contact *contact = m_contact; + if (contact == NULL) + contact = getContacts()->owner(); + if (n){ + n--; + QStringList l; + const ENCODING *e; + QStringList main; + for (e = getContacts()->getEncodings(); e->language; e++){ + if (!e->bMain) + continue; + main.append(i18n(e->language) + " (" + e->codec + ')'); + } + main.sort(); + QStringList::Iterator it; + for (it = main.begin(); it != main.end(); ++it){ + l.append(*it); + } + QStringList noMain; + for (e = getContacts()->getEncodings(); e->language; e++){ + if (e->bMain) + continue; + noMain.append(i18n(e->language) + " (" + e->codec + ')'); + } + noMain.sort(); + for (it = noMain.begin(); it != noMain.end(); ++it){ + l.append(*it); + } + for (it = l.begin(); it != l.end(); ++it){ + if (n-- == 0){ + QString str = *it; + int n = str.indexOf('('); + str = str.mid(n + 1); + n = str.indexOf(')'); + str = str.left(n); + encoding = str; + break; + } + } + } + QString oldEncoding = contact->getEncoding(); + if (oldEncoding == encoding) + return; + contact->setEncoding(encoding); + if (SendContactChangedEvent){ + EventContact(contact, EventContact::eChanged).process(); + } + EventHistoryConfig(contact->id()).process(); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "maininfo.moc" +#endif +*/ + +// vim: set expandtab: + diff --git a/plugins/_core/maininfo.h b/plugins/_core/maininfo.h new file mode 100644 index 0000000..962fdc8 --- /dev/null +++ b/plugins/_core/maininfo.h @@ -0,0 +1,65 @@ +/*************************************************************************** + maininfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MAININFO_H +#define _MAININFO_H + +#include "ui_maininfobase.h" + +class ListViewItem; + +// Lets do this later whole in one, because at the moment it only breaks linking of all other plugins... +#ifndef CORE_EXPORT +# ifdef CORE_EXPORTS +# define CORE_EXPORT Q_DECL_EXPORT +# else // CORE_EXPORTS +# define CORE_EXPORT Q_DECL_IMPORT +# endif // CORE_EXPORTS +#endif // CORE_EXPORT + +class CORE_EXPORT MainInfo : public QWidget, public Ui::MainInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + MainInfo(QWidget *parent, SIM::Contact *contact); +protected slots: + void apply(); + void mailSelectionChanged(); + void phoneSelectionChanged(); + void deleteMail(ListViewItem *item); + void deletePhone(ListViewItem *item); + void editMail(ListViewItem *item); + void editPhone(ListViewItem *item); + void addMail(); + void editMail(); + void deleteMail(); + void addPhone(); + void editPhone(); + void deletePhone(); +protected: + void fill(); + virtual bool processEvent(SIM::Event*); + void fillPhoneItem(ListViewItem *item, const QString &number, const QString &type, unsigned icon, const QString &proto); + void fillCurrentCombo(); + void fillEncoding(); + void getEncoding(bool SendContactChangedEvent = true); + bool m_bInit; + SIM::Contact *m_contact; +}; + +#endif + diff --git a/plugins/_core/maininfobase.ui b/plugins/_core/maininfobase.ui new file mode 100644 index 0000000..91bb683 --- /dev/null +++ b/plugins/_core/maininfobase.ui @@ -0,0 +1,382 @@ + + + MainInfo + + + + 0 + 0 + 469 + 279 + + + + Form1 + + + + 6 + + + 11 + + + + + 3 + + + + &Info + + + + 11 + + + 6 + + + + + First Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Last Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Display: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + 0 + 0 + + + + + + + + Encoding: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + &Mails + + + + 6 + + + 11 + + + + + Email addresses: + + + false + + + + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Add + + + + + + + &Edit + + + + + + + &Delete + + + + + + + + + Note: +You can change only those addresses which have entered. +It is impossible to change addresses which were received from the user. + + + false + + + + + + + + &Phones + + + + 6 + + + 11 + + + + + Phones: + + + false + + + + + + + + + + 6 + + + 0 + + + + + + 0 + 0 + + + + + + + false + + + + + + + + 0 + 0 + + + + + + + + + + 6 + + + 0 + + + + + Phone Status: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Add + + + + + + + &Edit + + + + + + + &Delete + + + + + + + + + Note: +You can change only those numbers which have entered. +It is impossible to change numbers which were received from the user. + + + false + + + + + + + + &Notes + + + + 6 + + + 11 + + + + + + + + + + + + + ListView + QWidget +

    simgui/listview.h
    + + + + + diff --git a/plugins/_core/mainwin.cpp b/plugins/_core/mainwin.cpp new file mode 100644 index 0000000..b13c79f --- /dev/null +++ b/plugins/_core/mainwin.cpp @@ -0,0 +1,266 @@ +/*************************************************************************** + mainwin.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "icons.h" +#include "mainwin.h" +#include "core.h" +#include "userview.h" +#include "contacts/contact.h" +#include "simgui/toolbtn.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace SIM; + +MainWindow *MainWindow::s_mainWindow = NULL; + +MainWindow::MainWindow() + : QMainWindow(NULL, Qt::Window) + , EventReceiver(LowestPriority) +{ + setObjectName("mainwnd"); + setAttribute(Qt::WA_AlwaysShowToolTips); + Q_ASSERT(s_mainWindow == NULL); + s_mainWindow = this; + h_lay = NULL; + m_bNoResize = false; + + m_icon = "SIM"; + setWindowIcon(Icon(m_icon)); + setTitle(); + +// setIconSize(QSize(16,16)); + + m_bar = NULL; + + main = new QWidget(this); + setCentralWidget(main); + + lay = new QVBoxLayout(main); + lay->setMargin(0); + + QStatusBar *status = statusBar(); + status->show(); + status->installEventFilter(this); +} + +MainWindow::MainWindow(Geometry &geometry) + : QMainWindow(NULL, Qt::Window) + , EventReceiver(LowestPriority) +{ + setObjectName("mainwnd"); + setAttribute(Qt::WA_AlwaysShowToolTips); + Q_ASSERT(s_mainWindow == NULL); + s_mainWindow = this; + h_lay = NULL; + m_bNoResize = false; + + m_icon = "SIM"; + setWindowIcon(Icon(m_icon)); + setTitle(); + +// setIconSize(QSize(16,16)); + + m_bar = NULL; + + main = new QWidget(this); + setCentralWidget(main); + + lay = new QVBoxLayout(main); + lay->setMargin(0); + + QStatusBar *status = statusBar(); + status->show(); + status->installEventFilter(this); + + if ((geometry[WIDTH].toLong() == -1) && (geometry[HEIGHT].toLong() == -1)) + { + geometry[HEIGHT].asLong() = QApplication::desktop()->height() * 2 / 3; + geometry[WIDTH].asLong() = geometry[HEIGHT].toLong() / 3; + } + if ((geometry[LEFT].toLong() == -1) && (geometry[TOP].toLong() == -1)){ + geometry[LEFT].asLong() = QApplication::desktop()->width() - 25 - geometry[WIDTH].toLong(); + geometry[TOP].asLong() = 5; + } + ::restoreGeometry(this, geometry, true, true); +} + +MainWindow::~MainWindow() +{ + s_mainWindow = NULL; +} + +MainWindow *MainWindow::mainWindow() +{ + return s_mainWindow; +} + +void MainWindow::resizeEvent(QResizeEvent *e) +{ + if (m_bNoResize) + return; + QMainWindow::resizeEvent(e); +} + +bool MainWindow::eventFilter(QObject *o, QEvent *e) +{ + if (e->type() == QEvent::ChildRemoved){ + QChildEvent *ce = static_cast(e); + std::list::iterator it; + for (it = statusWidgets.begin(); it != statusWidgets.end(); ++it){ + if (*it == ce->child()){ + statusWidgets.erase(it); + break; + } + } + if(statusWidgets.size() == 0) + { + statusBar()->hide(); + } + } + return QMainWindow::eventFilter(o, e); +} + +bool MainWindow::processEvent(Event *e) +{ + switch(e->type()){ + case eEventSetMainIcon: + { + EventSetMainIcon *smi = static_cast(e); + m_icon = smi->icon(); + setWindowIcon(Icon(m_icon)); + break; + } + case eEventInit: + { + setTitle(); + EventToolbar e(ToolBarMain, this); + e.process(); + m_bar = e.toolBar(); + m_bar->setObjectName("MainToolbar"); + this->addToolBar(m_bar); +// m_bar->setMaximumHeight(30); +// m_bar->setMinimumHeight(30); // FIXME + //restoreToolbar(m_bar, CorePlugin::instance()->data.toolBarState); + raiseWindow(this); + break; + } + case eEventCommandExec: + { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->id == CmdQuit) + quit(); + break; + } + case eEventAddWidget: + { + EventAddWidget *aw = static_cast(e); + switch(aw->place()) { + case EventAddWidget::eMainWindow: + addWidget(aw->widget(), aw->down()); + break; + case EventAddWidget::eStatusWindow: + addStatus(aw->widget(), aw->down()); + break; + default: + return false; + } + return true; + } + case eEventIconChanged: + setWindowIcon(Icon(m_icon)); + break; + case eEventContact: + { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + if (contact == getContacts()->owner()) + setTitle(); + break; + } + default: + break; + } + return false; +} + +void MainWindow::quit() +{ + close(); +} + +void MainWindow::closeEvent(QCloseEvent *e) +{ + CorePlugin::instance()->prepareConfig(); + save_state(); + QMainWindow::closeEvent(e); + qApp->quit(); +} + +void MainWindow::addWidget(QWidget *w, bool bDown) +{ + w->setParent(main); + w->move(QPoint()); + if (bDown){ + lay->addWidget(w); + }else{ + lay->insertWidget(0, w); + } + if (isVisible()) + w->show(); +} + +void MainWindow::addStatus(QWidget *w, bool) +{ + QStatusBar *status = statusBar(); + w->setParent(status); + w->move(QPoint()); + statusWidgets.push_back(w); + status->addWidget(w, true); + w->show(); + status->setSizeGripEnabled(true); + status->show(); +} + +void MainWindow::setTitle() +{ + QString title; + Contact *owner = getContacts()->owner(); + if (owner) + title = owner->getName(); + if (title.isEmpty()) + title = "SIM"; + setWindowTitle(title); +} + +void MainWindow::focusInEvent(QFocusEvent *e) +{ + QMainWindow::focusInEvent(e); + if (CorePlugin::instance()->m_view) + CorePlugin::instance()->m_view->setFocus(); +} + + diff --git a/plugins/_core/mainwin.h b/plugins/_core/mainwin.h new file mode 100644 index 0000000..f9fb98e --- /dev/null +++ b/plugins/_core/mainwin.h @@ -0,0 +1,71 @@ +/*************************************************************************** + mainwin.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MAINWIN_H +#define _MAINWIN_H + +#include +#include "simapi.h" +#include "event.h" + +#include "cfg.h" + +#include + +using namespace std; + +class QToolBat; +class CorePlugin; +class QCloseEvent; +class QEvent; +class QFocusEvent; +class QHBoxLayout; +class QResizeEvent; +class QSizeGrip; +class QVBoxLayout; + +class MainWindow : public QMainWindow, public SIM::EventReceiver +{ + Q_OBJECT +public: + MainWindow(); + MainWindow(SIM::Geometry&); + ~MainWindow(); + static MainWindow *mainWindow(); + bool m_bNoResize; + void closeEvent(QCloseEvent *e); +protected: + QWidget *main; + CToolBar *m_bar; + QVBoxLayout *lay; + QHBoxLayout *h_lay; + void focusInEvent(QFocusEvent*); + virtual bool processEvent(SIM::Event*); + void setTitle(); + void resizeEvent(QResizeEvent *e); + bool eventFilter(QObject *o, QEvent *e); + void quit(); + void addWidget(QWidget*, bool bDown); + void addStatus(QWidget *w, bool); + list statusWidgets; + QString m_icon; + friend class CorePlugin; + static MainWindow *s_mainWindow; +}; + +#endif + diff --git a/plugins/_core/manager.cpp b/plugins/_core/manager.cpp new file mode 100644 index 0000000..9ca80ad --- /dev/null +++ b/plugins/_core/manager.cpp @@ -0,0 +1,163 @@ +/*************************************************************************** + manager.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "manager.h" +#include "newprotocol.h" +#include "connectionsettings.h" +#include "core.h" +#include "contacts/client.h" + +#include +#include +#include +#include +#include + +using namespace SIM; + +ConnectionManager::ConnectionManager(bool bModal) + : QDialog(NULL) +{ + setupUi(this); + setObjectName("manager"); + SET_WNDPROC("manager") + setWindowIcon(Icon("configure")); + setButtonsPict(this); + lstConnection->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + fill(); + connect(btnAdd, SIGNAL(clicked()), this, SLOT(addClient())); + connect(btnRemove, SIGNAL(clicked()), this, SLOT(removeClient())); + connect(btnUp, SIGNAL(clicked()), this, SLOT(upClient())); + connect(btnDown, SIGNAL(clicked()), this, SLOT(downClient())); + connect(btnUpdate, SIGNAL(clicked()), this, SLOT(updateClient())); + connect(lstConnection, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); + m_bModal = bModal; +} + +void ConnectionManager::fill(Client *current) +{ + lstConnection->clear(); + QListWidgetItem *curItem = NULL; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + Protocol *protocol = client->protocol(); + const CommandDef *descr = protocol->description(); + QString text = CorePlugin::instance()->clientName(client); + QListWidgetItem *item = new QListWidgetItem(text, lstConnection); + if (descr) + item->setIcon(Pict(descr->icon)); + if (current == client) + curItem = item; + } + if (curItem) + lstConnection->setCurrentItem(curItem); + selectionChanged(); +} + +void ConnectionManager::selectionChanged() +{ + QListWidgetItem *item = lstConnection->currentItem(); + if (item == NULL){ + btnUp->setEnabled(false); + btnDown->setEnabled(false); + btnRemove->setEnabled(false); + btnUpdate->setEnabled(false); + return; + } + btnUpdate->setEnabled(true); + btnRemove->setEnabled(true); + int index = lstConnection->row(item); + btnUp->setEnabled(index > 0); + btnDown->setEnabled(index < lstConnection->count()); +} + +void ConnectionManager::closeEvent(QCloseEvent *e) +{ + QDialog::closeEvent(e); + emit finished(); +} + +void ConnectionManager::addClient() +{ + NewProtocol pDlg(this); + if (pDlg.exec()) + fill(); +} + +Client *ConnectionManager::currentClient() +{ + QListWidgetItem *item = lstConnection->currentItem(); + if (item == NULL) + return NULL; + int index = lstConnection->row(item); + if (index == -1) + return NULL; + return getContacts()->getClient(index); +} + +void ConnectionManager::removeClient() +{ + Client *client = currentClient(); + if (client == NULL) + return; + delete client; + fill(); +} + +void ConnectionManager::upClient() +{ + Client *client = currentClient(); + if (client == NULL) + return; + getContacts()->moveClient(client, true); + fill(client); +} + +void ConnectionManager::downClient() +{ + Client *client = currentClient(); + if (client == NULL) + return; + getContacts()->moveClient(client, false); + fill(client); +} + +void ConnectionManager::updateClient() +{ + Client *client = currentClient(); + if (client == NULL) + return; + unsigned n; + for (n = 0; n < getContacts()->nClients(); n++){ + if (getContacts()->getClient(n) == client) + break; + } + if (n >= getContacts()->nClients()) + return; + Command cmd; + cmd->id = CmdSetup; + cmd->menu_id = CmdClient + n; + EventCommandExec(cmd).process(); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "manager.moc" +#endif +*/ + diff --git a/plugins/_core/manager.h b/plugins/_core/manager.h new file mode 100644 index 0000000..abaccbd --- /dev/null +++ b/plugins/_core/manager.h @@ -0,0 +1,51 @@ +/*************************************************************************** + manager.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MANAGER_H +#define _MANAGER_H + +#include "ui_managerbase.h" +#include "event.h" +#include +#include +#include + +class CorePlugin; + +class ConnectionManager : public QDialog, public Ui::Connection +{ + Q_OBJECT +public: + ConnectionManager(bool bModal); +signals: + void finished(); +protected slots: + void addClient(); + void removeClient(); + void upClient(); + void downClient(); + void updateClient(); + void selectionChanged(); +protected: + virtual void closeEvent(QCloseEvent *e); + SIM::Client *currentClient(); + void fill(SIM::Client *current = NULL); + bool m_bModal; +}; + +#endif + diff --git a/plugins/_core/managerbase.ui b/plugins/_core/managerbase.ui new file mode 100644 index 0000000..4780afe --- /dev/null +++ b/plugins/_core/managerbase.ui @@ -0,0 +1,150 @@ + + + Connection + + + + 0 + 0 + 376 + 247 + + + + Connection manager + + + false + + + + 11 + + + + + + + + 0 + 0 + + + + QListView::Adjust + + + + + + + + + &Down + + + + + + + &Up + + + true + + + + + + + &Configure + + + + + + + &New connection + + + + + + + &Remove + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Close + + + true + + + + + + + + qPixmapFromMimeSource + + buttonCancel + + + + + buttonCancel + clicked() + Connection + reject() + + + 20 + 20 + + + 20 + 20 + + + + + diff --git a/plugins/_core/msgauth.cpp b/plugins/_core/msgauth.cpp new file mode 100644 index 0000000..784684b --- /dev/null +++ b/plugins/_core/msgauth.cpp @@ -0,0 +1,104 @@ +/*************************************************************************** + msggen.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msgauth.h" +#include "msgedit.h" +#include "simgui/textshow.h" +#include "userwnd.h" +#include "core.h" + +#include "simgui/toolbtn.h" + +#include +#include + +using namespace SIM; + +MsgAuth::MsgAuth(MsgEdit *parent, Message *msg) + : QObject(parent) +{ + m_client = msg->client(); + m_type = msg->type(); + m_edit = parent; + if (m_edit->m_edit->isReadOnly()){ + m_edit->m_edit->setText(QString::null); + m_edit->m_edit->setReadOnly(false); + } + QString text = msg->getPlainText(); + if (!text.isEmpty()) + parent->m_edit->setText(text); + Command cmd; + cmd->id = CmdSend; + cmd->flags = 0; + cmd->param = parent; + EventCommandChecked(cmd).process(); +} + +void MsgAuth::init() +{ + m_edit->m_edit->setFocus(); +} + +bool MsgAuth::processEvent(Event *e) +{ + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->param == m_edit){ + unsigned id = cmd->bar_grp; + if ((id >= MIN_INPUT_BAR_ID) && (id < MAX_INPUT_BAR_ID)){ + cmd->flags |= BTN_HIDE; + return true; + } + switch (cmd->id){ + case CmdTranslit: + case CmdSmile: + case CmdSend: + case CmdSendClose: + e->process(this); + cmd->flags &= ~BTN_HIDE; + return true; + case CmdNextMessage: + case CmdMsgAnswer: + e->process(this); + cmd->flags |= BTN_HIDE; + return true; + } + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->id == CmdSend) && (cmd->param == m_edit)){ + QString msgText = m_edit->m_edit->toPlainText(); + AuthMessage *msg = new AuthMessage(m_type); + msg->setText(msgText); + msg->setContact(m_edit->m_userWnd->id()); + msg->setClient(m_client); + m_edit->sendMessage(msg); + return true; + } + } + return false; +} + +/* +#ifndef NO_MOC_INCLUDES +#include "msgauth.moc" +#endif +*/ + diff --git a/plugins/_core/msgauth.h b/plugins/_core/msgauth.h new file mode 100644 index 0000000..21a85bf --- /dev/null +++ b/plugins/_core/msgauth.h @@ -0,0 +1,43 @@ +/*************************************************************************** + msgauth.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGAUTH_H +#define _MSGAUTH_H + +#include +#include + +#include "event.h" + +class MsgEdit; + +class MsgAuth : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgAuth(MsgEdit *parent, SIM::Message *msg); +protected slots: + void init(); +protected: + virtual bool processEvent(SIM::Event*); + QString m_client; + unsigned m_type; + MsgEdit *m_edit; +}; + +#endif + diff --git a/plugins/_core/msgcfg.cpp b/plugins/_core/msgcfg.cpp new file mode 100644 index 0000000..dba833d --- /dev/null +++ b/plugins/_core/msgcfg.cpp @@ -0,0 +1,71 @@ +/*************************************************************************** + msgcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msgcfg.h" +#include "filecfg.h" +#include "smscfg.h" +#include "core.h" + +#include +#include +#include + +MessageConfig::MessageConfig(QWidget *parent, SIM::PropertyHubPtr _data) + : QWidget(parent) +{ + setupUi(this); + m_file = NULL; + for (QObject *p = parent; p != NULL; p = p->parent()){ + QTabWidget *tab = qobject_cast(p); + if(!tab) + continue; + m_file = new FileConfig(tab, _data); + tab->addTab(m_file, i18n("File")); + tab->adjustSize(); + break; + } + + SIM::PropertyHubPtr data = _data; + chkOnline->setChecked(data->value("OpenOnOnline").toBool()); + chkStatus->setChecked(data->value("LogStatus").toBool()); + switch (data->value("OpenNewMessage").toUInt()){ + case NEW_MSG_NOOPEN: + btnNoOpen->setChecked(true); + break; + case NEW_MSG_MINIMIZE: + btnMinimize->setChecked(true); + break; + case NEW_MSG_RAISE: + btnRaise->setChecked(true); + break; + } +} + +void MessageConfig::apply(SIM::PropertyHubPtr _data) +{ + if (m_file) + m_file->apply(_data); + + SIM::PropertyHubPtr data = _data; + data->setValue("OpenOnOnline", chkOnline->isChecked()); + data->setValue("LogStatus", chkStatus->isChecked()); + data->setValue("OpenNewMessage", NEW_MSG_NOOPEN); + if (btnMinimize->isChecked()) + data->setValue("OpenNewMessage", NEW_MSG_MINIMIZE); + if (btnRaise->isChecked()) + data->setValue("OpenNewMessage", NEW_MSG_RAISE); +} diff --git a/plugins/_core/msgcfg.h b/plugins/_core/msgcfg.h new file mode 100644 index 0000000..70f4cb2 --- /dev/null +++ b/plugins/_core/msgcfg.h @@ -0,0 +1,38 @@ +/*************************************************************************** + msgcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGCFG_H +#define _MSGCFG_H + +#include "propertyhub.h" +#include "ui_msgcfgbase.h" + +class FileConfig; + +class MessageConfig : public QWidget, public Ui::MessageConfigBase +{ + Q_OBJECT +public: + MessageConfig(QWidget *parent, SIM::PropertyHubPtr data); +public slots: + void apply(SIM::PropertyHubPtr); +protected: + FileConfig *m_file; +}; + +#endif + diff --git a/plugins/_core/msgcfgbase.ui b/plugins/_core/msgcfgbase.ui new file mode 100644 index 0000000..1f4be5d --- /dev/null +++ b/plugins/_core/msgcfgbase.ui @@ -0,0 +1,85 @@ + + + MessageConfigBase + + + + 0 + 0 + 521 + 389 + + + + Form1 + + + + + + Save &status changes to history + + + + + + + Open window if user go online + + + + + + + New message + + + + + + &No open + + + + + + + Open and &minimize + + + + + + + Open and &raise + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + chkStatus + chkOnline + + + + diff --git a/plugins/_core/msgcontacts.cpp b/plugins/_core/msgcontacts.cpp new file mode 100644 index 0000000..5fe960c --- /dev/null +++ b/plugins/_core/msgcontacts.cpp @@ -0,0 +1,153 @@ +/*************************************************************************** + msgcontacts.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msgcontacts.h" +#include "msgedit.h" + +#include "userwnd.h" +#include "userlist.h" +#include "core.h" +#include "contacts/contact.h" +#include "simgui/textshow.h" +#include "simgui/toolbtn.h" + +#include + +using namespace std; +using namespace SIM; + +MsgContacts::MsgContacts(MsgEdit *parent, Message *msg) + : QObject(parent) +{ + m_client = msg->client(); + m_edit = parent; + m_list = new UserList(m_edit); + m_edit->m_layout->addWidget(m_list); + connect(m_list, SIGNAL(selectChanged()), this, SLOT(changed())); + ContactsMessage *m = static_cast(msg); + QString contacts = m->getContacts(); + while (contacts.length()){ + QString item = getToken(contacts, ';'); + QString url = getToken(item, ','); + QString proto = getToken(url, ':'); + if (proto == "sim"){ + unsigned contact_id = url.toULong(); + if (getContacts()->contact(contact_id)) + m_list->select( contact_id ); + } + } + changed(); + connect(m_edit, SIGNAL(finished()), this, SLOT(editFinished())); + connect(m_list, SIGNAL(finished()), this, SLOT(listFinished())); +} + +MsgContacts::~MsgContacts() +{ + if (m_edit && m_edit->m_edit) + m_edit->m_edit->show(); + if (m_list) + delete m_list; +} + +void MsgContacts::editFinished() +{ + m_edit = NULL; +} + +void MsgContacts::listFinished() +{ + m_list = NULL; +} + +void MsgContacts::changed() +{ + Command cmd; + cmd->id = CmdSend; + cmd->flags = m_list->isHaveSelected() ? 0 : COMMAND_DISABLED; + cmd->param = m_edit; + EventCommandDisabled(cmd).process(); +} + +void MsgContacts::init() +{ + m_edit->m_edit->hide(); + m_list->show(); + m_list->setFocus(); +} + +bool MsgContacts::processEvent(Event *e) +{ + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->param == m_edit){ + unsigned id = cmd->bar_grp; + if ((id >= MIN_INPUT_BAR_ID) && (id < MAX_INPUT_BAR_ID)){ + cmd->flags |= BTN_HIDE; + return true; + } + switch (cmd->id){ + case CmdSend: + case CmdSendClose: + e->process(this); + cmd->flags &= ~BTN_HIDE; + return true; + case CmdTranslit: + case CmdSmile: + case CmdNextMessage: + case CmdMsgAnswer: + e->process(this); + cmd->flags |= BTN_HIDE; + return true; + } + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->id == CmdSend) && (cmd->param == m_edit)){ + QString msgText = m_edit->m_edit->toPlainText(); + QString contacts; + QList< unsigned int > listSelected = m_list->selected(); + foreach( unsigned int id, listSelected ) { + Contact *contact = getContacts()->contact( id ); + if (contact){ + if (!contacts.isEmpty()) + contacts += ';'; + contacts += QString("sim:%1,%2") .arg( id ) .arg( contact->getName() ); + } + } + if (!contacts.isEmpty()){ + ContactsMessage *msg = new ContactsMessage; + msg->setContact(m_edit->m_userWnd->id()); + msg->setContacts(contacts); + msg->setClient(m_client); + m_edit->sendMessage(msg); + } + return true; + } + } + return false; +} + + +/* +#ifndef NO_MOC_INCLUDES +#include "msgcontacts.moc" +#endif +*/ + diff --git a/plugins/_core/msgcontacts.h b/plugins/_core/msgcontacts.h new file mode 100644 index 0000000..b83836d --- /dev/null +++ b/plugins/_core/msgcontacts.h @@ -0,0 +1,48 @@ +/*************************************************************************** + msgcontacts.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGCONTACTS_H +#define _MSGCONTACTS_H + +#include +#include + +#include "event.h" + +class MsgEdit; +class UserList; + +class MsgContacts : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgContacts(MsgEdit *btn, SIM::Message *msg); + ~MsgContacts(); +protected slots: + void init(); + void changed(); + void editFinished(); + void listFinished(); +protected: + virtual bool processEvent(SIM::Event*); + UserList *m_list; + MsgEdit *m_edit; + QString m_client; +}; + +#endif + diff --git a/plugins/_core/msgedit.cpp b/plugins/_core/msgedit.cpp new file mode 100644 index 0000000..18a054f --- /dev/null +++ b/plugins/_core/msgedit.cpp @@ -0,0 +1,1683 @@ +/*************************************************************************** + msgedit.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msgedit.h" + +#include "simapi.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/client.h" + +#include "userwnd.h" +#include "simgui/toolbtn.h" + +#include "log.h" +#include "msgrecv.h" +#include "msgsms.h" +#include "msgurl.h" +#include "msgcontacts.h" +#include "simgui/listview.h" +#include "msgfile.h" +#include "msgauth.h" +#include "userlist.h" +#include "simgui/ballonmsg.h" +#include "container.h" +#include "icons.h" +#include "history.h" + +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +const unsigned NO_TYPE = (unsigned)(-1); + +MsgTextEdit::MsgTextEdit(MsgEdit *edit, QWidget *parent) + : TextEdit(parent) +{ + m_edit = edit; + setBackground(CorePlugin::instance()->value("EditBackground").toUInt()); + setForeground(CorePlugin::instance()->value("EditForeground").toUInt(), true); +#if defined(USE_KDE) +#if KDE_IS_VERSION(3,2,0) + setCheckSpellingEnabled(CorePlugin::instance()->getEnableSpell()); +#endif +#endif +} + +void MsgTextEdit::contextMenuEvent(QContextMenuEvent* event) +{ + if (m_bInClick) + return; + + m_popupPos = event->pos(); + + Command cmd; + + cmd->popup_id = MenuTextEdit; + cmd->param = (TextEdit*)this; + cmd->flags = COMMAND_NEW_POPUP; + EventMenuGet e(cmd); + e.process(); + if(e.menu()) + e.menu()->exec(event->globalPos()); +} + +Message *MsgTextEdit::createMessage(QMimeSource *src) +{ + Message *msg = NULL; + CommandDef *cmd; + CommandsMapIterator it(CorePlugin::instance()->messageTypes); + while ((cmd = ++it) != NULL){ + MessageDef *def = (MessageDef*)(cmd->param); + if (def && def->drag){ + msg = def->drag(src); + if (msg){ + Command c; + c->id = cmd->id; + c->menu_id = MenuMessage; + c->param = (void*)(m_edit->m_userWnd->id()); + if (EventCheckCommandState(c).process()) + break; + delete msg; + msg = NULL; + } + } + } + return msg; +} + +void MsgTextEdit::contentsDropEvent(QDropEvent *e) +{ + Message *msg = createMessage(e); + if (msg){ + e->accept(); + msg->setContact(m_edit->m_userWnd->id()); + EventOpenMessage(msg).process(); + delete msg; + return; + } + //TextEdit::contentsDropEvent(e); //FIXME +} + +void MsgTextEdit::contentsDragEnterEvent(QDragEnterEvent *e) +{ + Message *msg = createMessage(e); + if (msg){ + delete msg; + e->accept(); + return; + } + //TextEdit::contentsDragEnterEvent(e); //FIXME +} + +void MsgTextEdit::contentsDragMoveEvent(QDragMoveEvent *e) +{ + Message *msg = createMessage(e); + if (msg){ + delete msg; + e->accept(); + return; + } + //TextEdit::contentsDragMoveEvent(e); //FIXME +} + +MsgEdit::MsgEdit(QWidget *parent, UserWnd *userWnd) : QFrame(parent) +{ + m_userWnd = userWnd; + m_msg = NULL; + m_bTyping = false; + m_type = NO_TYPE; + m_flags = 0; + m_retry.msg = NULL; + m_bReceived = false; + m_processor = NULL; + m_recvProcessor = NULL; + m_cmd.param = NULL; + + connect(CorePlugin::instance(), SIGNAL(modeChanged()), this, SLOT(modeChanged())); + + m_layout = new QVBoxLayout(this); + m_layout->setMargin(0); + + m_edit = new MsgTextEdit(this, this); + m_edit->setBackground(QColor(CorePlugin::instance()->value("EditBackground").toUInt() & 0xFFFFFF)); + m_edit->setBackground(QColor(255, 255, 255)); + m_edit->setForeground(QColor(CorePlugin::instance()->value("EditForeground").toUInt() & 0xFFFFFF), true); + m_edit->setFont(CorePlugin::instance()->editFont); + m_edit->setCtrlMode(!CorePlugin::instance()->value("SendOnEnter").toBool()); + m_edit->setParam(this); + setFocusProxy(m_edit); + + connect(m_edit, SIGNAL(lostFocus()), this, SLOT(editLostFocus())); + connect(m_edit, SIGNAL(textChanged()), this, SLOT(editTextChanged())); + connect(m_edit, SIGNAL(ctrlEnterPressed()), this, SLOT(editEnterPressed())); + connect(m_edit, SIGNAL(colorsChanged()), this, SLOT(colorsChanged())); + connect(m_edit, SIGNAL(finished()), this, SLOT(editFinished())); + connect(m_edit, SIGNAL(fontSelected(const QFont&)), this, SLOT(editFontChanged(const QFont&))); + + QFontMetrics fm(m_edit->font()); + m_edit->setMinimumSize(QSize(fm.maxWidth(), fm.height() + 10)); + + EventToolbar e(ToolBarMsgEdit, NULL); + e.process(); + m_bar = e.toolBar(); + m_bar->setParam(this); + + m_layout->addWidget(m_bar); + m_layout->addWidget(m_edit); + + if (CorePlugin::instance()->getContainerMode() == 0) + showCloseSend(false); +} + +MsgEdit::~MsgEdit() +{ + typingStop(); + editLostFocus(); + if (m_retry.msg) + delete m_retry.msg; + emit finished(); +} + +void MsgEdit::editFinished() +{ + m_edit = NULL; +} + +void MsgEdit::execCommand(CommandDef *cmd) +{ + if (m_cmd.param){ + Message *msg = (Message*)(m_cmd.param); + delete msg; + } + m_cmd = *cmd; + QTimer::singleShot(0, this, SLOT(execCommand())); +} + +void MsgEdit::execCommand() +{ + if (m_cmd.param == NULL) + return; + Message *msg = (Message*)(m_cmd.param); + EventCommandExec(&m_cmd).process(); + delete msg; + m_cmd.param = NULL; + switch (m_cmd.id){ + case CmdMsgQuote: + case CmdMsgForward: + break; + default: + goNext(); + } +} + +void MsgEdit::showCloseSend(bool bState) +{ + Command cmd; + cmd->id = CmdSendClose; + cmd->text = I18N_NOOP("C&lose after send"); + cmd->icon = "exit"; + cmd->icon_on = "exit"; + cmd->bar_grp = 0x7010; + cmd->flags = bState ? COMMAND_DEFAULT : BTN_HIDE; + cmd->param = this; + if (CorePlugin::instance()->value("CloseSend").toBool()) + cmd->flags |= COMMAND_CHECKED; + EventCommandChange(cmd).process(); +} + +void MsgEdit::resizeEvent(QResizeEvent *e) +{ + QFrame::resizeEvent(e); + emit heightChanged(height()); +} + +void MsgEdit::editFontChanged(const QFont &f) +{ + if (!CorePlugin::instance()->value("EditSaveFont").toBool()) + return; + CorePlugin::instance()->editFont = f; +} + +bool MsgEdit::setMessage(Message *msg, bool bSetFocus) +{ + m_type = msg->type(); + m_userWnd->setMessageType(msg->type()); + m_resource = msg->getResource(); + m_bReceived = msg->getFlags() & MESSAGE_RECEIVED; + QObject *processor = NULL; + MsgReceived *rcv = NULL; + if (m_bReceived){ + if ((msg->getFlags() & MESSAGE_OPEN) || (CorePlugin::instance()->getContainerMode() == 0)){ + rcv = new MsgReceived(this, msg, true); + processor = rcv; + }else{ + if (m_recvProcessor == NULL){ + rcv = new MsgReceived(this, msg, false); + m_recvProcessor = rcv; + } + } + }else{ + QObject *(*create)(MsgEdit *custom, Message *msg) = NULL; + CommandDef *cmd = CorePlugin::instance()->messageTypes.find(msg->baseType()); + if (cmd == NULL) + return false; + MessageDef *def = (MessageDef*)(cmd->param); + if (def == NULL) + return false; + create = def->generate; + if (create){ + m_userWnd->setStatus(QString::null); + processor = create(this, msg); + } + } + if (processor){ + if (m_recvProcessor){ + delete m_recvProcessor; + m_recvProcessor = NULL; + } + if (m_processor){ + delete m_processor; + m_processor = NULL; + } + m_processor = processor; + } + m_client = msg->client(); + + Contact *contact = getContacts()->contact(m_userWnd->id()); + if (contact){ + EventContactClient(contact).process(); + } + + m_bar->checkState(); + if (rcv) + rcv->init(); + Command cmd; + cmd->id = CmdMultiply; + cmd->flags = COMMAND_DEFAULT; + cmd->param = this; + if (msg->getFlags() & MESSAGE_FORWARD){ + cmd->flags = COMMAND_CHECKED; + m_userWnd->showListView(true); + } + EventCommandChecked(cmd).process(); + + if (m_processor && bSetFocus) + QTimer::singleShot(0, m_processor, SLOT(init())); + return true; +} + +Client *MsgEdit::client(void *&data, bool bCreate, bool bTyping, unsigned contact_id, bool bUseClient) +{ + data = NULL; + Contact *contact = getContacts()->contact(contact_id); + if (!bUseClient || m_client.isEmpty()){ + if (contact == NULL) + return NULL; + vector cs; + getWays(cs, contact); + unsigned i; + for (i = 0; i < cs.size(); i++){ + Client *client = getContacts()->getClient(cs[i].client); + if (client->canSend(m_type, cs[i].data)){ + data = cs[i].data; + if (bTyping) + changeTyping(client, data); + return client; + } + } + for (i = 0; i < cs.size(); i++){ + for (unsigned n = 0; n < getContacts()->nClients(); n++){ + Client *client = getContacts()->getClient(n); + clientData *d = cs[i].data; + Contact *c; + if (!client->isMyData(d, c)) + continue; + if (c && (c != contact)) + continue; + if (client->canSend(m_type, d)){ + if (bCreate) + client->createData(cs[i].data, contact); + data = cs[i].data; + if (bTyping) + changeTyping(client, data); + return client; + } + } + } + if (bTyping) + changeTyping(NULL, NULL); + return NULL; + } + if (contact == NULL) + return NULL; + void *d; + ClientDataIterator it(contact->clientData); + while ((d = ++it) != NULL){ + if (it.client()->dataName(d) == m_client){ + data = d; + if (bTyping) + changeTyping(it.client(), data); + return it.client(); + } + } + if (bTyping) + changeTyping(NULL, NULL); + return NULL; +} + +void MsgEdit::setInput() +{ + if (m_recvProcessor){ + delete m_recvProcessor; + m_recvProcessor = NULL; + m_bar->checkState(); + } +} + +static Message *createGeneric(Buffer *cfg) +{ + return new Message(MessageGeneric, cfg); +} + +static QObject *generateGeneric(MsgEdit *w, Message *msg) +{ + return new MsgGen(w, msg); +} + +#if 0 +i18n("Message", "%n messages", 1); +#endif + +static MessageDef defGeneric = + { + NULL, + NULL, + MESSAGE_DEFAULT, + "Message", + "%n messages", + createGeneric, + generateGeneric, + NULL + }; + +static Message *createSMS(Buffer *cfg) +{ + return new SMSMessage(cfg); +} + +static QObject* generateSMS(MsgEdit *w, Message *msg) +{ + return new MsgSMS(w, msg); +} + +#if 0 +i18n("SMS", "%n SMSs", 1); +#endif + +static MessageDef defSMS = + { + NULL, + NULL, + MESSAGE_DEFAULT, + "SMS", + "%n SMSs", + createSMS, + generateSMS, + NULL + }; + +#if 0 +i18n("URL", "%n URLs", 1); +#endif + +static Message *createUrl(Buffer *cfg) +{ + return new UrlMessage(MessageUrl, cfg); +} + +static QObject *generateUrl(MsgEdit *p, Message *msg) +{ + return new MsgUrl(p, msg); +} + +static Message *dropUrl(QMimeSource *src) +{ + log(L_DEBUG, "FIXME: Message:dropUrl"); + /* + if (Q3UriDrag::canDecode(src)){ + QStringList l; + if (Q3UriDrag::decodeLocalFiles(src, l)) + return NULL; + if (!Q3UriDrag::decodeToUnicodeUris(src, l) || (l.count() < 1)) + return NULL; + UrlMessage *msg = new UrlMessage; + msg->setUrl(l[0]); + return msg; + } + */ + return NULL; +} + +static MessageDef defUrl = + { + NULL, + NULL, + MESSAGE_DEFAULT, + "URL", + "%n URLs", + createUrl, + generateUrl, + dropUrl + }; + +static Message *createContacts(Buffer *cfg) +{ + return new ContactsMessage(MessageContacts, cfg); +} + +static QObject *generateContacts(MsgEdit *p, Message *msg) +{ + return new MsgContacts(p, msg); +} + +static Message *dropContacts(QMimeSource *src) +{ + if (ContactDragObject::canDecode(src)){ + Contact *contact = ContactDragObject::decode(src); + ContactsMessage *msg = new ContactsMessage; + QString name = contact->getName(); + msg->setContacts(QString("sim:") + QString::number(contact->id()) + ',' + getToken(name, '/')); + return msg; + } + return NULL; +} + +#if 0 +i18n("Contact list", "%n contact lists", 1); +#endif + +static MessageDef defContacts = + { + NULL, + NULL, + MESSAGE_DEFAULT, + "Contact list", + "%n contact lists", + createContacts, + generateContacts, + dropContacts + }; + +static Message *createFile(Buffer *cfg) +{ + return new FileMessage(MessageFile, cfg); +} + +static QObject* generateFile(MsgEdit *w, Message *msg) +{ + return new MsgFile(w, msg); +} + +Message *dropFile(QMimeSource *src) +{ + log(L_DEBUG, "FIXME: Message:dropFile"); + /* + if (Q3UriDrag::canDecode(src)){ + QStringList files; + if (Q3UriDrag::decodeLocalFiles(src, files) && files.count()){ + QString fileName; + for (QStringList::Iterator it = files.begin(); it != files.end(); ++it){ + if (!fileName.isEmpty()) + fileName += ','; + fileName += '\"'; + fileName += *it; + fileName += '\"'; + } + FileMessage *m = new FileMessage; + m->setFile(fileName); + return m; + } + } + */ + return NULL; +} + +#if 0 +i18n("File", "%n files", 1); +#endif + +static CommandDef fileCommands[] = + { + CommandDef ( + CmdFileAccept, + I18N_NOOP("&Accept"), + QString::null, + QString::null, + QString::null, + ToolBarMsgEdit, + 0x1090, + MenuMessage, + 0, + 0, + COMMAND_CHECK_STATE, + NULL, + QString::null + ), + CommandDef ( + CmdFileDecline, + I18N_NOOP("&Decline"), + QString::null, + QString::null, + QString::null, + ToolBarMsgEdit, + 0x1091, + MenuMessage, + 0, + MenuFileDecline, + COMMAND_CHECK_STATE, + NULL, + QString::null + ), + CommandDef () + }; + +static MessageDef defFile = + { + fileCommands, + NULL, + MESSAGE_DEFAULT, + "File", + "%n files", + createFile, + generateFile, + dropFile + }; + +static Message *createAuthRequest(Buffer *cfg) +{ + return new AuthMessage(MessageAuthRequest, cfg); +} + +static QObject* generateAuth(MsgEdit *w, Message *msg) +{ + return new MsgAuth(w, msg); +} + +#if 0 +i18n("Authorize request", "%n authorize requests", 1); +#endif + +static CommandDef authRequestCommands[] = + { + CommandDef ( + CmdGrantAuth, + I18N_NOOP("&Grant"), + QString::null, + QString::null, + QString::null, + ToolBarMsgEdit, + 0x1080, + MenuMessage, + 0, + 0, + COMMAND_DEFAULT, + NULL, + "" + ), + CommandDef ( + CmdRefuseAuth, + I18N_NOOP("&Refuse"), + QString::null, + QString::null, + QString::null, + ToolBarMsgEdit, + 0x1081, + MenuMessage, + 0, + 0, + COMMAND_DEFAULT, + NULL, + QString::null + ), + CommandDef () + }; + +static MessageDef defAuthRequest = + { + authRequestCommands, + NULL, + MESSAGE_DEFAULT | MESSAGE_SYSTEM, + "Authorize request", + "%n authorize requests", + createAuthRequest, + generateAuth, + NULL + }; + +static Message *createAuthGranted(Buffer *cfg) +{ + return new AuthMessage(MessageAuthGranted, cfg); +} + +#if 0 +i18n("Authorization granted", "%n authorization granted", 1); +#endif + +static MessageDef defAuthGranted = + { + NULL, + NULL, + MESSAGE_SILENT, + "Authorization granted", + "%n authorization granted", + createAuthGranted, + generateAuth, + NULL + }; + +static Message *createAuthRefused(Buffer *cfg) +{ + return new AuthMessage(MessageAuthRefused, cfg); +} + +#if 0 +i18n("Authorization refused", "%n authorization refused", 1); +#endif + +static MessageDef defAuthRefused = + { + NULL, + NULL, + MESSAGE_SILENT | MESSAGE_ERROR, + "Authorization refused", + "%n authorization refused", + createAuthRefused, + generateAuth, + NULL + }; + +static Message *createAdded(Buffer *cfg) +{ + return new AuthMessage(MessageAdded, cfg); +} + +#if 0 +i18n("Add to contacts", "%n add to contacts", 1); +#endif + +static MessageDef defAdded = + { + NULL, + NULL, + MESSAGE_INFO | MESSAGE_SYSTEM, + "Add to contacts", + "%n add to contacts", + createAdded, + NULL, + NULL + }; + +static Message *createRemoved(Buffer *cfg) +{ + return new AuthMessage(MessageRemoved, cfg); +} + +#if 0 +i18n("Removed from contacts", "%n removed from contacts", 1); +#endif + +static MessageDef defRemoved = + { + NULL, + NULL, + MESSAGE_INFO | MESSAGE_SYSTEM, + "Removed from contacts", + "%n removed from contacts", + createRemoved, + NULL, + NULL + }; + +static Message *createStatus(Buffer *cfg) +{ + return new StatusMessage(cfg); +} + +#if 0 +i18n("Status changed", "%n times status changed", 1); +#endif + +static MessageDef defStatus = + { + NULL, + NULL, + MESSAGE_HIDDEN, + "Status changed", + "%n times status changed", + createStatus, + NULL, + NULL + }; + +static bool cmp_status(ClientStatus s1, ClientStatus s2) +{ + if (s1.status > s2.status) + return true; + if (s1.status < s2.status) + return false; + if (s1.data->LastSend.toULong() > s2.data->LastSend.toULong()) + return true; + if (s1.data->LastSend.toULong() < s2.data->LastSend.toULong()) + return false; + return s1.client < s2.client; +} + +void MsgEdit::getWays(vector &cs, Contact *contact) +{ + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + ClientDataIterator it(contact->clientData, client); + clientData *data; + while ((data = ++it) != NULL){ + unsigned long status = STATUS_UNKNOWN; + unsigned style = 0; + QString statusIcon; + client->contactInfo(data, status, style, statusIcon); + ClientStatus s; + s.client = i; + s.status = status; + s.data = data; + cs.push_back(s); + } + } + sort(cs.begin(), cs.end(), cmp_status); +} + +bool MsgEdit::sendMessage(Message *msg) +{ + if (m_retry.msg){ + delete m_retry.msg; + m_retry.msg = NULL; + } + if (m_msg){ + delete msg; + if (EventMessageCancel(m_msg).process()) + m_msg = NULL; + stopSend(false); + return false; + } + bool bClose = true; + if (CorePlugin::instance()->getContainerMode()){ + bClose = false; + Command cmd; + cmd->id = CmdSendClose; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QToolButton *btnClose = qobject_cast(eWidget.widget()); + if (btnClose) + bClose = btnClose->isChecked(); + } + CorePlugin::instance()->setValue("CloseSend", bClose); + + Contact *contact = getContacts()->contact(m_userWnd->id()); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("translit"); + if (!data.isNull() && data->value("Translit").toBool()) + msg->setFlags(msg->getFlags() | MESSAGE_TRANSLIT); + } + + msg->setFlags(msg->getFlags() | m_flags); + m_flags = 0; + + if (m_userWnd->m_list){ + if( !m_userWnd->m_list->isHaveSelected() ) + return false; + multiply = m_userWnd->m_list->selected(); + msg->setContact( multiply.first() ); + multiply.pop_front(); + msg->setClient(NULL); + if( multiply.count() > 0 ) + msg->setFlags(msg->getFlags() | MESSAGE_MULTIPLY); + }else if (!m_resource.isEmpty()){ + void *data = NULL; + Client *c = client(data, true, false, msg->contact(), true); + if (c){ + QString resources = c->resources(data); + while (!resources.isEmpty()){ + QString res = getToken(resources, ';'); + getToken(res, ','); + if (m_resource == res){ + msg->setResource(m_resource); + break; + } + } + } + } + + editLostFocus(); + Command cmd; + cmd->id = CmdSend; + cmd->text = I18N_NOOP("Cancel"); + cmd->icon = "cancel"; + cmd->flags = BTN_PICT; + cmd->param = this; + EventCommandChange(cmd).process(); + m_msg = msg; + return send(); +} + +bool MsgEdit::send() +{ + Contact *contact = getContacts()->contact(m_msg->contact()); + QString client_str = m_msg->client(); + bool bSent = false; + void *data = NULL; + if (contact){ + EventMessageSend(m_msg).process(); + if (client_str.isEmpty()){ + m_type = m_msg->type(); + Client *c = client(data, true, false, m_msg->contact(), (m_msg->getFlags() & MESSAGE_MULTIPLY) == 0); + if (c){ + m_msg->setClient(c->dataName(data)); + bSent = c->send(m_msg, data); + }else{ + data = NULL; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (client->send(m_msg, NULL)){ + bSent = true; + break; + } + } + } + }else{ + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL){ + if (it.client()->dataName(data) == client_str){ + if (it.client()->send(m_msg, data)) + bSent = true; + break; + } + } + } + } + if (bSent){ + if (data){ + ((clientData*)data)->LastSend.asULong() = QDateTime::currentDateTime().toTime_t(); + } + }else{ + if (m_msg){ + delete m_msg; + m_msg = NULL; + } + stopSend(); + Command cmd; + cmd->id = CmdSend; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *msgWidget = eWidget.widget(); + if (msgWidget == NULL) + msgWidget = this; + BalloonMsg::message(i18n("No such client for send message"), msgWidget); + return false; + } + return true; +} + +void MsgEdit::stopSend(bool bCheck) +{ + if (m_userWnd->m_list){ + Command cmd; + m_userWnd->showListView(false); + cmd->id = CmdMultiply; + cmd->text = I18N_NOOP("Multi&ply send"); + cmd->icon = "1rightarrow"; + cmd->icon_on = "1leftarrow"; + cmd->flags = COMMAND_DEFAULT; + cmd->param = this; + EventCommandChange(cmd).process(); + } + multiply.clear(); + Command cmd; + cmd->id = CmdSend; + cmd->text = I18N_NOOP("&Send"); + cmd->icon = "mail_generic"; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x8000; + cmd->flags = BTN_PICT; + cmd->param = this; + EventCommandChange(cmd).process(); + if (bCheck && (m_msg == NULL)) + return; + if (m_msg) + m_msg = NULL; +} + +void MsgEdit::modeChanged() +{ + showCloseSend(CorePlugin::instance()->getContainerMode() != 0); + m_edit->setCtrlMode(CorePlugin::instance()->value("SendOnEnter").toBool()); +} + +bool MsgEdit::setType(unsigned type) +{ + CommandDef *def; + def = CorePlugin::instance()->messageTypes.find(type); + if (def == NULL) + return false; + MessageDef *mdef = (MessageDef*)(def->param); + if (mdef->flags & MESSAGE_SILENT) + return false; + if (mdef->create == NULL) + return false; + Message *msg = mdef->create(NULL); + if (msg == NULL) + return false; + m_userWnd->setMessage(msg); + delete msg; + return true; +} + +bool MsgEdit::adjustType() +{ + if (m_bReceived) + return true; + Command cmd; + cmd->menu_id = MenuMessage; + cmd->param = (void*)(m_userWnd->m_id); + cmd->id = m_userWnd->getMessageType(); + if (m_userWnd->getMessageType() != m_type) { + if(EventCheckCommandState(cmd).process()) { + if (setType(m_userWnd->getMessageType())) + return true; + } + } + cmd->id = m_type; + if(EventCheckCommandState(cmd).process()) + return true; + EventMenuGetDef eMenu(MenuMessage); + eMenu.process(); + CommandsDef *cmdsMsg = eMenu.defs(); + CommandsList itc(*cmdsMsg, true); + CommandDef *c; + unsigned desired = m_userWnd->getMessageType(); + bool bSet = false; + while ((c = ++itc) != NULL){ + if (c->id == CmdContactClients) + continue; + c->param = (void*)(m_userWnd->m_id); + if (!EventCheckCommandState(c).process()) + continue; + if (setType(c->id)){ + bSet = true; + break; + } + } + m_userWnd->setMessageType(desired); + return bSet; +} + +bool MsgEdit::processEvent(Event *e) +{ + switch (e->type()) { + case eEventContact: { + EventContact *ec = static_cast(e); + if (ec->contact()->id() != m_userWnd->m_id) + break; + adjustType(); + break; + } + case eEventClientChanged: { + adjustType(); + break; + } + case eEventMessageReceived: { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->getFlags() & MESSAGE_NOVIEW) + return false; + if ((msg->contact() == m_userWnd->id()) && (msg->type() != MessageStatus)){ + if (CorePlugin::instance()->getContainerMode()){ + bool bSetFocus = false; + if (topLevelWidget() && topLevelWidget()->inherits("Container")){ + Container *container = static_cast(topLevelWidget()); + if (container->wnd() == m_userWnd) + bSetFocus = true; + } + setMessage(msg, bSetFocus); + }else{ + if (m_edit->isReadOnly()) + QTimer::singleShot(0, this, SLOT(setupNext())); + } + } + break; + } + case eEventRealSendMessage: { + EventRealSendMessage *ersm = static_cast(e); + if (ersm->edit() == this){ + sendMessage(ersm->msg()); + return true; + } + break; + } + case eEventCheckCommandState: { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if ((cmd->param == (TextEdit*)m_edit) && (cmd->id == CmdTranslit)){ + Contact *contact = getContacts()->contact(m_userWnd->id()); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("translit"); + if(!data.isNull()) { + cmd->flags &= ~COMMAND_CHECKED; + if (data->value("Translit").toBool()) + cmd->flags |= COMMAND_CHECKED; + // FIXME: return true; missing here? + } + } + return false; + } + if ((cmd->menu_id != MenuTextEdit) || (cmd->param != (TextEdit*)m_edit)) + return false; + cmd->flags &= ~(COMMAND_CHECKED | COMMAND_DISABLED); + switch (cmd->id){ + case CmdUndo: + if (m_edit->isReadOnly()) + return false; + if (!m_edit->document()->isUndoAvailable()) + cmd->flags |= COMMAND_DISABLED; + return true; + case CmdRedo: + if (m_edit->isReadOnly()) + return false; + if (!m_edit->document()->isRedoAvailable()) + cmd->flags |= COMMAND_DISABLED; + return true; + case CmdCut: + if (m_edit->isReadOnly()) + return false; + case CmdCopy: + if (m_edit->textCursor().selectedText().isEmpty()) + cmd->flags |= COMMAND_DISABLED; + return true; + case CmdPaste: + if (m_edit->isReadOnly()) + return false; + if (QApplication::clipboard()->text().isEmpty()) + cmd->flags |= COMMAND_DISABLED; + return true; + case CmdClear: + if (m_edit->isReadOnly()) + return false; + case CmdSelectAll: + if (m_edit->toPlainText().isEmpty()) + cmd->flags |= COMMAND_DISABLED; + return true; + } + break; + } + case eEventCommandExec: { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); +#if defined(USE_KDE) +#if KDE_IS_VERSION(3,2,0) + if (cmd->id == CmdEnableSpell){ + m_edit->setCheckSpellingEnabled(cmd->flags & COMMAND_CHECKED); + return false; + } + else if ((cmd->id == CmdSpell) && (cmd->param == this)){ + m_edit->checkSpelling(); + return true; + } + else +#endif +#endif + if ((cmd->id == CmdSmile) && (cmd->param == this)){ + EventCommandWidget eWidget(cmd); + eWidget.process(); + QToolButton *btnSmile = qobject_cast(eWidget.widget()); + if (btnSmile){ + SmilePopup *popup = new SmilePopup(this); + connect(popup, SIGNAL(insert(const QString &)), this, SLOT(insertSmile(const QString &))); + QPoint p = CToolButton::popupPos(btnSmile, popup); + popup->move(p); + popup->show(); + } + return true; + } + else if ((cmd->id == CmdTranslit) && (cmd->param == this)){ + Contact *contact = getContacts()->contact(m_userWnd->id()); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("translit", true); + data->setValue("Translit", ((cmd->flags & COMMAND_CHECKED) != 0)); + } + return true; + } + else if ((cmd->id == CmdMultiply) && (cmd->param == this)){ + m_userWnd->showListView((cmd->flags & COMMAND_CHECKED) != 0); + return true; + } + else if ((cmd->bar_id == ToolBarMsgEdit) && m_edit->isReadOnly() && (cmd->param == this)){ + switch (cmd->id){ + case CmdMsgAnswer:{ + Message *msg = new Message(MessageGeneric); + msg->setContact(m_userWnd->id()); + msg->setClient(m_client); + EventOpenMessage(msg).process(); + delete msg; + } + case CmdNextMessage: + QTimer::singleShot(0, this, SLOT(goNext())); + break; + } + } + else if ((cmd->menu_id != MenuTextEdit) || (cmd->param != this)) + return false; + switch (cmd->id){ + case CmdUndo: + m_edit->undo(); + return true; + case CmdRedo: + m_edit->redo(); + return true; + case CmdCut: + m_edit->cut(); + return true; + case CmdCopy: + m_edit->copy(); + return true; + case CmdPaste: + m_edit->paste(); + return true; + case CmdClear: + m_edit->clear(); + return true; + case CmdSelectAll: + m_edit->selectAll(); + return true; + } + break; + } + case eEventMessageSent: + case eEventMessageAcked: { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg == m_msg){ + QString err = msg->getError(); + if (!err.isEmpty()) + err = i18n(err); + Contact *contact = getContacts()->contact(msg->contact()); + if(!err.isEmpty()) + { + stopSend(); + Command cmd; + cmd->id = CmdSend; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *msgWidget = eWidget.widget(); + if (msgWidget == NULL) + msgWidget = this; + if (msg->getRetryCode()){ + m_retry.edit = this; + if (m_retry.msg) + delete m_retry.msg; + m_retry.msg = new Message(msg->type()); + m_retry.msg->setRetryCode(msg->getRetryCode()); + m_retry.msg->setError(msg->getError()); + EventMessageRetry e(&m_retry); + if (e.process()) + return false; + }else{ + BalloonMsg::message(err, msgWidget); + } + }else{ + if (contact){ + contact->setLastActive(QDateTime::currentDateTime().toTime_t()); + EventContact(contact, EventContact::eStatus).process(); + } + if (!multiply.empty() ){ + CommandDef *def = CorePlugin::instance()->messageTypes.find(m_msg->type()); + if (def){ + MessageDef *mdef = (MessageDef*)(def->param); + QByteArray cfg = m_msg->save(); + Buffer config; + config = "[Title]\n" + cfg; + config.setWritePos(0); + config.getSection(); + m_msg = (mdef->create)(&config); + m_msg->setContact( multiply.first() ); + multiply.pop_front(); + m_msg->setClient(NULL); + m_msg->setFlags(m_msg->getFlags() | MESSAGE_MULTIPLY); + if( multiply.empty() ) + m_msg->setFlags(m_msg->getFlags() | MESSAGE_LAST); + send(); + return false; + } + } + stopSend(); + bool bClose = true; + if (CorePlugin::instance()->getContainerMode()){ + bClose = false; + Command cmd; + cmd->id = CmdSendClose; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QToolButton *btnClose = qobject_cast(eWidget.widget()); + if (btnClose) + bClose = btnClose->isChecked(); + } + CorePlugin::instance()->setValue("CloseSend", bClose); + if (bClose){ + QTimer::singleShot(0, m_userWnd, SLOT(close())); + }else{ + setEmptyMessage(); + m_edit->setFont(CorePlugin::instance()->editFont); + m_edit->setForeground(CorePlugin::instance()->value("EditForeground").toUInt(), true); + m_edit->setBackground(CorePlugin::instance()->value("EditBackground").toUInt()); + } + } + } + break; + } + default: + break; + } + return false; +} + +void MsgEdit::setEmptyMessage() +{ + m_edit->setPlainText(QString()); + EventMenuGetDef eMenu(MenuMessage); + eMenu.process(); + CommandsDef *cmdsMsg = eMenu.defs(); + CommandsList itc(*cmdsMsg, true); + CommandDef *c; + while ((c = ++itc) != NULL){ + c->param = (void*)(m_userWnd->m_id); + if (EventCheckCommandState(c).process()){ + Message *msg; + CommandDef *def = CorePlugin::instance()->messageTypes.find(c->id); + if (def == NULL) + continue; + MessageDef *mdef = (MessageDef*)(def->param); + if (mdef->create == NULL) + continue; + msg = mdef->create(NULL); + msg->setContact(m_userWnd->m_id); + if (mdef->flags & MESSAGE_SILENT) + continue; + msg->setFlags(MESSAGE_NORAISE); + EventOpenMessage(msg).process(); + delete msg; + return; + } + } +} + +void MsgEdit::changeTyping(Client *client, void *data) +{ + if (!m_bTyping) + return; + if (client == NULL){ + typingStop(); + return; + } + if (client->dataName(data) == m_typingClient) + return; + typingStop(); + typingStart(); +} + +void MsgEdit::typingStart() +{ + typingStop(); + void *data = NULL; + Client *cl = client(data, false, false, m_userWnd->id(), m_userWnd->m_list == NULL); + if (cl == NULL) + return; + Message *msg = new Message(MessageTypingStart); + if (cl->send(msg, data)){ + m_typingClient = cl->dataName(data); + }else{ + delete msg; + } +} + +void MsgEdit::typingStop() +{ + if (m_typingClient.isEmpty()) + return; + Contact *contact = getContacts()->contact(m_userWnd->m_id); + if (contact == NULL) + return; + ClientDataIterator it(contact->clientData); + clientData *data; + while ((data = ++it) != NULL){ + if (it.client()->dataName(data) == m_typingClient){ + Message *msg = new Message(MessageTypingStop); + if (!it.client()->send(msg, data)) + delete msg; + break; + } + } + m_typingClient = QString::null; +} + +void MsgEdit::editTextChanged() +{ + bool bTyping = !m_edit->isEmpty(); + if (qApp->focusWidget() != m_edit) + bTyping = false; + if (m_bTyping == bTyping) + return; + m_bTyping = bTyping; + if (m_bTyping){ + typingStart(); + }else{ + typingStop(); + } +} + +void MsgEdit::editLostFocus() +{ + if (!m_bTyping) + return; + typingStop(); + m_bTyping = false; +} + +void MsgEdit::colorsChanged() +{ + CorePlugin::instance()->setValue("EditBackground", m_edit->background().rgb()); + CorePlugin::instance()->setValue("EditForeground", m_edit->foreground().rgb()); + EventHistoryColors().process(); +} + +void MsgEdit::insertSmile(const QString &id) +{ + QString img_src = QString("").arg(id); +// int para; +// int index; + QFont saveFont = m_edit->font(); + QColor saveColor = m_edit->textColor(); + // determine the current position of the cursor + //m_edit->insert("\255", false, true, true); //FIXME + m_edit->insertPlainText("\255"); + //m_edit->getCursorPosition(¶,&index); //FIXME + // RTF doesn't like < and > + QString txt = m_edit->toHtml(); + txt.replace(QRegExp("\255"),img_src); + m_edit->setHtml(txt); + //m_edit->setCursorPosition(para, index); //FIXME + m_edit->setCurrentFont(saveFont); + m_edit->setTextColor(saveColor); +} + +void MsgEdit::goNext() +{ + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + if (it->contact != m_userWnd->id()) + continue; + Message *msg = History::load(it->id, it->client, it->contact); + if (msg == NULL) + continue; + EventOpenMessage(msg).process(); + delete msg; + return; + } + if (CorePlugin::instance()->getContainerMode()){ + setEmptyMessage(); + return; + } + QTimer::singleShot(0, m_userWnd, SLOT(close())); +} + +void MsgEdit::setupNext() +{ + Command cmd; + cmd->id = CmdNextMessage; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolButton *btnNext = qobject_cast(eWidget.widget()); + if (btnNext == NULL) + return; + + unsigned type = 0; + unsigned count = 0; + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + if (it->contact != m_userWnd->id()) + continue; + if (count == 0) + type = it->type; + count++; + } + QString str = i18n("&Next"); + if (count > 1) + str += QString(" [%1]") .arg(count); + + CommandDef *def = NULL; + def = CorePlugin::instance()->messageTypes.find(type); + + CommandDef c = btnNext->def(); + c.text_wrk = str; + if (def) + c.icon = def->icon; + if (count){ + c.flags &= ~COMMAND_DISABLED; + }else{ + c.flags |= COMMAND_DISABLED; + } + btnNext->setCommand(&c); +} + +void MsgEdit::editEnterPressed() +{ + Command cmd; + cmd->id = CmdSend; + cmd->param = this; + EventCommandExec(cmd).process(); +} + +SmileLabel::SmileLabel(const QString &_id, QWidget *parent) + : QLabel(parent), id(_id) +{ + setPixmap(Pict(_id)); + QStringList smiles = getIcons()->getSmile(_id); + QString tip = smiles.front(); + QString name = getIcons()->getSmileName(_id); + if ((name[0] < '0') || (name[0] > '9')){ + tip += ' '; + tip += i18n(name); + } + this->setToolTip(tip); +} + +void SmileLabel::mouseReleaseEvent(QMouseEvent*) +{ + emit clicked(id); +} + +SmilePopup::SmilePopup(QWidget *popup) + : QFrame(popup, Qt::Popup) +{ + setAttribute(Qt::WA_DeleteOnClose); + + setFrameShape(QFrame::StyledPanel); + setFrameShadow(QFrame::Sunken); + setLineWidth(1); + + QSize s; + QStringList smiles; + getIcons()->getSmiles(smiles); + if (smiles.empty()) + return; + unsigned nSmiles = 0; + QStringList::iterator it; + for (it = smiles.begin(); it != smiles.end(); ++it) + { + QPixmap pict = Pict(*it); + s = QSize(qMax(s.width(), pict.width()), qMax(s.height(), pict.height())); + nSmiles++; + } + + unsigned rows = 4; + unsigned cols = (nSmiles + 3) / 4; + if (cols > 8){ + cols = 8; + rows = (nSmiles + 7) / cols; + } + + QGridLayout *lay = new QGridLayout(this); + lay->setMargin(4); + lay->setSpacing(2); + unsigned i = 0; + unsigned j = 0; + for (it = smiles.begin(); it != smiles.end(); ++it){ + QPixmap is = Pict(*it); + if (is.isNull()) + continue; + QWidget *w = new SmileLabel(*it, this); + w->setMinimumSize(s); + connect(w, SIGNAL(clicked(const QString &)), this, SLOT(labelClicked(const QString &))); + lay->addWidget(w, i, j); + if (++j >= cols){ + i++; + j = 0; + } + } + resize(minimumSizeHint()); +} + +void SmilePopup::labelClicked(const QString &id) +{ + insert(id); + close(); +} + +void MsgEdit::setupMessages() +{ + Command cmd; + + cmd->id = MessageGeneric; + cmd->text = I18N_NOOP("&Message"); + cmd->icon = "message"; + cmd->menu_grp = 0x3010; + cmd->accel = "Ctrl+M"; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defGeneric; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageFile; + cmd->text = I18N_NOOP("&File"); + cmd->icon = "file"; + cmd->accel = "Ctrl+F"; + cmd->menu_grp = 0x3020; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defFile; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageUrl; + cmd->text = I18N_NOOP("&URL"); + cmd->icon = "url"; + cmd->accel = "Ctrl+U"; + cmd->menu_grp = 0x3030; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defUrl; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageSMS; + cmd->text = I18N_NOOP("SMS"); + cmd->icon = "sms"; + cmd->accel = "Ctrl+S"; + cmd->menu_grp = 0x3040; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defSMS; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageContacts; + cmd->text = I18N_NOOP("&Contact list"); + cmd->icon = "contacts"; + cmd->accel = "Ctrl+L"; + cmd->menu_grp = 0x3050; + cmd->param = &defContacts; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageAuthRequest; + cmd->text = I18N_NOOP("&Authorization request"); + cmd->icon = "auth"; + cmd->accel = "Ctrl+Q"; + cmd->menu_grp = 0x3060; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defAuthRequest; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageAuthGranted; + cmd->text = I18N_NOOP("&Grant autorization"); + cmd->icon = "auth"; + cmd->accel = "Ctrl+G"; + cmd->menu_grp = 0x3070; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defAuthGranted; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageAuthRefused; + cmd->text = I18N_NOOP("&Refuse autorization"); + cmd->icon = "auth"; + cmd->accel = "Ctrl+R"; + cmd->menu_grp = 0x3071; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defAuthRefused; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageAdded; + cmd->text = I18N_NOOP("Added"); + cmd->icon = "auth"; + cmd->menu_grp = 0; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defAdded; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageRemoved; + cmd->text = I18N_NOOP("Removed"); + cmd->icon = "auth"; + cmd->menu_grp = 0; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defRemoved; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageStatus; + cmd->text = I18N_NOOP("Status"); + cmd->icon = QString::null; + cmd->menu_grp = 0; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defStatus; + EventCreateMessageType(cmd).process(); +} + diff --git a/plugins/_core/msgedit.h b/plugins/_core/msgedit.h new file mode 100644 index 0000000..6f815e8 --- /dev/null +++ b/plugins/_core/msgedit.h @@ -0,0 +1,140 @@ +/*************************************************************************** + msgedit.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGEDIT_H +#define _MSGEDIT_H + +#include "core.h" +#include "simgui/textshow.h" +#include "event.h" + +#include + +class CorePlugin; +class UserWnd; +class CToolBar; +class QVBoxLayout; +class QFrame; +class TextEdit; + +struct ClientStatus +{ + unsigned long status; + unsigned client; + SIM::clientData *data; +}; + +class MsgTextEdit : public TextEdit +{ + Q_OBJECT +public: + MsgTextEdit(MsgEdit *edit, QWidget *parent); +protected: + virtual void contextMenuEvent(QContextMenuEvent* event); + virtual void contentsDropEvent(QDropEvent*); + virtual void contentsDragEnterEvent(QDragEnterEvent*); + virtual void contentsDragMoveEvent(QDragMoveEvent*); + SIM::Message *createMessage(QMimeSource*); + MsgEdit *m_edit; +}; + +class MsgEdit : public QFrame, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgEdit(QWidget *parent, UserWnd *userWnd); + ~MsgEdit(); + CToolBar *m_bar; + bool setMessage(SIM::Message *msg, bool bSetFocus); + UserWnd *m_userWnd; + TextEdit *m_edit; + QVBoxLayout *m_layout; + bool sendMessage(SIM::Message *msg); + static void setupMessages(); + void getWays(std::vector &cs, SIM::Contact *contact); + SIM::Client *client(void *&data, bool bCreate, bool bSendTyping, unsigned contact_id, bool bUseClient=true); + bool m_bReceived; + unsigned m_flags; + void execCommand(SIM::CommandDef *cmd); + unsigned type() { return m_type; } + bool adjustType(); + QString m_resource; +signals: + void heightChanged(int); + void init(); + void finished(); +public slots: + void insertSmile(const QString &id); + void modeChanged(); + void editLostFocus(); + void editTextChanged(); + void editEnterPressed(); + void setInput(); + void goNext(); + void setupNext(); + void colorsChanged(); + void execCommand(); + void editFinished(); + void editFontChanged(const QFont&); +protected: + QObject *m_processor; + QObject *m_recvProcessor; + unsigned m_type; + virtual bool processEvent(SIM::Event*); + void resizeEvent(QResizeEvent*); + void stopSend(bool bCheck=true); + void showCloseSend(bool bShow); + void typingStart(); + void typingStop(); + void changeTyping(SIM::Client *client, void *data); + void setEmptyMessage(); + bool setType(unsigned type); + bool m_bTyping; + QString m_typingClient; + bool send(); + QList< unsigned int > multiply; + SIM::CommandDef m_cmd; + SIM::Message *m_msg; + EventMessageRetry::MsgSend m_retry; + QString m_client; +}; + +class SmileLabel : public QLabel +{ + Q_OBJECT +public: + SmileLabel(const QString &id, QWidget *parent); +signals: + void clicked(const QString &id); +protected: + void mouseReleaseEvent(QMouseEvent*); + QString id; +}; + +class SmilePopup : public QFrame +{ + Q_OBJECT +public: + SmilePopup(QWidget *parent); +signals: + void insert(const QString &id); +protected slots: + void labelClicked(const QString &id); +}; + +#endif + diff --git a/plugins/_core/msgfile.cpp b/plugins/_core/msgfile.cpp new file mode 100644 index 0000000..ea6a34f --- /dev/null +++ b/plugins/_core/msgfile.cpp @@ -0,0 +1,215 @@ +/*************************************************************************** + msgfile.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "msgfile.h" +#include "msgedit.h" +#include "userwnd.h" +#include "core.h" + +#include "simgui/toolbtn.h" +#include "simgui/textshow.h" + + +#include +#include +#include + +#ifdef USE_KDE +#include +#define QFileDialog KFileDialog +#else +#include +#endif + +using namespace SIM; + +MsgFile::MsgFile(MsgEdit *parent, Message *msg) + : QObject(parent) +{ + m_client = msg->client(); + m_edit = parent; + m_bCanSend = false; + if (m_edit->m_edit->isReadOnly()){ + m_edit->m_edit->setText(QString::null); + m_edit->m_edit->setReadOnly(false); + } + QString t = msg->getPlainText(); + if (!t.isEmpty()) + m_edit->m_edit->setText(t); + + Command cmd; + cmd->id = CmdFileName; + cmd->param = parent; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolEdit *edtName = qobject_cast(eWidget.widget()); + if (edtName){ + connect(edtName, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + edtName->setText(static_cast(msg)->getFile()); + } + changed(static_cast(msg)->getFile()); +} + +void MsgFile::init() +{ + if (!m_edit->topLevelWidget()->isActiveWindow() || m_edit->topLevelWidget()->isMinimized()) + return; + Command cmd; + cmd->id = CmdFileName; + cmd->param = m_edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolEdit *edtName = qobject_cast(eWidget.widget()); + if (edtName){ + if (edtName->text().isEmpty()){ + selectFile(); + return; + } + edtName->setFocus(); + } +} + +void MsgFile::changed(const QString &str) +{ + if (m_bCanSend != str.isEmpty()) + return; + m_bCanSend = !str.isEmpty(); + Command cmd; + cmd->id = CmdSend; + cmd->flags = m_bCanSend ? 0 : COMMAND_DISABLED; + cmd->param = m_edit; + EventCommandDisabled(cmd).process(); +} + +void MsgFile::selectFile() +{ + Command cmd; + cmd->id = CmdFileName; + cmd->param = m_edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolEdit *edtName = qobject_cast(eWidget.widget()); + if (edtName == NULL) + return; + QString s = edtName->text(); + QStringList lst = QFileDialog::getOpenFileNames(m_edit->topLevelWidget()); + if ((lst.count() > 1) || ((lst.count() > 0) && (lst[0].indexOf(' ') >= 0))){ + for (QStringList::Iterator it = lst.begin(); it != lst.end(); ++it){ + *it = '\"' + QDir::convertSeparators(*it) + '\"'; + } + }else{ + for (QStringList::Iterator it = lst.begin(); it != lst.end(); ++it){ + *it = QDir::convertSeparators(*it); + } + } + edtName->setText(lst.join(" ")); +} + +bool MsgFile::processEvent(Event *e) +{ + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->param == m_edit){ + unsigned id = cmd->bar_grp; + if ((id >= MIN_INPUT_BAR_ID) && (id < MAX_INPUT_BAR_ID)){ + cmd->flags |= BTN_HIDE; + if (cmd->id == CmdFileName) + cmd->flags &= ~BTN_HIDE; + return true; + } + switch (cmd->id){ + case CmdTranslit: + case CmdSmile: + case CmdSend: + case CmdSendClose: + e->process(this); + cmd->flags &= ~BTN_HIDE; + return true; + case CmdNextMessage: + case CmdMsgAnswer: + e->process(this); + cmd->flags |= BTN_HIDE; + return true; + } + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->param == m_edit){ + if (cmd->id == CmdSend){ + Command cmd; + cmd->id = CmdFileName; + cmd->param = m_edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolEdit *edtName = qobject_cast(eWidget.widget()); + if (edtName == NULL) + return false; + QString msgText = m_edit->m_edit->toPlainText(); + QString file = edtName->text(); + QStringList files; + QString f; + for (int i = 0; i < (int)file.length(); i++){ + if (file[i] == '\"'){ + f = f.trimmed(); + if (!f.isEmpty()) + files.append(f); + f = QString::null; + for (i++; i < (int)file.length(); i++){ + if (file[i] == '\"') + break; + f += file[i]; + } + f = f.trimmed(); + if (!f.isEmpty()) + files.append(f); + f = QString::null; + continue; + } + f += file[i]; + } + f = f.trimmed(); + if (!f.isEmpty()) + files.append(f); + file = QString::null; + for (QStringList::Iterator it = files.begin(); it != files.end(); ++it){ + if (!file.isEmpty()) + file += ';'; + file += quoteChars(*it, ";"); + } + if (!file.isEmpty()){ + FileMessage *msg = new FileMessage; + msg->setText(msgText); + msg->setFile(file); + msg->setContact(m_edit->m_userWnd->id()); + msg->setClient(m_client); + m_edit->sendMessage(msg); + } + return true; + } + if (cmd->id == CmdFileName){ + selectFile(); + return true; + } + } + } + return false; +} diff --git a/plugins/_core/msgfile.h b/plugins/_core/msgfile.h new file mode 100644 index 0000000..fca3af7 --- /dev/null +++ b/plugins/_core/msgfile.h @@ -0,0 +1,45 @@ +/*************************************************************************** + msgfile.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGFILE_H +#define _MSGFILE_H + +#include +#include + +#include "event.h" + +class MsgEdit; + +class MsgFile : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgFile(MsgEdit *parent, SIM::Message *msg); +protected slots: + void selectFile(); + void changed(const QString&); + void init(); +protected: + virtual bool processEvent(SIM::Event*); + QString m_client; + MsgEdit *m_edit; + bool m_bCanSend; +}; + +#endif + diff --git a/plugins/_core/msggen.cpp b/plugins/_core/msggen.cpp new file mode 100644 index 0000000..f23c873 --- /dev/null +++ b/plugins/_core/msggen.cpp @@ -0,0 +1,126 @@ +/*************************************************************************** + msggen.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msggen.h" + +#include "simapi.h" +#include "log.h" + +#include "msgedit.h" +#include "userwnd.h" + +using namespace SIM; + +MsgGen::MsgGen(MsgEdit *parent, Message *msg) + : QObject(parent) +{ + m_client = msg->client(); + m_edit = parent; + if (m_edit->m_edit->isReadOnly()){ + m_edit->m_edit->setText(QString::null); + m_edit->m_edit->setReadOnly(false); + } + if (msg->getFlags() & MESSAGE_INSERT){ + QString text = msg->getPlainText(); + //m_edit->m_edit->insert(text, false, true, true); //FIXME + m_edit->m_edit->insertHtml(text); + }else{ + QString text = msg->getRichText(); + if (!text.isEmpty()){ + m_edit->m_edit->setText(text); + m_edit->m_edit->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); + if ((msg->getBackground() != msg->getForeground()) && !CorePlugin::instance()->value("OwnColors").toBool()){ + m_edit->m_edit->setBackground(msg->getBackground()); + m_edit->m_edit->setForeground(msg->getForeground(), true); + } + } + } + connect(m_edit->m_edit, SIGNAL(emptyChanged(bool)), this, SLOT(emptyChanged(bool))); + emptyChanged(m_edit->m_edit->isEmpty()); +} + +void MsgGen::init() +{ + if (m_edit->topLevelWidget()->isActiveWindow() && !m_edit->topLevelWidget()->isMinimized()) + m_edit->m_edit->setFocus(); +} + +void MsgGen::emptyChanged(bool bEmpty) +{ + Command cmd; + cmd->id = CmdSend; + cmd->flags = bEmpty ? COMMAND_DISABLED : 0; + cmd->param = m_edit; + EventCommandDisabled(cmd).process(); +} + +bool MsgGen::processEvent(Event *e) +{ + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->param == m_edit){ + unsigned id = cmd->bar_grp; + if ((id >= MIN_INPUT_BAR_ID) && (id < MAX_INPUT_BAR_ID)){ + cmd->flags |= BTN_HIDE; + return true; + } + switch (cmd->id){ + case CmdTranslit: + case CmdSmile: + case CmdSend: + case CmdSendClose: + e->process(this); + cmd->flags &= ~BTN_HIDE; + return true; + case CmdNextMessage: + case CmdMsgAnswer: + e->process(this); + cmd->flags |= BTN_HIDE; + return true; + } + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->id == CmdSend) && (cmd->param == m_edit)){ + QString msgText = m_edit->m_edit->toHtml(); + if (!msgText.isEmpty()) + { + msgText.remove(QRegExp("^]*>")); + msgText.remove(QRegExp("]*>[^<]*")); + log(L_DEBUG, "Send: %s", qPrintable(msgText)); + Message *msg = new Message; + msg->setText(msgText); + msg->setContact(m_edit->m_userWnd->id()); + msg->setClient(m_client); + msg->setFlags(MESSAGE_RICHTEXT); + msg->setForeground(m_edit->m_edit->foreground().rgb() & 0xFFFFFF); + msg->setBackground(m_edit->m_edit->background().rgb() & 0xFFFFFF); + msg->setFont(CorePlugin::instance()->value("EditFont").toString()); + m_edit->sendMessage(msg); + } + return true; + } + } + return false; +} + +// vim: set expandtab: + + diff --git a/plugins/_core/msggen.h b/plugins/_core/msggen.h new file mode 100644 index 0000000..91254ac --- /dev/null +++ b/plugins/_core/msggen.h @@ -0,0 +1,44 @@ +/*************************************************************************** + msggen.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGGEN_H +#define _MSGGEN_H + +#include "event.h" + +#include +#include + +class MsgEdit; + +class MsgGen : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgGen(MsgEdit *parent, SIM::Message *msg); +protected slots: + void init(); + void emptyChanged(bool bEmpty); +protected: + virtual bool processEvent(SIM::Event*); + QString m_client; + bool m_bCanSend; + MsgEdit *m_edit; +}; + +#endif + diff --git a/plugins/_core/msgrecv.cpp b/plugins/_core/msgrecv.cpp new file mode 100644 index 0000000..e886693 --- /dev/null +++ b/plugins/_core/msgrecv.cpp @@ -0,0 +1,209 @@ +/*************************************************************************** + msgrecv.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msgrecv.h" +#include "msgedit.h" +#include "msgview.h" +#include "history.h" +#include "core.h" + +#include "simgui/toolbtn.h" +#include "simgui/textshow.h" + +#include +#include +#include + +using namespace std; +using namespace SIM; + +MsgReceived::MsgReceived(MsgEdit *parent, Message *msg, bool bOpen) + : QObject(parent), EventReceiver(HighPriority - 1) +{ + m_id = msg->id(); + m_contact = msg->contact(); + m_client = msg->client(); + m_edit = parent; + m_bOpen = bOpen; + m_msg = msg; + m_type = msg->baseType(); + + if (m_bOpen){ + m_edit->m_edit->setReadOnly(true); + QString p = msg->presentation(); + if (p.isEmpty()) + p = msg->getRichText(); + EventAddHyperlinks e(p); + e.process(); + p = MsgViewBase::parseText(e.text(), CorePlugin::instance()->value("OwnColors").toBool(), CorePlugin::instance()->value("UseSmiles").toBool()); + m_edit->m_edit->setText(p); + if ((msg->getBackground() != msg->getForeground()) && !CorePlugin::instance()->value("OwnColors").toBool()){ + m_edit->m_edit->setBackground(msg->getBackground()); + m_edit->m_edit->setForeground(msg->getForeground(), true); + } + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + if ((it->id == msg->id()) && + (it->contact == msg->contact()) && + (it->client == msg->client())){ + CorePlugin::instance()->unread.erase(it); + EventMessageRead(msg).process(); + break; + } + } + m_edit->setupNext(); + }else{ + connect(m_edit->m_edit, SIGNAL(textChanged()), m_edit, SLOT(setInput())); + } +} + +bool MsgReceived::processEvent(Event *e) +{ + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + unsigned id = cmd->bar_grp; + if (cmd->param == m_edit){ + MessageDef *mdef = NULL; + CommandDef *msgCmd = CorePlugin::instance()->messageTypes.find(m_type); + if (msgCmd) + mdef = (MessageDef*)(msgCmd->param); + if (mdef && mdef->cmdReceived){ + for (const CommandDef *d = mdef->cmdReceived; !d->text.isEmpty(); d++){ + if (d->popup_id && (d->popup_id == cmd->menu_id)){ + Message *msg = History::load(m_id, m_client, m_contact); + if (msg){ + CommandDef c = *cmd; + c.param = msg; + m_edit->execCommand(&c); + } + return true; + } + } + } + + if ((id >= MIN_INPUT_BAR_ID) && (id < MAX_INPUT_BAR_ID)){ + Message *msg = History::load(m_id, m_client, m_contact); + if (msg){ + CommandDef c = *cmd; + c.id -= CmdReceived; + c.param = msg; + m_edit->execCommand(&c); + } + return true; + } + } + } else + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->param == m_edit){ + unsigned id = cmd->bar_grp; + if ((id >= 0x1000) && (id < MAX_INPUT_BAR_ID)){ + cmd->flags |= BTN_HIDE; + switch (cmd->id - CmdReceived){ + case CmdMsgQuote: + case CmdMsgForward:{ + CommandDef c = *cmd; + Message *msg = m_msg; + if (msg == NULL) + msg = History::load(m_id, m_client, m_contact); + if (msg){ + c.id -= CmdReceived; + c.param = msg; + if (EventCheckCommandState(&c).process()) + cmd->flags &= ~BTN_HIDE; + if (m_msg == NULL) + delete msg; + } + return true; + } + } + MessageDef *mdef = NULL; + CommandDef *msgCmd = CorePlugin::instance()->messageTypes.find(m_type); + if (msgCmd) + mdef = (MessageDef*)(msgCmd->param); + if (mdef && mdef->cmdReceived){ + for (const CommandDef *d = mdef->cmdReceived; !d->text.isEmpty(); d++){ + if (d->id + CmdReceived == cmd->id){ + if (d->flags & COMMAND_CHECK_STATE){ + Message *msg = m_msg; + if (msg == NULL) + msg = History::load(m_id, m_client, m_contact); + if (msg){ + CommandDef c = *d; + c.param = msg; + if (EventCheckCommandState(&c).process()) + cmd->flags &= ~BTN_HIDE; + if (m_msg == NULL) + delete msg; + } + }else{ + cmd->flags &= ~BTN_HIDE; + } + return true; + } + } + } + return true; + } + if (cmd->id == CmdMsgAnswer){ + e->process(this); + cmd->flags |= BTN_HIDE; + if (CorePlugin::instance()->getContainerMode() == 0) + cmd->flags &= ~BTN_HIDE; + return true; + } + + if (m_bOpen){ + switch (cmd->id){ + case CmdTranslit: + case CmdSmile: + case CmdSend: + case CmdSendClose: + e->process(this); + cmd->flags |= BTN_HIDE; + return true; + case CmdNextMessage: + e->process(this); + cmd->flags |= BTN_HIDE; + if (CorePlugin::instance()->getContainerMode() == 0) + cmd->flags &= ~BTN_HIDE; + return true; + } + } + } + } else + if (e->type() == eEventMessageDeleted){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->id() == m_id) + QTimer::singleShot(0, m_edit, SLOT(goNext())); + } + return false; +} + +void MsgReceived::init() +{ + m_msg = NULL; +} + +/* +#ifndef NO_MOC_INCLUDES +#include "msgrecv.moc" +#endif +*/ + diff --git a/plugins/_core/msgrecv.h b/plugins/_core/msgrecv.h new file mode 100644 index 0000000..36af995 --- /dev/null +++ b/plugins/_core/msgrecv.h @@ -0,0 +1,44 @@ +/*************************************************************************** + msgrecv.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGRECV_H +#define _MSGRECV_H + +#include "event.h" + +class MsgEdit; + +class MsgReceived : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgReceived(MsgEdit *parent, SIM::Message *msg, bool bOpen); +public slots: + void init(); +protected: + virtual bool processEvent(SIM::Event*); + unsigned m_type; + unsigned m_id; + unsigned m_contact; + QString m_client; + bool m_bOpen; + MsgEdit *m_edit; + SIM::Message *m_msg; +}; + +#endif + diff --git a/plugins/_core/msgsms.cpp b/plugins/_core/msgsms.cpp new file mode 100644 index 0000000..92422ea --- /dev/null +++ b/plugins/_core/msgsms.cpp @@ -0,0 +1,309 @@ +/*************************************************************************** + msgsms.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msgsms.h" +#include "msgedit.h" +#include "userwnd.h" +#include "core.h" +#include "contacts/contact.h" +#include "simgui/toolbtn.h" +#include "simgui/textshow.h" + +#include + +using namespace SIM; + +const unsigned MAX_SMS_LEN_LATIN1 = 160; +const unsigned MAX_SMS_LEN_UNICODE = 70; + +MsgSMS::MsgSMS(MsgEdit *parent, Message *msg) + : QObject(parent) +{ + m_edit = parent; + m_bExpand = false; + m_bCanSend = false; + if (m_edit->m_edit->isReadOnly()){ + m_edit->m_edit->setText(QString::null); + m_edit->m_edit->setReadOnly(false); + } + QString t = msg->getPlainText(); + if (!t.isEmpty()) + m_edit->m_edit->setText(t); + m_panel = NULL; + Command cmd; + cmd->id = CmdPhoneNumber; + cmd->param = m_edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolCombo *cmbPhone = qobject_cast(eWidget.widget()); + if (cmbPhone) + connect(cmbPhone->lineEdit(), SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + connect(m_edit->m_edit, SIGNAL(textChanged()), this, SLOT(textChanged())); + Contact *contact = getContacts()->contact(msg->contact()); + if (contact == NULL) + return; + if (cmbPhone){ + QString phones = contact->getPhones(); + while (phones.length()){ + QString phoneItem = getToken(phones, ';', false); + phoneItem = getToken(phoneItem, '/', false); + QString phone = getToken(phoneItem, ','); + getToken(phoneItem, ','); + if (phoneItem.toUInt() == CELLULAR) + cmbPhone->addItem(phone); + } + t = static_cast(msg)->getPhone(); + if (!t.isEmpty()) + cmbPhone->setText(t); + } + textChanged(); + SIM::PropertyHubPtr data = contact->getUserData("SMS"); + if (contact->getFlags() & CONTACT_TEMP){ + m_panel = new SMSPanel(m_edit); + m_edit->m_layout->insertWidget(0, m_panel); + connect(m_panel, SIGNAL(destroyed()), this, SLOT(panelDestroyed())); + m_panel->show(); + } + if (m_edit->m_edit->toPlainText().isEmpty()){ + EventTemplate::TemplateExpand t; + if (!data->value("SMSSignatureBefore").toString().isEmpty()){ + t.tmpl = data->value("SMSSignatureBefore").toString(); + t.contact = contact; + t.receiver = this; + t.param = NULL; + EventTemplateExpand(&t).process(); + }else{ + m_bExpand = true; + if (!data->value("SMSSignatureAfter").toString().isEmpty()){ + t.tmpl = data->value("SMSSignatureAfter").toString(); + t.contact = contact; + t.receiver = this; + t.param = NULL; + EventTemplateExpand(&t).process(); + } + } + } +} + +MsgSMS::~MsgSMS() +{ + m_edit->m_userWnd->setStatus(QString::null); // Clear "Size: %1 / Max. size: %2" from status line + if (m_panel) + delete m_panel; +} + +void MsgSMS::panelDestroyed() +{ + m_panel = NULL; +} + +void MsgSMS::init() +{ + if (!m_edit->topLevelWidget()->isActiveWindow() || m_edit->topLevelWidget()->isMinimized()) + return; + Command cmd; + cmd->id = CmdPhoneNumber; + cmd->param = m_edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolCombo *cmbPhone = qobject_cast(eWidget.widget()); + if (cmbPhone && cmbPhone->lineEdit()->text().isEmpty()){ + cmbPhone->setFocus(); + return; + } + m_edit->m_edit->setFocus(); +} + +void MsgSMS::textChanged(const QString&) +{ + textChanged(); +} + +void MsgSMS::textChanged() +{ + QString phone; + QString msgText = m_edit->m_edit->toPlainText(); + Command cmd; + cmd->id = CmdTranslit; + cmd->param = m_edit; + EventCommandWidget eWidget1(cmd); + eWidget1.process(); + CToolButton *btnTranslit = qobject_cast(eWidget1.widget()); + if (btnTranslit && btnTranslit->isChecked()) + msgText = toTranslit(msgText); + cmd->id = CmdPhoneNumber; + cmd->param = m_edit; + EventCommandWidget eWidget2(cmd); + eWidget2.process(); + CToolCombo *cmbPhone = qobject_cast(eWidget2.widget()); + if (cmbPhone) + phone = cmbPhone->lineEdit()->text(); + bool bCanSend = !phone.isEmpty() || !msgText.isEmpty(); + if (bCanSend != m_bCanSend){ + m_bCanSend = bCanSend; + cmd->id = CmdSend; + cmd->flags = m_bCanSend ? 0 : COMMAND_DISABLED; + EventCommandDisabled(cmd).process(); + } + unsigned size = msgText.length(); + unsigned max_size = MAX_SMS_LEN_UNICODE; + if (isLatin(msgText)) + max_size = MAX_SMS_LEN_LATIN1; + QString status = i18n("Size: %1 / Max. size: %2") + .arg(size) .arg(max_size); + if (size > max_size){ + status += " ! "; + status += i18n("Message will be split"); + } + m_edit->m_userWnd->setStatus(status); +} + +bool MsgSMS::processEvent(Event *e) +{ + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->param == m_edit){ + unsigned id = cmd->bar_grp; + if ((id >= MIN_INPUT_BAR_ID) && (id < MAX_INPUT_BAR_ID)){ + cmd->flags |= BTN_HIDE; + if (cmd->id == CmdPhoneNumber) + cmd->flags &= ~BTN_HIDE; + return true; + } + switch (cmd->id){ + case CmdTranslit: + case CmdSmile: + case CmdSend: + case CmdSendClose: + e->process(this); + cmd->flags &= ~BTN_HIDE; + return true; + case CmdNextMessage: + case CmdMsgAnswer: + e->process(this); + cmd->flags |= BTN_HIDE; + return true; + } + } + } else + if (e->type() == eEventTemplateExpanded){ + EventTemplate *et = static_cast(e); + EventTemplate::TemplateExpand *t = et->templateExpand(); + if (m_bExpand){ + m_edit->m_edit->append(t->tmpl); + }else{ + m_edit->m_edit->setText(t->tmpl); + m_edit->m_edit->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); + m_bExpand = true; + Contact *contact = getContacts()->contact(m_id); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("SMS"); + if (!data->value("SMSSignatureAfter").toString().isEmpty()){ + t->tmpl = data->value("SMSSignatureAfter").toString(); + EventTemplateExpand(t).process(); + } + } + } + return true; + } + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->id == CmdSend) && (cmd->param == m_edit)){ + unsigned flags = 0; + QString msgText = m_edit->m_edit->toPlainText(); + QString phone; + Command c; + c->id = CmdPhoneNumber; + c->param = m_edit; + EventCommandWidget eWidget(c); + eWidget.process(); + CToolCombo *cmbPhone = qobject_cast(eWidget.widget()); + if (cmbPhone) + phone = cmbPhone->lineEdit()->text(); + + if (!msgText.isEmpty() && !phone.isEmpty()){ + SMSMessage *msg = new SMSMessage; + msg->setText(msgText); + msg->setFlags(flags); + msg->setPhone(phone); + msg->setContact(m_edit->m_userWnd->id()); + if (m_edit->sendMessage(msg)){ + Contact *contact = getContacts()->contact(m_edit->m_userWnd->id()); + if (contact){ + if (contact->getFlags() & CONTACT_TEMP){ + contact->setName(phone); + if (m_panel && m_panel->chkSave->isChecked()){ + contact->setFlags(contact->getFlags() & ~CONTACT_TEMP); + delete m_panel; + } + EventContact(contact, EventContact::eChanged).process(); + } + QString newPhones; + QString phones = contact->getPhones(); + QString type = "Private Cellular"; + QString src = "-"; + while (phones.length()){ + QString phoneItem = getToken(phones, ';', false); + QString item = phoneItem; + QString phoneStr = getToken(phoneItem, '/', false); + QString phone = getToken(phoneStr, ','); + QString phoneType = getToken(phoneStr, ','); + if ((phone != msg->getPhone()) || (phoneStr.toUInt() != CELLULAR)){ + if (!newPhones.isEmpty()) + newPhones += ';'; + newPhones += item; + continue; + } + type = phoneType; + src = phoneItem; + } + phone += ','; + phone += type; + phone += ','; + phone += QString::number(CELLULAR); + phone += '/'; + phone += src; + if (!newPhones.isEmpty()) + phone += ';'; + newPhones = phone + newPhones; + QString oldPhones = contact->getPhones(); + contact->setPhones(newPhones); + if (oldPhones != newPhones){ + EventContact(contact, EventContact::eChanged).process(); + } + } + } + } + return true; + } + } + return false; +} + +SMSPanel::SMSPanel(QWidget *parent) + : QFrame(parent) + , lay(new QHBoxLayout(this)) +{ + chkSave = new QCheckBox(i18n("Save phone in contact list"), this); + lay->addSpacing(7); + lay->addWidget(chkSave); +} + +SMSPanel::~SMSPanel() +{} diff --git a/plugins/_core/msgsms.h b/plugins/_core/msgsms.h new file mode 100644 index 0000000..4ae8da9 --- /dev/null +++ b/plugins/_core/msgsms.h @@ -0,0 +1,60 @@ +/*************************************************************************** + msgsms.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGSMS_H +#define _MSGSMS_H + +#include +#include +#include "event.h" + +class QCheckBox; +class MsgEdit; + +class SMSPanel : public QFrame +{ + Q_OBJECT +public: + SMSPanel(QWidget *parent); + ~SMSPanel(); + QCheckBox *chkSave; +private: + QHBoxLayout *lay; +}; + +class MsgSMS : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgSMS(MsgEdit *parent, SIM::Message *msg); + ~MsgSMS(); +protected slots: + void init(); + void textChanged(const QString&); + void textChanged(); + void panelDestroyed(); +protected: + virtual bool processEvent(SIM::Event*); + MsgEdit *m_edit; + SMSPanel *m_panel; + unsigned m_id; + bool m_bExpand; + bool m_bCanSend; +}; + +#endif + diff --git a/plugins/_core/msgurl.cpp b/plugins/_core/msgurl.cpp new file mode 100644 index 0000000..203faf9 --- /dev/null +++ b/plugins/_core/msgurl.cpp @@ -0,0 +1,159 @@ +/*************************************************************************** + msgurl.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msgurl.h" +#include "msgedit.h" +#include "userwnd.h" +#include "userlist.h" +#include "core.h" + +#include "simgui/toolbtn.h" +#include "simgui/textshow.h" + + +using namespace SIM; + +MsgUrl::MsgUrl(MsgEdit *parent, Message *msg) + : QObject(parent) +{ + m_client = msg->client(); + m_edit = parent; + if (m_edit->m_edit->isReadOnly()){ + m_edit->m_edit->setText(QString::null); + m_edit->m_edit->setReadOnly(false); + } + QString t = msg->getPlainText(); + if (!t.isEmpty()) + m_edit->m_edit->setText(t); + Command cmd; + cmd->id = CmdUrlInput; + cmd->param = m_edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolEdit *edtUrl = qobject_cast(eWidget.widget()); + if (edtUrl){ + connect(edtUrl, SIGNAL(textChanged(const QString&)), this, SLOT(urlChanged(const QString&))); + edtUrl->setText(static_cast(msg)->getUrl()); + if (edtUrl->text().isEmpty()){ + QString url; + EventGetURL e; + e.process(); + url = e.url(); + if (!url.isEmpty()){ + url = url.mid(1); + int n = url.indexOf('\"'); + if (n > 0){ + QString u = url.left(n); + edtUrl->setText(u); + url = url.mid(n + 1); + n = url.indexOf('\"'); + if (n > 0) + url = url.mid(n + 1); + } + n = url.indexOf('\"'); + if (n > 0){ + url = url.left(n); + m_edit->m_edit->setText(url); + } + } + } + urlChanged(edtUrl->text()); + } +} + +void MsgUrl::init() +{ + if (!m_edit->topLevelWidget()->isActiveWindow() || m_edit->topLevelWidget()->isMinimized()) + return; + Command cmd; + cmd->id = CmdUrlInput; + cmd->param = m_edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolEdit *edtUrl = qobject_cast(eWidget.widget()); + if (edtUrl && edtUrl->text().isEmpty()){ + edtUrl->setFocus(); + return; + } + m_edit->m_edit->setFocus(); +} + +void MsgUrl::urlChanged(const QString &str) +{ + Command cmd; + cmd->id = CmdSend; + cmd->flags = str.isEmpty() ? COMMAND_DISABLED : 0; + cmd->param = m_edit; + EventCommandDisabled(cmd).process(); +} + +bool MsgUrl::processEvent(Event *e) +{ + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->param == m_edit){ + unsigned id = cmd->bar_grp; + if ((id >= MIN_INPUT_BAR_ID) && (id < MAX_INPUT_BAR_ID)){ + cmd->flags |= BTN_HIDE; + if (cmd->id == CmdUrlInput) + cmd->flags &= ~BTN_HIDE; + return true; + } + switch (cmd->id){ + case CmdTranslit: + case CmdSmile: + case CmdSend: + case CmdSendClose: + e->process(this); + cmd->flags &= ~BTN_HIDE; + return true; + case CmdNextMessage: + case CmdMsgAnswer: + e->process(this); + cmd->flags |= BTN_HIDE; + return true; + } + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->id == CmdSend) && (cmd->param == m_edit)){ + QString msgText = m_edit->m_edit->toPlainText(); + QString urlText; + Command cmd; + cmd->id = CmdUrlInput; + cmd->param = m_edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolEdit *edtUrl = qobject_cast(eWidget.widget()); + if (edtUrl) + urlText = edtUrl->text(); + if (!urlText.isEmpty()){ + UrlMessage *msg = new UrlMessage; + msg->setContact(m_edit->m_userWnd->id()); + msg->setText(msgText); + msg->setUrl(urlText); + msg->setClient(m_client); + m_edit->sendMessage(msg); + } + return true; + } + } + return false; +} diff --git a/plugins/_core/msgurl.h b/plugins/_core/msgurl.h new file mode 100644 index 0000000..305f67d --- /dev/null +++ b/plugins/_core/msgurl.h @@ -0,0 +1,43 @@ +/*************************************************************************** + msgurl.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGURL_H +#define _MSGURL_H + +#include +#include + +#include "event.h" + +class MsgEdit; + +class MsgUrl : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgUrl(MsgEdit *parent, SIM::Message *msg); +protected slots: + void init(); + void urlChanged(const QString&); +protected: + virtual bool processEvent(SIM::Event*); + QString m_client; + MsgEdit *m_edit; +}; + +#endif + diff --git a/plugins/_core/msgview.cpp b/plugins/_core/msgview.cpp new file mode 100644 index 0000000..50fb3fd --- /dev/null +++ b/plugins/_core/msgview.cpp @@ -0,0 +1,1466 @@ +/*************************************************************************** + msgview.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "icons.h" +#include "html.h" +#include "unquot.h" +#include "xsl.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/client.h" + +#include "msgview.h" +#include "core.h" +#include "history.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +static char MSG_ANCHOR[] = "
    "; + +class ViewParser : public HTMLParser +{ +public: + ViewParser(bool bIgnoreColors, bool bUseSmiles); + QString parse(const QString &str); +protected: + QString res; + bool m_bIgnoreColors; + bool m_bUseSmiles; + bool m_bInLink; + bool m_bInHead; + bool m_bInParagraph; + bool m_bParagraphEmpty; + bool m_bFirst; + bool m_bSpan; + // Marks the position in 'res' where " DIR=\"whatever\"" should be inserted, + // if the paragraph is DIR-less and we determine the DIR later on. + unsigned m_paraDirInsertionPos; + enum { + DirAuto, // Initial BiDi dir when not explicitly specified. + // Real dir will be determined from the first + // strong BiDi character. + DirLTR, + DirRTL, + DirUnknown + } m_paragraphDir; + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &options); + virtual void tag_end(const QString &tag); +}; + +/* + This parser is run on the output of the 'history XSL'. + The text which the XSL process output should generally be HTML, + but may contain the following special tags: + + ... + Strips the PREPEND tags and prepends their contents to the beginning + of the next paragraph. Useful to make sure chat prefixes are prepended + to the first paragraph of a multi-paragraph message (instead of residing + on a new paragraph). +*/ + +class XslOutputParser : public HTMLParser +{ +public: + XslOutputParser(); + QString parse(const QString &str); + +protected: + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &options); + virtual void tag_end(const QString &tag); + +protected: + QString res; + bool m_bInPrepend; + QString m_sPrepend; +}; + +XslOutputParser::XslOutputParser() + : m_bInPrepend(false) +{ +} + +QString XslOutputParser::parse(const QString &str) +{ + res = QString::null; + HTMLParser::parse(str); + if (!m_sPrepend.isEmpty()) + res = m_sPrepend + res; + return res; +} + +void XslOutputParser::text(const QString& text) +{ + if (m_bInPrepend) + m_sPrepend += quoteString(text); + else + res += quoteString(text); +} + +void XslOutputParser::tag_start(const QString &tag, const list &attrs) +{ + QString ltag = tag.toLower(); + + if (ltag == "prepend") + { + m_bInPrepend = true; + return; + } + + QString tagText; + tagText += '<'; + tagText += tag; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + tagText += ' '; + tagText += name; + if (!value.isEmpty()){ + tagText += "=\""; + tagText += value; + tagText += '\"'; + } + } + tagText += '>'; + + if (m_bInPrepend) + { + m_sPrepend += tagText; + } + else + { + res += tagText; + + // It's time to prepend whatever we've got in m_sPrepend + // to the start of a paragraph. + if ((ltag == "p") && !m_sPrepend.isEmpty()) + { + res += m_sPrepend; + m_sPrepend = QString::null; + } + } +} + +void XslOutputParser::tag_end(const QString &tag) +{ + QString ltag = tag.toLower(); + + if (ltag == "prepend") + { + m_bInPrepend = false; + return; + } + + QString tagText; + tagText += "'; + + if (m_bInPrepend) + m_sPrepend += tagText; + else + res += tagText; +} + +MsgViewBase::MsgViewBase(QWidget *parent, const char *name, unsigned id) + : TextShow (parent, name) + , m_id (id) + , m_popupPos (QPoint(0, 0)) + , m_nSelection (0) + , xsl (NULL) +{ + // Disable top and bottom margins for P tags. This will make sure + // paragraphs have no more spacing than regular lines, thus matching + // RTF's defaut look for paragraphs. + document()->setDefaultStyleSheet("p { margin-top: 0; margin-bottom: 0; }"); + + setColors(); + setFont(CorePlugin::instance()->editFont); + setContextMenuPolicy( Qt::DefaultContextMenu ); +} + +MsgViewBase::~MsgViewBase() +{ + if (xsl) + delete xsl; +} + +void MsgViewBase::setXSL(XSL *n_xsl) +{ + if (xsl) + delete xsl; + xsl = n_xsl; +} + +void MsgViewBase::setSelect(const QString &str) +{ + m_nSelection = 0; + m_selectStr = str; +} + +void MsgViewBase::update() +{ + if (m_updated.empty()) + return; +/* + unsigned i; + for (i = 0; i < (unsigned)paragraphs(); i++){ + QString s = text(i); + int n = s.indexOf(MSG_ANCHOR); + if (n < 0) + continue; + s = s.mid(n + strlen(MSG_ANCHOR)); + n = s.indexOf('\"'); + if (n < 0) + continue; + QString client; + unsigned id = messageId(s.left(n), client); + list::iterator it; + for (it = m_updated.begin(); it != m_updated.end(); ++it){ + if ((it->id == id) && (it->client == client)) + break; + } + if (it != m_updated.end()) + break; + } + m_updated.clear(); + if (i >= (unsigned)paragraphs()) + return; + int x = contentsX(); + int y = contentsY(); + viewport()->setUpdatesEnabled(false); + + unsigned start = i; + list msgs; + for (; i < (unsigned)paragraphs(); i++){ + QString s = text(i); + int n = s.indexOf(MSG_ANCHOR); + if (n < 0) + continue; + s = s.mid(n + strlen(MSG_ANCHOR)); + n = s.indexOf('\"'); + if (n < 0) + continue; + QString client; + unsigned id = messageId(s.left(n), client); + list::iterator it; + for (it = msgs.begin(); it != msgs.end(); ++it){ + if ((it->id == id) && (it->client == client)) + break; + } + if (it != msgs.end()) + continue; + Msg_Id m_id; + m_id.id = id; + m_id.client = client; + msgs.push_back(m_id); + } + int paraFrom, indexFrom; + int paraTo, indexTo; + getSelection(¶From, &indexFrom, ¶To, &indexTo); + setReadOnly(false); + setSelection(start, 0, paragraphs() - 1, 0xFFFF, 0); + removeSelectedText(); + setReadOnly(true); + QString text; + for (list::iterator it = msgs.begin(); it != msgs.end(); ++it){ + Message *msg = History::load(it->id, it->client, m_id); + if (msg == NULL) + continue; + bool bUnread = false; + for (list::iterator itu = CorePlugin::instance()->unread.begin(); itu != CorePlugin::instance()->unread.end(); ++itu){ + msg_id &m = (*itu); + if ((m.contact == msg->contact()) && + (m.id == msg->id()) && + (m.client == msg->client())){ + bUnread = true; + break; + } + } + text += messageText(msg, bUnread); + delete msg; + } + viewport()->setUpdatesEnabled(true); + append(text); //<= here occurred a crash + if (!CorePlugin::instance()->getOwnColors()) + setBackground(i); + if ((paraFrom != paraTo) || (indexFrom != indexTo)) + setSelection(paraFrom, indexFrom, paraTo, indexTo, 0); + TextShow::sync(); + setContentsPos(x, y); + viewport()->repaint(); +*/ +} + +//ToDo: Rewrite this ugly slow Function which is slowing down the History loading. +QString MsgViewBase::messageText(Message *msg, bool bUnread) +{ + QString options; + QString info; + QString status; + + QString icon = "message"; + const CommandDef *def = CorePlugin::instance()->messageTypes.find(msg->type()); + if (def) + icon = def->icon; + bool bDirection = false; + if (msg->type() == MessageStatus){ + icon = "empty"; + StatusMessage *sm = static_cast(msg); + Client *client = NULL; + QString clientStr = msg->client(); + int n = clientStr.lastIndexOf('.'); + if (n >= 0){ + clientStr = clientStr.left(n); + }else{ + clientStr.clear(); + } + if (!clientStr.isEmpty()){ + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + QString n = getContacts()->getClient(i)->name(); + if (n.startsWith(clientStr)){ + client = getContacts()->getClient(i); + break; + } + } + } + if ((client == NULL) && getContacts()->nClients()) + client = getContacts()->getClient(0); + if(client) { + for (def = client->protocol()->statusList(); !def->text.isEmpty(); def++){ + if (def->id == sm->getStatus()){ + icon = def->icon; + status = i18n(def->text); + break; + } + } + } + options += " direction=\"2\""; + bDirection = true; + }else{ + MessageDef *m_def = (MessageDef*)(def->param); + if (m_def->flags & MESSAGE_INFO){ + options += " direction=\"2\""; + bDirection = true; + } + } + info = QString("%1") .arg(icon); + + QString contactName; + if (msg->getFlags() & MESSAGE_RECEIVED){ + if (!bDirection) + options += " direction=\"1\""; + Contact *contact = getContacts()->contact(msg->contact()); + if (contact){ + contactName = contact->getName(); + if (contactName.isEmpty()){ + Client *client = NULL; + ClientDataIterator it(contact->clientData); + void *data; + while ((data = ++it) != NULL){ + if (it.client()->dataName(data) == msg->client()){ + client = it.client(); + break; + } + } + } + } + if (!bUnread){ + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + msg_id &m = (*it); + if ((m.id == msg->id()) && + (m.contact == msg->contact()) && + (m.client == msg->client())){ + bUnread = true; + break; + } + } + } + if (bUnread) + options += " unread=\"1\""; + }else{ + if (!bDirection) + options += " direction=\"0\""; + contactName = getContacts()->owner()->getName(); + } + if (contactName.isEmpty()) + contactName = "???"; + info += QString("%1") .arg(quoteString(contactName)); + QString id = QString::number(msg->id()); + id += ','; + // + // Terrible hack to set message bgcolor. We prefer to insert the entire history + // in one chunk (since it's more efficient and causes less redraws), and there's + // no way to set block's background color directly in Qt's HTML), so we make a note + // of it in the HTML and set it retroactively in setBackground. + if (!CorePlugin::instance()->value("OwnColors").toBool() && (msg->getBackground() != 0xFFFFFFFF) && (msg->getForeground() != msg->getBackground())) + id += QString::number(msg->getBackground()); + // + QString client_str = msg->client(); + if (!client_str.isEmpty()){ + id += ','; + id += quoteString(client_str); + } + if (m_cut.size()){ + id += ','; + id += QString::number(m_cut.size()); + } + info += ""; + info += id; + info += ""; + + + QString icons; + if (msg->getFlags() & MESSAGE_SECURE) + options += " encrypted=\"1\""; + if (msg->getFlags() & MESSAGE_URGENT) + options += " urgent=\"1\""; + if (msg->getFlags() & MESSAGE_LIST) + options += " list=\"1\""; + + QString s; + QDateTime t; + t.setTime_t(msg->getTime()); + info += s.sprintf("", + t.time().hour(), t.time().minute(), t.time().second()) .arg(formatDate(QDateTime::fromTime_t(msg->getTime()).date())); + + s = "type() != MessageStatus){ + msgText = msg->presentation(); + if (msgText.isEmpty()){ + unsigned type = msg->baseType(); + CommandDef *cmd = CorePlugin::instance()->messageTypes.find(type); + if (cmd){ + MessageDef *def = (MessageDef*)(cmd->param); + msgText = i18n(def->singular, def->plural, 1); + int n = msgText.indexOf("1 "); + if (n == 0){ + msgText = msgText.mid(2); + }else if (n > 0){ + msgText = msgText.left(n); + } + msgText = QString("

    ") + msgText + "

    "; + } + QString text = msg->getRichText(); + msgText += text; + } + }else{ + msgText = status; + } + EventAddHyperlinks e(msgText); + e.process(); + ViewParser parser(CorePlugin::instance()->value("OwnColors").toBool(), CorePlugin::instance()->value("UseSmiles").toBool()); + msgText = parser.parse(e.text()); + s += "value("OwnColors").toBool() && (msg->getForeground() != 0xFFFFFFFF) && (msg->getForeground() != msg->getBackground())) + { + s += " fgcolor=\"#"; + s += QString::number(msg->getForeground(), 16).rightJustified(6, '0'); + s += '\"'; + } + + // Some bright day might come when one could specify background color from inside Qt's richtext. + // Meanwhile, this is useless: + if ((msg->getBackground() != 0xFFFFFFFF) && (msg->getForeground() != msg->getBackground())) + { + s += " bgcolor=\"#"; + s += QString::number(msg->getBackground(), 16).rightJustified(6, '0'); + s += '\"'; + } + s += '>'; + + // We pass the rich text quoted, since we're not sure of its' XML validity. + // The XSL engine should copy it as-is (using xsl:value-of with disable-output-escaping="yes"). + s += quoteString(QString(MSG_BEGIN) + msgText); + + s += ""; + s += ""; + XSL *p = xsl; + if (p == NULL) + p = CorePlugin::instance()->historyXSL; + QString res = p->process(s); + + XslOutputParser outParser; + res = outParser.parse(res); + + QString anchor = MSG_ANCHOR; + anchor += id; + anchor += "\"/>"; + res = "

    " + anchor + res + "

    "; + return res; +} + +void MsgViewBase::setSource(const QUrl& url) +{ + setSource(url.toString()); +} + +void MsgViewBase::setSource(const QString &url) +{ + QString proto; + int n = url.indexOf(':'); + if (n >= 0) + proto = url.left(n); + if (proto != "msg"){ + TextShow::setSource(url); + return; + } + QString id = url.mid(proto.length() + 3); + unsigned msg_id = getToken(id, ',').toULong(); + getToken(id, ','); + id = getToken(id, '/'); + QString client = SIM::unquoteString(id); + if (client.isEmpty()) + client = QString::number(m_id); + Message *msg = History::load(msg_id, client, m_id); + if (msg){ + EventOpenMessage(msg).process(); + delete msg; + } +} + +// +// We have to use this function since Qt has no tag to set background color per-paragraph +// from within HTML. See matching hack in MsgViewBase::messageText. +void MsgViewBase::setBackground(unsigned /*n*/) +{ +/* + QColor bgcolor; + bool bInMsg = false; + bool bSet = false; + + QString sAnchor = QString::fromLatin1(MSG_ANCHOR), + sBegin = QString::fromLatin1(MSG_BEGIN); + + int i; + for (i = n; i >= 0; i--){ + QString s = text(i); + if (s.indexOf(sAnchor) >= 0) + break; + } + for (; i < paragraphs(); i++){ + QString s = text(i); + int anchorPos = s.indexOf(sAnchor); + if (anchorPos >= 0) + { + bInMsg = false; + bSet = false; + + // This code could be a bit faster by making assumptions. + // However, I prefer to be correct HTML-parser-wise. + + int idStart = anchorPos + sAnchor.length(); + int idEnd = s.indexOf('\"', idStart); + if ((idStart >= 0) && (idEnd >= 0)) + { + QString id = s.mid(idStart, idEnd - idStart); + + // Parse the message id (msgId,backgroundColor,...) + int bgcolorStart = id.indexOf(','); + if (bgcolorStart >= 0) + { + QString sBgcolor = id.mid(bgcolorStart + 1); + int bgcolorEnd = sBgcolor.indexOf(','); + if (bgcolorEnd > 0) + sBgcolor = sBgcolor.left(bgcolorEnd); + if (!sBgcolor.isEmpty()) + bgcolor = QColor(sBgcolor.toULong(&bSet)); + } + } + } + if (s.indexOf(sBegin) >= 0) + bInMsg = true; + + if (bInMsg && bSet){ + setParagraphBackgroundColor(i, bgcolor); + }else{ + clearParagraphBackground(i); + } + } +*/ +} +// + +void MsgViewBase::addMessage(Message *msg, bool bUnread, bool /*bSync*/) +{ + unsigned n = document()->blockCount(); + if (n > 0) + n--; + append(messageText(msg, bUnread)); + if (!CorePlugin::instance()->value("OwnColors").toBool()) + setBackground(n); +} + +bool MsgViewBase::findMessage(Message *msg) +{ + QTextBlock block = document()->firstBlock(); + while( block.isValid() ) { + QTextCursor cursor( block ); + cursor.select( QTextCursor::BlockUnderCursor ); + QTextDocumentFragment fragment( cursor ); + QString s = fragment.toHtml(); + int n = s.indexOf(MSG_ANCHOR); + if (n >= 0) { + s = s.mid(n + strlen(MSG_ANCHOR)); + n = s.indexOf('\"'); + if (n >= 0) { + QString client; + if ((messageId(s.left(n), client) == msg->id()) && (client == msg->client())) { + return true; + } + } + } + block = block.next(); + } + + return false; +} + +void MsgViewBase::setColors() +{ + TextShow::setBackground(CorePlugin::instance()->value("EditBackground").toUInt()); + TextShow::setForeground(CorePlugin::instance()->value("EditForeground").toUInt()); +} + +unsigned MsgViewBase::messageId(const QString &_s, QString &client) +{ + QString s(_s); + unsigned id = getToken(s, ',').toULong(); + getToken(s, ','); + client = getToken(s, ','); + if (id >= 0x80000000) + return id; + for (unsigned cut_id = s.toUInt(); cut_id < m_cut.size(); cut_id++){ + if (m_cut[cut_id].client != client) + continue; + if (id < m_cut[cut_id].from) + continue; + id -= m_cut[cut_id].size; + } + return id; +} + +void MsgViewBase::reload() +{ +/* + QString t; + vector msgs; + unsigned i; + for (i = 0; i < (unsigned)paragraphs(); i++){ + QString s = text(i); + int n = s.indexOf(MSG_ANCHOR); + if (n < 0) + continue; + s = s.mid(n + strlen(MSG_ANCHOR)); + n = s.indexOf('\"'); + if (n < 0) + continue; + Msg_Id id; + id.id = messageId(s.left(n), id.client); + unsigned nn; + for (nn = 0; nn < msgs.size(); nn++){ + if ((msgs[nn].id == id.id) && (msgs[nn].client == id.client)) + break; + } + if (nn >= msgs.size()) + msgs.push_back(id); + } + for (i = 0; i < msgs.size(); i++){ + Message *msg = History::load(msgs[i].id, msgs[i].client, m_id); + if (msg == NULL) + continue; + t += messageText(msg, false); + delete msg; + } + QPoint p = QPoint(0, height()); + p = mapToGlobal(p); + p = viewport()->mapFromGlobal(p); + int x, y; + viewportToContents(p.x(), p.y(), x, y); + int para; + int pos = charAt(QPoint(x, y), ¶); + setText(t); + if (!CorePlugin::instance()->getOwnColors()) + setBackground(0); + if (pos == -1){ + scrollToBottom(); + }else{ + setCursorPosition(para, pos); + ensureCursorVisible(); + } +*/ +} + +bool MsgViewBase::processEvent(Event *e) +{ + if ((e->type() == eEventRewriteMessage) || (e->type() == eEventMessageRead)){ + /* + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->contact() != m_id) + return false; + unsigned i; + for (i = 0; i < (unsigned)paragraphs(); i++){ + QString s = text(i); + int n = s.indexOf(MSG_ANCHOR); + if (n < 0) + continue; + s = s.mid(n + strlen(MSG_ANCHOR)); + n = s.indexOf('\"'); + if (n < 0) + continue; + QString client; + if ((messageId(s.left(n), client) == msg->id()) && (client == msg->client())) + break; + } + if (i >= (unsigned)paragraphs()) + return false; + Msg_Id id; + id.id = msg->id(); + id.client = msg->client(); + m_updated.push_back(id); + QTimer::singleShot(0, this, SLOT(update())); + */ + return false; + } + if (e->type() == eEventCutHistory){ + /* + EventCutHistory *ech = static_cast(e); + CutHistory *ch = ech->cut(); + if (ch->contact != m_id) + return false; + + bool bDelete = false; + vector start_pos; + vector end_pos; + for (unsigned i = 0; i < (unsigned)paragraphs(); i++){ + QString s = text(i); + int n = s.indexOf(MSG_ANCHOR); + if (n < 0) + continue; + s = s.mid(n + strlen(MSG_ANCHOR)); + n = s.indexOf('\"'); + if (n < 0) + continue; + QString client; + unsigned id = messageId(s.left(n), client); + if ((client == ch->client) && (id >= ch->from) && (id < ch->from + ch->size)){ + if (!bDelete){ + bDelete = true; + start_pos.push_back(i); + } + }else{ + if (bDelete){ + bDelete = false; + end_pos.push_back(i); + } + } + } + if (bDelete) + end_pos.push_back(paragraphs()); + if (start_pos.size()){ + int paraFrom, indexFrom; + int paraTo, indexTo; + getSelection(¶From, &indexFrom, ¶To, &indexTo); + QPoint p = QPoint(0, 0); + p = mapToGlobal(p); + p = viewport()->mapFromGlobal(p); + int x, y; + viewportToContents(p.x(), p.y(), x, y); + int para; + int pos = charAt(QPoint(x, y), ¶); + setReadOnly(false); + for (unsigned i = 0; i < start_pos.size(); i++){ + setSelection(start_pos[i], 0, end_pos[i], 0, 0); + removeSelectedText(); + if ((unsigned)pos >= start_pos[i]) + pos = end_pos[i] - start_pos[i]; + } + if ((paraFrom == -1) && (paraTo == -1)){ + if (pos == -1){ + scrollToBottom(); + }else{ + setCursorPosition(para, pos); + ensureCursorVisible(); + } + }else{ + setSelection(paraFrom, indexFrom, paraTo, indexTo, 0); + } + setReadOnly(true); + repaint(); + } + m_cut.push_back(*ch); + */ + return false; + } + if (e->type() == eEventMessageDeleted){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->contact() != m_id) + return false; + /* + for (unsigned i = 0; i < (unsigned)paragraphs(); i++){ + unsigned j; + QString s = text(i); + int n = s.indexOf(MSG_ANCHOR); + if (n < 0) + continue; + s = s.mid(n + strlen(MSG_ANCHOR)); + n = s.indexOf('\"'); + if (n < 0) + continue; + QString client; + if ((messageId(s.left(n), client) != msg->id()) || (client != msg->client())) + continue; + + for (j = i + 1; j < (unsigned)paragraphs(); j++){ + QString s = text(j); + int n = s.indexOf(MSG_ANCHOR); + if (n < 0) + continue; + s = s.mid(n + strlen(MSG_ANCHOR)); + n = s.indexOf('\"'); + if (n < 0) + continue; + QString client; + if ((messageId(s.left(n), client) != msg->id()) || (client != msg->client())) + break; + } + int paraFrom, indexFrom; + int paraTo, indexTo; + getSelection(¶From, &indexFrom, ¶To, &indexTo); + unsigned pos = 0xFFFF; + if (j == (unsigned)paragraphs()){ + j++; + pos = 0; + } + setSelection(i, 0, j - 1, pos, 0); + setReadOnly(false); + removeSelectedText(); + setReadOnly(true); + if ((paraFrom == -1) && (paraTo == -1)){ + scrollToBottom(); + }else{ + setSelection(paraFrom, indexFrom, paraTo, indexTo, 0); + } + break; + } + */ + return false; + } + if (e->type() == eEventHistoryConfig){ + EventHistoryConfig *ehc = static_cast(e); + unsigned long id = ehc->id(); + if (id && (id != m_id)) + return false; + reload(); + } else + if (e->type() == eEventHistoryColors) { + setColors(); + } else + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if ((cmd->param != this) || (cmd->menu_id != MenuMsgView)) + return false; + Message *msg; + switch (cmd->id){ + case CmdCopy: + cmd->flags &= ~(COMMAND_DISABLED | COMMAND_CHECKED); + if (!textCursor().hasSelection()) + cmd->flags |= COMMAND_DISABLED; + return true; + case CmdMsgOpen: + msg = currentMessage(); + if (msg){ + unsigned type = msg->baseType(); + delete msg; + CommandDef *def = CorePlugin::instance()->messageTypes.find(type); + if (def == NULL) + return false; + cmd->icon = def->icon; + cmd->flags &= ~COMMAND_CHECKED; + return true; + } + return false; + case CmdMsgSpecial: + msg = currentMessage(); + if (msg){ + EventMenuGetDef eMenu(MenuMsgCommand); + eMenu.process(); + CommandsDef *cmdsMsg = eMenu.defs(); + + unsigned n = 0; + MessageDef *mdef = NULL; + unsigned type = msg->baseType(); + const CommandDef *cmdsSpecial = NULL; + CommandDef *msgCmd = CorePlugin::instance()->messageTypes.find(type); + if (msgCmd) + mdef = (MessageDef*)(msgCmd->param); + + if (mdef){ + if (msg->getFlags() & MESSAGE_RECEIVED){ + cmdsSpecial = mdef->cmdReceived; + }else{ + cmdsSpecial = mdef->cmdSent; + } + if (cmdsSpecial) + for (const CommandDef *d = cmdsSpecial; !d->text.isEmpty(); d++) + n++; + } + + { + CommandsList it(*cmdsMsg, true); + while (++it) + n++; + } + if (n == 0) + return false; + + n++; + CommandDef *cmds = new CommandDef[n]; + n = 0; + if (cmdsSpecial){ + for (const CommandDef *d = cmdsSpecial; !d->text.isEmpty(); d++){ + cmds[n] = *d; + cmds[n].id = CmdMsgSpecial + n; + cmds[n].flags = COMMAND_DEFAULT; + n++; + } + } + CommandDef *c; + CommandsList it(*cmdsMsg, true); + while ((c = ++it) != NULL){ + CommandDef cmd = *c; + cmd.menu_id = MenuMsgCommand; + cmd.param = msg; + if (!EventCheckCommandState(&cmd).process()) + continue; + cmd.flags &= ~COMMAND_CHECK_STATE; + cmds[n++] = cmd; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + delete msg; + return true; + } + return false; + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->param != this) || (cmd->menu_id != MenuMsgView)) + return false; + Message *msg; + switch (cmd->id){ + case CmdCutHistory: + msg = currentMessage(); + if (msg){ + History::cut(msg, 0, 0); + delete msg; + return true; + } + return false; + case CmdDeleteMessage: + msg = currentMessage(); + if (msg){ + History::del(msg); + delete msg; + return true; + } + return false; + case CmdCopy: + copy(); + return true; + case CmdMsgOpen: + msg = currentMessage(); + if (msg){ + msg->setFlags(msg->getFlags() | MESSAGE_OPEN); + EventOpenMessage(msg).process(); + delete msg; + return true; + } + return false; + default: + msg = currentMessage(); + if (msg){ + if (cmd->id >= CmdMsgSpecial){ + MessageDef *mdef = NULL; + unsigned type = msg->baseType(); + CommandDef *msgCmd = CorePlugin::instance()->messageTypes.find(type); + if (msgCmd) + mdef = (MessageDef*)(msgCmd->param); + const CommandDef *cmds = NULL; + if (mdef){ + if (msg->getFlags() & MESSAGE_RECEIVED){ + cmds = mdef->cmdReceived; + }else{ + cmds = mdef->cmdSent; + } + } + + if (cmds){ + unsigned n = cmd->id - CmdMsgSpecial; + for (const CommandDef *d = cmds; !d->text.isEmpty(); d++){ + if (n-- == 0){ + CommandDef cmd = *d; + cmd.param = msg; + cmd.menu_id = 0; + EventCommandExec(&cmd).process(); + return true; + } + } + } + } + Command c; + c->id = cmd->id; + c->menu_id = MenuMsgCommand; + c->param = msg; + EventCommandExec e(c); + bool res = e.process(); + delete msg; + return res; + } + return false; + } + } + return false; +} + +Message *MsgViewBase::currentMessage() +{ + QTextCursor cursor = cursorForPosition( m_popupPos ); + QTextBlock block = cursor.block(); + if( !block.isValid() ) + return NULL; + while( block.isValid() ) { + QTextCursor cursor( block ); + cursor.select( QTextCursor::BlockUnderCursor ); + QTextDocumentFragment fragment( cursor ); + QString s = fragment.toHtml(); + int n = s.indexOf(MSG_ANCHOR); + if (n >= 0) { + s = s.mid(n + strlen(MSG_ANCHOR)); + n = s.indexOf('\"'); + if (n >= 0) { + QString client; + unsigned id = messageId(s.left(n), client); + Message *msg = History::load(id, client, m_id); + if (msg) + return msg; + } + } + block = block.previous(); + } + return NULL; +} + +void MsgViewBase::contextMenuEvent( QContextMenuEvent *event ) +{ + m_popupPos = event->pos(); + Command cmd; + cmd->popup_id = MenuMsgView; + cmd->param = this; + cmd->flags = COMMAND_NEW_POPUP; + EventMenuGet e(cmd); + e.process(); + QMenu *pMenu = e.menu(); + pMenu->exec( event->globalPos() ); + delete pMenu; +} + +MsgView::MsgView(QWidget *parent, unsigned id) + : MsgViewBase(parent, NULL, id) +{ + int nCopy = CorePlugin::instance()->value("CopyMessages").toUInt(); + unsigned nUnread = 0; + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + msg_id &m = (*it); + if (m.contact == m_id) + nUnread++; + } + if (nCopy || nUnread){ + QString t = toHtml(); + HistoryIterator it(m_id); + it.end(); + while ((nCopy > 0) || nUnread){ + Message *msg = --it; + if (msg == NULL) + break; + t = messageText(msg, false) + t; + nCopy--; + if (nUnread == 0) + continue; + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + msg_id &m = (*it); + if ((m.contact == msg->contact()) && + (m.id == msg->id()) && + (m.client == msg->client())){ + nUnread--; + break; + } + } + } + setHtml(t); + if (!CorePlugin::instance()->value("OwnColors").toBool()) + setBackground(0); + } + QScrollBar *sbar = verticalScrollBar(); + if( NULL != sbar ) { + sbar->setValue( sbar->maximum() ); + } + QTimer::singleShot(0, this, SLOT(init())); +} + +MsgView::~MsgView() +{ +} + +void MsgView::init() +{ + QScrollBar *sbar = verticalScrollBar(); + if( NULL != sbar ) { + sbar->setValue( sbar->maximum() ); + } +} + +bool MsgView::processEvent(Event *e) +{ + if ((e->type() == eEventSent) || (e->type() == eEventMessageReceived)){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->contact() != m_id) + return false; + if (msg->getFlags() & MESSAGE_NOVIEW) + return false; + bool bAdd = true; + if (msg->type() == MessageStatus){ + bAdd = false; + Contact *contact = getContacts()->contact(msg->contact()); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("_core"); + if (!data.isNull() && data->value("LogStatus").toBool() != NEW_MSG_NOOPEN) + bAdd = true; + } + } + if (bAdd && (e->type() == eEventMessageReceived)){ + Contact *contact = getContacts()->contact(msg->contact()); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("_core", true); + if (data->value("OpenNewMessage").toUInt() != NEW_MSG_NOOPEN) + bAdd = false; + } + } + if (bAdd){ + addMessage(msg); + if (!textCursor().hasSelection()) { + QScrollBar *sbar = verticalScrollBar(); + if( NULL != sbar ) { + sbar->setValue( sbar->maximum() ); + } + } + } + } + return MsgViewBase::processEvent(e); +} + +ViewParser::ViewParser(bool bIgnoreColors, bool bUseSmiles) +{ + m_bIgnoreColors = bIgnoreColors; + m_bUseSmiles = bUseSmiles; + m_bInLink = false; + m_bInHead = false; + m_bInParagraph = false; + m_bParagraphEmpty = true; + m_bFirst = true; + m_bSpan = false; +} + +QString ViewParser::parse(const QString &str) +{ + res = QString::null; + HTMLParser::parse(str); + return res; +} + +void ViewParser::text(const QString &text) +{ + if (text.isEmpty()) + return; + + if (m_bInParagraph) + m_bParagraphEmpty = false; + + if (m_bInParagraph && (m_paragraphDir == DirAuto)) + { + /* text isn't (unicode)-NULL terminated so we can't check for c->isNull! */ + for(unsigned int i = 0; ((i < (unsigned)text.length()) && (m_paragraphDir == DirAuto)); i++) + { + const QChar c = text.unicode()[i]; + // Note: Qt expects ltr/rtl to be lower-case. + switch(c.direction()) + { + case QChar::DirL: + res.insert(m_paraDirInsertionPos, " dir=\"ltr\""); + m_paragraphDir = DirLTR; + break; + case QChar::DirR: + res.insert(m_paraDirInsertionPos, " dir=\"rtl\""); + m_paragraphDir = DirRTL; + break; + default: // avoid gcc warning + break; + } + } + } + + if (!m_bUseSmiles || m_bInLink){ + res += quoteString(text); + return; + } + m_bFirst = false; + if (m_bUseSmiles){ + QString r = getIcons()->parseSmiles(text); + res += r; + }else{ + res += quoteString(text); + } +} + +static const char *def_smiles[] = + { + ":-)", + ":-0", + ":-|", + ":-/", + ":-(", + ":-{}", + ":*)", + ":'-(", + ";-)", + ":-@", + ":-\")", + ":-X", + ":-P", + "8-)", + "O:-)", + ":-D", + "*ANNOYED*", + "*DISGUSTED*", + "*DROOLING*", + "*GIGGLING*", + "*JOKINGLY*", + "*SHOCKED*", + "*WHINING*", + "*SURPRISED*", + "*SURPRISED*", + "*IN LOVE*" + }; + +void ViewParser::tag_start(const QString &tag, const list &attrs) +{ + // the tag that will be actually written out + QString oTag = tag; + + if (m_bInHead) + return; + + QString style; + + if (tag == "img"){ + QString src; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = it->toLower(); + ++it; + QString value = *it; + if (name == "src"){ + src = value; + break; + } + } + if (src.startsWith("icon:smile")){ + bool bOK; + unsigned nSmile = src.mid(10).toUInt(&bOK, 16); + if (bOK && (nSmile < 26)){ + QString s = def_smiles[nSmile]; + res += getIcons()->parseSmiles(s); + return; + } + } + }else if (tag == "a"){ + m_bInLink = true; + }else if (tag == "p"){ + m_bInParagraph = true; + m_paragraphDir = DirAuto; + m_bParagraphEmpty = true; + }else if (tag == "html"){ // we display as a part of a larger document + return; + }else if (tag == "head"){ + m_bInHead = 1; + return; + }else if (tag == "body"){ // we display as a part of a larger document + oTag = "span"; + } + + QString tagText; + tagText += '<'; + tagText += oTag; + + if (tag == "p") + { + m_paraDirInsertionPos = res.length() + tagText.length(); + } + + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = it->toLower(); + ++it; + QString value = *it; + + // Handling for attributes of specific tags. + if (tag == "body"){ + if (name == "bgcolor"){ + style += "background-color:" + value + ';'; + continue; + } + }else if (tag == "p"){ + if (name == "dir"){ + QString dir = value.toLower(); + if (dir == "ltr") + m_paragraphDir = DirLTR; + else if (dir == "rtl") + m_paragraphDir = DirRTL; + else + m_paragraphDir = DirUnknown; + } + }else if (tag == "font"){ + if (name == "color" && m_bIgnoreColors) + continue; + } + + // Handle for generic attributes. + if (name == "style"){ + style += value; + continue; + } + + tagText += ' '; + tagText += name; + if (!value.isEmpty()){ + tagText += "=\""; + tagText += value; + tagText += '\"'; + } + } + + // Quite crude but working CSS to remove color styling. + // It won't filter out colors as part of 'background', but life's tough. + // (If it's any comfort, Qt probably won't display it either.) + if (!style.isEmpty()){ + if (m_bIgnoreColors){ + list opt = parseStyle(style); + list new_opt; + for (list::iterator it = opt.begin(); it != opt.end(); ++it){ + QString name = *it; + it++; + if (it == opt.end()) + break; + QString value = *it; + if ((name == "color") || + (name == "background") || + (name == "background-color") || + (name == "font-size") || + (name == "font-style") || + (name == "font-variant") || + (name == "font-weight") || + (name == "font-family")) + continue; + new_opt.push_back(name); + new_opt.push_back(value); + } + style = makeStyle(new_opt); + } + if (!style.isEmpty()) + tagText += " style=\"" + style + '\"'; + } + tagText += '>'; + res += tagText; +} + +void ViewParser::tag_end(const QString &tag) +{ + QString oTag = tag; + if (tag == "a"){ + m_bInLink = false; + }else if (tag == "p"){ + if (m_bInParagraph && m_bParagraphEmpty) + // The user probably didn't intend to insert an empty paragraph. + // We are probably viewing faulty content produced by QTextEdit + // (which returns

    but optimizes it away upon loading), + // so we fix it up. + res += "
    "; + res += "

    "; + m_bInParagraph = false; + return; + }else if (tag == "head"){ + m_bInHead = false; + return; + }else if (tag == "html"){ + return; + }else if (tag == "body"){ + oTag = "span"; + } + if (m_bInHead) + return; + res += "'; +} + +QString MsgViewBase::parseText(const QString &text, bool bIgnoreColors, bool bUseSmiles) +{ + ViewParser parser(bIgnoreColors, bUseSmiles); + return parser.parse(text); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "msgview.moc" +#endif +*/ + diff --git a/plugins/_core/msgview.h b/plugins/_core/msgview.h new file mode 100644 index 0000000..c9453f4 --- /dev/null +++ b/plugins/_core/msgview.h @@ -0,0 +1,92 @@ +/*************************************************************************** + msgview.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGVIEW_H +#define _MSGVIEW_H + +#include +#include + +#include "simgui/textshow.h" +#include + +class CorePlugin; +class XSL; + +using namespace std; + +struct CutHistory +{ + unsigned contact; + QString client; + unsigned from; + unsigned size; +}; + +struct Msg_Id +{ + unsigned id; + QString client; +}; + +class MsgViewBase : public TextShow, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgViewBase(QWidget *parent, const char *name="", unsigned id=(unsigned)(-1)); + ~MsgViewBase(); + void addMessage(SIM::Message *msg, bool bUnread=false, bool bSync=true); + bool findMessage(SIM::Message *msg); + void setSelect(const QString &str); + void setXSL(XSL*); + static QString parseText(const QString &text, bool bIgnoreColors, bool bUseSmiles); + unsigned m_id; + SIM::Message *currentMessage(); +protected slots: + void update(); +protected: + virtual bool processEvent(SIM::Event*); + virtual void contextMenuEvent( QContextMenuEvent *event ); + void setBackground(unsigned start); + void setSource(const QString&); + void setSource(const QUrl&); + void setColors(); + void reload(); + unsigned messageId(const QString&, QString &client); + QString messageText(SIM::Message *msg, bool bUnread); + QPoint m_popupPos; + QString m_selectStr; + unsigned m_nSelection; + XSL *xsl; + vector m_cut; + list m_updated; +}; + +class MsgView : public MsgViewBase +{ + Q_OBJECT +public: + MsgView(QWidget *parent, unsigned id); + ~MsgView(); +protected slots: + void init(); +protected: + virtual bool processEvent(SIM::Event*); +}; + +#endif + diff --git a/plugins/_core/msgview_menu.cpp b/plugins/_core/msgview_menu.cpp new file mode 100644 index 0000000..5ec413e --- /dev/null +++ b/plugins/_core/msgview_menu.cpp @@ -0,0 +1,88 @@ +/*************************************************************************** + msgview_menu.cpp + + This file contains subroutine that creates MenuMsgView menu and add some + of it's items. Items that created in other places are mentioned as a comments. + MenuMsgView used as context menu for chat history in contaner window + (chat-window) and as a context menu in history window. (Some menu items are + visible only when used in history window (CmdDeleteMessage, CmdCutHistory)) + ------------------- + begin : Tue Nov 26 2008 + based on : core.cpp of Sim-IM by Vladimir Shutoff + and Sim-IM team + copyright : (C) 2002 - 2004 Vladimir Shutoff + (C) 2004 - 2008 Sim-IM Development Team + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "core.h" + +using namespace SIM; + +void CorePlugin::createMenuMsgView() +{ + EventMenu(MenuMsgView, EventMenu::eAdd).process(); + + Command cmd; + + cmd->id = CmdMsgOpen; + cmd->text = I18N_NOOP("&Open message"); + cmd->icon = "message"; + cmd->menu_id = MenuMsgView; + cmd->menu_grp = 0x1000; + cmd->bar_id = 0; + cmd->bar_grp = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdMsgSpecial; + cmd->text = "_"; + cmd->icon = QString::null; + cmd->menu_id = MenuMsgView; + cmd->menu_grp = 0x1001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdCopy; + cmd->text = I18N_NOOP("&Copy"); + cmd->accel = "Ctrl+C"; + cmd->icon = "editcopy"; + cmd->menu_id = MenuMsgView; + cmd->menu_grp = 0x2000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdDeleteMessage; + cmd->text = I18N_NOOP("&Delete message"); + cmd->accel = QString::null; + cmd->icon = "remove"; + cmd->menu_id = MenuMsgView; + cmd->menu_grp = 0x3000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdCutHistory; + cmd->text = I18N_NOOP("&Cut history"); + cmd->icon = "remove"; + cmd->menu_id = MenuMsgView; + cmd->menu_grp = 0x3001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + /***** Ignore this phrase (CmdIgnoreText, grp=0x7000) *****/ + // This item should be created by filter plugin by FilterPlugin constructor but for + // some reason it is not seen at menu list + // FIXME: Find out why 'Ignore this phrase' is not seen + + /***** Copy location (CmdCopyLocation, grp=0x7010) *****/ + // This menu item is created in plugins/navigate/navigate.cpp by NavigatePlugin constructor + +} diff --git a/plugins/_core/newprotocol.cpp b/plugins/_core/newprotocol.cpp new file mode 100644 index 0000000..1ffb24f --- /dev/null +++ b/plugins/_core/newprotocol.cpp @@ -0,0 +1,242 @@ +/*************************************************************************** + newprotocol.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "newprotocol.h" + +#include "icons.h" + +#include "profilemanager.h" +#include "newprotocol.h" +#include "connectwnd.h" +#include "core.h" +#include "contacts/client.h" +#include "contacts/protocolmanager.h" +#include "log.h" + +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +//static bool cmp_protocol(Protocol *p1, Protocol *p2) +//{ +// const CommandDef *cmd1 = p1->description(); +// const CommandDef *cmd2 = p2->description(); +// QString s1 = i18n(cmd1->text); +// QString s2 = i18n(cmd2->text); +// return s1 < s2; +//} + +NewProtocol::NewProtocol(QWidget *parent, int default_protocol, bool bConnect) : QWizard(parent) +{ + setupUi(this); + m_setup = NULL; + m_last = NULL; + m_bConnected = false; + m_bConnect = false; + m_bStart = (parent == NULL); + setWindowIcon(Icon("configure")); + setButtonsPict(this); + + m_setupPage = new QWizardPage( this ); + m_setupLayout = new QHBoxLayout(m_setupPage); + addPage(m_setupPage); + + m_connectWnd = new ConnectWnd(m_bStart); + addPage(m_connectWnd); //, i18n(protocol->description()->text)); + if (m_bStart){ + m_last = new QWizardPage(this); + addPage(m_last);//, i18n(protocol->description()->text)); + } + +// helpButton()->hide(); + + QStringList plugins = getPluginManager()->enumPlugins(); + foreach(QString pluginname, plugins) + { + if(getPluginManager()->isPluginProtocol(pluginname)) + m_protocolPlugins.append(getPluginManager()->plugin(pluginname)); + } + + ProtocolPtr protocol; + ProtocolIterator it; + while ((protocol = ++it) != NULL){ + const CommandDef *cmd = protocol->description(); + if (cmd == NULL) + continue; + m_protocols.push_back(protocol); + } + //sort(m_protocols.begin(), m_protocols.end(), cmp_protocol); + for (unsigned i = 0; i < m_protocols.size(); i++){ + const CommandDef *cmd = m_protocols[i]->description(); + cmbProtocol->addItem(Icon(cmd->icon), i18n(cmd->text)); + } + connect(cmbProtocol, SIGNAL(activated(int)), this, SLOT(protocolChanged(int))); + cmbProtocol->setCurrentIndex(default_protocol); + protocolChanged(default_protocol); + if (bConnect){ + next(); +// showPage(m_connectWnd); +// pageChanged(NULL); + } + connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(pageChanged(int))); + log(L_DEBUG, "NewProtocol::NewProtocol()"); +} + +NewProtocol::~NewProtocol() +{ + if (m_connectWnd) + delete m_connectWnd; + if (m_setup) + delete m_setup; + + // Protocol::plugin() returns raw Plugin pointer, we need smart + SIM::ProfileManager::instance()->currentProfile()->enablePlugin(m_protocol->plugin()->name()); + log(L_DEBUG, "NewProtocol::~NewProtocol()"); +} + +void NewProtocol::protocolChanged(int n) +{ + if (m_setup){ + delete m_setup; + m_setup = NULL; + } + if ((n < 0) || (n >= (int)(m_protocols.size()))) + return; + ProtocolPtr protocol = m_protocols[n]; + m_protocol = protocol; + m_client = protocol->createClient(NULL); + if (m_client == NULL) + return; + m_setup = m_client->setupWnd(); + m_setup->setParent(m_setupPage); + m_setupLayout->addWidget(m_setup); + if (m_setup == NULL){ + m_client.clear(); + return; + } + connect(m_setup, SIGNAL(okEnabled(bool)), this, SLOT(okEnabled(bool))); + connect(this, SIGNAL(apply()), m_setup, SLOT(apply())); + m_setupPage->setTitle(i18n(protocol->description()->text)); + m_connectWnd->setTitle(i18n(protocol->description()->text)); + if(m_last) + { + m_last->setTitle(i18n(protocol->description()->text)); + } +// setNextEnabled(currentPage(), true); + setWindowIcon(Icon(protocol->description()->icon)); + EventRaiseWindow e(this); + e.process(); +} + +void NewProtocol::okEnabled(bool bEnable) +{ +// setNextEnabled(m_setup, bEnable); +} + +void NewProtocol::pageChanged(int id) +{ + if (currentPage() == m_connectWnd){ + emit apply(); + m_bConnect = true; + unsigned status = CorePlugin::instance()->getManualStatus(); + if (status == STATUS_OFFLINE) + status = STATUS_ONLINE; + m_client->setStatus(status, false); + m_connectWnd->setConnecting(true); +// setBackEnabled(m_connectWnd, false); +// setNextEnabled(currentPage(), false); +// setFinishEnabled(m_connectWnd, false); + } + if (m_last && (currentPage() == m_last)){ +// setFinishEnabled(m_connectWnd, false); +// cancelButton()->show(); +// backButton()->show(); +// finishButton()->hide(); +// showPage(protocolPage); + protocolChanged(0); + } +} + +void NewProtocol::reject() +{ + if (m_bConnect){ + m_client->setStatus(STATUS_OFFLINE, false); +// setBackEnabled(m_connectWnd, true); + m_bConnect = false; + back(); + return; + } + QWizard::reject(); +} + +void NewProtocol::loginComplete() +{ + if (m_client == NULL) + return; + m_bConnect = false; + m_bConnected = true; + m_client->setStatus(CorePlugin::instance()->getManualStatus(), true); + m_connectWnd->setConnecting(false); +// setNextEnabled(currentPage(), true); +// setFinishEnabled(m_connectWnd, true); + getContacts()->addClient(m_client.data()); + m_client.clear(); +// cancelButton()->hide(); +// backButton()->hide(); + EventSaveState e; + e.process(); + accept(); +} + +bool NewProtocol::processEvent(Event *e) +{ + if (m_client == NULL || !m_bConnect) + return false; + + switch (e->type()){ + case eEventClientChanged: + if (m_client->getState() == Client::Connected){ + QTimer::singleShot(0, this, SLOT(loginComplete())); + return false; + } + break; + case eEventClientNotification: { + EventClientNotification *ee = static_cast(e); + const EventNotification::ClientNotificationData &d = ee->data(); + if (d.client == m_client){ + m_connectWnd->setErr(i18n(d.text), + (d.code == AuthError) ? m_client->protocol()->description()->accel : QString()); + m_bConnect = false; + m_client->setStatus(STATUS_OFFLINE, false); +// setBackEnabled(m_connectWnd, true); +// setFinishEnabled(m_connectWnd, false); + return true; + } + break; + } + default: + break; + } + return false; +} +// vim: set expandtab: + + diff --git a/plugins/_core/newprotocol.h b/plugins/_core/newprotocol.h new file mode 100644 index 0000000..594bdc1 --- /dev/null +++ b/plugins/_core/newprotocol.h @@ -0,0 +1,73 @@ +/*************************************************************************** + newprotocol.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _NEWPROTOCOL_H +#define _NEWPROTOCOL_H + +#include +#include +#include "contacts.h" +#include "plugins.h" +#include "contacts/protocol.h" +#include "contacts/client.h" + +#include "ui_newprotocolbase.h" + +class ConnectWnd; +class CorePlugin; + +namespace SIM +{ + class Protocol; +} + +class NewProtocol + : public QWizard + , public Ui::NewProtocolBase + , public SIM::EventReceiver +{ + Q_OBJECT +public: + NewProtocol(QWidget *parent,int default_protocol=0, bool bConnect=false); + ~NewProtocol(); + SIM::ClientPtr m_client; + bool connected() { return m_bConnected; } +signals: + void apply(); +protected slots: + void protocolChanged(int); + void okEnabled(bool); + void pageChanged(int); + void loginComplete(); +private: + virtual bool processEvent(SIM::Event*); + virtual void reject(); + std::vector m_protocols; + ConnectWnd *m_connectWnd; + QWidget *m_setup; + QWizardPage *m_setupPage; + QHBoxLayout *m_setupLayout; + QWizardPage *m_last; + bool m_bConnect; + bool m_bConnected; + bool m_bStart; + QList m_protocolPlugins; + SIM::ProtocolPtr m_protocol; +}; + +#endif + diff --git a/plugins/_core/newprotocolbase.ui b/plugins/_core/newprotocolbase.ui new file mode 100644 index 0000000..f9655ab --- /dev/null +++ b/plugins/_core/newprotocolbase.ui @@ -0,0 +1,65 @@ + + + NewProtocolBase + + + + 0 + 0 + 290 + 284 + + + + New connection + + + QWizard::ClassicStyle + + + + Select protocol + + + + 11 + + + + + Protocol: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + qPixmapFromMimeSource + + + diff --git a/plugins/_core/nonim.cpp b/plugins/_core/nonim.cpp new file mode 100644 index 0000000..91f0963 --- /dev/null +++ b/plugins/_core/nonim.cpp @@ -0,0 +1,76 @@ +/*************************************************************************** + nonim.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "contacts.h" + +#include "nonim.h" +#include "contacts/contact.h" +#include "simgui/intedit.h" +#include + +using namespace SIM; + +NonIM::NonIM(QWidget *parent) : QWidget(parent) +{ + setupUi(this); + connect(this, SIGNAL(setAdd(bool)), topLevelWidget(), SLOT(setAdd(bool))); + edtMail->setValidator(new EMailValidator(edtMail)); + edtPhone->setValidator(new PhoneValidator(edtPhone)); +} + +void NonIM::showEvent(QShowEvent *e) +{ + QWidget::showEvent(e); + emit setAdd(true); +} + +void NonIM::add(Contact *&contact) +{ + contact = getContacts()->contact(0, true); + contact->setFirstName(edtFirst->text()); + contact->setLastName(edtLast->text()); + if (!edtMail->text().isEmpty()) + contact->setEMails(edtMail->text() + "/-"); + if (!edtPhone->text().isEmpty()) + contact->setPhones(edtPhone->text() + "/-"); + QString nick = edtNick->text(); + if (nick.isEmpty()){ + nick = edtFirst->text(); + if (!nick.isEmpty() && !edtLast->text().isEmpty()) + nick += ' '; + nick += edtLast->text(); + } + if (nick.isEmpty()) + nick = edtMail->text(); + if (nick.isEmpty()) + nick = edtPhone->text(); + contact->setName(nick); +} + +void NonIM::createContact(unsigned tmpFlags, Contact *&contact) +{ + add(contact); + contact->setFlags(contact->getFlags() | tmpFlags); +} + + +/* +#ifndef NO_MOC_INCLUDES +#include "nonim.moc" +#endif +*/ + diff --git a/plugins/_core/nonim.h b/plugins/_core/nonim.h new file mode 100644 index 0000000..ff982c9 --- /dev/null +++ b/plugins/_core/nonim.h @@ -0,0 +1,43 @@ +/*************************************************************************** + nonim.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _NONIM_H +#define _NONIM_H + +#include "ui_nonimbase.h" +#include "event.h" + +#include +#include + +class NonIM : public QWidget, public Ui::NonIM +{ + Q_OBJECT +public: + NonIM(QWidget *parent); +signals: + void setAdd(bool); + void showError(const QString&); +protected slots: + void add(SIM::Contact *&contact); + void createContact(unsigned tmpFlags, SIM::Contact *&contact); +protected: + void showEvent(QShowEvent*); +}; + +#endif + diff --git a/plugins/_core/nonimbase.ui b/plugins/_core/nonimbase.ui new file mode 100644 index 0000000..afb997c --- /dev/null +++ b/plugins/_core/nonimbase.ui @@ -0,0 +1,117 @@ + + + NonIM + + + + 0 + 0 + 232 + 309 + + + + Form2 + + + + 6 + + + 0 + + + + + Non-IM Contact + + + + + + First Name: + + + false + + + + + + + + + + Last Name: + + + false + + + + + + + + + + Nickname: + + + false + + + + + + + + + + E-Mail address: + + + false + + + + + + + + + + Phone: + + + false + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + diff --git a/plugins/_core/pagerbase.ui b/plugins/_core/pagerbase.ui new file mode 100644 index 0000000..3895eec --- /dev/null +++ b/plugins/_core/pagerbase.ui @@ -0,0 +1,106 @@ + + + PagerDetails + + + + 0 + 0 + 222 + 110 + + + + Form2 + + + + 6 + + + 11 + + + + + 0 + + + 6 + + + + + + + + + + + Provider: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Email gateway: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Number: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + edtNumber + cmbProvider + edtGateway + + + + diff --git a/plugins/_core/pagerdetails.cpp b/plugins/_core/pagerdetails.cpp new file mode 100644 index 0000000..d6f79be --- /dev/null +++ b/plugins/_core/pagerdetails.cpp @@ -0,0 +1,89 @@ +/*************************************************************************** + pagerdetails.cpp - description + ------------------- + begin : Sun Mar 24 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "country.h" +#include "misc.h" + +#include "pagerdetails.h" + +#include +#include +#include + +using namespace SIM; + +PagerDetails::PagerDetails(QWidget *p, const QString &oldNumber) + : QWidget(p) +{ + setupUi(this); + cmbProvider->setEditable(true); + for (const pager_provider *provider = getProviders(); *provider->szName; provider++) + cmbProvider->addItem(provider->szName); + cmbProvider->lineEdit()->clear(); + connect(cmbProvider, SIGNAL(textChanged(const QString&)), this, SLOT(providerChanged(const QString&))); + connect(edtNumber, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + connect(edtGateway, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + QString pagerNumber = oldNumber; + QString number = getToken(pagerNumber, '@').trimmed(); + QString gateway = getToken(pagerNumber, '[').trimmed(); + QString providerName = getToken(pagerNumber, ']').trimmed(); + cmbProvider->lineEdit()->setText(providerName); + edtNumber->setText(number); + edtGateway->setText(gateway); + providerChanged(cmbProvider->lineEdit()->text()); +} + +void PagerDetails::getNumber() +{ + bool bOK = true; + QString res; + if (!edtNumber->text().isEmpty()){ + res = edtNumber->text(); + }else{ + bOK = false; + } + if (!edtGateway->text().isEmpty()){ + res += '@'; + res += edtGateway->text(); + }else{ + bOK = false; + } + if (!cmbProvider->lineEdit()->text().isEmpty()){ + res += " ["; + res += cmbProvider->lineEdit()->text(); + res += ']'; + } + emit numberChanged(res, bOK); +} + +void PagerDetails::providerChanged(const QString &str) +{ + for (const pager_provider *p = getProviders(); *p->szName; p++){ + if (str == p->szName){ + edtGateway->setText(p->szGate); + edtGateway->setEnabled(false); + getNumber(); + return; + } + } + edtGateway->setEnabled(true); +} + +void PagerDetails::textChanged(const QString&) +{ + getNumber(); +} diff --git a/plugins/_core/pagerdetails.h b/plugins/_core/pagerdetails.h new file mode 100644 index 0000000..cbdc110 --- /dev/null +++ b/plugins/_core/pagerdetails.h @@ -0,0 +1,38 @@ +/*************************************************************************** + pageretails.h - description + ------------------- + begin : Sun Mar 24 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _PAGERDETAILS_H +#define _PAGERDETAILS_H + +#include "ui_pagerbase.h" +#include "event.h" + +class PagerDetails : public QWidget, public Ui::PagerDetails +{ + Q_OBJECT +public: + PagerDetails(QWidget *p, const QString &number); + void getNumber(); +signals: + void numberChanged(const QString&, bool); +protected slots: + void providerChanged(const QString&); + void textChanged(const QString&); +}; + +#endif + diff --git a/plugins/_core/phonebase.ui b/plugins/_core/phonebase.ui new file mode 100644 index 0000000..283a45c --- /dev/null +++ b/plugins/_core/phonebase.ui @@ -0,0 +1,201 @@ + + + + + PhoneDetailsBase + + + + 0 + 0 + 403 + 130 + + + + + 1 + 1 + + + + Form1 + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + Area code: + + + Qt::AlignCenter + + + false + + + + + + + + + + Extension: + + + Qt::AlignCenter + + + false + + + + + + + + 1 + 0 + + + + + + + + + 1 + 0 + + + + + + + + + + + - + + + false + + + + + + + Number: + + + Qt::AlignCenter + + + false + + + + + + + - + + + false + + + + + + + Country: + + + Qt::AlignCenter + + + false + + + + + + + - + + + Qt::AlignVCenter|Qt::AlignLeft + + + false + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + cmbCountry + edtAreaCode + edtNumber + edtExtension + + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/_core/phonedetails.cpp b/plugins/_core/phonedetails.cpp new file mode 100644 index 0000000..694b92c --- /dev/null +++ b/plugins/_core/phonedetails.cpp @@ -0,0 +1,134 @@ +/*************************************************************************** + phonedetails.cpp - description + ------------------- + begin : Sun Mar 24 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" + +#include "phonedetails.h" + +#include +#include +#include +#include +#include + +using namespace SIM; + +PhoneDetails::PhoneDetails(QWidget *p, const QString &oldNumber) + : QWidget(p) +{ + setupUi(this); + QString number = oldNumber; + QString areaCode; + QString extension; + unsigned short countryCode = 0; + if (number.indexOf('(') >= 0){ + QString country = getToken(number, '(').trimmed(); + int i = 0; + while(!country[i].isNumber()) + i++; + countryCode = country.mid(i).toUShort(); + areaCode = getToken(number, ')').trimmed(); + } + if (number.indexOf(" - ") >= 0){ + int pos = number.indexOf(" - "); + extension = number.mid(pos + 3).trimmed(); + number = number.mid(0, pos); + } + number = number.trimmed(); + initCombo(cmbCountry, countryCode, getCountries()); + + QFontMetrics fm(font()); + unsigned wChar = fm.width("0"); + QSize s(wChar*10, 0); + edtNumber->setMinimumSize(s); + s = edtAreaCode->size(); + s.setWidth(wChar*5); + QSize sLabel = lblAreaCode->sizeHint(); + sLabel.setHeight(0); + s = s.expandedTo(sLabel); + edtAreaCode->setMaximumSize(s); + s.setWidth(wChar*5); + sLabel = lblExtension->sizeHint(); + sLabel.setHeight(0); + s = s.expandedTo(sLabel); + edtExtension->setMaximumSize(s); + connect(cmbCountry, SIGNAL(activated(int)), this, SLOT(countryChanged(int))); + connect(edtAreaCode, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + connect(edtNumber, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + connect(edtExtension, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + edtAreaCode->setValidator(new QIntValidator(edtAreaCode)); + edtNumber->setValidator(new QIntValidator(edtNumber)); + edtExtension->setValidator(new QIntValidator(edtExtension)); + edtAreaCode->setText(areaCode); + edtNumber->setText(number); + edtExtension->setText(extension); + m_bExt = false; +} + +void PhoneDetails::setExtensionShow(bool bShow) +{ + if (bShow){ + lblExtension->show(); + edtExtension->show(); + lblDivExtension->show(); + }else{ + lblExtension->hide(); + edtExtension->hide(); + lblDivExtension->hide(); + } + m_bExt = bShow; +} + +void PhoneDetails::getNumber() +{ + QString res; + bool bOK = true; + if (cmbCountry->currentIndex() > 0){ + res = '+'; + res += QString::number(getComboValue(cmbCountry, getCountries())); + res += ' '; + }else{ + bOK = false; + } + if (edtAreaCode->text().length() > 0){ + res += '('; + res += edtAreaCode->text(); + res += ") "; + }else{ + bOK = false; + } + if (edtNumber->text().length() > 0){ + res += edtNumber->text(); + }else{ + bOK = false; + } + if (m_bExt && (edtExtension->text().length() > 0)){ + res += " - "; + res += edtExtension->text(); + } + emit numberChanged(res, bOK); +} + +void PhoneDetails::countryChanged(int) +{ + getNumber(); +} + +void PhoneDetails::textChanged(const QString&) +{ + getNumber(); +} diff --git a/plugins/_core/phonedetails.h b/plugins/_core/phonedetails.h new file mode 100644 index 0000000..9201000 --- /dev/null +++ b/plugins/_core/phonedetails.h @@ -0,0 +1,41 @@ +/*************************************************************************** + phonedetails.h - description + ------------------- + begin : Sun Mar 24 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _PHONEDETAILS_H +#define _PHONEDETAILS_H + +#include "ui_phonebase.h" +#include "event.h" + +class PhoneDetails : public QWidget, public Ui::PhoneDetailsBase +{ + Q_OBJECT +public: + PhoneDetails(QWidget *p, const QString &oldNumber); + void setExtensionShow(bool bShow); + void getNumber(); +signals: + void numberChanged(const QString &str, bool bOK); +protected slots: + void countryChanged(int); + void textChanged(const QString&); +protected: + bool m_bExt; +}; + +#endif + diff --git a/plugins/_core/pict/CMakeLists.txt b/plugins/_core/pict/CMakeLists.txt new file mode 100644 index 0000000..d97b4e9 --- /dev/null +++ b/plugins/_core/pict/CMakeLists.txt @@ -0,0 +1,7 @@ +# install only + +FILE(GLOB mng *.mng) +FILE(GLOB png *.png) + +INSTALL(FILES ${mng} DESTINATION ${SIM_PICT_DIR}) +INSTALL(FILES ${png} DESTINATION ${SIM_PICT_DIR}) diff --git a/plugins/_core/pict/connect.gif b/plugins/_core/pict/connect.gif new file mode 100644 index 0000000000000000000000000000000000000000..61cd01ed0015bbf90aabfa48bb62d66b816926be GIT binary patch literal 14947 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/pict/connect.mng b/plugins/_core/pict/connect.mng new file mode 100644 index 0000000000000000000000000000000000000000..04a7d3a31df15c9a65cdc4ccadfafd778c4c62ba GIT binary patch literal 14659 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

    eA}w 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/plugincfg.cpp b/plugins/_core/plugincfg.cpp new file mode 100644 index 0000000..deb1137 --- /dev/null +++ b/plugins/_core/plugincfg.cpp @@ -0,0 +1,76 @@ +/*************************************************************************** + plugincfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" +#include "profilemanager.h" +#include "log.h" + +#include "plugincfg.h" +#include + +using namespace SIM; + +PluginCfg::PluginCfg(QWidget *parent, const QString& pluginname) : QWidget(parent) +{ + setupUi(this); + m_pluginName = pluginname; + if(ProfileManager::instance()->currentProfile()->enabledPlugins().contains(m_pluginName) || + getPluginManager()->isPluginAlwaysEnabled(m_pluginName)) + { + PluginPtr plugin = getPluginManager()->plugin(pluginname); + QWidget *w = plugin->createConfigWindow(addWnd); + if (w){ + QVBoxLayout *lay = new QVBoxLayout(addWnd); + lay->addWidget(w); + QObject::connect(parent->topLevelWidget(), SIGNAL(applyChanges()), w, SLOT(apply())); + // adjust plugin widget + w->setMinimumSize(w->sizeHint()); + w->adjustSize(); + // adjust addWnd widget + addWnd->setMinimumSize(addWnd->sizeHint()); + addWnd->adjustSize(); + } + } + // adjust description + if(!getPluginManager()->pluginDescription(pluginname).isNull()) + { + lblDescription->setText(i18n(getPluginManager()->pluginDescription(pluginname))); + } + else + { + lblDescription->setText(""); + } + // adjust tab + tabWnd->setCurrentIndex(0); + tabWnd->setTabText(0, i18n(getPluginManager()->pluginTitle(pluginname))); + tabWnd->setMinimumSize(tabWnd->sizeHint()); + tabWnd->adjustSize(); + // adjust complete widget + setMinimumSize(sizeHint()); + adjustSize(); + if (getPluginManager()->isPluginAlwaysEnabled(pluginname)) { + chkEnable->hide(); + } else { + chkEnable->setEnabled(true); + chkEnable->setChecked(ProfileManager::instance()->currentProfile()->enabledPlugins().contains(pluginname)); + } +} + +void PluginCfg::apply() +{ +} + diff --git a/plugins/_core/plugincfg.h b/plugins/_core/plugincfg.h new file mode 100644 index 0000000..87fc945 --- /dev/null +++ b/plugins/_core/plugincfg.h @@ -0,0 +1,37 @@ +/*************************************************************************** + plugincfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _PLUGINCFG_H +#define _PLUGINCFG_H + +#include "plugins.h" +#include "ui_plugincfgbase.h" + +class PluginCfg : public QWidget, public Ui::PluginCfgBase +{ + Q_OBJECT +public: + PluginCfg(QWidget *parent, const QString& pluginname); +public slots: + void apply(); +protected: + SIM::PluginInfo *m_info; + QString m_pluginName; +}; + +#endif + diff --git a/plugins/_core/plugincfgbase.ui b/plugins/_core/plugincfgbase.ui new file mode 100644 index 0000000..bd322ea --- /dev/null +++ b/plugins/_core/plugincfgbase.ui @@ -0,0 +1,74 @@ + + + PluginCfgBase + + + + 0 + 0 + 575 + 585 + + + + Form1 + + + + 6 + + + 11 + + + + + + + + + + + + Plugin &enabled + + + + + + + + 0 + 0 + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + + 0 + 0 + + + + + + + + + + + + + diff --git a/plugins/_core/prefcfg.cpp b/plugins/_core/prefcfg.cpp new file mode 100644 index 0000000..6fc60da --- /dev/null +++ b/plugins/_core/prefcfg.cpp @@ -0,0 +1,138 @@ +/*************************************************************************** + prefcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" + +#include "log.h" +#include "prefcfg.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +#include + +using namespace SIM; + +PrefConfig::PrefConfig(QWidget *parent, CommandDef *cmd, Contact *contact, Group *group) + : QWidget(parent) + , m_cmd(cmd) + , m_contact(contact) + , m_group(group) +{ + setupUi(this); + SIM::PropertyHubPtr data; + SIM::PropertyHubPtr mapdata; + if (m_contact) + { + data = m_contact->getUserData(m_cmd->accel); // HACK ! + if (m_contact->getUserData()->getUserData(m_cmd->accel)) + chkOverride->setChecked(true); + mapdata = m_contact->getUserData()->root(); + } + else if (m_group) { + mapdata = m_group->getUserData()->root(); + } + QWidget *w = NULL; + if(cmd->flags & COMMAND_CONTACT) + { + w = ((getPreferencesWindowContact)(cmd->param))(addWnd, mapdata); + chkOverride->setChecked(w->property("override").toBool()); + } + else if(!data.isNull()) + { + w = ((getPreferencesWindowContact)(cmd->param))(addWnd, data); + } + if(w) { + QVBoxLayout *lay = new QVBoxLayout(addWnd); + lay->addWidget(w); + + if(cmd->flags & COMMAND_CONTACT) + { + connect(this, SIGNAL(apply(SIM::PropertyHubPtr, bool)), w, SLOT(apply(SIM::PropertyHubPtr, bool))); + } + else + { + connect(this, SIGNAL(apply(SIM::PropertyHubPtr)), w, SLOT(apply(SIM::PropertyHubPtr))); + } + if(addWnd) + addWnd->setMinimumSize(w->minimumSizeHint()); + setMinimumSize(sizeHint()); + } + tabWnd->setCurrentIndex(0); + tabWnd->setTabText(tabWnd->currentIndex(), i18n(m_cmd->text)); + tabWnd->adjustSize(); + connect(chkOverride, SIGNAL(toggled(bool)), this, SLOT(overrideToggled(bool))); + overrideToggled(chkOverride->isChecked()); +} + +void PrefConfig::apply() +{ + if(m_cmd->flags & COMMAND_CONTACT) + { + SIM::PropertyHubPtr data; + if (m_contact) + { + log(L_DEBUG, "Contact"); + data = m_contact->getUserData()->root(); + } + else if (m_group) + { + log(L_DEBUG, "Group"); + data = m_group->getUserData()->root(); + } + log(L_DEBUG, "NULL Contact"); + if (data) + emit apply(data, chkOverride->isChecked()); + } + else + { + if (chkOverride->isChecked()) + { + SIM::PropertyHubPtr data; + if (m_contact) + { + data = m_contact->getUserData()->getUserData(m_cmd->accel); + if(data.isNull()) + data = m_contact->getUserData()->createUserData(m_cmd->accel); + } + else if (m_group) + { + data = m_group->getUserData()->getUserData(m_cmd->accel); + if(data.isNull()) + data = m_group->getUserData()->createUserData(m_cmd->accel); + } + if (data) + emit apply(data); + } + else + { + if (m_contact) + { + m_contact->getUserData()->destroyUserData(m_cmd->accel); + } + else if(m_group) + { + m_group->getUserData()->destroyUserData(m_cmd->accel); + } + } + } +} + +void PrefConfig::overrideToggled(bool bState) +{ + for(int i = 0; i < tabWnd->count(); ++i) + tabWnd->widget(i)->setEnabled(bState); +} diff --git a/plugins/_core/prefcfg.h b/plugins/_core/prefcfg.h new file mode 100644 index 0000000..8521c22 --- /dev/null +++ b/plugins/_core/prefcfg.h @@ -0,0 +1,48 @@ +/*************************************************************************** + prefcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _PREFCFG_H +#define _PREFCFG_H + +#include "cmddef.h" +#include "contacts.h" +#include "ui_prefcfgbase.h" + +class PrefConfig : public QWidget, public Ui::PrefConfigBase +{ + Q_OBJECT +public: + PrefConfig(QWidget *parent, SIM::CommandDef *cmd, SIM::Contact *contact, SIM::Group *group); + +signals: + void apply(SIM::PropertyHubPtr); + void apply(SIM::PropertyHubPtr, bool); + +public slots: + void apply(); + +protected slots: + void overrideToggled(bool); + +protected: + SIM::CommandDef *m_cmd; + SIM::Contact *m_contact; + SIM::Group *m_group; +}; + +#endif + diff --git a/plugins/_core/prefcfgbase.ui b/plugins/_core/prefcfgbase.ui new file mode 100644 index 0000000..c465c25 --- /dev/null +++ b/plugins/_core/prefcfgbase.ui @@ -0,0 +1,54 @@ + + + PrefConfigBase + + + + 0 + 0 + 354 + 266 + + + + Form1 + + + + 6 + + + 11 + + + + + &Override global settings + + + + + + + + + + + + 6 + + + 11 + + + + + + + + + + + + + diff --git a/plugins/_core/search.cpp b/plugins/_core/search.cpp new file mode 100644 index 0000000..3ba4200 --- /dev/null +++ b/plugins/_core/search.cpp @@ -0,0 +1,854 @@ +/*************************************************************************** + search.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "search.h" +#include "usercfg.h" +#include "core.h" + +#include "nonim.h" +#include "searchall.h" + +#include "simgui/ballonmsg.h" +#include "simgui/toolbtn.h" +#include "simgui/listview.h" + +#include "contacts/contact.h" +#include "contacts/client.h" +#include "contacts/group.h" +//#include "searchbase.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +const unsigned COL_KEY = 0x100; +const unsigned COL_SEARCH_WND = 0x101; + +SearchWidget::SearchWidget(QWidget* parent) : QWidget(parent) +{ + setupUi(this); +} + +SearchDialog::SearchDialog() +{ + SET_WNDPROC("search") + setWindowIcon(Icon("find")); + setButtonsPict(this); + setWindowTitle(i18n("Search")); + m_current = NULL; + m_currentResult = NULL; + m_bAdd = true; + m_id = 0; + m_result_id = 0; + m_active = NULL; + m_search = new SearchWidget(this); + m_update = new QTimer(this); + connect(m_update, SIGNAL(timeout()), this, SLOT(update())); + setCentralWidget(m_search); + m_status = statusBar(); + m_result = NULL; + setAdd(false); + m_search->btnOptions->setIcon(Icon("1downarrow")); + m_search->btnAdd->setIcon(Icon("add")); + m_search->btnNew->setIcon(Icon("new")); + connect(m_search->wndCondition, SIGNAL(aboutToShow(QWidget*)), this, SLOT(aboutToShow(QWidget*))); + connect(m_search->wndResult, SIGNAL(aboutToShow(QWidget*)), this, SLOT(resultShow(QWidget*))); + fillClients(); + connect(m_search->cmbClients, SIGNAL(activated(int)), this, SLOT(clientActivated(int))); + m_result = new ListView(m_search->wndResult); + m_result->addColumn(i18n("Results")); + //m_result->setShowSortIndicator(true); + m_result->setExpandingColumn(0); + m_result->setFrameShadow(QFrame::Sunken); + m_result->setLineWidth(1); + addResult(m_result); + showResult(NULL); + aboutToShow(m_search->wndCondition->currentWidget()); + connect(m_search->btnSearch, SIGNAL(clicked()), this, SLOT(searchClick())); + m_search->cmbClients->setFocus(); + connect(m_search->btnOptions, SIGNAL(clicked()), this, SLOT(optionsClick())); + connect(m_search->btnAdd, SIGNAL(clicked()), this, SLOT(addClick())); + m_search->btnOptions->setEnabled(false); + m_search->btnAdd->setEnabled(false); + connect(m_result, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); + connect(m_result, SIGNAL(dragStart()), this, SLOT(dragStart())); + connect(m_search->btnNew, SIGNAL(clicked()), this, SLOT(newSearch())); + m_result->setMenu(MenuSearchItem); + resultShow(m_result); +} + +SearchDialog::~SearchDialog() +{ + // Fixme Todin + //::saveGeometry(this, CorePlugin::instance()->data.SearchGeometry); +} + +void SearchDialog::resizeEvent(QResizeEvent *e) +{ + QMainWindow::resizeEvent(e); + m_result->adjustColumn(); + /* Fixme Todin + if (isVisible()) + ::saveGeometry(this, CorePlugin::instance()->data.SearchGeometry); + */ +} + +void SearchDialog::moveEvent(QMoveEvent *e) +{ + QMainWindow::moveEvent(e); + /* Fixme Todin + if (isVisible()) + ::saveGeometry(this, CorePlugin::instance()->data.SearchGeometry); + */ +} + +void SearchDialog::closeEvent(QCloseEvent *e) +{ + QMainWindow::closeEvent(e); + emit finished(); +} + +void SearchDialog::setAdd(bool bAdd) +{ + if (m_bAdd == bAdd) + return; + m_bAdd = bAdd; + setAddButton(); + setTitle(); +} + +void SearchDialog::setAddButton() +{ + QString text; + QIcon icon; + if (m_active){ + icon = Icon("cancel"); + text = i18n("&Cancel"); + }else if (m_bAdd){ + icon = Icon("add"); + text = i18n("&Add"); + }else{ + icon = Icon("find"); + text = i18n("&Search"); + } + m_search->btnSearch->setText(text); //Fixme: btnSearch broken + m_search->btnSearch->setIcon(icon); +} + +void SearchDialog::fillClients() +{ + vector widgets = m_widgets; + m_widgets.clear(); + m_search->cmbClients->clear(); + unsigned nClients = 0; + int current = -1; + int defCurrent = -1; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + QWidget *search = client->searchWindow(m_search->wndCondition); + if (search == NULL) + continue; + unsigned n; + for (n = 0; n < widgets.size(); n++){ + if ((widgets[n].client != client) || !widgets[n].name.isEmpty()) + continue; + delete search; + search = widgets[n].widget; + widgets[n].widget = NULL; + break; + } + if (n >= widgets.size()) + m_id = m_search->wndCondition->addWidget(search); + m_search->cmbClients->addItem(Icon(client->protocol()->description()->icon), + CorePlugin::instance()->clientName(client)); + ClientWidget cw; + cw.client = client; + cw.widget = search; + m_widgets.push_back(cw); + if (search == m_current) + current = m_widgets.size() - 1; + if (client->protocol()->description()->flags & PROTOCOL_SEARCH) + nClients++; + if (client->name() == CorePlugin::instance()->value("SearchClient").toString()) + defCurrent = m_widgets.size() - 1; + } + + + if (nClients > 1){ + unsigned n; + QWidget *search = NULL; + for (n = 0; n < widgets.size(); n++){ + if (widgets[n].client == (Client*)(-1)){ + search = widgets[n].widget; + widgets[n].widget = NULL; + break; + } + } + if (search == NULL){ + search = new SearchAll(NULL); + m_id = m_search->wndCondition->addWidget(search); + } + m_search->cmbClients->addItem(Icon("find"), i18n("All networks")); + ClientWidget cw; + cw.client = (Client*)(-1); + cw.widget = search; + m_widgets.push_back(cw); + if ((search == m_current) || ((m_current == NULL) && (current < 0) && (defCurrent < 0))) + current = m_widgets.size() - 1; + } + unsigned n; + QWidget *search = NULL; + for (n = 0; n < widgets.size(); n++){ + if (widgets[n].client == NULL){ + search = widgets[n].widget; + widgets[n].widget = NULL; + break; + } + } + if (search == NULL){ + search = new NonIM(NULL); + m_id = m_search->wndCondition->addWidget(search); + } + m_search->cmbClients->addItem(Icon("nonim"), i18n("Non-IM contact")); + ClientWidget cw; + cw.client = NULL; + cw.widget = search; + m_widgets.push_back(cw); + if (search == m_current) + current = m_widgets.size() - 1; + + if (m_update->isActive()){ + m_update->stop(); + }else if (m_result){ + m_result->viewport()->setUpdatesEnabled(false); + } + for (n = 0; n < widgets.size(); n++){ + if (widgets[n].name.isEmpty()) + continue; + unsigned i; + for (i = 0; i < m_widgets.size(); i++) + if (widgets[n].client == m_widgets[i].client) + break; + if (i >= m_widgets.size()) + continue; + m_search->cmbClients->addItem(Icon(widgets[n].client->protocol()->description()->icon), + widgets[n].name); + m_widgets.push_back(widgets[n]); + widgets[n].widget = NULL; + } + for (n = 0; n < widgets.size(); n++){ + if (widgets[n].widget){ + if (widgets[n].widget == m_active) + searchDone(m_active); + if (widgets[n].widget == m_current) + m_current = NULL; + for (int i = 0; i < m_result->topLevelItemCount(); i++){ + ListViewItem *item = static_cast(m_result->topLevelItem(i)); + if ((QWidget*)(item->text(COL_SEARCH_WND).toULong()) == widgets[n].widget) + delete item; + } + delete widgets[n].widget; + } + } + + if (current == -1) + current = defCurrent; + if (current == -1) + current = 0; + m_search->cmbClients->setCurrentIndex(current); + clientActivated(current); + setStatus(); + m_update->start(500); +} + +void SearchDialog::clientActivated(int n) +{ + if ((unsigned)n >= m_widgets.size()) + return; + searchDone(m_active); + if (m_widgets[n].widget != m_current) + showResult(NULL); + m_search->wndCondition->setCurrentWidget(m_widgets[n].widget); + setTitle(); +} + +void SearchDialog::setTitle() +{ + unsigned n = m_search->cmbClients->currentIndex(); + if (n >= m_widgets.size()) + return; + Client *client = m_widgets[n].client; + QString name; + if ((client != NULL) && (client != (Client*)(-1))) + name = client->name(); + CorePlugin::instance()->setValue("SearchClient", name); + if (m_bAdd){ + setWindowTitle(i18n("Add") + ": " + m_search->cmbClients->currentText()); + setWindowIcon(Icon("add")); + }else{ + setWindowTitle(i18n("Search") + ": " + m_search->cmbClients->currentText()); + setWindowIcon(Icon("find")); + } +} + +void SearchDialog::toggled(bool) +{ + textChanged(); +} + +bool SearchDialog::processEvent(Event *e) +{ + switch (e->type()){ + case eEventClientsChanged: + case eEventClientChanged: + fillClients(); + break; + case eEventCommandExec:{ + if (m_result != m_currentResult) + return false; + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->menu_id == MenuSearchGroups){ + Group *grp = getContacts()->group(cmd->id - CmdContactGroup); + if (grp){ + Contact *contact = NULL; + if ((QWidget*)(cmd->param) == m_search->btnSearch){ + if (m_current){ + connect(this, SIGNAL(createContact(unsigned,SIM::Contact*&)), m_current, SLOT(createContact(unsigned,SIM::Contact*&))); + emit createContact(CONTACT_TEMP, contact); + disconnect(this, SIGNAL(createContact(unsigned,SIM::Contact*&)), m_current, SLOT(createContact(unsigned,SIM::Contact*&))); + } + }else{ + contact = createContact(CONTACT_TEMP); + } + if (contact){ + if ((contact->getFlags() & CONTACT_TEMP) == 0){ + QString err = i18n("%1 already in contact list") .arg(contact->getName()); + if ((QWidget*)(cmd->param) == m_search->btnAdd){ + BalloonMsg::message(err, m_search->btnAdd); + }else if ((QWidget*)(cmd->param) == m_search->btnSearch){ + BalloonMsg::message(err, m_search->btnSearch); + }else{ + BalloonMsg::message(err, m_result); + } + return true; + } + contact->setFlags(contact->getFlags() & ~CONTACT_TEMP); + contact->setGroup(grp->id()); + EventContact(contact, EventContact::eChanged).process(); + } + } + return true; + } + if (cmd->id == CmdSearchInfo){ + Contact *contact = createContact(CONTACT_TEMP); + if (contact == NULL) + return true; + Command cmd; + cmd->id = CmdInfo; + cmd->menu_id = MenuContact; + cmd->param = (void*)(contact->id()); + CorePlugin::instance()->showInfo(cmd); + return true; + } + if (cmd->id == CmdSearchMsg){ + Contact *contact = createContact(CONTACT_TEMP); + if (contact == NULL) + return true; + Message *m = new Message(MessageGeneric); + m->setContact(contact->id()); + EventOpenMessage(m).process(); + delete m; + } + break; + } + case eEventCheckCommandState:{ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if ((cmd->id == CmdSearchOptions) && (cmd->menu_id == MenuSearchItem)){ + EventMenuGetDef eMenu(MenuSearchOptions); + eMenu.process(); + CommandsDef *def = eMenu.defs(); + if (def){ + CommandsList list(*def, true); + CommandDef *s; + unsigned nItems = 0; + while ((s = ++list) != NULL) + nItems++; + if (nItems){ + CommandDef *cmds = new CommandDef[nItems * 2 + 1]; + list.reset(); + nItems = 0; + unsigned prev = 0; + while ((s = ++list) != NULL){ + if (s->flags & COMMAND_CHECK_STATE){ + CommandDef cCheck = *s; + if (!EventCheckCommandState(&cCheck).process()) + continue; + } + if (prev && ((prev & 0xFF00) != (s->menu_grp & 0xFF00))) + cmds[nItems++].text = "_"; + prev = s->menu_grp; + cmds[nItems++] = *s; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + } + return false; + } + if ((cmd->id == CmdContactGroup) && (cmd->menu_id == MenuSearchGroups)){ + Group *grp; + ContactList::GroupIterator it; + unsigned nGrp = 0; + while ((grp = ++it) != NULL) + nGrp++; + it.reset(); + CommandDef *cmds = new CommandDef[nGrp + 1]; + nGrp = 0; + while ((grp = ++it) != NULL){ + if (grp->id() == 0) + continue; + cmds[nGrp].id = CmdContactGroup + grp->id(); + cmds[nGrp].menu_id = MenuSearchGroups; + cmds[nGrp].text = "_"; + cmds[nGrp].text_wrk = grp->getName(); + nGrp++; + } + cmds[nGrp].id = CmdContactGroup; + cmds[nGrp].menu_id = MenuSearchGroups; + cmds[nGrp].text = I18N_NOOP("Not in list"); + + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + break; + } + default: + break; + } + return false; +} + +void SearchDialog::textChanged(const QString&) +{ + if (m_active != NULL){ + m_search->btnSearch->setEnabled(true); + return; + } + bool bEnable = false; + checkSearch(m_current, bEnable) && checkSearch(m_currentResult, bEnable); + m_search->btnSearch->setEnabled(bEnable); +} + +bool SearchDialog::checkSearch(QWidget *w, bool &bEnable) +{ + if (w == NULL) + return true; + + const QList l = qFindChildren(w); + foreach(QWidget *obj,l){ + if ((obj->parent() == NULL) || + qobject_cast(obj->parent()) || + qobject_cast(obj->parent())) + continue; + + const QLineEdit *edit = qobject_cast(obj); + if (edit){ + if (edit->isEnabled()){ + if (!edit->text().isEmpty()){ + const QValidator *v = edit->validator(); + if (v){ + QString text = edit->text(); + int pos = 0; + if (v->validate(text, pos) == QValidator::Acceptable){ + bEnable = true; + }else{ + bEnable = false; + return false; + } + }else{ + bEnable = true; + } + } + } + continue; + } + const QComboBox *cmb = qobject_cast(obj); + if (cmb){ + if (cmb->isEnabled() && !cmb->currentText().isEmpty()) + bEnable = true; + continue; + } + } + return true; +} + +void SearchDialog::detach(QWidget *w) +{ + const QList l = qFindChildren(w); + foreach(QWidget *obj,l){ + if (qobject_cast(obj)) + disconnect(obj, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + if (qobject_cast(obj)) + disconnect(obj, SIGNAL(activated(const QString&)), this, SLOT(textChanged(const QString&))); + if (qobject_cast(obj)) + disconnect(obj, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); + } +} + +void SearchDialog::attach(QWidget *w) +{ + if (w == NULL) + return; + const QList l = qFindChildren(w); + foreach(QWidget *obj,l){ + if (qobject_cast(obj)) + connect(obj, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + if (qobject_cast(obj)) + connect(obj, SIGNAL(activated(const QString&)), this, SLOT(textChanged(const QString&))); + if (qobject_cast(obj)) + connect(obj, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); + } +} + +void SearchDialog::aboutToShow(QWidget *w) +{ + if (m_current) + detach(m_current); + m_current = w; + attach(m_current); + textChanged(); +} + +void SearchDialog::resultShow(QWidget *w) +{ + if (m_currentResult){ + if (m_currentResult != m_result) + disconnect(m_currentResult, SIGNAL(enableOptions(bool)), this, SLOT(enableOptions(bool))); + disconnect(m_currentResult, SIGNAL(destroyed()), this, SLOT(resultDestroyed())); + detach(m_currentResult); + } + m_currentResult = w; + attach(m_currentResult); + connect(m_currentResult, SIGNAL(destroyed()), this, SLOT(resultDestroyed())); + if (m_currentResult != m_result) + connect(m_currentResult, SIGNAL(enableOptions(bool)), this, SLOT(enableOptions(bool))); + textChanged(); +} + +void SearchDialog::resultDestroyed() +{ + m_currentResult = NULL; +} + +void SearchDialog::addResult(QWidget *w) +{ + m_result_id = m_search->wndResult->addWidget(w); +} + +void SearchDialog::showResult(QWidget *w) +{ + if (w == NULL) + w = m_result; + m_search->wndResult->setCurrentWidget(w); + selectionChanged(); +} + +const unsigned NO_GROUP = 0x10000; + +void SearchDialog::searchClick() +{ + if (m_bAdd){ + if (CorePlugin::instance()->value("GroupMode").toUInt()) + { + EventMenuProcess eMenu(MenuSearchGroups, m_search->btnSearch); + eMenu.process(); + QMenu *popup = eMenu.menu(); + if (popup) + popup->popup(CToolButton::popupPos(m_search->btnSearch, popup)); + } + else + { + Command cmd; + cmd->id = CmdContactGroup; + cmd->menu_id = MenuSearchGroups; + cmd->param = m_search->btnSearch; + EventCommandExec(cmd).process(); + } + return; + } + if (m_active){ + emit searchStop(); + searchDone(m_active); + return; + } + m_active = m_current; + m_result->clear(); + m_search->btnAdd->setEnabled(false); + m_search->btnOptions->setEnabled(false); + setAddButton(); + setStatus(); + m_bColumns = false; + connect(this, SIGNAL(search()), m_active, SLOT(search())); + connect(this, SIGNAL(searchStop()), m_active, SLOT(searchStop())); + connect(m_active, SIGNAL(setColumns(const QStringList&, int, QWidget*)), this, SLOT(setColumns(const QStringList&, int, QWidget*))); + connect(m_active, SIGNAL(addItem(const QStringList&,QWidget*)), this, SLOT(addItem(const QStringList&,QWidget*))); + connect(m_active, SIGNAL(searchDone(QWidget*)), this, SLOT(searchDone(QWidget*))); + emit search(); + m_result->setFocus(); +} + +void SearchDialog::setStatus() +{ + if (m_result == NULL) + return; + QString message = i18n("Search"); + if (m_result->firstChild()){ + message += ": "; + message += i18n("%n contact found", "%n contacts found", m_result->columnCount()); + } + m_status->showMessage(message); +} + +void SearchDialog::searchDone(QWidget*) +{ + if (m_active == NULL) + return; + m_status->clearMessage(); + disconnect(this, SIGNAL(search()), m_active, SLOT(search())); + disconnect(this, SIGNAL(searchStop()), m_active, SLOT(searchStop())); + disconnect(m_active, SIGNAL(setColumns(const QStringList&, int, QWidget*)), this, SLOT(setColumns(const QStringList&, int, QWidget*))); + disconnect(m_active, SIGNAL(addItem(const QStringList&,QWidget*)), this, SLOT(addItem(const QStringList&,QWidget*))); + disconnect(m_active, SIGNAL(searchDone(QWidget*)), this, SLOT(searchDone(QWidget*))); + m_active = NULL; + textChanged(); + setAddButton(); +} + +void SearchDialog::setColumns(const QStringList &columns, int n, QWidget*) +{ + int i; + if (!m_bColumns){ + m_result->setColumnCount(0); + /* + for (i = m_result->columnCount() - 1; i >= 0; i--) + m_result->removeColumn(i); + */ + m_bColumns = true; + } + for (i = 0; i < columns.count() / 2; i++) + m_result->addColumn(columns[2 * i + 1]); + m_result->setExpandingColumn(n); + m_result->adjustColumn(); +} + +class SearchViewItem : public ListViewItem +{ +public: +SearchViewItem(ListView *view) : ListViewItem(view) {} + QString key(int column, bool ascending) const; +}; + +QString SearchViewItem::key(int column, bool ascending) const +{ + /* + if (column) + return ListViewItem::key(column, ascending); + */ + QString res = text(COL_KEY); + return res; +} + +void SearchDialog::addItem(const QStringList &values, QWidget *wnd) +{ + ListViewItem *item = NULL; + for (int i = 0; i < m_result->topLevelItemCount(); i++){ + item = static_cast(m_result->topLevelItem(i)); + if (item->text(COL_KEY) == values[1]) + break; + } + if (item){ + QWidget *oldSearch = (QWidget*)(item->text(COL_SEARCH_WND).toULong()); + for (unsigned i = 0; i < m_widgets.size(); i++){ + if (m_widgets[i].widget == wnd){ + item->setText(COL_SEARCH_WND, QString::number((unsigned long)wnd)); + return; + } + if (m_widgets[i].widget == oldSearch) + return; + } + return; + } + if (m_update->isActive()){ + m_update->stop(); + }else{ + m_result->viewport()->setUpdatesEnabled(false); + } + item = new SearchViewItem(m_result); + item->setPixmap(0, Pict(values[0])); + item->setText(COL_KEY, values[1]); + for (int i = 2; i < values.count(); i++) + item->setText(i - 2, values[i]); + item->setText(COL_SEARCH_WND, QString::number((unsigned long)wnd)); + setStatus(); + m_update->start(500); +} + +void SearchDialog::update() +{ + m_update->stop(); + m_result->viewport()->setUpdatesEnabled(true); + m_result->viewport()->repaint(); + m_result->adjustColumn(); +} + +void SearchDialog::selectionChanged() +{ + if (m_result && ((m_currentResult == NULL) || (m_currentResult == m_result))){ + bool bEnable = (m_result->selectedItems().count() > 0); + enableOptions(bEnable); + } +} + +void SearchDialog::enableOptions(bool bEnable) +{ + m_search->btnAdd->setEnabled(bEnable); + m_search->btnOptions->setEnabled(bEnable); +} + +void SearchDialog::addClick() +{ + if (CorePlugin::instance()->value("GroupMode").toUInt()){ + EventMenuProcess eMenu(MenuSearchGroups, m_search->btnAdd); + eMenu.process(); + QMenu *popup = eMenu.menu(); + if (popup) + popup->popup(CToolButton::popupPos(m_search->btnAdd, popup)); + }else{ + Command cmd; + cmd->id = CmdContactGroup; + cmd->menu_id = MenuSearchGroups; + cmd->param = m_search->btnAdd; + EventCommandExec(cmd).process(); + } +} + +Contact *SearchDialog::createContact(unsigned flags) +{ + Contact *contact = NULL; + if (m_result->currentItem() == NULL) + return NULL; + QWidget *w = (QWidget*)(m_result->currentItem()->text(COL_SEARCH_WND).toULong()); + connect(this, SIGNAL(createContact(const QString&, unsigned, SIM::Contact*&)), w, SLOT(createContact(const QString&, unsigned, SIM::Contact*&))); + QString name = m_result->currentItem()->text(0); + emit createContact(name, flags, contact); + disconnect(this, SIGNAL(createContact(const QString&, unsigned, SIM::Contact*&)), w, SLOT(createContact(const QString&, unsigned, SIM::Contact*&))); + return contact; +} + +void SearchDialog::dragStart() +{ + Contact *contact = createContact(CONTACT_DRAG); + if (contact == NULL) + return; +// m_result->startDrag(new ContactDragObject(m_result, contact)); +} + +void SearchDialog::optionsClick() +{ + EventMenuProcess eMenu(MenuSearchOptions, NULL); + eMenu.process(); + QMenu *popup = eMenu.menu(); + if (popup) + popup->popup(CToolButton::popupPos(m_search->btnOptions, popup)); +} + +void SearchDialog::newSearch() +{ + searchStop(); + const QList l = qFindChildren(this); + foreach(QWidget *obj,l){ + QWidget *parent = static_cast(obj)->parentWidget(); + + QLineEdit *le = qobject_cast(obj); + if (le && parent && qobject_cast(parent) == NULL) + le->clear(); + + QComboBox *cb = qobject_cast(obj); + if (cb && parent && qobject_cast(parent) == NULL) + cb->setCurrentIndex(0); + } + m_result->clear(); + /* + for (int i = m_result->columnCount() - 1; i >= 0; i--) + m_result->removeColumn(i); + */ + m_result->setColumnCount(0); + m_result->addColumn(i18n("Results")); + m_result->setExpandingColumn(0); + m_result->adjustColumn(); +} + +void SearchDialog::addSearch(QWidget *w, Client *client, const QString &name) +{ + for (unsigned i = 0; i < m_widgets.size(); i++){ + if ((m_widgets[i].client == client) && (m_widgets[i].name == name)){ + delete w; + m_search->cmbClients->setCurrentIndex(i); + clientActivated(i); + return; + } + } + m_id = m_search->wndCondition->addWidget(w); + ClientWidget cw; + cw.widget = w; + cw.client = client; + cw.name = name; + m_widgets.push_back(cw); + m_search->cmbClients->addItem(Icon(client->protocol()->description()->icon), name); + m_search->cmbClients->setCurrentIndex(m_widgets.size() - 1); + clientActivated(m_widgets.size() - 1); +} + +void SearchDialog::showClient(Client *client) +{ + for (unsigned i = 0; i < m_widgets.size(); i++){ + if (m_widgets[i].client != client) + continue; + m_search->cmbClients->setCurrentIndex(i); + clientActivated(i); + return; + } +} diff --git a/plugins/_core/search.h b/plugins/_core/search.h new file mode 100644 index 0000000..e8015c3 --- /dev/null +++ b/plugins/_core/search.h @@ -0,0 +1,115 @@ +/*************************************************************************** + search.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SEARCH_H +#define _SEARCH_H + +#include +#include "contacts.h" +#include "ui_searchbase.h" + +#include +#include +#include +#include + +class CorePlugin; +class ListView; +class SearchBase; +class QStatusBar; +class QTimer; + +struct ClientWidget +{ + SIM::Client *client; + QWidget *widget; + QString name; +}; + +class SearchWidget : public QWidget, public Ui::Search +{ + Q_OBJECT +public: + SearchWidget(QWidget* parent); +}; + +class SearchDialog : public QMainWindow, public SIM::EventReceiver +{ + Q_OBJECT +public: + SearchDialog(); + ~SearchDialog(); +public slots: + void setAdd(bool bAdd); + void clientActivated(int); + void aboutToShow(QWidget*); + void resultShow(QWidget*); + void resultDestroyed(); + void textChanged(const QString &txt = QString::null); + void toggled(bool); + void addResult(QWidget*); + void showResult(QWidget*); + void addSearch(QWidget*, SIM::Client*, const QString &name); + void showClient(SIM::Client*); +signals: + void finished(); + void search(); + void searchStop(); + void createContact(const QString&, unsigned tmpFlags, SIM::Contact *&contact); + void createContact(unsigned tmpFlags, SIM::Contact *&contact); +protected slots: + void searchClick(); + void setColumns(const QStringList&, int, QWidget*); + void addItem(const QStringList&, QWidget *search); + void searchDone(QWidget*); + void update(); + void addClick(); + void optionsClick(); + void selectionChanged(); + void dragStart(); + void newSearch(); + void enableOptions(bool); +protected: + std::vector m_widgets; + void setStatus(); + void setAddButton(); + ListView *m_result; + QWidget *m_current; + QWidget *m_currentResult; + QWidget *m_active; + virtual bool processEvent(SIM::Event*); + void resizeEvent(QResizeEvent*); + void moveEvent(QMoveEvent*); + void closeEvent(QCloseEvent*); + void fillClients(); + void attach(QWidget*); + void detach(QWidget*); + bool checkSearch(QWidget*, bool&); + SIM::Contact *createContact(unsigned flags); + void setTitle(); + bool m_bAdd; + bool m_bColumns; + unsigned m_id; + unsigned m_result_id; + SearchWidget *m_search; + QStatusBar *m_status; + QTimer *m_update; + friend class SearchAll; +}; + +#endif + diff --git a/plugins/_core/searchall.cpp b/plugins/_core/searchall.cpp new file mode 100644 index 0000000..05b9f81 --- /dev/null +++ b/plugins/_core/searchall.cpp @@ -0,0 +1,184 @@ +/*************************************************************************** + searchall.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "searchall.h" +#include "search.h" +#include "log.h" + +#include "contacts/client.h" +#include "simgui/intedit.h" + +#include +#include + +using namespace std; +using namespace SIM; + +SearchAll::SearchAll(QWidget *parent) : QWidget(parent) + //: SearchAllBase(parent) +{ + setupUi(this); + connect(this, SIGNAL(setAdd(bool)), topLevelWidget(), SLOT(setAdd(bool))); + edtMail->setValidator(new EMailValidator(edtMail)); +} + +void SearchAll::showEvent(QShowEvent *e) +{ + QWidget::showEvent(e); + emit setAdd(false); +} + +void SearchAll::wndDestroyed() +{ + QTimer::singleShot(0, this, SLOT(refresh())); +} + +void SearchAll::refresh() +{ + vector &widgets = static_cast(topLevelWidget())->m_widgets; + WND_MAP::iterator it; + for (it = m_searches.begin(); it != m_searches.end(); ){ + vector::iterator itw; + for (itw = widgets.begin(); itw != widgets.end(); ++itw) + if (it->first == itw->widget) + break; + if (itw != widgets.end()){ + ++it; + continue; + } + m_searches.erase(it); + } + if (m_searches.empty()) + emit searchDone(this); +} + +void SearchAll::search() +{ + if (grpMail->isChecked() && !edtMail->text().isEmpty()){ + if (!makeSearches()) + return; + emit searchMail(edtMail->text()); + } + if(grpName->isChecked() && makeSearches()) + emit searchName(edtFirst->text(), edtLast->text(), edtNick->text()); +} + +void SearchAll::searchStop() +{ + emit sSearchStop(); + for (WND_MAP::iterator it = m_searches.begin(); it != m_searches.end(); ++it){ + disconnect(this, SIGNAL(sSearchStop()), it->first, SLOT(searchStop())); + disconnect(this, SIGNAL(searchMail(const QString&)), it->first, SLOT(searchMail(const QString&))); + disconnect(this, SIGNAL(searchName(const QString&, const QString&, const QString&)), it->first, SLOT(searchName(const QString&, const QString&, const QString&))); + disconnect(it->first, SIGNAL(searchDone(QWidget*)), this, SLOT(slotSearchDone(QWidget*))); + disconnect(it->first, SIGNAL(setColumns(const QStringList&, int, QWidget*)), this, SLOT(slotSetColumns(const QStringList&, int, QWidget*))); + disconnect(it->first, SIGNAL(addItem(const QStringList&, QWidget*)), this, SLOT(slotAddItem(const QStringList&, QWidget*))); + } +} + +bool SearchAll::makeSearches() +{ + m_searches.clear(); + m_attrs.clear(); + vector &widgets = static_cast(topLevelWidget())->m_widgets; + for (unsigned i = 0; i < widgets.size(); i++){ + if ((widgets[i].client == NULL) || (widgets[i].client == (Client*)(-1))) + continue; + if ((widgets[i].client->protocol()->description()->flags & PROTOCOL_SEARCH) == 0) + continue; + connect(this, SIGNAL(sSearchStop()), widgets[i].widget, SLOT(searchStop())); + connect(this, SIGNAL(searchMail(const QString&)), widgets[i].widget, SLOT(searchMail(const QString&))); + connect(this, SIGNAL(searchName(const QString&, const QString&, const QString&)), widgets[i].widget, SLOT(searchName(const QString&, const QString&, const QString&))); + connect(widgets[i].widget, SIGNAL(searchDone(QWidget*)), this, SLOT(slotSearchDone(QWidget*))); + connect(widgets[i].widget, SIGNAL(setColumns(const QStringList&, int, QWidget*)), this, SLOT(slotSetColumns(const QStringList&, int, QWidget*))); + connect(widgets[i].widget, SIGNAL(addItem(const QStringList&, QWidget*)), this, SLOT(slotAddItem(const QStringList&, QWidget*))); + QStringList l; + m_searches.insert(WND_MAP::value_type(widgets[i].widget, l)); + } + return m_searches.size() > 0; +} + +void SearchAll::slotSearchDone(QWidget *w) +{ + WND_MAP::iterator it = m_searches.find(w); + if (it == m_searches.end()) + return; + m_searches.erase(it); + disconnect(this, SIGNAL(sSearchStop()), w, SLOT(searchStop())); + disconnect(this, SIGNAL(searchMail(const QString&)), w, SLOT(searchMail(const QString&))); + disconnect(this, SIGNAL(searchName(const QString&, const QString&, const QString&)), w, SLOT(searchName(const QString&, const QString&, const QString&))); + disconnect(w, SIGNAL(searchDone(QWidget*)), this, SLOT(slotSearchDone(QWidget*))); + disconnect(w, SIGNAL(setColumns(const QStringList&, int, QWidget*)), this, SLOT(slotSetColumns(const QStringList&, int, QWidget*))); + disconnect(w, SIGNAL(addItem(const QStringList&, QWidget*)), this, SLOT(slotAddItem(const QStringList&, QWidget*))); + if (m_searches.empty()) + emit searchDone(this); +} + +void SearchAll::slotSetColumns(const QStringList &attrs, int, QWidget *w) +{ + WND_MAP::iterator it = m_searches.find(w); + if (it == m_searches.end()) + return; + int i; + for (i = 0; i < attrs.count() / 2; i++) + it->second.append(attrs[2 * i]); + QStringList newAttrs; + for (i = 0; i < attrs.count() / 2; i++){ + QString attr = attrs[i * 2]; + int n; + for (n = 0; n < m_attrs.count(); n++) + if (m_attrs[n] == attr) + break; + if (n < m_attrs.count()) + continue; + m_attrs.append(attr); + newAttrs.append(attr); + newAttrs.append(attrs[i * 2 + 1]); + } + if (newAttrs.count() == 0) + return; + emit setColumns(newAttrs, 0, this); +} + +void SearchAll::slotAddItem(const QStringList &attrs, QWidget *w) +{ + WND_MAP::iterator it = m_searches.find(w); + if (it == m_searches.end()) + return; + QStringList la; + la.append(attrs[0]); + la.append(attrs[1]); + for (int i = 0; i < m_attrs.count(); i++){ + QString attr = m_attrs[i]; + QString v; + for (int n = 0; n < it->second.count(); n++){ + if (it->second[n] == attr){ + v = attrs[n + 2]; + break; + } + } + la.append(v); + } + emit addItem(la, w); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "searchall.moc" +#endif +*/ + diff --git a/plugins/_core/searchall.h b/plugins/_core/searchall.h new file mode 100644 index 0000000..95fb616 --- /dev/null +++ b/plugins/_core/searchall.h @@ -0,0 +1,59 @@ +/*************************************************************************** + searchall.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SEARCHALL_H +#define _SEARCHALL_H + +#ifdef __OS2__ // to make it compileable under OS/2 (gcc 3.3.5) +#include "simapi.h" +#endif +#include "ui_searchallbase.h" + +#include + +typedef std::map WND_MAP; + +class SearchAll : public QWidget, public Ui::SearchAll +{ + Q_OBJECT +public: + SearchAll(QWidget *parent); +signals: + void setAdd(bool); + void searchName(const QString &first, const QString &last, const QString &nick); + void searchMail(const QString &mail); + void setColumns(const QStringList&, int, QWidget*); + void addItem(const QStringList&, QWidget*); + void searchDone(QWidget*); + void sSearchStop(); +protected slots: + void search(); + void searchStop(); + void wndDestroyed(); + void refresh(); + void slotSearchDone(QWidget*); + void slotSetColumns(const QStringList&, int, QWidget*); + void slotAddItem(const QStringList&, QWidget*); +protected: + void showEvent(QShowEvent*); + bool makeSearches(); + WND_MAP m_searches; + QStringList m_attrs; +}; + +#endif + diff --git a/plugins/_core/searchallbase.ui b/plugins/_core/searchallbase.ui new file mode 100644 index 0000000..f17bbf3 --- /dev/null +++ b/plugins/_core/searchallbase.ui @@ -0,0 +1,131 @@ + + + SearchAll + + + + 0 + 0 + 373 + 369 + + + + Form4 + + + + 6 + + + 0 + + + + + true + + + false + + + &E-Mail + + + + 6 + + + 11 + + + + + + + + + + + true + + + false + + + &Name + + + + 6 + + + 11 + + + + + First: + + + false + + + + + + + + + + Last: + + + false + + + + + + + + + + Nick: + + + false + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + grpMail + grpName + groupBox + groupBox_2 + + + + diff --git a/plugins/_core/searchbase.ui b/plugins/_core/searchbase.ui new file mode 100644 index 0000000..680038d --- /dev/null +++ b/plugins/_core/searchbase.ui @@ -0,0 +1,99 @@ + + + Search + + + + 0 + 0 + 614 + 451 + + + + Search + + + + 11 + + + 6 + + + + + &Add to list + + + + + + + + + + + + + true + + + + + + + More &options + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &New search + + + + + + + + + + + + + + + + + + + btnSearch + btnNew + btnOptions + btnAdd + cmbClients + + + + diff --git a/plugins/_core/smiles/Angel.png b/plugins/_core/smiles/Angel.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8e8712141263b1a0f0f37a6ee5e15053f2db96 GIT binary patch literal 864 zcmV-m1E2hfP)7JhMuJSOuE0dWJL?0Bdcvbb`)%VpaSzBA<|28u# zIOy%TqA0P}Vx2pTA54{iQi3strKM%Ie!n9#p~sHSyYH{vpk8laOofxDP5~eSA{GIh z6C4V+Pv6+s;Og}s==Jv86N`^w{F(sB{nvl~xwc#T?h1qcHqGh=jkyk<0UVSCq{AxR z!6GAR6NEKRpFTU4=@b;eXVuNuF4CxiSMe}Za8@XD$cBa_v2=S)^0~K3d0Os2Kc#6X zU%ACcFVU!ZgcSo?0~$&oSA?F%H$p`vbap?6+B+`g$qBHU$WZ<079LsUNJ|mc3{(|_ z`yg-Gvn|QuLi~{}7hB)p3E#L)E!8o>h4+OLlj1emQHM>w+?Tl-p0D(AuiYPh)G>PL+ zfd%5&61{c|3QPRSN%B4jpcT};uIr7OG64lM?wCV$9C3UCXaij!1p35ZF2SIHblhQ% zv7bMBoZj8eWTuwKDGH#pP#mljz&3CRr~rRLJ{mu-Qc+qcOGi;^e!JT_d{&2=4n}7r z9co4ykXtBWsOv- z<;><-WCyshU;k#ABypq}Bx#A%UwklhcX&aNfuTxGwbG&WPDsUt~C z1_>mxOs3njf2jlO4c|xHM-+1W8tl$$Q`51k_?1YUS`;MbqY8W3ee9M1U_J7e{xdZK)XM{rj)it$ulgp q&#`l-GZP38`1<~)J2SSk;^MmQ3Y%Jquj?XMx|>84R8W>*BGC^CL4qK~W{H+5 z5k~b*D57tLm93R8u+a9#iiRd?>mp{_+Rm;!J1@`My?q!NEXK~a%em*rJ?EbDKgRIz zFn2RmJf;nQ1i=(&P`Vl6EJ4Q}GVU4#7&;09cBDZG2nBl%)lOC%czQ&qIK4a&;ah5-EnIl8f zL?l=dfo+?(e|}y~KNi1=6#*$hNC)6v}QbXz_tIzCQRUvzHFl?rU{BOoLKkwWeOd zCJd`i6cECtpRzpj`~^G(jg5_Dvss#(o4K6N^W^q#A>R%Pl!8EMR0u%`p(m;}txV6w z^G5MKuuMRiy!%ER)3V8=QX~=yB9RDMYf7aO7bhkdI%%_}UlD|YAOtT^_`X6JIZQz6 z_$JDw0URqt3KKE0h+i(8C!5WZ%jIZjXuz^8!Z4&zDBw5_XD(0D9Mr77vwR4*u)&-u`9?#g0{9c=157)%nSv`;rCPu+qQ9%Wn5q3dQfo{ zWmi#|P9o<&VAKRz+KQ3QqQa1Qqob75lXT1u zD3+j9fE{J&8OkXhtCEAX1`|KA<;4~kpZ=#n^RXaE2J07*qoM6N<$f^SwLC;$Ke literal 0 HcmV?d00001 diff --git a/plugins/_core/smiles/Annoyed.png b/plugins/_core/smiles/Annoyed.png new file mode 100644 index 0000000000000000000000000000000000000000..b03a2e9b9d3d311bb77b16f00fe605ad3a497998 GIT binary patch literal 1102 zcmV-U1hM;xP)&6rJQ6kGxyB-a?W?Y zd?N-12Dn!!Tec=1M%W3kV8vpj+e9Rq#663E)VznaUh9ctchumwcE`NnVs@uX@*_65^8pL%u95LTNpO&}Kq0C^7=rIhCWA&){d-hdF$a96Q^iHA zqqk|O_sM!5t^z4Q0@i@lP>Ut80#|92lqly4H?O{fTfg5%&VQ6R(+|1KSClVV7A#P7 zeKE;XTW|64=RRa4A|r7!;Cj$`^d_5L8|QHUICVM6@JJ1F=leP1I{;bdeOns*noX@S zyI%JxtkQIKL1AT$?JwN`7f_PzZ`@$TnwYLGSk)A!7(bPa@46*i z1sgZ4=kytmzT-KH#W!hbSw^wAoxZ*;z&dbR=sWQk#gluIT>ta*ezKIa7Ze*>pGGN( z4Sr1|HT=sWyR^PSzD|KhvTj_GmxqBZQ}@4slMtMT${h$DbO4o#!JmYQ+i-otC3XK1 z;Rq){h=jAbA%Q%w99RPsfcrqCU}`1Kx##AVm@qlFCWkS}KCrXDh=B=U82Aym2wVdl zL2)ZXyT=(ibQo*FSg;ll*#tDMHJ~*Ku$}@3AOijbP6Nk)AE5RdeAmj*p~EzH_h2n( z4cdU#8mk%;NyW7mqUaKF1Zg=%gEOt*2@nz3%Mcrec3lNirn$R^{p}yI(?YBvj+0Af z9#23KTd4%ycmss1lfj-gn;8m z1uBDV*2~OeQjDBW7 zv+js>*+)Kmi%i->r4mtj13Qz=+QhAlf$INKN@E28`C|SSEg2g}|2t`T=qc?-H1$^ZO})A2kU0j9RtdI({$889|D~`LzZU zYpM}MwN*H|ojBezA~4()^ZrgkyICMNlT}x2SS@4C1lEF3i;;CrSluY}e1%i-FCS6X UXh`7=O#lD@07*qoM6N<$f`B~t5dZ)H literal 0 HcmV?d00001 diff --git a/plugins/_core/smiles/Cool.png b/plugins/_core/smiles/Cool.png new file mode 100644 index 0000000000000000000000000000000000000000..763ff64cf8edd33598c09b5146a0315f2bfba32a GIT binary patch literal 970 zcmV;*12z1KP)i72gIsDhRo0b72ld88#_F=&Kb}#HGRa-Ov*! zJ^?%?Chi69W@2Il@Mw*{*s&QI8R7iNM#p1pQhs0gt?6#-U!iXY5Z1O7SqR(*JOms9 zt^wyD{t41mNP)y7ZNvIHEU&=zn;{H+DSRjH!I(Lm1!36CIw|lM@GWo&SOvWRItB~a zvaE~+V?Y~&QwI=$H0}ZNyzCS-96xphG*vw=0>6Si5BViX7C{@1fBZ5S&<1n?g)T)# z_m|KA<>D8vFC1le)6%HdkP60+KEFM4Th7$Gr?Dv{iATH+YiqEyZ1E3HkuoU!wRE2d z)YGorK7$9;Elhp%Ic!vfqwIYR6s6c4vb-S6JklJJ)S&B+pcxcUrRB!j8$#M2oa6@1 zLd^%|!^~Hs6$h!aDc?}7bqcAC30`gR0YTwNZe5w26Ol~BJL zdsv0Dpo;>XL!LpBKpZPp<0iqr4@tRm`;?0FAwlq|Gx0I9^fEyJN>)*@MQ2DC8Du%M zV`vw{)b>x3*xS2Ckm$8eB6-#+cM9KLM#>t(g4@V+4w)H(=sAk;iJp_c=Q?TI!vYQy s1%Er6&*MzBqf|d$W0=AW{_l?Z7YOK!Wxc(U)c^nh07*qoM6N<$f_Xo(egFUf literal 0 HcmV?d00001 diff --git a/plugins/_core/smiles/Crying.png b/plugins/_core/smiles/Crying.png new file mode 100644 index 0000000000000000000000000000000000000000..8a37b1270226ec6298f4ec02f3dd0378acb61cc7 GIT binary patch literal 1056 zcmV+*1mF9KP)2T>0HZ^+~Fg8x%e8Y!Cv30h4CXL>34`Xtfm0XaKi&ikNNd;BBQYSB#1$=<7|{ z_nbrs`1Y$ZmH`at96Its6RqLoyB)apbyjce$Lo2+NPCC)pVBUW%xvyz@zk@D^QSzp z0pVu56p#W5AZ=m^BhNHB`A!Fo2COtXG5sgnPz#`B9W55L8wpA}PYN1QoU#`mC504M$qUtco-mc?nxW$-+x1yFAqrl(&9 z0rdvdT4nIMsYMm)O_+XvKL}{FAczdE1D*o~AEM>6nNrXD9?u2Wh3;O#;Gos+;^1JJ z?(SW{Fx`C*FnE7wW(Q#KUYnk73)==KPaRy$8nyUi$@KLER4P9BS(!641}HE*ybH&9 z0=NfQB2B+x=JW-KS`6=Yuu@GcfL7CHwWj!I#mCwHrEr85u3esa%n^)^3ZMW~fqq~+ zAaI;6Mjxp_QzH77Q47`o3=aq+v+|8DV+^44Y=;C^fJNX3;0o|JC<%F=-#i{;4Cp)& zekLqYcc9YCXa$ze{pbKhz#qU2@Dosn_!=ZZ`*LGID^NVeYI456ecfqm1#%%+23MzqA+QczLA%r0` zn~HkSgEjC`+e7Us6`Lch)LulTA&CdB4NgAx(0N0Wgd~TCAp|W&Bdk)~dYJeo-?X8D zyh{l0m|3nJpzK}6bHTBaY~r+`kVuFk2m(c@c2M4SkWk;Y@jL}+$t?nolg3{gtMxIS zwS<+c)hVbHWUPqQomk~@tm0!LT<7f#plcB^CUC~Uxo(tP!02TRAlyyZm7N&1MW~Gq a=J788>Ct01tiR0w0000L)*vz literal 0 HcmV?d00001 diff --git a/plugins/_core/smiles/Embarrassed.png b/plugins/_core/smiles/Embarrassed.png new file mode 100644 index 0000000000000000000000000000000000000000..10473e6fe8f41da11cb8da52761cfc69394b3900 GIT binary patch literal 1136 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 V1ljwEP)bkaKR~x?myE38V?ce=DqbrAgXe zq|v#5S#s;{&3*Yg zv*y2~Vj+Cj%$RoTO|DGY?0Keww80ke#aKJLw=2#~1Z>|Fk|nKmCh7g#VcKq?_2LkxNzq6nfoRH{&}WY27fLxiNwqcs`ss1xMb4 zp57ixM@t-d16~+_6Q8FXc|WCRRWGGKZgOCs&7Lhb(gWXB}s9>0ZHe!Epc^ z2KPas03#zK_&LGg%bOtB!Qg98QfLnt899XSB@FJgzyjL>#|GDyQ2jo8s9&Z6vuZ_1 zKHtop11f>ip9OmQ9z)7qz@xx#D0PO?)oHsL``KZ$Ou4ZT$V9;w8;$4oo}OB+uoE>4B{k+SAp+9 z>;~~6Xaxq!>}B+9JKC@aE1!|ZjegP;ObSnLsWEX7IW$seG$3ih>e!3{ z9IRc0(NTQQ;8@M70WJUx4lc>}!q6JxBzshqz95$au|lL2jgFl(tUduPwg0^7YP&@sK|0`C zK>tz?lgpA=feIlEp;}W^qLt`JK5eai0A(NMcBPYQ4eDVAHPcF1pOl0Vgb~ytsD_G) z>cm@jxW!J~-TCwGO=CxIlXtJ-*_pSt0rX;%PGV3IgrOod>yc{@5z*VytXn#NJ?RxV zACROcja~m3$*))fga*@4G~y7yyu*I?z#8wUN>i3Y&J}rI0>o#jMBVLSIn586y2g zr6)I`XEx0Xp98H=45@PdE$WgtuuU)o=m?0Wp#k_+LA9ErT>h9+{*jKK<$;>XML3Kyt<%!Lc(BQkQ^qN|3g*6#v?d5e%q*L$#Tlru5Bf z;etsV+hpU`3g=Fw5dcb{LI`C@7zlh1*1eeL^LH9>T__eq^2H3!@=vrmk=pE03o?@= z9FvXPbS|9UiAX$xvIJP5SzuU#nA1VL;c346Vl&Tn=dfeo*aFAOQyDrq8?A2XgDREy z5ho5$JeTDC!|&1k`UKrQ@N@qTl%azGm#(g+`#>YF_Kq_!zJYJPe3z}S0lrU}AGF;(y=6w36z-OI?x2!0SSGI1}&+9;HMrMGuK zW7#Z$lnh@VrA}F-br1p!At)CwVFS8pj9~~6`Z%%J4LUm7xHdeD=lis^HPhPKPGjSf ztX$d7$Y>TX2w1wLiE5=tTpL8wLDxXnA*znls^9;ctrjg*B;zJhH8Ygm#@X{@xa9)t zHyCtutOM?&RJuZ6-w%}XF88!0X>u;mni;}%BT7Y>D!|QLMEd@dnxRwz6_rp5Y%9z1 zyAQFrrH+`T5b<_k0MJM#M|t7-e%!&!m~sN?8C0sE6hx|aD&48&REAB+@CsoFW(0)b zSk+o@_`_hG2QGmsKyCy_aARoZ@uMn7E3Z@&r=4&3m3S0*? zh!o!+Zy*W-!mu{BQbtG#QbHiXO0TLxHL(G=a-5hMVCW`RRIBEijRiV8J8Qt{PgZaF zj8jK5_!0sc5l9FE@B{FCjr!(C@d3m2TQtHoDrTHRCm^y+)^C}jtE-D0o4bkG#j&|50yRl#+^ix0N(={-G!BT3Q}w5RsMOQGZq(FCB4f;auOARCh9Tm gWmHx3|L&-N04&A@4pFf!Q2+n{07*qoM6N<$g0h$*+W-In literal 0 HcmV?d00001 diff --git a/plugins/_core/smiles/Skeptical.png b/plugins/_core/smiles/Skeptical.png new file mode 100644 index 0000000000000000000000000000000000000000..5df3974b6fb520b4af3896beea24d021779c76d5 GIT binary patch literal 1129 zcmV-v1eW`WP)7{QlhEy}x_6-OV}OG*cH?qT(i5A+hBgB?*Z-!RSr&CSQ#y21yw~g_19n ziinV285Hza?1d7GfmE+tXj0uoWom6~?*9M%J*OA{JREp9=fn3o&*6K-rAwE% zUsx)qb&vyH04;!4q|-|v*NFQb0?b8=;g{Oc=SW)ju#zCO1rbCc_(j0)&~fq^;>@l^ z;R~Qk(l@o2KS4G#g<~7ohC~8FOH?F@Lq!-!s?|K@@>z-M&JT-RXRu30v1v>1Ku z9#?V!*wj;U<$B2IJF^^lcZSoiE@j`?6s{vlCyFq2s;O2cVcZ!!6s&l~U0a{hyrj2xN5Nl2{f&m`h04Im{KNu?l> zfG^IrP$+56e0&IiLQ#{iB*1AU@7WYeiZdS`1_6b#qT*@JzxM#P1&%H8W+v)Nt;^W9 zfoVd=Qc2%t3j`pbZ%c-bt_@&5PREKZ^z~;!)CS$R-l4PI#4seL0j43*rE36)+~jiI z)#;OVfrLS%O~xl85H85&e7P%0|s^NN{#0{QSq z!W6QK5Y0z`X$pph91tm>1?U0R020$|V`wl7r2=?B`0vC8Ae2{YU#k>K0gcr4Bm(Av zKY+`?HDCtfu(@a8#hYjiO4my=SrZn<-Nf;AlmgiR6N8GtyaPp)!ZNy3u$BHOYU@fmH4Wi8iK};Cb+lgvSVg+6vyc|?7^Vz3s8GQN|26x{;8%x-` z{~#~yY9Wdsj39_WWFDz0MGjN0evV^-DZ!wj7N$$5**`J@TJY#&>loZVLXZ0$53Me< zr60l>@IyrqD*Ql`T>T^-V3va(A=GxAG%sQRjxsPz$>4L-3=MzHhK)mP>ivn%j;n0# z-%6LAA@KgjpZf~Wmv{kGd_|nzh9{PZno^(?9TIkNQVZr#3KFK`z;1_xb&fs5TUpng zf!HSw$MJoM?<;&?QT3rxfpVBdu6nuYRH9+hu60u<;#bI|syMcRWk^h6AT*#PI+8>o zL;?67cpj9?P$;`N55A5kS2UqbKP`u=1okN%7Ea*WIc&3b$5J=^R5hWV2bGGV8uyZ1 zJ4#h|F7VR@CS4A?1o9+NctMNGH`v_95FoTd*PTD`Ay6w3Ejz(|N>mp(=_1fZRK*T~ vy#vg@bnNHQaUP_AWGhCtmsoZE?;rIKY3$10#VT-J00000NkvXXu0mjfAvp?V literal 0 HcmV?d00001 diff --git a/plugins/_core/smiles/Smile.png b/plugins/_core/smiles/Smile.png new file mode 100644 index 0000000000000000000000000000000000000000..2af912dcd1f9184d23b81112c9fb9871cf1709a7 GIT binary patch literal 1142 zcmV-+1d02JP)*`13{Z4sb`3ro?8=s z4|IL*ngqqew5*#Y?RvPj#zLb6Ox%Emp(a}|QLBAT>E?H0b-abIHmNnC4u6U9575~j zkV$D=TVpFgG#J2WOlT832G^o-&MlS;V|W|ik-)l}l2vHVJwSVFKrT0klNtcEj6^@8 z5HK1NjrRI+RX>)$h`v1m35bbUEPMt%U#>=~0W$g{X=^Fd{J;xbzOj#y(OE{`uXFD5 zD~Mx(tNHEfX@X291@23X9yrQt z``=`7Dd59{-?C8JMvTko*kogW*=O|N5z0Y3zS@T8YEquY@z0Sm1p&~SlVr2tdg~~b z14^YTu5Yz6D<6&5~*_$ z*8#^~!1ERu80_Wx^fW;juw_dJ-Q79bH$2MVBfS)6W(mTOzO5Va{R%l}8e1!D3mhA$ z{t1A(a%rP?MGohnePmDsyi7#MgAc$i9MhGWNmrBVvn-rG#iy0i4J zpT)01rIJuA8E!4Q$o3=3R;qsIy-20!c&PsfJw0hWFNI|d0uKUPX=;Lf`_5CFzknAn zVMPM9duv}wgaEck1|vQQjd~QwWCB0|Mc~THdKOq9^F%)afu;ugBQdos%o$KPsD9xEFX;1ji`VrAb<@7Ko&r?E4u$%ZC_E`v^#rcEj-_abbOK2f69wQWU8vl% znDlN{H~eR;*-q*VE1Y36_MDjT3X&8NKzS`#&3(kC<9~b9KV?bwd22y7EC2ui07*qo IM6N<$g7<746#xJL literal 0 HcmV?d00001 diff --git a/plugins/_core/smiles/Surprised.png b/plugins/_core/smiles/Surprised.png new file mode 100644 index 0000000000000000000000000000000000000000..089bfc41ec8174d095a40d577aec3f963563379b GIT binary patch literal 1089 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 M07*qoM6N<$f|K6J2><{9 literal 0 HcmV?d00001 diff --git a/plugins/_core/smiles/Wink.png b/plugins/_core/smiles/Wink.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a97ed555bd5fa6ec91be2ec06dd54eee770d68 GIT binary patch literal 1079 zcmV-71jze|P)DPiPRWpwJ#HsMVV2L95t6dywLxhaOcB6_t=0TS2J^ zg4Bb54?>kfFP0XSVxbqs;6Wr7tZDVxG|fxebocGf&L0o^8d{p_!0cgm=d<78`~Ce! zoIZV;TMgwWy)(aqZ*^8yAfrJFHi%np0@PBA(j4}o_?l{E1{H$Iq%7kV*uh z1QA5#OAlCZ5>#LbghT*1i#I9rGoz@LUoI*Q04i?GFYlS7s}>T+aA~f=#N=H}P7PqC zD1RM75JIRVl@Q_(;z&}9p%%?k%~eP4xA)V5IT#K5QR{LlDGnCdWy(Tc`eq80DFRJ6(SWPe1-9M7q~c+(7dp~XP=*> zw{Htp4T0(fDItK5k8bDr@qScLni)!{gpjnpEtQ7B1YyVJ=5$D|Jr6#xg^`gF#>d|R z(T$3?vUl%a;8L&!_@DS-v`LmpqyQx>Dv+4u7s3W88JtH3AOp#|)tZfWucp~-^7F(5 zn>KHx(O3t-rcFaY3(QsaJb4tOOS1&!BM{(=ze}Zpc9}z0y8O|53CDl9pXGfG9vylL zm;zR@XU}Hf2((T?D)G*OV{u=Z5Z#HV?Zepw=gQdBm$lfn{V+aQg;3uB4*`Qf6PN~L zz*@Wo=Q`7Za}p=wGE&C%V@&7U0x*D)2r~o8IpAce(4BzRShDA6P-rm5;xtfnW_uo5XJGb6xHJjrEM6CQ55v3XF$RhvLTigIAndxgJid&F zNz<>WgdT~62p-!phY;75vloEJd+;8{#`fVH6#4t;9C8g==BTgTh6YsI+%BAZ*eB`t z2mv@a_C*hmKYNAm-aJrR+ktI+<5kAS_HoaOgXFoS-G(f)wA&DLKY|whWf-pY(>UGj zduuaPD`go<2~Rw?aGlyx;l>pQDRN1cLz-EV1QxP7-GiSl9&Hg?4W_)i{4(9~Wh#;E z6olm0=@;=G=$-XOb$Oe*wEu&|KD= + + + SIM smiles + 0.9.6 + SIM smiles. + Vladimir Shutoff + 2004-06-11 + http://sim-im.org/ + + + :-) + :) + =) + Smile.png + + + :-0 + :-O + :=0 + :=O + Surprised.png + + + :-| + :-! + Indifferent.png + + + :-/ + :-\ + Skeptical.png + + + :-( + :( + Sad.png + + + :-{} + :{} + Kiss.png + + + :*) + Annoyed.png + + + :'-( + :'( + Crying.png + + + ;-) + ;) + Wink.png + + + :-@ + >:0 + >:O + >:o + Angry.png + + + :-") + :-[ + :-< + :< + Embarrassed.png + + + :-X + :-x + Uptight.png + + + :-P + Teaser.png + + + 8-) + Cool.png + + + 0:-) + O:-) + 0-) + O-) + Angel.png + + + :-D + :D + Grin.png + + diff --git a/plugins/_core/smscfg.cpp b/plugins/_core/smscfg.cpp new file mode 100644 index 0000000..c194128 --- /dev/null +++ b/plugins/_core/smscfg.cpp @@ -0,0 +1,37 @@ +/*************************************************************************** + smscfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "smscfg.h" +#include "core.h" + +#include + +SMSConfig::SMSConfig(QWidget *parent, SIM::PropertyHubPtr data) : QWidget(parent) +{ + setupUi(this); + edtBefore->setPlainText(data->value("SMSSignatureBefore").toString()); + edtAfter->setPlainText(data->value("SMSSignatureAfter").toString()); +} + +void SMSConfig::apply(SIM::PropertyHubPtr data) +{ + data->setValue("SMSSignatureBefore", edtBefore->toPlainText()); + data->setValue("SMSSignatureAfter", edtAfter->toPlainText()); +} + +// vim: set expandtab: + diff --git a/plugins/_core/smscfg.h b/plugins/_core/smscfg.h new file mode 100644 index 0000000..3975512 --- /dev/null +++ b/plugins/_core/smscfg.h @@ -0,0 +1,34 @@ +/*************************************************************************** + smscfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SMSCFG_H +#define _SMSCFG_H + +#include "propertyhub.h" +#include "ui_smscfgbase.h" + +class SMSConfig : public QWidget, public Ui::SMSConfig +{ + Q_OBJECT +public: + SMSConfig(QWidget *parent, SIM::PropertyHubPtr data); +public slots: + void apply(SIM::PropertyHubPtr ); +}; + +#endif + diff --git a/plugins/_core/smscfgbase.ui b/plugins/_core/smscfgbase.ui new file mode 100644 index 0000000..0122d38 --- /dev/null +++ b/plugins/_core/smscfgbase.ui @@ -0,0 +1,59 @@ + + + SMSConfig + + + + 0 + 0 + 321 + 274 + + + + Form1 + + + + 6 + + + 11 + + + + + Text before cursor: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + + + + Text after cursor: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + + + + + diff --git a/plugins/_core/status.cpp b/plugins/_core/status.cpp new file mode 100644 index 0000000..87f0cd7 --- /dev/null +++ b/plugins/_core/status.cpp @@ -0,0 +1,554 @@ +/*************************************************************************** + status.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include + +#include +#include +#include + +#include "unquot.h" +#include "status.h" +#include "core.h" +#include "statuswnd.h" +#include "logindlg.h" +#include "autoreply.h" + +#include "contacts/client.h" +#include "socket/socket.h" +#include "socket/socketfactory.h" +#include "clientmanager.h" +#include "simgui/ballonmsg.h" + +using namespace std; +using namespace SIM; + +typedef map MAP_STATUS; + +CommonStatus::CommonStatus() + : EventReceiver(LowPriority + 2) +{ + m_bBlink = false; + m_timer = NULL; + m_balloon = NULL; + + EventMenu(MenuStatus, EventMenu::eAdd).process(); + + Command cmd; + cmd->id = CmdStatusMenu; + cmd->text = I18N_NOOP("Status"); + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x6000; + cmd->popup_id = MenuStatus; + cmd->flags = COMMAND_IMPORTANT; + + EventCommandCreate(cmd).process(); + + m_bInitialized = false; + rebuildStatus(); + QTimer::singleShot(500, this, SLOT(setBarStatus())); +} + +CommonStatus::~CommonStatus() +{ + EventCommandRemove(CmdStatusBar).process(); + EventMenu(MenuStatus, EventMenu::eRemove).process(); +} + +void CommonStatus::setBarStatus() +{ + QString text = I18N_NOOP("Inactive"); + QString icon = "SIM_inactive"; + + m_bConnected = false; + bool bActive = getSocketFactory()->isActive(); + if (!bActive) + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (client->getState() != Client::Connected) + continue; + + bActive = true; + break; + } + + if (bActive) + { + m_bConnected = false; + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (!client->getCommonStatus() || (client->getState() != Client::Connecting)) + continue; + + m_bConnected = true; + break; + } + if (m_bConnected) + { + text = I18N_NOOP("Connecting"); + Client *client = getContacts()->getClient(0); + Protocol *protocol = NULL; + if (client) + protocol = client->protocol(); + if (m_timer == NULL){ + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); + m_timer->start(1000); + m_bBlink = false; + } + unsigned status; + if (m_bBlink) + { + icon = "SIM_online"; + status = CorePlugin::instance()->getManualStatus(); + } + else + { + icon = "SIM_offline"; + status = STATUS_OFFLINE; + } + } + else + { + if (m_timer) + { + delete m_timer; + m_timer = NULL; + } + unsigned status = CorePlugin::instance()->getManualStatus(); + unsigned i; + for (i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (!client->getCommonStatus()) + continue; + if (client->getState() == Client::Error){ + icon = "SIM_error"; + text = I18N_NOOP("Error"); + break; + } + } + if (i >= getContacts()->nClients()){ + Client *client = getContacts()->getClient(0); + if (client) + { + const CommandDef *d; + unsigned i = getContacts()->nClients(); + if ((status == STATUS_ONLINE) && CorePlugin::instance()->value("Invisible").toBool()) + for (i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (!(client->protocol()->description()->flags & PROTOCOL_INVISIBLE)) + continue; + + icon = "SIM_invisible"; + text = I18N_NOOP("&Invisible"); + break; + } + if (i >= getContacts()->nClients()) + { + for (d = client->protocol()->statusList(); !d->text.isEmpty(); d++) + { + if (d->id != status) + continue; + + if (status == STATUS_ONLINE) + icon = "SIM_online"; + else if (status == STATUS_AWAY) + icon = "SIM_away"; + else if (status == STATUS_NA) + icon = "SIM_na"; + else if (status == STATUS_DND) + icon = "SIM_dnd"; + else if (status == STATUS_OCCUPIED) + icon = "SIM_occupied"; + else if (status == STATUS_FFC) + icon = "SIM_ffc"; + else if (status == STATUS_OFFLINE) + icon = "SIM_offline"; + text = d->text; + break; + } + } + } + } + } + } + + Command cmd; + cmd->id = CmdStatusBar; + cmd->text = text; + cmd->icon = icon; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0x6000; + cmd->popup_id = MenuStatus; + cmd->flags = BTN_PICT; + + if (m_bInitialized) + EventCommandChange(cmd).process(); + else + EventCommandCreate(cmd).process(); + + m_bInitialized = true; + + EventSetMainIcon(icon).process(); + EventSetMainText(text).process(); +} + +void CommonStatus::timeout() +{ + m_bBlink = !m_bBlink; + setBarStatus(); +} + +void CommonStatus::rebuildStatus() +{ + MAP_STATUS status; + unsigned nClients = getContacts()->nClients(); + if (nClients == 0) + return; + int nInvisible = -1; + for (unsigned i = 0; i < nClients; i++){ + Client *client = getContacts()->getClient(i); + for (const CommandDef *cmd = client->protocol()->statusList(); !cmd->text.isEmpty(); cmd++) + { + MAP_STATUS::iterator it = status.find(cmd->id); + if (it == status.end()) + status.insert(MAP_STATUS::value_type(cmd->id, 1)); + else + it->second++; + } + if (!(nInvisible == -1 && client->protocol()->description()->flags & PROTOCOL_INVISIBLE)) + continue; + + nInvisible = i; + } + if (nInvisible != -1) + { + Command cmd; + cmd->id = CmdInvisible; + cmd->text = I18N_NOOP("&Invisible"); + cmd->icon = "SIM_invisible"; + cmd->menu_id = MenuStatus; + cmd->menu_grp = 0x2000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + } + Client *client = getContacts()->getClient(0); + unsigned id = 0x1000; + unsigned long FirstStatus = 0; + unsigned long ManualStatus = 0; + for (const CommandDef *cmd = client->protocol()->statusList(); !cmd->text.isEmpty(); cmd++) + { + MAP_STATUS::iterator it = status.find(cmd->id); + if (it == status.end()) + continue; + if (it->second != nClients) + continue; + CommandDef c = *cmd; + if (FirstStatus == 0) + FirstStatus = cmd->id; + if ((ManualStatus == 0) && (CorePlugin::instance()->getManualStatus() == cmd->id)) + ManualStatus = cmd->id; + if (c.id == STATUS_ONLINE) + c.icon = "SIM_online"; + else if (c.id == STATUS_AWAY) + c.icon = "SIM_away"; + else if (c.id == STATUS_NA) + c.icon = "SIM_na"; + else if (c.id == STATUS_DND) + c.icon = "SIM_dnd"; + else if (c.id == STATUS_OCCUPIED) + c.icon = "SIM_occupied"; + else if (c.id == STATUS_FFC) + c.icon = "SIM_ffc"; + else if (c.id == STATUS_OFFLINE) + c.icon = "SIM_offline"; + c.menu_id = MenuStatus; + c.menu_grp = id++; + c.flags = COMMAND_CHECK_STATE; + EventCommandCreate(&c).process(); + } + if (ManualStatus == 0) + ManualStatus = FirstStatus; + CorePlugin::instance()->setManualStatus(ManualStatus); + setBarStatus(); +} + +void CommonStatus::checkInvisible() +{ + bool bAllInvisible = true; + bool bAllNotInvisible = true; + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (!(client->protocol()->description()->flags & PROTOCOL_INVISIBLE)) + continue; + + if (client->getInvisible()) + bAllNotInvisible = false; + else + bAllInvisible = false; + } + + if (bAllNotInvisible && bAllInvisible) + return; + + if (bAllInvisible) + CorePlugin::instance()->setValue("Invisible", true); + if (bAllNotInvisible) + CorePlugin::instance()->setValue("Invisible", false); +} + +bool CommonStatus::processEvent(Event *e) +{ + switch (e->type()) + { + case eEventClientChanged: + checkInvisible(); + setBarStatus(); + break; + case eEventShowNotification: + { + EventShowNotification *ee = static_cast(e); + const EventNotification::ClientNotificationData &data = ee->data(); + for (list::iterator it = m_queue.begin(); it != m_queue.end(); ++it) + if (it->id == data.id) + return true; + BalloonItem item; + item.id = data.id; + item.client = data.client; + item.text = i18n(data.text); + if (!data.args.isEmpty()) + if (item.text.indexOf("%1") >= 0) + item.text = item.text.arg(data.args); + QString title = "SIM"; + if (getContacts()->nClients() > 1) + for (unsigned i = 0; i < getContacts()->nClients(); i++) + if (getContacts()->getClient(i) == data.client) + { + title = data.client->name(); + int n = title.indexOf("."); + if (n > 0) + title = title.left(n) + ' ' + title.mid(n + 1); + break; + } + item.text = QString(" %2

    ") + .arg((data.flags & EventNotification::ClientNotificationData::E_INFO) ? "info" : "error") + .arg(title) + quoteString(item.text) + "
    "; + if (data.options.isEmpty()) + item.buttons.append(i18n("OK")); + else { + QStringList sl = data.options.split(QLatin1Char('\0')); + Q_FOREACH(const QString &s, sl) + item.buttons.append(i18n(s)); + } + m_queue.push_back(item); + if (m_balloon == NULL) + showBalloon(); + break; + } + case eEventClientNotification: + { + EventClientNotification *ee = static_cast(e); + const EventNotification::ClientNotificationData &data = ee->data(); + if (data.code == AuthError) + { + QString msg; + if (!data.text.isEmpty()) + msg = i18n(data.text).arg(data.args); + ClientPtr client = SIM::getClientManager()->client(data.client->name()); + LoginDialog *loginDlg = new LoginDialog(false, client, msg, NULL); + raiseWindow(loginDlg); + } + else + { + EventShowNotification eShow(data); + eShow.process(); + } + return true; + } + case eEventClientStatus: + case eEventSocketActive: + case eEventInit: + setBarStatus(); + break; + case eEventClientsChanged: + { + bool bCommon = false; + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (client->getCommonStatus()) + bCommon = true; + } + if (!bCommon) + { + Client *client = getContacts()->getClient(0); + if (client) + { + client->setCommonStatus(true); + EventClientChanged(client).process(); + } + } + checkInvisible(); + rebuildStatus(); + break; + } + case eEventCheckCommandState: + { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *def = ecs->cmd(); + if (def->menu_id == MenuStatus) + { + if (def->id == CmdInvisible) + { + if (CorePlugin::instance()->value("Invisible").toBool()) + def->flags |= COMMAND_CHECKED; + else + def->flags &= ~COMMAND_CHECKED; + return true; + } + Client *client = getContacts()->getClient(0); + if (client == NULL) + return 0; + const CommandDef *curStatus = NULL; + const CommandDef *d; + for (d = client->protocol()->statusList(); !d->text.isEmpty(); d++) + if (d->id == def->id) + curStatus = d; + if (curStatus == NULL) + return 0; + bool bChecked = false; + unsigned status = CorePlugin::instance()->getManualStatus(); + bChecked = (status == curStatus->id); + + if (bChecked) + def->flags |= COMMAND_CHECKED; + else + def->flags &= ~COMMAND_CHECKED; + return true; + } + return 0; + } + case eEventCommandExec:{ + EventCommandExec *ece = static_cast(e); + CommandDef *def = ece->cmd(); + if (def->menu_id == MenuStatus) + { + if (def->id == CmdInvisible) + { + CorePlugin::instance()->setValue("Invisible", !CorePlugin::instance()->value("Invisible").toBool()); + for (unsigned i = 0; i < getContacts()->nClients(); i++) + getContacts()->getClient(i)->setInvisible(CorePlugin::instance()->value("Invisible").toBool()); + return true; + } + Client *client = getContacts()->getClient(0); + if (client == NULL) + return 0; + const CommandDef *curStatus = NULL; + const CommandDef *d; + for (d = client->protocol()->statusList(); !d->text.isEmpty(); d++) + if (d->id == def->id) + curStatus = d; + if (curStatus == NULL) + return false; + bool bOfflineStatus = false; + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (!(client->getCommonStatus() && client->protocol()->description()->flags & PROTOCOL_AR_OFFLINE)) + continue; + + bOfflineStatus = true; + break; + } + + if (bOfflineStatus || + (def->id != STATUS_ONLINE && def->id != STATUS_OFFLINE)){ + QString noShow = CorePlugin::instance()->propertyHub()->stringMapValue("NoShowAutoReply", def->id); + if (noShow.isEmpty()) + { + AutoReplyDialog dlg(def->id); + if (!dlg.exec()) + return true; + } + } + CorePlugin::instance()->setManualStatus(def->id); + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (client->getCommonStatus()) + client->setStatus(def->id, true); + } + return true; + } + break; + } + default: + break; + } + return false; +} + +void CommonStatus::showBalloon() +{ + if (m_balloon || m_queue.empty()) + return; + Command cmd; + cmd->id = CmdStatusBar; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *widget = eWidget.widget(); + if (widget == NULL){ + m_queue.erase(m_queue.begin()); + return; + } + BalloonItem &item = m_queue.front(); + if (CorePlugin::instance()->m_statusWnd) + m_balloon = CorePlugin::instance()->m_statusWnd->showError(item.text, item.buttons, item.client); + if (m_balloon == NULL) + m_balloon = new BalloonMsg(NULL, item.text, item.buttons, widget); + connect(m_balloon, SIGNAL(yes_action(void*)), this, SLOT(yes_action(void*))); + connect(m_balloon, SIGNAL(finished()), this, SLOT(finished())); + raiseWindow(widget->topLevelWidget()); + m_balloon->show(); +} + +void CommonStatus::yes_action(void*) +{ + if (!m_queue.empty() && m_balloon) + { + m_balloon->hide(); + BalloonItem &item = m_queue.front(); + Command cmd; + cmd->id = item.id; + cmd->param = item.client; + EventCommandExec(cmd).process(); + } +} + +void CommonStatus::finished() +{ + m_balloon = NULL; + if (!m_queue.empty()) + m_queue.erase(m_queue.begin()); + QTimer::singleShot(1000, this, SLOT(showBalloon())); +} + diff --git a/plugins/_core/status.h b/plugins/_core/status.h new file mode 100644 index 0000000..ddff721 --- /dev/null +++ b/plugins/_core/status.h @@ -0,0 +1,68 @@ +/*************************************************************************** + status.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _STATUS_H +#define _STATUS_H + +#include + +#include +#include +#include + +#include "event.h" + +using namespace std; + +class QTimer; +class CorePlugin; +class BalloonMsg; + +struct BalloonItem +{ + QString text; + QStringList buttons; + unsigned id; + SIM::Client *client; +}; + +class CommonStatus : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + CommonStatus(); + ~CommonStatus(); +protected slots: + void timeout(); + void setBarStatus(); + void yes_action(void*); + void finished(); + void showBalloon(); +protected: + QTimer *m_timer; + virtual bool processEvent(SIM::Event*); + void rebuildStatus(); + void checkInvisible(); + bool m_bInitialized; + bool m_bBlink; + bool m_bConnected; + BalloonMsg *m_balloon; + list m_queue; +}; + +#endif + diff --git a/plugins/_core/statuswnd.cpp b/plugins/_core/statuswnd.cpp new file mode 100644 index 0000000..f28c35b --- /dev/null +++ b/plugins/_core/statuswnd.cpp @@ -0,0 +1,388 @@ +/*************************************************************************** + statuswnd.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "statuswnd.h" +#include "core.h" +#include "log.h" + +#include "contacts/client.h" +#include "socket/socket.h" +#include "socket/socketfactory.h" +#include "simgui/ballonmsg.h" +#include "simgui/toolbtn.h" + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +StatusLabel::StatusLabel(QWidget *parent, Client *client, unsigned id) + : QLabel(parent) +{ + m_client = client; + m_bBlink = false; + m_id = id; + m_blinkTimer = NULL; + setPict(); +} + +void StatusLabel::startBlinkTimer() +{ + if (m_blinkTimer == NULL) { + m_blinkTimer = new QTimer(this); + connect(m_blinkTimer, SIGNAL(timeout()), this, SLOT(timeout())); + m_blinkTimer->start(1000); + m_bBlink = false; + } +} + +void StatusLabel::stopBlinkTimer() +{ + if (m_blinkTimer) { + delete m_blinkTimer; + m_blinkTimer = NULL; + } +} + +void StatusLabel::setPict() +{ + QIcon icon; + QString text; + if (m_client->getState() == Client::Connecting) { + if (getSocketFactory()->isActive()) { + IMStatusPtr status; + startBlinkTimer(); + text = I18N_NOOP("Connecting"); + if(m_client->protocol()) { + if (m_bBlink) { + status = m_client->currentStatus(); + } else { + status = m_client->protocol()->status("offline"); + } + icon = status->icon(); + } else { + icon = m_bBlink ? Icon("online") : Icon("offline"); + } + } else { + stopBlinkTimer(); + // TODO retreive appropriate icon + icon = Icon("inactive"); + text = I18N_NOOP("Inactive"); + } + } + else + { + stopBlinkTimer(); + if (m_client->getState() == Client::Error) { + icon = Icon("error"); + text = I18N_NOOP("Error"); + } else { + icon = m_client->currentStatus()->icon(); + text = m_client->currentStatus()->name(); + } + } + QPixmap p = icon.pixmap(size()); + setPixmap(p); + QString tip = CorePlugin::instance()->clientName(m_client); + tip += '\n'; + tip += i18n(text); + setToolTip(tip); + resize(p.width(), p.height()); + setFixedSize(p.width(), p.height()); +} + +void StatusLabel::timeout() +{ + m_bBlink = !m_bBlink; + setPict(); +} + +void StatusLabel::fillStatusMenu(QMenu& menu) +{ + menu.clear(); + menu.setTitle(m_client->name()); + QStringList statusNames = m_client->protocol()->statuses(); + foreach(const QString& statusId, statusNames) { + IMStatusPtr status = m_client->protocol()->status(statusId); + QAction* action = menu.addAction(status->icon(), status->name()); + action->setProperty("status_id", status->id()); + } +} + +void StatusLabel::mousePressEvent(QMouseEvent *me) +{ + if(me->button() == Qt::RightButton) + { + QMenu statusMenu; + fillStatusMenu(statusMenu); + if(!statusMenu.isEmpty()) { + QAction* action = statusMenu.exec(CToolButton::popupPos(this, &statusMenu)); + if(action) { + IMStatusPtr status = m_client->protocol()->status(action->property("status_id").toString()); + if(!status) + { + log(L_WARN, "Invalid status requested: %s (%s)", qPrintable(action->property("status_id").toString()), qPrintable(m_client->name())); + return; + } + CorePlugin::instance()->changeClientStatus(m_client, status); + } + } + } +} + +StatusFrame::StatusFrame(QWidget *parent) : QFrame(parent), EventReceiver(LowPriority + 1) +{ + log(L_DEBUG, "StatusFrame::StatusFrame()"); + setFrameStyle(NoFrame); + setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); + m_frame = new QFrame(this); + m_frame->show(); + m_lay = new QHBoxLayout(m_frame); + m_lay->setMargin(1); + m_lay->setSpacing(2); + m_lay->addStretch(); + addClients(); +} + +void StatusFrame::mousePressEvent(QMouseEvent *me) +{ + if (me->button() == Qt::RightButton){ + Command cmd; + cmd->id = MenuConnections; + EventMenuGet e(cmd); + e.process(); + QMenu *popup = e.menu(); + if (popup) + popup->popup(me->globalPos()); + } +} + +bool StatusFrame::processEvent(Event *e) +{ + switch (e->type()){ + case eEventSocketActive: { + const QList list = findChildren(); + Q_FOREACH(StatusLabel *lbl, list) { + lbl->setPict(); + } + break; + } + case eEventCheckCommandState: + { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if ((cmd->menu_id == MenuStatusWnd) && (cmd->id == CmdStatusWnd)){ + unsigned n = 0; + const QList list = findChildren(); + Q_FOREACH(StatusLabel *lbl, list) { + if (lbl->x() + lbl->width() > width()) + n++; + } + CommandDef *cmds = new CommandDef[n + 1]; + n = 0; + Q_FOREACH(StatusLabel *lbl, list) { + if (lbl->x() + lbl->width() > width()) { + cmds[n].id = 1; + cmds[n].text = "_"; + cmds[n].text_wrk = CorePlugin::instance()->clientName(lbl->m_client); + cmds[n].popup_id = lbl->m_id; + if (lbl->m_client->getState() == Client::Error) { + cmds[n].icon = "error"; + } else { + Protocol *protocol = lbl->m_client->protocol(); + const CommandDef *cmd = protocol->description(); + cmds[n].icon = cmd->icon; + for (cmd = protocol->statusList(); !cmd->text.isEmpty(); cmd++) { + if (cmd->id == lbl->m_client->getStatus()) { + cmds[n].icon = cmd->icon; + break; + } + } + } + n++; + } + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + break; + } + case eEventClientsChanged: + addClients(); + break; + case eEventClientChanged:{ + EventClientChanged *ecc = static_cast(e); + StatusLabel *lbl = findLabel(ecc->client()); + if (lbl) + lbl->setPict(); + break; + } + case eEventIconChanged:{ + const QList list = findChildren(); + Q_FOREACH(StatusLabel *lbl, list) { + lbl->setPict(); + } + break; + } + default: + break; + } + return false; +} + +void StatusFrame::addClients() +{ + const QList list = findChildren(); + Q_FOREACH(StatusLabel *lbl, list) { + delete lbl; + } + for (unsigned i = 0; i < getContacts()->nClients(); i++) { + Client *client = getContacts()->getClient(i); + QWidget *w = new StatusLabel(m_frame, client, CmdClient + i); + m_lay->addWidget(w); + w->show(); + } + adjustPos(); + repaint(); +} + +StatusLabel *StatusFrame::findLabel(Client *client) +{ + const QList list = findChildren(); + Q_FOREACH(StatusLabel *lbl, list) { + if (lbl->m_client == client) + return lbl; + } + return NULL; +} + +QSize StatusFrame::sizeHint() const +{ + QSize res = m_frame->sizeHint(); + res.setWidth(20); + return res; +} + +QSize StatusFrame::minimumSizeHint() const +{ + QSize res = m_frame->minimumSizeHint(); + res.setWidth(20); + return res; +} + +void StatusFrame::resizeEvent(QResizeEvent *e) +{ + QFrame::resizeEvent(e); + adjustPos(); +} + +void StatusFrame::adjustPos() +{ + QSize s = m_frame->minimumSizeHint(); + m_frame->resize(s); + m_frame->move(width() > s.width() ? width() - s.width() : 0, 0); + emit showButton(width() < s.width()); + repaint(); + m_frame->repaint(); + const QList list = findChildren(); + Q_FOREACH(StatusLabel *lbl, list) { + lbl->repaint(); + } +} + +static const char * const arrow_h_xpm[] = { + "9 7 3 1", + " c None", + ". c #000000", + "+ c none", + "..++..+++", + "+..++..++", + "++..++..+", + "+++..++..", + "++..++..+", + "+..++..++", + "..++..+++"}; + +StatusWnd::StatusWnd() : QFrame(NULL) +{ + log(L_DEBUG, "StatusWnd::StatusWnd()"); + setFrameStyle(NoFrame); + m_lay = new QHBoxLayout(this); + m_lay->setMargin(0); + m_frame = new StatusFrame(this); + m_btn = new QToolButton(this); + m_btn->setAutoRaise(true); + QIcon icon( QPixmap((const char **)arrow_h_xpm) ); + m_btn->setIcon( icon ); + m_btn->setMinimumSize(QSize(10, 10)); + m_lay->addWidget(m_frame); + m_lay->addWidget(m_btn); + connect(m_frame, SIGNAL(showButton(bool)), this, SLOT(showButton(bool))); + connect(m_btn, SIGNAL(clicked()), this, SLOT(clicked())); + EventAddWidget(this, true, EventAddWidget::eStatusWindow).process(); +} + +void StatusWnd::showButton(bool bState) +{ + if (bState){ + m_btn->show(); + }else{ + m_btn->hide(); + } +} + +void StatusWnd::clicked() +{ + Command cmd; + cmd->popup_id = MenuStatusWnd; + cmd->flags = COMMAND_NEW_POPUP; + EventMenuGet e(cmd); + e.process(); + QMenu *popup = e.menu(); + if (popup){ + QPoint pos = CToolButton::popupPos(m_btn, popup); + popup->popup(pos); + } +} + +BalloonMsg *StatusWnd::showError(const QString &text, QStringList &buttons, Client *client) +{ + if (!isVisible()) + return NULL; + StatusLabel *lbl = m_frame->findLabel(client); + if (lbl == NULL) + return NULL; + if (lbl->x() + lbl->width() > width()) + return NULL; + return new BalloonMsg(NULL, text, buttons, lbl); +} + diff --git a/plugins/_core/statuswnd.h b/plugins/_core/statuswnd.h new file mode 100644 index 0000000..2d3d059 --- /dev/null +++ b/plugins/_core/statuswnd.h @@ -0,0 +1,98 @@ +/*************************************************************************** + statuswnd.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _STATUSWND_H +#define _STATUSWND_H + + +#include "event.h" +#include +#include +#include +#include +#include + +class CorePlugin; + +class QHBoxLayout; +class QTimer; +class QToolButton; +class BalloonMsg; + +class StatusLabel : public QLabel +{ + Q_OBJECT +public: + StatusLabel(QWidget *parent, SIM::Client *client, unsigned id); + +protected slots: + void timeout(); + +protected: + void mousePressEvent(QMouseEvent *e); + +private: + void setPict(); + void fillStatusMenu(QMenu& menu); + void startBlinkTimer(); + void stopBlinkTimer(); + QTimer *m_blinkTimer; + SIM::Client *m_client; + unsigned m_id; + bool m_bBlink; + friend class StatusFrame; + +}; + +class StatusFrame : public QFrame, public SIM::EventReceiver +{ + Q_OBJECT +public: + StatusFrame(QWidget *parent); + void adjustPos(); + StatusLabel *findLabel(SIM::Client*); +signals: + void showButton(bool); +protected slots: + void addClients(); +protected: + virtual void resizeEvent(QResizeEvent*); + virtual void mousePressEvent(QMouseEvent *e); + virtual bool processEvent(SIM::Event*); + virtual QSize sizeHint() const; + virtual QSize minimumSizeHint() const; + QFrame *m_frame; + QHBoxLayout *m_lay; +}; + +class StatusWnd : public QFrame +{ + Q_OBJECT +public: + StatusWnd(); + BalloonMsg *showError(const QString &text, QStringList &buttons, SIM::Client *client); +protected slots: + void showButton(bool); + void clicked(); +protected: + StatusFrame *m_frame; + QHBoxLayout *m_lay; + QToolButton *m_btn; +}; + +#endif + diff --git a/plugins/_core/styles/CMakeLists.txt b/plugins/_core/styles/CMakeLists.txt new file mode 100644 index 0000000..97d694f --- /dev/null +++ b/plugins/_core/styles/CMakeLists.txt @@ -0,0 +1,30 @@ +# install only + +FILE(GLOB styles *.xsl) + +IF(MSVC_IDE) + FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/debug/styles) + FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/release/styles) +ELSE(MSVC_IDE) + IF(APPLE) + FILE(MAKE_DIRECTORY ${SIM_STYLES_DIR}) + ELSE(APPLE) + FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/styles) + ENDIF(APPLE) +ENDIF(MSVC_IDE) + +FOREACH(FILE ${styles}) + GET_FILENAME_COMPONENT(FILENAME ${FILE} NAME) + IF(MSVC_IDE) + CONFIGURE_FILE(${FILE} ${CMAKE_BINARY_DIR}/debug/styles/${NAME} COPYONLY) + CONFIGURE_FILE(${FILE} ${CMAKE_BINARY_DIR}/release/styles/${NAME} COPYONLY) + ELSE(MSVC_IDE) + IF(APPLE) + CONFIGURE_FILE(${FILE} ${SIM_STYLES_DIR}/${NAME} COPYONLY) + ELSE(APPLE) + CONFIGURE_FILE(${FILE} ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/styles/${NAME} COPYONLY) + ENDIF(APPLE) + ENDIF(MSVC_IDE) +ENDFOREACH(FILE) + +INSTALL(FILES ${styles} DESTINATION ${SIM_STYLES_DIR}) diff --git a/plugins/_core/styles/SIM.2.xsl b/plugins/_core/styles/SIM.2.xsl new file mode 100644 index 0000000..45cdbd8 --- /dev/null +++ b/plugins/_core/styles/SIM.2.xsl @@ -0,0 +1,70 @@ + + + +

    +background-color:;color:; + +

    +

    +  +

    + + \ No newline at end of file diff --git a/plugins/_core/styles/SIM.3.xsl b/plugins/_core/styles/SIM.3.xsl new file mode 100644 index 0000000..505f9f7 --- /dev/null +++ b/plugins/_core/styles/SIM.3.xsl @@ -0,0 +1,54 @@ + + + +

    + + + +#808080 + + + +:: + + +msg:// + + + + + + + +font-weight:600 + + + + + +#800000 + + +#000080 + + + +msg:// + + + + + + + + +:: + + + +

    +background-color:;color:; + +

    +
    +
    \ No newline at end of file diff --git a/plugins/_core/styles/SIM.4.(2+3).xsl b/plugins/_core/styles/SIM.4.(2+3).xsl new file mode 100644 index 0000000..f651e54 --- /dev/null +++ b/plugins/_core/styles/SIM.4.(2+3).xsl @@ -0,0 +1,57 @@ + + + +

    + + + +#808080 + + + +:: + + +msg:// + + + + + + + +font-weight:600 + + + + + +#800000 + + +#000080 + + + +msg:// + + + + + + + + +:: + + + +

    +background-color:;color:; + +

    +

    +  +

    +
    +
    \ No newline at end of file diff --git a/plugins/_core/styles/SIM.5.2.2.xsl b/plugins/_core/styles/SIM.5.2.2.xsl new file mode 100644 index 0000000..d439c06 --- /dev/null +++ b/plugins/_core/styles/SIM.5.2.2.xsl @@ -0,0 +1,160 @@ + + + + + + +
    + + + + + + +#e5e5e5 + + +#b0b0b0 + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +msg:// +sim:icons/ + +  + + + + +  + + + + + +  + + + + + +  + + + + + + + + + +font-weight:600 + + + + + + +#800000 + + +#000080 + + + + + + + + + +#ffffff + + + + +:: + +
    + + + + + + + + +

    + +sim:icons/ +  + + + + + + +:: + + + --> + +

    +
    + + + + +

    + +

    +
    +
    + + + + +

    +  +

    + + +
    +
    \ No newline at end of file diff --git a/plugins/_core/styles/SIM.5.2.3.xsl b/plugins/_core/styles/SIM.5.2.3.xsl new file mode 100644 index 0000000..a01629e --- /dev/null +++ b/plugins/_core/styles/SIM.5.2.3.xsl @@ -0,0 +1,160 @@ + + + + + + +
    + + + + + + +#e5e5e5 + + +#b0b0b0 + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +msg:// +sim:icons/ + +  + + + + +  + + + + + +  + + + + + +  + + + + + + + + + +font-weight:600 + + + + + + +#800000 + + +#000080 + + + + + + + + + +#ffffff + + + + +:: + +
    + + + + + + + + +

    + +sim:icons/ +  + + + + + + +:: + + + --> + +

    +
    + + + + + + + + +
    + + + + +

    +  +

    + + +
    +
    \ No newline at end of file diff --git a/plugins/_core/styles/SIM.5.2.4.xsl b/plugins/_core/styles/SIM.5.2.4.xsl new file mode 100644 index 0000000..9952c6b --- /dev/null +++ b/plugins/_core/styles/SIM.5.2.4.xsl @@ -0,0 +1,167 @@ + + + + + + +
    + + + + + + +#e5e5e5 + + +#b0b0b0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +msg:// +sim:icons/ + +  + + + + +  + + + + + +  + + + + + +  + + + + + + + + + +font-weight:600 + + + + + + +#800000 + + +#000080 + + + + + + + + + +#ffffff + + + + +:: + +
    + + + + + +#00C183 +

    + +sim:icons/ +  + + + +#000000 + + + +:: + + + --> + +

    +
    + + + + +#e5e5e5 +

    + +

    +
    + +#b0b0b0 +

    + +

    +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/plugins/_core/styles/SIM.5.2.5.xsl b/plugins/_core/styles/SIM.5.2.5.xsl new file mode 100644 index 0000000..0b90a05 --- /dev/null +++ b/plugins/_core/styles/SIM.5.2.5.xsl @@ -0,0 +1,167 @@ + + + + + + + + + + + + + +#e5e5e5 + + +#b0b0b0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +msg:// +sim:icons/ + +  + + + + +  + + + + + +  + + + + + +  + + + + + + + + + +font-weight:600 + + + + + + +#800000 + + +#000080 + + + + + + + + + +#ffffff + + + + +:: + +
    + + + + + +#00C183 +

    + +sim:icons/ +  + + + +#000000 + + + +:: + + + --> + +

    +
    + + + + +#e5e5e5 +

    + +

    +
    + +#b0b0b0 +

    + +

    +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/plugins/_core/styles/SIM.5.2.xsl b/plugins/_core/styles/SIM.5.2.xsl new file mode 100644 index 0000000..b3f1ef8 --- /dev/null +++ b/plugins/_core/styles/SIM.5.2.xsl @@ -0,0 +1,160 @@ + + + + + + +
    + + + + + + +#e5e5e5 + + +#b0b0b0 + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +msg:// +sim:icons/ + +  + + + + +  + + + + + +  + + + + + +  + + + + + + + + + +font-weight:600 + + + + + + +#800000 + + +#000080 + + + + + + + + + +#ffffff + + + + +:: + +
    + + + + + + + + +

    + +sim:icons/ +  + + + + + + +:: + + + --> + +

    +
    + + + + +

    + +

    +
    +
    + + + + +

    +  +

    + + +
    +
    \ No newline at end of file diff --git a/plugins/_core/styles/SIM.5.xsl b/plugins/_core/styles/SIM.5.xsl new file mode 100644 index 0000000..86eb191 --- /dev/null +++ b/plugins/_core/styles/SIM.5.xsl @@ -0,0 +1,162 @@ + + + + + + +
    + + + + + + +#e5e5e5 + + +#b0b0b0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +msg:// +sim:icons/ + +  + + + + +  + + + + + +  + + + + + +  + + + + + + + +font-weight:600 + + + + + + +#800000 + + +#000080 + + + + + + + + + +#ffffff + + + + +:: + +
    + + + + + + + + +

    + +sim:icons/ +  + + + + + + +:: + + + --> + +

    +
    + + + + +

    + +

    +
    +
    + + + + +

    +  +

    + + +
    +
    \ No newline at end of file diff --git a/plugins/_core/styles/SIM.xsl b/plugins/_core/styles/SIM.xsl new file mode 100644 index 0000000..50bc9dd --- /dev/null +++ b/plugins/_core/styles/SIM.xsl @@ -0,0 +1,64 @@ + + + +

    + +msg:// + +sim:icons/ + + + + + + + + + + + + + + + +#808080 + + + +:: + + + + + + + +font-weight:600 + + + + + +#800000 + + +#000080 + + + + + + + + + +:: + + + +

    +background-color:;color:; + +

    +
    +
    \ No newline at end of file diff --git a/plugins/_core/styles/Separated.2.xsl b/plugins/_core/styles/Separated.2.xsl new file mode 100644 index 0000000..49f6b6d --- /dev/null +++ b/plugins/_core/styles/Separated.2.xsl @@ -0,0 +1,71 @@ + + + + + +
    + + +#cccccc + + +#fafafa + + + + + + + + + +
    + +msg:// + +sim:icons/ + + + +  + + + +  + + + +  + + + + + +font-weight:600 + + + +#660000 + + +#000066 + + + + + + + +:: + +
    + + + + +color:; + + +
    +
    +
    diff --git a/plugins/_core/styles/Separated.3.xsl b/plugins/_core/styles/Separated.3.xsl new file mode 100644 index 0000000..331df14 --- /dev/null +++ b/plugins/_core/styles/Separated.3.xsl @@ -0,0 +1,54 @@ + + + + + +
    + + +#cccccc + + +#fafafa + + + + + + + + +
    + + +font-weight:600 + + + +#660000 + + +#000066 + + +msg:// + + + + + + + +:: + +
    + + + + +color:; + + +
    +
    +
    diff --git a/plugins/_core/styles/Separated.4.xsl b/plugins/_core/styles/Separated.4.xsl new file mode 100644 index 0000000..d6e5c3b --- /dev/null +++ b/plugins/_core/styles/Separated.4.xsl @@ -0,0 +1,67 @@ + + + + + + + +#cccccc + + +#fafafa + + + + + + + + + +
    + +msg:// + +sim:icons/ + + + + + + + + + + + + + + +font-weight:600 + + + +#660000 + + +#000066 + + + + + + + +:: + +
    + + + + +color:; + + +
    +
    +
    diff --git a/plugins/_core/styles/Separated.5.(2+3).xsl b/plugins/_core/styles/Separated.5.(2+3).xsl new file mode 100644 index 0000000..7eb0930 --- /dev/null +++ b/plugins/_core/styles/Separated.5.(2+3).xsl @@ -0,0 +1,54 @@ + + + + + +
    + + +#cccccc + + +#fafafa + + + + + + + + +
    + + +font-weight:600 + + + +#660000 + + +#000066 + + +msg:// + + + + + + + +:: + +
    + + + + +color:; + + +
    +
    +
    diff --git a/plugins/_core/styles/Separated.6.(2+4).xsl b/plugins/_core/styles/Separated.6.(2+4).xsl new file mode 100644 index 0000000..070d59b --- /dev/null +++ b/plugins/_core/styles/Separated.6.(2+4).xsl @@ -0,0 +1,70 @@ + + + + + + + +#cccccc + + +#fafafa + + + + + + + + + +
    + +msg:// + +sim:icons/ + + + +  + + + +  + + + +  + + + + + +font-weight:600 + + + +#660000 + + +#000066 + + + + + + + +:: + +
    + + + + +color:; + + +
    +
    +
    diff --git a/plugins/_core/styles/Separated.7.(3+4).xsl b/plugins/_core/styles/Separated.7.(3+4).xsl new file mode 100644 index 0000000..2fe3582 --- /dev/null +++ b/plugins/_core/styles/Separated.7.(3+4).xsl @@ -0,0 +1,53 @@ + + + + + + + +#cccccc + + +#fafafa + + + + + + + + +
    + + +font-weight:600 + + + +#660000 + + +#000066 + + +msg:// + + + + + + + +:: + +
    + + + + +color:; + + +
    +
    +
    diff --git a/plugins/_core/styles/Separated.8.(2+3+4).xsl b/plugins/_core/styles/Separated.8.(2+3+4).xsl new file mode 100644 index 0000000..8da4beb --- /dev/null +++ b/plugins/_core/styles/Separated.8.(2+3+4).xsl @@ -0,0 +1,53 @@ + + + + + + + +#cccccc + + +#fafafa + + + + + + + + +
    + + +font-weight:600 + + + +#660000 + + +#000066 + + +msg:// + + + + + + + +:: + +
    + + + + +color:; + + +
    +
    +
    diff --git a/plugins/_core/styles/Separated.xsl b/plugins/_core/styles/Separated.xsl new file mode 100644 index 0000000..eb69d98 --- /dev/null +++ b/plugins/_core/styles/Separated.xsl @@ -0,0 +1,68 @@ + + + + + +
    + + +#cccccc + + +#fafafa + + + + + + + + + +
    + +msg:// + +sim:icons/ + + + + + + + + + + + + + + +font-weight:600 + + + +#660000 + + +#000066 + + + + + + + +:: + +
    + + + + +color:; + + +
    +
    +
    diff --git a/plugins/_core/styles/XChat.xsl b/plugins/_core/styles/XChat.xsl new file mode 100644 index 0000000..f19d38a --- /dev/null +++ b/plugins/_core/styles/XChat.xsl @@ -0,0 +1,47 @@ + + + + + + + +#808080 + +[:] + < + +> + + + + + + + + +font-weight:600 + +[:] + < + + + +#800000 + + +#000080 + + + + +> + + + +background-color:;color:; + + + + + + diff --git a/plugins/_core/styles/XChat2seconds.xsl b/plugins/_core/styles/XChat2seconds.xsl new file mode 100644 index 0000000..6c420a7 --- /dev/null +++ b/plugins/_core/styles/XChat2seconds.xsl @@ -0,0 +1,47 @@ + + + + + + + + +#808080 +[::] + < + +> + + + + + + + + +font-weight:600 + +[::] + < + + + +#800000 + + +#000080 + + + + +> + + + +background-color:;color:; + + + + + + diff --git a/plugins/_core/styles/XChat3fullDate.xsl b/plugins/_core/styles/XChat3fullDate.xsl new file mode 100644 index 0000000..8ec6961 --- /dev/null +++ b/plugins/_core/styles/XChat3fullDate.xsl @@ -0,0 +1,47 @@ + + + + + + + + +#808080 +[::] + < + +> + + + + + + + + +font-weight:600 + +[ ::] + < + + + +#800000 + + +#000080 + + + + +> + + + +background-color:;color:; + + + + + + diff --git a/plugins/_core/textedit_menu.cpp b/plugins/_core/textedit_menu.cpp new file mode 100644 index 0000000..1113f53 --- /dev/null +++ b/plugins/_core/textedit_menu.cpp @@ -0,0 +1,138 @@ +/*************************************************************************** + textedit_menu.cpp + + This file contains subroutine that creates MenuTextEdit menu and adds some + of it's items. Items that created in other places are mentioned here as a + comments. MenuTextEdit is used as context menu in any multiline text input + areas, including MsgEdit area, and also in some non-editable text view + areas, witch is also based on such TextShow class, such as log view area in + networkmonitor, etc. + ------------------- + begin : Tue Nov 26 2008 + based on : core.cpp of Sim-IM by Vladimir Shutoff + and Sim-IM team + copyright : (C) 2002 - 2004 Vladimir Shutoff + (C) 2004 - 2008 Sim-IM Development Team + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "core.h" +#include "kdeisversion.h" // for KDE_IS_VERSION + +using namespace SIM; + +void CorePlugin::createMenuTextEdit() +{ + EventMenu(MenuTextEdit, EventMenu::eAdd).process(); + + Command cmd; + + /***** ????????? (CmdSpell, grp=0x0100) *****/ + // Some strange menu item is created here by constructor of spell plugin + // What does it do you should find out yourself + + cmd->id = CmdUndo; + cmd->text = I18N_NOOP("&Undo"); + cmd->accel = "Ctrl+Z"; + cmd->icon = "undo"; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x1000; + cmd->bar_id = 0; + cmd->bar_grp = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + + cmd->id = CmdRedo; + cmd->text = I18N_NOOP("&Redo"); + cmd->accel = "Ctrl+Y"; + cmd->icon = "redo"; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x1001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdCut; + cmd->text = I18N_NOOP("Cu&t"); + cmd->icon = "editcut"; + cmd->accel = "Ctrl+X"; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x2000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdCopy; + cmd->text = I18N_NOOP("&Copy"); + cmd->icon = "editcopy"; + cmd->accel = "Ctrl+C"; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x2001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdPaste; + cmd->text = I18N_NOOP("&Paste"); + cmd->icon = "editpaste"; + cmd->accel = "Ctrl+V"; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x2002; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdClear; + cmd->text = I18N_NOOP("Clear"); + cmd->icon = QString::null; + cmd->accel = QString::null; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x3000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSelectAll; + cmd->text = I18N_NOOP("Select All"); + cmd->icon = QString::null; + cmd->accel = "Ctrl+A"; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x3001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + +#ifdef USE_KDE +#if KDE_IS_VERSION(3,2,0) + cmd->id = CmdEnableSpell; + cmd->text = I18N_NOOP("Enable spell check"); + cmd->icon = QString::null; // TODO: Add KDE spellcheck icon here... may be slightly modified + cmd->accel = QString::null; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x4000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSpell; + cmd->text = I18N_NOOP("Spell check"); + cmd->icon = QString::null; // TODO: Add KDE spellcheck icon here... + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x4001; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); +#endif +#endif + + /***** Ignore this phrase (CmdIgnoreText, grp=0x7000) *****/ + // This menu item should be created by constructor of filter plugin, but for some reason + // it is not visible, where it should be. + // TODO: findout why 'Ignore this phrase' is always hidden + + /***** Copy &location (CmdCopyLocation, grp=0x7010 *****/ + // This menu item is created by constructor of navigate plugin + // TODO: findout why this 'Copy Location' item is always visible at msgedit box, even when there is no http link there + +} diff --git a/plugins/_core/tmpl.cpp b/plugins/_core/tmpl.cpp new file mode 100644 index 0000000..5cdf950 --- /dev/null +++ b/plugins/_core/tmpl.cpp @@ -0,0 +1,268 @@ +/*************************************************************************** + tmpl.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include "log.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/client.h" + +#include "core.h" + +#ifdef Q_OS_WIN +#include +#else +#include +#include +#endif + +#include +#include +#include + +#include "tmpl.h" +#include "socket/ip.h" + +using namespace std; +using namespace SIM; + +Tmpl::Tmpl(QObject *parent) + : QObject(parent) +{ +} + +Tmpl::~Tmpl() +{ +} + +bool Tmpl::processEvent(Event *e) +{ + if (e->type() == eEventTemplateExpand){ + EventTemplate *et = static_cast(e); + EventTemplate::TemplateExpand *t = et->templateExpand(); + TmplExpand tmpl; + tmpl.tmpl = *t; + tmpl.process = NULL; + tmpl.bReady = false; + if (!process(tmpl)) + tmpls.push_back(tmpl); + return true; + } + return false; +} + +void Tmpl::clear() +{ + for (QList::iterator it = tmpls.begin(); it != tmpls.end();){ + if (it->bReady && it->process){ + delete it->process; + it->process = NULL; + it->bReady = false; + if (process(*it)){ + tmpls.erase(it); + it = tmpls.begin(); + continue; + } + ++it; + } else { + ++it; + } + } +} + +void Tmpl::ready() +{ + for (QList::iterator it = tmpls.begin(); it != tmpls.end(); ++it){ + QProcess *p = it->process; + if (p && p->state() == QProcess::NotRunning){ + if (p->exitStatus() == QProcess::NormalExit){ + it->bReady = true; + p->setReadChannel(QProcess::StandardOutput); + it->res += QString::fromLocal8Bit(p->readAll()); + QTimer::singleShot(0, this, SLOT(clear())); + return; + } + } + } +} + +bool Tmpl::process(TmplExpand &t) +{ + QString head = getToken(t.tmpl.tmpl, '`', false); + t.res += process(t, head); + if (t.tmpl.tmpl.isEmpty()){ + t.tmpl.tmpl = t.res; + EventTemplateExpanded e(&t.tmpl); + t.tmpl.receiver->processEvent(&e); + e.setNoProcess(); + return true; + } + QString prg = getToken(t.tmpl.tmpl, '`', false); + prg = process(t, prg); + t.process = new QProcess(parent()); + connect(t.process, SIGNAL(processExited()), this, SLOT(ready())); + t.process->start(prg); + return false; +} + +QString Tmpl::process(TmplExpand &t, const QString &str) +{ + QString res; + QString s = str; + while (!s.isEmpty()){ + res += getToken(s, '&'); + if(s.isEmpty()) + break; + QString tag = getToken(s, ';'); + if (tag.isEmpty()) { + res += tag; + log(L_WARN, "Found '&' without ';' while parsing %s", qPrintable(str)); + continue; + } + Contact *contact; + if (tag.startsWith("My")){ + contact = getContacts()->owner(); + tag = tag.mid(2); + }else{ + contact = t.tmpl.contact; + } + + if (contact == NULL) + continue; + + if (tag == "TimeStatus"){ + QDateTime dt; + dt.setTime_t(CorePlugin::instance()->value("StatusTime").toUInt()); + res += dt.toString("hh:mm"); + continue; + } + + if (tag == "IntervalStatus"){ + res += QString::number(time(NULL) - CorePlugin::instance()->value("StatusTime").toUInt()); + continue; + } + + if (tag == "IP"){ + EventGetContactIP e(contact); + struct in_addr addr; + e.process(); + if (e.ip()) + addr.s_addr = e.ip()->ip(); + else + addr.s_addr = 0; + res += inet_ntoa(addr); + continue; + } + + if (tag == "Mail"){ + QString mails = contact->getEMails(); + QString mail = getToken(mails, ';', false); + res += getToken(mail, '/'); + continue; + } + + if (tag == "Phone"){ + QString phones = contact->getPhones(); + QString phone_item = getToken(phones, ';', false); + phone_item = getToken(phone_item, '/', false); + res += getToken(phone_item, ','); + continue; + } + + if (tag == "Unread"){ + unsigned nUnread = 0; + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + if (it->contact == contact->id()) + nUnread++; + } + res += QString::number(nUnread); + continue; + } + +// if (getTag(tag, &(contact->getGroup()), contact->dataDef(), res)) +// continue; + + clientData *data; + ClientDataIterator itc(contact->clientData); + while ((data = ++itc) != NULL){ + if (getTag(tag, &(data->Sign), itc.client()->protocol()->userDataDef(), res)) + break; + } + if (data) + continue; + +// UserDataDef *def; +// ContactList::UserDataIterator it; +// while ((def = ++it) != NULL){ +// SIM::Data *data = (SIM::Data*)contact->getUserData(def->id); +// if (data == NULL) +// continue; +// if (getTag(tag, data, def->def, res)){ +// break; +// } +// } + } + return res; +} + +bool Tmpl::getTag(const QString &name, SIM::Data *data, const DataDef *def, QString &res) +{ + const DataDef *d; + for (d = def; d->name; d++){ + if (name == d->name) + break; + data += d->n_values; + } + if (d->name == NULL) + return false; + + switch (d->type){ + case DATA_BOOL: + res += data->toBool() ? i18n("yes") : i18n("no"); + break; + case DATA_ULONG: + res += QString::number(data->toULong()); + break; + case DATA_LONG: + res += QString::number(data->toLong()); + break; + case DATA_STRING: + case DATA_UTF: + if(data->str().isEmpty()) + return false; // mabye we get a better one in the next contact + res += data->str(); + break; + case DATA_CSTRING: + if(data->cstr().isEmpty()) + return false; // mabye we get a better one in the next contact + // this is not encoded correct, but no other way atm + res += QString::fromLocal8Bit(data->cstr()); + break; + default: + break; + } + return true; +} + +/* +#ifndef NO_MOC_INCLUDES +#include "tmpl.moc" +#endif +*/ + + diff --git a/plugins/_core/tmpl.h b/plugins/_core/tmpl.h new file mode 100644 index 0000000..8db8ecc --- /dev/null +++ b/plugins/_core/tmpl.h @@ -0,0 +1,55 @@ +/*************************************************************************** + tmpl.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _TMPL_H +#define _TMPL_H + +#include +#include + +#include "event.h" +#include "misc.h" +#include "core_events.h" + +class QProcess; + +class Tmpl : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + Tmpl(QObject *parent); + ~Tmpl(); +protected slots: + void ready(); + void clear(); +protected: + struct TmplExpand + { + EventTemplate::TemplateExpand tmpl; + QProcess *process; + bool bReady; + QString res; + }; + virtual bool processEvent(SIM::Event*); + bool process(TmplExpand &t); + QString process(TmplExpand &t, const QString &str); + bool getTag(const QString &name, SIM::Data *data, const SIM::DataDef *def, QString &res); + QList tmpls; +}; + +#endif + diff --git a/plugins/_core/toolbar_container.cpp b/plugins/_core/toolbar_container.cpp new file mode 100644 index 0000000..d57fe88 --- /dev/null +++ b/plugins/_core/toolbar_container.cpp @@ -0,0 +1,143 @@ +/*************************************************************************** + toolbar_container.cpp + + This file contains subroutine that creates toolbar and it's submenu + for container window (One might call it chat-window, but in Sim-IM + terminology it is calld container). + Note that only static items are created here. Some items of MenuMessage + are created by MsgEdit::setupMessages(); (msgedit.cpp) while creating + message types. Some items somewhere else (I (shaplov) did not explore this + issue yet) + ------------------- + begin : Tue Nov 26 2008 + based on : core.cpp of Sim-IM by Vladimir Shutoff + and Sim-IM team + copyright : (C) 2002 - 2004 Vladimir Shutoff + (C) 2004 - 2008 Sim-IM Development Team + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "core.h" + +using namespace SIM; + +void CorePlugin::createContainerToolbar() +{ + Command cmd; + + EventToolbar(ToolBarContainer, EventToolbar::eAdd).process(); + + cmd->id = CmdMessageType; + cmd->text = I18N_NOOP("Message"); + cmd->icon = "message"; + cmd->bar_id = ToolBarContainer; + cmd->bar_grp = 0x2000; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->popup_id = MenuMessage; + cmd->flags = BTN_PICT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContainerContact; + cmd->text = I18N_NOOP("Contact"); + cmd->icon = "empty"; + cmd->bar_id = ToolBarContainer; + cmd->bar_grp = 0x6000; + cmd->popup_id = MenuContainerContact; + cmd->flags = BTN_PICT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdContactGroup; + cmd->text = I18N_NOOP("Group"); + cmd->icon = "grp_on"; + cmd->bar_id = ToolBarContainer; + cmd->bar_grp = 0x7000; + cmd->popup_id = MenuContactGroup; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdInfo; + cmd->text = I18N_NOOP("User &info"); + cmd->icon = "info"; + cmd->bar_id = ToolBarContainer; + cmd->bar_grp = 0x8000; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdHistory; + cmd->text = I18N_NOOP("&History"); + cmd->icon = "history"; + cmd->bar_id = ToolBarContainer; + cmd->bar_grp = 0x8010; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdChangeEncoding; + cmd->text = I18N_NOOP("Change &encoding"); + cmd->icon = "encoding"; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->bar_id = ToolBarContainer; + cmd->bar_grp = 0x8080; + cmd->popup_id = MenuEncoding; + cmd->flags = COMMAND_CHECK_STATE; + + EventCommandCreate(cmd).process(); + cmd->id = CmdClose; + cmd->text = I18N_NOOP("Close"); + cmd->icon = "exit"; + cmd->bar_id = ToolBarContainer; + cmd->bar_grp = 0xF000; + cmd->accel = "Esc"; + cmd->flags = COMMAND_DEFAULT; + cmd->popup_id = 0; + EventCommandCreate(cmd).process(); + + + // First menu of this tootbar: list of message types that can be sent to the contact + // displayed in chat window, and also list of different contact entities of meta-contact + // (if we have meta-contact) also with types of messages can be send to particular contact. + + // Some items ot this menu are added by MsgEdit::setupMessages(); (msgedit.cpp), witch is called at + // CorePlugin constructor, right after this function. MsgEdit::setupMessages() creates message + // types and creatins of message types creates menu item in MenuMessage (strange idea, isn't it?) + // And there are also plases where this menu is filled. Please use 'grep' to find them + + EventMenu(MenuMessage, EventMenu::eAdd).process(); + + cmd->id = CmdContactClients; + cmd->text = "_"; + cmd->icon = "NULL"; + cmd->bar_id = 0; + cmd->menu_id = MenuMessage; + cmd->menu_grp = 0x30FF; + cmd->accel = QString::null; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + + // Second menu of this toolbar: list of chats that are opened in this container + // To see where this menu is filled please use 'grep CmdContainerContacts *' + EventMenu(MenuContainerContact, EventMenu::eAdd).process(); + + cmd->id = CmdContainerContacts; + cmd->text = "_"; + cmd->icon = QString::null; + cmd->menu_id = MenuContainerContact; + cmd->menu_grp = 0x1000; + cmd->bar_id = 0; + cmd->bar_grp = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + +} diff --git a/plugins/_core/toolbar_history.cpp b/plugins/_core/toolbar_history.cpp new file mode 100644 index 0000000..da13fe9 --- /dev/null +++ b/plugins/_core/toolbar_history.cpp @@ -0,0 +1,85 @@ +/*************************************************************************** + toolbar_history.cpp + + This file contains subroutine that creates toolbar for history window + ------------------- + begin : Tue Nov 26 2008 + based on : core.cpp of Sim-IM by Vladimir Shutoff + and Sim-IM team + copyright : (C) 2002 - 2004 Vladimir Shutoff + (C) 2004 - 2008 Sim-IM Development Team + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "core.h" + +using namespace SIM; + +void CorePlugin::createHistoryToolbar() +{ + EventToolbar(ToolBarHistory, EventToolbar::eAdd).process(); + Command cmd; + + cmd->id = CmdHistoryDirection; + cmd->text = I18N_NOOP("&Direction"); + cmd->icon = "1uparrow"; + cmd->icon_on = "1downarrow"; + cmd->bar_id = ToolBarHistory; + cmd->bar_grp = 0x2000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdHistoryFind; + cmd->text = I18N_NOOP("&Filter"); + cmd->icon = "filter"; + cmd->icon_on = "filter"; + cmd->bar_id = ToolBarHistory; + cmd->bar_grp = 0x3000; + cmd->flags = BTN_COMBO_CHECK; + EventCommandCreate(cmd).process(); + + cmd->id = CmdHistoryPrev; + cmd->text = I18N_NOOP("&Previous page"); + cmd->icon = "1leftarrow"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarHistory; + cmd->bar_grp = 0x5000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdHistoryNext; + cmd->text = I18N_NOOP("&Next page"); + cmd->icon = "1rightarrow"; + cmd->bar_id = ToolBarHistory; + cmd->bar_grp = 0x5001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdHistorySave; + cmd->text = I18N_NOOP("&Save as text"); + cmd->icon = "filesave"; + cmd->accel = "Ctrl+S"; + cmd->bar_id = ToolBarHistory; + cmd->bar_grp = 0x6000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdChangeEncoding; + cmd->text = I18N_NOOP("Change &encoding"); + cmd->icon = "encoding"; + cmd->menu_id = 0; + cmd->bar_id = ToolBarHistory; + cmd->bar_grp = 0x8080; + cmd->popup_id = MenuEncoding; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + +} diff --git a/plugins/_core/toolbar_main.cpp b/plugins/_core/toolbar_main.cpp new file mode 100644 index 0000000..8b5178c --- /dev/null +++ b/plugins/_core/toolbar_main.cpp @@ -0,0 +1,356 @@ +/*************************************************************************** + toolbar_main.cpp + + This file contains subroutines for creating and processing main window + toolbar and it's pull-down menus. + ------------------- + begin : Tue Nov 26 2008 + based on : core.cpp of Sim-IM by Vladimir Shutoff + and Sim-IM team + copyright : (C) 2002 - 2004 Vladimir Shutoff + (C) 2004 - 2008 Sim-IM Development Team + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "core.h" +#include "log.h" + +using namespace SIM; + + +void CorePlugin::createMainToolbar() +{ + + log(L_DEBUG, "createMainToolbar()"); + Command cmd; + + // **** Main ToolBar **** + EventToolbar(ToolBarMain, EventToolbar::eAdd).process(); + + cmd->id = CmdOnline; + cmd->text = I18N_NOOP("Show &offline"); + cmd->icon = "online_off"; + cmd->icon_on = "online_on"; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0x4000; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0; + if (value("ShowOnLine").toBool()) cmd->flags |= COMMAND_CHECKED; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGroupToolbarButton; + cmd->text = I18N_NOOP("&Groups"); + cmd->icon = value("GroupMode").toUInt() ? "grp_on" : "grp_off"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0x4000; + cmd->menu_id = 0; + cmd->popup_id = MenuGroups; + EventCommandCreate(cmd).process(); + + // Status toolbar item is created at status.cpp line 197. May be it should be moved here too... + + cmd->id = CmdMenu; + cmd->text = I18N_NOOP("&Menu"); + cmd->icon = "1downarrow"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0x8000; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->popup_id = MenuMain; + cmd->flags = 0; + EventCommandCreate(cmd).process(); + + // **** Main Menu **** + + EventMenu(MenuMain, EventMenu::eAdd).process(); + + cmd->id = CmdSearch; + cmd->text = I18N_NOOP("Search / Add contact"); + cmd->icon = "find"; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x2080; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSendSMS; + cmd->text = I18N_NOOP("&Send SMS"); + cmd->icon = "sms"; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x2081; + cmd->popup_id = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdUnread; + cmd->text = I18N_NOOP("Unread messages"); + cmd->icon = "message"; + cmd->bar_id = 0; + cmd->bar_grp = 0; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x3000; + cmd->flags = COMMAND_IMPORTANT | COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + // Status menu item is created at status.cpp line 56. May be it should be moved here too... + + cmd->id = CmdGroup; + cmd->text = I18N_NOOP("&Groups"); + cmd->icon = "grp_on"; + cmd->icon_on = QString::null; + cmd->bar_id = 0; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x6001; + cmd->popup_id = MenuGroups; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdPhones; + cmd->text = I18N_NOOP("&Phone service"); + cmd->icon = "phone"; + cmd->bar_id = 0; + cmd->bar_grp = 0; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x60F0; + cmd->popup_id = MenuPhones; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + // "Always on top" menu item is created by "ontop" plugin + + // "Network monitor" menu item is created by "netmonitor" plugin + + // "Connections" or "Connection manager" menu item (whitch one depends on number of + // client plugins loaded) is created by CorePlugin::loadMenu() in core.cpp + // May be should moved here once... + + cmd->id = CmdConfigure; + cmd->text = I18N_NOOP("Setup"); + cmd->icon = "configure"; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x8080; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + // "About KDE" menu item is created by "about" plugin if KDE is enabled + + // "Bug report / Requests" menu item is created by "about" plugin + + // "About Sim-IM" menu item is created by "about" plugin + + cmd->id = CmdProfileChange; + cmd->text = I18N_NOOP("Change profile"); + cmd->icon = QString::null; + cmd->bar_id = 0; + cmd->bar_grp = 0; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x10040; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; // May be COMMAND_IMPORTANT? Do we need this menu item in tray menu by default? + EventCommandCreate(cmd).process(); + + cmd->id = CmdQuit; + cmd->text = I18N_NOOP("Quit"); + cmd->icon = "exit"; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x10080; + cmd->popup_id = 0; + cmd->flags = COMMAND_IMPORTANT; + EventCommandCreate(cmd).process(); + + // **** Groups menu **** + + EventMenu(MenuGroups, EventMenu::eAdd).process(); + + cmd->id = CmdGrpOff; + cmd->text = I18N_NOOP("Do&n't show groups"); + cmd->icon = "grp_off"; + cmd->bar_id = 0; + cmd->menu_id = MenuGroups; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGrpMode1; + cmd->text = I18N_NOOP("Group mode 1"); + cmd->icon = "grp_on"; + cmd->bar_id = 0; + cmd->menu_id = MenuGroups; + cmd->menu_grp = 0x1001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGrpMode2; + cmd->text = I18N_NOOP("Group mode 2"); + cmd->icon = "grp_on"; //TODO: Make icon for GroupMode2 independant from icon for GroupMode1 + cmd->bar_id = 0; + cmd->menu_id = MenuGroups; + cmd->menu_grp = 0x1002; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdOnline; + cmd->text = I18N_NOOP("Show &offline"); + cmd->icon = "online_off"; + cmd->icon_on = "online_on"; + cmd->bar_id = 0; + cmd->menu_id = MenuGroups; + cmd->menu_grp = 0x8000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdEmptyGroup; + cmd->text = I18N_NOOP("Show &empty groups"); + cmd->icon = QString::null; + cmd->icon_on = QString::null; + cmd->bar_id = 0; + cmd->menu_id = MenuGroups; + cmd->menu_grp = 0x8001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGrpCreate; + cmd->text = I18N_NOOP("&Create group"); + cmd->icon = "grp_create"; + cmd->icon_on = QString::null; + cmd->bar_id = 0; + cmd->menu_id = MenuGroups; + cmd->menu_grp = 0xA000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + // **** Phone service submenu **** + + EventMenu(MenuPhones, EventMenu::eAdd).process(); + + cmd->id = CmdPhoneLocation; + cmd->text = I18N_NOOP("&Location"); + cmd->icon = QString::null; + cmd->icon_on = QString::null; + cmd->bar_id = 0; + cmd->menu_id = MenuPhones; + cmd->menu_grp = 0x1000; + cmd->popup_id = MenuPhoneLocation; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + EventMenu(MenuPhoneLocation, EventMenu::eAdd).process(); + + cmd->id = CmdPhoneLocation; //FIXME: Is it ok that we have two CmdPhoneLocation menu items in different menus? + cmd->text = "_"; + cmd->icon = QString::null; + cmd->bar_id = 0; + cmd->menu_id = MenuPhoneLocation; + cmd->menu_grp = 0x1000; + cmd->popup_id = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdPhoneState; + cmd->text = I18N_NOOP("&Status"); + cmd->icon = QString::null; + cmd->icon_on = QString::null; + cmd->bar_id = 0; + cmd->menu_id = MenuPhones; + cmd->menu_grp = 0x1010; + cmd->popup_id = MenuPhoneState; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + EventMenu(MenuPhoneState, EventMenu::eAdd).process(); + + cmd->id = CmdPhoneNoShow; + cmd->text = I18N_NOOP("&No show"); + cmd->icon = QString::null; + cmd->icon_on = QString::null; + cmd->bar_id = 0; + cmd->menu_id = MenuPhoneState; + cmd->menu_grp = 0x1000; + cmd->popup_id = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdPhoneAvailable; + cmd->text = I18N_NOOP("&Available"); + cmd->icon = "phone"; + cmd->bar_id = 0; + cmd->menu_id = MenuPhoneState; + cmd->menu_grp = 0x1001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdPhoneBusy; + cmd->text = I18N_NOOP("&Busy"); + cmd->icon = "nophone"; + cmd->bar_id = 0; + cmd->menu_id = MenuPhoneState; + cmd->menu_grp = 0x1002; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdPhoneBook; + cmd->text = I18N_NOOP("&Phone book"); + cmd->icon = QString::null; + cmd->icon_on = QString::null; + cmd->bar_id = 0; + cmd->menu_id = MenuPhones; + cmd->menu_grp = 0x1020; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); +} + +bool CorePlugin::updateMainToolbar(unsigned long commandID) +{ + bool bUpdateAll = (commandID == ~((unsigned long) 0)); + + if ( ( commandID == CmdGroupToolbarButton ) || bUpdateAll ) + { + Command cmd; + cmd->id = CmdGroupToolbarButton; + cmd->text = I18N_NOOP("&Groups"); + cmd->icon = value("GroupMode").toUInt() ? "grp_on" : "grp_off"; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0x4000; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->popup_id = MenuGroups; + EventCommandChange(cmd).process(); + } + + if ( ( commandID == CmdOnline ) || bUpdateAll ) + { + Command cmd; + cmd->id = CmdOnline; + cmd->text = I18N_NOOP("Show &offline"); + cmd->icon = "online_off"; + cmd->icon_on = "online_on"; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0x4000; + cmd->menu_id = MenuGroups; + cmd->menu_grp = 0x8000; + cmd->flags = COMMAND_CHECK_STATE; + if (value("ShowOnLine").toBool()) cmd->flags |= COMMAND_CHECKED; + EventCommandChange(cmd).process(); + } + return bUpdateAll; +} diff --git a/plugins/_core/toolbar_msgedit.cpp b/plugins/_core/toolbar_msgedit.cpp new file mode 100644 index 0000000..f582a0b --- /dev/null +++ b/plugins/_core/toolbar_msgedit.cpp @@ -0,0 +1,196 @@ +/*************************************************************************** + toolbar_msgedit.cpp + + This file contains subroutine that creates toolbar for MsgEdit part of + chat window. + Note that not all items of that menu created here. Some items is a result + of some other actions. Such items only mentions as a comments here, with + specifing where the item is relly created. + ------------------- + begin : Tue Nov 26 2008 + based on : core.cpp of Sim-IM by Vladimir Shutoff + and Sim-IM team + copyright : (C) 2002 - 2004 Vladimir Shutoff + (C) 2004 - 2008 Sim-IM Development Team + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "core.h" +#include "simgui/textshow.h" // for CmdBgColor and all others... +#include "icons.h" // for getIcons(), getSmiles() +using namespace SIM; + +void CorePlugin::createMsgEditToolbar() +{ + Command cmd; + + EventToolbar(ToolBarMsgEdit, EventToolbar::eAdd).process(); + + cmd->id = CmdBgColor; + cmd->text = I18N_NOOP("Back&ground color"); + cmd->icon = "bgcolor"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdFgColor; + cmd->text = I18N_NOOP("Fo®round color"); + cmd->icon = "fgcolor"; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x1001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdBold; + cmd->text = I18N_NOOP("&Bold"); + cmd->icon = "text_bold"; + cmd->icon_on = "text_bold"; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x1002; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdItalic; + cmd->text = I18N_NOOP("It&alic"); + cmd->icon = "text_italic"; + cmd->icon_on = "text_italic"; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x1003; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdUnderline; + cmd->text = I18N_NOOP("&Underline"); + cmd->icon = "text_under"; + cmd->icon_on = "text_under"; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x1004; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdFont; + cmd->text = I18N_NOOP("Select f&ont"); + cmd->icon = "text"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x1005; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdFileName; + cmd->text = I18N_NOOP("Select &file"); + cmd->icon = "file"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x1010; + cmd->flags = BTN_EDIT | COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdPhoneNumber; + cmd->text = I18N_NOOP("&Phone number"); + cmd->icon = "cell"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x1020; + cmd->flags = BTN_COMBO | BTN_NO_BUTTON | COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + /***** URL (CmdUrlInput, grp=0x1030) *****/ + // Toolbar item 'URL' is created in plugins/icq/icqmessage.cpp in function ICQPlugin::registerMessages() + // And this item will exist even if icq plugin is not loaded. Because it were loaded while initing Sim-IM + // and 'URL' menu item were created. Then it was not destroed somehow. + // FIXME: may be 'URL' toolbar item _should_ be destroed when icq plugin is unloaded. Check it. + + // **** Quote (CmdMsgQuote + CmdReceived, grp=0x1041) *****/ + // Theoreticly another toolbar item should be created here... It is "Quote" item, and it is created while + // creating MenuMsgCommand. But (FIXME:) for some reason this item is missing when looking at item list + // when costumising toolbar. Why I do not know.... + + /***** Forward (CmdMsgForward + CmdReceived, grp=0x1042) *****/ + // Same as Quote. (FIXME: see fixme note for Quote few lines beforee) + + /***** Grant (CmdGrantAuth, grp=0x1080) *****/ + // Toolbar item is defined at msgedit.cpp in authRequestCommands structure and created at MsgEdit::setupMessages + // while creating MessageAuthRequest. So make sure MsgEdit::setupMessages is called after createMsgEditToolbar() + + /***** Refuse (CmdRefuseAuth, grp=0x1081) *****/ + // Same as for Grant. + + /***** Accept (CmdFileAccept, grp=0x1090) *****/ + // Toolbar item is defined at msgedit.cpp in fileCommands structure and created at MsgEdit::setupMessages + // while creating MessageFile. So make sure MsgEdit::setupMessages is called after createMsgEditToolbar() + + /***** Decline (CmdFileDecline, grp=0x1091) *****/ + // Same as for Accept. + + cmd->id = CmdSmile; + cmd->text = I18N_NOOP("I&nsert smile"); + cmd->icon = QString::null; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x7000; + cmd->flags = COMMAND_CHECK_STATE; + // Now checking are there any smile icons... if yes use one as item icon, if no hide 'Insert Smile' toolbar item + QStringList smiles; + getIcons()->getSmiles(smiles); + if (smiles.empty()) cmd->flags |= BTN_HIDE; + else cmd->icon = smiles.front(); + EventCommandCreate(cmd).process(); + + cmd->id = CmdTranslit; + cmd->text = I18N_NOOP("Send in &translit"); + cmd->icon = "translit"; + cmd->icon_on = "translit"; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x7010; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSendClose; + cmd->text = I18N_NOOP("C&lose after send"); + cmd->icon = "fileclose"; + cmd->icon_on = "fileclose"; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x7020; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdSend; + cmd->text = I18N_NOOP("&Send"); + cmd->icon = "mail_generic"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x8000; + cmd->flags = BTN_PICT | COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdNextMessage; + cmd->text = I18N_NOOP("&Next"); + cmd->icon = "message"; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x8000; + cmd->flags = BTN_PICT | COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + /***** Answer (CmdMsgAnswer grp= 0x8000) *****/ + // This toolbar item is created while creating MenuMsgCommand + + cmd->id = CmdMultiply; + cmd->text = I18N_NOOP("Multi&ply send"); + cmd->icon = "1rightarrow"; + cmd->icon_on = "1leftarrow"; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0xF010; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); +} + diff --git a/plugins/_core/toolbar_textedit.cpp b/plugins/_core/toolbar_textedit.cpp new file mode 100644 index 0000000..65cb1a7 --- /dev/null +++ b/plugins/_core/toolbar_textedit.cpp @@ -0,0 +1,88 @@ +/*************************************************************************** + toolbar_textedit.cpp + + This file contains subroutine that creates ToolBarTextEdit toolbar and + fills that toolbar with toolbar items. This toolbar is used as a default + toolbar for RichTextEdit (sim/textshow.cpp), but I (shaplov) have not + found any plase where this toolbar is really shown, so: + TODO: Check if this toolbar is really used, and may be remove it as unused code. + ------------------- + begin : Tue Nov 26 2008 + based on : core.cpp of Sim-IM by Vladimir Shutoff + and Sim-IM team + copyright : (C) 2002 - 2004 Vladimir Shutoff + (C) 2004 - 2008 Sim-IM Development Team + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#include "core.h" +#include "simgui/textshow.h" // for CmdBgColor and all others... + +using namespace SIM; + +void CorePlugin::createTextEditToolbar() +{ + EventToolbar(ToolBarTextEdit, EventToolbar::eAdd).process(); + + Command cmd; + + cmd->id = CmdBgColor; + cmd->text = I18N_NOOP("Back&ground color"); + cmd->icon = "bgcolor"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarTextEdit; + cmd->bar_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdFgColor; + cmd->text = I18N_NOOP("Fo®round color"); + cmd->icon = "fgcolor"; + cmd->bar_id = ToolBarTextEdit; + cmd->bar_grp = 0x1010; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdBold; + cmd->text = I18N_NOOP("&Bold"); + cmd->icon = "text_bold"; + cmd->icon_on = "text_bold"; + cmd->bar_id = ToolBarTextEdit; + cmd->bar_grp = 0x2000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdItalic; + cmd->text = I18N_NOOP("It&alic"); + cmd->icon = "text_italic"; + cmd->icon_on = "text_italic"; + cmd->bar_id = ToolBarTextEdit; + cmd->bar_grp = 0x2010; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdUnderline; + cmd->text = I18N_NOOP("&Underline"); + cmd->icon = "text_under"; + cmd->icon_on = "text_under"; + cmd->bar_id = ToolBarTextEdit; + cmd->bar_grp = 0x2020; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdFont; + cmd->text = I18N_NOOP("Select f&ont"); + cmd->icon = "text"; + cmd->icon_on = "text"; + cmd->bar_id = ToolBarTextEdit; + cmd->bar_grp = 0x3000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); +} diff --git a/plugins/_core/toolbarcfg.cpp b/plugins/_core/toolbarcfg.cpp new file mode 100644 index 0000000..40103ac --- /dev/null +++ b/plugins/_core/toolbarcfg.cpp @@ -0,0 +1,52 @@ +/*************************************************************************** + toolbarcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" + +#include "toolbarcfg.h" + +#include +#include +#include + +ToolbarsCfg::ToolbarsCfg() +{ + qApp->installEventFilter(this); +} + +ToolbarsCfg::~ToolbarsCfg() +{ +} + +bool ToolbarsCfg::eventFilter(QObject *o, QEvent *e) +{ + if((e->type() == QEvent::Show) && o->inherits("CMenu")) + { + QObject *parent = o->parent(); + if(parent && (parent->inherits("MainWindow") || parent->inherits("CToolBar"))) + { + QMenu *popup = static_cast(o); + popup->addAction(i18n("Customize toolbar..."), this, SLOT(popupActivated())); + } + } + return QObject::eventFilter(o, e); +} + +void ToolbarsCfg::popupActivated() +{ +} + diff --git a/plugins/_core/toolbarcfg.h b/plugins/_core/toolbarcfg.h new file mode 100644 index 0000000..5897f83 --- /dev/null +++ b/plugins/_core/toolbarcfg.h @@ -0,0 +1,38 @@ +/*************************************************************************** + toolbarcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _TOOLBARCFG_H +#define _TOOLBARCFG_H + +#include "qobject.h" + +#include + +class ToolbarsCfg : public QObject +{ + Q_OBJECT +public: + ToolbarsCfg(); + virtual ~ToolbarsCfg(); +protected slots: + void popupActivated(); +protected: + bool eventFilter(QObject *o, QEvent *e); +}; + +#endif + diff --git a/plugins/_core/toolsetup.cpp b/plugins/_core/toolsetup.cpp new file mode 100644 index 0000000..2f63b37 --- /dev/null +++ b/plugins/_core/toolsetup.cpp @@ -0,0 +1,258 @@ +/*************************************************************************** + toolsetup.cpp - description + ------------------- + begin : Sun Mar 24 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "cmddef.h" +#include "icons.h" +#include "misc.h" + +#include "toolsetup.h" +#include "commands.h" + + +#include +#include +#include + +using namespace std; +using namespace SIM; + +ToolBarSetup::ToolBarSetup(Commands *bars, CommandsDef *def) : QDialog(NULL) +{ + setupUi(this); + setObjectName("toolbar_setup"); + SET_WNDPROC("configure") + setWindowIcon(Icon("configure")); + setWindowTitle(def->isMenu() ? + i18n("Customize menu") : + i18n("Customize toolbar")); + + setButtonsPict(this); + m_def = def; + m_bars = bars; + + CommandsList list(*m_def); + CommandDef *s; + while ((s = ++list) != NULL){ + if (s->id && (s->text.isEmpty())) + continue; + active.push_back(s->id); + } + + setWindowIcon(Icon("setup")); + connect(btnClose, SIGNAL(clicked()), this, SLOT(close())); + connect(lstButtons, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged())); + connect(lstActive, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged())); + connect(btnAdd, SIGNAL(clicked()), this, SLOT(addClick())); + connect(btnRemove, SIGNAL(clicked()), this, SLOT(removeClick())); + connect(btnUp, SIGNAL(clicked()), this, SLOT(upClick())); + connect(btnDown, SIGNAL(clicked()), this, SLOT(downClick())); + connect(btnOk, SIGNAL(clicked()), this, SLOT(okClick())); + connect(btnApply, SIGNAL(clicked()), this, SLOT(applyClick())); + + setButtons(); + lstActive->clear(); + for (vector::iterator it = active.begin(); it != active.end(); ++it) + addButton(lstActive, *it); + + selectionChanged(); + bDirty = false; +} + +ToolBarSetup::~ToolBarSetup() +{ +} + +void ToolBarSetup::okClick() +{ + applyClick(); + close(); +} + +void ToolBarSetup::applyClick() +{ + if (bDirty) + { + QByteArray config; + vector::iterator it; + for (it = active.begin(); it != active.end(); ++it){ + if (config.length()) + config += ','; + config += QByteArray::number(*it); + } + bool bFirst = true; + CommandsList list(*m_def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + if ((s->id == 0) || ((m_def->isMenu() ? s->menu_grp : s->bar_grp) == 0)) + continue; + unsigned id = s->id; + for (it = active.begin(); it != active.end(); ++it) + if ((*it) == id) + break; + if (it != active.end()) + continue; + if (bFirst){ + config += '/'; + bFirst = false; + }else{ + config += ','; + } + config += QByteArray::number(id); + } + m_def->setConfig(QString(config)); + m_bars->set(m_def, config); + bDirty = false; + } +} + +void ToolBarSetup::addButton(QListWidget *lst, unsigned id) +{ + if (id == 0){ + QListWidgetItem* item = new QListWidgetItem(i18n("Separator"), lst); + item->setIcon(Pict("separator")); + lst->addItem(item); + return; + } + CommandsList list(*m_def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + if ((s->id == id) && !s->text.isEmpty()){ + QString name = i18n(s->text); + name = name.remove('&'); + QListWidgetItem* item = new QListWidgetItem(name, lst); + if (!s->icon.isEmpty()){ + item->setIcon(Pict(s->icon)); + } + return; + } + } +} + +void ToolBarSetup::selectionChanged() +{ + //orig + /* + btnAdd->setEnabled(lstButtons->currentItem() >= 0); + btnRemove->setEnabled(lstActive->currentItem() >= 0); + btnUp->setEnabled(lstActive->currentItem() > 0); + */ + + /* new*/ + btnAdd->setEnabled(lstButtons->count() >= 0); + btnRemove->setEnabled(lstActive->count() >= 0); + btnUp->setEnabled(lstActive->currentRow() > 0); + + btnDown->setEnabled((lstActive->currentRow() >= 0) && + (lstActive->currentRow() < (int)(lstActive->count() - 1))); +} + +void ToolBarSetup::setButtons() +{ + lstButtons->clear(); + CommandsList list(*m_def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + unsigned id = s->id; + vector::iterator it_active; + for (it_active = active.begin(); it_active != active.end(); ++it_active) + if ((*it_active) == id) + break; + if (it_active != active.end()) + continue; + addButton(lstButtons, id); + } + addButton(lstButtons, 0); +} + +void ToolBarSetup::addClick() +{ + int i = lstButtons->currentRow(); + if (i < 0) + return; + if (i == (int)(lstButtons->count() - 1)) + { + active.push_back(0); + addButton(lstActive, 0); + lstActive->setCurrentRow(lstActive->count() - 1); + return; + } + int n = i; + CommandsList list(*m_def, true); + CommandDef *s; + while (((s = ++list) != NULL) && (i >= 0)){ + unsigned id = s->id; + vector::iterator it_active; + for (it_active = active.begin(); it_active != active.end(); ++it_active) + if ((*it_active) == id) + break; + if (it_active != active.end()) + continue; + if (i-- == 0){ + active.push_back(id); + addButton(lstActive, id); + delete lstButtons->item(n); + lstActive->setCurrentRow(lstActive->count() - 1); + bDirty = true; + return; + } + } +} + +void ToolBarSetup::removeClick() +{ + int i = lstActive->currentRow(); + if (i < 0) return; + delete lstActive->item(i); + vector::iterator it = active.begin(); + for (; i > 0; i--, ++it) {}; + active.erase(it); + setButtons(); + bDirty = true; +} + +void ToolBarSetup::upClick() +{ + int i = lstActive->currentRow(); + if (i <= 0) return; + + lstActive->insertItem ( i - 1, lstActive->takeItem ( i ) ); + lstActive->setCurrentRow(i - 1); + + unsigned old = active[i - 1]; + active[i - 1] = active[i]; + active[i] = old; + + bDirty = true; +} + +void ToolBarSetup::downClick() +{ + int i = lstActive->currentRow(); + if ((i < 0) || (i >= (int)(lstActive->count() - 1))) return; + + lstActive->insertItem ( i + 1, lstActive->takeItem ( i ) ); + lstActive->setCurrentRow(i + 1); + + unsigned old = active[i + 1]; + active[i + 1] = active[i]; + active[i] = old; + + bDirty = true; +} + +// vim: set expandtab: + diff --git a/plugins/_core/toolsetup.h b/plugins/_core/toolsetup.h new file mode 100644 index 0000000..506177d --- /dev/null +++ b/plugins/_core/toolsetup.h @@ -0,0 +1,53 @@ +/*************************************************************************** + toolsetup.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _TOOLSETUP_H +#define _TOOLSETUP_H + +#include + +#include "event.h" +#include "ui_toolsetupbase.h" + +class Commands; + +class ToolBarSetup : public QDialog, public Ui::ToolBarSetup +{ + Q_OBJECT +public: + ToolBarSetup(Commands*, SIM::CommandsDef*); + ~ToolBarSetup(); +protected slots: + void selectionChanged(); + void addClick(); + void removeClick(); + void upClick(); + void downClick(); + void applyClick(); + void okClick(); +protected: + SIM::CommandsDef *m_def; + Commands *m_bars; + std::vector active; + bool bDirty; + void addButton(QListWidget *lst, unsigned id); + void setButtons(); + friend class Commands; +}; + +#endif + diff --git a/plugins/_core/toolsetupbase.ui b/plugins/_core/toolsetupbase.ui new file mode 100644 index 0000000..6757730 --- /dev/null +++ b/plugins/_core/toolsetupbase.ui @@ -0,0 +1,256 @@ + + + ToolBarSetup + + + + 0 + 0 + 551 + 300 + + + + Toolbar setup + + + + 6 + + + 11 + + + + + 6 + + + 0 + + + + + 6 + + + 0 + + + + + All buttons: + + + false + + + + + + + + + + + + 6 + + + 0 + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Add -> + + + + + + + <- &Remove + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + 6 + + + 0 + + + + + Active: + + + false + + + + + + + + + + + + 6 + + + 0 + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Up + + + + + + + &Down + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Apply + + + + + + + &OK + + + true + + + + + + + &Close + + + + + + + + qPixmapFromMimeSource + + + diff --git a/plugins/_core/usercfg.cpp b/plugins/_core/usercfg.cpp new file mode 100644 index 0000000..d6fee77 --- /dev/null +++ b/plugins/_core/usercfg.cpp @@ -0,0 +1,624 @@ +/*************************************************************************** + usercfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "usercfg.h" +#include "prefcfg.h" +#include "maininfo.h" +#include "core.h" +#include "arcfg.h" +#include "log.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/group.h" +#include "contacts/client.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +class ConfigItem : public QTreeWidgetItem +{ +public: + ConfigItem(QTreeWidgetItem *item, bool bShowUpdate = false); + ConfigItem(QTreeWidget *view, bool bShowUpdate = false); + ~ConfigItem(); + void show(); + unsigned id() { return m_id; } + static unsigned curIndex; +protected: + unsigned m_id; + bool m_bShowUpdate; + static unsigned defId; + void init(); + virtual QWidget *getWidget(UserConfig *dlg); + QWidget *m_widget; +}; + +unsigned ConfigItem::defId = 0x10000; +unsigned ConfigItem::curIndex; + +ConfigItem::ConfigItem(QTreeWidget *view, bool bShowUpdate) + : QTreeWidgetItem(view) + , m_bShowUpdate(bShowUpdate) +{ + init(); +} + +ConfigItem::ConfigItem(QTreeWidgetItem *item, bool bShowUpdate) + : QTreeWidgetItem(item) + , m_widget(NULL) + , m_bShowUpdate(bShowUpdate) +{ + init(); +} + +ConfigItem::~ConfigItem() +{ + //delete m_widget; +} + +void ConfigItem::init() +{ + QString key = QString::number(++curIndex); + while (key.length() < 4) + key = '0' + key; + setText(1, key); +} + +void ConfigItem::show() +{ + UserConfig *dlg = qobject_cast(treeWidget()->topLevelWidget()); + if(!dlg) + return; + if(m_widget == NULL) + { + m_widget = getWidget(dlg); //Fixme: Crash, second time: m_widget is 0xcccccc + if (m_widget == NULL) + return; + m_id = dlg->wnd->addWidget(m_widget/*, id() ? id() : defId++*/); + dlg->wnd->setMinimumSize(dlg->wnd->sizeHint()); + QObject::connect(dlg, SIGNAL(applyChanges()), m_widget, SLOT(apply())); + } + dlg->showUpdate(m_bShowUpdate); + dlg->wnd->setCurrentWidget(m_widget); +} + +QWidget *ConfigItem::getWidget(UserConfig *dlg) +{ + return dlg; //Fixme +} + +class PrefItem : public ConfigItem +{ +public: + PrefItem(QTreeWidgetItem *parent, CommandDef *cmd); +protected: + virtual QWidget *getWidget(UserConfig *dlg); + CommandDef *m_cmd; +}; + +PrefItem::PrefItem(QTreeWidgetItem *parent, CommandDef *cmd) + : ConfigItem(parent) +{ + m_cmd = cmd; + QString title = i18n(cmd->text); + title = title.remove('&'); + setText(0, title); + setIcon(0, Pict(cmd->icon)); +} + +QWidget *PrefItem::getWidget(UserConfig *dlg) +{ + return new PrefConfig(dlg->wnd, m_cmd, dlg->m_contact, dlg->m_group); +} + +class ClientItem : public ConfigItem +{ +public: + ClientItem(QTreeWidget *view, Client *client, void *_data, CommandDef *cmd); + ClientItem(QTreeWidgetItem *item, Client *client, void *_data, CommandDef *cmd); +protected: + void init(CommandDef *cmd); + virtual QWidget *getWidget(UserConfig *dlg); + Client *m_client; + void *m_data; + CommandDef *m_cmd; +}; + +ClientItem::ClientItem(QTreeWidget *view, Client *client, void *data, CommandDef *cmd) + : ConfigItem(view, true) +{ + m_client = client; + m_data = data; + init(cmd); +} + +ClientItem::ClientItem(QTreeWidgetItem *item, Client *client, void *data, CommandDef *cmd) + : ConfigItem(item, true) +{ + m_client = client; + m_data = data; + init(cmd); +} + +void ClientItem::init(CommandDef *cmd) +{ + m_cmd = cmd; + if (!cmd->text_wrk.isEmpty()){ + setText(0, cmd->text_wrk); + cmd->text_wrk = QString::null; + }else{ + setText(0, i18n(cmd->text)); + } + if (!cmd->icon.isEmpty()) + setIcon(0, Pict(cmd->icon)); +} + +QWidget *ClientItem::getWidget(UserConfig *dlg) +{ + void *data = m_data; + Client *client = dlg->m_contact->clientData.activeClient(data, m_client); + if (client == NULL) + return NULL; + return client->infoWindow(dlg, dlg->m_contact, data, m_cmd->id); +} + +class MainInfoItem : public ConfigItem +{ +public: + MainInfoItem(QTreeWidget *view, unsigned id); +protected: + virtual QWidget *getWidget(UserConfig *dlg); +}; + +MainInfoItem::MainInfoItem(QTreeWidget *view, unsigned id) + : ConfigItem(view, id) +{ + setText(0, i18n("User info")); + setIcon(0, Pict("info")); +} + +QWidget *MainInfoItem::getWidget(UserConfig *dlg) +{ + return new MainInfo(dlg, dlg->m_contact); +} + +class ARItem : public ConfigItem +{ +public: + ARItem(QTreeWidgetItem *item, const CommandDef *def); +protected: + virtual QWidget *getWidget(UserConfig *dlg); + unsigned m_status; +}; + +ARItem::ARItem(QTreeWidgetItem *item, const CommandDef *def) + : ConfigItem(item, 0) + , m_status(def->id) + +{ + QString icon; + + setText(0, i18n(def->text)); + switch (m_status){ + case STATUS_ONLINE: + icon="SIM_online"; + break; + case STATUS_AWAY: + icon="SIM_away"; + break; + case STATUS_NA: + icon="SIM_na"; + break; + case STATUS_DND: + icon="SIM_dnd"; + break; + case STATUS_OCCUPIED: + icon="SIM_occupied"; + break; + case STATUS_FFC: + icon="SIM_ffc"; + break; + case STATUS_OFFLINE: + icon="SIM_offline"; + break; + default: + icon=def->icon; + break; + } + setIcon(0, Pict(icon)); +} + +QWidget *ARItem::getWidget(UserConfig *dlg) +{ + return new ARConfig(dlg, m_status, text(0), dlg->m_contact); +} + +static unsigned itemWidth(QTreeWidgetItem *item, QFontMetrics &fm) +{ + unsigned w = fm.width(item->text(0)) + 64; + for(int i = 0; i < item->childCount(); i++) + { + QTreeWidgetItem *child = item->child(i); + w = qMax(w, itemWidth(child, fm)); + } + return w; +} + +UserConfig::UserConfig(Contact *contact, Group *group) + : QDialog (NULL) + , m_parentItem(NULL) + , m_contact (contact) + , m_group (group) + , m_nUpdates (0) +{ + setupUi(this); + setObjectName("userconfig"); + setAttribute(Qt::WA_DeleteOnClose); + setModal(false); + SET_WNDPROC("configure") + setWindowIcon(Icon(contact ? "info" : "configure")); + setButtonsPict(this); + setTitle(); + btnUpdate->setIcon(Icon("webpress")); + btnUpdate->hide(); + + lstBox->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + lstBox->sortItems(1, Qt::AscendingOrder); + lstBox->header()->hide(); + + fill(); + + connect(lstBox, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), + this, SLOT(itemSelected(QTreeWidgetItem*, QTreeWidgetItem*))); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(apply())); + connect(btnUpdate, SIGNAL(clicked()), this, SLOT(updateInfo())); + + lstBox->setCurrentItem(lstBox->topLevelItem(0)); + itemSelected(lstBox->topLevelItem(0), 0); +} + +UserConfig::~UserConfig() +{ + if (m_contact && (m_contact->getFlags() & CONTACT_TEMPORARY)) + { + Contact *contact = m_contact; + m_contact = NULL; + delete contact; + } +} + +void UserConfig::setTitle() +{ + QString title; + if (m_contact) + { + if (m_contact->id()) + title = i18n("User info '%1'") .arg(m_contact->getName()); + else + title = i18n("New contact"); + } + else + { + QString groupName; + if (m_group && m_group->id()) + groupName = m_group->getName(); + else + groupName = i18n("Not in list"); + title = i18n("Setting for group '%1'") .arg(groupName); + } + if (m_nUpdates) + { + title += ' '; + title += i18n("[Update info]"); + } + setWindowTitle(title); +} + +void UserConfig::fill() +{ + ConfigItem::curIndex = 1; + lstBox->clear(); + if (m_contact) + { + m_parentItem = new MainInfoItem(lstBox, CmdInfo); + ClientDataIterator it(m_contact->clientData); + void *data; //WUUUARH, Fixme + while ((data = ++it) != NULL) + { + Client *client = m_contact->clientData.activeClient(data, it.client()); + if (client == NULL) + continue; + CommandDef *cmds = client->infoWindows(m_contact, data); + if (cmds) + { + m_parentItem = NULL; + for (; !cmds->text.isEmpty(); cmds++) + { + if (m_parentItem) + new ClientItem(m_parentItem, it.client(), data, cmds); + else + { + m_parentItem = new ClientItem(lstBox, it.client(), data, cmds); + m_parentItem->setExpanded(true); + } + } + } + } + } + + m_parentItem = NULL; + ClientUserData* data; + if (m_contact) + data = &m_contact->clientData; + else + data = &m_group->clientData; + ClientDataIterator it(*data); + list st; + ARItem *tmp=NULL; + while (++it) + { + if ((it.client()->protocol()->description()->flags & PROTOCOL_AR_USER) == 0) + continue; + if (m_parentItem == NULL) + { + m_parentItem = new ConfigItem(lstBox, 0); + m_parentItem->setText(0, i18n("Autoreply")); + m_parentItem->setExpanded(true); + } + for (const CommandDef *d = it.client()->protocol()->statusList(); !d->text.isEmpty(); d++) + { + if ((d->id == STATUS_ONLINE) || (d->id == STATUS_OFFLINE)) + continue; + list::iterator it; + for (it = st.begin(); it != st.end(); ++it) + if ((*it) == d->id) + break; + if (it != st.end()) + continue; + st.push_back(d->id); + tmp=new ARItem(m_parentItem, d); + } + } + + delete tmp; + + m_parentItem = new ConfigItem(lstBox, 0); + m_parentItem->setText(0, i18n("Settings")); + m_parentItem->setIcon(0, Pict("configure")); + m_parentItem->setExpanded(true); + CommandDef *cmd; + CommandsMapIterator itc(CorePlugin::instance()->preferences); + m_defaultPage = 0; + while((cmd = ++itc) != NULL) + { + new PrefItem(m_parentItem, cmd); + if (m_defaultPage == 0) + m_defaultPage = cmd->id; + } + + QFontMetrics fm(lstBox->font()); + unsigned w = 0; + for(int i = 0; i < lstBox->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = lstBox->topLevelItem(i); + w = qMax(w, itemWidth(item, fm)); + } + lstBox->setFixedWidth(w); + lstBox->setColumnWidth(0, w - 2); +} + +bool UserConfig::raisePage(unsigned id) +{ + for(int i = 0; i < lstBox->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = lstBox->topLevelItem(i); + if (raisePage(id, item)) + return true; + } + return false; +} + +bool UserConfig::raiseDefaultPage() +{ + return raisePage(m_defaultPage); +} + +bool UserConfig::raisePage(unsigned id, QTreeWidgetItem *item) +{ + unsigned item_id = static_cast(item)->id(); + if (item_id && ((item_id == id) || (id == 0))) + { + lstBox->setCurrentItem(item); + return true; + } + for(int i = 0; i < item->childCount(); i++) + { + QTreeWidgetItem* it = item->child(i); + if (raisePage(id, it)) + return true; + } + return false; +} + +void UserConfig::apply() +{ + emit applyChanges(); + if (m_contact) + getContacts()->addContact(m_contact); + EventSaveState e; + e.process(); +} + +void UserConfig::itemSelected(QTreeWidgetItem *item, QTreeWidgetItem* /* previous */) +{ + static_cast(item)->show(); +} + +bool UserConfig::processEvent(Event *e) +{ + switch (e->type()){ + case eEventGroup: + { + EventGroup *ev = static_cast(e); + Group *group = ev->group(); + switch(ev->action()) { + case EventGroup::eDeleted: + if (group == m_group) + close(); + return false; + case EventGroup::eChanged: + if (group == m_group) + setTitle(); + return false; + case EventGroup::eAdded: + return false; + } + break; + } + case eEventContact: + { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + if (contact != m_contact) + break; + switch(ec->action()) { + case EventContact::eCreated: + if (m_nUpdates) + m_nUpdates--; + btnUpdate->setEnabled(m_nUpdates == 0); + setTitle(); + case EventContact::eDeleted: + close(); + break; + case EventContact::eChanged: + if (m_nUpdates) + m_nUpdates--; + btnUpdate->setEnabled(m_nUpdates == 0); + setTitle(); + break; + case EventContact::eFetchInfoFailed: + if (m_nUpdates){ + if (--m_nUpdates == 0){ + btnUpdate->setEnabled(true); + setTitle(); + } + } + break; + default: + break; + } + break; + } + case eEventCommandRemove: + { + EventCommandRemove *ecr = static_cast(e); + removeCommand(ecr->id()); + return false; + } + case eEventLanguageChanged: + case eEventPluginChanged: + case eEventClientsChanged: + fill(); + return false; + default: + break; + } + return false; +} + +void UserConfig::removeCommand(unsigned id) +{ + for(int i = 0; i < lstBox->topLevelItemCount(); i++) + { + QTreeWidgetItem *item = lstBox->topLevelItem(i); + removeCommand(id, item); + } +} + +bool UserConfig::removeCommand(unsigned id, QTreeWidgetItem *item) +{ + if (item->text(1).toUInt() == id) + { + delete item; + return true; + } + for(int i = 0; i < item->childCount(); i++) + { + QTreeWidgetItem *it= item->child(i); + if (removeCommand(id, it)) + return true; + } + return false; +} + +void UserConfig::updateInfo() +{ + if (m_nUpdates || (m_contact == NULL)) + return; + ClientDataIterator it(m_contact->clientData); + void *data; + while ((data = ++it) != NULL) + { + Client *client = m_contact->clientData.activeClient(data, it.client()); + if (client == NULL) + continue; + m_nUpdates++; + client->updateInfo(m_contact, data); + } + btnUpdate->setEnabled(m_nUpdates == 0); + setTitle(); +} + +void UserConfig::showUpdate(bool bShow) +{ + if (bShow) + { + btnUpdate->show(); + btnUpdate->setEnabled(m_nUpdates == 0); + } + else btnUpdate->hide(); + +} + +void UserConfig::accept() +{ + apply(); + QDialog::accept(); +} + +void UserConfig::resizeEvent(QResizeEvent *e) +{ + QDialog::resizeEvent(e); + /* Fixme Todin + if (isVisible()){ + CorePlugin::instance()->data.CfgGeometry[WIDTH].asLong() = width(); + CorePlugin::instance()->data.CfgGeometry[HEIGHT].asLong() = height(); + } + */ +} + +// vim: set expandtab: diff --git a/plugins/_core/usercfg.h b/plugins/_core/usercfg.h new file mode 100644 index 0000000..6842464 --- /dev/null +++ b/plugins/_core/usercfg.h @@ -0,0 +1,60 @@ +/*************************************************************************** + usercfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _USERCFG_H +#define _USERCFG_H + +#include "ui_cfgdlgbase.h" +#include "event.h" +#include + +class CorePlugin; + +class UserConfig : public QDialog, public Ui::ConfigureDialogBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + UserConfig(SIM::Contact *conatct, SIM::Group *group); + ~UserConfig(); + SIM::Contact *m_contact; + SIM::Group *m_group; + bool raisePage(unsigned id); + bool raiseDefaultPage(); + void showUpdate(bool); +signals: + void applyChanges(); +protected slots: + void apply(); + void itemSelected(QTreeWidgetItem*, QTreeWidgetItem*); + void updateInfo(); +protected: + virtual void accept(); + virtual bool processEvent(SIM::Event*); + void resizeEvent(QResizeEvent*); + void setTitle(); + void fill(); + unsigned m_nUpdates; + unsigned m_defaultPage; + bool raisePage(unsigned id, QTreeWidgetItem*); + void removeCommand(unsigned id); + bool removeCommand(unsigned id, QTreeWidgetItem*); +private: + QTreeWidgetItem *m_parentItem; +}; + +#endif + diff --git a/plugins/_core/userhistorycfg.cpp b/plugins/_core/userhistorycfg.cpp new file mode 100644 index 0000000..ef25cd8 --- /dev/null +++ b/plugins/_core/userhistorycfg.cpp @@ -0,0 +1,70 @@ +/*************************************************************************** + userhistorycfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "userhistorycfg.h" +#include "core.h" + +#include +#include +#include + +UserHistoryCfg::UserHistoryCfg(QWidget *parent, SIM::PropertyHubPtr data) : QWidget(parent) + //: UserHistoryCfgBase(parent) +{ + setupUi(this); + chkDays->setChecked(data->value("CutDays").toBool()); + chkSize->setChecked(data->value("CutSize").toBool()); + edtDays->setValue(data->value("Days").toUInt()); + edtSize->setValue(data->value("MaxSize").toUInt()); + toggledDays(chkDays->isChecked()); + toggledSize(chkSize->isChecked()); + connect(chkDays, SIGNAL(toggled(bool)), this, SLOT(toggledDays(bool))); + connect(chkSize, SIGNAL(toggled(bool)), this, SLOT(toggledSize(bool))); +} + +UserHistoryCfg::~UserHistoryCfg() +{ +} + +void UserHistoryCfg::apply(SIM::PropertyHubPtr data) +{ + data->setValue("CutDays", chkDays->isChecked()); + data->setValue("CutSize", chkSize->isChecked()); + data->setValue("Days", edtDays->text().toUInt()); + data->setValue("MaxSize", edtSize->text().toUInt()); +} + +void UserHistoryCfg::toggledDays(bool bState) +{ + lblDays->setEnabled(bState); + lblDays1->setEnabled(bState); + edtDays->setEnabled(bState); +} + +void UserHistoryCfg::toggledSize(bool bState) +{ + lblSize->setEnabled(bState); + lblSize1->setEnabled(bState); + edtSize->setEnabled(bState); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "userhistorycfg.moc" +#endif +*/ + diff --git a/plugins/_core/userhistorycfg.h b/plugins/_core/userhistorycfg.h new file mode 100644 index 0000000..5505131 --- /dev/null +++ b/plugins/_core/userhistorycfg.h @@ -0,0 +1,40 @@ +/*************************************************************************** + userhistorycfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _USERHISTORYCFG_H +#define _USERHISTORYCFG_H + + +#include "propertyhub.h" +#include "ui_userhistorycfgbase.h" + +class UserHistoryCfg : public QWidget, public Ui::UserHistoryCfgBase +{ + Q_OBJECT +public: + UserHistoryCfg(QWidget *parent, SIM::PropertyHubPtr data); + ~UserHistoryCfg(); +public slots: + void apply(SIM::PropertyHubPtr data); + void toggledDays(bool); + void toggledSize(bool); +protected: + SIM::PropertyHubPtr m_data; +}; + +#endif + diff --git a/plugins/_core/userhistorycfgbase.ui b/plugins/_core/userhistorycfgbase.ui new file mode 100644 index 0000000..88b0be3 --- /dev/null +++ b/plugins/_core/userhistorycfgbase.ui @@ -0,0 +1,158 @@ + + + + + UserHistoryCfgBase + + + + 0 + 0 + 285 + 145 + + + + Form1 + + + + 11 + + + 6 + + + + + 1000 + + + + + + + Mb + + + false + + + + + + + + + + + + + + Max history file size + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + 1000 + + + + + + + days + + + false + + + + + + + Keep history + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/_core/userlist.cpp b/plugins/_core/userlist.cpp new file mode 100644 index 0000000..691c4b5 --- /dev/null +++ b/plugins/_core/userlist.cpp @@ -0,0 +1,1162 @@ +/*************************************************************************** + userlist.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "userlist.h" +#include "core.h" +#include "icons.h" +#include "userview.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +using namespace std; +using namespace SIM; + +UserViewItemBase::UserViewItemBase(UserListBase *parent) + : ListViewItem(parent) +{ +} + +UserViewItemBase::UserViewItemBase(UserViewItemBase *parent) + : ListViewItem(parent) +{ +} + +void UserViewItemBase::setup() +{ +} + +void UserViewItemBase::setCheckable( bool bCheckable ) { + if( bCheckable ) { + setFlags( flags() | Qt::ItemIsUserCheckable ); + setCheckState( 0, Qt::Unchecked ); + } + else { + setFlags( flags() & ~Qt::ItemIsUserCheckable ); + } +} + +DivItem::DivItem(UserListBase *view, unsigned type) + : UserViewItemBase(view) +{ + m_type = type; + setText(0, QString::number(m_type)); + setExpandable(true); + //setSelectable(false); +} + +QVariant DivItem::data( int column, int role ) const +{ + QVariant result; + + switch( role ) + { + case Qt::DisplayRole : { + QString text; + switch( m_type ) + { + case DIV_ONLINE: + text = i18n("Online"); + break; + case DIV_OFFLINE: + text = i18n("Offline"); + break; + } + result = QVariant( text ); + break; + } + default : + return UserViewItemBase::data( column, role ); + } + + return result; +} + +GroupItem::GroupItem(UserListBase *view, Group *grp, bool bOffline, bool bCheckable ) + : UserViewItemBase(view) +{ + m_id = grp->id(); + m_bOffline = bOffline; + init(grp); + setCheckable( bCheckable ); +} + +GroupItem::GroupItem( UserViewItemBase *view, Group *grp, bool bOffline, bool bCheckable ) + : UserViewItemBase(view) +{ + m_id = grp->id(); + m_bOffline = bOffline; + init(grp); + setCheckable( bCheckable ); +} + +void GroupItem::init(Group *grp) +{ + m_unread = 0; + m_nContacts = 0; + m_nContactsOnline = 0; + setExpandable(true); + //setSelectable(true); + SIM::PropertyHubPtr data = grp->getUserData("list"); + if (data.isNull()){ + setOpen(true); + }else{ + if (m_bOffline){ + setOpen(data->value("OfflineOpen").toBool()); + }else{ + setOpen(data->value("OnlineOpen").toBool()); + } + } + update(grp, true); +} + +void GroupItem::update(Group *grp, bool bInit) +{ + QString s; + s = "A"; + if (grp->id()){ + s = QString::number(getContacts()->groupIndex(grp->id())); + while (s.length() < 12){ + s = QString("0") + s; + } + } + if (s == text(0)) + return; + setText(0, s); + if (bInit) + return; + ListViewItem *p = static_cast(parent()); + if (p){ + //p->sort(); + return; + } + //listView()->sort(); +} + +void GroupItem::setOpen(bool bOpen) +{ + //UserViewItemBase::setOpen(bOpen); + Group *grp = getContacts()->group(m_id); + if (grp){ + SIM::PropertyHubPtr data = grp->getUserData("list", !bOpen); + if (!data.isNull()){ + if (m_bOffline){ + data->setValue("OfflineOpen", bOpen); + }else{ + data->setValue("OnlineOpen", bOpen); + } + } + } +} + +QVariant GroupItem::data( int column, int role ) const { + QVariant result; + + switch( role ) + { + case Qt::DisplayRole : { + QString text; + if (id()){ + Group *grp = getContacts()->group(id()); + if (grp){ + text = grp->getName(); + }else{ + text = "???"; + } + }else{ + text = i18n("Not in list"); + } + if (m_nContacts){ + text += " ("; + if (m_nContactsOnline){ + text += QString::number(m_nContactsOnline); + text += '/'; + } + text += QString::number(m_nContacts); + text += ')'; + } + result = QVariant( text ); + break; + } + default : + return UserViewItemBase::data( column, role ); + } + + return result; +} + +void GroupItem::setData( int column, int role, const QVariant &value ) { + if( Qt::CheckStateRole == role ) { + Qt::CheckState cs = (Qt::CheckState)value.toInt(); + for( int i = 0 ; i < childCount() ; i++ ) { + child( i )->setCheckState( 0, cs ); + } + } + + UserViewItemBase::setData( column, role, value ); +} + +ContactItem::ContactItem( UserViewItemBase *view, Contact *contact, unsigned status, unsigned style, const QString &icons, unsigned unread, bool bCheckable ) + : UserViewItemBase(view) +{ + m_id = contact->id(); + init(contact, status, style, icons, unread); + setExpandable(false); + setCheckable( bCheckable ); + setFlags( flags() | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsSelectable ); +} + +void ContactItem::init(Contact *contact, unsigned status, unsigned style, const QString &icons, unsigned unread) +{ + m_bOnline = false; + m_bBlink = false; + update(contact, status, style, icons, unread); +} + +bool ContactItem::update(Contact *contact, unsigned status, unsigned style, const QString &icons, unsigned unread) +{ + m_unread = unread; + m_style = style; + m_status = status; + QString active; + active.sprintf("%08lX", (long unsigned int)(0xFFFFFFFF - contact->getLastActive())); + m_sExtraIcons = icons; + QString icon = getToken(m_sExtraIcons, ','); + m_Icon = Icon(icon); + setText(CONTACT_ICONS, icons); + setText(CONTACT_ACTIVE, active); + setText(CONTACT_STATUS, QString::number(9 - status)); + setup(); + return true; +} + +QString ContactItem::key(int column/*, bool ascending */) const //Fixme? +{ + if (column == 0){ + unsigned mode = CorePlugin::instance()->value("SortMode").toUInt(); + QString res; + for (;;){ + int n = 0; + switch (mode & 0xFF){ + case SORT_STATUS: + n = CONTACT_STATUS; + break; + case SORT_ACTIVE: + n = CONTACT_ACTIVE; + break; + case SORT_NAME: + n = CONTACT_TEXT; + break; + } + if (n == 0) + break; + res += text(n).toLower(); + mode = mode >> 8; + } + return res; + } + return QString::null; //UserViewItemBase::key(column, ascending); +} + +QVariant ContactItem::data( int column, int role ) const +{ + Contact *contact = getContacts()->contact( m_id ); + if( NULL == contact ) + return QVariant(); + + QVariant result; + + switch( role ) + { + case Qt::DisplayRole : { + result = QVariant( contact->getName() ); + break; + } + case Qt::DecorationRole : { + QIcon icon = m_Icon; + UserView* uv = dynamic_cast( treeWidget() ); + if( m_unread && uv->m_bUnreadBlink ) { + CommandDef *def = CorePlugin::instance()->messageTypes.find( m_unread ); + if (def) + icon = Icon( def->icon ); + } + result = QVariant( icon ); + break; + } + case Qt::ToolTipRole : { + result = QVariant( contact->tipText() ); + break; + } + case SIM::ExtraIconsRole : { + result = QVariant( m_sExtraIcons ); + break; + } + default : + return UserViewItemBase::data( column, role ); + } + + return result; +} + +UserListBase::UserListBase(QWidget *parent) + : ListView(parent) + , m_bInit (false) + , m_bDirty (false) + , m_groupMode (1) + , m_bShowOnline (false) + , m_bShowEmpty (false) + , m_bCheckable (false) + , updTimer (new QTimer(this)) + , m_contactItem (NULL) +{ + //header()->hide(); + addColumn(""); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + //setSorting(0); //Fixme + connect(updTimer, SIGNAL(timeout()), this, SLOT(drawUpdates())); + + setExpandingColumn(0); +} + +UserListBase::~UserListBase() +{ +} + +void UserListBase::drawUpdates() +{ + m_bDirty = false; + updTimer->stop(); + ListViewItem *item; +// int x = viewport()->x(); +// int y = viewport()->y(); + viewport()->setUpdatesEnabled(false); + bool bChanged = false; + list::iterator it; + for (it = updGroups.begin(); it != updGroups.end(); ++it){ + Group *group = getContacts()->group(*it); + if (group == NULL) + continue; + switch (m_groupMode){ + case 1: + item = findGroupItem(group->id()); + if (item){ + if (!m_bShowEmpty && (item->child(0) == NULL)){ + delete item; + bChanged = true; + }else{ + static_cast(item)->update(group); + addUpdatedItem(item); + } + }else{ + if (m_bShowEmpty){ + new GroupItem( this, group, true, m_bCheckable ); + bChanged = true; + } + } + break; + case 2: + for(int c = 0; c < topLevelItemCount(); c++) + { + item = static_cast(topLevelItem(c)); + UserViewItemBase *i = static_cast(item); + if (i->type() != DIV_ITEM) continue; + DivItem *divItem = static_cast(i); + GroupItem *grpItem = findGroupItem(group->id(), divItem); + if (grpItem){ + if (!m_bShowEmpty && (item->child(0) == NULL)){ + delete grpItem; + bChanged = true; + }else{ + grpItem->update(group); + addUpdatedItem(grpItem); + } + }else{ + if (m_bShowEmpty){ + new GroupItem( divItem, group, divItem->state() == DIV_OFFLINE, m_bCheckable ); + bChanged = true; + } + } + } + break; + } + } + updGroups.clear(); + DivItem *itemOnline = NULL; + DivItem *itemOffline = NULL; + if (updContacts.size()){ + if (m_groupMode != 1){ + for(int c = 0; c < topLevelItemCount(); c++) + { + item = static_cast(topLevelItem(c)); + UserViewItemBase *i = static_cast(item); + if (i->type() != DIV_ITEM) continue; + DivItem *divItem = static_cast(i); + if (divItem->state() == DIV_ONLINE) + itemOnline = divItem; + if (divItem->state() == DIV_OFFLINE) + itemOffline = divItem; + } + } + } + for (it = updContacts.begin(); it != updContacts.end(); ++it){ //Fixme, got crash: list operator not incremenable! + Contact *contact = getContacts()->contact(*it); + if (contact == NULL) + continue; + GroupItem *grpItem; + unsigned style; + QString icons; + unsigned status = getUserStatus(contact, style, icons); + unsigned unread = getUnread(contact->id()); + bool bShow = false; + SIM::PropertyHubPtr data = contact->getUserData("list"); + if (!data.isNull() && data->value("ShowAlways").toBool()) + bShow = true; + switch (m_groupMode){ + case 0: + if (status <= STATUS_OFFLINE){ + if (itemOnline){ + m_contactItem = findContactItem(contact->id(), itemOnline); + if (m_contactItem){ + deleteItem(m_contactItem); //<== crash + bChanged = true; + if (itemOnline->child(0) == NULL){ + deleteItem(itemOnline); + itemOnline = NULL; + } + } + } + if ((unread == 0) && !bShow && m_bShowOnline){ + if (itemOffline){ + m_contactItem = findContactItem(contact->id(), itemOffline); + if (m_contactItem){ + deleteItem(m_contactItem); + bChanged = true; + if (itemOffline->child(0) == NULL){ + deleteItem(itemOffline); + itemOffline = NULL; + } + } + } + break; + } + if (itemOffline == NULL){ + itemOffline = new DivItem(this, DIV_OFFLINE); + setOpen(itemOffline, true); + bChanged = true; + } + m_contactItem = findContactItem(contact->id(), itemOffline); + if (m_contactItem) + { + if (m_contactItem->update(contact, status, style, icons, unread)) + addSortItem(itemOffline); + addUpdatedItem(m_contactItem); + } + else + { + m_contactItem = new ContactItem( itemOffline, contact, status, style, icons, unread, m_bCheckable ); + bChanged = true; + } + } + else + { + if (itemOffline) + { + m_contactItem = findContactItem(contact->id(), itemOffline); + if (m_contactItem){ + deleteItem(m_contactItem); + bChanged = true; + if (itemOffline->child(0) == NULL){ + deleteItem(itemOffline); + itemOffline = NULL; + } + } + } + if (itemOnline == NULL){ + itemOnline = new DivItem(this, DIV_ONLINE); + setOpen(itemOnline, true); + bChanged = true; + } + m_contactItem = findContactItem(contact->id(), itemOnline); + if (m_contactItem) + { + if (m_contactItem->update(contact, status, style, icons, unread)) + addSortItem(itemOnline); + addUpdatedItem(m_contactItem); + } + else + { + m_contactItem = new ContactItem( itemOnline, contact, status, style, icons, unread, m_bCheckable ); + bChanged = true; + } + } + break; + case 1: + m_contactItem = findContactItem(contact->id()); + grpItem = NULL; + if (m_contactItem){ + grpItem = static_cast(m_contactItem->parent()); + if (((status <= STATUS_OFFLINE) && (unread == 0) && !bShow && m_bShowOnline) || + (contact->getGroup() != (int)grpItem->id())){ + grpItem->m_nContacts--; + if (m_contactItem->m_bOnline) + grpItem->m_nContactsOnline--; + addGroupForUpdate(grpItem->id()); + deleteItem(m_contactItem); + bChanged = true; + if (!m_bShowEmpty && (grpItem->child(0) == NULL)) + delete grpItem; + m_contactItem = NULL; + grpItem = NULL; + } + } + if ((status > STATUS_OFFLINE) || unread || bShow || !m_bShowOnline){ + if (grpItem == NULL){ + grpItem = findGroupItem(contact->getGroup()); + if (grpItem == NULL){ + Group *grp = getContacts()->group(contact->getGroup()); + if (grp){ + grpItem = new GroupItem( this, grp, true, m_bCheckable ); + bChanged = true; + } + } + } + if (grpItem){ + if (m_contactItem){ + if (m_contactItem->update(contact, status, style, icons, unread)) + addSortItem(grpItem); + addUpdatedItem(m_contactItem); + if (!m_bShowOnline && + (m_contactItem->m_bOnline != (status > STATUS_OFFLINE))){ + if (status <= STATUS_OFFLINE) + { + grpItem->m_nContactsOnline--; + m_contactItem->m_bOnline = false; + } + else + { + grpItem->m_nContactsOnline++; + m_contactItem->m_bOnline = true; + } + addGroupForUpdate(grpItem->id()); + } + } + else + { + bChanged = true; + m_contactItem = new ContactItem( grpItem, contact, status, style, icons, unread, m_bCheckable ); + grpItem->m_nContacts++; + if (!m_bShowOnline && (status > STATUS_OFFLINE)) + { + grpItem->m_nContactsOnline++; + m_contactItem->m_bOnline = true; + } + addGroupForUpdate(grpItem->id()); + } + } + } + break; + case 2: + m_contactItem = findContactItem(contact->id(), itemOnline); + grpItem = NULL; + if (m_contactItem){ + grpItem = static_cast(m_contactItem->parent()); + if ((status <= STATUS_OFFLINE) || ((int)grpItem->id() != contact->getGroup())){ + grpItem->m_nContacts--; + addGroupForUpdate(grpItem->id()); + deleteItem(m_contactItem); + bChanged = true; + if (!m_bShowEmpty && (grpItem->child(0) == NULL)) + delete grpItem; + grpItem = NULL; + m_contactItem = NULL; + } + } + if (itemOffline){ + m_contactItem = findContactItem(contact->id(), itemOffline); + grpItem = NULL; + if (m_contactItem){ + grpItem = static_cast(m_contactItem->parent()); + if ((status > STATUS_OFFLINE) || ((int)grpItem->id() != contact->getGroup())){ + grpItem->m_nContacts--; + addGroupForUpdate(grpItem->id()); + deleteItem(m_contactItem); + m_contactItem = NULL; + bChanged = true; + if (m_bShowOnline && (grpItem->child(0) == NULL)){ + deleteItem(grpItem); + grpItem = NULL; + if (itemOffline->child(0) == NULL){ + deleteItem(itemOffline); + itemOffline = NULL; + } + } + } + } + } + if ((unread == 0) && !bShow && (status <= STATUS_OFFLINE) && m_bShowOnline) + break; + DivItem *divItem; + if (status <= STATUS_OFFLINE) + { + if (itemOffline == NULL) + { + bChanged = true; + itemOffline = new DivItem(this, DIV_OFFLINE); + setOpen(itemOffline, true); + } + divItem = itemOffline; + } + else + divItem = itemOnline; + + grpItem = findGroupItem(contact->getGroup(), divItem); + if (grpItem == NULL) + { + Group *grp = getContacts()->group(contact->getGroup()); + if (grp == NULL) + break; + bChanged = true; + grpItem = new GroupItem( divItem, grp, true, m_bCheckable ); + addSortItem(divItem); + } + m_contactItem = findContactItem(contact->id(), grpItem); + if (m_contactItem) + { + if (m_contactItem->update(contact, status, style, icons, unread)) + addSortItem(grpItem); + } + else + { + bChanged = true; + new ContactItem( grpItem, contact, status, style, icons, unread, m_bCheckable ); + grpItem->m_nContacts++; + addGroupForUpdate(grpItem->id()); + } + } + } + updContacts.clear(); + for (list::iterator it_sort = sortItems.begin(); it_sort != sortItems.end(); ++it_sort){ + if ((*it_sort)->child(0) == NULL) + continue; + //(*it_sort)->sort(); + bChanged = true; + } + sortItems.clear(); + //center(x, y, 0, 0); + viewport()->setUpdatesEnabled(true); + if (bChanged){ + viewport()->repaint(); + }else{ + for (list::iterator it = updatedItems.begin(); it != updatedItems.end(); ++it) + (*it)->repaint(); + } + updatedItems.clear(); +} + +const unsigned UPDATE_TIME = 800; + +void UserListBase::addGroupForUpdate(unsigned long id) +{ + for (list::iterator it = updGroups.begin(); it != updGroups.end(); ++it){ + if (*it == id) + return; + } + updGroups.push_back(id); + if (!m_bDirty){ + m_bDirty = true; + updTimer->start(800); + } +} + +void UserListBase::addContactForUpdate(unsigned long id) +{ + for (list::iterator it = updContacts.begin(); it != updContacts.end(); ++it){ + if (*it == id) + return; + } + updContacts.push_back(id); + if (!m_bDirty){ + m_bDirty = true; + updTimer->start(800); + } +} + +void UserListBase::addSortItem(ListViewItem *item) +{ + for (list::iterator it = sortItems.begin(); it != sortItems.end(); ++it){ + if ((*it) == item) + return; + } + sortItems.push_back(item); +} + +void UserListBase::addUpdatedItem(ListViewItem *item) +{ + for (list::iterator it = updatedItems.begin(); it != updatedItems.end(); ++it){ + if ((*it) == item) + return; + } + updatedItems.push_back(item); +} + +unsigned UserListBase::getUnread(unsigned) +{ + return 0; +} + +void UserListBase::fill() +{ + m_pressedItem = NULL; + clear(); + GroupItem *grpItem; + UserViewItemBase *divItem; + UserViewItemBase *divItemOnline = NULL; + UserViewItemBase *divItemOffline = NULL; + ContactList *list = getContacts(); + ContactList::GroupIterator grp_it; + ContactList::ContactIterator contact_it; + Group *grp; + Contact *contact; + switch (m_groupMode){ + case 0: + divItemOnline = NULL; + divItemOffline = NULL; + while ((contact = ++contact_it) != NULL){ + if (contact->getIgnore() || (contact->getFlags() & CONTACT_TEMPORARY)) + continue; + unsigned style; + QString icons; + unsigned status = getUserStatus(contact, style, icons); + unsigned unread = getUnread(contact->id()); + bool bShow = false; + + SIM::PropertyHubPtr data = contact->getUserData("list"); + if (!data.isNull() && data->value("ShowAlways").toBool()) + bShow = true; + if ((unread == 0) && !bShow && (status <= STATUS_OFFLINE) && m_bShowOnline) + continue; + divItem = (status <= STATUS_OFFLINE) ? divItemOffline : divItemOnline; + if (divItem == NULL){ + if (status <= STATUS_OFFLINE){ + divItemOffline = new DivItem(this, DIV_OFFLINE); + setOpen(divItemOffline, true); + divItem = divItemOffline; + }else{ + divItemOnline = new DivItem(this, DIV_ONLINE); + setOpen(divItemOnline, true); + divItem = divItemOnline; + } + } + new ContactItem( divItem, contact, status, style, icons, unread, m_bCheckable ); + } + break; + case 1: + if (m_bShowEmpty){ + while ((grp = ++grp_it) != NULL){ + if (grp->id() == 0) + continue; + grpItem = new GroupItem( this, grp, true, m_bCheckable ); + } + grpItem = new GroupItem( this, list->group(0), true, m_bCheckable ); + } + while ((contact = ++contact_it) != NULL){ + if (contact->getIgnore() || (contact->getFlags() & CONTACT_TEMPORARY)) + continue; + unsigned style; + QString icons; + unsigned status = getUserStatus(contact, style, icons); + unsigned unread = getUnread(contact->id()); + bool bShow = false; + SIM::PropertyHubPtr data = contact->getUserData("list"); + if (!data.isNull() && data->value("ShowAlways").toBool()) + bShow = true; + if ((status <= STATUS_OFFLINE) && !bShow && (unread == 0) && m_bShowOnline) + continue; + grpItem = findGroupItem(contact->getGroup()); + if (grpItem == NULL){ + grp = list->group(contact->getGroup()); + if (grp) + grpItem = new GroupItem( this, grp, true, m_bCheckable ); + if (grpItem == NULL) + continue; + } + m_contactItem = new ContactItem( grpItem, contact, status, style, icons, unread, m_bCheckable ); + grpItem->m_nContacts++; + if ((status > STATUS_OFFLINE) && !m_bShowOnline){ + grpItem->m_nContactsOnline++; + m_contactItem->m_bOnline = true; + } + } + break; + case 2: + divItemOnline = new DivItem(this, DIV_ONLINE); + setOpen(divItemOnline, true); + if (m_bShowEmpty){ + while ((grp = ++grp_it) != NULL){ + if (grp->id() == 0) + continue; + grpItem = new GroupItem( divItemOnline, grp, false, m_bCheckable ); + } + grpItem = new GroupItem( divItemOnline, list->group(0), false, m_bCheckable ); + } + if (!m_bShowOnline){ + divItemOffline = new DivItem(this, DIV_OFFLINE); + setOpen(divItemOffline, true); + grp_it.reset(); + if (m_bShowEmpty){ + while ((grp = ++grp_it) != NULL){ + if (grp->id() == 0) + continue; + grpItem = new GroupItem( divItemOffline, grp, true, m_bCheckable ); + } + grpItem = new GroupItem( divItemOffline, list->group(0), true, m_bCheckable ); + } + } + while ((contact = ++contact_it) != NULL){ + if (contact->getIgnore() || (contact->getFlags() & CONTACT_TEMPORARY)) + continue; + unsigned style; + QString icons; + unsigned status = getUserStatus(contact, style, icons); + unsigned unread = getUnread(contact->id()); + bool bShow = false; + SIM::PropertyHubPtr data = contact->getUserData("list"); + if (!data.isNull() && data->value("ShowAlways").toBool()) + bShow = true; + if ((unread == 0) && !bShow && (status <= STATUS_OFFLINE) && m_bShowOnline) + continue; + if (status <= STATUS_OFFLINE){ + if (divItemOffline == NULL){ + divItemOffline = new DivItem(this, DIV_OFFLINE); + setOpen(divItemOffline, true); + } + divItem = divItemOffline; + }else{ + divItem = divItemOnline; + } + grpItem = findGroupItem(contact->getGroup(), divItem); + if (grpItem == NULL){ + Group *grp = getContacts()->group(contact->getGroup()); + if (grp == NULL) + continue; + grpItem = new GroupItem( divItem, grp, true, m_bCheckable ); + } + new ContactItem( grpItem, contact, status, style, icons, unread, m_bCheckable ); + grpItem->m_nContacts++; + } + break; + } + adjustColumn(); +} + +static void resort(ListViewItem *item) +{ + /* + if (!item->isExpandable()) + return; + item->sort(); + for (item = item->firstChild(); item; item = item->nextSibling()) + resort(item); + */ +} + +bool UserListBase::processEvent(Event *e) +{ + if (e->type() == eEventRepaintView){ + //sort(); + for(int c = 0; c < topLevelItemCount(); c++) + { + ListViewItem *item = static_cast(topLevelItem(c)); + resort(item); + } + viewport()->repaint(); + } + if (m_bInit){ + switch (e->type()){ + case eEventGroup:{ + EventGroup *ev = static_cast(e); + Group *g = ev->group(); + switch (ev->action()) { + case EventGroup::eAdded: + case EventGroup::eChanged: + addGroupForUpdate(g->id()); + break; + case EventGroup::eDeleted: + for (list::iterator it = updGroups.begin(); it != updGroups.end(); ++it){ + if (*it == g->id()){ + updGroups.erase(it); + break; + } + } + GroupItem *grpItem; + switch (m_groupMode){ + case 1: + grpItem = findGroupItem(g->id()); + deleteItem(grpItem); + break; + case 2: + for(int c = 0; c < topLevelItemCount(); c++) + { + ListViewItem *item = static_cast(topLevelItem(c)); + UserViewItemBase *i = static_cast(item); + if (i->type() != DIV_ITEM) continue; + DivItem *divItem = static_cast(i); + grpItem = findGroupItem(g->id(), divItem); + deleteItem(grpItem); + } + break; + } + } + break; + } + case eEventContact: { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + switch(ec->action()) { + case EventContact::eDeleted: { + for (list::iterator it = updContacts.begin(); it != updContacts.end(); ++it){ + if (*it == contact->id()){ + updContacts.erase(it); + break; + } + } + ContactItem *item = findContactItem(contact->id()); + if (item){ + if (m_groupMode){ + GroupItem *grpItem = static_cast(item->parent()); + grpItem->m_nContacts--; + if (item->m_bOnline) + grpItem->m_nContactsOnline--; + addGroupForUpdate(grpItem->id()); + deleteItem(item); + if ((m_groupMode == 2) && + (grpItem->child(0) == NULL) && + m_bShowOnline){ + DivItem *div = static_cast(grpItem->parent()); + if (div->state() == DIV_OFFLINE){ + deleteItem(grpItem); + if (div->child(0) == NULL) + deleteItem(div); + } + } + }else{ + ListViewItem *p = static_cast(item->parent()); + deleteItem(item); + if (p->child(0) == NULL) + deleteItem(p); + } + } + break; + } + case EventContact::eStatus: + case EventContact::eChanged: { + if (!contact->getIgnore() && ((contact->getFlags() & CONTACT_TEMPORARY) == 0)){ + addContactForUpdate(contact->id()); + }else{ + EventContact e(contact, EventContact::eDeleted); + processEvent(&e); + e.setNoProcess(); + } + break; + } + default: + break; + } + break; + } + case eEventMessageReceived:{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->type() == MessageStatus){ + Contact *contact = getContacts()->contact(msg->contact()); + if (contact) + addContactForUpdate(contact->id()); + } + break; + } + default: + break; + } + } + return ListView::processEvent(e); +} + +GroupItem *UserListBase::findGroupItem(unsigned id, ListViewItem *p) +{ + for(int c = 0; c < (p ? p->childCount() : topLevelItemCount()); c++) + { + ListViewItem *item = static_cast(!p ? topLevelItem(c) : p->child(c)); + UserViewItemBase *i = static_cast(item); + if (i->type() == GRP_ITEM){ + GroupItem *grpItem = static_cast(item); + if (grpItem->id() == id) + return grpItem; + } + //if (item->isExpandable()) + { + GroupItem *res = findGroupItem(id, item); + if (res) + return res; + } + } + return NULL; +} + +ContactItem *UserListBase::findContactItem(unsigned id, ListViewItem *p) +{ + for(int c = 0; c < (p ? p->childCount() : topLevelItemCount()); c++) + { + ListViewItem *item = static_cast(p ? p->child(c) : topLevelItem(c)); + UserViewItemBase *i = static_cast(item); + if (i->type() == USR_ITEM){ + ContactItem *contactItem = static_cast(item); + if (contactItem->id() == id) + return contactItem; + } + //if (item->isExpandable()) + { + ContactItem *res = findContactItem(id, item); + if (res) + return res; + } + } + return NULL; +} + +unsigned UserListBase::getUserStatus(Contact *contact, unsigned &style, QString &icons) +{ + style = 0; + QSet wrkIcons; + QString statusIcon; + unsigned long status = contact->contactInfo(style, statusIcon, &wrkIcons); + if (!statusIcon.isEmpty()) + icons = statusIcon; + QStringList sl = wrkIcons.toList(); + icons += QLatin1Char(',') + sl.join(","); + return status; +} + +void UserListBase::deleteItem(ListViewItem *item) +{ + if (item == NULL) + return; + /* + if (item == currentItem()) + { + + ListViewItem *nextItem = static_cast(item->nextSibling()); + if (nextItem == NULL){ + if (item->parent()){ + nextItem = static_cast(item->parent())->child(0); + }else{ + nextItem = static_cast(topLevelItem(0)); + } + for (; nextItem ; nextItem = nextItem->nextSibling()) + if (nextItem->nextSibling() == item) + break; + } + if ((nextItem == NULL) && item->parent()){ + nextItem = static_cast(item->parent()); + if (nextItem->firstChild() && (nextItem->firstChild() != item)){ + for (nextItem = nextItem->firstChild(); nextItem; nextItem = nextItem->nextSibling()) + if (nextItem->nextSibling() == item) + break; + } + } + if (nextItem) + { + setCurrentItem(nextItem); + //ensureItemVisible(nextItem); + //scrollTo(item); + } + } + */ + delete item; +} + +UserList::UserList(QWidget *parent) + : UserListBase(parent) +{ + m_bCheckable = true; + m_bInit = true; + setMenu(0); + fill(); +} + +UserList::~UserList() +{ +} + +void UserList::select( unsigned int id ) { + ContactItem *pItem = this->findContactItem( id, NULL ); + if( NULL != pItem ) + pItem->setCheckState( 0, Qt::Checked ); +} + +bool UserList::isHaveSelected() { + QList< unsigned int > list = selected(); + return ( list.count() > 0 ); +} + +QList< unsigned int > UserList::selected( QTreeWidgetItem *pItem ) { + QList< unsigned int > list; + + QList< QTreeWidgetItem* > listSubItems; + + if( NULL == pItem ) { + for( int i = 0 ; i < topLevelItemCount() ; i++ ) { + listSubItems.push_back( topLevelItem( i ) ); + } + } + else { + for( int i = 0 ; i < pItem->childCount() ; i++ ) { + listSubItems.push_back( pItem->child( i ) ); + } + } + + foreach( QTreeWidgetItem* pSubItem, listSubItems ) { + UserViewItemBase *pBaseItem = static_cast( pSubItem ); + if( GRP_ITEM == pBaseItem->type() ) { + list.append( selected( pSubItem ) ); + } + else if( ( USR_ITEM == pBaseItem->type() ) && ( Qt::Checked == pSubItem->checkState( 0 ) ) ) { + ContactItem *pContactItem = static_cast( pSubItem ); + list.push_back( pContactItem->id() ); + } + } + + return list; +} + +QList< unsigned int > UserList::selected() { + return selected( NULL ); +} + +// vim: set expandtab: diff --git a/plugins/_core/userlist.h b/plugins/_core/userlist.h new file mode 100644 index 0000000..435b457 --- /dev/null +++ b/plugins/_core/userlist.h @@ -0,0 +1,173 @@ +/*************************************************************************** + userlist.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _USERLIST_H +#define _USERLIST_H + +#include +#include "simgui/listview.h" +#include + +using namespace std; + +class UserListBase; +class QTimer; +class UserViewDelegate; + +const unsigned DIV_ITEM = 0; +const unsigned GRP_ITEM = 1; +const unsigned USR_ITEM = 2; + +const unsigned DIV_ONLINE = 0; +const unsigned DIV_OFFLINE = 1; + +const unsigned CONTACT_TEXT = 1; +const unsigned CONTACT_ICONS = 2; +const unsigned CONTACT_ACTIVE = 3; +const unsigned CONTACT_STATUS = 4; + +namespace SIM { + enum ItemDataRole { + ExtraIconsRole = Qt::UserRole + 0, + }; +} + +class UserViewItemBase : public ListViewItem +{ +public: + UserViewItemBase(UserListBase *view); + UserViewItemBase(UserViewItemBase *parent); + virtual unsigned type() = 0; + virtual void setup(); +protected: + void setCheckable( bool bCheckable ); +}; + +class DivItem : public UserViewItemBase +{ +public: + DivItem(UserListBase *view, unsigned type); + unsigned type() { return DIV_ITEM; } + unsigned state() { return m_type; } +protected: + unsigned m_type; + friend class UserListBase; + friend class UserViewDelegate; + virtual QVariant data( int column, int role ) const; +}; + +class GroupItem : public UserViewItemBase +{ +public: + GroupItem(UserListBase *view, SIM::Group *grp, bool bOffline, bool bCheckable ); + GroupItem(UserViewItemBase *view, SIM::Group *grp, bool bOffline, bool bCheckable ); + unsigned type() { return GRP_ITEM; } + unsigned long id() const { return m_id; } + void update(SIM::Group *grp, bool bInit=false); + unsigned m_nContacts; + unsigned m_nContactsOnline; + unsigned m_unread; + virtual QVariant data( int column, int role ) const; + virtual void setData( int column, int role, const QVariant &value ); +protected: + virtual void setOpen(bool bOpen); + void init(SIM::Group *grp); + unsigned long m_id; + bool m_bOffline; +}; + +class ContactItem : public UserViewItemBase +{ +public: + ContactItem(UserViewItemBase *view, SIM::Contact *contact, unsigned status, unsigned style, const QString &icons, unsigned unread, bool bCheckable ); + unsigned type() { return USR_ITEM; } + unsigned long id() { return m_id; } + unsigned style() { return m_style; } + unsigned status() { return m_status; } + bool update(SIM::Contact *grp, unsigned status, unsigned style, const QString &icons, unsigned unread); + bool m_bOnline; + bool m_bBlink; + unsigned m_unread; + virtual QVariant data( int column, int role ) const; +protected: + virtual QString key(int column/*, bool ascending*/) const; + void init(SIM::Contact *contact, unsigned status, unsigned style, const QString &icons, unsigned unread); + unsigned long m_id; + unsigned m_style; + unsigned m_status; + QIcon m_Icon; + QString m_sExtraIcons; + SIM::Contact *contact; +}; + +class UserListBase : public ListView +{ + Q_OBJECT +public: + UserListBase(QWidget *parent); + ~UserListBase(); + virtual void fill(); +protected slots: + void drawUpdates(); +protected: + unsigned m_groupMode; + unsigned m_bShowOnline; + unsigned m_bShowEmpty; + virtual bool processEvent(SIM::Event*); + unsigned getUserStatus(SIM::Contact *contact, unsigned &style, QString &icons); + virtual unsigned getUnread(unsigned contact_id); + GroupItem *findGroupItem(unsigned id, ListViewItem *p = NULL); + ContactItem *findContactItem(unsigned id, ListViewItem *p = NULL); + void addSortItem(ListViewItem *item); + void addUpdatedItem(ListViewItem *item); + void addGroupForUpdate(unsigned long id); + void addContactForUpdate(unsigned long id); + virtual void deleteItem(ListViewItem *item); + std::list sortItems; + std::list updatedItems; + std::list updGroups; + std::list updContacts; + bool m_bDirty; + bool m_bInit; + QTimer *updTimer; + friend class UserViewItemBase; + bool m_bCheckable; + ContactItem *m_contactItem; +}; + +class UserList + : public UserListBase +{ + Q_OBJECT +public: + UserList( QWidget *parent ); + virtual ~UserList(); + + void select( unsigned int id ); + bool isHaveSelected(); + QList< unsigned int > selected(); + +signals: + void selectChanged(); + +protected: + QList< unsigned int > selected( QTreeWidgetItem *pItem ); +}; + +#endif + +// vim: set expandtab: diff --git a/plugins/_core/userview.cpp b/plugins/_core/userview.cpp new file mode 100644 index 0000000..4dfd464 --- /dev/null +++ b/plugins/_core/userview.cpp @@ -0,0 +1,1419 @@ +/*************************************************************************** + userview.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "log.h" + +#include "userview.h" +#include "core.h" +#include "simgui/intedit.h" +#include "simgui/ballonmsg.h" +#include "simgui/linklabel.h" +#include "container.h" +#include "userviewdelegate.h" +#include "history.h" +#include "contacts/contact.h" +#include "contacts/client.h" +#include "contacts/group.h" +#include "contacts/clientdataiterator.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +const unsigned BLINK_TIMEOUT = 500; +const unsigned BLINK_COUNT = 8; + +struct JoinContacts +{ + unsigned contact1; + unsigned contact2; +}; + +static JoinContacts joinContactsData; + +UserView::UserView() + : UserListBase(NULL) + , m_bBlink (false) + , m_bUnreadBlink(false) + , m_blinkTimer (new QTimer(this)) + , m_unreadTimer (new QTimer(this)) + , m_current (NULL) + , mTipItem (NULL) //Refactor: rename to m_TipItem + , m_dropContactId(0) + , m_dropItem (NULL) + , m_searchItem (NULL) + , m_edtGroup (new IntLineEdit(viewport())) + , m_edtContact (new IntLineEdit(viewport())) + , m_userWnd (NULL) +{ + m_bShowOnline =CorePlugin::instance()->value("ShowOnLine").toBool(); + m_bShowEmpty =CorePlugin::instance()->value("ShowEmptyGroup").toBool(); + m_bShowOnline =CorePlugin::instance()->value("ShowOnLine").toBool(); + m_bShowEmpty =CorePlugin::instance()->value("ShowEmptyGroup").toBool(); + + + setItemDelegate(new UserViewDelegate(this)); + setRootIsDecorated(false); + setHeaderHidden(true); + setAnimated(true); + setIndentation(0); + setVerticalScrollBarPolicy(CorePlugin::instance()->value("NoScroller").toBool() ? Qt::ScrollBarAlwaysOff : Qt::ScrollBarAsNeeded); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + connect(m_blinkTimer, SIGNAL(timeout()), this, SLOT(blink())); + connect(m_unreadTimer, SIGNAL(timeout()), this, SLOT(unreadBlink())); + + topLevelWidget()->installEventFilter(this); + viewport()->installEventFilter(this); + + setFrameStyle(QFrame::StyledPanel); + setFrameShadow(QFrame::Sunken); + EventAddWidget(this, true, EventAddWidget::eMainWindow).process(); + clear(); + + setGroupMode(CorePlugin::instance()->value("GroupMode").toUInt(), true); + + m_edtGroup->hide(); + m_edtContact->hide(); + QFont font; + int size = font.pixelSize(); + if (size <= 0) + { + size = font.pointSize(); + font.setPointSize(size * 3 / 4); + } + else font.setPixelSize(size * 3 / 4); + font.setBold(true); + m_edtGroup->setFont(font); + connect(m_edtGroup, SIGNAL(escape()), this, SLOT(editEscape())); + connect(m_edtGroup, SIGNAL(returnPressed()), this, SLOT(editGroupEnter())); + connect(m_edtGroup, SIGNAL(lostFocus()), this, SLOT(editGroupEnter())); + connect(m_edtContact, SIGNAL(escape()), this, SLOT(editEscape())); + connect(m_edtContact, SIGNAL(returnPressed()), this, SLOT(editContactEnter())); + connect(m_edtContact, SIGNAL(lostFocus()), this, SLOT(editContactEnter())); + + setDragDropMode( QAbstractItemView::DragDrop ); + setDropIndicatorShown( true ); +} + +UserView::~UserView() +{ +} + +bool UserView::processEvent(Event *e) +{ + switch (e->type()) + { + case eEventRepaintView: + setVerticalScrollBarPolicy(CorePlugin::instance()->value("NoScroller").toBool() ? Qt::ScrollBarAlwaysOff : Qt::ScrollBarAsNeeded); + break; + case eEventInit: + m_bInit = true; + fill(); + break; + case eEventContact: + { + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eOnline) + break; + Contact *contact = ec->contact(); + if (m_bInit){ + bool bStart = blinks.empty(); + list::iterator it; + for (it = blinks.begin(); it != blinks.end(); ++it){ + if (it->id == contact->id()) + break; + } + if (it != blinks.end()){ + it->count = BLINK_COUNT; + return false; + } + BlinkCount bc; + bc.id = contact->id(); + bc.count = BLINK_COUNT; + blinks.push_back(bc); + if (bStart) + m_blinkTimer->start(BLINK_TIMEOUT); + return false; + } + break; + } + case eEventMessageReceived: + case eEventMessageDeleted: + case eEventMessageRead: + { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + addContactForUpdate(msg->contact()); + break; + } + case eEventCommandExec: + { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->menu_id == MenuContact){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + if (cmd->id == CmdContactDelete){ + ListViewItem *item = findContactItem(contact->id()); + if (item){ + //scrollTo(model()->index(item->row(), item->column())); + QRect rc = visualItemRect(item); + QPoint p = viewport()->mapToGlobal(rc.topLeft()); + rc = QRect(p.x(), p.y(), rc.width(), rc.height()); + m_bRemoveHistory = CorePlugin::instance()->value("RemoveHistory").toBool(); + BalloonMsg::ask((void*)contact->id(), + i18n("Delete \"%1\"?") .arg(contact->getName()), + this, SLOT(deleteContact(void*)), NULL, &rc, NULL, + i18n("Remove history"), &m_bRemoveHistory); + } + return true; + } + if (cmd->id == CmdContactRename){ + ListViewItem *item = findContactItem(contact->id()); + if (item){ + setCurrentItem(item); + renameContact(); + } + return true; + } + if (cmd->id == CmdShowAlways){ + SIM::PropertyHubPtr data = contact->getUserData("list", true); + if (!data.isNull()){ + bool bShow = false; + if (cmd->flags & COMMAND_CHECKED) + bShow = true; + if (data->value("ShowAlways").toBool() != bShow){ + data->setValue("ShowAlways", bShow); + EventContact(contact, EventContact::eChanged).process(); + } + } + return true; + } + if (cmd->id == CmdClose){ + UserWnd *wnd = NULL; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach(w,list) + { + if (w->inherits("Container")){ + Container *c = static_cast(w); + wnd = c->wnd((unsigned long)(cmd->param)); + if (wnd) + break; + } + } + if (wnd){ + delete wnd; + return true; + } + } + if (cmd->id > CmdSendMessage){ + Command c; + c->id = cmd->id - CmdSendMessage; + c->menu_id = MenuMessage; + c->param = (void*)(contact->id()); + c->flags = cmd->flags; + EventCommandExec eCmd(c); + if (eCmd.process()) + return true; + } + } + } + if (cmd->menu_id == MenuContactGroup){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + Group *grp = getContacts()->group(cmd->id - CmdContactGroup); + if (grp && ((int)grp->id() != contact->getGroup())){ + contact->setGroup(grp->id()); + EventContact(contact, EventContact::eChanged).process(); + return true; + } + } + } + if (cmd->menu_id == MenuContainer) + { + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + Container *from = NULL; + Container *to = NULL; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + unsigned max_id = 0; + foreach(w,list) + { + if (w->inherits("Container")){ + Container *c = static_cast(w); + if (c->getId() == cmd->id) + to = c; + if (c->wnd(contact->id())) + from = c; + if (!(c->getId() & CONTAINER_GRP)){ + if (max_id < c->getId()) + max_id = c->getId(); + } + } + } + if (from && to && (from == to)) + return true; + if (from) + { + m_userWnd = from->wnd(contact->id()); + from->removeUserWnd(m_userWnd); + delete m_userWnd; + } + if (from->wnd(contact->id()) == NULL) + m_userWnd = new UserWnd(contact->id(), NULL, true, true); + if (to == NULL) + to = new Container(max_id + 1); + to->init(); + to->addUserWnd(m_userWnd, true); + to->setNoSwitch(true); + raiseWindow(to); + to->setNoSwitch(false); + delete m_userWnd; + } + return true; + } + if (cmd->id == CmdOnline){ + CorePlugin::instance()->setValue("ShowOnLine", ((cmd->flags & COMMAND_CHECKED) != 0)); + m_bShowOnline = (cmd->flags & COMMAND_CHECKED); + if (cmd->menu_id){ + CommandDef c = *cmd; + c.bar_id = ToolBarMain; + c.bar_grp = 0x4000; + EventCommandChange(&c).process(); + } + fill(); + } + if (cmd->id == CmdEmptyGroup){ + CorePlugin::instance()->setValue("ShowEmptyGroup", ((cmd->flags & COMMAND_CHECKED) != 0)); + m_bShowEmpty = (cmd->flags & COMMAND_CHECKED); + fill(); + } + if (cmd->id == CmdGrpOff) + setGroupMode(0); + if (cmd->id == CmdGrpMode1) + setGroupMode(1); + if (cmd->id == CmdGrpMode2) + setGroupMode(2); + if (cmd->id == CmdGrpCreate){ + if (CorePlugin::instance()->value("GroupMode").toUInt()){ + /* Show empty groups because a new group is empty... */ + CorePlugin::instance()->setValue("ShowEmptyGroup", true); + m_bShowEmpty = true; + fill(); + Group *g = getContacts()->group(0, true); + drawUpdates(); + ListViewItem *item = findGroupItem(g->id()); + if (item){ + setCurrentItem(item); + QTimer::singleShot(0, this, SLOT(renameGroup())); + } + } + return true; + } + if (cmd->id == CmdGrpRename){ + ListViewItem *item = findGroupItem((unsigned long)(cmd->param)); + if (item){ + setCurrentItem(item); + renameGroup(); + } + return true; + } + if (cmd->id == CmdGrpUp){ + unsigned long grp_id = (unsigned long)(cmd->param); + getContacts()->moveGroup(grp_id, true); + ListViewItem *item = findGroupItem(grp_id); + if (item){ + //scrollTo(model()->index(item->row(), item->column())); + setCurrentItem(item); + } + return true; + } + if (cmd->id == CmdGrpDown){ + unsigned long grp_id = (unsigned long)(cmd->param); + getContacts()->moveGroup(grp_id, false); + ListViewItem *item = findGroupItem(grp_id); + if (item){ + //scrollTo(model()->index(item->row(), item->column())); + setCurrentItem(item); + } + return true; + } + if (cmd->id == CmdGrpDelete){ + unsigned long grp_id = (unsigned long)(cmd->param); + ListViewItem *item = findGroupItem(grp_id); + Group *g = getContacts()->group(grp_id); + if (item && g){ + //scrollTo(model()->index(item->row(), item->column())); + QRect rc = visualItemRect(item); + QPoint p = viewport()->mapToGlobal(rc.topLeft()); + rc = QRect(p.x(), p.y(), rc.width(), rc.height()); + BalloonMsg::ask((void*)grp_id, + i18n("Delete \"%1\"?") .arg(g->getName()), + this, SLOT(deleteGroup(void*)), NULL, &rc); + } + } + break; + } + case eEventCheckCommandState:{ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->menu_id == MenuGroups){ + cmd->flags = cmd->flags & (~COMMAND_CHECKED); + if (((cmd->id == CmdGrpOff) && (CorePlugin::instance()->value("GroupMode").toUInt() == 0)) || + ((cmd->id == CmdGrpMode1) && (CorePlugin::instance()->value("GroupMode").toUInt() == 1)) || + ((cmd->id == CmdGrpMode2) && (CorePlugin::instance()->value("GroupMode").toUInt() == 2)) || + ((cmd->id == CmdOnline) && CorePlugin::instance()->value("ShowOnLine").toBool())) + cmd->flags |= COMMAND_CHECKED; + if (cmd->id == CmdEmptyGroup){ + if (CorePlugin::instance()->value("GroupMode").toUInt() == 0) + return false; + if (CorePlugin::instance()->value("ShowEmptyGroup").toBool()) + cmd->flags |= COMMAND_CHECKED; + } + return true; + } + if (cmd->menu_id == MenuContact){ + if (cmd->id == CmdContactTitle){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + cmd->text_wrk = contact->getName(); + return true; + } + } + if (cmd->id == CmdShowAlways){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("list", true); + cmd->flags &= ~COMMAND_CHECKED; + if (!data.isNull() && data->value("ShowAlways").toBool()) + cmd->flags |= COMMAND_CHECKED; + return true; + } + } + if (cmd->id == CmdClose){ + UserWnd *wnd = NULL; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach(w,list) + { + if (w->inherits("Container")){ + wnd = static_cast(w)->wnd((unsigned long)(cmd->param)); + if (wnd) + break; + } + } + if (wnd) + return true; + } + if (cmd->id == CmdSendMessage){ + EventMenuGetDef eMenu(MenuMessage); + eMenu.process(); + CommandsDef *cmdsMsg = eMenu.defs(); + unsigned nCmds = 1; + { + CommandsList it(*cmdsMsg, true); + while (++it) + nCmds++; + } + + CommandDef *cmds = new CommandDef[nCmds]; + nCmds = 0; + + CommandsList it(*cmdsMsg, true); + CommandDef *c; + while ((c = ++it) != NULL){ + cmds[nCmds] = *c; + cmds[nCmds].id = CmdSendMessage + c->id; + cmds[nCmds].menu_id = MenuContact; + nCmds++; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + if (cmd->id > CmdSendMessage){ + Command c; + c->id = cmd->id - CmdSendMessage; + c->menu_id = MenuMessage; + c->param = cmd->param; + bool res = EventCheckCommandState(c).process(); + if (res && (c->flags & COMMAND_RECURSIVE)){ + cmd->flags |= COMMAND_RECURSIVE; + cmd->param = c->param; + } + if (res) { + cmd->flags = c->flags; + } + return res; + } + } + if (cmd->menu_id == MenuContactGroup){ + if (cmd->id == CmdContactGroup){ + unsigned grpId = 0; + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact) + grpId = contact->getGroup(); + unsigned nGroups = 0; + Group *grp; + ContactList::GroupIterator it; + while ((grp = ++it) != NULL) + nGroups++; + CommandDef *cmds = new CommandDef[nGroups + 1]; + it.reset(); + nGroups = 0; + while ((grp = ++it) != NULL){ + if (grp->id() == 0) continue; + CommandDef &c = cmds[nGroups++]; + c = *cmd; + c.id = CmdContactGroup + grp->id(); + c.flags = COMMAND_DEFAULT; + if ((grp->id() == grpId) && contact->id()) + c.flags |= COMMAND_CHECKED; + c.text_wrk = grp->getName(); + } + CommandDef &c = cmds[nGroups++]; + c = *cmd; + c.text = I18N_NOOP("Not in list"); + c.id = CmdContactGroup; + c.flags = COMMAND_DEFAULT; + if (grpId == 0) + c.flags = COMMAND_CHECKED; + cmds[nGroups].clear(); + cmd->flags |= COMMAND_RECURSIVE; + cmd->param = cmds; + return true; + } + } + if (cmd->menu_id == MenuGroup){ + unsigned long grp_id = (unsigned long)(cmd->param); + if (grp_id){ + if (cmd->id == CmdGrpTitle){ + Group *g = getContacts()->group(grp_id); + if (g) + cmd->text_wrk = g->getName(); + return true; + } + if ((cmd->id == CmdGrpDelete) || (cmd->id == CmdGrpRename)){ + cmd->flags &= ~COMMAND_CHECKED; + return true; + } + if (cmd->id == CmdGrpUp){ + if (getContacts()->groupIndex(grp_id) <= 1) + cmd->flags |= COMMAND_DISABLED; + cmd->flags &= ~COMMAND_CHECKED; + return true; + } + if (cmd->id == CmdGrpDown){ + if (getContacts()->groupIndex(grp_id) >= getContacts()->groupCount() - 1) + cmd->flags |= COMMAND_DISABLED; + cmd->flags &= ~COMMAND_CHECKED; + return true; + } + }else{ + if (cmd->id == CmdGrpTitle){ + cmd->text = I18N_NOOP("Not in list"); + return true; + } + } + } + if (cmd->id == CmdGrpCreate) { + cmd->flags &= ~COMMAND_CHECKED; + return CorePlugin::instance()->value("GroupMode").toUInt() ? true : false; + } + break; + } + case eEventIconChanged: + viewport()->repaint(); + break; + case eEventRaiseWindow:{ + EventRaiseWindow *w = static_cast(e); + QWidget *o = w->widget(); + if (o && o->inherits("MainWindow")) + QTimer::singleShot(0, this, SLOT(adjustColumn())); + break; + } + default: + break; + } + return UserListBase::processEvent(e); +} + +void UserView::deleteGroup(void *p) +{ + Group *grp = getContacts()->group((unsigned long)p); + if (grp) + delete grp; +} + +void UserView::deleteContact(void *p) +{ + Contact *contact = getContacts()->contact((unsigned long)p); + if (contact == NULL) + return; + ContactItem *item = findContactItem(contact->id()); + if (item) + setCurrentItem(item); + + // Looking for unread messages for this contact in order to delete them + int no_more_messages_flag; + do{ + no_more_messages_flag = 1; + // we should restart unread messages iteration after each message deletion + // because deleting message will change "unread" list + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + msg_id &message_id = *it; + if ( message_id.contact == contact->id()) + { + SIM::Message * message; + message = History::load(message_id.id,message_id.client,message_id.contact); + EventMessageDeleted(message).process(); + // may be we should do EventMessageRead instead of EventMessageDeleted when m_bRemoveHistory is flase + // I am not sure. shaplov. + no_more_messages_flag = 0; + break; + } + } + } while (!no_more_messages_flag); + + CorePlugin::instance()->setValue("RemoveHistory", m_bRemoveHistory); + if (!m_bRemoveHistory) + contact->setFlags(contact->getFlags() | CONTACT_NOREMOVE_HISTORY); + delete contact; +} + +void UserView::renameGroup() +{ + ListViewItem *item = currentItem(); + if (item == NULL) + return; + UserViewItemBase *i = static_cast(item); + if (i->type() != GRP_ITEM) + return; + GroupItem *grpItem = static_cast(item); + Group *g = getContacts()->group(grpItem->id()); + if (g){ + //scrollTo(model()->index(item->row(), item->column())); + QString name = g->getName(); + QRect rc = visualItemRect(item); + rc.setLeft(rc.left() + 18); + m_edtGroup->id = g->id(); + m_edtGroup->setGeometry(rc); + m_edtGroup->setText(name.length() ? name : i18n("New group")); + m_edtGroup->setSelection(0, m_edtGroup->text().length()); + m_edtGroup->show(); + m_edtGroup->setFocus(); + } +} + +void UserView::renameContact() +{ + ListViewItem *item = currentItem(); + if (item == NULL) + return; + UserViewItemBase *i = static_cast(item); + if (i->type() != USR_ITEM) + return; + ContactItem *contactItem = static_cast(item); + Contact *contact = getContacts()->contact(contactItem->id()); + if (contact){ + //scrollTo(model()->index(item->row(), item->column())); + QString name = contact->getName(); + QRect rc = visualItemRect(item); + rc.setLeft(rc.left() + 18); + m_edtContact->id = contact->id(); + m_edtContact->setGeometry(rc); + m_edtContact->setText(name); + m_edtContact->setSelection(0, m_edtContact->text().length()); + m_edtContact->show(); + m_edtContact->setFocus(); + } +} + +void UserView::setGroupMode(unsigned mode, bool bFirst) +{ + if (!bFirst && (CorePlugin::instance()->value("GroupMode").toUInt() == mode)) + return; + CorePlugin::instance()->setValue("GroupMode", mode); + m_groupMode = mode; + EventUpdateCommandState(CmdGroupToolbarButton).process(); + fill(); +} + +bool UserView::eventFilter(QObject *obj, QEvent *e) +{ + bool res = ListView::eventFilter(obj, e); + if (obj->inherits("QMainWindow")) + { + if (e->type() == QEvent::Show) + QTimer::singleShot(0, this, SLOT(repaintView())); + } + return res; +} + +void UserView::mousePressEvent(QMouseEvent *e) +{ + stopSearch(); + UserListBase::mousePressEvent(e); +} + +void UserView::focusOutEvent(QFocusEvent *e) +{ + stopSearch(); + UserListBase::focusOutEvent(e); +} + +void UserView::mouseReleaseEvent(QMouseEvent *e) +{ + ListViewItem *item = m_pressedItem; + UserListBase::mouseReleaseEvent(e); + if (item){ + if (!CorePlugin::instance()->value("UseDblClick").toBool()){ + m_current = item; + QTimer::singleShot(0, this, SLOT(doClick())); + } + } +} + +void UserView::mouseDoubleClickEvent(QMouseEvent *e) +{ + UserListBase::mouseDoubleClickEvent(e); + m_current = itemAt(e->pos()); + QTimer::singleShot(0, this, SLOT(doClick())); +} + +void UserView::doClick() +{ + if (m_current == NULL) + return; + if (m_current->isExpandable() && !CorePlugin::instance()->value("UseDblClick").toBool()) + { + m_current->setOpen(!m_current->isOpen()); + } + else if (static_cast(m_current)->type() == USR_ITEM) + { + ContactItem *item = static_cast(m_current); + EventDefaultAction(item->id()).process(); + } + m_current = NULL; +} + +void UserView::keyPressEvent(QKeyEvent *e) +{ + if (CorePlugin::instance()->value("UseDblClick").toBool() || m_searchItem){ + if (m_searchItem) { + int store = 0; + list items; + list::iterator it; + search(items); + if (!items.empty()) { + for (it = items.begin(); it != items.end(); ++it) + if (*it == m_searchItem) { + store = 1; + } + if (!store) m_searchItem = items.front(); + } else { + m_search = QString::null; + m_searchItem = NULL; + } + setCurrentItem(m_searchItem); + } + switch (e->key()){ + case Qt::Key_Return: + case Qt::Key_Enter: + m_current = currentItem(); + QTimer::singleShot(0, this, SLOT(doClick())); + return; + } + } + bool bTip = false; + if (m_searchItem && (m_searchItem == mTipItem)) + bTip = true; + list old_items; + list new_items; + switch (e->key()){ + case Qt::Key_Backspace: + if (m_search.isEmpty()){ + UserListBase::keyPressEvent(e); + return; + } + search(old_items); + m_search = m_search.left(m_search.length() - 1); + if (m_search.isEmpty()){ + m_searchItem = NULL; + list::iterator it; + for (it = closed_items.begin(); it != closed_items.end(); ++it) + (*it)->setOpen(false); + }else{ + search(new_items); + if (new_items.empty()){ + m_search = QString::null; + m_searchItem = NULL; + }else{ + m_searchItem = new_items.front(); + } + } + break; + case Qt::Key_Escape: + if (m_search.isEmpty()){ + UserListBase::keyPressEvent(e); + return; + } + stopSearch(); + return; + case Qt::Key_Up: + if (m_search.isEmpty()){ + UserListBase::keyPressEvent(e); + return; + } + if (m_searchItem){ + search(old_items); + list::iterator it_old; + for (it_old = old_items.begin(); it_old != old_items.end(); ++it_old) + if ((*it_old) == m_searchItem) + break; + if (it_old != old_items.begin()) + it_old--; + if (it_old == old_items.begin()){ + QApplication::beep(); + return; + } + m_searchItem = *it_old; + } + break; + case Qt::Key_Down: + if (m_search.isEmpty()){ + UserListBase::keyPressEvent(e); + return; + } + if (m_searchItem){ + search(old_items); + list::iterator it_old; + for (it_old = old_items.begin(); it_old != old_items.end(); ++it_old) + if ((*it_old) == m_searchItem) + break; + if (it_old != old_items.end()) + it_old++; + if (it_old == old_items.end()){ + QApplication::beep(); + return; + } + m_searchItem = *it_old; + } + break; + case Qt::Key_Plus: + case Qt::Key_Minus: + if (m_search.isEmpty()){ + ListViewItem *item = currentItem(); + if (item && item->isExpandable()){ + UserListBase::keyPressEvent(e); + return; + } + } + case Qt::Key_Delete: + // e->text() is not empty, but we don't need to specially handle Del + UserListBase::keyPressEvent(e); + return; + default: + QString t = e->text(); + if (t.isEmpty()){ + UserListBase::keyPressEvent(e); + return; + } + if (m_search.isEmpty()) { + closed_items.clear(); + for(int c = 0; c < topLevelItemCount(); c++) + { + ListViewItem *item = static_cast(topLevelItem(c)); + if (item->isExpandable() && !(item->isOpen())) + closed_items.push_back(item); + } + } + QString save_search = m_search; + search(old_items); + m_search += t; + search(new_items); + if (new_items.empty()){ + m_search = save_search; + search(new_items); + QApplication::beep(); + return; + }else{ + m_searchItem = new_items.front(); + } + } + list::iterator it_old; + list::iterator it_new; + for (it_old = old_items.begin(); it_old != old_items.end(); ++it_old){ + for (it_new = new_items.begin(); it_new != new_items.end(); ++it_new) + if (*it_new == *it_old) + break; + if (it_new == new_items.end()) + new_items.push_back(*it_old); + } + for (it_new = new_items.begin(); it_new != new_items.end(); ++it_new) + (*it_new)->repaint(); + setCurrentItem(m_searchItem); + if (m_searchItem){ + //scrollTo(model()->index(m_searchItem->row(), m_searchItem->column())); + } + if (m_search.isEmpty() || (m_searchItem == NULL)){ + QToolTip::hideText(); + }else{ + QString tip = i18n("Search: %1") .arg(m_search); + QRect tipRect = visualItemRect(m_searchItem); + QPoint p = viewport()->mapToGlobal(tipRect.topLeft()); + QToolTip::showText( mapToGlobal( tipRect.topLeft() ), tip, this, tipRect ); + } +} + +void UserView::stopSearch() +{ + if (m_search.isEmpty()) + return; + list old_items; + search(old_items); + m_search = QString::null; + m_searchItem = NULL; + list::iterator it_old; + for (it_old = old_items.begin(); it_old != old_items.end(); ++it_old) + (*it_old)->repaint(); + QToolTip::hideText(); +} + +bool UserView::getMenu(ListViewItem *list_item, unsigned long &id, void* ¶m) +{ + if (list_item == NULL) + return false; + + UserViewItemBase *item = static_cast(list_item); + switch (item->type()){ + case GRP_ITEM:{ + GroupItem *grpItem = static_cast(item); + id = MenuGroup; + param = (void*)(grpItem->id()); + return true; + } + case USR_ITEM:{ + ContactItem *contactItem = static_cast(item); + id = MenuContact; + param = (void*)(contactItem->id()); + return true; + } + } + return false; +} + +void UserView::editEscape() +{ + m_edtGroup->hide(); + m_edtContact->hide(); +} + +void UserView::editGroupEnter() +{ + m_edtGroup->hide(); + Group *g = getContacts()->group(m_edtGroup->id); + if (!(g && m_edtGroup->text().length())) return; + g->setName(m_edtGroup->text()); + EventGroup e(g, EventGroup::eChanged); + e.process(); +} + +void UserView::editContactEnter() +{ + m_edtContact->hide(); + Contact *c = getContacts()->contact(m_edtContact->id); + if (!(c && m_edtContact->text().length())) return; + c->setName(m_edtContact->text()); + EventContact(c, EventContact::eChanged).process(); +} + +unsigned UserView::getUnread(unsigned contact_id) +{ + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + if (it->contact == contact_id){ + if (!m_unreadTimer->isActive()){ + m_bUnreadBlink = true; + m_unreadTimer->start(BLINK_TIMEOUT); + } + return it->type; + } + } + return 0; +} + +static void resetUnread(ListViewItem *item, list &grp) +{ + if (static_cast(item)->type() == GRP_ITEM){ + list::iterator it; + for (it = grp.begin(); it != grp.end(); ++it) + if ((*it) == item) + break; + if (it == grp.end()){ + GroupItem *group = static_cast(item); + if (group->m_unread){ + group->m_unread = 0; + if (!group->isOpen()) + group->repaint(); + } + } + } + if (!item->isExpandable()) + return; + for(int c = 0; c < item->childCount(); c++) + { + ListViewItem *i= static_cast(item->child(c)); + resetUnread(i, grp); + } +} + +void UserView::unreadBlink() +{ + m_bUnreadBlink = !m_bUnreadBlink; + list blinks; + list::iterator itb; + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ++it){ + for (itb = blinks.begin(); itb != blinks.end(); ++itb) + if ((*itb) == it->contact) + break; + if (itb != blinks.end()) + continue; + blinks.push_back(it->contact); + } + list grps; + if (blinks.empty()) + m_unreadTimer->stop(); + else + { + for (itb = blinks.begin(); itb != blinks.end(); ++itb){ + ContactItem *contact = findContactItem((*itb), NULL); + if (contact == NULL) + return; + update(); + //repaintItem(contact); + if (CorePlugin::instance()->value("GroupMode").toUInt() && !contact->parent()->isExpanded()){ + GroupItem *group = static_cast(contact->parent()); + group->m_unread = contact->m_unread; + update(); + grps.push_back(group); + } + } + } + if (CorePlugin::instance()->value("GroupMode").toUInt()){ + for(int c = 0; c < topLevelItemCount(); c++) + { + ListViewItem *i = static_cast(topLevelItem(c)); + resetUnread(i, grps); + } + } +} + +void UserView::blink() +{ + m_bBlink = !m_bBlink; + list::iterator it; + for (it = blinks.begin(); it != blinks.end();){ + ContactItem *contact = findContactItem(it->id, NULL); + if (contact == NULL){ + blinks.erase(it); + it = blinks.begin(); + break; + } + contact->m_bBlink = m_bBlink; + update(); + //repaintItem(contact); + ++it; + } + if (m_bBlink) + return; + for (it = blinks.begin(); it != blinks.end(); ++it) + it->count--; + for (it = blinks.begin(); it != blinks.end(); ){ + if (it->count){ + ++it; + continue; + } + blinks.erase(it); + it = blinks.begin(); + } + if (blinks.size() == 0) + m_blinkTimer->stop(); +} + +void UserView::deleteItem(ListViewItem *item) +{ + if (item == NULL) + return; + if (item == m_pressedItem) + m_pressedItem = NULL; + if (item == m_searchItem) + stopSearch(); + UserListBase::deleteItem(item); +} + +class UserViewContactDragObject : public ContactDragObject +{ +public: + UserViewContactDragObject( const UserView *view, Contact *contact ); + virtual ~UserViewContactDragObject(); +}; + +UserViewContactDragObject::UserViewContactDragObject( const UserView *view, Contact *contact ) + : ContactDragObject( contact ) +{ + QTimer *dragTimer = new QTimer(this); + connect(dragTimer, SIGNAL(timeout()), view, SLOT(dragScroll())); + dragTimer->start(200); +} + +UserViewContactDragObject::~UserViewContactDragObject() +{ +} + +QMimeData *UserView::mimeData( const QList items ) const +{ + if( items.count() != 1 ) + return NULL; + + QTreeWidgetItem *pItem = items.first(); + + UserViewItemBase *base_item = static_cast(pItem); + if (base_item->type() != USR_ITEM) + return NULL; + ContactItem *item = static_cast(base_item); + Contact *contact = getContacts()->contact(item->id()); + if (contact == NULL) + return NULL; + return new UserViewContactDragObject(this, contact); +} + +QMimeData *UserView::dragObject() +{ + if (currentItem() == NULL) + return NULL; + UserViewItemBase *base_item = static_cast(currentItem()); + if (base_item->type() != USR_ITEM) + return NULL; + ContactItem *item = static_cast(currentItem()); + Contact *contact = getContacts()->contact(item->id()); + if (contact == NULL) + return NULL; + return new UserViewContactDragObject(this, contact); +} + +void UserView::dragEnterEvent(QDragEnterEvent *e) +{ + dragEvent(e, false); +} + +void UserView::dragMoveEvent(QDragMoveEvent *e) +{ + dragEvent(e, false); +} + +void UserView::dropEvent(QDropEvent *e) +{ + dragEvent(e, true); +} + +void UserView::dragEvent(QDropEvent *e, bool isDrop) +{ + ListViewItem *list_item = itemAt(e->pos()); + if (list_item == NULL){ + e->ignore(); + return; + } + UserViewItemBase *item = static_cast(list_item); + switch (item->type()){ + case GRP_ITEM: + if (ContactDragObject::canDecode(e)){ + if (isDrop){ + Contact *contact = ContactDragObject::decode(e); + m_dropItem = item; + m_dropContactId = contact->id(); + contact->setFlags(contact->getFlags() & ~CONTACT_DRAG); + QTimer::singleShot(0, this, SLOT(doDrop())); + } + e->setDropAction( Qt::MoveAction ); + e->accept(); + return; + } + break; + case USR_ITEM:{ + if (ContactDragObject::canDecode(e)){ + Contact *contact = ContactDragObject::decode(e); + if (static_cast(item)->id() == contact->id()){ + e->setDropAction( Qt::IgnoreAction ); + e->accept(); + return; + } + if (isDrop){ + m_dropItem = item; + m_dropContactId = contact->id(); + contact->setFlags(contact->getFlags() & ~CONTACT_DRAG); + QTimer::singleShot(0, this, SLOT(doDrop())); + e->ignore(); + return; + } + e->setDropAction( Qt::MoveAction ); + e->accept(); + } + Message *msg = NULL; + CommandDef *cmd; + CommandsMapIterator it(CorePlugin::instance()->messageTypes); + while ((cmd = ++it) != NULL){ + MessageDef *def = (MessageDef*)(cmd->param); + if (def && def->drag){ + msg = def->drag(e); + if (msg){ + unsigned type = cmd->id; + Command cmd; + cmd->id = type; + cmd->menu_id = MenuMessage; + cmd->param = (void*)(static_cast(item)->id()); + if (EventCheckCommandState(cmd).process()) + break; + } + } + } + if (msg){ + if (isDrop){ + msg->setContact(static_cast(item)->id()); + EventOpenMessage(msg).process(); + } + delete msg; + return; + } + if (!e->mimeData()->text().isEmpty()) { + QString str = e->mimeData()->text(); + e->accept(); + if (isDrop) { + Message *msg = new Message(MessageGeneric); + msg->setText(str); + msg->setContact(static_cast(item)->id()); + EventOpenMessage(msg).process(); + delete msg; + } + return; + } + break; + } + } + e->accept(); +} + +void UserView::doDrop() +{ + if (m_dropItem == NULL) + return; + Contact *contact = getContacts()->contact(m_dropContactId); + if (contact == NULL) + return; + switch (static_cast(m_dropItem)->type()){ + case GRP_ITEM:{ + GroupItem *grp_item = static_cast(m_dropItem); + contact->setGroup(grp_item->id()); + contact->setIgnore(false); + contact->setFlags(contact->getFlags() & ~CONTACT_TEMPORARY); + EventContact(contact, EventContact::eChanged).process(); + break; + } + case USR_ITEM:{ + ContactItem *contact_item = static_cast(m_dropItem); + Contact *contact1 = getContacts()->contact(contact_item->id()); + if (contact1 == NULL) + break; + joinContactsData.contact1 = contact_item->id(); + joinContactsData.contact2 = m_dropContactId; + //scrollTo(model()->index(contact_item->row(), contact_item->column())); + QRect rc = visualItemRect(contact_item); + QPoint p = viewport()->mapToGlobal(rc.topLeft()); + rc = QRect(p.x(), p.y(), rc.width(), rc.height()); + BalloonMsg::ask(NULL, + i18n("Join \"%1\" and \"%2\"?") + .arg(contact1->getName()) + .arg(contact->getName()), + this, + SLOT(joinContacts(void*)), + SLOT(cancelJoinContacts(void*)), &rc); + break; + } + } + m_dropContactId = 0; + m_dropItem = NULL; +} + +void UserView::joinContacts(void*) +{ + Contact *contact1 = getContacts()->contact(joinContactsData.contact1); + Contact *contact2 = getContacts()->contact(joinContactsData.contact2); + if ((contact1 == NULL) || (contact2 == NULL)) + return; + contact1->clientData.join(contact2->clientData); + if (!contact2->getPhones().isEmpty()){ + QString phones = contact1->getPhones(); + if (!phones.isEmpty()) + phones += ';'; + phones += contact2->getPhones(); + contact1->setPhones(phones); + } + if (!contact2->getEMails().isEmpty()){ + QString mails = contact1->getEMails(); + if (!mails.isEmpty()) + mails += ';'; + mails += contact2->getEMails(); + contact1->setEMails(mails); + } + delete contact2; + contact1->setup(); + EventContact(contact1, EventContact::eChanged).process(); +} + +void UserView::cancelJoinContacts(void*) +{ + Contact *contact2 = getContacts()->contact(joinContactsData.contact2); + if (contact2 && (contact2->getFlags() & CONTACT_TEMPORARY)) + delete contact2; +} + +void UserView::sortAll() +{ + //sort(); + for(int c = 0; c < topLevelItemCount(); c++) + { + ListViewItem *item = static_cast(topLevelItem(c)); + sortAll(item); + } +} + +void UserView::sortAll(ListViewItem *item) +{ + //item->sort(); + for(int c = 0; c < topLevelItemCount(); c++) + { + ListViewItem *item = static_cast(topLevelItem(c)); + sortAll(item); + } +} + +void UserView::search(list &items) +{ + if (m_search.isEmpty()) + return; + list::iterator it; + for (it = closed_items.begin(); it != closed_items.end(); ++it) + (*it)->setOpen(false); + for(int c = 0; c < topLevelItemCount(); c++) + { + ListViewItem *item = static_cast(topLevelItem(c)); + search(item, items); + } +} + +void UserView::search(ListViewItem *item, list &items) +{ + if (item->isExpandable()){ + for(int c = 0; c < item->childCount(); c++) + { + ListViewItem *ch = static_cast(item->child(c)); + search(ch, items); + } + } + if (static_cast(item)->type() != USR_ITEM) + return; + QString name = item->text(CONTACT_TEXT); + //log(L_DEBUG, "Contact List search: Examining name %s", (const char *)name.local8Bit()); + //Search from the beginning of contact name + //if (name.left(m_search.length()).upper() == m_search.upper()) + //Search for substring in contact name + if (name.contains(m_search,Qt::CaseInsensitive)>0) { + //log(L_DEBUG, "Contact List search: Found name %s", (const char *)name.local8Bit()); + item->parent()->setExpanded(true); + items.push_back(item); + } else { + void *data; + Contact *contact = getContacts()->contact(static_cast(item)->id()); + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL) + { + Client *client = contact->clientData.activeClient(data, it.client()); + if (client == NULL) + continue; + QString contactName = client->contactName(data); + //log(L_DEBUG, "Contact List search: Examining ID %s", (const char *)contactName.local8Bit()); + if (contactName.contains(m_search,Qt::CaseInsensitive)>0) + { + //log(L_DEBUG, "Contact List search: Found ID %s", (const char *)contactName.local8Bit()); + item->parent()->setExpanded(true); + items.push_back(item); + break; + } + } + } +} + +void UserView::dragScroll() //rewrite!? +{ + QPoint pos = QCursor::pos(); + pos = viewport()->mapFromGlobal(pos); + if ((pos.x() < 0) || (pos.x() > viewport()->width())) + return; + ListViewItem *item = NULL; + if (pos.y() < 0) + { + pos = QPoint(pos.x(), -1); + item = itemAt(pos); + } + else if (pos.y() > viewport()->height()) + { + pos = QPoint(pos.x(), viewport()->height() - 1); + item = itemAt(pos); //<== FIXME: crash, it does not return item, sometimes in QGList append() no mem allocation is possible :-/ ??? + if (item) + { + pos = QPoint(pos.x(), viewport()->height() - 1 + item->height()); + item = itemAt(pos); + } + } + + //if (item) + //scrollTo(model()->index(item->row(), item->column())); +} + +// vim: set expandtab: diff --git a/plugins/_core/userview.h b/plugins/_core/userview.h new file mode 100644 index 0000000..aa67371 --- /dev/null +++ b/plugins/_core/userview.h @@ -0,0 +1,107 @@ +/*************************************************************************** + userview.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _USERVIEW_H +#define _USERVIEW_H + +#include "userlist.h" +#include "userwnd.h" + +//#include +//#include +//#include +//#include +//#include +//#include +//#include + +class CorePlugin; +class IntLineEdit; +class QTimer; + +struct BlinkCount +{ + unsigned long id; + unsigned count; +}; + +class UserView : public UserListBase +{ + Q_OBJECT +public: + UserView(); + ~UserView(); + CorePlugin *m_plugin; + IntLineEdit *m_edtGroup; + IntLineEdit *m_edtContact; + ListViewItem *mTipItem; + bool m_bUnreadBlink; +public slots: + void editGroupEnter(); + void editContactEnter(); + void editEscape(); + void renameGroup(); + void renameContact(); + void deleteGroup(void*); + void deleteContact(void*); + void joinContacts(void*); + void cancelJoinContacts(void*); + void blink(); + void unreadBlink(); + void doDrop(); + void doClick(); + void dragScroll(); +protected: + virtual unsigned getUnread(unsigned contact_id); + virtual bool getMenu(ListViewItem *item, unsigned long &id, void* ¶m); + virtual bool processEvent(SIM::Event*); + bool eventFilter(QObject *obj, QEvent *e); + void setGroupMode(unsigned mode, bool bFirst=false); + void keyPressEvent(QKeyEvent *e); + void mousePressEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + void mouseDoubleClickEvent(QMouseEvent *e); + void dragEnterEvent(QDragEnterEvent *e); + virtual void dragMoveEvent(QDragMoveEvent *e); + void dropEvent(QDropEvent *e); + void focusOutEvent(QFocusEvent*); + void sortAll(); + void sortAll(ListViewItem*); + void dragEvent(QDropEvent *e, bool isDrop); + void search(std::list &items); + void search(ListViewItem*, std::list &items); + void stopSearch(); + virtual QMimeData *mimeData( const QList items ) const; + QMimeData *dragObject(); + virtual void deleteItem(ListViewItem *item); + std::list blinks; + std::list closed_items; + unsigned long m_dropContactId; + ListViewItem *m_dropItem; + ListViewItem *m_current; + bool m_bBlink; + QTimer *m_blinkTimer; + QTimer *m_unreadTimer; + QString m_search; + bool m_bRemoveHistory; + ListViewItem *m_searchItem; + friend class UserViewDelegate; + UserWnd *m_userWnd; +}; + +#endif + diff --git a/plugins/_core/userviewcfg.cpp b/plugins/_core/userviewcfg.cpp new file mode 100644 index 0000000..de09ebd --- /dev/null +++ b/plugins/_core/userviewcfg.cpp @@ -0,0 +1,240 @@ +/*************************************************************************** + userviewcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "userviewcfg.h" +#include "core.h" + +#include +#include +#include + +using namespace SIM; + +UserViewConfig::UserViewConfig(QWidget *parent) : QWidget(parent) +{ + setupUi(this); + chkDblClick->setChecked(CorePlugin::instance()->value("UseDblClick").toBool()); + chkSysColors->setChecked(CorePlugin::instance()->value("UseSysColors").toBool()); + btnOnline->setColor(CorePlugin::instance()->value("ColorOnline").toUInt()); + btnOffline->setColor(CorePlugin::instance()->value("ColorOffline").toUInt()); + btnAway->setColor(CorePlugin::instance()->value("ColorAway").toUInt()); + btnNA->setColor(CorePlugin::instance()->value("ColorNA").toUInt()); + btnDND->setColor(CorePlugin::instance()->value("ColorDND").toUInt()); + btnGroup->setColor(CorePlugin::instance()->value("ColorGroup").toUInt()); + chkGroupSeparator->setChecked(CorePlugin::instance()->value("GroupSeparator").toBool()); + chkSmallFont->setChecked(CorePlugin::instance()->value("SmallGroupFont").toBool()); + chkScroll->setChecked(CorePlugin::instance()->value("NoScroller").toBool()); + connect(chkSysColors, SIGNAL(toggled(bool)), this, SLOT(colorsToggled(bool))); + colorsToggled(chkSysColors->isChecked()); + fillBox(cmbSort1); + fillBox(cmbSort2); + fillBox(cmbSort3); + CorePlugin::instance()->setValue("SortMode", CorePlugin::instance()->value("SortMode").toUInt()); + connect(cmbSort1, SIGNAL(activated(int)), this, SLOT(sortChanged(int))); + connect(cmbSort2, SIGNAL(activated(int)), this, SLOT(sortChanged(int))); + connect(cmbSort3, SIGNAL(activated(int)), this, SLOT(sortChanged(int))); + btnAuth1->setIcon(Icon("text_strike")); + btnAuth2->setIcon(Icon("text_italic")); + btnAuth3->setIcon(Icon("text_under")); + btnVisible1->setIcon(Icon("text_strike")); + btnVisible2->setIcon(Icon("text_italic")); + btnVisible3->setIcon(Icon("text_under")); + btnInvisible1->setIcon(Icon("text_strike")); + btnInvisible2->setIcon(Icon("text_italic")); + btnInvisible3->setIcon(Icon("text_under")); + btnAuth1->setChecked(true); + btnAuth2->setChecked(true); + btnAuth3->setChecked(true); + btnVisible1->setChecked(true); + btnVisible2->setChecked(true); + btnVisible3->setChecked(true); + btnInvisible1->setChecked(true); + btnInvisible2->setChecked(true); + btnInvisible3->setChecked(true); + connect(btnAuth1, SIGNAL(toggled(bool)), this, SLOT(setFonts(bool))); + connect(btnAuth2, SIGNAL(toggled(bool)), this, SLOT(setFonts(bool))); + connect(btnAuth3, SIGNAL(toggled(bool)), this, SLOT(setFonts(bool))); + connect(btnVisible1, SIGNAL(toggled(bool)), this, SLOT(setFonts(bool))); + connect(btnVisible2, SIGNAL(toggled(bool)), this, SLOT(setFonts(bool))); + connect(btnVisible3, SIGNAL(toggled(bool)), this, SLOT(setFonts(bool))); + connect(btnInvisible1, SIGNAL(toggled(bool)), this, SLOT(setFonts(bool))); + connect(btnInvisible2, SIGNAL(toggled(bool)), this, SLOT(setFonts(bool))); + connect(btnInvisible3, SIGNAL(toggled(bool)), this, SLOT(setFonts(bool))); + btnAuth1->setChecked((CorePlugin::instance()->value("AuthStyle").toUInt() & STYLE_STRIKE) != 0); + btnAuth2->setChecked((CorePlugin::instance()->value("AuthStyle").toUInt() & STYLE_ITALIC) != 0); + btnAuth3->setChecked((CorePlugin::instance()->value("AuthStyle").toUInt() & STYLE_UNDER) != 0); + btnVisible1->setChecked((CorePlugin::instance()->value("VisibleStyle").toUInt() & STYLE_STRIKE) != 0); + btnVisible2->setChecked((CorePlugin::instance()->value("VisibleStyle").toUInt() & STYLE_ITALIC) != 0); + btnVisible3->setChecked((CorePlugin::instance()->value("VisibleStyle").toUInt() & STYLE_UNDER) != 0); + btnInvisible1->setChecked((CorePlugin::instance()->value("InvisibleStyle").toUInt() & STYLE_STRIKE) != 0); + btnInvisible2->setChecked((CorePlugin::instance()->value("InvisibleStyle").toUInt() & STYLE_ITALIC) != 0); + btnInvisible3->setChecked((CorePlugin::instance()->value("InvisibleStyle").toUInt() & STYLE_UNDER) != 0); + setFonts(true); +} + +UserViewConfig::~UserViewConfig() +{ +} + +void UserViewConfig::apply() +{ + CorePlugin::instance()->setValue("UseDblClick", chkDblClick->isChecked()); + CorePlugin::instance()->setValue("UseSysColors", chkSysColors->isChecked()); + CorePlugin::instance()->setValue("GroupSeparator", chkGroupSeparator->isChecked()); + CorePlugin::instance()->setValue("SortMode", getSortMode()); + CorePlugin::instance()->setValue("SmallGroupFont", chkSmallFont->isChecked()); + CorePlugin::instance()->setValue("NoScroller", chkScroll->isChecked()); + if (CorePlugin::instance()->value("UseSysColors").toBool()){ + CorePlugin::instance()->setValue("ColorOnline", 0); + CorePlugin::instance()->setValue("ColorOffline", 0); + CorePlugin::instance()->setValue("ColorAway", 0); + CorePlugin::instance()->setValue("ColorNA", 0); + CorePlugin::instance()->setValue("ColorDND", 0); + CorePlugin::instance()->setValue("ColorGroup", 0); + }else{ + CorePlugin::instance()->setValue("ColorOnline", btnOnline->color().rgb()); + CorePlugin::instance()->setValue("ColorOffline", btnOffline->color().rgb()); + CorePlugin::instance()->setValue("ColorAway", btnAway->color().rgb()); + CorePlugin::instance()->setValue("ColorNA", btnNA->color().rgb()); + CorePlugin::instance()->setValue("ColorDND", btnDND->color().rgb()); + CorePlugin::instance()->setValue("ColorGroup", btnGroup->color().rgb()); + } + unsigned style = 0; + if (btnAuth1->isChecked()) style |= STYLE_STRIKE; + if (btnAuth2->isChecked()) style |= STYLE_ITALIC; + if (btnAuth3->isChecked()) style |= STYLE_UNDER; + CorePlugin::instance()->setValue("AuthStyle", style); + style = 0; + if (btnVisible1->isChecked()) style |= STYLE_STRIKE; + if (btnVisible2->isChecked()) style |= STYLE_ITALIC; + if (btnVisible3->isChecked()) style |= STYLE_UNDER; + CorePlugin::instance()->setValue("VisibleStyle", style); + style = 0; + if (btnInvisible1->isChecked()) style |= STYLE_STRIKE; + if (btnInvisible2->isChecked()) style |= STYLE_ITALIC; + if (btnInvisible3->isChecked()) style |= STYLE_UNDER; + CorePlugin::instance()->setValue("InvisibleStyle", style); + EventRepaintView e; + e.process(); +} + +void UserViewConfig::colorsToggled(bool state) +{ + if (state){ + QColor textColor = palette().color(QPalette::Active, QPalette::Text); + QColor disabledColor = palette().color(QPalette::Disabled, QPalette::Text); + btnOnline->setColor(textColor); + btnOffline->setColor(disabledColor); + btnAway->setColor(disabledColor); + btnNA->setColor(disabledColor); + btnDND->setColor(disabledColor); + btnGroup->setColor(disabledColor); + } + btnOnline->setEnabled(!state); + btnOffline->setEnabled(!state); + btnAway->setEnabled(!state); + btnNA->setEnabled(!state); + btnDND->setEnabled(!state); + btnGroup->setEnabled(!state); + lblOnline->setEnabled(!state); + lblOffline->setEnabled(!state); + lblAway->setEnabled(!state); + lblNA->setEnabled(!state); + lblDND->setEnabled(!state); + lblGroup->setEnabled(!state); + lblColors->setEnabled(!state); +} + +void UserViewConfig::fillBox(QComboBox *cmb) +{ + cmb->insertItem(INT_MAX,i18n("Status")); + cmb->insertItem(INT_MAX,i18n("Last message time")); + cmb->insertItem(INT_MAX,i18n("Contact name")); + cmb->insertItem(INT_MAX,""); +} + +void UserViewConfig::setSortMode(unsigned mode) +{ + QComboBox *cmb[3] = { cmbSort1, cmbSort2, cmbSort3 }; + unsigned i; + for (i = 0; i < 3; i++){ + cmb[i]->setEnabled(true); + unsigned m = mode & 0xFF; + mode = mode >> 8; + if (m == 0){ + cmb[i++]->setCurrentIndex(3); + break; + } + cmb[i]->setCurrentIndex(m - 1); + } + for (;i < 3; i++){ + cmb[i]->setCurrentIndex(3); + cmb[i]->setEnabled(false); + } +} + +void UserViewConfig::sortChanged(int) +{ + setSortMode(getSortMode()); +} + +void UserViewConfig::setFonts(bool) +{ + QFont fAuth(font()); + fAuth.setStrikeOut(btnAuth1->isChecked()); + fAuth.setItalic(btnAuth2->isChecked()); + fAuth.setUnderline(btnAuth3->isChecked()); + lblAuth->setFont(fAuth); + QFont fVisible(font()); + fVisible.setStrikeOut(btnVisible1->isChecked()); + fVisible.setItalic(btnVisible2->isChecked()); + fVisible.setUnderline(btnVisible3->isChecked()); + lblVisible->setFont(fVisible); + QFont fInvisible(font()); + fInvisible.setStrikeOut(btnInvisible1->isChecked()); + fInvisible.setItalic(btnInvisible2->isChecked()); + fInvisible.setUnderline(btnInvisible3->isChecked()); + lblInvisible->setFont(fInvisible); +} + +unsigned UserViewConfig::getSortMode() +{ + unsigned m1 = cmbSort1->currentIndex() + 1; + if (m1 > 3) + m1 = 0; + unsigned m2 = cmbSort2->currentIndex() + 1; + if (m2 > 3) + m2 = 0; + unsigned m3 = cmbSort3->currentIndex() + 1; + if (m3 > 3) + m3 = 0; + if (m1){ + if (m2 == m1) + m2 = 0; + if (m2){ + if ((m3 == m1) || (m3 == m2)) + m3 = 0; + }else{ + m3 = 0; + } + }else{ + m2 = 0; + m3 = 0; + } + return (m3 << 16) + (m2 << 8) + m1; +} diff --git a/plugins/_core/userviewcfg.h b/plugins/_core/userviewcfg.h new file mode 100644 index 0000000..db85932 --- /dev/null +++ b/plugins/_core/userviewcfg.h @@ -0,0 +1,44 @@ +/*************************************************************************** + userviewcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _USERVIEWCFG_H +#define _USERVIEWCFG_H + +#include "simgui/qcolorbutton.h" +#include "ui_userviewcfgbase.h" + +class CorePlugin; + +class UserViewConfig : public QWidget, public Ui::ContactList +{ + Q_OBJECT +public: + UserViewConfig(QWidget *parent); + ~UserViewConfig(); +public slots: + void apply(); + void colorsToggled(bool); + void sortChanged(int); + void setFonts(bool); +protected: + void fillBox(QComboBox*); + void setSortMode(unsigned); + unsigned getSortMode(); +}; + +#endif + diff --git a/plugins/_core/userviewcfgbase.ui b/plugins/_core/userviewcfgbase.ui new file mode 100644 index 0000000..260b428 --- /dev/null +++ b/plugins/_core/userviewcfgbase.ui @@ -0,0 +1,475 @@ + + + ContactList + + + + 0 + 0 + 427 + 400 + + + + Form2 + + + + 11 + + + 6 + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + 0 + + + 6 + + + + + + + + Groups + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Do not distrub + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Offline + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Online: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Away + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + N/A + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Colors: + + + false + + + + + + + + + + + + Use &double click + + + + + + + Use system &colors + + + + + + + Use small &font for group + + + + + + + Show group &separator + + + + + + + 6 + + + 0 + + + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + Invisible + + + false + + + + + + + + + 6 + + + 0 + + + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + Visible + + + false + + + + + + + + + 6 + + + 0 + + + + + 0 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + Awaiting authorization + + + false + + + + + + + + + No show scroller + + + + + + + Sorting + + + + + + 1st: + + + false + + + + + + + + 0 + 0 + + + + + + + + 2nd: + + + false + + + + + + + + 0 + 0 + + + + + + + + 3rd: + + + false + + + + + + + + 0 + 0 + + + + + + cmbSort1 + TextLabel2 + cmbSort2 + TextLabel3 + TextLabel1 + cmbSort3 + cmbSort1 + TextLabel2 + cmbSort2 + TextLabel3 + TextLabel1 + cmbSort3 + cmbSort1 + TextLabel2 + cmbSort2 + TextLabel3 + TextLabel1 + cmbSort3 + + + + + + + QColorButton + QWidget +
    simgui/qcolorbutton.h
    +
    +
    + + chkDblClick + chkSysColors + chkSmallFont + chkGroupSeparator + chkScroll + btnAuth1 + btnAuth2 + btnAuth3 + btnVisible1 + btnVisible2 + btnVisible3 + btnInvisible1 + btnInvisible2 + btnInvisible3 + + + +
    diff --git a/plugins/_core/userviewdelegate.cpp b/plugins/_core/userviewdelegate.cpp new file mode 100644 index 0000000..7f37cf4 --- /dev/null +++ b/plugins/_core/userviewdelegate.cpp @@ -0,0 +1,289 @@ +#include "userviewdelegate.h" + +#include + +#include "userview.h" +#include "log.h" +#include "core.h" +#include "icons.h" +#include "contacts/group.h" + +using namespace SIM; + +UserViewDelegate::UserViewDelegate(UserView* uv) : m_uv(uv) +{ +} + +void UserViewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + UserViewItemBase *base = dynamic_cast(m_uv->itemFromIndex(index)); + if( NULL == base ) + return; + + painter->save(); + painter->translate(option.rect.x(), option.rect.y()); + + QPainter *p = painter; + QPalette cg = option.palette; + int width = option.rect.width(); + int height = option.rect.height(); + QSize itemsize = option.rect.size(); + int margin = 1; + + switch( base->type() ) + { + case GRP_ITEM: + { + GroupItem *item = static_cast(base); + QString text = index.data( Qt::DisplayRole ).toString(); + QImage img = Image( ( option.state & QStyle::State_Open ) ? "expanded" : "collapsed"); + if (!img.isNull()) + p->drawImage(2 + margin, (height - img.height()) / 2, img); + int x = 24 + margin; + if (!( option.state & QStyle::State_Open ) && item->m_unread){ + CommandDef *def = CorePlugin::instance()->messageTypes.find(item->m_unread); + if (def){ + img = Image(def->icon); + if (!img.isNull()){ + if (m_uv->m_bUnreadBlink) + p->drawImage(x, (height - img.height()) / 2, img); + x += img.width() + 2; + } + } + } + if (!CorePlugin::instance()->value("UseSysColors").toBool()) + p->setPen(CorePlugin::instance()->value("ColorGroup").toUInt()); + QFont f(option.font); + if (CorePlugin::instance()->value("SmallGroupFont").toBool()){ + int size = f.pixelSize(); + if (size <= 0){ + size = f.pointSize(); + f.setPointSize(size * 3 / 4); + }else{ + f.setPixelSize(size * 3 / 4); + } + } + f.setBold(true); + p->setFont(f); + x = drawText(p, x, itemsize, text); + if (CorePlugin::instance()->value("GroupSeparator").toBool()) + drawSeparator(p, x, itemsize, m_uv->style()); + break; + } + case USR_ITEM: + { + ContactItem *item = static_cast(base); + QFont f(option.font); + if (item->style() & CONTACT_ITALIC){ + if (CorePlugin::instance()->value("VisibleStyle").toUInt() & STYLE_ITALIC) + f.setItalic(true); + if (CorePlugin::instance()->value("VisibleStyle").toUInt() & STYLE_UNDER) + f.setUnderline(true); + if (CorePlugin::instance()->value("VisibleStyle").toUInt() & STYLE_STRIKE) + f.setStrikeOut(true); + } + if (item->style() & CONTACT_UNDERLINE){ + if (CorePlugin::instance()->value("AuthStyle").toUInt() & STYLE_ITALIC) + f.setItalic(true); + if (CorePlugin::instance()->value("AuthStyle").toUInt() & STYLE_UNDER) + f.setUnderline(true); + if (CorePlugin::instance()->value("AuthStyle").toUInt() & STYLE_STRIKE) + f.setStrikeOut(true); + } + if (item->style() & CONTACT_STRIKEOUT){ + if (CorePlugin::instance()->value("InvisibleStyle").toUInt() & STYLE_ITALIC) + f.setItalic(true); + if (CorePlugin::instance()->value("InvisibleStyle").toUInt() & STYLE_UNDER) + f.setUnderline(true); + if (CorePlugin::instance()->value("InvisibleStyle").toUInt() & STYLE_STRIKE) + f.setStrikeOut(true); + } + int x = margin; + QIcon mainIcon = index.data( Qt::DecorationRole ).value(); + if (!mainIcon.isNull()){ + QPixmap img = mainIcon.pixmap( 16 ); + x += 2; + p->drawPixmap(x, ( height - img.height() ) / 2, img); + x += img.width() + 2; + } + if (x < 24) + x = 24; + if (!item->isSelected() || !m_uv->hasFocus() || !CorePlugin::instance()->value("UseDblClick").toBool()){ + if (CorePlugin::instance()->value("UseSysColors").toBool()){ + if (item->status() != STATUS_ONLINE && item->status() != STATUS_FFC) + p->setPen(m_uv->palette().color(QPalette::Disabled,QPalette::Text)); + }else{ + switch (item->status()){ + case STATUS_ONLINE: + p->setPen(CorePlugin::instance()->value("ColorOnline").toUInt()); + break; + case STATUS_FFC: + p->setPen(CorePlugin::instance()->value("ColorOnline").toUInt()); + break; + case STATUS_AWAY: + p->setPen(CorePlugin::instance()->value("ColorAway").toUInt()); + break; + case STATUS_NA: + p->setPen(CorePlugin::instance()->value("ColorNA").toUInt()); + break; + case STATUS_DND: + p->setPen(CorePlugin::instance()->value("ColorDND").toUInt()); + break; + default: + p->setPen(CorePlugin::instance()->value("ColorOffline").toUInt()); + break; + } + } + } + if (item->m_bBlink) + f.setBold(true); + else + f.setBold(false); + + p->setFont(f); + QString highlight; + QString text = index.data( Qt::DisplayRole ).toString(); + int pos=0; + if(!m_uv->m_search.isEmpty()) + { + pos=text.toUpper().indexOf(m_uv->m_search.toUpper()); + //Search for substring in contact name + if (pos > -1) + highlight=text.mid(pos,m_uv->m_search.length()); + } + int save_x = x; + //p->setPen(QColor(0, 0, 0)); + x = drawText(p, x, itemsize, text); + if (pos > 0) + save_x = drawText(p, save_x, itemsize, text.left(pos)) - 4; + x += 2; + if (!highlight.isEmpty()) + { + QPen oldPen = p->pen(); + QColor oldBg = p->background().color(); + p->setBackgroundMode(Qt::OpaqueMode); + if (item == m_uv->m_searchItem){ + if ((item == m_uv->currentItem()) && CorePlugin::instance()->value("UseDblClick").toBool()){ + p->setBackground(cg.color(QPalette::HighlightedText)); + p->setPen(cg.color(QPalette::Highlight)); + }else{ + p->setBackground(cg.color(QPalette::Highlight)); + p->setPen(cg.color(QPalette::HighlightedText)); + } + }else{ + p->setBackground(oldPen.color()); + p->setPen(oldBg); + } + drawText(p, save_x, itemsize, highlight); + p->setPen(oldPen); + p->setBackground(oldBg); + p->setBackgroundMode(Qt::TransparentMode); + } + unsigned xIcon = width; + QString icons = index.data( SIM::ExtraIconsRole ).toString(); + while( !icons.isEmpty() ) { + QString icon = getToken(icons, ','); + QImage img = Image(icon); + if (!img.isNull()){ + xIcon -= img.width() + 2; + if (xIcon < (unsigned)x) + break; + p->drawImage(xIcon, (height - img.height()) / 2, img); + } + } + break; + } + case DIV_ITEM: + { + QString text = index.data( Qt::DisplayRole ).toString(); + QFont f(option.font); + int size = f.pixelSize(); + if (size <= 0) + { + size = f.pointSize(); + f.setPointSize(size * 3 / 4); + } + else + { + f.setPixelSize(size * 3 / 4); + } + p->setFont(f); + int x = drawText(p, 24 + margin, itemsize, text); + drawSeparator(p, x, itemsize, m_uv->style()); + break; + } + } + + painter->restore(); +} + +QSize UserViewDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + UserViewItemBase *base = dynamic_cast(m_uv->itemFromIndex(index)); + + QSize size; + if(!base) + return size; + + size.setWidth( m_uv->width() ); + + QFont f(option.font); + int h = 0; + if (base->type() == GRP_ITEM){ + if (CorePlugin::instance()->value("SmallGroupFont").toBool()){ + int size = f.pixelSize(); + if (size <= 0){ + size = f.pointSize(); + f.setPointSize(size * 3 / 4); + }else{ + f.setPixelSize(size * 3 / 4); + } + } + h = 14; + } + if (base->type() == USR_ITEM){ + ContactItem *item = static_cast(base); + QString icons = item->text(CONTACT_ICONS); + while (!icons.isEmpty()){ + QString icon = getToken(icons, ','); + QImage img = Image(icon); + if (img.height() > h) + h = img.height(); + } + if (item->m_unread){ + CommandDef *def = CorePlugin::instance()->messageTypes.find(item->m_unread); + if (def){ + QImage img = Image(def->icon); + if (img.height() > h) + h = img.height(); + } + } + } + QFontMetrics fm(f); + int fh = fm.height(); + if (fh > h) + h = fh; + + size.setHeight( h + 2 ); + + return size; +} + +int UserViewDelegate::drawText(QPainter *p, int x, QSize size, const QString &text) const +{ + QRect br; + p->drawText(x, 0, size.width(), size.height(), Qt::AlignLeft | Qt::AlignVCenter, text, &br); + return br.right() + 5; +} + +void UserViewDelegate::drawSeparator(QPainter *p, int x, QSize size, QStyle *style) const +{ + if (x < size.width() - 6) + { + QStyleOption option; + option.rect = QRect(x, size.height()/2, size.width() - 6 - x, 1); + style->drawPrimitive(QStyle::PE_Q3Separator, &option, p); + } +} + +// vim: set expandtab: diff --git a/plugins/_core/userviewdelegate.h b/plugins/_core/userviewdelegate.h new file mode 100644 index 0000000..e499d90 --- /dev/null +++ b/plugins/_core/userviewdelegate.h @@ -0,0 +1,25 @@ + +#ifndef CORE_USERVIEWDELEGATE_H +#define CORE_USERVIEWDELEGATE_H + +#include + +class UserView; +class UserViewDelegate : public QItemDelegate +{ +public: + UserViewDelegate(UserView* uv); + virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; + virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; + +protected: + int drawText(QPainter *p, int x, QSize size, const QString &text) const; + void drawSeparator(QPainter *p, int x, QSize size, QStyle *style) const; + +private: + UserView* m_uv; +}; + +#endif + +// vim: set expandtab: diff --git a/plugins/_core/userwnd.cpp b/plugins/_core/userwnd.cpp new file mode 100644 index 0000000..8cedd4c --- /dev/null +++ b/plugins/_core/userwnd.cpp @@ -0,0 +1,340 @@ +/*************************************************************************** + userwnd.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "log.h" + +#include "userwnd.h" +#include "msgedit.h" +#include "msgview.h" +#include "simgui/toolbtn.h" +#include "userlist.h" +#include "core.h" +#include "container.h" +#include "history.h" +#include "contacts/contact.h" +#include "contacts/client.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +static DataDef userWndData[] = + { + { "EditHeight", DATA_ULONG, 1, 0 }, + { "EditBar", DATA_LONG, 7, 0 }, + { "MessageType", DATA_ULONG, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +//FIXME: Obsolete? +//static void copyData(SIM::Data *dest, const SIM::Data *src, unsigned count) +//{ +// for(unsigned i = 0; i < count; i++) +// dest[i] = src[i]; +//} + +UserWnd::UserWnd(unsigned long id, Buffer *cfg, bool bReceived, bool bAdjust) + : QSplitter(Qt::Horizontal, NULL) +{ + load_data(userWndData, &data, cfg); + m_id = id; + m_bResize = false; + m_bClosed = false; + m_bTyping = false; + setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + + m_splitter = new QSplitter(Qt::Vertical, this); + m_list = NULL; + m_view = NULL; + /* Fixme Todin + if (cfg == NULL) + copyData(data.editBar, CorePlugin::instance()->data.EditBar, 7); + */ + + m_bBarChanged = true; + if (CorePlugin::instance()->getContainerMode()) + bReceived = false; + addWidget(m_splitter); + m_edit = new MsgEdit(m_splitter, this); + setFocusProxy(m_edit); + restoreToolbar(m_edit->m_bar, data.editBar); + m_bBarChanged = false; + m_splitter->addWidget(m_edit); + + connect(m_edit->m_bar, SIGNAL(movableChanged(bool)), this, SLOT(toolbarChanged(bool))); + connect(CorePlugin::instance(), SIGNAL(modeChanged()), this, SLOT(modeChanged())); + connect(m_edit, SIGNAL(heightChanged(int)), this, SLOT(editHeightChanged(int))); + modeChanged(); + + if (!bAdjust && getMessageType() == 0) + return; + + if (!m_edit->adjustType()) + { + unsigned type = getMessageType(); + Message *msg = new Message(MessageGeneric); + setMessage(msg); + delete msg; + setMessageType(type); + } +} + +UserWnd::~UserWnd() +{ + emit closed(this); + free_data(userWndData, &data); + Contact *contact = getContacts()->contact(id()); + if (contact && (contact->getFlags() & CONTACT_TEMPORARY)){ + m_id = 0; + delete contact; + } +} + +QByteArray UserWnd::getConfig() +{ + return save_data(userWndData, &data); +} + +QString UserWnd::getName() +{ + Contact *contact = getContacts()->contact(m_id); + return contact ? contact->getName() : QString::null; +} + +QString UserWnd::getLongName() +{ + QString res; + if (CorePlugin::instance()->value("ShowOwnerName").toBool() && !getContacts()->owner()->getName().isEmpty()) + res += getContacts()->owner()->getName(); + if (!res.isEmpty()) + res += " - "; + Contact *contact = getContacts()->contact(m_id); + if (contact) + res += contact->getName(); + else + return QString::null; + void *data; + Client *client = m_edit->client(data, false, true, id()); + if (client && data){ + res += ' '; + res += client->contactName(data); + if (!m_edit->m_resource.isEmpty()) + { + res += '/'; + res += m_edit->m_resource; + } + bool bFrom = false; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *pClient = getContacts()->getClient(i); + if (pClient == client) + continue; + Contact *contact; + clientData *data1 = (clientData*)data; + if (pClient->isMyData(data1, contact)){ + bFrom = true; + break; + } + } + if (bFrom){ + res += ' '; + if (m_edit->m_bReceived){ + res += i18n("to %1") .arg(client->name()); + }else{ + res += i18n("from %1") .arg(client->name()); + } + } + } + return res; +} + +QString UserWnd::getIcon() +{ + Contact *contact = getContacts()->contact(m_id); + if(!contact) { + log(L_ERROR, "Contact %lu not found!", m_id); + return QString::null; + } + unsigned long status = STATUS_UNKNOWN; + unsigned style; + QString statusIcon; + void *data; + Client *client = m_edit->client(data, false, true, id()); + if (client){ + client->contactInfo(data, status, style, statusIcon); + }else{ + contact->contactInfo(style, statusIcon); + } + return statusIcon; +} + +void UserWnd::modeChanged() +{ + if (CorePlugin::instance()->getContainerMode()) + { + if (m_view == NULL) + m_view = new MsgView(m_splitter, m_id); + m_splitter->insertWidget(0, m_view); + m_splitter->setStretchFactor(0, 0); + m_view->show(); + int editHeight = getEditHeight(); + if (editHeight == 0) + editHeight = CorePlugin::instance()->value("EditHeight").toInt(); //getEditHeight(); + if (editHeight){ + QList s; + s.append(1); + s.append(editHeight); + m_bResize = true; + m_splitter->setSizes(s); + m_bResize = false; + } + } + else + { + if (m_view){ + delete m_view; + m_view = NULL; + } + } +} + +void UserWnd::editHeightChanged(int h) +{ + if (!m_bResize && CorePlugin::instance()->getContainerMode()){ + setEditHeight(h); + CorePlugin::instance()->setValue("EditHeight", h); + } +} + +void UserWnd::toolbarChanged(bool) +{ + if (m_bBarChanged) + return; + //saveToolbar(m_edit->m_bar, data.editBar); + //copyData(CorePlugin::instance()->data.EditBar, data.editBar, 7); +} + +unsigned UserWnd::type() +{ + return m_edit->type(); +} + +void UserWnd::setMessage(Message *msg) +{ + bool bSetFocus = false; + + Container *container = NULL; + if (topLevelWidget() && topLevelWidget()->inherits("Container")) + { + container = static_cast(topLevelWidget()); + if (container->wnd() == this) + bSetFocus = true; + } + if (!m_edit->setMessage(msg, bSetFocus)) + { + // if this does not work as expected, we have to go back + // to EventOpenMessage with Message** :( + *msg = Message(MessageGeneric); + m_edit->setMessage(msg, bSetFocus); + } + if (container) + { + container->setMessageType(msg->baseType()); + container->contactChanged(getContacts()->contact(m_id)); + } + + if ((m_view == NULL) || (msg->id() == 0)) + return; + if (m_view->findMessage(msg)) + return; + m_view->addMessage(msg); +} + +void UserWnd::setStatus(const QString &status) +{ + m_status = status; + emit statusChanged(this); +} + +void UserWnd::showListView(bool bShow) +{ + if(bShow) + { + if (m_list == NULL) + { + m_list = new UserList(this); + setStretchFactor(indexOf(m_list), 1); + connect(m_list, SIGNAL(selectChanged()), this, SLOT(selectChanged())); + + if(topLevelWidget()->inherits("Container")) + { + Container *c = qobject_cast(topLevelWidget()); + list wnd = c->windows(); + for (list::iterator it = wnd.begin(); it != wnd.end(); ++it) + m_list->select((*it)->id()); + } + } + m_list->show(); + emit multiplyChanged(); + return; + } + if (m_list == NULL) + return; + delete m_list; + m_list = NULL; + emit multiplyChanged(); +} + +void UserWnd::selectChanged() +{ + emit multiplyChanged(); +} + +void UserWnd::closeEvent(QCloseEvent *e) +{ + QSplitter::closeEvent(e); + m_bClosed = true; + QTimer::singleShot(0, topLevelWidget(), SLOT(wndClosed())); +} + +void UserWnd::markAsRead() +{ + if (m_view == NULL) + return; + for (list::iterator it = CorePlugin::instance()->unread.begin(); it != CorePlugin::instance()->unread.end(); ) + { + if (it->contact != m_id) + { + ++it; + continue; + } + Message *msg = History::load(it->id, it->client, it->contact); + CorePlugin::instance()->unread.erase(it); + if (msg){ + EventMessageRead(msg).process(); + delete msg; + } + it = CorePlugin::instance()->unread.begin(); + } +} + diff --git a/plugins/_core/userwnd.h b/plugins/_core/userwnd.h new file mode 100644 index 0000000..a13fa64 --- /dev/null +++ b/plugins/_core/userwnd.h @@ -0,0 +1,87 @@ +/*************************************************************************** + userwnd.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _USERWND_H +#define _USERWND_H + +#include "cfg.h" +#include "message.h" + +#include +#include +#include + +class MsgEdit; +class MsgView; +class CorePlugin; +class QToolBar; +class UserList; + +struct UserWndData +{ + SIM::Data EditHeight; + SIM::Data editBar[7]; + SIM::Data MessageType; +}; + +class UserWnd : public QSplitter +{ + Q_OBJECT +public: + UserWnd(unsigned long id, Buffer *cfg, bool bReceived, bool bAdjust); + ~UserWnd(); + QByteArray getConfig(); + unsigned long id() const { return m_id; } + QString getName(); + QString getLongName(); + QString getIcon(); + unsigned type(); + void setMessage(SIM::Message*); + void setStatus(const QString&); + void showListView(bool bShow); + QString status() { return m_status; } + UserList *m_list; + void markAsRead(); + bool isClosed() { return m_bClosed; } + bool m_bTyping; + PROP_ULONG(MessageType); +signals: + void closed(UserWnd*); + void statusChanged(UserWnd*); + void multiplyChanged(); +protected slots: + void modeChanged(); + void editHeightChanged(int); + void toolbarChanged(bool); + void selectChanged(); +protected: + PROP_ULONG(EditHeight); + void closeEvent(QCloseEvent*); + MsgView *m_view; + MsgEdit *m_edit; + QSplitter *m_splitter; + QString m_status; + bool m_bResize; + bool m_bClosed; + bool m_bBarChanged; + unsigned long m_id; + UserWndData data; + friend class MsgEdit; +}; + +#endif + diff --git a/plugins/about/CMakeLists.txt b/plugins/about/CMakeLists.txt new file mode 100644 index 0000000..b682c4c --- /dev/null +++ b/plugins/about/CMakeLists.txt @@ -0,0 +1,24 @@ +################# +# about library # +################# +IF(BUILD_DROPPED) + +SET(about_SRCS + about.cpp + aboutdlg.cpp +) + +SET(about_HDRS + about.h + aboutdlg.h +) + +SET(about_UICS + aboutdlgbase.ui +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(about) +ENDIF(BUILD_DROPPED) diff --git a/plugins/about/about.cpp b/plugins/about/about.cpp new file mode 100644 index 0000000..5c35cf4 --- /dev/null +++ b/plugins/about/about.cpp @@ -0,0 +1,157 @@ +/*************************************************************************** + about.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#ifdef USE_KDE +#include +#include +#else +#include "aboutdlg.h" +#endif +#include + +#include "misc.h" + +#include "about.h" +#include "aboutdata.h" +#include "core_consts.h" + +using namespace SIM; + +Plugin *createAboutPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new AboutPlugin(base); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("About"), + I18N_NOOP("Plugin provides about information"), + VERSION, + createAboutPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +AboutPlugin::AboutPlugin(unsigned base) + : Plugin(base) +{ + CmdBugReport = registerType(); + CmdAbout = registerType(); +#ifdef USE_KDE + CmdAboutKDE = registerType(); +#endif + + Command cmd; + cmd->id = CmdBugReport; + cmd->text = I18N_NOOP("&Bug report / Requests"); + cmd->bar_id = ToolBarMain; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0xF000; + EventCommandCreate(cmd).process(); + + about = NULL; + cmd->id = CmdAbout; + cmd->text = I18N_NOOP("&About Sim-IM"); + cmd->icon = "SIM"; + EventCommandCreate(cmd).process(); + +#ifdef USE_KDE + about_kde = NULL; + cmd->id = CmdAboutKDE; + cmd->text = I18N_NOOP("About &KDE"); + cmd->icon = "about_kde"; + EventCommandCreate(cmd).process(); +#endif +} + +AboutPlugin::~AboutPlugin() +{ + if (about) + delete about; +#ifdef USE_KDE + if (about_kde) + delete about_kde; +#endif + EventCommandRemove(CmdBugReport).process(); + EventCommandRemove(CmdAbout).process(); +} + +bool AboutPlugin::processEvent(Event *e) +{ + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->id == CmdBugReport){ + QString s = "http://developer.berlios.de/bugs/?group_id=4482"; + EventGoURL eURL(s); + eURL.process(); + } + if (cmd->id == CmdAbout){ + if (about == NULL) + { + KAboutData *about_data = getAboutData(); + about_data->setTranslator( + I18N_NOOP("_: NAME OF TRANSLATORS\nYour names"), + I18N_NOOP("_: EMAIL OF TRANSLATORS\nYour emails")); + + about = new KAboutApplication( about_data, NULL, "about", false ); + connect(about, SIGNAL(finished()), this, SLOT(aboutDestroyed())); + } + raiseWindow(about); + } +#ifdef USE_KDE + if (cmd->id == CmdAboutKDE){ + if (about_kde == NULL) + { + about_kde = new KAboutKDE( NULL, "aboutkde", false); + connect(about_kde, SIGNAL(finished()), this, SLOT(aboutDestroyed())); + } + raiseWindow(about_kde); + } +#endif + } + return false; +} + +void AboutPlugin::aboutDestroyed() +{ + QTimer::singleShot( 0, this, SLOT(realDestroy()) ); +} + +void AboutPlugin::realDestroy() +{ + if ((about != NULL) && about->isVisible() == false ) + { + delete about; + about = NULL; + } +#ifdef USE_KDE + if ((about_kde != NULL) && about_kde->isVisible() == false ) + { + delete about_kde; + about_kde = NULL; + } +#endif +} + diff --git a/plugins/about/about.h b/plugins/about/about.h new file mode 100644 index 0000000..ceb66f0 --- /dev/null +++ b/plugins/about/about.h @@ -0,0 +1,49 @@ +/*************************************************************************** + about.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ABOUT_H +#define _ABOUT_H + +#include + +#include "event.h" +#include "plugins.h" + +class QWidget; + +class AboutPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + AboutPlugin(unsigned); + virtual ~AboutPlugin(); +protected slots: + void aboutDestroyed(); + void realDestroy(); +protected: + virtual bool processEvent(SIM::Event*); + unsigned long CmdBugReport; + unsigned long CmdAbout; + QWidget *about; +#ifdef USE_KDE + unsigned CmdAboutKDE; + QWidget *about_kde; +#endif +}; + +#endif + diff --git a/plugins/about/about.rc b/plugins/about/about.rc new file mode 100644 index 0000000..5da6a7d --- /dev/null +++ b/plugins/about/about.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "About plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "about\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "about.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/about/about.vcproj b/plugins/about/about.vcproj new file mode 100644 index 0000000..05a8524 --- /dev/null +++ b/plugins/about/about.vcproj @@ -0,0 +1,438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/about/aboutdlg.cpp b/plugins/about/aboutdlg.cpp new file mode 100644 index 0000000..667da67 --- /dev/null +++ b/plugins/about/aboutdlg.cpp @@ -0,0 +1,152 @@ +/*************************************************************************** + aboutdlg.cpp - description + ------------------- + begin : Sun Mar 24 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#ifndef USE_KDE + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aboutdata.h" +#include "icons.h" +#include "misc.h" +#include "simgui/textshow.h" + +#include "aboutdlg.h" +#include "about.h" + +using namespace SIM; + +KAboutApplication::KAboutApplication( const KAboutData *aboutData, QWidget *parent, const char *name, bool modal) + : QDialog(parent) +{ + setupUi(this); + SET_WNDPROC("about"); + setButtonsPict(this); + setObjectName(name); + setModal(modal); + + connect(btnOK, SIGNAL(clicked()), this, SLOT(close())); + setWindowIcon(SIM::Icon("SIM")); + QIcon icon = SIM::Icon("SIM"); + lblIcon->setPixmap(SIM::Pict("SIM")); + edtVersion->setText(i18n("%1 Version: %2") .arg(aboutData->appName()) .arg(aboutData->version())); + edtVersion->setReadOnly(true); + txtAbout->setText((QString("

    %1

    %2

    ") + + "%4

    " + + i18n("Bug report") + ": %6
    " + + i18n("Note: This is an english mailing list") + + "
    ") + .arg(quote(aboutData->shortDescription())) + .arg(quote(aboutData->copyrightStatement())) + .arg(quote(aboutData->homepage())) + .arg(quote(aboutData->homepage())) + .arg(quote(aboutData->bugAddress())) + .arg(quote(aboutData->bugAddress()))); + QString txt; + KAboutPerson person; + foreach( person, aboutData->authors() ) + { + txt += addPerson(&person); + txt += "
    "; + } + txtAuthors->setText(txt); + txt = QString::null; + QList translators = aboutData->translators(); + QList::iterator itt; + if (!translators.isEmpty()) + { + for (itt = translators.begin(); itt != translators.end(); ++itt) + { + const KAboutTranslator &t = *itt; + txt += QString("
    %1
    <%3>") + .arg(quote(t.name())) + .arg(quote(t.emailAddress())) + .arg(quote(t.emailAddress())); + txt += "
    "; + } + txtTranslations->setText(txt); + } + else + { + tabMain->removeTab(tabMain->indexOf(tabTranslation)); + } + QString license = aboutData->license(); + license += "\n\n"; + QFile f(SIM::app_file("COPYING")); + if (f.open(QIODevice::ReadOnly)) + { + for (;;) + { + QString s = QString(f.readLine(512)); + if(s.isEmpty() || s.isNull()) + break; + license += s; + } + } + txtLicence->setText(quote(license)); + this->setFixedSize(this->width()+50,this->height()); +} + +KAboutApplication::~KAboutApplication() +{ +} + +void KAboutApplication::closeEvent(QCloseEvent *e) +{ + QDialog::closeEvent(e); + emit finished(); +} + +QString KAboutApplication::addPerson(const KAboutPerson *p) +{ + QString res; + if (!p->task().isEmpty()){ + res += quote(p->task()); + res += ":
    "; + } + res += QString("%1 <%3>
    ") + .arg(quote(p->name())) + .arg(quote(p->emailAddress())) + .arg(quote(p->emailAddress())); + if (!p->webAddress().isEmpty()) + res += QString("%2
    ") + .arg(quote(p->webAddress())) + .arg(quote(p->webAddress())); + return res; +} + +QString KAboutApplication::quote(const QString &s) +{ + QString res = s; + res.replace('&', "&"); + res.replace('\"', """); + res.replace('<', "<"); + res.replace('>', ">"); + res.replace('\n', "
    "); + return res; +} + +#endif + diff --git a/plugins/about/aboutdlg.h b/plugins/about/aboutdlg.h new file mode 100644 index 0000000..3bfd97e --- /dev/null +++ b/plugins/about/aboutdlg.h @@ -0,0 +1,47 @@ +/*************************************************************************** + aboutdlg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ABOUTDLG_H +#define _ABOUTDLG_H + +#include "simapi.h" +#include + +#ifndef USE_KDE + +#include "ui_aboutdlgbase.h" + +class KAboutData; +class KAboutPerson; + +class KAboutApplication : public QDialog, public Ui::AboutDlgBase +{ + Q_OBJECT +public: + KAboutApplication(const KAboutData *aboutData, QWidget *parent=0, const char *name=0, bool modal=true); + ~KAboutApplication(); +signals: + void finished(); +protected: + void closeEvent(QCloseEvent*); + QString addPerson(const KAboutPerson*); + QString quote(const QString &s); +}; + +#endif +#endif + diff --git a/plugins/about/aboutdlgbase.ui b/plugins/about/aboutdlgbase.ui new file mode 100644 index 0000000..8327799 --- /dev/null +++ b/plugins/about/aboutdlgbase.ui @@ -0,0 +1,194 @@ + + + AboutDlgBase + + + + 0 + 0 + 420 + 300 + + + + + 0 + 0 + + + + About Sim-IM + + + + 11 + + + + + + About + + + + 11 + + + + + + + + + Authors + + + + 11 + + + + + + 0 + 0 + + + + + + + + + Translation + + + + 11 + + + + + + + + + License + + + + 11 + + + + + + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Close + + + + + + + + + + + + Qt::AlignCenter + + + false + + + + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 255 + 255 + 255 + + + + + + + + + 212 + 208 + 200 + + + + + + + + false + + + + + + + + TextShow + QWidget +
    simgui/textshow.h
    +
    +
    + + +
    diff --git a/plugins/action/CMakeLists.txt b/plugins/action/CMakeLists.txt new file mode 100644 index 0000000..f854cc6 --- /dev/null +++ b/plugins/action/CMakeLists.txt @@ -0,0 +1,29 @@ +################## +# action library # +################## +IF(BUILD_DROPPED) +SET(action_SRCS + action.cpp + actioncfg.cpp + additem.cpp + menucfg.cpp +) + +SET(action_HDRS + action.h + actioncfg.h + additem.h + menucfg.h +) + +SET(action_UICS + actioncfgbase.ui + additembase.ui + menucfgbase.ui +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(action) +ENDIF(BUILD_DROPPED) diff --git a/plugins/action/action.cpp b/plugins/action/action.cpp new file mode 100644 index 0000000..9802d11 --- /dev/null +++ b/plugins/action/action.cpp @@ -0,0 +1,306 @@ +/*************************************************************************** + action.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include + +#include "log.h" +#include "unquot.h" +#include "core.h" + +#include "contacts/contact.h" + +#include "action.h" +#include "actioncfg.h" + +using namespace std; +using namespace SIM; + +Plugin *createActionPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new ActionPlugin(base); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Action"), + I18N_NOOP("Plugin execute external programs on event or from contact menu"), + VERSION, + createActionPlugin, + PLUGIN_NOLOAD_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +static DataDef actionUserData[] = + { + { "OnLine", DATA_UTF, 1, 0 }, + { "Status", DATA_UTF, 1, 0 }, + { "Message", DATA_UTFLIST, 1, 0 }, + { "Menu", DATA_UTFLIST, 1, 0 }, + { "NMenu", DATA_ULONG, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +static ActionPlugin *plugin = NULL; + +static QWidget *getActionSetup(QWidget *parent, PropertyHubPtr data) +{ + return new ActionConfig(parent, data, plugin); +} + +ActionPlugin::ActionPlugin(unsigned base) + : Plugin(base), EventReceiver(HighPriority) +{ + plugin = this; + + //action_data_id = getContacts()->registerUserData(info.title, actionUserData); + CmdAction = registerType(); + + Command cmd; + cmd->id = action_data_id; + cmd->text = I18N_NOOP("&Action"); + cmd->icon = "run"; + cmd->param = (void*)getActionSetup; + EventAddPreferences(cmd).process(); + + cmd->id = CmdAction; + cmd->text = "_"; + cmd->icon = QString::null; + cmd->flags = COMMAND_CHECK_STATE; + cmd->menu_id = MenuContact; + cmd->menu_grp = 0xC000; + cmd->param = NULL; + EventCommandCreate(cmd).process(); +} + +ActionPlugin::~ActionPlugin() +{ + EventCommandRemove(CmdAction).process(); + EventRemovePreferences(action_data_id).process(); + getContacts()->unregisterUserData(action_data_id); +} + +QWidget *ActionPlugin::createConfigWindow(QWidget *parent) +{ + SIM::PropertyHubPtr data = getContacts()->getUserData("action"); + return new ActionConfig(parent, data, this); +} + +class MsgProcess : public QProcess +{ +protected: + Message *m_msg; +public: + MsgProcess(Message *msg, QObject *parent = 0) + : QProcess(parent), m_msg(msg) + {} + Message *msg() const { return m_msg; } +}; + +bool ActionPlugin::processEvent(Event *e) +{ + switch (e->type() ) { + case eEventCheckCommandState: { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if ((cmd->id == CmdAction) && (cmd->menu_id == MenuContact)){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + PropertyHubPtr data = contact->getUserData("action"); + if (!data || data->value("NMenu").toInt() == 0) + return false; + CommandDef *cmds = new CommandDef[data->value("NMenu").toInt() + 1]; + unsigned n = 0; + for (int i = 0; i < data->value("NMenu").toInt(); i++){ + QString str = data->stringMapValue("Menu", i +1); + QString item = getToken(str, ';'); + int pos = item.indexOf("&IP;"); + if (pos >= 0) + { + EventGetContactIP e(contact); + if (!e.process()) + continue; + } + pos = item.indexOf("&Mail;"); + if (pos >= 0) + { + if (contact->getEMails().isEmpty()) + continue; + } + pos = item.indexOf("&Phone;"); + if (pos >= 0) + { + if (contact->getPhones().isEmpty()) + continue; + } + cmds[n].id = CmdAction + i; + cmds[n].text = "_"; + cmds[n].text_wrk = item; + n++; + } + if (n == 0) + { + delete[] cmds; + return false; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + break; + } + case eEventCommandExec: { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->menu_id == MenuContact) && (cmd->id >= CmdAction)){ + unsigned n = cmd->id - CmdAction; + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + PropertyHubPtr data = contact->getUserData("action"); + if (!contact || !data || n >= data->value("NMenu").toLongLong()) + return false; + + QString str = data->stringMapValue("Menu", n +1); + getToken(str, ';'); + EventTemplate::TemplateExpand t; + t.tmpl = str; + t.contact = contact; + t.receiver = this; + t.param = NULL; + EventTemplateExpand(&t).process(); + return true; + } + break; + } + case eEventContact: { + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eOnline) + break; + Contact *contact = ec->contact(); + if (contact == NULL) + return false; + PropertyHubPtr data = contact->getUserData("action"); + if (!data || data->value("OnLine").toString().isEmpty()) + return false; + EventTemplate::TemplateExpand t; + t.tmpl = data->value("OnLine").toString(); + t.contact = contact; + t.receiver = this; + t.param = NULL; + EventTemplateExpand(&t).process(); + return true; + } + case eEventMessageReceived: { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + Contact *contact = getContacts()->contact(msg->contact()); + if (contact == NULL) + return false; + PropertyHubPtr data = contact->getUserData("action"); + if (!data) + return false; + if (msg->type() == MessageStatus){ + if (data->value("Status").toString().isEmpty()) + return false; + EventTemplate::TemplateExpand t; + t.tmpl = data->value("Status").toString(); + t.contact = contact; + t.receiver = this; + t.param = NULL; + EventTemplateExpand(&t).process(); + return false; + } + QString cmd = data->stringMapValue("Message",msg->baseType()); + if (cmd.isEmpty()) + return false; + EventTemplate::TemplateExpand t; + t.tmpl = cmd; + t.contact = contact; + t.receiver = this; + t.param = msg; + EventTemplateExpand(&t).process(); + return true; + } + case eEventTemplateExpanded: { + EventTemplate *et = static_cast(e); + EventTemplate::TemplateExpand *t = et->templateExpand(); + Message *msg = (Message*)(t->param); + QProcess *proc; + if (msg){ + QString text = t->tmpl + unquoteText(msg->presentation()); + proc = new MsgProcess(msg, this); + connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(msg_ready(int, QProcess::ExitStatus))); + proc->start(text); + }else{ + proc = new QProcess(this); + connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(ready(int, QProcess::ExitStatus))); + proc->start(t->tmpl); + } + break; + } + default: + break; + } + return false; +} + +void ActionPlugin::ready(int exitCode, QProcess::ExitStatus exitStatus) +{ + // if this does not work as expected we've to remember the pid + QProcess ptr in a map + // using a list is not the correct way to go! + QProcess *p = qobject_cast(sender()); + if(!p) + return; + if (exitStatus != QProcess::NormalExit || exitCode != 0) + log(L_WARN, "QProcess fail: %u, %u", exitStatus, exitCode); + p->deleteLater(); +} + +void ActionPlugin::msg_ready(int exitCode, QProcess::ExitStatus exitStatus) +{ + // if this does not work as expected we've to remember the pid + QProcess ptr in a map + // using a list is not the correct way to go! + QProcess *p = qobject_cast(sender()); + if(!p) + return; + Message *msg = static_cast(p)->msg(); + if (exitStatus != QProcess::NormalExit || exitCode != 0) { + EventMessageReceived e(msg); + if (!e.process(this)) + delete msg; + }else{ + QByteArray bOut = p->readAllStandardOutput(); + if (!bOut.isEmpty()){ + msg->setFlags(msg->getFlags() & ~MESSAGE_RICHTEXT); + msg->setText(QString::fromLocal8Bit(bOut)); + EventMessageReceived e(msg); + if (!e.process(this)) + delete msg; + }else{ + delete msg; + } + } + p->deleteLater(); +} diff --git a/plugins/action/action.h b/plugins/action/action.h new file mode 100644 index 0000000..65a487f --- /dev/null +++ b/plugins/action/action.h @@ -0,0 +1,57 @@ +/*************************************************************************** + action.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ACTION_H +#define _ACTION_H + +#include +#include +#include + +#include "cfg.h" +#include "event.h" +#include "plugins.h" + +class QProcess; + +struct ActionUserData +{ + SIM::Data OnLine; + SIM::Data Status; + SIM::Data Message; + SIM::Data Menu; + SIM::Data NMenu; +}; + +class ActionPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + ActionPlugin(unsigned); + virtual ~ActionPlugin(); + unsigned long action_data_id; +protected slots: + void ready(int, QProcess::ExitStatus); + void msg_ready(int, QProcess::ExitStatus); +protected: + unsigned long CmdAction; + virtual bool processEvent(SIM::Event*); + QWidget *createConfigWindow(QWidget *parent); +}; + +#endif + diff --git a/plugins/action/action.rc b/plugins/action/action.rc new file mode 100644 index 0000000..3842ee7 --- /dev/null +++ b/plugins/action/action.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Action plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "action\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "action.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/action/action.vcproj b/plugins/action/action.vcproj new file mode 100644 index 0000000..f7edccc --- /dev/null +++ b/plugins/action/action.vcproj @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/action/actioncfg.cpp b/plugins/action/actioncfg.cpp new file mode 100644 index 0000000..cdfb9c6 --- /dev/null +++ b/plugins/action/actioncfg.cpp @@ -0,0 +1,160 @@ +/*************************************************************************** + actioncfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "actioncfg.h" +#include "menucfg.h" +#include "action.h" +#include "core.h" +#include "simgui/ballonmsg.h" +#include "simgui/editfile.h" + +#include +#include +#include + +using namespace SIM; + +unsigned CONTACT_ONLINE = 0x10000; +unsigned CONTACT_STATUS = 0x10001; + +static void addRow(QTableWidget *lstEvent, int row, const QIcon &icon, const QString &text, + unsigned int id, const QString &program) +{ + QTableWidgetItem *item; + lstEvent->setRowCount(row+1); + + item = new QTableWidgetItem(icon, text); + item->setData(Qt::UserRole, id); + item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); + lstEvent->setItem(row, 0, item); + + item = new QTableWidgetItem(program); + item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled|Qt::ItemIsEditable); + lstEvent->setItem(row, 1, item); +} + +ActionConfig::ActionConfig(QWidget *parent, SIM::PropertyHubPtr data, ActionPlugin *plugin) + : QWidget(parent) + , m_menu(NULL) + , m_data(data) + , m_plugin(plugin) +{ + setupUi(this); + setButtonsPict(this); + + connect(btnHelp, SIGNAL(clicked()), this, SLOT(help())); + + int row = 0; + addRow(lstEvent, row, Icon("SIM"), i18n("Contact online"), CONTACT_ONLINE, data->value("OnLine").toString() ); + + row++; + addRow(lstEvent, row, Icon("SIM"), i18n("Status changed"), CONTACT_STATUS, data->value("Status").toString() ); + + CommandDef *cmd; + CorePlugin *core = GET_CorePlugin(); + CommandsMapIterator it(core->messageTypes); + while ((cmd = ++it) != NULL){ + MessageDef *def = (MessageDef*)(cmd->param); + if ((def == NULL) || (cmd->icon.isEmpty()) || + (def->flags & (MESSAGE_HIDDEN | MESSAGE_SENDONLY | MESSAGE_CHILD))) + continue; + if ((def->singular == NULL) || (def->plural == NULL) || + (*def->singular == 0) || (*def->plural == 0)) + continue; + QString type = i18n(def->singular, def->plural, 1); + int pos = type.indexOf("1 "); + if (pos == 0){ + type = type.mid(2); + }else if (pos > 0){ + type = type.left(pos); + } + type = type.left(1).toUpper() + type.mid(1); + + row++; + addRow(lstEvent, row, Icon(cmd->icon), type, cmd->id, data->stringMapValue("Message", cmd->id)); + } + EventTmplHelpList e; + e.process(); + LineEditDelegate *dg = new LineEditDelegate(1, lstEvent); + dg->setHelpList(e.helpList()); + lstEvent->setItemDelegate(dg); + lstEvent->resizeColumnToContents(0); + lstEvent->sortByColumn(0, Qt::AscendingOrder); + + for (QObject *p = parent; p != NULL; p = p->parent()){ + QTabWidget *tab = qobject_cast(p); + if (!tab) + continue; + m_menu = new MenuConfig(tab, data); + tab->addTab(m_menu, i18n("Menu")); + tab->adjustSize(); + break; + } +} + +ActionConfig::~ActionConfig() +{ +} + +void ActionConfig::apply() +{ + PropertyHubPtr data = getContacts()->getUserData("action"); + apply(data); +} + +void ActionConfig::apply(PropertyHubPtr data) +{ + //ActionUserData *data = (ActionUserData*)_data; + if (m_menu) + m_menu->apply(data); + + for (int row = 0; row < lstEvent->rowCount(); ++row) + { + unsigned id = lstEvent->item(row, 0)->data(Qt::UserRole).toUInt(); + const QString text = lstEvent->item(row, 1)->data(Qt::EditRole).toString(); + + if (id == CONTACT_ONLINE) + data->setValue("OnLine", text); + else if (id == CONTACT_STATUS) + data->setValue("Status", text); + else + data->setStringMapValue("Message",id, text); + } +} + +void ActionConfig::setEnabled(bool state) +{ + if (m_menu) + m_menu->setEnabled(state); + QWidget::setEnabled(state); +} + +void ActionConfig::help() +{ + QString helpString = i18n("In command line you can use:") + "\n"; + EventTmplHelp e(helpString); + e.process(); + helpString = e.help(); + helpString += "\n\n"; + helpString += i18n("For message events message text will be sent on standard input of the program.\n" + "If the program will return a zero error code message text will be replaced with program output.\n" + "If program output is empty, message will be destroyed.\n" + "Thus it is possible to organize additional messages filters.\n"); + BalloonMsg::message(helpString, btnHelp, false, 400); +} + diff --git a/plugins/action/actioncfg.h b/plugins/action/actioncfg.h new file mode 100644 index 0000000..333e7af --- /dev/null +++ b/plugins/action/actioncfg.h @@ -0,0 +1,48 @@ +/*************************************************************************** + actioncfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ACTIONCFG_H +#define _ACTIONCFG_H + +#include "ui_actioncfgbase.h" +#include "propertyhub.h" + +using namespace SIM; + +struct ActionUserData; +class ActionPlugin; +class MenuConfig; + +class ActionConfig : public QWidget, public Ui::ActionConfigBase +{ + Q_OBJECT +public: + ActionConfig(QWidget *parent, SIM::PropertyHubPtr data, ActionPlugin *plugin); + virtual ~ActionConfig(); +public slots: + void apply(); + void apply(PropertyHubPtr); + void help(); +protected: + MenuConfig *m_menu; + void setEnabled (bool); + SIM::PropertyHubPtr m_data; + ActionPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/action/actioncfgbase.ui b/plugins/action/actioncfgbase.ui new file mode 100644 index 0000000..592f737 --- /dev/null +++ b/plugins/action/actioncfgbase.ui @@ -0,0 +1,97 @@ + + + ActionConfigBase + + + + 0 + 0 + 370 + 220 + + + + Form1 + + + + 11 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Help + + + 4144 + + + + + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + true + + + false + + + true + + + false + + + 25 + + + 25 + + + + Event + + + + + Program + + + + + + + + + diff --git a/plugins/action/additem.cpp b/plugins/action/additem.cpp new file mode 100644 index 0000000..be3408b --- /dev/null +++ b/plugins/action/additem.cpp @@ -0,0 +1,64 @@ +/*************************************************************************** + additem.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "additem.h" +#include "core.h" +#include "core_events.h" + +#include "simgui/ballonmsg.h" +#include "simgui/editfile.h" + +#include +#include +#include + +using namespace SIM; + +AddItem::AddItem(QWidget *parent) + : QDialog(parent) +{ + setupUi(this); + setModal(true); + setWindowIcon(Icon("run")); + setButtonsPict(this); + QTimer::singleShot(0, this, SLOT(changed())); + connect(edtItem, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPrg, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(buttonHelp, SIGNAL(clicked()), this, SLOT(help())); + EventTmplHelpList e; + e.process(); + edtPrg->setHelpList(e.helpList()); +} + +void AddItem::changed() +{ + buttonOk->setEnabled(!edtItem->text().isEmpty() && !edtPrg->text().isEmpty()); +} + +void AddItem::changed(const QString&) +{ + changed(); +} + +void AddItem::help() +{ + QString helpString = i18n("In command line you can use:") + "\n"; + EventTmplHelp e(helpString); + e.process(); + BalloonMsg::message(e.help(), buttonHelp, false, 400); +} diff --git a/plugins/action/additem.h b/plugins/action/additem.h new file mode 100644 index 0000000..9d54ddd --- /dev/null +++ b/plugins/action/additem.h @@ -0,0 +1,35 @@ +/*************************************************************************** + additem.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ADDITEM_H +#define _ADDITEM_H + +#include "ui_additembase.h" + +class AddItem : public QDialog, public Ui::AddItemBase +{ + Q_OBJECT +public: + AddItem(QWidget *parent); +public slots: + void changed(); + void changed(const QString&); + void help(); +}; + +#endif + diff --git a/plugins/action/additembase.ui b/plugins/action/additembase.ui new file mode 100644 index 0000000..640e0d0 --- /dev/null +++ b/plugins/action/additembase.ui @@ -0,0 +1,171 @@ + + + AddItemBase + + + + 0 + 0 + 387 + 170 + + + + Add Item + + + true + + + + 6 + + + 11 + + + + + Item: + + + false + + + + + + + + + + Program: + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + 6 + + + 0 + + + + + &Help + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + + + LineEdit + QWidget +
    simgui/editfile.h
    +
    +
    + + + + buttonOk + clicked() + AddItemBase + accept() + + + 20 + 20 + + + 20 + 20 + + + + + buttonCancel + clicked() + AddItemBase + reject() + + + 20 + 20 + + + 20 + 20 + + + + +
    diff --git a/plugins/action/menucfg.cpp b/plugins/action/menucfg.cpp new file mode 100644 index 0000000..a17fa2a --- /dev/null +++ b/plugins/action/menucfg.cpp @@ -0,0 +1,116 @@ +/*************************************************************************** + menucfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#include "misc.h" +#include "menucfg.h" +#include "action.h" +#include "additem.h" + +#include "simgui/editfile.h" + +#include + +using namespace SIM; + +MenuConfig::MenuConfig(QWidget *parent, PropertyHubPtr data) + : QWidget(parent) + , m_data(data) +{ + setupUi(this); + + connect(lstMenu, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged())); + connect(btnAdd, SIGNAL(clicked()), this, SLOT(add())); + connect(btnEdit, SIGNAL(clicked()), this, SLOT(edit())); + connect(btnRemove, SIGNAL(clicked()), this, SLOT(remove())); + + for (int row = 0; row < m_data->value("NMenu").toInt(); row++){ + lstMenu->setRowCount(row+1); + + const QStringList sl = data->stringMapValue("Menu", row +1).split(';'); + if(sl.count() != 2) + continue; + + QTableWidgetItem *item = new QTableWidgetItem(sl[0]); + lstMenu->setItem(row, 0, item); + + item = new QTableWidgetItem(sl[1]); + lstMenu->setItem(row, 1, item); + } + itemSelectionChanged(); +} + +MenuConfig::~MenuConfig() +{ +} + +void MenuConfig::itemSelectionChanged() +{ + const bool rowSelected = (lstMenu->selectedItems().count() == 2); + btnEdit->setEnabled(rowSelected); + btnRemove->setEnabled(rowSelected); +} + +void MenuConfig::add() +{ + AddItem add(topLevelWidget()); + if (add.exec()){ + const int row = lstMenu->rowCount(); + lstMenu->setRowCount(row+1); + + QTableWidgetItem *item = new QTableWidgetItem(add.edtItem->text()); + lstMenu->setItem(row, 0, item); + + item = new QTableWidgetItem(add.edtPrg->text()); + lstMenu->setItem(row, 1, item); + + lstMenu->resizeColumnToContents(0); + } +} + +void MenuConfig::edit() +{ + const int row = lstMenu->currentRow(); + if (row < 0) + return; + AddItem add(topLevelWidget()); + add.edtItem->setText(lstMenu->item(row, 0)->text()); + add.edtPrg->setText(lstMenu->item(row, 1)->text()); + if (add.exec()){ + lstMenu->item(row, 0)->setText(add.edtItem->text()); + lstMenu->item(row, 1)->setText(add.edtPrg->text()); + lstMenu->resizeColumnToContents(0); + } +} + +void MenuConfig::remove() +{ + lstMenu->removeRow(lstMenu->currentRow()); +} + +void MenuConfig::apply(PropertyHubPtr data) +{ + //ActionUserData *data = (ActionUserData*)_data; + data->clearStringMap("Menu"); + data->setValue("NMenu", 0); + for (int row = 0; row < lstMenu->rowCount(); ++row){ + QString s = lstMenu->item(row, 0)->text() + ";" + lstMenu->item(row, 1)->text(); + data->setValue("NMenu", data->value("NMenu").toUInt() + 1); + data->setStringMapValue("Menu", data->value("NMenu").toUInt(), s); + } +} + diff --git a/plugins/action/menucfg.h b/plugins/action/menucfg.h new file mode 100644 index 0000000..0e1cb50 --- /dev/null +++ b/plugins/action/menucfg.h @@ -0,0 +1,44 @@ +/*************************************************************************** + menucfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MENUCFG_H +#define _MENUCFG_H + +#include "ui_menucfgbase.h" +#include "propertyhub.h" + +using namespace SIM; +struct ActionUserData; //RemoveMe? + +class MenuConfig : public QWidget, public Ui::MenuConfigBase +{ + Q_OBJECT +public: + MenuConfig(QWidget *parent, PropertyHubPtr data); + virtual ~MenuConfig(); +public Q_SLOTS: + void apply(PropertyHubPtr); + void itemSelectionChanged(); + void add(); + void edit(); + void remove(); +protected: + PropertyHubPtr m_data; +}; + +#endif + diff --git a/plugins/action/menucfgbase.ui b/plugins/action/menucfgbase.ui new file mode 100644 index 0000000..534ee29 --- /dev/null +++ b/plugins/action/menucfgbase.ui @@ -0,0 +1,109 @@ + + + MenuConfigBase + + + + 0 + 0 + 338 + 219 + + + + Form1 + + + + 6 + + + 11 + + + + + QAbstractItemView::SelectRows + + + false + + + false + + + true + + + false + + + false + + + true + + + + Item + + + + + Program + + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Add + + + + + + + &Edit + + + + + + + &Delete + + + + + + + + + + diff --git a/plugins/action/resource.h b/plugins/action/resource.h new file mode 100644 index 0000000..6a6e650 --- /dev/null +++ b/plugins/action/resource.h @@ -0,0 +1,18 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by action.rc +// +#define LANG_NEUTRAL 0 +#define SUBLANG_NEUTRAL 0 +#define IDI_ICON1 1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/plugins/autoaway/CMakeLists.txt b/plugins/autoaway/CMakeLists.txt new file mode 100644 index 0000000..f30e6a3 --- /dev/null +++ b/plugins/autoaway/CMakeLists.txt @@ -0,0 +1,70 @@ +IF(BUILD_DROPPED) +IF(NOT WIN32 AND NOT APPLE) + INCLUDE(CheckFunctionExists) + INCLUDE(FindX11) + INCLUDE(CheckLibraryExists) + #SET(CMAKE_REQUIRED_LIBRARIES "X11 Xext m") + CHECK_LIBRARY_EXISTS("Xext" "XScreenSaverRegister" "${X11_LIBRARY_DIR}" XSS_IN_XEXT) + IF(XSS_IN_XEXT) + SET(XSS_LIB "Xext") + ELSE(XSS_IN_XEXT) + CHECK_LIBRARY_EXISTS("Xss" "XScreenSaverRegister" "${X11_LIBRARY_DIR}" XSS_IN_XSS) + IF(XSS_IN_XSS) + SET(XSS_LIB "Xss") + ENDIF(XSS_IN_XSS) + ENDIF(XSS_IN_XEXT) + IF(XSS_LIB) + CHECK_INCLUDE_FILES("X11/extensions/scrnsaver.h" HAVE_X11_EXTENSIONS_SCRNSAVER) + ENDIF(XSS_LIB) + IF(HAVE_X11_EXTENSIONS_SCRNSAVER) + SET(COMPILE_PLUGIN TRUE) + ELSE(HAVE_X11_EXTENSIONS_SCRNSAVER) + IF( X11_Xscreensaver_FOUND ) + SET(COMPILE_PLUGIN TRUE) + ENDIF( X11_Xscreensaver_FOUND ) + ENDIF(HAVE_X11_EXTENSIONS_SCRNSAVER) +ELSE(NOT WIN32 AND NOT APPLE) + SET(COMPILE_PLUGIN TRUE) +ENDIF(NOT WIN32 AND NOT APPLE) + +IF(COMPILE_PLUGIN) + #################### + # autoaway library # + #################### + SET(autoaway_SRCS + autoaway.cpp + autoawaycfg.cpp + ) + + SET(autoaway_HDRS + autoaway.h + autoawaycfg.h + ) + + SET(autoaway_UICS + autoawaycfgbase.ui + ) + + SET(autoaway_LIBS + _core + ) + + IF(WIN32) + SET(autoaway_SRCS + ${autoaway_SRCS} + idleui.cpp + ) + SET(autoaway_HDRS + ${autoaway_HDRS} + idleui.h + ) + ENDIF(WIN32) + + LINK_DIRECTORIES(${X11_LIBRARY_DIR}) + INCLUDE_DIRECTORIES(${X11_INCLUDE_DIR}) + SIM_ADD_PLUGIN(autoaway) + TARGET_LINK_LIBRARIES(autoaway ${XSS_LIB}) +ELSE(COMPILE_PLUGIN) + MESSAGE(STATUS "XScreenSaver library not found, autoaway plugin disabled") +ENDIF(COMPILE_PLUGIN) +ENDIF(BUILD_DROPPED) diff --git a/plugins/autoaway/autoaway.cpp b/plugins/autoaway/autoaway.cpp new file mode 100644 index 0000000..c759969 --- /dev/null +++ b/plugins/autoaway/autoaway.cpp @@ -0,0 +1,390 @@ +/*************************************************************************** + autoaway.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + *************************************************************************** + +Detect idle time for MAC: +Copyright (C) 2003 Tarkvara Design Inc. + +*/ + +// This is required to use Xlibint (which isn't very clean itself) +#define QT_CLEAN_NAMESPACE + +#include "simapi.h" + +#include "log.h" +#include "autoaway.h" +#include "autoawaycfg.h" +#include "core.h" + +#include "contacts/client.h" + +#ifdef WIN32 +#define _WIN32_WINNT 0x0500 +#include + +#include + +#include "idleui.h" + +static BOOL (WINAPI * _GetLastInputInfo)(PLASTINPUTINFO); + +#elif defined(HAVE_CARBON_CARBON_H) && !defined(HAVE_X) +#include +#elif defined(__OS2__) +#define INCL_WIN +#include +#include "sysglit.h" +#else +#include +#include +#include +#include +#include +#endif + +#include +#include +#include +#include + +using namespace SIM; + +const unsigned AUTOAWAY_TIME = 10000; + +Plugin *createAutoAwayPlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new AutoAwayPlugin(base, config); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("AutoAway"), + I18N_NOOP("Plugin provides set away and N/A status after some idle time"), + VERSION, + createAutoAwayPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +#if defined(HAVE_CARBON_CARBON_H) && !defined(HAVE_X) + +static unsigned mSecondsIdle = 0; +static EventLoopTimerRef mTimerRef; + +static OSStatus LoadFrameworkBundle(CFStringRef framework, CFBundleRef *bundlePtr) { + OSStatus err; + FSRef frameworksFolderRef; + CFURLRef baseURL; + CFURLRef bundleURL; + + if ( bundlePtr == nil ) return( -1 ); + + *bundlePtr = nil; + + baseURL = nil; + bundleURL = nil; + + err = FSFindFolder(kOnAppropriateDisk, kFrameworksFolderType, true, &frameworksFolderRef); + if (err == noErr) { + baseURL = CFURLCreateFromFSRef(kCFAllocatorSystemDefault, &frameworksFolderRef); + if (baseURL == nil) { + err = coreFoundationUnknownErr; + } + } + if (err == noErr) { + bundleURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault, baseURL, framework, false); + if (bundleURL == nil) { + err = coreFoundationUnknownErr; + } + } + if (err == noErr) { + *bundlePtr = CFBundleCreate(kCFAllocatorSystemDefault, bundleURL); + if (*bundlePtr == nil) { + err = coreFoundationUnknownErr; + } + } + if (err == noErr) { + if ( ! CFBundleLoadExecutable( *bundlePtr ) ) { + err = coreFoundationUnknownErr; + } + } + + // Clean up. + if (err != noErr && *bundlePtr != nil) { + CFRelease(*bundlePtr); + *bundlePtr = nil; + } + if (bundleURL != nil) { + CFRelease(bundleURL); + } + if (baseURL != nil) { + CFRelease(baseURL); + } + return err; +} + +pascal void IdleTimerAction(EventLoopTimerRef, EventLoopIdleTimerMessage inState, void* inUserData) +{ + switch (inState) { + case kEventLoopIdleTimerStarted: + case kEventLoopIdleTimerStopped: + // Get invoked with this constant at the start of the idle period, + // or whenever user activity cancels the idle. + mSecondsIdle = 0; + break; + case kEventLoopIdleTimerIdling: + // Called every time the timer fires (i.e. every second). + mSecondsIdle++; + break; + } +} + +typedef OSStatus (*InstallEventLoopIdleTimerPtr)(EventLoopRef inEventLoop, + EventTimerInterval inFireDelay, + EventTimerInterval inInterval, + EventLoopIdleTimerUPP inTimerProc, + void * inTimerData, + EventLoopTimerRef * outTimer); + +#endif + +static DataDef autoAwayData[] = + { + { "AwayTime", DATA_ULONG, 1, DATA(3) }, + { "EnableAway", DATA_BOOL, 1, DATA(1) }, + { "NATime", DATA_ULONG, 1, DATA(10)}, + { "EnableNA", DATA_BOOL, 1, DATA(1) }, + { "OffTime", DATA_ULONG, 1, DATA(10)}, + { "EnableOff", DATA_BOOL, 1, 0 }, + { "DisableAlert", DATA_BOOL, 1, DATA(1) }, + { "RealManualStatus", DATA_ULONG, 1, DATA(STATUS_UNKNOWN) }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +AutoAwayPlugin::AutoAwayPlugin(unsigned base, Buffer *config) + : Plugin(base), EventReceiver(HighPriority) +{ + load_data(autoAwayData, &data, config); +#ifdef WIN32 + (DWORD&)_GetLastInputInfo = (DWORD)QLibrary::resolve("user32.dll", "GetLastInputInfo"); +#elif defined(HAVE_CARBON_CARBON_H) && !defined(HAVE_X) +/* ToDo: + CFBundleRef carbonBundle; + if (LoadFrameworkBundle( CFSTR("Carbon.framework"), &carbonBundle ) == noErr) { + InstallEventLoopIdleTimerPtr myInstallEventLoopIdleTimer = (InstallEventLoopIdleTimerPtr)CFBundleGetFunctionPointerForName(carbonBundle, CFSTR("InstallEventLoopIdleTimer")); + if (myInstallEventLoopIdleTimer){ + EventLoopIdleTimerUPP timerUPP = NewEventLoopIdleTimerUPP(Private::IdleTimerAction); + (*myInstallEventLoopIdleTimer)(GetMainEventLoop(), kEventDurationSecond, kEventDurationSecond, timerUPP, 0, &mTimerRef); + } + } +*/ +#endif + bAway = false; + bNA = false; + bOff = false; + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); + m_timer->start(AUTOAWAY_TIME); +} + +AutoAwayPlugin::~AutoAwayPlugin() +{ +#ifdef WIN32 + // nothing to do +#elif defined(HAVE_CARBON_CARBON_H) && !defined(HAVE_X) + RemoveEventLoopTimer(mTimerRef); +#elif defined(__OS2__) + // --- +#else + // We load static Xss in our autoaway.so's process space, but the bastard + // registers for shutdown in the XDisplay variable, so after autoaway.so + // unloads, its code will still be called (as part of the XCloseDisplay). + // As Xss offers no function to unregister itself, we'll have to be a little + // messy here: + Display* dpy = QX11Info::display(); + LockDisplay(dpy); + // Original code from Xlib's ClDisplay.c + _XExtension *ext, *prev_ext = NULL; + for (ext = dpy->ext_procs; ext; prev_ext = ext, ext = ext->next) + { + if (ext->name && (strcmp(ext->name, ScreenSaverName) == 0)) + { + if (ext->close_display) + (*ext->close_display)(dpy, &ext->codes); + if (prev_ext) + prev_ext->next = ext->next; + else + dpy->ext_procs = ext->next; + Xfree((char*)ext); + break; + } + } + UnlockDisplay(dpy); +#endif + free_data(autoAwayData, &data); +} + +QByteArray AutoAwayPlugin::getConfig() +{ + return save_data(autoAwayData, &data); +} + +QWidget *AutoAwayPlugin::createConfigWindow(QWidget *parent) +{ + return new AutoAwayConfig(parent, this); +} + +void AutoAwayPlugin::timeout() +{ + CorePlugin *core = GET_CorePlugin(); + unsigned long newStatus = core->getManualStatus(); + unsigned long oldStatus =getRealManualStatus(); + unsigned idle_time = getIdleTime() / 60; + if (oldStatus != STATUS_UNKNOWN && !bAway && !bNA && !bOff){ + // If fake ManualStatus were saved in config by chace, we should replace it by real value... + newStatus = oldStatus; + oldStatus = STATUS_UNKNOWN; + } + if ((bAway && (idle_time < getAwayTime())) || + (bNA && (idle_time < getNATime())) || + (bOff && (idle_time < getOffTime()))){ + bAway = false; + bNA = false; + bOff = false; + newStatus = oldStatus; + oldStatus = STATUS_UNKNOWN; + }else if (!bAway && !bNA && !bOff && getEnableAway() && (idle_time >= getAwayTime())){ + unsigned long status = core->getManualStatus(); + if ((status == STATUS_AWAY) || (status == STATUS_NA) || (status == STATUS_OFFLINE)) + return; + oldStatus = status; + newStatus = STATUS_AWAY; + bAway = true; + }else if (!bNA && !bOff && getEnableNA() && (idle_time >= getNATime())){ + unsigned long status = core->getManualStatus(); + if ((status == STATUS_NA) || (status == STATUS_OFFLINE)) + return; + if (!bAway) + oldStatus = status; + bNA = true; + newStatus = STATUS_NA; + }else if (!bOff && getEnableOff() && (idle_time >= getOffTime())){ + unsigned long status = core->getManualStatus(); + if (status == STATUS_OFFLINE) + return; + if (!bNA) + oldStatus = status; + bOff = true; + newStatus = STATUS_OFFLINE; + } + if (newStatus == core->getManualStatus()) + return; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (!client->getCommonStatus()) + continue; + client->setStatus(newStatus, true); + } + if (core->getManualStatus() == newStatus) + return; + core->setValue("StatusTime", (unsigned int)time(NULL)); //data.StatusTime.asULong() = time(NULL); + //core->data.ManualStatus.asULong() = newStatus; + core->setValue("ManualStatus", (unsigned int)newStatus); + setRealManualStatus(oldStatus); + EventClientStatus().process(); +} + +bool AutoAwayPlugin::processEvent(Event *e) +{ + switch (e->type()) { + case eEventPlaySound: { + if (getDisableAlert() && (bAway || bNA || bOff)) + return true; + break; + } + case eEventContact: { + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eOnline) + break; + unsigned long commonStatus = STATUS_UNKNOWN; + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (!client->getCommonStatus()) + continue; + commonStatus = client->getManualStatus(); + break; + } + if ((commonStatus == STATUS_ONLINE) || (commonStatus == STATUS_OFFLINE)) + return false; + if (getDisableAlert() && (bAway || bNA || bOff)) + return true; + break; + } + default: + break; + } + return false; +} + +unsigned AutoAwayPlugin::getIdleTime() +{ +#ifdef WIN32 + if (_GetLastInputInfo){ + LASTINPUTINFO lii; + ZeroMemory(&lii,sizeof(lii)); + lii.cbSize=sizeof(lii); + _GetLastInputInfo(&lii); + return (GetTickCount()-lii.dwTime) / 1000; + } + return IdleUIGetLastInputTime(); +#elif defined(HAVE_CARBON_CARBON_H) && !defined(HAVE_X) + return mSecondsIdle; +#elif defined(__OS2__) + ULONG lastInp = WinGetLastInputTime(); + if ( lastInp == 0 ) { + return 0; + } + return (WinGetCurrentTime(WinQueryAnchorBlock(HWND_DESKTOP)) - lastInp) / 1000; +#else + static XScreenSaverInfo *mit_info = NULL; + if (mit_info == NULL) { + int event_base, error_base; + /* + if(XScreenSaverQueryExtension(QX11Info::display(), &event_base, &error_base)) { + mit_info = XScreenSaverAllocInfo (); + } + */ + } + if (mit_info == NULL){ + log(L_WARN, "No XScreenSaver extension found on current XServer, disabling auto-away."); + m_timer->stop(); + return 0; + } + if (!XScreenSaverQueryInfo(QX11Info::display(), QX11Info::appRootWindow(), mit_info)) { + log(L_WARN, "XScreenSaverQueryInfo failed, disabling auto-away."); + m_timer->stop(); + return 0; + } + return (mit_info->idle / 1000); +#endif +} + diff --git a/plugins/autoaway/autoaway.h b/plugins/autoaway/autoaway.h new file mode 100644 index 0000000..8be0a1a --- /dev/null +++ b/plugins/autoaway/autoaway.h @@ -0,0 +1,70 @@ +/*************************************************************************** + autoaway.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _AUTOAWAY_H +#define _AUTOAWAY_H + +#include + +#include "cfg.h" +#include "event.h" +#include "plugins.h" + +class QTimer; + +struct AutoAwayData +{ + SIM::Data AwayTime; + SIM::Data EnableAway; + SIM::Data NATime; + SIM::Data EnableNA; + SIM::Data OffTime; + SIM::Data EnableOff; + SIM::Data DisableAlert; + SIM::Data RealManualStatus; +}; + +class AutoAwayPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + AutoAwayPlugin(unsigned, Buffer*); + ~AutoAwayPlugin(); + PROP_ULONG(AwayTime); + PROP_BOOL(EnableAway); + PROP_ULONG(NATime); + PROP_BOOL(EnableNA); + PROP_ULONG(OffTime); + PROP_BOOL(EnableOff); + PROP_BOOL(DisableAlert); + PROP_ULONG(RealManualStatus); +protected slots: + void timeout(); +protected: + virtual bool processEvent(SIM::Event*); + virtual QByteArray getConfig(); + virtual QWidget *createConfigWindow(QWidget *parent); + unsigned getIdleTime(); + bool bAway; + bool bNA; + bool bOff; + QTimer *m_timer; + AutoAwayData data; +}; + +#endif + diff --git a/plugins/autoaway/autoaway.rc b/plugins/autoaway/autoaway.rc new file mode 100644 index 0000000..333bf83 --- /dev/null +++ b/plugins/autoaway/autoaway.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Autoaway plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "autoaway\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "autoaway.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/autoaway/autoaway.vcproj b/plugins/autoaway/autoaway.vcproj new file mode 100644 index 0000000..cacf605 --- /dev/null +++ b/plugins/autoaway/autoaway.vcproj @@ -0,0 +1,418 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/autoaway/autoawaycfg.cpp b/plugins/autoaway/autoawaycfg.cpp new file mode 100644 index 0000000..c8a40d8 --- /dev/null +++ b/plugins/autoaway/autoawaycfg.cpp @@ -0,0 +1,72 @@ +/*************************************************************************** + autoawaycfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "autoawaycfg.h" +#include "autoaway.h" + +#include +#include + +AutoAwayConfig::AutoAwayConfig(QWidget *parent, AutoAwayPlugin *plugin) : QWidget(parent) + //: AutoAwayConfigBase(parent) +{ + setupUi(this); + m_plugin = plugin; + chkAway->setChecked(m_plugin->getEnableAway()); + chkNA->setChecked(m_plugin->getEnableNA()); + chkOff->setChecked(m_plugin->getEnableOff()); + spnAway->setValue(m_plugin->getAwayTime()); + spnNA->setValue(m_plugin->getNATime()); + spnOff->setValue(m_plugin->getOffTime()); + chkAlert->setChecked(m_plugin->getDisableAlert()); + connect(chkAway, SIGNAL(toggled(bool)), this, SLOT(toggledAway(bool))); + connect(chkNA, SIGNAL(toggled(bool)), this, SLOT(toggledNA(bool))); + connect(chkOff, SIGNAL(toggled(bool)), this, SLOT(toggledOff(bool))); + toggledAway(chkAway->isChecked()); + toggledNA(chkNA->isChecked()); + toggledOff(chkOff->isChecked()); +} + +void AutoAwayConfig::toggledAway(bool bState) +{ + spnAway->setEnabled(bState); +} + +void AutoAwayConfig::toggledNA(bool bState) +{ + spnNA->setEnabled(bState); +} + +void AutoAwayConfig::toggledOff(bool bState) +{ + spnOff->setEnabled(bState); +} + +void AutoAwayConfig::apply() +{ + m_plugin->setDisableAlert(chkAlert->isChecked()); + m_plugin->setEnableAway(chkAway->isChecked()); + m_plugin->setEnableNA(chkNA->isChecked()); + m_plugin->setEnableOff(chkOff->isChecked()); + if (m_plugin->getEnableAway()) + m_plugin->setAwayTime(spnAway->text().toULong()); + if (m_plugin->getEnableNA()) + m_plugin->setNATime(spnNA->text().toULong()); + if (m_plugin->getEnableOff()) + m_plugin->setOffTime(spnOff->text().toULong()); +} + diff --git a/plugins/autoaway/autoawaycfg.h b/plugins/autoaway/autoawaycfg.h new file mode 100644 index 0000000..5b37dd3 --- /dev/null +++ b/plugins/autoaway/autoawaycfg.h @@ -0,0 +1,40 @@ +/*************************************************************************** + autoawaycfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _AUTOAWAYCFG_H +#define _AUTOAWAYCFG_H + +#include "ui_autoawaycfgbase.h" + +class AutoAwayPlugin; + +class AutoAwayConfig : public QWidget, public Ui::AutoAwayConfigBase +{ + Q_OBJECT +public: + AutoAwayConfig(QWidget *parent, AutoAwayPlugin*); +public slots: + void apply(); + void toggledAway(bool); + void toggledNA(bool); + void toggledOff(bool); +protected: + AutoAwayPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/autoaway/autoawaycfgbase.ui b/plugins/autoaway/autoawaycfgbase.ui new file mode 100644 index 0000000..95ab7e8 --- /dev/null +++ b/plugins/autoaway/autoawaycfgbase.ui @@ -0,0 +1,141 @@ + + + AutoAwayConfigBase + + + + 0 + 0 + 484 + 243 + + + + Form1 + + + + + + Set "Away" status after + + + + + + + 1 + + + + + + + minutes not using computer + + + false + + + + + + + Set "N/A" status after + + + + + + + 1 + + + + + + + minutes of "Away" + + + false + + + + + + + Set "Offline" status after + + + + + + + 1 + + + + + + + minutes of "N/A" + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 10 + 10 + + + + + + + + Disable online alert in "Away", "N/A", "DND" and "Occupied" List + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 95 + + + + + + + + chkAway + spnAway + chkNA + spnNA + chkOff + spnOff + chkAlert + + + + diff --git a/plugins/autoaway/configure.in.in b/plugins/autoaway/configure.in.in new file mode 100644 index 0000000..2b643a3 --- /dev/null +++ b/plugins/autoaway/configure.in.in @@ -0,0 +1,24 @@ +if test "x$kde_use_qt_win" = "xno"; then + compile_plugin="no" + XSS_LIBS="no" + save_CPPFLAGS="$CPPFLAGS" + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $all_libraries" + CPPFLAGS="$CPPFLAGS $X_INCLUDES" + AC_CHECK_LIB(Xext, XScreenSaverRegister,[XSS_LIBS=""],[], [-lX11 -lXext -lm]) + AC_CHECK_LIB(Xss, XScreenSaverRegister,[XSS_LIBS="-lXss"],[],[-lX11 -lXext -lm]) + if test \! "$XSS_LIBS" = "no"; then + KDE_CHECK_HEADER(X11/extensions/scrnsaver.h,[compile_plugin="yes"],[]) + else + XSS_LIBS="" + AC_CHECK_HEADER(Carbon/Carbon.h,[compile_plugin="yes"]) + fi + AC_SUBST(XSS_LIBS) + if test "x$compile_plugin" = "xno"; then + AC_MSG_WARN([ScreenSaver extension not found. AutoAway plugin is disabled]) + fi + AM_CONDITIONAL(ENABLE_AUTOAWAY, test "x$compile_plugin" = "xyes") +else + AM_CONDITIONAL(ENABLE_AUTOAWAY, true) +fi + diff --git a/plugins/autoaway/idleui.cpp b/plugins/autoaway/idleui.cpp new file mode 100644 index 0000000..4945c23 --- /dev/null +++ b/plugins/autoaway/idleui.cpp @@ -0,0 +1,177 @@ +//////////////////////////////////////////////////////////////// +// 2000 Microsoft Systems Journal. +// If this program works, it was written by Paul DiLascia. +// If not, I don't know who wrote it. +// This program compiles with Visual C++ 6.0 on Windows 98 +// +// See IdleUI.h +// +#ifdef WIN32 +#include +#include +#include +#include + +//////////////// +// The following global data is SHARED among all instances of the DLL +// (processes); i.e., these are system-wide globals. +// +#pragma data_seg (".IdleUI") // you must define as SHARED in .def + +HHOOK g_keyboardHook = NULL; // one instance for all processes +HHOOK g_mouseHook = NULL; // one instance for all processes +DWORD g_lastInputTick = 0; // tick time of last input event + +/** + Last mouse position. +*/ +POINT g_lastMousePos; + +#pragma data_seg () + +/** + Flag indicating whether the DLL's owning process is the loading DLL. +*/ +bool g_isHandleOwner = false; + +// +// Public interface +// + +////////////////// +// Initialize DLL: install kbd/mouse hooks. +// +BOOL IdleUIInit() +{ + return TRUE; +} + +////////////////// +// Terminate DLL: remove hooks. +// +void IdleUITerm() +{ +} + +///////////////// +// Get tick count of last keyboard or mouse event +// +DWORD IdleUIGetLastInputTime() +{ + return g_lastInputTick; +} + +// +// Internals +// + +///////////////// +// Keyboard hook: record tick count +// +LRESULT CALLBACK keyboardHookCallback(int code, WPARAM wParam, LPARAM lParam) +{ + if (code == HC_ACTION) + { + g_lastInputTick = GetTickCount(); + } + return ::CallNextHookEx(g_keyboardHook, code, wParam, lParam); +} + +///////////////// +// Mouse hook: record tick count +// +LRESULT CALLBACK mouseHookCallback(int code, WPARAM wParam, LPARAM lParam) +{ + if (code == HC_ACTION) + { + // Update timestamp if event indicates mouse action + bool change = false; + if (wParam == WM_MOUSEMOVE && lParam != 0) + { + PMOUSEHOOKSTRUCT mhs = (PMOUSEHOOKSTRUCT) lParam; + if (mhs->pt.x != g_lastMousePos.x || + mhs->pt.y != g_lastMousePos.y) + { + change = true; + g_lastMousePos = mhs->pt; + } + } + else + { + change = true; + } + if (change) + { + g_lastInputTick = GetTickCount(); + } + } + return ::CallNextHookEx(g_mouseHook, code, wParam, lParam); +} + +void initialize(HINSTANCE module) +{ + if (g_keyboardHook == 0) + { + g_keyboardHook = SetWindowsHookEx(WH_KEYBOARD, keyboardHookCallback, module, 0); + g_mouseHook = SetWindowsHookEx(WH_MOUSE, mouseHookCallback, module, 0); + g_lastInputTick = GetTickCount(); + g_isHandleOwner = true; + } + assert(g_keyboardHook); + assert(g_mouseHook); +} + +void shutdown() +{ + // Only handle-owning process may unhook + if (g_isHandleOwner) + { + if (g_keyboardHook != 0) + { + UnhookWindowsHookEx(g_keyboardHook); + g_keyboardHook = 0; + } + if (g_mouseHook != 0) + { + UnhookWindowsHookEx(g_mouseHook); + g_mouseHook = 0; + } + } +} + +// +// DLL entry point +// +static bool bHaveGetLastInputInfo = false; +BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID reserved) +{ + if(bHaveGetLastInputInfo) + return TRUE; + if(QLibrary::resolve("user32.dll", "GetLastInputInfo")) { + bHaveGetLastInputInfo = true; + return TRUE; + } + reserved=0; + switch (reason) + { + case DLL_PROCESS_ATTACH: + { + initialize(module); + break; + } + case DLL_PROCESS_DETACH: + { + shutdown(); + break; + } + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + { + // Ignore + break; + } + } + return TRUE; +} +#endif + diff --git a/plugins/autoaway/idleui.def b/plugins/autoaway/idleui.def new file mode 100644 index 0000000..6669763 --- /dev/null +++ b/plugins/autoaway/idleui.def @@ -0,0 +1,6 @@ +LIBRARY "IdleUI" +SECTIONS .IdleUI READ WRITE SHARED + +EXPORTS +IdleUIGetLastInputTime + diff --git a/plugins/autoaway/idleui.h b/plugins/autoaway/idleui.h new file mode 100644 index 0000000..954eb25 --- /dev/null +++ b/plugins/autoaway/idleui.h @@ -0,0 +1,10 @@ +#ifndef IDLEUI_H +#define IDLEUI_H +#pragma once +#include + +BOOL IdleUIInit(); +void IdleUITerm(); +DWORD IdleUIGetLastInputTime(); + +#endif diff --git a/plugins/autoaway/idleui.rc b/plugins/autoaway/idleui.rc new file mode 100644 index 0000000..e1c593b --- /dev/null +++ b/plugins/autoaway/idleui.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,0 + PRODUCTVERSION 1,0,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Idle UI\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "idleui\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "idleui.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/autoaway/idleui.vcproj b/plugins/autoaway/idleui.vcproj new file mode 100644 index 0000000..2cfab77 --- /dev/null +++ b/plugins/autoaway/idleui.vcproj @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/background/CMakeLists.txt b/plugins/background/CMakeLists.txt new file mode 100644 index 0000000..139ebd7 --- /dev/null +++ b/plugins/background/CMakeLists.txt @@ -0,0 +1,23 @@ +###################### +# background library # +###################### +IF(BUILD_DROPPED) +SET(background_SRCS + background.cpp + bkgndcfg.cpp +) + +SET(background_HDRS + background.h + bkgndcfg.h +) + +SET(background_UICS + bkgndcfgbase.ui +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(background) +ENDIF(BUILD_DROPPED) diff --git a/plugins/background/background.cpp b/plugins/background/background.cpp new file mode 100644 index 0000000..7f88b49 --- /dev/null +++ b/plugins/background/background.cpp @@ -0,0 +1,177 @@ +/*************************************************************************** + background.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" + +#include "background.h" +#include "bkgndcfg.h" +#include "log.h" + +#include "profile.h" +#include "profilemanager.h" + +#include +#include +#include +#include + +using namespace SIM; + +Plugin *createBackgroundPlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new BackgroundPlugin(base, config); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Background"), + I18N_NOOP("Plugin provides background pictures for user list"), + VERSION, + createBackgroundPlugin, + PLUGIN_NOLOAD_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +BackgroundPlugin::BackgroundPlugin(unsigned base, Buffer *config) + : QObject(), Plugin(base) +{ + m_propertyHub = SIM::PropertyHub::create("background"); + redraw(); +} + +BackgroundPlugin::~BackgroundPlugin() +{ + +} + +QByteArray BackgroundPlugin::getConfig() +{ + return QByteArray(); //Fixme +} + +QWidget *BackgroundPlugin::createConfigWindow(QWidget *parent) +{ + return new BkgndCfg(parent, this); +} + +bool BackgroundPlugin::processEvent(Event *e) +{ + if (e->type() == eEventPaintView){ + EventPaintView *ev = static_cast(e); + EventPaintView::PaintView *pv = ev->paintView();; + if (!bgImage.isNull()){ + unsigned w = bgImage.width(); + unsigned h = bgImage.height(); + int x = pv->pos.x(); + int y = pv->pos.y(); + bool bTiled = false; + unsigned pos = value("Position").toUInt(); + switch(pos){ + case ContactLeft: + h = pv->height; + bTiled = true; + break; + case ContactScale: + h = pv->height; + w = pv->win->width(); + bTiled = true; + break; + case WindowTop: + break; + case WindowBottom: + y += (bgImage.height() - pv->win->height()); + break; + case WindowCenter: + y += (bgImage.height() - pv->win->height()) / 2; + break; + case WindowScale: + w = pv->win->width(); + h = pv->win->height(); + break; + } + const QPixmap &bg = makeBackground(w, h); + if (bTiled){ + for (int py = 0; py < pv->size.height(); py += bg.height()){ + pv->p->drawPixmap(QPoint(0, py), bgScale, QRect(x, 0, w, h)); + } + }else{ + pv->p->drawPixmap(QPoint(0, 0), bgScale, QRect(x, y, pv->size.width(), pv->size.height())); + pv->isStatic = true; + } + } + pv->margin = pv->isGroup ? value("MarginGroup").toUInt() : value("MarginContact").toUInt(); + } + else if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("_core"); + if(!hub.isNull()) + setPropertyHub(hub); + redraw(); + } + return false; +} + +void BackgroundPlugin::redraw() +{ + bgImage = QImage(); + bgScale = QPixmap(); + if (value("Background").toString().isEmpty()) + return; + bgImage = QImage(value("Background").toString()); + EventRepaintView e; + e.process(); +} + +QPixmap &BackgroundPlugin::makeBackground(int w, int h) +{ + if (bgImage.isNull()) + return bgScale; + if ((bgScale.width() != w) || (bgScale.height() != h)){ + if ((bgImage.width() == w) && (bgImage.height() == h)){ + bgScale = QPixmap::fromImage(bgImage); + }else{ + QImage img = bgImage.scaled( w, h, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); + bgScale = QPixmap::fromImage( img ); + } + } + return bgScale; +} + +void BackgroundPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr BackgroundPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant BackgroundPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void BackgroundPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} \ No newline at end of file diff --git a/plugins/background/background.h b/plugins/background/background.h new file mode 100644 index 0000000..6c29eac --- /dev/null +++ b/plugins/background/background.h @@ -0,0 +1,63 @@ +/*************************************************************************** + background.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _BACKGROUND_H +#define _BACKGROUND_H + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" + +#include +#include +#include + +const unsigned ContactLeft = 0; +const unsigned ContactScale = 1; +const unsigned WindowTop = 2; +const unsigned WindowBottom = 3; +const unsigned WindowCenter = 4; +const unsigned WindowScale = 5; + +class BackgroundPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ +public: + BackgroundPlugin(unsigned, Buffer *name); + virtual ~BackgroundPlugin(); + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); + +protected: + virtual bool processEvent(SIM::Event *e); + virtual QByteArray getConfig(); + virtual QWidget *createConfigWindow(QWidget *parent); + + QImage bgImage; + QPixmap bgScale; + QPixmap &makeBackground(int w, int h); + void redraw(); + friend class BkgndCfg; + +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/background/background.rc b/plugins/background/background.rc new file mode 100644 index 0000000..60b3d00 --- /dev/null +++ b/plugins/background/background.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Background plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "background\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "background.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/background/background.vcproj b/plugins/background/background.vcproj new file mode 100644 index 0000000..87858ec --- /dev/null +++ b/plugins/background/background.vcproj @@ -0,0 +1,369 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/background/bkgndcfg.cpp b/plugins/background/bkgndcfg.cpp new file mode 100644 index 0000000..b124733 --- /dev/null +++ b/plugins/background/bkgndcfg.cpp @@ -0,0 +1,100 @@ +/*************************************************************************** + bkgndcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "misc.h" +#include "simgui/linklabel.h" +#include "simgui/editfile.h" +#include "simgui/preview.h" + +#include "bkgndcfg.h" +#include "background.h" + +#ifndef USE_KDE + +static FilePreview *createPreview(QWidget *parent) +{ + return new PictPreview(parent); +} + +#endif + +BkgndCfg::BkgndCfg(QWidget *parent, BackgroundPlugin *plugin) : QWidget(parent) + //: BkgndCfgBase(parent) +{ + setupUi(this); + m_plugin = plugin; + edtPicture->setText(plugin->value("Background").toString()); + edtPicture->setStartDir(SIM::app_file("pict/")); + edtPicture->setTitle(i18n("Select background picture")); + QList formats = QImageReader::supportedImageFormats(); + QString format; + QString fmt; + foreach (fmt,formats) + { + if(format.length()>0) + format += " "; + fmt = fmt.toLower(); + format += "*." + fmt; + if (fmt == "jpeg") + format += " *.jpg"; + } +#ifdef USE_KDE + edtPicture->setFilter(i18n("%1|Graphics") .arg(format)); +#else + edtPicture->setFilter(i18n("Graphics(%1)") .arg(format)); + edtPicture->setFilePreview(createPreview); +#endif + cmbPosition->insertItem(INT_MAX,i18n("Contact - left")); + cmbPosition->insertItem(INT_MAX,i18n("Contact - scale")); + cmbPosition->insertItem(INT_MAX,i18n("Window - left top")); + cmbPosition->insertItem(INT_MAX,i18n("Window - left bottom")); + cmbPosition->insertItem(INT_MAX,i18n("Window - left center")); + cmbPosition->insertItem(INT_MAX,i18n("Window - scale")); + cmbPosition->setCurrentIndex(plugin->value("Position").toUInt()); + spnContact->setValue(plugin->value("MarginContact").toUInt()); + spnGroup->setValue(plugin->value("MarginGroup").toUInt()); + lblLink->setText(i18n("Get more skins")); + lblLink->setUrl("http://addons.miranda-im.org/index.php?action=display&id=34"); +} + +void BkgndCfg::apply() +{ + if (cmbPosition->currentIndex() >= 0) + m_plugin->setValue("Position", cmbPosition->currentIndex()); + m_plugin->setValue("Background", edtPicture->text()); + m_plugin->setValue("MarginContact", (uint)spnContact->text().toULong()); + m_plugin->setValue("MarginGroup", (uint)spnGroup->text().toULong()); + m_plugin->redraw(); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "bkgndcfg.moc" +#endif +*/ + diff --git a/plugins/background/bkgndcfg.h b/plugins/background/bkgndcfg.h new file mode 100644 index 0000000..99c04c6 --- /dev/null +++ b/plugins/background/bkgndcfg.h @@ -0,0 +1,37 @@ +/*************************************************************************** + bkgndcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _BKGNDCFG_H +#define _BKGNDCFG_H + +#include "ui_bkgndcfgbase.h" + +class BackgroundPlugin; + +class BkgndCfg : public QWidget, public Ui::BkgndCfgBase +{ + Q_OBJECT +public: + BkgndCfg(QWidget *parent, BackgroundPlugin *plugin); +public slots: + void apply(); +protected: + BackgroundPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/background/bkgndcfgbase.ui b/plugins/background/bkgndcfgbase.ui new file mode 100644 index 0000000..2b0f16f --- /dev/null +++ b/plugins/background/bkgndcfgbase.ui @@ -0,0 +1,257 @@ + + + + + BkgndCfgBase + + + + 0 + 0 + 419 + 187 + + + + Form1 + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + Group margin: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + Contact margin: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + Main window background: + + + Qt::AlignVCenter|Qt::AlignLeft + + + false + + + + + + + 0 + + + 6 + + + + + 20 + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + 0 + + + 6 + + + + + 20 + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + Place: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    + + LinkLabel + QWidget +
    simgui/linklabel.h
    + + -1 + -1 + + 0 + + 1 + 1 + + image1 + + text + +
    + + EditFile + QWidget +
    simgui/editfile.h
    + + -1 + -1 + + 0 + + 5 + 5 + + image1 +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + +
    diff --git a/plugins/dock/CMakeLists.txt b/plugins/dock/CMakeLists.txt new file mode 100644 index 0000000..ac00192 --- /dev/null +++ b/plugins/dock/CMakeLists.txt @@ -0,0 +1,22 @@ +################ +# dock library # +################ +IF(BUILD_DROPPED) +SET(dock_SRCS + dock.cpp + dockcfg.cpp + dockwnd.cpp +) + +SET(dock_HDRS + dock.h + dockcfg.h + dockwnd.h +) + +SET(dock_UICS + dockcfgbase.ui +) + +SIM_ADD_PLUGIN(dock) +ENDIF(BUILD_DROPPED) diff --git a/plugins/dock/dock.cpp b/plugins/dock/dock.cpp new file mode 100644 index 0000000..f9bc9e0 --- /dev/null +++ b/plugins/dock/dock.cpp @@ -0,0 +1,394 @@ +/*************************************************************************** + dock.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "dock.h" +#include "dockcfg.h" +#include "dockwnd.h" +#include "mainwin.h" +#include "misc.h" +#include "core_consts.h" +#include "cmddef.h" +#include "core.h" + +#include "profile.h" +#include "profilemanager.h" + +#include +#include +#include +#include + +using namespace SIM; + +Plugin *createDockPlugin(unsigned base, bool, Buffer *config) +{ + return new DockPlugin(base, config); +} + +static PluginInfo info = + { + I18N_NOOP("System tray"), + I18N_NOOP("Plugin provides dock main window in system tray"), + VERSION, + createDockPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +DockPlugin::DockPlugin(unsigned base, Buffer *config) + : QObject(), Plugin(base) + , EventReceiver() + , m_dock(NULL) + , m_popup(NULL) +{ + m_propertyHub = SIM::PropertyHub::create("dock"); + DockMenu = registerType(); + CmdTitle = registerType(); + CmdToggle = registerType(); + CmdCustomize = registerType(); + + EventMenu(DockMenu, EventMenu::eAdd).process(); + + Command cmd; + cmd->id = CmdTitle; + cmd->text = I18N_NOOP("Sim-IM"); + cmd->icon = "SIM"; + cmd->menu_id = DockMenu; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_TITLE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdCustomize; + cmd->text = I18N_NOOP("Customize menu"); + cmd->icon = "configure"; + cmd->menu_id = DockMenu; + cmd->menu_grp = 0x10000; + cmd->accel = QString::null; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + EventMenuGetDef eMenu(MenuMain); + eMenu.process(); + CommandsDef *def = eMenu.defs(); + if (def){ + CommandsList list(*def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + if (s->id == 0) + continue; + cmd = *s; + if (!(cmd->flags & COMMAND_IMPORTANT)) + cmd->menu_grp = 0; + cmd->bar_id = 0; + cmd->menu_id = DockMenu; + EventCommandCreate(cmd).process(); + } + } + + cmd->id = CmdToggle; + cmd->text = I18N_NOOP("Toggle main window"); + cmd->icon = QString::null; + cmd->menu_id = MenuMain; + cmd->menu_grp = 0; + cmd->accel = "Ctrl+Shift+A"; + cmd->flags = COMMAND_CHECK_STATE | COMMAND_GLOBAL_ACCEL | COMMAND_IMPORTANT; + EventCommandCreate(cmd).process(); + + init(); + + QTimer *timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(timer())); + timer->start(2000); +} + +DockPlugin::~DockPlugin() +{ + EventCommandRemove(CmdToggle).process(); + EventMenu(DockMenu, EventMenu::eRemove).process(); + delete m_dock; +} + +void DockPlugin::init() +{ + if (m_dock) + return; + m_main = getMainWindow(); + if (!m_main) + return; + m_main->installEventFilter(this); + m_dock = new DockWnd(this, "inactive", I18N_NOOP("Inactive")); + connect(m_dock, SIGNAL(showPopup(QPoint)), this, SLOT(showPopup(QPoint))); + connect(m_dock, SIGNAL(toggleWin()), this, SLOT(toggleWin())); + connect(m_dock, SIGNAL(doubleClicked()), this, SLOT(doubleClicked())); + m_bQuit = false; + QApplication::syncX(); +} + +bool DockPlugin::eventFilter(QObject *o, QEvent *e) +{ + if (o == m_popup) + { + if (e->type() == QEvent::Hide) + { + m_popup->removeEventFilter(this); + m_popup = NULL; + } + }else{ + switch (e->type()) + { + case QEvent::Close: + if (!m_bQuit) + { + QWidget *main = static_cast(o); + setValue("ShowMain", false); + //setShowMain(false); + main->hide(); + e->ignore(); + return true; + } + break; + case QEvent::WindowDeactivate: + m_inactiveTime = QDateTime::currentDateTime(); + break; + case QEvent::WindowActivate: + m_inactiveTime = QDateTime(); + break; + default: + break; + } + } + return QObject::eventFilter(o, e); +} + +bool DockPlugin::isMainShow() +{ + QWidget *main = getMainWindow(); + if (main && main->isVisible()) + return true; + return false; +} + +bool DockPlugin::processEvent(Event *e) +{ + switch (e->type()) + { + case eEventInit: + init(); + break; + case eEventQuit: + if (m_dock){ + delete m_dock; + m_dock = NULL; + } + break; + case eEventRaiseWindow: + { + EventRaiseWindow *w = static_cast(e); + if (w->widget() == getMainWindow()){ + if (!m_dock) + init(); + if (!value("ShowMain").toBool()) + return true; + } + break; + } + case eEventCommandCreate: + { + EventCommandCreate *ecc = static_cast(e); + CommandDef *def = ecc->cmd(); + if (def->menu_id == MenuMain) + { + CommandDef d = *def; + if (def->flags & COMMAND_IMPORTANT) + { + if (d.menu_grp == 0) + d.menu_grp = 0x1001; + } + else + d.menu_grp = 0; + d.menu_id = DockMenu; + d.bar_id = 0; + EventCommandCreate(&d).process(); + } + break; + } + case eEventCheckCommandState: + { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *def = ecs->cmd(); + if (def->id == CmdToggle) + { + def->flags &= ~COMMAND_CHECKED; + def->text = isMainShow() ? + I18N_NOOP("Hide main window") : + I18N_NOOP("Show main window"); + return true; + } + break; + } + case eEventCommandExec: + { + EventCommandExec *ece = static_cast(e); + CommandDef *def = ece->cmd(); + if (def->id == CmdToggle) + { + QWidget *main = getMainWindow(); + if(!main) + return false; + if (isMainShow()) + { + setValue("ShowMain", false); + main->hide(); + } + else + { + m_inactiveTime = QDateTime(); + setValue("ShowMain", true); + raiseWindow(main, value("Desktop").toUInt()); + } + return true; + } + if (def->id == CmdCustomize){ + EventMenu(DockMenu, EventMenu::eCustomize).process(); + return true; + } + if (def->id == CmdQuit) + m_bQuit = true; + break; + } + case eEventPluginLoadConfig: + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("dock"); + if(!hub.isNull()) + setPropertyHub(hub); + break; + } + default: + break; + } + return false; +} + +QByteArray DockPlugin::getConfig() +{ + return QByteArray(); //Fixme +} + +QMenu *DockPlugin::createMenu() +{ + Command cmd; + cmd->popup_id = DockMenu; + EventMenuGet e(cmd); + e.process(); + return e.menu(); +} + +void DockPlugin::showPopup(QPoint p) +{ + if (m_popup) + return; + m_popup = createMenu(); + if (m_popup){ + m_popup->installEventFilter(this); + m_popup->popup(p); + } +} + +void DockPlugin::toggleWin() +{ + if (m_popup) + return; + + Command cmd; + cmd->id = CmdToggle; + cmd->menu_id = DockMenu; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + + EventCommandExec(cmd).process(); +} + +void DockPlugin::doubleClicked() +{ + if (m_popup) + return; + + CorePlugin *core = GET_CorePlugin(); + if ( 0 == core->unread.size() ) + return; + + Command cmd; + cmd->id = CmdUnread; + cmd->menu_id = DockMenu; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + + EventCommandExec(cmd).process(); +} + +QWidget *DockPlugin::getMainWindow() +{ + CorePlugin *core = GET_CorePlugin(); + return core->getMainWindow(); +} + +QWidget *DockPlugin::createConfigWindow(QWidget *parent) +{ + return new DockCfg(parent, this); +} + +void DockPlugin::timer() +{ + if (!isMainShow()) // already hidden + return; + if (!value("AutoHide").toBool() || (m_inactiveTime.isNull())) // no autohide + return; + m_main = getMainWindow(); + m_main->installEventFilter(this); + + if (QDateTime::currentDateTime() > m_inactiveTime.addSecs(value("AutoHideInterval").toUInt())){ + if (m_main) + { + setValue("ShowMain", false); + m_main->hide(); + } + } +} + +void DockPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr DockPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant DockPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void DockPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/dock/dock.h b/plugins/dock/dock.h new file mode 100644 index 0000000..cd88941 --- /dev/null +++ b/plugins/dock/dock.h @@ -0,0 +1,77 @@ +/*************************************************************************** + dock.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _DOCK_H +#define _DOCK_H + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" + +#include +#include + +class DockWnd; +class QMenu; + +class DockPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + DockPlugin(unsigned, Buffer*); + virtual ~DockPlugin(); + + QMenu *createMenu(); + +protected slots: + void showPopup(QPoint); + void toggleWin(); + void doubleClicked(); + void timer(); +protected: + virtual bool processEvent(SIM::Event *e); + virtual QWidget *createConfigWindow(QWidget *parent); + virtual QByteArray getConfig(); + virtual bool eventFilter(QObject*, QEvent*); + QWidget *getMainWindow(); + bool isMainShow(); + void init(); + + DockWnd *m_dock; + QWidget* m_main; + QMenu *m_popup; + unsigned long DockMenu; + unsigned long CmdTitle; + unsigned long CmdToggle; + unsigned long CmdCustomize; + bool m_bQuit; + QDateTime m_inactiveTime; + friend class DockCfg; + friend class DockWnd; + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); + +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/dock/dock.rc b/plugins/dock/dock.rc new file mode 100644 index 0000000..58c8941 --- /dev/null +++ b/plugins/dock/dock.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Systray plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "dock\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "dock.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/dock/dock.vcproj b/plugins/dock/dock.vcproj new file mode 100644 index 0000000..062f1f3 --- /dev/null +++ b/plugins/dock/dock.vcproj @@ -0,0 +1,477 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/dock/dockcfg.cpp b/plugins/dock/dockcfg.cpp new file mode 100644 index 0000000..58e636d --- /dev/null +++ b/plugins/dock/dockcfg.cpp @@ -0,0 +1,68 @@ +/*************************************************************************** + dockcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "dockcfg.h" +#include "dock.h" + +#include +#include +#include +#include +#ifdef USE_KDE +#include +#endif + +DockCfg::DockCfg(QWidget *parent, DockPlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; + chkAutoHide->setChecked(plugin->value("AutoHide").toBool()); + unsigned interval = plugin->value("AutoHideInterval").toUInt(); + spnAutoHide->setValue(interval); + connect(chkAutoHide, SIGNAL(toggled(bool)), this, SLOT(autoHideToggled(bool))); + connect(btnCustomize, SIGNAL(clicked()), this, SLOT(customize())); + autoHideToggled(plugin->value("AutoHide").toBool()); +#ifdef USE_KDE + spn_desk->setMaxValue(KWin::numberOfDesktops()); + spn_desk->setValue(m_plugin->value("Desktop").toUInt()); +#else + spn_desk->hide(); + TextLabel1_2->hide(); +#endif +} + +void DockCfg::apply() +{ + m_plugin->setValue("AutoHide", chkAutoHide->isChecked()); + m_plugin->setValue("AutoHideInterval", (uint)spnAutoHide->text().toULong()); +#ifdef USE_KDE + m_plugin->setValue("Desktop", spn_desk->text().toULong()); +#endif +} + +void DockCfg::autoHideToggled(bool bAutoHide) +{ + spnAutoHide->setEnabled(bAutoHide); +} + +void DockCfg::customize() +{ + SIM::EventMenu(m_plugin->DockMenu, SIM::EventMenu::eCustomize).process(); +} + diff --git a/plugins/dock/dockcfg.h b/plugins/dock/dockcfg.h new file mode 100644 index 0000000..d3e6373 --- /dev/null +++ b/plugins/dock/dockcfg.h @@ -0,0 +1,39 @@ +/*************************************************************************** + dockcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _DOCKCFG_H +#define _DOCKCFG_H + +#include "ui_dockcfgbase.h" + +class DockPlugin; + +class DockCfg : public QWidget, public Ui::DockCfgBase +{ + Q_OBJECT +public: + DockCfg(QWidget *w, DockPlugin *plugin); +public slots: + void apply(); + void autoHideToggled(bool); + void customize(); +protected: + DockPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/dock/dockcfgbase.ui b/plugins/dock/dockcfgbase.ui new file mode 100644 index 0000000..071924a --- /dev/null +++ b/plugins/dock/dockcfgbase.ui @@ -0,0 +1,177 @@ + + DockCfgBase + + + + 0 + 0 + 313 + 138 + + + + Form1 + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + Hide main window after + + + + + + + 999 + + + + + + + seconds inactive + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + 0 + + + 6 + + + + + Show Mainwin on desktop + + + false + + + + + + + current + + + 999 + + + 0 + + + 0 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Customize dock menu + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + diff --git a/plugins/dock/dockwnd.cpp b/plugins/dock/dockwnd.cpp new file mode 100644 index 0000000..fa77cdb --- /dev/null +++ b/plugins/dock/dockwnd.cpp @@ -0,0 +1,383 @@ +/*************************************************************************** + dockwnd.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "icons.h" +#include "log.h" +#include "dockwnd.h" +#include "dock.h" +#include "core.h" +#include "contacts/contact.h" +#include "contacts/client.h" + +#include +#include +#include +#include + +using namespace SIM; + +void DockWnd::trayAction(QSystemTrayIcon::ActivationReason reason) +{ + log( L_DEBUG, "Tray activation reason: %d", (int)reason ); + switch (reason){ + case QSystemTrayIcon::Context: + showPopup(); + return; + case QSystemTrayIcon::DoubleClick: + bNoToggle = true; + QTimer::singleShot(0, this, SLOT(dbl_click())); + return; + case QSystemTrayIcon::Trigger: +#ifdef Q_OS_MAC + showPopup(); +#else + if (bNoToggle) + bNoToggle = false; + else + emit toggleWin(); +#endif + return; + default: + return; + } +} + +void DockWnd::messageClicked() { + if (m_queue.isEmpty()) + return; + unsigned id = m_queue.front().id; + SIM::Client *client = m_queue.front().client; + m_queue.erase(m_queue.begin()); + if (!m_queue.empty()) + showBalloon(); + Command cmd; + cmd->id = id; + cmd->param = client; + EventCommandExec(cmd).process(); +} + +void DockWnd::showPopup() +{ + m_menu = m_plugin->createMenu(); +#ifdef Q_OS_MAC + m_TrayIcon.setContextMenu( m_menu ); +#else + m_menu->exec( QCursor::pos() ); +#endif +} + +DockWnd::DockWnd(DockPlugin *plugin, const char *icon, const char *text) + : QWidget(NULL, Qt::Window + | Qt::FramelessWindowHint + | Qt::WindowStaysOnTopHint) + , EventReceiver(LowPriority) + , m_state(icon) + , m_plugin(plugin) +{ + setObjectName("dock"); + setMouseTracking(true); + bNoToggle = false; + bBlink = false; + blinkTimer = new QTimer(this); + connect(blinkTimer, SIGNAL(timeout()), this, SLOT(blink())); + + m_bBalloon = QSystemTrayIcon::supportsMessages(); + setIcon(icon); + QWidget::hide(); + connect( + &m_TrayIcon, + SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + SLOT(trayAction(QSystemTrayIcon::ActivationReason)) + ); + connect( + &m_TrayIcon, + SIGNAL(messageClicked()), + SLOT(messageClicked()) + ); + m_TrayIcon.show(); + setTip(text); + reset(); +} + +DockWnd::~DockWnd() +{ + quit(); +} + +void DockWnd::quit() +{ + m_TrayIcon.hide(); +} + +void DockWnd::dbl_click() +{ + emit doubleClicked(); +} + +bool DockWnd::processEvent(Event *e) +{ + switch (e->type()){ + case eEventMessageReceived: + case eEventMessageRead: + case eEventMessageDeleted: + reset(); + break; + case eEventSetMainIcon: { + EventSetMainIcon *smi = static_cast(e); + m_state = smi->icon(); + if (bBlink) + break; + setIcon(m_state); + break; + } + case eEventSetMainText: { + EventSetMainText *smt = static_cast(e); + setTip(smt->text()); + break; + } + case eEventIconChanged: + setIcon((bBlink && !m_unread.isEmpty()) ? m_unread : m_state); + break; + case eEventLanguageChanged: + setTip(m_tip); + break; + case eEventQuit: + quit(); + break; + case eEventShowNotification:{ + if (!m_bBalloon) + return false; + EventShowNotification *ee = static_cast(e); + const EventNotification::ClientNotificationData &data = ee->data(); + if (data.id == 0) + return false; + foreach(BalloonItem item, m_queue ) { + if (item.id == data.id) + return true; + } + QString arg = data.args; + + BalloonItem item; + item.id = data.id; + item.client = data.client; + item.flags = (data.flags & EventNotification::ClientNotificationData::E_INFO) ? EventNotification::ClientNotificationData::E_INFO : EventNotification::ClientNotificationData::E_INFO; + item.text = i18n(data.text); + if (item.text.indexOf("%1") >= 0) + item.text = item.text.arg(arg); + if (!m_queue.empty()){ + m_queue.push_back(item); + return true; + } + item.title = "SIM"; + if (getContacts()->nClients() > 1){ + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + if (getContacts()->getClient(i) == data.client){ + item.title = getContacts()->getClient(i)->name(); + int n = item.title.indexOf("."); + if (n > 0) + item.title = item.title.left(n) + " " + item.title.mid(n + 1); + } + } + } + m_queue.push_back(item); + if (showBalloon()) + return true; + return false; + } + default: + break; + } + return false; +} + +bool DockWnd::showBalloon() +{ + if (m_queue.empty()) + return false; + BalloonItem &item = m_queue.front(); + + m_TrayIcon.showMessage( + item.title, + item.text, + item.flags & EventNotification::ClientNotificationData::E_INFO ? QSystemTrayIcon::Information : QSystemTrayIcon::Critical, + 20000 + ); + + return true; +} + +void DockWnd::paintEvent( QPaintEvent* ) +{ + QPainter p(this); + p.drawPixmap((width() - drawIcon.width())/2, (height() - drawIcon.height())/2, drawIcon); +} + +void DockWnd::setIcon(const QString &icon) +{ + if(m_curIcon == icon) + return; + m_curIcon = icon; + drawIcon = Pict(icon); + QWidget::setWindowIcon(drawIcon); + m_TrayIcon.setIcon(drawIcon); +} + +void DockWnd::setTip(const QString &text) +{ + m_tip = text; + QString tip = m_unreadText; + if (tip.isEmpty()){ + tip = i18n(text); + tip = tip.remove('&'); + } + if(tip == m_curTipText) + return; + m_curTipText = tip; + m_TrayIcon.setToolTip(m_curTipText); +} + +void DockWnd::mouseEvent( QMouseEvent *e) +{ + switch(e->button()){ + case Qt::LeftButton: + if (bNoToggle) + bNoToggle = false; + else + emit toggleWin(); + break; + case Qt::RightButton: + emit showPopup(e->globalPos()); + break; + case Qt::MidButton: + emit doubleClicked(); + break; + default: + break; + } +} + +void DockWnd::mousePressEvent( QMouseEvent *e) +{ + QWidget::mousePressEvent(e); +} + +void DockWnd::mouseReleaseEvent( QMouseEvent *e) +{ + QWidget::mouseReleaseEvent(e); + mouseEvent(e); +} + +void DockWnd::mouseMoveEvent( QMouseEvent *e) +{ + QWidget::mouseMoveEvent(e); +} + +void DockWnd::mouseDoubleClickEvent( QMouseEvent*) +{ + bNoToggle = true; + emit doubleClicked(); +} + +void DockWnd::enterEvent( QEvent* ) +{ +} + +void DockWnd::blink() +{ + if (m_unread.isEmpty()){ + bBlink = false; + blinkTimer->stop(); + setIcon(m_state); + return; + } + bBlink = !bBlink; + setIcon(bBlink ? m_unread : m_state); +} + +struct msgIndex +{ + unsigned contact; + unsigned type; +}; + +bool operator < (const msgIndex &a, const msgIndex &b) +{ + if (a.contact < b.contact) + return true; + if (a.contact > b.contact) + return false; + return a.type < b.type; +} + +typedef QMap MAP_COUNT; + +void DockWnd::reset() +{ + m_unread = QString::null; + QString oldUnreadText = m_unreadText; + m_unreadText = QString::null; + MAP_COUNT count; + MAP_COUNT::iterator itc; + CorePlugin *core = GET_CorePlugin(); + for (std::list::iterator it = core->unread.begin(); it != core->unread.end(); ++it){ + if (m_unread.isEmpty()){ + CommandDef *def =core->messageTypes.find(it->type); + if (def) + m_unread = def->icon; + } + msgIndex m; + m.contact = it->contact; + m.type = it->type; + itc = count.find(m); + if (itc == count.end()){ + count.insert(m, 1); + }else{ + itc.value()++; + } + } + if (!count.empty()){ + for (itc = count.begin(); itc != count.end(); ++itc){ + CommandDef *def = core->messageTypes.find(itc.key().type); + if (def == NULL) + continue; + MessageDef *mdef = (MessageDef*)(def->param); + QString msg = i18n(mdef->singular, mdef->plural, itc.value()); + + Contact *contact = getContacts()->contact(itc.key().contact); + if (contact == NULL) + continue; + msg = i18n("%1 from %2") + .arg(msg) + .arg(contact->getName()); + if (m_unreadText.length() + 2 + msg.length() >= 64){ + m_unreadText += "..."; + break; + } + + if (!m_unreadText.isEmpty()) + m_unreadText += "\n"; + m_unreadText += msg; + } + } + if (!m_unread.isEmpty() && !blinkTimer->isActive()) + blinkTimer->start(1500); + if (m_unreadText != oldUnreadText) + setTip(m_tip); +} + diff --git a/plugins/dock/dockwnd.h b/plugins/dock/dockwnd.h new file mode 100644 index 0000000..8f248ea --- /dev/null +++ b/plugins/dock/dockwnd.h @@ -0,0 +1,90 @@ +/*************************************************************************** + dockwnd.h - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _DOCKWND_H +#define _DOCKWND_H + +#include +#include +#include +#include + +#include "event.h" + +class WharfIcon; +class DockPlugin; + +struct BalloonItem +{ + QString text; + QString title; + unsigned id; + unsigned flags; + SIM::Client *client; +}; + +class DockWnd : public QWidget, public SIM::EventReceiver +{ + Q_OBJECT +public: + DockWnd(DockPlugin *plugin, const char *icon, const char *text); + ~DockWnd(); + void setIcon(const QString &icon); + void setTip(const QString &text); + void mouseEvent( QMouseEvent *e); + virtual void mouseDoubleClickEvent( QMouseEvent *e); +signals: + void showPopup(QPoint); + void toggleWin(); + void doubleClicked(); +protected slots: + void blink(); + void dbl_click(); + void showPopup(); + void trayAction(QSystemTrayIcon::ActivationReason reason); + void messageClicked(); +protected: + virtual bool processEvent(SIM::Event *e); + void reset(); + bool bNoToggle; + QString m_tip; + QString m_curTipText; + QString m_curIcon; + QString m_state; + QString m_unread; + QString m_unreadText; + QPixmap drawIcon; + virtual void enterEvent( QEvent *e); + virtual void paintEvent( QPaintEvent *e); + virtual void mousePressEvent( QMouseEvent *e); + virtual void mouseReleaseEvent( QMouseEvent *e); + virtual void mouseMoveEvent( QMouseEvent *e); + void quit(); + bool bBlink; + QTimer *blinkTimer; + + bool m_bBalloon; + QList m_queue; + bool showBalloon(); + + DockPlugin *m_plugin; + QSystemTrayIcon m_TrayIcon; + QMenu *m_menu; +}; + +#endif + diff --git a/plugins/filter/CMakeLists.txt b/plugins/filter/CMakeLists.txt new file mode 100644 index 0000000..09723fe --- /dev/null +++ b/plugins/filter/CMakeLists.txt @@ -0,0 +1,23 @@ +################## +# filter library # +################## +IF(BUILD_DROPPED) +SET(filter_SRCS + filter.cpp + filtercfg.cpp + ignorelist.cpp +) + +SET(filter_HDRS + filter.h + filtercfg.h + ignorelist.h +) + +SET(filter_UICS + filtercfgbase.ui + ignorelistbase.ui +) + +SIM_ADD_PLUGIN(filter) +ENDIF(BUILD_DROPPED) diff --git a/plugins/filter/filter.cpp b/plugins/filter/filter.cpp new file mode 100644 index 0000000..553fc0f --- /dev/null +++ b/plugins/filter/filter.cpp @@ -0,0 +1,429 @@ +/*************************************************************************** + filter.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include "simgui/ballonmsg.h" +#include "unquot.h" +#include "msgedit.h" +#include "msgview.h" +#include "userwnd.h" + +#include "profile.h" +#include "profilemanager.h" + +#include "filter.h" +#include "filtercfg.h" +#include "contacts/contact.h" + +using namespace SIM; + +Plugin *createFilterPlugin(unsigned base, bool, Buffer *cfg) +{ + return new FilterPlugin(base, cfg); +} + +static PluginInfo info = + { + I18N_NOOP("Filter"), + I18N_NOOP("Plugin provides message filter"), + VERSION, + createFilterPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +static DataDef filterUserData[] = + { + { "SpamList", DATA_UTF, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +static FilterPlugin *filterPlugin = NULL; + +static QWidget *getFilterConfig(QWidget *parent, PropertyHubPtr data) +{ + return new FilterConfig(parent, data, filterPlugin, false); +} + +FilterPlugin::FilterPlugin(unsigned base, Buffer *cfg) + : QObject(), Plugin(base) + , EventReceiver(HighPriority - 1) +{ + filterPlugin = this; + + m_propertyHub = SIM::PropertyHub::create("filter"); + //load_data(filterData, &data, cfg); + user_data_id = getContacts()->registerUserData(info.title, filterUserData); + + CmdIgnoreList = registerType(); + CmdIgnore = registerType(); + CmdIgnoreText = registerType(); + + Command cmd; + cmd->id = CmdIgnoreList; + cmd->text = I18N_NOOP("Ignore list"); + cmd->menu_id = MenuContactGroup; + cmd->menu_grp = 0x8080; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdIgnore; + cmd->text = I18N_NOOP("Ignore user"); + cmd->icon = "ignorelist"; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->bar_id = ToolBarContainer; + cmd->bar_grp = 0x7001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdIgnoreText; + cmd->text = I18N_NOOP("Ignore this phrase"); + cmd->icon = QString::null; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x7000; + cmd->bar_id = 0; + cmd->bar_grp = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->menu_id = MenuMsgView; + EventCommandCreate(cmd).process(); + + cmd->id = user_data_id; + cmd->text = I18N_NOOP("&Filter"); + cmd->icon = "filter"; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->param = (void*)getFilterConfig; + EventAddPreferences(cmd).process(); +} + +FilterPlugin::~FilterPlugin() +{ + EventCommandRemove(CmdIgnoreList).process(); + EventRemovePreferences(user_data_id).process(); + getContacts()->unregisterUserData(user_data_id); +} + +QByteArray FilterPlugin::getConfig() +{ + return QByteArray(); +} + +bool FilterPlugin::processEvent(Event *e) +{ + switch (e->type()) { + case eEventContact: { + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + break; + Contact *contact = ec->contact(); + if (contact->getGroup()){ + Command cmd; + cmd->id = CmdIgnore; + cmd->flags = BTN_HIDE; + cmd->param = (void*)(contact->id()); + EventCommandShow(cmd).process(); + } + break; + } + case eEventPluginLoadConfig: + { + setPropertyHub( ProfileManager::instance()->getPropertyHub("filter") ); + break; + } + case eEventMessageReceived: { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (!msg || (msg->type() == MessageStatus)) + return false; + Contact *contact = getContacts()->contact(msg->contact()); + PropertyHubPtr data = contact->getUserData("filter"); + // check if we accept only from users on the list + if (((contact == NULL) || contact->getFlags() & CONTACT_TEMPORARY) && + ((value("FromList").toBool() && + msg->type() != MessageAuthRequest && + msg->type() != MessageAuthGranted && + msg->type() != MessageAuthRefused) || + (value("AuthFromList").toBool() && msg->type() <= MessageContacts))) { + delete msg; + delete contact; + return msg; + } + if (!contact) + return false; + // check if the user is a ignored user + if (contact->getIgnore()){ + delete msg; + return true; + } + + // get filter-data + if (data && !data->value("SpamList").toString().isEmpty() && (!contact || (contact->getFlags() & CONTACT_TEMPORARY) )) { + if (checkSpam(msg->getPlainText(), data->value("SpamList").toString())){ + delete msg; + return true; + } + } + break; + } + case eEventCheckCommandState: { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->id == CmdIgnore){ + cmd->flags &= ~BTN_HIDE; + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact && contact->getGroup()) + cmd->flags |= BTN_HIDE; + return true; + } + if (cmd->id == CmdIgnoreText){ + cmd->flags &= ~COMMAND_CHECKED; + if (cmd->menu_id == MenuMsgView){ + MsgViewBase *edit = (MsgViewBase*)(cmd->param); + if (edit->textCursor().hasSelection()) + return true; + } else + /*if (cmd->menu_id == MenuTextEdit){ + TextEdit *edit = ((MsgEdit*)(cmd->param))->m_edit; + if (edit->textCursor().hasSelection()) + return true; + }*/ //Fixme Block (crashing on rightclick in msgedit from container) + return false; + } + if (cmd->menu_id == MenuContactGroup){ + if (cmd->id == CmdIgnoreList){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + cmd->flags &= COMMAND_CHECKED; + if (contact->getIgnore()) + cmd->flags |= COMMAND_CHECKED; + return true; + } + } + break; + } + case eEventCommandExec: { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->id == CmdIgnore){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + QString text = i18n("Add %1 to ignore list?") .arg(contact->getName()); + Command cmd; + cmd->id = CmdIgnore; + cmd->param = (void*)(contact->id()); + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *w = eWidget.widget(); + BalloonMsg::ask((void*)(contact->id()), text, w, SLOT(addToIgnore(void*)), NULL, NULL, this); + } + return true; + } + if (cmd->id == CmdIgnoreText){ + QString text; + unsigned id = 0; + if (cmd->menu_id == MenuMsgView){ + MsgViewBase *view = (MsgViewBase*)(cmd->param); + if (view->textCursor().hasSelection()){ + text = view->textCursor().selectedText(); + text = unquoteText(text); + id = view->m_id; + } + }else if (cmd->menu_id == MenuTextEdit){ + MsgEdit *medit = (MsgEdit*)(cmd->param); + TextEdit *edit = medit->m_edit; + if (edit->textCursor().hasSelection()){ + text = edit->textCursor().selectedText(); + text = unquoteText(text); + id = medit->m_userWnd->id(); + } + } + + Contact *contact = getContacts()->contact(id); + PropertyHubPtr data = contact->getUserData("filter"); + + QString s = data->value("SpamList").toString(); + while (!text.isEmpty()){ + QString line = getToken(text, '\n'); + line = line.remove('\r'); + if (line.isEmpty()) + continue; + bool bSpace = false; + for (int i = 0; i < (int)(line.length()); i++) + if (line[i] == ' '){ + bSpace = true; + break; + } + if (bSpace) + line = '\"' + line + '\"'; + if (!s.isEmpty()) + s += ' '; + s += line; + } + data->setValue("SpamList", s); + return false; + } + if (cmd->menu_id == MenuContactGroup) + { + if (cmd->id == CmdIgnoreList) + { + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (!contact) + return false; + contact->setIgnore((cmd->flags & COMMAND_CHECKED) == 0); + EventContact(contact, EventContact::eChanged).process(); + return true; + } + } + break; + } + default: + break; + } + return false; +} + +QWidget *FilterPlugin::createConfigWindow(QWidget *parent) +{ + PropertyHubPtr data = getContacts()->getUserData("filter"); + return new FilterConfig(parent, data, this, true); +} + +static bool match(const QString &text, const QString &pat) +{ + int i; + for (i = 0; (i < (int)(text.length())) && (i < (int)(pat.length())); i++){ + QChar c = pat[i]; + if (c == '?') + continue; + if (c == '*'){ + int n; + for (n = i; n < (int)(pat.length()); n++) + if (pat[n] != '*') + break; + QString p = pat.mid(n); + if (p.isEmpty()) + return true; + for (n = i; n < (int)(text.length()); n++){ + QString t = text.mid(n); + if (match(text, p)) + return true; + } + return false; + } + if (text[i] != c) + return false; + } + return (i == (int)(text.length())) && (i == (int)(pat.length())); +} + +bool FilterPlugin::checkSpam(const QString &text, const QString &_filter) +{ + QString filter = _filter; + QStringList wordsText; + getWords(text, wordsText, false); + bool bQuota = false; + while (!filter.isEmpty()){ + QString filterPart = getToken(filter, '\"'); + QStringList wordsFilter; + getWords(filterPart, wordsFilter, true); + if (wordsFilter.count()){ + if (bQuota){ + for (QStringList::Iterator it = wordsText.begin(); it != wordsText.end(); ++it){ + if (!match(*it, wordsFilter[0])) + continue; + QStringList::Iterator it1 = it; + QStringList::Iterator itFilter = wordsFilter.begin(); + for (; (it1 != wordsText.end()) && (itFilter != wordsFilter.end()); ++it1, ++itFilter){ + if (!match(*it1, *itFilter)) + break; + } + if (itFilter == wordsFilter.end()) + return true; + } + }else{ + for (QStringList::Iterator it = wordsText.begin(); it != wordsText.end(); ++it){ + for (QStringList::Iterator itFilter = wordsFilter.begin(); itFilter != wordsFilter.end(); ++itFilter){ + if (match(*it, *itFilter)) + return true; + } + } + } + } + bQuota = !bQuota; + } + return false; +} + +void FilterPlugin::getWords(const QString &text, QStringList &words, bool bPattern) +{ + QString word; + for (int i = 0; i < (int)(text.length()); i++){ + QChar c = text[i]; + if (c.isLetterOrNumber()){ + word += c; + continue; + } + if (bPattern && ((c == '?') || (c == '*'))){ + word += c; + continue; + } + if (word.isEmpty()) + continue; + words.append(word); + word = QString::null; + } + if (!word.isEmpty()) + words.append(word); +} + +void FilterPlugin::addToIgnore(void *p) +{ + Contact *contact = getContacts()->contact((unsigned long)p); + if (contact && !contact->getIgnore()){ + contact->setIgnore(true); + EventContact(contact, EventContact::eChanged).process(); + } +} + +void FilterPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr FilterPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant FilterPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void FilterPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/filter/filter.h b/plugins/filter/filter.h new file mode 100644 index 0000000..6426610 --- /dev/null +++ b/plugins/filter/filter.h @@ -0,0 +1,68 @@ +/*************************************************************************** + filter.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FILTER_H +#define _FILTER_H + +#include + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" + +class QWidget; + +struct FilterUserData +{ + SIM::Data SpamList; +}; + +class QStringList; + +class FilterPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + FilterPlugin(unsigned, Buffer *cfg); + virtual ~FilterPlugin(); + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); + +protected slots: + void addToIgnore(void*); + +protected: + unsigned long user_data_id; + unsigned long CmdIgnoreList; + unsigned long CmdIgnore; + unsigned long CmdIgnoreText; + virtual bool processEvent(SIM::Event *e); + virtual QWidget *createConfigWindow(QWidget *parent); + virtual QByteArray getConfig(); + bool checkSpam(const QString &text, const QString &filter); + void getWords(const QString &text, QStringList &words, bool bPattern); + +private: + SIM::PropertyHubPtr m_propertyHub; + +}; + +#endif + diff --git a/plugins/filter/filter.rc b/plugins/filter/filter.rc new file mode 100644 index 0000000..51f8e63 --- /dev/null +++ b/plugins/filter/filter.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Filter plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "filter\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "filter.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/filter/filter.vcproj b/plugins/filter/filter.vcproj new file mode 100644 index 0000000..de509d3 --- /dev/null +++ b/plugins/filter/filter.vcproj @@ -0,0 +1,500 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/filter/filtercfg.cpp b/plugins/filter/filtercfg.cpp new file mode 100644 index 0000000..3f4d819 --- /dev/null +++ b/plugins/filter/filtercfg.cpp @@ -0,0 +1,75 @@ +/*************************************************************************** + filtercfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" + +#include "filtercfg.h" +#include "filter.h" +#include "ignorelist.h" + +#include +#include +#include + +FilterConfig::FilterConfig(QWidget *parent, PropertyHubPtr data, FilterPlugin *plugin, bool bMain) + : QWidget(parent) + , m_data(data) + , m_plugin(plugin) + , m_ignore(NULL) +{ + setupUi(this); + if(bMain) + { + chkFromList->setChecked(m_plugin->value("FromList").toBool()); + chkAuthFromList->setChecked(m_plugin->value("AuthFromList").toBool()); + for (QObject *p = parent; p != NULL; p = p->parent()){ + QTabWidget *tab = qobject_cast(p); + if (!tab) + continue; + m_ignore = new IgnoreList(tab); + tab->addTab(m_ignore, i18n("Ignore list")); + break; + } + } + else + { + chkFromList->hide(); + chkAuthFromList->hide(); + lblFilter->hide(); + } + edtFilter->setPlainText(data->value("SpamList").toString()); +} + +FilterConfig::~FilterConfig() +{ +// do not delete - it gets deleted when QTabWidget (=parent) goes away +// delete m_ignore; +} + +void FilterConfig::apply() +{ + m_plugin->setValue("FromList", chkFromList->isChecked()); + m_plugin->setValue("AuthFromList", chkAuthFromList->isChecked()); + apply(m_data); +} + +void FilterConfig::apply(PropertyHubPtr data) +{ + //FilterUserData *data = (FilterUserData*)_data; + data->setValue("SpamList", edtFilter->toPlainText()); +} + diff --git a/plugins/filter/filtercfg.h b/plugins/filter/filtercfg.h new file mode 100644 index 0000000..bf49725 --- /dev/null +++ b/plugins/filter/filtercfg.h @@ -0,0 +1,46 @@ +/*************************************************************************** + filtercfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FILTERCFG_H +#define _FILTERCFG_H + +#include "ui_filtercfgbase.h" +#include "propertyhub.h" + +using namespace SIM; + +struct FilterUserData; +class FilterPlugin; +class IgnoreList; + +class FilterConfig : public QWidget, public Ui::FilterConfigBase +{ + Q_OBJECT +public: + FilterConfig(QWidget *parent, PropertyHubPtr data, FilterPlugin *plugin, bool bMain); + ~FilterConfig(); +public slots: + void apply(); + void apply(PropertyHubPtr); +protected: + PropertyHubPtr m_data; + FilterPlugin *m_plugin; + IgnoreList *m_ignore; +}; + +#endif + diff --git a/plugins/filter/filtercfgbase.ui b/plugins/filter/filtercfgbase.ui new file mode 100644 index 0000000..ba5b19b --- /dev/null +++ b/plugins/filter/filtercfgbase.ui @@ -0,0 +1,74 @@ + + + FilterConfigBase + + + + 0 + 0 + 392 + 253 + + + + Form1 + + + + 6 + + + 11 + + + + + &Receive message only from contacts from list + + + + + + + &Receive authorization and system messages only from contacts from list + + + + + + + Reject messages from unknown users contains this words or phrases: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + + + + Words are divided by any separators (space, comma, i.e.) +A phrase can be specified using quotation marks +Words can contain wildcards: +* - any amount of symbols (or is empty) +? - any symbol + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + + diff --git a/plugins/filter/ignorelist.cpp b/plugins/filter/ignorelist.cpp new file mode 100644 index 0000000..0fb8a95 --- /dev/null +++ b/plugins/filter/ignorelist.cpp @@ -0,0 +1,238 @@ +/*************************************************************************** + ignorelist.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "log.h" +#include "misc.h" + +#include "ignorelist.h" +#include "contacts/contact.h" + +#include + +using namespace SIM; + +unsigned CmdListUnignore = 0x130001; + +IgnoreList::IgnoreList(QWidget *parent) : QWidget(parent) +{ + setupUi(this); + Command cmd; + cmd->id = CmdListUnignore; + cmd->text = I18N_NOOP("Unignore"); + cmd->icon = QString::null; + cmd->accel = QString::null; + cmd->bar_id = 0; + cmd->menu_id = MenuListView; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + lstIgnore->addColumn(i18n("Contact")); + lstIgnore->addColumn(i18n("Name")); + lstIgnore->addColumn(i18n("EMail")); + connect(lstIgnore, SIGNAL(deleteItem(ListViewItem*)), this, SLOT(deleteItem(ListViewItem*))); + connect(lstIgnore, SIGNAL(dragStart()), this, SLOT(dragStart())); + connect(lstIgnore, SIGNAL(dragEnter(QMimeSource*)), this, SLOT(dragEnter(QMimeSource*))); + connect(lstIgnore, SIGNAL(drop(QMimeSource*)), this, SLOT(drop(QMimeSource*))); + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + if (!contact->getIgnore()) + continue; + ListViewItem *item = new ListViewItem(lstIgnore); + updateItem(item, contact); + } +} + +bool IgnoreList::processEvent(Event *e) +{ + switch (e->type()){ + case eEventContact: { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + switch(ec->action()) { + case EventContact::eDeleted: { + removeItem(findItem(contact)); + break; + } + case EventContact::eCreated: { + ListViewItem *item = findItem(contact); + if (contact->getIgnore()){ + if (item == NULL) + item = new ListViewItem(lstIgnore); + updateItem(item, contact); + }else{ + removeItem(item); + } + break; + } + case EventContact::eChanged: { + if(contact->getIgnore()) { + ListViewItem *item = findItem(contact); + if(!item) { + if (item == NULL) + item = new ListViewItem(lstIgnore); + updateItem(item, contact); + } + } else { + ListViewItem *item = findItem(contact); + removeItem(item); + } + break; + } + default: + break; + } + break; + } + case eEventCommandExec: { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->id == CmdListUnignore) && (cmd->menu_id == MenuListView)){ + ListViewItem *item = (ListViewItem*)(cmd->param); + if (item->listView() == lstIgnore){ + unignoreItem(item); + return true; + } + } + break; + } + default: + break; + } + return false; +} + +void IgnoreList::updateItem(ListViewItem *item, Contact *contact) +{ + QString name = contact->getName(); + QString firstName = contact->getFirstName(); + QString lastName = contact->getLastName(); + firstName = getToken(firstName, '/'); + lastName = getToken(lastName, '/'); + if (!lastName.isEmpty()){ + if (!firstName.isEmpty()) + firstName += ' '; + firstName += lastName; + } + QString mail; + QString mails = contact->getEMails(); + while (mails.length()){ + QString mailItem = getToken(mails, ';'); + if (mail.length()) + mail += ','; + mail += getToken(mailItem, '/'); + } + unsigned style; + QString statusIcon; + contact->contactInfo(style, statusIcon); + item->setText(0, name); + item->setText(1, firstName); + item->setText(2, mail); + item->setText(3, QString::number(contact->id())); + item->setPixmap(0, Pict(statusIcon)); +} + +ListViewItem *IgnoreList::findItem(Contact *contact) +{ + for(int c = 0; c < lstIgnore->topLevelItemCount(); c++) + { + ListViewItem *item = static_cast(lstIgnore->topLevelItem(c)); + if (item->text(3).toUInt() == contact->id()) + return item; + } + return NULL; +} + +void IgnoreList::unignoreItem(ListViewItem *item) +{ + Contact *contact = getContacts()->contact(item->text(3).toUInt()); + if (contact) { + contact->setIgnore(false); + EventContact(contact, EventContact::eChanged).process(); + } +} + +void IgnoreList::deleteItem(ListViewItem *item) +{ + Contact *contact = getContacts()->contact(item->text(3).toUInt()); + if (contact) { + EventContact(contact,EventContact::eDeleted).process(); + } +} + +void IgnoreList::dragStart() +{ + ListViewItem *item = lstIgnore->currentItem(); + if (item == NULL) + return; +// Contact *contact = getContacts()->contact(item->text(3).toUInt()); +// if (contact) +// lstIgnore->startDrag(new ContactDragObject(lstIgnore, contact)); +} + +void IgnoreList::dragEnter(QMimeSource *s) +{ +// if (ContactDragObject::canDecode(s)){ +// Contact *contact = ContactDragObject::decode(s); +// if (contact){ +// if (!contact->getIgnore()){ +// log(L_DEBUG, "Set true"); +// lstIgnore->acceptDrop(true); +// return; +// } +// } +// } +// log(L_DEBUG, "Set false"); +// lstIgnore->acceptDrop(false); +} + +void IgnoreList::drop(QMimeSource *s) +{ + if (ContactDragObject::canDecode(s)){ + Contact *contact = ContactDragObject::decode(s); + if (contact){ + if (!contact->getIgnore()){ + contact->setIgnore(true); + EventContact(contact, EventContact::eChanged).process(); + return; + } + } + } +} + +void IgnoreList::removeItem(ListViewItem *item) +{ + if (item == NULL) + return; + /* + ListViewItem *nextItem = NULL; + if (item == lstIgnore->currentItem()){ + nextItem = item->nextSibling(); + if (nextItem == NULL){ + for (nextItem = lstIgnore->firstChild(); nextItem; nextItem = nextItem->nextSibling()) + if (nextItem->nextSibling() == item) + break; + } + } + */ + delete item; + //if (nextItem) + // lstIgnore->setCurrentItem(nextItem); +} + diff --git a/plugins/filter/ignorelist.h b/plugins/filter/ignorelist.h new file mode 100644 index 0000000..04a7216 --- /dev/null +++ b/plugins/filter/ignorelist.h @@ -0,0 +1,46 @@ +/*************************************************************************** + ignorelist.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _IGNORELIST_H +#define _IGNORELIST_H + +#include "ui_ignorelistbase.h" + +#include "event.h" + +class ListViewItem; + +class IgnoreList : public QWidget, public Ui::IgnoreListBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + IgnoreList(QWidget *parent); +protected slots: + void deleteItem(ListViewItem*); + void dragStart(); + void dragEnter(QMimeSource*); + void drop(QMimeSource*); +protected: + virtual bool processEvent(SIM::Event *e); + void removeItem(ListViewItem*); + void updateItem(ListViewItem*, SIM::Contact*); + void unignoreItem(ListViewItem*); + ListViewItem *findItem(SIM::Contact*); +}; + +#endif + diff --git a/plugins/filter/ignorelistbase.ui b/plugins/filter/ignorelistbase.ui new file mode 100644 index 0000000..434fbb5 --- /dev/null +++ b/plugins/filter/ignorelistbase.ui @@ -0,0 +1,73 @@ + + + + + IgnoreListBase + + + + 0 + 0 + 373 + 223 + + + + Form2 + + + + 11 + + + 6 + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    + + ListView + QWidget +
    simgui/listview.h
    + + -1 + -1 + + 0 + + 7 + 7 + + image1 +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + +
    diff --git a/plugins/flash/flash_win32.zip b/plugins/flash/flash_win32.zip new file mode 100644 index 0000000000000000000000000000000000000000..21a80b994b9c2424f08167f558e16c3f87996c59 GIT binary patch literal 16440 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 literal 0 HcmV?d00001 diff --git a/plugins/flash/flash_win32/FlashWnd.cpp b/plugins/flash/flash_win32/FlashWnd.cpp new file mode 100644 index 0000000..ed243fe --- /dev/null +++ b/plugins/flash/flash_win32/FlashWnd.cpp @@ -0,0 +1,156 @@ +/****************************************************************** +*** +*** +*** FREE WINDOWLESS FLASH CONTROL +*** +*** by Makarov Igor +*** +*** for questions and remarks mailto: mak_july@list.ru +*** +*** +*******************************************************************/ +// FlashWnd.cpp: implementation of the COleContainerWnd class. +// +////////////////////////////////////////////////////////////////////// + +//for help and reference see: http://www.codeproject.com/KB/COM/flashcontrol.aspx + + +#include "stdafx.h" +#include "FlashWnd.h" + +CFlashWnd::CFlashWnd() +{ + m_lVersion = 0; +} +CFlashWnd::~CFlashWnd() +{ +} + +//DShockwaveFlashEvents +HRESULT STDMETHODCALLTYPE CFlashWnd::OnReadyStateChange(long newState) +{ + return S_OK; +} +HRESULT STDMETHODCALLTYPE CFlashWnd::OnProgress(long percentDone) +{ + return S_OK; +} +HRESULT STDMETHODCALLTYPE CFlashWnd::FSCommand(_bstr_t command, _bstr_t args) +{ + return S_OK; +} + +void CFlashWnd::OnErrorClassNotReg() +{ + //some notification code here +} +BOOL CFlashWnd::OnBeforeShowingContent() +{ + m_lVersion = m_lpControl->FlashVersion(); + if ((m_lVersion & 0x00FF0000) == 0x00080000) + m_bFixTransparency = TRUE; + else + m_bFixTransparency = FALSE; + HRESULT hr; + hr = m_lpControl->QueryInterface(IID_IConnectionPointContainer, (void**)&m_lpConCont); + if (FAILED(hr)) + return FALSE; + hr = m_lpConCont->FindConnectionPoint(ShockwaveFlashObjects::DIID__IShockwaveFlashEvents, &m_lpConPoint); + if (FAILED(hr)) + return FALSE; + hr = m_lpConPoint->Advise((ShockwaveFlashObjects::_IShockwaveFlashEvents *)this, &m_dwConPointID); + if (FAILED(hr)) + return FALSE; + + if (m_bTransparent) + m_lpControl->PutWMode(L"transparent"); + m_lpControl->PutScale(L"showAll"); + m_lpControl->PutBackgroundColor(0x00000000); + m_lpControl->PutEmbedMovie(FALSE); + return TRUE; +} +BOOL CFlashWnd::OnAfterShowingContent() +{ + HRESULT hr; + m_lpControl->PutEmbedMovie(TRUE); + hr = m_lpControl->LoadMovie(0, L"http://www.djdean.de/dean_bot.swf"); +// hr = m_lpControl->LoadMovie(0, L"c:\\mailru.swf"); + if (FAILED(hr)) + return FALSE; + hr = m_lpControl->Play(); + if (FAILED(hr)) + return FALSE; + return TRUE; +} + +//IUnknown + +HRESULT STDMETHODCALLTYPE CFlashWnd::QueryInterface(REFIID riid, void ** ppvObject) +{ + HRESULT hr = COleContainerWnd::QueryInterface(riid, ppvObject); + if (hr != E_NOINTERFACE) + return hr; + if (IsEqualGUID(riid, ShockwaveFlashObjects::DIID__IShockwaveFlashEvents)) + *ppvObject = (void*)dynamic_cast(this); + else + { + *ppvObject = 0; + return E_NOINTERFACE; + } + if (!(*ppvObject)) + return E_NOINTERFACE; //if dynamic_cast returned 0 + m_iRef++; + return S_OK; +} + +ULONG STDMETHODCALLTYPE CFlashWnd::AddRef() +{ + m_iRef++; + return m_iRef; +} + +ULONG STDMETHODCALLTYPE CFlashWnd::Release() +{ + m_iRef--; + return m_iRef; +} + +//IDispatch +HRESULT STDMETHODCALLTYPE CFlashWnd::GetTypeInfoCount(UINT __RPC_FAR *pctinfo) +{ + NOTIMPLEMENTED; +} +HRESULT STDMETHODCALLTYPE CFlashWnd::GetTypeInfo( + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo) +{ + NOTIMPLEMENTED; +} +HRESULT STDMETHODCALLTYPE CFlashWnd::GetIDsOfNames( + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId) +{ + NOTIMPLEMENTED; +} +HRESULT STDMETHODCALLTYPE CFlashWnd::Invoke( + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr) +{ +/* switch (dispIdMember) + { + default: + return S_OK; + }*/ + return S_OK; +} diff --git a/plugins/flash/flash_win32/FlashWnd.h b/plugins/flash/flash_win32/FlashWnd.h new file mode 100644 index 0000000..ae079a5 --- /dev/null +++ b/plugins/flash/flash_win32/FlashWnd.h @@ -0,0 +1,1018 @@ +/****************************************************************** +*** +*** +*** FREE WINDOWLESS FLASH CONTROL +*** +*** by Makarov Igor +*** +*** for questions and remarks mailto: mak_july@list.ru +*** +*** +*******************************************************************/ +// FlashWnd.h: interface for the CFlashWnd class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_FLASHWND_H__D74EA89B_5D79_4D87_8BB9_4DB90A5FE8FC__INCLUDED_) +#define AFX_FLASHWND_H__D74EA89B_5D79_4D87_8BB9_4DB90A5FE8FC__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +//#import "c:\\winnt\\system32\\macromed\\flash\\flash.ocx" named_guids + +#import "c:\\WINNT\\system32\\macromed\\flash\\Flash10a.ocx" named_guids no_auto_exclude + +#define NOTIMPLEMENTED return E_NOTIMPL + +#define OLECONTAINER_DEF template +#define OLECONTAINER_DEF2 TObj + +#define OLECONTAINER_CONSTRUCT OLECONTAINER_DEF COleContainerWnd +#define OLECONTAINER(type) OLECONTAINER_DEF type COleContainerWnd + +#define OLE_IUNKNOWN_DECLARE \ + int m_iRef; \ + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void ** ppvObject); \ + ULONG STDMETHODCALLTYPE AddRef(); \ + ULONG STDMETHODCALLTYPE Release(); + + +OLECONTAINER_DEF class COleContainerWnd : +/*virtual*/ public IOleClientSite, +/*virtual*/ public IOleInPlaceSiteWindowless, +/*virtual*/ public IOleInPlaceFrame, +/*virtual*/ public IStorage + +{ +public: + GUID m_CLSID; + TObj *m_lpControl; + IOleObject *m_lpO; + IViewObjectEx *m_lpViewObject; + IViewObjectEx *m_lpViewObjectEx; + IOleInPlaceObject *m_lpInPlaceObj; + IOleInPlaceObjectWindowless *m_lpInPlaceObjWindowless; + IConnectionPointContainer *m_lpConCont; + IConnectionPoint *m_lpConPoint; + + HWND m_hWnd, m_hWndParent; + HINSTANCE m_hInst; + + BOOL m_bChild; + BOOL m_bTransparent; + BOOL m_bFixTransparency; + DWORD m_dwConPointID; + HDC m_hdcBack; + HBITMAP m_bmpBack; + RECT m_rcBounds; + BYTE *m_lpBitsOnly; + int m_iBPP; + HDC m_hdcBackW; + HBITMAP m_bmpBackW; + BYTE *m_lpBitsOnlyW; +public: + COleContainerWnd(); + virtual ~COleContainerWnd(); + static LRESULT CALLBACK WndProcStatic(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + LRESULT WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + HWND GetHWND() { assert(m_hWnd); return m_hWnd; } + HWND GetParentWindow() { assert(m_hWndParent); return m_hWndParent; } + HWND GetInstance() { assert(m_hInst); return m_hInst; } +public: + virtual BOOL Create(GUID clsid, DWORD dwExStyle, DWORD dwStyle, HWND hWndParent, HINSTANCE hInst); + virtual void Draw(HDC hdcDraw, const RECT *rcDraw, BOOL bErase); + //ole container events + virtual void OnErrorClassNotReg(); + virtual BOOL OnBeforeShowingContent(); + virtual BOOL OnAfterShowingContent(); +public: + //interface methods + + //IUnknown + int m_iRef; + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void ** ppvObject); + ULONG STDMETHODCALLTYPE AddRef(); + ULONG STDMETHODCALLTYPE Release(); + + //IOleClientSite + virtual HRESULT STDMETHODCALLTYPE SaveObject(); + virtual HRESULT STDMETHODCALLTYPE GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk); + virtual HRESULT STDMETHODCALLTYPE GetContainer(LPOLECONTAINER FAR* ppContainer); + virtual HRESULT STDMETHODCALLTYPE ShowObject(); + virtual HRESULT STDMETHODCALLTYPE OnShowWindow(BOOL fShow); + virtual HRESULT STDMETHODCALLTYPE RequestNewObjectLayout(); + + //IOleInPlaceSite + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND FAR* lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + virtual HRESULT STDMETHODCALLTYPE CanInPlaceActivate(); + virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivate(); + virtual HRESULT STDMETHODCALLTYPE OnUIActivate(); + virtual HRESULT STDMETHODCALLTYPE GetWindowContext(LPOLEINPLACEFRAME FAR* lplpFrame,LPOLEINPLACEUIWINDOW FAR* lplpDoc,LPRECT lprcPosRect,LPRECT lprcClipRect,LPOLEINPLACEFRAMEINFO lpFrameInfo); + virtual HRESULT STDMETHODCALLTYPE Scroll(SIZE scrollExtent); + virtual HRESULT STDMETHODCALLTYPE OnUIDeactivate(BOOL fUndoable); + virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate(); + virtual HRESULT STDMETHODCALLTYPE DiscardUndoState(); + virtual HRESULT STDMETHODCALLTYPE DeactivateAndUndo(); + virtual HRESULT STDMETHODCALLTYPE OnPosRectChange(LPCRECT lprcPosRect); + + //IOleInPlaceSiteEx + virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivateEx(BOOL __RPC_FAR *pfNoRedraw, DWORD dwFlags); + virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivateEx(BOOL fNoRedraw); + virtual HRESULT STDMETHODCALLTYPE RequestUIActivate(void); + + //IOleInPlaceSiteWindowless + virtual HRESULT STDMETHODCALLTYPE CanWindowlessActivate( void); + virtual HRESULT STDMETHODCALLTYPE GetCapture( void); + virtual HRESULT STDMETHODCALLTYPE SetCapture( + /* [in] */ BOOL fCapture); + virtual HRESULT STDMETHODCALLTYPE GetFocus( void); + virtual HRESULT STDMETHODCALLTYPE SetFocus( + /* [in] */ BOOL fFocus); + virtual HRESULT STDMETHODCALLTYPE GetDC( + /* [in] */ LPCRECT pRect, + /* [in] */ DWORD grfFlags, + /* [out] */ HDC __RPC_FAR *phDC); + virtual HRESULT STDMETHODCALLTYPE ReleaseDC( + /* [in] */ HDC hDC); + virtual HRESULT STDMETHODCALLTYPE InvalidateRect( + /* [in] */ LPCRECT pRect, + /* [in] */ BOOL fErase); + virtual HRESULT STDMETHODCALLTYPE InvalidateRgn( + /* [in] */ HRGN hRGN, + /* [in] */ BOOL fErase); + virtual HRESULT STDMETHODCALLTYPE ScrollRect( + /* [in] */ INT dx, + /* [in] */ INT dy, + /* [in] */ LPCRECT pRectScroll, + /* [in] */ LPCRECT pRectClip); + virtual HRESULT STDMETHODCALLTYPE AdjustRect( + /* [out][in] */ LPRECT prc); + virtual HRESULT STDMETHODCALLTYPE OnDefWindowMessage( + /* [in] */ UINT msg, + /* [in] */ WPARAM wParam, + /* [in] */ LPARAM lParam, + /* [out] */ LRESULT __RPC_FAR *plResult); + + //IOleInPlaceFrame +// virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND FAR* lphwnd); +// virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + virtual HRESULT STDMETHODCALLTYPE GetBorder(LPRECT lprectBorder); + virtual HRESULT STDMETHODCALLTYPE RequestBorderSpace(LPCBORDERWIDTHS pborderwidths); + virtual HRESULT STDMETHODCALLTYPE SetBorderSpace(LPCBORDERWIDTHS pborderwidths); + virtual HRESULT STDMETHODCALLTYPE SetActiveObject(IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName); + virtual HRESULT STDMETHODCALLTYPE InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths); + virtual HRESULT STDMETHODCALLTYPE SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject); + virtual HRESULT STDMETHODCALLTYPE RemoveMenus(HMENU hmenuShared); + virtual HRESULT STDMETHODCALLTYPE SetStatusText(LPCOLESTR pszStatusText); + virtual HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable); + virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpmsg, WORD wID); + + //IStorage + virtual HRESULT STDMETHODCALLTYPE CreateStream(const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm); + virtual HRESULT STDMETHODCALLTYPE OpenStream(const WCHAR * pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm); + virtual HRESULT STDMETHODCALLTYPE CreateStorage(const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage **ppstg); + virtual HRESULT STDMETHODCALLTYPE OpenStorage(const WCHAR * pwcsName, IStorage * pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg); + virtual HRESULT STDMETHODCALLTYPE CopyTo(DWORD ciidExclude, IID const *rgiidExclude, SNB snbExclude,IStorage *pstgDest); + virtual HRESULT STDMETHODCALLTYPE MoveElementTo(const OLECHAR *pwcsName,IStorage * pstgDest, const OLECHAR *pwcsNewName, DWORD grfFlags); + virtual HRESULT STDMETHODCALLTYPE Commit(DWORD grfCommitFlags); + virtual HRESULT STDMETHODCALLTYPE Revert(); + virtual HRESULT STDMETHODCALLTYPE EnumElements(DWORD reserved1, void * reserved2, DWORD reserved3, IEnumSTATSTG ** ppenum); + virtual HRESULT STDMETHODCALLTYPE DestroyElement(const OLECHAR *pwcsName); + virtual HRESULT STDMETHODCALLTYPE RenameElement(const WCHAR *pwcsOldName, const WCHAR *pwcsNewName); + virtual HRESULT STDMETHODCALLTYPE SetElementTimes(const WCHAR *pwcsName, FILETIME const *pctime, FILETIME const *patime, FILETIME const *pmtime); + virtual HRESULT STDMETHODCALLTYPE SetClass(REFCLSID clsid); + virtual HRESULT STDMETHODCALLTYPE SetStateBits(DWORD grfStateBits, DWORD grfMask); + virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG * pstatstg, DWORD grfStatFlag); + + //IDispatch + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( + /* [out] */ UINT __RPC_FAR *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke( + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); +}; + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +OLECONTAINER_CONSTRUCT::COleContainerWnd() +{ + m_lpControl = NULL; + m_lpO = NULL; + m_lpViewObjectEx = NULL; + m_lpViewObject = NULL; + m_lpInPlaceObj = NULL; + m_lpInPlaceObjWindowless = NULL; + m_lpConCont = NULL; + m_lpConPoint = NULL; + + m_hdcBack = NULL; + m_bmpBack = NULL; + m_hdcBackW = NULL; + m_bmpBackW = NULL; + m_rcBounds.left = m_rcBounds.top = m_rcBounds.right = m_rcBounds.bottom = 0; + m_lpBitsOnly = NULL; + m_lpBitsOnlyW = NULL; + m_iBPP = 0; + + m_dwConPointID = 0; + m_bTransparent = FALSE; + m_bFixTransparency = FALSE; + m_iRef = 0; +} + +OLECONTAINER_CONSTRUCT::~COleContainerWnd() +{ + if (m_lpControl) + { + if (m_lpConPoint) + { + if (m_dwConPointID) + m_lpConPoint->Unadvise(m_dwConPointID); + m_lpConPoint->Release(); + } + if (m_lpConCont) + m_lpConCont->Release(); + m_lpO->Close(OLECLOSE_NOSAVE); + if (m_lpViewObjectEx) + m_lpViewObjectEx->Release(); + if (m_lpViewObject) + m_lpViewObject->Release(); + if (m_lpInPlaceObjWindowless) + m_lpInPlaceObjWindowless->Release(); + if (m_lpInPlaceObj) + m_lpInPlaceObj->Release(); + if (m_lpO) + m_lpO->Release(); + m_lpControl->Release(); + } + if (m_hdcBack) + ::DeleteDC(m_hdcBack); + if (m_bmpBack) + ::DeleteObject(m_bmpBack); + if (m_hdcBackW) + ::DeleteDC(m_hdcBackW); + if (m_bmpBackW) + ::DeleteObject(m_bmpBackW); +} +OLECONTAINER(BOOL)::Create(GUID clsid, DWORD dwExStyle, DWORD dwStyle, HWND hWndParent, HINSTANCE hInst) +{ + m_hWndParent = hWndParent; + m_hInst = hInst; + + m_CLSID = clsid; + m_bTransparent = dwExStyle & WS_EX_LAYERED; + m_bChild = dwStyle & WS_CHILD; + + WNDCLASSEX wcs = {0}; + wcs.cbSize = sizeof(WNDCLASSEX); + wcs.lpfnWndProc = COleContainerWnd::WndProcStatic; + wcs.hInstance = hInst; + wcs.lpszClassName = "MyOleControl"; + RegisterClassEx(&wcs); + + RECT r; + if (m_bChild) + ::GetClientRect(hWndParent, &r); + else + ::GetWindowRect(hWndParent, &r); + m_hWnd = CreateWindowEx(dwExStyle, + "MyOleControl", "MyOleControlWindow", + dwStyle, + r.left, r.top, r.right-r.left, r.bottom-r.top, hWndParent, NULL, hInst, (void *)this); + ::SetWindowPos(GetHWND(), HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + HRESULT hr; + hr = OleCreate(m_CLSID, IID_IOleObject, OLERENDER_DRAW, + 0, (IOleClientSite *)this, (IStorage *)this, (void **)&m_lpO); + if (FAILED(hr)) + { + if (hr == REGDB_E_CLASSNOTREG) + { + OnErrorClassNotReg(); + } + return FALSE; + } + hr = OleSetContainedObject(m_lpO, TRUE); + if (FAILED(hr)) + return FALSE; + hr = m_lpO->QueryInterface(__uuidof(TObj), (void **)&m_lpControl); + if (FAILED(hr)) + return FALSE; + hr = m_lpO->QueryInterface(IID_IViewObjectEx, (void **)&m_lpViewObjectEx); + if (FAILED(hr)) + { + m_lpViewObjectEx = NULL; + hr = m_lpO->QueryInterface(IID_IViewObject, (void **)&m_lpViewObject); + if (FAILED(hr)) + return FALSE; + } + if (m_bTransparent) + { + hr = m_lpO->QueryInterface(IID_IOleInPlaceObjectWindowless, (void **)&m_lpInPlaceObjWindowless); + if (FAILED(hr)) + { + hr = m_lpO->QueryInterface(IID_IOleInPlaceObject, (void **)&m_lpInPlaceObj); + if (FAILED(hr)) + return FALSE; + m_bTransparent = FALSE; + } + } + else + { + hr = m_lpO->QueryInterface(IID_IOleInPlaceObject, (void **)&m_lpInPlaceObj); + if (FAILED(hr)) + return FALSE; + } + if (!OnBeforeShowingContent()) + return FALSE; + hr = m_lpO->DoVerb(OLEIVERB_SHOW, NULL, (IOleClientSite *)this, 0, NULL, NULL); + if (FAILED(hr)) + return FALSE; + if (!OnAfterShowingContent()) + return FALSE; + return TRUE; +} + +//interface methods + +//IUnknown + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::QueryInterface(REFIID riid, void ** ppvObject) +{ + if (IsEqualGUID(riid, IID_IUnknown)) + *ppvObject = (void*)(this); + else if (IsEqualGUID(riid, IID_IOleInPlaceSite)) + *ppvObject = (void*)dynamic_cast(this); + else if (IsEqualGUID(riid, IID_IOleInPlaceSiteEx)) + *ppvObject = (void*)dynamic_cast(this); + else if (IsEqualGUID(riid, IID_IOleInPlaceSiteWindowless)) + *ppvObject = (void*)dynamic_cast(this); + else if (IsEqualGUID(riid, IID_IOleInPlaceFrame)) + *ppvObject = (void*)dynamic_cast(this); + else if (IsEqualGUID(riid, IID_IStorage)) + *ppvObject = (void*)dynamic_cast(this); + else + { + *ppvObject = 0; + return E_NOINTERFACE; + } + if (!(*ppvObject)) + return E_NOINTERFACE; //if dynamic_cast returned 0 + m_iRef++; + return S_OK; +} + +OLECONTAINER(ULONG STDMETHODCALLTYPE)::AddRef() +{ + m_iRef++; + return m_iRef; +} + +OLECONTAINER(ULONG STDMETHODCALLTYPE)::Release() +{ + m_iRef--; + return m_iRef; +} + +//IOleClientSite + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SaveObject() { NOTIMPLEMENTED; } +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk) { NOTIMPLEMENTED; } +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetContainer(LPOLECONTAINER FAR* ppContainer) +{ + *ppContainer = 0; + return E_NOINTERFACE; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::ShowObject() +{ + return S_OK; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnShowWindow(BOOL fShow) { NOTIMPLEMENTED; } +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::RequestNewObjectLayout() { NOTIMPLEMENTED; } + +//IOleInPlaceSite + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetWindow(HWND FAR* lphwnd) +{ + *lphwnd = GetHWND(); + return S_OK; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::ContextSensitiveHelp(BOOL fEnterMode) { NOTIMPLEMENTED; } +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::CanInPlaceActivate() +{ + return(S_OK); +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnInPlaceActivate() +{ + return(S_OK); +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnUIActivate() +{ + return(S_OK); +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetWindowContext(LPOLEINPLACEFRAME FAR* lplpFrame, LPOLEINPLACEUIWINDOW FAR* lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) +{ + *lplpFrame = (LPOLEINPLACEFRAME)this; + + *lplpDoc = 0; + + lpFrameInfo->fMDIApp = FALSE; + lpFrameInfo->hwndFrame = GetHWND(); + lpFrameInfo->haccel = 0; + lpFrameInfo->cAccelEntries = 0; + + RECT r; + ::GetClientRect(GetHWND(), &r); + *lprcPosRect = r; + *lprcClipRect = r; + return(S_OK); +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::Scroll(SIZE scrollExtent) { NOTIMPLEMENTED; } +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnUIDeactivate(BOOL fUndoable) +{ + return(S_OK); +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnInPlaceDeactivate() +{ + return(S_OK); +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::DiscardUndoState() { NOTIMPLEMENTED; } +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::DeactivateAndUndo() { NOTIMPLEMENTED; } +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnPosRectChange(LPCRECT lprcPosRect) +{ + return(S_OK); +} + + +//IOleInPlaceSiteEx + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnInPlaceActivateEx(BOOL __RPC_FAR *pfNoRedraw, DWORD dwFlags) +{ + if (pfNoRedraw) + *pfNoRedraw = FALSE; + return S_OK; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnInPlaceDeactivateEx(BOOL fNoRedraw) +{ + return S_FALSE; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::RequestUIActivate(void) +{ + return S_FALSE; +} + + +//IOleInPlaceSiteWindowless + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::CanWindowlessActivate( void) +{ + return S_OK; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetCapture( void) +{ + return S_FALSE; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetCapture( + /* [in] */ BOOL fCapture) +{ + return S_FALSE; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetFocus( void) +{ + return S_OK; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetFocus( + /* [in] */ BOOL fFocus) +{ + return S_OK; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetDC( + /* [in] */ LPCRECT pRect, + /* [in] */ DWORD grfFlags, + /* [out] */ HDC __RPC_FAR *phDC) +{ + return S_FALSE; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::ReleaseDC( + /* [in] */ HDC hDC) +{ + return S_FALSE; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::InvalidateRect( + /* [in] */ LPCRECT pRect, + /* [in] */ BOOL fErase) +{ + Draw(NULL, pRect, fErase); + return S_OK; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::InvalidateRgn( + /* [in] */ HRGN hRGN, + /* [in] */ BOOL fErase) +{ + return S_OK; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::ScrollRect( + /* [in] */ INT dx, + /* [in] */ INT dy, + /* [in] */ LPCRECT pRectScroll, + /* [in] */ LPCRECT pRectClip) +{ + NOTIMPLEMENTED; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::AdjustRect( + /* [out][in] */ LPRECT prc) +{ + return S_FALSE; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OnDefWindowMessage( + /* [in] */ UINT msg, + /* [in] */ WPARAM wParam, + /* [in] */ LPARAM lParam, + /* [out] */ LRESULT __RPC_FAR *plResult) +{ + return S_FALSE; +} +OLECONTAINER(void)::Draw(HDC hdcDraw, const RECT *rcDraw, BOOL bErase) +{ + HWND hwnd = GetHWND(); + HRESULT hr; + RECT r; + + IOleObject *lpO = m_lpO; + IViewObject *lpV = m_lpViewObjectEx ? (IViewObject *)m_lpViewObjectEx : m_lpViewObject; + + if (!m_bTransparent) + { + RECT rTotal; + if (!::GetClientRect(hwnd, &rTotal)) + return; + if (lpV) + { + if (!hdcDraw) + { + hdcDraw = ::GetDC(hwnd); + hr = OleDraw(lpV, DVASPECT_CONTENT, hdcDraw, &rTotal); + ::ReleaseDC(hwnd, hdcDraw); + } + else + { + hr = OleDraw(lpV, DVASPECT_CONTENT, hdcDraw, &rTotal); + } + } + return; + } + + ::GetWindowRect(hwnd, &r); + if (!m_hdcBack || !EqualRect(&r, &m_rcBounds)) + { + if (m_hdcBack) + ::DeleteDC(m_hdcBack); + if (m_bmpBack) + ::DeleteObject(m_bmpBack); + if (m_hdcBackW) + ::DeleteDC(m_hdcBackW); + if (m_bmpBackW) + ::DeleteObject(m_bmpBackW); + m_rcBounds = r; + HDC hdc = ::GetDC(hwnd); + BITMAPINFOHEADER bih = {0}; + bih.biSize = sizeof(BITMAPINFOHEADER); + bih.biBitCount = 32; + bih.biCompression = BI_RGB; + bih.biPlanes = 1; + bih.biWidth = r.right - r.left; + bih.biHeight = -(r.bottom - r.top); + m_hdcBack = CreateCompatibleDC(hdc); + m_bmpBack = CreateDIBSection(hdc, (BITMAPINFO *)&bih, DIB_RGB_COLORS, (void **)&m_lpBitsOnly, NULL, 0x0); + SelectObject(m_hdcBack, m_bmpBack); + if (m_bFixTransparency) + { + m_hdcBackW = CreateCompatibleDC(hdc); + m_bmpBackW = CreateDIBSection(hdc, (BITMAPINFO *)&bih, DIB_RGB_COLORS, (void **)&m_lpBitsOnlyW, NULL, 0x0); + SelectObject(m_hdcBackW, m_bmpBackW); + } + ::ReleaseDC(hwnd, hdc); + if (m_iBPP == 0) + m_iBPP = GetDeviceCaps(m_hdcBack, BITSPIXEL); + } + POINT p = {r.left, r.top}; + POINT p2 = {0, 0}; + SIZE sz = {r.right-r.left, r.bottom-r.top}; + + if (lpO && lpV) + { + RECT rTotal; + ::GetClientRect(hwnd, &rTotal); + RECTL rcBounds = {rTotal.left, rTotal.top, rTotal.right, rTotal.bottom}; + BYTE *dst = m_lpBitsOnly, *dstW; + if (m_iBPP == 32) + { + if (!m_bFixTransparency) //if flash player version is other than 8, do usual painting + { + memset(m_lpBitsOnly, 0, sz.cx * sz.cy * 4); + hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal); + } + else //if player version is 8, we need to fix flash player 8 control transparency bug + { + memset(m_lpBitsOnly, 0, sz.cx * sz.cy * 4); + memset(m_lpBitsOnlyW, 255, sz.cx * sz.cy * 4); + hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal); + hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBackW, &rTotal); + dst = m_lpBitsOnly; + dstW = m_lpBitsOnlyW; + BYTE r, g, b, a, rw, gw, bw, aw, alpha_r, alpha_g, alpha_b, alpha; + for (int y = 0; y < sz.cy; y++) + { + for (int x = 0; x < sz.cx; x++) + { + //the idea is that we draw the same data onto black and white DC's + //and then calculate per pixel alpha based on difference, produced by alpha blending + r = *dst++; + g = *dst++; + b = *dst++; + a = *dst++; + rw = *dstW++; + gw = *dstW++; + bw = *dstW++; + aw = *dstW++; + alpha_r = rw-r; + alpha_g = gw-g; + alpha_b = bw-b; + //division by 3 is for accuracy and can be replaced by + //alpha = alpha_g; for example + alpha = (alpha_r + alpha_g + alpha_b) / 3; + *(dst - 1) = 255 - alpha; + //this algorithm should be optimized for MMX to achieve best performance + } + } + } + } + else //in 8/16/24 bit screen depth UpdateLayeredWindow produces wrong results - we use underlaying DC to paint to + { + HWND hwndParent = ::GetParent(hwnd); + HDC hdcParent = ::GetWindowDC(hwndParent); + BOOL bRet = BitBlt(m_hdcBack, 0, 0, rTotal.right, rTotal.bottom, hdcParent, 0, 0, SRCCOPY); + ::ReleaseDC(hwndParent, hdcParent); + hr = OleDraw(lpV, DVASPECT_TRANSPARENT, m_hdcBack, &rTotal); + dst = m_lpBitsOnly; + } + } + + BLENDFUNCTION bf; + bf.BlendOp = AC_SRC_OVER; + bf.AlphaFormat = AC_SRC_ALPHA; + bf.BlendFlags = 0; + bf.SourceConstantAlpha = 255; + BOOL bRet = UpdateLayeredWindow(hwnd, NULL, &p, &sz, m_hdcBack, &p2, 0, &bf, m_iBPP == 32 ? ULW_ALPHA : ULW_OPAQUE); +} + + +//IStorage + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::CreateStream(const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OpenStream(const WCHAR * pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::CreateStorage(const WCHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage **ppstg) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::OpenStorage(const WCHAR * pwcsName, IStorage * pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::CopyTo(DWORD ciidExclude, IID const *rgiidExclude, SNB snbExclude,IStorage *pstgDest) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::MoveElementTo(const OLECHAR *pwcsName,IStorage * pstgDest, const OLECHAR *pwcsNewName, DWORD grfFlags) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::Commit(DWORD grfCommitFlags) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::Revert() +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::EnumElements(DWORD reserved1, void * reserved2, DWORD reserved3, IEnumSTATSTG ** ppenum) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::DestroyElement(const OLECHAR *pwcsName) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::RenameElement(const WCHAR *pwcsOldName, const WCHAR *pwcsNewName) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetElementTimes(const WCHAR *pwcsName, FILETIME const *pctime, FILETIME const *patime, FILETIME const *pmtime) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetClass(REFCLSID clsid) +{ + return(S_OK); +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetStateBits(DWORD grfStateBits, DWORD grfMask) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::Stat(STATSTG * pstatstg, DWORD grfStatFlag) +{ + NOTIMPLEMENTED; +} + + +//IOleInPlaceFrame + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetBorder(LPRECT lprectBorder) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetBorderSpace(LPCBORDERWIDTHS pborderwidths) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetActiveObject(IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName) +{ + return(S_OK); +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject) +{ + return(S_OK); +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::RemoveMenus(HMENU hmenuShared) +{ + NOTIMPLEMENTED; +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::SetStatusText(LPCOLESTR pszStatusText) +{ + return(S_OK); +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::EnableModeless(BOOL fEnable) +{ + return(S_OK); +} + +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::TranslateAccelerator(LPMSG lpmsg, WORD wID) +{ + NOTIMPLEMENTED; +} + + +//IDispatch +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetTypeInfoCount(UINT __RPC_FAR *pctinfo) +{ + NOTIMPLEMENTED; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetTypeInfo( + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo) +{ + NOTIMPLEMENTED; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::GetIDsOfNames( + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId) +{ + NOTIMPLEMENTED; +} +OLECONTAINER(HRESULT STDMETHODCALLTYPE)::Invoke( + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr) +{ +/* switch (dispIdMember) + { + default: + return S_OK; + }*/ + return S_OK; +} + +OLECONTAINER(void)::OnErrorClassNotReg() +{ +} +OLECONTAINER(BOOL)::OnBeforeShowingContent() +{ + return TRUE; +} +OLECONTAINER(BOOL)::OnAfterShowingContent() +{ + return TRUE; +} + +OLECONTAINER(LRESULT CALLBACK)::WndProcStatic(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (uMsg == WM_CREATE) + { + LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; + SetWindowLong(hWnd, GWL_USERDATA, (long)lpcs->lpCreateParams); + return 0; + } + COleContainerWnd *lpWnd = (COleContainerWnd *)GetWindowLong(hWnd, GWL_USERDATA); + if (lpWnd) + return lpWnd->WndProc(hWnd, uMsg, wParam, lParam); + else + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} +OLECONTAINER(LRESULT)::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_CREATE: + { + LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; + SetWindowLong(hWnd, GWL_USERDATA, (long)lpcs->lpCreateParams); + return 0; + } + break; + case WM_PAINT: + { + if (!m_bTransparent) + { + PAINTSTRUCT ps; + HDC hdc = ::BeginPaint(GetHWND(), &ps); + Draw(hdc, &ps.rcPaint, ps.fErase); + ::EndPaint(GetHWND(), &ps); + return 0; + } + } + break; + case WM_NCHITTEST: + { + int x = LOWORD(lParam), y = HIWORD(lParam); + if (m_lpO && m_lpViewObjectEx) + { + IViewObjectEx *lpV = m_lpViewObjectEx; + POINT p = {x, y}; + DWORD dwRes; + RECT rTotal; + GetWindowRect(GetHWND(), &rTotal); + HRESULT hr = lpV->QueryHitPoint(DVASPECT_CONTENT, &rTotal, p, 1, &dwRes); + if (hr == S_OK) + { + if (dwRes == HITRESULT_OUTSIDE) + return HTTRANSPARENT; + else + return HTCLIENT; + } + } + } + break; + case WM_SIZE: + { + HRESULT hr; + RECT rPos; + GetClientRect(GetHWND(), &rPos); + RECT rClip = rPos; + if (m_lpInPlaceObjWindowless) + hr = m_lpInPlaceObjWindowless->SetObjectRects(&rPos, &rClip); + else if (m_lpInPlaceObj) + hr = m_lpInPlaceObj->SetObjectRects(&rPos, &rClip); + return 0; + } + break; + } + if (m_lpInPlaceObjWindowless) + { + if (uMsg == WM_MOUSEMOVE || uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP || uMsg == WM_LBUTTONDBLCLK + || uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONUP || uMsg == WM_RBUTTONDBLCLK + || uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONUP || uMsg == WM_MBUTTONDBLCLK + || uMsg == WM_MOUSEWHEEL + || uMsg == WM_KEYDOWN || uMsg == WM_KEYUP || uMsg == WM_CHAR + || uMsg == WM_SETCURSOR + ) + { + HRESULT hr; + LRESULT res; + hr = m_lpInPlaceObjWindowless->OnWindowMessage(uMsg, wParam, lParam, &res); + if (hr == S_OK) + return res; + } + } + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + + +class CFlashWnd : + public COleContainerWnd, + public ShockwaveFlashObjects::_IShockwaveFlashEvents + +{ +public: + long m_lVersion; +public: + CFlashWnd(); + virtual ~CFlashWnd(); + + virtual void OnErrorClassNotReg(); + virtual BOOL OnBeforeShowingContent(); + virtual BOOL OnAfterShowingContent(); +public: + //IUnknown + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void ** ppvObject); + ULONG STDMETHODCALLTYPE AddRef(); + ULONG STDMETHODCALLTYPE Release(); + + //IDispatch + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( + /* [out] */ UINT __RPC_FAR *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke( + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + //DShockwaveFlashEvents + HRESULT STDMETHODCALLTYPE OnReadyStateChange ( + long newState ); + HRESULT STDMETHODCALLTYPE OnProgress ( + long percentDone ); + HRESULT STDMETHODCALLTYPE FSCommand ( + _bstr_t command, + _bstr_t args ); +}; + +#endif // !defined(AFX_FLASHWND_H__D74EA89B_5D79_4D87_8BB9_4DB90A5FE8FC__INCLUDED_) diff --git a/plugins/flash/flash_win32/StdAfx.cpp b/plugins/flash/flash_win32/StdAfx.cpp new file mode 100644 index 0000000..0ddc873 --- /dev/null +++ b/plugins/flash/flash_win32/StdAfx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// flash.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/plugins/flash/flash_win32/StdAfx.h b/plugins/flash/flash_win32/StdAfx.h new file mode 100644 index 0000000..d86347d --- /dev/null +++ b/plugins/flash/flash_win32/StdAfx.h @@ -0,0 +1,47 @@ +/****************************************************************** +*** +*** +*** FREE WINDOWLESS FLASH CONTROL +*** +*** by Makarov Igor +*** +*** for questions and remarks mailto: mak_july@list.ru +*** +*** +*******************************************************************/ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) +#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +//#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#define WINVER 0x0500 +#define _WIN32_WINDOWS 0x0500 +#define _WIN32_WINNT 0x0500 + +// Windows Header Files: +#include + +// C RunTime Header Files +#include +#include +#include +#include +#include + +// Local Header Files + +// TODO: reference additional headers your program requires here + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) diff --git a/plugins/flash/flash_win32/flash.cpp b/plugins/flash/flash_win32/flash.cpp new file mode 100644 index 0000000..47b7bf5 --- /dev/null +++ b/plugins/flash/flash_win32/flash.cpp @@ -0,0 +1,246 @@ +/****************************************************************** +*** +*** +*** FREE WINDOWLESS FLASH CONTROL +*** +*** by Makarov Igor +*** +*** for questions and remarks mailto: mak_july@list.ru +*** +*** +*******************************************************************/ +// flash.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "resource.h" +#include "FlashWnd.h" + +#define MAX_LOADSTRING 100 + +// Global Variables: +HINSTANCE hInst; // current instance +TCHAR szTitle[MAX_LOADSTRING]; // The title bar text +TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text + +// Foward declarations of functions included in this code module: +ATOM MyRegisterClass(HINSTANCE hInstance); +BOOL InitInstance(HINSTANCE, int); +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); +LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); + +HWND g_hWnd = NULL; +HINSTANCE g_hInst = NULL; +CFlashWnd *g_flashWnd = NULL; + + +int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + // TODO: Place code here. + MSG msg; + HACCEL hAccelTable; + + // Initialize global strings + LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); + LoadString(hInstance, IDC_FLASH, szWindowClass, MAX_LOADSTRING); + MyRegisterClass(hInstance); + + // Perform application initialization: + if (!InitInstance (hInstance, nCmdShow)) + { + return FALSE; + } + + g_hInst = hInst; + + hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_FLASH); + + OleInitialize(NULL); + + g_flashWnd = new CFlashWnd; + +//create windowless control + g_flashWnd->Create(ShockwaveFlashObjects::CLSID_ShockwaveFlash, + WS_EX_LAYERED, WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS, + g_hWnd, g_hInst); + +//to create a windowed control uncomment this +// g_flashWnd->Create(ShockwaveFlashObjects::CLSID_ShockwaveFlash, +// 0, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, +// g_hWnd, g_hInst); + + // Main message loop: + while (GetMessage(&msg, NULL, 0, 0)) + { + if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + delete g_flashWnd; + + OleUninitialize(); + + return msg.wParam; +} + + + +// +// FUNCTION: MyRegisterClass() +// +// PURPOSE: Registers the window class. +// +// COMMENTS: +// +// This function and its usage is only necessary if you want this code +// to be compatible with Win32 systems prior to the 'RegisterClassEx' +// function that was added to Windows 95. It is important to call this function +// so that the application will get 'well formed' small icons associated +// with it. +// +ATOM MyRegisterClass(HINSTANCE hInstance) +{ + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = (WNDPROC)WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_FLASH); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = (LPCSTR)IDC_FLASH; + wcex.lpszClassName = szWindowClass; + wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); + + return RegisterClassEx(&wcex); +} + +// +// FUNCTION: InitInstance(HANDLE, int) +// +// PURPOSE: Saves instance handle and creates main window +// +// COMMENTS: +// +// In this function, we save the instance handle in a global variable and +// create and display the main program window. +// +BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) +{ + HWND hWnd; + + hInst = hInstance; // Store instance handle in our global variable + + hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, hInstance, NULL); + + if (!hWnd) + { + return FALSE; + } + + ShowWindow(hWnd, nCmdShow); + UpdateWindow(hWnd); + + g_hWnd = hWnd; + + return TRUE; +} + +// +// FUNCTION: WndProc(HWND, unsigned, WORD, LONG) +// +// PURPOSE: Processes messages for the main window. +// +// WM_COMMAND - process the application menu +// WM_PAINT - Paint the main window +// WM_DESTROY - post a quit message and return +// +// +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int wmId, wmEvent; + PAINTSTRUCT ps; + HDC hdc; + TCHAR szHello[MAX_LOADSTRING]; + LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); + + switch (message) + { + case WM_COMMAND: + wmId = LOWORD(wParam); + wmEvent = HIWORD(wParam); + // Parse the menu selections: + switch (wmId) + { + case IDM_ABOUT: + DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); + break; + case IDM_EXIT: + DestroyWindow(hWnd); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + break; + case WM_PAINT: + hdc = BeginPaint(hWnd, &ps); + // TODO: Add any drawing code here... + RECT rt; + GetClientRect(hWnd, &rt); + DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER | DT_VCENTER | DT_SINGLELINE); + EndPaint(hWnd, &ps); + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + case WM_MOVE: + { + RECT r; + GetWindowRect(hWnd, &r); + if (g_flashWnd) + SetWindowPos(g_flashWnd->GetHWND(), NULL, r.left, r.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER); + } + break; + case WM_SIZE: + { + RECT r; + GetWindowRect(hWnd, &r); + if (g_flashWnd) + SetWindowPos(g_flashWnd->GetHWND(), NULL, 0, 0, (r.right-r.left), (r.bottom-r.top), SWP_NOMOVE | SWP_NOZORDER); + } + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} + +// Mesage handler for about box. +LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + return TRUE; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, LOWORD(wParam)); + return TRUE; + } + break; + } + return FALSE; +} diff --git a/plugins/flash/flash_win32/flash.h b/plugins/flash/flash_win32/flash.h new file mode 100644 index 0000000..161c424 --- /dev/null +++ b/plugins/flash/flash_win32/flash.h @@ -0,0 +1,23 @@ +/****************************************************************** +*** +*** +*** FREE WINDOWLESS FLASH CONTROL +*** +*** by Makarov Igor +*** +*** for questions and remarks mailto: mak_july@list.ru +*** +*** +*******************************************************************/ + +#if !defined(AFX_FLASH_H__03637834_4B49_478B_98FD_E7B146E19D99__INCLUDED_) +#define AFX_FLASH_H__03637834_4B49_478B_98FD_E7B146E19D99__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" + + +#endif // !defined(AFX_FLASH_H__03637834_4B49_478B_98FD_E7B146E19D99__INCLUDED_) diff --git a/plugins/flash/flash_win32/flash.ico b/plugins/flash/flash_win32/flash.ico new file mode 100644 index 0000000000000000000000000000000000000000..386883523bcc032db77b69b047cbc5c15ae3b7fe GIT binary patch literal 1078 zcmeH_K@!3s3`IZHwe$$AoF2oYaWszOk{jR)NR>_(PRDWOZgV)&%Zp6VccBVa2?uQ&sh9LW;!?J w2dwKn!S@jnH5GJS10MR3&V{nkc?%F^XS#jrb=7ItXV>BJ*yg?&H~)SR4}%AClK=n! literal 0 HcmV?d00001 diff --git a/plugins/flash/flash_win32/flash.rc b/plugins/flash/flash_win32/flash.rc new file mode 100644 index 0000000..c1da62e --- /dev/null +++ b/plugins/flash/flash_win32/flash.rc @@ -0,0 +1,135 @@ +//Microsoft Visual C++ generated resource script. +// + +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE 9, 1 +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. + +IDI_FLASH ICON DISCARDABLE "flash.ICO" +IDI_SMALL ICON DISCARDABLE "SMALL.ICO" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDC_FLASH MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "E&xit", IDM_EXIT + END + POPUP "&Help" + BEGIN + MENUITEM "&About ...", IDM_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDC_FLASH ACCELERATORS MOVEABLE PURE +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 230, 75 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "About" +FONT 8, "System" +BEGIN + ICON IDI_FLASH,IDC_MYICON,14,9,16,16 + LTEXT "flash Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX + LTEXT "Copyright (C) 2006",IDC_STATIC,49,20,119,8 + DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""resource.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDC_FLASH "FLASH" + IDS_APP_TITLE "flash" + IDS_HELLO "Hello World!" +END + +#endif +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/flash/flash_win32/flash.sln b/plugins/flash/flash_win32/flash.sln new file mode 100644 index 0000000..1bc809b --- /dev/null +++ b/plugins/flash/flash_win32/flash.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flash", "flash.vcproj", "{2561D961-FBDC-4DC5-9F47-F9300CC74D03}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2561D961-FBDC-4DC5-9F47-F9300CC74D03}.Debug|Win32.ActiveCfg = Debug|Win32 + {2561D961-FBDC-4DC5-9F47-F9300CC74D03}.Debug|Win32.Build.0 = Debug|Win32 + {2561D961-FBDC-4DC5-9F47-F9300CC74D03}.Release|Win32.ActiveCfg = Release|Win32 + {2561D961-FBDC-4DC5-9F47-F9300CC74D03}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/plugins/flash/flash_win32/flash.vcproj b/plugins/flash/flash_win32/flash.vcproj new file mode 100644 index 0000000..f4f33d5 --- /dev/null +++ b/plugins/flash/flash_win32/flash.vcproj @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/flash/flash_win32/resource.h b/plugins/flash/flash_win32/resource.h new file mode 100644 index 0000000..87afef1 --- /dev/null +++ b/plugins/flash/flash_win32/resource.h @@ -0,0 +1,27 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by FLASH.RC +// +#define IDR_MAINFRAME 128 +#define IDD_FLASH_DIALOG 102 +#define IDD_ABOUTBOX 103 +#define IDS_APP_TITLE 103 +#define IDM_ABOUT 104 +#define IDM_EXIT 105 +#define IDS_HELLO 106 +#define IDI_FLASH 107 +#define IDI_SMALL 108 +#define IDC_FLASH 109 +#define IDC_MYICON 2 +#define IDC_STATIC -1 +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS + +#define _APS_NEXT_RESOURCE_VALUE 129 +#define _APS_NEXT_COMMAND_VALUE 32771 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 110 +#endif +#endif diff --git a/plugins/flash/flash_win32/small.ico b/plugins/flash/flash_win32/small.ico new file mode 100644 index 0000000000000000000000000000000000000000..8f94d9aa8285725af1920f17fa4ba90a7dad97fc GIT binary patch literal 318 zcmbu1u@S&92m|H2^tei$GGj6tBe4N_?3C#ONWzj2Y0z^{b=^ZcTR}S)7&>4n7JrdT ujNG@ttiTl!1hqz0y#czdCNotgVrj}ml}kwpjQ> +#include +#include +#include +#include + +using namespace SIM; + +const unsigned BLINK_TIMEOUT = 500; +const unsigned BLINK_COUNT = 8; + +Plugin *createFloatyPlugin(unsigned base, bool, Buffer*) +{ + FloatyPlugin *plugin = new FloatyPlugin(base); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Floaty"), + I18N_NOOP("Plugin provides floating windows for contacts"), + VERSION, + createFloatyPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +static DataDef floatyUserData[] = + { + { "FloatyPosition", DATA_LONG, 2, DATA((unsigned long)-1>>1)}, // 0x7FFFFFFF - maximum value of sigend long + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +FloatyPlugin::FloatyPlugin(unsigned base) + : Plugin(base) +{ + CmdFloaty = registerType(); + user_data_id = getContacts()->registerUserData(info.title, floatyUserData); + + m_bBlink = false; + unreadTimer = new QTimer(this); + connect(unreadTimer, SIGNAL(timeout()), this, SLOT(unreadBlink())); + + Command cmd; + cmd->id = CmdFloaty; + cmd->text = I18N_NOOP("Floating on"); + cmd->icon = "floating"; + cmd->menu_id = MenuContact; + cmd->menu_grp = 0xB000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); +} + +FloatyPlugin::~FloatyPlugin() +{ + qDeleteAll(m_floaties); + EventCommandRemove(CmdFloaty).process(); + getContacts()->unregisterUserData(user_data_id); +} + +bool FloatyPlugin::processEvent(Event *e) +{ + switch (e->type()){ + case eEventInit:{ + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + SIM::PropertyHubPtr data = contact->getUserData("floaty", false); + if (!data) + continue; + FloatyWnd *wnd = new FloatyWnd(this, contact->id()); + m_floaties.insert(contact->id(), wnd); + ((QWidget*)wnd)->move(data->value("X").toInt(), data->value("Y").toInt()); + wnd->show(); + } + break; + } + case eEventCheckCommandState:{ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->id == CmdFloaty){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("floaty", false); + if (data) + { + cmd->text = I18N_NOOP("Floating off"); + cmd->flags |= COMMAND_CHECKED; + }else{ + cmd->text = I18N_NOOP("Floating on"); + cmd->flags &= ~COMMAND_CHECKED; + } + } + return true; + } + break; + } + case eEventCommandExec:{ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->id == CmdFloaty){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("floaty", false); + if (data) + { + FloatyWnd *wnd = m_floaties.take(contact->id()); + delete wnd; + } + else + { + data = contact->getUserData("floaty", true); + QRect r = QApplication::desktop()->availableGeometry(); + data->setValue("X", r.x()); + data->setValue("Y", r.y()); + FloatyWnd *wnd = new FloatyWnd(this, (unsigned long)(cmd->param)); + m_floaties.insert((unsigned long)(cmd->param), wnd); + ((QWidget*)wnd)->move(r.x(), r.y()); + wnd->show(); + } + } + return true; + } + break; + } + case eEventMessageDeleted: + case eEventMessageRead: + case eEventMessageReceived:{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + FloatyWnd *wnd = m_floaties.value(msg->contact()); + if (wnd){ + wnd->init(); + wnd->repaint(); + } + break; + } + case eEventContactClient: { + EventContactClient *ecc = static_cast(e); + Contact *contact = ecc->contact(); + if(!contact) + break; + FloatyWnd *wnd = m_floaties.value(contact->id()); + if (wnd){ + wnd->init(); + wnd->repaint(); + } + break; + } + case eEventContact: { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + FloatyWnd *wnd = m_floaties.value(contact->id()); + if(!wnd) + break; + switch(ec->action()) { + case EventContact::eDeleted: + delete wnd; + break; + case EventContact::eStatus: + case EventContact::eChanged: + wnd->init(); + wnd->repaint(); + break; + case EventContact::eOnline: + wnd->startBlink(); + break; + default: + break; + } + break; + } + case eEventRepaintView:{ + QHashIterator it(m_floaties); + while(it.hasNext()) + { + FloatyWnd *wnd = it.next().value(); + wnd->init(); + wnd->repaint(); + } + break; + } + default: + break; + } + return false; +} + +void FloatyPlugin::showPopup() +{ + EventMenuProcess eMenu(MenuContact, (void*)popupId); + eMenu.process(); + QMenu *popup = eMenu.menu(); + if(popup) + popup->popup(popupPos); +} + +void FloatyPlugin::startBlink() +{ + if (unreadTimer->isActive()) + return; + m_bBlink = true; + unreadTimer->start(800); +} + +void FloatyPlugin::unreadBlink() +{ + m_bBlink = !m_bBlink; + QHashIterator it(m_floaties); + while(it.hasNext()) + { + FloatyWnd *wnd = it.next().value(); + wnd->repaint(); + } +} + +void FloatyWnd::startBlink() +{ + m_blink = BLINK_COUNT * 2 + 1; + blinkTimer->start(BLINK_TIMEOUT); + repaint(); +} diff --git a/plugins/floaty/floaty.h b/plugins/floaty/floaty.h new file mode 100644 index 0000000..a526535 --- /dev/null +++ b/plugins/floaty/floaty.h @@ -0,0 +1,63 @@ +/*************************************************************************** + floaty.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FLOATY_H +#define _FLOATY_H + +#include +#include +#include + +#include "cfg.h" +#include "event.h" +#include "plugins.h" + +class QTimer; + +struct FloatyUserData +{ + SIM::Data X; + SIM::Data Y; +}; + +class FloatyWnd; +class QTimer; + +class FloatyPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + FloatyPlugin(unsigned); + virtual ~FloatyPlugin(); + bool m_bBlink; + void startBlink(); +protected slots: + void showPopup(); + void unreadBlink(); +protected: + virtual bool processEvent(SIM::Event *e); + unsigned long CmdFloaty; + unsigned long user_data_id; + QPoint popupPos; + QTimer *unreadTimer; + unsigned long popupId; + QHash m_floaties; + friend class FloatyWnd; +}; + +#endif + diff --git a/plugins/floaty/floaty.rc b/plugins/floaty/floaty.rc new file mode 100644 index 0000000..116b990 --- /dev/null +++ b/plugins/floaty/floaty.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Floaty plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "floaty\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "floaty.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/floaty/floaty.vcproj b/plugins/floaty/floaty.vcproj new file mode 100644 index 0000000..d549bc7 --- /dev/null +++ b/plugins/floaty/floaty.vcproj @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/floaty/floatywnd.cpp b/plugins/floaty/floatywnd.cpp new file mode 100644 index 0000000..c040773 --- /dev/null +++ b/plugins/floaty/floatywnd.cpp @@ -0,0 +1,560 @@ +/*************************************************************************** + floatywnd.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" +#include + +#include "floatywnd.h" +#include "floaty.h" +#include "contacts/contact.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef USE_KDE +#include +#endif + +#include "icons.h" +#include "simgui/linklabel.h" +#include "userview.h" +#include "core.h" + +using namespace std; +using namespace SIM; + +namespace { namespace aux { + +static QString +compose_floaty_name( unsigned long id ) +{ + return QString( "floaty-%1" ).arg( id ); +} + +}} + +FloatyWnd::FloatyWnd(FloatyPlugin *plugin, unsigned long id) + : QWidget(NULL, + Qt::Tool + | Qt::WindowStaysOnTopHint + | Qt::CustomizeWindowHint + | Qt::FramelessWindowHint + | Qt::Tool + | Qt::X11BypassWindowManagerHint + ) +{ + setAttribute(Qt::WA_MacAlwaysShowToolWindow); + setAttribute(Qt::WA_AlwaysShowToolTips); + setObjectName(aux::compose_floaty_name( id ) ); + m_plugin = plugin; + m_id = id; + m_blink = 0; + b_ignoreMouseClickRelease=false; + init(); + setAcceptDrops(true); +#ifdef USE_KDE + KWin::setState(winId(), NET::SkipTaskbar | NET::SkipPager); + KWin::setOnAllDesktops(winId(), true); +#endif + moveTimer = new QTimer(this); + connect(moveTimer, SIGNAL(timeout()), this, SLOT(startMove())); + blinkTimer = new QTimer(this); + connect(blinkTimer, SIGNAL(timeout()), this, SLOT(blink())); + setMouseTracking(true); +} + +FloatyWnd::~FloatyWnd() +{ + delete moveTimer; + delete blinkTimer; +} + +void FloatyWnd::init() +{ + m_style = 0; + m_icons.clear(); + m_unread = 0; + Contact *contact = getContacts()->contact(m_id); + if (contact == NULL) + return; + m_text = contact->getName(); + m_status = contact->contactInfo(m_style, m_statusIcon, &m_icons); + unsigned blink = m_blink; + m_blink = 1; + m_blink = blink; + QFontMetrics metr(font()); + QRect br = metr.boundingRect(m_text); + int h = br.height(); + int w = br.width() + 5; + const QPixmap &pict = Pict(m_statusIcon); + w += pict.width() + 2; + if (pict.height() > h) + h = pict.height(); + Q_FOREACH(const QString &icon, m_icons) { + const QPixmap &pict = Pict(icon); + w += pict.width() + 2; + if (pict.height() > h) + h = pict.height(); + } + w += 15; + h += 6; + resize(w, h); + CorePlugin *core = GET_CorePlugin(); + for (list::iterator it = core->unread.begin(); it != core->unread.end(); ++it){ + if (it->contact != m_id) + continue; + m_unread = it->type; + m_plugin->startBlink(); + break; + } +} + +void FloatyWnd::paintEvent(QPaintEvent*) +{ + int w = width() - 4; + int h = height() - 4; + + QPixmap pict(w, h); + QPainter p(&pict); + p.fillRect(QRect(0, 0, width(), height()), palette().brush(QPalette::Base)); + EventPaintView::PaintView pv; + pv.p = &p; + pv.pos = QPoint(2, 2); + pv.size = QSize(w, h); + pv.win = this; + pv.isStatic = false; + pv.height = h; + CorePlugin *core = GET_CorePlugin(); + if (core->value("UseSysColors").toBool()){ + p.setPen(palette().color(QPalette::Text)); + }else{ + p.setPen(QColor(core->value("ColorOnline").toUInt())); + } + EventPaintView e(&pv); + e.process(); + + if (core->value("UseSysColors").toBool()){ + if (m_status != STATUS_ONLINE) + p.setPen(palette().color(QPalette::Disabled, QPalette::Text)); + }else{ + switch (m_status){ + case STATUS_ONLINE: + p.setPen(core->value("ColorOnline").toUInt()); + break; + case STATUS_AWAY: + p.setPen(core->value("ColorAway").toUInt()); + break; + case STATUS_NA: + p.setPen(core->value("ColorNA").toUInt()); + break; + case STATUS_DND: + p.setPen(core->value("ColorDND").toUInt()); + break; + default: + p.setPen(core->value("ColorOffline").toUInt()); + break; + } + } + + int x = 0; + QString statusIcon = m_statusIcon; + if (m_unread && m_plugin->m_bBlink){ + CommandDef *def = core->messageTypes.find(m_unread); + if (def) + statusIcon = def->icon; + } + + if (!statusIcon.isEmpty()){ + const QPixmap &pict = Pict(statusIcon); + x += 2; + p.drawPixmap(x, (h - pict.height()) / 2, pict); + x += pict.width() + 2; + } + QRect br; + setFont(&p); + p.drawText(x, 0, w, h, Qt::AlignLeft | Qt::AlignVCenter, m_text, &br); + x = br.right() + 5; + Q_FOREACH(const QString &icon, m_icons) { + const QPixmap &pict = Pict(icon); + x += 2; + p.drawPixmap(x, (h - pict.height()) / 2, pict); + x += pict.width(); + } + p.end(); + + p.begin(this); + p.drawPixmap(QPoint(2, 2), pict); + + p.setPen(palette().color(QPalette::Dark)); + p.drawLine(1, 1, width() - 2, 1); + p.drawLine(width() - 2, 1, width() - 2, height() - 2); + p.drawLine(width() - 2, height() - 2, 1, height() - 2); + p.drawLine(1, height() - 2, 1, 1); + + p.setPen(palette().color(QPalette::Shadow)); + p.drawLine(0, height() - 1, width() - 1, height() - 1); + p.drawLine(width() - 1, height() - 1, width() - 1, 1); + p.drawLine(width() - 3, 2, 2, 2); + p.drawLine(2, 2, 2, height() - 3); + + p.setPen(palette().color(QPalette::Light)); + p.drawLine(2, height() - 3, width() - 3, height() - 3); + p.drawLine(width() - 3, height() - 3, width() - 3, 2); + p.drawLine(width() - 1, 0, 0, 0); + p.drawLine(0, 0, 0, height() - 1); +} + +void FloatyWnd::setFont(QPainter *p) +{ + QFont f(font()); + CorePlugin *core = GET_CorePlugin(); + if (m_style & CONTACT_ITALIC){ + if (core->value("VisibleStyle").toUInt() & STYLE_ITALIC) + f.setItalic(true); + if (core->value("VisibleStyle").toUInt() & STYLE_UNDER) + f.setUnderline(true); + if (core->value("VisibleStyle").toUInt() & STYLE_STRIKE) + f.setStrikeOut(true); + } + if (m_style & CONTACT_UNDERLINE){ + if (core->value("AuthStyle").toUInt() & STYLE_ITALIC) + f.setItalic(true); + if (core->value("AuthStyle").toUInt() & STYLE_UNDER) + f.setUnderline(true); + if (core->value("AuthStyle").toUInt() & STYLE_STRIKE) + f.setStrikeOut(true); + } + if (m_style & CONTACT_STRIKEOUT){ + if (core->value("InvisibleStyle").toUInt() & STYLE_ITALIC) + f.setItalic(true); + if (core->value("InvisibleStyle").toUInt() & STYLE_UNDER) + f.setUnderline(true); + if (core->value("InvisibleStyle").toUInt() & STYLE_STRIKE) + f.setStrikeOut(true); + } + if (m_blink & 1){ + f.setBold(true); + }else{ + f.setBold(false); + } + p->setFont(f); +} + +void FloatyWnd::mousePressEvent(QMouseEvent *e) +{ + if (e->button() == Qt::LeftButton){ + initMousePos = e->pos(); + moveTimer->start(QApplication::startDragTime()); + } + if (e->button() == Qt::RightButton){ + m_plugin->popupPos = e->globalPos(); + m_plugin->popupId = m_id; + QTimer::singleShot(0, m_plugin, SLOT(showPopup())); + } +} + +void FloatyWnd::mouseReleaseEvent(QMouseEvent *e) +{ + moveTimer->stop(); + + if (!mousePos.isNull()){ + if (!b_ignoreMouseClickRelease) // we reached fetch positich + move(e->globalPos() - mousePos); + releaseMouse(); + Contact *contact = getContacts()->contact(m_id); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("floaty", false); + if(!data.isNull()) + { + data->setValue("X", x()); + data->setValue("Y", y()); + } + } + mousePos = QPoint(); + } + else + { + CorePlugin *core = GET_CorePlugin(); + if ((e->pos() == initMousePos) && !core->value("UseDblClick").toBool()) + { + EventDefaultAction(m_id).process(); + } + } + initMousePos = QPoint(0, 0); +} + +void FloatyWnd::mouseMoveEvent(QMouseEvent *e) +{ + if ((e->buttons() & Qt::LeftButton) && !initMousePos.isNull() && + (QPoint(e->pos() - initMousePos).manhattanLength() > QApplication::startDragDistance())) + startMove(); + if (!mousePos.isNull()) + { + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach(w,list) + { + if (w->inherits("FloatyWnd")) + { + FloatyWnd *refwnd = static_cast(w); + int dist = 4; + move(e->globalPos() - mousePos); + //Top left: + if (this->pos().x() + this->width() - refwnd->pos().x() <= dist && //== x Top left + this->pos().x() + this->width() - refwnd->pos().x() >= 0 && + this->pos().y() + this->height() - refwnd->pos().y() <= dist && + this->pos().y() + this->height() - refwnd->pos().y() >= 0) { + QWidget::move(refwnd->pos().x()-this->width(), //== x Top left + refwnd->pos().y()-this->height()); + b_ignoreMouseClickRelease=true; + cout << "TOP LEFT" << endl; + return; + } + + //Bottom left + if (this->pos().x() + this->width() - refwnd->pos().x() <= dist && + this->pos().x() + this->width() - refwnd->pos().x() >=0 && //== x Top left + this->pos().y() - refwnd->pos().y() - refwnd->height() <= dist && + this->pos().y() - refwnd->pos().y() - refwnd->height() >=0 ) { + QWidget::move(refwnd->pos().x()-this->width(), //== x Top left + refwnd->pos().y()+refwnd->height()); + b_ignoreMouseClickRelease=true; + cout << "BOTTOM LEFT" << endl; + return; + } + + //Top right + if (this->pos().x() + refwnd->width() - this->pos().x() <= dist && + this->pos().y() + this->height() - refwnd->pos().y() <= dist ) {//== y Top left + QWidget::move(refwnd->pos().x()+refwnd->width(), + refwnd->pos().y()-this->height()); //== y Top left + b_ignoreMouseClickRelease=true; + cout << "TOP RIGHT" << endl; + return; + } + + //Bottom right + if (this->pos().x() + refwnd->width() - this->pos().x() <= dist && + this->pos().x() + refwnd->width() - this->pos().x() >=0 && //== x Top right + this->pos().y() - refwnd->pos().y() - refwnd->height() <= dist && + this->pos().y() - refwnd->pos().y() - refwnd->height() >=0 ) { //== y Bottom left + QWidget::move(refwnd->pos().x()+refwnd->width(), //== x Top right + refwnd->pos().y()-refwnd->height()); //== y Bottom left + b_ignoreMouseClickRelease=true; + cout << "BOTTOM LEFT" << endl; + return; + } + //Top + if (this->pos().y()+this->height()-refwnd->pos().y() <= dist ) { + if (this->pos().x() == refwnd->pos().x()) {//add distance + QWidget::move(refwnd->pos().x(), //== x Top right + refwnd->pos().y()-this->height()); //== y Top left + b_ignoreMouseClickRelease=true; + cout << "TOP dock left" << endl; + return; + } + + if (this->pos().x() + this->width() == refwnd->pos().x() + refwnd->width()) {//add distance + QWidget::move(refwnd->pos().x() + refwnd->width() - this->width(), //== x Top right + refwnd->pos().y()-this->height()); //== y Top left + b_ignoreMouseClickRelease=true; + cout << "TOP dock right" << endl; + return; + } + } + + //Bottom + if (refwnd->pos().y()+refwnd->height()-this->pos().y() <= dist ) { + if (this->pos().x() == refwnd->pos().x()) { //add distance + QWidget::move(refwnd->pos().x(), //== x Top right + refwnd->pos().y()+refwnd->height()); //== y Bottem left + b_ignoreMouseClickRelease=true; + cout << "BOTTOM dock left" << endl; + return; + } + + if (this->pos().x() + this->width() == refwnd->pos().x() + refwnd->width()) {//add distance + QWidget::move(refwnd->pos().x() + refwnd->width() - this->width(), //== x Top right + refwnd->pos().y()+refwnd->height()); //== y Bottem left + b_ignoreMouseClickRelease=true; + cout << "BOTTOM dock right" << endl; + return; + } + } + + //Left + if (this->pos().x()+this->width()-refwnd->pos().x() <= dist && + this->pos().x()+this->width()-refwnd->pos().x() >= 0 + ) + if (this->pos().y() - refwnd->pos().y() < dist || + refwnd->pos().y() - this->pos().y() < dist ) { + QWidget::move(refwnd->pos().x() - this->width(), + refwnd->pos().y()); + b_ignoreMouseClickRelease=true; + cout << "LEFT" << endl; + return; + } + + + + //Right + if (refwnd->pos().x()+refwnd->width()-this->pos().x() <= dist && + refwnd->pos().x()+refwnd->width()-this->pos().x() >=0 + ) + if (this->pos().y() - refwnd->pos().y() < dist || + refwnd->pos().y() - this->pos().y() < dist ) { + QWidget::move(refwnd->pos().x() + refwnd->width(), + refwnd->pos().y()); + b_ignoreMouseClickRelease=true; + cout << "RIGHT" << endl; + return; + } + + //this->size(); + this->repaint(); + } + } + } +} + +void FloatyWnd::startMove() +{ + if (initMousePos.isNull()) + return; + moveTimer->stop(); + mousePos = initMousePos; + initMousePos = QPoint(0, 0); + grabMouse(); +} + +void FloatyWnd::move(QPoint point) +{ + QRect r = QApplication::desktop()->availableGeometry(); + QRect wr = frameGeometry(); + if(point.x() < r.x()) + point.setX(r.x()); + if(point.y() < r.y()) + point.setY(r.y()); + if(point.x()+wr.width() > r.x()+r.width()) + point.setX(r.x()+r.width()-wr.width()); + if(point.y()+wr.height() > r.y()+r.height()) + point.setY(r.y()+r.height()-wr.height()); + QWidget::move(point); +} + +void FloatyWnd::blink() +{ + if (m_blink){ + m_blink--; + }else{ + blinkTimer->stop(); + } + repaint(); +} + +void FloatyWnd::mouseDoubleClickEvent(QMouseEvent *) +{ + EventDefaultAction(m_id).process(); +} + +void FloatyWnd::dragEnterEvent(QDragEnterEvent *e) +{ + dragEvent(e, false); +} + +void FloatyWnd::dropEvent(QDropEvent *e) +{ + dragEvent(e, true); +} + +void FloatyWnd::dragEvent(QDropEvent *e, bool isDrop) +{ + Message *msg = NULL; + CommandDef *cmd; + CorePlugin *core = GET_CorePlugin(); + CommandsMapIterator it(core->messageTypes); + while ((cmd = ++it) != NULL){ + MessageDef *def = (MessageDef*)(cmd->param); + if (def && def->drag){ + msg = def->drag(e); + if (msg){ + unsigned type = cmd->id; + Command cmd; + cmd->id = type; + cmd->menu_id = MenuMessage; + cmd->param = (void*)m_id; + if (EventCheckCommandState(cmd).process()) + break; + } + } + } + if (msg){ + e->accept(); + if (isDrop){ + msg->setContact(m_id); + EventOpenMessage(msg).process(); + } + delete msg; + return; + } + if (!e->mimeData()->text().isEmpty()) { + e->accept(); + if (isDrop) { + Message *msg = new Message(MessageGeneric); + msg->setText(e->mimeData()->text()); + msg->setContact(m_id); + EventOpenMessage(msg).process(); + delete msg; + } + return; + } +} + +bool FloatyWnd::event( QEvent *event ) { + if( QEvent::ToolTip == event->type() ) { + do { + QHelpEvent *e = dynamic_cast( event ); + + Contact *contact = getContacts()->contact(m_id); + if (contact == NULL) + break; + + QString tip = contact->tipText(); + QRect tipRect(pos().x(), pos().y(), width(), height()); + QToolTip::showText( mapToGlobal( e->pos() ), tip, this, tipRect ); + + return true; + } while( false ); + + QToolTip::hideText(); + } + + return QWidget::event( event ); +} + +// vim: set expandtab: + diff --git a/plugins/floaty/floatywnd.h b/plugins/floaty/floatywnd.h new file mode 100644 index 0000000..7cacc2c --- /dev/null +++ b/plugins/floaty/floatywnd.h @@ -0,0 +1,77 @@ +/*************************************************************************** + floatywnd.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FLOATYWND_H +#define _FLOATYWND_H + + +#include +#include +#include + +class FloatyPlugin; +class QTimer; +class QPainter; + +#ifdef MAKE_FLOATY_LIB +# define FLOATY_EXPORTS Q_DECL_EXPORT +#else +# define FLOATY_EXPORTS Q_DECL_IMPORT +#endif + +class FLOATY_EXPORTS FloatyWnd : public QWidget +{ + Q_OBJECT +public: + FloatyWnd(FloatyPlugin*, unsigned long id); + ~FloatyWnd(); + unsigned long id() { return m_id; } + void init(); + void startBlink(); +private slots: + void startMove(); + void blink(); +private: + void paintEvent(QPaintEvent*); + void mousePressEvent(QMouseEvent*); + void mouseReleaseEvent(QMouseEvent*); + void mouseMoveEvent(QMouseEvent*); + void mouseDoubleClickEvent(QMouseEvent*); + void dragEnterEvent(QDragEnterEvent*); + void dropEvent(QDropEvent*); + void dragEvent(QDropEvent *e, bool isDrop); + void setFont(QPainter *p); + void move(QPoint point); + virtual bool event( QEvent *event ); + QPoint mousePos; + QPoint initMousePos; + QString m_text; + QSet m_icons; + QString m_statusIcon; + unsigned long m_id; + unsigned m_style; + unsigned m_unread; + unsigned m_blink; + unsigned long m_status; + bool b_ignoreMouseClickRelease; + QTimer *blinkTimer; + QTimer *moveTimer; + FloatyPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/forward/CMakeLists.txt b/plugins/forward/CMakeLists.txt new file mode 100644 index 0000000..78f1c3a --- /dev/null +++ b/plugins/forward/CMakeLists.txt @@ -0,0 +1,28 @@ +################### +# forward library # +################### +IF(BUILD_DROPPED) +SET(forward_SRCS + forward.cpp + forwardcfg.cpp +) + +SET(forward_HDRS + forward.h + forwardcfg.h +) + +SET(forward_UICS + forwardcfgbase.ui +) + +SET(forward_LIBS + _core +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(forward) +ENDIF(BUILD_DROPPED) + diff --git a/plugins/forward/forward.cpp b/plugins/forward/forward.cpp new file mode 100644 index 0000000..c22335f --- /dev/null +++ b/plugins/forward/forward.cpp @@ -0,0 +1,208 @@ +/*************************************************************************** + forward.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "forward.h" +#include "forwardcfg.h" +#include "core.h" + +#include "profile.h" +#include "profilemanager.h" + +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/group.h" +#include "contacts/client.h" + +using namespace SIM; + +Plugin *createForwardPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new ForwardPlugin(base); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Forward"), + I18N_NOOP("Plugin provides messages forwarding on cellular"), + VERSION, + createForwardPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +static DataDef forwardUserData[] = + { + { "Phone", DATA_UTF, 1, 0 }, + { "Send1st", DATA_BOOL, 1, 0 }, + { "Translit", DATA_BOOL, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +static ForwardPlugin *forwardPlugin = NULL; + +static QWidget *getForwardSetup(QWidget *parent, PropertyHubPtr data) +{ + return new ForwardConfig(parent, data, forwardPlugin); +} + +ForwardPlugin::ForwardPlugin(unsigned base) + : QObject(), Plugin(base) + , EventReceiver(DefaultPriority - 1) +{ + m_propertyHub = SIM::PropertyHub::create("forward"); + forwardPlugin = this; + user_data_id = getContacts()->registerUserData(info.title, forwardUserData); + Command cmd; + cmd->id = user_data_id; + cmd->text = I18N_NOOP("&Forward"); + cmd->icon = "cell"; + cmd->param = (void*)getForwardSetup; + EventAddPreferences(cmd).process(); +} + +ForwardPlugin::~ForwardPlugin() +{ + EventRemovePreferences(user_data_id).process(); + getContacts()->unregisterUserData(user_data_id); +} + +bool ForwardPlugin::processEvent(Event *e) +{ + if (e->type() == eEventMessageReceived){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->type() == MessageStatus) + return false; + QString text = msg->getPlainText(); + if (text.isEmpty()) + return false; + if (msg->type() == MessageSMS){ + SMSMessage *sms = static_cast(msg); + QString phone = sms->getPhone(); + bool bMyPhone; + SIM::PropertyHubPtr data = getContacts()->getUserData("forward"); + bMyPhone = ContactList::cmpPhone(phone, data->value("Phone").toString()); + if (!bMyPhone){ + Group *grp; + ContactList::GroupIterator it; + while ((grp = ++it) != NULL){ + data = grp->getUserData("forward", false); + if (data && !data->value("Phone").toString().isEmpty()){ + bMyPhone = ContactList::cmpPhone(phone, data->value("Phone").toString()); + break; + } + } + } + if (!bMyPhone){ + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + data = contact->getUserData("forward", false); + if (data && !data->value("Phone").toString().isEmpty()) + { + bMyPhone = ContactList::cmpPhone(phone, data->value("Phone").toString()); + break; + } + } + } + if (bMyPhone){ + int n = text.indexOf(": "); + if (n > 0){ + QString name = text.left(n); + QString msg_text = text.mid(n + 2); + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + if (contact->getName() == name){ + Message *msg = new Message(MessageGeneric); + msg->setContact(contact->id()); + msg->setText(msg_text); + void *data; + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL){ + if (it.client()->send(msg, data)) + break; + } + if (data == NULL) + delete msg; + return true; + } + } + } + } + } + Contact *contact = getContacts()->contact(msg->contact()); + if (contact == NULL) + return false; + SIM::PropertyHubPtr data = contact->getUserData("forward"); + if (!data || data->value("Key").toString().isEmpty()) + return false; + CorePlugin *core = GET_CorePlugin(); + unsigned status = core->getManualStatus(); + if ((status == STATUS_AWAY) || (status == STATUS_NA)){ + text = contact->getName() + ": " + text; + unsigned flags = MESSAGE_NOHISTORY; + if (data->value("Send1st").toBool()) + flags |= MESSAGE_1ST_PART; + if (data->value("Translit").toBool()) + flags |= MESSAGE_TRANSLIT; + SMSMessage *m = new SMSMessage; + m->setPhone(data->value("Phone").toString()); + m->setText(text); + m->setFlags(flags); + unsigned i; + for (i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (client->send(m, NULL)) + break; + } + if (i >= getContacts()->nClients()) + delete m; + } + } + return false; +} + +QWidget *ForwardPlugin::createConfigWindow(QWidget *parent) +{ + return new ForwardConfig(parent, getContacts()->getUserData("forward"), this); +} + +void ForwardPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr ForwardPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant ForwardPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void ForwardPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} \ No newline at end of file diff --git a/plugins/forward/forward.h b/plugins/forward/forward.h new file mode 100644 index 0000000..1d0e48a --- /dev/null +++ b/plugins/forward/forward.h @@ -0,0 +1,52 @@ +/*************************************************************************** + forward.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FORWARD_H +#define _FORWARD_H + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" + +struct ForwardUserData +{ + SIM::Data Phone; + SIM::Data Send1st; + SIM::Data Translit; +}; + +class ForwardPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ +public: + ForwardPlugin(unsigned); + virtual ~ForwardPlugin(); + unsigned long user_data_id; + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +protected: + virtual QWidget *createConfigWindow(QWidget *parent); + virtual bool processEvent(SIM::Event *e); +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/forward/forward.rc b/plugins/forward/forward.rc new file mode 100644 index 0000000..9fc3ece --- /dev/null +++ b/plugins/forward/forward.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Forward plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "forward\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "forward.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/forward/forward.vcproj b/plugins/forward/forward.vcproj new file mode 100644 index 0000000..3425483 --- /dev/null +++ b/plugins/forward/forward.vcproj @@ -0,0 +1,369 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/forward/forwardcfg.cpp b/plugins/forward/forwardcfg.cpp new file mode 100644 index 0000000..60dfa44 --- /dev/null +++ b/plugins/forward/forwardcfg.cpp @@ -0,0 +1,62 @@ +/*************************************************************************** + forwardcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include + +#include "contacts/contact.h" +#include "misc.h" + +#include "forwardcfg.h" +#include "forward.h" + +using namespace SIM; + +ForwardConfig::ForwardConfig(QWidget *parent, PropertyHubPtr data, ForwardPlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; + //PropertyHubPtr data = (ForwardUserData*)_data; + chkFirst-> setChecked(data->value("Send1st") .toBool()); + chkTranslit->setChecked(data->value("Translit") .toBool()); + cmbPhone->setEditable(true); + QString phones = getContacts()->owner()->getPhones(); + while (!phones.isEmpty()) + { + QString item = getToken(phones, ';', false); + QString number = getToken(item, ','); + getToken(item, ','); + if (item.toULong() == CELLULAR) + cmbPhone->insertItem(INT_MAX,number); + } + cmbPhone->lineEdit()->setText(data->value("Phone").toString()); +} + +void ForwardConfig::apply(PropertyHubPtr data) +{ + //ForwardUserData *data = (ForwardUserData*)_data; + data->setValue("Send1st", chkFirst->isChecked() ); + data->setValue("Translit", chkTranslit->isChecked() ); + data->setValue("Phone", cmbPhone->lineEdit()->text()); +} + +void ForwardConfig::apply() +{ + apply(getContacts()->getUserData("forward")); +} + diff --git a/plugins/forward/forwardcfg.h b/plugins/forward/forwardcfg.h new file mode 100644 index 0000000..68e1b8b --- /dev/null +++ b/plugins/forward/forwardcfg.h @@ -0,0 +1,40 @@ +/*************************************************************************** + forwardcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FORWARDCFG_H +#define _FORWARDCFG_H + +#include "ui_forwardcfgbase.h" +#include "propertyhub.h" + +using namespace SIM; +class ForwardPlugin; + +class ForwardConfig : public QWidget, public Ui::ForwardConfigBase +{ + Q_OBJECT +public: + ForwardConfig(QWidget *parent, PropertyHubPtr data, ForwardPlugin *plugin); +public slots: + void apply(PropertyHubPtr data); + void apply(); +protected: + ForwardPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/forward/forwardcfgbase.ui b/plugins/forward/forwardcfgbase.ui new file mode 100644 index 0000000..9b9eb0d --- /dev/null +++ b/plugins/forward/forwardcfgbase.ui @@ -0,0 +1,112 @@ + + + + + ForwardConfigBase + + + + 0 + 0 + 352 + 215 + + + + Form1 + + + + 11 + + + 6 + + + + + Send all messages in status "Away" and "N/A" on the cellular: + + + Qt::AlignVCenter|Qt::AlignLeft + + + true + + + + + + + + + + For the answer or sending of the new message you can answer on SMS having specified in the beginning of the message a line: +<UIN>: + + + Qt::AlignVCenter|Qt::AlignLeft + + + true + + + + + + + Send only &one message (don't split) + + + + + + + Send in &translit + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/gpg/CMakeLists.txt b/plugins/gpg/CMakeLists.txt new file mode 100644 index 0000000..bf059e8 --- /dev/null +++ b/plugins/gpg/CMakeLists.txt @@ -0,0 +1,41 @@ +############### +# gpg library # +############### +IF(BUILD_DROPPED) +IF(WIN32) + SET (gpg_SRCS gpgfind.cpp) + SET (gpg_HDRS gpgfind.h) + SET (gpg_UICS gpgfindbase.ui) +ENDIF(WIN32) + +SET(gpg_SRCS + gpg.cpp + gpgadv.cpp + gpgcfg.cpp + gpggen.cpp + gpguser.cpp + passphrase.cpp + ${gpg_SRCS} +) + +SET(gpg_HDRS + gpg.h + gpgadv.h + gpgcfg.h + gpggen.h + gpguser.h + passphrase.h + ${gpg_HDRS} +) + +SET(gpg_UICS + gpgadvbase.ui + gpgcfgbase.ui + gpggenbase.ui + gpguserbase.ui + passphrasebase.ui + ${gpg_UICS} +) + +SIM_ADD_PLUGIN(gpg) +ENDIF(BUILD_DROPPED) diff --git a/plugins/gpg/configure.in.in b/plugins/gpg/configure.in.in new file mode 100644 index 0000000..466093d --- /dev/null +++ b/plugins/gpg/configure.in.in @@ -0,0 +1,5 @@ +if test "$kde_use_qt_win" = "yes"; then + GPG_OBJ=gpgfind.lo + AC_SUBST([GPG_OBJ]) +fi + diff --git a/plugins/gpg/gpg.cpp b/plugins/gpg/gpg.cpp new file mode 100644 index 0000000..10e092d --- /dev/null +++ b/plugins/gpg/gpg.cpp @@ -0,0 +1,998 @@ +/*************************************************************************** + gpg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "log.h" +#include "msgedit.h" +#include "userwnd.h" +#include "passphrase.h" + +#include "simgui/textshow.h" +#include "simgui/ballonmsg.h" +#include "contacts/contact.h" +#include "contacts/client.h" + +#include "profile.h" +#include "profilemanager.h" + +#include "gpg.h" +#include "gpgcfg.h" +#include "gpguser.h" + +#include +#include +#include +#include +#include +#include //for Linux: qApp->processEvents(); +#include +#include + +#ifdef HAVE_SYS_STAT_H +#include +#endif + +using namespace SIM; + +#ifndef WIN32 +static QString GPGpath; +#endif + +Plugin *createGpgPlugin(unsigned base, bool, Buffer *cfg) +{ +#ifndef WIN32 + if (GPGpath.isEmpty()) + return NULL; +#endif + Plugin *plugin = new GpgPlugin(base, cfg); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("GPG"), + I18N_NOOP("Plugin adds GnuPG encryption/decryption support for messages"), + VERSION, + createGpgPlugin, PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ +#ifndef WIN32 + QString path; + const char *p = getenv("PATH"); + if (p) + path = QFile::decodeName(p); + while (!path.isEmpty()){ + QString p = getToken(path, ':'); + p += "/gpg"; + QFile f(p); + QFileInfo fi(f); + if (fi.isExecutable()){ + GPGpath = p; + break; + } + } + if (GPGpath.isEmpty()) + info.description = I18N_NOOP("Plugin adds GnuPG encryption/decryption support for messages\n" + "GPG not found in PATH"); +#endif + return &info; +} + +static DataDef gpgUserData[] = + { + { "Key", DATA_STRING, 1, 0 }, + { "Use", DATA_BOOL, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +GpgPlugin *GpgPlugin::plugin = NULL; + +GpgPlugin::GpgPlugin(unsigned base, Buffer *cfg) + : QObject(), Plugin(base) + , EventReceiver(HighestPriority - 0x100) //??? Fixmee!! + , m_bMessage(false) + , m_passphraseDlg(NULL) +{ + m_propertyHub = SIM::PropertyHub::create("gpg"); + user_data_id = getContacts()->registerUserData(info.title, gpgUserData); + reset(); + plugin = this; +} + +GpgPlugin::~GpgPlugin() +{ + delete m_passphraseDlg; + unregisterMessage(); + QList::ConstIterator it; + for (it = m_decrypt.constBegin(); it != m_decrypt.constEnd(); ++it){ + delete it->msg; + delete it->process; + } + for (it = m_import.constBegin(); it != m_import.constEnd(); ++it){ + delete it->msg; + delete it->process; + } + for (it = m_public.constBegin(); it != m_public.constEnd(); ++it) + delete it->process; + for (it = m_wait.constBegin(); it != m_wait.constEnd(); ++it) + delete it->msg; + getContacts()->unregisterUserData(user_data_id); +} + +QString GpgPlugin::GPG() +{ +#ifdef WIN32 + return value("GPG").toString(); +#else + return GPGpath; +#endif +} + +void GpgPlugin::clear() +{ + QList::iterator it; + for (it = m_decrypt.begin(); it != m_decrypt.end();){ + if (it->msg){ + ++it; + continue; + } + delete it->process; + QFile::remove(it->infile); + QFile::remove(it->outfile); + m_decrypt.erase(it); + it = m_decrypt.begin(); + } + for (it = m_import.begin(); it != m_import.end(); ){ + if (it->msg){ + ++it; + continue; + } + delete it->process; + QFile::remove(it->infile); + QFile::remove(it->outfile); + m_import.erase(it); + it = m_import.begin(); + } + for (it = m_public.begin(); it != m_public.end(); ){ + if (it->contact){ + ++it; + continue; + } + delete it->process; + QFile::remove(it->infile); + QFile::remove(it->outfile); + m_public.erase(it); + it = m_public.begin(); + } +} + +void GpgPlugin::decryptReady() +{ + int res = 0; + for (QList::iterator it = m_decrypt.begin(); it != m_decrypt.end(); ++it){ + QProcess *p = it->process; + if (p && p->state() != QProcess::Running && it->msg){ + Message *msg = it->msg; + it->msg = NULL; + QTimer::singleShot(0, this, SLOT(clear())); + if (p->exitStatus() == QProcess::NormalExit && p->exitCode() == 0){ + QString s = it->outfile; + QFile f(s); + if (f.open(QIODevice::ReadOnly)){ + QByteArray ba = f.readAll(); + msg->setText(QString::fromUtf8(ba.data(), ba.size())); + msg->setFlags(msg->getFlags() | MESSAGE_SECURE); + }else{ + log(L_WARN, "Can't open output decrypt file %s", qPrintable(s)); + res = -1; + } + if (!it->key.isEmpty()){ + unsigned i = 1; + for (i = 1; i <= value("NPassphrases").toUInt(); i++){ + if (it->key == value("Keys").toStringList()[i]) + break; + } + if (i > value("NPassphrases").toUInt()){ + setValue("NPassphrases", i); + QStringList l = value("Keys").toStringList(); + l[i] = it->key; + setValue("Keys", l); + } + + QStringList list = value("Passphrases").toStringList(); + list[i] = it->passphrase; + setValue("Passphrases", list); + for (;;){ + QList::iterator itw; + bool bDecode = false; + for (itw = m_wait.begin(); itw != m_wait.end(); ++itw){ + if (itw->key == it->key){ + decode(itw->msg, it->passphrase, it->key); + m_wait.erase(itw); + bDecode = true; + break; + } + } + if (!bDecode) + break; + } + if (m_passphraseDlg && (it->key == m_passphraseDlg->m_key)){ + delete m_passphraseDlg; + m_passphraseDlg = NULL; + askPassphrase(); + } + } + }else{ + QString key; + QString passphrase; + p->setReadChannel(QProcess::StandardError); + QByteArray ba = p->readAll(); + QString str = QString::fromUtf8(ba.data(), ba.size()); + while(!str.isEmpty()) { + key = getToken(str, '\n'); + if (key.contains("BAD_PASSPHRASE")){ + int n = key.indexOf("BAD_PASSPHRASE "); + if(n < 0) + break; + key = key.mid(n + strlen("BAD_PASSPHRASE ")); + if (m_passphraseDlg && (it->key == m_passphraseDlg->m_key)){ + DecryptMsg m; + m.msg = msg; + m.key = key; + m_wait.push_back(m); + m_passphraseDlg->error(); + return; + } + if (it->passphrase.isEmpty()){ + for (unsigned i = 1; i <= value("NPassphrases").toUInt(); i++){ + if (key == value("Keys").toStringList()[i]){ + passphrase = value("Passphrases").toStringList()[i]; + break; + } + } + } + if (it->passphrase.isEmpty() && !passphrase.isEmpty()){ + if (decode(msg, passphrase, key)) + return; + }else{ + DecryptMsg m; + m.msg = msg; + m.key = key; + m_wait.push_back(m); + it->msg = NULL; + QTimer::singleShot(0, this, SLOT(clear())); + askPassphrase(); + return; + } + } + } + if (m_passphraseDlg && (it->key == m_passphraseDlg->m_key)){ + delete m_passphraseDlg; + m_passphraseDlg = NULL; + askPassphrase(); + } else { + msg->setText(key + '\n' + str); + } + } + EventMessageReceived e(msg); + if ((res == 0) && processEvent(&e)) + return; + if (!e.process(this)) + delete msg; + return; + } + } + log(L_WARN, "No decrypt exec"); +} + +void GpgPlugin::importReady() +{ + for (QList::iterator it = m_import.begin(); it != m_import.end(); ++it){ + QProcess *p = it->process; + if (p && p->state() != QProcess::Running){ + Message *msg = new Message(MessageGPGKey); + msg->setContact(it->msg->contact()); + msg->setClient(it->msg->client()); + msg->setFlags(it->msg->getFlags()); + + p->setReadChannel(QProcess::StandardError); + QByteArray ba = p->readAll(); + QString err = QString::fromLocal8Bit(ba.data(), ba.size()); + if (p->exitStatus() == QProcess::NormalExit && p->exitCode() == 0){ + QRegExp r1("[0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]:"); + QRegExp r2("\".*\""); + int len; + int pos = r1.indexIn(err, 0); + len = r1.matchedLength(); + if (pos >= 0) + { + QString key_name; + key_name = err.mid(pos + 1, len - 2); + QString text = key_name; + text += ' '; + pos = r2.indexIn(err, 0); + len = r2.matchedLength(); + text += err.mid(pos + 1, len - 2); + msg->setText(text); + delete it->msg; + it->msg = msg; + + QString home = GpgPlugin::plugin->getHomeDir(); + + QStringList sl; + sl += GPG(); + sl += "--no-tty"; + sl += "--homedir"; + sl += home; + sl += value("PublicList").toString().split(' '); + + QProcess *proc = new QProcess(this); + + DecryptMsg dm; + dm.process = proc; + dm.contact = msg->contact(); + dm.outfile = key_name; + m_public.push_back(dm); + connect(dm.process, SIGNAL(processExited()), this, SLOT(publicReady())); + dm.process->start(sl.join(" ")); + } else { + QString str; + if(!err.isEmpty()) + str = '(' + err + ')'; + msg->setText(i18n("Importing public key failed") + str); + } + } else { + QString str; + if(!err.isEmpty()) + str = '(' + err + ')'; + msg->setText(i18n("Importing public key failed") + str); + } + EventMessageReceived e(it->msg); + if (!e.process(this)) + delete it->msg; + it->msg = NULL; + QTimer::singleShot(0, this, SLOT(clear())); + return; + } + } + log(L_WARN, "No decrypt exec"); +} + +QByteArray GpgPlugin::getConfig() +{ + /* + QStringList keys; + QStringList passphrases; + for (unsigned i = 1; i <= getnPassphrases(); i++){ + keys.append(getKeys(i)); + passphrases.append(getPassphrases(i)); + } + if (!getSavePassphrase()){ + clearKeys(); + clearPassphrases(); + } + QByteArray res = save_data(gpgData, &data); + for (unsigned i = 0; i < getnPassphrases(); i++){ + setKeys(i + 1, keys[i]); + setPassphrases(i + 1, passphrases[i]); + } + */ + return QByteArray(); +} + +bool GpgPlugin::processEvent(Event *e) +{ + switch (e->type()){ + case eEventCheckCommandState:{ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->menu_id == MenuMessage){ + if (cmd->id == MessageGPGKey){ + cmd->flags &= ~COMMAND_CHECKED; + CommandDef c = *cmd; + c.id = MessageGeneric; + return EventCheckCommandState(&c).process(); + } + if (cmd->id == MessageGPGUse){ + cmd->flags &= ~COMMAND_CHECKED; + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + SIM::PropertyHubPtr data = contact->getUserData("gpg", false); + if (!data || data->value("Key").toString().isEmpty()) + return false; + if (data->value("Use").toBool()) + cmd->flags |= COMMAND_CHECKED; + return true; + } + } + return false; + } + case eEventCommandExec:{ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->menu_id == MenuMessage) && (cmd->id == MessageGPGUse)){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + SIM::PropertyHubPtr data = contact->getUserData("gpg", false); + if (data && !data->value("Key").toString().isEmpty()) + data->setValue("Use", (cmd->flags & COMMAND_CHECKED) != 0); + return true; + } + return false; + } + case eEventCheckSend:{ + EventCheckSend *ecs = static_cast(e); + if ((ecs->id() == MessageGPGKey) && ecs->client()->canSend(MessageGeneric, ecs->data())) + return true; + return false; + } + case eEventMessageSent:{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + for (QList::iterator it = m_sendKeys.begin(); it != m_sendKeys.end(); ++it){ + if (it->msg == msg){ + if (msg->getError().isEmpty()){ + Message m(MessageGPGKey); + m.setText(it->key); + m.setClient(msg->client()); + m.setContact(msg->contact()); + EventSent(&m).process(); + } + m_sendKeys.erase(it); + break; + } + } + return false; + } + case eEventMessageSend:{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->type() == MessageGeneric){ + Contact *contact = getContacts()->contact(msg->contact()); + if (contact){ + SIM::PropertyHubPtr data = contact->getUserData("gpg", false); + if (data && !data->value("Key").toString().isEmpty() && data->value("Use").toBool()){ + msg->setFlags(msg->getFlags() | MESSAGE_SECURE); + if (msg->getFlags() & MESSAGE_RICHTEXT){ + QString text = msg->getPlainText(); + msg->setText(text); + msg->setFlags(msg->getFlags() & ~MESSAGE_RICHTEXT); + } + } + } + } + return false; + } + case eEventSend:{ + EventSend *es = static_cast(e); + if ((es->msg()->type() == MessageGeneric) && + (es->msg()->getFlags() & MESSAGE_SECURE)){ + Contact *contact = getContacts()->contact(es->msg()->contact()); + if (contact) + { + SIM::PropertyHubPtr data = contact->getUserData("gpg", false); + if (data && !data->value("Key").toString().isEmpty() && data->value("Use").toBool()){ + QString output = user_file("m."); + output += QString::number((unsigned long)es->msg()); + QString input = output + ".in"; + QFile in(input); + if (!in.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + log(L_WARN, "Can't create %s", qPrintable(input)); + return false; + } + in.write(es->localeText()); + in.close(); + QString home = GpgPlugin::plugin->getHomeDir(); + + QStringList sl; + sl += GPG(); + sl += "--no-tty"; + sl += "--homedir"; + sl += home; + sl += value("Encrypt").toString().split(' '); + sl = sl.replaceInStrings(QRegExp("\\%plainfile\\%"), input); + sl = sl.replaceInStrings(QRegExp("\\%cipherfile\\%"), output); + sl = sl.replaceInStrings(QRegExp("\\%userid\\%"), data->value("Key").toString()); + + QProcess proc(this); + + proc.start(sl.join(" ")); + + // FIXME: not soo good... + while(proc.state() == QProcess::Running) + qApp->processEvents(); + + if (proc.exitStatus() != QProcess::NormalExit || proc.exitCode() != 0){ + es->msg()->setError(I18N_NOOP("Encrypt failed")); + QFile::remove(input); + QFile::remove(output); + return true; + } + QFile::remove(input); + QFile out(output); + if (!out.open(QIODevice::ReadOnly)){ + QFile::remove(output); + es->msg()->setError(I18N_NOOP("Encrypt failed")); + return true; + } + es->setLocaleText(QByteArray(out.readAll())); + out.close(); + QFile::remove(output); + return false; + } + } + } + return false; + } + case eEventMessageReceived:{ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if(!msg) + return false; + if ((msg->baseType() == MessageGeneric) && m_bMessage){ + QString text = msg->getPlainText(); + const char SIGN_MSG[] = "-----BEGIN PGP MESSAGE-----"; + const char SIGN_KEY[] = "-----BEGIN PGP PUBLIC KEY BLOCK-----"; + if (text.startsWith(SIGN_MSG)){ + if (decode(msg, "", "")) + return true; + return false; + } + if (text.startsWith(SIGN_KEY)){ + QString input = user_file("m."); + input += QString::number((unsigned long)msg); + input += ".in"; + QFile in(input); + if (!in.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + log(L_WARN, "Can't create %s", qPrintable(input)); + return false; + } + QByteArray cstr = text.toUtf8(); + in.write(cstr); + in.close(); + QString home = GpgPlugin::plugin->getHomeDir(); + + QStringList sl; + sl += GPG(); + sl += "--no-tty"; + sl += "--homedir"; + sl += home; + sl += value("Import").toString().split(' '); + sl = sl.replaceInStrings(QRegExp("\\%keyfile\\%"), input); + + QProcess *proc = new QProcess(this); + + DecryptMsg dm; + dm.process = proc; + dm.msg = msg; + dm.infile = input; + m_import.push_back(dm); + connect(dm.process, SIGNAL(processExited()), this, SLOT(importReady())); + dm.process->start(sl.join(" ")); + dm.process->write("\n"); + return msg; + } + } + return false; + } + case eEventPluginLoadConfig: + { + setPropertyHub(ProfileManager::instance()->getPropertyHub("gpg")); + // Defaults: + if(!value("Home").isValid()) + setValue("Home", "keys/"); + if(!value("GenKey").isValid()) + setValue("GenKey", "--gen-key --batch"); + if(!value("PublicList").isValid()) + setValue("PublicList", "--with-colon --list-public-keys"); + if(!value("SecretList").isValid()) + setValue("SecretList", "--with-colon --list-secret-keys"); + if(!value("Import").isValid()) + setValue("Import", "--import %keyfile%"); + if(!value("Export").isValid()) + setValue("Export", "--batch --yes --armor --comment \"\" --no-version --export %userid%"); + if(!value("Encrypt").isValid()) + setValue("Encrypt", "--charset utf8 --batch --yes --armor --comment \"\" --no-version --recipient %userid% --trusted-key %userid% --output %cipherfile% --encrypt %plainfile%"); + if(!value("Decrypt").isValid()) + setValue("Decrypt", "--charset utf8 --yes --passphrase-fd 0 --status-fd 2 --output %plainfile% --decrypt %cipherfile%"); + break; + } + default: + break; + } + return false; +} + +static unsigned decode_index = 0; + +bool GpgPlugin::decode(Message *msg, const QString &aPassphrase, const QString &key) +{ + QString output = user_file("md."); + output += QString::number(decode_index++); + QString input = output + ".in"; + QFile in(input); + if (!in.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + log(L_WARN, "Can't create %s", qPrintable(input)); + return false; + } + QByteArray cstr = msg->getPlainText().toUtf8(); + in.write(cstr); + in.close(); + QString home = GpgPlugin::plugin->getHomeDir(); + + QStringList sl; + sl += GPG(); + sl += "--no-tty"; + sl += "--homedir"; + sl += home; + sl += value("Decrypt").toString().split(' '); + sl = sl.replaceInStrings(QRegExp("\\%plainfile\\%"), output); + sl = sl.replaceInStrings(QRegExp("\\%cipherfile\\%"), input); + + QProcess *proc = new QProcess(this); + + DecryptMsg dm; + dm.process = proc; + dm.msg = msg; + dm.infile = input; + dm.outfile = output; + dm.passphrase = aPassphrase; + dm.key = key; + m_decrypt.push_back(dm); + + connect(dm.process, SIGNAL(processExited()), this, SLOT(decryptReady())); + dm.process->start(sl.join(" ")); + dm.process->write(aPassphrase.toUtf8().data()); + return true; +} + +void GpgPlugin::publicReady() +{ + for (QList::iterator it = m_public.begin(); it != m_public.end(); ++it){ + QProcess *p = it->process; + if (p && p->state() != QProcess::Running){ + if (p->exitStatus() == QProcess::NormalExit && p->exitCode() == 0){ + p->setReadChannel(QProcess::StandardError); + QByteArray str(p->readAll()); + for (;;){ + QByteArray line; + line = getToken(str, '\n'); + if(line.isEmpty()) + break; + QByteArray type = getToken(line, ':'); + if (type == "pub"){ + getToken(line, ':'); + getToken(line, ':'); + getToken(line, ':'); + QString sign = getToken(line, ':'); + QString name = it->outfile; + int pos = sign.length() - name.length(); + if (pos < 0) + pos = 0; + if (sign.mid(pos) == name.toLatin1()){ + Contact *contact = getContacts()->contact(it->contact); + if (contact) + { + SIM::PropertyHubPtr data = contact->getUserData("gpg", true); + data->setValue("Key", sign); + } + break; + } + } + } + } + it->contact = 0; + break; + } + } +} + +void GpgPlugin::passphraseApply(const QString &passphrase) +{ + for (QList::iterator it = m_wait.begin(); it != m_wait.end(); ++it){ + if (it->key == m_passphraseDlg->m_key){ + Message *msg = it->msg; + m_wait.erase(it); + decode(msg, passphrase, m_passphraseDlg->m_key); + return; + } + } + delete m_passphraseDlg; + m_passphraseDlg = NULL; + askPassphrase(); +} + +QWidget *GpgPlugin::createConfigWindow(QWidget *parent) +{ + return new GpgCfg(parent, this); +} + +void GpgPlugin::reset() +{ + if (!GPG().isEmpty() && !value("Home").toString().isEmpty() && !value("Key").toString().isEmpty()){ +#ifdef HAVE_CHMOD + chmod(QFile::encodeName(user_file(value("Home").toString())), 0700); +#endif + registerMessage(); + }else{ + unregisterMessage(); + } +} + +QString GpgPlugin::getHomeDir() +{ + QString home = user_file(value("Home").toString()); + if (home.endsWith("\\") || home.endsWith("/")) + home = home.left(home.length() - 1); + return home; +} + +#if 0 +i18n("%n GPG key", "%n GPG keys", 1); +#endif + +static Message *createGPGKey(Buffer *cfg) +{ + return new Message(MessageGPGKey, cfg); +} + +static QObject *generateGPGKey(MsgEdit *p, Message *msg) +{ + return new MsgGPGKey(p, msg); +} + +static MessageDef defGPGKey = + { + NULL, + NULL, + MESSAGE_INFO | MESSAGE_SYSTEM, + "%n GPG key", + "%n GPG keys", + createGPGKey, + generateGPGKey, + NULL + }; + +static MessageDef defGPGUse = + { + NULL, + NULL, + MESSAGE_SILENT, + NULL, + NULL, + NULL, + NULL, + NULL + }; + +static QWidget *getGpgSetup(QWidget *parent, void *data) +{ + return new GpgUser(parent, (GpgUserData*)data); +} + +void GpgPlugin::registerMessage() +{ + if (m_bMessage) + return; + m_bMessage = true; + Command cmd; + cmd->id = MessageGPGKey; + cmd->text = I18N_NOOP("GPG key"); + cmd->icon = "encrypted"; + cmd->param = &defGPGKey; + cmd->menu_grp = 0x4081; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageGPGUse; + cmd->text = I18N_NOOP("Use GPG encryption"); + cmd->icon = QString::null; + cmd->param = &defGPGUse; + cmd->menu_grp = 0x4080; + EventCreateMessageType(cmd).process(); + + cmd->id = user_data_id; + cmd->text = I18N_NOOP("&GPG key"); + cmd->icon = "encrypted"; + cmd->param = (void*)getGpgSetup; + EventAddPreferences(cmd).process(); +} + +void GpgPlugin::unregisterMessage() +{ + if (!m_bMessage) + return; + m_bMessage = false; + EventRemoveMessageType(MessageGPGKey).process(); + EventRemoveMessageType(MessageGPGUse).process(); + EventRemovePreferences(user_data_id).process(); +} + +void GpgPlugin::askPassphrase() +{ + if (m_passphraseDlg || m_wait.empty()) + return; + m_passphraseDlg = new PassphraseDlg(this, m_wait.front().key); + connect(m_passphraseDlg, SIGNAL(finished()), this, SLOT(passphraseFinished())); + connect(m_passphraseDlg, SIGNAL(apply(const QString&)), this, SLOT(passphraseApply(const QString&))); + raiseWindow(m_passphraseDlg); +} + +void GpgPlugin::passphraseFinished() +{ + if (m_passphraseDlg){ + for (QList::iterator it = m_wait.begin(); it != m_wait.end();){ + if (it->key != m_passphraseDlg->m_key){ + ++it; + continue; + } + EventMessageReceived e(it->msg); + if (!e.process(this)) + delete it->msg; + m_wait.erase(it); + it = m_wait.begin(); + } + } + m_passphraseDlg = NULL; + askPassphrase(); +} + +void GpgPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr GpgPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant GpgPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void GpgPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} + +MsgGPGKey::MsgGPGKey(MsgEdit *parent, Message *msg) + : QObject(parent) +{ + m_client = msg->client(); + m_edit = parent; + m_edit->m_edit->setText(QString::null); + m_edit->m_edit->setReadOnly(true); + m_edit->m_edit->setParam(m_edit); + + Command cmd; + cmd->id = CmdSend; + cmd->flags = COMMAND_DISABLED; + cmd->param = m_edit; + EventCommandDisabled(cmd).process(); + + QString gpg = GpgPlugin::plugin->GPG(); + QString home = GpgPlugin::plugin->getHomeDir(); + m_key = GpgPlugin::plugin->value("Key").toString(); + + QStringList sl; + sl += GpgPlugin::plugin->GPG(); + sl += "--no-tty"; + sl += "--homedir"; + sl += home; + sl += GpgPlugin::plugin->value("Export").toString().split(' '); + sl = sl.replaceInStrings(QRegExp("\\%userid\\%"), m_key); + + m_process = new QProcess(this); + + connect(m_process, SIGNAL(processExited()), this, SLOT(exportReady())); + m_process->start(sl.join(" ")); + exportReady(); +} + +MsgGPGKey::~MsgGPGKey() +{ + delete m_process; +} + +void MsgGPGKey::init() +{ + m_edit->m_edit->setFocus(); +} + +void MsgGPGKey::exportReady() +{ + if (m_process->exitStatus() == QProcess::NormalExit && m_process->exitCode() == 0) { + m_process->setReadChannel(QProcess::StandardOutput); + QByteArray ba1 = m_process->readAll(); + m_edit->m_edit->setText(QString::fromLocal8Bit(ba1.data(), ba1.size())); + if(ba1.isEmpty()) { + m_process->setReadChannel(QProcess::StandardError); + QByteArray ba2 = m_process->readAll(); + QString errStr; + if(!ba2.isEmpty()) + errStr = " (" + QString::fromLocal8Bit( ba2.data(), ba2.size() ) + ") "; + BalloonMsg::message(i18n("Can't read gpg key ") + errStr + + " Error code: " + QString::number(m_process->error()), m_edit->m_edit); + } + } + + Command cmd; + cmd->id = CmdSend; + cmd->flags = 0; + cmd->param = m_edit; + EventCommandDisabled(cmd).process(); + + delete m_process; + m_process = 0; +} + +bool MsgGPGKey::processEvent(Event *e) +{ + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->param == m_edit){ + unsigned id = cmd->bar_grp; + if ((id >= MIN_INPUT_BAR_ID) && (id < MAX_INPUT_BAR_ID)){ + cmd->flags |= BTN_HIDE; + return true; + } + switch (cmd->id){ + case CmdSend: + case CmdSendClose: + e->process(this); + cmd->flags &= ~BTN_HIDE; + return true; + case CmdTranslit: + case CmdSmile: + case CmdNextMessage: + case CmdMsgAnswer: + e->process(this); + cmd->flags |= BTN_HIDE; + return true; + } + } + } + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->id == CmdSend) && (cmd->param == m_edit)){ + QString msgText = m_edit->m_edit->toPlainText(); + if (!msgText.isEmpty()){ + Message *msg = new Message; + msg->setText(msgText); + msg->setContact(m_edit->m_userWnd->id()); + msg->setClient(m_client); + msg->setFlags(MESSAGE_NOHISTORY); + KeyMsg km; + km.key = m_key; + km.msg = msg; + GpgPlugin::plugin->m_sendKeys.push_back(km); + EventRealSendMessage(msg, m_edit).process(); + } + return true; + } + } + return false; +} + diff --git a/plugins/gpg/gpg.h b/plugins/gpg/gpg.h new file mode 100644 index 0000000..48fa96d --- /dev/null +++ b/plugins/gpg/gpg.h @@ -0,0 +1,123 @@ +/*************************************************************************** + gpg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _GPG_H +#define _GPG_H + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" + +#include +#include +#include +#include + +const unsigned long MessageGPGKey = 0x5000; +const unsigned long MessageGPGUse = 0x5001; + +struct GpgUserData +{ + SIM::Data Key; + SIM::Data Use; +}; + +class QProcess; + +struct DecryptMsg +{ + SIM::Message *msg; + QProcess *process; + QString infile; + QString outfile; + unsigned contact; + QString passphrase; + QString key; +}; + +struct KeyMsg +{ + QString key; + SIM::Message *msg; +}; + +class GpgPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + GpgPlugin(unsigned, Buffer*); + virtual ~GpgPlugin(); + + QString GPG(); + void reset(); + static GpgPlugin *plugin; + QList m_sendKeys; + unsigned long user_data_id; + QString getHomeDir(); + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); + +protected slots: + void decryptReady(); + void importReady(); + void publicReady(); + void clear(); + void passphraseFinished(); + void passphraseApply(const QString&); +protected: + virtual QWidget *createConfigWindow(QWidget *parent); + virtual QByteArray getConfig(); + virtual bool processEvent(SIM::Event *e); + void registerMessage(); + void unregisterMessage(); + void askPassphrase(); + bool decode(SIM::Message *msg, const QString &pass, const QString &key); + bool m_bMessage; + QList m_decrypt; + QList m_import; + QList m_public; + QList m_wait; + class PassphraseDlg *m_passphraseDlg; +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +class MsgEdit; + +class MsgGPGKey : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgGPGKey(MsgEdit *parent, SIM::Message *msg); + ~MsgGPGKey(); +protected slots: + void init(); + void exportReady(); +protected: + virtual bool processEvent(SIM::Event *e); + QString m_client; + QString m_key; + MsgEdit *m_edit; + QProcess *m_process; +}; + +#endif + diff --git a/plugins/gpg/gpg.rc b/plugins/gpg/gpg.rc new file mode 100644 index 0000000..5da6a7d --- /dev/null +++ b/plugins/gpg/gpg.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "About plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "about\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "about.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/gpg/gpg.vcproj b/plugins/gpg/gpg.vcproj new file mode 100644 index 0000000..47492be --- /dev/null +++ b/plugins/gpg/gpg.vcproj @@ -0,0 +1,761 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/gpg/gpg_pch.h b/plugins/gpg/gpg_pch.h new file mode 100644 index 0000000..465057f --- /dev/null +++ b/plugins/gpg/gpg_pch.h @@ -0,0 +1,46 @@ +#pragma once + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef NO_QT_MOC_HEADER +#include +//#include +//#include +#endif + +#include "gpg.h" +#include "gpgadv.h" +#include "ui_gpgadvbase.h" +#include "gpgcfg.h" +#include "ui_gpgcfgbase.h" +#include "gpgfind.h" +#include "ui_gpgfindbase.h" +#include "gpggen.h" +#include "ui_gpggenbase.h" +#include "passphrase.h" +#include "ui_passphrasebase.h" diff --git a/plugins/gpg/gpgadv.cpp b/plugins/gpg/gpgadv.cpp new file mode 100644 index 0000000..7b23896 --- /dev/null +++ b/plugins/gpg/gpgadv.cpp @@ -0,0 +1,51 @@ +/*************************************************************************** + gpgadv.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "gpgadv.h" +#include "gpg.h" + +#include + +GpgAdvanced::GpgAdvanced(QWidget *parent, GpgPlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; + edtGenKey->setText(m_plugin->value("GenKey").toString()); + edtPublic->setText(m_plugin->value("PublicList").toString()); + edtSecret->setText(m_plugin->value("SecretList").toString()); + edtExport->setText(m_plugin->value("Export").toString()); + edtImport->setText(m_plugin->value("Import").toString()); + edtEncrypt->setText(m_plugin->value("Encrypt").toString()); + edtDecrypt->setText(m_plugin->value("Decrypt").toString()); +} + +GpgAdvanced::~GpgAdvanced() +{ +} + +void GpgAdvanced::apply() +{ + m_plugin->setValue("GenKey", edtGenKey->text()); + m_plugin->setValue("PublicList", edtPublic->text()); + m_plugin->setValue("SecretList", edtSecret->text()); + m_plugin->setValue("Export", edtExport->text()); + m_plugin->setValue("Import", edtImport->text()); + m_plugin->setValue("Encrypt", edtEncrypt->text()); + m_plugin->setValue("Decrypt", edtDecrypt->text()); +} + + diff --git a/plugins/gpg/gpgadv.h b/plugins/gpg/gpgadv.h new file mode 100644 index 0000000..bed738e --- /dev/null +++ b/plugins/gpg/gpgadv.h @@ -0,0 +1,38 @@ +/*************************************************************************** + gpgadv.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _GPGADV_H +#define _GPGADV_H + +#include "ui_gpgadvbase.h" + +class GpgPlugin; + +class GpgAdvanced : public QWidget, public Ui::GpgAdvanced +{ + Q_OBJECT +public: + GpgAdvanced(QWidget *parent, GpgPlugin *plugin); + ~GpgAdvanced(); +public slots: + void apply(); +protected: + GpgPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/gpg/gpgadvbase.ui b/plugins/gpg/gpgadvbase.ui new file mode 100644 index 0000000..0383fa6 --- /dev/null +++ b/plugins/gpg/gpgadvbase.ui @@ -0,0 +1,164 @@ + + + GpgAdvanced + + + + 0 + 0 + 499 + 276 + + + + Form1 + + + + 6 + + + 11 + + + + + GroupBox + + + + + + Generate key: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + List public keys: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + List secret keys: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Import public: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Export public: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Encrypt: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Decrypt: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + diff --git a/plugins/gpg/gpgcfg.cpp b/plugins/gpg/gpgcfg.cpp new file mode 100644 index 0000000..7f0b3b4 --- /dev/null +++ b/plugins/gpg/gpgcfg.cpp @@ -0,0 +1,244 @@ +/*************************************************************************** + gpgcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" + +#include "gpg.h" +#include "gpgcfg.h" +#include "simgui/ballonmsg.h" +#include "simgui/editfile.h" +#include "simgui/linklabel.h" +#ifdef WIN32 +#include "gpgfind.h" +#endif +#include "gpgadv.h" +#include "gpggen.h" + +#include +#include +#include +#include +#include + +using namespace SIM; + +GpgCfg::GpgCfg(QWidget *parent, GpgPlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; + m_process= NULL; + m_bNew = false; +#ifdef WIN32 + edtGPG->setText(m_plugin->GPG()); + edtGPG->setFilter(i18n("GPG(gpg.exe)")); + m_find = NULL; +#else + lblGPG->hide(); + edtGPG->hide(); +#endif + edtHome->setText(m_plugin->getHomeDir()); + edtHome->setDirMode(true); + edtHome->setShowHidden(true); + edtHome->setTitle(i18n("Select home directory")); + lnkGPG->setUrl("http://www.gnupg.org/(en)/download/index.html"); + lnkGPG->setText(i18n("Download GPG")); + connect(btnFind, SIGNAL(clicked()), this, SLOT(find())); + connect(edtGPG, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + textChanged(edtGPG->text()); + for (QObject *p = parent; p != NULL; p = p->parent()){ + if (!p->inherits("QTabWidget")) + continue; + QTabWidget *tab = static_cast(p); + m_adv = new GpgAdvanced(tab, plugin); + tab->addTab(m_adv, i18n("&Advanced")); + tab->adjustSize(); + break; + } + connect(btnRefresh, SIGNAL(clicked()), this, SLOT(refresh())); + connect(cmbKey, SIGNAL(activated(int)), this, SLOT(selectKey(int))); + fillSecret(); + refresh(); +} + +GpgCfg::~GpgCfg() +{ +} + +void GpgCfg::apply() +{ + QString key; + int nKey = cmbKey->currentIndex(); + if (nKey && (nKey < cmbKey->count() - 1)){ + QString k = cmbKey->currentText(); + key = getToken(k, ' '); + } + m_plugin->setValue("Key", key); +#ifdef WIN32 + m_plugin->setValue("GPG", edtGPG->text()); +#endif + m_plugin->setValue("Home", edtHome->text()); + m_adv->apply(); + m_plugin->reset(); +} + +#ifdef WIN32 +void GpgCfg::textChanged(const QString &str) +{ + if (str.isEmpty()){ + lnkGPG->show(); + btnFind->show(); + }else{ + lnkGPG->hide(); + btnFind->hide(); + } +} +#else +void GpgCfg::textChanged(const QString&) +{ + lnkGPG->hide(); + btnFind->hide(); +} +#endif + +void GpgCfg::find() +{ +#ifdef WIN32 + if (m_find == NULL){ + m_find = new GpgFind(edtGPG); + connect(m_find, SIGNAL(finished()), this, SLOT(findFinished())); + } + raiseWindow(m_find); +#endif +} + +void GpgCfg::findFinished() +{ +#ifdef WIN32 + m_find = NULL; +#endif +} + +void GpgCfg::fillSecret(const QByteArray &ba) +{ + int cur = 0; + int n = 1; + cmbKey->clear(); + cmbKey->addItem(i18n("None")); + if (!ba.isEmpty()){ + QByteArray all(ba); + for (;;){ + QByteArray line = getToken(all, '\n'); + if(line.isEmpty()) + break; + QByteArray type = getToken(line, ':'); + if (type == "sec"){ + getToken(line, ':'); + getToken(line, ':'); + getToken(line, ':'); + QString sign = QString::fromLocal8Bit(getToken(line, ':')); + if (sign == m_plugin->value("Key").toString()) + cur = n; + getToken(line, ':'); + getToken(line, ':'); + getToken(line, ':'); + getToken(line, ':'); + QString name = QString::fromLocal8Bit(getToken(line, ':')); + cmbKey->addItem(sign + QString(" - ") + name); + n++; + } + } + } + cmbKey->addItem(i18n("New")); + if (m_bNew){ + cur = cmbKey->count() - 2; + m_bNew = false; + } + cmbKey->setCurrentIndex(cur); +} + +void GpgCfg::refresh() +{ +#ifdef WIN32 + QString gpg = edtGPG->text(); +#else + QString gpg = m_plugin->GPG(); +#endif + QString home = edtHome->text(); + + if (gpg.isEmpty() || home.isEmpty()){ + fillSecret(); + return; + } + if (m_process) + return; + + QStringList sl; + sl += gpg; + sl += "--no-tty"; + sl += "--homedir"; + sl += home; + sl += GpgPlugin::plugin->value("SecretList").toString().split(' '); + + m_process = new QProcess(this); + + connect(m_process, SIGNAL(processExited()), this, SLOT(secretReady())); + m_process->start(sl.join(" ")); +} + +void GpgCfg::secretReady() +{ + if (m_process->exitStatus() == QProcess::NormalExit && m_process->exitCode() == 0) { + m_process->setReadChannel(QProcess::StandardOutput); + fillSecret(m_process->readAll()); + } else { + QByteArray ba1, ba2; + m_process->setReadChannel(QProcess::StandardError); + ba1 = m_process->readAll(); + m_process->setReadChannel(QProcess::StandardOutput); + ba2 = m_process->readAll(); + QString s(" ("); + if (!ba1.isEmpty()) + s += QString::fromLocal8Bit(ba1.data(), ba1.size()); + if (!ba2.isEmpty()) { + if(!s.isEmpty()) + s += ' '; + s += QString::fromLocal8Bit(ba2.data(), ba2.size()); + } + s += ')'; + if(s == " ()") + s = QString::null; + BalloonMsg::message(i18n("Get secret list failed") + s, btnRefresh); + } + delete m_process; + m_process = 0; +} + +void GpgCfg::selectKey(int n) +{ + if (n == cmbKey->count() - 1){ + if(edtHome->text().isEmpty()) + edtHome->setText(m_plugin->getHomeDir()); + GpgGen gen(this); + if (gen.exec()){ + m_bNew = true; + QTimer::singleShot(0, this, SLOT(refresh())); + } + } +} + +// vim: set expandtab: + diff --git a/plugins/gpg/gpgcfg.h b/plugins/gpg/gpgcfg.h new file mode 100644 index 0000000..559a112 --- /dev/null +++ b/plugins/gpg/gpgcfg.h @@ -0,0 +1,57 @@ +/*************************************************************************** + gpgcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _GPGCFG_H +#define _GPGCFG_H + +#include "ui_gpgcfgbase.h" + +class GpgPlugin; +class GpgAdvanced; +class QProcess; + +#ifdef WIN32 +class GpgFind; +#endif + +class GpgCfg : public QWidget, public Ui::GpgCfgBase +{ + Q_OBJECT +public: + GpgCfg(QWidget *parent, GpgPlugin *plugin); + ~GpgCfg(); +public slots: + void apply(); + void refresh(); + void textChanged(const QString&); + void find(); + void findFinished(); + void secretReady(); + void selectKey(int); +protected: + void fillSecret(const QByteArray &ba = QByteArray()); + bool m_bNew; + QProcess *m_process; + GpgPlugin *m_plugin; +#ifdef WIN32 + GpgFind *m_find; +#endif + GpgAdvanced *m_adv; +}; + +#endif + diff --git a/plugins/gpg/gpgcfgbase.ui b/plugins/gpg/gpgcfgbase.ui new file mode 100644 index 0000000..f2690a1 --- /dev/null +++ b/plugins/gpg/gpgcfgbase.ui @@ -0,0 +1,222 @@ + + + + + GpgCfgBase + + + + 0 + 0 + 389 + 237 + + + + Form1 + + + + 11 + + + 6 + + + + + Executable: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + 7 + 5 + + + + + + + + Home directory: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + 7 + 5 + + + + + + + + 0 + + + 6 + + + + + + 7 + 1 + + + + + + + + &Find + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + 0 + + + 6 + + + + + Your key: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + 7 + 0 + + + + + + + + &Refresh + + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    + + EditFile + QWidget +
    simgui/editfile.h
    + + -1 + -1 + + 0 + + 5 + 5 + + image1 +
    + + LinkLabel + QWidget +
    simgui/linklabel.h
    + + -1 + -1 + + 0 + + 1 + 1 + + image1 + + text + +
    +
    + + btnFind + cmbKey + btnRefresh + + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + +
    diff --git a/plugins/gpg/gpgfind.cpp b/plugins/gpg/gpgfind.cpp new file mode 100644 index 0000000..d556f8d --- /dev/null +++ b/plugins/gpg/gpgfind.cpp @@ -0,0 +1,116 @@ +/*************************************************************************** + gpgfind.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include + +#include "simgui/editfile.h" +#include "icons.h" +#include "misc.h" + +#include "gpgfind.h" + +using namespace SIM; + +GpgFind::GpgFind(EditFile *edt) : QDialog(NULL) +{ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + setWindowIcon(Icon("find")); + setButtonsPict(this); + m_edit = edt; + connect(btnCancel, SIGNAL(clicked()), this, SLOT(close())); + //m_drives = *QDir::drives(); //portme + //m_drive = m_drives.first(); //portme + QTimer::singleShot(0, this, SLOT(next())); +} + +GpgFind::~GpgFind() +{ + emit finished(); +} + +void GpgFind::next() +{ + if (!m_tree.empty()){ + QStringList &subDirs = m_tree.top(); + unsigned pos = m_pos.top(); + if (pos >= (unsigned)subDirs.count()){ + m_tree.pop(); + m_pos.pop(); + m_path = m_path.left(m_path.length() - 1); + m_path = m_path.left(m_path.lastIndexOf('\\') + 1); + QTimer::singleShot(0, this, SLOT(next())); + return; + } + QString subDir = subDirs[pos++]; + m_pos.pop(); + m_pos.push(pos); + if (!subDir.startsWith(".")){ + m_path += subDir; + m_path += '\\'; + if (checkPath()) + return; + } + QTimer::singleShot(0, this, SLOT(next())); + return; + } + if (m_drive == NULL){ + close(); + return; + } + m_path = m_drive->absoluteFilePath(); + m_path = m_path.replace('/', '\\'); + if ((GetDriveTypeW((LPCWSTR)m_path.utf16()) == DRIVE_FIXED) && checkPath()) + return; + //m_drive = m_drives.next(); //portme + QTimer::singleShot(0, this, SLOT(next())); +} + +bool GpgFind::checkPath() +{ + QDir d(m_path); + if (!d.exists()) + return false; + QString p = m_path; + if (p.length() > 40){ + p = "..."; + p += m_path.mid(m_path.length() - 38); + } + lblPath->setText(p); + QFile f(m_path + "gpg.exe"); + if (f.exists()){ + m_edit->setText(m_path + "gpg.exe"); + QTimer::singleShot(0, this, SLOT(close())); + return true; + } + QStringList subDirs = d.entryList(QDir::Dirs); + if (!subDirs.isEmpty()){ + m_tree.push(subDirs); + m_pos.push(0); + }else{ + m_path = m_path.left(m_path.lastIndexOf('\\')); + } + return false; +} + diff --git a/plugins/gpg/gpgfind.h b/plugins/gpg/gpgfind.h new file mode 100644 index 0000000..c45e6de --- /dev/null +++ b/plugins/gpg/gpgfind.h @@ -0,0 +1,51 @@ +/*************************************************************************** + gpgfind.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _GPGFIND_H +#define _GPGFIND_H + +#include "ui_gpgfindbase.h" + +#include +#include +#include +#include + +class EditFile; + +class GpgFind : public QDialog, public Ui::GpgFindBase +{ + Q_OBJECT +public: + GpgFind(EditFile *edt); + ~GpgFind(); +signals: + void finished(); +protected slots: + void next(); +protected: + bool checkPath(); + QString m_path; + QStack m_tree; + QStack m_pos; + QFileInfoList m_drives; + QFileInfo *m_drive; + EditFile *m_edit; +}; + +#endif + diff --git a/plugins/gpg/gpgfindbase.ui b/plugins/gpg/gpgfindbase.ui new file mode 100644 index 0000000..4388cb0 --- /dev/null +++ b/plugins/gpg/gpgfindbase.ui @@ -0,0 +1,86 @@ + + + + + GpgFindBase + + + + 0 + 0 + 358 + 97 + + + + Find GPG + + + true + + + + 11 + + + 6 + + + + + + 1 + 7 + + + + + + + false + + + + + + + &Cancel + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + qPixmapFromMimeSource + diff --git a/plugins/gpg/gpggen.cpp b/plugins/gpg/gpggen.cpp new file mode 100644 index 0000000..421c704 --- /dev/null +++ b/plugins/gpg/gpggen.cpp @@ -0,0 +1,188 @@ +/*************************************************************************** + gpggen.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" +#include "icons.h" + +#include "gpggen.h" +#include "gpgcfg.h" +#include "gpg.h" + +#include "simgui/ballonmsg.h" +#include "simgui/editfile.h" +#include "contacts/group.h" +#include "contacts/contact.h" + +#include +#include +#include +#include +#include +#include + +using namespace SIM; + +GpgGen::GpgGen(GpgCfg *cfg) : QDialog() +{ + setupUi(this); + setModal(true); + SET_WNDPROC("genkey") + setWindowIcon(Icon("encrypted")); + setButtonsPict(this); + cmbMail->setEditable(true); + m_process = NULL; + m_cfg = cfg; + connect(edtName, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + connect(edtPass1, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + connect(edtPass2, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + connect(cmbMail->lineEdit(), SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + Contact *owner = getContacts()->owner(); + if (owner){ + QString name; + name = owner->getFirstName(); + QString firstName = getToken(name, '/'); + name = owner->getLastName(); + QString lastName = getToken(name, '/'); + + if (firstName.isEmpty() || lastName.isEmpty()){ + name = firstName + lastName; + }else{ + name = firstName + ' ' + lastName; + } + edtName->setText(name); + QString mails = owner->getEMails(); + while (!mails.isEmpty()){ + QString item = getToken(mails, ';'); + QString mail = getToken(item, '/'); + cmbMail->addItem(mail); + } + } +} + +GpgGen::~GpgGen() +{ + delete m_process; +} + +void GpgGen::textChanged(const QString&) +{ + buttonOk->setEnabled(!edtName->text().isEmpty() && + !cmbMail->lineEdit()->text().isEmpty() && + (edtPass1->text() == edtPass2->text())); +} + +#ifdef WIN32 + #define CRLF "\r\n" +#else + #define CRLF "\n" +#endif + +void GpgGen::accept() +{ + edtName->setEnabled(false); + cmbMail->setEnabled(false); + edtComment->setEnabled(false); + buttonOk->setEnabled(false); +#ifdef WIN32 + QString gpg = m_cfg->edtGPG->text(); +#else + QString gpg = GpgPlugin::plugin->GPG(); +#endif + QString home = m_cfg->edtHome->text(); + if (gpg.isEmpty() || home.isEmpty()) + return; + lblProcess->setText(i18n("Move mouse for generate random key")); + if (home.endsWith("\\") || home.endsWith("/")) + home = home.left(home.length() - 1); + QString in = + "Key-Type: 1" CRLF + "Key-Length: 1024" CRLF + "Expire-Date: 0" CRLF + "Name-Real: "; + in += edtName->text(); + in += CRLF; + if (!edtComment->text().isEmpty()){ + in += "Name-Comment: "; + in += edtComment->text(); + in += CRLF; + } + in += "Name-Email: "; + in += cmbMail->lineEdit()->text(); + in += CRLF; + if (!edtPass1->text().isEmpty()){ + in += "Passphrase: "; + in += edtPass1->text(); + in += CRLF; + } + QString fname = user_file("keys/genkey.txt"); + QFile f(fname); + f.open(QIODevice::WriteOnly | QIODevice::Truncate); + f.write(in.toUtf8()); + f.close(); + + QStringList sl; + sl += gpg; + sl += "--no-tty"; + sl += "--homedir"; + sl += home; + sl += GpgPlugin::plugin->value("GenKey").toString().split(' '); + sl += fname; + + delete m_process; // to be sure... + m_process = new QProcess(this); + + connect(m_process, SIGNAL(finished()), this, SLOT(genKeyReady())); + + m_process->start(sl.join(" ")); +} + +void GpgGen::genKeyReady() +{ + QFile::remove(user_file("keys/genkey.txt")); + if(m_process->exitStatus() == QProcess::NormalExit && m_process->exitCode() == 0) + { + QDialog::accept(); + } + else + { + QByteArray ba1, ba2; + m_process->setReadChannel(QProcess::StandardError); + ba1 = m_process->readAll(); + m_process->setReadChannel(QProcess::StandardOutput); + ba2 = m_process->readAll(); + QString s(" ("); + if (!ba1.isEmpty()) + s += QString::fromLocal8Bit(ba1.data(), ba1.size()); + if (!ba2.isEmpty()) { + if(!s.isEmpty()) + s += ' '; + s += QString::fromLocal8Bit(ba2.data(), ba2.size()); + } + s += ')'; + if(s == " ()") + s = QString::null; + edtName->setEnabled(true); + cmbMail->setEnabled(true); + edtComment->setEnabled(true); + lblProcess->setText(QString::null); + buttonOk->setEnabled(true); + BalloonMsg::message(i18n("Generate key failed") + s, buttonOk); + } + delete m_process; + m_process = 0; +} + diff --git a/plugins/gpg/gpggen.h b/plugins/gpg/gpggen.h new file mode 100644 index 0000000..76a3702 --- /dev/null +++ b/plugins/gpg/gpggen.h @@ -0,0 +1,42 @@ +/*************************************************************************** + gpggen.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _GPGGEN_H +#define _GPGGEN_H + +#include "ui_gpggenbase.h" + +class QProcess; +class GpgCfg; + +class GpgGen : public QDialog, public Ui::GpgGenBase +{ + Q_OBJECT +public: + GpgGen(GpgCfg *parent); + ~GpgGen(); +protected slots: + void textChanged(const QString&); + void genKeyReady(); +protected: + void accept(); + QProcess *m_process; + GpgCfg *m_cfg; +}; + +#endif + diff --git a/plugins/gpg/gpggenbase.ui b/plugins/gpg/gpggenbase.ui new file mode 100644 index 0000000..6b540d5 --- /dev/null +++ b/plugins/gpg/gpggenbase.ui @@ -0,0 +1,210 @@ + + + + + GpgGenBase + + + + 0 + 0 + 385 + 241 + + + + Generate key + + + true + + + + 11 + + + 6 + + + + + EMail: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + Comment: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + Name: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + + + + + + + Passphrase: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + Retype passphrase: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + QLineEdit::Password + + + + + + + QLineEdit::Password + + + + + + + + 7 + 7 + + + + + + + Qt::AlignCenter + + + false + + + + + + + 0 + + + 6 + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + qPixmapFromMimeSource + + edtName + cmbMail + edtComment + edtPass1 + edtPass2 + buttonOk + buttonCancel + + + + buttonOk + clicked() + GpgGen + accept() + + + buttonCancel + clicked() + GpgGen + reject() + + + diff --git a/plugins/gpg/gpguser.cpp b/plugins/gpg/gpguser.cpp new file mode 100644 index 0000000..1c99a29 --- /dev/null +++ b/plugins/gpg/gpguser.cpp @@ -0,0 +1,120 @@ +/*************************************************************************** + gpguser.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" + +#include "gpguser.h" +#include "gpg.h" + + +#include +#include +#include +#include + + +using namespace SIM; + +GpgUser::GpgUser(QWidget *parent, GpgUserData *data) : QWidget(parent) +{ + setupUi(this); + if(data) + m_key = data->Key.str(); + m_process = NULL; + connect(btnRefresh, SIGNAL(clicked()), this, SLOT(refresh())); + refresh(); +} + +GpgUser::~GpgUser() +{ + delete m_process; +} + +void GpgUser::apply(void *_data) +{ + GpgUserData *data = (GpgUserData*)_data; + QString key; + int nKey = cmbPublic->currentIndex(); + if (nKey && (nKey < cmbPublic->count())){ + QString k = cmbPublic->currentText(); + key = getToken(k, ' '); + } + data->Key.str() = key; + if (key.isEmpty()) + data->Use.asBool() = false; +} + +void GpgUser::refresh() +{ + if (m_process) + return; + QString gpg = GpgPlugin::plugin->GPG(); + QString home = GpgPlugin::plugin->getHomeDir(); + if (gpg.isEmpty() || home.isEmpty()) + return; + + QStringList sl; + sl += gpg; + sl += "--no-tty"; + sl += "--homedir"; + sl += home; + sl += GpgPlugin::plugin->value("PublicList").toString().split(' '); + + m_process = new QProcess(this); + + connect(m_process, SIGNAL(processExited()), this, SLOT(publicReady())); + m_process->start(sl.join(" ")); +} + +void GpgUser::publicReady() +{ + int cur = 0; + int n = 1; + cmbPublic->clear(); + cmbPublic->insertItem(INT_MAX,i18n("None")); + if (m_process->exitStatus() == QProcess::NormalExit && m_process->exitCode() == 0){ + m_process->setReadChannel(QProcess::StandardOutput); + QByteArray str(m_process->readAll()); + for (;;){ + QByteArray line; + line = getToken(str, '\n'); + if(line.isEmpty()) + break; + QByteArray type = getToken(line, ':'); + if (type == "pub"){ + getToken(line, ':'); + getToken(line, ':'); + getToken(line, ':'); + QByteArray sign = getToken(line, ':'); + if (QString::fromLocal8Bit(sign) == m_key) + cur = n; + getToken(line, ':'); + getToken(line, ':'); + getToken(line, ':'); + getToken(line, ':'); + QByteArray name = getToken(line, ':'); + cmbPublic->insertItem(INT_MAX,QString::fromLocal8Bit(sign) + QString(" - ") + + QString::fromLocal8Bit(name)); + n++; + } + } + } + cmbPublic->setCurrentIndex(cur); + delete m_process; + m_process = 0; +} + diff --git a/plugins/gpg/gpguser.h b/plugins/gpg/gpguser.h new file mode 100644 index 0000000..bb68a68 --- /dev/null +++ b/plugins/gpg/gpguser.h @@ -0,0 +1,43 @@ +/*************************************************************************** + gpguser.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _GPGUSER_H +#define _GPGUSER_H + +#include "ui_gpguserbase.h" + +struct GpgUserData; +class GpgPlugin; +class QProcess; + +class GpgUser : public QWidget, public Ui::GpgUserBase +{ + Q_OBJECT +public: + GpgUser(QWidget *parent, GpgUserData *data); + ~GpgUser(); +public slots: + void apply(void *data); + void refresh(); + void publicReady(); +protected: + QProcess *m_process; + QString m_key; +}; + +#endif + diff --git a/plugins/gpg/gpguserbase.ui b/plugins/gpg/gpguserbase.ui new file mode 100644 index 0000000..570347e --- /dev/null +++ b/plugins/gpg/gpguserbase.ui @@ -0,0 +1,98 @@ + + + + + GpgUserBase + + + + 0 + 0 + 452 + 159 + + + + Form1 + + + + 11 + + + 6 + + + + + Key: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + 7 + 0 + + + + + + + + &Refresh + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/gpg/passphrase.cpp b/plugins/gpg/passphrase.cpp new file mode 100644 index 0000000..7a3497b --- /dev/null +++ b/plugins/gpg/passphrase.cpp @@ -0,0 +1,70 @@ +/*************************************************************************** + passphrase.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "misc.h" + +#include "passphrase.h" +#include "gpg.h" +#include "simgui/ballonmsg.h" + +#include +#include +#include +#include +#include + +using namespace SIM; + +PassphraseDlg::PassphraseDlg(GpgPlugin *plugin, const QString &key) : QDialog(NULL) +{ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + setObjectName("passphrase"); + m_plugin = plugin; + SET_WNDPROC("passphrase") + setWindowIcon(Icon("encrypted")); + setButtonsPict(this); + m_key = key; + lblTitle->setText(i18n("Input passphrase for key %1") .arg(key)); + connect(edtPass, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + btnOk->setEnabled(false); + chkSave->setChecked(m_plugin->value("SavePassphrase").toBool()); +} + +PassphraseDlg::~PassphraseDlg() +{ + emit finished(); +} + +void PassphraseDlg::accept() +{ + m_plugin->setValue("SavePassphrase", chkSave->isChecked()); + emit apply(edtPass->text()); +} + +void PassphraseDlg::textChanged(const QString &text) +{ + btnOk->setEnabled(!text.isEmpty()); +} + +void PassphraseDlg::error() +{ + raiseWindow(this); + BalloonMsg::message(i18n("Bad passphrase"), btnOk); +} + diff --git a/plugins/gpg/passphrase.h b/plugins/gpg/passphrase.h new file mode 100644 index 0000000..6341ca3 --- /dev/null +++ b/plugins/gpg/passphrase.h @@ -0,0 +1,44 @@ +/*************************************************************************** + passphrase.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _PASSPHRASE_H +#define _PASSPHRASE_H + +#include "ui_passphrasebase.h" + +class GpgPlugin; + +class PassphraseDlg : public QDialog, public Ui::PassphraseDlgBase +{ + Q_OBJECT +public: + PassphraseDlg(GpgPlugin *plugin, const QString &key); + ~PassphraseDlg(); + QString m_key; + void error(); +signals: + void finished(); + void apply(const QString &pass); +protected slots: + void textChanged(const QString&); +protected: + void accept(); + GpgPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/gpg/passphrasebase.ui b/plugins/gpg/passphrasebase.ui new file mode 100644 index 0000000..d9de98e --- /dev/null +++ b/plugins/gpg/passphrasebase.ui @@ -0,0 +1,111 @@ + + + + + PassphraseDlgBase + + + + 0 + 0 + 388 + 119 + + + + Input passphrase + + + + 11 + + + 6 + + + + + + 7 + 7 + + + + + + + Qt::AlignVCenter|Qt::AlignLeft + + + true + + + + + + + &Save passphrase + + + + + + + QLineEdit::Password + + + + + + + &OK + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &Cancel + + + + + + qPixmapFromMimeSource + + edtPass + chkSave + btnOk + btnCancel + + + + btnOk + clicked() + Passphrase + accept() + + + btnCancel + clicked() + Passphrase + reject() + + + diff --git a/plugins/gpg/resource.h b/plugins/gpg/resource.h new file mode 100644 index 0000000..b4a4ae1 --- /dev/null +++ b/plugins/gpg/resource.h @@ -0,0 +1,18 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by gpg.rc +// +#define LANG_NEUTRAL 0 +#define SUBLANG_NEUTRAL 0 +#define IDI_ICON1 1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/plugins/icons/CMakeLists.txt b/plugins/icons/CMakeLists.txt new file mode 100644 index 0000000..0b672a9 --- /dev/null +++ b/plugins/icons/CMakeLists.txt @@ -0,0 +1,23 @@ +################# +# icons library # +################# +IF(BUILD_DROPPED) +SET(icons_SRCS + icon.cpp + iconcfg.cpp +) + +SET(icons_HDRS + icon.h + iconcfg.h +) + +SET(icons_UICS + iconcfgbase.ui +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(icons) +ENDIF(BUILD_DROPPED) diff --git a/plugins/icons/icon.cpp b/plugins/icons/icon.cpp new file mode 100644 index 0000000..1234d87 --- /dev/null +++ b/plugins/icons/icon.cpp @@ -0,0 +1,129 @@ +/*************************************************************************** + icon.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "misc.h" +#include "log.h" + +#include "profile.h" +#include "profilemanager.h" + +#include "icon.h" +#include "iconcfg.h" + +#include + +using namespace std; +using namespace SIM; + +Plugin *createIconsPlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new IconsPlugin(base, config); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Icons"), + I18N_NOOP("Plugin provides JISP icons themes and emoticons"), + VERSION, + createIconsPlugin, + PLUGIN_NOLOAD_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +IconsPlugin::IconsPlugin(unsigned base, Buffer *config) + : QObject(), Plugin(base), EventReceiver(HighestPriority - 0x100) +{ + m_propertyHub = SIM::PropertyHub::create("icon"); + setIcons(false); +} + +IconsPlugin::~IconsPlugin() +{ + +} + +void IconsPlugin::setIcons(bool bForce) +{ + if (!bForce && value("Default").toBool()) + return; + getIcons()->removeIconSet(NULL); + if (value("Default").toBool()){ + getIcons()->addIconSet("icons/smile.jisp", false); + }else{ + const QStringList l = value("Icons").toStringList(); + for (unsigned i = 0; i < value("NIcons").toUInt(); i++) + { + if(i >= (unsigned)l.size()) + break; + getIcons()->addIconSet(l[i], false); + } + } + EventIconChanged().process(); +} + +QByteArray IconsPlugin::getConfig() +{ + return QByteArray(); +} + +bool IconsPlugin::processEvent(Event *e) +{ + switch (e->type()) + { + case eEventPluginLoadConfig: + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("icon"); + if(!hub.isNull()) + setPropertyHub(hub); + setIcons(false); + break; + } + default: + break; + } + return false; +} +QWidget *IconsPlugin::createConfigWindow(QWidget *parent) +{ + return new IconCfg(parent, this); +} + +void IconsPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr IconsPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant IconsPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void IconsPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/icons/icon.h b/plugins/icons/icon.h new file mode 100644 index 0000000..ec565f2 --- /dev/null +++ b/plugins/icons/icon.h @@ -0,0 +1,46 @@ +/*************************************************************************** + icon.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICON_H +#define _ICON_H + +#include "cfg.h" +#include "plugins.h" +#include "propertyhub.h" + + +class IconsPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ +public: + IconsPlugin(unsigned, Buffer*); + virtual ~IconsPlugin(); + void setIcons(bool bForce); + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +protected: + bool processEvent(SIM::Event *e); + virtual QWidget *createConfigWindow(QWidget *parent); + virtual QByteArray getConfig(); +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/icons/iconcfg.cpp b/plugins/icons/iconcfg.cpp new file mode 100644 index 0000000..7706ae3 --- /dev/null +++ b/plugins/icons/iconcfg.cpp @@ -0,0 +1,132 @@ +/*************************************************************************** + iconcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include +#include + +#ifdef USE_KDE +# include +# define QFileDialog KFileDialog +#else +# include +#endif + +#include "icons.h" +#include "misc.h" + +#include "iconcfg.h" +#include "icon.h" + +IconCfg::IconCfg(QWidget *parent, IconsPlugin *plugin) + : QWidget(parent) + , m_plugin(plugin) +{ + setupUi(this); + connect(btnUp, SIGNAL(clicked()), this, SLOT(up())); + connect(btnDown, SIGNAL(clicked()), this, SLOT(down())); + connect(btnAdd, SIGNAL(clicked()), this, SLOT(add())); + connect(btnRemove, SIGNAL(clicked()), this, SLOT(remove())); + connect(lstIcon, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged())); + if (m_plugin->value("Default").toBool()){ + lstIcon->addItem(QDir::toNativeSeparators("icons/smiles.jisp")); + + }else{ + const QStringList l = m_plugin->value("Icons").toStringList(); + for (int i = 0; i < m_plugin->value("NIcons").toInt(); i++) + { + if(i >= l.size()) + break; + lstIcon->addItem(l[i]); + } + } + itemSelectionChanged(); +} + +void IconCfg::apply() +{ + m_plugin->setValue("Default", false); + QStringList l; + for (int i = 0; i < lstIcon->count(); i++) + l.append(lstIcon->item(i)->text()); + m_plugin->setValue("Icons", l); + m_plugin->setValue("NIcons", lstIcon->count()); + m_plugin->setIcons(true); +} + +void IconCfg::up() +{ + int n = lstIcon->currentRow(); + if (n < 1) + return; + QListWidgetItem *item = lstIcon->takeItem(n); + lstIcon->insertItem(n - 1, item); + if (n==lstIcon->count()-1) + lstIcon->setCurrentRow(lstIcon->currentRow()-1); + else + lstIcon->setCurrentRow(lstIcon->currentRow()-2); + + itemSelectionChanged(); +} + +void IconCfg::down() +{ + int n = lstIcon->currentRow(); + if ((n < 0) || (n >= lstIcon->count() - 1)) + return; + QListWidgetItem *item = lstIcon->takeItem(n); + lstIcon->insertItem(n + 1, item); + lstIcon->setCurrentRow(lstIcon->currentRow()+1); + itemSelectionChanged(); +} + +void IconCfg::add() +{ +#ifdef USE_KDE + QString filter = i18n("*.jisp|Icon set"); +#else + QString filter = i18n("Icon set(*.jisp)"); +#endif + QString jisp = QFileDialog::getOpenFileName(topLevelWidget(), i18n("Select icon set"), SIM::app_file("icons/"), filter); + if (!jisp.isEmpty()) { + int n = lstIcon->currentRow(); + lstIcon->insertItem(n, QDir::toNativeSeparators(jisp)); + itemSelectionChanged(); + } +} + +void IconCfg::remove() +{ + delete lstIcon->takeItem(lstIcon->currentRow()); + itemSelectionChanged(); +} + +void IconCfg::itemSelectionChanged() +{ + int n = lstIcon->currentRow(); + if (n < 0){ + btnUp->setEnabled(false); + btnDown->setEnabled(false); + btnRemove->setEnabled(false); + return; + } + btnRemove->setEnabled(true); + btnUp->setEnabled(n > 0); + btnDown->setEnabled(n < lstIcon->count() - 1); +} + diff --git a/plugins/icons/iconcfg.h b/plugins/icons/iconcfg.h new file mode 100644 index 0000000..790638f --- /dev/null +++ b/plugins/icons/iconcfg.h @@ -0,0 +1,43 @@ +/*************************************************************************** + iconcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICONCFG_H +#define _ICONCFG_H + + +#include "ui_iconcfgbase.h" + +class IconsPlugin; + +class IconCfg : public QWidget, public Ui::IconCfgBase +{ + Q_OBJECT +public: + IconCfg(QWidget *parent, IconsPlugin *plugin); +public slots: + void apply(); + void up(); + void down(); + void add(); + void remove(); + void itemSelectionChanged(); +protected: + IconsPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/icons/iconcfgbase.ui b/plugins/icons/iconcfgbase.ui new file mode 100644 index 0000000..534937e --- /dev/null +++ b/plugins/icons/iconcfgbase.ui @@ -0,0 +1,84 @@ + + + IconCfgBase + + + + 0 + 0 + 459 + 322 + + + + Form1 + + + + 11 + + + 6 + + + + + &Up + + + true + + + + + + + &Down + + + + + + + &Remove + + + + + + + &New + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + btnUp + btnDown + btnAdd + btnRemove + lstIcon + + + + diff --git a/plugins/icons/icons.rc b/plugins/icons/icons.rc new file mode 100644 index 0000000..4e48104 --- /dev/null +++ b/plugins/icons/icons.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Icons plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "icons\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "icons.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/icons/icons.vcproj b/plugins/icons/icons.vcproj new file mode 100644 index 0000000..4669928 --- /dev/null +++ b/plugins/icons/icons.vcproj @@ -0,0 +1,372 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/icq/CMakeLists.txt b/plugins/icq/CMakeLists.txt new file mode 100644 index 0000000..487bb0f --- /dev/null +++ b/plugins/icq/CMakeLists.txt @@ -0,0 +1,105 @@ +############### +# icq library # +############### +SET(icq_SRCS + aboutinfo.cpp + advsearch.cpp + aimconfig.cpp + aiminfo.cpp + aimsearch.cpp + aimservices.cpp + encodingdlg.cpp + homeinfo.cpp + icq.cpp + icqbos.cpp + icqbuddy.cpp + icqbuffer.cpp + icqclient.cpp + icqconfig.cpp + icqdirect.cpp + icqicmb.cpp + icqinfo.cpp + icqlists.cpp + icqlocation.cpp + icqlogin.cpp + icqmessage.cpp + icqpicture.cpp + icqping.cpp + icqsearch.cpp + icqsecure.cpp + icqservice.cpp + icqssbi.cpp + icqstatus.cpp + icqvarious.cpp + interestsinfo.cpp + moreinfo.cpp + pastinfo.cpp + polling.cpp + rtfgen.cpp + securedlg.cpp + verifydlg.cpp + warndlg.cpp + workinfo.cpp + xml.cpp + snac.cpp +) + +SET(icq_HDRS + aboutinfo.h + advsearch.h + aimconfig.h + aiminfo.h + aimsearch.h + encodingdlg.h + homeinfo.h + icq.h + icqbuffer.h + icqclient.h + icqconfig.h + icqinfo.h + icqlocation.h + icqmessage.h + icqdirect.h + icqicmb.h + icqpicture.h + icqsearch.h + icqsecure.h + icqssbi.h + icqstatus.h + interestsinfo.h + moreinfo.h + pastinfo.h + polling.h + securedlg.h + verifydlg.h + warndlg.h + workinfo.h + xml.h + snac.h +) + +SET(icq_UICS + aboutinfobase.ui + advsearchbase.ui + aimconfigbase.ui + aiminfobase.ui + aimsearchbase.ui + encodingdlgbase.ui + homeinfobase.ui + icqconfigbase.ui + icqinfobase.ui + icqpicturebase.ui + icqsearchbase.ui + icqsecurebase.ui + interestsinfobase.ui + moreinfobase.ui + pastinfobase.ui + securedlgbase.ui + verifydlgbase.ui + warndlgbase.ui + workinfobase.ui +) + +ADD_FLEX_FILES(icq_SRCS rtf.ll) + +SIM_ADD_PLUGIN(icq) diff --git a/plugins/icq/aboutinfo.cpp b/plugins/icq/aboutinfo.cpp new file mode 100644 index 0000000..0014da0 --- /dev/null +++ b/plugins/icq/aboutinfo.cpp @@ -0,0 +1,83 @@ +/*************************************************************************** + aboutinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "aboutinfo.h" +#include "icqclient.h" +#include "simgui/textshow.h" +#include "contacts/contact.h" + +using namespace SIM; + +AboutInfo::AboutInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client) : QWidget(parent) +{ + setupUi(this); + m_data = data; + m_client = client; + if (m_data) + edtAbout->setReadOnly(true); + m_contact = contact; + fill(); +} + +void AboutInfo::apply() +{ +} + +void AboutInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->About.str() = edtAbout->toPlainText(); +} + +bool AboutInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +void AboutInfo::fill() +{ + ICQUserData *data = m_data; + if(data == NULL) data = &m_client->data.owner; + if(data->Uin.toULong()) + { +// edtAbout->setTextFormat(Qt::PlainText); + edtAbout->setText(data->About.str()); + } + else + { +// edtAbout->setTextFormat(Qt::RichText); + edtAbout->setText(data->About.str()); + //if (m_data == NULL) + //edtAbout->showBar(); + } +} + diff --git a/plugins/icq/aboutinfo.h b/plugins/icq/aboutinfo.h new file mode 100644 index 0000000..fa9407c --- /dev/null +++ b/plugins/icq/aboutinfo.h @@ -0,0 +1,45 @@ +/*************************************************************************** + aboutinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ABOUTINFO_H +#define _ABOUTINFO_H + +#include "contacts.h" + +#include "ui_aboutinfobase.h" + +class ICQClient; +struct ICQUserData; + +class AboutInfo : public QWidget, public Ui::aboutInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + AboutInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + ICQUserData *m_data; + unsigned m_contact; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/aboutinfobase.ui b/plugins/icq/aboutinfobase.ui new file mode 100644 index 0000000..499eadd --- /dev/null +++ b/plugins/icq/aboutinfobase.ui @@ -0,0 +1,57 @@ + + + aboutInfo + + + + 0 + 0 + 374 + 288 + + + + Form4 + + + + 6 + + + 11 + + + + + + A&bout + + + + 6 + + + 11 + + + + + Additional information about user: + + + false + + + + + + + + + + + + + + + diff --git a/plugins/icq/advsearch.cpp b/plugins/icq/advsearch.cpp new file mode 100644 index 0000000..dd9d0ee --- /dev/null +++ b/plugins/icq/advsearch.cpp @@ -0,0 +1,64 @@ +/*************************************************************************** + advsearch.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "country.h" +#include "misc.h" + +#include "advsearch.h" +#include + +using namespace SIM; + +extern const ext_info *p_genders; +extern const ext_info *p_languages; +extern const ext_info *p_occupations; +extern const ext_info *p_interests; +extern const ext_info *p_pasts; +extern const ext_info *p_affilations; + +const ext_info ages[] = + { + { "18-22", 1 }, + { "23-29", 2 }, + { "30-39", 3 }, + { "40-49", 4 }, + { "50-59", 5 }, + { "> 60", 6 }, + { "", 0 } + }; + +const ext_info *p_ages = ages; + +AdvSearch::AdvSearch() : QWidget(NULL) +{ + setupUi(this); + initCombo(cmbGender, 0, p_genders); + initCombo(cmbAge, 0, ages); + initCombo(cmbCountry, 0, getCountries(), true, getCountryCodes()); + initCombo(cmbLang, 0, p_languages); + initCombo(cmbOccupation, 0, p_occupations); + initCombo(cmbInterests, 0, p_interests); + initCombo(cmbPast, 0, p_pasts); + initCombo(cmbAffilation, 0, p_affilations); +} + +void AdvSearch::showEvent(QShowEvent *e) +{ + QWidget::showEvent(e); + emit enableOptions(false); +} + diff --git a/plugins/icq/advsearch.h b/plugins/icq/advsearch.h new file mode 100644 index 0000000..1cdbaff --- /dev/null +++ b/plugins/icq/advsearch.h @@ -0,0 +1,36 @@ +/*************************************************************************** + advsearch.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ADVSEARCH_H +#define _ADVSEARCH_H + +#include "ui_advsearchbase.h" +#include + +class AdvSearch : public QWidget, public Ui::AdvSearch +{ + Q_OBJECT +public: + AdvSearch(); +signals: + void enableOptions(bool); +protected: + void showEvent(QShowEvent*); +}; + +#endif + diff --git a/plugins/icq/advsearchbase.ui b/plugins/icq/advsearchbase.ui new file mode 100644 index 0000000..71d1c86 --- /dev/null +++ b/plugins/icq/advsearchbase.ui @@ -0,0 +1,328 @@ + + + AdvSearch + + + + 0 + 0 + 613 + 418 + + + + Form1 + + + + 6 + + + 0 + + + + + 6 + + + 0 + + + + + Info + + + + + + Gender: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Age: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Country: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + State: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + City: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Language: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Work + + + + + + Occupation: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Company: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Department: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Position: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + 6 + + + 0 + + + + + Interests + + + + + + + + + + + + + + + Past + + + + + + + + + + + + + + + + + + + Affiliations + + + + + + + + + + + + + + + Keywords + + + + + + + + + + + + Search &online users only + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + chkOnline + + + + diff --git a/plugins/icq/aimconfig.cpp b/plugins/icq/aimconfig.cpp new file mode 100644 index 0000000..1427e7b --- /dev/null +++ b/plugins/icq/aimconfig.cpp @@ -0,0 +1,95 @@ +/*************************************************************************** + aimconfig.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "aimconfig.h" +#include "icq.h" +#include "simgui/linklabel.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace SIM; + +AIMConfig::AIMConfig(QWidget *parent, ICQClient *client, bool bConfig) : QDialog(parent) +{ + setupUi(this); + m_client = client; + m_bConfig = bConfig; + if (m_bConfig){ + QTimer::singleShot(0, this, SLOT(changed())); + edtScreen->setText(m_client->data.owner.Screen.str()); + edtPasswd->setText(m_client->getPassword()); + connect(edtScreen, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPasswd, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + lnkReg->setText(i18n("Register new ScreenName")); + lnkReg->setUrl("http://my.screenname.aol.com/_cqr/login/login.psp?siteId=aimregistrationPROD&authLev=1&mcState=initialized&createSn=1&triedAimAuth=y"); + }else{ + tabConfig->removeTab(tabConfig->indexOf(tabAIM)); + } + edtServer->setText(m_client->getServer()); + edtPort->setValue(m_client->getPort()); + connect(edtServer, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPort, SIGNAL(valueChanged(const QString&)), this, SLOT(changed(const QString&))); + chkHTTP->setChecked(client->getUseHTTP()); + connect(chkAuto, SIGNAL(toggled(bool)), this, SLOT(autoToggled(bool))); + chkAuto->setChecked(client->getAutoHTTP()); + chkKeepAlive->setChecked(client->getKeepAlive()); +} + +void AIMConfig::autoToggled(bool bState) +{ + chkHTTP->setEnabled(!bState); +} + +void AIMConfig::apply(Client*, void*) +{ +} + +void AIMConfig::apply() +{ + if (m_bConfig){ + m_client->setScreen(edtScreen->text().toLower()); + m_client->setPassword(edtPasswd->text()); + } + m_client->setServer(edtServer->text()); + m_client->setPort(edtPort->text().toUShort()); + m_client->setUseHTTP(chkHTTP->isChecked()); + m_client->setAutoHTTP(chkAuto->isChecked()); + m_client->setKeepAlive(chkKeepAlive->isChecked()); +} + +void AIMConfig::changed(const QString&) +{ + changed(); +} + +void AIMConfig::changed() +{ + bool bOK = true; + bOK = !edtScreen->text().isEmpty() && + !edtPasswd->text().isEmpty() && + !edtServer->text().isEmpty() && + edtPort->text().toUShort(); + emit okEnabled(bOK); +} + diff --git a/plugins/icq/aimconfig.h b/plugins/icq/aimconfig.h new file mode 100644 index 0000000..bd0d129 --- /dev/null +++ b/plugins/icq/aimconfig.h @@ -0,0 +1,44 @@ +/*************************************************************************** + aimconfig.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _AIMCONFIG_H +#define _AIMCONFIG_H + +#include "ui_aimconfigbase.h" +#include "icqclient.h" + +class AIMConfig : public QDialog, public Ui::AIMConfigBase +{ + Q_OBJECT +public: + AIMConfig(QWidget *parent, ICQClient *client, bool bConfig); +signals: + void okEnabled(bool); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected slots: + void changed(); + void changed(const QString&); + void autoToggled(bool); +protected: + bool m_bConfig; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/aimconfigbase.ui b/plugins/icq/aimconfigbase.ui new file mode 100644 index 0000000..4d38300 --- /dev/null +++ b/plugins/icq/aimconfigbase.ui @@ -0,0 +1,251 @@ + + + + + AIMConfigBase + + + + 0 + 0 + 318 + 258 + + + + Form1 + + + + 11 + + + 6 + + + + + + &AIM + + + + 11 + + + 6 + + + + + ScreenName: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + Password: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + QLineEdit::Password + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + &Network + + + + 11 + + + 6 + + + + + + + + Port: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + 65535 + + + 1 + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + Server: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + Use &HTTP polling + + + + + + + &Automatically use HTTP polling if proxy required + + + + + + + Note: For HTTP-polling using proxy settings for HTTP + + + Qt::AlignVCenter|Qt::AlignLeft + + + true + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + &Keep-alive connection + + + + + + + + + + + + LinkLabel + QWidget +
    simgui/linklabel.h
    + + -1 + -1 + + 0 + + 1 + 1 + + image0 + + text + +
    +
    + + tabConfig + edtScreen + edtPasswd + edtServer + edtPort + chkHTTP + chkAuto + + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + +
    diff --git a/plugins/icq/aiminfo.cpp b/plugins/icq/aiminfo.cpp new file mode 100644 index 0000000..92d5449 --- /dev/null +++ b/plugins/icq/aiminfo.cpp @@ -0,0 +1,227 @@ +/*************************************************************************** + aiminfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "aiminfo.h" +#include "icqclient.h" +#include "contacts/contact.h" + +#include +#include +#include +#include +#include + +using namespace SIM; + +AIMInfo::AIMInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client) : QWidget(parent) +{ + setupUi(this); + m_client = client; + m_data = data; + m_contact = contact; + edtScreen->setReadOnly(true); + if (m_data){ + edtFirst->setReadOnly(true); + edtLast->setReadOnly(true); + edtMiddle->setReadOnly(true); + edtMaiden->setReadOnly(true); + edtNick->setReadOnly(true); + edtStreet->setReadOnly(true); + edtCity->setReadOnly(true); + edtState->setReadOnly(true); + edtZip->setReadOnly(true); + edtAutoReply->setReadOnly(true); + disableWidget(cmbCountry); + }else{ + edtAutoReply->hide(); + } + edtOnline->setReadOnly(true); + edtNA->setReadOnly(true); + edtExtIP->setReadOnly(true); + edtIntIP->setReadOnly(true); + edtClient->setReadOnly(true); + fill(); +} + +void AIMInfo::apply() +{ + ICQUserData *data = m_data; + if (data == NULL) + data = &m_client->data.owner; +} + +void AIMInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->FirstName.str() = edtFirst->text(); + data->LastName.str() = edtLast->text(); + data->MiddleName.str() = edtMiddle->text(); + data->Maiden.str() = edtMaiden->text(); + data->Nick.str() = edtNick->text(); + data->Address.str() = edtStreet->text(); + data->City.str() = edtCity->text(); + data->State.str() = edtState->text(); + data->Zip.str() = edtZip->text(); + data->Country.asULong() = getComboValue(cmbCountry, getCountries()); +} + +bool AIMInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } else + if ((e->type() == eEventMessageReceived) && m_data){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->type() == MessageStatus){ + if (m_client->dataName(m_data) == msg->client()) + fill(); + } + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +void AIMInfo::fill() +{ + ICQUserData *data = m_data; + if (data == NULL) data = &m_client->data.owner; + + edtScreen->setText(data->Screen.str()); + edtFirst->setText(data->FirstName.str()); + edtLast->setText(data->LastName.str()); + edtMiddle->setText(data->MiddleName.str()); + edtMaiden->setText(data->Maiden.str()); + edtNick->setText(data->Nick.str()); + edtStreet->setText(data->Address.str()); + edtCity->setText(data->City.str()); + edtState->setText(data->State.str()); + edtZip->setText(data->Zip.str()); + initCombo(cmbCountry, data->Country.toULong(), getCountries()); + + if (m_data == NULL){ + if (edtFirst->text().isEmpty()) { + QString firstName = getContacts()->owner()->getFirstName(); + firstName = getToken(firstName, '/'); + edtFirst->setText(firstName); + } + if (edtLast->text().isEmpty()) { + QString lastName = getContacts()->owner()->getLastName(); + lastName = getToken(lastName, '/'); + edtLast->setText(lastName); + } + } + + cmbStatus->clear(); + unsigned status = STATUS_ONLINE; + if (m_data){ + switch (m_data->Status.toULong()){ + case STATUS_ONLINE: + case STATUS_OFFLINE: + status = m_data->Status.toULong(); + break; + default: + status = STATUS_AWAY; + } + }else{ + status = m_client->getStatus(); + } + if (m_data && !m_data->AutoReply.str().isEmpty()){ + edtAutoReply->setPlainText(m_data->AutoReply.str()); + }else{ + edtAutoReply->hide(); + } + + int current = 0; + QString text; + ProtocolPtr proto = ICQPlugin::icq_plugin->m_aim; + AIMProtocol* aim = static_cast(proto.data()); + for (const CommandDef *cmd = aim->statusList(); cmd->id; cmd++){ + if (cmd->flags & COMMAND_CHECK_STATE) + continue; + if (status == cmd->id){ + current = cmbStatus->count(); + text = cmd->text; + } + cmbStatus->addItem(Pict(cmd->icon), i18n(cmd->text)); + } + + cmbStatus->setCurrentIndex(current); + disableWidget(cmbStatus); + if (status == STATUS_OFFLINE){ + lblOnline->setText(i18n("Last online") + ':'); + edtOnline->setText(formatDateTime(QDateTime::fromTime_t(data->StatusTime.toULong()))); + lblNA->hide(); + edtNA->hide(); + }else{ + if (data->OnlineTime.toULong()){ + edtOnline->setText(formatDateTime(QDateTime::fromTime_t(data->OnlineTime.toULong()))); + }else{ + lblOnline->hide(); + edtOnline->hide(); + } + if ((status == STATUS_ONLINE) || text.isEmpty()){ + lblNA->hide(); + edtNA->hide(); + }else{ + lblNA->setText(i18n(text)); + edtNA->setText(formatDateTime(QDateTime::fromTime_t(data->StatusTime.toULong()))); + } + } + if (data->IP.ip()){ + edtExtIP->setText(formatAddr(data->IP, data->Port.toULong())); + }else{ + lblExtIP->hide(); + edtExtIP->hide(); + } + if (data->RealIP.ip() && ((data->IP.ip() == NULL) || (get_ip(data->IP) != get_ip(data->RealIP)))){ + edtIntIP->setText(formatAddr(data->RealIP, data->Port.toULong())); + }else{ + lblIntIP->hide(); + edtIntIP->hide(); + } + if (m_data){ + QString client_name = m_client->clientName(data); + if (client_name.length()){ + edtClient->setText(client_name); + }else{ + lblClient->hide(); + edtClient->hide(); + } + }else{ + QString name = PACKAGE; + name += ' '; + name += VERSION; +#ifdef WIN32 + name += "/win32"; +#endif + edtClient->setText(name); + } +} + diff --git a/plugins/icq/aiminfo.h b/plugins/icq/aiminfo.h new file mode 100644 index 0000000..0969a2e --- /dev/null +++ b/plugins/icq/aiminfo.h @@ -0,0 +1,44 @@ +/*************************************************************************** + aiminfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _AIMINFO_H +#define _AIMINFO_H + +#include "ui_aiminfobase.h" +#include "event.h" + +class ICQClient; +struct ICQUserData; + +class AIMInfo : public QWidget, public Ui::AIMInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + AIMInfo(QWidget *parent, ICQUserData*, unsigned contact, ICQClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + ICQUserData *m_data; + unsigned m_contact; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/aiminfobase.ui b/plugins/icq/aiminfobase.ui new file mode 100644 index 0000000..4bd9791 --- /dev/null +++ b/plugins/icq/aiminfobase.ui @@ -0,0 +1,430 @@ + + + AIMInfo + + + + 0 + 0 + 477 + 344 + + + + Form1 + + + + 6 + + + 11 + + + + + + &Profile + + + + 11 + + + 6 + + + + + First Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Last Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Middle: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Maiden: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Nick: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Street: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + City: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + State: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Zip: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Country: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + 6 + + + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + ScreenName: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &Status + + + + 11 + + + 6 + + + + + + + + + + + Online: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + External IP: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + + Client: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Status: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Internal IP: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + + + TabWidget3 + edtScreen + edtFirst + edtLast + edtMiddle + edtMaiden + edtNick + edtStreet + edtCity + edtState + edtZip + cmbCountry + edtClient + edtIntIP + edtOnline + edtExtIP + edtNA + cmbStatus + + + + diff --git a/plugins/icq/aimsearch.cpp b/plugins/icq/aimsearch.cpp new file mode 100644 index 0000000..f89e446 --- /dev/null +++ b/plugins/icq/aimsearch.cpp @@ -0,0 +1,36 @@ +/*************************************************************************** + aimsearch.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "misc.h" + +#include "aimsearch.h" +#include + +using namespace SIM; + +AIMSearch::AIMSearch() : QWidget(NULL) +{ + setupUi(this); + initCombo(cmbCountry, 0, getCountries(), true, getCountryCodes()); +} + +void AIMSearch::showEvent(QShowEvent *e) +{ + QWidget::showEvent(e); + emit enableOptions(false); +} + diff --git a/plugins/icq/aimsearch.h b/plugins/icq/aimsearch.h new file mode 100644 index 0000000..50d8a10 --- /dev/null +++ b/plugins/icq/aimsearch.h @@ -0,0 +1,36 @@ +/*************************************************************************** + aimsearch.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _AIMSEARCH_H +#define _AIMSEARCH_H + +#include "ui_aimsearchbase.h" +#include + +class AIMSearch : public QWidget, public Ui::AIMSearch +{ + Q_OBJECT +public: + AIMSearch(); +signals: + void enableOptions(bool); +protected: + void showEvent(QShowEvent*); +}; + +#endif + diff --git a/plugins/icq/aimsearchbase.ui b/plugins/icq/aimsearchbase.ui new file mode 100644 index 0000000..63f6af9 --- /dev/null +++ b/plugins/icq/aimsearchbase.ui @@ -0,0 +1,221 @@ + + + AIMSearch + + + + 0 + 0 + 477 + 383 + + + + Form1 + + + + 6 + + + 0 + + + + + Names + + + + + + First: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Last: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Middle: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Maiden: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Nick: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Location + + + + + + Country: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + State: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + City: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Zip: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Street: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + diff --git a/plugins/icq/aimservices.cpp b/plugins/icq/aimservices.cpp new file mode 100644 index 0000000..335ade7 --- /dev/null +++ b/plugins/icq/aimservices.cpp @@ -0,0 +1,430 @@ +/*************************************************************************** + services.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "log.h" + +#include "icqclient.h" + +#include + +using namespace std; +using namespace SIM; + +ServiceSocket::ServiceSocket(ICQClient *client, unsigned short id) + : m_client( client ) + , m_id ( id) + , m_socket( NULL) + , m_bConnected( false) + +{ + m_client->m_snacService->addService(this); +} + +ServiceSocket::~ServiceSocket() +{ + m_client->m_snacService->deleteService(this); + delete m_socket; +} + +void ServiceSocket::connect(const char *addr, unsigned short port, const QByteArray &cookie) +{ + log(L_DEBUG, "%s: connect to %s:%d ", serviceSocketName(), addr, port); + m_cookie = cookie; + if (m_socket != NULL) + { + m_socket->close(); + delete m_socket; + } + m_socket = new ICQClientSocket(this); + m_socket->connect(addr, port, m_client); +} + +void ServiceSocket::close() +{ + log(L_DEBUG, "%s: close()", serviceSocketName()); + m_socket->close(); +} + +bool ServiceSocket::error_state(const QString &err, unsigned) +{ + log(L_DEBUG, "%s: Service error %s", serviceSocketName(), qPrintable(err)); + return true; +} + +void ServiceSocket::connect_ready() +{ + log(L_DEBUG, "%s: connect_ready()", serviceSocketName()); + OscarSocket::connect_ready(); +} + +void ServiceSocket::packet_ready() +{ + log(L_DEBUG, "%s: packet_ready()", serviceSocketName()); + OscarSocket::packet_ready(); +} + +void ServiceSocket::packet(unsigned long size) //Fixme: Unsed Parameter size +{ + EventLog::log_packet(m_socket->readBuffer(), false,ICQPlugin::icq_plugin->OscarPacket); + switch (m_nChannel) + { + case ICQ_CHNxNEW: + flap(ICQ_CHNxNEW); + m_socket->writeBuffer() << 0x00000001L; + m_socket->writeBuffer().tlv(6, m_cookie.data(), (unsigned short)(m_cookie.size())); + m_cookie.resize(0); + sendPacket(); + break; + case ICQ_CHNxDATA: + unsigned short food, type; + unsigned short flags, seq, cmd; + m_socket->readBuffer() >> food >> type >> flags >> seq >> cmd; + if (flags & 0x8000) + { // some unknown data before real snac data + // just read the length and forget it ;-) + unsigned short unknown_length = 0; + m_socket->readBuffer() >> unknown_length; + m_socket->readBuffer().incReadPos(unknown_length); + } + // now just take a look at the type because 0x0001 == error + // in all foodgroups + if (type == 0x0001) + { + unsigned short err_code; + m_socket->readBuffer() >> err_code; + log(L_DEBUG,"%s: Error! foodgroup: %04X reason", serviceSocketName(), food); + // now decrease for icqicmb & icqvarious + m_socket->readBuffer().decReadPos(sizeof(unsigned short)); + } + data(food, type, seq); + break; + default: + log(L_ERROR, "%s: Unknown channel %u", serviceSocketName(), m_nChannel & 0xFF); + } + m_socket->readBuffer().init(6); + m_socket->readBuffer().packetStart(); + m_bHeader = true; +} + +const unsigned short USER_DIRECTORY_SERVICE = 0x000F; + +const unsigned short USER_DIRECTORY_SEARCH = 0x0002; +const unsigned short USER_DIRECTORY_RESULT = 0x0003; + +const unsigned short SNACxSRV_CLIENTxREADY = 0x0002; +const unsigned short SNACxSRV_READYxSERVER = 0x0003; +const unsigned short SNACxSRV_REQxRATExINFO = 0x0006; +const unsigned short SNACxSRV_RATExINFO = 0x0007; +const unsigned short SNACxSRV_RATExACK = 0x0008; +const unsigned short SNACxSRV_I_AM_ICQ = 0x0017; +const unsigned short SNACxSRV_ACK_ICQ = 0x0018; + +typedef QMap REQUEST_MAP; +typedef QMap SEQ_MAP; + +class SearchSocket : public ServiceSocket +{ +public: + SearchSocket(ICQClient*); + unsigned short add(const QStringList &str); +protected: + virtual const char *serviceSocketName() { return "SearchSocket"; } + void data(unsigned short food, unsigned short type, unsigned short seq); + void snac_service(unsigned short type); + void snac_search(unsigned short type, unsigned short seq); + void process(); + void addTlv(unsigned short n, const QString&, bool); + REQUEST_MAP m_requests; + SEQ_MAP m_seq; + unsigned short m_id; +}; + +SearchSocket::SearchSocket(ICQClient *client) + : ServiceSocket(client, USER_DIRECTORY_SERVICE) +{ + m_id = 0; +} + +static bool bLatin1(const QString &s) +{ + for (int i = 0; i < (int)(s.length()); i++) + { + if (s[i].unicode() > 0x7F) + return false; + } + return true; +} + +void SearchSocket::addTlv(unsigned short n, const QString &s, bool bLatin) +{ + QByteArray str; + if (bLatin) + str = s.toLatin1(); + else + str = s.toUtf8(); + m_socket->writeBuffer().tlv(n, str.data()); +} + +void SearchSocket::process() +{ + if (!connected()) + return; + for (REQUEST_MAP::iterator it = m_requests.begin(); it != m_requests.end(); ++it){ + snac(USER_DIRECTORY_SERVICE, USER_DIRECTORY_SEARCH, true); + bool bLatin; + if (!it->count() == 0) + continue; + if (!it->count() == 1) + { + QStringList sl = (*it); + QString mail = sl[0]; + bLatin = bLatin1(mail); + m_socket->writeBuffer().tlv(0x1C, bLatin ? "us-ascii" : "utf8"); + m_socket->writeBuffer().tlv(0x0A, (unsigned short)1); + addTlv(0x05, mail, bLatin); + } + else + { + QStringList sl = (*it); + bLatin = bLatin1(sl[0]) && + bLatin1(sl[1]) && + bLatin1(sl[2]) && + bLatin1(sl[3]) && + bLatin1(sl[4]) && + bLatin1(sl[5]) && + bLatin1(sl[6]) && + bLatin1(sl[7]) && + bLatin1(sl[8]) && + bLatin1(sl[9]); + m_socket->writeBuffer().tlv(0x1C, bLatin ? "us-ascii" : "utf8"); + m_socket->writeBuffer().tlv(0x0A, (unsigned short)0); + if (!sl[0].isEmpty()) + addTlv(0x01, sl[0], bLatin); + if (!sl[1].isEmpty()) + addTlv(0x02, sl[1], bLatin); + if (!sl[2].isEmpty()) + addTlv(0x03, sl[2], bLatin); + if (!sl[3].isEmpty()) + addTlv(0x04, sl[3], bLatin); + if (!sl[4].isEmpty()) + addTlv(0x06, sl[4], bLatin); + if (!sl[5].isEmpty()) + addTlv(0x07, sl[5], bLatin); + if (!sl[6].isEmpty()) + addTlv(0x08, sl[6], bLatin); + if (!sl[7].isEmpty()) + addTlv(0x0C, sl[7], bLatin); + if (!sl[8].isEmpty()) + addTlv(0x0D, sl[8], bLatin); + if (!sl[9].isEmpty()) + addTlv(0x21, sl[9], bLatin); + } + sendPacket(); + m_seq.insert(m_nMsgSequence, it.key()); + } + m_requests.clear(); +} + +unsigned short SearchSocket::add(const QStringList &name) +{ + m_requests.insert(++m_id, name); + process(); + return m_id; +} + +void SearchSocket::data(unsigned short food, unsigned short type, unsigned short seq) +{ + switch (food) + { + case ICQ_SNACxFOOD_SERVICE: + snac_service(type); + break; + case USER_DIRECTORY_SERVICE: + snac_search(type, seq); + break; + default: + log(L_WARN, "Unknown foodgroup %04X", food); + } +} + +void SearchSocket::snac_service(unsigned short type) +{ + switch (type){ + case SNACxSRV_READYxSERVER: + snac(ICQ_SNACxFOOD_SERVICE, SNACxSRV_I_AM_ICQ); + m_socket->writeBuffer() << 0x00010004L << 0x000F0001L; + sendPacket(); + break; + case SNACxSRV_ACK_ICQ: + snac(ICQ_SNACxFOOD_SERVICE, SNACxSRV_REQxRATExINFO); + sendPacket(); + break; + case SNACxSRV_RATExINFO: + snac(ICQ_SNACxFOOD_SERVICE, SNACxSRV_RATExACK); + m_socket->writeBuffer() << 0x00010002L << 0x00030004L << 0x0005; + sendPacket(); + snac(ICQ_SNACxFOOD_SERVICE, SNACxSRV_CLIENTxREADY); + m_socket->writeBuffer() << 0x00010003L << 0x00100739L << 0x000F0001L << 0x00100739L; + sendPacket(); + m_bConnected = true; + process(); + break; + default: + log(L_DEBUG, "Unknown service type %u", type); + } +} + +void SearchSocket::snac_search(unsigned short type, unsigned short seq) +{ + SEQ_MAP::iterator it; + switch (type){ + case USER_DIRECTORY_RESULT: + it = m_seq.find(seq); + if (it == m_seq.end()) + log(L_WARN, "Bad sequence in search answer"); + else + { + unsigned short r; + unsigned long nSearch; + m_socket->readBuffer() >> r >> nSearch; + + SearchResult res; + res.id = (*it); + res.client = m_client; + for (unsigned n = 0; n < nSearch; n++) + { + unsigned short nTlvs; + m_socket->readBuffer() >> nTlvs; + TlvList tlvs(m_socket->readBuffer(), nTlvs); + Tlv *tlv = tlvs(0x09); + if (tlv) + { + load_data(ICQProtocol::icqUserData, &res.data, NULL); + res.data.Screen.str() = tlv->Data(); // utf8 ? + tlv = tlvs(0x01); + if (tlv) + { + QString str = ICQClient::convert(tlv, tlvs, 0x1C); + res.data.FirstName.str() = str; + } + tlv = tlvs(0x02); + if (tlv) + { + QString str = ICQClient::convert(tlv, tlvs, 0x1C); + res.data.LastName.str() = str; + } + tlv = tlvs(0x03); + if (tlv) + { + QString str = ICQClient::convert(tlv, tlvs, 0x1C); + res.data.MiddleName.str() = str; + } + tlv = tlvs(0x07); + if (tlv){ + QString str = ICQClient::convert(tlv, tlvs, 0x1C); + res.data.Address.str() = str; + } + tlv = tlvs(0x08); + if (tlv) + { + QString str = ICQClient::convert(tlv, tlvs, 0x1C); + res.data.City.str() = str; + } + tlv = tlvs(0x0C); + if (tlv) + { + QString str = ICQClient::convert(tlv, tlvs, 0x1C); + res.data.Nick.str() = str; + } + tlv = tlvs(0x07); + if (tlv) + { + QString str = ICQClient::convert(tlv, tlvs, 0x1C); + res.data.State.str() = str; + } + tlv = tlvs(0x06); + if (tlv) + { + QString country_text; + country_text = QString::fromLatin1(tlv->Data()); + country_text = country_text.toLower(); + for (const ext_info *info = getCountryCodes(); info->szName; ++info) + { + if (country_text != info->szName) + continue; + + res.data.Country.asULong() = info->nCode; + break; + } + } + EventSearch(&res).process(); + free_data(ICQProtocol::icqUserData, &res.data); + } + } + if (r != 6) + { + load_data(ICQProtocol::icqUserData, &res.data, NULL); + EventSearchDone(&res).process(); + free_data(ICQProtocol::icqUserData, &res.data); + m_seq.erase(it); + } + } + break; + default: + log(L_WARN, "Unknown search foodgroup type %04X", type); + } +} + +unsigned short ICQClient::aimEMailSearch(const QString &name) +{ + SearchSocket *s = static_cast(m_snacService->getService(USER_DIRECTORY_SERVICE)); + if (s == NULL) + { + s = new SearchSocket(this); + snacService()->requestService(s); + } + QStringList sl; + sl.append(name); + return s->add(sl); +} + +unsigned short ICQClient::aimInfoSearch(const QString &first, const QString &last, const QString &middle, + const QString &maiden, const QString &country, const QString &street, + const QString &city, const QString &nick, const QString &zip, + const QString &state) +{ + SearchSocket *s = static_cast(m_snacService->getService(USER_DIRECTORY_SERVICE)); + if(s == NULL) + { + s = new SearchSocket(this); + snacService()->requestService(s); + } + QStringList info; + + info.append(first); + info.append(last); + info.append(middle); + info.append(maiden); + info.append(country); + info.append(street); + info.append(city); + info.append(nick); + info.append(zip); + info.append(state); + return s->add(info); +} + diff --git a/plugins/icq/configure.in.in b/plugins/icq/configure.in.in new file mode 100644 index 0000000..fdbdd84 --- /dev/null +++ b/plugins/icq/configure.in.in @@ -0,0 +1,5 @@ +if test "$have_ssl" != yes; then + AC_MSG_WARN([OpenSSL library disabled. ICQ plugin is disabled]) +fi +AM_CONDITIONAL(ENABLE_ICQ, test "$have_ssl" = "yes") + diff --git a/plugins/icq/encodingdlg.cpp b/plugins/icq/encodingdlg.cpp new file mode 100644 index 0000000..8e431bd --- /dev/null +++ b/plugins/icq/encodingdlg.cpp @@ -0,0 +1,92 @@ +/*************************************************************************** + encodingdlg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "encodingdlg.h" +#include "icqclient.h" +#include "contacts/contact.h" + +#include +#include +#include + +using namespace SIM; + +class ICQClient; + +EncodingDlg::EncodingDlg(QWidget *parent, ICQClient *client) + : QDialog(parent) +{ + setupUi(this); + setModal(true); + SET_WNDPROC("encoding") + setWindowIcon(Icon("encoding")); + setButtonsPict(this); + setWindowTitle(windowTitle()); + m_client = client; + connect(buttonOk, SIGNAL(clicked()), this, SLOT(apply())); + connect(cmbEncoding, SIGNAL(activated(int)), this, SLOT(changed(int))); + cmbEncoding->addItem(QString()); + const ENCODING *e = getContacts()->getEncodings(); + for (e++; e->language; e++){ + if (!e->bMain) + continue; + cmbEncoding->addItem(i18n(e->language) + " (" + e->codec + ')'); + } + for (e = getContacts()->getEncodings(); e->language; e++){ + if (e->bMain) + continue; + cmbEncoding->addItem(i18n(e->language) + " (" + e->codec + ')'); + } + buttonOk->setEnabled(false); +} + +void EncodingDlg::apply() +{ + // Subtract 1 to account for the first menu item which is empty + int n = cmbEncoding->currentIndex(); + + if (n == 0) + return; // User selected the empty menu item + + const ENCODING *e; + for (e = getContacts()->getEncodings() + 1; e->language; e++){ + if (!e->bMain) + continue; + --n; + if (n == 0){ + getContacts()->owner()->setEncoding(e->codec); + return; + } + } + + for (e = getContacts()->getEncodings(); e->language; e++){ + if (!e->bMain) + continue; + --n; + if (n == 0){ + getContacts()->owner()->setEncoding(e->codec); + return; + } + } +} + +void EncodingDlg::changed(int n) +{ + buttonOk->setEnabled(n > 0); +} + diff --git a/plugins/icq/encodingdlg.h b/plugins/icq/encodingdlg.h new file mode 100644 index 0000000..44a9f50 --- /dev/null +++ b/plugins/icq/encodingdlg.h @@ -0,0 +1,38 @@ +/*************************************************************************** + encodingdlg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ENCODINGDLG_H +#define _ENCODINGDLG_H + +#include "ui_encodingdlgbase.h" + +class ICQClient; + +class EncodingDlg : public QDialog, public Ui::EncodingDlgBase +{ + Q_OBJECT +public: + EncodingDlg(QWidget *parent, ICQClient *m_client); +public slots: + void apply(); + void changed(int); +protected: + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/encodingdlgbase.ui b/plugins/icq/encodingdlgbase.ui new file mode 100644 index 0000000..7693da3 --- /dev/null +++ b/plugins/icq/encodingdlgbase.ui @@ -0,0 +1,126 @@ + + + + + EncodingDlgBase + + + + 0 + 0 + 311 + 180 + + + + Choose default encoding + + + true + + + + 11 + + + 6 + + + + + + 1 + 7 + + + + Your current system encoding (UTF-8) may cause problems saving your personal information and reading offline messages from other users. + + + Qt::AlignCenter + + + true + + + + + + + You will choose the coding by default which want to use: + + + false + + + + + + + + + + 0 + + + 6 + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + qPixmapFromMimeSource + + + buttonOk + clicked() + EncodingDlg + accept() + + + buttonCancel + clicked() + EncodingDlg + reject() + + + diff --git a/plugins/icq/homeinfo.cpp b/plugins/icq/homeinfo.cpp new file mode 100644 index 0000000..80f5b39 --- /dev/null +++ b/plugins/icq/homeinfo.cpp @@ -0,0 +1,134 @@ +/*************************************************************************** + homeinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "homeinfo.h" +#include "icqclient.h" +#include "log.h" +#include "contacts/contact.h" + +#include +#include +#include + +using namespace SIM; + +HomeInfo::HomeInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client) : QWidget(parent) +{ + setupUi(this); + m_data = data; + m_client = client; + m_contact = contact; + if (m_data){ + edtAddress->setReadOnly(true); + edtCity->setReadOnly(true); + edtState->setReadOnly(true); + edtZip->setReadOnly(true); + disableWidget(cmbCountry); + disableWidget(cmbZone); + } + fill(); + btnWebLocation->setText(i18n("map")); + connect(btnWebLocation, SIGNAL(clicked()), this, SLOT(goUrl())); +} + +void HomeInfo::apply() +{ +} + +void HomeInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->Address.str() = edtAddress->toPlainText(); + data->City.str() = edtCity->text(); + data->State.str() = edtState->text(); + data->Zip.str() = edtZip->text(); + data->Country.asULong() = getComboValue(cmbCountry, getCountries()); +} + +bool HomeInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +static QString formatTime(char n) +{ + QString res; + res.sprintf("%+i:%02u", -n/2, (n & 1) * 30); + return res; +} + +static void initTZCombo(QComboBox *cmb, char tz) +{ + if (tz < -24) + tz = 0; + if (tz > 24) + tz = 0; + if (cmb->isEnabled()){ + unsigned nSel = 12; + unsigned n = 0; + for (char i = 24; i >= -24; i--, n++){ + cmb->addItem(formatTime(i)); + if (i == tz) nSel = n; + } + cmb->setCurrentIndex(nSel); + }else{ + cmb->addItem(formatTime(tz)); + } +} + +void HomeInfo::fill() +{ + ICQUserData *data = m_data; + if (data == NULL) + data = &m_client->data.owner; + edtAddress->setPlainText(data->Address.str()); + edtCity->setText(data->City.str()); + edtState->setText(data->State.str()); + edtZip->setText(data->Zip.str()); + initCombo(cmbCountry, data->Country.toULong(), getCountries()); + initTZCombo(cmbZone, data->TimeZone.toULong()); +} + +void HomeInfo::goUrl() +{ + ICQUserData *data = m_data; + if (data == NULL) + data = &m_client->data.owner; + QString url = QString("http://www.mapquest.com/maps/map.adp?city=%1&state=%2&country=%3&zip=%4") + .arg(edtCity->text()) + .arg(edtState->text()) + .arg(cmbCountry->currentText()) + .arg(edtZip->text()); + EventGoURL e(url); + e.process(); +} + diff --git a/plugins/icq/homeinfo.h b/plugins/icq/homeinfo.h new file mode 100644 index 0000000..a8b9c43 --- /dev/null +++ b/plugins/icq/homeinfo.h @@ -0,0 +1,47 @@ +/*************************************************************************** + homeinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _HOMEINFO_H +#define _HOMEINFO_H + +#include "contacts.h" +#include "event.h" + +#include "ui_homeinfobase.h" + +class ICQClient; +struct ICQUserData; + +class HomeInfo : public QWidget, public Ui::HomeInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + HomeInfo(QWidget *parent, ICQUserData*, unsigned contact, ICQClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); + void goUrl(); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + ICQUserData *m_data; + unsigned m_contact; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/homeinfobase.ui b/plugins/icq/homeinfobase.ui new file mode 100644 index 0000000..e2819a6 --- /dev/null +++ b/plugins/icq/homeinfobase.ui @@ -0,0 +1,242 @@ + + + HomeInfo + + + + 0 + 0 + 407 + 315 + + + + Form1 + + + + 6 + + + 11 + + + + + + &Home info + + + + 6 + + + 11 + + + + + 0 + + + 6 + + + + + + + + State: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Address: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + 6 + + + 0 + + + + + + + + Country: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + City: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Zip code: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + 0 + 5 + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + 6 + + + 0 + + + + + Time zone: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + + edtCity + edtState + edtZip + cmbCountry + cmbZone + TabWidget2 + + + + diff --git a/plugins/icq/icq.cpp b/plugins/icq/icq.cpp new file mode 100644 index 0000000..5863651 --- /dev/null +++ b/plugins/icq/icq.cpp @@ -0,0 +1,439 @@ +/*************************************************************************** + icq.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icq.h" +#include "icqconfig.h" +#include "core.h" +#include "log.h" +#include "clientmanager.h" +#include "icons.h" + +#include "contacts/protocolmanager.h" + +using namespace SIM; + +Plugin *createICQPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new ICQPlugin(base); + return plugin; +} + +static PluginInfo info = + { + NULL, + NULL, + VERSION, + createICQPlugin, + PLUGIN_PROTOCOL + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +ICQProtocol::ICQProtocol(Plugin *plugin) + : Protocol(plugin) +{ + initStatuses(); +} + +ICQProtocol::~ICQProtocol() +{ +} + +ClientPtr ICQProtocol::createClient(Buffer *cfg) +{ + ClientPtr icq = ClientPtr(new ICQClient(this, cfg, false)); + getClientManager()->addClient(icq); + return icq; +} + +QStringList ICQProtocol::statuses() +{ + QStringList list; + foreach(const ICQStatusPtr& status, m_statuses) { + list.append(status->id()); + } + return list; +} + +void ICQProtocol::initStatuses() +{ + m_statuses.clear(); + addStatus(ICQStatusPtr(new ICQStatus("online", "Online", true, "", Icon("ICQ_online")))); + addStatus(ICQStatusPtr(new ICQStatus("away", "Away", true, "", Icon("ICQ_away")))); + addStatus(ICQStatusPtr(new ICQStatus("n/a", "N/A", true, "", Icon("ICQ_na")))); + addStatus(ICQStatusPtr(new ICQStatus("dnd", "Do not disturb", true, "", Icon("ICQ_dnd")))); + addStatus(ICQStatusPtr(new ICQStatus("occupied", "Occupied", true, "", Icon("ICQ_occupied")))); + addStatus(ICQStatusPtr(new ICQStatus("free_for_chat", "Free for chat", true, "", Icon("ICQ_ffc")))); + addStatus(ICQStatusPtr(new ICQStatus("offline", "Offline", true, "", Icon("ICQ_offline")))); +} + +void ICQProtocol::addStatus(ICQStatusPtr status) +{ + m_statuses.append(status); +} + +SIM::IMStatusPtr ICQProtocol::status(const QString& id) +{ + foreach(const ICQStatusPtr& status, m_statuses) { + if(status->id() == id) { + return status; + } + } + + return SIM::IMStatusPtr(); +} + +static CommandDef icq_descr = + CommandDef ( + 0, + I18N_NOOP("ICQ"), + "ICQ_online", + "ICQ_invisible", + "http://www.icq.com/password/", + 0, + 0, + 0, + 0, + 0, + PROTOCOL_INFO | PROTOCOL_SEARCH | PROTOCOL_INVISIBLE | PROTOCOL_AR_USER | PROTOCOL_ANY_PORT | PROTOCOL_NODATA, + NULL, + QString::null + ); + +const CommandDef *ICQProtocol::description() +{ + return &icq_descr; +} + +static CommandDef icq_status_list[] = + { + CommandDef ( + STATUS_ONLINE, + I18N_NOOP("Online"), + "ICQ_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_AWAY, + I18N_NOOP("Away"), + "ICQ_away", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_NA, + I18N_NOOP("N/A"), + "ICQ_na", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_DND, + I18N_NOOP("Do not Disturb"), + "ICQ_dnd", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_OCCUPIED, + I18N_NOOP("Occupied"), + "ICQ_occupied", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_FFC, + I18N_NOOP("Free for chat"), + "ICQ_ffc", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_OFFLINE, + I18N_NOOP("Offline"), + "ICQ_offline", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef () + }; + +const CommandDef *ICQProtocol::statusList() +{ + return icq_status_list; +} + +const CommandDef *ICQProtocol::_statusList() +{ + return icq_status_list; +} + +AIMProtocol::AIMProtocol(Plugin *plugin) + : Protocol(plugin) +{ +} + +AIMProtocol::~AIMProtocol() +{ +} + +QStringList AIMProtocol::statuses() +{ + // TODO + return QStringList(); +} + +SIM::IMStatusPtr AIMProtocol::status(const QString& /*id*/) +{ + // TODO + return SIM::IMStatusPtr(); +} + +ClientPtr AIMProtocol::createClient(Buffer *cfg) +{ + ClientPtr aim = ClientPtr(new ICQClient(this, cfg, true)); + getClientManager()->addClient(aim); + return aim; +} + +static CommandDef aim_descr = + CommandDef ( + 0, + I18N_NOOP("AIM"), + "AIM_online", + QString::null, + "http://www.aim.com/help_faq/forgot_password/password.adp", + 0, + 0, + 0, + 0, + 0, + PROTOCOL_INFO | PROTOCOL_AR | PROTOCOL_ANY_PORT, + NULL, + QString::null + ); + +const CommandDef *AIMProtocol::description() +{ + return &aim_descr; +} + +static CommandDef aim_status_list[] = + { + CommandDef ( + STATUS_ONLINE, + I18N_NOOP("Online"), + "AIM_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_AWAY, + I18N_NOOP("Away"), + "AIM_away", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_OFFLINE, + I18N_NOOP("Offline"), + "AIM_offline", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef () + }; + +const CommandDef *AIMProtocol::statusList() +{ + return aim_status_list; +} + +//Protocol *ICQPlugin::m_icq = NULL; +//Protocol *ICQPlugin::m_aim = NULL; + +ICQPlugin *ICQPlugin::icq_plugin = NULL; + +ICQPlugin::ICQPlugin(unsigned base) + : Plugin(base) +{ + icq_plugin = this; + + OscarPacket = registerType(); + getContacts()->addPacketType(OscarPacket, "Oscar"); + ICQDirectPacket = registerType(); + getContacts()->addPacketType(ICQDirectPacket, "ICQ.Direct"); + AIMDirectPacket = registerType(); + getContacts()->addPacketType(AIMDirectPacket, "AIM.Direct"); + + m_icq = ProtocolPtr(new ICQProtocol(this)); + getProtocolManager()->addProtocol(m_icq); + m_aim = ProtocolPtr(new AIMProtocol(this)); + getProtocolManager()->addProtocol(m_aim); + + EventMenu(MenuSearchResult, EventMenu::eAdd).process(); + EventMenu(MenuIcqGroups, EventMenu::eAdd).process(); + + Command cmd; + cmd->id = CmdVisibleList; + cmd->text = I18N_NOOP("Visible list"); + cmd->menu_id = MenuContactGroup; + cmd->menu_grp = 0x8010; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdInvisibleList; + cmd->text = I18N_NOOP("Invisible list"); + cmd->menu_grp = 0x8011; + EventCommandCreate(cmd).process(); + + cmd->id = CmdIcqSendMessage; + cmd->text = I18N_NOOP("&Message"); + cmd->icon = "message"; + cmd->menu_id = MenuSearchResult; + cmd->menu_grp = 0x1000; + cmd->bar_id = 0; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdInfo; + cmd->text = I18N_NOOP("User &info"); + cmd->icon = "info"; + cmd->menu_grp = 0x1001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGroups; + cmd->text = I18N_NOOP("&Add to group"); + cmd->icon = QString::null; + cmd->menu_grp = 0x1002; + cmd->popup_id = MenuIcqGroups; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGroups; + cmd->text = "_"; + cmd->menu_id = MenuIcqGroups; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + registerMessages(); + + RetrySendDND = registerType(); + RetrySendOccupied = registerType(); +} + +ICQPlugin::~ICQPlugin() +{ + unregisterMessages(); + getProtocolManager()->removeProtocol(m_aim); + getProtocolManager()->removeProtocol(m_icq); + + getContacts()->removePacketType(OscarPacket); + getContacts()->removePacketType(ICQDirectPacket); + getContacts()->removePacketType(AIMDirectPacket); + + EventCommandRemove(CmdVisibleList).process(); + EventCommandRemove(CmdInvisibleList).process(); + + EventMenu(MenuSearchResult, EventMenu::eRemove).process(); + EventMenu(MenuIcqGroups, EventMenu::eRemove).process(); +} + diff --git a/plugins/icq/icq.h b/plugins/icq/icq.h new file mode 100644 index 0000000..899fcff --- /dev/null +++ b/plugins/icq/icq.h @@ -0,0 +1,95 @@ +/*************************************************************************** + icq.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICQ_H +#define _ICQ_H + +#include "contacts.h" +#include "contacts/client.h" +#include "contacts/imstatus.h" +#include "icqstatus.h" + +class CorePlugin; + +const unsigned IcqCmdBase = 0x00040000; + +#include "icq_events.h" + +const unsigned long CmdVisibleList = IcqCmdBase; +const unsigned long CmdInvisibleList = IcqCmdBase + 1; +const unsigned long CmdGroups = IcqCmdBase + 2; +const unsigned long CmdIcqSendMessage = IcqCmdBase + 5; +const unsigned long CmdShowWarning = IcqCmdBase + 6; +const unsigned long CmdPasswordFail = IcqCmdBase + 7; +const unsigned long CmdPasswordSuccess = IcqCmdBase + 8; + +const unsigned long MenuSearchResult = IcqCmdBase; +const unsigned long MenuIcqGroups = IcqCmdBase + 2; + +class ICQProtocol : public SIM::Protocol +{ +public: + ICQProtocol(SIM::Plugin *plugin); + ~ICQProtocol(); + SIM::ClientPtr createClient(Buffer *cfg); + const SIM::CommandDef *description(); + const SIM::CommandDef *statusList(); + static const SIM::CommandDef *_statusList(); + virtual const SIM::DataDef *userDataDef(); + static const SIM::DataDef *icqUserData; + virtual QStringList statuses(); + virtual SIM::IMStatusPtr status(const QString& id); + +private: + void initStatuses(); + void addStatus(ICQStatusPtr status); + QList m_statuses; +}; + +class AIMProtocol : public SIM::Protocol +{ +public: + AIMProtocol(SIM::Plugin *plugin); + ~AIMProtocol(); + SIM::ClientPtr createClient(Buffer *cfg); + const SIM::CommandDef *description(); + const SIM::CommandDef *statusList(); + virtual const SIM::DataDef *userDataDef(); + static const SIM::DataDef *icqUserData; + virtual QStringList statuses(); + virtual SIM::IMStatusPtr status(const QString& id); +}; + +class ICQPlugin : public SIM::Plugin +{ +public: + ICQPlugin(unsigned base); + virtual ~ICQPlugin(); + unsigned OscarPacket; + unsigned ICQDirectPacket; + unsigned AIMDirectPacket; + unsigned RetrySendDND; + unsigned RetrySendOccupied; + SIM::ProtocolPtr m_icq; + SIM::ProtocolPtr m_aim; + static ICQPlugin *icq_plugin; + void registerMessages(); + void unregisterMessages(); +}; + +#endif + diff --git a/plugins/icq/icq.rc b/plugins/icq/icq.rc new file mode 100644 index 0000000..3368573 --- /dev/null +++ b/plugins/icq/icq.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "ICQ plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "icq\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "icq.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/icq/icq.vcproj b/plugins/icq/icq.vcproj new file mode 100644 index 0000000..bc069c4 --- /dev/null +++ b/plugins/icq/icq.vcproj @@ -0,0 +1,2669 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/icq/icq_events.h b/plugins/icq/icq_events.h new file mode 100644 index 0000000..61ce144 --- /dev/null +++ b/plugins/icq/icq_events.h @@ -0,0 +1,33 @@ +#ifndef _ICQ_EVENTS_H +#define _ICQ_EVENTS_H + +#include "event.h" + +struct SearchResult; + +class EventSearchInternal : public SIM::Event +{ +public: + EventSearchInternal(SIM::SIMEvent e, SearchResult *res) + : Event(e), m_res(res) {} + + SearchResult *searchResult() const { return m_res; } +protected: + SearchResult *m_res; +}; + +class EventSearchDone : public EventSearchInternal +{ +public: + EventSearchDone(SearchResult *res) + : EventSearchInternal(SIM::eEventICQSearchDone, res) {} +}; + +class EventSearch : public EventSearchInternal +{ +public: + EventSearch(SearchResult *res) + : EventSearchInternal(SIM::eEventICQSearch, res) {} +}; + +#endif // _ICQ_EVENTS_H diff --git a/plugins/icq/icq_pch.h b/plugins/icq/icq_pch.h new file mode 100644 index 0000000..bf0acbb --- /dev/null +++ b/plugins/icq/icq_pch.h @@ -0,0 +1,61 @@ +#pragma once + +#include + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef NO_QT_MOC_HEADER +#include +//#include +//#include +#endif + +#include "aboutinfo.h" +#include "advsearch.h" +#include "aimconfig.h" +#include "aiminfo.h" +#include "aimsearch.h" +#include "encodingdlg.h" +#include "homeinfo.h" +#include "icq.h" +#include "icqclient.h" +#include "icqconfig.h" +#include "icqinfo.h" +#include "icqmessage.h" +#include "icqpicture.h" +#include "icqsearch.h" +#include "icqsecure.h" +#include "interestsinfo.h" +#include "moreinfo.h" +#include "pastinfo.h" +#include "polling.h" +#include "securedlg.h" +#include "verifydlg.h" +#include "warndlg.h" +#include "workinfo.h" +#include "xml.h" diff --git a/plugins/icq/icqbos.cpp b/plugins/icq/icqbos.cpp new file mode 100644 index 0000000..ba6cb25 --- /dev/null +++ b/plugins/icq/icqbos.cpp @@ -0,0 +1,46 @@ +/*************************************************************************** + icqbos.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "log.h" + +#include "icqclient.h" + +using namespace SIM; + +const unsigned short ICQ_SNACxBOS_REQUESTxRIGHTS = 0x0002; +const unsigned short ICQ_SNACxBOS_RIGHTSxGRANTED = 0x0003; +const unsigned short ICQ_SNACxBOS_ADDxVISIBLExLIST = 0x0005; +const unsigned short ICQ_SNACxBOS_REMxVISIBLExLIST = 0x0006; +const unsigned short ICQ_SNACxBOS_ADDxINVISIBLExLIST = 0x0007; +const unsigned short ICQ_SNACxBOS_REMxINVISIBLExLIST = 0x0008; + +void ICQClient::snac_bos(unsigned short type, unsigned short) +{ + switch (type){ + case ICQ_SNACxBOS_RIGHTSxGRANTED: + log(L_DEBUG, "BOS rights granted"); + break; + default: + log(L_WARN, "Unknown bos foodgroup type %04X", type); + } +} + +void ICQClient::bosRequest() +{ + snac(ICQ_SNACxFOOD_BOS, ICQ_SNACxBOS_REQUESTxRIGHTS); + sendPacket(true); +} diff --git a/plugins/icq/icqbuddy.cpp b/plugins/icq/icqbuddy.cpp new file mode 100644 index 0000000..5a4ddc7 --- /dev/null +++ b/plugins/icq/icqbuddy.cpp @@ -0,0 +1,640 @@ +/*************************************************************************** + icqbuddy.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icqclient.h" + +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#include +#endif + +#include +#include + +#include "log.h" +#include "icqbuddy.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" + +using namespace SIM; + +const unsigned short ICQ_SNACxBDY_REQUESTxRIGHTS = 0x0002; +const unsigned short ICQ_SNACxBDY_RIGHTSxGRANTED = 0x0003; +const unsigned short ICQ_SNACxBDY_ADDxTOxLIST = 0x0004; +const unsigned short ICQ_SNACxBDY_REMOVExFROMxLIST = 0x0005; +const unsigned short ICQ_SNACxBDY_USERONLINE = 0x000B; +const unsigned short ICQ_SNACxBDY_USEROFFLINE = 0x000C; + +const unsigned short TLV_USER_CLASS = 0x0001; +const unsigned short TLV_USER_SIGNON_TIME = 0x0003; +const unsigned short TLV_USER_MEMBER_SINCE = 0x0005; // not interpreted +const unsigned short TLV_USER_STATUS = 0x0006; +const unsigned short TLV_USER_EXT_IP = 0x000A; +const unsigned short TLV_USER_DC_INFO = 0x000C; +const unsigned short TLV_USER_CAPS = 0x000D; +const unsigned short TLV_USER_ONLINE_TIME = 0x000F; // not interpreted +const unsigned short TLV_USER_TIMES_UPDATED = 0x0011; // ???? +const unsigned short TLV_USER_NEWCAPS = 0x0019; +const unsigned short TLV_USER_BUDDYINFO = 0x001D; + +static QString makeCapStr( const capability cap, unsigned size ) +{ + QString str, tmp; + for(unsigned int i = 0; i < size; i++ ) { + str += tmp.sprintf( "0x%02x ", cap[i] ); + } + return str; +} + + +SnacIcqBuddy::SnacIcqBuddy(ICQClient* client) : SnacHandler(client, 0x0003) +{ +} + +SnacIcqBuddy::~SnacIcqBuddy() +{ +} + +bool SnacIcqBuddy::process(unsigned short subtype, ICQBuffer* buf, unsigned short seq) +{ + switch (subtype) + { + case ICQ_SNACxBDY_RIGHTSxGRANTED: + log(L_DEBUG, "Buddy rights granted"); + break; + case ICQ_SNACxBDY_USEROFFLINE: + { + Contact *contact; + QString screen = buf->unpackScreen(); + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if(!data) + break; + if(data->Status.toULong() != ICQ_STATUS_OFFLINE) + { + m_client->setOffline(data); + StatusMessage *m = new StatusMessage; + m->setContact(contact->id()); + m->setClient(m_client->dataName(data)); + m->setStatus(STATUS_OFFLINE); + m->setFlags(MESSAGE_RECEIVED); + EventMessageReceived e(m); + if(!e.process()) + delete m; + } + else + { + // hack for trillian + EventContact e(contact, EventContact::eOnline); + e.process(); + } + break; + } + case ICQ_SNACxBDY_USERONLINE: + { + Contact *contact; + QString screen = buf->unpackScreen(); + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if(data) + { + bool bChanged = false; + bool bAwayChanged = false; + unsigned long prevStatus = data->Status.toULong(); + + unsigned short level, len; + (*buf) >> level >> len; + data->WarningLevel.asULong() = level; + + TlvList tlv((*buf)); + Tlv* tlvClass = tlv(TLV_USER_CLASS); + if(tlvClass) + { + unsigned short userClass = *tlvClass; + if(userClass != data->Class.toULong()) + { + if ((userClass & CLASS_AWAY) != (data->Class.toULong() & CLASS_AWAY)) + { + data->StatusTime.asULong() = (unsigned long)time(NULL); + bAwayChanged = true; + } + data->Class.asULong() = userClass; + bChanged = true; + } + if(data->Uin.toULong() == 0) + { + if (userClass & CLASS_AWAY) + { + m_client->fetchAwayMessage(data); + } + else + { + data->AutoReply.str() = QString::null; + } + } + } + + // Status TLV + Tlv *tlvStatus = tlv(TLV_USER_STATUS); + if(tlvStatus) + { + uint32_t status = *tlvStatus; + if (status != data->Status.toULong()) + { + data->Status.asULong() = status; + if ((status & 0xFF) == 0) + data->AutoReply.str() = QString::null; + data->StatusTime.asULong() = (unsigned long)time(NULL); + } + } + else if(data->Status.toULong() == ICQ_STATUS_OFFLINE) + { + data->Status.asULong() = ICQ_STATUS_ONLINE; + data->StatusTime.asULong() = (unsigned long)time(NULL); + } + + // Online time TLV + Tlv *tlvOnlineTime = tlv(TLV_USER_SIGNON_TIME); + if(tlvOnlineTime) + { + uint32_t OnlineTime = *tlvOnlineTime; + if(OnlineTime != data->OnlineTime.toULong()) + { + data->OnlineTime.asULong() = OnlineTime; + bChanged = true; + } + } + Tlv *tlvNATime = tlv(0x0004); + if(tlvNATime) + { + unsigned short na_time = *tlvNATime; + unsigned long StatusTime = (unsigned long)time(NULL) - na_time * 60; + if(StatusTime != data->StatusTime.toULong()) + { + data->StatusTime.asULong() = StatusTime; + bChanged = true; + } + } + + // IP TLV + Tlv *tlvIP = tlv(TLV_USER_EXT_IP); + if(tlvIP) + bChanged |= set_ip(&data->IP, htonl((uint32_t)(*tlvIP))); + + // short caps tlv + Tlv *tlvCapShort = tlv(TLV_USER_NEWCAPS); + if(tlvCapShort) + { + data->Caps.asULong() = 0; + data->Caps2.asULong() = 0; + + ICQBuffer info(*tlvCapShort); + + for (; info.readPos() < (unsigned)info.size(); ) + { + unsigned char shortcap[2]; + info.unpack((char*)shortcap, sizeof(shortcap)); + for (unsigned i = 0;; i++) + { + if(!memcmp(&m_client->capabilities[i][2], shortcap, sizeof(shortcap))) + { + m_client->setCap(data, (cap_id_t)i); + break; + } + // we don't go through all caps, only the first ones starting with 0x09 + if (*m_client->capabilities[i] != '\x09') + { + log(L_DEBUG, "%lu unknown cap %s", data->Uin.toULong(), + qPrintable(makeCapStr(shortcap, sizeof(shortcap)))); + break; + } + } + } + } + // normal cap tlv + Tlv *tlvCapability = tlv(TLV_USER_CAPS); + if (tlvCapability) + { + if(!tlvCapShort) + { + data->Caps.asULong() = 0; + data->Caps2.asULong() = 0; + } + ICQBuffer info(*tlvCapability); + for(; info.readPos() < (unsigned)info.size(); ) + { + capability cap; + info.unpack((char*)cap, sizeof(capability)); + for(unsigned i = 0;; i++) + { + unsigned size = sizeof(capability); + if (i == CAP_SIMOLD) + size--; + + if (*m_client->capabilities[i] == 0) + { + log( L_DEBUG, "%lu unknown cap %s", data->Uin.toULong(), qPrintable(makeCapStr( cap, size )) ); + break; + } + if ((i == CAP_MICQ) || (i == CAP_LICQ) || (i == CAP_SIM) || (i == CAP_KOPETE)) + size -= 4; + if ((i == CAP_ANDRQ)) + size -= 7; + if ((i == CAP_MIRANDA)) + size -= 8; + if ((i == CAP_JIMM)) + size -= 11; + + if (i == CAP_ICQJP) + size -= (16 - 4); + + if (!memcmp(cap, m_client->capabilities[i], size)) + { + if (i == CAP_SIMOLD) + { + unsigned char build = cap[sizeof(capability)-1]; + if (build && ((build == 0x92) || (build < (1 << 6)))) continue; + data->Build.asULong() = build; + } + if ((i == CAP_MICQ) || (i == CAP_LICQ) || (i == CAP_SIM) || (i == CAP_KOPETE)) + { + unsigned char *p = (unsigned char*)cap; + p += 12; + data->Build.asULong() = (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]; + } + if ((i == CAP_ANDRQ)) + { + unsigned char *p = (unsigned char*)cap; + p += 9; + data->Build.asULong() = (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]; + } + if ((i == CAP_MIRANDA)) + { + unsigned char *p = (unsigned char*)cap; + p += 8; + data->Build.asULong() = (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]; + } + if ((i == CAP_JIMM)) + { + char *p = (char*)cap; + p += 5; + const QString str = QString::fromAscii(p, 10); + const QStringList sl = str.split('.'); + unsigned char maj = 0, min = 0; + unsigned short rev = 0; + if(sl.count() > 0) + maj = sl[0].toUShort(); + if(sl.count() > 1) + min = sl[1].toUShort(); + if(sl.count() > 2) + rev = sl[2].toUShort(); + + data->Build.asULong() = (maj << 24) + (min << 16) + rev; + } + if (i == CAP_ICQJP) + { + log(L_DEBUG, "%lu ICQJP cap is set", data->Uin.toULong()); + data->Build.asULong() = cap[0x4] << 0x18 | cap[0x5] << 0x10 | + cap[0x6] << 8 | cap[0x7]; + } + m_client->setCap(data, (cap_id_t)i); + break; + } + } + } + } + + // buddy info + Tlv *tlvBuddy = tlv(TLV_USER_BUDDYINFO); + if (tlvBuddy) + { + const QByteArray &ba = data->buddyHash.toBinary(); + unsigned short iconID; + unsigned char iconFlags, hashSize; + ICQBuffer info(*tlvBuddy); + QByteArray hash; + QString fname = m_client->pictureFile(data); + QFileInfo fi(fname); + + info >> iconID >> iconFlags >> hashSize; + hash.resize(hashSize); + info.unpack(hash.data(), hashSize); + if(data->buddyID.toULong() != iconID || + ba != hash || + !fi.exists() || fi.size() == 0) { + data->buddyID.asULong() = iconID; + data->buddyHash.asBinary() = hash; + m_client->requestBuddy(data); + } + } + + unsigned long infoUpdateTime = 0; + unsigned long pluginInfoTime = 0; + unsigned long pluginStatusTime = 0; + + // Direct connection info + Tlv *tlvDirect = tlv(TLV_USER_DC_INFO); + if(tlvDirect) + { + ICQBuffer info(*tlvDirect); + unsigned long realIP; + unsigned short port; + char mode, version, junk; + info >> realIP; + info.incReadPos(2); + info >> port; + if (realIP == 0x7F000001) + realIP = 0; + bChanged |= set_ip(&data->RealIP, htonl(realIP)); + data->Port.asULong() = port; + unsigned long DCcookie; + info >> mode >> junk >> version >> DCcookie; + data->DCcookie.asULong() = DCcookie; + info.incReadPos(8); + info + >> infoUpdateTime + >> pluginInfoTime + >> pluginStatusTime; + if (mode == MODE_DENIED) mode = MODE_INDIRECT; + if ((mode != MODE_DIRECT) && (mode != MODE_INDIRECT)) + mode = MODE_INDIRECT; + data->Mode.asULong() = mode; + data->Version.asULong() = version; + } + + Tlv *tlvPlugin = tlv(0x0011); + if(tlvPlugin && data->Uin.toULong()) + { + ICQBuffer info(*tlvPlugin); + char type; + unsigned long time; + info >> type; + info.unpack(time); + plugin p; + unsigned plugin_index; + unsigned long plugin_status; + switch (type){ + case 1: + m_client->addFullInfoRequest(data->Uin.toULong()); + break; + case 2: + if ((m_client->getInvisible() && data->VisibleId.toULong()) || + (!m_client->getInvisible() && (data->InvisibleId.toULong() == 0))){ + info.incReadPos(6); + info.unpack((char*)p, sizeof(p)); + data->PluginInfoTime.asULong() = time; + for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++) + if (!memcmp(p, m_client->plugins[plugin_index], sizeof(p))) + break; + switch (plugin_index) + { + case PLUGIN_PHONEBOOK: + log(L_DEBUG, "Updated phonebook"); + m_client->addPluginInfoRequest(data->Uin.toULong(), plugin_index); + break; + case PLUGIN_PICTURE: + log(L_DEBUG, "Updated picture"); + // when buddyID -> new avatar support, no need to ask for old picture plugin + if(data->buddyID.toULong() == 0 || data->buddyHash.toBinary().size() != 16) { + data->buddyID.asULong() = 0; + m_client->addPluginInfoRequest(data->Uin.toULong(), plugin_index); + } + break; + case PLUGIN_QUERYxINFO: + log(L_DEBUG, "Updated info plugin list"); + m_client->addPluginInfoRequest(data->Uin.toULong(), plugin_index); + break; + default: + if (plugin_index >= PLUGIN_NULL) + log(L_WARN, "Unknown plugin sign (%04X %04X)", + type, plugin_index); + } + } + break; + case 3: + info.incReadPos(6); + info.unpack((char*)p, sizeof(p)); + info.incReadPos(1); + info.unpack(plugin_status); + data->PluginStatusTime.asULong() = time; + for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++) + if (!memcmp(p, m_client->plugins[plugin_index], sizeof(p))) + break; + switch (plugin_index){ + case PLUGIN_FOLLOWME: + if (data->FollowMe.toULong() == plugin_status) + break; + data->FollowMe.asULong() = plugin_status; + bChanged = true; + break; + case PLUGIN_FILESERVER: + if ((data->SharedFiles.toBool() != 0) == (plugin_status != 0)) + break; + data->SharedFiles.asBool() = (plugin_status != 0); + bChanged = true; + break; + case PLUGIN_ICQPHONE: + if (data->ICQPhone.toULong() == plugin_status) + break; + data->ICQPhone.asULong() = plugin_status; + bChanged = true; + break; + default: + if (plugin_index >= PLUGIN_NULL) + log(L_WARN, "Unknown plugin sign (%04X %04X)", + type, plugin_index); + } + break; + + } + } + else + { + data->InfoUpdateTime.asULong() = infoUpdateTime; + data->PluginInfoTime.asULong() = pluginInfoTime; + data->PluginStatusTime.asULong() = pluginStatusTime; + if (!m_client->getDisableAutoUpdate() && + ((m_client->getInvisible() && data->VisibleId.toULong()) || + (!m_client->getInvisible() && (data->InvisibleId.toULong() == 0)))){ + if (infoUpdateTime == 0) + infoUpdateTime = 1; + if (infoUpdateTime != data->InfoFetchTime.toULong()) + m_client->addFullInfoRequest(data->Uin.toULong()); + if ((data->PluginInfoTime.toULong() != data->PluginInfoFetchTime.toULong())){ + if (data->PluginInfoTime.toULong()) + m_client->addPluginInfoRequest(data->Uin.toULong(), PLUGIN_QUERYxINFO); + } + if ((data->PluginInfoTime.toULong() != data->PluginInfoFetchTime.toULong()) || + (data->PluginStatusTime.toULong() != data->PluginStatusFetchTime.toULong())){ + if (data->SharedFiles.toBool()){ + data->SharedFiles.asBool() = false; + bChanged = true; + } + if (data->FollowMe.toULong()){ + data->FollowMe.asULong() = 0; + bChanged = true; + } + if (data->ICQPhone.toULong()){ + data->ICQPhone.asULong() = 0; + bChanged = true; + } + if (data->PluginStatusTime.toULong()) + m_client->addPluginInfoRequest(data->Uin.toULong(), PLUGIN_QUERYxSTATUS); + } + } + } + if (data->bInvisible.toBool()){ + data->bInvisible.asBool() = false; + bChanged = true; + } + if (bChanged){ + EventContact(contact, EventContact::eChanged).process(); + } + if ((data->Status.toULong() != prevStatus) || bAwayChanged){ + unsigned status = STATUS_OFFLINE; + if ((data->Status.toULong() & 0xFFFF) != ICQ_STATUS_OFFLINE){ + status = STATUS_ONLINE; + if (data->Status.toULong() & ICQ_STATUS_DND){ + status = STATUS_DND; + }else if (data->Status.toULong() & ICQ_STATUS_OCCUPIED){ + status = STATUS_OCCUPIED; + }else if (data->Status.toULong() & ICQ_STATUS_NA){ + status = STATUS_NA; + }else if (data->Status.toULong() & ICQ_STATUS_AWAY){ + status = STATUS_AWAY; + }else if (data->Status.toULong() & ICQ_STATUS_FFC){ + status = STATUS_FFC; + } + } + if((status == STATUS_ONLINE) && (data->Class.toULong() & CLASS_AWAY)) + status = STATUS_AWAY; + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(m_client->dataName(data)); + m->setStatus(status); + m->setFlags(MESSAGE_RECEIVED); + EventMessageReceived e(m); + if(!e.process()) + delete m; + if (!contact->getIgnore() && + ((data->Class.toULong() & CLASS_AWAY) == 0) && + (((data->Status.toULong() & 0xFF) == ICQ_STATUS_ONLINE) && + (((prevStatus & 0xFF) != ICQ_STATUS_ONLINE)) || bAwayChanged) && + (((prevStatus & 0xFFFF) != ICQ_STATUS_OFFLINE) || + (data->OnlineTime.toULong() > m_client->data.owner.OnlineTime.toULong()))){ + EventContact e(contact, EventContact::eOnline); + e.process(); + } + if (!m_client->getDisableAutoReplyUpdate() && ((data->Status.toULong() & 0xFF) != ICQ_STATUS_ONLINE)){ + if ((m_client->getInvisible() && data->VisibleId.toULong()) || + (!m_client->getInvisible() && (data->InvisibleId.toULong() == 0))) + m_client->addPluginInfoRequest(data->Uin.toULong(), PLUGIN_AR); + } + } + } + break; + } + default: + log(L_WARN, "Unknown buddy foodgroup type %04X", subtype); + } + return false; +} + +void ICQClient::buddyRequest() +{ + snac(ICQ_SNACxFOOD_BUDDY, ICQ_SNACxBDY_REQUESTxRIGHTS); + sendPacket(true); +} + +void ICQClient::sendContactList() +{ + buddies.clear(); + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + ClientDataIterator it_data(contact->clientData, this); + ICQUserData *data; + while ((data = toICQUserData(++it_data)) != NULL){ + if (data->IgnoreId.toULong() == 0) + buddies.push_back(screen(data)); + } + } + if (buddies.empty()) + return; + snac(ICQ_SNACxFOOD_BUDDY, ICQ_SNACxBDY_ADDxTOxLIST); + it.reset(); + while ((contact = ++it) != NULL){ + ClientDataIterator it_data(contact->clientData, this); + ICQUserData *data; + while ((data = toICQUserData(++it_data)) != NULL){ + if (data->IgnoreId.toULong() == 0) + socket()->writeBuffer().packScreen(screen(data)); + } + } + sendPacket(true); +} + +void SnacIcqBuddy::addBuddy(Contact *contact) +{ + if (m_client->getState() != ICQClient::Connected) + return; + if (contact->id() == 0) + return; + ICQUserData *data; + ClientDataIterator it_data(contact->clientData, m_client); + while ((data = m_client->toICQUserData(++it_data)) != NULL){ + int it = m_client->buddies.indexOf(m_client->screen(data)); + if (it != -1) + continue; + if ((data->IgnoreId.toULong() == 0) && (data->WaitAuth.toBool() || (data->GrpId.toULong() == 0))){ + m_client->snac(ICQ_SNACxFOOD_BUDDY, ICQ_SNACxBDY_ADDxTOxLIST); + m_client->socket()->writeBuffer().packScreen(m_client->screen(data)); + m_client->sendPacket(true); + m_client->buddies.push_back(m_client->screen(data)); + } + } +} + +void SnacIcqBuddy::removeBuddy(Contact *contact) +{ + if (m_client->getState() != ICQClient::Connected) + return; + if (contact->id() == 0) + return; + ICQUserData *data; + ClientDataIterator it_data(contact->clientData, m_client); + while ((data = m_client->toICQUserData(++it_data)) != NULL){ + int it = m_client->buddies.indexOf(m_client->screen(data)); + if (it == -1) + continue; + if(data->WantAuth.toBool()) + { + Message *msg = new Message; + msg->setText(i18n("removed from buddy list")); + m_client->sendAuthRefused(msg, data); + } + m_client->snac(ICQ_SNACxFOOD_BUDDY, ICQ_SNACxBDY_REMOVExFROMxLIST); + m_client->socket()->writeBuffer().packScreen(m_client->screen(data)); + m_client->sendPacket(true); + m_client->buddies.removeAt(it); + } +} + diff --git a/plugins/icq/icqbuddy.h b/plugins/icq/icqbuddy.h new file mode 100644 index 0000000..1567b24 --- /dev/null +++ b/plugins/icq/icqbuddy.h @@ -0,0 +1,20 @@ + +#ifndef _ICQBUDDY_H +#define _ICQBUDDY_H + +#include "snac.h" +#include "contacts.h" + +class ICQClient; +class SnacIcqBuddy : public SnacHandler +{ +public: + SnacIcqBuddy(ICQClient* client); + virtual ~SnacIcqBuddy(); + + virtual bool process(unsigned short subtype, ICQBuffer* buf, unsigned short seq); + void addBuddy(SIM::Contact *contact); + void removeBuddy(SIM::Contact *contact); +}; + +#endif diff --git a/plugins/icq/icqbuffer.cpp b/plugins/icq/icqbuffer.cpp new file mode 100644 index 0000000..28e19fc --- /dev/null +++ b/plugins/icq/icqbuffer.cpp @@ -0,0 +1,539 @@ +/*************************************************************************** + msnfiltetransfer.cpp - description + ------------------- + begin : Fri Jan 05 2007 + copyright : (C) 2007 Christian Ehrlicher + email : ch.ehrlicher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifdef WIN32 +#include +#else +#include +#include +#include +#include +#include +#endif + +#include "simapi.h" +#include "log.h" + +#include "icqbuffer.h" +#include + +using namespace SIM; + +// FIXME: move into own file +#ifdef WORDS_BIGENDIAN +# define SWAP_S(s) s = ((s&0xFF)<<8) + ((s&0xFF00)>>8); +# define SWAP_L(s) s = ((s&0xFF)<<24) + ((s&0xFF00)<<8) + ((s&0xFF0000)>>8) + ((s&0xFF000000)>>24); +#else +# define SWAP_S(s) +# define SWAP_L(s) +#endif +// Tlv +Tlv::Tlv(unsigned short num, unsigned short size, const char *data) + : m_nNum(num), m_nSize(size) +{ + m_data.resize(m_nSize + 1); + memcpy(m_data.data(), data, m_nSize); + m_data[(int)m_nSize] = 0; +} +Tlv::Tlv(unsigned short num, QByteArray& array) : m_nNum(num), m_nSize(array.size()) +{ + m_data = array; +} + +Tlv::operator uint16_t () const +{ + return (m_nSize >= 2) ? htons(*((uint16_t*)m_data.data())) : 0; +} + +Tlv::operator uint32_t () const +{ + return (m_nSize >= 4) ? htonl(*((uint32_t*)m_data.data())) : 0; +} + +// TlvList +TlvList::TlvList() +{} + +TlvList::TlvList(ICQBuffer &b, unsigned nTlvs) +{ + for(unsigned n = 0; (b.readPos() < (unsigned)b.size()) && (n < nTlvs); n++) + { + unsigned short num, size; + b >> num >> size; + if (b.readPos() + size > (unsigned)b.size()) + break; + append(new Tlv(num, size, b.data(b.readPos()))); + b.incReadPos(size); + } +} + +TlvList::~TlvList() +{ + qDeleteAll(*this); +} + +Tlv *TlvList::operator()(unsigned short num, int skip) +{ + for(uint i = 0; i < (unsigned)count(); i++) { + if ((at(i))->Num() == num) { + if(skip == 0) + return at(i); + --skip; + } + } + return NULL; +} + +ICQBuffer::ICQBuffer(unsigned size) + : Buffer(size) +{} + +ICQBuffer::ICQBuffer(const QByteArray &ba) + : Buffer(ba) +{} + +ICQBuffer::ICQBuffer(Tlv &tlv) + : Buffer(tlv.Size()) +{ + pack((char*)tlv, tlv.Size()); +} + + +ICQBuffer::~ICQBuffer() +{} + +void ICQBuffer::tlv(unsigned short n, const char *data, unsigned short len) +{ + *this << n << len; + pack(data, len); +} + +void ICQBuffer::tlvLE(unsigned short n, const char *data, unsigned short len) +{ + pack(n); + pack(len); + pack(data, len); +} + +void ICQBuffer::tlv(unsigned short n, const char *data) +{ + if (data == NULL) + data = ""; + tlv(n, data, (unsigned short)strlen(data)); +} + +void ICQBuffer::tlvLE(unsigned short n, const char *data) +{ + if (data == NULL) + data = ""; + unsigned short len = strlen(data) + 1; + pack(n); + pack((unsigned short)(len + 2)); + pack(len); + pack(data, len); +} + +void ICQBuffer::tlv(unsigned short n, unsigned short c) +{ + c = htons(c); + tlv(n, (char*)&c, 2); +} + +void ICQBuffer::tlvLE(unsigned short n, unsigned short c) +{ + pack(n); + pack((unsigned short)2); + pack(c); +} + +void ICQBuffer::tlv(unsigned short n, unsigned long c) +{ + /* XXX: + * WARNING! BUG HERE. sizeof(long) is not 4 on 64bit platform */ + c = htonl(c); + tlv(n, (char*)&c, 4); +} + +void ICQBuffer::tlvLE(unsigned short n, unsigned long c) +{ + /* XXX: + * WARNING! BUG HERE. sizeof(long) is not 4 on 64bit platform */ + pack(n); + pack((unsigned short)4); + pack(c); +} + +ICQBuffer &ICQBuffer::operator << (const TlvList &tlvList) +{ + unsigned size = 0; + for (uint i = 0; i < (unsigned)tlvList.count(); i++) + size += tlvList[(int)i]->Size() + 4; + *this << (unsigned short)size; + for (uint i = 0; i < (unsigned)tlvList.count(); i++) { + Tlv *tlv = tlvList[(int)i]; + *this << tlv->Num() << (int)tlv->Size(); + pack(*tlv, tlv->Size()); + } + return *this; +} + +ICQBuffer &ICQBuffer::operator << (const QString &s) +{ + QByteArray utf8 = s.toUtf8(); + unsigned short size = (unsigned short)(utf8.length() + 1); + *this << (unsigned short)htons(size); + pack(utf8, size); + return *this; +} + +/*ICQBuffer &ICQBuffer::operator << (const QByteArray &s) +{ + if(!s.length()) + return *this; + unsigned short size = (unsigned short)(s.length() + 1); + *this << (unsigned short)htons(size); + pack(s, size); + return *this; +}*/ + +ICQBuffer &ICQBuffer::operator << (const QByteArray &s) +{ + if(!s.size()) + return *this; + unsigned short size = (unsigned short)(s.size()); + *this << (unsigned short)htons(size); + pack(s, size); + return *this; +} + +ICQBuffer &ICQBuffer::operator << (const Buffer &b) +{ + unsigned short size = (unsigned short)(b.size() - b.readPos()); + *this << (unsigned short)htons(size); + pack(b.data(b.readPos()), size); + return *this; +} + +ICQBuffer &ICQBuffer::operator << (char c) +{ + pack(&c, 1); + return *this; +} + +ICQBuffer &ICQBuffer::operator << (const char *str) +{ + if(!str) + return *this; + pack(str, strlen(str)); + return *this; +} + +ICQBuffer &ICQBuffer::operator << (unsigned short c) +{ + c = htons(c); + pack((char*)&c, 2); + return *this; +} + +ICQBuffer &ICQBuffer::operator << (unsigned long c) +{ + /* XXX: + * WARNING! BUG HERE. sizeof(long) is not 4 on 64bit platform */ + c = htonl(c); + pack((char*)&c, 4); + return *this; +} + +ICQBuffer &ICQBuffer::operator << (bool b) +{ + char c = b ? (char)1 : (char)0; + pack(&c, 1); + return *this; +} + +ICQBuffer &ICQBuffer::operator >> (std::string &s) +{ + unsigned short size; + *this >> size; + size = htons(size); + s.erase(); + if (size){ + if (size > this->size() - m_posRead) + size = (unsigned short)(this->size() - m_posRead); + s.append((unsigned)size, '\x00'); + unpack((char*)s.c_str(), size); + } + return *this; +} + +ICQBuffer &ICQBuffer::operator >> (QByteArray &str) +{ + unsigned short s; + str = ""; + + *this >> s; + s = htons(s); + if (s == 0) + return *this; + if (s > size() - m_posRead) + s = (unsigned short)(size() - m_posRead); + unpack(str, s); + return *this; +} + +ICQBuffer &ICQBuffer::operator >> (char &c) +{ + if (unpack(&c, 1) != 1) + c = 0; + return *this; +} + +ICQBuffer &ICQBuffer::operator >> (unsigned short &c) +{ + if (unpack((char*)&c, 2) != 2) + c = 0; + c = ntohs(c); + return *this; +} + +ICQBuffer &ICQBuffer::operator >> (unsigned long &c) +{ + /* XXX: + * WARNING! BUG HERE. sizeof(long) is not 4 on 64bit platform */ + if (unpack((char*)&c, 4) != 4) + c = 0; + c = ntohl(c); + return *this; +} + +ICQBuffer &ICQBuffer::operator >> (int &c) +{ + if (unpack((char*)&c, 4) != 4) + c = 0; + c = ntohl(c); + return *this; +} + +void ICQBuffer::packScreen(const QString &screen) +{ + char len = screen.toUtf8().length(); + pack(&len, 1); + pack(screen.toUtf8(), len); +} + +void ICQBuffer::packStr32(const char *s) +{ + if (s) { + unsigned long size = strlen(s); + pack(size); + pack(s, strlen(s)); + } else { + pack((unsigned long)0); + pack("", 0); + } +} + +void ICQBuffer::packStr32(const QByteArray &s) +{ + unsigned long size = s.length(); + pack(size); + pack(s, size); +} + +void ICQBuffer::pack32(const Buffer &b) +{ + /* XXX: + * WARNING! BUG HERE. sizeof(long) is not 4 on 64bit platform */ + unsigned long size = b.size() - b.readPos(); + *this << (unsigned long)htonl(size); + pack(b.data(b.readPos()), size); +} + +void ICQBuffer::pack(const QByteArray &s) +{ + unsigned short size = (unsigned short)(s.size()); + *this << size; + pack(s, size); +} + +void ICQBuffer::pack(const QString &s) +{ + QByteArray cstr = s.toUtf8(); + unsigned short size = (unsigned short)(s.length()); + *this << size; + pack(cstr, size); +} + +void ICQBuffer::pack(unsigned short s) +{ + SWAP_S(s); + pack((char*)&s, 2); +} + +void ICQBuffer::pack(unsigned long s) +{ + /* XXX: + * WARNING! BUG HERE. sizeof(long) is not 4 on 64bit platform */ + unsigned int i = s; + SWAP_L(i); + pack((char*)&i, 4); +} +bool ICQBuffer::unpackStr(QString &str) +{ + unsigned short s; + str = QString::null; + *this >> s; + if (s == 0) + return false; + if (s > size() - m_posRead) + s = (unsigned short)(size() - m_posRead); + unpack(str, s); + return true; +} + +bool ICQBuffer::unpackStr(QByteArray &str) +{ + unsigned short s; + str = ""; + *this >> s; + if (s == 0) + return false; + if (s > size() - m_posRead) + s = (unsigned short)(size() - m_posRead); + unpack(str, s); + return true; +} + +void ICQBuffer::unpackStr32(std::string &s) +{ + unsigned long size; + *this >> size; + size = htonl(size); + s.erase(); + if (size == 0) return; + if (size > this->size() - m_posRead) + size = this->size() - m_posRead; + s.append(size, '\x00'); + unpack((char*)s.c_str(), size); +} + +bool ICQBuffer::unpackStr32(QByteArray &str) +{ + unsigned long s; + *this >> s; + s = ntohl(s); + str = ""; + if (s == 0) + return false; + if (s > size() - m_posRead) + s = size() - m_posRead; + unpack(str, s); + return true; +} + +/*bool ICQBuffer::unpackStr32(QByteArray &str) +{ + unsigned long s; + *this >> s; + s = ntohl(s); + str = QByteArray(); + if (s == 0) + return false; + if (s > size() - m_posRead) + s = size() - m_posRead; + unpack(str, s); + return true; +}*/ + +QString ICQBuffer::unpackScreen() +{ + char len; + QString res; + + *this >> len; + /* 13 isn't right, AIM allows 16. But when we get a longer + name, we *must* unpack them if we won't lose the TLVs + behind the Screenname ... */ + if (len > 16) + log(L_DEBUG,"Too long Screenname! Length: %d",len); + unpack(res, len); + return res; +} + +unsigned ICQBuffer::unpack(char *d, unsigned s) +{ + unsigned readn = size() - m_posRead; + if (s < readn) + readn = s; + memcpy(d, data() + m_posRead, readn); + m_posRead += readn; + return readn; +} + +unsigned ICQBuffer::unpack(QString &d, unsigned s) +{ + unsigned readn = size() - m_posRead; + if (s < readn) + readn = s; + d = QString::fromUtf8(data() + m_posRead, readn); + m_posRead += readn; + return readn; +} + +/*unsigned ICQBuffer::unpack(QByteArray &d, unsigned s) +{ + unsigned readn = size() - m_posRead; + if (s < readn) + readn = s; + d = QByteArray(data() + m_posRead, readn + 1); + m_posRead += readn; + return readn; +}*/ + +unsigned ICQBuffer::unpack(QByteArray &d, unsigned s) +{ + unsigned readn = size() - m_posRead; + if (s < readn) + readn = s; + d = QByteArray( data() + m_posRead, readn ); + unsigned size = d.size(); + d.resize(size); + m_posRead += readn; + if(d.endsWith((char)0)) + { + d.chop(1); + } + return readn; +} + +void ICQBuffer::unpack(unsigned short &c) +{ + if (unpack((char*)&c, 2) != 2) + c = 0; + SWAP_S(c); +} + +void ICQBuffer::unpack(unsigned long &c) +{ + // FIXME: This needs to be rewritten for 64-bit machines. + // Kludge for now. + unsigned int i; + if (unpack((char*)&i, 4) != 4) + i = 0; + SWAP_L(i); + c = i; +} diff --git a/plugins/icq/icqbuffer.h b/plugins/icq/icqbuffer.h new file mode 100644 index 0000000..f15ee25 --- /dev/null +++ b/plugins/icq/icqbuffer.h @@ -0,0 +1,152 @@ +/*************************************************************************** + icqbuffer.h - description + ------------------- + begin : Fri Jan 05 2007 + copyright : (C) 2007 by Christian Ehrlicher + email : ch.ehrlicher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef _ICQBUFFER_H +#define _ICQBUFFER_H + +#include "buffer.h" +#include "socket/socket.h" +#include "socket/clientsocket.h" +#include //Fixme +#include + +class QByteArray; +class ICQBuffer; +class Tlv +{ +public: + Tlv(unsigned short num = 0, unsigned short size = 0, const char *data = NULL); + Tlv(unsigned short num, QByteArray& array); + unsigned short Num() const { return m_nNum; } + unsigned short Size() const { return m_nSize; } + const char *Data() const { return m_data.data(); } + operator const char* () const { return (const char*)m_data.data(); } + operator char* () { return m_data.data(); } + const QByteArray &byteArray() const { return m_data; } + operator uint16_t () const; + operator uint32_t () const; +protected: + unsigned int m_nNum; + unsigned int m_nSize; + QByteArray m_data; +}; + +class TlvList : public QList +{ +public: + TlvList(); + TlvList(ICQBuffer&, unsigned nTlvs = ~0U); + ~TlvList(); + // return Tlv, since there can be more than one Tlv inside + // a package, you can specificy how much Tlv should be skipped + Tlv *operator() (unsigned short num, int skip = 0); +}; + +class ICQBuffer : public Buffer +{ +public: + ICQBuffer(unsigned size = 0); + ICQBuffer(const QByteArray &ba); + ICQBuffer(Tlv&); + virtual ~ICQBuffer(); + + void tlv(unsigned short n, const char *data, unsigned short len); + void tlv(unsigned short n) { tlv(n, NULL, 0); } + void tlv(unsigned short n, const char *data); + void tlv(unsigned short n, unsigned short c); + void tlv(unsigned short n, int c) { tlv(n, (unsigned short)c); } + void tlv(unsigned short n, unsigned long c); + void tlv(unsigned short n, long c) { tlv(n, (unsigned long)c); } + void tlv(unsigned short n, Buffer &b) { tlv(n, b.data(), (unsigned short)(b.size())); } + + void tlvLE(unsigned short n, const char *data, unsigned short len); + void tlvLE(unsigned short n, const char *data); + void tlvLE(unsigned short n, char c) { tlvLE(n, &c, 1); } + void tlvLE(unsigned short n, unsigned short c); + void tlvLE(unsigned short n, unsigned long c); + void tlvLE(unsigned short n, Buffer &b) { tlvLE(n, b.data(), (unsigned short)(b.size())); } + + ICQBuffer &operator << (const TlvList&); + ICQBuffer &operator << (const QString &s); // utf8 + ICQBuffer &operator << (const QByteArray &s); + //ICQBuffer &operator << (const QByteArray &s); + ICQBuffer &operator << (const Buffer &b); + ICQBuffer &operator << (char c); + ICQBuffer &operator << (unsigned char c) { return operator << ((char)c); } + ICQBuffer &operator << (const char *str); + ICQBuffer &operator << (unsigned short c); + ICQBuffer &operator << (int c) { return operator << ((unsigned short)c); } + ICQBuffer &operator << (unsigned long c); + ICQBuffer &operator << (long c) { return operator << ((unsigned long)c); } + ICQBuffer &operator << (const bool b); + + ICQBuffer &operator >> (std::string &s); //Ported from 0.9.4 + ICQBuffer &operator >> (QByteArray &s); // size is 2 byte & little endian! + ICQBuffer &operator >> (char &c); + ICQBuffer &operator >> (unsigned char &c) { return operator >> ((char&)c); } + ICQBuffer &operator >> (unsigned short &c); + ICQBuffer &operator >> (unsigned long &c); + ICQBuffer &operator >> (int &c); + + void pack(const QString &s); + void pack(const QByteArray &s); + void pack(const char *d, unsigned size) { Buffer::pack(d, size); } + void pack(const unsigned char *d, unsigned size) { Buffer::pack((const char*)d, size); } + void pack(char c) { *this << c; } + void pack(unsigned char c) { *this << c; } + void pack(unsigned short c); + void pack(unsigned long c); + void pack(long c) { pack((unsigned long)c); } + + void packScreen(const QString &); + void packStr32(const char *s); + void packStr32(const QByteArray &); + void pack32(const Buffer &b); + + // 2 byte size + string + bool unpackStr(QString &s); // utf8 + bool unpackStr(QByteArray &s); + // 4 byte size + string + void unpackStr32(std::string &s); // Ported from 0.9.4 + bool unpackStr32(QByteArray &s); + //bool unpackStr32(QByteArray &s); + QString unpackScreen(); + + void unpack(char &c) { *this >> c; } + void unpack(unsigned char &c) { *this >> c; } + unsigned unpack(char *d, unsigned size); + unsigned unpack(QString &d, unsigned size); // utf8 + unsigned unpack(QByteArray &d, unsigned size); + //unsigned unpack(QByteArray &d, unsigned size); + void unpack(unsigned short &c); + void unpack(unsigned long &c); +}; + +class ICQClientSocket : public SIM::ClientSocket +{ +public: + ICQClientSocket(SIM::ClientSocketNotify *notify, SIM::Socket *sock = NULL) + : ClientSocket(notify, sock) {}; + ~ICQClientSocket() {}; + + virtual ICQBuffer &readBuffer() { return m_readICQBuffer; } + virtual ICQBuffer &writeBuffer() { return m_writeICQBuffer; } +protected: + ICQBuffer m_readICQBuffer; + ICQBuffer m_writeICQBuffer; +}; + +#endif // _ICQBUFFER_H diff --git a/plugins/icq/icqclient.cpp b/plugins/icq/icqclient.cpp new file mode 100644 index 0000000..0f4470f --- /dev/null +++ b/plugins/icq/icqclient.cpp @@ -0,0 +1,3568 @@ +/*************************************************************************** + icqclient.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "buffer.h" +#include "socket/socket.h" +#include "unquot.h" +#include "log.h" +#include "icons.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +#include "icq.h" +#include "icqconfig.h" +#include "aimconfig.h" +#include "icqinfo.h" +#include "homeinfo.h" +#include "workinfo.h" +#include "moreinfo.h" +#include "aboutinfo.h" +#include "interestsinfo.h" +#include "pastinfo.h" +#include "icqpicture.h" +#include "aiminfo.h" +#include "icqsearch.h" +#include "icqsecure.h" +#include "icqmessage.h" +#include "securedlg.h" +#include "msgedit.h" +#include "simgui/ballonmsg.h" +#include "encodingdlg.h" +#include "warndlg.h" + +#include "icqbuddy.h" +#include "icqservice.h" + +#include "icqdirect.h" + + +using namespace std; +using namespace SIM; + +static DataDef _icqUserData[] = + { + { "", DATA_ULONG, 1, DATA(1) }, // Sign + { "LastSend", DATA_ULONG, 1, 0 }, + { "Alias", DATA_UTF, 1, 0 }, // Alias + { "Cellular", DATA_UTF, 1, 0 }, // Cellular + { "", DATA_ULONG, 1, DATA(0xFFFF) }, // Status + { "", DATA_ULONG, 1, 0 }, // Class + { "StatusTime", DATA_ULONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // OnlineTime + { "WarningLevel", DATA_ULONG, 1, 0 }, + { "IP", DATA_IP, 1, 0 }, + { "RealIP", DATA_IP, 1, 0 }, + { "Port", DATA_ULONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // DCcookie + { "Caps", DATA_ULONG, 1, 0 }, + { "Caps2", DATA_ULONG, 1, 0 }, + { "", DATA_STRING, 1, 0 }, // AutoReply + { "Uin", DATA_ULONG, 1, 0 }, + { "Screen", DATA_STRING, 1, 0 }, + { "ID", DATA_ULONG, 1, 0 }, + { "", DATA_BOOL, 1, DATA(1) }, // bChecked + { "GroupID", DATA_ULONG, 1, 0 }, + { "Ignore", DATA_ULONG, 1, 0 }, + { "Visible", DATA_ULONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // ContactVisibleId + { "Invsible", DATA_ULONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // ContactInvisibleId + { "WaitAuth", DATA_BOOL, 1, 0 }, // Need auth from to add to our contact list + { "WantAuth", DATA_BOOL, 1, 0 }, // Want's auth from us + { "WebAware", DATA_BOOL, 1, DATA(1) }, + { "InfoUpdateTime", DATA_ULONG, 1, 0 }, + { "PluginInfoTime", DATA_ULONG, 1, 0 }, + { "PluginStatusTime", DATA_ULONG, 1, 0 }, + { "InfoFetchTime", DATA_ULONG, 1, 0 }, + { "PluginInfoFetchTime", DATA_ULONG, 1, 0 }, + { "PluginStatusFetchTime", DATA_ULONG, 1, 0 }, + { "Mode", DATA_ULONG, 1, 0 }, + { "Version", DATA_ULONG, 1, 0 }, + { "Build", DATA_ULONG, 1, 0 }, + { "Nick", DATA_STRING, 1, 0 }, + { "FirstName", DATA_STRING, 1, 0 }, + { "LastName", DATA_STRING, 1, 0 }, + { "MiddleName", DATA_STRING, 1, 0 }, + { "Maiden", DATA_STRING, 1, 0 }, + { "EMail", DATA_STRING, 1, 0 }, + { "HiddenEMail", DATA_BOOL, 1, 0 }, + { "City", DATA_STRING, 1, 0 }, + { "State", DATA_STRING, 1, 0 }, + { "HomePhone", DATA_STRING, 1, 0 }, + { "HomeFax", DATA_STRING, 1, 0 }, + { "Address", DATA_UTF, 1, 0 }, + { "PrivateCellular", DATA_STRING, 1, 0 }, + { "Zip", DATA_STRING, 1, 0 }, + { "Country", DATA_ULONG, 1, 0 }, + { "TimeZone", DATA_ULONG, 1, 0 }, + { "Age", DATA_ULONG, 1, 0 }, + { "Gender", DATA_ULONG, 1, 0 }, + { "Homepage", DATA_STRING, 1, 0 }, + { "BirthYear", DATA_ULONG, 1, 0 }, + { "BirthMonth", DATA_ULONG, 1, 0 }, + { "BirthDay", DATA_ULONG, 1, 0 }, + { "Language", DATA_ULONG, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "WorkCity", DATA_STRING, 1, 0 }, + { "WorkState", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "WorkAddress", DATA_STRING, 1, 0 }, + { "WorkZip", DATA_STRING, 1, 0 }, + { "WorkCountry", DATA_ULONG, 1, 0 }, + { "WorkName", DATA_STRING, 1, 0 }, + { "WorkDepartment", DATA_STRING, 1, 0 }, + { "WorkPosition", DATA_STRING, 1, 0 }, + { "Occupation", DATA_ULONG, 1, 0 }, + { "WorkHomepage", DATA_STRING, 1, 0 }, + { "About", DATA_STRING, 1, 0 }, + { "Interests", DATA_STRING, 1, 0 }, + { "Backgrounds", DATA_STRING, 1, 0 }, + { "Affilations", DATA_STRING, 1, 0 }, + { "FollowMe", DATA_ULONG, 1, 0 }, + { "SharedFiles", DATA_BOOL, 1, 0 }, // Shared files + { "ICQPhone", DATA_ULONG, 1, 0 }, // ICQPhone + { "Picture", DATA_UTF, 1, 0 }, + { "PictureWidth", DATA_ULONG, 1, 0 }, + { "PictureHeight", DATA_ULONG, 1, 0 }, + { "PhoneBook", DATA_STRING, 1, 0 }, + { "ProfileFetch", DATA_BOOL, 1, 0 }, + { "", DATA_BOOL, 1, 0 }, // bTyping + { "", DATA_BOOL, 1, 0 }, // bBadClient + { "", DATA_OBJECT, 1, 0 }, // Direct + { "", DATA_OBJECT, 1, 0 }, // DirectPluginInfo + { "", DATA_OBJECT, 1, 0 }, // DirectPluginStatus + { "", DATA_BOOL, 1, 0 }, // bNoDirect + { "", DATA_BOOL, 1, 0 }, // bInviisble + { "", DATA_ULONG, 1, 0}, // buddyRosterID + { "buddyID", DATA_ULONG, 1, 0}, + { "buddyHash", DATA_BINARY, 1, 0}, + { "unknown2", DATA_BINARY, 1, 0}, + { "unknown4", DATA_BINARY, 1, 0}, + { "unknown5", DATA_BINARY, 1, 0}, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +const DataDef *ICQProtocol::icqUserData = _icqUserData; + +static DataDef icqClientData[] = + { + { "Server", DATA_STRING, 1, 0 }, + { "ServerPort", DATA_ULONG, 1, DATA(5190) }, + { "", DATA_ULONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, + { "HideIP", DATA_BOOL, 1, 0 }, + { "IgnoreAuth", DATA_BOOL, 1, 0 }, + { "UseMD5", DATA_BOOL, 1, 0 }, + { "DirectMode", DATA_ULONG, 1, 0 }, + { "IdleTime", DATA_ULONG, 1, 0 }, + { "ListRequests", DATA_STRING, 1, 0 }, + { "Picture", DATA_UTF, 1, 0 }, + { "RandomChatGroup", DATA_ULONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // RandomChatGroupCurrent + { "SendFormat", DATA_ULONG, 1, DATA(1) }, // use utf-8 whereever possible + { "DisablePlugins", DATA_BOOL, 1, 0 }, + { "DisableAutoUpdate", DATA_BOOL, 1, 0 }, + { "DisableAutoReplyUpdate", DATA_BOOL, 1, 0 }, + { "DisableTypingNotification", DATA_BOOL, 1, 0 }, + { "AcceptInDND", DATA_BOOL, 1, DATA(1) }, + { "AcceptInOccupied", DATA_BOOL, 1, DATA(1) }, + { "MinPort", DATA_ULONG, 1, DATA(1024) }, + { "MaxPort", DATA_ULONG, 1, DATA(0xFFFE) }, + { "WarnAnonimously", DATA_BOOL, 1, 0 }, + { "ACKMode", DATA_ULONG, 1, DATA(1) }, + { "UseHTTP", DATA_BOOL, 1, DATA(0) }, + { "AutoHTTP", DATA_BOOL, 1, DATA(0) }, + { "KeepAlive", DATA_BOOL, 1, DATA(1) }, + { "MediaSense", DATA_BOOL, 1, DATA(1) }, + { "", DATA_STRUCT, sizeof(ICQUserData) / sizeof(Data), DATA(_icqUserData) }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +ICQClient::ICQClient(Protocol *protocol, Buffer *cfg, bool bAIM) + : TCPClient(protocol, cfg, HighPriority - 1), + m_bVerifying (false), + m_listener (NULL), + m_listRequest (NULL), + m_bRosters (false), + m_bBirthday (false), + m_bNoSend (true), + m_bJoin (false), + m_bFirstTry (false), + m_bReady (false), + m_bconnectionLost (false), + m_ifChecker (NULL), + m_bBirthdayInfoDisplayed (false) +{ + m_bAIM = bAIM; + + load_data(icqClientData, &data, cfg); + if (data.owner.Uin.toULong() != 0) + m_bAIM = false; + if (!data.owner.Screen.str().isEmpty()) + m_bAIM = true; + + data.owner.DCcookie.asULong() = rand(); + + QString requests = getListRequests(); + while (requests.length()) + { + QString req = getToken(requests, ';'); + QString n = getToken(req, ','); + ListRequest lr; + lr.type = n.toUInt(); + lr.screen = req; + listRequests.push_back(lr); + } + + m_snacBuddy = new SnacIcqBuddy(this); + m_snacICBM = new SnacIcqICBM(this); + m_snacService = new SnacIcqService(this); + addSnacHandler(m_snacBuddy); + addSnacHandler(m_snacICBM); + addSnacHandler(m_snacService); + + m_processTimer = new QTimer(this); + connect(m_processTimer, SIGNAL(timeout()), m_snacICBM, SLOT(processSendQueue())); + + disconnected(); + + ContactList::ContactIterator it; + Contact *contact; + while ((contact = ++it) != NULL) + { + ClientDataIterator itd(contact->clientData, this); + ICQUserData *data; + while ((data = toICQUserData(++itd)) != NULL) + data->Alias.str() = contact->getName(); + } + if ( !getMediaSense() ) + return; + + m_ifChecker = new SIM::InterfaceChecker(); + connect(m_ifChecker, SIGNAL(interfaceDown(QString)), this, SLOT(interfaceDown(QString))); + connect(m_ifChecker, SIGNAL(interfaceUp(QString)), this, SLOT(interfaceUp(QString))); + +} + +ICQClient::~ICQClient() +{ + setStatus(STATUS_OFFLINE, false); + freeData(); // before deleting of other members! + + delete m_listener; + delete m_snacService; + delete m_snacBuddy; + delete m_snacICBM; + delete m_ifChecker; //independed if MediaSense is activated, it can be risk-less deleted, because it is initilized with NULL + free_data(icqClientData, &data); + delete socket(); + for(list::iterator it = m_processMsg.begin(); it != m_processMsg.end(); ++it) + { + Message *msg = *it; + msg->setError(I18N_NOOP("Process message failed")); //crashed on shutdown + // FIXME: this does not work and could crash!!!! + // Event e(EventRealSendMessage, msg); + // e.process(); + delete msg; + } + while (!m_sockets.empty()) + delete m_sockets.front(); + m_processMsg.clear(); +} + +bool ICQClient::addSnacHandler(SnacHandler* handler) +{ + if(!handler) + return false; + mapSnacHandlers::iterator it = m_snacHandlers.find(handler->getType()); + if(it != m_snacHandlers.end()) + delete it->second; + m_snacHandlers[handler->getType()] = handler; + return true; +} + +void ICQClient::clearSnacHandlers() +{ + // TODO +} + +void ICQClient::deleteFileMessage(MessageId const& cookie) +{ + for(list::iterator it = m_processMsg.begin(); it != m_processMsg.end(); ++it) + { + if((*it)->baseType() == MessageFile) + { + AIMFileMessage* afm = static_cast(*it); + if (afm && afm->getID_L() == cookie.id_l && afm->getID_H() == cookie.id_h) + { + m_processMsg.erase(it); + return; + } + } + } +} + +void ICQClient::contactsLoaded() +{ + /* outdated + QTextCodec *codec = getContacts()->getCodec(NULL); + QString cdc = codec->name(); + if (codec && (cdc.lower().indexOf("utf") >= 0)){ + QString _def_enc = I18N_NOOP("Dear translator! type this default encoding for your language"); + QString def_enc = i18n(_def_enc); + if (def_enc == _def_enc){ + EncodingDlg dlg(NULL, this); + dlg.exec(); + }else{ + getContacts()->owner()->setEncoding(def_enc); + } + } + */ +} + +const DataDef *ICQProtocol::userDataDef() +{ + return _icqUserData; +} + +const DataDef *AIMProtocol::userDataDef() +{ + return _icqUserData; +} + +bool ICQClient::compareData(void *d1, void *d2) +{ + ICQUserData *data1 = toICQUserData((SIM::clientData*) d1); // FIXME unsafe type conversion + ICQUserData *data2 = toICQUserData((SIM::clientData*) d2); // FIXME unsafe type conversion + if (data1->Uin.toULong()) + return data1->Uin.toULong() == data2->Uin.toULong(); + if (data2->Uin.toULong()) + return false; + return (data1->Screen.str() == data2->Screen.str()); +} + +QByteArray ICQClient::getConfig() +{ + QString listRequest; + for (list::iterator it = listRequests.begin(); it != listRequests.end(); ++it) + { + if (listRequest.length()) + listRequest += ';'; + listRequest += QString::number(it->type); + listRequest += ','; + listRequest += it->screen; + } + setListRequests(listRequest); + QByteArray res = Client::getConfig(); + if (res.length()) + res += '\n'; + return res += save_data(icqClientData, &data); +} + +QString ICQClient::name() +{ + if (m_bAIM) + return "AIM." + data.owner.Screen.str(); + return "ICQ." + QString::number(data.owner.Uin.toULong()); +} + +QString ICQClient::getScreen() +{ + if (m_bAIM) + return data.owner.Screen.str(); + return QString::number(data.owner.Uin.toULong()); +} + +QWidget *ICQClient::setupWnd() +{ + if (m_bAIM) + return new AIMConfig(NULL, this, true); + return new ICQConfig(NULL, this, true); +} + +static const char aim_server[] = "login.oscar.aol.com"; +static const char icq_server[] = "login.icq.com"; + +QString ICQClient::getServer() const +{ + if (!data.Server.str().isEmpty()) + return data.Server.str(); + return m_bAIM ? aim_server : icq_server; +} + +void ICQClient::setServer(const QString &server) +{ + if (server == (m_bAIM ? aim_server : icq_server)) + data.Server.str() = QString::null; + else + data.Server.str() = server; +} + +void ICQClient::setUin(unsigned long uin) +{ + data.owner.Uin.asULong() = uin; +} + +void ICQClient::setScreen(const QString &screen) +{ + data.owner.Screen.str() = screen; +} + +unsigned long ICQClient::getUin() +{ + return data.owner.Uin.toULong(); +} + +void ICQClient::generateCookie(MessageId& id) +{ + // Just for fun: + id.id_h = rand() + (rand() << 16); + id.id_l = rand() + (rand() << 16); +} + +bool ICQClient::isMyData(clientData *&_data, Contact *&contact) +{ + if (_data->Sign.toULong() != ICQ_SIGN) + return false; + ICQUserData *data = toICQUserData(_data); + if (m_bAIM) + { + if (!data->Screen.str().isEmpty() && + !this->data.owner.Screen.str().isEmpty() && + data->Screen.str().toLower() == this->data.owner.Screen.str().toLower()) + return false; + } + else if (data->Uin.toULong() == this->data.owner.Uin.toULong()) + return false; + ICQUserData *my_data = findContact(screen(data), NULL, false, contact); + if (my_data) + data = my_data; + else + contact = NULL; + return true; +} + +bool ICQClient::createData(clientData *&_data, Contact *contact) +{ + ICQUserData *data = toICQUserData(_data); + ICQUserData *new_data = toICQUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + new_data->Uin = data->Uin; + new_data->Screen.str() = data->Screen.str(); + _data = (clientData*)new_data; + return true; +} + +OscarSocket::OscarSocket() +{ + //m_nFlapSequence = (unsigned short)(rand() & 0x7FFF); + m_nFlapSequence = 8984; + m_nMsgSequence = 0; +} + +void OscarSocket::connect_ready() +{ + socket()->readBuffer().init(6); + socket()->readBuffer().packetStart(); + m_bHeader = true; +} + +void ICQClient::connect_ready() +{ + log(L_DEBUG, "ICQClient::connect_ready()"); + m_bFirstTry = false; + if (m_listener == NULL) + { + m_listener = new ICQListener(this); + m_listener->bind(getMinPort(), getMaxPort(), NULL); + } + m_bNoSend = false; + m_bReady = true; + OscarSocket::connect_ready(); + TCPClient::connect_ready(); +} + +void ICQClient::setNewLevel(RateInfo &r) +{ + QDateTime now = QDateTime::currentDateTime(); + unsigned delta = 0; + if (now.date() == r.m_lastSend.date()) + delta = r.m_lastSend.time().msecsTo(now.time()); + unsigned res = (((r.m_winSize - 1) * r.m_curLevel) + delta) / 4 * r.m_winSize; + if (res > r.m_maxLevel) + res = r.m_maxLevel; + r.m_curLevel = res; + r.m_lastSend = now; + log(L_DEBUG, "Level: %04X [%04X %04X]", res, r.m_minLevel, r.m_winSize); +} + +RateInfo *ICQClient::rateInfo(unsigned snac) +{ + RATE_MAP::iterator it = m_rate_grp.find(snac); + if (it == m_rate_grp.end()) + return NULL; + return &m_rates[it->second]; +} + +unsigned ICQClient::delayTime(unsigned snac) +{ + RateInfo *r = rateInfo(snac); + if (r == NULL) + return 0; + return delayTime(*r); +} + +unsigned ICQClient::delayTime(RateInfo &r) +{ + if (r.m_winSize == 0) + return 0; + int res = r.m_minLevel * r.m_winSize - r.m_curLevel * (r.m_winSize - 1); + if (res < 0) + return 0; + QDateTime now = QDateTime::currentDateTime(); + unsigned delta = 0; + if (now.date() == r.m_lastSend.date()) + delta = r.m_lastSend.time().msecsTo(now.time()); + res -= delta; + return (res > 0) ? res : 0; +} + +void ICQClient::setStatus(unsigned status, bool bCommon) +{ + if (status != STATUS_OFFLINE) + { + if (status != STATUS_NA && status != STATUS_AWAY) + setIdleTime(0); + else if (getIdleTime() == 0) + setIdleTime(QDateTime::currentDateTime().toTime_t()); + } + TCPClient::setStatus(status, bCommon); +} + +void ICQClient::changeStatus(const SIM::IMStatusPtr& status) +{ + if (status->id() == "offline") + { + flap(ICQ_CHNxCLOSE); + return; + } + if (m_bAIM) + { + if (status->id() == "online") + { + IMStatusPtr newstatus = protocol()->status("away"); + // TODO obtain AR + + /* + ar_request req; + req.bDirect = true; + arRequests.push_back(req); + + ARRequest ar; + ar.contact = NULL; + ar.param = &arRequests.back(); + ar.receiver = this; + ar.status = status; + EventARRequest(&ar).process(); + EventClientChanged(this).process(); + */ + } + else if (m_status != STATUS_ONLINE) + { + setAwayMessage(); + } + } + else + { + if (status->id() == currentStatus()->id()) + return; + + snacService()->sendStatus(fullStatus(status)); + } + TCPClient::changeStatus(status); +} + +void ICQClient::setStatus(unsigned status) +{ + if (status == STATUS_OFFLINE) + { + flap(ICQ_CHNxCLOSE); + return; + } + if (m_bAIM) + { + if (status != STATUS_ONLINE) + { + m_status = STATUS_AWAY; + + ar_request req; + req.type = 0; + req.flags = 0; + req.ack = 0; + req.id1 = req.id2 = 0; + req.bDirect = true; + arRequests.push_back(req); + + ARRequest ar; + ar.contact = NULL; + ar.param = &arRequests.back(); + ar.receiver = this; + ar.status = status; + EventARRequest(&ar).process(); + EventClientChanged(this).process(); + } + else if (m_status != STATUS_ONLINE) + { + m_status = STATUS_ONLINE; + setAwayMessage(); + EventClientChanged(this).process(); + } + return; + } + if (status == m_status) + return; + + m_status = status; + snacService()->sendStatus(); + EventClientChanged(this).process(); +} + +void ICQClient::setInvisible(bool bState) +{ + if (bState != getInvisible()) + { + TCPClient::setInvisible(bState); + if (getState() == Connected) + snacService()->setInvisible(); + EventClientChanged(this).process(); + } +} + +void ICQClient::disconnected() +{ + TCPClient::changeStatus(protocol()->status("offline")); + m_rates.clear(); + m_rate_grp.clear(); + snacICBM()->getSendTimer()->stop(); + m_processTimer->stop(); + clearServerRequests(); + clearListServerRequest(); + clearSMSQueue(); + snacICBM()->clearMsgQueue(); + buddies.clear(); + Contact *contact; + ContactList::ContactIterator it; + arRequests.clear(); + while ((contact = ++it) != NULL) + { + ICQUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toICQUserData(++it)) != NULL) + { + if ((data->Status.toULong() != ICQ_STATUS_OFFLINE) || data->bInvisible.toBool()) + { + setOffline(data); + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(dataName(data)); + m->setStatus(STATUS_OFFLINE); + m->setFlags(MESSAGE_RECEIVED); + EventMessageReceived e(m); + if(e.process()) + continue; + delete m; + } + } + } + for (list::iterator itm = m_acceptMsg.begin(); itm != m_acceptMsg.end(); ++itm) + { + EventMessageDeleted(*itm).process(); + delete *itm; + } + m_acceptMsg.clear(); + m_bRosters = false; + m_nMsgSequence = 0; + m_bNoSend = true; + m_bReady = false; + m_cookie.resize(0); + m_advCounter = 0; + m_info_req.clear(); + if(m_snacService) + m_snacService->clearServices(); + if (m_listener) + { + delete m_listener; + m_listener = NULL; + } + m_nFlapSequence = 8984; +} + +const char *icq_error_codes[] = {I18N_NOOP("Unknown error"), + I18N_NOOP("Invalid SNAC header"), + I18N_NOOP("Server rate limit exceeded"), + I18N_NOOP("Client rate limit exceeded"), + I18N_NOOP("Recipient is not logged in"), + I18N_NOOP("Requested service unavailable"), + I18N_NOOP("Requested service not defined"), + I18N_NOOP("We sent an obsolete SNAC"), + I18N_NOOP("Not supported by server"), + I18N_NOOP("Not supported by client"), + I18N_NOOP("Refused by client"), + I18N_NOOP("Reply too big"), + I18N_NOOP("Responses lost"), + I18N_NOOP("Request denied"), + I18N_NOOP("Incorrect SNAC format"), + I18N_NOOP("Insufficient rights"), + I18N_NOOP("Recipient blocked"), + I18N_NOOP("Sender too evil"), + I18N_NOOP("Receiver too evil"), + I18N_NOOP("User temporarily unavailable"), + I18N_NOOP("No match"), + I18N_NOOP("List overflow"), + I18N_NOOP("Request ambiguous"), + I18N_NOOP("Server queue full"), + I18N_NOOP("Not while on AOL")}; + +const char* ICQClient::error_message(unsigned short error) +{ + if (error >= 1 && error <= 0x18) + return icq_error_codes[error]; + return icq_error_codes[0]; +} + +void OscarSocket::packet_ready() +{ + unsigned short l_size = 0; + if(m_bHeader) + { + char c; + socket()->readBuffer() >> c; + if (c != 0x2A) + { + log(L_ERROR, "Server send bad packet start code: %02X", c); + socket()->error_state(I18N_NOOP("Protocol error")); + return; + } + socket()->readBuffer() >> m_nChannel; + unsigned short sequence; + socket()->readBuffer() >> sequence >> l_size; + m_bHeader = false; + if (l_size) + { + socket()->readBuffer().add(l_size); + return; + } + } + l_size = socket()->readBuffer().size() - socket()->readBuffer().readPos(); + packet(l_size); +} + +void ICQClient::packet_ready() +{ + OscarSocket::packet_ready(); +} + +void ICQClient::packet(unsigned long size) +{ + ICQPlugin *plugin = static_cast(protocol()->plugin()); + EventLog::log_packet(socket()->readBuffer(), false, plugin->OscarPacket); + if (m_nChannel == ICQ_CHNxNEW) + chn_login(); + else if (m_nChannel == ICQ_CHNxCLOSE) + chn_close(); + else if (m_nChannel == ICQ_CHNxDATA) + { + unsigned short food, type; + unsigned short flags, seq, cmd; + socket()->readBuffer() >> food >> type >> flags >> cmd >> seq; + unsigned short unknown_length = 0; + if (flags & 0x8000) + { + // some unknown data before real snac data + // just read the length and forget it ;-) + socket()->readBuffer() >> unknown_length; + socket()->readBuffer().incReadPos(unknown_length); + } + // now just take a look at the type because 0x0001 == error + // in all foodgroups + if (type == 0x0001) + { + unsigned short err_code; + socket()->readBuffer() >> err_code; + log(L_DEBUG, "Error! foodgroup: %04X reason: %s", food, error_message(err_code)); + // now decrease for icqicmb & icqvarious + socket()->readBuffer().decReadPos(sizeof(unsigned short)); + } + if (food == ICQ_SNACxFOOD_LOCATION) + snac_location(type, seq); + else if (food == ICQ_SNACxFOOD_BOS) + snac_bos(type, seq); + else if (food == ICQ_SNACxFOOD_PING) + snac_ping(type, seq); + else if (food == ICQ_SNACxFOOD_LISTS) + snac_lists(type, seq); + else if (food == ICQ_SNACxFOOD_VARIOUS) + snac_various(type, seq); + else if (food == ICQ_SNACxFOOD_LOGIN) + snac_login(type, seq); + else + { + mapSnacHandlers::iterator it = m_snacHandlers.find(food); + if (it == m_snacHandlers.end()) + log(L_WARN, "Unknown foodgroup %04X", food); + else + { + ICQBuffer b; + b.resize(size - unknown_length); + b.setReadPos(0); + b.setWritePos(size - unknown_length); + socket()->readBuffer().unpack(b.data(), size - unknown_length); + it->second->process(type, &b, seq); + } + } + } + else log(L_ERROR, "Unknown channel %u", m_nChannel & 0xFF); + socket()->readBuffer().init(6); + socket()->readBuffer().packetStart(); + m_bHeader = true; +} + +void OscarSocket::flap(char channel) +{ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << (char)0x2A + << channel + << 0x00000000L; +} + +void OscarSocket::snac(unsigned short food, unsigned short type, bool msgId, bool bType) +{ + flap(ICQ_CHNxDATA); + socket()->writeBuffer() + << food + << type + << 0x0000 + << (bType ? type : (unsigned short)0) + << (msgId ? ++m_nMsgSequence : 0x0000); +} + +void OscarSocket::sendPacket(bool bSend) +{ + Buffer &writeBuffer = socket()->writeBuffer(); + char *packet = writeBuffer.data(writeBuffer.packetStartPos()); + unsigned size = writeBuffer.size() - writeBuffer.packetStartPos() - 6; + packet[4] = (char)((size >> 8) & 0xFF); + packet[5] = (char)(size & 0xFF); + if (bSend) + { + packet[2] = (m_nFlapSequence >> 8); + packet[3] = m_nFlapSequence; + EventLog::log_packet(socket()->writeBuffer(), true, ICQPlugin::icq_plugin->OscarPacket); + socket()->write(); + ++m_nFlapSequence; + } +} + +void ICQClient::sendPacket(bool bSend) +{ + Buffer &writeBuffer = socket()->writeBuffer(); + unsigned char *packet = (unsigned char*)(writeBuffer.data(writeBuffer.readPos())); + unsigned long snac = 0; + if (writeBuffer.writePos() >= writeBuffer.readPos() + 10) + snac = (packet[6] << 24) + (packet[7] << 16) + (packet[8] << 8) + packet[9]; + unsigned delay = delayTime(snac); + if (m_bNoSend) + bSend = false; + else if (!bSend && (delay == 0)) + bSend = true; + RateInfo *r = rateInfo(snac); + if (!r) + bSend = true; + else if (m_bNoSend || r->delayed.size()) + bSend = false; + if (bSend) + { + if (r) + setNewLevel(*r); + OscarSocket::sendPacket(true); + return; + } + OscarSocket::sendPacket(false); + r->delayed.pack(writeBuffer.data(writeBuffer.packetStartPos()), writeBuffer.size() - writeBuffer.packetStartPos()); + writeBuffer.resize(writeBuffer.packetStartPos()); + m_processTimer->stop(); + m_processTimer->start(delay); +} + +QByteArray ICQClient::cryptPassword() +{ + unsigned char xor_table[] = + { + 0xf3, 0x26, 0x81, 0xc4, 0x39, 0x86, 0xdb, 0x92, + 0x71, 0xa3, 0xb9, 0xe6, 0x53, 0x7a, 0x95, 0x7c + }; + QByteArray pswd = getContacts()->fromUnicode(NULL, getPassword()); + char buf[8]; + int len=0; + for (int j = 0; j < 8; j++) + { + char c = pswd[j]; + if (c == 0) + break; + c = (char)(c ^ xor_table[j]); + buf[j] = c; + len++; + } + QByteArray res( buf,len ); + return res; +} +unsigned long ICQClient::getFullStatus() +{ + return fullStatus(m_status); +} + +unsigned long ICQClient::fullStatus(const SIM::IMStatusPtr& status) +{ + unsigned long code = 0; + if(status->id() == "online") + code = ICQ_STATUS_ONLINE; + else if(status->id() == "away") + code = ICQ_STATUS_AWAY; + else if(status->id() == "n/a") + code = ICQ_STATUS_AWAY | ICQ_STATUS_NA; + else if(status->id() == "occupied") + code = ICQ_STATUS_AWAY | ICQ_STATUS_OCCUPIED; + else if(status->id() == "dnd") + code = ICQ_STATUS_AWAY | ICQ_STATUS_DND | ICQ_STATUS_OCCUPIED; + else if(status->id() == "free_for_chat") + code = ICQ_STATUS_FFC; + + if(data.owner.WebAware.toBool()) + code |= ICQ_STATUS_FxWEBxPRESENCE; + if (getHideIP()) + code |= ICQ_STATUS_FxHIDExIP | ICQ_STATUS_FxDIRECTxAUTH; + else if (getDirectMode() == 1) + code |= ICQ_STATUS_FxDIRECTxLISTED; + else if (getDirectMode() == 2) + code |= ICQ_STATUS_FxDIRECTxAUTH; + + if (m_bBirthday) + code |= ICQ_STATUS_FxBIRTHDAY; + if (getInvisible()) + { + code |= ICQ_STATUS_FxPRIVATE | ICQ_STATUS_FxHIDExIP; + code &= ~(ICQ_STATUS_FxDIRECTxLISTED | ICQ_STATUS_FxDIRECTxAUTH); + } + return code; +} + +unsigned long ICQClient::fullStatus(unsigned s) +{ + unsigned long status = 0; + switch (s) + { + case STATUS_ONLINE: + status = ICQ_STATUS_ONLINE; + break; + case STATUS_AWAY: + status = ICQ_STATUS_AWAY; + break; + case STATUS_NA: + status = ICQ_STATUS_NA | ICQ_STATUS_AWAY; + break; + case STATUS_OCCUPIED: + status = ICQ_STATUS_OCCUPIED | ICQ_STATUS_AWAY; + break; + case STATUS_DND: + status = ICQ_STATUS_DND | ICQ_STATUS_OCCUPIED | ICQ_STATUS_AWAY; + break; + case STATUS_FFC: + status = ICQ_STATUS_FFC; + break; + } + if(data.owner.WebAware.toBool()) + status |= ICQ_STATUS_FxWEBxPRESENCE; + if (getHideIP()) + status |= ICQ_STATUS_FxHIDExIP | ICQ_STATUS_FxDIRECTxAUTH; + else if (getDirectMode() == 1) + status |= ICQ_STATUS_FxDIRECTxLISTED; + else if (getDirectMode() == 2) + status |= ICQ_STATUS_FxDIRECTxAUTH; + + if (m_bBirthday) + status |= ICQ_STATUS_FxBIRTHDAY; + if (getInvisible()) + { + status |= ICQ_STATUS_FxPRIVATE | ICQ_STATUS_FxHIDExIP; + status &= ~(ICQ_STATUS_FxDIRECTxLISTED | ICQ_STATUS_FxDIRECTxAUTH); + } + return status; +} + +void ICQClient::interfaceDown(QString ifname) +{ + log(L_DEBUG, "icq: interface down: %s", qPrintable(ifname)); +} + +void ICQClient::interfaceUp(QString ifname) +{ + if(getMediaSense()) + { + log(L_DEBUG, "icq: interface up: %s", qPrintable(ifname)); + if(!m_bconnectionLost) + return; + + // Try to connect + setStatus(STATUS_ONLINE, false); + } +} + +ICQUserData *ICQClient::findContact(unsigned long l, const QString *alias, bool bCreate, Contact *&contact, Group *grp, bool bJoin) +{ + return findContact(QString::number(l), alias, bCreate, contact, grp, bJoin); +} + +ICQUserData *ICQClient::findContact(const QString &screen, const QString *alias, bool bCreate, Contact *&contact, Group *grp, bool bJoin) +{ + if (screen.isEmpty()) + return NULL; + + QString s = screen.toLower(); + + ContactList::ContactIterator it; + ICQUserData *data; + unsigned long uin = screen.toULong(); + + while ((contact = ++it) != NULL) + { + ClientDataIterator it(contact->clientData, this); + while ((data = toICQUserData(++it)) != NULL) + { + if (uin && data->Uin.toULong() != uin || (uin == 0 && s != data->Screen.str())) + continue; + bool bChanged = false; + if (alias) + { + if (!alias->isEmpty()) + { + bChanged = contact->getName() != *alias; + if(bChanged) + contact->setName(*alias); + } + data->Alias.str() = *alias; + } + if (grp && contact->getGroup() != (int)grp->id()) + { + contact->setGroup(grp->id()); + bChanged = true; + } + if (bChanged) + { + EventContact e(contact, EventContact::eChanged); + e.process(); + } + return data; + } + } + if (!bCreate) + return NULL; + if (bJoin) + { + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (client == this || client->protocol() != protocol()) + continue; + ICQClient *c = static_cast(client); + it.reset(); + while ((contact = ++it) != NULL) + { + ClientDataIterator it(contact->clientData, c); + while ((data = toICQUserData(++it)) != NULL) + { + if (uin && data->Uin.toULong() != uin || (uin == 0 && s != data->Screen.str())) + continue; + data = toICQUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + data->Uin.asULong() = uin; + if (uin == 0) + data->Screen.str() = s; + bool bChanged = false; + if(alias) + { + if(!alias->isEmpty()) + { + bChanged = contact->getName() != *alias; + if(bChanged) + contact->setName(*alias); + } + data->Alias.str() = *alias; + } + if (grp && (int)grp->id() != contact->getGroup()) + { + contact->setGroup(grp->id()); + bChanged = true; + } + if (bChanged) + { + EventContact e(contact, EventContact::eChanged); + e.process(); + updateInfo(contact, data); + } + updateInfo(contact, data); + return data; + } + } + } + if (alias && !alias->isEmpty()) + { + QString name = alias->toLower(); + it.reset(); + while ((contact = ++it) != NULL) + if (contact->getName().toLower() == name){ + ICQUserData *data = toICQUserData((SIM::clientData*) contact->clientData.createData(this)); // FIXME unsafe type conversion + data->Uin.asULong() = uin; + if (uin == 0) + data->Screen.str() = screen; + data->Alias.str() = alias ? *alias : QString::null; + EventContact e(contact, EventContact::eChanged); + e.process(); + m_bJoin = true; + updateInfo(contact, data); + return data; + } + } + } + contact = getContacts()->contact(0, true); + data = toICQUserData((SIM::clientData*) contact->clientData.createData(this)); // FIXME unsafe type conversion + data->Uin.asULong() = uin; + if (uin == 0) + data->Screen.str() = s; + QString name; + if (alias) + name = *alias; + else if (uin) + name = QString::number(uin); + else + name = screen; + if(alias) + data->Alias.str() = *alias; + contact->setName(name); + if (grp) + contact->setGroup(grp->id()); + EventContact e(contact, EventContact::eChanged); + e.process(); + updateInfo(contact, data); + return data; +} + +ICQUserData *ICQClient::findGroup(unsigned id, const QString *alias, Group *&grp) +{ + ContactList::GroupIterator it; + ICQUserData *data; + while ((grp = ++it) != NULL) + { + data = toICQUserData((SIM::clientData*)grp->clientData.getData(this)); // FIXME unsafe type conversion + if (!data || data->IcqID.toULong() != id) + continue; + + if (alias) + data->Alias.str() = *alias; + return data; + } + if (alias == NULL) + return NULL; + it.reset(); + QString name = *alias; + while ((grp = ++it) != NULL) + { + if (grp->getName() == name) + { + data = toICQUserData((SIM::clientData*)grp->clientData.createData(this)); // FIXME unsafe type conversion + data->IcqID.asULong() = id; + data->Alias.str() = *alias; + return data; + } + } + grp = getContacts()->group(0, true); + grp->setName(name); + data = toICQUserData((SIM::clientData*)grp->clientData.createData(this)); // FIXME unsafe type conversion + data->IcqID.asULong() = id; + data->Alias.str() = *alias; + EventGroup e(grp, EventGroup::eChanged); + e.process(); + return data; +} + +void ICQClient::setOffline(ICQUserData *data) +{ + QString name = dataName(data); + for (list::iterator it = m_acceptMsg.begin(); it != m_acceptMsg.end(); ) + { + Message *msg = *it; //will sometimes not work, content: it is broken then: 0xcdcdcdcd, reason seems to be Filetransfer.. however.. + + if(!msg->client().isEmpty() && name == msg->client()) + { + EventMessageDeleted(msg).process(); + delete msg; + m_acceptMsg.erase(it); + it = m_acceptMsg.begin(); + } + ++it; //FIXME: Exception: Client-Operator not incrementable, because variable "it" is broken at this position, anyhow + } + if (data->Direct.object()) + { + delete data->Direct.object(); + data->Direct.clear(); + } + if (data->DirectPluginInfo.object()) + { + delete data->DirectPluginInfo.object(); + data->DirectPluginInfo.clear(); + } + if (data->DirectPluginStatus.object()) + { + delete data->DirectPluginStatus.object(); + data->DirectPluginStatus.clear(); + } + data->bNoDirect.asBool() = false; + data->Status.asULong() = ICQ_STATUS_OFFLINE; + data->Class.asULong() = 0; + data->bTyping.asBool() = false; + data->bBadClient.asBool() = false; + data->bInvisible.asBool() = false; + data->StatusTime.asULong()= QDateTime::currentDateTime().toTime_t(); + data->AutoReply.str() = QString::null; +} + +static void addIcon(QSet *s, const QString &icon, const QString &statusIcon) +{ + if (!s || statusIcon == icon) + return; + s->insert(icon); +} + +void ICQClient::contactInfo(void *_data, unsigned long &curStatus, unsigned &style, QString &statusIcon, QSet *icons) +{ + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + unsigned status = STATUS_ONLINE; + unsigned client_status = data->Status.toULong(); + if (client_status == ICQ_STATUS_OFFLINE) + status = STATUS_OFFLINE; + else if (client_status & ICQ_STATUS_DND) + status = STATUS_DND; + else if (client_status & ICQ_STATUS_OCCUPIED) + status = STATUS_OCCUPIED; + else if (client_status & ICQ_STATUS_NA) + status = STATUS_NA; + else if (client_status & ICQ_STATUS_AWAY) + status = STATUS_AWAY; + else if (client_status & ICQ_STATUS_FFC) + status = STATUS_FFC; + unsigned iconStatus = status; + QString dicon; + if (data->Uin.toULong()) + if (!(iconStatus == STATUS_ONLINE && client_status & ICQ_STATUS_FxPRIVATE)) + { + const CommandDef *def = ICQProtocol::_statusList(); + for (; !def->text.isEmpty(); def++) + { + if (def->id != iconStatus) + continue; + dicon = def->icon; + break; + } + } + else dicon = "ICQ_invisible"; + else + { + if (status != STATUS_OFFLINE) + { + status = STATUS_ONLINE; + dicon = "AIM_online"; + if (data->Class.toULong() & CLASS_AWAY) + { + status = STATUS_AWAY; + dicon = "AIM_away"; + } + } + else + dicon = "AIM_offline"; + } + if(dicon.isEmpty()) + return; + if (status == STATUS_OCCUPIED) + status = STATUS_DND; + if (status == STATUS_FFC) + status = STATUS_ONLINE; + if (status > curStatus) + { + curStatus = status; + if (!statusIcon.isEmpty() && icons) + icons->insert(statusIcon); + statusIcon = dicon; + } + else if (!statusIcon.isEmpty()) + addIcon(icons, dicon, statusIcon); + else + statusIcon = dicon; + if (status == STATUS_OFFLINE && data->bInvisible.toBool()) + { + status = STATUS_INVISIBLE; + if (status > curStatus) + curStatus = status; + } + if (icons) + { + if ((iconStatus != STATUS_ONLINE && iconStatus != STATUS_OFFLINE && client_status & ICQ_STATUS_FxPRIVATE) || data->bInvisible.toBool()) + addIcon(icons, "ICQ_invisible", statusIcon); + if (data->Status.toULong() & ICQ_STATUS_FxBIRTHDAY) { + QDate today=QDate::currentDate(); + if (today.day()==(int)data->BirthDay.toULong() && today.month()==(int)data->BirthMonth.toULong()) + addIcon(icons, "partytime", statusIcon); + else + addIcon(icons, "birthday", statusIcon); + } + if (data->FollowMe.toULong() == 1) + addIcon(icons, "phone", statusIcon); + if (data->FollowMe.toULong() == 2) + addIcon(icons, "nophone", statusIcon); + if (status != STATUS_OFFLINE) + { + if (data->SharedFiles.toBool()) + addIcon(icons, "sharedfiles", statusIcon); + if (data->ICQPhone.toULong() == 1) + addIcon(icons, "icqphone", statusIcon); + if (data->ICQPhone.toULong() == 2) + addIcon(icons, "icqphonebusy", statusIcon); + } + if (data->bTyping.toBool()) + addIcon(icons, "typing", statusIcon); + DirectClient *dc = dynamic_cast(data->Direct.object()); + if (dc && dc->isSecure()) + addIcon(icons, "encrypted", statusIcon); + } + if (data->InvisibleId.toULong()) + style |= CONTACT_STRIKEOUT; + if (data->VisibleId.toULong()) + style |= CONTACT_ITALIC; + if (data->WaitAuth.toBool()) + style |= CONTACT_UNDERLINE; +} + +void ICQClient::ping() +{ + if (getState() == Connected) + { + bool bBirthday = false; + if (!m_bAIM) + { + int year = data.owner.BirthYear.toULong(); + int month = data.owner.BirthMonth.toULong(); + int day = data.owner.BirthDay.toULong(); + if (day && month && year) + { + QDate tNow = QDate::currentDate(); + QDate tBirthday(tNow.year(), month, day); + // we send it two days before we've birthday + int diff = tNow.daysTo(tBirthday); + if (diff < 0 || diff > 2) + { + tBirthday = tBirthday.addYears(1); + diff = tNow.daysTo(tBirthday); + if(diff >= 0 && diff <=2) + bBirthday = true; + } + else bBirthday = true; + } + } + if (bBirthday != m_bBirthday) + { + m_bBirthday = bBirthday; + setStatus(m_status); + } + else if (getKeepAlive() || m_bHTTP) + { + bool bSend = true; + for (unsigned i = 0; i < m_rates.size(); i++) + { + if (!m_rates[i].delayed.size()) + continue; + bSend = false; + break; + } + if (bSend) + { + flap(ICQ_CHNxPING); + sendPacket(false); + } + } + snacICBM()->processSendQueue(); + checkListRequest(); + checkInfoRequest(); + QTimer::singleShot(PING_TIMEOUT * 1000, this, SLOT(ping())); + } +} + +void ICQClient::setupContact(Contact *contact, void *_data) +{ + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString phones; + if (!data->HomePhone.str().isEmpty()) + { + phones += trimPhone(data->HomePhone.str()); + phones += ",Home Phone,"; + phones += QString::number(PHONE); + } + if (!data->HomeFax.str().isEmpty()) + { + if (phones.length()) + phones += ';'; + phones += trimPhone(data->HomeFax.str()); + phones += ",Home Fax,"; + phones += QString::number(FAX); + } + if (!data->WorkPhone.str().isEmpty()) + { + if (phones.length()) + phones += ';'; + phones += trimPhone(data->WorkPhone.str()); + phones += ",Work Phone,"; + phones += QString::number(PHONE); + } + if (!data->WorkFax.str().isEmpty()) + { + if (phones.length()) + phones += ';'; + phones += trimPhone(data->WorkFax.str()); + phones += ",Work Fax,"; + phones += QString::number(FAX); + } + if (!data->PrivateCellular.str().isEmpty()) + { + if (phones.length()) + phones += ';'; + phones += trimPhone(data->PrivateCellular.str()); + phones += ",Private Cellular,"; + phones += QString::number(CELLULAR); + } + if(data->PhoneBook.str().isEmpty()) + { + if (phones.length()) + phones += ';'; + phones += data->PhoneBook.str(); + } + contact->setPhones(phones, name()); + QString mails; + if (!data->EMail.str().isEmpty()) + { + mails += data->EMail.str().trimmed(); + QString emails = data->EMails.str(); + while (emails.length()) + { + QString mailItem = getToken(emails, ';', false); + QString mail = getToken(mailItem, '/').trimmed(); + if (mail.length()) + { + if (mails.length()) + mails += ';'; + mails += mail; + } + } + } + QString n = name(); + contact->setEMails(mails, n); + QString firstName = data->FirstName.str(); + if (firstName.length()) + contact->setFirstName(firstName, n); + QString lastName = data->LastName.str(); + if (lastName.length()) + contact->setLastName(lastName, n); + if (contact->getName().isEmpty()) + contact->setName(QString::number(data->Uin.toULong())); + QString nick = data->Nick.str(); + if (nick.isEmpty()) + nick = data->Alias.str(); + if (!nick.isEmpty()) + { + QString name = QString::number(data->Uin.toULong()); + if (name == contact->getName()) + contact->setName(nick); + } +} + +QString ICQClient::trimPhone(const QString &from) +{ + QString res; + if (from.isEmpty()) + return res; + res = from; + int idx = res.indexOf("SMS"); + if(idx != -1) + res = res.left(idx); + return res.trimmed(); +} + +QString ICQClient::contactTip(void *_data) +{ + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString res; + QString statusText; + unsigned long status = STATUS_OFFLINE; + unsigned style = 0; + QString statusIcon; + contactInfo(data, status, style, statusIcon); + if (status == STATUS_INVISIBLE) + { + res += ""; + res += i18n("Possibly invisible"); + } + else + { + res += ""; + if (statusIcon == "ICQ_invisible") + { + res += ' '; + res += i18n("Invisible"); + } + else if (data->Uin.toULong()) + for (const CommandDef *cmd = ICQProtocol::_statusList(); !cmd->text.isEmpty(); cmd++) + { + if (cmd->icon == statusIcon) + { + res += ' '; + statusText += i18n(cmd->text); + res += statusText; + break; + } + } + else + { + if (status == STATUS_OFFLINE) + res += i18n("Offline"); + else if (status == STATUS_ONLINE) + res += i18n("Online"); + else + res += i18n("Away"); + } + } + res += "
    "; + if (data->Uin.toULong()) + { + res += "UIN: "; + res += QString::number(data->Uin.toULong()); + res += ""; + }else{ + res += ""; + res += data->Screen.str(); + res += ""; + } + if (data->WarningLevel.toULong()) + { + res += "
    "; + res += i18n("Warning level"); + res += ": "; + res += QString::number(warnLevel(data->WarningLevel.toULong())); + res += "%
    "; + } + if (data->Status.toULong() == ICQ_STATUS_OFFLINE) + { + if (data->StatusTime.toULong()){ + res += "
    "; + res += i18n("Last online"); + res += ": "; + res += formatDateTime(data->StatusTime.toULong()); + } + } + else + { + if (data->OnlineTime.toULong()) + { + res += "
    "; + res += i18n("Online"); + res += ": "; + res += formatDateTime(data->OnlineTime.toULong()); + } + if (data->Status.toULong() & (ICQ_STATUS_AWAY | ICQ_STATUS_NA)){ + res += "
    "; + res += statusText; + res += ": "; + res += formatDateTime(data->StatusTime.toULong()); + } + } + if (data->IP.ip()) + { + res += "
    "; + res += formatAddr(data->IP, data->Port.toULong()); + } + if ((data->RealIP.ip()) && ((data->IP.ip() == NULL) || (get_ip(data->IP) != get_ip(data->RealIP)))) + { + res += "
    "; + res += formatAddr(data->RealIP, data->Port.toULong()); + } + QString client_name = clientName(data); + if (client_name.length()) + { + res += "
    "; + res += quoteString(client_name); + } + QString pictureFileName = pictureFile(data); + QImage img(pictureFileName); + if (!img.isNull()) + { + int w = img.width(); + int h = img.height(); + if (h > w) + { + if (h > 60) + { + w = w * 60 / h; + h = 60; + } + } + else if (w > 60) + { + h = h * 60 / w; + w = 60; + } + res += "
    "; + } + if (!data->AutoReply.str().isEmpty()) + { + res += "

    "; + res += quoteString(data->AutoReply.str()); + } + if (!(data->Status.toULong() & ICQ_STATUS_FxBIRTHDAY)) + return res; + + QDate today=QDate::currentDate(); + if (today.day()==(int)data->BirthDay.toULong() && today.month()==(int)data->BirthMonth.toULong()) + { + //Today is birthday! + //addIcon(icons, "partytime", statusIcon); + res += "

    "+i18n("has birthday today!")+"
    "; + if (!m_bBirthdayInfoDisplayed) + { + int ret=QMessageBox::question(0, + i18n("Birthday Notification"), + QString("%1 (%2 %3) %4\n\n%5").arg(data->Alias.str(), data->FirstName.str(), data->LastName.str(), i18n("has birthday today!"), i18n("Send GreetingCard?")), + QMessageBox::Yes | QMessageBox::No); + m_bBirthdayInfoDisplayed=true; + //Todo: navigate to birthday greetingcard-webpage ;) + EventGoURL e(QString("http://www.google.com/search?q=ecards")); + if (ret==QMessageBox::Yes) e.process(); + } + + } + else + { + //Birthday one or two more days. + //addIcon(icons, "birthday", statusIcon); + int nextbirthdayyear=today.year(); + if ((int)data->BirthMonth.toULong()==1 && (int)data->BirthDay.toULong()<2) //special case + nextbirthdayyear=today.year()+1; + + QDate birthday(nextbirthdayyear,(int)data->BirthMonth.toULong(),(int)data->BirthDay.toULong()); + int remainingdays=today.daysTo(birthday); + res += QString("

    "+i18n("has birthday in %1 days.").arg(QString::number(remainingdays))+"
    "); + } + return res; +} + +unsigned long ICQClient::warnLevel(unsigned long level) +{ + level = ((level + 5) / 10); + if (level > 100) + level = 100; + return level; +} + +bool ICQClient::hasCap(const ICQUserData *data, cap_id_t n) +{ + unsigned long val = n > 31 ? data->Caps2.toULong() : data->Caps.toULong(); + int pos = (int)n % 32; + return (val & (1 << pos)) != 0; +} + +void ICQClient::setCap(ICQUserData *data, cap_id_t n) +{ + unsigned long &val = n > 31 ? data->Caps2.asULong() : data->Caps.asULong(); + int pos = (int)n % 32; + val |= (1 << pos); +} + +static QString verString(unsigned ver) +{ + QString res; + if (ver == 0) + return res; + unsigned char v[4]; + v[0] = (unsigned char)((ver >> 24) & 0xFF); + v[1] = (unsigned char)((ver >> 16) & 0xFF); + v[2] = (unsigned char)((ver >> 8) & 0xFF); + v[3] = (unsigned char)((ver >> 0) & 0xFF); + if ((v[0] & 0x80) || (v[1] & 0x80) || (v[2] & 0x80) || (v[3] & 0x80)) + return res; + + res.sprintf(" %u.%u", v[0], v[1]); + if (v[2] || v[3]) + { + QString s; + s.sprintf(".%u", v[2]); + res += s; + } + if (v[3]) + { + QString s; + s.sprintf(".%u", v[3]); + res += s; + } + return res; +} + +QString ICQClient::clientName(ICQUserData *data) +{ + QString res; + if (data->Version.toULong()) + res.sprintf("v%lu ", data->Version.toULong()); + + if (data->InfoUpdateTime.toULong() == 0xFFFFFFFFL) + { + if (data->PluginStatusTime.toULong() == 0xFFFFFFFFL && data->PluginInfoTime.toULong() == 0xFFFFFFFFL) + { + res += "GAIM"; + return res; + } + res += "MIRANDA"; + res += hasCap(data, CAP_ICQJP) ? verString(data->Build.toULong()) : verString(data->PluginInfoTime.toULong() & 0xFFFFFF); + if (!(data->PluginInfoTime.toULong() & 0x80000000)) + return res; + + res += " alpha"; + return res; + } + if (data->InfoUpdateTime.toULong() == 0xFFFFFF8FL) + { + res += "StrICQ"; + res += verString(data->PluginInfoTime.toULong() & 0xFFFFFF); + return res; + } + else if (data->InfoUpdateTime.toULong() == 0xFFFFFF42L) + { + res += "mICQ"; + return res; + } + else if (data->InfoUpdateTime.toULong() == 0xFFFFFFBEL) + { + res += "alicq"; + res += verString(data->PluginInfoTime.toULong() & 0xFFFFFF); + return res; + } + else if (data->InfoUpdateTime.toULong() == 0xFFFFFF7FL) + { + res += "&RQ"; + res += verString(data->PluginInfoTime.toULong() & 0xFFFFFF); + return res; + } + else if (data->InfoUpdateTime.toULong() == 0xFFFFFFABL) + { + res += "YSM"; + res += verString(data->PluginInfoTime.toULong() & 0xFFFF); + return res; + } + else if (data->InfoUpdateTime.toULong() == 0x04031980L) + { + QString r; + r.sprintf("vICQ 0.43.%lu.%lu", data->PluginInfoTime.toULong() & 0xffff, data->PluginInfoTime.toULong() & (0x7fff0000) >> 16); + res += r; + return res; + } + else if (data->InfoUpdateTime.toULong() == 0x3AA773EEL && data->PluginStatusTime.toULong() == 0x3AA66380L && data->PluginInfoTime.toULong() == 0x3A877A42L) + { + res += "libicq2000"; + return res; + } + + if (hasCap(data, CAP_MIRANDA)) + { + QString r; + unsigned ver1 = (data->Build.toULong() >> 24) & 0x7F; + unsigned ver2 = (data->Build.toULong() >> 16) & 0xFF; + unsigned ver3 = (data->Build.toULong() >> 8) & 0xFF; + unsigned ver4 = (data->Build.toULong() >> 0) & 0xFF; + r.sprintf("Miranda %u.%u.%u.%u", ver1, ver2, ver3, ver4); + // highest bit set -> alpha version + if(((data->Build.toULong() >> 24) & 0x80) != 0x80) + return res + r; + + r += " (alpha)"; + return res + r; + } + if (hasCap(data, CAP_QIP)) + { + res += "QIP 2005a"; + return res; + } + if (hasCap(data, CAP_JIMM)) + { + QString r; + unsigned maj = (data->Build.toULong() >> 24) & 0xFF; + unsigned min = (data->Build.toULong() >> 16) & 0xFF; + unsigned rev = (data->Build.toULong() >> 0) & 0xFFFF; + if(rev) + r.sprintf("Jimm %d.%d.%d", maj, min, rev); + else + r.sprintf("Jimm %d.%d", maj, min); + return res + r; + } + if (hasCap(data, CAP_ICQ51)) + { + res += "ICQ 5.1"; + return res; + } + if (hasCap(data, CAP_ICQ5_1) && hasCap(data, CAP_ICQ5_3) && hasCap(data, CAP_ICQ5_4)) + { + res += "ICQ 5.0"; + return res; + } + if (hasCap(data, CAP_ICQ5_1)) + { + log( L_DEBUG, "CAP_ICQ5_1 without all others" ); + } + if (hasCap(data, CAP_ICQ5_3)) + { + log( L_DEBUG, "CAP_ICQ5_3 without all others" ); + } + if (hasCap(data, CAP_ICQ5_4)) + { + log( L_DEBUG, "CAP_ICQ5_4 without all others" ); + } + if (hasCap(data, CAP_TRIL_CRYPT) || hasCap(data, CAP_TRILLIAN)) + { + res += "Trillian"; + return res; + } + + if (hasCap(data, CAP_SIMOLD)) + { + QString r; + unsigned hiVersion = (data->Build.toULong() >> 6) - 1; + unsigned loVersion = data->Build.toULong() & 0x1F; + r.sprintf("SIM %u.%u", hiVersion, loVersion); + return res + r; + } + + if (hasCap(data, CAP_SIM)) + { + QString r; + unsigned ver1 = (data->Build.toULong() >> 24) & 0xFF; + unsigned ver2 = (data->Build.toULong() >> 16) & 0xFF; + unsigned ver3 = (data->Build.toULong() >> 8) & 0xFF; + unsigned ver4 = data->Build.toULong() & 0x0F; + if (ver4) + r.sprintf("SIM %u.%u.%u.%u", ver1, ver2, ver3, ver4); + else if (ver3) + r.sprintf("SIM %u.%u.%u", ver1, ver2, ver3); + else + r.sprintf("SIM %u.%u", ver1, ver2); + res += r; + if (data->Build.toULong() & 0x80) + res += "/win32"; + + if (data->Build.toULong() & 0x40) + res += "/MacOS X"; + return res; + } + + if (hasCap(data, CAP_LICQ)) + { + QString r; + unsigned ver1 = (data->Build.toULong() >> 24) & 0xFF; + unsigned ver2 = (data->Build.toULong() >> 16) & 0xFF; + unsigned ver3 = (data->Build.toULong() >> 8) & 0xFF; + ver2 %=100; // see licq source + r.sprintf("Licq %u.%u.%u", ver1, ver2, ver3); + res += r; + if ((data->Build.toULong() & 0xFF) == 1) + res += "/SSL"; + return res; + } + if (hasCap(data, CAP_KOPETE)) + { + // last 4 bytes determine version + // NOTE change with each Kopete Release! + // first number, major version + // second number, minor version + // third number, point version 100+ + // fourth number, point version 0-99 + QString r; + unsigned ver1 = (data->Build.toULong() >> 24) & 0xFF; // major + unsigned ver2 = (data->Build.toULong() >> 16) & 0xFF; // minor + unsigned ver3 = ((data->Build.toULong() >> 8) & 0xFF) * 100; + ver3 += (data->Build.toULong() >> 0) & 0xFF; + r.sprintf("Kopete %u.%u.%u", ver1, ver2, ver3); + res += r; + return res; + } + if (hasCap(data, CAP_XTRAZ)) + { + res += "ICQ 4.0 Lite"; + return res; + } + if (hasCap(data, CAP_MACICQ)) + { + res += "ICQ for Mac"; + return res; + } + // gaim 2.0 + if (hasCap(data, CAP_AIM_SENDFILE) && + hasCap(data, CAP_AIM_IMIMAGE) && + hasCap(data, CAP_AIM_BUDDYCON) && + hasCap(data, CAP_UTF) && + hasCap(data, CAP_AIM_CHAT)) + { + res += "gaim 2.0"; + return res; + } + if (hasCap(data, CAP_AIM_CHAT)) + { + res += "AIM"; + return res; + } + if ((data->InfoUpdateTime.toULong() & 0xFF7F0000L) == 0x7D000000L) + { + QString r; + unsigned ver = data->InfoUpdateTime.toULong() & 0xFFFF; + if (ver % 10) + r.sprintf("Licq %u.%u.%u", ver / 1000, (ver / 10) % 100, ver % 10); + else + r.sprintf("Licq %u.%u", ver / 1000, (ver / 10) % 100); + res += r; + if (data->InfoUpdateTime.toULong() & 0x00800000L) + res += "/SSL"; + return res; + } + + + if (hasCap(data, CAP_TYPING)) + { + if (data->Version.toULong() == 10) + res += "ICQ 2003b"; + else if (data->Version.toULong() == 9) + res += "ICQ Lite"; + else + res += "ICQ2go"; + return res; + } + if (data->InfoUpdateTime.toULong() && + (data->InfoUpdateTime.toULong() == data->PluginStatusTime.toULong()) && + (data->PluginStatusTime.toULong() == data->PluginInfoTime.toULong()) && + (data->Caps.toULong() == 0) && (data->Caps2.toULong() == 0)){ + res += "vICQ"; + return res; + } + if (hasCap(data, CAP_AIM_BUDDYCON)) + { + res += "gaim"; + return res; + } + if ((hasCap(data, CAP_STR_2001) || hasCap(data, CAP_SRV_RELAY)) && hasCap(data, CAP_IS_2001)) + { + res += "ICQ 2001"; + return res; + } + if ((hasCap(data, CAP_STR_2001) || hasCap(data, CAP_SRV_RELAY)) && hasCap(data, CAP_IS_2002)) + { + res += "ICQ 2002"; + return res; + } + if (hasCap(data, CAP_RTF) && hasCap(data, CAP_UTF) && + hasCap(data, CAP_SRV_RELAY) && hasCap(data, CAP_DIRECT)) + { + res += "ICQ 2003a"; + return res; + } + if (hasCap(data, CAP_SRV_RELAY) && hasCap(data, CAP_DIRECT)) + { + res += "ICQ 2001b"; + return res; + } + if ((data->Version.toULong() == 7) && hasCap(data, CAP_RTF)) + { + res += "GnomeICU"; + return res; + } + // ICQ2go doesn't use CAP_TYPING anymore + if ((data->Version.toULong() == 7) && hasCap(data, CAP_UTF)) + { + res += "ICQ2go"; + return res; + } + return res; +} + +const unsigned MAIN_INFO = 1; +const unsigned HOME_INFO = 2; +const unsigned WORK_INFO = 3; +const unsigned MORE_INFO = 4; +const unsigned ABOUT_INFO = 5; +const unsigned INTERESTS_INFO = 6; +const unsigned PAST_INFO = 7; +const unsigned PICTURE_INFO = 8; +const unsigned NETWORK = 9; +const unsigned SECURITY = 10; + +static CommandDef icqWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "ICQ_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + HOME_INFO, + I18N_NOOP("Home info"), + "home", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + WORK_INFO, + I18N_NOOP("Work info"), + "work", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + MORE_INFO, + I18N_NOOP("More info"), + "more", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + ABOUT_INFO, + I18N_NOOP("About info"), + "info", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + INTERESTS_INFO, + I18N_NOOP("Interests"), + "interest", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + PAST_INFO, + I18N_NOOP("Group/Past"), + "past", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + PICTURE_INFO, + I18N_NOOP("Picture"), + "pict", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +static CommandDef aimWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "AIM_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + ABOUT_INFO, + I18N_NOOP("About info"), + "info", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +static CommandDef icqConfigWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "ICQ_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + HOME_INFO, + I18N_NOOP("Home info"), + "home", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + WORK_INFO, + I18N_NOOP("Work info"), + "work", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + MORE_INFO, + I18N_NOOP("More info"), + "more", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + ABOUT_INFO, + I18N_NOOP("About info"), + "info", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + INTERESTS_INFO, + I18N_NOOP("Interests"), + "interest", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + PAST_INFO, + I18N_NOOP("Group/Past"), + "past", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + PICTURE_INFO, + I18N_NOOP("Picture"), + "pict", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + NETWORK, + I18N_NOOP("Network"), + "network", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + SECURITY, + I18N_NOOP("Security"), + "security", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +static CommandDef aimConfigWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "AIM_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + ABOUT_INFO, + I18N_NOOP("About info"), + "info", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + NETWORK, + I18N_NOOP("Network"), + "network", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +CommandDef *ICQClient::infoWindows(Contact*, void *_data) +{ + ICQUserData *data = toICQUserData((SIM::clientData*) _data); // FIXME unsafe type conversion + CommandDef *def = data->Uin.toULong() ? icqWnd : aimWnd; + QString name = i18n(protocol()->description()->text); + name += ' '; + if (data->Uin.toULong()) + name += QString::number(data->Uin.toULong()); + else + name += data->Screen.str(); + def->text_wrk = name; + return def; +} + +CommandDef *ICQClient::configWindows() +{ + CommandDef *def = icqConfigWnd; + QString name = i18n(protocol()->description()->text); + name += ' '; + if (m_bAIM) + { + name += data.owner.Screen.str(); + def = aimConfigWnd; + } + else name += QString::number(data.owner.Uin.toULong()); + def->text_wrk = name; + return def; +} + +QWidget *ICQClient::infoWindow(QWidget *parent, Contact *contact, void *_data, unsigned id) +{ + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + switch (id){ + case MAIN_INFO: + if (data->Uin.toULong()) + return new ICQInfo(parent, data, contact->id(), this); + return new AIMInfo(parent, data, contact->id(), this); + case HOME_INFO: + return new HomeInfo(parent, data, contact->id(), this); + case WORK_INFO: + return new WorkInfo(parent, data, contact->id(), this); + case MORE_INFO: + return new MoreInfo(parent, data, contact->id(), this); + case ABOUT_INFO: + return new AboutInfo(parent, data, contact->id(), this); + case INTERESTS_INFO: + return new InterestsInfo(parent, data, contact->id(), this); + case PAST_INFO: + return new PastInfo(parent, data, contact->id(), this); + case PICTURE_INFO: + return new ICQPicture(parent, data, this); + } + return NULL; +} + +QWidget *ICQClient::configWindow(QWidget *parent, unsigned id) +{ + switch (id){ + case MAIN_INFO: + if (m_bAIM) + return new AIMInfo(parent, NULL, 0, this); + return new ICQInfo(parent, NULL, 0, this); + case HOME_INFO: + return new HomeInfo(parent, NULL, 0, this); + case WORK_INFO: + return new WorkInfo(parent, NULL, 0, this); + case MORE_INFO: + return new MoreInfo(parent, NULL, 0, this); + case ABOUT_INFO: + return new AboutInfo(parent, NULL, 0, this); + case INTERESTS_INFO: + return new InterestsInfo(parent, NULL, 0, this); + case PAST_INFO: + return new PastInfo(parent, NULL, 0, this); + case PICTURE_INFO: + return new ICQPicture(parent, NULL, this); + case NETWORK: + if (m_bAIM) + return new AIMConfig(parent, this, false); + return new ICQConfig(parent, this, false); + case SECURITY: + return new ICQSecure(parent, this); + } + return NULL; +} + +QWidget *ICQClient::searchWindow(QWidget *parent) +{ + if (getState() != Connected) + return NULL; + return new ICQSearch(this, parent); +} + +void ICQClient::updateInfo(Contact *contact, void *_data) +{ + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + if (getState() != Connected) + { + Client::updateInfo(contact, _data); + return; + } + if (data == NULL) + data = &this->data.owner; + if (data->Uin.toULong()) + { + addFullInfoRequest(data->Uin.toULong()); + addPluginInfoRequest(data->Uin.toULong(), PLUGIN_QUERYxINFO); + addPluginInfoRequest(data->Uin.toULong(), PLUGIN_QUERYxSTATUS); + addPluginInfoRequest(data->Uin.toULong(), PLUGIN_AR); + } + else + fetchProfile(data); + requestBuddy(data); +} + +void ICQClient::fetchAwayMessage(ICQUserData *data) +{ + addPluginInfoRequest(data->Uin.toULong(), PLUGIN_AR); +} + +bool ICQClient::processEvent(Event *e) +{ + TCPClient::processEvent(e); + switch (e->type()) { + case eEventAddContact: { + EventAddContact *ec = static_cast(e); + EventAddContact::AddContact *ac = ec->addContact(); + if (protocol()->description()->text == ac->proto) + { + Group *grp = getContacts()->group(ac->group); + Contact *contact; + QString tmp = ac->nick; + findContact(ac->addr, &tmp, true, contact, grp); + ec->setContact(contact); + return true; + } + break; + } + case eEventDeleteContact: { + EventDeleteContact *ec = static_cast(e); + QString addr = ec->alias(); + ContactList::ContactIterator it; + Contact *contact; + while ((contact = ++it) != NULL) + { + ICQUserData *data; + ClientDataIterator itc(contact->clientData, this); + while ((data = toICQUserData(++itc)) != NULL) + { + if (data->Screen.str() != addr) + continue; + contact->clientData.freeData(data); + ClientDataIterator itc(contact->clientData); + if (++itc == NULL) + delete contact; + return true; + } + } + break; + } + case eEventGetContactIP: { + EventGetContactIP *ei = static_cast(e); + Contact *contact = ei->contact(); + ICQUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toICQUserData(++it)) != NULL) + { + if (data->RealIP.ip()) + { + ei->setIP(data->RealIP.ip()); + return true; + } + if (data->IP.ip()) + { + ei->setIP(data->IP.ip()); + return true; + } + } + break; + } + case eEventMessageAccept: { + EventMessageAccept *ema = static_cast(e); + for (list::iterator it = m_acceptMsg.begin(); it != m_acceptMsg.end(); ++it){ + if ((*it)->id() == ema->msg()->id()){ + Message *msg = *it; + m_acceptMsg.erase(it); + snacICBM()->accept(msg, ema->dir(), ema->mode()); + return msg; + } + } + break; + } + case eEventMessageDecline: { + EventMessageDecline *emd = static_cast(e); + for (list::iterator it = m_acceptMsg.begin(); it != m_acceptMsg.end(); ++it){ + if ((*it)->id() == emd->msg()->id()) + { + Message *msg = *it; + m_acceptMsg.erase(it); + snacICBM()->decline(msg, emd->reason()); + return msg; + } + } + break; + } + case eEventMessageRetry: { + EventMessageRetry *emr = static_cast(e); + EventMessageRetry::MsgSend *m = emr->msgRetry(); + QStringList btns; + if (m->msg->getRetryCode() == static_cast(protocol()->plugin())->RetrySendOccupied){ + btns.append(i18n("Send &urgent")); + }else if (m->msg->getRetryCode() != static_cast(protocol()->plugin())->RetrySendDND){ + return false; + } + btns.append(i18n("Send to &list")); + btns.append(i18n("&Cancel")); + QString err = i18n(m->msg->getError()); + Command cmd; + cmd->id = CmdSend; + cmd->param = m->edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *msgWidget = eWidget.widget(); + if (msgWidget == NULL) + msgWidget = m->edit; + BalloonMsg *msg = new BalloonMsg(m, quoteString(err), btns, msgWidget, NULL, false); + connect(msg, SIGNAL(action(int, void*)), this, SLOT(retry(int, void*))); + msg->show(); + return true; + } + case eEventTemplateExpanded: { + EventTemplate *et = static_cast(e); + EventTemplate::TemplateExpand *t = et->templateExpand(); + list::iterator it; + for (it = arRequests.begin(); it != arRequests.end(); ++it) + if (&(*it) == t->param) + break; + if (it == arRequests.end()) + return false; + if (m_bAIM){ + if ((getState() == Connected) && (m_status == STATUS_AWAY)){ + if (it->bDirect){ + setAwayMessage(t->tmpl); + }else{ + sendCapability(t->tmpl); + m_snacICBM->sendICMB(1, 11); + m_snacICBM->sendICMB(2, 3); + m_snacICBM->sendICMB(4, 3); + snacICBM()->processSendQueue(); + fetchProfiles(); + } + } + return true; + } + ar_request ar = (*it); + if (ar.bDirect){ + Contact *contact; + ICQUserData *data = findContact(ar.screen, NULL, false, contact); + DirectClient *dc = dynamic_cast(data ? data->Direct.object() : 0); + if (dc){ + QByteArray answer; + if (data->Version.toULong() >= 10){ + answer = t->tmpl.toUtf8(); + }else{ + answer = getContacts()->fromUnicode(contact, t->tmpl); + } + dc->sendAck((unsigned short)(ar.id.id_l), ar.type, ar.flags, answer); + } + }else{ + ICQBuffer copy; + snacICBM()->sendAutoReply(ar.screen, ar.id, plugins[PLUGIN_NULL], + ar.id1, ar.id2, ar.type, (char)(ar.ack), 0, t->tmpl, 0, copy); + } + arRequests.erase(it); + return true; + } + case eEventContact: { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + switch(ec->action()) { + case EventContact::eDeleted: { + ICQUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toICQUserData(++it)) != NULL){ + if (data->IcqID.toULong() == 0) + continue; + list::iterator it; + for (it = listRequests.begin(); it != listRequests.end(); it++){ + if (it->type != LIST_USER_CHANGED) + continue; + if (it->screen == screen(data)) + break; + } + if (it != listRequests.end()) + listRequests.erase(it); + ListRequest lr; + lr.type = LIST_USER_DELETED; + lr.screen = screen(data); + lr.icq_id = (unsigned short)(data->IcqID.toULong()); + lr.grp_id = (unsigned short)(data->GrpId.toULong()); + lr.visible_id = (unsigned short)(data->ContactVisibleId.toULong()); + lr.invisible_id = (unsigned short)(data->ContactInvisibleId.toULong()); + lr.ignore_id = (unsigned short)(data->IgnoreId.toULong()); + listRequests.push_back(lr); + snacICBM()->processSendQueue(); + } + //m_snacBuddy->removeBuddy(contact); + break; + } + case EventContact::eChanged: { + if (getState() == Connected){ + if (!m_bAIM) + m_snacBuddy->addBuddy(contact); + if (contact == getContacts()->owner()){ + QDateTime now(QDateTime::currentDateTime()); + if (getContacts()->owner()->getPhones() != data.owner.PhoneBook.str()){ + data.owner.PhoneBook.str() = getContacts()->owner()->getPhones(); + data.owner.PluginInfoTime.asULong() = now.toTime_t(); + snacService()->sendPluginInfoUpdate(PLUGIN_PHONEBOOK); + } + /* + if (getPicture() != data.owner.Picture.str()){ + data.owner.Picture.str() = getPicture(); + data.owner.PluginInfoTime.asULong() = now; + snacService()->sendPluginInfoUpdate(PLUGIN_PICTURE); + } + */ + if (getContacts()->owner()->getPhoneStatus() != (int)data.owner.FollowMe.toULong()){ + data.owner.FollowMe.asULong() = getContacts()->owner()->getPhoneStatus(); + data.owner.PluginStatusTime.asULong() = now.toTime_t(); + snacService()->sendPluginStatusUpdate(PLUGIN_FOLLOWME, data.owner.FollowMe.toULong()); + } + return false; + } + ICQUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toICQUserData(++it)) != NULL){ + if (data->Uin.toULong() || data->ProfileFetch.toBool()) + continue; + fetchProfile(data); + } + } + addContactRequest(contact); + break; + } + default: + break; + } + break; + } + case eEventGroup: { + EventGroup *ev = static_cast(e); + Group *group = ev->group(); + if(!group->id()) + return false; + switch(ev->action()) { + case EventGroup::eChanged: + addGroupRequest(group); + break; + case EventGroup::eDeleted: { + ICQUserData *data = toICQUserData((SIM::clientData*)group->clientData.getData(this)); + if (data){ + ListRequest lr; + lr.type = LIST_GROUP_DELETED; + lr.icq_id = (unsigned short)(data->IcqID.toULong()); + listRequests.push_back(lr); + snacICBM()->processSendQueue(); + } + break; + } + case EventGroup::eAdded: + return false; + } + break; + } + case eEventMessageCancel: { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + return snacICBM()->cancelMessage(msg); + break; + } + case eEventCheckCommandState: { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->id == CmdPhones){ + if (!m_bAIM) + return true; + return false; + } + if(cmd->id == CmdFetchAway) { + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (!contact) + return false; + ClientDataIterator it(contact->clientData, this); + ICQUserData *data; + while ((data = toICQUserData(++it)) != NULL){ + unsigned long status = STATUS_OFFLINE; + unsigned style = 0; + QString statusIcon; + contactInfo(data, status, style, statusIcon); + if(status != STATUS_ONLINE && status != STATUS_OFFLINE) { + cmd->flags &= ~BTN_HIDE; + return true; + } + } + return false; + } + if ((cmd->bar_id == ToolBarContainer) || (cmd->bar_id == ToolBarHistory)){ + if (cmd->id == CmdChangeEncoding) + { + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + { + cmd->flags |= BTN_HIDE; + return true; + } + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (client == this) + { + cmd->flags |= BTN_HIDE; + break; + } + if (client->protocol() == protocol()) + break; + } + ClientDataIterator it(contact->clientData, this); + if ((++it) != NULL){ + cmd->flags &= ~BTN_HIDE; + return true; + } + return false; + } + } + if (cmd->menu_id == MenuContactGroup){ + if (cmd->id == CmdVisibleList) + { + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (client == this) + { + cmd->flags &= ~COMMAND_CHECKED; + break; + } + if (client->protocol() != protocol()) + continue; + + break; + } + ICQUserData *data; + bool bOK = false; + ClientDataIterator it(contact->clientData, this); + while ((data = toICQUserData(++it)) != NULL) + { + bOK = true; + if (data->VisibleId.toULong()) + cmd->flags |= COMMAND_CHECKED; + } + return bOK; + } + if (cmd->id == CmdInvisibleList){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + for (unsigned i = 0; i < getContacts()->nClients(); i++) + { + Client *client = getContacts()->getClient(i); + if (client == this) + { + cmd->flags &= ~COMMAND_CHECKED; + break; + } + if (client->protocol() == protocol()) + break; + } + ICQUserData *data; + bool bOK = false; + ClientDataIterator it(contact->clientData, this); + while ((data = toICQUserData(++it)) != NULL) + { + bOK = true; + if (data->InvisibleId.toULong()) + cmd->flags |= COMMAND_CHECKED; + } + return (void*)bOK; + } + } + break; + } + case eEventCommandExec: { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if(cmd->id == CmdFetchAway) + { + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + ClientDataIterator it(contact->clientData, this); + ICQUserData *data; + while ((data = toICQUserData(++it)) != NULL) + { + unsigned long status = STATUS_OFFLINE; + unsigned style = 0; + QString statusIcon; + contactInfo(data, status, style, statusIcon); + if(status != STATUS_ONLINE && status != STATUS_OFFLINE) + fetchAwayMessage(data); + } + cmd->flags &= ~COMMAND_CHECKED; + return false; + } + if (cmd->menu_id == MenuContactGroup){ + if (cmd->id == CmdVisibleList){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + SIM::clientData *data; + ICQUserData * icq_user_data; + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL) + { + if (data->Sign.asULong() == ICQ_SIGN) + { // Only ICQ contacts can be added to Visible list + icq_user_data=toICQUserData(data); + icq_user_data->VisibleId.asULong() = (cmd->flags & COMMAND_CHECKED) ? getListId() : 0; + EventContact eContact(contact, EventContact::eChanged); + eContact.process(); + } + } + return true; + } + if (cmd->id == CmdInvisibleList){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + SIM::clientData *data; + ICQUserData * icq_user_data; + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL) + { + if (data->Sign.asULong() == ICQ_SIGN) + { // Only ICQ contacts can be added to Invisible list + icq_user_data=toICQUserData(data); + icq_user_data->InvisibleId.asULong() = (cmd->flags & COMMAND_CHECKED) ? getListId() : 0; + EventContact eContact(contact, EventContact::eChanged); + eContact.process(); + } + } + return true; + } + } + break; + } + case eEventGoURL: { + EventGoURL *u = static_cast(e); + QString url = u->url(); + QString proto; + int n = url.indexOf(':'); + if (n < 0) + return false; + proto = url.left(n); + if ((proto != "icq") && (proto != "aim")) + return false; + url = url.mid(proto.length() + 1); + while (url.startsWith("/")) + url = url.mid(1); + QString s = unquoteString(url); + QString screen = getToken(s, ','); + if (!screen.isEmpty()) + { + Contact *contact; + findContact(screen, &s, true, contact); + Command cmd; + cmd->id = MessageGeneric; + cmd->menu_id = MenuMessage; + cmd->param = (void*)(contact->id()); + EventCommandExec(cmd).process(); + return true; + } + break; + } + case eEventInterfaceDown: + { + if(getMediaSense()) + { + EventInterfaceDown* ev = static_cast(e); + if (socket() != NULL && ev->getFd() == socket()->socket()->getFd()) + { + setState(Error, "Interface down"); + setStatus(STATUS_OFFLINE, false); + m_bconnectionLost = true; + } + } + break; + } + case eEventOpenMessage: { + if (getState() != Connected) + return false; + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if ((msg->type() != MessageOpenSecure) && + (msg->type() != MessageCloseSecure) && + (msg->type() != MessageWarning)) + return false; + QString client = msg->client(); + Contact *contact = getContacts()->contact(msg->contact()); + if (contact == NULL) + return false; + ICQUserData *data = NULL; + ClientDataIterator it(contact->clientData, this); + if (client.isEmpty()) + while ((data = toICQUserData(++it)) != NULL) + break; + while ((data = toICQUserData(++it)) != NULL) + if (dataName(data) == client) + break; + if (data == NULL) + return false; + if (msg->type() == MessageOpenSecure) + { + SecureDlg *dlg = NULL; + QWidgetList list = QApplication::topLevelWidgets(); + QWidget * w; + foreach(w,list) + { + if (!w->inherits("SecureDlg")) + continue; + dlg = static_cast(w); + if (dlg->m_client == this && dlg->m_contact == contact->id() && dlg->m_data == data) + break; + dlg = NULL; + } + if (dlg == NULL) + dlg = new SecureDlg(this, contact->id(), data); + raiseWindow(dlg); + return true; + } else + if (msg->type() == MessageWarning){ + if (!(data && (m_bAIM || data->Uin.toULong() == 0))) + return false; + + WarnDlg *dlg = new WarnDlg(NULL, data, this); + raiseWindow(dlg); + return true; + } + DirectClient *dc = dynamic_cast(data->Direct.object()); + if (dc && dc->isSecure()) + { + Message *m = new Message(MessageCloseSecure); + m->setContact(msg->contact()); + m->setClient(msg->client()); + m->setFlags(MESSAGE_NOHISTORY); + if (!dc->sendMessage(m)) + delete m; + return true; + } + break; + } + default: + break; + } + return false; +} + +bool ICQClient::send(Message *msg, void *_data) +{ + if (getState() != Connected) + return false; + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + SendMsg s; + switch (msg->type()){ + case MessageSMS: + if (m_bAIM) + return false; + s.msg = static_cast(msg); + s.text = s.msg->getPlainText(); + s.flags = SEND_1STPART; + snacICBM()->sendSMS(s); + return true; + case MessageAuthRequest: + if (data && data->WaitAuth.toBool()) + return sendAuthRequest(msg, data); + return false; + case MessageAuthGranted: + if (data && data->WantAuth.toBool()) + return sendAuthGranted(msg, data); + return false; + case MessageAuthRefused: + if (data && data->WantAuth.toBool()) + return sendAuthRefused(msg, data); + return false; + case MessageFile: + if (data && ((data->Status.toULong() & 0xFFFF) != ICQ_STATUS_OFFLINE)) + { + log(L_DEBUG, "send: MessageFile"); + if (!hasCap(data, CAP_AIM_SENDFILE)) + return false; + snacICBM()->sendThruServer(msg, data); + return true; + } + return false; + case MessageTypingStop: + case MessageTypingStart: + if ((data == NULL) || getDisableTypingNotification()) + return false; + if((data->Status.toULong() & 0xFFFF) == ICQ_STATUS_OFFLINE) + return false; + if (getInvisible()){ + if (data->VisibleId.toULong() == 0) + return false; + }else{ + if (data->InvisibleId.toULong()) + return false; + } + if (!hasCap(data, CAP_TYPING) && !hasCap(data, CAP_AIM_BUDDYCON)) + return false; + snacICBM()->sendMTN(screen(data), msg->type() == MessageTypingStart ? ICQ_MTN_START : ICQ_MTN_FINISH); + delete msg; + return true; + case MessageOpenSecure: { + if (data == NULL) + return false; + DirectClient *dc = dynamic_cast(data->Direct.object()); + if (dc && dc->isSecure()) + return false; + if (!dc){ + dc = new DirectClient(data, this, PLUGIN_NULL); + data->Direct.setObject(dc); + dc->connect(); + } + return dc->sendMessage(msg); + } + case MessageCloseSecure: { + if (data == NULL) + return false; + DirectClient *dc = dynamic_cast(data->Direct.object()); + if (dc && dc->isSecure()) + return dc->sendMessage(msg); + return false; + } + case MessageWarning: + return snacICBM()->sendThruServer(msg, data); + case MessageContacts: + if ((data == NULL) || ((data->Uin.toULong() == 0) && !hasCap(data, CAP_AIM_BUDDYLIST))) + return false; + } + if (data == NULL) + return false; + if (data->Uin.toULong()){ + bool bCreateDirect = false; + DirectClient *dc = dynamic_cast(data->Direct.object()); + if ((dc == NULL) && + !data->bNoDirect.toBool() && + (data->Status.toULong() != ICQ_STATUS_OFFLINE) && + (get_ip(data->IP) == get_ip(this->data.owner.IP))) + bCreateDirect = true; + if (!bCreateDirect && + (msg->type() == MessageGeneric) && + (data->Status.toULong() != ICQ_STATUS_OFFLINE) && + (get_ip(data->IP)) && + ((unsigned)msg->getPlainText().length() >= MAX_TYPE2_MESSAGE_SIZE)) + bCreateDirect = true; + if ((getInvisible() && (data->VisibleId.toULong() == 0)) || + (!getInvisible() && data->InvisibleId.toULong())) + bCreateDirect = false; + if (bCreateDirect){ + dc = new DirectClient(data, this, PLUGIN_NULL); + data->Direct.setObject(dc); + dc->connect(); + } + if (dc) + return dc->sendMessage(msg); + } + return snacICBM()->sendThruServer(msg, data); +} + +bool ICQClient::canSend(unsigned type, void *_data) +{ + if (_data && (((clientData*)_data)->Sign.toULong() != ICQ_SIGN)) + return false; + if (getState() != Connected) + return false; + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + switch (type){ + case MessageSMS: + return !m_bAIM; + case MessageGeneric: + case MessageUrl: + return (data != NULL); + case MessageContacts: + return (data != NULL) && (data->Uin.toULong() || hasCap(data, CAP_AIM_BUDDYLIST)); + case MessageAuthRequest: + return data && (data->WaitAuth.toBool()); + case MessageAuthGranted: + return data && (data->WantAuth.toBool()); + case MessageFile: + return data && + ((data->Status.toULong() & 0xFFFF) != ICQ_STATUS_OFFLINE) && + (data->Uin.toULong() || hasCap(data, CAP_AIM_SENDFILE)); + case MessageWarning: + return data && (data->Uin.toULong() == 0); + case MessageOpenSecure: + if ((data == NULL) || ((data->Status.toULong() & 0xFFFF) == ICQ_STATUS_OFFLINE)) + return false; + if (hasCap(data, CAP_LICQ) || + hasCap(data, CAP_SIM) || + hasCap(data, CAP_SIMOLD) || + ((data->InfoUpdateTime.toULong() & 0xFF7F0000L) == 0x7D000000L)){ + DirectClient *dc = dynamic_cast(data->Direct.object()); + if (dc) + return !(dc->isSecure()); + return get_ip(data->IP) || get_ip(data->RealIP); + } + return false; + case MessageCloseSecure: { + if(!data) + return false; + DirectClient *dc = dynamic_cast(data->Direct.object()); + return dc && dc->isSecure(); + } + } + return false; +} + +QString ICQClient::dataName(void *data) +{ + return dataName(screen(toICQUserData((SIM::clientData*)data))); // FIXME unsafe type conversion +} + +QString ICQClient::dataName(const QString &screen) +{ + return name() + '.' + screen; +} + +QString ICQClient::screen(const ICQUserData *data) +{ + if (data->Uin.toULong() == 0) + return data->Screen.str(); + return QString::number(data->Uin.toULong()); +} + +bool ICQClient::messageReceived(Message *msg, const QString &screen) +{ + msg->setFlags(msg->getFlags() | MESSAGE_RECEIVED); + if (msg->contact() == 0){ + Contact *contact; + ICQUserData *data = findContact(screen, NULL, false, contact); + if (data == NULL){ + data = findContact(screen, NULL, true, contact); + if (data == NULL){ + delete msg; + return true; + } + contact->setFlags(CONTACT_TEMP); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + msg->setClient(dataName(data)); + msg->setContact(contact->id()); + if (data->bTyping.toBool()){ + data->bTyping.asBool() = false; + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + } + bool bAccept = false; + switch (msg->type()){ + case MessageICQFile: + case MessageFile: + bAccept = true; + break; + } + if (bAccept) + m_acceptMsg.push_back(msg); + EventMessageReceived e(msg); + if (e.process()){ + if (bAccept){ + for (list::iterator it = m_acceptMsg.begin(); it != m_acceptMsg.end(); ++it){ + if ((*it) == msg){ + m_acceptMsg.erase(it); + break; + } + } + } + }else{ + if (!bAccept) + delete msg; + } + return !bAccept; +} + +QString ICQClient::contactName(void *clientData) +{ + QString res; + ICQUserData *data = toICQUserData((SIM::clientData*)clientData); // FIXME unsafe type conversion + res = data->Uin.toULong() ? "ICQ: " : "AIM: "; + if (!data->Nick.str().isEmpty()){ + res += data->Nick.str(); + res += " ("; + } + res += data->Uin.toULong() ? QString::number(data->Uin.toULong()) : data->Screen.str(); + if (!data->Nick.str().isEmpty()) + res += ')'; + return res; +} + +bool ICQClient::isSupportPlugins(ICQUserData *data) +{ + if (data->Version.toULong() < 7) + return false; + switch (data->InfoUpdateTime.toULong()){ + case 0xFFFFFF42: + case 0xFFFFFFFF: + case 0xFFFFFF7F: + case 0xFFFFFFBE: + case 0x3B75AC09: + case 0x3AA773EE: + case 0x3BC1252C: + case 0x3B176B57: + case 0x3BA76E2E: + case 0x3C7D8CBC: + case 0x3CFE0688: + case 0x3BFF8C98: + return false; + } + if ((data->InfoUpdateTime.toULong() & 0xFF7F0000L) == 0x7D000000L) + return false; + if (hasCap(data, CAP_TRIL_CRYPT) || hasCap(data, CAP_TRILLIAN)) + return false; + return true; +} + +void ICQClient::addPluginInfoRequest(unsigned long uin, unsigned plugin_index) +{ + log(L_DEBUG, "ICQClient::addPluginInfoRequest"); + Contact *contact; + ICQUserData *data = findContact(uin, NULL, false, contact); + if (data && !data->bNoDirect.toBool() && + get_ip(data->IP) && (get_ip(data->IP) == get_ip(this->data.owner.IP)) && + ((getInvisible() && data->VisibleId.toULong()) || + (!getInvisible() && (data->InvisibleId.toULong() == 0)))){ + switch (plugin_index){ + case PLUGIN_AR: { + DirectClient *dc = dynamic_cast(data->Direct.object()); + if ((dc == NULL) && !getHideIP()){ + dc = new DirectClient(data, this, PLUGIN_NULL); + data->Direct.setObject(dc); + dc->connect(); + } + if (dc){ + dc->addPluginInfoRequest(plugin_index); + return; + } + break; + } + case PLUGIN_QUERYxINFO: + case PLUGIN_PHONEBOOK: + case PLUGIN_PICTURE: { + if (!isSupportPlugins(data)) + return; + DirectClient *dc = dynamic_cast(data->DirectPluginInfo.object()); + if ((dc == NULL) && !getHideIP()){ + dc = new DirectClient(data, this, PLUGIN_INFOxMANAGER); + data->DirectPluginInfo.setObject(dc); + dc->connect(); + } + if (dc){ + dc->addPluginInfoRequest(plugin_index); + return; + } + break; + } + case PLUGIN_QUERYxSTATUS: + case PLUGIN_FILESERVER: + case PLUGIN_FOLLOWME: + case PLUGIN_ICQPHONE: { + if (!isSupportPlugins(data)) + return; + DirectClient *dc = dynamic_cast(data->DirectPluginStatus.object()); + if ((dc == NULL) && !getHideIP()){ + dc = new DirectClient(data, this, PLUGIN_STATUSxMANAGER); + data->DirectPluginStatus.setObject(dc); + dc->connect(); + } + if (dc){ + dc->addPluginInfoRequest(plugin_index); + return; + } + break; + } + } + } + snacICBM()->pluginInfoRequest(uin, plugin_index); +} + +void ICQClient::randomChatInfo(unsigned long uin) +{ + addPluginInfoRequest(uin, PLUGIN_RANDOMxCHAT); +} + +unsigned short ICQClient::msgStatus() +{ + return (unsigned short)(fullStatus(getStatus()) & 0xFF); +} + +static char PICT_PATH[] = "pictures/"; + +QString ICQClient::pictureFile(const ICQUserData *data) +{ + QString f = user_file(PICT_PATH); + QFileInfo fi(f); + if(!fi.exists()) + QDir().mkdir(f); + if(!fi.isDir()) + log(L_ERROR, QString("%1 is not a directory!").arg(f)); + f += "icq.avatar."; + f += data->Uin.toULong() ? QString::number(data->Uin.toULong()) : data->Screen.str(); + f += '.'; + f += QString::number(data->buddyID.toULong()); + return f; +} + +QImage ICQClient::userPicture(unsigned id) +{ + if (id==0) + return QImage(); + Contact *contact = getContacts()->contact(id); + if(!contact) + return QImage(); + ClientDataIterator it(contact->clientData, this); + + ICQUserData *d; + while ((d = toICQUserData(++it)) != NULL){ + QImage img = userPicture(d); + if(!img.isNull()) + return img; + } + return QImage(); +} + +QImage ICQClient::userPicture(ICQUserData *d) +{ + QImage img=QImage(d ? pictureFile(d) : data.owner.Picture.str()); + + if(img.isNull()) + return img; + + int w = img.width(); + int h = img.height(); + if (h > w){ + if (h > 60){ + w = w * 60 / h; + h = 60; + } + }else{ + if (w > 60){ + h = h * 60 / w; + w = 60; + } + } + + return img.scaled(w, h); +} + + +void ICQClient::retry(int n, void *p) +{ + EventMessageRetry::MsgSend *m = reinterpret_cast(p); + if (m->msg->getRetryCode() == static_cast(protocol()->plugin())->RetrySendDND){ + if (n == 0){ + m->edit->m_flags = MESSAGE_LIST; + }else{ + return; + } + }else if (m->msg->getRetryCode() == static_cast(protocol()->plugin())->RetrySendOccupied){ + switch (n){ + case 0: + m->edit->m_flags = MESSAGE_URGENT; + break; + case 1: + m->edit->m_flags = MESSAGE_LIST; + break; + default: + return; + } + }else{ + return; + } + Command cmd; + cmd->id = CmdSend; + cmd->param = m->edit; + EventCommandExec(cmd).process(); +} + +bool ICQClient::isOwnData(const QString &screen) +{ + if (screen.isEmpty()) + return false; + if(data.owner.Uin.toULong()) + return (data.owner.Uin.toULong() == screen.toULong()); + return (screen.toLower() == data.owner.Screen.str().toLower()); +} + +QString ICQClient::addCRLF(const QString &str) +{ + QString res = str; + return res.replace(QRegExp("\r?\n"), "\r\n"); +} + +Contact *ICQClient::getContact(ICQUserData *data) +{ + Contact *contact = NULL; + findContact(screen(data), NULL, false, contact); + return contact; +} + + +ICQUserData* ICQClient::toICQUserData(SIM::clientData * data) +{ + // This function is used to more safely preform type conversion from SIM::clientData* into ICQUserData* + // It will at least warn if the content of the structure is not ICQUserData + // Brave wariors may uncomment abort() function call to know for sure about wrong conversion ;-) + if (! data) return NULL; + if (data->Sign.asULong() != ICQ_SIGN) + { + QString Signs[] = { + "Unknown(0)" , // 0x0000 + "ICQ_SIGN", // 0x0001 + "JABBER_SIGN", // 0x0002 + "MSN_SIGN", // 0x0003 + "Unknown(4)" // 0x0004 + "LIVEJOURNAL_SIGN",// 0x0005 + "SMS_SIGN", // 0x0006 + "Unknown(7)", // 0x0007 + "Unknown(8)", // 0x0008 + "YAHOO_SIGN" // 0x0009 + }; + QString Sign; + if (data->Sign.toULong()<=9) // is always >=0 as it is unsigned int + Sign = Signs[data->Sign.toULong()]; + else + Sign = QString("Unknown(%1)").arg(Sign.toULong()); + + log(L_ERROR, + "ATTENTION!! Unsafly converting %s user data into ICQ_SIGN", + qPrintable(Sign)); +// abort(); + } + return (ICQUserData*) data; +} + diff --git a/plugins/icq/icqclient.h b/plugins/icq/icqclient.h new file mode 100644 index 0000000..10b6a1e --- /dev/null +++ b/plugins/icq/icqclient.h @@ -0,0 +1,987 @@ +/*************************************************************************** + icqclient.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICQCLIENT_H +#define _ICQCLIENT_H + +#include +#include +#include + +#include +#include +#include +#include + +#include "misc.h" +#include "snac.h" +#include "icqbuddy.h" +#include "icqservice.h" +#include "icqicmb.h" + +#include "socket/socket.h" +#include "socket/serversocketnotify.h" +#include "socket/clientsocket.h" +#include "socket/tcpclient.h" +#include "socket/interfacechecker.h" +#include "socket/sslclient.h" +#include "contacts/clientdataiterator.h" +#include "icq.h" +#include "icqbuffer.h" + +const unsigned ICQ_SIGN = 0x0001; + +const unsigned MESSAGE_DIRECT = 0x0100; + +//const unsigned STATUS_INVISIBLE = 2; //took over to contacts.h +//const unsigned STATUS_OCCUPIED = 100; //took over to contacts.h + +const unsigned char ICQ_TCP_VERSION = 0x09; + +const unsigned char MODE_DENIED = 0x01; +const unsigned char MODE_INDIRECT = 0x02; +const unsigned char MODE_DIRECT = 0x04; + +// Server channels +const unsigned char ICQ_CHNxNEW = 0x01; +const unsigned char ICQ_CHNxDATA = 0x02; +const unsigned char ICQ_CHNxERROR = 0x03; +const unsigned char ICQ_CHNxCLOSE = 0x04; +const unsigned char ICQ_CHNxPING = 0x05; + +// Server SNAC foodgroups +const unsigned short ICQ_SNACxFOOD_SERVICE = 0x0001; +const unsigned short ICQ_SNACxFOOD_LOCATION = 0x0002; +const unsigned short ICQ_SNACxFOOD_BUDDY = 0x0003; +const unsigned short ICQ_SNACxFOOD_MESSAGE = 0x0004; +const unsigned short ICQ_SNACxFOOD_AIMxINVITATION = 0x0006; +const unsigned short ICQ_SNACxFOOD_ADMINISTRATIVE = 0x0007; +const unsigned short ICQ_SNACxFOOD_BOS = 0x0009; +const unsigned short ICQ_SNACxFOOD_PING = 0x000B; +const unsigned short ICQ_SNACxFOOD_CHATxNAVIGATION = 0x000D; +const unsigned short ICQ_SNACxFOOD_CHAT = 0x000E; +const unsigned short ICQ_SNACxFOOD_SSBI = 0x0010; +const unsigned short ICQ_SNACxFOOD_LISTS = 0x0013; +const unsigned short ICQ_SNACxFOOD_VARIOUS = 0x0015; +const unsigned short ICQ_SNACxFOOD_LOGIN = 0x0017; + +#define SNAC(A, B) ((A << 16) + B) + +// Status +const unsigned short ICQ_STATUS_OFFLINE = 0xFFFF; +const unsigned short ICQ_STATUS_ONLINE = 0x0000; +const unsigned short ICQ_STATUS_AWAY = 0x0001; +const unsigned short ICQ_STATUS_DND = 0x0002; +const unsigned short ICQ_STATUS_NA = 0x0004; +const unsigned short ICQ_STATUS_OCCUPIED = 0x0010; +const unsigned short ICQ_STATUS_FFC = 0x0020; + +const unsigned long ICQ_STATUS_FxFLAGS = 0xFFFF0000; +const unsigned long ICQ_STATUS_FxUNKNOWNxFLAGS = 0xCFC0FCC8; +const unsigned long ICQ_STATUS_FxPRIVATE = 0x00000100; +const unsigned long ICQ_STATUS_FxPFMxAVAILABLE = 0x00000200; // not implemented +const unsigned long ICQ_STATUS_FxWEBxPRESENCE = 0x00010000; +const unsigned long ICQ_STATUS_FxHIDExIP = 0x00020000; +const unsigned long ICQ_STATUS_FxPFM = 0x00040000; // not implemented +const unsigned long ICQ_STATUS_FxBIRTHDAY = 0x00080000; +const unsigned long ICQ_STATUS_FxDIRECTxDISABLED = 0x00100000; +const unsigned long ICQ_STATUS_FxICQxHOMEPAGE = 0x00200000; // not implemented +const unsigned long ICQ_STATUS_FxDIRECTxAUTH = 0x10000000; // will accept connections only when authorized +const unsigned long ICQ_STATUS_FxDIRECTxLISTED = 0x20000000; // will accept connections only when listed + +const unsigned CLASS_UNCONFIRMED = 0x0001; // AOL unconfirmed user flsg +const unsigned CLASS_ADMINISTRATOR = 0x0002; // AOL administrator flag +const unsigned CLASS_AOL = 0x0004; // AOL staff user flag +const unsigned CLASS_COMMERCIAL = 0x0008; // AOL commercial account flag +const unsigned CLASS_FREE = 0x0010; // ICQ non-commercial account flag +const unsigned CLASS_AWAY = 0x0020; // Away status flag +const unsigned CLASS_ICQ = 0x0040; // ICQ user sign +const unsigned CLASS_WIRELESS = 0x0100; // AOL wireless user + +const unsigned short ICQ_MSGxMSG = 0x0001; +const unsigned short ICQ_MSGxCHAT = 0x0002; +const unsigned short ICQ_MSGxFILE = 0x0003; +const unsigned short ICQ_MSGxURL = 0x0004; +const unsigned short ICQ_MSGxAUTHxREQUEST = 0x0006; +const unsigned short ICQ_MSGxAUTHxREFUSED = 0x0007; +const unsigned short ICQ_MSGxAUTHxGRANTED = 0x0008; +const unsigned short ICQ_MSGxSERVERxMSG = 0x0009; +const unsigned short ICQ_MSGxADDEDxTOxLIST = 0x000C; +const unsigned short ICQ_MSGxWEBxPANEL = 0x000D; +const unsigned short ICQ_MSGxEMAILxPAGER = 0x000E; +const unsigned short ICQ_MSGxCONTACTxLIST = 0x0013; +const unsigned short ICQ_MSGxEXT = 0x001A; + +const unsigned short ICQ_MSGxSECURExCLOSE = 0x00EE; +const unsigned short ICQ_MSGxSECURExOPEN = 0x00EF; + +const unsigned short ICQ_MSGxAR_AWAY = 0x03E8; +const unsigned short ICQ_MSGxAR_OCCUPIED = 0x03E9; +const unsigned short ICQ_MSGxAR_NA = 0x03EA; +const unsigned short ICQ_MSGxAR_DND = 0x03EB; +const unsigned short ICQ_MSGxAR_FFC = 0x03EC; + +const unsigned short ICQ_TCPxACK_ONLINE = 0x0000; +const unsigned short ICQ_TCPxACK_AWAY = 0x0004; +const unsigned short ICQ_TCPxACK_OCCUPIED = 0x0009; +const unsigned short ICQ_TCPxACK_DND = 0x000A; +const unsigned short ICQ_TCPxACK_OCCUPIEDxCAR = 0x000B; +const unsigned short ICQ_TCPxACK_OCCUPIEDx2 = 0x000C; +const unsigned short ICQ_TCPxACK_NA = 0x000E; +const unsigned short ICQ_TCPxACK_DNDxCAR = 0x000F; +const unsigned short ICQ_TCPxACK_ACCEPT = 0x0000; +const unsigned short ICQ_TCPxACK_REFUSE = 0x0001; + +const unsigned short ICQ_TCPxMSG_AUTOxREPLY = 0x0000; +const unsigned short ICQ_TCPxMSG_NORMAL = 0x0001; +const unsigned short ICQ_TCPxMSG_URGENT = 0x0002; +const unsigned short ICQ_TCPxMSG_LIST = 0x0004; + +const unsigned short ICQ_MTN_FINISH = 0x0000; +const unsigned short ICQ_MTN_TYPED = 0x0001; +const unsigned short ICQ_MTN_START = 0x0002; + +const char DIRECT_MODE_DENIED = 0x01; +const char DIRECT_MODE_INDIRECT = 0x02; +const char DIRECT_MODE_DIRECT = 0x04; + +const unsigned MAX_PLAIN_MESSAGE_SIZE = 450; +const unsigned MAX_TYPE2_MESSAGE_SIZE = 4096; + +const unsigned PING_TIMEOUT = 60; + +const unsigned RATE_PAUSE = 3; +const unsigned RATE_LIMIT = 5; + +const unsigned short SEARCH_DONE = USHRT_MAX; + +class AIMFileTransfer; +class DirectClient; + +struct ICQUserData : public SIM::clientData +{ + SIM::Data Alias; + SIM::Data Cellular; + SIM::Data Status; + SIM::Data Class; + SIM::Data StatusTime; + SIM::Data OnlineTime; + SIM::Data WarningLevel; + SIM::Data IP; + SIM::Data RealIP; + SIM::Data Port; + SIM::Data DCcookie; + SIM::Data Caps; + SIM::Data Caps2; + SIM::Data AutoReply; + SIM::Data Uin; + SIM::Data Screen; + SIM::Data IcqID; + SIM::Data bChecked; + SIM::Data GrpId; + SIM::Data IgnoreId; + SIM::Data VisibleId; + SIM::Data ContactVisibleId; + SIM::Data InvisibleId; + SIM::Data ContactInvisibleId; + SIM::Data WaitAuth; + SIM::Data WantAuth; + SIM::Data WebAware; + SIM::Data InfoUpdateTime; + SIM::Data PluginInfoTime; + SIM::Data PluginStatusTime; + SIM::Data InfoFetchTime; + SIM::Data PluginInfoFetchTime; + SIM::Data PluginStatusFetchTime; + SIM::Data Mode; + SIM::Data Version; + SIM::Data Build; + SIM::Data Nick; + SIM::Data FirstName; + SIM::Data LastName; + SIM::Data MiddleName; + SIM::Data Maiden; + SIM::Data EMail; + SIM::Data HiddenEMail; + SIM::Data City; + SIM::Data State; + SIM::Data HomePhone; + SIM::Data HomeFax; + SIM::Data Address; + SIM::Data PrivateCellular; + SIM::Data Zip; + SIM::Data Country; + SIM::Data TimeZone; + SIM::Data Age; + SIM::Data Gender; + SIM::Data Homepage; + SIM::Data BirthYear; + SIM::Data BirthMonth; + SIM::Data BirthDay; + SIM::Data Language; + SIM::Data EMails; + SIM::Data WorkCity; + SIM::Data WorkState; + SIM::Data WorkPhone; + SIM::Data WorkFax; + SIM::Data WorkAddress; + SIM::Data WorkZip; + SIM::Data WorkCountry; + SIM::Data WorkName; + SIM::Data WorkDepartment; + SIM::Data WorkPosition; + SIM::Data Occupation; + SIM::Data WorkHomepage; + SIM::Data About; + SIM::Data Interests; + SIM::Data Backgrounds; + SIM::Data Affilations; + SIM::Data FollowMe; + SIM::Data SharedFiles; + SIM::Data ICQPhone; + SIM::Data Picture; + SIM::Data PictureWidth; + SIM::Data PictureHeight; + SIM::Data PhoneBook; + SIM::Data ProfileFetch; + SIM::Data bTyping; + SIM::Data bBadClient; + SIM::Data Direct; + SIM::Data DirectPluginInfo; + SIM::Data DirectPluginStatus; + SIM::Data bNoDirect; + SIM::Data bInvisible; + SIM::Data buddyRosterID; + SIM::Data buddyID; + SIM::Data buddyHash; + SIM::Data unknown2; + SIM::Data unknown4; + SIM::Data unknown5; +}; + +struct ICQClientData +{ + SIM::Data Server; + SIM::Data Port; + SIM::Data ContactsTime; + SIM::Data ContactsLength; + SIM::Data ContactsInvisible; + SIM::Data HideIP; + SIM::Data IgnoreAuth; + SIM::Data UseMD5; + SIM::Data DirectMode; + SIM::Data IdleTime; + SIM::Data ListRequests; + SIM::Data Picture; + SIM::Data RandomChatGroup; + SIM::Data RandomChatGroupCurrent; + SIM::Data SendFormat; + SIM::Data DisablePlugins; + SIM::Data DisableAutoUpdate; + SIM::Data DisableAutoReplyUpdate; + SIM::Data DisableTypingNotification; +// Data AutoCheckInvisible; +// Data CheckInvisibleInterval; + SIM::Data AcceptInDND; + SIM::Data AcceptInOccupied; + SIM::Data MinPort; + SIM::Data MaxPort; + SIM::Data WarnAnonimously; + SIM::Data AckMode; + SIM::Data UseHTTP; + SIM::Data AutoHTTP; + SIM::Data KeepAlive; + SIM::Data MediaSense; + ICQUserData owner; +}; + +class ICQClient; + +struct SearchResult +{ + ICQUserData data; + unsigned short id; + ICQClient *client; +}; + +class QTimer; + +typedef unsigned char capability[0x10]; +typedef unsigned char plugin[0x12]; + +enum cap_id_t { + CAP_AIM_SHORTCAPS = 0, // 0x00000001 + CAP_AIM_VOICE, // 0x00000002 + CAP_AIM_SENDFILE, // 0x00000004 + CAP_DIRECT, // 0x00000008 + CAP_AIM_IMIMAGE, // 0x00000010 + CAP_AIM_BUDDYCON, // 0x00000020 + CAP_AIM_STOCKS, // 0x00000040 + CAP_AIM_GETFILE, // 0x00000080 + CAP_SRV_RELAY, // 0x00000100 + CAP_AIM_GAMES, // 0x00000200 + CAP_AIM_BUDDYLIST, // 0x00000400 + CAP_AVATAR, // 0x00000800 + CAP_AIM_SUPPORT, // 0x00001000 + CAP_UTF, // 0x00002000 + CAP_RTF, // 0x00004000 + CAP_TYPING, // 0x00008000 + CAP_SIM, // 0x00010000 + CAP_STR_2001, // 0x00020000 + CAP_STR_2002, // 0x00040000 + CAP_IS_2001, // 0x00080000 + CAP_TRILLIAN, // 0x00100000 + CAP_TRIL_CRYPT, // 0x00200000 + CAP_MACICQ, // 0x00400000 + CAP_AIM_CHAT, // 0x00800000 + CAP_MICQ, // 0x01000000 + CAP_LICQ, // 0x02000000 + CAP_SIMOLD, // 0x04000000 + CAP_KOPETE, // 0x08000000 + CAP_XTRAZ, // 0x10000000 + CAP_IS_2002, // 0x20000000 + CAP_MIRANDA, // 0x40000000 + CAP_ANDRQ, // 0x80000000 + CAP_QIP, // 0x00000001 - Caps2 + CAP_IMSECURE, // 0x00000002 + CAP_KXICQ, // 0x00000004 + CAP_ICQ5_1, // 0x00000008 + CAP_UNKNOWN, // 0x00000010 + CAP_ICQ5_3, // 0x00000020 + CAP_ICQ5_4, // 0x00000040 + CAP_ICQ51, // 0x00000080 + CAP_JIMM, // 0x00000100 + CAP_ICQJP, // 0x00000200 + CAP_NULL, // 0x00000400 +}; + +const unsigned PLUGIN_PHONEBOOK = 0; +const unsigned PLUGIN_PICTURE = 1; +const unsigned PLUGIN_FILESERVER = 2; +const unsigned PLUGIN_FOLLOWME = 3; +const unsigned PLUGIN_ICQPHONE = 4; +const unsigned PLUGIN_QUERYxINFO = 5; +const unsigned PLUGIN_QUERYxSTATUS = 6; +const unsigned PLUGIN_INFOxMANAGER = 7; +const unsigned PLUGIN_STATUSxMANAGER = 8; +const unsigned PLUGIN_RANDOMxCHAT = 9; +const unsigned PLUGIN_VIDEO_CHAT = 10; +const unsigned PLUGIN_NULL = 11; +const unsigned PLUGIN_FILE = 12; +const unsigned PLUGIN_CHAT = 13; +const unsigned PLUGIN_AR = 14; +const unsigned PLUGIN_INVISIBLE = 15; +const unsigned PLUGIN_REVERSE = 16; +const unsigned PLUGIN_AIM_FT = 17; +const unsigned PLUGIN_AIM_FT_ACK = 18; + +class ICQClient; + +const unsigned LIST_USER_CHANGED = 0; +const unsigned LIST_USER_DELETED = 1; +const unsigned LIST_GROUP_CHANGED = 2; +const unsigned LIST_GROUP_DELETED = 3; +const unsigned LIST_BUDDY_CHECKSUM = 4; + +class ListRequest +{ +public: + ListRequest() + : type(0), icq_id(0), grp_id(0), visible_id(0), invisible_id(0), ignore_id(0), + icqUserData(NULL) {} + +public: + unsigned type; + QString screen; + unsigned short icq_id; + unsigned short grp_id; + unsigned short visible_id; + unsigned short invisible_id; + unsigned short ignore_id; + const ICQUserData *icqUserData; +}; + +class ICQListener : public SIM::ServerSocketNotify +{ +public: + ICQListener(ICQClient *client); + ~ICQListener(); +protected: + virtual bool accept(SIM::Socket *s, unsigned long ip); + virtual void bind_ready(unsigned short port); + virtual bool error(const QString &err); + ICQClient *m_client; +}; + +class DirectSocket; +class ServerRequest; +class ListServerRequest; +class QTextCodec; + +const unsigned SEND_PLAIN = 0x0001; +const unsigned SEND_UTF = 0x0002; +const unsigned SEND_RTF = 0x0003; +const unsigned SEND_TYPE2 = 0x0004; +const unsigned SEND_RAW = 0x0005; +const unsigned SEND_HTML = 0x0006; +const unsigned SEND_HTML_PLAIN = 0x0007; +const unsigned SEND_MASK = 0x000F; +const unsigned SEND_1STPART = 0x0010; + +struct ar_request +{ + unsigned short type; + unsigned short flags; + unsigned short ack; + MessageId id; + unsigned short id1; + unsigned short id2; + QString screen; + bool bDirect; +}; + +typedef std::map INFO_REQ_MAP; + +class DirectSocket; +class ServiceSocket; +class ICQClientSocket; + +class OscarSocket +{ +public: + OscarSocket(); + virtual ~OscarSocket(){}; + + void snac(unsigned short food, unsigned short type, bool msgId=false, bool bType=true); + void sendPacket(bool bSend = true); +protected: + virtual ICQClientSocket *socket() = 0; + virtual void packet(unsigned long size) = 0; + void flap(char channel); + void connect_ready(); + void packet_ready(); + bool m_bHeader; + char m_nChannel; + unsigned short m_nFlapSequence; + unsigned short m_nMsgSequence; +}; + +struct alias_group +{ + QString alias; + unsigned grp; +}; + +struct RateInfo +{ + Buffer delayed; + QDateTime m_lastSend; + unsigned m_curLevel; + unsigned m_maxLevel; + unsigned m_minLevel; + unsigned m_winSize; +}; + +struct InfoRequest +{ + unsigned uin; + unsigned request_id; + unsigned start_time; +}; + +typedef std::map CONTACTS_MAP; +typedef std::map RATE_MAP; +typedef std::map mapSnacHandlers; + +class ICQClient : public SIM::TCPClient, public OscarSocket +{ + Q_OBJECT +public: + ICQClient(SIM::Protocol*, Buffer *cfg, bool bAIM); + ~ICQClient(); + virtual QString name(); + virtual QString getScreen(); + virtual QString dataName(void*); + virtual QWidget *setupWnd(); + virtual QByteArray getConfig(); + virtual void contactsLoaded(); + void setUin(unsigned long); + void setScreen(const QString &); + unsigned long getUin(); + QString getServer() const; + void setServer(const QString &); + PROP_USHORT(Port); + PROP_ULONG(ContactsTime); + PROP_USHORT(ContactsLength); + PROP_USHORT(ContactsInvisible); + PROP_BOOL(HideIP); + PROP_BOOL(IgnoreAuth); + PROP_BOOL(UseMD5); + PROP_ULONG(DirectMode); + PROP_ULONG(IdleTime); + PROP_STR(ListRequests); + PROP_UTF8(Picture); + PROP_USHORT(RandomChatGroup); + PROP_ULONG(RandomChatGroupCurrent); + PROP_ULONG(SendFormat); + PROP_BOOL(DisablePlugins); + PROP_BOOL(DisableAutoUpdate); + PROP_BOOL(DisableAutoReplyUpdate); + PROP_BOOL(DisableTypingNotification); + PROP_BOOL(AcceptInDND); + PROP_BOOL(AcceptInOccupied); + PROP_USHORT(MinPort); + PROP_USHORT(MaxPort); + PROP_BOOL(WarnAnonimously); + PROP_USHORT(AckMode); + PROP_BOOL(UseHTTP); + PROP_BOOL(AutoHTTP); + PROP_BOOL(KeepAlive); + PROP_BOOL(MediaSense); + ICQClientData data; + // reimplement socket() to get correct Buffer + virtual ICQClientSocket *socket() { return static_cast(TCPClient::socket()); } + virtual ICQClientSocket *createClientSocket() { return new ICQClientSocket(this, createSocket()); } + // icq functions + unsigned short findByUin(unsigned long uin); + unsigned short findByMail(const QString &mail); + unsigned short findWP(const QString &first, const QString &last, const QString &nick, + const QString &email, char age, char nGender, + unsigned short nLanguage, const QString &city, const QString &szState, + unsigned short nCountryCode, + const QString &cCoName, const QString &szCoDept, const QString &szCoPos, + unsigned short nOccupation, + unsigned short nPast, const QString &szPast, + unsigned short nInterests, const QString &szInterests, + unsigned short nAffiliation, const QString &szAffiliation, + unsigned short nHomePoge, const QString &szHomePage, + const QString &sKeyWord, bool bOnlineOnly); + SIM::Contact *getContact(ICQUserData*); + ICQUserData *findContact(unsigned long uin, const QString *alias, bool bCreate, SIM::Contact *&contact, SIM::Group *grp=NULL, bool bJoin=true); + ICQUserData *findContact(const QString &screen, const QString *alias, bool bCreate, SIM::Contact *&contact, SIM::Group *grp=NULL, bool bJoin=true); + ICQUserData *findGroup(unsigned id, const QString *name, SIM::Group *&group); + void addFullInfoRequest(unsigned long uin); + ListRequest *findContactListRequest(const QString &screen); + ListRequest *findGroupListRequest(unsigned short id); + void removeListRequest(ListRequest *lr); + virtual void setupContact(SIM::Contact*, void *data); + QString clientName(ICQUserData*); + void changePassword(const QString &new_pswd); + void searchChat(unsigned short); + void randomChatInfo(unsigned long uin); + unsigned short aimEMailSearch(const QString &name); + unsigned short aimInfoSearch(const QString &first, const QString &last, const QString &middle, + const QString &maiden, const QString &country, const QString &street, + const QString &city, const QString &nick, const QString &zip, + const QString &state); + SIM::Message *parseMessage(unsigned short type, const QString &screen, + const QByteArray &p, ICQBuffer &packet, MessageId &id, unsigned cookie); + void sendPacket(bool bSend); + bool messageReceived(SIM::Message*, const QString &screen); + static bool parseRTF(const QByteArray &str, SIM::Contact *contact, QString &result); + static QString pictureFile(const ICQUserData *data); + virtual QImage userPicture(unsigned id); + QImage userPicture(ICQUserData *d); + static const capability *capabilities; + static const plugin *plugins; + static QString convert(Tlv *tlvInfo, TlvList &tlvs, unsigned n); + static QString convert(const char *text, unsigned size, TlvList &tlvs, unsigned n); + static QString screen(const ICQUserData*); + static unsigned long warnLevel(unsigned long); + static unsigned clearTags(QString &text); + bool m_bAIM; + static QString addCRLF(const QString &str); + void uploadBuddy(const ICQUserData *data); + ICQUserData * toICQUserData(SIM::clientData*); // More safely type conversion from generic SIM::clientData into ICQUserData + + virtual void changeStatus(const SIM::IMStatusPtr& status); + + unsigned long getFullStatus(); + + bool addSnacHandler(SnacHandler* handler); + void clearSnacHandlers(); + + // ICBM: + void deleteFileMessage(MessageId const& cookie); + + // SSI: + void ssiStartTransaction(); + void ssiEndTransaction(); + bool isSSITransaction(){return false;} + unsigned short ssiAddBuddy(QString& screen, unsigned short group_id, unsigned short buddy_id, unsigned short buddy_type, TlvList* tlvs); + unsigned short ssiModifyBuddy(const QString& name, unsigned short grp_id, unsigned short usr_id, unsigned short subCmd, TlvList* tlv); + unsigned short ssiDeleteBuddy(QString& screen, unsigned short group_id, unsigned short buddy_id, unsigned short buddy_type, TlvList* tlvs); + void getGroupIDs(unsigned short group_id, ICQBuffer* buf); // hack + unsigned short ssiAddToGroup(QString& groupname, unsigned short buddy_id, unsigned short group_id); + unsigned short ssiRemoveFromGroup(QString& groupname, unsigned short buddy_id, unsigned short group_id); + TlvList *createListTlv(ICQUserData *data, SIM::Contact *contact); + + // Snac handlers accessors + SnacIcqService* snacService() { return m_snacService; } + SnacIcqBuddy* snacBuddy() { return m_snacBuddy; } + SnacIcqICBM* snacICBM() { return m_snacICBM; } + +protected slots: + void ping(); + void retry(int n, void*); + void interfaceDown(QString); + void interfaceUp(QString); +protected: + void generateCookie(MessageId& id); + + virtual void setInvisible(bool bState); + virtual void setStatus(unsigned status, bool bCommon); + virtual void setStatus(unsigned status); + virtual void disconnected(); + virtual bool processEvent(SIM::Event *e); + virtual bool compareData(void*, void*); + virtual void contactInfo(void *_data, unsigned long &status, unsigned &style, QString &statusIcon, QSet *icons = NULL); + virtual bool send(SIM::Message*, void*); + virtual bool canSend(unsigned type, void*); + virtual bool isMyData(SIM::clientData*&, SIM::Contact*&); + virtual bool createData(SIM::clientData*&, SIM::Contact*); + virtual QString contactTip(void *_data); + virtual SIM::CommandDef *infoWindows(SIM::Contact *contact, void *_data); + virtual QWidget *infoWindow(QWidget *parent, SIM::Contact *contact, void *_data, unsigned id); + virtual SIM::CommandDef *configWindows(); + virtual QWidget *configWindow(QWidget *parent, unsigned id); + virtual QWidget *searchWindow(QWidget *parent); + virtual void updateInfo(SIM::Contact *contact, void *_data); + virtual void setClientInfo(void *data); + virtual SIM::Socket *createSocket(); + virtual QString contactName(void *clientData); + QString dataName(const QString &screen); + QByteArray m_cookie; + virtual void packet(unsigned long size); + void snac_location(unsigned short, unsigned short); + void snac_bos(unsigned short, unsigned short); + void snac_ping(unsigned short, unsigned short); + void snac_lists(unsigned short, unsigned short); + void snac_various(unsigned short, unsigned short); + void snac_login(unsigned short, unsigned short); + void parseRosterItem(unsigned short type, const QString &str,unsigned short grp_id, + unsigned short id, TlvList *inf, bool &bIgnoreTime); + void chn_login(); + void chn_close(); + void listsRequest(); + void locationRequest(); + void buddyRequest(); + void bosRequest(); + void addCapability(ICQBuffer &cap, cap_id_t id); // helper for sendCapability() + void sendCapability(const QString &msg=QString::null); + void sendMessageRequest(); + void serverRequest(unsigned short cmd, unsigned short seq=0); + void sendServerRequest(); + void sendInvisible(bool bState); + void sendContactList(); + void setOffline(ICQUserData*); + void removeFullInfoRequest(unsigned long uin); + class SSBISocket *getSSBISocket(); + unsigned long fullStatus(unsigned status); + unsigned long fullStatus(const SIM::IMStatusPtr& status); + QByteArray cryptPassword(); + virtual void connect_ready(); + virtual void packet_ready(); + const char* error_message(unsigned short error); + bool m_bVerifying; + ICQListener *m_listener; + QTimer *m_processTimer; + unsigned short m_sendSmsId; + unsigned short m_offlineMessagesRequestId; + ListServerRequest *m_listRequest; + bool m_bRosters; + bool m_bBirthday; + bool m_bNoSend; + std::list varRequests; + std::list infoRequests; + QStringList buddies; + std::list listRequests; + std::list arRequests; + void addGroupRequest(SIM::Group *group); + void addContactRequest(SIM::Contact *contact); + void checkListRequest(); + void checkInfoRequest(); + ServerRequest *findServerRequest(unsigned short id); + void clearServerRequests(); + void clearListServerRequest(); + void clearSMSQueue(); + unsigned processListRequest(); + unsigned processSMSQueue(); + unsigned processInfoRequest(); + static bool hasCap(const ICQUserData *data, cap_id_t fcap); + static void setCap(ICQUserData *data, cap_id_t fcap); + bool isSupportPlugins(ICQUserData *data); + QString trimPhone(const QString &phone); + unsigned short getListId(); + unsigned short sendRoster(unsigned short cmd, const QString &name, + unsigned short grp_id, unsigned short usr_id, + unsigned short subCmd=0, TlvList *tlv = NULL); + void sendRosterGrp(const QString &name, unsigned short grpId, unsigned short usrId); + bool isContactRenamed(ICQUserData *data, SIM::Contact *contact); + QString getUserCellular(SIM::Contact *contact); + void setMainInfo(ICQUserData *d); + void setAIMInfo(ICQUserData *data); + void setProfile(ICQUserData *data); + bool isOwnData(const QString &screen); + void packInfoList(const QString &str); + QString packContacts(SIM::ContactsMessage *msg, ICQUserData *data, CONTACTS_MAP &c); + QByteArray createRTF(QString &text, QString &part, unsigned long foreColor, SIM::Contact *contact, unsigned max_size); + QString removeImages(const QString &text, bool icqSmiles); + bool sendAuthRequest(SIM::Message *msg, void *data); + bool sendAuthGranted(SIM::Message *msg, void *data); + bool sendAuthRefused(SIM::Message *msg, void *data); + void parseAdvancedMessage(const QString &screen, ICQBuffer &msg, bool needAck, MessageId id); + void addPluginInfoRequest(unsigned long uin, unsigned plugin_index); + void setChatGroup(); + SIM::Message *parseExtendedMessage(const QString &screen, ICQBuffer &packet, MessageId &id, unsigned cookie); + void parsePluginPacket(ICQBuffer &b, unsigned plugin_index, ICQUserData *data, unsigned uin, bool bDirect); + void pluginAnswer(unsigned plugin_type, unsigned long uin, ICQBuffer &b); + void packMessage(ICQBuffer &b, SIM::Message *msg, ICQUserData *data, unsigned short &type, bool bDirect, unsigned short flags=ICQ_TCPxMSG_NORMAL); + void packExtendedMessage(SIM::Message *msg, ICQBuffer &buf, ICQBuffer &msgBuf, ICQUserData *data); + void fetchProfile(ICQUserData *data); + void fetchAwayMessage(ICQUserData *data); + void fetchProfiles(); + void setAwayMessage(const QString &msg = QString::null); + void encodeString(const QString &text, const QString &type, unsigned short charsetTlv, unsigned short infoTlv); + void encodeString(const QString &_str, unsigned short nTlv, bool bWide); + bool processMsg(); + void packTlv(unsigned short tlv, unsigned short code, const QString &keywords); + void packTlv(unsigned short tlv, const QString &_data); + void packTlv(unsigned short tlv, unsigned short data); + void uploadBuddyIcon(unsigned short refNumber, const QImage &img); + void requestBuddy(const ICQUserData *data); + ICQUserData *findInfoRequest(unsigned short seq, SIM::Contact *&contact); + INFO_REQ_MAP m_info_req; + unsigned short msgStatus(); + unsigned short m_advCounter; + bool m_bJoin; + bool m_bFirstTry; + bool m_bHTTP; + bool m_bReady; + std::vector m_rates; + RATE_MAP m_rate_grp; + void setNewLevel(RateInfo &r); + unsigned delayTime(unsigned snac); + unsigned delayTime(RateInfo &r); + RateInfo *rateInfo(unsigned snac); + std::list m_processMsg; + std::list m_sockets; + std::list m_acceptMsg; + std::list m_filetransfers; + SnacIcqBuddy* m_snacBuddy; + SnacIcqService* m_snacService; + SnacIcqICBM* m_snacICBM; + mapSnacHandlers m_snacHandlers; + bool m_bconnectionLost; + + friend class ListServerRequest; + friend class FullInfoRequest; + friend class SMSRequest; + friend class ServiceSocket; + friend class DirectSocket; + friend class DirectClient; + friend class ICQListener; + friend class AIMFileTransfer; + friend class ICQFileTransfer; + friend class SetBuddyRequest; + friend class SSBISocket; + + // This should be removed when refactoring is over + friend class SnacIcqBuddy; + friend class SnacIcqService; + friend class SnacIcqICBM; + +private: + SIM::PropertyHubPtr m_propertyHub; + SIM::InterfaceChecker* m_ifChecker; + bool m_bBirthdayInfoDisplayed; +}; + +class ServiceSocket : public SIM::ClientSocketNotify, public OscarSocket +{ +public: + ServiceSocket(ICQClient*, unsigned short id); + ~ServiceSocket(); + unsigned short id() const { return m_id; } + void connect(const char *addr, unsigned short port, const QByteArray &cookie); + virtual bool error_state(const QString &err, unsigned code = 0); + bool connected() const { return m_bConnected; } + void close(); +protected: + virtual const char *serviceSocketName() = 0; + virtual void connect_ready(); + virtual void packet_ready(); + virtual ICQClientSocket *socket() { return m_socket; } + virtual void packet(unsigned long size); + virtual void data(unsigned short food, unsigned short type, unsigned short seq) = 0; + unsigned short m_id; + QByteArray m_cookie; + bool m_bConnected; + ICQClientSocket *m_socket; + ICQClient *m_client; +}; + +class DirectSocket : public QObject, public SIM::ClientSocketNotify +{ + Q_OBJECT +public: + enum SocketState{ + NotConnected, + ConnectIP1, + ConnectIP2, + ConnectFail, + WaitInit, + WaitAck, + WaitReverse, + ReverseConnect, + Logged + }; + DirectSocket(SIM::Socket *s, ICQClient*, unsigned long ip); + DirectSocket(ICQUserData *data, ICQClient *client); + ~DirectSocket(); + virtual void packet_ready(); + SocketState m_state; + void connect(); + void reverseConnect(unsigned long ip, unsigned short port); + void acceptReverse(SIM::Socket *s); + virtual bool error_state(const QString &err, unsigned code = 0); + virtual void connect_ready(); + unsigned short localPort(); + unsigned short remotePort(); + unsigned long Uin(); + ICQUserData *m_data; + void setPort(unsigned short port) {m_port = port;} +protected slots: + void timeout(); +protected: + virtual void login_timeout(); + virtual void processPacket() = 0; + void init(); + void sendInit(); + void sendInitAck(); + void removeFromClient(); + bool m_bIncoming; + unsigned short m_nSequence; + unsigned short m_port; + unsigned short m_localPort; + char m_version; + bool m_bHeader; + unsigned long m_nSessionId; + ICQClientSocket *m_socket; + ICQClient *m_client; + unsigned long m_ip; + friend class AIMFileTransfer; +}; + +struct SendDirectMsg +{ + SIM::Message *msg; + unsigned type; + unsigned short seq; + unsigned short icq_type; +}; + +class DirectClient : public DirectSocket +{ +public: + DirectClient(SIM::Socket *s, ICQClient *client, unsigned long ip); + DirectClient(ICQUserData *data, ICQClient *client, unsigned channel = PLUGIN_NULL); + ~DirectClient(); + bool sendMessage(SIM::Message*); + void acceptMessage(SIM::Message*); + void declineMessage(SIM::Message*, const QString &reason); + bool cancelMessage(SIM::Message*); + void sendAck(unsigned short, unsigned short msgType, unsigned short msgFlags, + const char *message=NULL, unsigned short status=ICQ_TCPxACK_ACCEPT, SIM::Message *m=NULL); + bool isLogged() { return (m_state != None) && (m_state != WaitInit2); } + bool isSecure(); + void addPluginInfoRequest(unsigned plugin_index); +protected: + enum State{ + None, + WaitLogin, + WaitInit2, + Logged, + SSLconnect + }; + State m_state; + unsigned m_channel; + void processPacket(); + void connect_ready(); + virtual bool error_state(const QString &err, unsigned code); + void sendInit2(); + void startPacket(unsigned short cms, unsigned short seq); + void sendPacket(); + void processMsgQueue(); + bool copyQueue(DirectClient *to); + QList m_queue; + QString name(); + QString m_name; + void secureConnect(); + void secureListen(); + void secureStop(bool bShutdown); + SIM::SSLClient *m_ssl; +}; + +class ICQFileTransfer : public SIM::FileTransfer, public DirectSocket, public SIM::ServerSocketNotify +{ +public: + ICQFileTransfer(SIM::FileMessage *msg, ICQUserData *data, ICQClient *client); + ~ICQFileTransfer(); + void connect(unsigned short port); + void listen(); + void setSocket(ICQClientSocket *socket); + virtual void processPacket(); +protected: + enum State + { + None, + WaitLogin, + WaitInit, + InitSend, + InitReceive, + Send, + Receive, + Wait, + WaitReverse, + WaitReverseLogin, + Listen + }; + State m_state; + + virtual void connect_ready(); + virtual bool error_state(const QString &err, unsigned code); + virtual void write_ready(); + virtual void setSpeed(unsigned speed); + virtual void startReceive(unsigned pos); + virtual void bind_ready(unsigned short port); + virtual bool accept(SIM::Socket *s, unsigned long ip); + virtual bool error(const QString &err); + virtual void login_timeout(); + + void sendInit(); + void startPacket(char cmd); + void sendPacket(bool dump=true); + void sendFileInfo(); + void initReceive(char cmd); + + friend class ICQClient; +}; + +#endif + + diff --git a/plugins/icq/icqconfig.cpp b/plugins/icq/icqconfig.cpp new file mode 100644 index 0000000..bde04b2 --- /dev/null +++ b/plugins/icq/icqconfig.cpp @@ -0,0 +1,155 @@ +/*************************************************************************** + icqconfig.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icqconfig.h" +#include "icq.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace SIM; + +ICQConfig::ICQConfig(QWidget *parent, ICQClient *client, bool bConfig) + : QWidget(parent) +{ + setupUi(this); + m_client = client; + m_bConfig = bConfig; + + if (m_bConfig){ + QTimer::singleShot(0, this, SLOT(changed())); + connect(chkNew, SIGNAL(toggled(bool)), this, SLOT(newToggled(bool))); + if (m_client->data.owner.Uin.toULong()){ + edtUin->setText(QString::number(m_client->data.owner.Uin.toULong())); + chkNew->setChecked(false); + edtPasswd->setText(m_client->getPassword()); +/* }else if(core->getRegNew()) { + * edtUin->setText(core->getICQUIN()); + * edtPasswd->setText(core->getICQPassword()); + */ + }else{ + chkNew->setChecked(true); + } + //FIXME: we will have to do something when UIN is greater than signed int + edtUin->setValidator(new QIntValidator(1000, 0x7FFFFFFF, edtUin)); + connect(edtUin, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPasswd, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + }else{ + tabConfig->removeTab(tabConfig->indexOf(tabICQ)); + } + edtServer->setText(m_client->getServer()); + edtPort->setValue(m_client->getPort()); + edtMinPort->setValue(m_client->getMinPort()); + edtMaxPort->setValue(m_client->getMaxPort()); + connect(edtServer, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPort, SIGNAL(valueChanged(const QString&)), this, SLOT(changed(const QString&))); + cmbFormat->addItem(i18n("RTF")); + cmbFormat->addItem(i18n("UTF")); + cmbFormat->addItem(i18n("Plain text")); + cmbFormat->setCurrentIndex(client->getSendFormat()); + chkPlugins->setChecked(client->getDisablePlugins()); + chkUpdate->setChecked(client->getDisableAutoUpdate()); + chkAutoReply->setChecked(client->getDisableAutoReplyUpdate()); + chkTyping->setChecked(client->getDisableTypingNotification()); + chkInvisible->hide(); + edtInvisible->hide(); + lblInvisible->hide(); + lblInvisible2->hide(); + chkDND->setChecked(client->getAcceptInDND()); + chkOccupied->setChecked(client->getAcceptInOccupied()); + chkHTTP->setChecked(client->getUseHTTP()); + connect(chkAuto, SIGNAL(toggled(bool)), this, SLOT(autoToggled(bool))); + connect(chkInvisible, SIGNAL(toggled(bool)), this, SLOT(invisibleToggled(bool))); + chkAuto->setChecked(client->getAutoHTTP()); + chkKeepAlive->setChecked(client->getKeepAlive()); + chkMediaSense->setChecked(client->getMediaSense()); + cmbAck->setCurrentIndex(client->getAckMode()); +} + +void ICQConfig::autoToggled(bool bState) +{ + chkHTTP->setEnabled(!bState); +} + +void ICQConfig::invisibleToggled(bool bState) +{ + lblInvisible->setEnabled(bState); + lblInvisible2->setEnabled(bState); + edtInvisible->setEnabled(bState); +} + +void ICQConfig::apply(Client*, void*) +{ +} + +void ICQConfig::apply() +{ + if (m_bConfig){ + m_client->setUin(edtUin->text().toULong()); + m_client->setPassword(edtPasswd->text()); + } + m_client->setServer(edtServer->text()); + m_client->setPort(edtPort->text().toUShort()); + m_client->setMinPort(edtMinPort->text().toUShort()); + m_client->setMaxPort(edtMaxPort->text().toUShort()); + m_client->setSendFormat(cmbFormat->currentIndex()); + m_client->setDisablePlugins(chkPlugins->isChecked()); + m_client->setDisableAutoUpdate(chkUpdate->isChecked()); + m_client->setDisableAutoReplyUpdate(chkAutoReply->isChecked()); + m_client->setDisableTypingNotification(chkTyping->isChecked()); + m_client->setAcceptInDND(chkDND->isChecked()); + m_client->setAcceptInOccupied(chkOccupied->isChecked()); + m_client->setUseHTTP(chkHTTP->isChecked()); + m_client->setAutoHTTP(chkAuto->isChecked()); + m_client->setKeepAlive(chkKeepAlive->isChecked()); + m_client->setAckMode(cmbAck->currentIndex()); + m_client->setMediaSense(chkMediaSense->isChecked()); +} + +void ICQConfig::changed(const QString&) +{ + changed(); +} + +void ICQConfig::newToggled(bool bNew) +{ + if (bNew) + edtUin->setText(QString::null); + lblUin->setEnabled(!bNew); + edtUin->setEnabled(!bNew); +} + +void ICQConfig::changed() +{ + bool bOK = true; + if (!chkNew->isChecked()) + bOK = (edtUin->text().toLong() > 1000); + bOK = bOK && !edtPasswd->text().isEmpty() && + !edtServer->text().isEmpty() && + edtPort->text().toUShort(); + emit okEnabled(bOK); +} + +// vim: set expandtab: + + diff --git a/plugins/icq/icqconfig.h b/plugins/icq/icqconfig.h new file mode 100644 index 0000000..566905f --- /dev/null +++ b/plugins/icq/icqconfig.h @@ -0,0 +1,47 @@ +/*************************************************************************** + icqconfig.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICQCONFIG_H +#define _ICQCONFIG_H + +#include "ui_icqconfigbase.h" +#include "icqclient.h" + +class ICQConfig : public QWidget, public Ui::ICQConfigBase +{ + Q_OBJECT +public: + ICQConfig(QWidget *parent, ICQClient *client, bool bConfig); + CorePlugin *core; +signals: + void okEnabled(bool); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected slots: + void changed(); + void changed(const QString&); + void newToggled(bool); + void autoToggled(bool); + void invisibleToggled(bool); +protected: + bool m_bConfig; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/icqconfigbase.ui b/plugins/icq/icqconfigbase.ui new file mode 100644 index 0000000..42fbd48 --- /dev/null +++ b/plugins/icq/icqconfigbase.ui @@ -0,0 +1,509 @@ + + + ICQConfigBase + + + + 0 + 0 + 461 + 349 + + + + Form1 + + + + 11 + + + + + 0 + + + + &ICQ + + + + 11 + + + + + Password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + QLineEdit::Password + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Register new UIN + + + + + + + UIN: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + &Network + + + + 11 + + + + + 1 + + + 65535 + + + + + + + &Automatically use HTTP polling if proxy required + + + + + + + Use &HTTP polling + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + Server: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Port: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + 0 + 0 + + + + Port range for direct connections: + + + false + + + + + + + 1024 + + + 65534 + + + + + + + 1024 + + + 65534 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + 0 + 0 + + + + Note: For HTTP-polling using proxy settings for HTTP + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + &Keep-alive connection + + + + + + + Activate Network &Media Sense + + + + + + + + &Options + + + + 11 + + + + + Automatically check &invisible + + + + + + + Send format: + + + false + + + + + + + + 0 + 0 + + + + + + + + + + Send message: + + + false + + + + + + + + 0 + 0 + + + + + No wait ack + + + + + Wait ack from server + + + + + Wait ack from client + + + + + + + + + + Accept in &occupied mode + + + + + + + Accept in &DND mode + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + For decrease traffic you can: + + + false + + + + + + + Disable answer on phonebook and &picture requests + + + + + + + Disable automatically &request autoreply on change status + + + + + + + Disable automatically &update user info + + + + + + + Disable &typing notification + + + + + + + + + Check invisible every + + + false + + + + + + + 5 + + + 999 + + + + + + + minutes + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + + chkNew + edtUin + edtPasswd + edtServer + edtPort + chkHTTP + chkAuto + chkKeepAlive + edtMaxPort + cmbFormat + cmbAck + chkDND + chkOccupied + chkInvisible + edtInvisible + chkPlugins + chkAutoReply + chkUpdate + chkTyping + + + + diff --git a/plugins/icq/icqdirect.cpp b/plugins/icq/icqdirect.cpp new file mode 100644 index 0000000..dbd6283 --- /dev/null +++ b/plugins/icq/icqdirect.cpp @@ -0,0 +1,3039 @@ +/*************************************************************************** + icqdirect.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#include "icqclient.h" +#include "icqmessage.h" +#include "icqdirect.h" +#include "contacts/contact.h" + +#include "core_events.h" + +#ifdef WIN32 +#include +#else +#include +#include +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" + +using namespace std; +using namespace SIM; + +const unsigned short TCP_START = 0x07EE; +const unsigned short TCP_ACK = 0x07DA; +const unsigned short TCP_CANCEL = 0x07D0; + +const char FT_INIT = 0; +const char FT_INIT_ACK = 1; +const char FT_FILEINFO = 2; +const char FT_START = 3; +const char FT_SPEED = 5; +const char FT_DATA = 6; + +const unsigned DIRECT_TIMEOUT = 10; + +ICQListener::ICQListener(ICQClient *client) +{ + m_client = client; +} + +ICQListener::~ICQListener() +{ + if (m_client == NULL) + return; + m_client->m_listener = NULL; + m_client->data.owner.Port.asULong() = 0; +} + +bool ICQListener::accept(Socket *s, unsigned long ip) +{ + log(L_DEBUG, "Accept direct connection %s", qPrintable(QHostAddress(ip).toString())); + m_client->m_sockets.push_back(new DirectClient(s, m_client, ip)); + return false; +} + +void ICQListener::bind_ready(unsigned short port) +{ + m_client->data.owner.Port.asULong() = port; +} + +bool ICQListener::error(const QString &err) +{ + log(L_WARN, "ICQListener error: %s", qPrintable(err)); + m_client->m_listener = NULL; + m_client->data.owner.Port.asULong() = 0; + m_client = NULL; + return true; +} + +// ___________________________________________________________________________________________ + +DirectSocket::DirectSocket(Socket *s, ICQClient *client, unsigned long ip) +{ + m_socket = new ICQClientSocket(this); + m_socket->setSocket(s); + m_bIncoming = true; + m_client = client; + m_state = WaitInit; + m_version = 0; + m_data = NULL; + m_port = 0; + m_ip = ip; + init(); +} + +DirectSocket::DirectSocket(ICQUserData *data, ICQClient *client) +{ + m_socket = new ICQClientSocket(this); + m_bIncoming = false; + m_version = (char)(data->Version.toULong()); + m_client = client; + m_state = NotConnected; + m_data = data; + m_port = 0; + m_localPort = 0; + m_ip = 0; + init(); +} + +DirectSocket::~DirectSocket() +{ + if (m_socket) + delete m_socket; + removeFromClient(); +} + +void DirectSocket::timeout() +{ + if ((m_state != Logged) && m_socket) + login_timeout(); +} + +void DirectSocket::login_timeout() +{ + m_socket->error_state("Timeout direct connection"); + if (m_data) + m_data->bNoDirect.asBool() = true; +} + +void DirectSocket::removeFromClient() +{ + for (list::iterator it = m_client->m_sockets.begin(); it != m_client->m_sockets.end(); ++it){ + if (*it == this){ + m_client->m_sockets.erase(it); + break; + } + } +} + +void DirectSocket::init() +{ + if (!m_socket->created()) + m_socket->error_state("Connect error"); + m_nSequence = 0xFFFF; + m_socket->writeBuffer().init(0); + m_socket->readBuffer().init(2); + m_socket->readBuffer().packetStart(); + m_bHeader = true; +} + +unsigned long DirectSocket::Uin() +{ + if (m_data) + return m_data->Uin.toULong(); + return 0; +} + +unsigned short DirectSocket::localPort() +{ + return m_localPort; +} + +unsigned short DirectSocket::remotePort() +{ + return m_port; +} + +bool DirectSocket::error_state(const QString &error, unsigned) +{ + if ((m_state == ConnectIP1) || (m_state == ConnectIP2)){ + connect(); + return false; + } + if (!error.isEmpty()) + log(L_WARN, "Direct socket error %s", qPrintable(error)); + return true; +} + +void DirectSocket::connect() +{ + log(L_DEBUG, "DirectSocket::connect()"); + m_socket->writeBuffer().init(0); + m_socket->readBuffer().init(2); + m_socket->readBuffer().packetStart(); + m_bHeader = true; + if (m_port == 0){ + m_state = ConnectFail; + m_socket->error_state(I18N_NOOP("Connect to unknown port")); + return; + } + if (m_state == NotConnected){ + m_state = ConnectIP1; + unsigned long ip = get_ip(m_data->RealIP); + if (get_ip(m_data->IP) != get_ip(m_client->data.owner.IP)) + ip = 0; + if (ip){ + m_socket->connect(QHostAddress(ip).toString(), m_port, NULL); + return; + } + } + if (m_state == ConnectIP1){ + m_state = ConnectIP2; + unsigned long ip = get_ip(m_data->IP); + if ((ip == get_ip(m_client->data.owner.IP)) && (ip == get_ip(m_data->RealIP))) + ip = 0; + if (ip){ + m_socket->connect(QHostAddress(ip).toString(), m_port, m_client); + return; + } + } + m_state = ConnectFail; + m_socket->error_state(I18N_NOOP("Can't established direct connection")); +} + +void DirectSocket::reverseConnect(unsigned long ip, unsigned short port) +{ + if (m_state != NotConnected){ + log(L_WARN, "Bad state for reverse connect"); + return; + } + m_bIncoming = true; + m_state = ReverseConnect; + m_socket->connect(QHostAddress(ip).toString(), port, NULL); +} + +void DirectSocket::acceptReverse(Socket *s) +{ + if (m_state != WaitReverse){ + log(L_WARN, "Accept reverse in bad state"); + if (s) + delete s; + return; + } + if (s == NULL){ + m_socket->error_state("Reverse fail"); + return; + } + delete m_socket->socket(); + m_socket->setSocket(s); + m_socket->readBuffer().init(2); + m_socket->readBuffer().packetStart(); + m_bHeader = true; + m_state = WaitInit; + m_bIncoming = true; +} + +void DirectSocket::packet_ready() +{ + log(L_DEBUG, "DirectSocket::packet_ready()"); + if (m_bHeader){ + unsigned short size; + m_socket->readBuffer().unpack(size); + if (size){ + m_socket->readBuffer().add(size); + m_bHeader = false; + return; + } + } + if (m_state != Logged){ + ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->readBuffer(), false, plugin->ICQDirectPacket, QString::number((unsigned long)this)); + } + switch (m_state){ + case Logged:{ + processPacket(); + break; + } + case WaitAck:{ + unsigned short s1, s2; + m_socket->readBuffer().unpack(s1); + m_socket->readBuffer().unpack(s2); + if (s2 != 0){ + m_socket->error_state("Bad ack"); + return; + } + if (m_bIncoming){ + m_state = Logged; + connect_ready(); + }else{ + m_state = WaitInit; + } + break; + } + case WaitInit:{ + char cmd; + m_socket->readBuffer().unpack(cmd); + if ((unsigned char)cmd != 0xFF){ + m_socket->error_state("Bad direct init command"); + return; + } + m_socket->readBuffer().unpack(m_version); + if (m_version < 6){ + m_socket->error_state("Use old protocol"); + return; + } + m_socket->readBuffer().incReadPos(3); + unsigned long my_uin; + m_socket->readBuffer().unpack(my_uin); + if (my_uin != m_client->data.owner.Uin.toULong()){ + m_socket->error_state("Bad owner UIN"); + return; + } + m_socket->readBuffer().incReadPos(6); + unsigned long p_uin; + m_socket->readBuffer().unpack(p_uin); + if (m_data == NULL){ + Contact *contact; + m_data = m_client->findContact(p_uin, NULL, false, contact); + if ((m_data == NULL) || contact->getIgnore()){ + m_socket->error_state("User not found"); + return; + } + if ((m_client->getInvisible() && (m_data->VisibleId.toULong() == 0)) || + (!m_client->getInvisible() && m_data->InvisibleId.toULong())){ + m_socket->error_state("User not found"); + return; + } + } + if (p_uin != m_data->Uin.toULong()){ + m_socket->error_state("Bad sender UIN"); + return; + } + if (get_ip(m_data->RealIP) == 0) + set_ip(&m_data->RealIP, m_ip); + m_socket->readBuffer().incReadPos(13); + unsigned long sessionId; + m_socket->readBuffer().unpack(sessionId); + if (m_bIncoming){ + m_nSessionId = sessionId; + sendInitAck(); + sendInit(); + m_state = WaitAck; + }else{ + if (sessionId != m_nSessionId){ + m_socket->error_state("Bad session ID"); + return; + } + sendInitAck(); + m_state = Logged; + connect_ready(); + } + break; + } + default: + m_socket->error_state("Bad session ID"); + return; + } + if (m_socket == NULL){ + delete this; + return; + } + m_socket->readBuffer().init(2); + m_socket->readBuffer().packetStart(); + m_bHeader = true; +} + +void DirectSocket::sendInit() +{ + log(L_DEBUG, "DirectSocket::sendInit()"); + if (!m_bIncoming && (m_state != ReverseConnect)){ + if (m_data->DCcookie.toULong() == 0){ + m_socket->error_state("No direct info"); + return; + } + m_nSessionId = m_data->DCcookie.toULong(); + } + + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer().pack((unsigned short)((m_version >= 7) ? 0x0030 : 0x002c)); + m_socket->writeBuffer().pack('\xFF'); + m_socket->writeBuffer().pack((unsigned short)m_version); + m_socket->writeBuffer().pack((unsigned short)((m_version >= 7) ? 0x002b : 0x0027)); + m_socket->writeBuffer().pack(m_data->Uin.toULong()); + m_socket->writeBuffer().pack((unsigned short)0x0000); + m_socket->writeBuffer().pack(m_data->Port.toULong()); + m_socket->writeBuffer().pack(m_client->data.owner.Uin.toULong()); + m_socket->writeBuffer().pack(get_ip(m_client->data.owner.IP)); + m_socket->writeBuffer().pack(get_ip(m_client->data.owner.RealIP)); + m_socket->writeBuffer().pack((char)0x04); + m_socket->writeBuffer().pack(m_data->Port.toULong()); + m_socket->writeBuffer().pack(m_nSessionId); + m_socket->writeBuffer().pack(0x00000050L); + m_socket->writeBuffer().pack(0x00000003L); + if (m_version >= 7) + m_socket->writeBuffer().pack(0x00000000L); + ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->writeBuffer(), true, plugin->ICQDirectPacket, QString::number((unsigned long)this)); + m_socket->write(); +} + +void DirectSocket::sendInitAck() +{ + log(L_DEBUG, "DirectSocket::sendInitAck()"); + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer().pack((unsigned short)0x0004); + m_socket->writeBuffer().pack((unsigned short)0x0001); + m_socket->writeBuffer().pack((unsigned short)0x0000); + ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->writeBuffer(), true, plugin->ICQDirectPacket, QString::number((unsigned long)this)); + m_socket->write(); +} + +void DirectSocket::connect_ready() +{ + log(L_DEBUG, "DirectSocket::connect_ready()"); + QTimer::singleShot(DIRECT_TIMEOUT * 1000, this, SLOT(timeout())); + if (m_bIncoming){ + if (m_state == ReverseConnect) + m_state = WaitInit; + }else{ + sendInit(); + m_state = WaitAck; + } + m_socket->readBuffer().init(2); + m_socket->readBuffer().packetStart(); + m_bHeader = true; +} + +// ___________________________________________________________________________________________ + +static unsigned char client_check_data[] = + { + "As part of this software beta version Mirabilis is " + "granting a limited access to the ICQ network, " + "servers, directories, listings, information and databases (\"" + "ICQ Services and Information\"). The " + "ICQ Service and Information may databases (\"" + "ICQ Services and Information\"). The " + "ICQ Service and Information may\0" + }; + +DirectClient::DirectClient(Socket *s, ICQClient *client, unsigned long ip) + : DirectSocket(s, client, ip) +{ + m_channel = PLUGIN_NULL; + m_state = WaitLogin; + m_ssl = NULL; +} + +DirectClient::DirectClient(ICQUserData *data, ICQClient *client, unsigned channel) + : DirectSocket(data, client) +{ + m_state = None; + m_channel = channel; + m_port = (unsigned short)(data->Port.toULong()); + m_ssl = NULL; +} + +DirectClient::~DirectClient() +{ + error_state(QString::null, 0); + switch (m_channel){ + case PLUGIN_NULL: + if (m_data && (m_data->Direct.object() == this)) + m_data->Direct.clear(); + break; + case PLUGIN_INFOxMANAGER: + if (m_data && (m_data->DirectPluginInfo.object() == this)) + m_data->DirectPluginInfo.clear(); + break; + case PLUGIN_STATUSxMANAGER: + if (m_data && (m_data->DirectPluginStatus.object() == this)) + m_data->DirectPluginStatus.clear(); + break; + } + secureStop(false); +} + +bool DirectClient::isSecure() +{ + return m_ssl && m_ssl->connected(); +} + +void DirectClient::processPacket() +{ + log(L_DEBUG, "DirectSocket::processPacket()"); + switch (m_state){ + case None: + m_socket->error_state("Bad state process packet"); + return; + case WaitInit2: + if (m_bIncoming){ + ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->readBuffer(), false, plugin->ICQDirectPacket, QString::number((unsigned long)this)); + if (m_version < 8){ + if (m_data->Direct.object()){ + m_socket->error_state("Direct connection already established"); + return; + } + m_state = Logged; + processMsgQueue(); + break; + } + plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->readBuffer(), false, plugin->ICQDirectPacket, QString::number((unsigned long)this)); + m_socket->readBuffer().incReadPos(13); + char p[16]; + m_socket->readBuffer().unpack(p, 16); + for (m_channel = 0; m_channel <= PLUGIN_NULL; m_channel++){ + if (!memcmp(m_client->plugins[m_channel], p, 16)) + break; + } + removeFromClient(); + switch (m_channel){ + case PLUGIN_INFOxMANAGER: { + DirectClient *dc = dynamic_cast(m_data->DirectPluginInfo.object()); + if (dc){ + if (dc->copyQueue(this)){ + delete dc; + m_data->DirectPluginInfo.setObject(this); + }else{ + m_socket->error_state("Plugin info connection already established"); + } + }else{ + m_data->DirectPluginInfo.setObject(this); + } + break; + } + case PLUGIN_STATUSxMANAGER: { + DirectClient *dc = dynamic_cast(m_data->DirectPluginStatus.object()); + if (dc){ + if (dc->copyQueue(this)){ + delete dc; + m_data->DirectPluginStatus.setObject(this); + }else{ + m_socket->error_state("Plugin status connection already established"); + } + }else{ + m_data->DirectPluginStatus.setObject(this); + } + break; + } + case PLUGIN_NULL: { + DirectClient *dc = dynamic_cast(m_data->Direct.object()); + if (dc){ + if (dc->copyQueue(this)){ + delete dc; + m_data->Direct.setObject(this); + }else{ + m_socket->error_state("Direct connection already established"); + } + }else{ + m_data->Direct.setObject(this); + } + break; + } + default: + m_socket->error_state("Unknown direct channel"); + return; + } + sendInit2(); + } + m_state = Logged; + processMsgQueue(); + return; + default: + break; + } + unsigned long hex, key, B1, M1; + unsigned int i; + unsigned char X1, X2, X3; + + unsigned int correction = 2; + if (m_version >= 7) + correction++; + + unsigned int size = m_socket->readBuffer().size() - correction; + if (m_version >= 7) m_socket->readBuffer().incReadPos(1); + + unsigned long check; + m_socket->readBuffer().unpack(check); + + // main XOR key + key = 0x67657268 * size + check; + + unsigned char *p = (unsigned char*)m_socket->readBuffer().data(m_socket->readBuffer().readPos()-4); + for(i=4; i<(size+3)/4; i+=4) { + hex = key + client_check_data[i&0xFF]; + p[i] ^= hex&0xFF; + p[i+1] ^= (hex>>8) & 0xFF; + p[i+2] ^= (hex>>16) & 0xFF; + p[i+3] ^= (hex>>24) & 0xFF; + } + + B1 = (p[4] << 24) | (p[6] << 16) | (p[4] <<8) | (p[6]<<0); + + // special decryption + B1 ^= check; + + // validate packet + M1 = (B1 >> 24) & 0xFF; + if(M1 < 10 || M1 >= size){ + m_socket->error_state("Decrypt packet failed"); + return; + } + + X1 = (unsigned char)(p[M1] ^ 0xFF); + if(((B1 >> 16) & 0xFF) != X1){ + m_socket->error_state("Decrypt packet failed"); + return; + } + + X2 = (unsigned char)((B1 >> 8) & 0xFF); + if(X2 < 220) { + X3 = (unsigned char)(client_check_data[X2] ^ 0xFF); + if((B1 & 0xFF) != X3){ + m_socket->error_state("Decrypt packet failed"); + return; + } + } + ICQPlugin *icq_plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->readBuffer(), false, icq_plugin->ICQDirectPacket, name()); + + m_socket->readBuffer().setReadPos(2); + if (m_version >= 7){ + char startByte; + m_socket->readBuffer().unpack(startByte); + if (startByte != 0x02){ + m_socket->error_state("Bad start byte"); + return; + } + } + unsigned long checksum; + m_socket->readBuffer().unpack(checksum); + unsigned short command; + m_socket->readBuffer().unpack(command); + m_socket->readBuffer().incReadPos(2); + unsigned short seq; + m_socket->readBuffer().unpack(seq); + m_socket->readBuffer().incReadPos(12); + + unsigned short type, ackFlags, msgFlags; + m_socket->readBuffer().unpack(type); + m_socket->readBuffer().unpack(ackFlags); + m_socket->readBuffer().unpack(msgFlags); + QByteArray msg_str; + m_socket->readBuffer() >> msg_str; + Message *m; + switch (command){ + case TCP_START: + switch (type){ + case ICQ_MSGxAR_AWAY: + case ICQ_MSGxAR_OCCUPIED: + case ICQ_MSGxAR_NA: + case ICQ_MSGxAR_DND: + case ICQ_MSGxAR_FFC:{ + unsigned req_status = STATUS_AWAY; + switch (type){ + case ICQ_MSGxAR_OCCUPIED: + req_status = STATUS_OCCUPIED; + break; + case ICQ_MSGxAR_NA: + req_status = STATUS_NA; + break; + case ICQ_MSGxAR_DND: + req_status = STATUS_DND; + break; + case ICQ_MSGxAR_FFC: + req_status = STATUS_FFC; + break; + } + ar_request req; + req.screen = m_client->screen(m_data); + req.type = type; + req.flags = msgFlags; + req.id.id_l = seq; + req.id1 = 0; + req.id2 = 0; + req.bDirect = true; + m_client->arRequests.push_back(req); + + Contact *contact = NULL; + m_client->findContact(m_client->screen(m_data), NULL, false, contact); + ARRequest ar; + ar.contact = contact; + ar.param = &m_client->arRequests.back(); + ar.receiver = m_client; + ar.status = req_status; + EventARRequest(&ar).process(); + return; + } + case ICQ_MSGxSECURExOPEN: + case ICQ_MSGxSECURExCLOSE: + msg_str = NULL; + msg_str = "1"; + sendAck(seq, type, msgFlags, msg_str); + if (type == ICQ_MSGxSECURExOPEN){ + secureListen(); + }else{ + secureStop(true); + } + return; + } + if (m_channel == PLUGIN_NULL){ + MessageId id; + id.id_l = seq; + m = m_client->parseMessage(type, m_client->screen(m_data), msg_str, m_socket->readBuffer(), id, 0); + if (m == NULL){ + m_socket->error_state("Start without message"); + return; + } + unsigned flags = m->getFlags() | MESSAGE_RECEIVED | MESSAGE_DIRECT; + if (isSecure()) + flags |= MESSAGE_SECURE; + m->setFlags(flags); + bool bAccept = true; + switch (m_client->getStatus()){ + case STATUS_DND: + if (!m_client->getAcceptInDND()) + bAccept = false; + break; + case STATUS_OCCUPIED: + if (!m_client->getAcceptInOccupied()) + bAccept = false; + break; + } + if (msgFlags & (ICQ_TCPxMSG_URGENT | ICQ_TCPxMSG_LIST)) + bAccept = true; + if (bAccept){ + if (msgFlags & ICQ_TCPxMSG_URGENT) + m->setFlags(m->getFlags() | MESSAGE_URGENT); + if (msgFlags & ICQ_TCPxMSG_LIST) + m->setFlags(m->getFlags() | MESSAGE_LIST); + if (m_client->messageReceived(m, m_client->screen(m_data))) + sendAck(seq, type, msgFlags); + }else{ + sendAck(seq, type, ICQ_TCPxMSG_AUTOxREPLY); + delete m; + } + }else{ + plugin p; //Fixme: Local declaration of 'p' hides declaration of the same name in outer scope, see previous declaration at line '609' + m_socket->readBuffer().unpack((char*)p, sizeof(p)); + unsigned plugin_index; + for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++){ + if (!memcmp(p, m_client->plugins[plugin_index], sizeof(p))) + break; + } + ICQBuffer info; + unsigned short type = 1; //Fixme: Local declaration of 'type' hides declaration of the same name in outer scope, see previous declaration at line '665' + switch (plugin_index){ + case PLUGIN_FILESERVER: + case PLUGIN_FOLLOWME: + case PLUGIN_ICQPHONE: + type = 2; + case PLUGIN_PHONEBOOK: + case PLUGIN_PICTURE: + case PLUGIN_QUERYxINFO: + case PLUGIN_QUERYxSTATUS: + m_client->pluginAnswer(plugin_index, m_data->Uin.toULong(), info); + startPacket(TCP_ACK, seq); + m_socket->writeBuffer().pack(type); + m_socket->writeBuffer() << 0x00000000L + << (char)1 + << type; + m_socket->writeBuffer().pack(info.data(0), info.size()); + sendPacket(); + break; + default: + log(L_WARN, "Unknwon direct plugin request %u", plugin_index); + break; + } + } + break; + case TCP_CANCEL: + case TCP_ACK: { + log(L_DEBUG, "Ack %X %X", ackFlags, msgFlags); + bool itDeleted = false; + QList::iterator it; + for (it = m_queue.begin(); it != m_queue.end(); ++it){ + if (it->seq != seq) + continue; + if (it->msg == NULL){ + if (it->type == PLUGIN_AR){ + Contact *contact = NULL; + m_client->findContact(m_client->screen(m_data), NULL, false, contact); + m_data->AutoReply.str() = getContacts()->toUnicode(contact,msg_str); + m_queue.erase(it); + itDeleted = true; + break; + } + unsigned plugin_index = it->type; + switch (plugin_index){ + case PLUGIN_FILESERVER: + case PLUGIN_FOLLOWME: + case PLUGIN_ICQPHONE: + m_socket->readBuffer().incReadPos(-3); + break; + case PLUGIN_QUERYxSTATUS: + m_socket->readBuffer().incReadPos(9); + break; + } + m_client->parsePluginPacket(m_socket->readBuffer(), plugin_index, m_data, m_data->Uin.toULong(), true); + m_queue.erase(it); + itDeleted = true; + break; + } + Message *msg = it->msg; + if (command == TCP_CANCEL){ + EventMessageCancel(msg).process(); + delete msg; + break; + } + MessageId id; + id.id_l = seq; + Message *m = m_client->parseMessage(type, m_client->screen(m_data), msg_str, m_socket->readBuffer(), id, 0); //Fixme: Local declaration of 'm' hides declaration of the same name in outer scope, see previous declaration at line '671' + switch (msg->type()){ + case MessageCloseSecure: + secureStop(true); + break; + case MessageOpenSecure: + if (msg_str.isEmpty()){ + msg->setError(I18N_NOOP("Other side does not support the secure connection")); + }else{ + secureConnect(); + } + return; + case MessageFile: + if (m == NULL){ + m_socket->error_state("Ack without message"); + return; + } + if (ackFlags){ + if (msg_str.isEmpty()){ + msg->setError(I18N_NOOP("Send message fail")); + }else{ + QString err = getContacts()->toUnicode(m_client->getContact(m_data), msg_str); + msg->setError(err); + } + EventMessageSent(msg).process(); + m_queue.erase(it); + delete msg; + }else{ + if (m->type() != MessageICQFile){ + m_socket->error_state("Bad message type in ack file"); + return; + } + ICQFileTransfer *ft = new ICQFileTransfer(static_cast(msg), m_data, m_client); + EventMessageAcked(msg).process(); + m_queue.erase(it); + m_client->m_processMsg.push_back(msg); + ft->connect(static_cast(m)->getPort()); + } + return; + } + unsigned flags = msg->getFlags() | MESSAGE_DIRECT; + if (isSecure()) + flags |= MESSAGE_SECURE; + if (m_client->snacICBM()->ackMessage(msg, ackFlags, msg_str)){ + if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + if (msg->type() == MessageGeneric){ + Message m; //Fixme: Local declaration of 'm' hides declaration of the same name in outer scope, see previous declaration at line '842' + m.setContact(msg->contact()); + m.setClient(msg->client()); + if (it->type == CAP_RTF){ + m.setText(m_client->removeImages(msg->getRichText(), true)); + flags |= MESSAGE_RICHTEXT; + }else{ + m.setText(msg->getPlainText()); + } + m.setFlags(flags); + if (msg->getBackground() != msg->getForeground()){ + m.setForeground(msg->getForeground()); + m.setBackground(msg->getBackground()); + } + EventSent(&m).process(); + }else if ((msg->type() != MessageOpenSecure) && (msg->type() != MessageCloseSecure)){ + msg->setFlags(flags); + EventSent(msg).process(); + } + } + } + EventMessageSent(msg).process(); + m_queue.erase(it); + delete msg; + break; + } + if (!itDeleted && (m_queue.size() == 0 || it == m_queue.end())){ + list::iterator it; //Fixme: Local declaration of 'it' hides declaration of the same name in outer scope, see previous declaration at line '805' + for (it = m_client->m_acceptMsg.begin(); it != m_client->m_acceptMsg.end(); ++it){ + QString name = m_client->dataName(m_data); + Message *msg = *it; + if ((msg->getFlags() & MESSAGE_DIRECT) && (!msg->client().isEmpty()) && (name == msg->client())){ + bool bFound = false; + switch (msg->type()){ + case MessageICQFile: + if (static_cast(msg)->getID_L() == seq) + bFound = true; + break; + } + if (bFound){ + m_client->m_acceptMsg.erase(it); + EventMessageDeleted(msg).process(); + delete msg; + break; + } + } + if (it == m_client->m_acceptMsg.end()) + log(L_WARN, "Message for ACK not found??"); + } + } + break; + } + default: + m_socket->error_state("Unknown TCP command"); + } +} + +bool DirectClient::copyQueue(DirectClient *to) +{ + if (m_state == Logged) + return false; + to->m_queue = m_queue; + m_queue.clear(); + return true; +} + +void DirectClient::connect_ready() +{ + log(L_DEBUG, "DirectSocket::connect_ready()"); + if (m_state == None){ + m_state = WaitLogin; + DirectSocket::connect_ready(); + return; + } + if (m_state == SSLconnect){ + for (QList::iterator it = m_queue.begin(); it != m_queue.end(); ++it){ + SendDirectMsg &sm = *it; + if ((sm.msg == NULL) || (sm.msg->type() != MessageOpenSecure)) + continue; + EventMessageSent(sm.msg).process(); + delete sm.msg; + m_queue.erase(it); + break; + } + m_state = Logged; + Contact *contact; + if (m_client->findContact(m_client->screen(m_data), NULL, false, contact)){ + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + return; + } + if (m_state == SSLconnect){ + for (QList::iterator it = m_queue.begin(); it != m_queue.end(); ++it){ + SendDirectMsg &sm = *it; + if ((sm.msg == NULL) || (sm.msg->type() != MessageOpenSecure)) + continue; + EventMessageSent(sm.msg).process(); + delete sm.msg; + m_queue.erase(it); + break; + } + m_state = Logged; + Contact *contact; + if (m_client->findContact(m_client->screen(m_data), NULL, false, contact)){ + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + return; + } + if (m_bIncoming){ + Contact *contact; + m_data = m_client->findContact(m_client->screen(m_data), NULL, false, contact); + if ((m_data == NULL) || contact->getIgnore()){ + m_socket->error_state("Connection from unknown user"); + return; + } + m_state = WaitInit2; + }else{ + if (m_version >= 7){ + sendInit2(); + m_state = WaitInit2; + }else{ + m_state = Logged; + processMsgQueue(); + } + } +} + +void DirectClient::sendInit2() +{ + log(L_DEBUG, "DirectSocket::sendInit2()"); + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer().pack((unsigned short)0x0021); + m_socket->writeBuffer().pack((char) 0x03); + m_socket->writeBuffer().pack(0x0000000AL); + m_socket->writeBuffer().pack(0x00000001L); + m_socket->writeBuffer().pack(m_bIncoming ? 0x00000001L : 0x00000000L); + const plugin &p = m_client->plugins[m_channel]; + m_socket->writeBuffer().pack((const char*)p, 8); + if (m_bIncoming) { + m_socket->writeBuffer().pack(0x00040001L); + m_socket->writeBuffer().pack((const char*)p + 8, 8); + } else { + m_socket->writeBuffer().pack((const char*)p + 8, 8); + m_socket->writeBuffer().pack(0x00040001L); + } + ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->writeBuffer(), true, plugin->ICQDirectPacket, name()); + m_socket->write(); +} + +bool DirectClient::error_state(const QString &_err, unsigned code) +{ + //Fixme: Dereferencing NULL pointer 'm_data': Lines: 1045, 1046, 1048, 1058, 1059, 1060, 1061, 1062, 1069 + QString err = _err; + if (!err.isEmpty() && !DirectSocket::error_state(err, code)) + return false; + if (m_data && (m_port == m_data->Port.toULong())){ + switch (m_state){ + case ConnectIP1: + case ConnectIP2: + m_data->bNoDirect.asBool() = true; + break; + default: + break; + } + } + if (err.isEmpty()) + err = I18N_NOOP("Send message fail"); + for (QList::iterator it = m_queue.begin(); it != m_queue.end(); ++it){ + SendDirectMsg &sm = *it; + if (sm.msg){ + if (!m_client->snacICBM()->sendThruServer(sm.msg, m_data)){ + sm.msg->setError(err); + EventMessageSent(sm.msg).process(); + delete sm.msg; + } + }else{ + m_client->addPluginInfoRequest(m_data->Uin.toULong(), sm.type); + } + } + m_queue.clear(); + return true; +} + +void DirectClient::sendAck(unsigned short seq, unsigned short type, unsigned short flags, + const char *msg, unsigned short status, Message *m) +{ + log(L_DEBUG, "DirectSocket::sendAck()"); + bool bAccept = true; + if (status == ICQ_TCPxACK_ACCEPT){ + switch (m_client->getStatus()){ + case STATUS_AWAY: + status = ICQ_TCPxACK_AWAY; + break; + case STATUS_OCCUPIED: + bAccept = false; + status = ICQ_TCPxACK_OCCUPIED; + if (type == ICQ_MSGxAR_OCCUPIED){ + status = ICQ_TCPxACK_OCCUPIEDxCAR; + bAccept = true; + } + break; + case STATUS_NA: + status = ICQ_TCPxACK_NA; + break; + case STATUS_DND: + status = ICQ_TCPxACK_DND; + bAccept = false; + if (type == ICQ_MSGxAR_DND){ + status = ICQ_TCPxACK_DNDxCAR; + bAccept = true; + } + break; + default: + break; + } + } + if (!bAccept && (msg == NULL)){ + ar_request req; + req.screen = m_client->screen(m_data); + req.type = type; + req.ack = 0; + req.flags = flags; + req.id.id_l = seq; + req.id1 = 0; + req.id2 = 0; + req.bDirect = true; + m_client->arRequests.push_back(req); + + unsigned short req_status = STATUS_ONLINE; + if (m_data->Status.toULong() & ICQ_STATUS_DND){ + req_status = STATUS_DND; + }else if (m_data->Status.toULong() & ICQ_STATUS_OCCUPIED){ + req_status = STATUS_OCCUPIED; + }else if (m_data->Status.toULong() & ICQ_STATUS_NA){ + req_status = STATUS_NA; + }else if (m_data->Status.toULong() & ICQ_STATUS_AWAY){ + req_status = STATUS_AWAY; + }else if (m_data->Status.toULong() & ICQ_STATUS_FFC){ + req_status = STATUS_FFC; + } + + Contact *contact = NULL; + m_client->findContact(m_client->screen(m_data), NULL, false, contact); + ARRequest ar; + ar.contact = contact; + ar.param = &m_client->arRequests.back(); + ar.receiver = m_client; + ar.status = req_status; + EventARRequest(&ar).process(); + return; + } + + QByteArray message; + if (msg) + message = msg; + + startPacket(TCP_ACK, seq); + m_socket->writeBuffer().pack(type); + m_socket->writeBuffer().pack(status); + m_socket->writeBuffer().pack(flags); + m_socket->writeBuffer() << message; + bool bExt = false; + if (m){ + switch (m->type()){ + case MessageICQFile: + if (static_cast(m)->getExtended()){ + bExt = true; + ICQBuffer buf, msgBuf; + ICQBuffer b; + m_client->packExtendedMessage(m, buf, msgBuf, m_data); + b.pack((unsigned short)buf.size()); + b.pack(buf.data(0), buf.size()); + b.pack32(msgBuf); + m_socket->writeBuffer().pack(b.data(), b.size()); + } + break; + } + } + if (!bExt){ + m_socket->writeBuffer() + << 0x00000000L + << 0xFFFFFFFFL; + } + sendPacket(); +} + +void DirectClient::startPacket(unsigned short cmd, unsigned short seq) +{ + log(L_DEBUG, "DirectSocket::startPacket()"); + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer() + << (unsigned short)0; // size + if (m_version >= 7) + m_socket->writeBuffer() << (char)0x02; + if (seq == 0) + seq = --m_nSequence; + m_socket->writeBuffer() + << (unsigned long)0; // checkSum + m_socket->writeBuffer().pack(cmd); + m_socket->writeBuffer() + << (char) ((m_channel == PLUGIN_NULL) ? 0x0E : 0x12) + << (char) 0; + m_socket->writeBuffer().pack(seq); + m_socket->writeBuffer() + << (unsigned long)0 + << (unsigned long)0 + << (unsigned long)0; +} + +void DirectClient::sendPacket() +{ + log(L_DEBUG, "DirectSocket::sendPacket()"); + unsigned size = m_socket->writeBuffer().size() - m_socket->writeBuffer().packetStartPos() - 2; + unsigned char *p = (unsigned char*)(m_socket->writeBuffer().data(m_socket->writeBuffer().packetStartPos())); + p[0] = (unsigned char)(size & 0xFF); + p[1] = (unsigned char)((size >> 8) & 0xFF); + + ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->writeBuffer(), true, plugin->ICQDirectPacket, name()); + + unsigned long hex, key, B1, M1; + unsigned long i, check; + unsigned char X1, X2, X3; + + p += 2; + if (m_version >= 7){ + size--; + p++; + } + + // calculate verification data + M1 = (rand() % ((size < 255 ? size : 255)-10))+10; + X1 = (unsigned char)(p[M1] ^ 0xFF); + X2 = (unsigned char)(rand() % 220); + X3 = (unsigned char)(client_check_data[X2] ^ 0xFF); + + B1 = (p[4] << 24) | (p[6]<<16) | (p[4]<<8) | (p[6]); + + // calculate checkcode + check = (M1 << 24) | (X1 << 16) | (X2 << 8) | X3; + check ^= B1; + + *((unsigned long*)p) = check; + // main XOR key + key = 0x67657268 * size + check; + + // XORing the actual data + for(i=4; i<(size+3)/4; i+=4){ + hex = key + client_check_data[i & 0xFF]; + p[i] ^= hex & 0xFF; + p[i+1] ^= (hex>>8) & 0xFF; + p[i+2] ^= (hex>>16) & 0xFF; + p[i+3] ^= (hex>>24) & 0xFF; + } + m_socket->write(); +} + +void DirectClient::acceptMessage(Message *msg) +{ + log(L_DEBUG, "DirectSocket::acceptMessage()"); + unsigned short seq = 0; + switch (msg->type()){ + case MessageICQFile: + seq = (unsigned short)(static_cast(msg)->getID_L()); + sendAck(seq, static_cast(msg)->getExtended() ? ICQ_MSGxEXT : ICQ_MSGxFILE, 0, NULL, ICQ_TCPxACK_ACCEPT, msg); + break; + default: + log(L_WARN, "Unknown type for direct decline"); + } +} + +void DirectClient::declineMessage(Message *msg, const QString &reason) +{ + QByteArray r; + r = getContacts()->fromUnicode(m_client->getContact(m_data), reason); + unsigned short seq = 0; + switch (msg->type()){ + case MessageICQFile: + seq = (unsigned short)(static_cast(msg)->getID_L()); + sendAck(seq, static_cast(msg)->getExtended() ? ICQ_MSGxEXT : ICQ_MSGxFILE, 0, r, ICQ_TCPxACK_REFUSE, msg); + break; + default: + log(L_WARN, "Unknown type for direct decline"); + } +} + +bool DirectClient::sendMessage(Message *msg) +{ + SendDirectMsg sm; + sm.msg = msg; + sm.seq = 0; + sm.type = 0; + sm.icq_type = 0; + m_queue.push_back(sm); + processMsgQueue(); + return true; +} + +void packCap(ICQBuffer &b, const capability &c); + +void DirectClient::processMsgQueue() +{ + if (m_state != Logged) + return; + for (QList::iterator it = m_queue.begin(); it != m_queue.end();){ + SendDirectMsg &sm = *it; + if (sm.seq){ + ++it; + continue; + } + if (sm.msg){ + QByteArray message; + ICQBuffer &mb = m_socket->writeBuffer(); + unsigned short flags = ICQ_TCPxMSG_NORMAL; + if (sm.msg->getFlags() & MESSAGE_URGENT) + flags = ICQ_TCPxMSG_URGENT; + if (sm.msg->getFlags() & MESSAGE_LIST) + flags = ICQ_TCPxMSG_LIST; + switch (sm.msg->type()){ + case MessageGeneric: + startPacket(TCP_START, 0); + mb.pack((unsigned short)ICQ_MSGxMSG); + mb.pack(m_client->msgStatus()); + mb.pack(flags); + if ((sm.msg->getFlags() & MESSAGE_RICHTEXT) && + (m_client->getSendFormat() == 0) && + (m_client->hasCap(m_data, CAP_RTF))){ + QString text = sm.msg->getRichText(); + QString part; + message = m_client->createRTF(text, part, sm.msg->getForeground(), m_client->getContact(m_data), 0xFFFFFFFF); + sm.type = CAP_RTF; + }else if (m_client->hasCap(m_data, CAP_UTF) && + (m_client->getSendFormat() <= 1) && + ((sm.msg->getFlags() & MESSAGE_SECURE) == 0)){ + message = ICQClient::addCRLF(sm.msg->getPlainText()).toUtf8(); + sm.type = CAP_UTF; + }else{ + message = getContacts()->fromUnicode(m_client->getContact(m_data), sm.msg->getPlainText()); + EventSend e(sm.msg, message); + e.process(); + message = e.localeText(); + } + mb << message; + if (sm.msg->getBackground() == sm.msg->getForeground()){ + mb << 0x00000000L << 0xFFFFFF00L; + }else{ + mb << (sm.msg->getForeground() << 8) << (sm.msg->getBackground() << 8); + } + if (sm.type){ + mb << 0x26000000L; + packCap(mb, ICQClient::capabilities[sm.type]); + } + sendPacket(); + sm.seq = m_nSequence; + sm.icq_type = ICQ_MSGxMSG; + break; + case MessageFile: + case MessageUrl: + case MessageContacts: + case MessageOpenSecure: + case MessageCloseSecure: + startPacket(TCP_START, 0); + m_client->packMessage(mb, sm.msg, m_data, sm.icq_type, true); + sendPacket(); + sm.seq = m_nSequence; + break; + default: + sm.msg->setError(I18N_NOOP("Unknown message type")); + EventMessageSent(sm.msg).process(); + delete sm.msg; + m_queue.erase(it); + it = m_queue.begin(); + continue; + } + }else{ + if (sm.type == PLUGIN_AR){ + sm.icq_type = 0; + unsigned s = m_data->Status.toULong(); + if (s != ICQ_STATUS_OFFLINE){ + if (s & ICQ_STATUS_DND){ + sm.icq_type = ICQ_MSGxAR_DND; + }else if (s & ICQ_STATUS_OCCUPIED){ + sm.icq_type = ICQ_MSGxAR_OCCUPIED; + }else if (s & ICQ_STATUS_NA){ + sm.icq_type = ICQ_MSGxAR_NA; + }else if (s & ICQ_STATUS_AWAY){ + sm.icq_type = ICQ_MSGxAR_AWAY; + }else if (s & ICQ_STATUS_FFC){ + sm.icq_type = ICQ_MSGxAR_FFC; + } + } + if (sm.type == 0){ + m_queue.erase(it); + it = m_queue.begin(); + continue; + } + ICQBuffer &mb = m_socket->writeBuffer(); + startPacket(TCP_START, 0); + mb.pack(sm.icq_type); + mb.pack(m_client->msgStatus()); + mb.pack(ICQ_TCPxMSG_AUTOxREPLY); + mb << (char)1 << (unsigned short)0; + sendPacket(); + sm.seq = m_nSequence; + }else{ + ICQBuffer &mb = m_socket->writeBuffer(); + startPacket(TCP_START, 0); + mb.pack((unsigned short)ICQ_MSGxMSG); + mb.pack(m_client->msgStatus()); + mb.pack(ICQ_TCPxMSG_AUTOxREPLY); + mb.pack((unsigned short)1); + mb.pack((char)0); + mb.pack((char*)m_client->plugins[sm.type], sizeof(plugin)); + mb.pack((unsigned long)0); + sendPacket(); + sm.seq = m_nSequence; + } + } + ++it; + } +} + +bool DirectClient::cancelMessage(Message *msg) +{ + for (QList::iterator it = m_queue.begin(); it != m_queue.end(); ++it){ + if (it->msg == msg){ + if (it->seq){ + ICQBuffer &mb = m_socket->writeBuffer(); + startPacket(TCP_CANCEL, it->seq); + mb.pack((unsigned short)it->icq_type); + mb.pack((unsigned short)0); + mb.pack((unsigned short)0); + QByteArray message; + mb << message; + sendPacket(); + } + m_queue.erase(it); + return true; + } + } + return false; +} + +void DirectClient::addPluginInfoRequest(unsigned plugin_index) +{ + QList::ConstIterator it; + for (it = m_queue.constBegin(); it != m_queue.constEnd(); ++it){ + const SendDirectMsg &sm = *it; + if (sm.msg) + continue; + if (sm.type == plugin_index) + return; + } + SendDirectMsg sm; + sm.msg = NULL; + sm.seq = 0; + sm.type = plugin_index; + sm.icq_type = 0; + m_queue.push_back(sm); + processMsgQueue(); +} + +class ICQ_SSLClient : public SSLClient +{ +public: + ICQ_SSLClient(Socket *s) : SSLClient(s) {} +}; + + +void DirectClient::secureConnect() +{ + if (m_ssl != NULL) return; + m_ssl = new ICQ_SSLClient(m_socket->socket()); + m_socket->setSocket(m_ssl); + m_state = SSLconnect; + m_ssl->startEncryption(); +} + +void DirectClient::secureListen() +{ + if (m_ssl != NULL) + return; + m_ssl = new ICQ_SSLClient(m_socket->socket()); + m_socket->setSocket(m_ssl); + m_state = SSLconnect; +// m_ssl->accept(); +} + +void DirectClient::secureStop(bool bShutdown) +{ + if (m_ssl){ + if (bShutdown){ + m_ssl->close(); + } + m_socket->setSocket(m_ssl->socket(), false); + m_ssl->setSocket(NULL); + delete m_ssl; + m_ssl = NULL; + Contact *contact; + if (m_client->findContact(m_client->screen(m_data), NULL, false, contact)){ + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + } +} + +QString DirectClient::name() +{ + if (m_data == NULL) + return QString::null; + m_name = QString::null; + switch (m_channel){ + case PLUGIN_NULL: + break; + case PLUGIN_INFOxMANAGER: + m_name = "Info."; + break; + case PLUGIN_STATUSxMANAGER: + m_name = "Status."; + break; + default: + m_name = "Unknown."; + } + m_name += QString::number(m_data->Uin.toULong()); + m_name += '.'; + m_name += QString::number((unsigned long)this); + return m_name; +} + +ICQFileTransfer::ICQFileTransfer(FileMessage *msg, ICQUserData *data, ICQClient *client) + : FileTransfer(msg), DirectSocket(data, client) +{ + m_state = None; + FileMessage::Iterator it(*msg); + m_nFiles = it.count(); + m_totalSize = msg->getSize(); +} + +ICQFileTransfer::~ICQFileTransfer() +{ +} + +void ICQFileTransfer::connect(unsigned short port) +{ + log(L_DEBUG, "ICQFileTransfer::connect()"); + m_port = port; + FileTransfer::m_state = FileTransfer::Connect; + if (m_notify) + m_notify->process(); + DirectSocket::connect(); +} + +void ICQFileTransfer::listen() +{ + FileTransfer::m_state = FileTransfer::Listen; + if (m_notify) + m_notify->process(); + bind(m_client->getMinPort(), m_client->getMaxPort(), m_client); +} + +void ICQFileTransfer::processPacket() +{ + log(L_DEBUG, "ICQFileTransfer::processPacket()"); + char cmd; + m_socket->readBuffer() >> cmd; + if (cmd != FT_DATA){ + ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->readBuffer(), false, plugin->ICQDirectPacket, QByteArray("File transfer")); + } + if (cmd == FT_SPEED){ + char speed; + m_socket->readBuffer().unpack(speed); + m_speed = speed; + return; + } + switch (m_state){ + case InitSend: + switch (cmd){ + case FT_INIT_ACK: + sendFileInfo(); + break; + case FT_START:{ + unsigned long pos, empty, speed, curFile; + m_socket->readBuffer().unpack(pos); + m_socket->readBuffer().unpack(empty); + m_socket->readBuffer().unpack(speed); + m_socket->readBuffer().unpack(curFile); + curFile--; + log(L_DEBUG, "Start send at %lu %lu", pos, curFile); + FileMessage::Iterator it(*m_msg); + if (curFile >= it.count()){ + m_socket->error_state("Bad file index"); + return; + } + while (curFile != m_nFile){ + if (!openFile()){ + m_socket->error_state("Can't open file"); + return; + } + } + if (m_file && !m_file->seek(pos)){ + m_socket->error_state("Can't set transfer position"); + return; + } + m_totalBytes += pos; + m_bytes = pos; + m_state = Send; + FileTransfer::m_state = FileTransfer::Write; + if (m_notify){ + m_notify->process(); + m_notify->transfer(true); + } + write_ready(); + break; + } + default: + log(L_WARN, "Bad init client command %X", cmd); + m_socket->error_state("Bad packet"); + } + break; + case WaitInit:{ + if (cmd != FT_INIT){ + m_socket->error_state("No init command"); + return; + } + unsigned long n; + m_socket->readBuffer().unpack(n); + m_socket->readBuffer().unpack(n); + m_nFiles = n; + m_socket->readBuffer().unpack(n); + m_totalSize = n; + m_msg->setSize(m_totalSize); + m_state = InitReceive; + setSpeed(m_speed); + startPacket(FT_INIT_ACK); + m_socket->writeBuffer().pack((unsigned long)m_speed); + QString uin = m_client->screen(&m_client->data.owner); + m_socket->writeBuffer() << uin; + sendPacket(); + FileTransfer::m_state = Negotiation; + if (m_notify) + m_notify->process(); + } + break; + case InitReceive:{ + initReceive(cmd); + break; + } + case Receive:{ + if (m_bytes < m_fileSize){ + if (cmd != FT_DATA){ + m_socket->error_state("Bad data command"); + return; + } + unsigned short size = (unsigned short)(m_socket->readBuffer().size() - m_socket->readBuffer().readPos()); + m_bytes += size; + m_totalBytes += size; + m_transferBytes += size; + if (size){ + if (m_file == NULL){ + m_socket->error_state("Write without file"); + return; + } + if (m_file->write(m_socket->readBuffer().data(m_socket->readBuffer().readPos()), size) != size){ + m_socket->error_state("Error write file"); + return; + } + } + } + if (m_bytes >= m_fileSize){ + if (m_nFile + 1 >= m_nFiles){ + log(L_DEBUG, "File transfer OK"); + FileTransfer::m_state = FileTransfer::Done; + if (m_notify) + m_notify->process(); + m_socket->error_state(QString::null); + return; + } + m_state = InitReceive; + } + if (m_notify) + m_notify->process(); + if (cmd != FT_DATA) + initReceive(cmd); + break; + } + + default: + log(L_WARN, "Bad state in process packet %u", m_state); + } +} + +void ICQFileTransfer::initReceive(char cmd) +{ + if (cmd != FT_FILEINFO){ + m_socket->error_state("Bad command in init receive"); + return; + } + string stdStrFileName; + char isDir; + m_socket->readBuffer() >> isDir >> stdStrFileName; + QByteArray qcfilename(stdStrFileName.c_str()); + QString fName = getContacts()->toUnicode(m_client->getContact(m_data), qcfilename); + + string stdStrDir; + unsigned long n; + m_socket->readBuffer() >> stdStrDir; + QByteArray dir(stdStrDir.c_str()); + m_socket->readBuffer().unpack(n); + if (m_notify) + m_notify->transfer(false); + if (!dir.isEmpty()) + fName = getContacts()->toUnicode(m_client->getContact(m_data), dir) + '/' + fName; + if (isDir) + fName += '/'; + m_state = Wait; + FileTransfer::m_state = FileTransfer::Read; + if (m_notify) + m_notify->createFile(fName, n, true); +} + +bool ICQFileTransfer::error(const QString &err) +{ + return error_state(err, 0); +} + +bool ICQFileTransfer::accept(Socket *s, unsigned long) +{ + log(L_DEBUG, "Accept file transfer"); + if (m_state == WaitReverse){ + acceptReverse(s); + }else{ + m_socket->setSocket(s); + m_bIncoming = true; + DirectSocket::m_state = DirectSocket::WaitInit; + init(); + } + return true; +} + +void ICQFileTransfer::bind_ready(unsigned short port) +{ + m_localPort = port; + if (m_state == WaitReverse){ + m_client->snacICBM()->requestReverseConnection(m_client->screen(m_data), this); + return; + } + m_state = Listen; + static_cast(m_msg)->setPort(port); + m_client->snacICBM()->accept(m_msg, m_data); +} + +void ICQFileTransfer::login_timeout() +{ + if (ICQClient::hasCap(m_data, CAP_DIRECT)){ + DirectSocket::m_state = DirectSocket::WaitReverse; + m_state = WaitReverse; + bind(m_client->getMinPort(), m_client->getMaxPort(), m_client); + return; + } + DirectSocket::login_timeout(); +} + +bool ICQFileTransfer::error_state(const QString &err, unsigned code) +{ + if (DirectSocket::m_state == DirectSocket::ConnectFail){ + if (ICQClient::hasCap(m_data, CAP_DIRECT)){ + login_timeout(); + return false; + } + } + if (!DirectSocket::error_state(err, code)) + return false; + if (FileTransfer::m_state != FileTransfer::Done){ + m_state = None; + FileTransfer::m_state = FileTransfer::Error; + m_msg->setError(err); + } + m_msg->m_transfer = NULL; + m_msg->setFlags(m_msg->getFlags() & ~MESSAGE_TEMP); + EventMessageSent(m_msg).process(); + return true; +} + +void ICQFileTransfer::connect_ready() +{ + log(L_DEBUG, "ICQFileTransfer::connect_ready()"); + if (m_state == None){ + m_state = WaitLogin; + DirectSocket::connect_ready(); + return; + } + if (m_state == WaitReverse){ + m_bIncoming = false; + m_state = WaitReverseLogin; + DirectSocket::connect_ready(); + return; + } + if (m_state == WaitReverseLogin) + m_bIncoming = true; + m_file = 0; + FileTransfer::m_state = FileTransfer::Negotiation; + if (m_notify) + m_notify->process(); + if (m_bIncoming){ + m_state = WaitInit; + }else{ + m_state = InitSend; + startPacket(FT_SPEED); + m_socket->writeBuffer().pack((unsigned long)m_speed); + sendPacket(true); + sendInit(); + } +} + +void ICQFileTransfer::sendInit() +{ + startPacket(FT_INIT); + m_socket->writeBuffer().pack((unsigned long)0); + m_socket->writeBuffer().pack((unsigned long)m_nFiles); // nFiles + m_socket->writeBuffer().pack((unsigned long)m_totalSize); // Total size + m_socket->writeBuffer().pack((unsigned long)m_speed); // speed + m_socket->writeBuffer() << QString::number(m_client->data.owner.Uin.toULong()).data(); + sendPacket(); + if ((m_nFiles == 0) || (m_totalSize == 0)) + m_socket->error_state(I18N_NOOP("No files for transfer")); +} + +void ICQFileTransfer::startPacket(char cmd) +{ + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer() << (unsigned short)0; + m_socket->writeBuffer() << cmd; +} + +void ICQFileTransfer::sendPacket(bool dump) +{ + unsigned long start_pos = m_socket->writeBuffer().packetStartPos(); + unsigned size = m_socket->writeBuffer().size() - start_pos - 2; + unsigned char *p = (unsigned char*)(m_socket->writeBuffer().data(start_pos)); + p[0] = (unsigned char)(size & 0xFF); + p[1] = (unsigned char)((size >> 8) & 0xFF); + if (dump){ + ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); + QString name = "FileTranfer"; + if (m_data){ + name += '.'; + name += QString::number(m_data->Uin.toULong()); + } + EventLog::log_packet(m_socket->writeBuffer(), true, plugin->ICQDirectPacket, name); + } + m_socket->write(); +} + +void ICQFileTransfer::setSpeed(unsigned speed) +{ + FileTransfer::setSpeed(speed); + switch (m_state){ + case InitSend: + case InitReceive: + case Send: + case Receive: + case Wait: + startPacket(FT_SPEED); + m_socket->writeBuffer().pack((unsigned long)m_speed); + sendPacket(true); + break; + default: + break; + } +} + +void ICQFileTransfer::write_ready() +{ + if (m_state != Send){ + DirectSocket::write_ready(); + return; + } + if (m_transfer){ + m_transferBytes += m_transfer; + m_transfer = 0; + if (m_notify) + m_notify->process(); + } + if (m_bytes >= m_fileSize){ + m_state = None; + m_state = InitSend; + sendFileInfo(); + if (m_notify) + m_notify->process(); + return; + } + QDateTime now(QDateTime::currentDateTime()); + if (now != m_sendTime){ + m_sendTime = now; + m_sendSize = 0; + } + if (m_sendSize > (m_speed << 18)){ + m_socket->pause(1); + return; + } + unsigned long tail = m_fileSize - m_bytes; + if (tail > 2048) tail = 2048; + startPacket(FT_DATA); + char buf[2048]; + int readn = m_file->read(buf, tail); + if (readn <= 0){ + m_socket->error_state("Read file error"); + return; + } + m_transfer = readn; + m_bytes += readn; + m_totalBytes += readn; + m_sendSize += readn; + m_socket->writeBuffer().pack(buf, readn); + sendPacket(false); +} + +void ICQFileTransfer::sendFileInfo() +{ + if (!openFile()){ + if (FileTransfer::m_state == FileTransfer::Done) + m_socket->error_state(QString::null); + if (m_notify) + m_notify->transfer(false); + return; + } + if (m_notify) + m_notify->transfer(false); + startPacket(FT_FILEINFO); + m_socket->writeBuffer().pack((char)(isDirectory() ? 1 : 0)); + QString fn = filename(); + QString dir; + int n = fn.lastIndexOf('/'); + if (n >= 0){ + dir = fn.left(n); + dir = dir.replace('/', '\\'); + fn = fn.mid(n); + } + QByteArray s1 = getContacts()->fromUnicode(m_client->getContact(m_data), fn); + QByteArray s2=""; + if (!dir.isEmpty()) + s2 = getContacts()->fromUnicode(m_client->getContact(m_data), dir); + string ssc1 = s1.data(); + string ssc2 = s2.data(); +//#ifdef __OS2__ // to make it compileable under OS/2 (gcc 3.3.5) + m_socket->writeBuffer() << ssc1.c_str() << ssc2.c_str(); +//#else +// m_socket->writeBuffer() << QString(ssc1) << QString(ssc2); +//#endif + m_socket->writeBuffer().pack((unsigned long)m_fileSize); + m_socket->writeBuffer().pack((unsigned long)0); + m_socket->writeBuffer().pack((unsigned long)m_speed); + sendPacket(); + if (m_notify) + m_notify->process(); +} + +void ICQFileTransfer::setSocket(ICQClientSocket *socket) +{ + if (m_socket) + delete m_socket; + m_socket = socket; + m_socket->setNotify(this); + m_state = WaitInit; + processPacket(); + if ((m_msg->getFlags() & MESSAGE_RECEIVED) == 0){ + m_state = InitSend; + sendInit(); + } + m_socket->readBuffer().init(2); + m_socket->readBuffer().packetStart(); + m_bHeader = true; + DirectSocket::m_state = DirectSocket::Logged; +} + +void ICQFileTransfer::startReceive(unsigned pos) +{ + if (m_state != Wait){ + log(L_WARN, "Start receive in bad state"); + return; + } + startPacket(FT_START); + if (pos > m_fileSize) + pos = m_fileSize; + m_bytes = pos; + m_totalBytes += pos; + m_socket->writeBuffer().pack((unsigned long)pos); + m_socket->writeBuffer().pack((unsigned long)0); + m_socket->writeBuffer().pack((unsigned long)m_speed); + m_socket->writeBuffer().pack((unsigned long)(m_nFile + 1)); + sendPacket(); + m_state = Receive; + if (m_notify) + m_notify->transfer(true); +} + +/////////////////////////////////////////// +// + +AIMFileTransfer::AIMFileTransfer(FileMessage *msg, ICQUserData *data, ICQClient *client) + : FileTransfer(msg) +{ + m_msg = msg; + m_client = client; + m_data = data; + m_ip = 0; + m_proxy = false; + m_proxyActive = true; + m_packetLength = 1000; + m_socket = new ICQClientSocket(this); + client->m_filetransfers.push_back(this); + log(L_DEBUG, "AIMFileTransfer::AIMFileTransfer: %p", this); +} + +AIMFileTransfer::~AIMFileTransfer() +{ + if(m_client) + { + for(std::list::iterator it = m_client->m_filetransfers.begin(); it != m_client->m_filetransfers.end(); ++it) + { + if((*it) == this) // FIXME make comparison by cookie + { + m_client->m_filetransfers.erase(it); + break; + } + } + } + delete m_socket; + log(L_DEBUG, "AIMFileTransfer::~AIMFileTransfer"); +} + +void AIMFileTransfer::requestFT() +{ + log(L_DEBUG, "AIMFileTransfer::requestFT m_stage = %d", m_stage); + log(L_DEBUG, "Description: %s", qPrintable(m_msg->getDescription())); + log(L_DEBUG, "filename: %s", qPrintable(filename())); + ICQBuffer b; + bool bWide = false; + for(int i = 0; i < (int)(filename().length()); i++) + { + if (filename()[i].unicode() > 0x7F) + { + bWide = true; + break; + } + } + QString charset = bWide ? "utf-8" : "us-ascii"; + + unsigned short this_port = (unsigned short)(m_proxy ? m_cookie2 : m_port); + + b << (unsigned short)0; + b << m_cookie.id_l << m_cookie.id_h; + b.pack((char*)m_client->capabilities[CAP_AIM_SENDFILE], sizeof(capability)); + b.tlv(0x0A, (unsigned short)m_stage); + b.tlv(0x0F); + b.tlv(0x03, (unsigned long)htonl(get_ip(m_client->data.owner.RealIP))); + b.tlv(0x04, (unsigned long)htonl(get_ip(m_client->data.owner.IP))); + b.tlv(0x05, this_port); + + this_port = ~(htons(m_port)); + b.tlv(0x17, this_port); + + unsigned long this_ip = m_ip; + if(m_ip == 0) + this_ip = htonl(get_ip(m_client->data.owner.RealIP)); + + b.tlv(0x02, this_ip); + this_ip = ~this_ip; + b.tlv(0x16, this_ip); + + if(m_proxy) + { + b.tlv(0x10); + } + ICQBuffer buf; + if(m_stage == 1) + { + if(files() == 1) + { + buf << ((unsigned short)0x0001) << ((unsigned short)0x0001); + } + else + { + buf << ((unsigned short)0x0002) << ((unsigned short)files()); + } + buf << ((unsigned long)totalSize()); + + if(!m_proxy && (files() == 1)) + { + if(bWide) + { + QByteArray decodedfname = filename().toUtf8(); + buf.pack(decodedfname.data(), decodedfname.length() + 1); + } + else + { + // FIXME: this does not compile and is wrong ! + //buf.pack(filename(), filename().length() + 1); + // maybe this was meant? + buf.pack((const char*)filename().utf16(), filename().length() * 2 + 2); + } + } + else + { + buf.pack((unsigned char)0); + } + } + b.tlv(0x2711, buf); + if(m_stage == 1) + { + b.tlv(0x2712, charset.toAscii(), charset.length()); + } + m_client->snacICBM()->sendThroughServer(m_client->screen(m_data), 2, b, m_cookie, false, true); +} + +void AIMFileTransfer::accept() +{ +} + +unsigned short AIMFileTransfer::remotePort() +{ + return m_port; +} + +void AIMFileTransfer::processPacket() +{ + log(L_DEBUG, "AIMFileTransfer::processPacket"); +} + +void AIMFileTransfer::setICBMCookie(MessageId const& cookie) +{ + m_cookie = cookie; +} + +void AIMFileTransfer::setICBMCookie2(unsigned short cookie2) +{ + m_cookie2 = cookie2; +} + + + +bool AIMFileTransfer::readOFT(OftData* oft) +{ + log(L_DEBUG, "reading OFT"); + m_socket->readBuffer().unpack(oft->magic); + + if(oft->magic != OFT_magic) + { + log(L_DEBUG, "Invalid magic for OFT in stream %08x", (unsigned int)oft->magic); + return false; + } + + m_socket->readBuffer().unpack(oft->unknown); + m_socket->readBuffer().unpack(oft->type); + m_socket->readBuffer().unpack(oft->cookie, 8); + m_socket->readBuffer().unpack(oft->encrypt); + m_socket->readBuffer().unpack(oft->compress); + + m_socket->readBuffer().unpack(oft->total_files); + oft->total_files = ntohs(oft->total_files); + m_socket->readBuffer().unpack(oft->files_left); + oft->files_left = ntohs(oft->files_left); + m_socket->readBuffer().unpack(oft->total_parts); + oft->total_parts = ntohs(oft->total_parts); + m_socket->readBuffer().unpack(oft->parts_left); + oft->parts_left = ntohs(oft->parts_left); + m_socket->readBuffer().unpack(oft->total_size); + oft->total_size = ntohl(oft->total_size); + m_socket->readBuffer().unpack(oft->size); + oft->size = ntohl(oft->size); + + m_socket->readBuffer().unpack(oft->mod_time); + m_socket->readBuffer().unpack(oft->checksum); + m_socket->readBuffer().unpack(oft->rfrcsum); + m_socket->readBuffer().unpack(oft->rfsize); + m_socket->readBuffer().unpack(oft->cretime); + m_socket->readBuffer().unpack(oft->rfcsum); + m_socket->readBuffer().unpack(oft->nrecvd); + m_socket->readBuffer().unpack(oft->recvcsum); + m_socket->readBuffer().unpack(oft->idstring, 32); + m_socket->readBuffer().unpack(oft->flags); + m_socket->readBuffer().unpack(oft->lnameoffset); + m_socket->readBuffer().unpack(oft->lsizeoffset); + m_socket->readBuffer().unpack(oft->dummy, 69); + m_socket->readBuffer().unpack(oft->macfileinfo, 16); + m_socket->readBuffer().unpack(oft->nencode); + m_socket->readBuffer().unpack(oft->nlanguage); + + m_socket->readBuffer().unpack(oft->name, m_socket->readBuffer().size() - m_socket->readBuffer().readPos()); + + if(oft->nencode == 0x0200) // Hack + { + for(unsigned int i = 0; i < (unsigned)oft->name.size() ; i++) + { + unsigned char tmp = oft->name.data()[i + 1]; + oft->name.data()[i + 1] = oft->name.data()[i]; + oft->name.data()[i] = tmp; + } + } + oft->name.detach(); + return true; +} + +bool AIMFileTransfer::writeOFT(OftData* oft) +{ + log(L_DEBUG, "writing OFT"); + m_socket->writeBuffer().pack(oft->magic); + m_socket->writeBuffer().pack(oft->unknown); + m_socket->writeBuffer().pack(oft->type); + m_socket->writeBuffer().pack(oft->cookie, 8); + m_socket->writeBuffer().pack(oft->encrypt); + m_socket->writeBuffer().pack(oft->compress); + m_socket->writeBuffer().pack((unsigned short)htons(oft->total_files)); + m_socket->writeBuffer().pack((unsigned short)htons(oft->files_left)); + m_socket->writeBuffer().pack((unsigned short)htons(oft->total_parts)); + m_socket->writeBuffer().pack((unsigned short)htons(oft->parts_left)); + m_socket->writeBuffer().pack((unsigned long)htonl(oft->total_size)); + m_socket->writeBuffer().pack((unsigned long)htonl(oft->size)); + m_socket->writeBuffer().pack(oft->mod_time); + m_socket->writeBuffer().pack(oft->checksum); + m_socket->writeBuffer().pack(oft->rfrcsum); + m_socket->writeBuffer().pack(oft->rfsize); + m_socket->writeBuffer().pack(oft->cretime); + m_socket->writeBuffer().pack(oft->rfcsum); + m_socket->writeBuffer().pack(oft->nrecvd); + m_socket->writeBuffer().pack(oft->recvcsum); + m_socket->writeBuffer().pack(oft->idstring, 32); + m_socket->writeBuffer().pack(oft->flags); + m_socket->writeBuffer().pack(oft->lnameoffset); + m_socket->writeBuffer().pack(oft->lsizeoffset); + m_socket->writeBuffer().pack(oft->dummy, 69); + m_socket->writeBuffer().pack(oft->macfileinfo, 16); + m_socket->writeBuffer().pack(oft->nencode); + m_socket->writeBuffer().pack(oft->nlanguage); + m_socket->writeBuffer().pack(oft->name.data(), oft->name.size() - 1); + if(oft->name.size() - 1 <= 0x40) + { + for(unsigned int i = 0; i < 0x40 - (unsigned)oft->name.size() + 1; i++) + { + m_socket->writeBuffer().pack((unsigned char)0); + } + } + else + { + m_socket->writeBuffer().pack((unsigned char)0); + } + return true; +} + +unsigned long AIMFileTransfer::calculateChecksum() +{ + if(!m_file) + { + log(L_WARN, "No file for checksum calculation"); + return 0; + } + unsigned long checksum = 0xFFFF; + //bool high = true; + QByteArray chunk(1024, '\0'); + ulong bytesread = 0; + long streamposition = 0; + m_file->reset(); + do + { + bytesread = m_file->read(chunk.data(), chunk.size()); + checksum = checksumChunk(&chunk, (unsigned int)bytesread, checksum); + streamposition += bytesread; + + } + while (bytesread == (unsigned)chunk.size()); + + checksum = ((checksum & 0x0000ffff) + (checksum >> 16)); + checksum = ((checksum & 0x0000ffff) + (checksum >> 16)); + + log(L_WARN, "Calculating checksum: %s (%08x)", qPrintable(m_file->fileName()), (unsigned int)checksum); + return checksum; +} + +unsigned long AIMFileTransfer::checksumChunk(QByteArray* filechunk, unsigned int chunklength, unsigned int start) +{ + uint32_t checksum = start, prevchecksum; + bool high = false; + for (unsigned long i = 0; i < (unsigned long)filechunk->size() && i < (unsigned long)chunklength; i++) + { + prevchecksum = checksum; + + if(high) + { + checksum -= (((uint32_t)(filechunk->at(i)) & 0xff) << 8); + } + else + { + checksum -= ((uint32_t)(filechunk->at(i)) & 0xff); + } + high = !high; + + if(checksum > prevchecksum) + checksum--; + } + + return checksum; +} + +void AIMFileTransfer::connectThroughProxy(const QString& host, uint16_t port, uint16_t cookie2) +{ + log(L_DEBUG, "Proxy connection, host = %s, port = %d", host.toLatin1().data(), port); + m_proxy = true; + m_port = port; + m_cookie2 = cookie2; + + FileTransfer::m_state = FileTransfer::Connect; + if (m_notify) + m_notify->process(); + + m_socket->connect(host, port, NULL); + m_socket->writeBuffer().init(0); + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + m_socket->setRaw(true); + +} + +void AIMFileTransfer::negotiateWithProxy() +{ + if(m_proxyActive) // We initiated proxy transfer + { + unsigned char uin_length = m_client->getScreen().length(); + unsigned short packet_length = 0x26 + 1 + uin_length; + m_socket->writeBuffer() << packet_length; + m_socket->writeBuffer() << Chunk_status; + // Status chunk is made of 6 bytes, first 2 are actually status and other 4 are zeroes + m_socket->writeBuffer() << (unsigned short)0x0002 << (unsigned long) 0x00000000; // 0x0002 means FT request to send + // Then, UIN chunk goes. First byte is length. + m_socket->writeBuffer() << Chunk_uin << uin_length; + m_socket->writeBuffer().pack(m_client->getScreen().toAscii(), uin_length); + // Next chunk is cookie chunk + m_socket->writeBuffer() << m_cookie.id_l << m_cookie.id_h; + // And the last one is magic caps chunk + m_socket->writeBuffer() << Chunk_cap << (unsigned short)0x0010; + m_socket->writeBuffer().pack(m_client->capabilities[CAP_AIM_SENDFILE], 0x10); + //EventLog::log_packet(m_socket->writeBuffer(), true, ICQPlugin::icq_plugin->AIMDirectPacket); //commented out due to problems with netmon while transfer + m_socket->write(); + } + else // Remote host initiated proxy transfer + { + unsigned char uin_length = m_client->getScreen().length(); + unsigned short packet_length = 0x28 + 1 + uin_length; + m_socket->writeBuffer() << packet_length; + m_socket->writeBuffer() << Chunk_status; + // Status chunk is made of 6 bytes, first 2 are actually status and other 4 are zeroes + m_socket->writeBuffer() << (unsigned short)0x0004 << (unsigned long) 0x00000000; // 0x0004 means FT request to receive + // Then, UIN chunk goes. First byte is length. + m_socket->writeBuffer() << Chunk_uin << uin_length; + m_socket->writeBuffer().pack(m_client->getScreen().toAscii(), uin_length); + // Next chunk is cookie chunk + m_socket->writeBuffer() << (unsigned short)m_cookie2 << m_cookie.id_l << m_cookie.id_h; + // And the last one is magic caps chunk + m_socket->writeBuffer() << Chunk_cap << (unsigned short)0x0010; + m_socket->writeBuffer().pack(m_client->capabilities[CAP_AIM_SENDFILE], 0x10); + //EventLog::log_packet(m_socket->writeBuffer(), true, ICQPlugin::icq_plugin->AIMDirectPacket); //commented out due to problems with netmon while transfer + m_socket->write(); + } +} + +void AIMFileTransfer::resolve_ready(QHostAddress ip) +{ + m_ip = ip.toIPv4Address(); +} + +bool AIMFileTransfer::error_state(const QString &err, unsigned) +{ + m_msg->setError(err); + EventMessageSent(m_msg).process(); + return true; +} + + +void AIMFileTransfer::startReceive(unsigned) +{ + log(L_DEBUG, "AIMFileTransfer::startReceive"); +} + +void AIMFileTransfer::bind_ready(unsigned short port) +{ + log(L_DEBUG, "AIMFileTransfer::bind_ready(%d)", port); + for (list::iterator it = m_client->m_processMsg.begin(); it != m_client->m_processMsg.end(); ++it){ + if ((*it) == m_msg){ + m_client->m_processMsg.erase(it); + break; + } + } + m_port = port; +} + +bool AIMFileTransfer::error(const QString &err) +{ + error_state(err, 0); + return true; +} + +void AIMFileTransfer::connect(unsigned long ip, unsigned short port) +{ + log(L_DEBUG, "AIMFileTransfer::connect"); + + m_socket->connect(ip, port, NULL); + m_socket->writeBuffer().init(0); + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + m_socket->setRaw(true); +} + + +AIMIncomingFileTransfer::AIMIncomingFileTransfer(SIM::FileMessage *msg, ICQUserData *data, ICQClient *client) + : QObject(), + AIMFileTransfer(msg, data, client), + m_connectTimer(this) +{ + QObject::connect(&m_connectTimer, SIGNAL(timeout()), this, SLOT(connect_timeout())); + m_totalBytes = 0; +} + +AIMIncomingFileTransfer::~AIMIncomingFileTransfer() +{ + //m_client->deleteFileMessage(m_cookie); +} + +bool AIMIncomingFileTransfer::error_state(const QString &err, unsigned code) +{ + log(L_DEBUG, "AIMFileTransfer::error_state: %s, %d", qPrintable(err), code); + if(m_stage == 1) + { + // Well, this is hack, but, i think, it is not so ugly as it seems :) + connect_timeout(); + return false; + } + else if(m_stage == 2) + { + // It can occur, so skip this stage, and wait for proxy FT request from the other peer + return false; + } + return true; +} + +bool AIMIncomingFileTransfer::accept(SIM::Socket* /*s*/, unsigned long /*ip*/) +{ + // TODO + return false; +} + +void AIMIncomingFileTransfer::accept() +{ + log(L_DEBUG, "AIMIncomingFileTransfer::accept"); + m_state = Connecting; + m_connectTimer.setSingleShot( true ); + m_connectTimer.start( DIRECT_TIMEOUT * 1000 ); + FileTransfer::m_state = FileTransfer::Connect; + if(m_notify) + m_notify->process(); + + unsigned long ip = get_ip(m_data->RealIP); + if(!ip) + { + ip = get_ip(m_data->IP); + } + m_socket->connect(ip, m_port, NULL); +} + +void AIMIncomingFileTransfer::connect_timeout() +{ + if(m_state == Connecting) + { + log(L_DEBUG, "Connecting timeout, trying reverse connection"); + FileMessage* msg = static_cast(m_msg); + QString filename = msg->getDescription(); + m_stage++; + requestFT(); + m_state = ProxyConnection; + // TODO Here we should really open the socket and wait for incoming connection, + // but we'll cheat for now - skip this step and wait for request for proxy transfer + } +} + +void AIMIncomingFileTransfer::connect_ready() +{ + log(L_DEBUG, "AIMIncomingFileTransfer::connect_ready()"); + m_connectTimer.stop(); + m_socket->writeBuffer().init(0); + m_socket->readBuffer().init(0); + m_socket->writeBuffer().packetStart(); + m_socket->readBuffer().packetStart(); + + if(!m_proxy) + { + m_state = OFTNegotiation; + + ICQBuffer buf; + buf << 0x0002 << m_cookie.id_l << m_cookie.id_h; + buf.pack(m_client->capabilities[CAP_AIM_SENDFILE], 0x10); + m_client->snacICBM()->sendThroughServer(m_client->screen(m_data), 0x0002, buf, m_cookie, false, true); + + FileTransfer::m_state = FileTransfer::Negotiation; + if(m_notify) + m_notify->process(); + } + else + { + m_state = ProxyNegotiation; + negotiateWithProxy(); + } + m_socket->setRaw(true); +} +void AIMIncomingFileTransfer::packet_ready() +{ + ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->readBuffer(), false, plugin->AIMDirectPacket); + long size = (unsigned long)(m_socket->readBuffer().size() - m_socket->readBuffer().readPos()); + if(size <= 0) + { + log(L_DEBUG, "size <= 0"); + return; + } + switch(m_state) + { + case ProxyNegotiation: + { + unsigned short packet_length, chunk_id, status; + m_socket->readBuffer() >> packet_length; + m_socket->readBuffer() >> chunk_id; + log(L_DEBUG, "[Input]Proxy packet, length = %d, chunk_id = %04x",packet_length, chunk_id); + if(chunk_id == Chunk_status) + { + m_socket->readBuffer() >> status; + log(L_DEBUG, "status = %04x", status); + // TODO Handle errors + if(status == 0x0003) + { + m_socket->readBuffer().incReadPos(6); + m_socket->readBuffer() >> m_cookie2; + m_socket->readBuffer() >> m_ip; + FileMessage* msg = static_cast(m_msg); + QString filename = msg->getDescription(); + m_stage++; + requestFT(); + } + if(status == 0x0005) // Everything is allright + { + log(L_DEBUG, "Connection accepted"); + // Read the rest of a packet: + m_socket->readBuffer().incReadPos(packet_length - 4); + ICQBuffer buf; + buf << (unsigned short) 0x0002 << m_cookie.id_l << m_cookie.id_h; + buf.pack(m_client->capabilities[CAP_AIM_SENDFILE], 0x10); + + m_client->snacICBM()->sendThroughServer(m_client->screen(m_data), 0x0002, buf, m_cookie, false, true); + FileTransfer::m_state = FileTransfer::Negotiation; + if(m_notify) + m_notify->process(); + m_state = OFTNegotiation; + } + } + return; + } + break; + case OFTNegotiation: + if(readOFT(&m_oft)) + { + if(m_oft.type == OFT_fileInfo) + ackOFT(); + FileTransfer::m_state = FileTransfer::Read; + if(m_notify) + { + m_notify->transfer(true); + m_notify->process(); + } + m_state = Reading; + } + break; + + case Reading: + { + if(m_bytes < m_fileSize) + { + long recvd_size = (unsigned long)(m_socket->readBuffer().size() - m_socket->readBuffer().readPos()); + if(size < 0) + { + return; + } + receiveNextBlock(recvd_size); + } + if(m_bytes >= m_fileSize) + { + /// TODO Calculate and verify checksum + m_oft.type = OFT_success; + writeOFT(&m_oft); + //EventLog::log_packet(m_socket->writeBuffer(), true, ICQPlugin::icq_plugin->AIMDirectPacket); //commented out due to problems with netmon while transfer + m_socket->write(); + + if(m_totalBytes >= m_totalSize) + { + if(m_notify) + m_notify->transfer(false); + ICQBuffer buf; + buf << (unsigned short) 0x0002 << m_cookie.id_l << m_cookie.id_h; + buf.pack(m_client->capabilities[CAP_AIM_SENDFILE], 0x10); + if(m_file) + m_file->flush(); + + m_client->snacICBM()->sendThroughServer(m_client->screen(m_data), 0x0002, buf, m_cookie, false, true); + m_state = Done; + } + else + { + m_state = OFTNegotiation; + } + return; + } + } + break; + default: + break; + } +} +void AIMIncomingFileTransfer::startReceive(unsigned /*pos*/) +{ + m_oft.type = OFT_answer; + *((unsigned long*)&m_oft.cookie[0]) = htonl(m_cookie.id_l); + *((unsigned long*)&m_oft.cookie[4]) = htonl(m_cookie.id_h); + writeOFT(&m_oft); + //EventLog::log_packet(m_socket->writeBuffer(), true, ICQPlugin::icq_plugin->AIMDirectPacket); //commented out due to problems with netmon while transfer + m_socket->write(); + m_nFile = m_oft.total_files - m_oft.files_left + 1; + m_nFiles = m_oft.total_files; + m_fileSize = m_oft.size; + m_totalSize = m_oft.total_size; +} + +void AIMIncomingFileTransfer::ackOFT() +{ + log(L_DEBUG, "Sending file ack"); + if(m_notify) + { + m_notify->transfer(false); + if(m_oft.nencode == 0x0200) // this is ucs2 + { + m_notify->createFile(QString::fromUtf16((unsigned short*)m_oft.name.data()), m_fileSize, true); + } + else + { + m_notify->createFile(QString(m_oft.name), m_fileSize, true); + } + } +} + +void AIMIncomingFileTransfer::receiveNextBlock(long size) +{ + m_totalBytes += size; + m_bytes += size; + m_transferBytes += size; + if(size) + { + if(!m_file) + { + log(L_DEBUG, "Write without file"); + return; + } + long hret = m_file->write(m_socket->readBuffer().data(m_socket->readBuffer().readPos()), size); + if(hret != size) + { + log(L_DEBUG, "Error while writing to file: %d", (int)hret); + m_socket->error_state("Error write file"); + return; + } + } + if (m_notify) + m_notify->process(); + m_socket->readBuffer().incReadPos(size); +} + +void AIMIncomingFileTransfer::write_ready() +{ + log(L_DEBUG, "AIMIncomingFileTransfer::write_ready()"); + if(m_state == Done) + { + FileTransfer::m_state = FileTransfer::Done; + //m_client->deleteFileMessage(m_cookie); + if(m_notify) + m_notify->process(); + // I'm not sure who is responsible for connection closing in this case. + // If sender is icq6, it closes this socket itself. Pidgin, however, does not. + m_socket->close(); + } +} + +void AIMIncomingFileTransfer::connectThroughProxy(const QString& host, uint16_t port, uint16_t cookie2) +{ + m_state = ProxyConnection; + AIMFileTransfer::connectThroughProxy(host, port, cookie2); +} + +AIMFileTransfer::tTransferDirection AIMIncomingFileTransfer::getDirection() +{ + return tdInput; +} + + +AIMOutcomingFileTransfer::AIMOutcomingFileTransfer(SIM::FileMessage *msg, ICQUserData *data, ICQClient *client) : AIMFileTransfer(msg, data, client), m_connectTimer(this) +{ + QObject::connect(&m_connectTimer, SIGNAL(timeout()), this, SLOT(connect_timeout())); + openFile(); + m_totalBytes = 0; + EventMessageAcked(m_msg).process(); +} + +AIMOutcomingFileTransfer::~AIMOutcomingFileTransfer() +{ +} + +void AIMOutcomingFileTransfer::listen() +{ + log(L_DEBUG, "AIMFileTransfer::listen"); + m_state = Listen; + bind(m_client->getMinPort(), m_client->getMaxPort(), m_client); + FileTransfer::m_state = FileTransfer::Connect; + if(m_notify) + m_notify->process(); +} + +bool AIMOutcomingFileTransfer::accept(Socket *s, unsigned long) +{ + log(L_DEBUG, "Accept AIM file transfer"); + m_state = OFTNegotiation; + + m_socket->setSocket(s); + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + + FileTransfer::m_state = FileTransfer::Negotiation; + if (m_notify) + m_notify->process(); + + m_socket->setRaw(true); + initOFTSending(); + + return true; +} + +void AIMOutcomingFileTransfer::initOFTSending() +{ + int delta_length = filename().length() - 0x40; + if(delta_length < 0) + delta_length = 0; + + m_oft.magic = OFT_magic; + m_oft.unknown = htons(256 + delta_length); + m_oft.type = OFT_fileInfo; + + *((unsigned long*)&m_oft.cookie[0]) = htonl(m_cookie.id_l); + *((unsigned long*)&m_oft.cookie[4]) = htonl(m_cookie.id_h); + + m_oft.encrypt = 0; + m_oft.compress = 0; + m_oft.total_files = files(); + m_oft.files_left = files() - file(); + m_oft.total_parts = 1; //FIXME if needed + m_oft.parts_left = 1; + m_oft.total_size = totalSize(); + m_oft.size = fileSize(); + m_oft.mod_time = QDateTime::currentDateTime().toTime_t(); //FIXME + m_oft.checksum = calculateChecksum(); + m_oft.rfrcsum = 0x0000ffff; + m_oft.rfsize = 0x0; + m_oft.cretime = 0x0; + m_oft.rfcsum = 0x0000ffff; + m_oft.nrecvd = 0; + m_oft.recvcsum = 0x0000ffff; + memset(m_oft.idstring, 0, 32); + strncpy((char*)m_oft.idstring, "Cool FileXfer", 31); + m_oft.flags = 0x20; //FIXME magic + m_oft.lnameoffset = 0x1c; // ??? + m_oft.lsizeoffset = 0x11; + memset(m_oft.dummy, 0, 69); + memset(m_oft.macfileinfo, 0, 16); + //FileMessage* msg = static_cast(m_msg); //Fixme: msg is initialized, but not used. + +// QString filename = filename(); + bool bWide = false; + for(int i = 0; i < (int)(filename().length() + 1); i++) + { + if (filename()[i].unicode() > 0x7F) + { + bWide = true; + break; + } + } + + if(bWide) + { + m_oft.nencode = 0x0200; + m_oft.nlanguage = 0; + m_oft.name.resize((filename().length() + 1) * 2); + for(int i = 0; i < (int)(filename().length() + 1); i++) + { + *((unsigned short*)(&m_oft.name.data()[i * 2])) = htons(filename()[i].unicode()); + } + } + else + { + m_oft.nencode = 0x0; + m_oft.nlanguage = 0; + m_oft.name = QByteArray( filename().toUtf8().data(), filename().length() + 1 ); + } + writeOFT(&m_oft); + //EventLog::log_packet(m_socket->writeBuffer(), true, ICQPlugin::icq_plugin->AIMDirectPacket); //commented out due to problems with netmon while transfer + m_socket->write(); +} + +void AIMOutcomingFileTransfer::packet_ready() +{ + log(L_DEBUG, "AIMOutcomingFileTransfer::packet_ready %d", m_state); + //ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); //commented out due to problems with netmon while transfer + //EventLog::log_packet(m_socket->readBuffer(), false, plugin->AIMDirectPacket, m_client->screen(m_data)); //commented out due to problems with netmon while transfer + switch(m_state) + { + case ProxyNegotiation: + { + unsigned short packet_length, chunk_id, status; + m_socket->readBuffer() >> packet_length; + m_socket->readBuffer() >> chunk_id; + log(L_DEBUG, "[Output]Proxy packet, length = %d, chunk_id = %04x",packet_length, chunk_id); + if(chunk_id == Chunk_status) + { + m_socket->readBuffer() >> status; + log(L_DEBUG, "status = %04x", status); + // TODO Handle errors + if(status == 0x0003) + { + m_socket->readBuffer().incReadPos(6); + m_socket->readBuffer() >> m_cookie2; + m_socket->readBuffer() >> m_ip; + FileMessage* msg = static_cast(m_msg); + QString filename = msg->getDescription(); + m_stage++; + requestFT(); + } + if(status == 0x0005) // Everything is allright + { + log(L_DEBUG, "Connection accepted"); + // Read the rest of a packet: + if(!m_proxyActive) + { + ICQBuffer buf; + buf << (unsigned short) 0x0002 << m_cookie.id_l << m_cookie.id_h; + buf.pack(m_client->capabilities[CAP_AIM_SENDFILE], 0x10); + + m_client->snacICBM()->sendThroughServer(m_client->screen(m_data), 0x0002, buf, m_cookie, false, true); + } + m_socket->readBuffer().incReadPos(packet_length - 4); + FileTransfer::m_state = FileTransfer::Negotiation; + if(m_notify) + m_notify->process(); + m_state = OFTNegotiation; + + initOFTSending(); + } + } + return; + } + break; + case OFTNegotiation: + { + log(L_DEBUG, "Output, negotiation"); + if(!m_notify) + { + log(L_DEBUG, "m_notify == NULL!!! Achtung!! Alarm!!11"); + } + OftData this_oft; + readOFT(&this_oft); + if(this_oft.magic != OFT_magic) + { + log(L_WARN, "Invalid magic in OFT"); + // TODO cleanup + return; + } + if(this_oft.type == OFT_success) + { + log(L_DEBUG, "File transfer OK(3)"); + FileTransfer::m_state = FileTransfer::Done; + m_socket->close(); + if (m_notify) + m_notify->process(); + m_socket->error_state(QString::null); + return; + } + if(this_oft.type != OFT_answer) + { + log(L_WARN, "Error in OFT"); + // TODO cleanup + return; + } + m_file->reset(); + m_state = Writing; + // TODO Check other fields in this_oft + FileTransfer::m_state = FileTransfer::Write; + + if(m_notify) + { + m_notify->transfer(true); + m_notify->process(); + } + + log(L_DEBUG, "m_nFile = %d", file()); + sendNextBlock(); + } + break; + case Writing: + { + log(L_DEBUG, "Output, write"); + OftData this_oft; + readOFT(&this_oft); + if(this_oft.magic != OFT_magic) + { + log(L_WARN, "Invalid magic in OFT"); + // TODO cleanup + return; + } + if(this_oft.type == OFT_success) + { + log(L_DEBUG, "File transfer OK(4)"); + if(totalBytes() >= totalSize()) + { + FileTransfer::m_state = FileTransfer::Done; + m_socket->close(); + m_socket->error_state(QString::null); + EventSent(m_msg).process(); + if(m_notify) + { + m_notify->transfer(false); + m_notify->process(); + } + } + else + { + m_state = OFTNegotiation; + openFile(); + log(L_DEBUG, "m_nFile = %d", file()); + if(m_notify) + m_notify->process(); + initOFTSending(); + } + return; + } + } + break; + default: + break; + } + if (m_socket->readBuffer().readPos() <= m_socket->readBuffer().writePos()) + { + return; + } + //ICQPlugin *plugin = static_cast(m_client->protocol()->plugin()); //commented out due to problems with netmon while transfer + //EventLog::log_packet(m_socket->readBuffer(), false, plugin->AIMDirectPacket, m_client->screen(m_data)); //commented out due to problems with netmon while transfer + m_socket->readBuffer().init(0); +} + +bool AIMOutcomingFileTransfer::sendNextBlock() +{ + if(!m_file) + { + log(L_DEBUG, "Read without file"); + m_socket->error_state("Read without file"); + return false; + } + + char* buffer = new char[m_packetLength + 1]; // FIXME replace it with QByteArray + + int bytes_read = m_file->read(buffer, m_packetLength); + if(bytes_read < 0) + { + log(L_DEBUG, "Error while reading file"); + m_socket->error_state("Error while reading file"); + delete [] buffer; + return false; + } + if(bytes_read == 0) + { + delete [] buffer; + return true; + } + m_socket->writeBuffer().pack(buffer, bytes_read); + m_socket->write(); + m_totalBytes += bytes_read; + m_bytes += bytes_read; + m_transferBytes += bytes_read; + + if(m_notify) + m_notify->process(); + + delete [] buffer; + return true; +} + +void AIMOutcomingFileTransfer::connect_ready() +{ + log(L_DEBUG, "AIMOutcomingFileTransfer::connect_ready() %d %d", m_state, m_proxyActive); + if(m_state == ProxyConnection) + { + negotiateWithProxy(); + m_state = ProxyNegotiation; + } +} + +void AIMOutcomingFileTransfer::write_ready() +{ + if(FileTransfer::m_state != FileTransfer::Connect) + { + if(totalBytes() < totalSize()) + { + if(FileTransfer::m_state == FileTransfer::Write) + sendNextBlock(); + } + else + { + /// TODO Calculate and verify checksum + log(L_DEBUG, "File transfer OK(6)"); + } + } +} + +void AIMOutcomingFileTransfer::connect_timeout() +{ + if(m_state == ReverseConnection) + { + FileMessage* msg = static_cast(m_msg); + QString filename = msg->getDescription(); + } +} + +AIMFileTransfer::tTransferDirection AIMOutcomingFileTransfer::getDirection() +{ + return tdOutput; +} + +void AIMOutcomingFileTransfer::connectThroughProxy(const QString& host, uint16_t port, uint16_t cookie2) +{ + m_state = ProxyConnection; + AIMFileTransfer::connectThroughProxy(host, port, cookie2); +} + +void AIMOutcomingFileTransfer::connect(unsigned long ip, unsigned short port) +{ + log(L_DEBUG, "AIMOutcomingFileTransfer::connect"); + + if(m_stage == 2) + { + m_port = port; + FileTransfer::m_state = FileTransfer::Connect; + if (m_notify) + m_notify->process(); + + m_state = ProxyConnection; + connectThroughProxy(AOL_PROXY_HOST, AOL_PROXY_PORT, 0); + } + else + { + AIMFileTransfer::connect(ip, port); + } +} + diff --git a/plugins/icq/icqdirect.h b/plugins/icq/icqdirect.h new file mode 100644 index 0000000..e711fca --- /dev/null +++ b/plugins/icq/icqdirect.h @@ -0,0 +1,199 @@ + +#ifndef _ICQDIRECT_H_ +#define _ICQDIRECT_H_ + +#include +#include +#include + +#include "message.h" +#include "socket/socket.h" +#include "icqclient.h" +#include "icqicmb.h" + +#define AOL_PROXY_HOST "ars.oscar.aol.com" +#define AOL_PROXY_PORT 5190 + +struct ICQUserData; +class ICQClient; +struct OftData +{ + unsigned long magic; + unsigned short unknown; + unsigned short type; + char cookie[8]; + unsigned short encrypt; + unsigned short compress; + unsigned short total_files; + unsigned short files_left; + unsigned short total_parts; + unsigned short parts_left; + unsigned long total_size; + unsigned long size; + unsigned long mod_time; + unsigned long checksum; + unsigned long rfrcsum; + unsigned long rfsize; + unsigned long cretime; + unsigned long rfcsum; + unsigned long nrecvd; + unsigned long recvcsum; + char idstring[32]; + unsigned char flags; + unsigned char lnameoffset; + unsigned char lsizeoffset; + char dummy[69]; + char macfileinfo[16]; + unsigned short nencode; + unsigned short nlanguage; + QByteArray name; +}; + +class AIMFileTransfer : public SIM::FileTransfer, public SIM::ClientSocketNotify, public SIM::ServerSocketNotify +{ +public: + typedef enum + { + tdInput, + tdOutput + } tTransferDirection; + + AIMFileTransfer(SIM::FileMessage *msg, ICQUserData *data, ICQClient *client); + ~AIMFileTransfer(); + virtual void accept(); + void setPort(unsigned short port) {m_port = port;} + unsigned short remotePort(); + void setICBMCookie(MessageId const& cookie); + void setICBMCookie2(unsigned short cookie2); + MessageId& getICBMCookie() {return m_cookie; } + void setProxyActive(bool proxyActive) { m_proxyActive = proxyActive; } + virtual void connect(unsigned long ip, unsigned short port); + void setStage(int stage) { m_stage = stage; } + void forceProxyConnection() { m_proxy = true;} + void requestFT(); + + virtual void connectThroughProxy(const QString& host, uint16_t port, uint16_t cookie2); + virtual tTransferDirection getDirection() = 0; + + static const unsigned long OFT_magic = 0x3254464f; + static const int OFT_fileInfo = 0x0101; + static const int OFT_answer = 0x0202; + static const int OFT_success = 0x0402; + static const int OFT_continue = 0x0502; + + static const unsigned short Chunk_status = 0x044a; + static const unsigned short Chunk_uin = 0x0000; + static const unsigned short Chunk_cap = 0x0001; + +protected: + + virtual void processPacket(); + virtual bool error_state(const QString &err, unsigned code); + virtual void resolve_ready(QHostAddress ip); + virtual void startReceive(unsigned pos); + virtual void bind_ready(unsigned short port); + virtual bool error(const QString &err); + void negotiateWithProxy(); + + bool readOFT(OftData* oft); + bool writeOFT(OftData* oft); + unsigned long calculateChecksum(); + unsigned long checksumChunk(QByteArray* filechunk, unsigned int chunklength, unsigned int start); + + int m_stage; + bool m_proxy; + bool m_proxyActive; + MessageId m_cookie; + uint16_t m_cookie2; + OftData m_oft; + unsigned long m_packetLength; + bool bcontinue; + ICQUserData *m_data; + ICQClient *m_client; + ICQClientSocket *m_socket; + unsigned short m_port; + unsigned long m_ip; + + friend class ICQClient; +}; + +class AIMIncomingFileTransfer : public QObject, public AIMFileTransfer +{ + Q_OBJECT +public: + AIMIncomingFileTransfer(SIM::FileMessage *msg, ICQUserData *data, ICQClient *client); + virtual ~AIMIncomingFileTransfer(); + virtual void accept(); + virtual void connect_ready(); + virtual void packet_ready(); + virtual void write_ready(); + virtual bool accept(SIM::Socket *s, unsigned long ip); + + void receiveNextBlock(long size); + void ackOFT(); + virtual void connectThroughProxy(const QString& host, uint16_t port, uint16_t cookie2); + virtual tTransferDirection getDirection(); + +protected slots: + virtual void connect_timeout(); +protected: + virtual void startReceive(unsigned pos); + virtual bool error_state(const QString &err, unsigned code); + enum State + { + None, + Connecting, + ReverseConnection, + ProxyConnection, + ProxyNegotiation, + OFTNegotiation, + Reading, + Done + }; + State m_state; + QTimer m_connectTimer; +}; + +class AIMOutcomingFileTransfer : public QObject, public AIMFileTransfer +{ + Q_OBJECT +public: + AIMOutcomingFileTransfer(SIM::FileMessage *msg, ICQUserData *data, ICQClient *client); + virtual ~AIMOutcomingFileTransfer(); + + void listen(); + virtual void connect(unsigned long ip, unsigned short port); + //void connect(unsigned short port); + virtual tTransferDirection getDirection(); + virtual void connectThroughProxy(const QString& host, uint16_t port, uint16_t cookie2); +protected slots: + virtual void connect_timeout(); +protected: + enum State + { + None, + Listen, + ReverseConnection, + ProxyConnection, + ProxyNegotiation, + OFTNegotiation, + Writing, + Done + }; + virtual bool accept(SIM::Socket *s, unsigned long ip); + virtual void write_ready(); + virtual void packet_ready(); + virtual void connect_ready(); + + //void read_ready(); + bool sendNextBlock(); + + void initOFTSending(); + + State m_state; + QTimer m_connectTimer; +}; + + +#endif + diff --git a/plugins/icq/icqicmb.cpp b/plugins/icq/icqicmb.cpp new file mode 100644 index 0000000..806cf28 --- /dev/null +++ b/plugins/icq/icqicmb.cpp @@ -0,0 +1,2575 @@ +/*************************************************************************** + icqicmb.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#ifdef WIN32 +#include +#else +#include +#include +#include +#include +#include +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "contacts.h" +#include "html.h" +#include "unquot.h" +#include "log.h" +#include "core_events.h" +#include "misc.h" + +#include "icqclient.h" +#include "icqmessage.h" +#include "icqdirect.h" +#include "icq.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +using namespace std; +using namespace SIM; + +const unsigned MAX_TYPE2_SIZE = 0x1800; +const unsigned SEND_TIMEOUT = 50000; + +bool operator < (const alias_group &s1, const alias_group &s2) +{ + return s1.grp < s2.grp; +} + +const unsigned short ICQ_SNACxMSG_ERROR = 0x0001; +const unsigned short ICQ_SNACxMSG_SETxICQxMODE = 0x0002; +const unsigned short ICQ_SNACxMSG_RESETxICQxMODE = 0x0003; // not implemented +const unsigned short ICQ_SNACxMSG_REQUESTxRIGHTS = 0x0004; +const unsigned short ICQ_SNACxMSG_RIGHTSxGRANTED = 0x0005; +const unsigned short ICQ_SNACxMSG_SENDxSERVER = 0x0006; +const unsigned short ICQ_SNACxMSG_SERVERxMESSAGE = 0x0007; +const unsigned short ICQ_SNACxMSG_BLAMExUSER = 0x0008; +const unsigned short ICQ_SNACxMSG_BLAMExSRVxACK = 0x0009; +const unsigned short ICQ_SNACxMSG_SRV_MISSED_MSG = 0x000A; +const unsigned short ICQ_SNACxMSG_AUTOREPLY = 0x000B; +const unsigned short ICQ_SNACxMSG_ACK = 0x000C; +const unsigned short ICQ_SNACxMSG_MTN = 0x0014; + +static void copyTlv(ICQBuffer &b, TlvList *tlvs, unsigned nTlv) +{ + if (tlvs == NULL) + return; + Tlv *tlv = (*tlvs)(nTlv); + if (tlv == NULL) + return; + b.tlv(nTlv, *tlv, tlv->Size()); +} + +static char c2h(char c) +{ + c = (char)(c & 0xF); + if (c < 10) + return (char)('0' + c); + return (char)('A' + c - 10); +} + +static void b2h(char *&p, char c) +{ + *(p++) = c2h((char)(c >> 4)); + *(p++) = c2h(c); +} + +void packCap(ICQBuffer &b, const capability &c) +{ + char pack_cap[0x27]; + char *p = pack_cap; + *(p++) = '{'; + b2h(p, c[0]); b2h(p, c[1]); b2h(p, c[2]); b2h(p, c[3]); + *(p++) = '-'; + b2h(p, c[4]); b2h(p, c[5]); + *(p++) = '-'; + b2h(p, c[6]); b2h(p, c[7]); + *(p++) = '-'; + b2h(p, c[8]); b2h(p, c[9]); + *(p++) = '-'; + b2h(p, c[10]); b2h(p, c[11]); + b2h(p, c[12]); b2h(p, c[13]); b2h(p, c[14]); b2h(p, c[15]); + *(p++) = '}'; + *p = 0; + b << pack_cap; +} + +SnacIcqICBM::SnacIcqICBM(ICQClient* client) : QObject(NULL), SnacHandler(client, 0x0004) +{ + m_sendTimer = new QTimer(this); + connect(m_sendTimer, SIGNAL(timeout()), this, SLOT(sendTimeout())); +} + +SnacIcqICBM::~SnacIcqICBM() +{ +} + +void SnacIcqICBM::rightsRequest() +{ + client()->snac(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_REQUESTxRIGHTS); + client()->sendPacket(true); +} + +void SnacIcqICBM::sendICMB(unsigned short channel, unsigned long flags) +{ + client()->snac(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_SETxICQxMODE); + client()->socket()->writeBuffer() + << channel << flags + << (unsigned short)0x1f40 + << (unsigned short)0x30e7 + << (unsigned short)0x30e7 + << (unsigned short)0x0000 + << (unsigned short)0x0000; + client()->sendPacket(true); +} + +void SnacIcqICBM::sendThroughServer(const QString &screen, unsigned short channel, ICQBuffer &b, const MessageId &id, bool bOffline, bool bReqAck) +{ + // we need informations about channel 2 tlvs ! + unsigned short tlv_type = 5; + client()->snac(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_SENDxSERVER, true, true); + socket()->writeBuffer() << id.id_l << id.id_h; + socket()->writeBuffer() << channel; + socket()->writeBuffer().packScreen(screen); + if (channel == 1) + tlv_type = 2; + if (b.size()) + socket()->writeBuffer().tlv(tlv_type, b); + if (bReqAck) + socket()->writeBuffer().tlv(3); // req. ack from server + if (bOffline) + socket()->writeBuffer().tlv(6); // store if user is offline + client()->sendPacket(true); +} + +bool SnacIcqICBM::ackMessage(Message *msg, unsigned short ackFlags, const QByteArray &msg_str) +{ + switch (ackFlags){ + case ICQ_TCPxACK_OCCUPIED: + case ICQ_TCPxACK_DND: + case ICQ_TCPxACK_REFUSE: + if (msg_str.isEmpty()) + msg->setError(I18N_NOOP("Message declined")); + else + msg->setError(msg_str); + switch (ackFlags){ + case ICQ_TCPxACK_OCCUPIED: + msg->setRetryCode(static_cast(client()->protocol()->plugin())->RetrySendOccupied); + break; + case ICQ_TCPxACK_DND: + msg->setRetryCode(static_cast(client()->protocol()->plugin())->RetrySendDND); + break; + } + return false; + } + return true; +} + +void SnacIcqICBM::sendType1(const QString &text, bool bWide, ICQUserData *data) +{ + ICQBuffer msgBuf; + const ENCODING *encoding = getContacts()->getEncoding(client()->getContact(data)); + unsigned short usLang = 0; + if( ( NULL == encoding ) || !strcmp( encoding->codec, "UTF-8" ) ) { + bWide = true; + } + else { + usLang = encoding->cp_code; + } + + if (bWide) + { + QTextCodec *codec = QTextCodec::codecForName("UTF-16BE"); + Q_ASSERT(codec); + msgBuf << (unsigned short)0x0002L; + msgBuf << (unsigned short)0x0000L; + QByteArray ba = codec->fromUnicode( text ); + msgBuf.pack(ba, ba.size() ); + } + else + { + log(L_DEBUG, "%s", qPrintable(client()->getContact(data)->getEncoding())); + QByteArray msg_text = getContacts()->fromUnicode(client()->getContact(data), text); + EventSend e(m_send.msg, msg_text); + e.process(); + msg_text = e.localeText(); + msgBuf << (unsigned short)0x0000L; + msgBuf << (unsigned short)usLang; + msgBuf << msg_text.data(); + } + ICQBuffer b; + b.tlv(0x0501, "\x01", 1); + b.tlv(0x0101, msgBuf); + sendThroughServer(m_send.screen, 1, b, m_send.id, true, true); + if ((data->Status.toULong() != ICQ_STATUS_OFFLINE) || (client()->getAckMode() == 0)) + ackMessage(m_send); +} + +void SnacIcqICBM::sendType2(const QString &screen, ICQBuffer &msgBuf, const MessageId &id, unsigned cap, bool bOffline, unsigned short port, TlvList *tlvs, unsigned short type) +{ + ICQBuffer b; + b << (unsigned short)0; + b << id.id_l << id.id_h; + b.pack((char*)client()->capabilities[cap], sizeof(capability)); + b.tlv(0x0A, (unsigned short)type); + if(type != 4) + b.tlv(0x0F); + copyTlv(b, tlvs, 0x14); + if(port) + { + if(type != 4) + { + b.tlv(0x03, (unsigned long)htonl(get_ip(client()->data.owner.RealIP))); + if(type != 3) + { + b.tlv(0x04, (unsigned long)htonl(get_ip(client()->data.owner.IP))); + } + } + b.tlv(0x05, port); + log(L_DEBUG, "RealIP = %08x, IP = %08x, port = %04x", (unsigned int)(get_ip(client()->data.owner.RealIP)), (unsigned int)(get_ip(client()->data.owner.IP)), port); + } + copyTlv(b, tlvs, 0x17); + copyTlv(b, tlvs, 0x0E); + copyTlv(b, tlvs, 0x0D); + copyTlv(b, tlvs, 0x0C); + copyTlv(b, tlvs, 0x10); + copyTlv(b, tlvs, 0x02); + copyTlv(b, tlvs, 0x16); + if(type != 4) + b.tlv(0x2711, msgBuf); + copyTlv(b, tlvs, 0x2712); + copyTlv(b, tlvs, 0x03); + sendThroughServer(screen, 2, b, id, bOffline, true); +} + +ICQClientSocket* SnacIcqICBM::socket() +{ + return client()->socket(); +} + +void SnacIcqICBM::sendAdvMessage(const QString &screen, ICQBuffer &msgText, unsigned plugin_index, const MessageId &id, bool bOffline, bool bDirect, unsigned short cookie1, unsigned short cookie2, unsigned short type) +{ + if (cookie1 == 0) + { + client()->m_advCounter--; + cookie1 = client()->m_advCounter; + cookie2 = (plugin_index == PLUGIN_NULL) ? 0x0E : 0x12; + } + ICQBuffer msgBuf; + msgBuf.pack((unsigned short)0x1B); + msgBuf.pack((unsigned short)0x08); + msgBuf.pack((char*)client()->plugins[plugin_index], sizeof(plugin)); + msgBuf.pack(0x00000003L); + msgBuf.pack((char)(type ? 4 : 0)); + msgBuf.pack(cookie1); + msgBuf.pack(cookie2); + msgBuf.pack(cookie1); + msgBuf.pack(0x00000000L); + msgBuf.pack(0x00000000L); + msgBuf.pack(0x00000000L); + msgBuf.pack(msgText.data(0), msgText.size()); + sendType2(screen, msgBuf, id, CAP_SRV_RELAY, bOffline, bDirect ? client()->data.owner.Port.toULong() : 0, NULL, type); +} + +void SnacIcqICBM::ackMessage(SendMsg &s) +{ + if (s.flags == PLUGIN_AIM_FT){ + s.msg->setError(I18N_NOOP("File transfer declined")); + EventMessageSent(s.msg).process(); + delete s.msg; + s.msg = NULL; + s.screen = QString::null; + m_sendTimer->stop(); + processSendQueue(); + return; + } + if ((s.msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + if ((s.flags & SEND_MASK) == SEND_RAW){ + s.msg->setClient(client()->dataName(m_send.screen)); + EventSent(s.msg).process(); + }else if (!s.part.isEmpty()){ + Message m(MessageGeneric); + m.setContact(s.msg->contact()); + m.setBackground(s.msg->getBackground()); + m.setForeground(s.msg->getForeground()); + unsigned flags = s.msg->getFlags() & (~MESSAGE_RICHTEXT); + if ((s.flags & SEND_MASK) == SEND_RTF){ + flags |= MESSAGE_RICHTEXT; + m.setText(client()->removeImages(s.part, true)); + }else if ((s.flags & SEND_MASK) == SEND_HTML){ + flags |= MESSAGE_RICHTEXT; + m.setText(client()->removeImages(s.part, false)); + }else{ + m.setText(s.part); + } + m.setFlags(flags); + m.setClient(client()->dataName(s.screen)); + EventSent(&m).process(); + } + } + if ((s.text.length() == 0) || (s.msg->type() == MessageWarning)){ + EventMessageSent(s.msg).process(); + delete s.msg; + s.msg = NULL; + s.screen = QString::null; + } + else + { + sendFgQueue.push_front(s); + } + m_sendTimer->stop(); + processSendQueue(); +} + +bool SnacIcqICBM::sendThruServer(Message *msg, void *_data) +{ + ICQUserData *data = client()->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + Contact *contact = getContacts()->contact(msg->contact()); + if ((contact == NULL) || (data == NULL)) + return false; + SendMsg s; + switch (msg->type()){ + case MessageGeneric: + if ((data->Status.toULong() != ICQ_STATUS_OFFLINE) && (client()->getSendFormat() == 0) && + client()->hasCap(data, CAP_RTF) && (msg->getFlags() & MESSAGE_RICHTEXT) && + !data->bBadClient.toBool()){ + s.flags = SEND_RTF; + s.msg = msg; + s.text = msg->getRichText(); + s.screen = client()->screen(data); + sendFgQueue.push_back(s); + processSendQueue(); + return true; + } + if ((data->Status.toULong() != ICQ_STATUS_OFFLINE) && + (client()->getSendFormat() <= 1) && + client()->hasCap(data, CAP_UTF) && + ((msg->getFlags() & MESSAGE_SECURE) == 0) && + (data->Version.toULong() >= 8) && !data->bBadClient.toBool()){ + s.flags = SEND_UTF; + s.msg = msg; + s.text = client()->addCRLF(msg->getPlainText()); + s.screen = client()->screen(data); + sendFgQueue.push_back(s); + processSendQueue(); + return true; + } + if ((data->Status.toULong() != ICQ_STATUS_OFFLINE) && + (data->Version.toULong() >= 8) && + !data->bBadClient.toBool() && + ((unsigned)msg->getPlainText().length() >= MAX_PLAIN_MESSAGE_SIZE)){ + s.flags = SEND_TYPE2; + s.msg = msg; + s.text = msg->getPlainText(); + s.screen = client()->screen(data); + sendFgQueue.push_back(s); + processSendQueue(); + return true; + } + if ((data->Uin.toULong() == 0) || client()->m_bAIM){ + s.msg = msg; + if (msg->getFlags() & MESSAGE_RICHTEXT){ + s.flags = SEND_HTML; + s.text = client()->removeImages(msg->getRichText(), false); + }else{ + s.flags = SEND_HTML_PLAIN; + s.text = msg->getPlainText(); + } + s.screen = client()->screen(data); + sendFgQueue.push_back(s); + processSendQueue(); + return true; + } + s.flags = SEND_PLAIN; + s.msg = msg; + s.text = client()->addCRLF(msg->getPlainText()); + s.screen = client()->screen(data); + sendFgQueue.push_back(s); + processSendQueue(); + return true; + case MessageUrl: + if ((data->Uin.toULong() == 0) || client()->m_bAIM){ + UrlMessage *m = static_cast(msg); + QString text = "getUrl(); + text += "\">"; + text += m->getUrl(); + text += "
    "; + text += client()->removeImages(msg->getRichText(), false); + s.flags = SEND_HTML; + s.msg = msg; + s.text = text; + s.screen = client()->screen(data); + sendFgQueue.push_back(s); + processSendQueue(); + return true; + } + case MessageContacts: + case MessageFile: + case MessageWarning: + s.flags = SEND_RAW; + s.msg = msg; + s.screen = client()->screen(data); + sendFgQueue.push_back(s); + processSendQueue(); + return true; + } + return false; +} + +void SnacIcqICBM::clearMsgQueue() +{ + list::iterator it; + for (it = sendFgQueue.begin(); it != sendFgQueue.end(); ++it){ + if (it->socket){ + // dunno know if this is ok - vladimir please take a look + it->socket->acceptReverse(NULL); + continue; + } + if (it->msg) + { + it->msg->setError(I18N_NOOP("Client go offline")); + EventMessageSent(it->msg).process(); + if (it->msg == m_send.msg) + m_send.msg = NULL; + delete it->msg; + } + } + sendFgQueue.clear(); + for (it = sendBgQueue.begin(); it != sendBgQueue.end(); ++it){ + if (it->socket){ + // dunno know if this is ok - vladimir please take a look + it->socket->acceptReverse(NULL); + continue; + } + if(it->msg) + { + it->msg->setError(I18N_NOOP("Client go offline")); + EventMessageSent(it->msg).process(); + if (it->msg == m_send.msg) + m_send.msg = NULL; + delete it->msg; + } + } + sendBgQueue.clear(); + if (m_send.msg) + { + m_send.msg->setError(I18N_NOOP("Client go offline")); + EventMessageSent(m_send.msg).process(); + delete m_send.msg; + } + m_send.msg = NULL; + m_send.screen = QString::null; +} + +void SnacIcqICBM::sendFile(TlvList& tlv, unsigned long primary_ip, unsigned long secondary_ip, unsigned short port,const QString &screen, MessageId const& id) +{ + log(L_DEBUG, "ICQClient::icbmSendFile()"); + Tlv *desc = tlv(0x0A); + Tlv *info = tlv(0x2711); + QString d; + unsigned short type; + unsigned short nFiles; + unsigned long size; + bool is_proxy = tlv(0x10); + log(L_DEBUG, "Desc = %d", (uint16_t)(*desc)); + + // First, let's find our filetransfer + AIMFileTransfer* ft = NULL; + for(list::iterator it = client()->m_filetransfers.begin(); it != client()->m_filetransfers.end(); ++it) + { + if((*it)->getICBMCookie() == id) + { + ft = (*it); + break; + } + } + if(ft == NULL) + { + log(L_DEBUG, "ft == NULL"); + // Incoming file + if(info == NULL) + { + // This is baaad + log(L_WARN, "No info tlv in send file"); + return; + } + ICQBuffer b(*info); + b >> type >> nFiles >> size; + QString name = client()->convert(b.data(8), b.size() - 8, tlv, 0x2712); + AIMFileMessage *msg = new AIMFileMessage; + msg->setPort(port); + msg->setBackground(client()->clearTags(d)); + //msg->setText(d); + msg->setSize(size); + msg->setID_L(id.id_l); + msg->setID_H(id.id_h); + if(is_proxy) + { + msg->isProxy = true; + } + if(tlv(5)) + { + msg->cookie2 = *tlv(5); + } + if(type == 2) + { + d = i18n("Directory"); + d += ' '; + d += name; + d += " ("; + d += i18n("%n file", "%n files", nFiles); + d += ')'; + } + else + { + if (nFiles == 1) + { + d = name; + } + else + { + d = i18n("%n file", "%n files", nFiles); + } + } + msg->setDescription(d); + msg->setFlags(MESSAGE_RECEIVED | MESSAGE_RICHTEXT | MESSAGE_TEMP); + client()->m_processMsg.push_back(msg); + client()->messageReceived(msg, screen); + return; + } + AIMFileMessage* afm = NULL; + for(list::iterator it = client()->m_processMsg.begin(); it != client()->m_processMsg.end(); ++it) + { + if ((*it)->type() == MessageFile) + { + afm = static_cast((*it)); + MessageId this_id; + this_id.id_l = afm->getID_L(); + this_id.id_h = afm->getID_H(); + if(this_id == id) + { + afm->setPort(port); + } + } + } + + unsigned short ft_type = *desc; + ft->setStage(ft_type); + log(L_DEBUG, "stage = %d", ft_type); + if(is_proxy) // Connection through proxy + { + log(L_DEBUG, "Proxy request"); + for(list::iterator it = client()->m_filetransfers.begin(); it != client()->m_filetransfers.end(); ++it) + { + if((*it)->getICBMCookie() == id) + { + Contact *contact; + ICQUserData *data = client()->findContact(screen, NULL, false, contact); + if(data) + { + if(primary_ip) + set_ip(&data->RealIP, primary_ip); + AIMFileTransfer *ft = (*it); //Fixme:Local declaration of 'ft' hides declaration from line: 857 + + ft->setProxyActive(false); + unsigned short cookie2 = 0; + if(tlv(5)) + { + cookie2 = *tlv(5); + }; + if(primary_ip) + ft->connectThroughProxy(QHostAddress(primary_ip).toString(), AOL_PROXY_PORT, cookie2); + else + { + ft->setProxyActive(true); + ft->connectThroughProxy(AOL_PROXY_HOST, AOL_PROXY_PORT, cookie2); + } + + return; + } + } + } + } + else + { + log(L_DEBUG, "No Proxy request: %d", ft_type); + if(ft_type == 3) + { + ft->setProxyActive(true); + ft->connectThroughProxy(AOL_PROXY_HOST, AOL_PROXY_PORT, 0); + } + if(ft_type == 2) + { + for(list::iterator it = client()->m_filetransfers.begin(); it != m_client->m_filetransfers.end(); ++it) + { + AIMFileTransfer *ft = (*it); //Fixme:Local declaration of 'ft' hides declaration from line: 857 + if(ft->getICBMCookie() == id) + { + if(primary_ip) + ft->connect(primary_ip, port); + else + ft->connect(secondary_ip, port); + } + } + } + return; + } + if(info == NULL && afm) + { + afm->setPort(port); + return; + } +} + +void SnacIcqICBM::sendAutoReply(const QString &screen, MessageId id, + const plugin p, unsigned short cookie1, unsigned short cookie2, + unsigned short msgType, char msgFlags, unsigned short msgState, + const QString &response, unsigned short response_type, ICQBuffer ©) +{ + client()->snac(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_AUTOREPLY); + socket()->writeBuffer() << id.id_l << id.id_h << 0x0002; + socket()->writeBuffer().packScreen(screen); + socket()->writeBuffer() << 0x0003 << 0x1B00 << 0x0800; + socket()->writeBuffer().pack((char*)p, sizeof(plugin)); + socket()->writeBuffer() << 0x03000000L << (char)0; + socket()->writeBuffer().pack(cookie1); + socket()->writeBuffer().pack(cookie2); + socket()->writeBuffer().pack(cookie1); + socket()->writeBuffer() << 0x00000000L << 0x00000000L << 0x00000000L; + socket()->writeBuffer().pack(msgType); + socket()->writeBuffer() << msgFlags << msgState << (char)0; + if (!response.isEmpty()){ + Contact *contact = NULL; + client()->findContact(screen, NULL, false, contact); + QByteArray r = getContacts()->fromUnicode(contact, response); + unsigned short size = (unsigned short)(r.length() + 1); + socket()->writeBuffer().pack(size); + socket()->writeBuffer().pack(r.data(), size); + }else{ + socket()->writeBuffer() << (char)0x01 << response_type; + } + if (response_type != 3){ + if (copy.size()){ + socket()->writeBuffer().pack(copy.data(0), copy.writePos()); + }else{ + socket()->writeBuffer() << 0x00000000L << 0xFFFFFF00L; + } + } + client()->sendPacket(false); +} + +void SnacIcqICBM::sendMTN(const QString &screen, unsigned short type) +{ + if (client()->getDisableTypingNotification()) + return; + client()->snac(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_MTN); + socket()->writeBuffer() << 0x00000000L << 0x00000000L << (unsigned short)0x0001; + socket()->writeBuffer().packScreen(screen); + socket()->writeBuffer() << type; + client()->sendPacket(true); +} + +void SnacIcqICBM::sendTimeout() +{ + m_sendTimer->stop(); + if (m_send.screen.length()){ + log(L_WARN, "Send timeout"); + if (m_send.msg){ + m_send.msg->setError(I18N_NOOP("Send timeout")); + EventMessageSent(m_send.msg).process(); + delete m_send.msg; + } + m_send.msg = NULL; + m_send.screen = QString::null; + } + processSendQueue(); +} + +void SnacIcqICBM::accept(Message *msg, ICQUserData *data) +{ + MessageId id; + if (msg->getFlags() & MESSAGE_DIRECT){ + Contact *contact = getContacts()->contact(msg->contact()); + ICQUserData *data = NULL; //Fixme: Local declaration of 'data' hides declaration of the same name in outer scope, see previous declaration at line '2163' + if (contact){ + ClientDataIterator it(contact->clientData, client()); + while ((data = (client()->toICQUserData(++it))) != NULL){ + if (!msg->client().isEmpty() && (client()->dataName(data) == msg->client())) + break; + data = NULL; + } + } + if (data == NULL){ + log(L_WARN, "Data for request not found"); + return; + } + DirectClient *dc = dynamic_cast(data->Direct.object()); + if (dc == NULL){ + log(L_WARN, "No direct connection"); + return; + } + dc->acceptMessage(msg); + }else{ + id.id_l = static_cast(msg)->getID_L(); + id.id_h = static_cast(msg)->getID_H(); + ICQBuffer b; + unsigned short type = ICQ_MSGxEXT; + client()->packMessage(b, msg, data, type, false, 0); + unsigned cookie = static_cast(msg)->getCookie(); + sendAdvMessage(client()->screen(data), b, PLUGIN_NULL, id, false, true, (unsigned short)(cookie & 0xFFFF), (unsigned short)((cookie >> 16) & 0xFFFF), 2); + } +} + +void SnacIcqICBM::accept(Message *msg, const QString &dir, OverwriteMode overwrite) +{ + ICQUserData *data = NULL; + bool bDelete = true; + if (!msg->client().isEmpty()){ + Contact *contact = getContacts()->contact(msg->contact()); + if (contact){ + ClientDataIterator it(contact->clientData, client()); + while ((data = (client()->toICQUserData(++it))) != NULL){ + if (client()->dataName(data) == msg->client()) + break; + data = NULL; + } + } + } + if (data){ + switch (msg->type()){ + case MessageICQFile:{ + ICQFileTransfer *ft = new ICQFileTransfer(static_cast(msg), data, client()); + ft->setDir(dir); + ft->setOverwrite(overwrite); + EventMessageAcked(msg).process(); + client()->m_processMsg.push_back(msg); + bDelete = false; + ft->listen(); + break; + } + case MessageFile: + { + AIMFileTransfer *ft = new AIMIncomingFileTransfer(static_cast(msg), data, client()); + AIMFileMessage* fmsg = static_cast(msg); + fmsg->m_transfer = ft; + ft->setDir(dir); + ft->setOverwrite(overwrite); + EventMessageAcked(msg).process(); + bDelete = false; + ft->setPort(fmsg->getPort()); + MessageId this_id; + this_id.id_l = fmsg->getID_L(); + this_id.id_h = fmsg->getID_H(); + ft->setICBMCookie(this_id); + log(L_DEBUG, "port = %d", fmsg->getPort()); + ft->setStage(1); + if(fmsg->isProxy) + { + ft->setICBMCookie2(fmsg->cookie2); + ft->setProxyActive(false); + ft->forceProxyConnection(); + } + ft->accept(); + return; + } + default: + log(L_DEBUG, "Bad message type %u for accept", msg->type()); + } + } + EventMessageDeleted(msg).process(); + if (bDelete) + { + delete msg; + } +} + +void SnacIcqICBM::decline(Message *msg, const QString &reason) +{ + if (msg->getFlags() & MESSAGE_DIRECT){ + Contact *contact = getContacts()->contact(msg->contact()); + ICQUserData *data = NULL; + if (contact){ + ClientDataIterator it(contact->clientData, client()); + while ((data = (client()->toICQUserData(++it))) != NULL){ + if (!msg->client().isEmpty() && (client()->dataName(data) == msg->client())) + break; + data = NULL; + } + } + if (data == NULL){ + log(L_WARN, "Data for request not found"); + return; + } + DirectClient *dc = dynamic_cast(data->Direct.object()); + if (dc == NULL){ + log(L_WARN, "No direct connection"); + return; + } + dc->declineMessage(msg, reason); + }else{ + MessageId id; + unsigned cookie = 0; + switch (msg->type()){ + case MessageICQFile: + id.id_l = static_cast(msg)->getID_L(); + id.id_h = static_cast(msg)->getID_H(); + cookie = static_cast(msg)->getCookie(); + break; + case MessageFile: + id.id_l = static_cast(msg)->getID_L(); + id.id_h = static_cast(msg)->getID_H(); + break; + default: + log(L_WARN, "Bad type %u for decline", msg->type()); + } + ICQUserData *data = NULL; + Contact *contact = NULL; + if (!msg->client().isEmpty()){ + contact = getContacts()->contact(msg->contact()); + if (contact){ + ClientDataIterator it(contact->clientData, client()); + while ((data = (client()->toICQUserData(++it))) != NULL){ + if (client()->dataName(data) == msg->client()) + break; + data = NULL; + } + } + } + if (data && (id.id_l || id.id_h)){ + if (msg->type() == MessageICQFile){ + ICQBuffer buf, msgBuf; + ICQBuffer b; + client()->packExtendedMessage(msg, buf, msgBuf, data); + b.pack((unsigned short)buf.size()); + b.pack(buf.data(0), buf.size()); + b.pack32(msgBuf); + unsigned short type = ICQ_MSGxEXT; + sendAutoReply(client()->screen(data), id, client()->plugins[PLUGIN_NULL], (unsigned short)(cookie & 0xFFFF), + (unsigned short)((cookie >> 16) & 0xFFFF), type, 1, 0, reason, 2, b); + }else{ + client()->snac(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_AUTOREPLY); + socket()->writeBuffer() << id.id_l << id.id_h << 0x0002; + socket()->writeBuffer().packScreen(client()->screen(data)); + socket()->writeBuffer() << 0x0003 << 0x0002 << 0x0001; + client()->sendPacket(false); + if (!reason.isEmpty()){ + Message *msg = new Message(MessageGeneric); //Fixme: Local declaration of 'msg' hides declaration of the same name in outer scope, see previous declaration at line '2262' + msg->setText(reason); + msg->setFlags(MESSAGE_NOHISTORY); + msg->setContact(contact->id()); + if (!client()->send(msg, data)) + delete msg; + } + } + } + } + EventMessageDeleted(msg).process(); + delete msg; +} + + +void SnacIcqICBM::requestReverseConnection(const QString &screen, DirectSocket *socket) +{ + SendMsg s; + s.flags = PLUGIN_REVERSE; + s.socket = socket; + s.screen = screen; + sendFgQueue.push_back(s); + processSendQueue(); +} + +bool SnacIcqICBM::cancelMessage(SIM::Message* msg) +{ + list::iterator it; + for(it = client()->m_processMsg.begin(); it != m_client->m_processMsg.end(); ++it) + if (*it == msg) + break; + if(it != m_client->m_processMsg.end()) + { + m_client->m_processMsg.erase(it); + delete msg; + return true; + } + if(msg->type() == MessageSMS) + { + for (list::iterator it = smsQueue.begin(); it != smsQueue.end(); ++it) + { + if (it->msg == msg) + { + if (it == smsQueue.begin()) + { + it->text = QString::null; + } + else + { + smsQueue.erase(it); + } + return msg; + } + } + } + else + { + Contact *contact = getContacts()->contact(msg->contact()); + if(contact) + { + ICQUserData *data; + ClientDataIterator it(contact->clientData, m_client); + while ((data = m_client->toICQUserData(++it)) != NULL) + { + DirectClient *dc = dynamic_cast(data->Direct.object()); + if (dc && dc->cancelMessage(msg)) + return msg; + } + } + if(m_send.msg == msg) + { + m_send.msg = NULL; + m_send.screen = QString::null; + m_sendTimer->stop(); + processSendQueue(); + return msg; + } + list::iterator it; + for(it = sendFgQueue.begin(); it != sendFgQueue.end(); ++it) + { + if(it->msg == msg) + { + sendFgQueue.erase(it); + delete msg; + return msg; + } + } + for(it = sendBgQueue.begin(); it != sendBgQueue.end(); ++it) + { + if (it->msg == msg) + { + sendBgQueue.erase(it); + delete msg; + return msg; + } + } + for(it = replyQueue.begin(); it != replyQueue.end(); ++it) + { + if (it->msg == msg) + { + replyQueue.erase(it); + delete msg; + return msg; + } + } + } + return true; +} + +void SnacIcqICBM::sendSMS(SendMsg msg) +{ + smsQueue.push_back(msg); + m_client->processSMSQueue(); +} + +void SnacIcqICBM::pluginInfoRequest(unsigned long uin, unsigned plugin_index) +{ + list::iterator it; + for (it = sendBgQueue.begin(); it != sendBgQueue.end(); ++it){ + SendMsg &s = *it; + if((s.screen.toULong() == uin) && (s.flags == plugin_index) && (s.msg == NULL)) + break; + } + if (it != sendBgQueue.end()) + return; + SendMsg s; + s.screen = QString::number(uin); + s.flags = plugin_index; + sendBgQueue.push_back(s); + processSendQueue(); +} + +bool SnacIcqICBM::process(unsigned short subtype, ICQBuffer* buf, unsigned short seq) +{ + switch (subtype){ + case ICQ_SNACxMSG_RIGHTSxGRANTED: + log(L_DEBUG, "Message rights granted"); + break; + case ICQ_SNACxMSG_MTN:{ + buf->incReadPos(10); + QString screen = buf->unpackScreen(); + unsigned short type; //Fixme!!! Local declaration of 'type' hides declaration of the same name in outer scope: Function parameter "type" + *buf >> type; + bool bType = (type > 1); + Contact *contact; + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if (data == NULL) + break; + if (data->bTyping.toBool() == bType) + break; + data->bTyping.asBool() = bType; + EventContact e(contact, EventContact::eStatus);; + e.process(); + break; + } + case ICQ_SNACxMSG_ERROR:{ + if(seq == 0) + break; + unsigned short error; + *buf >> error; + QString err_str = I18N_NOOP("Unknown error"); + if ((error == 0x0009) && + ((m_send.msg == NULL) || (m_send.msg->type() != MessageContacts))){ + err_str = I18N_NOOP("Not supported by client"); + Contact *contact; + ICQUserData *data = m_client->findContact(m_send.screen, NULL, false, contact); + if (data){ + list::iterator it; + for (it = sendFgQueue.begin(); it != sendFgQueue.end();){ + if (it->screen != m_send.screen){ + ++it; + continue; + } + if (it->msg){ + it->flags = 0; + ++it; + continue; + } + sendFgQueue.erase(it); + it = sendFgQueue.begin(); + } + for (it = sendBgQueue.begin(); it != sendBgQueue.end();){ + if (it->screen != m_send.screen){ + ++it; + continue; + } + if (it->msg){ + it->flags = 0; + ++it; + continue; + } + sendBgQueue.erase(it); + it = sendBgQueue.begin(); + } + data->bBadClient.asBool() = true; + if (m_send.msg) + sendThruServer(m_send.msg, data); + m_send.msg = NULL; + m_send.screen = QString::null; + m_sendTimer->stop(); + processSendQueue(); + break; + } + }else{ + err_str = m_client->error_message(error); + } + if(error == 2) + m_client->snacService()->requestRateInfo(); + if (m_send.msg){ + m_send.msg->setError(err_str); + EventMessageSent(m_send.msg).process(); + delete m_send.msg; + } + m_send.msg = NULL; + m_send.screen = QString::null; + m_sendTimer->stop(); + processSendQueue(); + break; + } + case ICQ_SNACxMSG_SRV_MISSED_MSG: { + unsigned short mFormat; // missed channel + QString screen; // screen + unsigned short wrnLevel;// warning level + unsigned short nTlv; // number of tlvs + TlvList lTlv; // all tlvs in message + unsigned short missed; // number of missed messages + unsigned short error; // error reason + socket()->readBuffer() >> mFormat; + screen = socket()->readBuffer().unpackScreen(); + socket()->readBuffer() >> wrnLevel; + socket()->readBuffer() >> nTlv; + for(unsigned i = 0; i < nTlv; i++) { + unsigned short num; + unsigned short size; + const char* data; + *buf >> num >> size; + data = buf->data(socket()->readBuffer().readPos()); + Tlv* tlv = new Tlv(num,size,data); + lTlv += tlv; + } + *buf >> missed >> error; + const char *err_str = NULL; + switch (error) { + case 0x00: + err_str = I18N_NOOP("Invalid message"); + break; + case 0x01: + err_str = I18N_NOOP("Message was too large"); + break; + case 0x02: + err_str = I18N_NOOP("Message rate exceeded"); + break; + case 0x03: + err_str = I18N_NOOP("Sender too evil"); + break; + case 0x04: + err_str = I18N_NOOP("We are to evil :("); + break; + default: + err_str = I18N_NOOP("Unknown error"); + } + log(L_DEBUG, "ICMB error %u (%s) - screen(%s)", error, err_str, qPrintable(screen)); + break; + } + case ICQ_SNACxMSG_BLAMExSRVxACK: + if((m_send.id.id_l == seq) && m_send.msg) + { + unsigned short oldLevel, newLevel; + *buf >> oldLevel >> newLevel; + WarningMessage *msg = static_cast(m_send.msg); + msg->setOldLevel((unsigned short)(newLevel - oldLevel)); + msg->setNewLevel(newLevel); + ackMessage(m_send); + } + break; + case ICQ_SNACxMSG_ACK: + { + MessageId id; + *buf >> id.id_l >> id.id_h; + buf->incReadPos(2); + QString screen = buf->unpackScreen(); + bool bAck = false; + if (m_send.id == id){ + if(screen.toLower() == m_send.screen.toLower()) + bAck = true; + } + if (bAck){ + log(L_DEBUG, "Ack: %lu %lu (%s)", m_send.id.id_h, m_send.id.id_l, qPrintable(m_send.screen)); + if (m_send.msg){ + Contact *contact; + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if (((data == NULL) || + (data->Status.toULong() == ICQ_STATUS_OFFLINE) || + (m_client->getAckMode() == 1)) && + (m_send.msg->type() != MessageFile)){ + m_sendTimer->stop(); + ackMessage(m_send); + return true; + }else{ + replyQueue.push_back(m_send); + } + }else{ + replyQueue.push_back(m_send); + } + } + m_send.msg = NULL; + m_send.screen = QString::null; + m_sendTimer->stop(); + processSendQueue(); + break; + } + case ICQ_SNACxMSG_AUTOREPLY:{ + MessageId id; + unsigned short len, channel, reason, version; + *buf >> id.id_l >> id.id_h; + buf->unpack(channel); + if (channel == 1) { + log(L_DEBUG,"Please send paket to developer!"); + return true; + } + QString screen = buf->unpackScreen(); + buf->unpack(reason); + buf->unpack(len); + buf->unpack(version); + plugin p; + buf->unpack((char*)p, sizeof(p)); + buf->incReadPos(len - sizeof(plugin) + 2); + buf->unpack(len); + buf->incReadPos(len + 12); + unsigned short ackFlags, msgFlags; + buf->unpack(ackFlags); + buf->unpack(msgFlags); + + list::iterator it; + for (it = replyQueue.begin(); it != replyQueue.end(); ++it){ + SendMsg &s = *it; + if ((s.id == id) && (s.screen == screen)) + break; + } + if (it == replyQueue.end()) + break; + + unsigned plugin_type = it->flags; + if (plugin_type == PLUGIN_AIM_FT_ACK){ + m_client->m_processMsg.push_back(it->msg); + replyQueue.erase(it); + break; + } + if (it->msg){ + QByteArray answer; + socket()->readBuffer() >> answer; + if (ackMessage(it->msg, ackFlags, answer)){ + ackMessage(*it); + }else{ + EventMessageSent(it->msg).process(); + delete it->msg; + } + replyQueue.erase(it); + break; + } + + replyQueue.erase(it); + Contact *contact; + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + + if (memcmp(p, m_client->plugins[PLUGIN_NULL], sizeof(plugin))){ + unsigned plugin_index; + for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++){ + if (memcmp(p, m_client->plugins[plugin_index], sizeof(plugin)) == 0) + break; + } + if (plugin_index == PLUGIN_NULL){ + QString plugin_str; + unsigned i; + for (i = 0; i < sizeof(plugin); i++){ + char b[4]; + sprintf(b, "%02X ", p[i]); + plugin_str += b; + } + log(L_WARN, "Unknown plugin sign in reply %s", qPrintable(plugin_str)); + break; + } + if ((data == NULL) && (plugin_index != PLUGIN_RANDOMxCHAT)) + break; + m_client->parsePluginPacket(socket()->readBuffer(), plugin_type, data, screen.toULong(), false); + break; + } + + if (plugin_type == PLUGIN_AR){ + QByteArray answer; + *buf >> answer; + log(L_DEBUG, "Autoreply from %s %s", qPrintable(screen), answer.data()); + Contact *contact; //Fixme: Local declaration of 'contact' hides declaration of the same name in outer scope, see previous declaration at line '300' + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if (data && data->AutoReply.setStr(getContacts()->toUnicode(contact, answer))){ + EventContact e(contact, EventContact::eChanged); + e.process(); + } + } + break; + } + case ICQ_SNACxMSG_SERVERxMESSAGE:{ + MessageId id; + *buf >> id.id_l >> id.id_h; + unsigned short mFormat; + *buf >> mFormat; + QString screen = buf->unpackScreen(); + log(L_DEBUG, "Message from %s [%04X]", qPrintable(screen), mFormat); + unsigned short level, nTLV; + *buf >> level >> nTLV; + TlvList tlvFixed(*buf, nTLV); + TlvList tlvChannel(*buf); + switch (mFormat){ + case 0x0001:{ + if (!tlvChannel(2)){ + log(L_WARN, "TLV 0x0002 not found"); + break; + } + ICQBuffer m(*tlvChannel(2)); + TlvList tlv_msg(m); + Tlv *m_tlv = tlv_msg(0x101); + if (m_tlv == NULL){ + log(L_WARN, "TLV 0x0101 not found"); + break; + } + if (m_tlv->Size() <= 4){ + log(L_WARN, "Bad TLV 0x0101 size (%d)",m_tlv->Size()); + break; + } + char *m_data = (*m_tlv); + unsigned short encoding = (unsigned short)((m_data[0] << 8) + m_data[1]); + unsigned short codepage = (unsigned short)((m_data[2] << 8) + m_data[3]); + m_data += 4; + QString text; + switch( encoding ) { + case 0 : { // ASCII + QTextCodec *pCodec = ContactList::getCodecByCodePage(codepage); + if( NULL != pCodec ) { + text = pCodec->toUnicode( m_data, m_tlv->Size() - 4 ); + } + else { + text = QString::fromAscii( m_data, m_tlv->Size() - 4 ); + } + break; + } + case 2 : { // Unicode + QTextCodec *codec = QTextCodec::codecForName("UTF-16BE"); + Q_ASSERT(codec); + text = codec->toUnicode( m_data, m_tlv->Size() - 4 ); + break; + } + case 3 : { // Latin_1 + text = QString::fromLatin1( m_data, m_tlv->Size() - 4 ); + break; + } + } + + Message *msg = new Message(MessageGeneric); + if (screen.toULong()){ + msg->setText(text); + }else{ + unsigned bgColor = m_client->clearTags(text); + msg->setText(text); + msg->setBackground(bgColor); + msg->setFlags(MESSAGE_RICHTEXT); + } + log(L_DEBUG, "Message %s", qPrintable(text)); + m_client->messageReceived(msg, screen); + break; + } + case 0x0002:{ + Tlv *tlv5 = tlvChannel(5); + if(!tlv5) + { + log(L_WARN, "TLV 0x0005 not found"); + break; + } + ICQBuffer msg(*tlv5); + unsigned short type; //Fixme: Local declaration of 'type' hides declaration of the same name in outer scope, see previous declaration at line '73' + msg >> type; + switch (type){ + case 0: + parseAdvancedMessage(screen, msg, tlvChannel(3) != NULL, id); + break; + case 1: + { + Contact *contact; + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if (data){ + QString name = m_client->dataName(data); + for (list::iterator it = m_client->m_acceptMsg.begin(); it != m_client->m_acceptMsg.end(); ++it){ + Message *msg = *it; //Fixme: Local declaration of 'msg' hides declaration of the same name in outer scope, see previous declaration at line '413' + if (!msg->client().isEmpty() && (name == msg->client())){ + MessageId msg_id; + switch (msg->type()){ + case MessageICQFile: + msg_id.id_l = static_cast(msg)->getID_L(); + msg_id.id_h = static_cast(msg)->getID_H(); + break; + case MessageFile: + msg_id.id_l = static_cast(msg)->getID_L(); + msg_id.id_h = static_cast(msg)->getID_H(); + break; + } + if (msg_id == id) + { + m_client->m_acceptMsg.erase(it); + EventMessageDeleted(msg).process(); + delete msg; + break; + } + } + } + } + break; + } + case 2: + log(L_DEBUG, "File ack"); + break; + default: + log(L_WARN, "Unknown type: 0x%04X", type); + } + break; + } + case 0x0004:{ + Tlv *tlv5 = tlvChannel(5); + if (!tlv5){ + log(L_WARN, "TLV 0x0005 not found"); + break; + } + ICQBuffer msg(*tlv5); + unsigned long msg_uin; + msg >> msg_uin; + if (msg_uin == 0){ + parseAdvancedMessage(screen, msg, tlvChannel(6) != NULL, id); + return true; + } + unsigned char type, flags; //Fixme: Local declaration of 'type' hides declaration of the same name in outer scope, see previous declaration at line '73' + QByteArray msg_str; + msg >> type; + msg >> flags; + msg >> msg_str; + Message *m = m_client->parseMessage(type, screen, msg_str, msg, id, 0); + if (m) + m_client->messageReceived(m, screen); + break; + } + default: + log(L_WARN, "Unknown message format %04X", mFormat); + } + break; + } + default: + break; + } + return true; +} + +void SnacIcqICBM::parseAdvancedMessage(const QString &screen, ICQBuffer &m, bool needAck, MessageId id) +{ + m.incReadPos(8); /* msg-id cookie */ + capability cap; + m.unpack((char*)cap, sizeof(cap)); + if (!memcmp(cap, m_client->capabilities[CAP_DIRECT], sizeof(cap))) + { + TlvList tlv(m); + if(!tlv(0x2711)) + { + log(L_DEBUG, "TLV 0x2711 not found"); + return; + } + unsigned long req_uin; + unsigned long localIP; + unsigned long localPort; + unsigned long remotePort; + unsigned long localPort1; + char mode; + ICQBuffer adv(*tlv(0x2711)); + adv.unpack(req_uin); + adv.unpack(localIP); + adv.unpack(localPort); + adv.unpack(mode); + adv.unpack(remotePort); + adv.unpack(localPort1); + if (req_uin != screen.toULong()){ + log(L_WARN, "Bad UIN in reverse direct request"); + return; + } + Contact *contact; + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if ((data == NULL) || contact->getIgnore()){ + log(L_DEBUG, "Reverse direct request from unknown user"); + return; + } + if (get_ip(data->RealIP) == 0) + set_ip(&data->RealIP, localIP); + for (list::iterator it = m_client->m_processMsg.begin(); it != m_client->m_processMsg.end(); ++it){ + if ((*it)->type() != MessageICQFile) + continue; + ICQFileMessage *msg = static_cast(*it); + if (msg->m_transfer == NULL) + continue; + } + log(L_DEBUG, "Setup reverse connect to %s %s:%lu", + qPrintable(screen), qPrintable(QHostAddress(localIP).toString()), localPort); + DirectClient *direct = new DirectClient(data, m_client); + m_client->m_sockets.push_back(direct); + direct->reverseConnect(localIP, localPort); + return; + } + + TlvList tlv(m); + unsigned long real_ip = 0; + unsigned long ip = 0; + unsigned short port = 0; + unsigned long test_ip = 0; + + if (tlv(2)) + test_ip = ((uint32_t)(*tlv(2))); + if (tlv(3)) + real_ip = ((uint32_t)(*tlv(3))); + if (tlv(4)) + ip = ((uint32_t)(*tlv(4))); + if (tlv(5)) + port = (*tlv(5)); + + if(tlv(13)) { + // lang? + } + if(tlv(14)) { + // codepage? + } + + log(L_DEBUG, "Test IP: %08x, Real IP: %08x, IP: %08x, PORT: %d",(unsigned int)test_ip, (unsigned int)real_ip, (unsigned int)ip, port); + + if(real_ip || ip) + { + Contact *contact; + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if (data) + { + //if(real_ip && (get_ip(data->RealIP) == 0)) + if(real_ip) + set_ip(&data->RealIP, real_ip); + if(ip && (get_ip(data->IP) == 0)) + set_ip(&data->IP, ip); + if(port && (data->Port.toULong() == 0)) + data->Port.asULong() = port; + } + } + + if (!memcmp(cap, m_client->capabilities[CAP_AIM_IMIMAGE], sizeof(cap))){ + log(L_DEBUG, "AIM set direct connection"); + return; + } + + if (!memcmp(cap, m_client->capabilities[CAP_AIM_SENDFILE], sizeof(cap))) + { + sendFile(tlv, test_ip, ip, port, screen, id); + return; + } + + if (!memcmp(cap, m_client->capabilities[CAP_AIM_BUDDYLIST], sizeof(cap))) + { + log(L_DEBUG, "AIM buddies list"); + if (!tlv(0x2711)){ + log(L_WARN, "No body in ICMB message found"); + return; + } + ICQBuffer adv(*tlv(0x2711)); + QString contacts; + while (adv.readPos() < (unsigned)adv.size()){ + QString grp; + adv.unpackStr(grp); + unsigned short nBuddies; + adv >> nBuddies; + for (unsigned short i = 0; i < nBuddies; i++){ + QString s; + adv.unpackStr(s); + if (!contacts.isEmpty()) + contacts += ';'; + if (s.toULong()){ + contacts += "icq:"; + contacts += s; + contacts += ",ICQ "; + contacts += s; + }else{ + contacts += "aim:"; + contacts += s; + contacts += ",AIM "; + contacts += s; + } + } + } + m_client->snac(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_AUTOREPLY); + socket()->writeBuffer() << id.id_l << id.id_h << 0x0002; + socket()->writeBuffer().packScreen(screen); + socket()->writeBuffer() << 0x0003 << 0x0002 << 0x0002; + m_client->sendPacket(false); + ContactsMessage *msg = new ContactsMessage; + msg->setContacts(contacts); + m_client->messageReceived(msg, screen); + return; + } + + if (memcmp(cap, m_client->capabilities[CAP_SRV_RELAY], sizeof(cap))){ + QString s; + for (unsigned i = 0; i < sizeof(cap); i++){ + char b[5]; + sprintf(b, "0x%02X ", cap[i] & 0xFF); + s += b; + } + log(L_DEBUG, "Unknown capability in advanced message\n%s", qPrintable(s)); + return; + } + + if (!tlv(0x2711)){ + log(L_WARN, "No body in ICMB message found"); + return; + } + + ICQBuffer adv(*tlv(0x2711)); + unsigned short len; + unsigned short tcp_version; + plugin p; + + adv.unpack(len); + adv.unpack(tcp_version); + adv.unpack((char*)p, sizeof(p)); + adv.incReadPos(len - sizeof(p) - 4); + + unsigned short cookie1; + unsigned short cookie2; + unsigned short cookie3; + adv.unpack(cookie1); + adv.unpack(cookie2); + adv.unpack(cookie3); + if ((cookie1 != cookie3) && (cookie1 + 1 != cookie3)){ + log(L_WARN, "Bad cookie in TLV 2711 (%X %X %X)", cookie1, cookie2, cookie3); + return; + } + adv.unpack(len); + adv.incReadPos(len + 10); + + if (memcmp(p, m_client->plugins[PLUGIN_NULL], sizeof(p))){ + unsigned plugin_index; + for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++) + if (memcmp(p, m_client->plugins[plugin_index], sizeof(p)) == 0) + break; + if (plugin_index >= PLUGIN_NULL){ + QString sign; + unsigned int i; + for (i = 0; i < sizeof(p); i++) { + char temp[8]; + int value = p[i]; + + sprintf(temp,"%02X",value); + sign += QString(temp); + } + if (sign.length()) + log(L_WARN, "Unknown plugin sign %s",qPrintable(sign)); + return; + } + switch (plugin_index){ + case PLUGIN_INFOxMANAGER: + case PLUGIN_STATUSxMANAGER: + break; + default: + log(L_WARN, "Unsupported plugin request %u", plugin_index); + return; + } + char type; + adv.unpack(type); + if (type != 1){ + log(L_WARN, "Unknown type plugin request %u", type); + return; + } + adv.incReadPos(8); + plugin p; //Fixme: Local declaration of 'p' hides declaration of the same name in outer scope: previous declaration at line '1176' + adv.unpack((char*)p, sizeof(p)); + unsigned plugin_type; + for (plugin_type = 0; plugin_type < PLUGIN_NULL; plugin_type++){ + if (memcmp(p, m_client->plugins[plugin_type], sizeof(p)) == 0) + break; + } + if (plugin_type >= PLUGIN_NULL){ + log(L_WARN, "Unknown plugin request"); + return; + } + ICQBuffer info; + m_client->pluginAnswer(plugin_type, screen.toULong(), info); + sendAutoReply(screen, id, m_client->plugins[plugin_index], + cookie1, cookie2, 0, 0, 0x0200, QString::null, 1, info); + return; + } + + unsigned short msgType; + unsigned short msgFlags; + unsigned short msgState; + adv.unpack(msgType); + adv.unpack(msgState); + adv.unpack(msgFlags); + QByteArray msg; + adv >> msg; + + switch (msgType){ + case ICQ_MSGxAR_AWAY: + case ICQ_MSGxAR_OCCUPIED: + case ICQ_MSGxAR_NA: + case ICQ_MSGxAR_DND: + case ICQ_MSGxAR_FFC:{ + unsigned req_status = STATUS_AWAY; + switch (msgType){ + case ICQ_MSGxAR_OCCUPIED: + req_status = STATUS_OCCUPIED; + break; + case ICQ_MSGxAR_NA: + req_status = STATUS_NA; + break; + case ICQ_MSGxAR_DND: + req_status = STATUS_DND; + break; + case ICQ_MSGxAR_FFC: + req_status = STATUS_FFC; + break; + } + Contact *contact; + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if (data == NULL) + return; + if ((m_client->getInvisible() && (data->VisibleId.toULong() == 0)) || + (!m_client->getInvisible() && data->InvisibleId.toULong())) + return; + ar_request req; + req.screen = screen; + req.type = msgType; + req.ack = 0; + req.id = id; + req.id1 = cookie1; + req.id2 = cookie2; + req.bDirect = false; + m_client->arRequests.push_back(req); + + ARRequest ar; + ar.contact = contact; + ar.param = &m_client->arRequests.back(); + ar.receiver = m_client; + ar.status = req_status; + EventARRequest(&ar).process(); + + if (!msg.isEmpty()){ + Contact *contact; //Fixme: Local declaration of 'contact' hides declaration of the same name in outer scope, see previous declaration at line '1278' + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); //Fixme: Local declaration of 'data' hides declaration of the same name in outer scope, see previous declaration at line '1279' + QString m = getContacts()->toUnicode(contact, msg); //Fixme: Local declaration of 'm' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '1006' + data->AutoReply.str() = m; + EventContact e(contact, EventContact::eChanged); + e.process(); + } + return; + } + } + ICQBuffer copy; + if (!msg.isEmpty() || (msgType == ICQ_MSGxEXT)){ + if (adv.readPos() < adv.writePos()) + copy.pack(adv.data(adv.readPos()), adv.writePos() - adv.readPos()); + log(L_DEBUG, "Msg size=%lu type=%u", (unsigned long) msg.size(), msgType); + if (msg.size() || (msgType == ICQ_MSGxEXT)){ + Message *m = m_client->parseMessage(msgType, screen, msg, adv, id, cookie1 | (cookie2 << 16)); //Fixme: Local declaration of 'm' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '1006' + if (m){ + if ((m_send.id == id) && (m_send.screen == screen)){ + replyQueue.push_back(m_send); + m_send.msg = NULL; + m_send.screen = ""; + m_sendTimer->stop(); + processSendQueue(); + return; + } + list::iterator it; + for (it = replyQueue.begin(); it != replyQueue.end(); ++it){ + SendMsg &s = *it; + log(L_DEBUG, "%lu %lu (%s) - %lu %lu (%s)", + s.id.id_h, s.id.id_l, qPrintable(s.screen), + id.id_h, id.id_l, qPrintable(screen)); + if ((s.id == id) && (s.screen == screen)) + break; + } + if (it == replyQueue.end()){ + bool bAccept = true; + unsigned short ackFlags = 0; + if (m->type() != MessageICQFile){ + if (m->type() == MessageStatus){ + bAccept = false; + }else{ + switch (m_client->getStatus()){ + case STATUS_DND: + if (m_client->getAcceptInDND()) + break; + ackFlags = ICQ_TCPxACK_DND; + bAccept = false; + break; + case STATUS_OCCUPIED: + if (m_client->getAcceptInOccupied()) + break; + ackFlags = ICQ_TCPxACK_OCCUPIED; + bAccept = false; + break; + } + if (msgFlags & (ICQ_TCPxMSG_URGENT | ICQ_TCPxMSG_LIST)) + bAccept = true; + } + if (!bAccept){ + Contact *contact; + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if (data == NULL) + return; + + ar_request req; + req.screen = screen; + req.type = msgType; + req.ack = ackFlags; + req.id = id; + req.id1 = cookie1; + req.id2 = cookie2; + req.bDirect = false; + m_client->arRequests.push_back(req); + + ARRequest ar; + ar.contact = contact; + ar.param = &m_client->arRequests.back(); + ar.receiver = m_client; + ar.status = m_client->getStatus(); + EventARRequest(&ar).process(); + return; + } + } + if (msgFlags & ICQ_TCPxMSG_URGENT) + m->setFlags(m->getFlags() | MESSAGE_URGENT); + if (msgFlags & ICQ_TCPxMSG_LIST) + m->setFlags(m->getFlags() | MESSAGE_LIST); + needAck = m_client->messageReceived(m, screen); + } + else + { + Message *msg = it->msg; //Fixme: Local declaration of 'msg' hides declaration of the same name in outer scope, see previous declaration at line '1254' + replyQueue.erase(it); + if(msg->type() == MessageFile) + { + Contact *contact; + ICQUserData *data = m_client->findContact(screen, NULL, false, contact); + if ((m->type() != MessageICQFile) || (data == NULL)){ + log(L_WARN, "Bad answer type"); + msg->setError(I18N_NOOP("Send failed")); + EventMessageSent(msg).process(); + delete msg; + return; + } + if(m_client->getState() == 1) + { + msg->setError(I18N_NOOP("Message declined")); + EventMessageSent(msg).process(); + delete msg; + return; + } + } + else + { + log(L_WARN, "Unknown message type for ACK"); + delete msg; + } + } + } + } + } + if (!needAck) + return; + sendAutoReply(screen, id, p, cookie1, cookie2, + msgType, 0, 0, QString::null, 0, copy); //variable p seems corrupted, maybe crash? +} + +class AIMParser : public HTMLParser +{ +public: + AIMParser() {} + QString parse(const QString &str); +protected: + bool bPara; + QString res; + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &options); + virtual void tag_end(const QString &tag); +}; + +QString AIMParser::parse(const QString &str) +{ + bPara = false; + res = QString::null; + HTMLParser::parse(str); + return res; +} + +void AIMParser::text(const QString &text) +{ + if (text.isEmpty()) + return; + bPara = true; + res += text; +} + +void AIMParser::tag_start(const QString &tag, const list &options) +{ + QString dummytag=tag; //remove this cramp later + list::const_iterator dummyoptions = options.begin();//remove this cramp later + /*QString otag; + QString add; + if (tag == "br") + otag = "BR"; + if (tag == "p"){ + if (!bPara) + return; + otag = "BR"; + } + if ((tag == "font") || (tag == "b") || (tag == "u") || (tag == "i")) + otag = tag.upper(); + if (tag == "span") + otag = "FONT"; + if (otag.isEmpty()) + return; + res += '<'; + res += otag; + for (list::const_iterator it = options.begin(); it != options.end(); ++it){ + QString key = *it; + ++it; + QString value = *it; + if (key.lower() == "style"){ + list styles = parseStyle(value); + for (list::const_iterator its = styles.begin(); its != styles.end(); ++its){ + QString key = *its; + ++its; + QString value = *its; + if (key == "font-family") + { + res += " FACE=\""; + res += value; + res += '\"'; + } + else if (key == "font-size") + { + if (value == "smaller") + { + res += " SIZE=2"; + } + else if (value == "larger") + { + res += " SIZE=4"; + } + } + else if (key == "font-style") + { + if (value.lower() == "italic") + add = ""; + } + else if (key == "font-weight") + { + if (value.toInt() >= 600) + add = ""; + } + else if (key == "text-decoration") + { + if (value.lower() == "underline") + add = "u"; + } + else if (key == "color") + { + res += " COLOR=\""; + res += value; + res += '\"'; + } + } + continue; + } + res += ' '; + res += key.upper(); + res += "=\""; + res += value; + res += '\"'; + } + res += ">";*/ +} + +void AIMParser::tag_end(const QString &tag) +{ + if(tag == "p") { + res += '\n'; + } + /*QString otag; + if ((tag == "font") || (tag == "b") || (tag == "u") || (tag == "i")) + otag = tag.upper(); + if (tag == "span") + otag = "FONT"; + if (otag.isEmpty()) + return; + res += "";*/ +} + +void SnacIcqICBM::processSendQueue() +{ + if (m_sendTimer->isActive()) //Crash here on change Profile, m_sendTimer is 0 + return; + m_client->m_processTimer->stop(); + if (m_client->m_bNoSend) + return; + if (m_client->getState() != Client::Connected){ + m_sendTimer->stop(); + return; + } + unsigned delay = 0; + unsigned send_delay = 0; + if (m_client->m_bReady){ + while (!sendFgQueue.empty()){ + send_delay = m_client->delayTime(SNAC(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_SENDxSERVER)); + if (send_delay){ + delay = send_delay; + break; + } + log(L_DEBUG, "Process fg queue"); + m_send = sendFgQueue.front(); + sendFgQueue.pop_front(); + m_sendTimer->start(SEND_TIMEOUT); + if (processMsg()) + return; + m_sendTimer->stop(); + } + } + send_delay = m_client->processSMSQueue(); + if (send_delay && (delay > send_delay)) + delay = send_delay; + for (unsigned i = 0; i < m_client->m_rates.size(); i++){ + RateInfo &r = m_client->m_rates[i]; + for (;;){ + if (r.delayed.readPos() == r.delayed.writePos()) + break; + send_delay = m_client->delayTime(r); + if (send_delay){ + log(L_DEBUG, "Delay for group %d: %u", i, send_delay); + m_client->m_processTimer->start(send_delay); + return; + } + unsigned char *packet = (unsigned char*)(r.delayed.data(r.delayed.readPos())); + unsigned size = (packet[4] << 8) + packet[5] + 6; + ++m_client->m_nFlapSequence; + packet[2] = (m_client->m_nFlapSequence >> 8); + packet[3] = m_client->m_nFlapSequence; + socket()->writeBuffer().packetStart(); + socket()->writeBuffer().pack(r.delayed.data(r.delayed.readPos()), size); + EventLog::log_packet(socket()->writeBuffer(), true, ICQPlugin::icq_plugin->OscarPacket); + r.delayed.incReadPos(size); + m_client->setNewLevel(r); + socket()->write(); + } + if (r.delayed.readPos() == r.delayed.writePos()) + r.delayed.init(0); + } + send_delay = m_client->processInfoRequest(); + if (send_delay && (delay > send_delay)) + delay = send_delay; + send_delay = m_client->processListRequest(); + if (send_delay && (delay > send_delay)) + delay = send_delay; + if (m_client->m_bReady){ + while (!sendBgQueue.empty()){ + send_delay = m_client->delayTime(SNAC(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_SENDxSERVER)); + if (send_delay){ + if (send_delay < delay) + delay = send_delay; + break; + } + m_send = sendBgQueue.front(); + sendBgQueue.pop_front(); + m_sendTimer->start(SEND_TIMEOUT); + if (processMsg()) + return; + m_sendTimer->stop(); + } + } + if (delay){ + log(L_DEBUG, "Delay: %u", delay); + m_client->m_processTimer->start(delay); + } +} + +static QString getUtf8Part(QString &str, unsigned size) +{ + if ((unsigned) str.toUtf8().length() < size){ + QString res = str; + str = QString::null; + return res; + } + unsigned s = 0; + int n; + int wordStart = 0; + bool bWord = false; + for (n = 0; n < str.length(); n++) + { + QChar c = str[n]; + if (c.isSpace()) + { + if (bWord) + { + unsigned word_size = str.mid(wordStart, n - wordStart).toUtf8().length(); + if (s + word_size > 0){ + if (wordStart == 0) + { + s = 0; + for (n = 0; n < str.length(); n++) + { + unsigned char_size = str.mid(n, 1).toUtf8().length(); + if (s + char_size > 0) + break; + } + } + break; + } + s += word_size; + bWord = false; + } + unsigned char_size = str.mid(n, 1).toUtf8().length(); + if (s + char_size > 0) + break; + s += char_size; + } + else if (!bWord) + { + wordStart = n; + bWord = true; + } + } + QString res = str.left(n); + str = str.mid(n); + return res; +} + +bool SnacIcqICBM::processMsg() +{ + log(L_DEBUG, "SnacIcqICBM::processMsg()"); + Contact *contact; + ICQUserData *data = m_client->findContact(m_send.screen, NULL, false, contact); + if ((data == NULL) && (m_send.flags != PLUGIN_RANDOMxCHAT)){ + if (m_send.msg != NULL) + { + m_send.msg->setError(I18N_NOOP("No contact")); + EventMessageSent(m_send.msg).process(); + delete m_send.msg; + m_send.msg = NULL; + } + m_send.screen = QString::null; + return false; + } + unsigned short type = 0; + if (m_send.msg) + { + type = m_send.msg->type(); + log(L_DEBUG, "Send: %s %u %X", qPrintable(m_send.screen), type, m_send.flags); + } + if(m_send.msg && (m_send.socket == NULL)) + { + ICQBuffer b; + m_send.id.id_l = rand(); + m_send.id.id_h = rand(); + switch (m_send.msg->type()) + { + case MessageContacts: + if (data->Uin.toULong() == 0){ + CONTACTS_MAP c; + QString nc = m_client->packContacts(static_cast(m_send.msg), data, c); + if (c.empty()){ + m_send.msg->setError(I18N_NOOP("No contacts for send")); + EventMessageSent(m_send.msg).process(); + delete m_send.msg; + m_send.msg = NULL; + m_send.screen = QString::null; + return false; + } + static_cast(m_send.msg)->setContacts(nc); + ICQBuffer msgBuf; + vector cc; + for (CONTACTS_MAP::iterator it = c.begin(); it != c.end(); ++it){ + alias_group c; //Fixme: Local declaration of 'c' hides declaration of the same name in outer scope, see previous declaration at line '1786' + c.alias = it->first.str(); + c.grp = it->second.grp; + cc.push_back(c); + } + sort(cc.begin(), cc.end()); + + unsigned grp = (unsigned)(-1); + unsigned start = 0; + unsigned short size = 0; + unsigned i; + for (i = 0; i < cc.size(); i++){ + if (cc[i].grp != grp){ + if (grp != (unsigned)(-1)){ + QString s = "Not in list"; + if (grp){ + Group *group = getContacts()->group(grp); + if (group) + s = group->getName(); + } + msgBuf.pack(s); + msgBuf << size; + for (unsigned j = start; j < i; j++) + msgBuf.pack(cc[j].alias); + } + size = 0; + start = i; + grp = cc[i].grp; + } + size++; + } + QString s = "Not in list"; + if (grp){ + Group *group = getContacts()->group(grp); + if (group) + s = group->getName(); + } + msgBuf.pack(s); + msgBuf << size; + for (unsigned j = start; j < i; j++) + msgBuf.pack(cc[j].alias); + m_send.id.id_l = rand(); + m_send.id.id_h = rand(); + sendType2(m_send.screen, msgBuf, m_send.id, CAP_AIM_BUDDYLIST, false, 0); + return true; + } + case MessageUrl:{ + if (data->Uin.toULong() == 0) + break; + m_client->packMessage(b, m_send.msg, data, type, false); + QString err = m_send.msg->getError(); + if (!err.isEmpty()){ + EventMessageSent(m_send.msg).process(); + delete m_send.msg; + m_send.msg = NULL; + m_send.screen = QString::null; + return false; + } + sendThroughServer(m_client->screen(data), 4, b, m_send.id, true, false); + if (data->Status.toULong() != ICQ_STATUS_OFFLINE) + m_sendTimer->stop(); + if ((data->Status.toULong() != ICQ_STATUS_OFFLINE) || (m_client->getAckMode() == 0)) + ackMessage(m_send); + return true; + } + case MessageFile: + { + log(L_DEBUG, "processMsg: MessageFile"); + MessageId id; + m_client->generateCookie(id); + FileMessage* msg = static_cast(m_send.msg); + AIMOutcomingFileTransfer *ft = new AIMOutcomingFileTransfer(msg, data, m_client); + ft->setICBMCookie(id); + ft->listen(); + QString filename = msg->getDescription(); + ft->setStage(1); + //unsigned long filesize = msg->getSize(); //Fixme: filesize is initialized, but not used. + ft->requestFT(); + return true; + } + case MessageWarning:{ + WarningMessage *msg = static_cast(m_send.msg); + m_client->snac(ICQ_SNACxFOOD_MESSAGE, ICQ_SNACxMSG_BLAMExUSER, true); + m_send.id.id_l = m_client->m_nMsgSequence; + unsigned short flag = 0; + if (msg->getAnonymous()) + flag = 1; + socket()->writeBuffer() << flag; + socket()->writeBuffer().packScreen(m_client->screen(data)); + m_client->sendPacket(false); + return true; + } + } + QByteArray text; + log(L_DEBUG, "Alpha %x", m_send.flags); + switch (m_send.flags & SEND_MASK){ + case SEND_RTF: + text = m_client->createRTF(m_send.text, m_send.part, m_send.msg->getForeground(), contact, MAX_TYPE2_MESSAGE_SIZE); + break; + case SEND_UTF: + m_send.part = getUtf8Part(m_send.text, MAX_TYPE2_MESSAGE_SIZE); + text = m_send.part.toUtf8(); + break; + case SEND_TYPE2:{ + m_send.part = getPart(m_send.text, MAX_TYPE2_MESSAGE_SIZE); + text = getContacts()->fromUnicode(contact, m_send.part); + EventSend e(m_send.msg, text); + e.process(); + text = e.localeText(); + break; + } + case SEND_HTML: + case SEND_HTML_PLAIN:{ + QString t; + unsigned max_size = MAX_TYPE2_MESSAGE_SIZE; + bool bWide = false; + for (int i = 0; i < (int)(m_send.text.length()); i++){ + if (m_send.text[i].unicode() > 0x7F){ + max_size = max_size / 2; + bWide = true; + break; + } + } + m_send.part = getPart(m_send.text, max_size); + //char b[15]; + //sprintf(b, "%06X", (unsigned)(m_send.msg->getBackground() & 0xFFFFFF)); + //t += ""; + if ((m_send.flags & SEND_MASK) == SEND_HTML){ + AIMParser p; + t += p.parse(m_send.part); + }else{ + EventSend e(m_send.msg, m_send.part.toUtf8()); + e.process(); + m_send.part = QString::fromUtf8( e.localeText() ); + t += quoteString(m_send.part); + } + //t += ""; + sendType1(t, bWide, data); + return true; + } + default: + m_send.part = getPart(m_send.text, MAX_PLAIN_MESSAGE_SIZE); + sendType1(m_send.part, false, data); + return true; + } + + ICQBuffer msgBuf; + unsigned short size = (unsigned short)(text.length() + 1); + unsigned short flags = ICQ_TCPxMSG_NORMAL; + if (m_send.msg->getFlags() & MESSAGE_URGENT) + flags = ICQ_TCPxMSG_URGENT; + if (m_send.msg->getFlags() & MESSAGE_LIST) + flags = ICQ_TCPxMSG_LIST; + msgBuf.pack((unsigned short)1); + msgBuf.pack(m_client->msgStatus()); + msgBuf.pack(flags); + msgBuf.pack(size); + msgBuf.pack(text.data(), size); + if (m_send.msg->getBackground() == m_send.msg->getForeground()){ + msgBuf << 0x00000000L << 0xFFFFFF00L; + }else{ + msgBuf << (m_send.msg->getForeground() << 8) << (m_send.msg->getBackground() << 8); + } + if ((m_send.flags & SEND_MASK) != SEND_TYPE2){ + msgBuf << 0x26000000L; + packCap(msgBuf, m_client->capabilities[((m_send.flags & SEND_MASK) == SEND_RTF) ? CAP_RTF : CAP_UTF]); + } + m_send.id.id_l = rand(); + m_send.id.id_h = rand(); + sendAdvMessage(m_send.screen, msgBuf, PLUGIN_NULL, m_send.id, true, false); + return true; + } + if(m_send.socket) + { + ICQBuffer msgBuf; + if(m_send.flags == PLUGIN_AIM_FT_ACK) + { + log(L_DEBUG, "This way"); + AIMFileMessage *msg = static_cast(m_send.msg); + m_send.id.id_l = msg->getID_L(); + m_send.id.id_h = msg->getID_H(); + ICQBuffer b; + b << (unsigned short)0; + b << m_send.id.id_l << m_send.id.id_h; + b.pack((char*)m_client->capabilities[CAP_AIM_SENDFILE], sizeof(capability)); + b.tlv(0x0A, (unsigned short)2); + b.tlv(0x03, (unsigned long)htonl(get_ip(m_client->data.owner.RealIP))); + b.tlv(0x05, static_cast(msg->m_transfer)->remotePort()); + sendThroughServer(m_send.screen, 2, b, m_send.id, false, false); + replyQueue.push_back(m_send); + m_send.msg = NULL; + m_send.screen = QString::null; + return false; + } + m_send.id.id_l = rand(); + m_send.id.id_h = rand(); + if(m_send.flags == PLUGIN_AIM_FT) + { + TlvList tlvs; + tlvs += new Tlv(0x0E, 2, "en"); + char b[15]; + sprintf(b, "%06X", (unsigned)(m_send.msg->getBackground() & 0xFFFFFF)); + QString text = QString("%2") + .arg(b) + .arg(m_client->removeImages(m_send.msg->getRichText(), false)); + bool bWide = false; + int i; + for (i = 0; i < (int)(text.length()); i++){ + if (text[i].unicode() > 0x7F){ + bWide = true; + break; + } + } + QString charset = bWide ? "unicode-2-0" : "us-ascii"; + tlvs += new Tlv(0x0D, charset.length(), charset.toLatin1()); + QByteArray st; + if (bWide){ + for (i = 0; i < (int)(text.length()); i++){ + unsigned short s = text[i].unicode(); + st += (char)((s >> 8) & 0xFF); + st += (char)(s & 0xFF); + } + }else{ + st = text.toUtf8(); + } + tlvs += new Tlv(0x0C, st.length(), st.data()); + FileMessage *msg = static_cast(m_send.msg); + FileMessage::Iterator it(*msg); + msgBuf + << (unsigned short)0x0001 + << (unsigned short)(it.count()) + << (unsigned long)(it.size()); + QString fname; + if (it.count() == 1){ + fname = *(it[0]); + fname = fname.replace('\\', '/'); + int n = fname.lastIndexOf('/'); + if (n >= 0) + fname = fname.mid(n + 1); + }else{ + fname = QString::number(it.count()); + fname += " files"; + } + bWide = false; + for (i = 0; i < (int)(fname.length()); i++){ + if (fname[i].unicode() > 0x7F){ + bWide = true; + break; + } + } + charset = bWide ? "utf8" : "us-ascii"; + tlvs += new Tlv(0x2712, charset.length(), charset.toUtf8()); + msgBuf << (const char*)(fname.toUtf8()) << (char)0; + sendType2(m_send.screen, msgBuf, m_send.id, CAP_AIM_SENDFILE, false, m_send.socket->localPort(), &tlvs); + return true; + } + msgBuf.pack(m_client->data.owner.Uin.toULong()); + unsigned long ip = get_ip(m_client->data.owner.IP); + if (ip == get_ip(m_send.socket->m_data->IP)) + ip = get_ip(m_client->data.owner.RealIP); + msgBuf.pack(ip); + msgBuf.pack((unsigned long)(m_send.socket->localPort())); + msgBuf.pack((char)MODE_DIRECT); + msgBuf.pack((unsigned long)(m_send.socket->remotePort())); + msgBuf.pack(m_client->data.owner.Port.toULong()); + msgBuf.pack((unsigned short)8); + msgBuf.pack((unsigned long)m_client->m_nMsgSequence); + sendType2(m_send.screen, msgBuf, m_send.id, CAP_DIRECT, false, 0); + return true; + } + if (m_send.flags == PLUGIN_AR){ + log(L_DEBUG, "Request auto response %s", qPrintable(m_send.screen)); + + unsigned long status = data->Status.toULong(); + if ((status == ICQ_STATUS_ONLINE) || (status == ICQ_STATUS_OFFLINE)) + return false; + + unsigned short type = ICQ_MSGxAR_AWAY; //Fixme: Local declaration of 'type' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '1771' + if (status & ICQ_STATUS_DND){ + type = ICQ_MSGxAR_DND; + }else if (status & ICQ_STATUS_OCCUPIED){ + type = ICQ_MSGxAR_OCCUPIED; + }else if (status & ICQ_STATUS_NA){ + type = ICQ_MSGxAR_NA; + }else if (status & ICQ_STATUS_FFC){ + type = ICQ_MSGxAR_FFC; + } + + ICQBuffer msg; + msg.pack(type); + msg.pack((unsigned short)(m_client->fullStatus(m_client->m_status) & 0xFFFF)); + msg << 0x0100 << 0x0100 << (char)0; + + m_send.id.id_l = rand(); + m_send.id.id_h = rand(); + sendAdvMessage(m_client->screen(data), msg, PLUGIN_NULL, m_send.id, false, false); + return true; + }else if (m_send.flags == PLUGIN_RANDOMxCHAT){ + m_send.id.id_l = rand(); + m_send.id.id_h = rand(); + ICQBuffer b; + b << (char)1 << 0x00000000L << 0x00010000L; + sendAdvMessage(m_send.screen, b, PLUGIN_RANDOMxCHAT, m_send.id, false, false); + }else{ + unsigned plugin_index = m_send.flags; + log(L_DEBUG, "Plugin info request %s (%u)", qPrintable(m_send.screen), plugin_index); + + ICQBuffer b; + unsigned short type = 0; //Fixme: Local declaration of 'type' hides declaration of the same name in outer scope. For additional information, see previous declaration at line '1771' + switch (plugin_index){ + case PLUGIN_QUERYxINFO: + case PLUGIN_PHONEBOOK: + case PLUGIN_PICTURE: + type = 2; + break; + } + b.pack((unsigned short)1); + b.pack((unsigned short)0); + b.pack((unsigned short)2); + b.pack((unsigned short)1); + b.pack((char)0); + b.pack((char*)m_client->plugins[plugin_index], sizeof(plugin)); + b.pack((unsigned long)0); + + m_send.id.id_l = rand(); + m_send.id.id_h = rand(); + sendAdvMessage(m_send.screen, b, type ? PLUGIN_INFOxMANAGER : PLUGIN_STATUSxMANAGER, m_send.id, false, false); + return true; + } + return false; +} + +static const plugin arrPlugins[] = + { + // PLUGIN_PHONExBOOK + { 0x90, 0x7C, 0x21, 0x2C, 0x91, 0x4D, + 0xD3, 0x11, 0xAD, 0xEB, 0x00, 0x04, + 0xAC, 0x96, 0xAA, 0xB2, 0x00, 0x00 }, + // PLUGIN_PICTURE + { 0x80, 0x66, 0x28, 0x83, 0x80, 0x28, + 0xD3, 0x11, 0x8D, 0xBB, 0x00, 0x10, + 0x4B, 0x06, 0x46, 0x2E, 0x00, 0x00 }, + // PLUGIN_FILExSERVER + { 0xF0, 0x2D, 0x12, 0xD9, 0x30, 0x91, + 0xD3, 0x11, 0x8D, 0xD7, 0x00, 0x10, + 0x4B, 0x06, 0x46, 0x2E, 0x04, 0x00 }, + // PLUGIN_FOLLOWxME + { 0x90, 0x7C, 0x21, 0x2C, 0x91, 0x4D, + 0xD3, 0x11, 0xAD, 0xEB, 0x00, 0x04, + 0xAC, 0x96, 0xAA, 0xB2, 0x02, 0x00 }, + // PLUGIN_ICQxPHONE + { 0x3F, 0xB6, 0x5E, 0x38, 0xA0, 0x30, + 0xD4, 0x11, 0xBD, 0x0F, 0x00, 0x06, + 0x29, 0xEE, 0x4D, 0xA1, 0x00, 0x00 }, + // PLUGIN_QUERYxINFO + { 0xF0, 0x02, 0xBF, 0x71, 0x43, 0x71, + 0xD3, 0x11, 0x8D, 0xD2, 0x00, 0x10, + 0x4B, 0x06, 0x46, 0x2E, 0x00, 0x00 }, + // PLUGIN_QUERYxSTATUS + { 0x10, 0x18, 0x06, 0x70, 0x54, 0x71, + 0xD3, 0x11, 0x8D, 0xD2, 0x00, 0x10, + 0x4B, 0x06, 0x46, 0x2E, 0x00, 0x00 }, + // PLUGIN_INFOxMANAGER + { 0xA0, 0xE9, 0x3F, 0x37, 0x4F, 0xE9, + 0xD3, 0x11, 0xBC, 0xD2, 0x00, 0x04, + 0xAC, 0x96, 0xDD, 0x96, 0x00, 0x00 }, + // PLUGIN_STATUSxMANAGER + { 0x10, 0xCF, 0x40, 0xD1, 0x4F, 0xE9, + 0xD3, 0x11, 0xBC, 0xD2, 0x00, 0x04, + 0xAC, 0x96, 0xDD, 0x96, 0x00, 0x00 }, + // PLUGIN_RANDOM_CHAT + { 0x60, 0xF1, 0xA8, 0x3D, 0x91, 0x49, + 0xD3, 0x11, 0x8D, 0xBE, 0x00, 0x10, + 0x4B, 0x06, 0x46, 0x2E, 0x00, 0x00 }, + // PLUGIN_VIDEO_CHAT + { 0x68, 0x33, 0x01, 0x6B, 0x0B, 0x7D, + 0x36, 0x4B, 0x98, 0x6C, 0x63, 0x72, + 0x01, 0x5E, 0x7C, 0x8E, 0x00, 0x00 }, + // PLUGIN_NULL + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + // PLUGIN_FILE + { 0xF0, 0x2D, 0x12, 0xD9, 0x30, 0x91, + 0xD3, 0x11, 0x8D, 0xD7, 0x00, 0x10, + 0x4B, 0x06, 0x46, 0x2E, 0x00, 0x00 }, + // PLUGIN_CHAT + { 0xBF, 0xF7, 0x20, 0xB2, 0x37, 0x8E, + 0xD4, 0x11, 0xBD, 0x28, 0x00, 0x04, + 0xAC, 0x96, 0xD9, 0x05, 0x00, 0x00 } + }; + +plugin const *ICQClient::plugins = arrPlugins; + +bool operator == (const MessageId &m1, const MessageId &m2) +{ + return ((m1.id_l == m2.id_l) && (m1.id_h == m2.id_h)); +} +/* +#ifndef NO_MOC_INCLUDES +#include "icqicmb.moc" +#endif +*/ diff --git a/plugins/icq/icqicmb.h b/plugins/icq/icqicmb.h new file mode 100644 index 0000000..f0a08f9 --- /dev/null +++ b/plugins/icq/icqicmb.h @@ -0,0 +1,106 @@ + +#ifndef ICQICMB_H +#define ICQICMB_H + +#include +#include +#include "snac.h" +#include "message.h" + +class ICQBuffer; +class ICQClientSocket; +class DirectSocket; +class TlvList; +class QTimer; + +struct ICQUserData; + + +struct MessageId +{ + unsigned long id_l; + unsigned long id_h; + MessageId() : id_l(0), id_h(0) {} +}; + +bool operator == (const MessageId &m1, const MessageId &m2); +namespace SIM +{ + class Message; +} + +struct SendMsg +{ + QString screen; + MessageId id; + SIM::Message *msg; + QString text; + QString part; + unsigned flags; + DirectSocket *socket; + SendMsg() : msg(NULL), socket(NULL) {} +}; + +typedef unsigned char plugin[0x12]; + +class SnacIcqICBM : public QObject, public SnacHandler +{ + Q_OBJECT +public: + SnacIcqICBM(ICQClient* client); + virtual ~SnacIcqICBM(); + + virtual bool process(unsigned short subtype, ICQBuffer* buf, unsigned short seq); + void rightsRequest(); + void sendICMB(unsigned short channel, unsigned long flags); + void sendThroughServer(const QString &screen, unsigned short channel, ICQBuffer &b, const MessageId &id, bool bOffline, bool bReqAck); + void sendType2(const QString &screen, ICQBuffer &msgBuf, const MessageId &id, unsigned cap, bool bOffline, unsigned short port, TlvList *tlvs = NULL, unsigned short type = 1); + bool ackMessage(SIM::Message *msg, unsigned short ackFlags, const QByteArray &msg_str); + void sendType1(const QString &text, bool bWide, ICQUserData *data); + void sendAdvMessage(const QString &screen, ICQBuffer &msgText, unsigned plugin_index, + const MessageId &id, bool bOffline, bool bDirect, unsigned short cookie1 = 0, + unsigned short cookie2 = 0, unsigned short type = 1); + void ackMessage(SendMsg &s); + bool sendThruServer(SIM::Message *msg, void *_data); + void clearMsgQueue(); + void sendFile(TlvList& tlv, unsigned long primary_ip, unsigned long secondary_ip, unsigned short port,const QString &screen, MessageId const& id); + void sendAutoReply(const QString &screen, MessageId id, + const plugin p, unsigned short cookie1, unsigned short cookie2, + unsigned short msgType, char msgFlags, unsigned short msgState, + const QString &response, unsigned short response_type, ICQBuffer ©); + void sendMTN(const QString &screen, unsigned short type); + void accept(SIM::Message *msg, ICQUserData *data); + void accept(SIM::Message *msg, const QString &dir, SIM::OverwriteMode overwrite); + void decline(SIM::Message *msg, const QString &reason); + void requestReverseConnection(const QString &screen, DirectSocket *socket); + void parseAdvancedMessage(const QString &screen, ICQBuffer &m, bool needAck, MessageId id); + bool processMsg(); + bool cancelMessage(SIM::Message* msg); + void sendSMS(SendMsg msg); + void pluginInfoRequest(unsigned long, unsigned plugin_index); + + QTimer* getSendTimer() { return m_sendTimer; } + +public slots: + void processSendQueue(); + +protected: + virtual ICQClientSocket *socket(); + +protected slots: + void sendTimeout(); + +private: + QTimer *m_sendTimer; + SendMsg m_send; + std::list sendFgQueue; + std::list sendBgQueue; + std::list replyQueue; + std::list smsQueue; + + friend class SMSRequest; + friend class ICQClient; +}; + +#endif + diff --git a/plugins/icq/icqinfo.cpp b/plugins/icq/icqinfo.cpp new file mode 100644 index 0000000..3a9fe32 --- /dev/null +++ b/plugins/icq/icqinfo.cpp @@ -0,0 +1,275 @@ +/*************************************************************************** + icqinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "icqinfo.h" +#include "icqclient.h" +#include "simgui/ballonmsg.h" +#include "contacts/contact.h" + +#include +#include +#include +#include +#include +#include + +using namespace SIM; + +const ext_info chat_groups[] = + { + { I18N_NOOP("General chat"), 1 }, + { I18N_NOOP("Romance"), 2 }, + { I18N_NOOP("Games"), 3 }, + { I18N_NOOP("Students"), 4 }, + { I18N_NOOP("20 Something"), 5 }, + { I18N_NOOP("30 Something"), 6 }, + { I18N_NOOP("40 Something"), 7 }, + { I18N_NOOP("50 Plus"), 8 }, + { I18N_NOOP("Seeking Women"), 9 }, + { I18N_NOOP("Seeking Men"), 10 }, + { "", 0 } + }; + +const ext_info *p_chat_groups = chat_groups; + +ICQInfo::ICQInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client) : QWidget(parent) +{ + setupUi(this); + m_client = client; + m_data = data; + m_contact = contact; + edtUin->setReadOnly(true); + if (m_data){ + edtFirst->setReadOnly(true); + edtLast->setReadOnly(true); + edtNick->setReadOnly(true); + edtAutoReply->setReadOnly(true); + lblRandom->hide(); + cmbRandom->hide(); + tabWnd->removeTab(tabWnd->indexOf(password)); + }else{ + edtAutoReply->hide(); + connect(this, SIGNAL(raise(QWidget*)), topLevelWidget(), SLOT(raisePage(QWidget*))); + } + edtOnline->setReadOnly(true); + edtNA->setReadOnly(true); + edtExtIP->setReadOnly(true); + edtIntIP->setReadOnly(true); + edtClient->setReadOnly(true); + fill(); +} + +void ICQInfo::apply() +{ + ICQUserData *data = m_data; + if (data == NULL){ + if (m_client->getState() == Client::Connected){ + QString errMsg; + QWidget *errWidget = edtCurrent; + if (!edtPswd1->text().isEmpty() || !edtPswd2->text().isEmpty()){ + if (edtCurrent->text().isEmpty()){ + errMsg = i18n("Input current password"); + }else{ + if (edtPswd1->text() != edtPswd2->text()){ + errMsg = i18n("Confirm password does not match"); + errWidget = edtPswd2; + }else if (edtCurrent->text() != m_client->getPassword()){ + errMsg = i18n("Invalid password"); + } + } + } + if (!errMsg.isEmpty()){ + for (QWidget *p = parentWidget(); p; p = p->parentWidget()){ + if (p->inherits("QTabWidget")){ + static_cast(p)->setCurrentWidget(this); + break; + } + } + emit raise(this); + BalloonMsg::message(errMsg, errWidget); + return; + } + if (!edtPswd1->text().isEmpty()) + m_client->changePassword(edtPswd1->text()); + // clear Textboxes + edtCurrent->clear(); + edtPswd1->clear(); + edtPswd2->clear(); + } + m_data = &m_client->data.owner; + m_client->setRandomChatGroup(getComboValue(cmbRandom, chat_groups)); + } +} + +void ICQInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->FirstName.str() = edtFirst->text(); + data->LastName.str() = edtLast->text(); + data->Nick.str() = edtNick->text(); +} + +bool ICQInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } else + if ((e->type() == eEventMessageReceived) && m_data){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->type() == MessageStatus){ + if (m_client->dataName(m_data) == msg->client()) + fill(); + } + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +void ICQInfo::fill() +{ + ICQUserData *data = m_data; + if (data == NULL) data = &m_client->data.owner; + + edtUin->setText(QString::number(data->Uin.toULong())); + edtFirst->setText(data->FirstName.str()); + edtLast->setText(data->LastName.str()); + edtNick->setText(data->Nick.str()); + + if (m_data == NULL){ + if (edtFirst->text().isEmpty()) { + QString firstName = getContacts()->owner()->getFirstName(); + firstName = getToken(firstName, '/'); + edtFirst->setText(firstName); + } + if (edtLast->text().isEmpty()) { + QString lastName = getContacts()->owner()->getLastName(); + lastName = getToken(lastName, '/'); + edtLast->setText(lastName); + } + password->setEnabled(m_client->getState() == Client::Connected); + } + + cmbStatus->clear(); + unsigned status = STATUS_ONLINE; + if (m_data){ + unsigned s = m_data->Status.toULong(); + if (s == ICQ_STATUS_OFFLINE){ + status = STATUS_OFFLINE; + }else if (s & ICQ_STATUS_DND){ + status = STATUS_DND; + }else if (s & ICQ_STATUS_OCCUPIED){ + status = STATUS_OCCUPIED; + }else if (s & ICQ_STATUS_NA){ + status = STATUS_NA; + }else if (s & ICQ_STATUS_AWAY){ + status = STATUS_AWAY; + }else if (s & ICQ_STATUS_FFC){ + status = STATUS_FFC; + } + }else{ + status = m_client->getStatus(); + initCombo(cmbRandom, m_client->getRandomChatGroup(), chat_groups); + } + if ((status != STATUS_ONLINE) && (status != STATUS_OFFLINE) && m_data){ + edtAutoReply->setPlainText(m_data->AutoReply.str()); + }else{ + edtAutoReply->hide(); + } + + int current = 0; + QString text; + if (m_data && (status == STATUS_OFFLINE) && m_data->bInvisible.toBool()){ + cmbStatus->addItem(Pict("ICQ_invisible"), i18n("Possibly invisible")); + }else{ + ProtocolPtr proto = ICQPlugin::icq_plugin->m_icq; + ICQProtocol* icq = static_cast(proto.data()); + for (const CommandDef *cmd = icq->statusList(); cmd->id; cmd++){ + if (cmd->flags & COMMAND_CHECK_STATE) + continue; + if (status == cmd->id){ + current = cmbStatus->count(); + text = cmd->text; + } + cmbStatus->addItem(Pict(cmd->icon), i18n(cmd->text)); + } + } + cmbStatus->setCurrentIndex(current); + disableWidget(cmbStatus); + if (status == STATUS_OFFLINE){ + lblOnline->setText(i18n("Last online") + ':'); + edtOnline->setText(formatDateTime(data->StatusTime.toULong())); + lblNA->hide(); + edtNA->hide(); + }else{ + if (data->OnlineTime.toULong()){ + edtOnline->setText(formatDateTime(data->OnlineTime.toULong())); + }else{ + lblOnline->hide(); + edtOnline->hide(); + } + if ((status == STATUS_ONLINE) || text.isEmpty()){ + lblNA->hide(); + edtNA->hide(); + }else{ + lblNA->setText(i18n(text)); + edtNA->setText(formatDateTime(data->StatusTime.toULong())); + } + } + if (data->IP.ip()){ + edtExtIP->setText(formatAddr(data->IP, data->Port.toULong())); + }else{ + lblExtIP->hide(); + edtExtIP->hide(); + } + if ((data->RealIP.ip()) && ((data->IP.ip() == NULL) || (get_ip(data->IP) != get_ip(data->RealIP)))){ + edtIntIP->setText(formatAddr(data->RealIP, data->Port.toULong())); + }else{ + lblIntIP->hide(); + edtIntIP->hide(); + } + if (m_data){ + QString client_name = m_client->clientName(data); + if (client_name.length()){ + edtClient->setText(client_name); + }else{ + lblClient->hide(); + edtClient->hide(); + } + }else{ + QString name = PACKAGE; + name += ' '; + name += VERSION; +#ifdef WIN32 + name += "/win32"; +#endif + edtClient->setText(name); + } +} + diff --git a/plugins/icq/icqinfo.h b/plugins/icq/icqinfo.h new file mode 100644 index 0000000..ae3622a --- /dev/null +++ b/plugins/icq/icqinfo.h @@ -0,0 +1,46 @@ +/*************************************************************************** + icqinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICQINFO_H +#define _ICQINFO_H + +#include "ui_icqinfobase.h" +#include "event.h" + +class ICQClient; +struct ICQUserData; + +class ICQInfo : public QWidget, public Ui::MainInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + ICQInfo(QWidget *parent, ICQUserData*, unsigned contact, ICQClient *client); +signals: + void raise(QWidget*); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + ICQUserData *m_data; + unsigned m_contact; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/icqinfobase.ui b/plugins/icq/icqinfobase.ui new file mode 100644 index 0000000..fd7579f --- /dev/null +++ b/plugins/icq/icqinfobase.ui @@ -0,0 +1,841 @@ + + + MainInfo + + + + 0 + 0 + 390 + 337 + + + + Form5 + + + + 6 + + + 11 + + + + + 1 + + + + &Names + + + + 11 + + + 6 + + + + + + + + Last Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + + 75 + true + + + + Uin: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Nick: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 255 + 255 + 255 + + + + + + + 223 + 223 + 223 + + + + + + + 96 + 96 + 96 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + + + 0 + 0 + 0 + + + + + + + 192 + 192 + 192 + + + + + + + 255 + 255 + 255 + + + + + + + 220 + 220 + 220 + + + + + + + 96 + 96 + 96 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 192 + 192 + 192 + + + + + + + 255 + 255 + 255 + + + + + + + 220 + 220 + 220 + + + + + + + 96 + 96 + 96 + + + + + + + 128 + 128 + 128 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 192 + 192 + 192 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + 6 + + + 0 + + + + + + 75 + true + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + First Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 0 + 0 + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Random chat group: + + + false + + + + + + + + + + + &Status + + + + 11 + + + 6 + + + + + Status: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Online: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + + External IP: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Internal IP: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Client: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + &Password + + + + 11 + + + 6 + + + + + New password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + QLineEdit::Password + + + + + + + QLineEdit::Password + + + + + + + Retype new password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Current password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + QLineEdit::Password + + + + + + + + + + + tabWnd + edtUin + edtFirst + edtLast + edtNick + cmbRandom + cmbStatus + edtOnline + edtNA + edtExtIP + edtIntIP + edtClient + + + + diff --git a/plugins/icq/icqlists.cpp b/plugins/icq/icqlists.cpp new file mode 100644 index 0000000..abb1f9e --- /dev/null +++ b/plugins/icq/icqlists.cpp @@ -0,0 +1,1812 @@ +/*************************************************************************** + icqlists.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icqclient.h" +#include "icqmessage.h" +#include "core_events.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +#ifndef WIN32 +#include +#else +#include // htons +#endif +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "log.h" + +using namespace std; +using namespace SIM; + +const unsigned short ICQ_SNACxLISTS_ERROR = 0x0001; +const unsigned short ICQ_SNACxLISTS_REQxRIGHTS = 0x0002; +const unsigned short ICQ_SNACxLISTS_RIGHTS = 0x0003; +const unsigned short ICQ_SNACxLISTS_REQxROSTER = 0x0005; +const unsigned short ICQ_SNACxLISTS_ROSTER = 0x0006; +const unsigned short ICQ_SNACxLISTS_ACTIVATE = 0x0007; +const unsigned short ICQ_SNACxLISTS_CREATE = 0x0008; +const unsigned short ICQ_SNACxLISTS_UPDATE = 0x0009; +const unsigned short ICQ_SNACxLISTS_DELETE = 0x000A; +const unsigned short ICQ_SNACxLISTS_DONE = 0x000E; +const unsigned short ICQ_SNACxLISTS_ROSTERxOK = 0x000F; +const unsigned short ICQ_SNACxLISTS_EDIT = 0x0011; +const unsigned short ICQ_SNACxLISTS_SAVE = 0x0012; +const unsigned short ICQ_SNACxLISTS_FUTURE_AUTH = 0x0014; +const unsigned short ICQ_SNACxLISTS_FUTURE_GRANT = 0x0015; +const unsigned short ICQ_SNACxLISTS_REQUEST_AUTH = 0x0018; +const unsigned short ICQ_SNACxLISTS_AUTHxREQUEST = 0x0019; +const unsigned short ICQ_SNACxLISTS_AUTHxSEND = 0x001A; +const unsigned short ICQ_SNACxLISTS_AUTH = 0x001B; +const unsigned short ICQ_SNACxLISTS_ADDED = 0x001C; + +const unsigned short ICQ_USER = 0x0000; +const unsigned short ICQ_GROUPS = 0x0001; +const unsigned short ICQ_VISIBLE_LIST = 0x0002; +const unsigned short ICQ_INVISIBLE_LIST = 0x0003; +const unsigned short ICQ_INVISIBLE_STATE = 0x0004; +const unsigned short ICQ_PRESENCE_INFO = 0x0005; +const unsigned short ICQ_SHORTCUT_BAR = 0x0009; +const unsigned short ICQ_IGNORE_LIST = 0x000E; +const unsigned short ICQ_LAST_UPDATE = 0x000F; +const unsigned short ICQ_NON_IM = 0x0010; +const unsigned short ICQ_UNKNOWN = 0x0011; +const unsigned short ICQ_IMPORT_TIME = 0x0013; +const unsigned short ICQ_BUDDY_CHECKSUM = 0x0014; +const unsigned short ICQ_UNKNOWN2 = 0x0019; +const unsigned short ICQ_UNKNOWN3 = 0x001A; +const unsigned short ICQ_AWAITING_AUTH = 0x001B; + +const unsigned short TLV_WAIT_AUTH = 0x0066; +const unsigned short TLV_UNKNOWN2 = 0x006d; +const unsigned short TLV_UNKNOWN3 = 0x006e; +const unsigned short TLV_SUBITEMS = 0x00C8; +const unsigned short TLV_SHORTCUT_BAR = 0x00cd; +const unsigned short TLV_TIME = 0x00D4; +const unsigned short TLV_BUDDYHASH = 0x00D5; +const unsigned short TLV_ALIAS = 0x0131; +const unsigned short TLV_CELLULAR = 0x013A; +const unsigned short TLV_UNKNOWN4 = 0x015c; +const unsigned short TLV_UNKNOWN5 = 0x015d; + +const unsigned LIST_REQUEST_TIMEOUT = 50; + +class ListServerRequest +{ +public: + ListServerRequest(unsigned short seq) : m_seq(seq), m_time(QDateTime::currentDateTime()) {} + virtual ~ListServerRequest() {}; + + virtual void process(ICQClient *client, unsigned short res) + { + Q_UNUSED(res); + if(client->isSSITransaction()) + { + client->snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_SAVE, true, false); + client->sendPacket(true); + } + } + + unsigned short seq() const { return m_seq; } + QDateTime getTime() const { return m_time; } +protected: + unsigned short m_seq; + QDateTime m_time; +}; + +class GroupServerRequest : public ListServerRequest +{ +public: + GroupServerRequest(unsigned short seq, unsigned long id, unsigned short icq_id, const QString &name); + virtual void process(ICQClient *client, unsigned short res); +protected: + unsigned long m_id; + unsigned short m_icqId; + QString m_name; +}; + +class ContactServerRequest : public ListServerRequest +{ +public: + ContactServerRequest(unsigned short seq, const QString &screen, + unsigned short icq_id, unsigned short grp_id, TlvList *tlv = NULL); + ~ContactServerRequest(); + virtual void process(ICQClient *client, unsigned short res); +protected: + QString m_screen; + unsigned short m_icqId; + unsigned short m_grpId; + TlvList *m_tlv; +}; + +class SetListRequest : public ListServerRequest +{ +public: + SetListRequest(unsigned short seq, const QString &screen, + unsigned short icq_id, unsigned short type); + virtual void process(ICQClient *client, unsigned short res); +protected: + QString m_screen; + unsigned short m_icqId; + unsigned short m_type; +}; + +class SetBuddyRequest : public ListServerRequest +{ +public: + SetBuddyRequest(unsigned short seq, const ICQUserData *icqUserData); + virtual void process(ICQClient *client, unsigned short res); +protected: + const ICQUserData *m_icqUserData; +}; + +static char PLEASE_UPGRADE[] = "PleaseUpgrade"; + +void ICQClient::parseRosterItem(unsigned short type, + const QString &str, + unsigned short grp_id, + unsigned short id, + TlvList *inf, + bool &bIgnoreTime) +{ + int seq; + + switch (type){ + case ICQ_USER: { + if (str.length()){ + if (str.startsWith(PLEASE_UPGRADE)){ + log(L_DEBUG, "Upgrade warning"); + return; + } + log(L_DEBUG, "User %s", qPrintable(str)); + // check for own uin in contact list + if (!m_bAIM && (str.toULong() == getUin())) { + log(L_DEBUG, "Own UIN in contact list - removing!"); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, QString::null, grp_id, id); + m_listRequest = new ContactServerRequest(seq, QString::number(id), 0, 0); + break; + } + ListRequest *lr = findContactListRequest(str); + if (lr){ + log(L_DEBUG, "Request found"); + lr->icq_id = id; + lr->grp_id = grp_id; + Contact *contact; + ICQUserData *data = findContact(lr->screen, NULL, false, contact); + if (data){ + data->IcqID.asULong() = id; + data->GrpId.asULong() = grp_id; + } + }else{ + bool bChanged = false; + QString alias; + Tlv *tlv_name = inf ? (*inf)(TLV_ALIAS) : NULL; + if (tlv_name) + alias = QString::fromUtf8(*tlv_name); + log(L_DEBUG, "User %s [%s] id %u - group %u", qPrintable(str), qPrintable(alias), id, grp_id); + Contact *contact; + Group *grp = NULL; + ICQUserData *data = findGroup(grp_id, NULL, grp); + data = findContact(str, &alias, true, contact, grp); + if(data) + { + Tlv* unknown2 = inf ? (*inf)(TLV_UNKNOWN2) : NULL; + if(unknown2) + { + data->unknown2.setBinary(unknown2->byteArray()); + } + Tlv* unknown4 = inf ? (*inf)(TLV_UNKNOWN4) : NULL; + if(unknown4) + { + data->unknown4.setBinary(unknown4->byteArray()); + } + Tlv* unknown5 = inf ? (*inf)(TLV_UNKNOWN5) : NULL; + if(unknown5) + { + data->unknown5.setBinary(unknown5->byteArray()); + } + } + if (inf && (*inf)(TLV_WAIT_AUTH)){ + if (!data->WaitAuth.toBool()){ + data->WaitAuth.asBool() = true; + bChanged = true; + } + } else { + /* if not TLV(WAIT_AUTH) we are authorized ... */ + if (inf && !(*inf)(TLV_WAIT_AUTH)) { + if (data->WaitAuth.toBool()){ + data->WaitAuth.asBool() = false; + bChanged = true; + } + } + } + data->IcqID.asULong() = id; + data->GrpId.asULong() = grp_id; + Tlv *tlv_phone = inf ? (*inf)(TLV_CELLULAR) : NULL; + if (tlv_phone){ + data->Cellular.str() = QString::fromUtf8(*tlv_phone); + QString phone = trimPhone(data->Cellular.str()); + QString phone_str = quoteChars(phone, ","); + phone_str += ",Private Cellular,"; + phone_str += QString::number(CELLULAR); + bChanged |= contact->setPhones(phone_str, NULL); + }else{ + data->Cellular.clear(); + } + if (bChanged){ + EventContact e(contact, EventContact::eChanged); + e.process(); + } + if ((data->InfoFetchTime.toULong() == 0) && data->Uin.toULong()) + addFullInfoRequest(data->Uin.toULong()); + } + }else{ + bIgnoreTime = true; + } + break; + } + case ICQ_GROUPS:{ + if (str.isEmpty()) + break; + log(L_DEBUG, "group %s %u", qPrintable(str), grp_id); + ListRequest *lr = findGroupListRequest(grp_id); + if (lr) + break; + Group *grp; + ICQUserData *data = findGroup(grp_id, &str, grp); + if (data->IcqID.toULong()){ + lr = findGroupListRequest((unsigned short)(data->IcqID.toULong())); + if (lr) + removeListRequest(lr); + } + data->IcqID.asULong() = grp_id; + data->bChecked.asBool() = true; + if (grp->getName() != str){ + grp->setName(str); + EventGroup e(grp, EventGroup::eChanged); + e.process(); + } + break; + } + case ICQ_VISIBLE_LIST:{ + if (str.length()){ + log(L_DEBUG, "Visible %s", qPrintable(str)); + ListRequest *lr = findContactListRequest(str); + if (lr) + lr->visible_id = id; + if ((lr == NULL) || (lr->type != LIST_USER_DELETED)){ + Contact *contact; + ICQUserData *data = findContact(str, NULL, true, contact); + data->ContactVisibleId.asULong() = id; + if ((lr == NULL) && (data->VisibleId.toULong() != id)){ + data->VisibleId.asULong() = id; + EventContact e(contact, EventContact::eChanged); + e.process(); + } + if ((data->InfoFetchTime.toULong() == 0) && data->Uin.toULong()) + addFullInfoRequest(data->Uin.toULong()); + } + } + break; + } + case ICQ_INVISIBLE_LIST:{ + if (str.length()){ + log(L_DEBUG, "Invisible %s", qPrintable(str)); + ListRequest *lr = findContactListRequest(str); + if (lr) + lr->invisible_id = id; + if ((lr == NULL) || (lr->type != LIST_USER_DELETED)){ + Contact *contact; + ICQUserData *data = findContact(str, NULL, true, contact); + data->ContactInvisibleId.asULong() = id; + if ((lr == NULL) && (data->InvisibleId.toULong() != id)){ + data->InvisibleId.asULong() = id; + EventContact e(contact, EventContact::eChanged); + e.process(); + } + if ((data->InfoFetchTime.toULong() == 0) && data->Uin.toULong()) + addFullInfoRequest(data->Uin.toULong()); + } + } + break; + } + case ICQ_IGNORE_LIST:{ + if (str.length()){ + log(L_DEBUG, "Ignore %s", qPrintable(str)); + ListRequest *lr = findContactListRequest(str); + if (lr) + lr->ignore_id = id; + Contact *contact; + ICQUserData *data = findContact(str, NULL, true, contact); + if (data->IgnoreId.toULong() != id){ + data->IgnoreId.asULong() = id; + if (lr == NULL){ + contact->setIgnore(true); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + } + } + break; + } + case ICQ_INVISIBLE_STATE: + setContactsInvisible(id); + break; + case ICQ_PRESENCE_INFO: + break; + case ICQ_BUDDY_CHECKSUM: { + if (str.length()){ + Tlv *tlv_buddyHash = inf ? (*inf)(TLV_BUDDYHASH) : NULL; + if(tlv_buddyHash) { + const QByteArray &ba = data.owner.buddyHash.toBinary(); + unsigned char flag, size; + QByteArray buddyHash; + + flag = tlv_buddyHash->Data()[0]; + size = tlv_buddyHash->Data()[1]; + buddyHash.resize(size); + memcpy(buddyHash.data(), &tlv_buddyHash->Data()[2], size); + + if(ba != buddyHash) { + data.owner.buddyHash.asBinary() = buddyHash; + data.owner.buddyID.asULong() = flag; + } + data.owner.buddyRosterID.asULong() = id; + } + } + break; + } + case ICQ_LAST_UPDATE: + case ICQ_UNKNOWN: + break; + case ICQ_UNKNOWN3: + if(inf) { + Tlv *tlv_uk3 = NULL; + tlv_uk3 = (*inf)(TLV_UNKNOWN3); + } + break; + case ICQ_SHORTCUT_BAR: + if(inf) { + Tlv *tlv_sc = NULL; + tlv_sc = (*inf)(TLV_SHORTCUT_BAR); + } + break; + case ICQ_UNKNOWN2: + if(inf) { + Tlv *tlv_uk2 = NULL; + tlv_uk2 = (*inf)(TLV_UNKNOWN2); + } + break; + case ICQ_NON_IM: { + Tlv *tlv_name = NULL; + Tlv *tlv_phone = NULL; + QString alias; + QString phone; + + if (inf) { + tlv_name = (*inf)(TLV_ALIAS); + if (tlv_name) + alias = (char*)(*tlv_name); + tlv_phone = (*inf)(TLV_CELLULAR); + if (tlv_phone){ + phone = (char*)(*tlv_phone); + } + log (L_DEBUG,"External Contact: %s Phone: %s", + qPrintable(alias), + qPrintable(phone)); + } + break; + } + case ICQ_IMPORT_TIME:{ + Tlv *tlv_time = NULL; + QDateTime qt_time; + + if (inf) { + tlv_time = (*inf)(TLV_TIME); + qt_time.setTime_t((uint32_t)(*tlv_time)); + log (L_DEBUG, "Import Time %s",qPrintable(qt_time.toString())); + } + break; + } + case ICQ_AWAITING_AUTH: { + Contact *contact; + if (str.length()){ + log(L_DEBUG, "%s is awaiting auth", qPrintable(str)); + ICQUserData *data; + if ((data = findContact(str, NULL, false, contact)) != NULL) { + addFullInfoRequest(str.toULong()); + data->WantAuth.asBool() = true; + } else { + log(L_DEBUG, "not in contact list, skipped"); + } + } + break; + } + default: + log(L_WARN,"Unknown roster type %04X", type); + } +} + +void ICQClient::snac_lists(unsigned short type, unsigned short seq) +{ + switch (type){ + case ICQ_SNACxLISTS_ERROR: + break; + case ICQ_SNACxLISTS_RIGHTS: + log(L_DEBUG, "List rights"); + break; + case ICQ_SNACxLISTS_EDIT: { + log(L_DEBUG, "Server begins SSI transaction"); + break; + } + case ICQ_SNACxLISTS_SAVE: { + log(L_DEBUG, "Server ends SSI transaction"); + break; + } + case ICQ_SNACxLISTS_CREATE: { + log(L_DEBUG, "Server adds new item"); + break; + } + case ICQ_SNACxLISTS_UPDATE: { + QString name; + unsigned short id, grp_id, type, len; + bool tmp; + + socket()->readBuffer().unpackStr(name); + socket()->readBuffer() >> grp_id >> id >> type >> len; + TlvList *inf = NULL; + if (len){ + ICQBuffer b(len); + b.pack(socket()->readBuffer().data(socket()->readBuffer().readPos()), len); + socket()->readBuffer().incReadPos(len); + inf = new TlvList(b); + } + log(L_DEBUG, "Server updates item: group_id = %d; id = %d", grp_id, id); + parseRosterItem(type,name,grp_id,id,inf,tmp); + delete inf; + break; + } + case ICQ_SNACxLISTS_DELETE: { + log(L_DEBUG, "Server deletes item"); + break; + } + case ICQ_SNACxLISTS_ROSTER:{ + char c; + unsigned short list_len; + log(L_DEBUG,"Rosters"); + socket()->readBuffer() >> c; + if (c){ + log(L_WARN, "Unknown SSI-Version 0x%02X", c); + break; + } + bool bIgnoreTime = false; + if (!m_bRosters){ + m_bRosters = true; + m_bJoin = false; + setContactsInvisible(0); + Group *grp; + ContactList::GroupIterator it_g; + while ((grp = ++it_g) != NULL){ + ICQUserData *data; + ClientDataIterator it(grp->clientData, this); + while ((data = toICQUserData(++it)) != NULL){ + if (data->IcqID.toULong() == 0){ + data->bChecked.asBool() = true; + continue; + } + data->bChecked.asBool() = false; + } + } + Contact *contact; + ContactList::ContactIterator it_c; + while ((contact = ++it_c) != NULL){ + ICQUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toICQUserData(++it)) != NULL){ + data->bChecked.asBool() = false; + data->GrpId.asULong() = 0; + data->IgnoreId.asULong() = 0; + data->VisibleId.asULong() = 0; + data->InvisibleId.asULong() = 0; + } + } + } + socket()->readBuffer() >> list_len; + for (unsigned i = 0; i < list_len; i++){ + QString name; + unsigned short id, grp_id, type, len; + socket()->readBuffer().unpackStr(name); + socket()->readBuffer() >> grp_id >> id >> type >> len; + TlvList *inf = NULL; + if (len){ + ICQBuffer b(len); + b.pack(socket()->readBuffer().data(socket()->readBuffer().readPos()), len); + socket()->readBuffer().incReadPos(len); + inf = new TlvList(b); + } + parseRosterItem(type, name, grp_id, id, inf, bIgnoreTime); + delete inf; + } + unsigned long time; + socket()->readBuffer() >> time; + if ((time == 0) && list_len && !bIgnoreTime) + break; + setContactsTime(time); + Group *grp; + ContactList::GroupIterator it_g; + list forRemove; + while ((grp = ++it_g) != NULL){ + ICQUserData *data = toICQUserData((SIM::clientData*)grp->clientData.getData(this)); // FIXME unsafe type conversion + QString n; + if (grp->id()) + n = grp->getName(); + log(L_DEBUG, "Check %ld %s %p %u", grp->id(), qPrintable(n), data, data ? data->bChecked.toBool() : 0); + if ((data == NULL) || data->bChecked.toBool()) + continue; + ListRequest *lr = findGroupListRequest((unsigned short)(data->IcqID.toULong())); + if (lr) + continue; + forRemove.push_back(grp); + } + for (list::iterator it = forRemove.begin(); it != forRemove.end(); ++it){ + delete *it; + } + + Contact *contact; + ContactList::ContactIterator it_c; + while ((contact = ++it_c) != NULL){ + ICQUserData *data; + SIM::clientData * client_data; + ClientDataIterator it_d(contact->clientData); + bool bOther = (contact->clientData.size() == 0); + bool bMy = false; + unsigned long newGroup = 0; + while ((client_data = ++it_d) != NULL){ + if (it_d.client() != this){ + bOther = true; + continue; + } + data=toICQUserData(client_data); // Will get here only when client is our's so feel free to converse + unsigned grpId = data->GrpId.toULong(); + ContactList::GroupIterator it_g; + while ((grp = ++it_g) != NULL){ + ICQUserData *data = toICQUserData((SIM::clientData*)grp->clientData.getData(this)); // FIXME unsafe type conversion + if (data && (data->IcqID.toULong() == grpId)) + break; + } + if (grp) + newGroup = grp->id(); + bMy = true; + } + if ((int)newGroup != contact->getGroup()){ + if ((newGroup == 0) && bOther){ + if (bMy) + addContactRequest(contact); + }else{ + contact->setGroup(newGroup); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + } + } + } + getContacts()->save(); + if (m_bJoin){ + EventJoinAlert(this).process(); + m_bJoin = false; + } + case ICQ_SNACxLISTS_ROSTERxOK: // FALLTHROUGH + { + log(L_DEBUG, "Rosters OK"); + QTimer::singleShot(PING_TIMEOUT * 1000, this, SLOT(ping())); + setPreviousPassword(QString::null); + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_ACTIVATE, true, false); + sendPacket(true); + if (m_bAIM){ + Group *grp; + ContactList::GroupIterator it; + while ((grp = ++it) != NULL){ + if (grp->id()) + break; + } + if (grp == NULL){ + grp = getContacts()->group(0, true); + grp->setName("General"); + EventGroup e(grp, EventGroup::eChanged); + e.process(); + } + data.owner.OnlineTime.asULong() = QDateTime::currentDateTime().toTime_t(); + if (m_logonStatus == STATUS_ONLINE){ + m_status = STATUS_ONLINE; + sendCapability(); + snacICBM()->sendICMB(1, 11); + snacICBM()->sendICMB(2, 3); + snacICBM()->sendICMB(4, 3); + fetchProfiles(); + }else{ + m_status = STATUS_AWAY; + + ar_request req; + req.bDirect = false; + arRequests.push_back(req); + + ARRequest ar; + ar.contact = NULL; + ar.param = &arRequests.back(); + ar.receiver = this; + ar.status = m_logonStatus; + EventARRequest(&ar).process(); + } + m_snacService->sendClientReady(); + setState(Connected); + m_bReady = true; + snacICBM()->processSendQueue(); + break; + } + sendCapability(); + // 0x070b will send html text. + // Probably, later we can use it. + snacICBM()->sendICMB(0, 0x000b); + snacService()->sendLogonStatus(); + snacService()->sendClientReady(); + sendMessageRequest(); + + setState(Connected); + fetchProfiles(); + break; + } + case ICQ_SNACxLISTS_ADDED:{ + QString screen = socket()->readBuffer().unpackScreen(); + messageReceived(new AuthMessage(MessageAdded), screen); + break; + } + case ICQ_SNACxLISTS_AUTHxREQUEST:{ + QString screen = socket()->readBuffer().unpackScreen(); + QByteArray message; + QByteArray charset; + unsigned short have_charset; + socket()->readBuffer().unpackStr(message); + socket()->readBuffer() >> have_charset; + if (have_charset){ + socket()->readBuffer().incReadPos(2); + socket()->readBuffer().unpackStr(charset); + } + log(L_DEBUG, "Auth request %s", qPrintable(screen)); + Message *m = NULL; + if (charset.isEmpty()){ + AuthMessage *msg = new AuthMessage(MessageAuthRequest); + msg->setText(QString::fromUtf8(message)); + m = msg; + }else{ + ICQAuthMessage *msg = new ICQAuthMessage(MessageICQAuthRequest, MessageAuthRequest); + msg->setServerText(message); + msg->setCharset(charset); + m = msg; + } + messageReceived(m, screen); + Contact *contact; + ICQUserData *data = findContact(screen, NULL, false, contact); + if (data) + data->WantAuth.asBool() = true; + break; + } + case ICQ_SNACxLISTS_FUTURE_GRANT:{ + /* we treat future grant as normal grant but it isn't the same... + http://iserverd1.khstu.ru/oscar/snac_13_15.html */ + QString screen = socket()->readBuffer().unpackScreen(); + QByteArray message; + Message *m = NULL; + + socket()->readBuffer().unpackStr(message); + AuthMessage *msg = new AuthMessage(MessageAuthGranted); + msg->setText(QString::fromUtf8(message)); // toUnicode ?? + m = msg; + messageReceived(m, screen); + Contact *contact; + ICQUserData *data = findContact(screen, NULL, false, contact); + if (data){ + data->WaitAuth.asBool() = false; + EventContact e(contact, EventContact::eChanged); + e.process(); + addPluginInfoRequest(data->Uin.toULong(), PLUGIN_QUERYxSTATUS); + addPluginInfoRequest(data->Uin.toULong(), PLUGIN_QUERYxINFO); + } + } + case ICQ_SNACxLISTS_AUTH:{ + QString screen = socket()->readBuffer().unpackScreen(); + char auth_ok; + socket()->readBuffer() >> auth_ok; + QByteArray message; + QByteArray charset; + unsigned short have_charset; + socket()->readBuffer().unpackStr(message); + socket()->readBuffer() >> have_charset; + if (have_charset){ + socket()->readBuffer().incReadPos(2); + socket()->readBuffer().unpackStr(charset); + } + log(L_DEBUG, "Auth %u %s", auth_ok, qPrintable(screen)); + Message *m = NULL; + if (charset.isEmpty()){ + AuthMessage *msg = new AuthMessage(auth_ok ? MessageAuthGranted : MessageAuthRefused); + msg->setText(QString::fromUtf8(message)); + m = msg; + }else{ + ICQAuthMessage *msg = new ICQAuthMessage(auth_ok ? MessageICQAuthGranted : MessageICQAuthRefused, auth_ok ? MessageAuthGranted : MessageAuthRefused); + msg->setServerText(message); + msg->setCharset(charset); + m = msg; + } + messageReceived(m, screen); + if (auth_ok){ + Contact *contact; + ICQUserData *data = findContact(screen, NULL, false, contact); + if (data){ + data->WaitAuth.asBool() = false; + EventContact e(contact, EventContact::eChanged); + e.process(); + addPluginInfoRequest(data->Uin.toULong(), PLUGIN_QUERYxSTATUS); + addPluginInfoRequest(data->Uin.toULong(), PLUGIN_QUERYxINFO); + } + } + break; + } + case ICQ_SNACxLISTS_DONE: + if (m_listRequest && m_listRequest->seq() == seq) + { + unsigned short res; + const char *msg; + socket()->readBuffer() >> res; + switch (res) { + case 0x00: + msg = "No errors (success)"; + break; + case 0x02: + msg = "Item you want to modify not found in list"; + break; + case 0x03: + msg = "Item you want to add already exists"; + break; + case 0x0a: + msg = "Error adding item (invalid id, already in list, invalid data)"; + break; + case 0x0c: + msg = "Can't add item. Limit for this type of items exceeded"; + break; + case 0x0d: + msg = "Trying to add ICQ contact to an AIM list"; + break; + case 0x0e: + msg = "Can't add this contact because it requires authorization"; + break; + default: + msg = NULL; + } + if (msg) + log(L_DEBUG, "%s", msg); + else + log(L_DEBUG, "Unknown list request answer %u", res); + m_listRequest->process(this, res); + delete m_listRequest; + m_listRequest = NULL; + snacICBM()->processSendQueue(); + } + break; + default: + log(L_WARN, "Unknown lists foodgroup type %04X", type); + } +} + +void ICQClient::listsRequest() +{ + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_REQxRIGHTS, true, false); + sendPacket(true); + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_REQxROSTER, true, false); + unsigned long contactsTime = getContactsTime(); + unsigned short contactsLength = getContactsLength(); + socket()->writeBuffer() << contactsTime << contactsLength; + sendPacket(true); +} + +void ICQClient::sendInvisible(bool bInvisible) +{ + unsigned short cmd = ICQ_SNACxLISTS_UPDATE; + if (getContactsInvisible() == 0){ + cmd = ICQ_SNACxLISTS_CREATE; + setContactsInvisible((unsigned short)(get_random() & 0x7FFF)); + } + char data = bInvisible ? 4 : 3; + TlvList tlvs; + tlvs += new Tlv(0xCA, 1, &data); + sendRoster(cmd, NULL, 0, getContactsInvisible(), ICQ_INVISIBLE_STATE, &tlvs); +} + +ListRequest *ICQClient::findContactListRequest(const QString &screen) +{ + for (list::iterator it = listRequests.begin(); it != listRequests.end(); ++it){ + if (((it->type == LIST_USER_CHANGED) || (it->type == LIST_USER_DELETED)) && + (it->screen == screen)) + return &(*it); + } + return NULL; +} + +ListRequest *ICQClient::findGroupListRequest(unsigned short id) +{ + for (list::iterator it = listRequests.begin(); it != listRequests.end(); ++it){ + switch (it->type){ + case LIST_GROUP_DELETED: + case LIST_GROUP_CHANGED: + if (it->icq_id == id) + return &(*it); + break; + } + } + return NULL; +} + +void ICQClient::removeListRequest(ListRequest *lr) +{ + for (list::iterator it = listRequests.begin(); it != listRequests.end(); ++it){ + if (&(*it) == lr){ + listRequests.erase(it); + return; + } + } +} + +void ICQClient::clearListServerRequest() +{ + if (m_listRequest){ + delete m_listRequest; + m_listRequest = NULL; + } +} + +//----------------------------------------------------------------------------- + +GroupServerRequest::GroupServerRequest(unsigned short seq, unsigned long id, unsigned short icq_id, const QString &name) + : ListServerRequest(seq), m_id(id), m_icqId(icq_id), m_name(name) +{ +} + +void GroupServerRequest::process(ICQClient *client, unsigned short res) +{ + ListServerRequest::process(client, res); + + ListRequest *lr = client->findGroupListRequest(m_icqId); + if (lr && (lr->type == LIST_GROUP_DELETED)){ + lr->icq_id = 0; + return; + } + Group *group = getContacts()->group(m_id); + if (group == NULL) + return; + ICQUserData *data = client->toICQUserData((SIM::clientData*)group->clientData.getData(client)); // FIXME unsafe type conversion + if (data == NULL) + data = client->toICQUserData((SIM::clientData*)group->clientData.createData(client)); // FIXME unsafe type conversion + data->IcqID.asULong() = m_icqId; + data->Alias.str() = m_name; +} + +//----------------------------------------------------------------------------- + +ContactServerRequest::ContactServerRequest(unsigned short seq, const QString &screen, + unsigned short icq_id, unsigned short grp_id, TlvList *tlv) + : ListServerRequest(seq), m_screen(screen), m_icqId(icq_id), m_grpId(grp_id), m_tlv(tlv) +{ +} + +ContactServerRequest::~ContactServerRequest() +{ + delete m_tlv; +} + +void ContactServerRequest::process(ICQClient *client, unsigned short res) +{ + ListRequest *lr = client->findContactListRequest(m_screen); + if (lr && (lr->type == LIST_USER_DELETED)){ + lr->screen = QString::null; + lr->icq_id = 0; + lr->grp_id = 0; + return; + } + Contact *contact; + ICQUserData *data = client->findContact(m_screen, NULL, true, contact); + if(res == 0x0e) + { + //data->GrpId.setULong(0); + if(data->WaitAuth.toBool()) + { + client->ssiEndTransaction(); + client->ssiStartTransaction(); + TlvList *tlv = client->createListTlv(data, contact); + client->ssiAddBuddy(m_screen, m_grpId, (unsigned short) data->IcqID.toULong(), 0, tlv); + data->WaitAuth.setBool(true); + } + EventContact e(contact, EventContact::eChanged); + e.process(); + client->ssiEndTransaction(); + return; + } + data->IcqID.asULong() = m_icqId; + data->GrpId.asULong() = m_grpId; + if ((data->GrpId.toULong() == 0) && data->WaitAuth.toBool()){ + data->WaitAuth.asBool() = false; + EventContact e(contact, EventContact::eChanged); + e.process(); + } + if (m_tlv){ + Tlv *tlv_alias = (*m_tlv)(TLV_ALIAS); + if (tlv_alias){ + // ok here since Alias is utf8 and TLV_ALIAS too + data->Alias.str() = QString::fromUtf8(*tlv_alias); + }else{ + data->Alias.clear(); + } + Tlv *tlv_cell = (*m_tlv)(TLV_CELLULAR); + if (tlv_cell){ + data->Cellular.str() = QString::fromUtf8(*tlv_cell); + }else{ + data->Cellular.clear(); + } + } + ListServerRequest::process(client, res); +} + +//----------------------------------------------------------------------------- + +SetListRequest::SetListRequest(unsigned short seq, const QString &screen, + unsigned short icq_id, unsigned short type) + : ListServerRequest(seq), m_screen(screen), m_icqId(icq_id), m_type(type) +{ +} + +void SetListRequest::process(ICQClient *client, unsigned short res) +{ + ListServerRequest::process(client, res); + + ListRequest *lr = client->findContactListRequest(m_screen); + if (lr && (lr->type == LIST_USER_DELETED)){ + switch (m_type){ + case ICQ_VISIBLE_LIST: + lr->visible_id = 0; + break; + case ICQ_INVISIBLE_LIST: + lr->invisible_id = 0; + break; + case ICQ_IGNORE_LIST: + lr->ignore_id = 0; + break; + } + return; + } + Contact *contact; + ICQUserData *data = client->findContact(m_screen, NULL, true, contact); + switch (m_type){ + case ICQ_VISIBLE_LIST: + data->ContactVisibleId.asULong() = m_icqId; + break; + case ICQ_INVISIBLE_LIST: + data->ContactInvisibleId.asULong() = m_icqId; + break; + case ICQ_IGNORE_LIST: + data->IgnoreId.asULong() = m_icqId; + break; + } +} + +//----------------------------------------------------------------------------- +SetBuddyRequest::SetBuddyRequest(unsigned short seq, const ICQUserData *icqUserData) + : ListServerRequest(seq), m_icqUserData(icqUserData) +{ +} + +void SetBuddyRequest::process(ICQClient *client, unsigned short res) +{ + ListServerRequest::process(client, res); + + client->listRequests.erase(client->listRequests.begin()); + // item does not exist + if(res == 2) { + ListRequest lr; + lr.type = LIST_BUDDY_CHECKSUM; + lr.icq_id = m_icqUserData->buddyRosterID.toULong(); + lr.icqUserData = m_icqUserData; + client->listRequests.push_back(lr); + client->snacICBM()->processSendQueue(); + } + if(res != 0) + return; +} + +//----------------------------------------------------------------------------- + +unsigned short ICQClient::getListId() +{ + unsigned short id; + for (id = (unsigned short)(get_random() & 0x7FFF) ;; id++){ + id &= 0x7FFF; + if (id == 0) continue; + Group *group; + ContactList::GroupIterator it_grp; + while ((group = ++it_grp) != NULL){ + ICQUserData *data = toICQUserData((SIM::clientData*)group->clientData.getData(this)); // FIXME unsafe type conversion + if (data == NULL) + continue; + if (data->IcqID.toULong() == id) + break; + } + if (group) + continue; + Contact *contact; + ContactList::ContactIterator it_cnt; + while ((contact = ++it_cnt) != NULL){ + ClientDataIterator it(contact->clientData, this); + ICQUserData *data; + while((data = toICQUserData(++it)) != NULL){ + if((data->IcqID.toULong() == id) || (data->IgnoreId.toULong() == id) || + (data->VisibleId.toULong() == id) || (data->InvisibleId.toULong() == id)) + break; + } + if (data) + break; + } + if (contact) + continue; + break; + } + return id; +} + +TlvList *ICQClient::createListTlv(ICQUserData *data, Contact *contact) +{ + TlvList *tlv = new TlvList; //Fixme Leak, warning C6211: Leaking memory 'tlv' due to an exception. Consider using a local catch block to clean up memory: Lines: 1086, 1087, 1088 + QByteArray name = contact->getName().toUtf8(); + *tlv += new Tlv(TLV_ALIAS, (unsigned short)(name.length()), name); + if(data->WaitAuth.toBool()) + *tlv += new Tlv(TLV_WAIT_AUTH, 0, NULL); + QString cell = getUserCellular(contact); + if (cell.length()) + *tlv += new Tlv(TLV_CELLULAR, (unsigned short)(cell.length()), cell.toLatin1()); + if(data->unknown2.asBinary().size() > 0) + *tlv += new Tlv(TLV_UNKNOWN2, data->unknown2.asBinary().size() - 1, data->unknown2.asBinary().data()); + if(data->unknown4.asBinary().size() > 0) + *tlv += new Tlv(TLV_UNKNOWN4, data->unknown4.asBinary().size() - 1, data->unknown4.asBinary().data()); + if(data->unknown5.asBinary().size() > 0) + *tlv += new Tlv(TLV_UNKNOWN5, data->unknown5.asBinary().size() - 1, data->unknown5.asBinary().data()); + return tlv; +} + +void ICQClient::uploadBuddy(const ICQUserData *data) +{ + ListRequest lr; + lr.type = LIST_BUDDY_CHECKSUM; + lr.icq_id = data->buddyRosterID.toULong(); + lr.icqUserData = data; + listRequests.push_back(lr); + snacICBM()->processSendQueue(); +} + +void ICQClient::ssiStartTransaction() +{ + log(L_DEBUG, "ICQClient::ssiStartTransaction"); + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_EDIT, true, false); + sendPacket(true); +} + +void ICQClient::ssiEndTransaction() +{ + log(L_DEBUG, "ICQClient::ssiEndTransaction"); + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_SAVE, true, false); + sendPacket(true); +} + +unsigned short ICQClient::ssiAddBuddy(QString& screen, unsigned short group_id, unsigned short buddy_id, unsigned short buddy_type, TlvList* tlvs) +{ + log(L_DEBUG, "ICQClient::ssiAddBuddy"); + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_CREATE, true, false); + QByteArray utfscreen = screen.toUtf8(); + socket()->writeBuffer() << (unsigned short)utfscreen.length(); + socket()->writeBuffer().pack(utfscreen.data(), utfscreen.length()); + socket()->writeBuffer() << group_id << buddy_id << buddy_type; + if(!tlvs) + socket()->writeBuffer() << (unsigned short) 0x0000; + else + socket()->writeBuffer() << *tlvs; + sendPacket(true); + return m_nMsgSequence; +} + +unsigned short ICQClient::ssiDeleteBuddy(QString& screen, unsigned short group_id, unsigned short buddy_id, unsigned short buddy_type, TlvList* tlvs) +{ + log(L_DEBUG, "ICQClient::ssiDeleteBuddy"); + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_DELETE, true, false); + QByteArray utfscreen = screen.toUtf8(); + socket()->writeBuffer() << (unsigned short)utfscreen.length(); + socket()->writeBuffer().pack(utfscreen.data(), utfscreen.length()); + socket()->writeBuffer() << group_id << buddy_id << buddy_type; + if(!tlvs) + socket()->writeBuffer() << (unsigned short)0x0000; + else + socket()->writeBuffer() << *tlvs; + sendPacket(true); + return m_nMsgSequence; +} + +void ICQClient::getGroupIDs(unsigned short group_id, ICQBuffer* buf) +{ + if(!buf) + return; + ContactList::ContactIterator it; + Contact* contact; + ICQUserData *data; + while((contact = ++it) != NULL) + { + ClientDataIterator it(contact->clientData, this); + data = toICQUserData(++it); + if(!data) + continue; + if(data->GrpId.toULong() == group_id) + { + (*buf) << (unsigned short)data->IcqID.toULong(); + } + } +} + +unsigned short ICQClient::ssiAddToGroup(QString& groupname, unsigned short buddy_id, unsigned short group_id) +{ + QByteArray sName = groupname.toUtf8(); + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_UPDATE, true, false); + socket()->writeBuffer() << (unsigned short)sName.length(); + socket()->writeBuffer().pack(sName.data(), sName.length()); + socket()->writeBuffer() << group_id << (unsigned short)0x0000 << (unsigned short)0x0001; + ICQBuffer b; + getGroupIDs(group_id, &b); + b << buddy_id; + TlvList tlvs; + tlvs += new Tlv(TLV_SUBITEMS, b.writePos(), b.data()); + socket()->writeBuffer() << tlvs; + sendPacket(true); + return m_nMsgSequence; + +} + +unsigned short ICQClient::ssiRemoveFromGroup(QString& groupname, unsigned short buddy_id, unsigned short group_id) +{ + ContactList::ContactIterator it; + Contact* contact; + ICQUserData *data; + while((contact = ++it) != NULL) + { + ClientDataIterator it(contact->clientData, this); + data = toICQUserData(++it); + if(!data) + continue; + if(data->IcqID.toULong() == buddy_id) + { + data->GrpId.setULong(0); + break; + } + } + + QByteArray sName = groupname.toUtf8(); + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_UPDATE, true, false); + socket()->writeBuffer() << (unsigned short)sName.length(); + socket()->writeBuffer().pack(sName.data(), sName.length()); + socket()->writeBuffer() << group_id << (unsigned short)0x0000 << (unsigned short)0x0001; + ICQBuffer b; + getGroupIDs(group_id, &b); + TlvList tlvs; + tlvs += new Tlv(TLV_SUBITEMS, b.writePos(), b.data()); + socket()->writeBuffer() << tlvs; + sendPacket(true); + return m_nMsgSequence; +} + +unsigned short ICQClient::ssiModifyBuddy(const QString& name, unsigned short grp_id, unsigned short usr_id, unsigned short subCmd, TlvList* tlv) +{ + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_UPDATE, true, false); + QByteArray sName = name.toUtf8(); + socket()->writeBuffer().pack(static_cast(htons(sName.size()))); + socket()->writeBuffer().pack(sName.data(), sName.size()); + socket()->writeBuffer() + << grp_id + << usr_id + << subCmd; + if (tlv){ + socket()->writeBuffer() << *tlv; + }else{ + socket()->writeBuffer() << (unsigned short)0; + } + sendPacket(true); + return m_nMsgSequence; +} + +unsigned short ICQClient::sendRoster(unsigned short cmd, const QString &name, unsigned short grp_id, + unsigned short usr_id, unsigned short subCmd, TlvList *tlv) +{ + log(L_DEBUG, "ICQClient::sendRoster"); + // start edit SSI + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_EDIT, true, false); + sendPacket(true); + + snac(ICQ_SNACxFOOD_LISTS, cmd, true, false); + QByteArray sName = name.toUtf8(); + socket()->writeBuffer().pack(static_cast( htons(sName.length()) ) ); + socket()->writeBuffer().pack(sName.data(), sName.length()); + socket()->writeBuffer() + << grp_id + << usr_id + << subCmd; + if (tlv){ + socket()->writeBuffer() << *tlv; + }else{ + socket()->writeBuffer() << (unsigned short)0; + } + sendPacket(true); + return m_nMsgSequence; +} + +void ICQClient::sendRosterGrp(const QString &name, unsigned short grpId, unsigned short usrId) +{ + QByteArray sName = name.toUtf8(); + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_UPDATE, true, false); + socket()->writeBuffer().pack(sName.data(), sName.length()); + socket()->writeBuffer() + << grpId + << (unsigned long) ICQ_GROUPS; + if (usrId){ + socket()->writeBuffer() + << (unsigned short) 6 + << (unsigned short) 0xC8 + << (unsigned short) 2 + << (unsigned short) usrId; + }else{ + socket()->writeBuffer() + << (unsigned short) 4 + << (unsigned short) 0xC8 + << (unsigned short) 0; + } + sendPacket(true); +} + +static QString userStr(Contact *contact, const ICQUserData *data) +{ + QString name = contact ? contact->getName() : "unknown"; + return QString::number(data->Uin.toULong()) + '[' + name + ']'; +} + +unsigned ICQClient::processListRequest() +{ + if (m_listRequest || (getState() != Connected) || !m_bReady) + return false; + for (;;){ + if (listRequests.size() == 0) + return 0; + unsigned delay = delayTime(SNAC(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_CREATE)); + if (delay) + return delay; + ListRequest &lr = listRequests.front(); + unsigned short seq = 0; + unsigned short icq_id; + Group *group = NULL; + Contact *contact; + ICQUserData *data; + unsigned grp_id = 0; + switch (lr.type){ + case LIST_USER_CHANGED: + data = findContact(lr.screen, NULL, false, contact); + if (data == NULL) + break; + if (data->VisibleId.toULong() != data->ContactVisibleId.toULong()){ + if ((data->VisibleId.toULong() == 0) || (data->ContactVisibleId.toULong() == 0)){ + if (data->VisibleId.toULong()){ + log(L_DEBUG, "%s add to visible list", qPrintable(userStr(contact, data))); + seq = sendRoster(ICQ_SNACxLISTS_CREATE, screen(data), 0, data->VisibleId.toULong(), ICQ_VISIBLE_LIST); + }else{ + log(L_DEBUG, "%s remove from visible list", qPrintable(userStr(contact, data))); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, screen(data), 0, data->ContactVisibleId.toULong(), ICQ_VISIBLE_LIST); + } + m_listRequest = new SetListRequest(seq, screen(data), data->VisibleId.toULong(), ICQ_VISIBLE_LIST); + break; + } + data->VisibleId.asULong() = data->ContactVisibleId.toULong(); + } + if (data->InvisibleId.toULong() != data->ContactInvisibleId.toULong()){ + if ((data->InvisibleId.toULong() == 0) || (data->ContactInvisibleId.toULong() == 0)){ + if (data->InvisibleId.toULong()){ + log(L_DEBUG, "%s add to invisible list", qPrintable(userStr(contact, data))); + seq = sendRoster(ICQ_SNACxLISTS_CREATE, screen(data), 0, data->InvisibleId.toULong(), ICQ_INVISIBLE_LIST); + }else{ + log(L_DEBUG, "%s remove from invisible list", qPrintable(userStr(contact, data))); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, screen(data), 0, data->ContactInvisibleId.toULong(), ICQ_INVISIBLE_LIST); + } + m_listRequest = new SetListRequest(seq, screen(data), data->InvisibleId.toULong(), ICQ_INVISIBLE_LIST); + break; + } + data->InvisibleId.asULong() = data->ContactInvisibleId.toULong(); + } + if (contact->getIgnore() != (data->IgnoreId.toULong() != 0)){ + unsigned short ignore_id = 0; + if (data->IgnoreId.toULong()){ + log(L_DEBUG, "%s remove from ignore list", qPrintable(userStr(contact, data))); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, screen(data), 0, data->IgnoreId.toULong(), ICQ_IGNORE_LIST); + }else{ + ignore_id = getListId(); + log(L_DEBUG, "%s add to ignore list", qPrintable(userStr(contact, data))); + seq = sendRoster(ICQ_SNACxLISTS_CREATE, screen(data), 0, ignore_id, ICQ_IGNORE_LIST); + } + m_listRequest = new SetListRequest(seq, screen(data), ignore_id, ICQ_IGNORE_LIST); + break; + } + if (contact->getGroup()){ + group = getContacts()->group(contact->getGroup()); + if (group){ + ICQUserData *grp_data = toICQUserData((SIM::clientData*)group->clientData.getData(this)); // FIXME unsafe type conversion + if (grp_data) + grp_id = grp_data->IcqID.toULong(); + } + } + if (data->GrpId.toULong() != grp_id) + { + if (grp_id) + { + if (data->GrpId.toULong() == 0) + { + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_FUTURE_AUTH, true, false); + socket()->writeBuffer().packScreen(screen(data)); + socket()->writeBuffer() << 0x00000000L; + data->WaitAuth.setBool(true); + sendPacket(true); + } + if (data->IcqID.toULong() == 0) + data->IcqID.asULong() = getListId(); + TlvList *tlv = createListTlv(data, contact); + /* + if (data->GrpId.toULong()) + seq = sendRoster(ICQ_SNACxLISTS_DELETE, QString::null, data->GrpId.toULong(), data->IcqID.toULong()); + */ + QString name = screen(data); + QString groupname = group->getName(); + ssiStartTransaction(); + if(data->GrpId.toULong()) + { + seq = ssiDeleteBuddy(name, data->GrpId.toULong(), data->IcqID.toULong(), 0, tlv); + } + seq = ssiAddBuddy(name, grp_id, (unsigned short) data->IcqID.toULong(), 0, tlv); + ssiAddToGroup(groupname, data->IcqID.toULong(), grp_id); + data->GrpId.setULong(grp_id); + //ssiEndTransaction(); + /* + seq = sendRoster(ICQ_SNACxLISTS_CREATE, screen(data), grp_id, data->IcqID.toULong(), 0, tlv); + sendRosterGrp(group->getName(), grp_id, data->IcqID.toULong()); + */ + log(L_DEBUG, "%s move to group %s", qPrintable(userStr(contact, data)), qPrintable(group->getName())); + m_listRequest = new ContactServerRequest(seq, screen(data), data->IcqID.toULong(), grp_id, tlv); + } + else + { + log(L_DEBUG, "%s remove from contact list", qPrintable(userStr(contact, data))); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, QString::null, data->GrpId.toULong(), data->IcqID.toULong()); + m_listRequest = new ContactServerRequest(seq, screen(data), 0, 0); + } + break; + } + if ((data->IcqID.toULong() == 0) || (data->Uin.toULong() == 0)) + break; + if (isContactRenamed(data, contact)){ + log(L_DEBUG, "%s rename", qPrintable(userStr(contact, data))); + TlvList *tlv = createListTlv(data, contact); + seq = sendRoster(ICQ_SNACxLISTS_UPDATE, screen(data), data->GrpId.toULong(), data->IcqID.toULong(), 0, tlv); + m_listRequest = new ContactServerRequest(seq, screen(data), data->IcqID.toULong(), data->GrpId.toULong(), tlv); + break; + } + break; + case LIST_USER_DELETED: + data = findContact(lr.screen, NULL, false, contact); + if (data == NULL) + break; + if (lr.visible_id){ + log(L_DEBUG, "%s remove from visible list", qPrintable(lr.screen)); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, lr.screen, 0, lr.visible_id, ICQ_VISIBLE_LIST); + m_listRequest = new SetListRequest(seq, lr.screen, 0, ICQ_VISIBLE_LIST); + break; + } + if (lr.invisible_id){ + log(L_DEBUG, "%s remove from invisible list", qPrintable(lr.screen)); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, lr.screen, 0, lr.invisible_id, ICQ_INVISIBLE_LIST); + m_listRequest = new SetListRequest(seq, lr.screen, 0, ICQ_INVISIBLE_LIST); + break; + } + if (lr.ignore_id){ + log(L_DEBUG, "%s remove from ignore list", qPrintable(lr.screen)); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, lr.screen, 0, lr.ignore_id, ICQ_IGNORE_LIST); + m_listRequest = new SetListRequest(seq, lr.screen, 0, ICQ_IGNORE_LIST); + break; + } + if (lr.screen.length() && lr.grp_id){ + group = getContacts()->group(contact->getGroup()); + QString groupname = group->getName(); + /* + if(group) + { + ICQUserData *grp_data = toICQUserData((SIM::clientData*)group->clientData.getData(this)); // FIXME unsafe type conversion + if(grp_data) + grp_id = grp_data->IcqID.toULong(); + } + */ + log(L_DEBUG, "%s remove from contact list", qPrintable(lr.screen)); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, QString::null, lr.grp_id, lr.icq_id); + seq = ssiRemoveFromGroup(groupname, lr.icq_id, lr.grp_id); + m_listRequest = new ContactServerRequest(seq, lr.screen, 0, 0); + } + break; + case LIST_GROUP_CHANGED: + group = getContacts()->group(lr.screen.toULong()); + if (group){ + QString name = group->getName(); + data = toICQUserData((SIM::clientData*)group->clientData.getData(this)); // FIXME unsafe type conversion + if (data){ + icq_id = (unsigned short)(data->IcqID.toULong()); + QString alias = data->Alias.str(); + if (alias != name){ + log(L_DEBUG, "rename group %s", qPrintable(group->getName())); + seq = sendRoster(ICQ_SNACxLISTS_UPDATE, name, icq_id, 0, ICQ_GROUPS); + } + }else{ + log(L_DEBUG, "create group %s", qPrintable(group->getName())); + icq_id = getListId(); + seq = sendRoster(ICQ_SNACxLISTS_CREATE, name, icq_id, 0, ICQ_GROUPS); + } + if (seq) + m_listRequest = new GroupServerRequest(seq, group->id(), icq_id, name); + } + break; + case LIST_GROUP_DELETED: + if (lr.icq_id){ + log(L_DEBUG, "delete group"); + seq = sendRoster(ICQ_SNACxLISTS_DELETE, QString::null, lr.icq_id, 0, ICQ_GROUPS); + m_listRequest = new GroupServerRequest(seq, 0, lr.icq_id, QString::null); + } + break; + case LIST_BUDDY_CHECKSUM: + if (lr.icqUserData){ + log(L_DEBUG, "Add/Modify buddy icon checksum"); + + QImage img(getPicture()); + if(img.isNull()) + break; + + QByteArray ba; + QBuffer buf(&ba); + if(!buf.open(QIODevice::WriteOnly)) { + log(L_ERROR, "Can't open QByteArray for writing!"); + break; + } + if(!img.save(&buf, "JPEG")) { + log(L_ERROR, "Can't save QImage to QBuffer"); + break; + } + buf.close(); + QByteArray hash = QCryptographicHash::hash(ba, QCryptographicHash::Md5); + if(hash == this->data.owner.buddyHash.toBinary() && + 1 == this->data.owner.buddyID.toULong()) { + log(L_DEBUG, "No need to upload buddy"); + // break; + } + + TlvList *tlvList = new TlvList; //Fixme Leak, warning C6211: Leaking memory 'tlvList' due to an exception. Consider using a local catch block to clean up memory: Lines: 1304, 1307, 1309, 1310, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1495, 1496, 1497, 1499, 1500, 1503, 1504, 1505, 1509, 1513, 1514, 1515, 1521, 1523, 1524, 1525, 1526, 1527 + + ba.resize(hash.size() + 2); + ba.data()[0] = 0x01; + ba.data()[1] = hash.size(); + memcpy(&ba.data()[2], hash.data(), hash.size()); + *tlvList += new Tlv(TLV_ALIAS, 0, NULL); + *tlvList += new Tlv(TLV_BUDDYHASH, ba.size(), ba.data()); + + //unsigned short seq = sendRoster(lr.icq_id ? ICQ_SNACxLISTS_UPDATE : ICQ_SNACxLISTS_CREATE, + // "1", lr.grp_id, lr.icq_id, ICQ_BUDDY_CHECKSUM, tlvList); + ssiStartTransaction(); + unsigned short seq = ssiModifyBuddy("1", lr.grp_id, lr.icq_id, ICQ_BUDDY_CHECKSUM, tlvList); + ssiEndTransaction(); + m_listRequest = new SetBuddyRequest(seq, &this->data.owner); + } + break; + } + if (m_listRequest) + break; + listRequests.erase(listRequests.begin()); + } + return 0; +} + +void ICQClient::checkListRequest() +{ + if (m_listRequest == NULL) + return; + if (QDateTime::currentDateTime() > (m_listRequest->getTime().addSecs(LIST_REQUEST_TIMEOUT))){ + log(L_WARN, "List request timeout"); + m_listRequest->process(this, USHRT_MAX); + delete m_listRequest; + m_listRequest = NULL; + snacICBM()->processSendQueue(); + } +} + +void ICQClient::addGroupRequest(Group *group) +{ + QString name; + name = group->getName(); + ICQUserData *data = toICQUserData((SIM::clientData*)group->clientData.getData(this)); // FIXME unsafe type conversion + if (data == NULL){ + list::iterator it; + for (it = listRequests.begin(); it != listRequests.end(); it++){ + if (it->type != LIST_GROUP_CHANGED) + continue; + if (it->screen.toULong() == group->id()) + return; + } + ListRequest lr; + lr.type = LIST_GROUP_CHANGED; + lr.screen = QString::number(group->id()); + listRequests.push_back(lr); + snacICBM()->processSendQueue(); + return; + } + list::iterator it; + for (it = listRequests.begin(); it != listRequests.end(); it++){ + if (it->type != LIST_GROUP_CHANGED) + continue; + if (it->icq_id == data->IcqID.toULong()) + return; + } + QString alias = data->Alias.str(); + if (alias == name) + return; + ListRequest lr; + lr.type = LIST_GROUP_CHANGED; + lr.icq_id = (unsigned short)(data->IcqID.toULong()); + lr.screen = QString::number(group->id()); + listRequests.push_back(lr); + snacICBM()->processSendQueue(); +} + +void ICQClient::addContactRequest(Contact *contact) +{ + ICQUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toICQUserData(++it)) != NULL){ + list::iterator it; + for (it = listRequests.begin(); it != listRequests.end(); it++){ + if (it->type != LIST_USER_CHANGED) + continue; + if (it->screen == screen(data)) + return; + } + + bool bChanged = false; + if (data->VisibleId.toULong() != data->ContactVisibleId.toULong()){ + if ((data->VisibleId.toULong() == 0) || (data->ContactVisibleId.toULong() == 0)){ + bChanged = true; + log(L_DEBUG, "%s change visible state", qPrintable(userStr(contact, data))); + }else{ + data->VisibleId.asULong() = data->ContactVisibleId.toULong(); + } + } + if (data->InvisibleId.toULong() != data->ContactInvisibleId.toULong()){ + if ((data->InvisibleId.toULong() == 0) || (data->ContactInvisibleId.toULong() == 0)){ + bChanged = true; + log(L_DEBUG, "%s change invisible state", qPrintable(userStr(contact, data))); + }else{ + data->InvisibleId.asULong() = data->ContactInvisibleId.toULong(); + } + } + if (contact->getIgnore() != (data->IgnoreId.toULong() != 0)){ + log(L_DEBUG, "%s change ignore state", qPrintable(userStr(contact, data))); + bChanged = true; + } + if (!bChanged){ + unsigned grp_id = 0; + if (contact->getGroup()){ + Group *group = getContacts()->group(contact->getGroup()); + if (group){ + ICQUserData *grp_data = toICQUserData((SIM::clientData*)group->clientData.getData(this)); // FIXME unsafe type conversion + if (grp_data){ + grp_id = grp_data->IcqID.toULong(); + }else{ + addGroupRequest(group); + } + } + } + if (data->GrpId.toULong() != grp_id){ + if (grp_id == 0) { + // + // fix for #5302 + grp_id = 1; + contact->setGroup(grp_id); + unsigned oldGrpId = data->GrpId.toULong(); + data->GrpId.asULong() = grp_id; + log(L_WARN, "%s change group %u->%u, because otherewise the contact would be deleted", + qPrintable(userStr(contact, data)), oldGrpId, grp_id); + return; + // + } else { + log(L_DEBUG, "%s change group %lu->%u", + qPrintable(userStr(contact, data)), data->GrpId.toULong(), grp_id); + bChanged = true; + } + } + if (!bChanged && (data->IcqID.toULong() == 0)) + return; + if (!bChanged && !isContactRenamed(data, contact)) + return; + } + + ListRequest lr; + lr.type = LIST_USER_CHANGED; + lr.screen = screen(data); + listRequests.push_back(lr); + snacICBM()->processSendQueue(); + } +} + +bool ICQClient::isContactRenamed(ICQUserData *data, Contact *contact) +{ + QString alias = data->Alias.str(); + if(alias.isEmpty()) + alias.sprintf("%lu", data->Uin.toULong()); + + if (contact->getName() != alias){ + log(L_DEBUG, "%lu renamed %s->%s", data->Uin.toULong(), qPrintable(alias), qPrintable(contact->getName())); + return true; + } + QString cell = getUserCellular(contact); + QString phone = data->Cellular.str(); + if (cell != phone){ + log(L_DEBUG, "%s phone changed %s->%s", qPrintable(userStr(contact, data)), qPrintable(phone), qPrintable(cell)); + return true; + } + return false; +} + +QString ICQClient::getUserCellular(Contact *contact) +{ + QString phones = contact->getPhones(); + while (phones.length()){ + QString phoneItem = getToken(phones, ';', false); + QString phone = getToken(phoneItem, '/', false); + if (phoneItem != "-") + continue; + QString value = getToken(phone, ','); + getToken(phone, ','); + if (phone.toUInt() == CELLULAR){ + return value; + } + } + return QString(); +} + +bool ICQClient::sendAuthRequest(Message *msg, void *_data) +{ + if ((getState() != Connected) || (_data == NULL)) + return false; + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_REQUEST_AUTH, true, false); + socket()->writeBuffer().packScreen(screen(data)); + QByteArray message; + QString charset; + if (hasCap(data, CAP_RTF) || hasCap(data, CAP_UTF)) + { + message = msg->getPlainText().toUtf8(); + charset = "utf-8"; + } + else + { + message = getContacts()->fromUnicode(NULL, msg->getPlainText()); + } + socket()->writeBuffer() + << (unsigned short)(message.length()) + << message.data() + << (char)0x00; + if (charset.isEmpty()){ + socket()->writeBuffer() << (char)0x00; + }else{ + socket()->writeBuffer() + << (char)0x01 + << (unsigned short)1 + << (unsigned short)(charset.length()) + << charset.toLatin1(); + } + sendPacket(true); + + msg->setClient(dataName(data)); + EventSent(msg).process(); + EventMessageSent(msg).process(); + delete msg; + return true; +} + +bool ICQClient::sendAuthGranted(Message *msg, void *_data) +{ + if ((getState() != Connected) || (_data == NULL)) + return false; + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->WantAuth.asBool() = false; + + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_AUTHxSEND, true, false); + socket()->writeBuffer().packScreen(screen(data)); + socket()->writeBuffer() + << (char)0x01 + << (unsigned long)0; + sendPacket(true); + + msg->setClient(dataName(data)); + EventSent(msg).process(); + EventMessageSent(msg).process(); + delete msg; + return true; +} + +bool ICQClient::sendAuthRefused(Message *msg, void *_data) +{ + if ((getState() != Connected) || (_data == NULL)) + return false; + ICQUserData *data = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->WantAuth.asBool() = false; + + snac(ICQ_SNACxFOOD_LISTS, ICQ_SNACxLISTS_AUTHxSEND, true, false); + socket()->writeBuffer().packScreen(screen(data)); + + QByteArray message; + QByteArray charset; + if (hasCap(data, CAP_RTF) || hasCap(data, CAP_UTF)){ + message = msg->getPlainText().toUtf8(); + charset = "utf-8"; + }else{ + message = getContacts()->fromUnicode(NULL, msg->getPlainText()); + } + socket()->writeBuffer() + << (char) 0 + << (unsigned short)(message.length()) + << message + << (char)0x00; + if (charset.isEmpty()){ + socket()->writeBuffer() << (char)0x00; + }else{ + socket()->writeBuffer() << (char)0x01 + << (unsigned short)1 + << (unsigned short)(charset.length()) + << charset; + } + sendPacket(true); + + msg->setClient(dataName(data)); + EventSent(msg).process(); + EventMessageSent(msg).process(); + delete msg; + return true; +} diff --git a/plugins/icq/icqlocation.cpp b/plugins/icq/icqlocation.cpp new file mode 100644 index 0000000..143d6fc --- /dev/null +++ b/plugins/icq/icqlocation.cpp @@ -0,0 +1,648 @@ +/*************************************************************************** + icqlocation.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icqclient.h" +#include "icqlocation.h" +#include "contacts/contact.h" + +#include +#include +#ifdef Q_OS_WIN32 +# include +#else +# include +#endif + +#include "log.h" + +using namespace SIM; + +const unsigned short ICQ_SNACxLOC_ERROR = 0x0001; +const unsigned short ICQ_SNACxLOC_REQUESTxRIGHTS = 0x0002; +const unsigned short ICQ_SNAXxLOC_RIGHTSxGRANTED = 0x0003; +const unsigned short ICQ_SNACxLOC_SETxUSERxINFO = 0x0004; +const unsigned short ICQ_SNACxLOC_REQUESTxUSERxINFO = 0x0005; +const unsigned short ICQ_SNACxLOC_LOCATIONxINFO = 0x0006; +const unsigned short ICQ_SNACxLOC_SETxDIRxINFO = 0x0009; +const unsigned short ICQ_SNACxLOC_RESPONSExSETxINFO = 0x000A; +const unsigned short ICQ_SNACxLOC_REQUESTxDIRxINFO = 0x000B; +const unsigned short ICQ_SNACxLOC_DIRxINFO = 0x000C; + +SnacIcqLocation::SnacIcqLocation(ICQClient* client) : QObject(NULL), SnacHandler(client, 0x0002) +{ +} + +SnacIcqLocation::~SnacIcqLocation() +{ +} + +static bool extractInfo(TlvList &tlvs, unsigned short id, SIM::Data &data, Contact *c = NULL) +{ + const char *info = NULL; + Tlv *tlv = tlvs(id); + if (tlv) + info = *tlv; + return data.setStr(getContacts()->toUnicode(c, info)); +} + +QString ICQClient::convert(Tlv *tlvInfo, TlvList &tlvs, unsigned n) +{ + if (tlvInfo == NULL) + return QString::null; + return convert(*tlvInfo, tlvInfo->Size(), tlvs, n); +} + +QString ICQClient::convert(const char *text, unsigned size, TlvList &tlvs, unsigned n) +{ + QByteArray charset = "us-ascii"; //perhaps Bug here, should be read from packet!? + Tlv *tlvCharset = NULL; + for (int i = 0; i < tlvs.count(); i++){ + Tlv *tlv = tlvs[i]; + if (tlv->Num() != n) + continue; + if (tlvCharset && (tlv->Size() < tlvCharset->Size())) + continue; + tlvCharset = tlv; + } + if (tlvCharset){ + int idx1 = charset.indexOf('\"'); + if (idx1 != -1){ + idx1++; + int idx2 = charset.indexOf('\"', idx1); + if(idx2 != -1) + charset = charset.mid(idx1, idx2 - idx1); + else + charset = charset.mid(idx1); + } + } + QString res; + if (charset.contains("us-ascii") || charset.contains("utf")){ //perhaps Bug here, should be read from packet!? + res = QString::fromUtf8(text, size); + }else if (charset.contains("unicode")){ + unsigned short *p = (unsigned short*)text; + for (unsigned i = 0; i < size - 1; i += 2, p++) + res += QChar((unsigned short)htons(*p)); + }else{ + QTextCodec *codec = QTextCodec::codecForName(charset); + if (codec){ + res = codec->toUnicode(text, size); + }else{ + res = QString::fromUtf8(text, size); + log(L_WARN, "Unknown encoding %s", charset.data()); + } + } + return res; +} + +void ICQClient::snac_location(unsigned short type, unsigned short seq) +{ + Contact *contact = NULL; + ICQUserData *data; + QString screen; + switch (type){ + case ICQ_SNAXxLOC_RIGHTSxGRANTED: + log(L_DEBUG, "Location rights granted"); + break; + case ICQ_SNACxLOC_ERROR: + break; + case ICQ_SNACxLOC_LOCATIONxINFO: + screen = socket()->readBuffer().unpackScreen(); + if (isOwnData(screen)){ + data = &this->data.owner; + }else{ + data = findContact(screen, NULL, false, contact); + } + if (data){ + socket()->readBuffer().incReadPos(4); + TlvList tlvs(socket()->readBuffer()); + Tlv *tlvInfo = tlvs(0x02); + if (tlvInfo){ + QString info = convert(tlvInfo, tlvs, 0x01); + if (info.startsWith("", Qt::CaseInsensitive)) + info = info.mid(6); + if (info.endsWith("", Qt::CaseInsensitive)) + info = info.left(info.length() - 7); + if (data->About.setStr(info)){ + data->ProfileFetch.asBool() = true; + if (contact){ + EventContact(contact, EventContact::eChanged).process(); + }else{ + EventClientChanged(this).process(); + } + } + break; /* Because we won't find tlv(0x03) which is + "since online" instead of encoding... */ + } + Tlv *tlvAway = tlvs(0x04); + if (tlvAway){ + QString info = convert(tlvAway, tlvs, 0x03); + data->AutoReply.str() = info; + EventClientChanged(this).process(); + } + } + break; + case ICQ_SNACxLOC_DIRxINFO: + if (isOwnData(screen)){ + data = &this->data.owner; + }else{ + data = findInfoRequest(seq, contact); + } + if (data){ + bool bChanged = false; + unsigned country = 0; + socket()->readBuffer().incReadPos(4); + TlvList tlvs(socket()->readBuffer()); + Contact *c = getContact(data); + bChanged |= extractInfo(tlvs, 0x01, data->FirstName, c); + bChanged |= extractInfo(tlvs, 0x02, data->LastName, c); + bChanged |= extractInfo(tlvs, 0x03, data->MiddleName, c); + bChanged |= extractInfo(tlvs, 0x04, data->Maiden, c); + bChanged |= extractInfo(tlvs, 0x07, data->State, c); + bChanged |= extractInfo(tlvs, 0x08, data->City, c); + bChanged |= extractInfo(tlvs, 0x0C, data->Nick, c); + bChanged |= extractInfo(tlvs, 0x0D, data->Zip, c); + bChanged |= extractInfo(tlvs, 0x21, data->Address, c); + Tlv *tlvCountry = tlvs(0x06); + if (tlvCountry){ + const char *code = *tlvCountry; + for (const ext_info *c = getCountryCodes(); c->nCode; c++){ + QString name(c->szName); + if (name.toUpper() == code){ + country = c->nCode; + break; + } + } + } + if (country != data->Country.toULong()){ + data->Country.asULong() = country; + bChanged = true; + } + data->ProfileFetch.asBool() = true; + if (bChanged){ + if (contact){ + EventContact e(contact, EventContact::eChanged); + e.process(); + }else{ + EventClientChanged(this).process(); + } + } + } + break; + case ICQ_SNACxLOC_RESPONSExSETxINFO: + break; + default: + log(L_WARN, "Unknown location foodgroup type %04X", type); + } +} + +void ICQClient::locationRequest() +{ + snac(ICQ_SNACxFOOD_LOCATION, ICQ_SNACxLOC_REQUESTxRIGHTS); + sendPacket(true); +} + +#define cap_id 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 +#define cap_none 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +#define cap_str 0xbc, 0xd2, 0x00, 0x04, 0xac, 0x96, 0xdd, 0x96 + +#define cap_mid 0x4c, 0x7f, 0x11, 0xd1 +#define cap_mstr 0x4f, 0xe9, 0xd3, 0x11 +#define cap_aim 0x09, 0x46 + +// must be synced with cap_id_t enum in icqclient.h +// +const capability arrCapabilities[] = + { + // CAP_AIM_SHORTCAPS + { cap_aim, 0x00, 0x00, cap_mid, cap_id }, + // CAP_AIM_VOICE + { cap_aim, 0x13, 0x41, cap_mid, cap_id }, + // CAP_AIM_SENDFILE + { cap_aim, 0x13, 0x43, cap_mid, cap_id }, + // CAP_DIRECT + { cap_aim, 0x13, 0x44, cap_mid, cap_id }, + // CAP_AIM_IMIMAGE + { cap_aim, 0x13, 0x45, cap_mid, cap_id }, + // CAP_AIM_BUDDYCON + { cap_aim, 0x13, 0x46, cap_mid, cap_id }, + // CAP_AIM_STOCKS + { cap_aim, 0x13, 0x47, cap_mid, cap_id }, + // CAP_AIM_GETFILE + { cap_aim, 0x13, 0x48, cap_mid, cap_id }, + // CAP_SRV_RELAY + { cap_aim, 0x13, 0x49, cap_mid, cap_id }, + // CAP_AIM_GAMES + { cap_aim, 0x13, 0x4a, cap_mid, cap_id }, + // CAP_AIM_BUDDYLIST + { cap_aim, 0x13, 0x4b, cap_mid, cap_id }, + // CAP_AVATAR + { cap_aim, 0x13, 0x4c, cap_mid, cap_id }, + // CAP_AIM_SUPPORT + { cap_aim, 0x13, 0x4d, cap_mid, cap_id }, + // CAP_UTF + { cap_aim, 0x13, 0x4e, cap_mid, cap_id }, + // CAP_RTF + { 0x97, 0xb1, 0x27, 0x51, 0x24, 0x3c, 0x43, 0x34, + 0xad, 0x22, 0xd6, 0xab, 0xf7, 0x3f, 0x14, 0x92 }, + // CAP_TYPING + { 0x56, 0x3f, 0xc8, 0x09, 0x0b, 0x6f, 0x41, 0xbd, + 0x9f, 0x79, 0x42, 0x26, 0x09, 0xdf, 0xa2, 0xf3 }, + // CAP_SIM + { 'S', 'I', 'M', ' ', 'c', 'l', 'i', 'e', + 'n', 't', ' ', ' ', 0, 0, 0, 0 }, + // CAP_STR_2001 + { 0xa0, 0xe9, 0x3f, 0x37, cap_mstr, cap_str }, + // CAP_STR_2002 + { 0x10, 0xcf, 0x40, 0xd1, cap_mstr, cap_str }, + // CAP_IS_2001 + { 0x2e, 0x7a, 0x64, 0x75, 0xfa, 0xdf, 0x4d, 0xc8, + 0x88, 0x6f, 0xea, 0x35, 0x95, 0xfd, 0xb6, 0xdf }, + // CAP_TRILLIAN + { 0x97, 0xb1, 0x27, 0x51, 0x24, 0x3c, 0x43, 0x34, + 0xad, 0x22, 0xd6, 0xab, 0xf7, 0x3f, 0x14, 0x09 }, + // CAP_TRIL_CRYPT + { 0xf2, 0xe7, 0xc7, 0xf4, 0xfe, 0xad, 0x4d, 0xfb, + 0xb2, 0x35, 0x36, 0x79, 0x8b, 0xdf, 0x00, 0x00 }, + // CAP_MACICQ + { 0xdd, 0x16, 0xf2, 0x02, 0x84, 0xe6, 0x11, 0xd4, + 0x90, 0xdb, 0x00, 0x10, 0x4b, 0x9b, 0x4b, 0x7d }, + // CAP_AIM_CHAT + { 0x74, 0x8f, 0x24, 0x20, 0x62, 0x87, 0x11, 0xd1, cap_id }, + // CAP_MICQ + { 'm', 'I', 'C', 'Q', ' ', (unsigned char)'©', 'R', '.', + 'K', ' ', '.', ' ', 0, 0, 0, 0 }, + // CAP_LICQ + { 'L', 'i', 'c', 'q', ' ', 'c', 'l', 'i', + 'e', 'n', 't', ' ', 0, 0, 0, 0 }, + // CAP_SIMOLD + { 0x97, 0xb1, 0x27, 0x51, 0x24, 0x3c, 0x43, 0x34, + 0xad, 0x22, 0xd6, 0xab, 0xf7, 0x3f, 0x14, 0x00 }, + // CAP_KOPETE + { 'K', 'o', 'p', 'e', 't', 'e', ' ', 'I', + 'C', 'Q', ' ', ' ', 0, 0, 0, 0 }, + // CAP_XTRAZ + { 0x1A, 0x09, 0x3C, 0x6C, 0xD7, 0xFD, 0x4E, 0xC5, + 0x9D, 0x51, 0xA6, 0x47, 0x4E, 0x34, 0xF5, 0xA0 }, + // CAP_IS_2002 + { 0x10, 0xcf, 0x40, 0xd1, cap_mid, cap_id }, + // CAP_MIRANDA + { 'M', 'i', 'r', 'a', 'n', 'd', 'a', 'M', cap_none }, + // CAP_ANDRQ + { '&', 'R', 'Q', 'i', 'n', 's', 'i', 'd', + 'e', 0, 0, 0, 0, 0, 0, 0 }, + // CAP_QIP + { 0x56, 0x3f, 0xc8, 0x09, 0x0b, 0x6f, 0x41, 'Q', + 'I', 'P', ' ', '2', '0', '0', '5', 'a' }, + // CAP_IMSECURE + { 'I', 'M', 's', 'e', 'c', 'u', 'r', 'e', + 'C', 'p', 'h', 'r', 0, 0, 0, 0 }, + // CAP_KXICQ + { 0x09, 0x49, 0x13, 0x44, cap_mid, cap_id }, + // CAP_ICQ5_1 + { 0xe3, 0x62, 0xc1, 0xe9, 0x12, 0x1a, 0x4b, 0x94, + 0xa6, 0x26, 0x7a, 0x74, 0xde, 0x24, 0x27, 0x0d }, + // CAP_UNKNOWN - used by Trillian and some ICQ 5 clients + { 0x17, 0x8c, 0x2d, 0x9b, 0xda, 0xa5, 0x45, 0xbb, + 0x8d, 0xdb, 0xf3, 0xbd, 0xbd, 0x53, 0xa1, 0x0a }, + // CAP_ICQ5_3 + { 0x67, 0x36, 0x15, 0x15, 0x61, 0x2d, 0x4c, 0x07, + 0x8f, 0x3d, 0xbd, 0xe6, 0x40, 0x8e, 0xa0, 0x41 }, + // CAP_ICQ5_4 + { 0xb9, 0x97, 0x08, 0xb5, 0x3a, 0x92, 0x42, 0x02, + 0xb0, 0x69, 0xf1, 0xe7, 0x57, 0xbb, 0x2e, 0x17 }, + // CAP_ICQ51 + { 0xb2, 0xec, 0x8f, 0x16, 0x7c, 0x6f, 0x45, 0x1b, + 0xbd, 0x79, 0xdc, 0x58, 0x49, 0x78, 0x88, 0xb9 }, + // CAP_JIMM + { 'J', 'i', 'm', 'm', ' ', 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }, + //CAP_ICQJP + {'i', 'c', 'q', 'p', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + /*/* + // from Gaim: + // CAP_AIM_HIPTOP + { cap_aim, 0x13, 0x23, cap_mid, cap_id }, + // CAP_AIM_SECUREIM + { cap_aim, 0x00, 0x01, cap_mid, cap_id }, + // CAP_AIM_VIDEO + { cap_aim, 0x01, 0x00, cap_mid, cap_id }, + // CAP_AIM_LIVEVIDEO + { cap_aim, 0x01, 0x01, cap_mid, cap_id }, + // CAP_AIM_CAMERA + { cap_aim, 0x01, 0x02, cap_mid, cap_id }, + // CAP_AIM_ICHATAV + { cap_aim, 0x01, 0x05, cap_mid, cap_id }, + // CAP_AIM_SMS + { cap_aim, 0x01, 0xff, cap_mid, cap_id }, + // unknown + { cap_aim, 0xf0, 0x03, cap_mid, cap_id }, + { cap_aim, 0xf0, 0x05, cap_mid, cap_id }, + + // from http://community.livejournal.com/oscardoc/12366.html: + // HasMicrophone + { cap_aim, 0x01, 0x03, cap_mid, cap_id }, + // RtcAudio + { cap_aim, 0x01, 0x04, cap_mid, cap_id }, + // Aca + { cap_aim, 0x01, 0x06, cap_mid, cap_id }, + // MultiAudio + { cap_aim, 0x01, 0x07, cap_mid, cap_id }, + // MultiVideo + { cap_aim, 0x01, 0x08, cap_mid, cap_id }, + // Viceroy + { cap_aim, 0xf0, 0x04, cap_mid, cap_id }, + + // unknown QIP caps: + { 0xd3, 0xd4, 0x53, 0x19, 0x8b, 0x32, 0x40, 0x3b, + 0xac, 0xc7, 0xd1, 0xa9, 0xe2, 0xb5, 0x81, 0x3e }, + { 0x78, 0x5e, 0x8c, 0x48, 0x40, 0xd3, 0x4c, 0x65, + 0x88, 0x6f, 0x04, 0xcf, 0x3f, 0x3f, 0x43, 0xdf }, + { 0xe6, 0x01, 0xe4, 0x1c, 0x33, 0x73, 0x4b, 0xd1, + 0xbc, 0x06, 0x81, 0x1d, 0x6c, 0x32, 0x3d, 0x81 }, + { 0x61, 0xbe, 0xe0, 0xdd, 0x8b, 0xdd, 0x47, 0x5d, + 0x8d, 0xee, 0x5f, 0x4b, 0xaa, 0xcf, 0x19, 0xa7 }, + + // from mICQ: + { 0x17, 0x8c, 0x2d, 0x9b, 0xda, 0xa5, 0x45, 0xbb, + 0x8d, 0xdb, 0xf3, 0xbd, 0xbd, 0x53, 0xa1, 0x0a }, + { 0x67, 0x36, 0x15, 0x15, 0x61, 0x2d, 0x4c, 0x07, + 0x8f, 0x3d, 0xbd, 0xe6, 0x40, 0x8e, 0xa0, 0x41 }, + { 0xe3, 0x62, 0xc1, 0xe9, 0x12, 0x1a, 0x4b, 0x94, + 0xa6, 0x26, 0x7a, 0x74, 0xde, 0x24, 0x27, 0x0d }, + { 0xb9, 0x97, 0x08, 0xb5, 0x3a, 0x92, 0x42, 0x02, + 0xb0, 0x69, 0xf1, 0xe7, 0x57, 0xbb, 0x2e, 0x17 }, + { 0xb6, 0x07, 0x43, 0x78, 0xf5, 0x0c, 0x4a, 0xc7, + 0x90, 0x92, 0x59, 0x38, 0x50, 0x2d, 0x05, 0x91 }, + { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x19, 0x04, + 0x4a, 0x16, 0xed, 0x79, 0x2c, 0xb1, 0x71, 0x01 }, + { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xb3, 0xf8, + 0x53, 0x44, 0x7f, 0x0d, 0x2d, 0x83, 0xbd, 0x76 }, +*/ + // CAP_NULL + { cap_none, cap_none }, + }; + +const capability *ICQClient::capabilities = arrCapabilities; + +#ifndef VERSION +#define VERSION "0.1" +#endif + +static unsigned char get_ver(const char *&v) +{ + if (v == NULL) + return 0; + char c = (char)atol(v); + v = strchr(v, '.'); + if (v) + v++; + return c; +} + +static bool isWide(const QString &str) +{ + for (int i = 0; i < (int)(str.length()); i++) + if (str[i].unicode() > 0x7F) + return true; + return true; +} + +static inline bool isWide(const SIM::Data &data) +{ + return isWide(data.str()); +} + +void ICQClient::encodeString(const QString &str, unsigned short nTlv, bool bWide) +{ + if (str.isEmpty()){ + socket()->writeBuffer().tlv(nTlv); + return; + } + QString m = str; + if (bWide){ + unsigned short *unicode = new unsigned short[m.length()]; + unsigned short *t = unicode; + for (int i = 0; i < (int)(m.length()); i++) + *(t++) = htons(m[i].unicode()); + socket()->writeBuffer().tlv(nTlv, (char*)unicode, (unsigned short)(m.length() * sizeof(unsigned short))); + delete[] unicode; + }else{ + socket()->writeBuffer().tlv(nTlv, m.toLatin1().data()); + } +} + +void ICQClient::encodeString(const QString &m, const QString &type, unsigned short charsetTlv, unsigned short infoTlv) +{ + bool bWide = isWide(m); + QString content_type = type + "; charset=\""; + if (bWide){ + unsigned short *unicode = new unsigned short[m.length()]; + unsigned short *t = unicode; + for (int i = 0; i < (int)(m.length()); i++) + *(t++) = htons(m[i].unicode()); + content_type += "unicode-2\""; + socket()->writeBuffer().tlv(charsetTlv, content_type.toUtf8().data()); + socket()->writeBuffer().tlv(infoTlv, (char*)unicode, (unsigned short)(m.length() * sizeof(unsigned short))); + delete[] unicode; + }else{ + content_type += "us-ascii\""; + socket()->writeBuffer().tlv(charsetTlv, content_type.toUtf8().data()); + socket()->writeBuffer().tlv(infoTlv, m.toLatin1().data()); + } +} + +void ICQClient::addCapability(ICQBuffer &cap, cap_id_t id) +{ + cap.pack((char*)capabilities[id], sizeof(capability)); +} + +void ICQClient::sendCapability(const QString &away_msg) +{ + ICQBuffer cap; + capability c; + + memcpy(c, capabilities[CAP_SIM], sizeof(c)); + const char *ver = VERSION; + unsigned char *pack_ver = c + sizeof(capability) - 4; + *(pack_ver++) = get_ver(ver); + *(pack_ver++) = get_ver(ver); + *(pack_ver++) = get_ver(ver); + unsigned char os_ver; +#ifdef WIN32 + os_ver = 0x80; +#else +#ifdef Q_OS_MAC + os_ver = 0x40; +#else + os_ver = 0; +#endif +#endif + *(pack_ver++) = os_ver | get_ver(ver); + addCapability(cap, CAP_AIM_SHORTCAPS); + addCapability(cap, CAP_AIM_SUPPORT); + addCapability(cap, CAP_AVATAR); + if (m_bAIM){ + addCapability(cap, CAP_AIM_CHAT); + addCapability(cap, CAP_AIM_BUDDYCON); + addCapability(cap, CAP_AIM_IMIMAGE); + addCapability(cap, CAP_AIM_SENDFILE); + addCapability(cap, CAP_AIM_BUDDYLIST); + }else{ + addCapability(cap, CAP_AIM_SENDFILE); //Since we add this, ICQ6 accepts the client as filetransfer partner + addCapability(cap, CAP_DIRECT); + addCapability(cap, CAP_SRV_RELAY); + addCapability(cap, CAP_XTRAZ); // What? We don't support it. Yet. + if (getSendFormat() <= 1) + addCapability(cap, CAP_UTF); + if (getSendFormat() == 0) + addCapability(cap, CAP_RTF); + } + if (!getDisableTypingNotification()) + cap.pack((char*)capabilities[CAP_TYPING], sizeof(capability)); + + cap.pack((char*)c, sizeof(c)); + snac(ICQ_SNACxFOOD_LOCATION, ICQ_SNACxLOC_SETxUSERxINFO); + if (m_bAIM){ + if (data.owner.ProfileFetch.toBool()){ + QString profile; + profile = QString("") + data.owner.About.str() + ""; + encodeString(profile, "text/aolrtf", 1, 2); + } + if (!away_msg.isNull()) + encodeString(away_msg, "text/plain", 3, 4); + } + socket()->writeBuffer().tlv(0x0005, cap); + if (m_bAIM) + socket()->writeBuffer().tlv(0x0006, "\x00\x04\x00\x02\x00\x02", 6); + sendPacket(true); +} + +void ICQClient::setAwayMessage(const QString &msg) +{ + snac(ICQ_SNACxFOOD_LOCATION, ICQ_SNACxLOC_SETxUSERxINFO); + if (!msg.isNull()){ + encodeString(msg, "text/plain", 3, 4); + }else{ + socket()->writeBuffer().tlv(0x0004); + } + sendPacket(true); +} + +void ICQClient::fetchProfile(ICQUserData *data) +{ + snac(ICQ_SNACxFOOD_LOCATION, ICQ_SNACxLOC_REQUESTxUSERxINFO, true); + socket()->writeBuffer() << (unsigned short)0x0001; + socket()->writeBuffer().packScreen(screen(data)); + sendPacket(false); + snac(ICQ_SNACxFOOD_LOCATION, ICQ_SNACxLOC_REQUESTxDIRxINFO, true); + socket()->writeBuffer().packScreen(screen(data)); + sendPacket(false); + m_info_req.insert(INFO_REQ_MAP::value_type(m_nMsgSequence, screen(data))); + data->ProfileFetch.setBool(true); +} + +void ICQClient::fetchProfiles() +{ + if (!data.owner.ProfileFetch.toBool()) + fetchProfile(&data.owner); + Contact *contact; + ContactList::ContactIterator itc; + while ((contact = ++itc) != NULL){ + ICQUserData *data; + ClientDataIterator itd(contact->clientData, this); + while ((data = toICQUserData(++itd)) != NULL){ + if (data->Uin.toULong() || data->ProfileFetch.toBool()) + continue; + fetchProfile(data); + } + } +} + +ICQUserData *ICQClient::findInfoRequest(unsigned short seq, Contact *&contact) +{ + INFO_REQ_MAP::iterator it = m_info_req.find(seq); + if (it == m_info_req.end()){ + log(L_WARN, "Info req %u not found", seq); + return NULL; + } + QString screen = it->second; + m_info_req.erase(it); + return findContact(screen, NULL, false, contact); +} + +void ICQClient::setAIMInfo(ICQUserData *data) +{ + if (getState() != Connected) + return; + bool bWide = isWide(data->FirstName) || + isWide(data->LastName) || + isWide(data->MiddleName) || + isWide(data->Maiden) || + isWide(data->Nick) || + isWide(data->Zip) || + isWide(data->Address) || + isWide(data->City); + QString country; + for (const ext_info *e = getCountryCodes(); e->szName; e++){ + if (e->nCode == data->Country.toULong()){ + country = e->szName; + break; + } + } + snac(ICQ_SNACxFOOD_LOCATION, ICQ_SNACxLOC_SETxDIRxINFO); + QString encoding = bWide ? "unicode-2-0" : "us-ascii"; + socket()->writeBuffer().tlv(0x1C, encoding.toUtf8().data()); + socket()->writeBuffer().tlv(0x0A, (unsigned short)0x01); + encodeString(data->FirstName.str(), 0x01, bWide); + encodeString(data->LastName.str(), 0x02, bWide); + encodeString(data->MiddleName.str(), 0x03, bWide); + encodeString(data->Maiden.str(), 0x04, bWide); + encodeString(country, 0x06, bWide); + encodeString(data->Address.str(), 0x07, bWide); + encodeString(data->City.str(), 0x08, bWide); + encodeString(data->Nick.str(), 0x0C, bWide); + encodeString(data->Zip.str(), 0x0D, bWide); + encodeString(data->State.str(), 0x21, bWide); + sendPacket(false); + + ICQUserData *ownerData = &this->data.owner; + ownerData->FirstName.str() = data->FirstName.str(); + ownerData->LastName.str() = data->LastName.str(); + ownerData->MiddleName.str() = data->MiddleName.str(); + ownerData->Maiden.str() = data->Maiden.str(); + ownerData->Address.str() = data->Address.str(); + ownerData->City.str() = data->City.str(); + ownerData->Nick.str() = data->Nick.str(); + ownerData->Zip.str() = data->Zip.str(); + ownerData->State.str() = data->State.str(); + ownerData->Country.asULong() = data->Country.toULong(); +} + +void ICQClient::setProfile(ICQUserData *data) +{ + snac(ICQ_SNACxFOOD_LOCATION, ICQ_SNACxLOC_SETxUSERxINFO); + QString profile; + profile = QString("") + data->About.str() + ""; + encodeString(profile, "text/aolrtf", 1, 2); + sendPacket(false); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "icqlocation.moc" +#endif +*/ diff --git a/plugins/icq/icqlocation.h b/plugins/icq/icqlocation.h new file mode 100644 index 0000000..9face63 --- /dev/null +++ b/plugins/icq/icqlocation.h @@ -0,0 +1,18 @@ + +#ifndef ICQLOCATION_H +#define ICQLOCATION_H + +#include "snac.h" +#include + +class SnacIcqLocation : public QObject, public SnacHandler +{ + Q_OBJECT +public: + SnacIcqLocation(ICQClient* client); + virtual ~SnacIcqLocation(); + +}; + + +#endif diff --git a/plugins/icq/icqlogin.cpp b/plugins/icq/icqlogin.cpp new file mode 100644 index 0000000..37f03fa --- /dev/null +++ b/plugins/icq/icqlogin.cpp @@ -0,0 +1,398 @@ +/*************************************************************************** + login.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include + +#include "log.h" +#include "buffer.h" +#include "socket/socket.h" + +#include "icqclient.h" +#include "verifydlg.h" + +using namespace SIM; + +const unsigned short ICQ_SNACxLOGIN_ERROR = 0x0001; +const unsigned short ICQ_SNACxLOGIN_MD5xLOGIN = 0x0002; +const unsigned short ICQ_SNACxLOGIN_LOGINxREPLY = 0x0003; +const unsigned short ICQ_SNACxLOGIN_REGISTERxREQ = 0x0004; +const unsigned short ICQ_SNACxLOGIN_REGISTER = 0x0005; +const unsigned short ICQ_SNACxLOGIN_AUTHxREQUEST = 0x0006; +const unsigned short ICQ_SNACxLOGIN_AUTHxKEYxRESPONSE = 0x0007; +const unsigned short ICQ_SNACxLOGIN_REGISTERxREQ_IMG = 0x000c; +const unsigned short ICQ_SNACxLOGIN_REGISTERxSEND_IMG = 0x000d; + +const unsigned ICQ_LOGIN_ERRxBAD_PASSWD1 = 0x0001; +const unsigned ICQ_LOGIN_ERRxBAD_PASSWD2 = 0x0004; +const unsigned ICQ_LOGIN_ERRxBAD_PASSWD3 = 0x0005; +const unsigned ICQ_LOGIN_ERRxBAD_LOGIN = 0x0006; +const unsigned ICQ_LOGIN_ERRxNOT_EXISTS1 = 0x0007; +const unsigned ICQ_LOGIN_ERRxNOT_EXISTS2 = 0x0008; +const unsigned ICQ_LOGIN_ERRxUNAVAILABLE1 = 0x000c; +const unsigned ICQ_LOGIN_ERRxUNAVAILABLE2 = 0x000d; +const unsigned ICQ_LOGIN_ERRxSUSPENDED1 = 0x0011; +const unsigned ICQ_LOGIN_ERRxUNAVAILABLE3 = 0x0012; +const unsigned ICQ_LOGIN_ERRxUNAVAILABLE4 = 0x0013; +const unsigned ICQ_LOGIN_ERRxUNAVAILABLE5 = 0x0014; +const unsigned ICQ_LOGIN_ERRxUNAVAILABLE6 = 0x0015; +const unsigned ICQ_LOGIN_ERRxIP_RATE_LIMIT1 = 0x0016; +const unsigned ICQ_LOGIN_ERRxIP_RATE_LIMIT2 = 0x0017; +const unsigned ICQ_LOGIN_ERRxRATE_LIMIT1 = 0x0018; +const unsigned ICQ_LOGIN_ERRxUNAVAILABLE7 = 0x001a; +const unsigned ICQ_LOGIN_ERRxOLDCLIENT1 = 0x001b; +const unsigned ICQ_LOGIN_ERRxOLDCLIENT2 = 0x001c; +const unsigned ICQ_LOGIN_ERRxRATE_LIMIT2 = 0x001d; +const unsigned ICQ_LOGIN_ERRxCANT_REGISTER = 0x001e; +const unsigned ICQ_LOGIN_ERRxUNAVAILABLE8 = 0x001f; +const unsigned ICQ_LOGIN_ERRxINVALID_ID = 0x0020; +const unsigned ICQ_LOGIN_ERRxTOO_YOUNG = 0x0022; + +void ICQClient::snac_login(unsigned short type, unsigned short) +{ + unsigned long newUin; + switch (type){ + case ICQ_SNACxLOGIN_ERROR: + if (data.owner.Uin.toULong()){ + m_reconnect = NO_RECONNECT; + socket()->error_state(I18N_NOOP("Login error"), AuthError); + break; + } + // in the process of registering; + // it seems that we need to request bot protection picture; + // reconnecting to send the request. + log(L_DEBUG, "Verification required, reconnecting"); + m_bVerifying = true; + socket()->close(); + socket()->connect(getServer(), getPort(), this); + break; + case ICQ_SNACxLOGIN_REGISTER: + if (data.owner.Uin.toULong()){ + socket()->error_state(I18N_NOOP("Registered in no register state")); + break; + } + socket()->readBuffer().incReadPos(0x2E); + socket()->readBuffer().unpack(newUin); + log(L_DEBUG, "Register %lu %08lX", newUin, newUin); + setUin(newUin); + setState(Connecting); + socket()->connect(getServer(), getPort(), this); + break; + case ICQ_SNACxLOGIN_AUTHxKEYxRESPONSE: + log(L_DEBUG, "Sending MD5 key"); + if (!data.owner.Screen.str().isEmpty() || data.owner.Uin.toULong()){ + QByteArray md5_key; + socket()->readBuffer().unpackStr(md5_key); + snac(ICQ_SNACxFOOD_LOGIN, ICQ_SNACxLOGIN_MD5xLOGIN, false, false); + if (data.owner.Uin.toULong()){ + char uin[20]; + sprintf(uin, "%lu", data.owner.Uin.toULong()); + socket()->writeBuffer().tlv(0x0001, uin); + } + else + { + socket()->writeBuffer().tlv(0x0001, data.owner.Screen.str().toUtf8().data()); + } + QByteArray md = md5_key; + md += getContacts()->fromUnicode(NULL, getPassword()); + md += "AOL Instant Messenger (SM)"; + md = QCryptographicHash::hash(md, QCryptographicHash::Md5); + socket()->writeBuffer().tlv(0x0025, md.data(), md.size()); + if (data.owner.Uin.toULong()){ + socket()->writeBuffer().tlv(0x0003, "ICQBasic"); //ToDo: Should be updated anytime + socket()->writeBuffer().tlv(0x0016, 0x010A); // ID Number + socket()->writeBuffer().tlv(0x0017, 0x0014); // major + socket()->writeBuffer().tlv(0x0018, 0x0034); // minor + socket()->writeBuffer().tlv(0x0019, 0x0009); + socket()->writeBuffer().tlv(0x001A, 0x0c18); + socket()->writeBuffer().tlv(0x0014, 0x0000043dL); + socket()->writeBuffer().tlv(0x000f, "en"); + socket()->writeBuffer().tlv(0x000e, "us"); + }else{ + socket()->writeBuffer().tlv(0x0003, "AOL Instant Messenger, version 5.1.3036/WIN32"); //ToDo: Should be updated anytime + socket()->writeBuffer().tlv(0x0016, (unsigned short)0x0109); + socket()->writeBuffer().tlv(0x0017, (unsigned short)0x0005); + socket()->writeBuffer().tlv(0x0018, (unsigned short)0x0001); + socket()->writeBuffer().tlv(0x0019, (unsigned short)0x0000); + socket()->writeBuffer().tlv(0x001A, (unsigned short)0x0BDC); + socket()->writeBuffer().tlv(0x0014, 0x000000D2L); + socket()->writeBuffer().tlv(0x000F, "en"); //Todo Send right language shortcut ;) same below + socket()->writeBuffer().tlv(0x000E, "us"); + socket()->writeBuffer().tlv(0x004A, "\x01"); + } + sendPacket(true); + } + break; + case ICQ_SNACxLOGIN_LOGINxREPLY: + chn_close(); + break; + case ICQ_SNACxLOGIN_REGISTERxSEND_IMG: { + m_bVerifying = false; + TlvList tlv(socket()->readBuffer()); + // currently there are 2 TLVs in SNAC(17,0D): + // type = 1: the value contains the mime type of the image (image/jpeg); ignored + // type = 2: the value contains the image itself in the binary form + Tlv* tlvImage = tlv(2); + if (!tlvImage) + break; + log(L_DEBUG, "Image length: %d bytes", tlvImage->Size()); + QByteArray buf = tlvImage->byteArray(); + QPixmap pict; + if (!pict.loadFromData(buf)) + break; + log(L_DEBUG, "Received verification image"); + VerifyDlg verdlg(qApp->activeWindow(), pict); + if (verdlg.exec() == QDialog::Accepted) // what to do if the user has cancelled the dialog? + { + QString verifyStr = verdlg.getVerifyString(); + log(L_DEBUG, "User input: %s", qPrintable(verifyStr)); + snac(ICQ_SNACxFOOD_LOGIN, ICQ_SNACxLOGIN_REGISTERxREQ); + ICQBuffer msg; + msg + << 0x00000000L << 0x28000300L << 0x00000000L + << 0x00000000L << 0x94680000L << 0x94680000L + << 0x00000000L << 0x00000000L << 0x00000000L + << 0x00000000L; + QByteArray pswd = getContacts()->fromUnicode(NULL, getPassword()); + unsigned short len = (unsigned short)(pswd.length() + 1); + msg.pack(len); + msg.pack(pswd.data(), len); + msg << 0x94680000L << 0x00000602L; + socket()->writeBuffer().tlv(0x0001, msg); + socket()->writeBuffer().tlv(0x0009, verifyStr.toLatin1(), verifyStr.length()); + sendPacket(true); + } + break; + } + default: + log(L_WARN, "Unknown login foodgroup type %04X", type); + } +} + +void ICQClient::chn_login() +{ + m_bconnectionLost = false; + if (m_cookie.size()){ + flap(ICQ_CHNxNEW); + socket()->writeBuffer() << 0x00000001L; + socket()->writeBuffer().tlv(6, m_cookie.data(), (unsigned short)(m_cookie.size())); + m_cookie.resize(0); + sendPacket(true); + return; + } + if (data.owner.Uin.toULong() && ! getUseMD5()){ + QByteArray pswd = cryptPassword(); + log(L_DEBUG, "Login %lu [%s]", data.owner.Uin.toULong(), /*pswd.c_str()*/""); + char uin[20]; + sprintf(uin, "%lu", data.owner.Uin.toULong()); + + flap(ICQ_CHNxNEW); + socket()->writeBuffer() << 0x00000001L; + socket()->writeBuffer().tlv(0x0001, uin); + socket()->writeBuffer().tlv(0x0002, pswd.data(), pswd.size()); + // Thanks to pidgin guys for those values + socket()->writeBuffer().tlv(0x0003, "ICQBasic"); // ID String, currently ICQ 5.1 (21.08.2006) + socket()->writeBuffer().tlv(0x0016, 0x010A); // ID Number + socket()->writeBuffer().tlv(0x0017, 0x0014); // major + socket()->writeBuffer().tlv(0x0018, 0x0034); // minor + socket()->writeBuffer().tlv(0x0019, 0x0000); // lesser + socket()->writeBuffer().tlv(0x001A, 0x0c18); // build number + socket()->writeBuffer().tlv(0x0014, 0x0000043dL); // distribution number + socket()->writeBuffer().tlv(0x000f, "en"); //Todo Send right language shortcut + socket()->writeBuffer().tlv(0x000e, "us"); + sendPacket(true); + return; + } + if (!data.owner.Screen.str().isEmpty() || getUseMD5()){ + log(L_DEBUG, "Requesting MD5 salt"); + flap(ICQ_CHNxNEW); + socket()->writeBuffer() << 0x00000001L; + sendPacket(true); + snac(ICQ_SNACxFOOD_LOGIN, ICQ_SNACxLOGIN_AUTHxREQUEST, false, false); + if (data.owner.Uin.toULong()) + { + QString uin = QString::number(data.owner.Uin.toULong()); + socket()->writeBuffer().tlv(0x0001, uin.toUtf8().data()); + }else{ + socket()->writeBuffer().tlv(0x0001, data.owner.Screen.str().toUtf8().data()); + } + socket()->writeBuffer().tlv(0x004B); + socket()->writeBuffer().tlv(0x005A); + sendPacket(true); + return; + } + if (m_bVerifying){ + log(L_DEBUG, "Requesting verification picture"); + flap(ICQ_CHNxNEW); + socket()->writeBuffer() << 0x00000001L; + sendPacket(true); + snac(ICQ_SNACxFOOD_LOGIN, ICQ_SNACxLOGIN_REGISTERxREQ_IMG); + sendPacket(true); + return; + } + flap(ICQ_CHNxNEW); + socket()->writeBuffer() << 0x00000001L; + sendPacket(true); + // first try the old registration scheme + snac(ICQ_SNACxFOOD_LOGIN, ICQ_SNACxLOGIN_REGISTERxREQ); + ICQBuffer msg; + msg + << 0x00000000L << 0x28000300L << 0x00000000L + << 0x00000000L << 0x94680000L << 0x94680000L + << 0x00000000L << 0x00000000L << 0x00000000L + << 0x00000000L; + QByteArray pswd = getContacts()->fromUnicode(NULL, getPassword()); + unsigned short len = (unsigned short)(pswd.length() + 1); + msg.pack(len); + msg.pack(pswd.data(), len); + msg << 0x94680000L << 0x00000602L; + socket()->writeBuffer().tlv(0x0001, msg); + sendPacket(true); +} + +void ICQClient::chn_close() +{ + unsigned errorCode = 0; + TlvList tlv(socket()->readBuffer()); + Tlv *tlv_error = tlv(8); + if (tlv_error){ + unsigned short err = *tlv_error; + QString errString; + switch (err){ + case ICQ_LOGIN_ERRxOLDCLIENT1: + case ICQ_LOGIN_ERRxOLDCLIENT2: + errString = I18N_NOOP("This client is outdated"); + m_reconnect = NO_RECONNECT; + break; + case ICQ_LOGIN_ERRxIP_RATE_LIMIT1: + case ICQ_LOGIN_ERRxIP_RATE_LIMIT2: + errString = I18N_NOOP("Too many clients from same IP"); + m_reconnect = NO_RECONNECT; + break; + case ICQ_LOGIN_ERRxRATE_LIMIT1: + case ICQ_LOGIN_ERRxRATE_LIMIT2: + errString = I18N_NOOP("Rate limit"); + m_reconnect = NO_RECONNECT; + break; + case ICQ_LOGIN_ERRxBAD_PASSWD1: + case ICQ_LOGIN_ERRxBAD_PASSWD2: + case ICQ_LOGIN_ERRxBAD_PASSWD3: + errString = I18N_NOOP("Invalid UIN and password combination"); + m_reconnect = NO_RECONNECT; + errorCode = AuthError; + break; + case ICQ_LOGIN_ERRxNOT_EXISTS1: + case ICQ_LOGIN_ERRxNOT_EXISTS2: + errString = I18N_NOOP("Non-existant UIN"); + m_reconnect = NO_RECONNECT; + errorCode = AuthError; + break; + case ICQ_LOGIN_ERRxBAD_LOGIN: + errString = I18N_NOOP("Bad login procedure"); + m_reconnect = NO_RECONNECT; + break; + case ICQ_LOGIN_ERRxUNAVAILABLE1: + case ICQ_LOGIN_ERRxUNAVAILABLE2: + case ICQ_LOGIN_ERRxUNAVAILABLE3: + case ICQ_LOGIN_ERRxUNAVAILABLE4: + case ICQ_LOGIN_ERRxUNAVAILABLE5: + case ICQ_LOGIN_ERRxUNAVAILABLE6: + case ICQ_LOGIN_ERRxUNAVAILABLE7: + case ICQ_LOGIN_ERRxUNAVAILABLE8: + errString = I18N_NOOP("Service temporarly unavailable"); + m_reconnect = NO_RECONNECT; + break; + case ICQ_LOGIN_ERRxINVALID_ID: + errString = I18N_NOOP("Invalid SecureID"); + m_reconnect = NO_RECONNECT; + break; + case ICQ_LOGIN_ERRxTOO_YOUNG: + errString = I18N_NOOP("Too young!"); + m_reconnect = NO_RECONNECT; + break; + case ICQ_LOGIN_ERRxSUSPENDED1: + errString = I18N_NOOP("UIN was suspended"); + m_reconnect = NO_RECONNECT; + break; + case ICQ_LOGIN_ERRxCANT_REGISTER: + errString = I18N_NOOP("Can't login to ICQ network - Please try again later"); + m_reconnect = NO_RECONNECT; + break; + case 0: + break; + default: + errString = "Unknown error "; + errString += QString::number(err); + } + if (err){ + log(L_ERROR, "%s", qPrintable(errString)); + socket()->error_state(errString, errorCode); + flap(ICQ_CHNxCLOSE); + sendPacket(true); + return; + } + } + tlv_error = tlv(9); + if (tlv_error){ + QString errString; + unsigned short err = *tlv_error; + switch (err){ + case 0x1:{ + errString = I18N_NOOP("Your UIN is being used from another location"); + m_reconnect = NO_RECONNECT; + break; + } + case 0: + break; + default: + errString = "Unknown run-time error "; + errString += QString::number(err); + } + if (err){ + log(L_ERROR, "%s", qPrintable(errString)); + socket()->error_state(errString); + return; + } + } + flap(ICQ_CHNxCLOSE); + sendPacket(true); + + Tlv *tlv_host = tlv(5); + Tlv *tlv_cookie = tlv(6); + if ((tlv_host == NULL) || (tlv_cookie == NULL)){ + socket()->error_state(I18N_NOOP("Close packet from server")); + return; + } + QString host = tlv_host->byteArray().data(); + int idx = host.indexOf(':'); + if (idx == -1){ + log(L_ERROR, "Bad host address %s", qPrintable(host)); + socket()->error_state(I18N_NOOP("Bad host address")); + return; + } + unsigned short port = host.mid(idx + 1).toUShort(); + host = host.left(idx); + + socket()->close(); + socket()->connect(host, port, this); + m_cookie = tlv_cookie->byteArray(); + m_cookie.resize(m_cookie.size() - 1); // tlv has \0 terminator... time for Qt4 +} + diff --git a/plugins/icq/icqmessage.cpp b/plugins/icq/icqmessage.cpp new file mode 100644 index 0000000..ca41fae --- /dev/null +++ b/plugins/icq/icqmessage.cpp @@ -0,0 +1,1593 @@ +/*************************************************************************** + icqmessage.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "simgui/toolbtn.h" +#include "log.h" + +#include "icqmessage.h" +#include "icqclient.h" +#include "icq.h" +#include "core.h" +#include "xml.h" +#include "contacts/contact.h" + +using namespace std; +using namespace SIM; + +static DataDef aimFileMessageData[] = + { + { "", DATA_ULONG, 1, 0 }, // Port + { "", DATA_ULONG, 1, 0 }, // ID_L + { "", DATA_ULONG, 1, 0 }, // ID_H + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +AIMFileMessage::AIMFileMessage(Buffer *cfg) + : FileMessage(MessageFile, cfg) +{ + load_data(aimFileMessageData, &data, cfg); + isProxy = false; +} + +AIMFileMessage::~AIMFileMessage() +{ + free_data(aimFileMessageData, &data); +} + +static DataDef icqFileMessageData[] = + { + { "ServerDescr", DATA_STRING, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // IP + { "", DATA_ULONG, 1, 0 }, // Port + { "", DATA_ULONG, 1, 0 }, // ID_L + { "", DATA_ULONG, 1, 0 }, // ID_H + { "", DATA_ULONG, 1, 0 }, // Cookie + { "", DATA_ULONG, 1, 0 }, // Extended + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +ICQFileMessage::ICQFileMessage(Buffer *cfg) + : FileMessage(MessageICQFile, cfg) +{ + load_data(icqFileMessageData, &data, cfg); +} + +ICQFileMessage::~ICQFileMessage() +{ + free_data(icqFileMessageData, &data); +} + +QString ICQFileMessage::getDescription() +{ + QString serverText = getServerDescr(); + if (serverText.isEmpty()) + return FileMessage::getDescription(); + return serverText; +} + +QByteArray ICQFileMessage::save() +{ + QByteArray s = FileMessage::save(); + QByteArray s1 = save_data(icqFileMessageData, &data); + if (!s1.isEmpty()){ + if (!s.isEmpty()) + s += '\n'; + s += s1; + } + return s; +} + +IcqContactsMessage::IcqContactsMessage(Buffer *cfg) + : ContactsMessage(MessageICQContacts, cfg) +{ +} + +IcqContactsMessage::~IcqContactsMessage() +{ +} + +QString IcqContactsMessage::getContacts() const +{ + QByteArray serverText = getServerText(); + if (serverText.isEmpty()) + return ContactsMessage::getContacts(); + return serverText; // this is wrong ... but I'm currently unsure what'ssaved in there +} + +static DataDef icqAuthMessageData[] = + { + { "Charset", DATA_STRING, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +ICQAuthMessage::ICQAuthMessage(unsigned type, unsigned baseType, Buffer *cfg) + : AuthMessage(type, cfg) +{ + load_data(icqAuthMessageData, &data, cfg); + m_baseType = baseType; +} + +ICQAuthMessage::~ICQAuthMessage() +{ + free_data(icqAuthMessageData, &data); +} + +QString ICQAuthMessage::getText() const +{ + QByteArray serverText = getServerText(); + if (serverText.isEmpty()) + return Message::getText(); + QString charset = getCharset(); + if (!charset.isEmpty()){ + QTextCodec *codec = QTextCodec::codecForName(charset.toUtf8().constData()); + if (codec) + return codec->toUnicode(serverText); + } + return Message::getText(); +} + +QByteArray ICQAuthMessage::save() +{ + QByteArray s = Message::save(); + QByteArray s1 = save_data(icqAuthMessageData, &data); + if (!s1.isEmpty()){ + if (!s.isEmpty()) + s += '\n'; + s += s1; + } + return s; +} + +static bool h2b(const char *&p, char &r) +{ + char c = *(p++); + if ((c >= '0') && (c <= '9')){ + r = (char)(c - '0'); + return true; + } + if ((c >= 'A') && (c <= 'F')){ + r = (char)(c - 'A' + 10); + return true; + } + return false; +} + +static bool h2b(const char *&p, QByteArray &cap) +{ + char r1, r2; + if (h2b(p, r1) && h2b(p, r2)){ + cap += (char)((r1 << 4) + r2); + return true; + } + return false; +} + +static bool parseFE(QByteArray str, QList &l, unsigned n) +{ + int idx = str.indexOf('\xFE'); + while(idx != -1) { + l += str.left(idx); + str = str.mid(idx+1); + idx = str.indexOf('\xFE'); + } + l += str; + for( unsigned i = l.count(); i < n; i++ ) + l += QByteArray(); + return true; +} + +static Message *parseTextMessage(const QByteArray &str, const QByteArray &_pp, Contact *contact) +{ + if (str.isEmpty()) + return NULL; + log(L_DEBUG, "Text message: %s %s", str.data(), _pp.data()); + if (_pp.length() == 38){ + QByteArray cap; + const char *pp = _pp.data(); + if ((*(pp++) == '{') && + h2b(pp, cap) && h2b(pp, cap) && h2b(pp, cap) && h2b(pp, cap) && + (*(pp++) == '-') && + h2b(pp, cap) && h2b(pp, cap) && + (*(pp++) == '-') && + h2b(pp, cap) && h2b(pp, cap) && + (*(pp++) == '-') && + h2b(pp, cap) && h2b(pp, cap) && + (*(pp++) == '-') && + h2b(pp, cap) && h2b(pp, cap) && h2b(pp, cap) && h2b(pp, cap) && + h2b(pp, cap) && h2b(pp, cap) && + (*(pp++) == '}')){ + const char *unpack_cap = cap.data(); + if (!memcmp(unpack_cap, ICQClient::capabilities[CAP_RTF], sizeof(capability))){ + Message *msg = new Message(MessageGeneric); + QString text; + if (ICQClient::parseRTF(str, contact, text)) + msg->setFlags(MESSAGE_RICHTEXT); + log(L_DEBUG, "Msg: %s", str.data()); + msg->setText(text); + return msg; + } + if (!memcmp(unpack_cap, ICQClient::capabilities[CAP_UTF], sizeof(capability))){ + Message *msg = new Message(MessageGeneric); + msg->setText(QString::fromUtf8(str)); + return msg; + } + } + } + Message *m = new Message; + m->setServerText(str); + return m; +} + +static Message *parseURLMessage(const QByteArray &str) +{ + QList l; + if (!parseFE(str, l, 2)){ + log(L_WARN, "Parse error URL message"); + return NULL; + } + UrlMessage *m = new UrlMessage; + m->setServerText(l[0]); + m->setUrl(l[1]); + return m; +} + +//ToDo: Send Contacts does not work +static Message *parseContactMessage(const QByteArray &str) +{ + QList l; + if (!parseFE(str, l, 2)){ + log(L_WARN, "Parse error contacts message"); + return NULL; + } + unsigned nContacts = l[0].toUInt(); + if (nContacts == 0){ + log(L_WARN, "No contacts found"); + return NULL; + } + QList c; + if (!parseFE(l[1], c, nContacts*2+1)){ + log(L_WARN, "Parse error contacts message"); + return NULL; + } + QByteArray serverText; + for (unsigned i = 0; i < nContacts; i++){ + QByteArray screen = c[i*2]; + QByteArray alias = c[i*2+1]; + if (!serverText.isEmpty()) + serverText += ';'; + if (screen.toULong()){ + serverText += "icq:"; + serverText += screen; + serverText += '/'; + serverText += alias; + serverText += ','; + if (screen == alias){ + serverText += "ICQ "; + serverText += screen; + }else{ + serverText += alias; + serverText += " (ICQ "; + serverText += screen; + serverText += ')'; + } + }else{ + serverText += "aim:"; + serverText += screen; + serverText += '/'; + serverText += alias; + serverText += ','; + if (screen == alias){ + serverText += "AIM "; + serverText += screen; + }else{ + serverText += alias; + serverText += " (AIM "; + serverText += screen; + serverText += ')'; + } + } + } + IcqContactsMessage *m = new IcqContactsMessage; + m->setServerText(serverText); + return m; +} + +static Message *parseAuthRequest(const QByteArray &str) +{ + QList l; + if (!parseFE(str, l, 6)){ + log(L_WARN, "Parse error auth request message"); + return NULL; + } + ICQAuthMessage *m = new ICQAuthMessage(MessageICQAuthRequest, MessageAuthRequest); + m->setServerText(l[4]); + return m; +} + +Message *ICQClient::parseExtendedMessage(const QString &screen, ICQBuffer &packet, MessageId &id, unsigned cookie) +{ + string header; + packet >> header; + ICQBuffer h(header.size()); + //QString strheader(header); + h.pack(header.c_str(), header.size()); + h.incReadPos(16); + unsigned short msg_type; + h >> msg_type; + //QString msgType; + string msgType; + h.unpackStr32(msgType); + //QString info; + string info; + packet.unpackStr32(info); + ICQBuffer b(info.size()); + b.pack(info.c_str(), info.size()); + + log(L_DEBUG, "Extended message %s [%04X] %u", msgType.data(), msg_type, (unsigned int)info.length()); + + int n = msgType.find("URL"); + if (n >= 0){ + QByteArray info; + b.unpackStr32(info); + return parseURLMessage(info); + } + if (msgType == "Request For Contacts"){ + QByteArray info; + b.unpackStr32(info); + ICQAuthMessage *m = new ICQAuthMessage(MessageContactRequest, MessageContactRequest); + m->setServerText(info); + return m; + } + if (msgType == "Contacts"){ + QByteArray p; + b.unpackStr32(p); + return parseContactMessage(p); + } + if (msgType == "Message"){ + QByteArray p; + b.unpackStr32(p); + unsigned long forecolor, backcolor; + b >> forecolor >> backcolor; + QByteArray cap_str; + b.unpackStr32(cap_str); + Contact *contact; + ICQUserData *data = findContact(screen, NULL, false, contact); + if (data == NULL) { + data = findContact(screen, NULL, true, contact); + if (data == NULL) { + return NULL; + } + contact->setFlags(contact->getFlags() | CONTACT_TEMP); + } + Message *msg = parseTextMessage(p, cap_str, contact); + if (msg){ + if (forecolor != backcolor){ + msg->setForeground(forecolor >> 8); + msg->setBackground(backcolor >> 8); + } + } + return msg; + } + n = msgType.find("File"); + if (n >= 0){ + string fileDescr, fileName; + b.unpackStr32(fileDescr); + unsigned short port; + b >> port; + b.incReadPos(2); + b >> fileName; + unsigned long fileSize; + b.unpack(fileSize); + ICQFileMessage *m = new ICQFileMessage; +//#ifdef __OS2__ // to make it compileable under OS/2 (gcc 3.3.5) + m->setServerDescr(fileName.c_str()); +//#else +// m->setServerDescr(fileName); +//#endif + m->setServerText(QByteArray(fileDescr.data())); + m->setSize(fileSize); + m->setPort(port); + m->setFlags(MESSAGE_TEMP); + m->setID_L(id.id_l); + m->setID_H(id.id_h); + m->setCookie(cookie); + m->setExtended(true); + return m; + } + if (msgType == "ICQSMS"){ + string p; + b.unpackStr32(p); + //p = QCString(info).data(); // FIXME!! + string::iterator s = p.begin(); + auto_ptr top(XmlNode::parse(s, p.end())); + if (top.get() == NULL){ + log(L_WARN, "Parse SMS XML error"); + return NULL; + } + if (msg_type == 0){ + if (top->getTag() != "sms_message"){ + log(L_WARN, "No sms_message tag in SMS message"); + return NULL; + } + XmlNode *n = top.get(); + if ((n == NULL) || !n->isBranch()){ + log(L_WARN, "Parse no branch"); + return NULL; + } + XmlBranch *sms_message = static_cast(n); + XmlLeaf *text = sms_message->getLeaf("text"); + if (text == NULL){ + log(L_WARN, "No in SMS message"); + return NULL; + } + SMSMessage *m = new SMSMessage; + XmlLeaf *sender = sms_message->getLeaf("sender"); + if (sender != NULL){ + m->setPhone(QString::fromUtf8(sender->getValue().c_str())); + // string -> QString is ok here since phone doesn't contain non ascii chars + Contact *contact = getContacts()->contactByPhone(sender->getValue().c_str()); + m->setContact(contact->id()); + } + XmlLeaf *senders_network = sms_message->getLeaf("senders_network"); + if (senders_network != NULL) + m->setNetwork(QString::fromUtf8(senders_network->getValue().c_str())); + m->setText(QString::fromUtf8(text->getValue().c_str())); + return m; + } + } + if (msgType == "StatusMsgExt"){ + StatusMessage *m = new StatusMessage; + return m; + } + log(L_WARN, "Unknown extended message type %s", msgType.data()); + return NULL; +} + +Message *ICQClient::parseMessage(unsigned short type, const QString &screen, const QByteArray &p, ICQBuffer &packet, MessageId &id, unsigned cookie) +{ + if (screen.toULong() == 0x0A){ + QList l; + if (!parseFE(p, l, 6)){ + log(L_WARN, "Parse error web panel message"); + return NULL; + } + char SENDER_IP[] = "Sender IP:"; + QByteArray head = l[5].left(strlen(SENDER_IP)); + Message *msg = new Message((head == SENDER_IP) ? MessageWebPanel : MessageEmailPager); + QString name = getContacts()->toUnicode(NULL, l[0]); + QString mail = getContacts()->toUnicode(NULL, l[3]); + msg->setServerText(l[5]); + Contact *contact = getContacts()->contactByMail(mail, name); + if (contact == NULL){ + delete msg; + return NULL; + } + msg->setContact(contact->id()); + return msg; + } + log(L_DEBUG, "Parse message [type=%u]", type); + Message *msg = NULL; + switch (type){ + case ICQ_MSGxMSG:{ + unsigned long forecolor, backcolor; + packet >> forecolor >> backcolor; + QByteArray cap_str; + packet.unpackStr32(cap_str); + Contact *contact; + ICQUserData *data = findContact(screen, NULL, false, contact); + if (data == NULL) { + data = findContact(screen, NULL, true, contact); + if (data == NULL) { + return NULL; + } + contact->setFlags(contact->getFlags() | CONTACT_TEMP); + } + msg = parseTextMessage(p, cap_str, contact); + if (msg == NULL) + break; + if (forecolor != backcolor){ + msg->setForeground(forecolor >> 8); + msg->setBackground(backcolor >> 8); + } + break; + } + case ICQ_MSGxURL: + msg = parseURLMessage(p); + break; + case ICQ_MSGxAUTHxREQUEST: + msg = parseAuthRequest(p); + break; + case ICQ_MSGxAUTHxGRANTED: + msg = new AuthMessage(MessageAuthGranted); + break; + case ICQ_MSGxAUTHxREFUSED: + msg = new AuthMessage(MessageAuthRefused); + break; + case ICQ_MSGxADDEDxTOxLIST: + msg = new AuthMessage(MessageAdded); + break; + case ICQ_MSGxCONTACTxLIST: + msg = parseContactMessage(p); + break; + case ICQ_MSGxFILE:{ + ICQFileMessage *m = new ICQFileMessage; + m->setServerText(p); + unsigned short port; + unsigned long fileSize; + QByteArray fileName; + packet >> port; + packet.incReadPos(2); + packet >> fileName; + packet.unpack(fileSize); + m->setPort(port); + m->setSize(fileSize); + m->setServerDescr(fileName); + msg = m; + break; + } + case ICQ_MSGxEXT: + msg = parseExtendedMessage(screen, packet, id, cookie); + break; + default: + log(L_WARN, "Unknown message type %04X", type); + } + return msg; +} + +static Message *createIcqFile(Buffer *cfg) +{ + return new ICQFileMessage(cfg); +} + +#if 0 +i18n("File", "%n files", 1); +#endif + +static MessageDef defIcqFile = + { + NULL, + NULL, + MESSAGE_CHILD, + "File", + "%n files", + createIcqFile, + NULL, + NULL + }; + +#if 0 +i18n("WWW-panel message", "%n WWW-panel messages", 1); +#endif + +static Message *createWebPanel(Buffer *cfg) +{ + return new Message(MessageWebPanel, cfg); +} + +static MessageDef defWebPanel = + { + NULL, + NULL, + MESSAGE_DEFAULT, + "WWW-panel message", + "%n WWW-panel messages", + createWebPanel, + NULL, + NULL + }; + +#if 0 +i18n("Email pager message", "%n Email pager messages", 1); +#endif + +static Message *createEmailPager(Buffer *cfg) +{ + return new Message(MessageEmailPager, cfg); +} + +static MessageDef defEmailPager = + { + NULL, + NULL, + MESSAGE_DEFAULT, + "Email pager message", + "%n Email pager messages", + createEmailPager, + NULL, + NULL + }; + +#if 0 +i18n("Request secure channel", "%n requests secure channel", 1); +#endif + +static Message *createOpenSecure(Buffer *cfg) +{ + return new Message(MessageOpenSecure, cfg); +} + +static MessageDef defOpenSecure = + { + NULL, + NULL, + MESSAGE_SENDONLY, + "Request secure channel", + "%n requests secure channel", + createOpenSecure, + NULL, + NULL + }; + +#if 0 +i18n("Close secure channel", "%n times close secure channel", 1); +#endif + +static Message *createCloseSecure(Buffer *cfg) +{ + return new Message(MessageCloseSecure, cfg); +} + +static MessageDef defCloseSecure = + { + NULL, + NULL, + MESSAGE_SILENT | MESSAGE_SENDONLY, + "Close secure channel", + "%n times close secure channel", + createCloseSecure, + NULL, + NULL + }; + +#if 0 +i18n("Warning", "%n warnings", 1); +#endif + +static DataDef warningMessageData[] = + { + { "Anonymous", DATA_BOOL, 1, 0 }, + { "OldLevel", DATA_ULONG, 1, 0 }, + { "NewLevel", DATA_ULONG, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +WarningMessage::WarningMessage(Buffer *cfg) + : AuthMessage(MessageWarning, cfg) +{ + load_data(warningMessageData, &data, cfg); +} + +QByteArray WarningMessage::save() +{ + QByteArray res = AuthMessage::save(); + if (!res.isEmpty()) + res += '\n'; + return res + save_data(warningMessageData, &data); +} + +QString WarningMessage::presentation() +{ + return QString("Increase warning level from %1% to %2%") + .arg(ICQClient::warnLevel(getOldLevel())) + .arg(ICQClient::warnLevel(getNewLevel())); +} + +static Message *createWarning(Buffer *cfg) +{ + return new WarningMessage(cfg); +} + +static MessageDef defWarning = + { + NULL, + NULL, + MESSAGE_SENDONLY, + "Warning", + "%n warnings", + createWarning, + NULL, + NULL + }; + +static Message *createIcqAuthRequest(Buffer *cfg) +{ + return new ICQAuthMessage(MessageICQAuthRequest, MessageAuthRequest, cfg); +} + +static MessageDef defIcqAuthRequest = + { + NULL, + NULL, + MESSAGE_CHILD, + NULL, + NULL, + createIcqAuthRequest, + NULL, + NULL + }; + +static Message *createIcqAuthGranted(Buffer *cfg) +{ + return new ICQAuthMessage(MessageICQAuthGranted, MessageAuthGranted, cfg); +} + +static MessageDef defIcqAuthGranted = + { + NULL, + NULL, + MESSAGE_CHILD, + NULL, + NULL, + createIcqAuthGranted, + NULL, + NULL + }; + +static Message *createIcqAuthRefused(Buffer *cfg) +{ + return new ICQAuthMessage(MessageICQAuthRefused, MessageAuthRefused, cfg); +} + +static MessageDef defIcqAuthRefused = + { + NULL, + NULL, + MESSAGE_CHILD, + NULL, + NULL, + createIcqAuthRefused, + NULL, + NULL + }; + +static Message *createContactRequest(Buffer *cfg) +{ + return new ICQAuthMessage(MessageContactRequest, MessageContactRequest, cfg); +} + +#if 0 +i18n("Contact request", "%n contact requests", 1); +#endif + +static MessageDef defContactRequest = + { + NULL, + NULL, + MESSAGE_DEFAULT | MESSAGE_SYSTEM, + "Contact request", + "%n contact requests", + createContactRequest, + NULL, + NULL + }; + +static Message *createIcqContacts(Buffer *cfg) +{ + return new IcqContactsMessage(cfg); +} + +static MessageDef defIcqContacts = + { + NULL, + NULL, + MESSAGE_CHILD, + NULL, + NULL, + createIcqContacts, + NULL, + NULL + }; + +void ICQPlugin::registerMessages() +{ + Command cmd; + + cmd->id = MessageICQContacts; + cmd->text = "ICQContacts"; + cmd->icon = "contacts"; + cmd->param = &defIcqContacts; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageICQFile; + cmd->text = "ICQFile"; + cmd->icon = "file"; + cmd->param = &defIcqFile; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageContactRequest; + cmd->text = I18N_NOOP("Contact Request"); + cmd->icon = "contacts"; + cmd->param = &defContactRequest; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageICQAuthRequest; + cmd->text = "ICQAuthRequest"; + cmd->icon = "auth"; + cmd->param = &defIcqAuthRequest; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageICQAuthGranted; + cmd->text = "ICQAuthGranted"; + cmd->icon = "auth"; + cmd->param = &defIcqAuthGranted; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageICQAuthRefused; + cmd->text = "ICQAuthRefused"; + cmd->icon = "auth"; + cmd->param = &defIcqAuthRefused; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageWebPanel; + cmd->text = I18N_NOOP("Web panel"); + cmd->icon = "web"; + cmd->param = &defWebPanel; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageEmailPager; + cmd->text = I18N_NOOP("Email pager"); + cmd->icon = "mailpager"; + cmd->param = &defEmailPager; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageOpenSecure; + cmd->text = I18N_NOOP("Request secure channel"); + cmd->icon = "encrypted"; + cmd->menu_grp = 0x30F0; + cmd->param = &defOpenSecure; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageCloseSecure; + cmd->text = I18N_NOOP("Close secure channel"); + cmd->icon = "encrypted"; + cmd->menu_grp = 0x30F0; + cmd->param = &defCloseSecure; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageWarning; + cmd->text = I18N_NOOP("Warning"); + cmd->icon = "error"; + cmd->menu_grp = 0x30F2; + cmd->param = &defWarning; + EventCreateMessageType(cmd).process(); + + cmd->id = CmdUrlInput; + cmd->text = I18N_NOOP("&URL"); + cmd->icon = "empty"; + cmd->icon_on = QString::null; + cmd->bar_id = ToolBarMsgEdit; + cmd->bar_grp = 0x1030; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->flags = BTN_EDIT | BTN_NO_BUTTON | COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); +} + +void ICQPlugin::unregisterMessages() +{ + EventRemoveMessageType(MessageICQUrl).process(); + EventRemoveMessageType(MessageICQContacts).process(); + EventRemoveMessageType(MessageICQ).process(); + EventRemoveMessageType(MessageICQFile).process(); + EventRemoveMessageType(MessageICQAuthRequest).process(); + EventRemoveMessageType(MessageICQAuthGranted).process(); + EventRemoveMessageType(MessageICQAuthRefused).process(); + EventRemoveMessageType(MessageContactRequest).process(); + EventRemoveMessageType(MessageWebPanel).process(); + EventRemoveMessageType(MessageEmailPager).process(); + EventRemoveMessageType(MessageOpenSecure).process(); + EventRemoveMessageType(MessageCloseSecure).process(); + EventRemoveMessageType(MessageWarning).process(); + + EventCommandRemove(CmdUrlInput).process(); +} + +void ICQClient::packExtendedMessage(Message *msg, ICQBuffer &buf, ICQBuffer &msgBuf, ICQUserData *data) +{ + unsigned short port = 0; + switch (msg->type()){ + case MessageICQFile: + port = static_cast(msg)->getPort(); + case MessageFile: + buf.pack((char*)plugins[PLUGIN_FILE], sizeof(plugin)); + buf.packStr32("File"); + buf << 0x00000100L << 0x00010000L << 0x00000000L << (unsigned short)0 << (char)0; + //msgBuf.packStr32(getContacts()->fromUnicode(getContact(data), msg->getPlainText())); + string msgdata1 = getContacts()->fromUnicode(getContact(data), msg->getPlainText()).data(); + msgBuf.packStr32(msgdata1.c_str()); + msgBuf << port << (unsigned short)0; + //msgBuf << getContacts()->fromUnicode(getContact(data), static_cast(msg)->getDescription()); + string msgdata2 = getContacts()->fromUnicode(getContact(data), static_cast(msg)->getDescription()).data(); + msgBuf << msgdata2.c_str(); + msgBuf.pack((unsigned long)(static_cast(msg)->getSize())); + msgBuf << 0x00000000L; + break; + } +} + +QString ICQClient::packContacts(ContactsMessage *msg, ICQUserData *, CONTACTS_MAP &c) +{ + QString contacts = msg->getContacts(); + QString newContacts; + while (!contacts.isEmpty()){ + QString contact = getToken(contacts, ';'); + QString url = getToken(contact, ','); + QString proto = getToken(url, ':'); + if (proto == "sim"){ + Contact *contact = getContacts()->contact(url.toULong()); + if (contact){ + ClientDataIterator it(contact->clientData); + clientData *cdata; + while ((cdata = ++it) != NULL){ + Contact *cc = contact; + if (!isMyData(cdata, cc)) + continue; + ICQUserData *d = toICQUserData(cdata); + QString screen = this->screen(d); + CONTACTS_MAP::iterator it = c.find(screen); + if (it == c.end()){ + alias_group ci; + ci.alias = contact->getName(); + ci.grp = cc ? cc->getGroup() : 0; + c.insert(CONTACTS_MAP::value_type(screen, ci)); + if (!newContacts.isEmpty()) + newContacts += ';'; + if (screen.toULong()){ + newContacts += "icq:"; + newContacts += screen; + newContacts += '/'; + newContacts += contact->getName(); + newContacts += ','; + if (contact->getName() == screen){ + newContacts += "ICQ "; + newContacts += screen; + }else{ + newContacts += contact->getName(); + newContacts += " (ICQ "; + newContacts += screen; + newContacts += ')'; + } + }else{ + newContacts += "aim:"; + newContacts += screen; + newContacts += '/'; + newContacts += contact->getName(); + newContacts += ','; + if (contact->getName() == screen){ + newContacts += "AIM "; + newContacts += screen; + }else{ + newContacts += contact->getName(); + newContacts += " (AIM "; + newContacts += screen; + newContacts += ')'; + } + } + } + } + } + } + if ((proto == "icq") || (proto == "aim")){ + QString screen = getToken(url, '/'); + if (url.isEmpty()) + url = screen; + CONTACTS_MAP::iterator it = c.find(screen); + if (it == c.end()){ + alias_group ci; + ci.alias = url; + ci.grp = 0; + c.insert(CONTACTS_MAP::value_type(screen, ci)); + } + } + } + return newContacts; +} + +void ICQClient::packMessage(ICQBuffer &b, Message *msg, ICQUserData *data, unsigned short &type, bool bDirect, unsigned short flags) +{ + ICQBuffer msgBuf, buf; + QString res; + switch (msg->type()){ + case MessageUrl: + res = getContacts()->fromUnicode(getContact(data), msg->getPlainText()); + res += '\xFE'; + res += getContacts()->fromUnicode(getContact(data), static_cast(msg)->getUrl()); + type = ICQ_MSGxURL; + break; + case MessageContacts:{ + CONTACTS_MAP c; + QString nc = packContacts(static_cast(msg), data, c); + if (c.empty()){ + msg->setError(I18N_NOOP("No contacts for send")); + return; + } + static_cast(msg)->setContacts(nc); + res = QString::number(c.size()); + for (CONTACTS_MAP::iterator it = c.begin(); it != c.end(); ++it){ + res += '\xFE'; + res += getContacts()->fromUnicode(getContact(data), it->first.str()); + res += '\xFE'; + res += getContacts()->fromUnicode(getContact(data), it->second.alias); + } + res += '\xFE'; + type = ICQ_MSGxCONTACTxLIST; + break; + } + case MessageICQFile: + if (!static_cast(msg)->getExtended()){ + res = getContacts()->fromUnicode(getContact(data), msg->getPlainText()); + type = ICQ_MSGxFILE; + break; + } + case MessageFile: // FALLTHROW + type = ICQ_MSGxEXT; + packExtendedMessage(msg, buf, msgBuf, data); + break; + case MessageOpenSecure: + type = ICQ_MSGxSECURExOPEN; + break; + case MessageCloseSecure: + type = ICQ_MSGxSECURExCLOSE; + break; + } + if (flags == ICQ_TCPxMSG_NORMAL){ + if (msg->getFlags() & MESSAGE_URGENT) + flags = ICQ_TCPxMSG_URGENT; + if (msg->getFlags() & MESSAGE_LIST) + flags = ICQ_TCPxMSG_LIST; + } + if (bDirect || (type == ICQ_MSGxEXT)){ + b.pack(type); + b.pack(msgStatus()); + b.pack(flags); + }else{ + b.pack(this->data.owner.Uin.toULong()); + b.pack((char)type); + b.pack((char)0x01); + } + b << res; + if (buf.size()){ + b.pack((unsigned short)buf.size()); + b.pack(buf.data(0), buf.size()); + b.pack32(msgBuf); + } +} + +void ICQClient::parsePluginPacket(ICQBuffer &b, unsigned plugin_type, ICQUserData *data, unsigned uin, bool bDirect) +{ + b.incReadPos(1); + unsigned short type; + b >> type; + b.incReadPos(bDirect ? 1 : 4); + QList phonebook; + QList numbers; + QList phonedescr; + Contact *contact = NULL; + unsigned long state, time, size, nEntries; + unsigned i; + unsigned nActive; + switch (type){ + case 0: + case 1: + b.unpack(time); + b.unpack(size); + b.incReadPos(4); + b.unpack(nEntries); + if (data) + log(L_DEBUG, "Plugin info reply %lu %lu (%lu %lu) %lu %lu (%u)", + data->Uin.toULong(), time, data->PluginInfoTime.toULong(), + data->PluginStatusTime.toULong(), size, nEntries, plugin_type); + switch (plugin_type){ + case PLUGIN_RANDOMxCHAT:{ + QByteArray name, topic, homepage; + + b.incReadPos(-12); + b.unpackStr(name); + b.unpackStr(topic); + unsigned short age; + char gender; + unsigned short country; + unsigned short language; + b.unpack(age); + b.unpack(gender); + b.unpack(country); + b.unpack(language); + b.unpackStr(homepage); + ICQUserData data; + load_data(static_cast(protocol())->icqUserData, &data, NULL); + data.Uin.asULong() = uin; + data.Alias.str() = QString::fromUtf8(name); + data.About.str() = QString::fromUtf8(topic); + data.Age.asULong() = age; + data.Gender.asULong() = gender; + data.Country.asULong() = country; + data.Language.asULong() = language; + data.Homepage.str() = QString::fromUtf8(homepage); +// currently unhandled +// Event e(EventRandomChatInfo, &data); +// e.process(); + free_data(static_cast(protocol())->icqUserData, &data); + break; + } + case PLUGIN_QUERYxSTATUS: + if (data == NULL) + break; + if (!bDirect){ + b.incReadPos(5); + b.unpack(nEntries); + } + log(L_DEBUG, "Status info answer %lu", nEntries); + case PLUGIN_QUERYxINFO: + if (data == NULL) + break; + if (nEntries > 0x80){ + log(L_DEBUG, "Bad entries value %lX", nEntries); + break; + } + for (i = 0; i < nEntries; i++){ + plugin p; + b.unpack((char*)p, sizeof(p)); + b.incReadPos(4); + QByteArray name, descr; + b.unpackStr32(name); + b.unpackStr32(descr); + b.incReadPos(4); + unsigned plugin_index; + for (plugin_index = 0; plugin_index < PLUGIN_NULL; plugin_index++) + if (memcmp(p, plugins[plugin_index], sizeof(p)) == 0) + break; + if (plugin_index >= PLUGIN_NULL){ + log(L_DEBUG, "Unknown plugin sign %s %s", name.data(), descr.data()); + continue; + } + log(L_DEBUG, "Plugin %u %s %s", plugin_index, name.data(), descr.data()); + switch (plugin_index){ + case PLUGIN_PHONEBOOK: + case PLUGIN_FOLLOWME: + if (plugin_type == PLUGIN_QUERYxINFO){ + addPluginInfoRequest(uin, PLUGIN_PHONEBOOK); + }else{ + addPluginInfoRequest(uin, PLUGIN_FOLLOWME); + } + break; + case PLUGIN_PICTURE: + if (plugin_type == PLUGIN_QUERYxINFO) { + // when buddyID -> new avatar support, no need to ask for old picture plugin + if(data->buddyID.toULong() == 0 || data->buddyHash.toBinary().size() != 16) { + data->buddyID.asULong() = 0; + addPluginInfoRequest(uin, plugin_index); + } + } + break; + case PLUGIN_FILESERVER: + case PLUGIN_ICQPHONE: + if (plugin_type == PLUGIN_QUERYxSTATUS) + addPluginInfoRequest(uin, plugin_index); + break; + } + } + if (plugin_type == PLUGIN_QUERYxINFO){ + data->PluginInfoFetchTime = data->PluginInfoTime; + }else{ + data->PluginStatusFetchTime = data->PluginStatusTime; + } + break; + case PLUGIN_PICTURE: + if (data){ + b.incReadPos(-4); + QByteArray pict; + QByteArray ba; + b.unpackStr32(pict); + b.unpackStr32(ba); + QImage img; + QString fName = pictureFile(data); + QFile f(fName); + if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + f.write(ba.data()); + f.close(); + img.load(fName); + }else{ + log(L_ERROR, "Can't create %s", qPrintable(fName)); + } + data->PictureWidth.asULong() = img.width(); + data->PictureHeight.asULong() = img.height(); + } + break; + case PLUGIN_PHONEBOOK: + if (data){ + QString phones; + nActive = (unsigned)(-1); + if (nEntries > 0x80){ + log(L_DEBUG, "Bad entries value %lX", nEntries); + break; + } + for (i = 0; i < nEntries; i++){ + QByteArray descr, area, phone, ext, country; + unsigned long active; + b.unpackStr32(descr); + b.unpackStr32(area); + b.unpackStr32(phone); + b.unpackStr32(ext); + b.unpackStr32(country); + numbers.push_back(phone); + QByteArray value; + for (const ext_info *e = getCountries(); e->szName; e++){ + if (country == e->szName){ + value = "+"; + value += QByteArray::number(e->nCode); + break; + } + } + if (!area.isEmpty()){ + if (!value.isEmpty()) + value += ' '; + value += '('; + value += area; + value += ')'; + } + if (!value.isEmpty()) + value += ' '; + value += phone; + if (!ext.isEmpty()){ + value += " - "; + value += ext; + } + b.unpack(active); + if (active) + nActive = i; + phonebook.push_back(value); + phonedescr.push_back(descr); + } + for (i = 0; i < nEntries; i++){ + unsigned long type; + QByteArray phone = phonebook[i]; + QByteArray gateway; + b.incReadPos(4); + b.unpack(type); + b.unpackStr32(gateway); + b.incReadPos(16); + switch (type){ + case 1: + case 2: + type = CELLULAR; + break; + case 3: + type = FAX; + break; + case 4:{ + type = PAGER; + phone = numbers[i]; + const pager_provider *p; + for (p = getProviders(); *p->szName; p++){ + if (gateway == p->szName){ + phone += '@'; + phone += p->szGate; + phone += '['; + phone += p->szName; + phone += ']'; + break; + } + } + if (*p->szName == 0){ + phone += '@'; + phone += gateway; + } + break; + } + default: + type = PHONE; + } + phone += ','; + phone += phonedescr[i]; + phone += ','; + phone += QByteArray::number((quint32)type); + if (i == nActive) + phone += ",1"; + if (!phones.isEmpty()) + phones += ';'; + phones += QString::fromUtf8(phone); + } + data->PhoneBook.str() = phones; + Contact *contact = NULL; + findContact(data->Uin.toULong(), NULL, false, contact); + if (contact){ + setupContact(contact, data); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + } + } + break; + case 2: + if (data){ + if (bDirect) + b.incReadPos(3); + b.unpack(state); + b.unpack(time); + log(L_DEBUG, "Plugin status reply %u %lu %lu (%u)", uin, state, time, plugin_type); + findContact(uin, NULL, false, contact); + if (contact == NULL) + break; + switch (plugin_type){ + case PLUGIN_FILESERVER: + if ((state != 0) != (data->SharedFiles.toBool() != 0)){ + data->SharedFiles.asBool() = (state != 0); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + break; + case PLUGIN_FOLLOWME: + if (state != data->FollowMe.toULong()){ + data->FollowMe.asULong() = state; + EventContact e(contact, EventContact::eChanged); + e.process(); + } + break; + case PLUGIN_ICQPHONE: + if ((state != 0) != (data->ICQPhone.toULong() != 0)){ + data->ICQPhone.asULong() = (state != 0); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + break; + } + } + break; + default: + log(L_DEBUG, "Unknown plugin type answer %u %u (%u)", uin, type, plugin_type); + } +} + +static const char* plugin_name[] = + { + "Phone Book", // PLUGIN_PHONEBOOK + "Picture", // PLUGIN_PICTURE + "Shared Files Directory", // PLUGIN_FILESERVER + "Phone \"Follow Me\"", // PLUGIN_FOLLOWME + "ICQphone Status" // PLUGIN_ICQPHONE + }; + +static const char* plugin_descr[] = + { + "Phone Book / Phone \"Follow Me\"", // PLUGIN_PHONEBOOK + "Picture", // PLUGIN_PICTURE + "Shared Files Directory", // PLUGIN_FILESERVER + "Phone Book / Phone \"Follow Me\"", // PLUGIN_FOLLOWME + "ICQphone Status" // PLUGIN_ICQPHONE + }; + +void ICQClient::pluginAnswer(unsigned plugin_type, unsigned long uin, ICQBuffer &info) +{ + Contact *contact; + ICQUserData *data = findContact(uin, NULL, false, contact); + log(L_DEBUG, "Request about %u", plugin_type); + ICQBuffer answer; + unsigned long typeAnswer = 0; + unsigned long nEntries = 0; + unsigned long time = 0; + switch (plugin_type){ + case PLUGIN_PHONEBOOK:{ + if (data && data->GrpId.toULong() && !contact->getIgnore()){ + ICQBuffer answer1; + time = this->data.owner.PluginInfoTime.toULong(); + QString phones = getContacts()->owner()->getPhones(); + while (!phones.isEmpty()){ + QString item = getToken(phones, ';', false); + unsigned long publish = 0; + QString phoneItem = getToken(item, '/', false); + if (item != "-") + publish = 1; + QString number = getToken(phoneItem, ','); + QString descr = getToken(phoneItem, ','); + unsigned long type = getToken(phoneItem, ',').toUInt(); + unsigned long active = 0; + if (!phoneItem.isEmpty()) + active = 1; + QString area; + QString phone; + QString ext; + QString country; + QString gateway; + if (type == PAGER){ + phone = getToken(number, '@'); + int n = number.indexOf('['); + if (n >= 0){ + getToken(number, '['); + gateway = getToken(number, ']'); + }else{ + gateway = number; + } + }else{ + int n = number.indexOf('('); + if (n >= 0){ + country = getToken(number, '('); + area = getToken(number, ')'); + if (country[0] == '+') + country = country.mid(1); + unsigned code = country.toULong(); + country = QString::null; + for (const ext_info *e = getCountries(); e->nCode; e++){ + if (e->nCode == code){ + country = e->szName; + break; + } + } + } + n = number.indexOf(" - "); + if (n >= 0){ + ext = number.mid(n + 3); + number = number.left(n); + } + phone = number; + } + answer.packStr32(descr.toUtf8().data()); + answer.packStr32(area.toUtf8().data()); + answer.packStr32(phone.toUtf8().data()); + answer.packStr32(ext.toUtf8().data()); + answer.packStr32(country.toUtf8().data()); + answer.pack(active); + + unsigned long len = gateway.length() + 24; + unsigned long sms_available = 0; + switch (type){ + case PHONE: + type = 0; + break; + case FAX: + type = 3; + break; + case CELLULAR: + type = 2; + sms_available = 1; + break; + case PAGER: + type = 4; + break; + } + answer1.pack(len); + answer1.pack(type); + answer1.packStr32(gateway.toUtf8().data()); + answer1.pack((unsigned long)0); + answer1.pack(sms_available); + answer1.pack((unsigned long)0); + answer1.pack(publish); + nEntries++; + } + answer.pack(answer1.data(0), answer1.size()); + typeAnswer = 0x00000003; + break; + } + } + case PLUGIN_PICTURE:{ + time = this->data.owner.PluginInfoTime.toULong(); + typeAnswer = 0x00000001; + QString pictFile = getPicture(); + if (!pictFile.isEmpty()){ + QFile f(pictFile); + if (f.open(QIODevice::ReadOnly)){ + QFileInfo fi(f); + pictFile = fi.fileName(); + nEntries = pictFile.length(); + answer.pack(pictFile.toLocal8Bit(), pictFile.length()); + unsigned long size = f.size(); + answer.pack(size); + while (size > 0){ + char buf[2048]; + unsigned tail = sizeof(buf); + if (tail > size) + tail = size; + f.read(buf, tail); + answer.pack(buf, tail); + size -= tail; + } + } + } + break; + } + case PLUGIN_FOLLOWME: + time = this->data.owner.PluginStatusTime.toULong(); + break; + case PLUGIN_QUERYxINFO: + time = this->data.owner.PluginInfoTime.toULong(); + typeAnswer = 0x00010002; + if (!getPicture().isEmpty()){ + nEntries++; + answer.pack((char*)plugins[PLUGIN_PICTURE], sizeof(plugin)); + answer.pack((unsigned short)0); + answer.pack((unsigned short)1); + answer.packStr32(plugin_name[PLUGIN_PICTURE]); + answer.packStr32(plugin_descr[PLUGIN_PICTURE]); + answer.pack((unsigned long)0); + } + if (!getContacts()->owner()->getPhones().isEmpty()){ + nEntries++; + answer.pack((char*)plugins[PLUGIN_PHONEBOOK], sizeof(plugin)); + answer.pack((unsigned short)0); + answer.pack((unsigned short)1); + answer.packStr32(plugin_name[PLUGIN_PHONEBOOK]); + answer.packStr32(plugin_descr[PLUGIN_PHONEBOOK]); + answer.pack((unsigned long)0); + } + break; + case PLUGIN_QUERYxSTATUS: + time = this->data.owner.PluginStatusTime.toULong(); + typeAnswer = 0x00010000; + nEntries++; + answer.pack((char*)plugins[PLUGIN_FOLLOWME], sizeof(plugin)); + answer.pack((unsigned short)0); + answer.pack((unsigned short)1); + answer.packStr32(plugin_name[PLUGIN_FOLLOWME]); + answer.packStr32(plugin_descr[PLUGIN_FOLLOWME]); + answer.pack((unsigned long)0); + if (this->data.owner.SharedFiles.toBool()){ + nEntries++; + answer.pack((char*)plugins[PLUGIN_FILESERVER], sizeof(plugin)); + answer.pack((unsigned short)0); + answer.pack((unsigned short)1); + answer.packStr32(plugin_name[PLUGIN_FILESERVER]); + answer.packStr32(plugin_descr[PLUGIN_FILESERVER]); + answer.pack((unsigned long)0); + } + if (this->data.owner.ICQPhone.toULong()){ + nEntries++; + answer.pack((char*)plugins[PLUGIN_ICQPHONE], sizeof(plugin)); + answer.pack((unsigned short)0); + answer.pack((unsigned short)1); + answer.packStr32(plugin_name[PLUGIN_ICQPHONE]); + answer.packStr32(plugin_descr[PLUGIN_ICQPHONE]); + answer.pack((unsigned long)0); + } + break; + default: + log(L_DEBUG, "Bad plugin type request %u", plugin_type); + } + unsigned long size = answer.size() + 8; + info.pack((unsigned short)0); + info.pack((unsigned short)1); + switch (plugin_type){ + case PLUGIN_FOLLOWME: + info.pack(this->data.owner.FollowMe.toULong()); + info.pack(time); + info.pack((char)1); + break; + case PLUGIN_QUERYxSTATUS: + info.pack((unsigned long)0); + info.pack((unsigned long)0); + info.pack((char)1); + default: + info.pack(time); + info.pack(size); + info.pack(typeAnswer); + info.pack(nEntries); + info.pack(answer.data(0), answer.size()); + } +} + + + diff --git a/plugins/icq/icqmessage.h b/plugins/icq/icqmessage.h new file mode 100644 index 0000000..d403c70 --- /dev/null +++ b/plugins/icq/icqmessage.h @@ -0,0 +1,142 @@ +/*************************************************************************** + icqmessage.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICQMESSAGE_H +#define _ICQMESSAGE_H + +#include "contacts.h" + +#include +#include +#include + +const unsigned long MessageICQ = 0x100; +const unsigned long MessageICQUrl = 0x101; +const unsigned long MessageICQContacts = 0x102; +const unsigned long MessageContactRequest = 0x103; +const unsigned long MessageICQAuthRequest = 0x104; +const unsigned long MessageICQAuthGranted = 0x105; +const unsigned long MessageICQAuthRefused = 0x106; +const unsigned long MessageWebPanel = 0x107; +const unsigned long MessageEmailPager = 0x108; +const unsigned long MessageOpenSecure = 0x109; +const unsigned long MessageCloseSecure = 0x110; +const unsigned long MessageICQFile = 0x112; +const unsigned long MessageWarning = 0x113; + +class IcqContactsMessage : public SIM::ContactsMessage +{ +public: + IcqContactsMessage(Buffer *cfg=NULL); + ~IcqContactsMessage(); + QString getContacts() const; + virtual unsigned baseType() { return SIM::MessageContacts; } +}; + +struct ICQAuthMessageData +{ + SIM::Data Charset; +}; + +class ICQAuthMessage : public SIM::AuthMessage +{ +public: + ICQAuthMessage(unsigned type, unsigned base_type, Buffer *cfg=NULL); + ~ICQAuthMessage(); + PROP_STR(Charset); + virtual QString getText() const; + virtual QByteArray save(); + virtual unsigned baseType() { return m_baseType; } +protected: + unsigned m_baseType; + ICQAuthMessageData data; +}; + +struct ICQFileMessageData +{ + SIM::Data ServerDescr; + SIM::Data IP; + SIM::Data Port; + SIM::Data ID_L; + SIM::Data ID_H; + SIM::Data Cookie; + SIM::Data Extended; +}; + +class ICQFileMessage : public SIM::FileMessage +{ +public: + ICQFileMessage(Buffer *cfg=NULL); + ~ICQFileMessage(); + PROP_STR(ServerDescr); + PROP_ULONG(IP); + PROP_USHORT(Port); + PROP_ULONG(ID_L); + PROP_ULONG(ID_H); + PROP_ULONG(Cookie); + PROP_ULONG(Extended); + virtual QString getDescription(); + virtual QByteArray save(); + virtual unsigned baseType() { return SIM::MessageFile; } +protected: + ICQFileMessageData data; +}; + +struct AIMFileMessageData +{ + SIM::Data Port; + SIM::Data ID_L; + SIM::Data ID_H; +}; + +class AIMFileMessage : public SIM::FileMessage +{ +public: + AIMFileMessage(Buffer *cfg=NULL); + ~AIMFileMessage(); + PROP_USHORT(Port); + PROP_ULONG(ID_L); + PROP_ULONG(ID_H); + virtual unsigned baseType() { return SIM::MessageFile; } + bool isProxy; + uint16_t cookie2; +protected: + AIMFileMessageData data; +}; + +struct MessageWarningData +{ + SIM::Data Anonymous; + SIM::Data OldLevel; + SIM::Data NewLevel; +}; + +class WarningMessage : public SIM::AuthMessage +{ +public: + WarningMessage(Buffer *cfg=NULL); + PROP_BOOL(Anonymous); + PROP_USHORT(OldLevel); + PROP_USHORT(NewLevel); + virtual QByteArray save(); + QString presentation(); +protected: + MessageWarningData data; +}; + +#endif + diff --git a/plugins/icq/icqpicture.cpp b/plugins/icq/icqpicture.cpp new file mode 100644 index 0000000..7c5f4e1 --- /dev/null +++ b/plugins/icq/icqpicture.cpp @@ -0,0 +1,152 @@ +/*************************************************************************** + icqpicture.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icqpicture.h" +#include "icqclient.h" + +#include "log.h" + +#include "contacts/contact.h" +#include "simgui/editfile.h" +#include "simgui/ballonmsg.h" +#include "simgui/preview.h" + +#include +#include +#include +#include +#include +#include + +#include + +using namespace SIM; + +#ifndef USE_KDE + +static FilePreview *createPreview(QWidget *parent) +{ + return new PictPreview(parent); +} + +#endif + +ICQPicture::ICQPicture(QWidget *parent, ICQUserData *data, ICQClient *client) + : QWidget(parent) +{ + setupUi(this); + m_data = data; + m_client = client; + if (m_data) + { + edtPict->hide(); + btnClear->hide(); + } else { + QString format = QString("*.jpg"); + QList formats = QImageReader::supportedImageFormats(); + QByteArray f; + foreach( f, formats ) + { + f.toLower(); + format += " *." + f; + } +#ifdef USE_KDE + edtPict->setFilter(i18n("%1|Graphics").arg(format)); +#else + edtPict->setFilter(i18n("Graphics(%1)").arg(format)); + edtPict->setFilePreview(createPreview); +#endif + edtPict->setReadOnly(true); + connect(btnClear, SIGNAL(clicked()), this, SLOT(clearPicture())); + connect(edtPict, SIGNAL(textChanged(const QString&)), this, SLOT(pictSelected(const QString&))); + edtPict->setText(client->getPicture()); + pictSelected(client->getPicture()); + } + fill(); +} + +void ICQPicture::apply() +{ +} + +void ICQPicture::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + QString pict = edtPict->text(); + log(L_DEBUG, "Pict: %s", qPrintable(pict)); + m_client->setPicture(pict); + m_client->data.owner.Picture.setStr(pict); + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + if (lblPict->pixmap() == NULL) + pict.clear(); + if(pict != m_client->getPicture()) + { + data->PluginInfoTime.asULong() = time(NULL); + } +} + +bool ICQPicture::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } + return false; +} + +void ICQPicture::fill() +{ + setPict(m_client->userPicture(m_data)); +} + +void ICQPicture::clearPicture() +{ + edtPict->setText(QString::null); +} + +const unsigned short MAX_PICTURE_SIZE = 7168; + +void ICQPicture::pictSelected(const QString &file) +{ + if (file.isEmpty()){ + setPict(QImage()); + } else { + QFile f(file); + if (f.size() > MAX_PICTURE_SIZE){ + setPict(QImage()); + BalloonMsg::message(i18n("Picture can not be more than 7 kbytes"), edtPict); + } + setPict(QImage(file)); + } +} + +void ICQPicture::setPict(const QImage &img) +{ + if (img.isNull()){ + lblPict->setText(i18n("Picture is not available")); + return; + } + QPixmap pict = QPixmap::fromImage(img); + lblPict->setPixmap(pict); + lblPict->setMinimumSize(pict.size()); +} + diff --git a/plugins/icq/icqpicture.h b/plugins/icq/icqpicture.h new file mode 100644 index 0000000..178bf78 --- /dev/null +++ b/plugins/icq/icqpicture.h @@ -0,0 +1,50 @@ +/*************************************************************************** + icqpicture.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICQPICTURE_H +#define _ICQPICTURE_H + +#include "event.h" + +#include "ui_icqpicturebase.h" + +class ICQClient; +struct ICQUserData; + +class QImage; + +class ICQPicture : public QWidget, public Ui::ICQPictureBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + ICQPicture(QWidget *parent, ICQUserData *data, ICQClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected slots: + void clearPicture(); + void pictSelected(const QString&); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + void setPict(const QImage &img); + ICQUserData *m_data; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/icqpicturebase.ui b/plugins/icq/icqpicturebase.ui new file mode 100644 index 0000000..adf3c0c --- /dev/null +++ b/plugins/icq/icqpicturebase.ui @@ -0,0 +1,123 @@ + + + + + ICQPictureBase + + + + 0 + 0 + 464 + 324 + + + + Form1 + + + + 11 + + + 6 + + + + + + &Picture + + + + 11 + + + 6 + + + + + + 7 + 7 + + + + + + + Qt::AlignCenter + + + false + + + + + + + &Clear + + + + + + + + 7 + 5 + + + + + + + + + + + + + EditFile + QWidget +
    simgui/editfile.h
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 +
    + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image1 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/icq/icqping.cpp b/plugins/icq/icqping.cpp new file mode 100644 index 0000000..b899d06 --- /dev/null +++ b/plugins/icq/icqping.cpp @@ -0,0 +1,40 @@ +/*************************************************************************** + icqping.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "log.h" + +#include "icqclient.h" + +using namespace SIM; + +const unsigned short ICQ_SNACxPING_ERROR = 0x0001; +const unsigned short ICQ_SNACxPING_REPORTxINTERVALL = 0x0002; +const unsigned short ICQ_SNACxPING_STATS = 0x0003; // not implemented +const unsigned short ICQ_SNACxPING_STATSxACK = 0x0004; // not implemented + +void ICQClient::snac_ping(unsigned short type, unsigned short) +{ + switch (type){ + case ICQ_SNACxPING_ERROR: + break; + case ICQ_SNACxPING_REPORTxINTERVALL: + break; + default: + log(L_WARN, "Unknown ping foodgroup type %04X", type); + } +} + diff --git a/plugins/icq/icqsearch.cpp b/plugins/icq/icqsearch.cpp new file mode 100644 index 0000000..10fafc7 --- /dev/null +++ b/plugins/icq/icqsearch.cpp @@ -0,0 +1,477 @@ +/*************************************************************************** + icqsearch.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "icqsearch.h" +#include "icqclient.h" +#include "advsearch.h" +#include "aimsearch.h" +#include "simgui/intedit.h" +#include "log.h" +#include "contacts/contact.h" + +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +ICQSearch::ICQSearch(ICQClient *client, QWidget *parent) : QWidget(parent) +{ + setupUi(this); + m_client = client; + m_bAdv = false; + m_id_icq = 0; + m_id_aim = 0; + connect(this, SIGNAL(setAdd(bool)), topLevelWidget(), SLOT(setAdd(bool))); + connect(this, SIGNAL(addResult(QWidget*)), topLevelWidget(), SLOT(addResult(QWidget*))); + connect(this, SIGNAL(showResult(QWidget*)), topLevelWidget(), SLOT(showResult(QWidget*))); + if (client->m_bAIM){ + m_adv = new AIMSearch; + emit addResult(m_adv); + + edtAOL_UIN->setValidator(new QRegExpValidator(QRegExp("([ -]*[0-9]){4,13}[ -]*"), this)); + edtScreen->setValidator(new QRegExpValidator(QRegExp("[0-9A-Za-z]+"), this)); + connect(grpScreen, SIGNAL(toggled(bool)), this, SLOT(radioToggled(bool))); + connect(grpAOL_UIN, SIGNAL(toggled(bool)), this, SLOT(radioToggled(bool))); + grpUin->hide(); + grpAOL->hide(); + grpName->hide(); + }else{ + m_adv = new AdvSearch; + emit addResult(m_adv); + + edtUIN->setValidator(new QRegExpValidator(QRegExp("([ -]*[0-9]){4,13}[ -]*"), this)); + edtAOL->setValidator(new QRegExpValidator(QRegExp("[0-9A-Za-z]+"), this)); + connect(grpUin, SIGNAL(toggled(bool)), this, SLOT(radioToggled(bool))); + connect(grpAOL, SIGNAL(toggled(bool)), this, SLOT(radioToggled(bool))); + connect(grpName, SIGNAL(toggled(bool)), this, SLOT(radioToggled(bool))); + grpScreen->hide(); + grpAOL_UIN->hide(); + } + edtMail->setValidator(new EMailValidator(edtMail)); + connect(grpMail, SIGNAL(toggled(bool)), this, SLOT(radioToggled(bool))); + connect(btnAdvanced, SIGNAL(clicked()), this, SLOT(advClick())); + QIcon is = Icon("1rightarrow"); + btnAdvanced->setIcon(is); +} + +ICQSearch::~ICQSearch() +{ + if (m_adv) + delete m_adv; +} + +void ICQSearch::advDestroyed() +{ + m_adv = NULL; +} + +void ICQSearch::showEvent(QShowEvent *e) +{ + QWidget::showEvent(e); + emit setAdd(grpAOL->isChecked() || grpScreen->isChecked()); + if (m_adv && m_bAdv) + emit showResult(m_adv); +} + +void ICQSearch::radioToggled(bool) +{ + setAdv(false); + emit setAdd(grpAOL->isChecked() || grpScreen->isChecked()); +} + +void ICQSearch::advClick() +{ + if (!m_bAdv && (m_id_icq || m_id_aim)){ + m_id_icq = 0; + m_id_aim = 0; + emit searchDone(this); + } + setAdv(!m_bAdv); +} + +void ICQSearch::setAdv(bool bAdv) +{ + if (m_bAdv == bAdv) + return; + m_bAdv = bAdv; + QIcon is = Icon(m_bAdv ? "1leftarrow" : "1rightarrow"); + btnAdvanced->setIcon(is); + if (m_bAdv) + { + if (m_client->m_bAIM) + { + edtMail->setEnabled(false); + edtAOL_UIN->setEnabled(false); + edtScreen->setEnabled(false); + } + else + { + edtMail->setEnabled(true); + edtFirst->setEnabled(true); + edtLast->setEnabled(true); + edtNick->setEnabled(true); + lblFirst->setEnabled(true); + lblLast->setEnabled(true); + lblNick->setEnabled(true); + edtUIN->setEnabled(false); + edtAOL->setEnabled(false); + } + emit setAdd(false); + } + else + { + if (m_client->m_bAIM) + { + grpScreen->setChecked( true ); + grpAOL_UIN->setChecked( true ); + } + else + { + grpUin->setChecked( false ); + grpAOL->setChecked( false ); + grpName->setChecked( false ); + } + grpMail->setChecked( false ); + radioToggled(false); + } + emit showResult(m_bAdv ? m_adv : NULL); +} + +void ICQSearch::createContact(unsigned tmpFlags, Contact *&contact) +{ + if (m_client->m_bAIM){ + + if (grpScreen->isChecked() && !edtScreen->text().isEmpty()) + + add(edtScreen->text(), tmpFlags, contact); + + if (grpAOL_UIN->isChecked() && !edtAOL_UIN->text().isEmpty()) + + add(extractUIN(edtAOL_UIN->text()), tmpFlags, contact); + + }else{ + + if (grpAOL->isChecked() && !edtAOL->text().isEmpty()) + add(edtAOL->text(), tmpFlags, contact); + + } +} + +void ICQSearch::add(const QString &screen, unsigned tmpFlags, Contact *&contact) +{ + if (m_client->findContact(screen, NULL, false, contact)) + return; + m_client->findContact(screen, &screen, true, contact, NULL, false); + contact->setFlags(contact->getFlags() | tmpFlags); +} + +extern const ext_info *p_ages; +extern const ext_info *p_genders; +extern const ext_info *p_languages; +extern const ext_info *p_occupations; +extern const ext_info *p_interests; +extern const ext_info *p_pasts; +extern const ext_info *p_affilations; + +void ICQSearch::icq_search() +{ + m_bAdd = false; + switch (m_type){ + case UIN: + m_id_icq = m_client->findByUin(m_uin); + break; + case Mail: + m_id_icq = m_client->findByMail(m_mail); + break; + case Name: + m_id_icq = m_client->findWP(m_first, m_last, m_nick, + NULL, 0, 0, 0, NULL, NULL, 0, NULL, NULL, NULL, + 0, 0, NULL, 0, NULL, 0, NULL, 0, NULL, NULL, false); + break; + case Full: + m_id_icq = m_client->findWP(m_first, m_last, m_nick, + m_mail, m_age, m_gender, m_lang, + m_city, m_state, m_country, + m_company, m_depart, m_position, + m_occupation, m_past, m_past_text, + m_interests, m_interests_text, + m_affilations, m_affilations_text, 0, NULL, + m_keywords, m_bOnline); + break; + case None: + m_id_icq = 0; + break; + } +} + +const QString ICQSearch::extractUIN(const QString& str) +{ + if (str.isEmpty()) + return QString::null; + QString s = str; + return s.remove(' ').remove('-'); +} + +void ICQSearch::search() +{ + m_id_icq = 0; + m_id_aim = 0; + m_uins.clear(); + m_bAdd = false; + if (!m_client->m_bAIM && m_bAdv){ + m_type = Full; + setAdv(false); + AdvSearch *adv = static_cast(m_adv); + m_first = edtFirst->text(); + m_last = edtLast->text(); + m_nick = edtNick->text(); + m_mail = edtMail->text(); + m_age = getComboValue(adv->cmbAge, p_ages); + m_gender = getComboValue(adv->cmbGender, p_genders); + m_lang = getComboValue(adv->cmbLang, p_languages); + m_city = adv->edtCity->text(); + m_state = adv->edtState->text(); + m_country = getComboValue(adv->cmbCountry, getCountries(), getCountryCodes()); + m_company = adv->edtCompany->text(); + m_depart = adv->edtDepartment->text(); + m_position = adv->edtPosition->text(); + m_occupation= getComboValue(adv->cmbOccupation, p_occupations); + m_past = getComboValue(adv->cmbPast, p_pasts); + m_past_text = adv->edtPast->text(); + m_interests = getComboValue(adv->cmbInterests, p_interests); + m_interests_text = adv->edtInterests->text(); + m_affilations = getComboValue(adv->cmbAffilation, p_affilations); + m_affilations_text = adv->edtAffilation->text(); + m_keywords = adv->edtKeywords->text(); + m_bOnline = adv->chkOnline->isChecked(); + icq_search(); + }else if (m_client->m_bAIM && m_bAdv){ + setAdv(false); + AIMSearch *adv = static_cast(m_adv); + const char *country = NULL; + int nCountry = getComboValue(adv->cmbCountry, getCountries(), getCountryCodes()); + for (const ext_info *info = getCountryCodes(); info->szName; ++info){ + if (info->nCode == nCountry){ + country = info->szName; + break; + } + } + m_id_aim = m_client->aimInfoSearch( + adv->edtFirst->text(), + adv->edtLast->text(), + adv->edtMiddle->text(), + adv->edtMaiden->text(), + country, + adv->edtStreet->text(), + adv->edtCity->text(), + adv->edtNick->text(), + adv->edtZip->text(), + adv->edtState->text()); + } + else if (!m_client->m_bAIM && grpUin->isChecked() && !edtUIN->text().isEmpty()) + { + m_type = UIN; + m_uin = extractUIN(edtUIN->text()).toULong(); + icq_search(); + } + else if (grpMail->isChecked() && !edtMail->text().isEmpty()) + { + if (!m_client->m_bAIM) + { + m_type = Mail; + m_mail = edtMail->text(); + icq_search(); + } + m_id_aim = m_client->aimEMailSearch(edtMail->text()); + } + else if (!m_client->m_bAIM && grpName->isChecked() && + (!edtFirst->text().isEmpty() || !edtLast->text().isEmpty() || !edtNick->text().isEmpty())){ + m_type = Name; + m_first = edtFirst->text(); + m_last = edtLast->text(); + m_nick = edtNick->text(); + icq_search(); + m_id_aim = m_client->aimInfoSearch(edtFirst->text(), edtLast->text(), QString::null, QString::null, + QString::null, QString::null, QString::null, edtNick->text(), QString::null, QString::null); + } + if ((m_id_icq == 0) && (m_id_aim == 0)) + return; + addColumns(); +} + +void ICQSearch::addColumns() +{ + QStringList columns; + columns.append(QString::null); + columns.append(QString::null); + columns.append("nick"); + columns.append(i18n("Nick")); + columns.append("first"); + columns.append(i18n("First Name")); + columns.append("last"); + columns.append(i18n("Last Name")); + if (m_client->m_bAIM){ + columns.append("city"); + columns.append(i18n("City")); + columns.append("state"); + columns.append(i18n("State")); + columns.append("country"); + columns.append(i18n("Country")); + }else{ + columns.append("gender"); + columns.append(i18n("Gender")); + columns.append("age"); + columns.append(i18n("Age")); + columns.append("email"); + columns.append(i18n("E-Mail")); + } + emit setColumns(columns, 6, this); +} + +void ICQSearch::searchMail(const QString &mail) +{ + if (!m_client->m_bAIM){ + m_type = Mail; + m_mail = mail; + icq_search(); + } + m_id_aim = m_client->aimEMailSearch(mail); + addColumns(); +} + +void ICQSearch::searchName(const QString &first, const QString &last, const QString &nick) +{ + if (!m_client->m_bAIM){ + m_type = Name; + m_first = first; + m_last = last; + m_nick = nick; + icq_search(); + } + m_id_aim = m_client->aimInfoSearch(first, last, QString::null, QString::null, QString::null, + QString::null, QString::null, nick, QString::null, QString::null); + addColumns(); +} + +void ICQSearch::searchStop() +{ + m_id_icq = 0; + m_id_aim = 0; +} + +bool ICQSearch::processEvent(Event *e) +{ + if ((e->type() == eEventICQSearch) || (e->type() == eEventICQSearchDone)){ + EventSearchInternal *es = static_cast(e); + SearchResult *res = es->searchResult(); + if ((res->id != m_id_aim) && (res->id != m_id_icq) && (res->client != m_client)) + return false; + if (e->type() == eEventICQSearchDone){ + if (res->id == m_id_icq){ + m_id_icq = 0; + if (res->data.Uin.toULong() && m_bAdd) + icq_search(); + } + if (res->id == m_id_aim) + m_id_aim = 0; + if ((m_id_icq == 0) && (m_id_aim == 0)) + emit searchDone(this); + return false; + } + QString icon; + if (res->data.Uin.toULong()){ + icon = "ICQ_"; + switch (res->data.Status.toULong()){ + case STATUS_ONLINE: + icon += "online"; + break; + case STATUS_OFFLINE: + icon += "offline"; + break; + default: + icon += "inactive"; + } + if (m_uins.indexOf (res->data.Uin.toULong()) != -1) + return false; + m_bAdd = true; + m_uins.push_back(res->data.Uin.toULong()); + }else{ + icon = "AIM"; + } + QString gender; + switch (res->data.Gender.toULong()){ + case 1: + gender = i18n("Female"); + break; + case 2: + gender = i18n("Male"); + break; + } + QString age; + if (res->data.Age.toULong()) + age = QString::number(res->data.Age.toULong()); + QStringList l; + l.append(icon); + QString key = m_client->screen(&res->data); + if (res->data.Uin.toULong()){ + while (key.length() < 13) + key = '.' + key; + } + l.append(key); + l.append(m_client->screen(&res->data));; + if (m_client->m_bAIM){ + QString s; + l.append(res->data.Nick.str()); + l.append(res->data.FirstName.str()); + l.append(res->data.LastName.str()); + l.append(res->data.City.str()); + l.append(res->data.State.str()); + if (res->data.Country.toULong()){ + for (const ext_info *info = getCountries(); info->szName; info++){ + if (info->nCode == res->data.Country.toULong()){ + s = i18n(info->szName); + break; + } + } + } + l.append(s); + }else{ + l.append(res->data.Nick.str()); + l.append(res->data.FirstName.str()); + l.append(res->data.LastName.str()); + l.append(gender); + l.append(age); + l.append(res->data.EMail.str()); + } + emit addItem(l, this); + } + return false; +} + +void ICQSearch::createContact(const QString &name, unsigned tmpFlags, Contact *&contact) +{ + if (m_client->findContact(name, NULL, false, contact)) + return; + if (m_client->findContact(name, &name, true, contact, NULL, false) == NULL) + return; + contact->setFlags(contact->getFlags() | tmpFlags); +} + diff --git a/plugins/icq/icqsearch.h b/plugins/icq/icqsearch.h new file mode 100644 index 0000000..c020810 --- /dev/null +++ b/plugins/icq/icqsearch.h @@ -0,0 +1,104 @@ +/*************************************************************************** + icqsearch.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICQSEARCH_H +#define _ICQSEARCH_H + +#include "ui_icqsearchbase.h" +#include +#include +#include "event.h" + +class ICQClient; +class AdvSearch; +class AIMSearch; +class GroupRadioButton; + +class ICQSearch : public QWidget, public Ui::ICQSearchBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + ICQSearch(ICQClient *client, QWidget *parent); + ~ICQSearch(); +signals: + void setAdd(bool); + void addResult(QWidget*); + void showResult(QWidget*); + void setColumns(const QStringList&, int, QWidget*); + void addItem(const QStringList&, QWidget*); + void searchDone(QWidget*); +protected slots: + void advDestroyed(); + void radioToggled(bool); + void advClick(); + void search(); + void searchStop(); + void searchMail(const QString&); + void searchName(const QString&, const QString&, const QString&); + void createContact(const QString&, unsigned tmpFlags, SIM::Contact *&contact); + void createContact(unsigned tmpFlags, SIM::Contact *&contact); +protected: + enum SearchType + { + None, + UIN, + Mail, + Name, + Full + }; + static inline const QString extractUIN(const QString& str); + virtual bool processEvent(SIM::Event *e); + void showEvent(QShowEvent*); + void setAdv(bool); + void icq_search(); + void addColumns(); + void add(const QString &screen, unsigned tmpFlags, SIM::Contact *&contact); + QList m_uins; + ICQClient *m_client; + QWidget *m_adv; + bool m_bAdv; + bool m_bAdd; + SearchType m_type; + unsigned short m_id_icq; + unsigned short m_id_aim; + unsigned long m_uin; + QString m_first; + QString m_last; + QString m_nick; + QString m_mail; + unsigned short m_age; + char m_gender; + unsigned short m_lang; + QString m_city; + QString m_state; + unsigned short m_country; + QString m_company; + QString m_depart; + QString m_position; + unsigned short m_occupation; + unsigned short m_past; + QString m_past_text; + unsigned short m_interests; + QString m_interests_text; + unsigned short m_affilations; + QString m_affilations_text; + QString m_keywords; + bool m_bOnline; +}; + +#endif + diff --git a/plugins/icq/icqsearchbase.ui b/plugins/icq/icqsearchbase.ui new file mode 100644 index 0000000..ca0f44b --- /dev/null +++ b/plugins/icq/icqsearchbase.ui @@ -0,0 +1,228 @@ + + + ICQSearchBase + + + + 0 + 0 + 227 + 606 + + + + Form1 + + + + 0 + + + + + &UIN + + + true + + + + 11 + + + + + + + + + + + &Screenname + + + true + + + false + + + + 11 + + + + + + + + + + + &E-Mail + + + true + + + false + + + + 11 + + + + + + + + + + + &Name + + + true + + + false + + + + 11 + + + + + First: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + + + + Last: + + + false + + + + + + + + + + Nick: + + + false + + + + + + + + + + + + + AOL s&creenname + + + true + + + false + + + + 11 + + + + + + + + + + + ICQ &UIN + + + true + + + false + + + + 11 + + + + + + + + + + + Advanced + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + RadioGroup + QGroupBox +
    simgui/intedit.h
    + 1 +
    +
    + + edtUIN + edtScreen + edtMail + edtFirst + edtLast + edtNick + edtAOL + edtAOL_UIN + btnAdvanced + + + +
    diff --git a/plugins/icq/icqsecure.cpp b/plugins/icq/icqsecure.cpp new file mode 100644 index 0000000..61d5169 --- /dev/null +++ b/plugins/icq/icqsecure.cpp @@ -0,0 +1,228 @@ +/*************************************************************************** + icqsecure.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "icqsecure.h" +#include "icqclient.h" +#include "simgui/ballonmsg.h" +#include "contacts/contact.h" + +#include +#include +#include + +using namespace SIM; + +ICQSecure::ICQSecure(QWidget *parent, ICQClient *client) : QWidget(parent) +{ + setupUi(this); + m_client = client; + connect(chkHideIP, SIGNAL(toggled(bool)), this, SLOT(hideIpToggled(bool))); + setListView(lstVisible); + setListView(lstInvisible); + fill(); + connect(lstVisible, SIGNAL(deleteItem(ListViewItem*)), this, SLOT(deleteVisibleItem(ListViewItem*))); + connect(lstInvisible, SIGNAL(deleteItem(ListViewItem*)), this, SLOT(deleteInvisibleItem(ListViewItem*))); +} + +void ICQSecure::deleteVisibleItem(ListViewItem *item) +{ + Contact *contact = getContacts()->contact(item->text(4).toUInt()); + if (contact) { + ICQUserData *data; + ClientDataIterator it(contact->clientData); + while ((data = m_client->toICQUserData(++it)) != NULL){ + data->VisibleId.asULong() = 0; + EventContact eContact(contact, EventContact::eChanged); + eContact.process(); + } + } +} + +void ICQSecure::deleteInvisibleItem(ListViewItem *item) +{ + Contact *contact = getContacts()->contact(item->text(4).toUInt()); + if (contact) { + ICQUserData *data; + ClientDataIterator it(contact->clientData); + while ((data = m_client->toICQUserData(++it)) != NULL){ + data->InvisibleId.asULong() = 0; + EventContact eContact(contact, EventContact::eChanged); + eContact.process(); + } + } +} + +void ICQSecure::apply() +{ + bool bStatusChanged = false; + if (chkHideIP->isChecked() != m_client->getHideIP()){ + bStatusChanged = true; + m_client->setHideIP(chkHideIP->isChecked()); + } + unsigned mode = 0; + if(btnDirectAllow->isChecked()) + mode = 1; + else if(btnDirectAuth->isChecked()) + mode = 2; + if (mode != m_client->getDirectMode()){ + bStatusChanged = true; + m_client->setDirectMode(mode); + } + if (bStatusChanged && (m_client->getState() == Client::Connected)) + m_client->snacService()->sendStatus(); + m_client->setIgnoreAuth(chkIgnoreAuth->isChecked()); + m_client->setUseMD5(chkUseMD5->isChecked()); +} + +void ICQSecure::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->WaitAuth.asBool() = chkAuth->isChecked(); + data->WebAware.asBool() = chkWeb->isChecked(); +} + +void ICQSecure::fill() +{ + chkAuth->setChecked(m_client->data.owner.WaitAuth.toBool()); + chkWeb->setChecked(m_client->data.owner.WebAware.toBool()); + chkHideIP->setChecked(m_client->getHideIP()); + chkIgnoreAuth->setChecked(m_client->getIgnoreAuth()); + chkUseMD5->setChecked(m_client->getUseMD5()); + + switch(m_client->getDirectMode()) + { + case 0: + btnDirectContact->setChecked(true); + break; + case 1: + btnDirectAllow->setChecked(true); + break; + case 2: + btnDirectAuth->setChecked(true); + break; + default: + break; + + } + fillListView(lstVisible, &ICQUserData::VisibleId); + fillListView(lstInvisible, &ICQUserData::InvisibleId); + hideIpToggled(m_client->getHideIP()); +} + +bool ICQSecure::processEvent(Event *e) +{ + if (e->type() == eEventClientChanged){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } else + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + fillListView(lstVisible, &ICQUserData::VisibleId); + fillListView(lstInvisible, &ICQUserData::InvisibleId); + } + return false; +} + +void ICQSecure::setListView(ListView *lst) +{ + //lst->setSorting(0); + lst->addColumn(i18n("UIN")); + lst->addColumn(i18n("Nick")); + lst->addColumn(i18n("Name")); + lst->addColumn(i18n("EMail")); + //lst->setColumnAlignment(0, Qt::AlignRight); + lst->setExpandingColumn(3); +} + +void ICQSecure::fillListView(ListView *lst, SIM::Data ICQUserData::* field) +{ + lst->clear(); + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + ICQUserData *data; + ClientDataIterator it(contact->clientData, m_client); + while ((data = m_client->toICQUserData(++it)) != NULL){ + if ((data->*field).toULong()){ + QString firstName = contact->getFirstName(); + QString lastName = contact->getLastName(); + firstName = getToken(firstName, '/'); + lastName = getToken(lastName, '/'); + if (!lastName.isEmpty()){ + if (!firstName.isEmpty()) + firstName += ' '; + firstName += lastName; + } + QString mails; + QString emails = contact->getEMails(); + while (emails.length()){ + QString mailItem = getToken(emails, ';', false); + mailItem = getToken(mailItem, '/'); + if (!mails.isEmpty()) + mails += ", "; + mails += mailItem; + } + ListViewItem *item = new ListViewItem(lst); + item->setText(0,QString::number(data->Uin.toULong())); + item->setText(1,contact->getName()); + item->setText(2,firstName); + item->setText(3,mails); + item->setText(4,QString::number(contact->id())); + unsigned long status = STATUS_UNKNOWN; + unsigned style = 0; + QString statusIcon; + ((Client*)m_client)->contactInfo(data, status, style, statusIcon); + item->setPixmap(0, Pict(statusIcon)); + } + } + } +} + +void ICQSecure::hideIpToggled(bool bOn) +{ + if (bOn) { + btnDirectAuth->setChecked(true); + grpDirect->setEnabled(false); + } else { + switch(m_client->getDirectMode()) + { + case 0: + btnDirectContact->setChecked(true); + break; + case 1: + btnDirectAllow->setChecked(true); + break; + case 2: + btnDirectAuth->setChecked(true); + break; + default: + break; + + } + grpDirect->setEnabled(true); + } +} + + +// vim: set expandtab: + diff --git a/plugins/icq/icqsecure.h b/plugins/icq/icqsecure.h new file mode 100644 index 0000000..fbd6711 --- /dev/null +++ b/plugins/icq/icqsecure.h @@ -0,0 +1,49 @@ +/*************************************************************************** + icqsecure.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _ICQSECURE_H +#define _ICQSECURE_H + +#include "cfg.h" + +#include "simgui/listview.h" +#include "ui_icqsecurebase.h" + +class ICQClient; +struct ICQUserData; + +class ICQSecure : public QWidget, public Ui::Secure, public SIM::EventReceiver +{ + Q_OBJECT +public: + ICQSecure(QWidget *parent, ICQClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); + void hideIpToggled(bool); + void deleteVisibleItem(ListViewItem *item); + void deleteInvisibleItem(ListViewItem *item); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + void setListView(ListView*); + void fillListView(ListView *lst, SIM::Data ICQUserData::* field); + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/icqsecurebase.ui b/plugins/icq/icqsecurebase.ui new file mode 100644 index 0000000..ba534de --- /dev/null +++ b/plugins/icq/icqsecurebase.ui @@ -0,0 +1,170 @@ + + + Secure + + + + 0 + 0 + 441 + 324 + + + + Form1 + + + + 6 + + + 11 + + + + + 0 + + + + &Security + + + + 6 + + + 11 + + + + + My &authorization is required before users add me to Contact List + + + + + + + Don't show my &IP-address + + + + + + + + + + Allow other to view my &status from the Web + + + + + + + I&gnore user authorization + + + + + + + Always use &MD5 authentication + + + + + + + Direct connections + + + + + + Allow direct connection from user listed in &contact list + + + + + + + Allow &direct connection from any user + + + + + + + Allow direct connection from user &upon authorization + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &Visible list + + + + 6 + + + 11 + + + + + + + + + &Invisible list + + + + 6 + + + 11 + + + + + + + + + + + + + ListView + QWidget +
    simgui/listview.h
    +
    +
    + + +
    diff --git a/plugins/icq/icqservice.cpp b/plugins/icq/icqservice.cpp new file mode 100644 index 0000000..0f51bad --- /dev/null +++ b/plugins/icq/icqservice.cpp @@ -0,0 +1,723 @@ +/*************************************************************************** + icqservice.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifdef WIN32 +#include +#else +#include +#include +#endif + +#include +#include +#include +#include +#include + +#include "log.h" + +#include "icqclient.h" +#include "icqservice.h" +#include "contacts/contact.h" + +using namespace std; +using namespace SIM; + +const unsigned short ICQ_SNACxSRV_ERROR = 0x0001; +const unsigned short ICQ_SNACxSRV_READYxCLIENT = 0x0002; +const unsigned short ICQ_SNACxSRV_READYxSERVER = 0x0003; +const unsigned short ICQ_SNACxSRV_SERVICExREQ = 0x0004; +const unsigned short ICQ_SNACxSRV_SERVICExRESP = 0x0005; +const unsigned short ICQ_SNACxSRV_REQxRATExINFO = 0x0006; +const unsigned short ICQ_SNACxSRV_RATExINFO = 0x0007; +const unsigned short ICQ_SNACxSRV_RATExACK = 0x0008; +const unsigned short ICQ_SNACxSRV_RATExDEL = 0x0009; /* Not implemented */ +const unsigned short ICQ_SNACxSRV_RATExCHANGE = 0x000A; +const unsigned short ICQ_SNACxSRV_PAUSE = 0x000B; +const unsigned short ICQ_SNACxSRV_PAUSExACK = 0x000C; +const unsigned short ICQ_SNACxSRV_RESUME = 0x000D; +const unsigned short ICQ_SNACxSRV_GETxUSERxINFO = 0x000E; +const unsigned short ICQ_SNACxSRV_NAMExINFO = 0x000F; +const unsigned short ICQ_SNACxSRV_EVIL = 0x0010; +const unsigned short ICQ_SNACxSRV_SETxIDLE = 0x0011; +const unsigned short ICQ_SNACxSRV_MIGRATE = 0x0012; +const unsigned short ICQ_SNACxSRV_MOTD = 0x0013; +const unsigned short ICQ_SNACxSRV_PRIVATY_FLAGS = 0x0014; /* Not implemented */ +const unsigned short ICQ_SNACxSRV_IMxICQ = 0x0017; +const unsigned short ICQ_SNACxSRV_ACKxIMxICQ = 0x0018; +const unsigned short ICQ_SNACxSRV_SETxSTATUS = 0x001E; +const unsigned short ICQ_SNACxSRV_EXT_STATUS = 0x0021; + +SnacIcqService::SnacIcqService(ICQClient* client) : SnacHandler(client, 0x0001) +{ +} + +SnacIcqService::~SnacIcqService() +{ +} + +bool SnacIcqService::process(unsigned short subtype, ICQBuffer* buf, unsigned short /*seq*/) //seq unused +{ + switch (subtype) + { + case ICQ_SNACxSRV_PAUSE: + log(L_DEBUG, "Server pause"); + m_client->m_bNoSend = true; + m_client->snac(ICQ_SNACxFOOD_SERVICE, ICQ_SNACxSRV_PAUSExACK); + m_client->socket()->writeBuffer() << ICQ_SNACxFOOD_SERVICE + << ICQ_SNACxFOOD_LOCATION + << ICQ_SNACxFOOD_BUDDY + << ICQ_SNACxFOOD_MESSAGE + << ICQ_SNACxFOOD_BOS + << ICQ_SNACxFOOD_PING + << ICQ_SNACxFOOD_LISTS + << ICQ_SNACxFOOD_VARIOUS + << ICQ_SNACxFOOD_LOGIN; + m_client->sendPacket(true); + break; + case ICQ_SNACxSRV_RESUME: + log(L_DEBUG, "Server resume"); + m_client->m_bNoSend = false; + m_client->snacICBM()->processSendQueue(); + break; + case ICQ_SNACxSRV_MIGRATE: + { + log(L_DEBUG, "Server migrate"); + m_client->m_bNoSend = true; + int i; + unsigned short cnt; + unsigned short food[0x17]; + + *buf >> cnt; + for(i = 0; i < cnt; i++) + { + *buf >> food[i]; + } + TlvList tlv(*buf); + Tlv *tlv_adr = tlv(0x05); + Tlv *tlv_cookie = tlv(0x06); + for(; i >= 0; i--) + { + + setServiceSocket(tlv_adr,tlv_cookie,food[i]); + } + break; + } + case ICQ_SNACxSRV_RATExCHANGE: + { + const char *msg_text = NULL; + unsigned short msg_code; + unsigned short class_id; + unsigned long window_size; + unsigned long clear_level; + unsigned long alert_level; + unsigned long limit_level; + unsigned long discon_level; + unsigned long current_level; + unsigned long max_level; + unsigned long last_send; + char current_state; + *buf >> msg_code + >> class_id + >> window_size + >> clear_level + >> alert_level + >> limit_level + >> discon_level + >> current_level + >> max_level + >> last_send + >> current_state; + if(subtype == ICQ_SNACxSRV_RATExCHANGE) + { + switch (msg_code) + { + case 0x0001: + msg_text = "Rate limits parameters changed"; + break; + case 0x0002: + msg_text = "Rate limits warning"; + break; + case 0x0003: + msg_text = "Rate limit hit"; + break; + case 0x0004: + msg_text = "Rate limit clear"; + break; + default: + msg_text = "Unknown"; + } + log(L_DEBUG, "%s", msg_text); + } + log(L_DEBUG, "grp: %02X, ws: %04lX, cl %04lX, al %04lX, ll %04lX, dl: %04lX, cur %04lX, ml %04lX", + class_id,window_size,clear_level,alert_level,limit_level,discon_level, + current_level,max_level); + if (--class_id < m_client->m_rates.size()){ + RateInfo &r = m_client->m_rates[class_id]; + r.m_winSize = window_size; + r.m_maxLevel = max_level; + r.m_minLevel = alert_level; + r.m_curLevel = current_level; + r.m_lastSend = QDateTime::currentDateTime(); + m_client->snacICBM()->processSendQueue(); + } + break; + } + case ICQ_SNACxSRV_RATExINFO: + { + bool bNew = m_client->m_rates.size() == 0; + m_client->m_rates.clear(); + unsigned short n_rates; + *buf >> n_rates; + unsigned n; + for(n = 0; n < n_rates; n++) + { + unsigned short class_id; + unsigned long window_size; + unsigned long clear_level; + unsigned long alert_level; + unsigned long limit_level; + unsigned long discon_level; + unsigned long current_level; + unsigned long max_level; + unsigned long last_send; + char current_state; + *buf >> class_id + >> window_size + >> clear_level + >> alert_level + >> limit_level + >> discon_level + >> current_level + >> max_level + >> last_send + >> current_state; + log(L_DEBUG, "grp: %02X, ws: %04lX, cl %04lX, al %04lX, ll %04lX, dl: %04lX, cur %04lX, ml %04lX, cs: %d", + class_id,window_size,clear_level,alert_level,limit_level,discon_level, + current_level,max_level, current_state); + RateInfo r; + r.m_winSize = window_size; + r.m_minLevel = alert_level; + r.m_maxLevel = max_level; + r.m_curLevel = current_level; + r.m_lastSend = QDateTime::currentDateTime(); + m_client->m_rates.push_back(r); + } + for(n = 0; n < n_rates; n++) + { + unsigned short class_id; + unsigned short pairs; + *buf >> class_id + >> pairs; + class_id--; + for(unsigned i = 0; i < pairs; i++) + { + unsigned long snac; + *buf >> snac; + if(class_id >= m_client->m_rates.size()) + continue; + RATE_MAP::iterator it = m_client->m_rate_grp.find(snac); + if (it != m_client->m_rate_grp.end()) + continue; + m_client->m_rate_grp.insert(RATE_MAP::value_type(snac, class_id)); + } + } + m_client->snac(ICQ_SNACxFOOD_SERVICE, ICQ_SNACxSRV_RATExACK); + m_client->socket()->writeBuffer() << 0x00010002L << 0x00030004L << 0x0005; + m_client->sendPacket(true); + if(!bNew) + break; + m_client->snac(ICQ_SNACxFOOD_SERVICE, ICQ_SNACxSRV_GETxUSERxINFO); + m_client->sendPacket(true); + m_client->listsRequest(); + m_client->locationRequest(); + log(L_DEBUG, "alpha"); + m_client->buddyRequest(); + log(L_DEBUG, "beta"); + m_client->snacICBM()->rightsRequest(); + log(L_DEBUG, "gamma"); + m_client->bosRequest(); + log(L_DEBUG, "delta"); + } + break; + case ICQ_SNACxSRV_MOTD: + break; + case ICQ_SNACxSRV_ACKxIMxICQ: + requestRateInfo(); + break; + case ICQ_SNACxSRV_EXT_STATUS: + { + QByteArray shash; + unsigned short nType; + char flags, size; + + *buf >> nType; + if(nType == 0) // SSBI ready + break; + if(nType == 2) // iChat message + break; + + *buf >> flags >> size; + shash.resize(size); + buf->unpack(shash.data(), shash.size()); + + QImage img(m_client->getPicture()); + if(img.isNull()) + break; + + QByteArray ba; + QBuffer l_buf(&ba); + if(!l_buf.open(QIODevice::WriteOnly)) + { + log(L_ERROR, "Can't open QByteArray for writing!"); + break; + } + if(!img.save(&l_buf, "JPEG")) { + log(L_ERROR, "Can't save QImage to QBuffer"); + break; + } + l_buf.close(); + QByteArray hash = QCryptographicHash::hash(ba.data(), QCryptographicHash::Md5); + + if(hash != shash) { + log(L_WARN, "The buddyIcon on server does not match the local one - updating"); + m_client->uploadBuddy(&m_client->data.owner); + break; + } + log(L_DEBUG, "SRV_EXT_STATUS"); + if(flags & FirstSend) + { + m_client->uploadBuddyIcon(1, img); + } + else + { + ICQUserData* data = &m_client->data.owner; + data->buddyHash.setBinary(hash); + /* + m_client->sendCapability(QString::null); + m_client->requestBuddy(data); + */ + } + + } + break; + case ICQ_SNACxSRV_NAMExINFO: + { + QString screen = buf->unpackScreen(); + if(screen.length() == 0){ + char n; + *buf >> n; + buf->incReadPos(n); + screen = buf->unpackScreen(); + } + if (screen.toULong() != m_client->data.owner.Uin.toULong()){ + log(L_WARN, "Not my name info (%s)", qPrintable(screen)); + break; + } + buf->incReadPos(4); + TlvList tlv(*buf); + Tlv *tlvIP = tlv(0x000A); + if (tlvIP) + set_ip(&m_client->data.owner.IP, htonl((uint32_t)(*tlvIP))); + break; + } + case ICQ_SNACxSRV_SERVICExRESP: + { + TlvList tlv(*buf); + Tlv *tlv_id = tlv(0x0D); + if (!tlv_id){ + log(L_WARN, "No service id in response"); + break; + } + Tlv *tlv_adr = tlv(0x05); + Tlv *tlv_cookie = tlv(0x06); + setServiceSocket(tlv_adr,tlv_cookie,(uint16_t)(*tlv_id)); + break; + } + case ICQ_SNACxSRV_READYxSERVER: + m_client->snac(ICQ_SNACxFOOD_SERVICE, ICQ_SNACxSRV_IMxICQ); + if (m_client->m_bAIM){ + m_client->socket()->writeBuffer() + << 0x00010003L + << 0x00130003L + << 0x00020001L + << 0x00030001L + << 0x00040001L + << 0x00060001L + << 0x00080001L + << 0x00090001L + << 0x000A0001L + << 0x000B0001L; + }else{ + m_client->socket()->writeBuffer() + << 0x00010004L + << 0x00130004L + << 0x00020001L + << 0x00030001L + << 0x00150001L + << 0x00040001L + << 0x00060001L + << 0x00090001L + << 0x000A0001L + << 0x000B0001L; + } + m_client->sendPacket(true); + break; + case ICQ_SNACxSRV_ERROR: + break; + case ICQ_SNACxSRV_EVIL: + { + unsigned short level; + buf->unpack(level); + QString from = buf->unpackScreen(); + m_client->data.owner.WarningLevel.asULong() = level; + if (from.isEmpty()) + from = i18n("anonymous"); + EventNotification::ClientNotificationData d; + d.client = m_client; + d.code = 0; + d.text = I18N_NOOP("You've been warned by %1"); + d.args = from; + d.flags = EventNotification::ClientNotificationData::E_INFO; + d.options = QString::null; + d.id = CmdShowWarning; + EventClientNotification e(d); + e.process(); + break; + } + default: + log(L_WARN, "Unknown service foodgroup type %04X", subtype); + } + return true; +} + +void SnacIcqService::requestRateInfo() +{ + m_client->snac(ICQ_SNACxFOOD_SERVICE, ICQ_SNACxSRV_REQxRATExINFO); + m_client->sendPacket(true); +} + +void SnacIcqService::addService(ServiceSocket* s) +{ + m_services.push_back(s); +} + +void SnacIcqService::deleteService(ServiceSocket* s) +{ + for(std::list::iterator it = m_services.begin(); it != m_services.end(); ++it) + { + if((*it) == s) + { + m_services.erase(it); + break; + } + } +} + +ServiceSocket* SnacIcqService::getService(unsigned short id) +{ + for(std::list::iterator it = m_services.begin(); it != m_services.end(); ++it) + { + if((*it)->id() == id) + { + return (*it); + } + } + log(L_WARN, "Service not found"); + return NULL; +} + +void SnacIcqService::clearServices() +{ + while(!m_services.empty()) + { + ServiceSocket *s = m_services.front(); + delete s; + } +} + +void SnacIcqService::setServiceSocket(Tlv *tlv_addr, Tlv *tlv_cookie, unsigned short service) +{ + ServiceSocket *s = getService(service); + if(!s) + { + return; + } + if (!tlv_addr){ + s->error_state("No address for service", 0); + return; + } + if (!tlv_cookie){ + s->error_state("No cookie for service", 0); + return; + } + unsigned short port = m_client->getPort(); + QByteArray addr(tlv_addr->byteArray()); + int idx = addr.indexOf(':'); + if(idx != -1) { + port = addr.mid(idx + 1).toUShort(); + addr = addr.left(idx); + } + if (s->connected()) + s->close(); + QByteArray ba = tlv_cookie->byteArray(); + ba.resize(ba.size()-1); + s->connect(addr, port, ba); +} + +void SnacIcqService::sendClientReady() +{ + snac(ICQ_SNACxSRV_READYxCLIENT); + m_client->socket()->writeBuffer() + << 0x00010004L << 0x0110164FL + << 0x00130004L << 0x0110164FL + << 0x00020001L << 0x0110164FL + << 0x00030001L << 0x0110164FL + << 0x00150001L << 0x0110164FL + << 0x00040001L << 0x0110164FL + << 0x00060001L << 0x0110164FL + << 0x00090001L << 0x0110164FL + << 0x000A0001L << 0x0110164FL + << 0x000B0001L << 0x0110164FL; + + m_client->sendPacket(true); +} + +void SnacIcqService::sendLogonStatus() +{ + if (m_client->getInvisible()) + m_client->sendInvisible(false); + m_client->sendContactList(); + + QDateTime now(QDateTime::currentDateTime()); + if (m_client->data.owner.PluginInfoTime.toULong() == 0) + m_client->data.owner.PluginInfoTime.asULong() = now.toTime_t(); + if (m_client->data.owner.PluginStatusTime.toULong() == 0) + m_client->data.owner.PluginStatusTime.asULong() = now.toTime_t(); + if (m_client->data.owner.InfoUpdateTime.toULong() == 0) + m_client->data.owner.InfoUpdateTime.asULong() = now.toTime_t(); + m_client->data.owner.OnlineTime.asULong() = now.toTime_t(); + if (getContacts()->owner()->getPhones() != m_client->data.owner.PhoneBook.str()) + { + m_client->data.owner.PhoneBook.str() = getContacts()->owner()->getPhones(); + m_client->data.owner.PluginInfoTime.asULong() = now.toTime_t(); + } + if (m_client->getPicture() != m_client->data.owner.Picture.str()){ + m_client->data.owner.Picture.str() = m_client->getPicture(); + m_client->data.owner.PluginInfoTime.asULong() = now.toTime_t(); + } + if (getContacts()->owner()->getPhoneStatus() != (int)m_client->data.owner.FollowMe.toULong()){ + m_client->data.owner.FollowMe.asULong() = getContacts()->owner()->getPhoneStatus(); + m_client->data.owner.PluginStatusTime.asULong() = now.toTime_t(); + } + + ICQBuffer directInfo(25); + fillDirectInfo(directInfo); + + snac(ICQ_SNACxSRV_SETxSTATUS); + m_client->socket()->writeBuffer().tlv(0x0006, m_client->getFullStatus()); + m_client->socket()->writeBuffer().tlv(0x0008, (unsigned short)0x0a06); + m_client->socket()->writeBuffer().tlv(0x000C, directInfo); + Buffer b; + b << (unsigned short)0x000e + << (unsigned short)0x0000 + << (unsigned short)0x0002 + << (unsigned short)0x0000; + + m_client->socket()->writeBuffer().tlv(0x001d, b); + m_client->socket()->writeBuffer().tlv(0x001f, (unsigned short)0); + m_client->sendPacket(true); + if (!m_client->getInvisible()) + m_client->sendInvisible(true); + sendIdleTime(); + m_client->m_status = m_client->m_logonStatus; +} + +void SnacIcqService::setInvisible() +{ + log(L_DEBUG, "SnacIcqService::setInvisible"); + if(m_client->getInvisible()) + m_client->sendInvisible(false); + snac(ICQ_SNACxSRV_SETxSTATUS); + m_client->socket()->writeBuffer().tlv(0x0006, m_client->getFullStatus()); + m_client->sendPacket(true); + if (!m_client->getInvisible()) + m_client->sendInvisible(true); +} + +void SnacIcqService::sendStatus(unsigned long statuscode) +{ + snac(ICQ_SNACxSRV_SETxSTATUS); + m_client->socket()->writeBuffer().tlv(0x0006, statuscode); + m_client->sendPacket(true); + sendIdleTime(); +} + +void SnacIcqService::sendStatus() +{ + log(L_DEBUG, "SnacIcqService::sendStatus"); + snac(ICQ_SNACxSRV_SETxSTATUS); + m_client->socket()->writeBuffer().tlv(0x0006, m_client->getFullStatus()); + m_client->sendPacket(true); + sendIdleTime(); +} + +void SnacIcqService::sendPluginInfoUpdate(unsigned plugin_id) +{ + log(L_DEBUG, "SnacIcqService::sendPluginInfoUpdate"); + snac(ICQ_SNACxSRV_SETxSTATUS); + m_client->socket()->writeBuffer().tlv(0x0006, m_client->getFullStatus()); + ICQBuffer directInfo(25); + fillDirectInfo(directInfo); + m_client->socket()->writeBuffer().tlv(0x000C, directInfo); + ICQBuffer b; + b << (char)2; + b.pack(m_client->data.owner.PluginInfoTime.toULong()); + b.pack((unsigned short)2); + b.pack((unsigned short)1); + b.pack((unsigned short)2); + b.pack((char*)m_client->plugins[plugin_id], sizeof(plugin)); + b.pack(m_client->data.owner.PluginInfoTime.toULong()); + b << (char)0; + m_client->socket()->writeBuffer().tlv(0x0011, b); + m_client->socket()->writeBuffer().tlv(0x0012, (unsigned short)0); + m_client->sendPacket(false); +} + +void SnacIcqService::sendPluginStatusUpdate(unsigned plugin_id, unsigned long status) +{ + log(L_DEBUG, "SnacIcqService::sendPluginInfoUpdate"); + snac(ICQ_SNACxSRV_SETxSTATUS); + m_client->socket()->writeBuffer().tlv(0x0006, m_client->fullStatus(m_client->m_logonStatus)); + ICQBuffer directInfo(25); + fillDirectInfo(directInfo); + m_client->socket()->writeBuffer().tlv(0x000C, directInfo); + ICQBuffer b; + b << (char)3; + b.pack(m_client->data.owner.PluginStatusTime.toULong()); + b.pack((unsigned short)0); + b.pack((unsigned short)1); + b.pack((unsigned short)1); + b.pack((char*)m_client->plugins[plugin_id], sizeof(plugin)); + b << (char)1; + b.pack(status); + b.pack(m_client->data.owner.PluginStatusTime.toULong()); + b.pack((unsigned short)0); + b.pack((unsigned short)0); + b.pack((unsigned short)1); + m_client->socket()->writeBuffer().tlv(0x0011, b); + m_client->socket()->writeBuffer().tlv(0x0012, (unsigned short)0); + m_client->sendPacket(false); +} + +void SnacIcqService::sendUpdate() +{ + if (m_nUpdates == 0) + return; + if (--m_nUpdates) + return; + m_client->data.owner.InfoUpdateTime.asULong() = QDateTime::currentDateTime().toTime_t(); + snac(ICQ_SNACxSRV_SETxSTATUS); + m_client->socket()->writeBuffer().tlv(0x0006, m_client->getFullStatus()); + ICQBuffer directInfo(25); + fillDirectInfo(directInfo); + m_client->socket()->writeBuffer().tlv(0x000C, directInfo); + m_client->sendPacket(false); +} + +void SnacIcqService::fillDirectInfo(ICQBuffer &directInfo) +{ + set_ip(&m_client->data.owner.RealIP, m_client->socket()->localHost()); + /* + if (m_client->getHideIP()){ + directInfo + << (unsigned long)0 + << (unsigned long)0; + }else{ + directInfo + << (unsigned long)htonl(get_ip(m_client->data.owner.RealIP)) + << (unsigned short)0 + << (unsigned short)m_client->data.owner.Port.toULong(); + } + + char mode = DIRECT_MODE_DIRECT; + unsigned long ip1 = get_ip(m_client->data.owner.IP); + unsigned long ip2 = get_ip(m_client->data.owner.RealIP); + if (ip1 && ip2 && (ip1 != ip2)) + mode = DIRECT_MODE_INDIRECT; + switch (m_client->socket()->socket()->mode()){ + case Socket::Indirect: + mode = DIRECT_MODE_INDIRECT; + break; + case Socket::Web: + mode = DIRECT_MODE_DENIED; + break; + default: + break; + } + */ + directInfo + << (unsigned long)0 + << (unsigned long)0 + << (char)0x00//mode + << (char)0x00 + << (char)ICQ_TCP_VERSION + << m_client->data.owner.DCcookie.toULong() + << 0x00000000L + << 0x00000000L + << 0x00000000L + << 0x00000000L + << 0x00000000L + << (unsigned short)0x0000; + + /* + directInfo + << 0x00000050L + << 0x00000003L + << m_client->data.owner.InfoUpdateTime.toULong() + << m_client->data.owner.PluginInfoTime.toULong() + << m_client->data.owner.PluginStatusTime.toULong() + << (unsigned short) 0x0000; + */ +} + +void SnacIcqService::sendIdleTime() +{ + // avoid traffic + if(!m_idleTime && m_client->getIdleTime() == 0) + return; + snac(ICQ_SNACxSRV_SETxIDLE); + if(m_client->getIdleTime()) { + unsigned long idle = QDateTime::currentDateTime().toTime_t() - m_client->getIdleTime(); + if (idle <= 0) + idle = 1; + m_client->socket()->writeBuffer() << idle; + m_idleTime = true; + } else { + m_client->socket()->writeBuffer() << (unsigned long)0; + m_idleTime = false; + } + m_client->sendPacket(false); +} + +void SnacIcqService::requestService(ServiceSocket *s) +{ + snac(ICQ_SNACxSRV_SERVICExREQ, true); + m_client->socket()->writeBuffer() << s->id(); + m_client->sendPacket(true); +} + diff --git a/plugins/icq/icqservice.h b/plugins/icq/icqservice.h new file mode 100644 index 0000000..704a811 --- /dev/null +++ b/plugins/icq/icqservice.h @@ -0,0 +1,47 @@ + +#ifndef _ICQSERVICE_H +#define _ICQSERVICE_H + +#include + +#include "snac.h" + +class ServiceSocket; +class Tlv; +class SnacIcqService : public SnacHandler +{ +public: + SnacIcqService(ICQClient* client); + virtual ~SnacIcqService(); + + virtual bool process(unsigned short subtype, ICQBuffer* buf, unsigned short seq); + void requestRateInfo(); + + void addService(ServiceSocket* s); + void deleteService(ServiceSocket* s); + ServiceSocket* getService(unsigned short id); + void clearServices(); + void setServiceSocket(Tlv *tlv_addr, Tlv *tlv_cookie, unsigned short service); + void sendClientReady(); + void sendLogonStatus(); + void setInvisible(); + void sendStatus(unsigned long statuscode); + void sendStatus(); + void sendUpdate(); + void sendPluginInfoUpdate(unsigned plugin_id); + void sendPluginStatusUpdate(unsigned plugin_id, unsigned long status); + void sendIdleTime(); + void requestService(ServiceSocket *s); + static const unsigned int FirstSend = 0x40; + +protected: + void fillDirectInfo(ICQBuffer &directInfo); + +private: + bool m_idleTime; + + std::list m_services; + unsigned int m_nUpdates; +}; + +#endif diff --git a/plugins/icq/icqssbi.cpp b/plugins/icq/icqssbi.cpp new file mode 100644 index 0000000..e00090f --- /dev/null +++ b/plugins/icq/icqssbi.cpp @@ -0,0 +1,358 @@ +/*************************************************************************** + icqssbi.cpp - description + ------------------- + begin : Sun Oct 17 2006 + copyright : (C) 2006 by Christian Ehrlicher + email : ch.ehrlicher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include +#include +#include +#include + +#include "log.h" + +#include "icqclient.h" +#include "icqssbi.h" + +using namespace std; +using namespace SIM; + +const unsigned short ICQ_SNACxSSBI_ERROR = 0x0001; +const unsigned short ICQ_SNACxSSBI_UPLOAD = 0x0002; // cli -> srv +const unsigned short ICQ_SNACxSSBI_UPLOAD_ACK = 0x0003; // src -> cli +const unsigned short ICQ_SNACxSSBI_REQ_AIM = 0x0004; // cli -> srv +const unsigned short ICQ_SNACxSSBI_REQ_AIM_ACK = 0x0005; // src -> cli +const unsigned short ICQ_SNACxSSBI_REQ_ICQ = 0x0006; // cli -> srv +const unsigned short ICQ_SNACxSSBI_REQ_ICQ_ACK = 0x0007; // src -> cli + +SSBISocket *ICQClient::getSSBISocket() +{ + SSBISocket *s = static_cast(m_snacService->getService(ICQ_SNACxFOOD_SSBI)); + if (s == NULL){ + s = new SSBISocket(this); + snacService()->requestService(s); + } + return s; +} + +void ICQClient::requestBuddy(const ICQUserData *data) +{ + if(!data->buddyHash.toBinary().size()) + return; + SSBISocket *s = getSSBISocket(); + s->requestBuddy(screen(data), data->buddyID.toULong(), data->buddyHash.toBinary()); +} + +void ICQClient::uploadBuddyIcon(unsigned short refNumber, const QImage &img) +{ + SSBISocket *s = getSSBISocket(); + s->uploadBuddyIcon(refNumber, img); +} + +SSBISocket::SSBISocket(ICQClient *client) + : ServiceSocket(client, ICQ_SNACxFOOD_SSBI), m_refNumber(0), m_retryCount(3) +{} + +SSBISocket::~SSBISocket() +{} + +bool SSBISocket::error_state(const QString &err, unsigned code) +{ + bool bRet = ServiceSocket::error_state(err, code); + if(m_retryCount && (!m_img.isNull() || m_buddyRequests.count())) { + m_retryCount--; + QTimer::singleShot(5000, this, SLOT(requestService())); + return false; + } + return bRet; +} + +void SSBISocket::data(unsigned short food, unsigned short type, unsigned short seq) +{ + switch(food) { + case ICQ_SNACxFOOD_SERVICE: + snac_service(type, seq); + break; + case ICQ_SNACxFOOD_SSBI: + snac_ssbi(type, seq); + break; + default: + log(L_WARN, "Unknown foodgroup %d in SSBISocket", food); + break; + } +} + +// from icqservice.cpp +const unsigned short ICQ_SNACxSRV_READYxCLIENT = 0x0002; +const unsigned short ICQ_SNACxSRV_READYxSERVER = 0x0003; +const unsigned short ICQ_SNACxSRV_REQxRATExINFO = 0x0006; +const unsigned short ICQ_SNACxSRV_RATExINFO = 0x0007; +const unsigned short ICQ_SNACxSRV_RATExACK = 0x0008; +const unsigned short ICQ_SNACxSRV_IMxICQ = 0x0017; +const unsigned short ICQ_SNACxSRV_ACKxIMxICQ = 0x0018; + +void SSBISocket::snac_service(unsigned short type, unsigned short) +{ + switch(type) { + case ICQ_SNACxSRV_READYxSERVER: + snac(ICQ_SNACxFOOD_SERVICE, ICQ_SNACxSRV_IMxICQ); + socket()->writeBuffer() << 0x00010004L << 0x00100001L; + sendPacket(); + break; + case ICQ_SNACxSRV_ACKxIMxICQ: + snac(ICQ_SNACxFOOD_SERVICE, ICQ_SNACxSRV_REQxRATExINFO); + sendPacket(); + break; + case ICQ_SNACxSRV_RATExINFO: + snac(ICQ_SNACxFOOD_SERVICE, ICQ_SNACxSRV_RATExACK); + socket()->writeBuffer() << 0x00010002L << 0x00030004L << 0x0005; + sendPacket(); + snac(ICQ_SNACxFOOD_SERVICE, ICQ_SNACxSRV_READYxCLIENT); + socket()->writeBuffer() << 0x00010004L << 0x0010157fL << 0x00100001L << 0x0010157fL; + sendPacket(); + m_bConnected = true; + process(); + break; + default: + log(L_DEBUG, "Unknown service type %u", type); + break; + } +} + +void SSBISocket::snac_ssbi(unsigned short type, unsigned short seq) +{ + switch (type){ + case ICQ_SNACxSSBI_ERROR:{ + unsigned short error_code; + socket()->readBuffer() >> error_code; + log(L_WARN, "SSBI error (%04X,%04X)", seq, error_code); + break; + } + case ICQ_SNACxSSBI_UPLOAD_ACK: { + unsigned short unknown1, unknown2; + char size; + QByteArray ba; + + socket()->readBuffer() >> unknown1 >> unknown2; + socket()->readBuffer() >> size; + ba.resize(size); + socket()->readBuffer().unpack(ba.data(), size); + break; + } + case ICQ_SNACxSSBI_REQ_AIM_ACK: { + ICQUserData *data; + Contact *contact; + QString screen; + QByteArray hash, icon; + //uint16_t iconID, + uint16_t iconSize; + uint8_t unknown_byte; + //char iconFlags; + char hashSize; + + screen = socket()->readBuffer().unpackScreen(); + if(m_client->screen(&m_client->data.owner) == screen) + data = &m_client->data.owner; + else + data = m_client->findContact(screen, NULL, false, contact); + if(data) + { + // 3 unknown bytes + socket()->readBuffer() >> unknown_byte; + socket()->readBuffer() >> unknown_byte; + socket()->readBuffer() >> unknown_byte; + // then hash (should be 5 bytes) + socket()->readBuffer() >> hashSize; + hash.resize(hashSize); + socket()->readBuffer().unpack(hash.data(), hashSize); + socket()->readBuffer() >> iconSize; + // then icon size and the icon itself + icon.resize(iconSize); + if(iconSize == 0) + { + log(L_DEBUG, "Empty icon"); + process(); + break; + } + socket()->readBuffer().unpack(icon.data(), iconSize); + + QString filename = ICQClient::pictureFile(data); + QFile f(filename); + if(f.open(QIODevice::WriteOnly)) + f.write(icon); + else + log(L_WARN, QString("Can't open %1").arg(filename)); + f.close(); + } + //process(); + break; + } + case ICQ_SNACxSSBI_REQ_ICQ_ACK: { + ICQUserData *data; + Contact *contact; + QString screen; + QByteArray hash, icon; + //uint16_t iconID; + uint16_t iconSize; + uint8_t unknown_byte; + //char iconFlags; + char hashSize; + //char unknown1; + + screen = socket()->readBuffer().unpackScreen(); + if(m_client->screen(&m_client->data.owner) == screen) + data = &m_client->data.owner; + else + data = m_client->findContact(screen, NULL, false, contact); + if(data) { + // 3 unknown bytes + socket()->readBuffer() >> unknown_byte; + socket()->readBuffer() >> unknown_byte; + socket()->readBuffer() >> unknown_byte; + // then hash (should be 5 bytes) + socket()->readBuffer() >> hashSize; + hash.resize(hashSize); + socket()->readBuffer().unpack(hash.data(), hashSize); + socket()->readBuffer() >> iconSize; + // then icon size and the icon itself + icon.resize(iconSize); + if(iconSize == 0) + { + log(L_DEBUG, "Empty icon"); + process(); + break; + } + socket()->readBuffer().unpack(icon.data(), iconSize); + + QString filename = ICQClient::pictureFile(data); + QFile f(filename); + if(f.open(QIODevice::WriteOnly)) + f.write(icon); + else + log(L_WARN, QString("Can't open %1").arg(filename)); + f.close(); + } + process(); + break; + } + default: + log(L_WARN, "Unknown SSBI foodgroup type %04X", type); + break; + } +} + +void SSBISocket::process() +{ + if(!m_img.isNull()) { + //unsigned short ref = m_refNumber; //ref unused + QImage img = m_img; + m_refNumber = 0; + m_img = QImage(); + //uploadBuddyIcon(ref, img); + } + while(m_buddyRequests.count()) { + // implement me: we can also request more than one buddy at a time ! + ICQUserData *data; + Contact *contact; + QString screen = m_buddyRequests[0]; + m_buddyRequests.pop_front(); + if(m_client->screen(&m_client->data.owner) == screen) + data = &m_client->data.owner; + else + data = m_client->findContact(screen, NULL, false, contact); + if(data) { + requestBuddy(screen, data->buddyID.toULong(), data->buddyHash.toBinary()); + return; + } + } +} + +void SSBISocket::uploadBuddyIcon(unsigned short refNumber, const QImage &img) +{ + if(img.isNull()) { + log(L_ERROR, "Uploaded Buddy icon is empty!"); + return; + } + + if(!m_img.isNull()) { + log(L_WARN, "Already in upload mode"); + return; + } + + if(!connected()) { + // wait + m_img = img; + m_refNumber = refNumber; + return; + } + + QByteArray ba; + QBuffer buf(&ba); + unsigned short len; + if(!buf.open(QIODevice::WriteOnly)) + { + log(L_ERROR, "Can't open QByteArray for writing!"); + return; + } + if(!img.save(&buf, "JPEG")) + { + log(L_ERROR, "Can't save QImage to QBuffer"); + return; + } + buf.close(); + + len = ba.size(); + if(ba.size() > 0xffff) { + log(L_ERROR, "Image is to big (max: %d bytes)", 0xffff); + len = 0xffff; + } + + snac(ICQ_SNACxFOOD_SSBI, ICQ_SNACxSSBI_UPLOAD, true); + socket()->writeBuffer() << refNumber; + socket()->writeBuffer() << len; + socket()->writeBuffer().pack(ba.data(), len); + + sendPacket(true); +} + +void SSBISocket::requestBuddy(const QString &screen, unsigned short buddyID, const QByteArray &buddyHash) +{ + log(L_DEBUG, "SSBISocket::requestBuddy: %s", qPrintable(screen)); + if(!((buddyHash.size() == 0x05) || (buddyHash.size() == 0x10))) { + log(L_WARN, "Invalid buddyHash size (%d, id: %d) for %s", buddyHash.size(), buddyID, qPrintable(screen)); + return; + } + // buddyID == 1 -> jpeg + // buddyID == 8 -> xml/swf + if(!connected()) { + // wait + if(!m_buddyRequests.contains(screen)) + m_buddyRequests.append(screen); + return; + } + + char len = buddyHash.size(); + //snac(ICQ_SNACxFOOD_SSBI, m_client->m_bAIM ? ICQ_SNACxSSBI_REQ_AIM : ICQ_SNACxSSBI_REQ_ICQ, true); + snac(ICQ_SNACxFOOD_SSBI, ICQ_SNACxSSBI_REQ_AIM, true); + + socket()->writeBuffer().packScreen(screen); + socket()->writeBuffer() << (char)0x01 + << (char)0x00//(unsigned short)buddyID + << (char)0x01 + << (char)0x00; + socket()->writeBuffer().pack(&len, 1); + socket()->writeBuffer().pack(buddyHash.data(), len); + sendPacket(); +} + diff --git a/plugins/icq/icqssbi.h b/plugins/icq/icqssbi.h new file mode 100644 index 0000000..0795827 --- /dev/null +++ b/plugins/icq/icqssbi.h @@ -0,0 +1,32 @@ +#ifndef ICQSSBI_H +#define ICQSSBI_H + +#include +#include +#include "icqclient.h" + +class SSBISocket : public QObject, public ServiceSocket +{ + Q_OBJECT +public: + SSBISocket(ICQClient *client); + ~SSBISocket(); + void requestBuddy(const QString &screen, unsigned short buddyID, const QByteArray &buddyHash); + void uploadBuddyIcon(unsigned short refNumber, const QImage &img); +protected: + virtual bool error_state(const QString &err, unsigned code); + virtual const char *serviceSocketName() { return "SSBISocket"; } + virtual void data(unsigned short food, unsigned short type, unsigned short seq); + void snac_service(unsigned short type, unsigned short seq); + void snac_ssbi(unsigned short type, unsigned short seq); + void process(); + + QStringList m_buddyRequests; + QImage m_img; // image to upload + unsigned short m_refNumber; // the ref number for the image + unsigned m_retryCount; +protected slots: + void requestService() { m_client->snacService()->requestService(this); } +}; + +#endif // ICQSSBI_H diff --git a/plugins/icq/icqstatus.cpp b/plugins/icq/icqstatus.cpp new file mode 100644 index 0000000..7f3cc13 --- /dev/null +++ b/plugins/icq/icqstatus.cpp @@ -0,0 +1,63 @@ + +#include "icqstatus.h" + +ICQStatus::ICQStatus(const QString& id, const QString& name, bool hasText, const QString& defaultText, const QIcon& icon) : IMStatus(), + m_id(id), + m_name(name), + m_hasText(hasText), + m_text(defaultText), + m_icon(icon) +{ +} + +ICQStatus::~ICQStatus() +{ +} + +QString ICQStatus::id() const +{ + return m_id; +} + +QString ICQStatus::name() const +{ + return m_name; +} + +void ICQStatus::setText(const QString& t) +{ + m_text = t; +} + +QString ICQStatus::text() const +{ + return m_text; +} + +QIcon ICQStatus::icon() const +{ + return m_icon; +} + +QStringList ICQStatus::substatuses() +{ + return QStringList(); +} + +SIM::IMStatusPtr ICQStatus::substatus(const QString& id) +{ + return SIM::IMStatusPtr(); +} + +SIM::IMStatusPtr ICQStatus::clone() +{ + return SIM::IMStatusPtr(new ICQStatus(m_id, m_name, m_hasText, m_text, m_icon)); +} + +bool ICQStatus::hasText() const +{ + return m_hasText; +} + +// vim: set expandtab: + diff --git a/plugins/icq/icqstatus.h b/plugins/icq/icqstatus.h new file mode 100644 index 0000000..83a01af --- /dev/null +++ b/plugins/icq/icqstatus.h @@ -0,0 +1,38 @@ + +#ifndef ICQSTATUS_H +#define ICQSTATUS_H + +#include "contacts/imstatus.h" + +class ICQStatus : public SIM::IMStatus +{ +public: + ICQStatus(const QString& id, const QString& name, bool hasText, const QString& defaultText, const QIcon& icon); + virtual ~ICQStatus(); + + virtual QString id() const; + virtual QString name() const; + virtual bool hasText() const; + virtual void setText(const QString& t); + virtual QString text() const; + virtual QIcon icon() const; + + virtual QStringList substatuses(); + virtual SIM::IMStatusPtr substatus(const QString& id); + virtual SIM::IMStatusPtr clone(); + + +private: + QString m_id; + QString m_name; + bool m_hasText; + QString m_text; + QIcon m_icon; +}; + +typedef QSharedPointer ICQStatusPtr; + +#endif + +// vim: set expandtab: + diff --git a/plugins/icq/icqvarious.cpp b/plugins/icq/icqvarious.cpp new file mode 100644 index 0000000..1066720 --- /dev/null +++ b/plugins/icq/icqvarious.cpp @@ -0,0 +1,1833 @@ +/*************************************************************************** + icqvarious.cpp - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#include +#include +#ifdef WIN32 +#include +#else +#include +#include +#endif + +#include +#include +#include +#include +#include + +#include + +#include "log.h" + +#include "icqclient.h" +#include "xml.h" + +using namespace std; +using namespace SIM; + +const unsigned short ICQ_SNACxVAR_ERROR = 0x0001; +const unsigned short ICQ_SNACxVAR_REQxSRV = 0x0002; +const unsigned short ICQ_SNACxVAR_DATA = 0x0003; + +const unsigned short ICQ_SRVxREQ_OFFLINE_MSG = 0x3C00; +const unsigned short ICQ_SRVxREQ_ACK_OFFLINE_MSG = 0x3E00; +const unsigned short ICQ_SRVxOFFLINE_MSG = 0x4100; +const unsigned short ICQ_SRVxEND_OFFLINE_MSG = 0x4200; +const unsigned short ICQ_SRVxREQ_MORE = 0xD007; +const unsigned short ICQ_SRVxANSWER_MORE = 0xDA07; + +const unsigned short ICQ_SRVxREQ_FULL_INFO = 0xB204; +const unsigned short ICQ_SRVxREQ_SHORT_INFO = 0xBA04; +const unsigned short ICQ_SRVxREQ_OWN_INFO = 0xD004; +const unsigned short ICQ_SRVxREQ_SEND_SMS = 0x8214; +const unsigned short ICQ_SRVxREQ_WP_UIN = 0x6905; +const unsigned short ICQ_SRVxREQ_WP_MAIL = 0x7305; +const unsigned short ICQ_SRVxREQ_WP_FULL = 0x5F05; +const unsigned short ICQ_SRVxREQ_CHANGE_PASSWD = 0x2E04; +const unsigned short ICQ_SRVxREQ_PERMISSIONS = 0x2404; +const unsigned short ICQ_SRVxREQ_XML_KEY = 0x9808; + +const unsigned short ICQ_SRVxGENERAL_INFO = 0xC800; +const unsigned short ICQ_SRVxMORE_INFO = 0xDC00; +const unsigned short ICQ_SRVxEMAIL_INFO = 0xEB00; +const unsigned short ICQ_SRVxWORK_INFO = 0xD200; +const unsigned short ICQ_SRVxABOUT_INFO = 0xE600; +const unsigned short ICQ_SRVxINTERESTS_INFO = 0xF000; +const unsigned short ICQ_SRVxBACKGROUND_INFO = 0xFA00; +const unsigned short ICQ_SRVxUNKNOWN_INFO = 0x0E01; + +const unsigned short ICQ_SRVxREQ_MODIFY_MAIN = 0xEA03; +const unsigned short ICQ_SRVxREQ_MODIFY_HOME = 0xFD03; +const unsigned short ICQ_SRVxREQ_MODIFY_ABOUT = 0x0604; +const unsigned short ICQ_SRVxREQ_MODIFY_WORK = 0xF303; +const unsigned short ICQ_SRVxREQ_MODIFY_MORE = 0xFD03; +const unsigned short ICQ_SRVxREQ_MODIFY_INTERESTS = 0x1004; +const unsigned short ICQ_SRVxREQ_MODIFY_BACKGROUND = 0x1A04; +const unsigned short ICQ_SRVxREQ_MODIFY_MAIL = 0x0B04; + +const unsigned short ICQ_SRVxREQ_PHONE_UPDATE = 0x5406; +const unsigned short ICQ_SRVxREQ_SET_CHAT_GROUP = 0x5807; +const unsigned short ICQ_SRVxREQ_RANDOM_CHAT = 0x4E07; + +const unsigned short ICQ_SRVxWP_SET = 0x3A0C; +const unsigned short ICQ_SRVxWP_SET_RESP = 0x3F0C; + +const unsigned short TLV_UIN = 0x0136; +const unsigned short TLV_FIRST_NAME = 0x0140; +const unsigned short TLV_LAST_NAME = 0x014A; +const unsigned short TLV_NICK = 0x0154; +const unsigned short TLV_EMAIL = 0x015E; +const unsigned short TLV_AGE_RANGE = 0x0168; +const unsigned short TLV_AGE = 0x0172; +const unsigned short TLV_GENDER = 0x017C; +const unsigned short TLV_LANGUAGE = 0x0186; +const unsigned short TLV_CITY = 0x0190; +const unsigned short TLV_STATE = 0x019A; +const unsigned short TLV_COUNTRY = 0x01A4; +const unsigned short TLV_WORK_COMPANY = 0x01AE; +const unsigned short TLV_WORK_DEPARTMENT = 0x01B8; +const unsigned short TLV_WORK_POSITION = 0x01C2; +const unsigned short TLV_WORK_OCCUPATION = 0x01CC; +const unsigned short TLV_AFFILATIONS = 0x01D6; +const unsigned short TLV_INTERESTS = 0x01EA; +const unsigned short TLV_PAST = 0x01FE; +const unsigned short TLV_HOMEPAGE_CATEGORY = 0x0212; +const unsigned short TLV_HOMEPAGE = 0x0213; +const unsigned short TLV_KEYWORDS = 0x0226; +const unsigned short TLV_SEARCH_ONLINE = 0x0230; +const unsigned short TLV_BIRTHDAY = 0x023A; +const unsigned short TLV_NOTES = 0x0258; +const unsigned short TLV_STREET = 0x0262; +const unsigned short TLV_ZIP = 0x026C; +const unsigned short TLV_PHONE = 0x0276; +const unsigned short TLV_FAX = 0x0280; +const unsigned short TLV_CELLULAR = 0x028A; +const unsigned short TLV_WORK_STREET = 0x0294; +const unsigned short TLV_WORK_CITY = 0x029E; +const unsigned short TLV_WORK_STATE = 0x02A8; +const unsigned short TLV_WORK_COUNTRY = 0x02B2; +const unsigned short TLV_WORK_ZIP = 0x02BC; +const unsigned short TLV_WORK_PHONE = 0x02C6; +const unsigned short TLV_WORK_FAX = 0x02D0; +const unsigned short TLV_WORK_HOMEPAGE = 0x02DA; +const unsigned short TLV_SHOW_WEB = 0x030C; +const unsigned short TLV_NEED_AUTH = 0x02F8; +const unsigned short TLV_TIMEZONE = 0x0316; +const unsigned short TLV_ORIGINALLY_CITY = 0x0320; +const unsigned short TLV_ORIGINALLY_STATE = 0x032A; +const unsigned short TLV_ORIGINALLY_COUNTRY = 0x0334; +const unsigned short TLV_RECV_ICQ_SPAM = 0x0348; + +const char SEARCH_STATE_OFFLINE = 0; +const char SEARCH_STATE_ONLINE = 1; +const char SEARCH_STATE_DISABLED = 2; + +const unsigned INFO_REQUEST_TIMEOUT = 60; + +class ServerRequest +{ +public: + ServerRequest(unsigned short id); + virtual ~ServerRequest() {} + unsigned short id() { return m_id; } + virtual bool answer(ICQBuffer&, unsigned short nSubType) = 0; + virtual void fail(unsigned short error_code = 0); +protected: + unsigned short m_id; +}; + +ServerRequest::ServerRequest(unsigned short id) +{ + m_id = id; +} + +ServerRequest *ICQClient::findServerRequest(unsigned short id) +{ + log(L_DEBUG,"Searching for event id %d (%p)", id, this); + for (list::iterator it = varRequests.begin(); it != varRequests.end(); ++it){ + if ((*it)->id() == id) + return *it; + } + return NULL; +} + +void ServerRequest::fail(unsigned short) +{ +} + +void ICQClient::clearServerRequests() +{ + log(L_DEBUG,"Clearing server requests (%p)", this); + for (list::iterator it_req = varRequests.begin(); it_req != varRequests.end(); ++it_req){ + (*it_req)->fail(); + delete *it_req; + } + varRequests.clear(); + list::iterator it; + for (it = infoRequests.begin(); it != infoRequests.end(); ++it){ + Contact *contact = getContacts()->contact(it->uin); + if (contact == NULL) + continue; + EventContact e(contact, EventContact::eFetchInfoFailed); + e.process(); + } + infoRequests.clear(); +} + +void ICQClient::snac_various(unsigned short type, unsigned short id) +{ + switch (type){ + case ICQ_SNACxVAR_ERROR:{ + unsigned short error_code; + socket()->readBuffer() >> error_code; + if (id == m_offlineMessagesRequestId) + { + log(L_WARN, "Server responded with error %04X for offline messages request.", error_code); + // We'll never get ICQ_SRVxEND_OFFLINE_MSG, so we finish initing here instead. + } + else + { + ServerRequest *req = findServerRequest(id); + if (req == NULL){ + log(L_WARN, "Various event ID %04X not found for error %04X", id, error_code); + break; + } + req->fail(error_code); + } + break; + } + case ICQ_SNACxVAR_DATA:{ + TlvList tlv(socket()->readBuffer()); + if (tlv(0x0001) == NULL){ + log(L_WARN, "Bad server response"); + break; + } + ICQBuffer msg(*tlv(1)); + unsigned short len, nType, nId; + unsigned long own_uin; + msg >> len >> own_uin >> nType; + msg.unpack(nId); + switch (nType){ + case ICQ_SRVxEND_OFFLINE_MSG: + serverRequest(ICQ_SRVxREQ_ACK_OFFLINE_MSG); + sendServerRequest(); + setChatGroup(); + addFullInfoRequest(data.owner.Uin.toULong()); + m_bReady = true; + snacICBM()->processSendQueue(); + break; + case ICQ_SRVxOFFLINE_MSG:{ + unsigned long uin; + unsigned char type, flag; + struct tm sendTM; + memset(&sendTM, 0, sizeof(sendTM)); + QByteArray message; + unsigned short year; + unsigned char month, day, hours, min; + msg.unpack(uin); + msg.unpack(year); + msg.unpack(month); + msg.unpack(day); + msg.unpack(hours); + msg.unpack(min); + msg.unpack(type); + msg.unpack(flag); + msg.unpackStr(message); + // ToDo: replace time_t & tm with QDateTime + #ifndef HAVE_TM_GMTOFF + sendTM.tm_sec = -timezone; + #else + time_t now = time (NULL); + sendTM = *localtime (&now); + sendTM.tm_sec = sendTM.tm_gmtoff - (sendTM.tm_isdst == 1 ? 3600 : 0); + #endif + sendTM.tm_year = year-1900; + sendTM.tm_mon = month-1; + sendTM.tm_mday = day; + sendTM.tm_hour = hours; + sendTM.tm_min = min; + sendTM.tm_isdst = -1; + time_t send_time = mktime(&sendTM); + MessageId id; + Message *m = parseMessage(type, QString::number(uin), message, msg, id, 0); + if (m){ + m->setTime(send_time); + messageReceived(m, QString::number(uin)); + } + break; + } + case ICQ_SRVxANSWER_MORE:{ + unsigned short nSubtype; + char nResult; + msg >> nSubtype >> nResult; + if ((nResult == 0x32) || (nResult == 0x14) || (nResult == 0x1E)){ + ServerRequest *req = findServerRequest(nId); + if (req == NULL){ + log(L_WARN, "Various event ID %04X not found (%X)", nId, nResult); + break; + } + req->fail(); + log(L_DEBUG, "removing server request %d (%p)", nId, this); + varRequests.remove(req); + delete req; + break; + } + ServerRequest *req = findServerRequest(nId); + if (req == NULL){ + log(L_WARN, "Various event ID %04X not found (%X)", nId, nResult); + break; + } + if (req->answer(msg, nSubtype)){ + log(L_DEBUG, "removing server request %d (%p)", nId, this); + varRequests.remove(req); + delete req; + } + break; + } + break; + default: + log(L_WARN, "Unknown SNAC(15,03) response type %04X", nType); + } + break; + } + default: + log(L_WARN, "Unknown various foodgroup type %04X", type); + } +} + +void ICQClient::serverRequest(unsigned short cmd, unsigned short seq) +{ + snac(ICQ_SNACxFOOD_VARIOUS, ICQ_SNACxVAR_REQxSRV, true, false); + socket()->writeBuffer().tlv(0x0001, 0); + socket()->writeBuffer().pack(data.owner.Uin.toULong()); + socket()->writeBuffer() << cmd; + socket()->writeBuffer().pack((unsigned short)(seq ? seq : m_nMsgSequence)); +} + +void ICQClient::sendServerRequest() +{ + ICQBuffer &b = socket()->writeBuffer(); + char *packet = b.data(b.packetStartPos()); + unsigned short packet_size = (unsigned short)(b.size() - b.packetStartPos()); + unsigned short size = (unsigned short)(packet_size - 0x14); + packet[0x12] = (char)((size >> 8) & 0xFF); + packet[0x13] = (char)(size & 0xFF); + size = (unsigned short)(packet_size - 0x16); + packet[0x14] = (char)(size & 0xFF); + packet[0x15] = (char)((size >> 8) & 0xFF); + sendPacket(true); +} + +void ICQClient::sendMessageRequest() +{ + serverRequest(ICQ_SRVxREQ_OFFLINE_MSG); + m_offlineMessagesRequestId = m_nMsgSequence; + sendServerRequest(); +} + +// _________________________________________________________________________________________ + +class FullInfoRequest : public ServerRequest +{ +public: + FullInfoRequest(ICQClient *client, unsigned short id, unsigned long uin); +protected: + virtual void fail(unsigned short error_code); + bool answer(ICQBuffer &b, unsigned short nSubtype); + QString unpack_list(ICQBuffer &b, Contact *contact); + unsigned m_nParts; + unsigned long m_uin; + ICQClient *m_client; +}; + +FullInfoRequest::FullInfoRequest(ICQClient *client, unsigned short id, unsigned long uin) + : ServerRequest(id) +{ + m_client = client; + m_nParts = 0; + m_uin = uin; +} + +void FullInfoRequest::fail(unsigned short) +{ + Contact *contact = NULL; + if (m_nParts){ + if (m_client->data.owner.Uin.toULong() == m_uin){ + EventClientChanged(m_client).process(); + }else{ + m_client->findContact(m_uin, NULL, false, contact); + if (contact){ + EventContact e(contact, EventContact::eChanged); + e.process(); + } + } + } + if (contact){ + EventContact e(contact, EventContact::eFetchInfoFailed); + e.process(); + } + m_client->removeFullInfoRequest(m_uin); +} + +QString FullInfoRequest::unpack_list(ICQBuffer &b, Contact *contact) +{ + QString res; + char n; + b >> n; + for (; n > 0; n--){ + unsigned short c; + b.unpack(c); + QByteArray s; + b >> s; + if (c == 0) continue; + if (res.length()) + res += ';'; + res += QString::number(c); + res += ','; + res += quoteChars(getContacts()->toUnicode(contact, s), ";"); + } + return res; +} + +bool FullInfoRequest::answer(ICQBuffer &b, unsigned short nSubtype) +{ + Contact *contact = NULL; + ICQUserData *data; + if (m_client->data.owner.Uin.toULong() == m_uin){ + data = &m_client->data.owner; + }else{ + data = m_client->findContact(m_uin, NULL, false, contact); + if (data == NULL){ + log(L_DEBUG, "Info request %lu not found", m_uin); + m_client->removeFullInfoRequest(m_uin); + return true; + } + } + switch (nSubtype){ + case ICQ_SRVxGENERAL_INFO:{ + unsigned short n; + char TimeZone; + char authFlag; /* ??? */ + char webAware; + char allowDC; + char hideEmail; + QByteArray Nick, FirstName, LastName, EMail, City, State; + QByteArray HomePhone, HomeFax, Address, PrivateCellular, Zip; + b + >> Nick + >> FirstName + >> LastName + >> EMail + >> City + >> State + >> HomePhone + >> HomeFax + >> Address + >> PrivateCellular + >> Zip; + + data->Nick.str() = getContacts()->toUnicode(contact, Nick); + data->FirstName.str() = getContacts()->toUnicode(contact, FirstName); + data->LastName.str() = getContacts()->toUnicode(contact, LastName); + data->EMail.str() = getContacts()->toUnicode(contact, EMail); + data->City.str() = getContacts()->toUnicode(contact, City); + data->State.str() = getContacts()->toUnicode(contact, State); + data->HomePhone.str() = getContacts()->toUnicode(contact, HomePhone); + data->HomeFax.str() = getContacts()->toUnicode(contact, HomeFax); + data->Address.str() = getContacts()->toUnicode(contact, Address); + data->PrivateCellular.str() = getContacts()->toUnicode(contact, PrivateCellular); + data->Zip.str() = getContacts()->toUnicode(contact, Zip); + log(L_DEBUG, "Address: %s(%s)", qPrintable(data->Address.str()), Address.toHex().data()); + b.unpack(n); + data->Country.asULong() = n; + + b + >> TimeZone + >> authFlag + >> webAware + >> allowDC + >> hideEmail; + data->TimeZone.asULong() = TimeZone; + data->WebAware.asBool() = (webAware != 0); + data->bNoDirect.asBool() = (allowDC == 0); // negate! + data->HiddenEMail.asBool() = (hideEmail != 0); + break; + } + case ICQ_SRVxMORE_INFO:{ + char c; + QByteArray Homepage; + b >> c; + data->Age.asULong() = c; + b >> c; + b >> c; + data->Gender.asULong() = c; + b >> Homepage; + data->Homepage.str() = getContacts()->toUnicode(contact, Homepage); + unsigned short year; + b.unpack(year); + data->BirthYear.asULong() = year; + b >> c; + data->BirthMonth.asULong() = c; + b >> c; + data->BirthDay.asULong() = c; + unsigned char lang[3]; + b + >> lang[0] + >> lang[1] + >> lang[2]; + data->Language.asULong() = (lang[2] << 16) + (lang[1] << 8) + lang[0]; + break; + } + case ICQ_SRVxEMAIL_INFO:{ + QString mail; + char c; + b >> c; + for (;c > 0;c--){ + char d; + b >> d; + QByteArray s; + b >> s; + if (mail.length()) + mail += ';'; + mail += quoteChars(getContacts()->toUnicode(contact, s), ";"); + mail += '/'; + if (d) + mail += '-'; + } + data->EMails.str() = mail; + break; + } + case ICQ_SRVxWORK_INFO:{ + unsigned short n; + QByteArray WorkCity, WorkState, WorkPhone, WorkFax, WorkAddress, WorkZip; + QByteArray WorkName, WorkDepartment, WorkPosition, WorkHomepage; + b + >> WorkCity + >> WorkState + >> WorkPhone + >> WorkFax + >> WorkAddress + >> WorkZip; + data->WorkCity.str() = getContacts()->toUnicode(contact, WorkCity); + data->WorkState.str() = getContacts()->toUnicode(contact, WorkState); + data->WorkPhone.str() = getContacts()->toUnicode(contact, WorkPhone); + data->WorkFax.str() = getContacts()->toUnicode(contact, WorkFax); + data->WorkAddress.str() = getContacts()->toUnicode(contact, WorkAddress); + data->WorkZip.str() = getContacts()->toUnicode(contact, WorkZip); + + b.unpack(n); + data->WorkCountry.asULong() = n; + b + >> WorkName + >> WorkDepartment + >> WorkPosition; + data->WorkName.str() = getContacts()->toUnicode(contact, WorkName); + data->WorkDepartment.str() = getContacts()->toUnicode(contact, WorkDepartment); + data->WorkPosition.str() = getContacts()->toUnicode(contact, WorkPosition); + + b.unpack(n); + data->Occupation.asULong() = n; + b >> WorkHomepage; + data->WorkHomepage.str() = getContacts()->toUnicode(contact, WorkHomepage); + break; + } + case ICQ_SRVxABOUT_INFO: { + QByteArray About; + b >> About; + data->About.str() = getContacts()->toUnicode(contact, About); + break; + } + case ICQ_SRVxINTERESTS_INFO: + data->Interests.str() = unpack_list(b, contact); + break; + case ICQ_SRVxBACKGROUND_INFO: + data->Backgrounds.str() = unpack_list(b, contact); + data->Affilations.str() = unpack_list(b, contact); + break; + case ICQ_SRVxUNKNOWN_INFO: + break; + default: + log(L_WARN, "Unknwon info type %04X for %lu", nSubtype, m_uin); + } + m_nParts++; + if (m_nParts >= 8){ + data->InfoFetchTime.asULong() = data->InfoUpdateTime.toULong() ? data->InfoUpdateTime.toULong() : 1; + if (contact != NULL){ + m_client->setupContact(contact, data); + EventContact e(contact, EventContact::eChanged); + e.process(); + }else{ + int tz; + // ToDo: replace time_t & tm with QDateTime +#ifndef HAVE_TM_GMTOFF + tz = - timezone; +#else + time_t now = time(NULL); + struct tm *tm = localtime(&now); + tz = tm->tm_gmtoff; + if (tm->tm_isdst) tz -= (60 * 60); +#endif + tz = - tz / (30 * 60); + m_client->setupContact(getContacts()->owner(), data); + if (data->TimeZone.toULong() != (unsigned)tz){ + data->TimeZone.asULong() = tz; + m_client->setMainInfo(data); + } + EventContact eContact(getContacts()->owner(), EventContact::eChanged); + eContact.process(); + EventClientChanged(m_client).process(); + } + m_client->removeFullInfoRequest(m_uin); + return true; + } + return false; +} + +unsigned ICQClient::processInfoRequest() +{ + if ((getState() != Connected) || infoRequests.empty()) + return 0; + for (list::iterator it = infoRequests.begin(); it != infoRequests.end(); ++it){ + if (it->request_id) + continue; + unsigned delay = delayTime(SNAC(ICQ_SNACxFOOD_VARIOUS, ICQ_SNACxVAR_REQxSRV)); + if (delay) + return delay; + unsigned long uin = it->uin; + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() << ((uin == data.owner.Uin.toULong()) ? ICQ_SRVxREQ_OWN_INFO : ICQ_SRVxREQ_FULL_INFO); + socket()->writeBuffer().pack(uin); + sendServerRequest(); + it->request_id = m_nMsgSequence; + it->start_time = time(NULL); + log(L_DEBUG, "add server request %d (%p)", m_nMsgSequence, this); + varRequests.push_back(new FullInfoRequest(this, m_nMsgSequence, uin)); + } + return 0; +} + +void ICQClient::checkInfoRequest() +{ + // ToDo: replace time_t & tm with QDateTime + time_t now = time(NULL); + for (list::iterator it = infoRequests.begin(); it != infoRequests.end(); ){ + if ((it->request_id == 0) || ((time_t)(it->start_time + INFO_REQUEST_TIMEOUT) < now)){ + ++it; + continue; + } + ServerRequest *req = findServerRequest(it->request_id); + if (req){ + req->fail(); + }else{ + infoRequests.erase(it); + } + it = infoRequests.begin(); + } +} + +void ICQClient::addFullInfoRequest(unsigned long uin) +{ + for (list::iterator it = infoRequests.begin(); it != infoRequests.end(); ++it){ + if (it->uin == uin) + return; + } + InfoRequest r; + r.uin = uin; + r.request_id = 0; + r.start_time = 0; + infoRequests.push_back(r); + snacICBM()->processSendQueue(); +} + +void ICQClient::removeFullInfoRequest(unsigned long uin) +{ + list::iterator it; + for (it = infoRequests.begin(); it != infoRequests.end(); ++it){ + if (it->uin == uin){ + infoRequests.erase(it); + break; + } + } +} + +// _________________________________________________________________________________________ + +class SearchWPRequest : public ServerRequest +{ +public: + SearchWPRequest(ICQClient *client, unsigned short id); +protected: + virtual void fail(unsigned short error_code); + bool answer(ICQBuffer &b, unsigned short nSubtype); + ICQClient *m_client; +}; + +SearchWPRequest::SearchWPRequest(ICQClient *client, unsigned short id) + : ServerRequest(id) +{ + m_client = client; +} + +void SearchWPRequest::fail(unsigned short) +{ + SearchResult res; + res.id = m_id; + res.client = m_client; + load_data(ICQProtocol::icqUserData, &res.data, NULL); + EventSearchDone(&res).process(); + free_data(ICQProtocol::icqUserData, &res.data); +} + +bool SearchWPRequest::answer(ICQBuffer &b, unsigned short nSubType) +{ + QByteArray Nick, FirstName, LastName, EMail; + SearchResult res; + res.id = m_id; + res.client = m_client; + load_data(ICQProtocol::icqUserData, &res.data, NULL); + + unsigned short n; + b >> n; + b.unpack(res.data.Uin.asULong()); + char waitAuth; + unsigned short state; + char gender; + unsigned short age; + b + >> Nick + >> FirstName + >> LastName + >> EMail + >> waitAuth; + res.data.Nick.str() = getContacts()->toUnicode(NULL, Nick); + res.data.FirstName.str() = getContacts()->toUnicode(NULL, FirstName); + res.data.LastName.str() = getContacts()->toUnicode(NULL, LastName); + res.data.EMail.str() = getContacts()->toUnicode(NULL, EMail); + + b.unpack(state); + b >> gender; + b.unpack(age); + + if (waitAuth) + res.data.WaitAuth.asBool() = true; + switch (state){ + case SEARCH_STATE_OFFLINE: + res.data.Status.asULong() = STATUS_OFFLINE; + break; + case SEARCH_STATE_ONLINE: + res.data.Status.asULong() = STATUS_ONLINE; + break; + case SEARCH_STATE_DISABLED: + res.data.Status.asULong() = STATUS_UNKNOWN; + break; + } + res.data.Gender.asULong() = gender; + res.data.Age.asULong() = age; + + if (res.data.Uin.toULong() != m_client->data.owner.Uin.toULong()){ + EventSearch(&res).process(); + } + free_data(ICQProtocol::icqUserData, &res.data); + + if (nSubType == 0xAE01){ + unsigned long all; + b >> all; + load_data(ICQProtocol::icqUserData, &res.data, NULL); + res.data.Uin.asULong() = all; + EventSearchDone(&res).process(); + free_data(ICQProtocol::icqUserData, &res.data); + return true; + } + return false; +} + +unsigned short ICQClient::findByUin(unsigned long uin) +{ + if (getState() != Connected) + return USHRT_MAX; + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() + << ICQ_SRVxREQ_WP_UIN; + socket()->writeBuffer().tlvLE(TLV_UIN, uin); + sendServerRequest(); + varRequests.push_back(new SearchWPRequest(this, m_nMsgSequence)); + return m_nMsgSequence; +} + +unsigned short ICQClient::findByMail(const QString &_mail) +{ + if (getState() != Connected) + return USHRT_MAX; + const QByteArray mail = getContacts()->fromUnicode(NULL, _mail); + + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() << ICQ_SRVxREQ_WP_MAIL; + socket()->writeBuffer().tlvLE(TLV_EMAIL, mail.data()); + sendServerRequest(); + varRequests.push_back(new SearchWPRequest(this, m_nMsgSequence)); + return m_nMsgSequence; +} + +void ICQClient::packTlv(unsigned short tlv, unsigned short code, const QString &_keywords) +{ + if ((code == 0) && _keywords.isEmpty()) + return; + QByteArray data = getContacts()->fromUnicode(NULL, _keywords); + + ICQBuffer b; + b.pack(code); + b << data; + socket()->writeBuffer().tlvLE(tlv, b); +} + +void ICQClient::packTlv(unsigned short tlv, const QString &_data) +{ + if(_data.isEmpty()) + return; + const QByteArray data = getContacts()->fromUnicode(NULL, _data); + socket()->writeBuffer().tlvLE(tlv, data.data()); +} + +void ICQClient::packTlv(unsigned short tlv, unsigned short data) +{ + if(data == 0) + return; + socket()->writeBuffer().tlvLE(tlv, data); +} + +unsigned short ICQClient::findWP(const QString &szFirst, const QString &szLast, const QString &szNick, + const QString &szEmail, char age, char nGender, + unsigned short nLanguage, const QString &szCity, const QString &szState, + unsigned short nCountryCode, + const QString &szCoName, const QString &szCoDept, const QString &szCoPos, + unsigned short nOccupation, + unsigned short nPast, const QString &szPast, + unsigned short nInterests, const QString &szInterests, + unsigned short nAffilation, const QString &szAffilation, + unsigned short nHomePage, const QString &szHomePage, + const QString &szKeyWords, bool bOnlineOnly) +{ + if (getState() != Connected) + return USHRT_MAX; + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() << ICQ_SRVxREQ_WP_FULL; + + unsigned long nMinAge = 0; + unsigned long nMaxAge = 0; + switch (age){ + case 1: + nMinAge = 18; + nMaxAge = 22; + break; + case 2: + nMinAge = 23; + nMaxAge = 29; + break; + case 3: + nMinAge = 30; + nMaxAge = 39; + break; + case 4: + nMinAge = 40; + nMaxAge = 49; + break; + case 5: + nMinAge = 50; + nMaxAge = 59; + break; + case 6: + nMinAge = 60; + nMaxAge = 120; + break; + } + + packTlv(TLV_CITY, szCity); + packTlv(TLV_STATE, szState); + packTlv(TLV_WORK_COMPANY, szCoName); + packTlv(TLV_WORK_DEPARTMENT, szCoDept); + packTlv(TLV_WORK_POSITION, szCoPos); + packTlv(TLV_AGE_RANGE, (nMaxAge << 16) + nMinAge); + packTlv(TLV_GENDER, nGender); + packTlv(TLV_LANGUAGE, nLanguage); + packTlv(TLV_COUNTRY, nCountryCode); + packTlv(TLV_WORK_OCCUPATION, nOccupation); + packTlv(TLV_PAST, nPast, szPast); + packTlv(TLV_INTERESTS, nInterests, szInterests); + packTlv(TLV_AFFILATIONS, nAffilation, szAffilation); + packTlv(TLV_HOMEPAGE, nHomePage, szHomePage); + packTlv(TLV_FIRST_NAME, szFirst); + packTlv(TLV_LAST_NAME, szLast); + packTlv(TLV_NICK, szNick); + packTlv(TLV_KEYWORDS, szKeyWords); + packTlv(TLV_EMAIL, szEmail); + if (bOnlineOnly) + socket()->writeBuffer().tlvLE(TLV_SEARCH_ONLINE, (char)1); + + sendServerRequest(); + varRequests.push_back(new SearchWPRequest(this, m_nMsgSequence)); + return m_nMsgSequence; +} + +// ______________________________________________________________________________________ + +class SetMainInfoRequest : public ServerRequest +{ +public: + SetMainInfoRequest(ICQClient *client, unsigned short id, ICQUserData *data); +protected: + bool answer(ICQBuffer &b, unsigned short nSubtype); + QString m_nick; + QString m_firstName; + QString m_lastName; + QString m_city; + QString m_state; + QString m_address; + QString m_zip; + QString m_email; + QString m_homePhone; + QString m_homeFax; + QString m_privateCellular; + bool m_hiddenEMail; + unsigned m_country; + unsigned m_tz; + ICQClient *m_client; +}; + +SetMainInfoRequest::SetMainInfoRequest(ICQClient *client, unsigned short id, ICQUserData *data) + : ServerRequest(id) +{ + m_client = client; + m_nick = data->Nick.str(); + m_firstName = data->FirstName.str(); + m_lastName = data->LastName.str(); + m_city = data->City.str(); + m_state = data->State.str(); + m_address = data->Address.str(); + m_zip = data->Zip.str(); + m_email = data->EMail.str(); + m_homePhone = data->HomePhone.str(); + m_homeFax = data->HomeFax.str(); + m_privateCellular = data->PrivateCellular.str(); + m_country = data->Country.toULong(); + m_tz = data->TimeZone.toULong(); + m_hiddenEMail = data->HiddenEMail.toBool(); +} + +bool SetMainInfoRequest::answer(ICQBuffer&, unsigned short) +{ + m_client->data.owner.Nick.str() = m_nick; + m_client->data.owner.FirstName.str() = m_firstName; + m_client->data.owner.LastName.str() = m_lastName; + m_client->data.owner.City.str() = m_city; + m_client->data.owner.State.str() = m_state; + m_client->data.owner.Address.str() = m_address; + m_client->data.owner.Zip.str() = m_zip; + m_client->data.owner.EMail.str() = m_email; + m_client->data.owner.HomePhone.str() = m_homePhone; + m_client->data.owner.HomeFax.str() = m_homeFax; + m_client->data.owner.PrivateCellular.str() = m_privateCellular; + m_client->data.owner.Country.asULong() = m_country; + m_client->data.owner.TimeZone.asULong() = m_tz; + m_client->data.owner.HiddenEMail.asBool() = m_hiddenEMail; + EventClientChanged(m_client).process(); + m_client->snacService()->sendUpdate(); + return true; +} + +// ****************************************** +// static helper functions +// ****************************************** +static Tlv makeSString(unsigned id, const QString &str) +{ + QByteArray cstr = getContacts()->fromUnicode(NULL, str); + unsigned len = cstr.length() + 1; // including '\0' + QByteArray ba( len + 2, '\0' ); + ba[0] = (char)((len ) & 0xff); + ba[1] = (char)((len >> 8) & 0xff); + memcpy( ba.data() + 2, cstr, len ); + return Tlv(id, ba.size(), ba.data()); +} + +static Tlv makeBCombo(unsigned id, unsigned long y, unsigned long m, unsigned long d) +{ + unsigned short buf[4]; + buf[0] = (unsigned short)(y); + buf[1] = (unsigned short)(m); + buf[2] = (unsigned short)(d); + buf[3] = '\0'; + + return Tlv( id, 6, (const char*)buf ); +} + +static Tlv makeECombo(unsigned id, const QString &str) +{ + QByteArray cstr = getContacts()->fromUnicode(NULL, str); + unsigned len = cstr.length() + 1; // including '\0' + QByteArray ba( len + 3, '\0' ); + ba[0] = (char)((len ) & 0xff); + ba[1] = (char)((len >> 8) & 0xff); + memcpy( ba.data() + 2, cstr, len ); + ba[ (int)len + 2 ] = '\0'; // permission (don't use in icq directories) + return Tlv( id, ba.size(), ba.data() ); +} + +static QList makeICombo(unsigned id, const QString &str) +{ + QList list; + if ( str.isEmpty() ) + return list; + + QByteArray cstr = getContacts()->fromUnicode(NULL, str); + int cur = 0; + int idx = 0; + do { + idx = cstr.indexOf( ',', cur ); + if( idx == -1 ) + break; + + int cat = cstr.mid( cur, idx - cur ).toULong(); + cur = idx + 1; + + int start_pos = cur; + // Now looking for ";" with even number of slashes before it + do { + idx = cstr.indexOf( ';', cur ); + if ( idx == -1 ) { + idx = cstr.length(); // If no ";' will use whole string + } + else{ + // If found then count slashes before it + int slash_count = 0; + while ( (idx > slash_count) && (cstr.mid(idx-1-slash_count,1) == "\\") ){ + slash_count++ ; + } + if ( slash_count % 2 != 0 ) // If there are odd number of slashes, looking for another ";" + { + cur = idx+1; + idx = -1; + } + } + } while (idx == -1); + + QByteArray data = cstr.mid( start_pos, idx - start_pos ); + cur = idx + 1; + + int len = data.length(); + + QByteArray ba( len + 4, '\0' ); + ba[0] = (char)((cat ) & 0xff); + ba[1] = (char)((cat >> 8) & 0xff); + ba[2] = (char)((len ) & 0xff); + ba[3] = (char)((len >> 8) & 0xff); + memcpy( ba.data() + 4, data.data(), len ); + + list.append( Tlv( id, ba.size(), ba.data() ) ); + } while( idx != cstr.length() ); + return list; +} + +static Tlv makeUInt32(unsigned id, unsigned long d) +{ + char data[4]; + + data[0] = (char)((d >> 0) & 0xff); + data[1] = (char)((d >> 8) & 0xff); + data[2] = (char)((d >> 16) & 0xff); + data[3] = (char)((d >> 24) & 0xff); + return Tlv( id, 4, data ); +} + +static Tlv makeUInt16(unsigned id, unsigned short d) +{ + char data[2]; + + data[0] = (char)((d >> 0) & 0xff); + data[1] = (char)((d >> 8) & 0xff); + return Tlv( id, 2, data ); +} + +static Tlv makeUInt8(unsigned id, unsigned char d) +{ + char data[1]; + + data[0] = (char)((d >> 0) & 0xff); + return Tlv( id, 1, data ); +} + +static QString getSString(const char *tlvData) +{ + unsigned len; + const unsigned char *data = (const unsigned char*)tlvData; + len = data[0] | ( data[1] << 8 ); + QString ret = getContacts()->toUnicode(NULL, QByteArray::fromRawData(&tlvData[2], len)); + return ret; +} + +static void getBCombo(const char *tlvData, unsigned long &y, unsigned long &m, unsigned long &d) +{ + unsigned short *buf = (unsigned short*)tlvData; + y = buf[0]; + m = buf[1]; + d = buf[2]; +} + +static QString getECombo(const char *tlvData) +{ + unsigned len; + const unsigned char *data = (const unsigned char*)tlvData; + len = data[0] | ( data[1] << 8 ); + QString ret = getContacts()->toUnicode(NULL, QByteArray::fromRawData( &tlvData[2], len)); + return ret; +} + +static QString getICombo(const char *tlvData, const QString &o) +{ + QString ret; + QString others = o; + const unsigned char *data = (const unsigned char*)tlvData; + + unsigned cat = data[0] | ( data[1] << 8 ); + ret = QString::number( cat ) + ',' + getSString( &tlvData[2] ); + if( others.isEmpty() ) + return ret; + return others + ';' + ret; +} + +static unsigned long getUInt32(const char *tlvData) +{ + unsigned long ret; + const unsigned char *data = (const unsigned char*)tlvData; + ret = data[0] | ( data[1] << 8 ) | ( data[2] << 16 ) | ( data[3] << 24 ); + return ret; +} + +static unsigned short getUInt16(const char *tlvData) +{ + unsigned short ret; + const unsigned char *data = (const unsigned char*)tlvData; + ret = data[0] | ( data[1] << 8 ); + return ret; +} + +static char getUInt8(const char *tlvData) +{ + unsigned char ret; + ret = tlvData[0]; + return ret; +} + +class ChangeInfoRequest : public ServerRequest +{ +public: + ChangeInfoRequest(ICQClient *client, unsigned short id, const QList &clientInfoTLVs); +protected: + bool answer(ICQBuffer &b, unsigned short nSubtype); + ICQClient *m_client; + QList m_clientInfoTLVs; +}; + +ChangeInfoRequest::ChangeInfoRequest(ICQClient *client, unsigned short id, const QList &clientInfoTLVs) + : ServerRequest(id), m_client(client), m_clientInfoTLVs(clientInfoTLVs) +{ +} + +bool ChangeInfoRequest::answer(ICQBuffer&, unsigned short) +{ + bool bFirstAffilation = true; + bool bFirstInterest = true; + bool bFirstBackground = true; + for( int i = 0; i < m_clientInfoTLVs.count(); i++ ) { + Tlv *tlv = &m_clientInfoTLVs[i]; + switch(tlv->Num()) { + case TLV_FIRST_NAME: + m_client->data.owner.FirstName.str() = getSString(tlv->Data()); + break; + case TLV_LAST_NAME: + m_client->data.owner.LastName.str() = getSString(tlv->Data()); + break; + case TLV_NICK: + m_client->data.owner.Nick.str() = getSString(tlv->Data()); + break; + case TLV_EMAIL: + m_client->data.owner.EMail.str() = getECombo(tlv->Data()); + break; + case TLV_AGE: + m_client->data.owner.Age.asULong() = getUInt16(tlv->Data()); + break; + case TLV_GENDER: + m_client->data.owner.Gender.asULong() = getUInt8(tlv->Data()); + break; + case TLV_LANGUAGE: + m_client->data.owner.Language.asULong() = getUInt16(tlv->Data()); + break; + case TLV_CITY: + m_client->data.owner.City.str() = getSString(tlv->Data()); + break; + case TLV_STATE: + m_client->data.owner.State.str() = getSString(tlv->Data()); + break; + case TLV_COUNTRY: + m_client->data.owner.Country.asULong() = getUInt16(tlv->Data()); + break; + case TLV_WORK_COMPANY: + m_client->data.owner.WorkName.str() = getSString(tlv->Data()); + break; + case TLV_WORK_DEPARTMENT: + m_client->data.owner.WorkDepartment.str() = getSString(tlv->Data()); + break; + case TLV_WORK_POSITION: + m_client->data.owner.WorkPosition.str() = getSString(tlv->Data()); + break; + case TLV_WORK_OCCUPATION: + m_client->data.owner.Occupation.asULong() = getUInt16(tlv->Data()); + break; + case TLV_AFFILATIONS: { + if( bFirstAffilation ) { + m_client->data.owner.Affilations.clear(); + bFirstAffilation = false; + } + m_client->data.owner.Affilations.str() = getICombo(tlv->Data(), m_client->data.owner.Affilations.str()); + break; + } + case TLV_INTERESTS: + if( bFirstInterest ) { + m_client->data.owner.Interests.clear(); + bFirstInterest = false; + } + m_client->data.owner.Interests.str() = getICombo(tlv->Data(), m_client->data.owner.Interests.str()); + break; + case TLV_PAST: { + if( bFirstBackground ) { + m_client->data.owner.Backgrounds.clear(); + bFirstBackground = false; + } + m_client->data.owner.Backgrounds.str() = getICombo(tlv->Data(), m_client->data.owner.Backgrounds.str()); + break; + } +// 530 0x0212 icombo User homepage category/keywords + case TLV_HOMEPAGE: + m_client->data.owner.Homepage.str() = getSString(tlv->Data()); + break; + case TLV_BIRTHDAY: { + getBCombo(tlv->Data(), m_client->data.owner.BirthYear.asULong(), + m_client->data.owner.BirthMonth.asULong(), + m_client->data.owner.BirthDay.asULong()); + break; + } + case TLV_NOTES: + m_client->data.owner.About.str() = getSString(tlv->Data()); + break; + case TLV_STREET: + m_client->data.owner.Address.str() = getSString(tlv->Data()); + break; + case TLV_ZIP: { + QString str; + str.sprintf("%lu", getUInt32(tlv->Data())); + m_client->data.owner.Zip.str() = str; + break; + } + case TLV_PHONE: + m_client->data.owner.HomePhone.str() = getSString(tlv->Data()); + break; + case TLV_FAX: + m_client->data.owner.HomeFax.str() = getSString(tlv->Data()); + break; + case TLV_CELLULAR: + m_client->data.owner.PrivateCellular.str() = getSString(tlv->Data()); + break; + case TLV_WORK_STREET: + m_client->data.owner.WorkAddress.str() = getSString(tlv->Data()); + break; + case TLV_WORK_CITY: + m_client->data.owner.WorkCity.str() = getSString(tlv->Data()); + break; + case TLV_WORK_STATE: + m_client->data.owner.WorkState.str() = getSString(tlv->Data()); + break; + case TLV_WORK_COUNTRY: + m_client->data.owner.WorkCountry.asULong() = getUInt16((tlv->Data())); + break; + case TLV_WORK_ZIP: { + QString str; + str.sprintf("%lu", getUInt32(tlv->Data())); + m_client->data.owner.WorkZip.str() = str; + break; + } + case TLV_WORK_PHONE: + m_client->data.owner.WorkPhone.str() = getSString(tlv->Data()); + break; + case TLV_WORK_FAX: + m_client->data.owner.WorkFax.str() = getSString(tlv->Data()); + break; + case TLV_WORK_HOMEPAGE: + m_client->data.owner.WorkHomepage.str() = getSString(tlv->Data()); + break; + case TLV_SHOW_WEB: + m_client->data.owner.WebAware.asBool() = getUInt8(tlv->Data()); + break; + case TLV_NEED_AUTH: + m_client->data.owner.WaitAuth.asBool() = !getUInt8(tlv->Data()); + break; + case TLV_TIMEZONE: + m_client->data.owner.TimeZone.asBool() = getUInt8(tlv->Data()); + break; + /* + 800 0x0320 sstring User originally from city + 810 0x032A sstring User originally from state + 820 0x0334 uint16 User originally from country (code) + */ + default: + break; + } + } + m_client->snacService()->sendStatus(); + EventClientChanged(m_client).process(); + return true; +} + +void ICQClient::setMainInfo(ICQUserData *d) +{ + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() << ICQ_SRVxREQ_MODIFY_MAIN + << d->Nick.str() + << d->FirstName.str() + << d->LastName.str() + << d->EMail.str() + << d->City.str() + << d->State.str() + << d->HomePhone.str() + << d->HomeFax.str() + << d->Address.str() + << d->PrivateCellular.str() + << d->Zip.str(); + socket()->writeBuffer().pack((unsigned short)(d->Country.toULong())); + socket()->writeBuffer().pack((char)(d->TimeZone.toULong())); + socket()->writeBuffer().pack((char)(d->HiddenEMail.toBool())); + sendServerRequest(); + + varRequests.push_back(new SetMainInfoRequest(this, m_nMsgSequence, d)); +} + +void ICQClient::setClientInfo(void *_data) +{ + if (getState() != Connected) + return; + + ICQUserData *d = toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + + if (m_bAIM){ + d->ProfileFetch.asBool() = true; + data.owner.About.str() = d->About.str(); + setAIMInfo(d); + setProfile(d); + return; + } + + QList clientInfoTLVs; + + if (d->FirstName.str() != data.owner.FirstName.str()) + clientInfoTLVs.append(makeSString(TLV_FIRST_NAME, d->FirstName.str())); + + if (d->LastName.str() != data.owner.LastName.str()) + clientInfoTLVs.append(makeSString(TLV_LAST_NAME, d->LastName.str())); + + if (d->Nick.str() != data.owner.Nick.str()) + clientInfoTLVs.append(makeSString(TLV_NICK, d->Nick.str())); + + if (d->EMail.str() != data.owner.EMail.str()) + clientInfoTLVs.append(makeECombo(TLV_EMAIL, d->EMail.str())); + + if (d->Age.toULong() != data.owner.Age.toULong()) + clientInfoTLVs.append(makeUInt16(TLV_AGE, d->Age.toULong())); + + if (d->Gender.toULong() != data.owner.Gender.toULong()) + clientInfoTLVs.append(makeUInt8(TLV_GENDER, d->Gender.toULong())); + + if (d->Language.toULong() != data.owner.Language.toULong()) + clientInfoTLVs.append(makeUInt16(TLV_LANGUAGE, d->Language.toULong())); + + if (d->City.str() != data.owner.City.str()) + clientInfoTLVs.append(makeSString(TLV_CITY, d->City.str())); + + if (d->State.str() != data.owner.State.str()) + clientInfoTLVs.append(makeSString(TLV_STATE, d->State.str())); + + if (d->Country.toULong() != data.owner.Country.toULong()) + clientInfoTLVs.append(makeUInt16(TLV_COUNTRY, d->Country.toULong())); + + if (d->WorkName.str() != data.owner.WorkName.str()) + clientInfoTLVs.append(makeSString(TLV_WORK_COMPANY, d->WorkName.str())); + + if (d->WorkDepartment.str() != data.owner.WorkDepartment.str()) + clientInfoTLVs.append(makeSString(TLV_WORK_DEPARTMENT, d->WorkDepartment.str())); + + if (d->WorkPosition.str() != data.owner.WorkPosition.str()) + clientInfoTLVs.append(makeSString(TLV_WORK_POSITION, d->WorkPosition.str())); + + if (d->Occupation.toULong() != data.owner.Occupation.toULong()) + clientInfoTLVs.append(makeUInt16(TLV_WORK_OCCUPATION, d->Occupation.toULong())); + + if (d->Affilations.str() != data.owner.Affilations.str()) + clientInfoTLVs += makeICombo(TLV_AFFILATIONS, d->Affilations.str()); + + if (d->Interests.str() != data.owner.Interests.str()) + clientInfoTLVs += makeICombo(TLV_INTERESTS, d->Interests.str()); + + if (d->Backgrounds.str() != data.owner.Backgrounds.str()) + clientInfoTLVs += makeICombo(TLV_PAST, d->Backgrounds.str()); + +// 530 0x0212 icombo User homepage category/keywords + + if (d->Homepage.str() != data.owner.Homepage.str()) + clientInfoTLVs.append(makeSString(TLV_HOMEPAGE, d->Homepage.str())); + + if (d->BirthDay.toULong() != data.owner.BirthDay.toULong() || + d->BirthMonth.toULong() != data.owner.BirthMonth.toULong() || + d->BirthYear.toULong() != data.owner.BirthYear.toULong()) { + clientInfoTLVs.append(makeBCombo(TLV_BIRTHDAY, d->BirthYear.toULong(), d->BirthMonth.toULong(), d->BirthDay.toULong())); + } + + if (d->About.str() != data.owner.About.str()) + clientInfoTLVs.append(makeSString(TLV_NOTES, d->About.str())); + + if (d->Address.str() != data.owner.Address.str()) + clientInfoTLVs.append(makeSString(TLV_STREET, d->Address.str())); + + if (d->Zip.str() != data.owner.Zip.str()) + clientInfoTLVs.append(makeUInt32(TLV_ZIP, QString(d->Zip.str()).toULong())); + + if (d->HomePhone.str() != data.owner.HomePhone.str()) + clientInfoTLVs.append(makeSString(TLV_PHONE, d->HomePhone.str())); + + if (d->HomeFax.str() != data.owner.HomeFax.str()) + clientInfoTLVs.append(makeSString(TLV_FAX, d->HomeFax.str())); + + if (d->PrivateCellular.str() != data.owner.PrivateCellular.str()) + clientInfoTLVs.append(makeSString(TLV_CELLULAR, d->PrivateCellular.str())); + + if (d->WorkAddress.str() != data.owner.WorkAddress.str()) + clientInfoTLVs.append(makeSString(TLV_WORK_STREET, d->WorkAddress.str())); + + if (d->WorkCity.str() != data.owner.WorkCity.str()) + clientInfoTLVs.append(makeSString(TLV_WORK_CITY, d->WorkCity.str())); + + if (d->WorkState.str() != data.owner.WorkState.str()) + clientInfoTLVs.append(makeSString(TLV_WORK_STATE, d->WorkState.str())); + + if (d->WorkCountry.toULong() != data.owner.WorkCountry.toULong()) + clientInfoTLVs.append(makeUInt16(TLV_WORK_COUNTRY, d->WorkCountry.toULong())); + + if (d->WorkZip.str() != data.owner.WorkZip.str()) + clientInfoTLVs.append(makeUInt32(TLV_WORK_ZIP, QString(d->WorkZip.str()).toULong())); + + if (d->WorkPhone.str() != data.owner.WorkPhone.str()) + clientInfoTLVs.append(makeSString(TLV_WORK_PHONE, d->WorkPhone.str())); + + if (d->WorkFax.str() != data.owner.WorkFax.str()) + clientInfoTLVs.append(makeSString(TLV_WORK_FAX, d->WorkFax.str())); + + if (d->WorkHomepage.str() != data.owner.WorkHomepage.str()) + clientInfoTLVs.append(makeSString(TLV_WORK_HOMEPAGE, d->WorkHomepage.str())); + + if (d->WebAware.toBool() != data.owner.WebAware.toBool()) + clientInfoTLVs.append(makeUInt8(TLV_SHOW_WEB, d->WebAware.toBool())); + + if (d->WaitAuth.toBool() != data.owner.WaitAuth.toBool()) + clientInfoTLVs.append(makeUInt8(TLV_NEED_AUTH, d->WaitAuth.toBool() ? 0 : 1)); + + if (d->TimeZone.toULong() != data.owner.TimeZone.toULong()) + clientInfoTLVs.append(makeUInt8(TLV_TIMEZONE, d->TimeZone.toULong())); + /* + 800 0x0320 sstring User originally from city + 810 0x032A sstring User originally from state + 820 0x0334 uint16 User originally from country (code) + */ + uploadBuddy(&data.owner); + if (!clientInfoTLVs.isEmpty()) { + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() << ICQ_SRVxWP_SET; + for( int i =0; i < clientInfoTLVs.count(); i++ ) { + Tlv *tlv = &clientInfoTLVs[i]; + socket()->writeBuffer().tlvLE( tlv->Num(), *tlv, tlv->Size() ); + } + sendServerRequest(); + varRequests.push_back(new ChangeInfoRequest(this, m_nMsgSequence, clientInfoTLVs)); + } + + setChatGroup(); + //snacService()->sendStatus(); +} + +class SetPasswordRequest : public ServerRequest +{ +public: + SetPasswordRequest(ICQClient *client, unsigned short id, const QString &pwd); +protected: + bool answer(ICQBuffer &b, unsigned short nSubtype); + virtual void fail(unsigned short error_code); + QString m_pwd; + ICQClient *m_client; +}; + +SetPasswordRequest::SetPasswordRequest(ICQClient *client, unsigned short id, const QString &pwd) + : ServerRequest(id), m_pwd(pwd), m_client(client) +{} + +bool SetPasswordRequest::answer(ICQBuffer&, unsigned short) +{ + m_client->setPassword(m_pwd); + log(L_DEBUG, "Password change success"); + EventNotification::ClientNotificationData d; + d.client = m_client; + d.code = 0; + d.text = I18N_NOOP("Password successfuly changed"); + d.args = QString::null; + d.flags = EventNotification::ClientNotificationData::E_INFO; + d.options = QString::null; + d.id = CmdPasswordSuccess; + EventClientNotification e(d); + e.process(); + return true; +} + +void SetPasswordRequest::fail(unsigned short error_code) +{ + log(L_DEBUG, "Password change fail: %X", error_code); + EventNotification::ClientNotificationData d; + d.client = m_client; + d.code = 0; + d.text = I18N_NOOP("Change password fail"); + d.args = QString::null; + d.flags = EventNotification::ClientNotificationData::E_ERROR; + d.options = QString::null; + d.id = CmdPasswordFail; + EventClientNotification e(d); + e.process(); +} + +void ICQClient::changePassword(const QString &new_pswd) +{ + QString pwd = new_pswd; + unsigned short passlen = htons(pwd.length() + 1); + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() + << ICQ_SRVxREQ_CHANGE_PASSWD + << passlen + << (const char*)getContacts()->fromUnicode(NULL, pwd).data() + << (unsigned char)0x00; + sendServerRequest(); + varRequests.push_back(new SetPasswordRequest(this, m_nMsgSequence, new_pswd)); +} + +class SMSRequest : public ServerRequest +{ +public: + SMSRequest(ICQClient *client, unsigned short id); + virtual bool answer(ICQBuffer&, unsigned short nSubType); + virtual void fail(unsigned short error_code); +protected: + ICQClient *m_client; +}; + +#if 0 +const char *translations[] = + { + I18N_NOOP("The Cellular network is currently unable to send your message to the recipient. Please try again later."), + I18N_NOOP("INVALID NUMBER"), + I18N_NOOP("RATE LIMIT") + }; +#endif + +SMSRequest::SMSRequest(ICQClient *client, unsigned short id) + : ServerRequest(id) +{ + m_client = client; +} + +bool SMSRequest::answer(ICQBuffer &b, unsigned short code) +{ + if (code == 0x0100) + { + if (m_client->snacICBM()->smsQueue.empty()) + return true; + QByteArray errStr = b.data(b.readPos()); + SendMsg &s = m_client->snacICBM()->smsQueue.front(); + SMSMessage *sms = static_cast(s.msg); + m_client->snacICBM()->smsQueue.erase(m_client->snacICBM()->smsQueue.begin()); + sms->setError(errStr.data()); + EventMessageSent(sms).process(); + delete sms; + }else{ + b.incReadPos(6); + QByteArray provider; + QByteArray answer_QCString; + b.unpackStr(provider); + b.unpackStr(answer_QCString); +// FIXME + std::string answer = (const char *)answer_QCString; + string::iterator s = answer.begin(); + auto_ptr top(XmlNode::parse(s, answer.end())); + QString error = I18N_NOOP("SMS send fail"); + QString network; + if (top.get()){ + XmlNode *n = top.get(); + if (n && n->isBranch()){ + XmlBranch *msg = static_cast(n); + XmlLeaf *l = msg->getLeaf("deliverable"); + if (l && (l->getValue() == "Yes")){ + error = QString::null; + l = msg->getLeaf("network"); + if (l) + network = QString(l->getValue().c_str()); + }else{ + XmlBranch *param = msg->getBranch("param"); + if (param){ + XmlLeaf *l = param->getLeaf("error"); + if (l) + error = QString(l->getValue().c_str()); + } + } + } + } + + if (error.isEmpty()){ + if (!m_client->snacICBM()->smsQueue.empty()){ + SendMsg &s = m_client->snacICBM()->smsQueue.front(); + SMSMessage *sms = static_cast(s.msg); + sms->setNetwork(network); + if ((sms->getFlags() & MESSAGE_NOHISTORY) == 0){ + SMSMessage m; + m.setContact(sms->contact()); + m.setText(s.part); + m.setPhone(sms->getPhone()); + m.setNetwork(network); + EventSent(&m).process(); + } + } + }else{ + if (!m_client->snacICBM()->smsQueue.empty()){ + SendMsg &s = m_client->snacICBM()->smsQueue.front(); + s.msg->setError(error); + EventMessageSent(s.msg).process(); + delete s.msg; + m_client->snacICBM()->smsQueue.erase(m_client->snacICBM()->smsQueue.begin()); + } + } + } + m_client->snacICBM()->processSendQueue(); + return true; +} + +void SMSRequest::fail(unsigned short) +{ + if (m_client->snacICBM()->smsQueue.empty()) + return; + SendMsg &s = m_client->snacICBM()->smsQueue.front(); + Message *sms = s.msg; + sms->setError(I18N_NOOP("SMS send fail")); + m_client->snacICBM()->smsQueue.erase(m_client->snacICBM()->smsQueue.begin()); + EventMessageSent(sms).process(); + delete sms; + m_client->m_sendSmsId = 0; + m_client->snacICBM()->processSendQueue(); +} + +const unsigned MAX_SMS_LEN_LATIN1 = 160; +const unsigned MAX_SMS_LEN_UNICODE = 70; + +static const char *w_days[] = + { + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Say" + }; + +static const char *months[] = + { + I18N_NOOP("Jan"), + I18N_NOOP("Feb"), + I18N_NOOP("Mar"), + I18N_NOOP("Apr"), + I18N_NOOP("May"), + I18N_NOOP("Jun"), + I18N_NOOP("Jul"), + I18N_NOOP("Aug"), + I18N_NOOP("Sep"), + I18N_NOOP("Oct"), + I18N_NOOP("Nov"), + I18N_NOOP("Dec") + }; + +unsigned ICQClient::processSMSQueue() +{ + if (m_sendSmsId) + return 0; + for (;;){ + if (snacICBM()->smsQueue.empty()) + break; + unsigned delay = delayTime(SNAC(ICQ_SNACxFOOD_VARIOUS, ICQ_SNACxVAR_REQxSRV)); + if (delay) + return delay; + SendMsg &s = snacICBM()->smsQueue.front(); + if (s.text.isEmpty() || (!(s.flags & SEND_1STPART) && (s.msg->getFlags() & MESSAGE_1ST_PART))){ + EventMessageSent(s.msg).process(); + delete s.msg; + snacICBM()->smsQueue.erase(snacICBM()->smsQueue.begin()); + continue; + } + SMSMessage *sms = static_cast(s.msg); + QString text = s.text; + QString part = getPart(text, MAX_SMS_LEN_LATIN1); + if (!isLatin(part)){ + text = s.text; + part = getPart(text, MAX_SMS_LEN_UNICODE); + } + s.text = text; + s.part = part; + + QString nmb = "+"; + QString phone = sms->getPhone(); + for (int i = 0; i < (int)(phone.length()); i++){ + QChar c = phone[i]; + if ((c >= '0') && (c <= '9')) + nmb += c; + } + XmlBranch xmltree("icq_sms_message"); + xmltree.pushnode(new XmlLeaf("destination",nmb.toUtf8().data())); + xmltree.pushnode(new XmlLeaf("text",part.toUtf8().data())); + xmltree.pushnode(new XmlLeaf("codepage","1252")); + xmltree.pushnode(new XmlLeaf("encoding","utf8")); + xmltree.pushnode(new XmlLeaf("senders_UIN",QString::number(data.owner.Uin.toULong()).toLatin1().data())); + xmltree.pushnode(new XmlLeaf("senders_name","")); + xmltree.pushnode(new XmlLeaf("delivery_receipt","Yes")); + + // ToDo: replace time_t & tm with QDateTime + char timestr[30]; + time_t t = time(NULL); + struct tm *tm; + tm = gmtime(&t); + snprintf(timestr, sizeof(timestr), "%s, %02u %s %04u %02u:%02u:%02u GMT", + w_days[tm->tm_wday], tm->tm_mday, months[tm->tm_mon], tm->tm_year + 1900, + tm->tm_hour, tm->tm_min, tm->tm_sec); + xmltree.pushnode(new XmlLeaf("time",string(timestr))); + string msg = xmltree.toString(0); + + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() << ICQ_SRVxREQ_SEND_SMS + << 0x00010016L << 0x00000000L << 0x00000000L + << 0x00000000L << 0x00000000L << (unsigned long)(msg.size()); + socket()->writeBuffer() << msg.c_str(); + sendServerRequest(); + varRequests.push_back(new SMSRequest(this, m_nMsgSequence)); + m_sendSmsId = m_nMsgSequence; + break; + } + return 0; +} + +void ICQClient::clearSMSQueue() +{ + for (list::iterator it = snacICBM()->smsQueue.begin(); it != snacICBM()->smsQueue.end(); ++it){ + it->msg->setError(I18N_NOOP("Client go offline")); + EventMessageSent(it->msg).process(); + delete it->msg; + } + snacICBM()->smsQueue.clear(); + m_sendSmsId = 0; +} + +void ICQClient::setChatGroup() +{ + if ((getState() != Connected) || (getRandomChatGroup() == getRandomChatGroupCurrent())) + return; + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() << (unsigned short)ICQ_SRVxREQ_SET_CHAT_GROUP; + if (getRandomChatGroup()){ + socket()->writeBuffer().pack((unsigned short)getRandomChatGroup()); + socket()->writeBuffer() + << 0x00000310L + << 0x00000000L + << 0x00000000L + << 0x00000000L + << (char)4 + << (char)ICQ_TCP_VERSION + << 0x00000000L + << 0x00000050L + << 0x00000003L + << (unsigned short)0 + << (char)0; + }else{ + socket()->writeBuffer() << (unsigned short)0; + } + sendServerRequest(); + setRandomChatGroupCurrent(getRandomChatGroup()); +} + +class RandomChatRequest : public ServerRequest +{ +public: + RandomChatRequest(ICQClient *client, unsigned short id); +protected: + virtual void fail(unsigned short error_code); + bool answer(ICQBuffer &b, unsigned short nSubtype); + ICQClient *m_client; +}; + + +RandomChatRequest::RandomChatRequest(ICQClient *client, unsigned short id) + : ServerRequest(id) +{ + m_client = client; +} + +bool RandomChatRequest::answer(ICQBuffer &b, unsigned short) +{ + unsigned long uin; + b.unpack(uin); +// currently unhandled +// Event e(EventRandomChat, (void*)uin); +// e.process(); + return true; +} + +void RandomChatRequest::fail(unsigned short) +{ +// currently unhandled +// Event e(EventRandomChat, NULL); +// e.process(); +} + +void ICQClient::searchChat(unsigned short group) +{ + if (getState() != Connected){ +// currently unhandled +// Event e(EventRandomChat, NULL); +// e.process(); + return; + } + serverRequest(ICQ_SRVxREQ_MORE); + socket()->writeBuffer() << (unsigned short)ICQ_SRVxREQ_RANDOM_CHAT; + socket()->writeBuffer().pack(group); + sendServerRequest(); + varRequests.push_back(new RandomChatRequest(this, m_nMsgSequence)); +} diff --git a/plugins/icq/interestsinfo.cpp b/plugins/icq/interestsinfo.cpp new file mode 100644 index 0000000..6fc83a5 --- /dev/null +++ b/plugins/icq/interestsinfo.cpp @@ -0,0 +1,244 @@ +/*************************************************************************** + interestsinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "interestsinfo.h" +#include "icqclient.h" +#include "contacts/contact.h" + +#include +#include + +using namespace SIM; + +InterestsInfo::InterestsInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client) : QWidget(parent) +{ + setupUi(this); + m_data = data; + m_client = client; + m_contact = contact; + if (m_data){ + edtBg1->setReadOnly(true); + edtBg2->setReadOnly(true); + edtBg3->setReadOnly(true); + edtBg4->setReadOnly(true); + disableWidget(cmbBg1); + disableWidget(cmbBg2); + disableWidget(cmbBg3); + disableWidget(cmbBg4); + }else{ + connect(cmbBg1, SIGNAL(activated(int)), this, SLOT(cmbChanged(int))); + connect(cmbBg2, SIGNAL(activated(int)), this, SLOT(cmbChanged(int))); + connect(cmbBg3, SIGNAL(activated(int)), this, SLOT(cmbChanged(int))); + connect(cmbBg4, SIGNAL(activated(int)), this, SLOT(cmbChanged(int))); + } + fill(); +} + +void InterestsInfo::apply() +{ +} + +void InterestsInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString info[4]; + info[0] = getInfo(cmbBg1, edtBg1); + info[1] = getInfo(cmbBg2, edtBg2); + info[2] = getInfo(cmbBg3, edtBg3); + info[3] = getInfo(cmbBg4, edtBg4); + QString res; + for (unsigned i = 0; i < 4; i++){ + if (info[i].isEmpty()) + continue; + if (!res.isEmpty()) + res += ';'; + res += info[i]; + } + data->Interests.str() = res; +} + +bool InterestsInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +static const ext_info interests[] = + { + { I18N_NOOP("Art"), 100 }, + { I18N_NOOP("Cars"), 101 }, + { I18N_NOOP("Celebrity Fans"), 102 }, + { I18N_NOOP("Collections"), 103 }, + { I18N_NOOP("Computers"), 104 }, + { I18N_NOOP("Culture & Literature"), 105 }, + { I18N_NOOP("Fitness"), 106 }, + { I18N_NOOP("Games"), 107 }, + { I18N_NOOP("Hobbies"), 108 }, + { I18N_NOOP("ICQ - Providing Help"), 109 }, + { I18N_NOOP("Internet"), 110 }, + { I18N_NOOP("Lifestyle"), 111 }, + { I18N_NOOP("Movies/TV"), 112 }, + { I18N_NOOP("Music"), 113 }, + { I18N_NOOP("Outdoor Activities"), 114 }, + { I18N_NOOP("Parenting"), 115 }, + { I18N_NOOP("Pets/Animals"), 116 }, + { I18N_NOOP("Religion"), 117 }, + { I18N_NOOP("Science/Technology"), 118 }, + { I18N_NOOP("Skills"), 119 }, + { I18N_NOOP("Sports"), 120 }, + { I18N_NOOP("Web Design"), 121 }, + { I18N_NOOP("Nature and Environment"), 122 }, + { I18N_NOOP("News & Media"), 123 }, + { I18N_NOOP("Government"), 124 }, + { I18N_NOOP("Business & Economy"), 125 }, + { I18N_NOOP("Mystics"), 126 }, + { I18N_NOOP("Travel"), 127 }, + { I18N_NOOP("Astronomy"), 128 }, + { I18N_NOOP("Space"), 129 }, + { I18N_NOOP("Clothing"), 130 }, + { I18N_NOOP("Parties"), 131 }, + { I18N_NOOP("Women"), 132 }, + { I18N_NOOP("Social science"), 133 }, + { I18N_NOOP("60's"), 134 }, + { I18N_NOOP("70's"), 135 }, + { I18N_NOOP("80's"), 136 }, + { I18N_NOOP("50's"), 137 }, + { I18N_NOOP("Finance and corporate"), 138 }, + { I18N_NOOP("Entertainment"), 139 }, + { I18N_NOOP("Consumer electronics"), 140 }, + { I18N_NOOP("Retail stores"), 141 }, + { I18N_NOOP("Health and beauty"), 142 }, + { I18N_NOOP("Media"), 143 }, + { I18N_NOOP("Household products"), 144 }, + { I18N_NOOP("Mail order catalog"), 145 }, + { I18N_NOOP("Business services"), 146 }, + { I18N_NOOP("Audio and visual"), 147 }, + { I18N_NOOP("Sporting and athletic"), 148 }, + { I18N_NOOP("Publishing"), 149 }, + { I18N_NOOP("Home automation"), 150 }, + { "", 0 } + }; + +const ext_info *p_interests = interests; + +void InterestsInfo::fill() +{ + ICQUserData *data = m_data; + if (data == NULL) data = &m_client->data.owner; + unsigned i = 0; + QString str = data->Interests.str(); + while (str.length()){ + QString info = getToken(str, ';', false); + QString n = getToken(info, ','); + unsigned short category = n.toUShort(); + switch (i){ + case 0: + edtBg1->setText(unquoteChars(info,";")); + initCombo(cmbBg1, category, interests); + break; + case 1: + edtBg2->setText(unquoteChars(info,";")); + initCombo(cmbBg2, category, interests); + break; + case 2: + edtBg3->setText(unquoteChars(info,";")); + initCombo(cmbBg3, category, interests); + break; + case 3: + edtBg4->setText(unquoteChars(info,";")); + initCombo(cmbBg4, category, interests); + break; + } + i++; + } + for (; i < 4; i++){ + switch (i){ + case 0: + initCombo(cmbBg1, 0, interests); + break; + case 1: + initCombo(cmbBg2, 0, interests); + break; + case 2: + initCombo(cmbBg3, 0, interests); + break; + case 3: + initCombo(cmbBg4, 0, interests); + break; + } + } + if (m_data == NULL) + cmbChanged(0); +} + +QString InterestsInfo::getInfo(QComboBox *cmb, QLineEdit *edt) +{ + unsigned n = getComboValue(cmb, interests); + if (n == 0) + return QString::null; + QString res = QString::number(n) + ','; + res += quoteChars(edt->text(), ";"); + return res; +} + +void InterestsInfo::cmbChanged(int) +{ + QComboBox *cmbs[4] = { cmbBg1, cmbBg2, cmbBg3, cmbBg4 }; + QLineEdit *edts[4] = { edtBg1, edtBg2, edtBg3, edtBg4 }; + unsigned n = 0; + for (unsigned i = 0; i < 4; i++){ + unsigned short value = getComboValue(cmbs[i], interests); + if (value){ + if (i != n){ + cmbs[n]->setEnabled(true); + edts[n]->setEnabled(true); + initCombo(cmbs[n], value, interests, true); + edts[n]->setText(edts[i]->text()); + } + edts[n]->setEnabled(true); + edts[n]->setReadOnly(false); + n++; + } + } + if (n >= 4) + return; + cmbs[n]->setEnabled(true); + disableWidget(edts[n]); + cmbs[n]->setCurrentIndex(0); + edts[n]->setText(QString::null); + for (n++; n < 4; n++){ + disableWidget(cmbs[n]); + disableWidget(edts[n]); + initCombo(cmbs[n], 0, interests, true); + edts[n]->setText(QString::null); + } +} + diff --git a/plugins/icq/interestsinfo.h b/plugins/icq/interestsinfo.h new file mode 100644 index 0000000..9a01b70 --- /dev/null +++ b/plugins/icq/interestsinfo.h @@ -0,0 +1,46 @@ +/*************************************************************************** + interestsinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _INTERESTSINFO_H +#define _INTERESTSINFO_H + +#include "event.h" +#include "ui_interestsinfobase.h" + +class ICQClient; +struct ICQUserData; + +class InterestsInfo : public QWidget, public Ui::InterestsInfoBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + InterestsInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); + void cmbChanged(int); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + QString getInfo(QComboBox *cmb, QLineEdit *edt); + ICQUserData *m_data; + unsigned m_contact; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/interestsinfobase.ui b/plugins/icq/interestsinfobase.ui new file mode 100644 index 0000000..e555872 --- /dev/null +++ b/plugins/icq/interestsinfobase.ui @@ -0,0 +1,129 @@ + + + + + InterestsInfoBase + + + + 0 + 0 + 398 + 266 + + + + Form2 + + + + 11 + + + 6 + + + + + + &Interests + + + + 11 + + + 6 + + + + + + + + 0 + + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 +
    +
    + + cmbBg1 + edtBg1 + cmbBg2 + edtBg2 + cmbBg3 + edtBg3 + cmbBg4 + edtBg4 + + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/icq/moreinfo.cpp b/plugins/icq/moreinfo.cpp new file mode 100644 index 0000000..7ba1f51 --- /dev/null +++ b/plugins/icq/moreinfo.cpp @@ -0,0 +1,258 @@ +/*************************************************************************** + moreinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "moreinfo.h" +#include "icqclient.h" + +#include "contacts/contact.h" +#include "simgui/datepicker.h" + +#include +#include +#include +#include +#include + +using namespace SIM; + +MoreInfo::MoreInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client) : QWidget(parent) +{ + setupUi(this); + m_data = data; + m_client = client; + m_contact = contact; + btnHomePage->setIcon(Icon("home")); + connect(btnHomePage, SIGNAL(clicked()), this, SLOT(goUrl())); + spnAge->setSpecialValueText(" "); + spnAge->setRange(0, 100); + connect(cmbLang1, SIGNAL(activated(int)), this, SLOT(setLang(int))); + connect(cmbLang2, SIGNAL(activated(int)), this, SLOT(setLang(int))); + connect(cmbLang3, SIGNAL(activated(int)), this, SLOT(setLang(int))); + connect(edtDate, SIGNAL(changed()), this, SLOT(birthDayChanged())); + if (m_data){ + disableWidget(spnAge); + edtHomePage->setReadOnly(true); + disableWidget(cmbGender); + disableWidget(edtDate); + disableWidget(cmbLang1); + disableWidget(cmbLang2); + disableWidget(cmbLang3); + }else{ + connect(edtHomePage, SIGNAL(textChanged(const QString&)), this, SLOT(urlChanged(const QString&))); + } + fill(); +} + +void MoreInfo::apply() +{ +} + +bool MoreInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +const ext_info genders[] = + { + { I18N_NOOP("Female"), 1 }, + { I18N_NOOP("Male"), 2 }, + { "", 0 } + }; + +const ext_info *p_genders = genders; + +const ext_info languages[] = + { + {I18N_NOOP("Arabic"), 1}, + {I18N_NOOP("Bhojpuri"), 2}, + {I18N_NOOP("Bulgarian"), 3}, + {I18N_NOOP("Burmese"), 4}, + {I18N_NOOP("Cantonese"), 5}, + {I18N_NOOP("Catalan"), 6}, + {I18N_NOOP("Chinese"), 7}, + {I18N_NOOP("Croatian"), 8}, + {I18N_NOOP("Czech"), 9}, + {I18N_NOOP("Danish"), 10}, + {I18N_NOOP("Dutch"), 11}, + {I18N_NOOP("English"), 12}, + {I18N_NOOP("Esperanto"), 13}, + {I18N_NOOP("Estonian"), 14}, + {I18N_NOOP("Farsi"), 15}, + {I18N_NOOP("Finnish"), 16}, + {I18N_NOOP("French"), 17}, + {I18N_NOOP("Gaelic"), 18}, + {I18N_NOOP("German"), 19}, + {I18N_NOOP("Greek"), 20}, + {I18N_NOOP("Hebrew"), 21}, + {I18N_NOOP("Hindi"), 22}, + {I18N_NOOP("Hungarian"), 23}, + {I18N_NOOP("Icelandic"), 24}, + {I18N_NOOP("Indonesian"), 25}, + {I18N_NOOP("Italian"), 26}, + {I18N_NOOP("Japanese"), 27}, + {I18N_NOOP("Khmer"), 28}, + {I18N_NOOP("Korean"), 29}, + {I18N_NOOP("Lao"), 30}, + {I18N_NOOP("Latvian"), 31}, + {I18N_NOOP("Lithuanian"), 32}, + {I18N_NOOP("Malay"), 33}, + {I18N_NOOP("Norwegian"), 34}, + {I18N_NOOP("Polish"), 35}, + {I18N_NOOP("Portuguese"), 36}, + {I18N_NOOP("Romanian"), 37}, + {I18N_NOOP("Russian"), 38}, + {I18N_NOOP("Serbian"), 39}, + {I18N_NOOP("Slovak"), 40}, + {I18N_NOOP("Slovenian"), 41}, + {I18N_NOOP("Somali"), 42}, + {I18N_NOOP("Spanish"), 43}, + {I18N_NOOP("Swahili"), 44}, + {I18N_NOOP("Swedish"), 45}, + {I18N_NOOP("Tagalog"), 46}, + {I18N_NOOP("Tatar"), 47}, + {I18N_NOOP("Thai"), 48}, + {I18N_NOOP("Turkish"), 49}, + {I18N_NOOP("Ukrainian"), 50}, + {I18N_NOOP("Urdu"), 51}, + {I18N_NOOP("Vietnamese"), 52}, + {I18N_NOOP("Yiddish"), 53}, + {I18N_NOOP("Yoruba"), 54}, + {I18N_NOOP("Afrikaans"), 55}, + {I18N_NOOP("Persian"), 57}, + {I18N_NOOP("Albanian"), 58}, + {I18N_NOOP("Armenian"), 59}, + {I18N_NOOP("Kyrgyz"), 123}, + {I18N_NOOP("Maltese"), 125}, + {"", 0} + }; + +const ext_info *p_languages = languages; + +void MoreInfo::fill() +{ + ICQUserData *data = m_data; + if (data == NULL) + data = &m_client->data.owner; + edtHomePage->setText(data->Homepage.str()); + initCombo(cmbGender, data->Gender.toULong(), genders); + if (spnAge->text() == "0") + spnAge->setSpecialValueText(QString::null); + + if (data->BirthYear.toULong()>0 && data->BirthMonth.toULong()>0 && data->BirthDay.toULong()>0) { + QDate date; + date.setYMD(data->BirthYear.toULong(), data->BirthMonth.toULong(), data->BirthDay.toULong()); + edtDate->setDate(date); + birthDayChanged(); + } + + unsigned l = data->Language.toULong(); + char l1 = (char)(l & 0xFF); + l = l >> 8; + char l2 = (char)(l & 0xFF); + l = l >> 8; + char l3 = (char)(l & 0xFF); + initCombo(cmbLang1, l1, languages); + initCombo(cmbLang2, l2, languages); + initCombo(cmbLang3, l3, languages); + setLang(0); + urlChanged(edtHomePage->text()); +} + +void MoreInfo::birthDayChanged() +{ + int day = edtDate->getDate().day(); + int month = edtDate->getDate().month(); + int year = edtDate->getDate().year(); + if (year){ + QDate now = QDate::currentDate(); + int age = now.year() - year; + if ((now.month() < month) || ((now.month() == month) && (now.day() < day))) age--; + if (age < 100){ + spnAge->setValue(age); + }else{ + spnAge->setValue(0); + } + }else{ + spnAge->setValue(0); + } +} + +void MoreInfo::goUrl() +{ + QString url = edtHomePage->text(); + if (url.isEmpty()) + return; + if(!url.startsWith("http://")) + url = "http://" + url; + EventGoURL e(url); + e.process(); +} + +void MoreInfo::setLang(int) +{ + unsigned l[3], sl[3]; + l[0] = cmbLang1->currentIndex(); + l[1] = cmbLang2->currentIndex(); + l[2] = cmbLang3->currentIndex(); + unsigned j = 0; + for (unsigned i = 0; i < 3; i++) + if (l[i]) + sl[j++] = l[i]; + for (; j < 3; j++) + sl[j] = 0; + cmbLang1->setCurrentIndex(sl[0]); + cmbLang2->setCurrentIndex(sl[1]); + cmbLang3->setCurrentIndex(sl[2]); + cmbLang2->setEnabled(sl[0] != 0); + cmbLang3->setEnabled(sl[1] != 0); +} + +void MoreInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->Homepage.str() = edtHomePage->text(); + data->Gender.asULong() = getComboValue(cmbGender, genders); + data->BirthMonth.asULong() = edtDate->getDate().month(); + data->BirthDay.asULong() = edtDate->getDate().day(); + data->BirthYear.asULong() = edtDate->getDate().year(); + unsigned l1 = getComboValue(cmbLang1, languages); + unsigned l2 = getComboValue(cmbLang2, languages); + unsigned l3 = getComboValue(cmbLang3, languages); + data->Language.asULong() = (l3 << 16) | (l2 << 8) | l1; +} + +void MoreInfo::urlChanged(const QString &text) +{ + btnHomePage->setEnabled(!text.isEmpty()); +} + diff --git a/plugins/icq/moreinfo.h b/plugins/icq/moreinfo.h new file mode 100644 index 0000000..0202565 --- /dev/null +++ b/plugins/icq/moreinfo.h @@ -0,0 +1,48 @@ +/*************************************************************************** + moreinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MOREINFO_H +#define _MOREINFO_H + +#include "ui_moreinfobase.h" + +#include "event.h" +class ICQClient; +struct ICQUserData; + +class MoreInfo : public QWidget, public Ui::MoreInfoBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + MoreInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); + void goUrl(); + void urlChanged(const QString&); + void setLang(int); + void birthDayChanged(); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + ICQUserData *m_data; + unsigned m_contact; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/moreinfobase.ui b/plugins/icq/moreinfobase.ui new file mode 100644 index 0000000..ee95ef6 --- /dev/null +++ b/plugins/icq/moreinfobase.ui @@ -0,0 +1,335 @@ + + + + + MoreInfoBase + + + + 0 + 0 + 352 + 246 + + + + Form3 + + + + 11 + + + 6 + + + + + + &More info + + + + 11 + + + 6 + + + + + + 0 + 5 + + + + QFrame::HLine + + + QFrame::Sunken + + + QFrame::HLine + + + + + + + 0 + + + 6 + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + Age: + + + false + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + Homepage: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + 0 + + + 6 + + + + + + + + + 0 + 0 + + + + + 22 + 22 + + + + + + + + + + + + + Gender: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + 0 + + + 6 + + + + + Birth date: + + + false + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + + &Languages + + + + 11 + + + 6 + + + + + Spoken languages: + + + false + + + + + + + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    + + DatePicker + QWidget +
    simgui/datepicker.h
    + + -1 + -1 + + 0 + + 0 + 1 + + image1 +
    +
    + + edtHomePage + btnHomePage + cmbGender + spnAge + TabWidget2 + cmbLang1 + cmbLang2 + cmbLang3 + + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + +
    diff --git a/plugins/icq/pastinfo.cpp b/plugins/icq/pastinfo.cpp new file mode 100644 index 0000000..96d126e --- /dev/null +++ b/plugins/icq/pastinfo.cpp @@ -0,0 +1,311 @@ +/*************************************************************************** + pastinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "pastinfo.h" +#include "icqclient.h" +#include "contacts/contact.h" + +#include +#include + +using namespace SIM; + +PastInfo::PastInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client) : QWidget(parent) +{ + setupUi(this); + m_data = data; + m_client = client; + m_contact = contact; + if (m_data){ + edtBg1->setReadOnly(true); + edtBg2->setReadOnly(true); + edtBg3->setReadOnly(true); + edtAf1->setReadOnly(true); + edtAf2->setReadOnly(true); + edtAf3->setReadOnly(true); + disableWidget(cmbBg1); + disableWidget(cmbBg2); + disableWidget(cmbBg3); + disableWidget(cmbAf1); + disableWidget(cmbAf2); + disableWidget(cmbAf3); + }else{ + connect(cmbBg1, SIGNAL(activated(int)), this, SLOT(cmbBgChanged(int))); + connect(cmbBg2, SIGNAL(activated(int)), this, SLOT(cmbBgChanged(int))); + connect(cmbBg3, SIGNAL(activated(int)), this, SLOT(cmbBgChanged(int))); + connect(cmbAf1, SIGNAL(activated(int)), this, SLOT(cmbAfChanged(int))); + connect(cmbAf2, SIGNAL(activated(int)), this, SLOT(cmbAfChanged(int))); + connect(cmbAf3, SIGNAL(activated(int)), this, SLOT(cmbAfChanged(int))); + } + fill(); +} + +void PastInfo::apply() +{ +} + +bool PastInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +static const ext_info pasts[] = + { + { I18N_NOOP("Elementary School"), 300 }, + { I18N_NOOP("High School"), 301 }, + { I18N_NOOP("College"), 302 }, + { I18N_NOOP("University"), 303 }, + { I18N_NOOP("Military"), 304 }, + { I18N_NOOP("Past Work Place"), 305 }, + { I18N_NOOP("Past Organization"), 306 }, + { I18N_NOOP("Other"), 399 }, + { "", 0 } + }; + +const ext_info *p_pasts = pasts; + +static const ext_info affilations[] = + { + { I18N_NOOP("Alumni Org."), 200 }, + { I18N_NOOP("Charity Org."), 201 }, + { I18N_NOOP("Club/Social Org."), 202 }, + { I18N_NOOP("Community Org."), 203 }, + { I18N_NOOP("Cultural Org."), 204 }, + { I18N_NOOP("Fan Clubs"), 205 }, + { I18N_NOOP("Fraternity/Sorority"), 206 }, + { I18N_NOOP("Hobbyists Org."), 207 }, + { I18N_NOOP("International Org."), 208 }, + { I18N_NOOP("Nature and Environment Org."), 209 }, + { I18N_NOOP("Professional Org."), 210 }, + { I18N_NOOP("Scientific/Technical Org."), 211 }, + { I18N_NOOP("Self Improvement Group"), 212 }, + { I18N_NOOP("Spiritual/Religious Org."), 213 }, + { I18N_NOOP("Sports Org."), 214 }, + { I18N_NOOP("Support Org."), 215 }, + { I18N_NOOP("Trade and Business Org."), 216 }, + { I18N_NOOP("Union"), 217 }, + { I18N_NOOP("Volunteer Org."), 218 }, + { I18N_NOOP("Other"), 299 }, + { "", 0 } + }; + +const ext_info *p_affilations = affilations; + +void PastInfo::fill() +{ + ICQUserData *data = m_data; + if (data == NULL) + data = &m_client->data.owner; + unsigned i = 0; + QString str = data->Backgrounds.str(); + while (str.length()){ + QString info = getToken(str, ';', false); + QString n = getToken(info, ','); + unsigned short category = n.toUShort(); + switch (i){ + case 0: + edtBg1->setText(info); + initCombo(cmbBg1, category, pasts); + break; + case 1: + edtBg2->setText(info); + initCombo(cmbBg2, category, pasts); + break; + case 2: + edtBg3->setText(info); + initCombo(cmbBg3, category, pasts); + break; + } + i++; + } + for (; i < 4; i++){ + switch (i){ + case 0: + initCombo(cmbBg1, 0, pasts); + break; + case 1: + initCombo(cmbBg2, 0, pasts); + break; + case 2: + initCombo(cmbBg3, 0, pasts); + break; + } + } + i = 0; + str = data->Affilations.str(); + while (str.length()){ + QString info = getToken(str, ';', false); + QString n = getToken(info, ','); + unsigned short category = n.toUShort(); + switch (i){ + case 0: + edtAf1->setText(info); + initCombo(cmbAf1, category, affilations); + break; + case 1: + edtAf2->setText(info); + initCombo(cmbAf2, category, affilations); + break; + case 2: + edtAf3->setText(info); + initCombo(cmbAf3, category, affilations); + break; + } + i++; + } + for (; i < 4; i++){ + switch (i){ + case 0: + initCombo(cmbAf1, 0, affilations); + break; + case 1: + initCombo(cmbAf2, 0, affilations); + break; + case 2: + initCombo(cmbAf3, 0, affilations); + break; + } + } + if (m_data == NULL){ + cmbBgChanged(0); + cmbAfChanged(0); + } +} + +void PastInfo::cmbBgChanged(int) +{ + QComboBox *cmbs[3] = { cmbBg1, cmbBg2, cmbBg3 }; + QLineEdit *edts[3] = { edtBg1, edtBg2, edtBg3 }; + unsigned n = 0; + for (unsigned i = 0; i < 3; i++){ + unsigned short value = getComboValue(cmbs[i], pasts); + if (value){ + if (i != n){ + cmbs[n]->setEnabled(true); + edts[n]->setEnabled(true); + initCombo(cmbs[n], value, pasts, true); + edts[n]->setText(edts[i]->text()); + } + edts[n]->setEnabled(true); + edts[n]->setReadOnly(false); + n++; + } + } + if (n >= 3) + return; + cmbs[n]->setEnabled(true); + disableWidget(edts[n]); + cmbs[n]->setCurrentIndex(0); + edts[n]->setText(QString::null); + for (n++; n < 3; n++){ + disableWidget(cmbs[n]); + disableWidget(edts[n]); + initCombo(cmbs[n], 0, pasts, true); + edts[n]->setText(QString::null); + } +} + +void PastInfo::cmbAfChanged(int) +{ + QComboBox *cmbs[3] = { cmbAf1, cmbAf2, cmbAf3 }; + QLineEdit *edts[3] = { edtAf1, edtAf2, edtAf3 }; + unsigned n = 0; + for (unsigned i = 0; i < 3; i++){ + unsigned short value = getComboValue(cmbs[i], affilations); + if (value){ + if (i != n){ + cmbs[n]->setEnabled(true); + edts[n]->setEnabled(true); + initCombo(cmbs[n], value, affilations, true); + edts[n]->setText(edts[i]->text()); + } + edts[n]->setEnabled(true); + edts[n]->setReadOnly(false); + n++; + } + } + if (n >= 3) + return; + cmbs[n]->setEnabled(true); + disableWidget(edts[n]); + cmbs[n]->setCurrentIndex(0); + edts[n]->setText(QString::null); + for (n++; n < 3; n++){ + disableWidget(cmbs[n]); + disableWidget(edts[n]); + initCombo(cmbs[n], 0, affilations, true); + edts[n]->setText(QString::null); + } +} + + +void PastInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString bg[3]; + bg[0] = getInfo(cmbBg1, edtBg1, pasts); + bg[1] = getInfo(cmbBg2, edtBg2, pasts); + bg[2] = getInfo(cmbBg3, edtBg3, pasts); + QString res; + for (unsigned i = 0; i < 3; i++){ + if (bg[i].isEmpty()) + continue; + if (!res.isEmpty()) + res += ';'; + res += bg[i]; + } + data->Backgrounds.str() = res; + res = QString::null; + QString af[3]; + af[0] = getInfo(cmbAf1, edtAf1, affilations); + af[1] = getInfo(cmbAf2, edtAf2, affilations); + af[2] = getInfo(cmbAf3, edtAf3, affilations); + for (unsigned i = 0; i < 3; i++){ + if (af[i].isEmpty()) + continue; + if (!res.isEmpty()) + res += ';'; + res += af[i]; + } + data->Affilations.str() = res; +} + +QString PastInfo::getInfo(QComboBox *cmb, QLineEdit *edt, const ext_info *info) +{ + unsigned n = getComboValue(cmb, info); + if (n == 0) + return QString::null; + QString res = QString::number(n) + ','; + res += quoteChars(edt->text(), ",;"); + return res; +} + diff --git a/plugins/icq/pastinfo.h b/plugins/icq/pastinfo.h new file mode 100644 index 0000000..db6b11b --- /dev/null +++ b/plugins/icq/pastinfo.h @@ -0,0 +1,49 @@ +/*************************************************************************** + pastinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _PASTINFO_H +#define _PASTINFO_H + +#include "country.h" +#include "event.h" + +#include "ui_pastinfobase.h" + +class ICQClient; +struct ICQUserData; + +class PastInfo : public QWidget, public Ui::PastInfoBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + PastInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); + void cmbAfChanged(int); + void cmbBgChanged(int); +protected: + virtual bool processEvent(SIM::Event *e); + QString getInfo(QComboBox *cmb, QLineEdit *edt, const SIM::ext_info*); + void fill(); + ICQUserData *m_data; + unsigned m_contact; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/pastinfobase.ui b/plugins/icq/pastinfobase.ui new file mode 100644 index 0000000..c41c09e --- /dev/null +++ b/plugins/icq/pastinfobase.ui @@ -0,0 +1,185 @@ + + + + + PastInfoBase + + + + 0 + 0 + 316 + 263 + + + + Form1 + + + + 11 + + + 6 + + + + + + A&ffilation + + + + 11 + + + 6 + + + + + Organization, Affiliation, Group: + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + &Background + + + + 11 + + + 6 + + + + + Past background: + + + false + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + cmbAf1 + edtAf1 + cmbAf2 + edtAf2 + cmbAf3 + edtAf3 + TabWidget2 + cmbBg1 + edtBg1 + cmbBg2 + edtBg2 + cmbBg3 + edtBg3 + + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/icq/polling.cpp b/plugins/icq/polling.cpp new file mode 100644 index 0000000..712104b --- /dev/null +++ b/plugins/icq/polling.cpp @@ -0,0 +1,401 @@ +/*************************************************************************** + polling.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include + +#include "fetch.h" +#include "log.h" + +#include "icqclient.h" +#include "polling.h" + +using namespace std; +using namespace SIM; + +const unsigned short HTTP_PROXY_VERSION = 0x0443; + +const unsigned short HTTP_PROXY_HELLO = 2; +const unsigned short HTTP_PROXY_LOGIN = 3; +const unsigned short HTTP_PROXY_UNK1 = 4; +const unsigned short HTTP_PROXY_FLAP = 5; +const unsigned short HTTP_PROXY_CONNECT = 6; +const unsigned short HTTP_PROXY_UNK2 = 7; + +class HttpPacket +{ + COPY_RESTRICTED(HttpPacket) +public: + HttpPacket(const char *data, unsigned short size, unsigned short type, unsigned long nSock); + ~HttpPacket(); + char *data; + unsigned short size; + unsigned short type; + unsigned long nSock; +}; + +HttpPacket::HttpPacket(const char *_data, unsigned short _size, unsigned short _type, unsigned long _nSock) +{ + size = _size; + type = _type; + nSock = _nSock; + data = NULL; + if (size){ + data = new char[size]; + memcpy(data, _data, size); + } +} + +HttpPacket::~HttpPacket() +{ + if (data) delete[] data; +} + +// ___________________________________________________________________________________ + +static char ANSWER_ERROR[] = "Bad answer"; + +class HttpRequest : public FetchClient +{ +public: + HttpRequest(HttpPool *pool); + void send(); +protected: + virtual bool done(unsigned code, Buffer &data, const QString &headers); + virtual HttpPacket *packet() = 0; + virtual QString url() = 0; + virtual void data_ready(ICQBuffer*) = 0; + HttpPool *m_pool; +}; + +HttpRequest::HttpRequest(HttpPool *pool) +{ + m_pool = pool; +} + +void HttpRequest::send() +{ + HttpPacket *p = packet(); + ICQBuffer *postData = NULL; + if (p){ + postData = new ICQBuffer; + unsigned short len = (unsigned short)(p->size + 12); + *postData + << len + << HTTP_PROXY_VERSION + << p->type + << 0x00000000L + << p->nSock; + if (p->size) + postData->pack(p->data, p->size); + m_pool->queue.remove(p); + delete p; + } + char headers[] = "Cache-control: no-store, no-cache\n" + "Pragma: no-cache"; + fetch(url(), headers, postData); +} + +bool HttpRequest::done(unsigned code, Buffer &data, const QString &) +{ + if (code != 200){ + log(L_DEBUG, "Res: %u %s", code, qPrintable(url())); + m_pool->error(ANSWER_ERROR); + return false; + } + ICQBuffer d(data); + data_ready(&d); + return true; +} + +unsigned long HttpPool::localHost() +{ + return 0; +} + +void HttpPool::pause(unsigned time) +{ + QTimer::singleShot(time * 1000, this, SLOT(timeout())); +} + +void HttpPool::timeout() +{ + if (notify) + notify->write_ready(); +} + +// ______________________________________________________________________________________ + +class HelloRequest : public HttpRequest +{ +public: + HelloRequest(HttpPool *poll, bool bAIM); +protected: + virtual HttpPacket *packet(); + virtual QString url(); + virtual void data_ready(ICQBuffer*); + bool m_bAIM; +}; + +HelloRequest::HelloRequest(HttpPool *poll, bool bAIM) + : HttpRequest(poll) +{ + m_bAIM = bAIM; + send(); +} + +HttpPacket *HelloRequest::packet() +{ + return NULL; +} + +QString HelloRequest::url() +{ + return m_bAIM ? "http://aimhttp.oscar.aol.com/hello" : "http://http.proxy.icq.com/hello"; +} + +void HelloRequest::data_ready(ICQBuffer *bIn) +{ + m_pool->hello = NULL; + bIn->incReadPos(12); + unsigned long SID[4]; + (*bIn) >> SID[0] >> SID[1] >> SID[2] >> SID[3]; + char b[34]; + snprintf(b, sizeof(b), "%08lx%08lx%08lx%08lx", SID[0], SID[1], SID[2], SID[3]); + m_pool->sid = b; + bIn->unpackStr(m_pool->m_host); + m_pool->request(); +} + +// ______________________________________________________________________________________ + +class MonitorRequest : public HttpRequest +{ +public: + MonitorRequest(HttpPool *pool); +protected: + virtual HttpPacket *packet(); + virtual QString url(); + virtual void data_ready(ICQBuffer*); +}; + +MonitorRequest::MonitorRequest(HttpPool *pool) + : HttpRequest(pool) +{ + send(); +} + +HttpPacket *MonitorRequest::packet() +{ + return NULL; +} + +QString MonitorRequest::url() +{ + QString sURL; + sURL = "http://"; + sURL += m_pool->m_host; + sURL += "/monitor?sid="; + sURL += m_pool->sid; + return sURL; +} + +void MonitorRequest::data_ready(ICQBuffer *bIn) +{ + m_pool->monitor = NULL; + m_pool->readn = 0; + while (bIn->readPos() < (unsigned)bIn->size()){ + unsigned short len, ver, type; + (*bIn) >> len >> ver >> type; + bIn->incReadPos(8); + len -= 12; + if (len > (bIn->size() - bIn->readPos())){ + m_pool->error(ANSWER_ERROR); + return; + } + if (ver != HTTP_PROXY_VERSION){ + m_pool->error(ANSWER_ERROR); + return; + } + switch (type){ + case HTTP_PROXY_FLAP: + if (len){ + unsigned short nSock; + bIn->incReadPos(-2); + *bIn >> nSock; + if (nSock == m_pool->nSock){ + char *data = bIn->data(bIn->readPos()); + m_pool->readData.pack(data, len); + m_pool->readn += len; + } + bIn->incReadPos(len); + } + break; + case HTTP_PROXY_UNK1: + case HTTP_PROXY_UNK2: + if (len) + bIn->incReadPos(len); + break; + default: + m_pool->error(ANSWER_ERROR); + return; + } + } + m_pool->request(); +} + +// ______________________________________________________________________________________ + +class PostRequest : public HttpRequest +{ +public: + PostRequest(HttpPool *proxy); +protected: + virtual HttpPacket *packet(); + virtual QString url(); + virtual void data_ready(ICQBuffer *b); +}; + +PostRequest::PostRequest(HttpPool *proxy) + : HttpRequest(proxy) +{ + send(); +} + +HttpPacket *PostRequest::packet() +{ + if (m_pool->queue.size()) + return m_pool->queue.front(); + return NULL; +} + +QString PostRequest::url() +{ + QString sURL; + sURL = "http://"; + sURL += m_pool->m_host; + sURL += "/data?sid="; + sURL += m_pool->sid; + sURL += "&seq="; + char b[15]; + snprintf(b, sizeof(b), "%u", ++m_pool->seq); + sURL += b; + return sURL; +} + +void PostRequest::data_ready(ICQBuffer*) +{ + m_pool->post = NULL; + m_pool->request(); +} + +// ______________________________________________________________________________________ + +HttpPool::HttpPool(bool bAIM) +{ + m_bAIM = bAIM; + hello = NULL; + monitor = NULL; + post = NULL; + state = None; + seq = 0; + readn = 0; + nSock = 0; +} + +HttpPool::~HttpPool() +{ + if (hello) delete hello; + if (monitor) delete monitor; + if (post) delete post; + for (list::iterator it = queue.begin(); it != queue.end(); ++it) + delete *it; +} + +int HttpPool::read(char *buf, unsigned size) +{ + unsigned tail = readData.size() - readData.readPos(); + if (size > tail) size = tail; + if (size == 0) return 0; + readData.unpack(buf, size); + if (readData.readPos() == (unsigned)readData.size()) + readData.init(0); + return size; +} + +void HttpPool::write(const char *buf, unsigned size) +{ + queue.push_back(new HttpPacket(buf, (unsigned short)size, HTTP_PROXY_FLAP, nSock)); + request(); +} + +void HttpPool::close() +{ + readData.init(0); +} + +void HttpPool::connect(const QString &host, unsigned short port) +{ + state = None; + ICQBuffer b; + unsigned short len = host.length(); + b << len << host.toLocal8Bit().data() << port; + nSock++; + queue.push_back(new HttpPacket(b.data(0), (unsigned short)(b.size()), HTTP_PROXY_LOGIN, nSock)); + if (sid.length()){ + unsigned char close_packet[] = { 0x2A, 0x04, 0x14, 0xAB, 0x00, 0x00 }; + queue.push_back(new HttpPacket((char*)close_packet, sizeof(close_packet), HTTP_PROXY_FLAP, 1)); + queue.push_back(new HttpPacket(NULL, 0, HTTP_PROXY_CONNECT, 1)); + } + request(); +} + +void HttpPool::request() +{ + if (sid.length() == 0){ + if (hello == NULL) + hello = new HelloRequest(this, m_bAIM); + return; + } + if (monitor == NULL) + monitor = new MonitorRequest(this); + if (queue.size() && (post == NULL)) + post = new PostRequest(this); + if (readn && notify){ + if (state == None){ + state = Connected; + notify->connect_ready(); + } + readn = 0; + notify->read_ready(); + } +} + +Socket *ICQClient::createSocket() +{ + m_bHTTP = getUseHTTP(); + if (getAutoHTTP()){ + m_bHTTP = m_bFirstTry; + if (!m_bFirstTry) + m_bFirstTry = true; + } + if (m_bHTTP) + return new HttpPool(m_bAIM); + return NULL; +} + diff --git a/plugins/icq/polling.h b/plugins/icq/polling.h new file mode 100644 index 0000000..8e64f72 --- /dev/null +++ b/plugins/icq/polling.h @@ -0,0 +1,78 @@ +/*************************************************************************** + polling.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _POLLING_H +#define _POLLING_H + +#include +#include "socket/socket.h" + +class HttpRequest; +class HttpPacket; + +class HttpPool : public QObject, public SIM::Socket +{ + Q_OBJECT +public: + HttpPool(bool bAIM); + ~HttpPool(); + virtual void connect(const QString &host, unsigned short port); + virtual int read(char *buf, unsigned size); + virtual void write(const char *buf, unsigned size); + virtual void close(); + virtual Mode mode() const { return Web; } + virtual bool isEncrypted(){ return false; } + virtual bool startEncryption(){ return false; } +protected slots: + void timeout(); +protected: + enum State + { + None, + Connected + }; + State state; + + QString sid; + QString m_host; + QString m_url; + + std::list queue; + unsigned seq; + unsigned readn; + Buffer readData; + + HttpRequest *hello; + HttpRequest *monitor; + HttpRequest *post; + + unsigned short nSock; + void request(); + virtual unsigned long localHost(); + virtual void pause(unsigned); + + bool m_bAIM; + + friend class HttpRequest; + friend class HelloRequest; + friend class MonitorRequest; + friend class PostRequest; +}; + + +#endif + diff --git a/plugins/icq/rtf.ll b/plugins/icq/rtf.ll new file mode 100644 index 0000000..141ba75 --- /dev/null +++ b/plugins/icq/rtf.ll @@ -0,0 +1,1044 @@ +%{ + /*************************************************************************** + rtf.ll - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + + /*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include +#include +#include + +#include + +#include "unquot.h" +#include "log.h" + +#include "icqclient.h" + +#define UP 1 +#define DOWN 2 +#define CMD 3 +#define TXT 4 +#define HEX 5 +#define IMG 6 +#define UNICODE_CHAR 7 +#define SKIP 8 +#define SLASH 9 +#define S_TXT 10 + +#define YY_NEVER_INTERACTIVE 1 +#define YY_ALWAYS_INTERACTIVE 0 +#define YY_MAIN 0 + +%} + +%option nounput +%option nostack +%option prefix="rtf" + +%% + +"{" { return UP; } +"}" { return DOWN; } +"\\"[\\\{\}] { return SLASH; } +"\\u"[0-9]{3,7}[ ]?"?" { return UNICODE_CHAR; } +"\\"[A-Za-z]+[0-9]*[ ]? { return CMD; } +"\\'"[0-9A-Fa-f][0-9A-Fa-f] { return HEX; } +"<##"[^>]+">" { return IMG; } +[^\\{}<]+ { return TXT; } +. { return TXT; } +%% + +using namespace std; +using namespace SIM; + +struct FontDef +{ + int charset; + QString taggedName; + QString nonTaggedName; +}; + +class RTF2HTML; + +enum TagEnum +{ + TAG_ALL = 0, + TAG_FONT_SIZE, + TAG_FONT_COLOR, + TAG_FONT_FAMILY, + TAG_BG_COLOR, + TAG_BOLD, + TAG_ITALIC, + TAG_UNDERLINE +}; + +class ParStyle +{ +public: + ParStyle() { dir = DirLTR; } + void clearFormatting(); + +public: + enum {DirLTR, DirRTL} dir; +}; + +void ParStyle::clearFormatting() +{ + // For now, do nothing. + // dir is not a formatting item. +} + +class Level +{ +public: + Level(RTF2HTML *_p); + Level(const Level&); + void setText(const char* str); + void setFontTbl() { m_bFontTbl = true; } + void setColors() { m_bColors = true; resetColors(); } + void setRed(unsigned char val) { setColor(val, &m_nRed); } + void setGreen(unsigned char val) { setColor(val, &m_nGreen); } + void setBlue(unsigned char val) { setColor(val, &m_nBlue); } + void setFont(unsigned nFont); + void setEncoding(unsigned nFont); + void setFontName(); + void setFontColor(unsigned short color); + void setFontBgColor(unsigned short color); + void setFontSizeHalfPoints(unsigned short sizeInHalfPoints); + void setFontSize(unsigned short sizeInPoints); + void setBold(bool); + void setItalic(bool); + void setUnderline(bool); + void startParagraph(); + bool isParagraphOpen() const; + void clearParagraphFormatting(); + void setParagraphDirLTR(); + void setParagraphDirRTL(); + void addLineBreak(); + void setAnsiCodePage(unsigned short cp); + void flush(); + void reset(); + void resetTag(TagEnum tag); +protected: + QString text; + void Init(); + RTF2HTML *p; + void resetColors() { m_nRed = m_nGreen = m_nBlue = 0; m_bColorInit = false; } + void setColor(unsigned char val, unsigned char *p) + { *p = val; m_bColorInit=true; } + + // Marks the position in m_tags where this level begun. + unsigned m_nTagsStartPos; + + // True when parsing the fonts table + bool m_bFontTbl; + // True when parsing the colors table. + bool m_bColors; + // True when inside a 'fname' block. + bool m_bFontName; + // False until we get the tagged font name. + bool m_bTaggedFontNameOk; + + unsigned char m_nRed; + unsigned char m_nGreen; + unsigned char m_nBlue; + bool m_bColorInit; + unsigned m_nFont; // 1-based + unsigned m_nEncoding; + unsigned m_nFontColor; // 1-based + unsigned m_nFontSize; + unsigned m_nFontBgColor; // 1-based + bool m_bBold; + bool m_bItalic; + bool m_bUnderline; +}; + +class OutTag +{ +public: + OutTag(TagEnum _tag, unsigned _param) : tag(_tag), param(_param) {} + TagEnum tag; + unsigned param; +}; + +class RTF2HTML +{ + friend class Level; + +public: + RTF2HTML(); + QString Parse(const char *rtf, const char *encoding); + +// Paragraph-specific functions: + + // Appends a string with formatting into the paragraph buffer. +#if defined __GNUC__ + void PrintUnquoted(const char *str, ...) + __attribute__ ((__format__ (printf, 2, 3))); +#else + void PrintUnquoted(const char *str, ...); +#endif + // Quotes and appends a string to the paragraph buffer. + void PrintQuoted(const QString &str); + // Writes down the tags from oTags into the paragraph buffer. + void FlushOutTags(); + // Retrieves the top not-yet-written tag. + OutTag* getTopOutTag(TagEnum tagType); + // Writes down the paragraph buffer and resets the paragraph state. + void FlushParagraph(); + //sets the codepage found in the rtf stream + void setAnsiCodePage(unsigned short cp); + +// Document-wide functions: + + void PutTag(TagEnum n) + { + tags.push(n); + } + +protected: + +// Paragraph members + + // The paragraph's HTML buffer. + QString sParagraph; + // True if the paragraph was opened explicitly. + bool bExplicitParagraph; + // Whether we have an empty paragraph which we haven't flushed yet. + // We do not haste with flushing it, since it might be the last + // (empty) paragraph in the RTF message, which we want to discard. + // This last paragraph is not appended by the user, but by the + // client itself, to keep the official ICQ client's sanity, + // and there's no reason our users should see it. + bool bPendingEmptyParagraph; + // Defines the paragraph's formatting. + ParStyle parStyle; + // Tags which weren't yet printed out. + vector oTags; + +// Document members + + // The document HTML buffer. + QString s; + // Fonts table. + vector fonts; + // Colors table. + vector colors; + // Stack of tags (across all levels, not just current level) + stack tags; + +// RTF parser internals + + const char *rtf_ptr; + const char *encoding; + Level cur_level; + stack levels; +}; + +RTF2HTML::RTF2HTML() + : cur_level(this) +{ + rtf_ptr = NULL; + bExplicitParagraph = false; + bPendingEmptyParagraph = false; +} + +OutTag* RTF2HTML::getTopOutTag(TagEnum tagType) +{ + vector::iterator it, it_end; + for(it = oTags.begin(), it_end = oTags.end(); it != it_end; ++it) + if (it->tag == tagType) + return &(*it); + return NULL; +} + +void RTF2HTML::FlushOutTags() +{ + vector::iterator iter; + for (iter = oTags.begin(); iter != oTags.end(); iter++) + { + OutTag &t = *iter; + switch (t.tag){ + case TAG_FONT_COLOR: + { + // RTF colors are 1-based; colors[] is a 0-based array. + if (t.param > colors.size() || t.param == 0) + break; + QColor &c = colors[t.param-1]; + PrintUnquoted("", c.red(), c.green(), c.blue()); + } + break; + case TAG_FONT_SIZE: + PrintUnquoted("", t.param); + break; + case TAG_FONT_FAMILY: + { + if (t.param > fonts.size() || t.param == 0) + break; + FontDef &f = fonts[t.param-1]; + QString name = (!f.nonTaggedName.isEmpty()) ? f.nonTaggedName : f.taggedName; + PrintUnquoted("", qPrintable(name)); + } + break; + case TAG_BG_COLOR: + { + if (t.param > colors.size() || t.param == 0) + break; + QColor &c = colors[t.param-1]; + PrintUnquoted("", c.red(), c.green(), c.blue()); + break; + } + case TAG_BOLD: + PrintUnquoted(""); + break; + case TAG_ITALIC: + PrintUnquoted(""); + break; + case TAG_UNDERLINE: + PrintUnquoted(""); + break; + default: + break; + } + } + oTags.clear(); +} + +// This function will close the already-opened tag 'tag'. It will take +// care of closing the tags which 'tag' contains first (ie. it will unroll +// the stack till the point where 'tag' is). +void Level::resetTag(TagEnum tag) +{ + // A stack which'll keep tags we had to close in order to reach 'tag'. + // After we close 'tag', we will reopen them. + stack s; + + while (p->tags.size() > m_nTagsStartPos){ // Don't go further than the point where this level starts. + + TagEnum nTag = p->tags.top(); + + /* A tag will be located in oTags if it still wasn't printed out. + A tag will get printed out only if necessary (e.g. will + be optimized away). + Thus, for each tag we remove from the actual tag stack, we also + try to remove a yet-to-be-printed tag, and only if there are no + yet-to-be-printed tags left, we start closing the tags we pop. + The tags have one space - needed for umlaute (�) and .utf8() + */ + if (p->oTags.empty()){ + switch (nTag){ + case TAG_FONT_COLOR: + case TAG_FONT_SIZE: + case TAG_BG_COLOR: + case TAG_FONT_FAMILY: + p->PrintUnquoted(""); + break; + case TAG_BOLD: + p->PrintUnquoted(""); + break; + case TAG_ITALIC: + p->PrintUnquoted(""); + break; + case TAG_UNDERLINE: + p->PrintUnquoted(""); + break; + default: + break; + } + }else{ + p->oTags.pop_back(); + } + + p->tags.pop(); + if (nTag == tag) break; // if we reached the tag we were looking to close. + s.push(nTag); // remember to reopen this tag + } + + if (tag == TAG_ALL) return; + + while (!s.empty()){ + TagEnum nTag = s.top(); + switch (nTag){ + case TAG_FONT_COLOR:{ + unsigned nFontColor = m_nFontColor; + m_nFontColor = 0; + setFontColor(nFontColor); + break; + } + case TAG_FONT_SIZE:{ + unsigned nFontSize = m_nFontSize; + m_nFontSize = 0; + setFontSize(nFontSize); + break; + } + case TAG_BG_COLOR:{ + unsigned nFontBgColor = m_nFontBgColor; + m_nFontBgColor = 0; + setFontBgColor(nFontBgColor); + break; + } + case TAG_FONT_FAMILY:{ + unsigned nFont = m_nFont; + m_nFont = 0; + setFont(nFont); + break; + } + case TAG_BOLD:{ + bool nBold = m_bBold; + m_bBold = false; + setBold(nBold); + break; + } + case TAG_ITALIC:{ + bool nItalic = m_bItalic; + m_bItalic = false; + setItalic(nItalic); + break; + } + case TAG_UNDERLINE:{ + bool nUnderline = m_bUnderline; + m_bUnderline = false; + setUnderline(nUnderline); + break; + } + default: + break; + } + s.pop(); + } +} + +Level::Level(RTF2HTML *_p) : + p(_p), + m_bFontTbl(false), + m_bColors(false), + m_bFontName(false), + m_bTaggedFontNameOk(false), + m_nFont(0), + m_nEncoding(0) +{ + m_nTagsStartPos = p->tags.size(); + Init(); +} + +Level::Level(const Level &l) : + p(l.p), + m_bFontTbl(l.m_bFontTbl), + m_bColors(l.m_bColors), + m_bFontName(false), + m_bTaggedFontNameOk(l.m_bTaggedFontNameOk), + m_nFont(l.m_nFont), + m_nEncoding(l.m_nEncoding) +{ + m_nTagsStartPos = p->tags.size(); + Init(); +} + +void Level::Init() +{ + m_nFontColor = 0; + m_nFontBgColor = 0; + m_nFontSize = 0; + m_bFontName = false; + m_bBold = false; + m_bItalic = false; + m_bUnderline = false; +} + +void RTF2HTML::PrintUnquoted(const char *str, ...) +{ + char buff[1024]; + va_list ap; + va_start(ap, str); + vsnprintf(buff, sizeof(buff), str, ap); + va_end(ap); + sParagraph += buff; +} + +void RTF2HTML::PrintQuoted(const QString &str) +{ + sParagraph += quoteString(str); +} + +void RTF2HTML::FlushParagraph() +{ + if (bPendingEmptyParagraph) + { + s += "


    "; + bPendingEmptyParagraph = false; + } + + if (!sParagraph.isEmpty()) + { + s += "

    "; + s += sParagraph; + s += "

    "; + } + else + { + if (bExplicitParagraph) + // Delay the empty paragraph for later appending. + // If this empty paragraph happens to be the last one + // in the message, we'll end up discarding it -- which + // is a good thing (since it's just a compatibility hack + // for the official ICQ client). + bPendingEmptyParagraph = true; + } + + // Clear up the paragraph members + sParagraph = ""; +} + +void RTF2HTML::setAnsiCodePage(unsigned short cp) +{ + for (const ENCODING *c = getContacts()->getEncodings(); c->language; c++){ + if (!c->bMain) + continue; + if ((unsigned)c->cp_code == cp){ + encoding = c->codec; + return; + } + } +} + +void Level::setFont(unsigned nFont) +{ + if (nFont <= 0) + return; + + if (m_bFontTbl){ + if (nFont > p->fonts.size() +1){ + log(L_WARN, "Invalid font index (%u) while parsing font table.", nFont); + return; + } + if (nFont > p->fonts.size()){ + FontDef f; + f.charset = 0; + p->fonts.push_back(f); + } + m_nFont = nFont; + } + else + { + if (nFont > p->fonts.size()) + { + log(L_WARN, "Invalid font index (%u)",nFont); + return; + } + if (m_nFont == nFont) + return; + m_nFont = nFont; + if (m_nFont) resetTag(TAG_FONT_FAMILY); + m_nEncoding = p->fonts[nFont-1].charset; + p->oTags.push_back(OutTag(TAG_FONT_FAMILY, nFont)); + p->PutTag(TAG_FONT_FAMILY); + } +} + +void Level::setFontName() +{ + // This function is only valid during font table parsing. + if (m_bFontTbl){ + if ((m_nFont > 0) && (m_nFont <= p->fonts.size())) + // Be prepared to accept a font name. + m_bFontName = true; + } +} + +void Level::setEncoding(unsigned nEncoding) +{ + if (m_bFontTbl){ + if ((m_nFont > 0) && (m_nFont <= p->fonts.size())) + p->fonts[m_nFont-1].charset = nEncoding; + return; + } + m_nEncoding = nEncoding; +} + +void Level::setBold(bool bBold) +{ + if (m_bBold == bBold) return; + if (m_bBold) resetTag(TAG_BOLD); + m_bBold = bBold; + if (!m_bBold) return; + p->oTags.push_back(OutTag(TAG_BOLD, 0)); + p->PutTag(TAG_BOLD); +} + +void Level::setItalic(bool bItalic) +{ + if (m_bItalic == bItalic) return; + if (m_bItalic) resetTag(TAG_ITALIC); + m_bItalic = bItalic; + if (!m_bItalic) return; + p->oTags.push_back(OutTag(TAG_ITALIC, 0)); + p->PutTag(TAG_ITALIC); +} + +void Level::setUnderline(bool bUnderline) +{ + if (m_bUnderline == bUnderline) return; + if (m_bUnderline) resetTag(TAG_UNDERLINE); + m_bUnderline = bUnderline; + if (!m_bUnderline) return; + p->oTags.push_back(OutTag(TAG_UNDERLINE, 0)); + p->PutTag(TAG_UNDERLINE); +} + +void Level::setFontColor(unsigned short nColor) +{ + if (m_nFontColor == nColor) return; + if (m_nFontColor) resetTag(TAG_FONT_COLOR); + if (nColor > p->colors.size()) return; + m_nFontColor = nColor; + p->oTags.push_back(OutTag(TAG_FONT_COLOR, m_nFontColor)); + p->PutTag(TAG_FONT_COLOR); +} + +void Level::setFontBgColor(unsigned short nColor) +{ + if (m_nFontBgColor == nColor) return; + if (m_nFontBgColor != 0) resetTag(TAG_BG_COLOR); + if (nColor > p->colors.size()) return; + m_nFontBgColor = nColor; + p->oTags.push_back(OutTag(TAG_BG_COLOR, m_nFontBgColor)); + p->PutTag(TAG_BG_COLOR); +} + +void Level::setFontSizeHalfPoints(unsigned short nSize) +{ + setFontSize(nSize / 2); +} + +void Level::setFontSize(unsigned short nSize) +{ + if (m_nFontSize == nSize) + return; + if (m_nFontSize) + resetTag(TAG_FONT_SIZE); + p->oTags.push_back(OutTag(TAG_FONT_SIZE, nSize)); + p->PutTag(TAG_FONT_SIZE); + m_nFontSize = nSize; +} + +void Level::startParagraph() +{ + // Whatever tags we have open now, close them. + // We cannot carry let character formatting tags wrap paragraphs, + // since a formatting tag can close at any time and we cannot + // close the paragraph any time we want. + resetTag(TAG_ALL); + + // Flush the current paragraph HTML to the document HTML. + p->FlushParagraph(); + + // Mark this new paragraph as an explicit one (from \par etc.). + p->bExplicitParagraph = true; + + // Restore character formatting + p->oTags.push_back(OutTag(TAG_FONT_SIZE, m_nFontSize)); + p->PutTag(TAG_FONT_SIZE); + p->oTags.push_back(OutTag(TAG_FONT_COLOR, m_nFontColor)); + p->PutTag(TAG_FONT_COLOR); + p->oTags.push_back(OutTag(TAG_FONT_FAMILY, m_nFont)); + p->PutTag(TAG_FONT_FAMILY); + if (m_nFontBgColor != 0) + { + p->oTags.push_back(OutTag(TAG_BG_COLOR, m_nFontBgColor)); + p->PutTag(TAG_BG_COLOR); + } + if (m_bBold) + { + p->oTags.push_back(OutTag(TAG_BOLD, 0)); + p->PutTag(TAG_BOLD); + } + if (m_bItalic) + { + p->PutTag(TAG_ITALIC); + p->oTags.push_back(OutTag(TAG_ITALIC, 0)); + } + if (m_bUnderline) + { + p->oTags.push_back(OutTag(TAG_UNDERLINE, 0)); + p->PutTag(TAG_UNDERLINE); + } +} + +bool Level::isParagraphOpen() const +{ + return p->bExplicitParagraph; +} + +void Level::clearParagraphFormatting() +{ + // implicitly start a paragraph + if (!isParagraphOpen()) + startParagraph(); + // Since we don't implement any of the paragraph formatting tags (e.g. alignment), + // we don't clean up anything here. Note that \pard does NOT clean character + // formatting (such as font size, font weight, italics...). + p->parStyle.clearFormatting(); +} + +void Level::setParagraphDirLTR() +{ + // implicitly start a paragraph + if (!isParagraphOpen()) + startParagraph(); + p->parStyle.dir = ParStyle::DirLTR; +} + +void Level::setParagraphDirRTL() +{ + // implicitly start a paragraph + if (!isParagraphOpen()) + startParagraph(); + p->parStyle.dir = ParStyle::DirRTL; +} + +void Level::addLineBreak() +{ + p->PrintUnquoted("
    "); +} + +void Level::setAnsiCodePage(unsigned short cp) +{ + p->setAnsiCodePage(cp); +} + +void Level::reset() +{ + resetTag(TAG_ALL); + if (m_bColors){ + if (m_bColorInit){ + QColor c(m_nRed, m_nGreen, m_nBlue); + p->colors.push_back(c); + resetColors(); + } + return; + } +} + +void Level::setText(const char *str) +{ + if (m_bColors) + { + reset(); + } + else if (m_bFontTbl) + { + if ((m_nFont <= 0) || (m_nFont > p->fonts.size())) + return; + + FontDef& def = p->fonts[m_nFont-1]; + + char *pp = (char *)strchr(str, ';'); + unsigned size; + if (pp != NULL) + size = (pp - str); + else + size = strlen(str); + + if (m_bFontName) + { + def.nonTaggedName += QString::fromLatin1(str, size); + // We know we have the entire name + if (pp != NULL) + m_bFontName = false; + } + else if (!m_bTaggedFontNameOk) + { + def.taggedName += QString::fromLatin1(str, size); + if (pp != NULL) + m_bTaggedFontNameOk = true; + } + } + else + { + for (; *str; str++) + if ((unsigned char)(*str) >= ' ') break; + if (!*str) return; + p->FlushOutTags(); + text += str; + } +} + +void Level::flush() +{ + if (text.length() == 0) + return; + const char *encoding = NULL; + if (m_nEncoding){ + for (const ENCODING *c = getContacts()->getEncodings(); c->language; c++){ + if (!c->bMain) + continue; + if ((unsigned)c->rtf_code == m_nEncoding){ + encoding = c->codec; + break; + } + } + } + if (encoding == NULL) + encoding = p->encoding; + QTextCodec *codec = getContacts()->getCodecByName(encoding); + p->PrintQuoted(codec->toUnicode(text.toLocal8Bit())); + text = ""; +} + +const unsigned FONTTBL = 0; +const unsigned COLORTBL = 1; +const unsigned RED = 2; +const unsigned GREEN = 3; +const unsigned BLUE = 4; +const unsigned CF = 5; +const unsigned FS = 6; +const unsigned HIGHLIGHT = 7; +const unsigned PARD = 8; +const unsigned PAR = 9; +const unsigned I = 10; +const unsigned B = 11; +const unsigned UL = 12; +const unsigned F = 13; +const unsigned FCHARSET = 14; +const unsigned FNAME = 15; +const unsigned ULNONE = 16; +const unsigned LTRPAR = 17; +const unsigned RTLPAR = 18; +const unsigned LINE = 19; +const unsigned ANSICPG = 20; + +static char cmds[] = + "fonttbl\x00" + "colortbl\x00" + "red\x00" + "green\x00" + "blue\x00" + "cf\x00" + "fs\x00" + "highlight\x00" + "pard\x00" + "par\x00" + "i\x00" + "b\x00" + "ul\x00" + "f\x00" + "fcharset\x00" + "fname\x00" + "ulnone\x00" + "ltrpar\x00" + "rtlpar\x00" + "line\x00" + "ansicpg\x00" + "\x00"; + +int yywrap() { return 1; } + +static char h2d(char c) +{ + if ((c >= '0') && (c <= '9')) + return c - '0'; + if ((c >= 'A') && (c <= 'F')) + return (c - 'A') + 10; + if ((c >= 'a') && (c <= 'f')) + return (c - 'a') + 10; + return 0; +} + +QString RTF2HTML::Parse(const char *rtf, const char *_encoding) +{ + encoding = _encoding; + YY_BUFFER_STATE yy_current_buffer = yy_scan_string(rtf); + yy_start = 1; /* == BEGIN(INITIAL) - go to initial state since yy_start + is static and can have an old invalid value */ + rtf_ptr = rtf; + int res; + while ((res = yylex())) { + switch (res){ + case UP:{ + cur_level.flush(); + levels.push(cur_level); + break; + } + case DOWN:{ + if (!levels.empty()){ + cur_level.flush(); + cur_level.reset(); + cur_level = levels.top(); + levels.pop(); + } + break; + } + case IMG:{ + cur_level.flush(); + const char ICQIMAGE[] = "icqimage"; + const char *p = yytext + 3; + if ((strlen(p) > strlen(ICQIMAGE)) && !memcmp(p, ICQIMAGE, strlen(ICQIMAGE))){ + unsigned n = 0; + for (p += strlen(ICQIMAGE); *p; p++){ + if ((*p >= '0') && (*p <= '9')){ + n = n << 4; + n += (*p - '0'); + continue; + } + if ((*p >= 'A') && (*p <= 'F')){ + n = n << 4; + n += (*p - 'A') + 10; + continue; + } + if ((*p >= 'a') && (*p <= 'f')){ + n = n << 4; + n += (*p - 'a') + 10; + continue; + } + break; + } + if (n < 26) + PrintUnquoted("", n); + }else{ + log(L_WARN, "Unknown image %s", yytext); + } + break; + } + case SKIP: + break; + case SLASH: + cur_level.setText(yytext+1); + break; + case TXT: + cur_level.setText(yytext); + break; + case UNICODE_CHAR:{ + cur_level.flush(); + sParagraph += QChar((unsigned short)(atol(yytext + 2))); + break; + } + case HEX:{ + char s[2]; + s[0] = (h2d(yytext[2]) << 4) + h2d(yytext[3]); + s[1] = 0; + cur_level.setText(s); + break; + } + case CMD: + { + cur_level.flush(); + const char *cmd = yytext + 1; + unsigned n_cmd = 0; + unsigned cmd_size = 0; + int cmd_value = -1; + const char *p; + for (p = cmd; *p; p++, cmd_size++) + if (((*p >= '0') && (*p <= '9')) || (*p == ' ')) break; + if (*p && (*p != ' ')) cmd_value = atol(p); + for (p = cmds; *p; p += strlen(p) + 1, n_cmd++){ + if (strlen(p) > cmd_size) continue; + if (!memcmp(p, cmd, cmd_size)) break; + } + cmd += strlen(p); + switch (n_cmd){ + case FONTTBL: // fonttbl + cur_level.setFontTbl(); + break; + case COLORTBL: + cur_level.setColors(); + break; + case RED: + cur_level.setRed(cmd_value); + break; + case GREEN: + cur_level.setGreen(cmd_value); + break; + case BLUE: + cur_level.setBlue(cmd_value); + break; + case CF: + cur_level.setFontColor(cmd_value); + break; + case FS: + cur_level.setFontSizeHalfPoints(cmd_value); + break; + case HIGHLIGHT: + cur_level.setFontBgColor(cmd_value); + break; + case PARD: + cur_level.clearParagraphFormatting(); + break; + case PAR: + cur_level.startParagraph(); + break; + case I: + cur_level.setItalic(cmd_value != 0); + break; + case B: + cur_level.setBold(cmd_value != 0); + break; + case UL: + cur_level.setUnderline(cmd_value != 0); + break; + case ULNONE: + cur_level.setUnderline(false); + break; + case F: + // RTF fonts are 0-based; our font index is 1-based. + cur_level.setFont(cmd_value+1); + break; + case FCHARSET: + cur_level.setEncoding(cmd_value); + break; + case FNAME: + cur_level.setFontName(); + break; + case LTRPAR: + cur_level.setParagraphDirLTR(); + break; + case RTLPAR: + cur_level.setParagraphDirRTL(); + break; + case LINE: + cur_level.addLineBreak(); + case ANSICPG: + cur_level.setAnsiCodePage(cmd_value); + } + break; + } + } + }; + yy_delete_buffer(yy_current_buffer); + yy_current_buffer = NULL; + FlushParagraph(); + return s; +} + +bool ICQClient::parseRTF(const QByteArray &rtf, Contact *contact, QString &res) +{ + const char _RTF[] = "{\\rtf"; + // codec to use when no other information is in the rtf stream + QTextCodec *codec = getContacts()->getCodec(contact); + if (!qstrncmp(rtf.data(), _RTF, strlen(_RTF))) + { + RTF2HTML p; + res = p.Parse(rtf.data(), codec->name().data()); + return true; + } + res = codec->toUnicode(rtf); + return false; +} + diff --git a/plugins/icq/rtfgen.cpp b/plugins/icq/rtfgen.cpp new file mode 100644 index 0000000..4c91814 --- /dev/null +++ b/plugins/icq/rtfgen.cpp @@ -0,0 +1,1112 @@ +/*************************************************************************** + rtfgen.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifdef WIN32 +#include +#endif + +#include +#include +#include +#include + +#include +#include + +#include "html.h" +#include "icons.h" +#include "unquot.h" +#include "log.h" + +#include "icqclient.h" +#include "polling.h" + + +#include "icqclient.h" + +using namespace std; +using namespace SIM; + +// Represents a character (as opposed to paragraph) style +struct CharStyle +{ + CharStyle() : + colorIdx(-1), + sizePt(-1), + faceIdx(-1), + bold(false), + italic(false), + underline(false), + bgColorIdx(-1) + {} + + // Returns the diff from 'old' CharStyle to this CharStyle as RTF commands. + QString getDiffRTF(const CharStyle& old) const; + + bool operator==(const CharStyle& that) + { + return (colorIdx == that.colorIdx && + sizePt == that.sizePt && + faceIdx == that.faceIdx && + bold == that.bold && + italic == that.italic && + underline == that.underline && + bgColorIdx == that.bgColorIdx); + } + + bool operator!=(const CharStyle& that) + { + return !(*this == that); + } + + signed colorIdx; + signed sizePt; // size in points + signed faceIdx; + bool bold; + bool italic; + bool underline; + signed bgColorIdx; +}; + +QString CharStyle::getDiffRTF(const CharStyle& old) const +{ + QString rtf; + + if (old.colorIdx != colorIdx) + { + rtf += QString("\\cf%1").arg(colorIdx); + } + if (old.sizePt != sizePt) + { + rtf += QString("\\fs%1").arg(sizePt * 2); + } + if (old.faceIdx != faceIdx) + { + rtf += QString("\\f%1").arg(faceIdx); + } + if (old.bold != bold) + { + rtf += QString("\\b%1").arg(bold ? 1 : 0); + } + if (old.italic != italic) + { + rtf += QString("\\i%1").arg(italic ? 1 : 0); + } + if (old.underline != underline) + { + rtf += QString("\\ul%1").arg(underline ? 1 : 0); + } + if (old.bgColorIdx != bgColorIdx) + { + rtf += QString("\\highlight%1").arg(bgColorIdx); + } + + return rtf; +} + +class Tag +{ +public: + Tag() +: pCharStyle(NULL) + { + } + + ~Tag() + { + if (pCharStyle != NULL) + delete pCharStyle; + } + + void setCharStyle(const CharStyle& charStyle) + { + if (pCharStyle == NULL) + pCharStyle = new CharStyle(); + *pCharStyle = charStyle; + } + + bool hasCharStyle() + { + return pCharStyle != NULL; + } + +public: + QString name; + CharStyle* pCharStyle; +}; + +class TagStack : private list +{ +public: + TagStack() + { + } + + Tag* getTopTagWithCharStyle() + { + iterator it = end(), it_begin = begin(); + while(it != it_begin) + { + it--; + if (it->hasCharStyle()) + return &(*it); + } + return NULL; + } + + Tag* pushNew() + { + push_back(Tag()); + return &(back()); + } + + Tag* peek() + { + if (!empty()) + return &(back()); + else + return NULL; + } + + void pop() + { + pop_back(); + } +}; + +int htmlFontSizeToPt(int fontSize, int baseSize = 12) +{ + // Based on Qt's code (so we'd be compatible with QTextEdit) + int pt; + + switch ( fontSize ) { + case 1: + pt = 7*baseSize/10; + break; + case 2: + pt = (8 * baseSize) / 10; + break; + case 4: + pt = (12 * baseSize) / 10; + break; + case 5: + pt = (15 * baseSize) / 10; + break; + case 6: + pt = 2 * baseSize; + break; + case 7: + pt = (24 * baseSize) / 10; + break; + default: + pt = baseSize; + } + + return pt; +} + +class RTFGenParser : public HTMLParser +{ +public: + RTFGenParser(ICQClient *client, const QColor& foreColor, Contact *contact, unsigned max_size); + QByteArray parse(const QString &text); + // Returns the color's index in the colors table, adding the color if necessary. + int getColorIdx(const QColor &color); + // Returns the font face's index in the fonts table, adding the font face if necessary. + int getFontFaceIdx(const QString &fontFace); + unsigned textPos; + stack tags; + stack options; + unsigned m_res_size; +protected: + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &attrs); + virtual void tag_end(const QString &tag); + QByteArray res; + ICQClient *m_client; + Contact *m_contact; + QTextCodec *m_codec; + bool m_bSpace; + unsigned m_max_size; + + TagStack m_tags; + + // Used to compose RTF tables of unique font names and colors. + list m_fontFaces; + list m_colors; + + QColor m_foreColor; + // The character position in 'res' string of the last paragraph start + // (right after \par). Useful for inserting paragraph formatting + // after you wrote past the paragraph mark. + unsigned m_lastParagraphPos; + enum { + DirUnknown, // Initial BiDi dir; if not explicitly specified, + // its determined from the first "strong character". + DirLTR, + DirRTL + } m_paragraphDir; +}; + +RTFGenParser::RTFGenParser(ICQClient *client, const QColor& foreColor, Contact *contact, unsigned max_size) +{ + m_client = client; + m_contact = contact; + m_foreColor = foreColor; + m_max_size = max_size; + m_lastParagraphPos = 0; + m_paragraphDir = DirUnknown; +} + +#ifdef WIN32 + +struct rtf_cp +{ + unsigned cp; + unsigned charset; +}; + +rtf_cp rtf_cps[] = + { + { 737, 161 }, + { 855, 204 }, + { 857, 162 }, + { 862, 177 }, + { 864, 180 }, + { 866, 204 }, + { 869, 161 }, + { 875, 161 }, + { 932, 128 }, + { 1026, 162 }, + { 1250, 238 }, + { 1251, 204 }, + { 1253, 161 }, + { 1254, 162 }, + { 1255, 177 }, + { 0, 0 } + }; + +#endif + +int RTFGenParser::getColorIdx(const QColor& color) +{ + int i = 0; + for (list::iterator it = m_colors.begin(); it != m_colors.end(); ++it, i++){ + if ((*it) == color) + return i + 1; + } + m_colors.push_back(color); + return m_colors.size(); // the colors table is 1-based +} + +int RTFGenParser::getFontFaceIdx(const QString& fontFace) +{ + int i = 0; + for (list::iterator it = m_fontFaces.begin(); it != m_fontFaces.end(); ++it, i++){ + if ((*it) == fontFace) + return i; + } + m_fontFaces.push_back(fontFace); + return m_fontFaces.size() - 1; +} + +QByteArray RTFGenParser::parse(const QString &text) +{ + res.clear(); + m_res_size = 0; + m_codec = getContacts()->getCodec(m_contact); + int charset = 0; + for (const ENCODING *c = getContacts()->getEncodings(); c->language; c++){ + if (!qstricmp(c->codec, m_codec->name())){ + charset = c->rtf_code; + break; + } + } +#ifdef WIN32 + if ((charset == 0) && !qstricmp(m_codec->name(), "system")){ + char buff[256]; + int res = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE, (char*)&buff, sizeof(buff)); + if (res){ + unsigned codepage = atol(buff); + if (codepage){ + for (const rtf_cp *c = rtf_cps; c->cp; c++){ + if (c->cp == codepage) + charset = c->charset; + } + } + } + } +#endif + unsigned ansicpg = 0; + const char *send_encoding = 0; + m_codec = NULL; + if (charset){ + for (const ENCODING *c = getContacts()->getEncodings(); c->language; c++){ + if ((c->rtf_code == charset) && c->bMain){ + send_encoding = c->codec; + m_codec = getContacts()->getCodecByName(send_encoding); + ansicpg = c->cp_code; + break; + } + } + } + + // Add defaults to the tables + m_fontFaces.push_back("MS Sans Serif"); + m_colors.push_back(m_foreColor); + // Create a "fake" tag which'll serve as the default style + CharStyle style; + style.faceIdx = 0; + style.colorIdx = 1; // colors are 1-based (0 = default) + style.sizePt = 12; // default according to Microsoft + Tag& tag = *(m_tags.pushNew()); + tag.setCharStyle(style); + + // Assume we go immediately after a tag. + m_bSpace = true; + HTMLParser::parse(text); + + QByteArray s; + s = "{\\rtf1\\ansi"; + if (ansicpg){ + s += "\\ansicpg"; + s += QByteArray::number(ansicpg); + } + s += "\\deff0\r\n"; + s += "{\\fonttbl"; + unsigned n = 0; + for (list::iterator it_face = m_fontFaces.begin(); it_face != m_fontFaces.end(); it_face++, n++){ + s += "{\\f"; + s += QByteArray::number(n); + QString face = (*it_face); + if (face.indexOf("Times") >= 0){ + s += "\\froman"; + }else if (face.indexOf("Courier") >= 0){ + s += "\\fmodern"; + }else{ + s += "\\fswiss"; + } + if (charset){ + s += "\\fcharset"; + s += QByteArray::number(charset); + } + s += ' '; + int pos = face.indexOf(QRegExp(" +[")); + if (pos > 0) + face = face.left(pos); + s += face.toLatin1(); + s += ";}"; + } + s += "}\r\n"; + s += "{\\colortbl ;"; + for (list::iterator it_colors = m_colors.begin(); it_colors != m_colors.end(); ++it_colors){ + QColor c = *it_colors; + s += "\\red"; + s += QByteArray::number(c.red()); + s += "\\green"; + s += QByteArray::number(c.green()); + s += "\\blue"; + s += QByteArray::number(c.blue()); + s += ';'; + } + s += "}\r\n"; + s += "\\viewkind4\\pard"; + s += style.getDiffRTF(CharStyle()).toUtf8(); + s += res; + s += "\r\n}\r\n"; + + log(L_DEBUG, "Resulting RTF: %s", s.data()); + + return s; +} + +void RTFGenParser::text(const QString &text) +{ + if (m_res_size) + return; + unsigned size = res.length(); + if (size > m_max_size){ + textPos = start_pos; + m_res_size = size; + return; + } + for (int i = 0; i < (int)(text.length()); i++){ + QChar c = text[i]; + if (c.isSpace()){ + unsigned size = res.length(); + if (size > m_max_size){ + textPos = start_pos + i; + m_res_size = size; + return; + } + } + // In Qt, unless you force the paragraph direction with (Left/Right) + // Ctrl-Shift (also known as Key_Direction_L and Key_Direction_R), + // the P tag won't have a DIR attribute at all. In such cases, unlike + // HTML, Qt will render the paragraph LTR or RTL according to the + // first strong character (as Unicode TR#9 defines). Thus, if the + // direction isn't known yet, we check each character till we find + // a strong one. + if ((m_lastParagraphPos != 0) && (m_paragraphDir == DirUnknown)) + { + switch(c.direction()) + { + case QChar::DirL: + res.insert(m_lastParagraphPos, "\\ltrpar"); + m_paragraphDir = DirLTR; + break; + case QChar::DirR: + res.insert(m_lastParagraphPos, "\\rtlpar"); + m_paragraphDir = DirRTL; + break; + default: // to avoid warnings + break; + } + } + + unsigned short u = c.unicode(); + if (c == '\r' || c == '\n') + continue; + if ((c == '{') || (c == '}') || (c == '\\')){ + char b[5]; + snprintf(b, sizeof(b), "\\\'%02x", u & 0xFF); + res += b; + m_bSpace = false; + continue; + } + if (u < 0x80){ + if (m_bSpace) + res += ' '; + res += (char)u; + m_bSpace = false; + continue; + } + QString s; + s += c; + if (m_codec){ + QByteArray plain = m_codec->fromUnicode(s); + if ((plain.length() == 1) && (m_codec->toUnicode(plain) == s)){ + char b[5]; + snprintf(b, sizeof(b), "\\\'%02x", plain[0] & 0xFF); + res += b; + m_bSpace = false; + continue; + } + } + res += "\\u"; + res += QByteArray::number(s[0].unicode()); + res += '?'; + m_bSpace = false; + } +} + +static const char *def_smiles[] = + { + ":-)", + ":-0", + ":-|", + ":-/", + ":-(", + ":-{}", + ":*)", + ":'-(", + ";-)", + ":-@", + ":-\")", + ":-X", + ":-P", + "8-)", + "O:-)", + ":-D", + "*ANNOYED*", + "*DISGUSTED*", + "*DROOLING*", + "*GIGGLING*", + "*JOKINGLY*", + "*SHOCKED*", + "*WHINING*", + "*SURPRISED*", + "*SURPRISED*", + "*IN LOVE*" + }; + +void RTFGenParser::tag_start(const QString &tagName, const list &attrs) +{ + if (m_res_size) + return; + CharStyle parentStyle, style; + { + Tag* pParentTag = m_tags.getTopTagWithCharStyle(); + if (pParentTag != NULL) + { + parentStyle = *(pParentTag->pCharStyle); + } + } + style = parentStyle; + if ((tagName == "b") || (tagName == "i") || (tagName == "u") || + (tagName == "font") || (tagName == "p") || (tagName == "span")){ + QString tag = tagName; + QString option; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString key = *it; + ++it; + QString value = *it; + option += ' '; + option += key; + if (!value.isEmpty()){ + option += "=\""; + option += value; + option += "\""; + } + } + tags.push(tag); + options.push(option); + } + + if (tagName == "b"){ + style.bold = true; + } + else if (tagName == "i"){ + style.italic = true; + } + else if (tagName == "u"){ + style.underline = true; + } + else if (tagName == "font"){ + for (list::const_iterator it = attrs.begin(); it != attrs.end(); it++){ + QString name = (*it); + ++it; + QString value = (*it); + if (name == "color") + { + style.colorIdx = getColorIdx(value); + } + else if (name == "face") + { + style.faceIdx = getFontFaceIdx(value); + } + else if (name == "size") + { + int logicalSize = value.toInt(); + if (value[0] == '+' || value[0] == '-') + logicalSize += 3; + if (logicalSize < 1) + logicalSize = 1; + else if (logicalSize > 7) + logicalSize = 7; + style.sizePt = htmlFontSizeToPt(logicalSize); + } + } + } + else if (tagName == "p"){ + m_paragraphDir = DirUnknown; + m_lastParagraphPos = res.length(); + m_bSpace = true; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = it->toLower(); + ++it; + QString value = (*it); + if (name == "dir") + { + QString dir = value.toLower(); + if (dir == "ltr") + { + res += "\\ltrpar"; + m_paragraphDir = DirLTR; + } + if (dir == "rtl") + { + res += "\\rtlpar"; + m_paragraphDir = DirRTL; + } + } + } + + } + else if (tagName == "br"){ + res += "\\line"; + m_bSpace = true; + } + else if (tagName == "img"){ + QString src; + QString alt; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = (*it); + ++it; + QString value = (*it); + if (name == "src"){ + src = value; + break; + } + if (name == "alt"){ + alt = value; + break; + } + } + if (src.startsWith("sim:icons/")){ + QStringList smiles = getIcons()->getSmile(src.mid(10)); + for (QStringList::iterator its = smiles.begin(); its != smiles.end(); ++its){ + QString s = *its; + for (unsigned nSmile = 0; nSmile < 26; nSmile++){ + if (s != def_smiles[nSmile]) + continue; + res += "<##icqimage00"; + char buf[4]; + sprintf(buf, "%02X", nSmile); + res += buf; + res += '>'; + return; + } + } + if (!smiles.empty()){ + text(smiles.front()); + return; + } + } + text(alt); + return; + } + + // Process attributes which all tags share. + + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = it->toLower(); + ++it; + QString value = (*it); + + // Any tag might have a STYLE. + if (name == "style"){ + // A really crude CSS parser goes here: + QRegExp cssReNum("[0-9]+"); + list cssProp = parseStyle(value); + for (list::iterator it = cssProp.begin(); it != cssProp.end(); ++it) + { + QString cssPropName = *it; + ++it; + if (it == cssProp.end()) + break; + QString cssPropValue = *it; + if (cssPropName == "font-family") + { + style.faceIdx = getFontFaceIdx(cssPropValue); + } + else if (cssPropName == "font-size") + { + cssPropValue = cssPropValue.toLower(); + int length; + if(cssReNum.indexIn(cssPropValue) != -1) + { + length = cssReNum.matchedLength(); + float number = cssPropValue.left(length).toFloat(); + QString type = cssPropValue.mid(length); + if (type == "pt") + { + style.sizePt = static_cast(number); + } + else if (type == "px") + { + // for now, handle like 'pt', though it's wrong + style.sizePt = static_cast(number); + } + else if (type == "%") + { + style.sizePt = static_cast(parentStyle.sizePt * (number/100)); + } + // We don't handle 'cm', 'em' etc. + } + else if (cssPropValue == "smaller") + { + // FONT SIZE=3 is 'normal', 2 is 'smaller' + style.sizePt = htmlFontSizeToPt(2, parentStyle.sizePt); + } + else if (cssPropValue == "larger") + { + // FONT SIZE=3 is 'normal', 4 is 'larger' + style.sizePt = htmlFontSizeToPt(4, parentStyle.sizePt); + } + + // We don't handle 'small', 'medium' etc. It goes too far + // beyond our basic implementation. + // Also, empty 'type' would be invalid CSS, thus ignored. + } + else if (cssPropName == "font-style") + { + style.italic = (cssPropValue.toLower() == "italic"); + } + else if (cssPropName == "font-weight") + { + style.bold = (cssPropValue.toInt() >= 600); + } + else if (cssPropName == "text-decoration") + { + style.underline = (cssPropValue.toLower() == "underline"); + } + else if (cssPropName == "color") + { + style.colorIdx = getColorIdx(cssPropValue); + } + else if (cssPropName == "background-color") + { + style.bgColorIdx = getColorIdx(cssPropValue); + } + } + } + } + + Tag& tag = *(m_tags.pushNew()); + tag.name = tagName; + // Check if anything changed in the style. + // Only then the tag deserves getting a charStyle. + if (parentStyle != style) + { + QString rtf = style.getDiffRTF(parentStyle); + if (!rtf.isEmpty()) + { + res += rtf.toUtf8(); + m_bSpace = true; + } + tag.setCharStyle(style); + } +} + +void RTFGenParser::tag_end(const QString &tagName) +{ + if (m_res_size) + return; + if ((tagName == "b") || (tagName == "i") || (tagName == "u") || + (tagName == "font") || (tagName == "p") || (tagName == "span")){ + while (!tags.empty()){ + QString tag = tags.top(); + tags.pop(); + options.pop(); + if (tag == tagName) + break; + } + } + + // Roll back until we find our tag. + bool found = false; + for(Tag* pTag = m_tags.peek(); pTag != NULL && !found; pTag = m_tags.peek()) + { + if (pTag->name == tagName) + { + found = true; + } + + if (pTag->hasCharStyle()) + { + CharStyle style = *(pTag->pCharStyle); + + // We must pop here, so that getTopTagWithCharStyle will find a parent tag. + m_tags.pop(); + pTag = NULL; // to avoid confusion + + Tag* pParentTag = m_tags.getTopTagWithCharStyle(); + if (pParentTag != NULL) + { + if (pParentTag->hasCharStyle()) + { + CharStyle* pParentStyle = pParentTag->pCharStyle; + + // Roll back the character style. This is regardless of whether + // we found the closed tag; we just collapse all styles on our way. + QString rtf = pParentStyle->getDiffRTF(style); + if (!rtf.isEmpty()) + { + res += rtf.toUtf8(); + m_bSpace = true; + } + } + } + } + else // if this tag has no char style attached + { + m_tags.pop(); // just pop the tag out + pTag = NULL; // to avoid confusion + } + + if (found) + { + if (tagName.toLower() == "p") + { + res += "\\par"; + m_bSpace = true; + } + } + } +} + +QByteArray ICQClient::createRTF(QString &text, QString &part, unsigned long foreColor, Contact *contact, unsigned max_size) +{ + RTFGenParser p(this, foreColor, contact, max_size); + QByteArray res = p.parse(text); + if (p.m_res_size == 0){ + part = text; + text.clear(); + return res; + } + QString endTags; + QString startTags; + while (!p.tags.empty()){ + QString tag = p.tags.top(); + QString option = p.options.top(); + p.tags.pop(); + p.options.pop(); + endTags += "'; + startTags = '<' + tag + option + '>' + startTags; + } + part = text.left(p.textPos) + endTags; + text = startTags + text.mid(p.textPos); + return res; +} + +class ImageParser : public HTMLParser +{ +public: + ImageParser(bool bIcq); + QString parse(const QString &text); +protected: + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &attrs); + virtual void tag_end(const QString &tag); + void startBody(); + void endBody(); + QByteArray res; + bool m_bBody; + bool m_bIcq; +}; + +ImageParser::ImageParser(bool bIcq) +{ + m_bIcq = bIcq; +} + +QString ImageParser::parse(const QString &text) +{ + res = 0; //QString::null; + startBody(); + HTMLParser::parse(text); + endBody(); + return res; +} + +void ImageParser::startBody() +{ + m_bBody = true; + res = 0;//QString::null; +} + +void ImageParser::endBody() +{ + if (m_bBody) + m_bBody = false; +} + +void ImageParser::text(const QString &text) +{ + if (!m_bBody) + return; + res += quoteString(text).toUtf8(); +} + +void ImageParser::tag_start(const QString &tag, const list &attrs) +{ + QString oTag = tag; + + if (tag == "html") + { + res = 0; //QString::null; + m_bBody = false; + return; + } + if (tag == "body"){ + startBody(); + // We still want BODY's styles + oTag = "span"; + } + if (!m_bBody) + return; + if (tag == "img"){ + QString src; + QString alt; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + if (name == "src"){ + src = value; + break; + } + if (name == "alt"){ + alt = value; + break; + } + } + if (src.left(10) != "sim:icons/"){ + text(alt); + return; + } + QStringList smiles = getIcons()->getSmile(src.mid(5)); + if (smiles.empty()){ + text(alt); + return; + } + if (m_bIcq){ + QStringList::ConstIterator its; + for (its = smiles.constBegin(); its != smiles.constEnd(); ++its){ + for (unsigned nSmile = 0; nSmile < 26; nSmile++){ + if ((*its) != def_smiles[nSmile]) + continue; + res += ""; + return; + } + } + } + text(smiles.front()); + return; + } + res += '<'; + res += oTag.toUtf8(); + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + res += ' '; + res += name.toUpper().toUtf8(); + if (!value.isEmpty()){ + res += "=\""; + res += quoteString(value).toUtf8(); + res += "\""; + } + } + res += '>'; +} + +void ImageParser::tag_end(const QString &tag) +{ + QString oTag = tag; + if (!m_bBody) + return; + if (tag == "body"){ + endBody(); + oTag = "span"; + } + res += "'; +} + +QString ICQClient::removeImages(const QString &text, bool bIcq) +{ + ImageParser p(bIcq); + return p.parse(text); +} + +class BgParser : public HTMLParser +{ +public: + BgParser(); + QString parse(const QString &text); + unsigned bgColor; +protected: + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &attrs); + virtual void tag_end(const QString &tag); + QString res; + bool m_bBody; +}; + +BgParser::BgParser() +{ + bgColor = 0xFFFFFF; + m_bBody = true; +} + +QString BgParser::parse(const QString &text) +{ + res = QString::null; + HTMLParser::parse(text); + return res; +} + +void BgParser::text(const QString &text) +{ + if (!m_bBody) + return; + res += quoteString(text); +} + +void BgParser::tag_start(const QString &tag, const list &attrs) +{ + if (tag == "body"){ + m_bBody = true; + res = QString::null; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + if (name.toLower() == "bgcolor"){ + QColor c(value); + bgColor = c.rgb(); + } + } + return; + } + if (!m_bBody) + return; + res += '<'; + res += tag; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + res += ' '; + res += name; + if (!value.isEmpty()){ + res += "=\""; + res += quoteString(value); + res += "\""; + } + } + res += '>'; +} + +void BgParser::tag_end(const QString &tag) +{ + if (tag == "body"){ + m_bBody = false; + return; + } + if (!m_bBody) + return; + res += "'; +} + +unsigned ICQClient::clearTags(QString &text) +{ + BgParser p; + text = p.parse(text); + return p.bgColor; +} + + diff --git a/plugins/icq/securedlg.cpp b/plugins/icq/securedlg.cpp new file mode 100644 index 0000000..7af7367 --- /dev/null +++ b/plugins/icq/securedlg.cpp @@ -0,0 +1,109 @@ +/*************************************************************************** + securedlg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "securedlg.h" +#include "icqclient.h" +#include "icqmessage.h" + +#include +#include +#include +#include +#include + +using namespace SIM; + +SecureDlg::SecureDlg(ICQClient *client, unsigned contact, ICQUserData *data) + : QDialog(NULL) +{ + setupUi(this); + setObjectName("securedlg"); + setModal(false); + setAttribute(Qt::WA_DeleteOnClose); + SET_WNDPROC("secure") + setWindowIcon(Icon("encrypted")); + setButtonsPict(this); + setWindowTitle(windowTitle()); + m_client = client; + m_contact = contact; + m_data = data; + m_msg = NULL; + connect(btnCancel, SIGNAL(clicked()), this, SLOT(close())); + QTimer::singleShot(0, this, SLOT(start())); +} + +SecureDlg::~SecureDlg() +{ + if (m_msg) + EventMessageCancel(m_msg).process(); +} + +void SecureDlg::start() +{ + m_msg = new Message(MessageOpenSecure); + m_msg->setContact(m_contact); + m_msg->setClient(m_client->dataName(m_data)); + m_msg->setFlags(MESSAGE_NOHISTORY); + if (!static_cast(m_client)->send(m_msg, m_data)){ + delete m_msg; + error(I18N_NOOP("Request secure channel fail")); + } +} + +bool SecureDlg::processEvent(Event *e) +{ + switch(e->type()) { + case eEventContact: { + EventContact *ec = static_cast(e); + switch(ec->action()) { + case EventContact::eDeleted: { + close(); + break; + } + default: + break; + } + break; + } + case eEventMessageSent: { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg != m_msg) + return false; + QString err = msg->getError(); + if (!err.isEmpty()){ + error(err); + }else{ + m_msg = NULL; + close(); + } + return true; + } + default: + break; + } + return false; +} + +void SecureDlg::error(const QString &err) +{ + QString errText = i18n(err); + m_msg = NULL; + lblError->setText(errText); + btnCancel->setText(i18n("&Close")); +} diff --git a/plugins/icq/securedlg.h b/plugins/icq/securedlg.h new file mode 100644 index 0000000..369e18d --- /dev/null +++ b/plugins/icq/securedlg.h @@ -0,0 +1,45 @@ +/*************************************************************************** + securedlg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SECUREDLG_H +#define _SECUREDLG_H + +#include "ui_securedlgbase.h" +#include "event.h" + +class ICQClient; +struct ICQUserData; + +class SecureDlg : public QDialog, public Ui::SecureDlgBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + SecureDlg(ICQClient *client, unsigned contact, ICQUserData *data); + ~SecureDlg(); + ICQClient *m_client; + unsigned m_contact; + ICQUserData *m_data; +protected slots: + void start(); +protected: + virtual bool processEvent(SIM::Event *e); + void error(const QString &err); + SIM::Message *m_msg; +}; + +#endif + diff --git a/plugins/icq/securedlgbase.ui b/plugins/icq/securedlgbase.ui new file mode 100644 index 0000000..12907a2 --- /dev/null +++ b/plugins/icq/securedlgbase.ui @@ -0,0 +1,110 @@ + + + + + SecureDlgBase + + + + 0 + 0 + 415 + 151 + + + + Secure chanel request + + + + 11 + + + 6 + + + + + Secure channel is established using SSL with Diffie-Hellman key exchange and the TLS version 1 protocol. + +This only works with other SIM and Licq clients + + + Qt::AlignCenter + + + true + + + + + + + + true + + + + + + + Qt::AlignCenter + + + false + + + + + + + 0 + + + 6 + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &Cancel + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + qPixmapFromMimeSource + diff --git a/plugins/icq/snac.cpp b/plugins/icq/snac.cpp new file mode 100644 index 0000000..99d6c98 --- /dev/null +++ b/plugins/icq/snac.cpp @@ -0,0 +1,22 @@ + +#include "snac.h" +#include "icqclient.h" + +SnacHandler::SnacHandler(ICQClient* client, unsigned short snac) : m_snac(snac) +{ + m_client = client; +} + +SnacHandler::~SnacHandler() +{ +} + +void SnacHandler::snac(const unsigned short subtype, bool bMsgID, bool bType) +{ + m_client->snac(m_snac, subtype, bMsgID, bType); +} + +ICQClient* SnacHandler::client() +{ + return m_client; +} diff --git a/plugins/icq/snac.h b/plugins/icq/snac.h new file mode 100644 index 0000000..7ec40f6 --- /dev/null +++ b/plugins/icq/snac.h @@ -0,0 +1,25 @@ + +#ifndef _SNAC_H +#define _SNAC_H + +class ICQClient; +class ICQBuffer; +class SnacHandler +{ +public: + SnacHandler(ICQClient* client, unsigned short snac); + virtual ~SnacHandler(); + + unsigned short getType() { return m_snac; }; + virtual bool process(unsigned short subtype, ICQBuffer* buf, unsigned short seq) = 0; + + void snac(const unsigned short subtype, bool bMsgID = true, bool bType = false); + + ICQClient* client(); +protected: + unsigned short m_snac; + ICQClient* m_client; + +}; + +#endif diff --git a/plugins/icq/verifydlg.cpp b/plugins/icq/verifydlg.cpp new file mode 100644 index 0000000..a7a072e --- /dev/null +++ b/plugins/icq/verifydlg.cpp @@ -0,0 +1,55 @@ +/*************************************************************************** + verifydlg.cpp - description + ------------------- + begin : Sun Nov 27 2005 + copyright : (C) 2005 by Andrey Rahmatullin + email : wrar@altlinux.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include + +#include "log.h" + +#include "verifydlg.h" + +using namespace SIM; + +VerifyDlg::VerifyDlg(QWidget *parent, const QPixmap& picture) + : QDialog(parent) +{ + setupUi(this); + setModal(false); + QTimer::singleShot(0, this, SLOT(changed())); + connect(edtVerify, SIGNAL(textChanged(const QString&)), SLOT(changed(const QString&))); + lblPicture->setPixmap(picture); + lblPicture->adjustSize(); + log(L_DEBUG, "Image size: %dx%d", picture.width(), picture.height()); + edtVerify->setFocus(); +} + +VerifyDlg::~VerifyDlg() +{ + +} + +void VerifyDlg::changed() +{ + changed(QString()); +} + +void VerifyDlg::changed(const QString& text) +{ + buttonOk->setEnabled(!text.isEmpty()); +} diff --git a/plugins/icq/verifydlg.h b/plugins/icq/verifydlg.h new file mode 100644 index 0000000..312516a --- /dev/null +++ b/plugins/icq/verifydlg.h @@ -0,0 +1,41 @@ +/*************************************************************************** + verifydlg.h - description + ------------------- + begin : Sun Nov 27 2005 + copyright : (C) 2005 by Andrey Rahmatullin + email : wrar@altlinux.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _VERIFYDLG_H +#define _VERIFYDLG_H + +#include "event.h" +#include "ui_verifydlgbase.h" +#include +#include + +class QPixmap; + +class VerifyDlg : public QDialog, public Ui::VerifyDlgBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + VerifyDlg(QWidget *parent, const QPixmap& picture); + ~VerifyDlg(); + const QString getVerifyString() const { return edtVerify->text(); }; +protected slots: + void changed(); + void changed(const QString& text); +}; + +#endif + diff --git a/plugins/icq/verifydlgbase.ui b/plugins/icq/verifydlgbase.ui new file mode 100644 index 0000000..79644d6 --- /dev/null +++ b/plugins/icq/verifydlgbase.ui @@ -0,0 +1,262 @@ + + + + + VerifyDlgBase + + + + 0 + 0 + 317 + 231 + + + + Verification Dialog + + + true + + + + + + + + + 40 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + true + + + + 0 + 0 + 0 + 0 + + + + + 240 + 100 + + + + true + + + false + + + + + + + + 40 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + + + + 40 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + Please retype the letters from the picture above: + + + edtVerify + + + false + + + + + + + + 40 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + + + + 40 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + + + 40 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + + 20 + 12 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + 0 + + + 6 + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &OK + + + + + + true + + + true + + + + + + + &Cancel + + + + + + true + + + + + + + + + qPixmapFromMimeSource + + + buttonOk + clicked() + VerifyDlg + accept() + + + buttonCancel + clicked() + VerifyDlg + reject() + + + diff --git a/plugins/icq/warndlg.cpp b/plugins/icq/warndlg.cpp new file mode 100644 index 0000000..1800afe --- /dev/null +++ b/plugins/icq/warndlg.cpp @@ -0,0 +1,99 @@ +/*************************************************************************** + warndlg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "warndlg.h" +#include "simgui/ballonmsg.h" +#include "icqclient.h" +#include "icqmessage.h" +#include "contacts/contact.h" + +#include +#include +#include +#include +#include +#include + +using namespace SIM; + +WarnDlg::WarnDlg(QWidget *parent, ICQUserData *data, ICQClient *client) + : QDialog(parent) +{ + setupUi(this); + setModal(true); + setAttribute(Qt::WA_DeleteOnClose); + SET_WNDPROC("warn") + setWindowIcon(Icon("error")); + setButtonsPict(this); + setWindowTitle(windowTitle()); + m_client = client; + m_data = data; + m_msg = NULL; + m_contact = 0; + Contact *contact; + if (m_client->findContact(client->screen(data), NULL, false, contact)) + m_contact = contact->id(); + lblInfo->setText(lblInfo->text().replace(QRegExp("\\%1"), m_client->screen(data))); + chkAnon->setChecked(m_client->getWarnAnonimously()); +} + +WarnDlg::~WarnDlg() +{ + if (m_msg) + EventMessageCancel(m_msg).process(); +} + +void WarnDlg::accept() +{ + m_msg = new WarningMessage; + m_msg->setClient(m_client->dataName(m_data)); + m_msg->setContact(m_contact); + m_msg->setAnonymous(chkAnon->isChecked()); + m_client->setWarnAnonimously(chkAnon->isChecked()); + if (!((Client*)m_client)->send(m_msg, m_data)){ + delete m_msg; + m_msg = NULL; + showError(I18N_NOOP("Send failed")); + return; + } + buttonOk->setEnabled(false); +} + +void WarnDlg::showError(const char *error) +{ + buttonOk->setEnabled(true); + BalloonMsg::message(i18n(error), buttonOk); +} + +bool WarnDlg::processEvent(Event *e) +{ + if (e->type() == eEventMessageSent){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg == m_msg){ + m_msg = false; + QString err = msg->getError(); + if (!err.isEmpty()){ + showError(qPrintable(err)); + }else{ + QTimer::singleShot(0, this, SLOT(close())); + } + } + } + return false; +} diff --git a/plugins/icq/warndlg.h b/plugins/icq/warndlg.h new file mode 100644 index 0000000..78cb5f7 --- /dev/null +++ b/plugins/icq/warndlg.h @@ -0,0 +1,43 @@ +/*************************************************************************** + warndlg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _WARNDLG_H +#define _WARNDLG_H + +#include "ui_warndlgbase.h" +#include "icqclient.h" + +class WarningMessage; + +class WarnDlg : public QDialog, public Ui::WarnDlgBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + WarnDlg(QWidget *parent, ICQUserData *data, ICQClient *client); + ~WarnDlg(); +protected: + void accept(); + virtual bool processEvent(SIM::Event *e); + void showError(const char*); + ICQClient *m_client; + ICQUserData *m_data; + unsigned m_contact; + WarningMessage *m_msg; +}; + +#endif + diff --git a/plugins/icq/warndlgbase.ui b/plugins/icq/warndlgbase.ui new file mode 100644 index 0000000..6a8f817 --- /dev/null +++ b/plugins/icq/warndlgbase.ui @@ -0,0 +1,128 @@ + + + + + WarnDlgBase + + + + 0 + 0 + 374 + 193 + + + + Send warning + + + true + + + + 11 + + + 6 + + + + + Click OK to send warning to %1. This will raise %1's warning and limit his or her activity. Do this only if %1 has done something to merit a warning. + + + Qt::AlignVCenter|Qt::AlignLeft + + + true + + + + + + + Warn &anonymously + + + + + + + Check this if you don't want your screen name revealed. +Anonymous warnings are less severe. + + + Qt::AlignTop|Qt::AlignLeft + + + true + + + + + + + 0 + + + 6 + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + qPixmapFromMimeSource + + + buttonOk + clicked() + WarningDlg + accept() + + + buttonCancel + clicked() + WarningDlg + reject() + + + diff --git a/plugins/icq/workinfo.cpp b/plugins/icq/workinfo.cpp new file mode 100644 index 0000000..5c116ab --- /dev/null +++ b/plugins/icq/workinfo.cpp @@ -0,0 +1,159 @@ +/*************************************************************************** + workinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "workinfo.h" +#include "icqclient.h" +#include "contacts/contact.h" + +#include +#include +#include + +using namespace SIM; + +WorkInfo::WorkInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client) : QWidget(parent) +{ + setupUi(this); + m_data = data; + m_client = client; + m_contact = contact; + btnSite->setIcon(Icon("home")); + connect(btnSite, SIGNAL(clicked()), this, SLOT(goUrl())); + if (m_data){ + edtAddress->setReadOnly(true); + edtCity->setReadOnly(true); + edtState->setReadOnly(true); + edtZip->setReadOnly(true); + disableWidget(cmbCountry); + disableWidget(cmbOccupation); + edtName->setReadOnly(true); + edtDept->setReadOnly(true); + edtPosition->setReadOnly(true); + edtSite->setReadOnly(true); + }else{ + connect(edtSite, SIGNAL(textChanged(const QString&)), this, SLOT(urlChanged(const QString&))); + } + fill(); +} + +void WorkInfo::apply() +{ +} + +bool WorkInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +static const ext_info occupations[] = + { + { I18N_NOOP("Academic"), 1 }, + { I18N_NOOP("Administrative"), 2 }, + { I18N_NOOP("Art/Entertainment"), 3 }, + { I18N_NOOP("College Student"), 4 }, + { I18N_NOOP("Computers"), 5 }, + { I18N_NOOP("Community & Social"), 6 }, + { I18N_NOOP("Education"), 7 }, + { I18N_NOOP("Engineering"), 8 }, + { I18N_NOOP("Financial Services"), 9 }, + { I18N_NOOP("Government"), 10 }, + { I18N_NOOP("High School Student"), 11 }, + { I18N_NOOP("Home"), 12 }, + { I18N_NOOP("ICQ - Providing Help"), 13 }, + { I18N_NOOP("Law"), 14 }, + { I18N_NOOP("Managerial"), 15 }, + { I18N_NOOP("Manufacturing"), 16 }, + { I18N_NOOP("Medical/Health"), 17 }, + { I18N_NOOP("Military"), 18 }, + { I18N_NOOP("Non-Goverment Organisation"), 19 }, + { I18N_NOOP("Professional"), 20 }, + { I18N_NOOP("Retail"), 21 }, + { I18N_NOOP("Retired"), 22 }, + { I18N_NOOP("Science & Research"), 23 }, + { I18N_NOOP("Sports"), 24 }, + { I18N_NOOP("Technical"), 25 }, + { I18N_NOOP("University student"), 26 }, + { I18N_NOOP("Web building"), 27 }, + { I18N_NOOP("Other services"), 99 }, + { "", 0 } + }; + +const ext_info *p_occupations = occupations; + +void WorkInfo::fill() +{ + ICQUserData *data = m_data; + if (data == NULL) + data = &m_client->data.owner; + edtAddress->setPlainText(data->WorkAddress.str()); + edtCity->setText(data->WorkCity.str()); + edtState->setText(data->WorkState.str()); + edtZip->setText(data->WorkZip.str()); + initCombo(cmbCountry, data->WorkCountry.toULong(), getCountries()); + initCombo(cmbOccupation, data->Occupation.toULong(), occupations); + edtName->setText(data->WorkName.str()); + edtDept->setText(data->WorkDepartment.str()); + edtPosition->setText(data->WorkPosition.str()); + edtSite->setText(data->WorkHomepage.str()); + urlChanged(edtSite->text()); +} + +void WorkInfo::goUrl() +{ + QString url = edtSite->text(); + if (url.isEmpty()) + return; + EventGoURL e(url); + e.process(); +} + +void WorkInfo::urlChanged(const QString &text) +{ + btnSite->setEnabled(!text.isEmpty()); +} + +void WorkInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + ICQUserData *data = m_client->toICQUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->WorkAddress.str() = edtAddress->toPlainText(); + data->WorkCity.str() = edtCity->text(); + data->WorkState.str() = edtState->text(); + data->WorkZip.str() = edtZip->text(); + data->WorkCountry.asULong() = getComboValue(cmbCountry, getCountries()); + data->Occupation.asULong() = getComboValue(cmbOccupation, occupations); + data->WorkName.str() = edtName->text(); + data->WorkDepartment.str() = edtDept->text(); + data->WorkPosition.str() = edtPosition->text(); + data->WorkHomepage.str() = edtSite->text(); +} + diff --git a/plugins/icq/workinfo.h b/plugins/icq/workinfo.h new file mode 100644 index 0000000..9da93c8 --- /dev/null +++ b/plugins/icq/workinfo.h @@ -0,0 +1,46 @@ +/*************************************************************************** + workinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _WORKINFO_H +#define _WORKINFO_H + +#include "ui_workinfobase.h" +#include "event.h" + +class ICQClient; +struct ICQUserData; + +class WorkInfo : public QWidget, public Ui::WorkInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + WorkInfo(QWidget *parent, ICQUserData *data, unsigned contact, ICQClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); + void goUrl(); + void urlChanged(const QString&); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + ICQUserData *m_data; + unsigned m_contact; + ICQClient *m_client; +}; + +#endif + diff --git a/plugins/icq/workinfobase.ui b/plugins/icq/workinfobase.ui new file mode 100644 index 0000000..b4b995a --- /dev/null +++ b/plugins/icq/workinfobase.ui @@ -0,0 +1,275 @@ + + + WorkInfo + + + + 0 + 0 + 387 + 338 + + + + Form2 + + + + 6 + + + 11 + + + + + + &Company + + + + 11 + + + 6 + + + + + Address: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + City: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + State: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Zip code: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Country: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + 6 + + + 0 + + + + + + + + + 0 + 0 + + + + + 22 + 22 + + + + + + + + + + + + + Web site: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + &Occupation + + + + 11 + + + 6 + + + + + Occupation: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Div / dept: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Position: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + edtCity + edtState + edtZip + cmbCountry + edtName + edtSite + btnSite + TabWidget2 + edtDept + edtPosition + cmbOccupation + + + + diff --git a/plugins/icq/xml.cpp b/plugins/icq/xml.cpp new file mode 100644 index 0000000..cbbf142 --- /dev/null +++ b/plugins/icq/xml.cpp @@ -0,0 +1,219 @@ +/* + * XML Parser/Generator + * + * Copyright (C) 2001 Barnaby Gray . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include "xml.h" + +using namespace std; + +// ---------- XmlNode --------------------------- + +XmlNode::XmlNode(const string& t) : tag(t) { } + +XmlNode::~XmlNode() { } + +bool XmlNode::isLeaf() { return !isBranch(); } + +string XmlNode::getTag() { return tag; } + +string XmlNode::replace_all(const string& s, const string& r1, const string& r2) { + string t(s.c_str()); + int curr = 0, next; + while ( (next = t.find( r1, curr )) != -1) { + t.replace( next, r1.size(), r2 ); + curr = next + r2.size(); + } + return t; +} + +string XmlNode::quote(const string& a) { + return + replace_all( + replace_all( + replace_all(a, + "&", "&"), + "<", "<"), + ">", ">"); +} + +string XmlNode::unquote(const string& a) { + return + replace_all( + replace_all( + replace_all(a, + "<", "<"), + ">", ">"), + "&", "&"); +} + +XmlNode *XmlNode::parse(string::iterator& curr, string::iterator end) { + + skipWS(curr,end); + if (curr == end || *curr != '<') return NULL; + + string tag = parseTag(curr,end); + if (tag.empty() || tag[0] == '/') return NULL; + + skipWS(curr,end); + if (curr == end) return NULL; + + if (*curr == '<') { + + XmlNode *p = NULL; + while (curr != end) { + string::iterator mark = curr; + string nexttag = parseTag(curr,end); + if (nexttag.empty()) { if (p != NULL) delete p; return NULL; } + if (nexttag[0] == '/') { + // should be the closing + if (nexttag.size() == tag.size()+1 && nexttag.find(tag,1) == 1) { + // is closing tag + if (p == NULL) p = new XmlLeaf(unquote(tag),""); + return p; + } else { + if (p != NULL) delete p; + return NULL; + } + } else { + if (p == NULL) p = new XmlBranch(unquote(tag)); + // an opening tag + curr = mark; + XmlNode *c = parse(curr,end); + if (c != NULL) ((XmlBranch*)p)->pushnode(c); + } + skipWS(curr,end); + if(curr == end || *curr != '<') { + if (p != NULL) delete p; + + } + } + return NULL; + + } + // XmlLeaf + string value; + while (curr != end && *curr != '<') { + value += *curr; + curr++; + } + if(curr == end) return NULL; + string nexttag = parseTag(curr,end); + if (nexttag.empty() || nexttag[0] != '/') return NULL; + if (nexttag.size() == tag.size()+1 && nexttag.find(tag,1) == 1) { + return new XmlLeaf(unquote(tag),unquote(value)); + } + // error + return NULL; +} + +string XmlNode::parseTag(string::iterator& curr, string::iterator end) { + string tag; + if(curr == end || *curr != '<') return string(); + curr++; + while(curr != end && *curr != '>') { + tag += *curr; + curr++; + } + if (curr == end) return string(); + curr++; + return tag; +} + +void XmlNode::skipWS(string::iterator& curr, string::iterator end) { + while(curr != end && isspace(*curr)) curr++; +} + +// ----------- XmlBranch ------------------------ + +XmlBranch::XmlBranch(const string& t) : XmlNode(t) { } + +XmlBranch::~XmlBranch() { + list::iterator curr = children.begin(); + while (curr != children.end()) { + delete (*curr); + curr++; + } + children.clear(); +} + +bool XmlBranch::isBranch() { return true; } + +bool XmlBranch::exists(const string& tag) { + list::iterator curr = children.begin(); + while (curr != children.end()) { + if ((*curr)->getTag() == tag) return true; + curr++; + } + return false; +} + +XmlNode *XmlBranch::getNode(const string& tag) { + list::iterator curr = children.begin(); + while (curr != children.end()) { + if ((*curr)->getTag() == tag) return (*curr); + curr++; + } + return NULL; +} + +XmlBranch *XmlBranch::getBranch(const string& tag) { + XmlNode *t = getNode(tag); + if (t == NULL || !t->isBranch()) return NULL; + return static_cast(t); +} + +XmlLeaf *XmlBranch::getLeaf(const string& tag) { + XmlNode *t = getNode(tag); + if (t == NULL || !t->isLeaf()) return NULL; + return static_cast(t); +} + +void XmlBranch::pushnode(XmlNode *c) { + children.push_back(c); +} + +string XmlBranch::toString(int n) { + string ret(n,'\t'); + ret += '<' + quote(tag) + ">\n"; + list::iterator curr = children.begin(); + while (curr != children.end()) { + ret += (*curr)->toString(n+1); + curr++; + } + ret += string(n,'\t') + "\n"; + + return ret; +} + +// ----------- XmlLeaf -------------------------- + +XmlLeaf::XmlLeaf(const string& t, const string& v) + : XmlNode(t), value(v) { } + +XmlLeaf::~XmlLeaf() { } + +bool XmlLeaf::isBranch() { return false; } + +string XmlLeaf::getValue() { return value; } + +string XmlLeaf::toString(int n) { + return string(n,'\t') + '<' + quote(tag) + '>' + quote(value) + "\n"; +} + diff --git a/plugins/icq/xml.h b/plugins/icq/xml.h new file mode 100644 index 0000000..1f49b0c --- /dev/null +++ b/plugins/icq/xml.h @@ -0,0 +1,94 @@ +/* + * XML Parser/Generator + * Simple XML parser/generator sufficient to + * send+receive the XML in ICQ SMS messages + * Copyright (C) 2001 Barnaby Gray . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef XML_H +#define XML_H + +#include +#include +#include + +class XmlNode { +private: + static std::string parseTag(std::string::iterator& curr, std::string::iterator end); + static void skipWS(std::string::iterator& curr, std::string::iterator end); + +protected: + std::string tag; + + XmlNode(const std::string& t); + +public: + virtual ~XmlNode(); + + virtual bool isBranch() = 0; + bool isLeaf(); + + std::string getTag(); + + static XmlNode *parse(std::string::iterator& start, std::string::iterator end); + + static std::string quote(const std::string& s); + static std::string unquote(const std::string& s); + static std::string replace_all(const std::string& s, const std::string& r1, const std::string& r2); + + virtual std::string toString(int n) = 0; +}; + +class XmlLeaf; + +class XmlBranch : public XmlNode { +private: + std::list children; + +public: + XmlBranch(const std::string& t); + ~XmlBranch(); + + bool isBranch(); + bool exists(const std::string& tag); + XmlNode *getNode(const std::string& tag); + XmlBranch *getBranch(const std::string& tag); + XmlLeaf *getLeaf(const std::string& tag); + + void pushnode(XmlNode *c); + + std::string toString(int n); + +}; + +class XmlLeaf : public XmlNode { +private: + std::string value; +public: + XmlLeaf(const std::string& t, const std::string& v); + ~XmlLeaf(); + + bool isBranch(); + std::string getValue(); + + std::string toString(int n); + +}; + +#endif + diff --git a/plugins/jabber/CMakeLists.txt b/plugins/jabber/CMakeLists.txt new file mode 100644 index 0000000..34a1216 --- /dev/null +++ b/plugins/jabber/CMakeLists.txt @@ -0,0 +1,68 @@ +################## +# jabber library # +################## +SET(jabber_SRCS + discoinfo.cpp + httppoll.cpp + infoproxy.cpp + jabber.cpp + jabber_auth.cpp + jabber_rosters.cpp + jabber_ssl.cpp + jabberaboutinfo.cpp + jabberadd.cpp + jabberbrowser.cpp + jabberbuffer.cpp + jabberclient.cpp + jabberconfig.cpp + jabberfiletransfer.cpp + jabberhomeinfo.cpp + jabberinfo.cpp + jabbermessage.cpp + jabberpicture.cpp + jabbersearch.cpp + jabberstatus.cpp + jabberworkinfo.cpp + jidadvsearch.cpp + jidsearch.cpp +) + +SET(jabber_HDRS + discoinfo.h + infoproxy.h + jabber.h + jabber_events.h + jabber_ssl.h + jabberaboutinfo.h + jabberadd.h + jabberbrowser.h + jabberbuffer.h + jabberclient.h + jabberconfig.h + jabberhomeinfo.h + jabberinfo.h + jabbermessage.h + jabberpicture.h + jabbersearch.h + jabberstatus.h + jabberworkinfo.h + jidadvsearch.h + jidsearch.h +) + +SET(jabber_UICS + discoinfobase.ui + infoproxybase.ui + jabberaboutinfobase.ui + jabberaddbase.ui + jabberconfigbase.ui + jabberhomeinfobase.ui + jabberinfobase.ui + jabberpicturebase.ui + jabberworkinfobase.ui + jidadvsearchbase.ui + jidsearchbase.ui +) + +SIM_ADD_PLUGIN(jabber) + diff --git a/plugins/jabber/discoinfo.cpp b/plugins/jabber/discoinfo.cpp new file mode 100644 index 0000000..da1b0f1 --- /dev/null +++ b/plugins/jabber/discoinfo.cpp @@ -0,0 +1,310 @@ +/*************************************************************************** + discoinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include + +#include "icons.h" +#include "simgui/listview.h" +#include "misc.h" + +#include "jabberclient.h" +#include "discoinfo.h" +#include "jabberbrowser.h" +#include "jabber.h" +#include "jabberaboutinfo.h" + +using namespace SIM; + +extern DataDef jabberUserData[]; + +DiscoInfo::DiscoInfo(JabberBrowser *browser, const QString &features, + const QString &name, const QString &type, const QString &category) : QDialog(browser) +{ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose,true); + m_browser = browser; + SET_WNDPROC("jbrowser") + setWindowIcon(Icon("Jabber_online")); + setTitle(); + setButtonsPict(this); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(apply())); + m_bTime = true; + m_bLast = true; + m_bStat = true; + m_bVCard = true; + m_about = NULL; + m_features = features; + m_name = name; + m_type = type; + m_category = category; + load_data(jabberUserData, &m_data, NULL); + disableWidget(edtJName); + disableWidget(edtType); + disableWidget(edtCategory); + edtNameSpace->setReadOnly(true); + disableWidget(edtName); + disableWidget(edtVersion); + disableWidget(edtSystem); + disableWidget(edtTime); + disableWidget(edtLast); + lstStat->addColumn(i18n("Name")); + lstStat->addColumn(i18n("Units")); + lstStat->addColumn(i18n("Value")); + lstStat->setExpandingColumn(2); + btnUrl->setIcon(Icon("home")); + connect(btnUrl, SIGNAL(clicked()), this, SLOT(goUrl())); + connect(edtUrl, SIGNAL(textChanged(const QString&)), this, SLOT(urlChanged(const QString&))); +} + +DiscoInfo::~DiscoInfo() +{ + free_data(jabberUserData, &m_data); + m_browser->m_info = NULL; +} + +void DiscoInfo::setTitle() +{ + setWindowTitle(m_url); +} + +void DiscoInfo::reset() +{ + if (m_about){ + tabInfo->removeTab(tabInfo->indexOf(m_about)); + delete m_about; + m_about = NULL; + } + if (m_browser->m_list->currentItem()){ + m_url = m_browser->m_list->currentItem()->text(COL_JID); + m_node = m_browser->m_list->currentItem()->text(COL_NODE); + } + free_data(jabberUserData, &m_data); + load_data(jabberUserData, &m_data, NULL); + m_data.ID.str() = m_url; + m_data.Node.str() = m_node; + setTitle(); + edtJName->setText(m_name); + edtType->setText(m_type); + edtCategory->setText(m_category); + edtNameSpace->setPlainText(m_features); + bool bTime = false; + bool bLast = false; + bool bStat = false; + bool bVCard = false; + QString mf = m_features; + while (!mf.isEmpty()){ + QString f = getToken(mf, '\n'); + if (f == "jabber:iq:time") + bTime = true; + if (f == "jabber:iq:last") + bLast = true; + if (f == "http://jabber.org/protocol/stats") + bStat = true; + if (f == "vcard-temp") + bVCard = true; + } + int pos = 2; + edtName->setText(QString::null); + edtVersion->setText(QString::null); + edtSystem->setText(QString::null); + m_browser->m_client->versionInfo(m_url, m_node); + if ((bTime || bLast) != (m_bTime || m_bLast)){ + m_bTime = bTime; + m_bLast = bLast; + if (m_bTime || m_bLast){ + tabInfo->insertTab(pos++, tabTime, i18n("&Time")); + }else{ + tabInfo->removeTab(tabInfo->indexOf(tabTime)); + } + }else if (m_bTime || m_bLast){ + pos++; + } + edtTime->setText(QString::null); + edtLast->setText(QString::null); + if (m_bTime){ + edtTime->show(); + m_browser->m_client->timeInfo(m_url, m_node); + }else{ + edtTime->hide(); + } + if (m_bLast){ + edtLast->show(); + m_browser->m_client->lastInfo(m_url, m_node); + }else{ + edtLast->hide(); + } + lstStat->clear(); + if (bStat != m_bStat){ + m_bStat = bStat; + if (m_bStat){ + tabInfo->insertTab(pos++, tabStat, i18n("&Stat")); + }else{ + tabInfo->removeTab(tabInfo->indexOf(tabStat)); + } + }else if (m_bStat){ + pos++; + } + m_statId = m_bStat ? m_browser->m_client->statInfo(m_url, m_node) : QString::null; + if (bVCard != m_bVCard){ + m_bVCard = bVCard; + if (m_bVCard || m_bVCard){ + tabInfo->insertTab(pos++, tabVCard, i18n("&Info")); + }else{ + tabInfo->removeTab(tabInfo->indexOf(tabVCard)); + } + }else if (m_bVCard){ + pos++; + } + edtFirstName->setText(QString::null); + edtNick->setText(QString::null); + edtBirthday->setText(QString::null); + edtUrl->setText(QString::null); + edtEMail->setText(QString::null); + edtPhone->setText(QString::null); + if (bVCard){ + m_about = new JabberAboutInfo(tabInfo, &m_data, m_browser->m_client); + tabInfo->insertTab(pos++, m_about, i18n("About info")); + m_browser->m_client->info_request(&m_data, true); + } +} + +bool DiscoInfo::processEvent(Event *e) +{ + if (e->type() == eEventVCard){ + EventVCard *evc = static_cast(e); + JabberUserData *data = evc->data(); + if (m_data.ID.str() == data->ID.str() && m_data.Node.str() == data->Node.str()){ + edtFirstName->setText(data->FirstName.str()); + edtNick->setText(data->Nick.str()); + edtBirthday->setText(data->Bday.str()); + edtUrl->setText(data->Url.str()); + urlChanged(edtUrl->text()); + edtEMail->setText(data->EMail.str()); + edtPhone->setText(data->Phone.str()); + } + } else + if (e->type() == eEventDiscoItem){ + EventDiscoItem *edi = static_cast(e); + DiscoItem *item = edi->item(); + if (m_statId == item->id){ + if (item->jid.isEmpty()){ + m_statId = QString::null; + return true; + } + ListViewItem *i = new ListViewItem(lstStat); + i->setText(0, item->jid); + i->setText(1, item->name); + i->setText(2, item->node); + return true; + } + } else + if (e->type() == eEventClientVersion){ + EventClientVersion *ecv = static_cast(e); + ClientVersionInfo* info = ecv->info(); + if (m_data.ID.str() == info->jid && m_data.Node.str() == info->node){ + edtName->setText(info->name); + edtVersion->setText(info->version); + edtSystem->setText(info->os); + } + } else + if (e->type() == eEventClientLastInfo){ + EventClientLastInfo *ecli = static_cast(e); + ClientLastInfo* info = ecli->info(); + if (m_data.ID.str() == info->jid){ + unsigned ss = info->seconds; + unsigned mm = ss / 60; + ss -= mm * 60; + unsigned hh = mm / 60; + mm -= hh * 60; + unsigned dd = hh / 24; + hh -= dd * 24; + QString date; + if (dd){ + date = i18n("%n day", "%n days", dd); + date += ' '; + } + QString time; + time.sprintf("%02u:%02u:%02u", hh, mm, ss); + date += time; + edtLast->setText(date); + } + } else + if (e->type() == eEventClientTimeInfo){ + EventClientTimeInfo *ecti = static_cast(e); + ClientTimeInfo* info = ecti->info(); + if (m_data.ID.str() == info->jid){ + /* + if (!info->display.isEmpty()) + edtTime->setText(info->display); + else + */ + edtTime->setText(info->utc); + } + } + return false; +} + +void DiscoInfo::resizeEvent(QResizeEvent *e) +{ + QDialog::resizeEvent(e); + lstStat->adjustColumn(); +} + +void DiscoInfo::accept() +{ + apply(); + QDialog::accept(); +} + +void DiscoInfo::apply() +{ + if (m_bVCard && m_about){ + m_about->apply(m_browser->m_client, &m_data); + m_data.FirstName.str() = edtFirstName->text(); + m_data.Nick.str() = edtNick->text(); + m_data.Bday.str() = edtBirthday->text(); + m_data.Url.str() = edtUrl->text(); + m_data.EMail.str() = edtEMail->text(); + m_data.Phone.str() = edtPhone->text(); + m_browser->m_client->setClientInfo(&m_data); + } +} + +void DiscoInfo::goUrl() +{ + QString url = edtUrl->text(); + if (url.isEmpty()) + return; + EventGoURL e(url); + e.process(); +} + +void DiscoInfo::urlChanged(const QString &text) +{ + btnUrl->setEnabled(!text.isEmpty()); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "discoinfo.moc" +#endif +*/ + diff --git a/plugins/jabber/discoinfo.h b/plugins/jabber/discoinfo.h new file mode 100644 index 0000000..9cc1a8d --- /dev/null +++ b/plugins/jabber/discoinfo.h @@ -0,0 +1,65 @@ +/*************************************************************************** + discoinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _DISCOINFO_H +#define _DISCOINFO_H + +#include "jabberclient.h" +#include "ui_discoinfobase.h" + +#include + +class JabberBrowser; +class JabberHomeInfo; +class JabberWorkInfo; +class JabberAboutInfo; + +class DiscoInfo : public QDialog, public Ui::DiscoInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + DiscoInfo(JabberBrowser *browser, const QString &features, + const QString &name, const QString &type, const QString &category); + ~DiscoInfo(); + void reset(); +protected slots: + void apply(); + void goUrl(); + void urlChanged(const QString &text); +protected: + void accept(); + QString m_url; + QString m_node; + QString m_features; + QString m_name; + QString m_type; + QString m_category; + virtual bool processEvent(SIM::Event *e); + void resizeEvent(QResizeEvent*); + void setTitle(); + bool m_bTime; + bool m_bLast; + bool m_bStat; + bool m_bVCard; + JabberBrowser *m_browser; + QString m_statId; + JabberAboutInfo *m_about; + JabberUserData m_data; +}; + +#endif + diff --git a/plugins/jabber/discoinfobase.ui b/plugins/jabber/discoinfobase.ui new file mode 100644 index 0000000..8cc7096 --- /dev/null +++ b/plugins/jabber/discoinfobase.ui @@ -0,0 +1,522 @@ + + + DiscoInfo + + + + 0 + 0 + 451 + 308 + + + + DiscoInfo + + + true + + + + 6 + + + 11 + + + + + + &Info + + + + 11 + + + 6 + + + + + Namespaces: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Category: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Type: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + &Version + + + + 11 + + + 6 + + + + + Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Version: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + System: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &Time + + + + 11 + + + 6 + + + + + UTC client time: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Last activity, idle response: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &Statistic + + + + 6 + + + 11 + + + + + + + + + + + + + &Info + + + + 11 + + + 6 + + + + + Nick: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Homepage: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Birth date: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + First Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + 6 + + + 0 + + + + + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + EMail: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Phone: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Apply + + + true + + + + + + + &OK + + + true + + + true + + + + + + + &Close + + + true + + + + + + + + + + ListView + QWidget +
    simgui/listview.h
    +
    +
    + + tabInfo + edtJName + edtType + edtCategory + edtName + edtVersion + edtSystem + edtTime + edtLast + buttonCancel + + + + + buttonCancel + clicked() + DiscoInfo + reject() + + + 20 + 20 + + + 20 + 20 + + + + + buttonOk + clicked() + DiscoInfo + accept() + + + 20 + 20 + + + 20 + 20 + + + + +
    diff --git a/plugins/jabber/httppoll.cpp b/plugins/jabber/httppoll.cpp new file mode 100644 index 0000000..0925355 --- /dev/null +++ b/plugins/jabber/httppoll.cpp @@ -0,0 +1,184 @@ +/*************************************************************************** + httppool.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "fetch.h" +#include "log.h" + +#include "jabberclient.h" +#include +#include + +using namespace SIM; + +class JabberHttpPool : public Socket, public FetchClient +{ +public: + JabberHttpPool(const QString &url); + ~JabberHttpPool(); + virtual void connect(const QString &host, unsigned short port); + virtual int read(char *buf, unsigned size); + virtual void write(const char *buf, unsigned size); + virtual void close(); + virtual Mode mode() const { return Web; } + virtual bool isEncrypted(){ return false; } + virtual bool startEncryption(){ return false; } +protected: + QString getKey(); + virtual bool done(unsigned code, Buffer &data, const QString &headers); + JabberBuffer readData; + JabberBuffer writeData; + QString m_url; + QByteArray m_key; + QByteArray m_seed; + QString m_cookie; + virtual unsigned long localHost(); + virtual void pause(unsigned); +}; + +// ______________________________________________________________________________________ + +JabberHttpPool::JabberHttpPool(const QString &url) + : m_url(url) +{ + m_cookie = "0"; +/* + Buffer k; + for (unsigned i = 0; i < 48; i++){ + char c = get_random() & 0xFF; + k.pack(&c, 1); + } + m_seed += k.toBase64(); +*/ + m_seed = "foo"; +} + +JabberHttpPool::~JabberHttpPool() +{ +} + +QString JabberHttpPool::getKey() +{ + if (m_key.isEmpty()){ + m_key = m_seed; + return m_key; + } + QByteArray digest = QCryptographicHash::hash(m_key, QCryptographicHash::Sha1); + Buffer b; + b.pack(digest, digest.size()); + m_key = b.toBase64(); + return m_key; +} + +int JabberHttpPool::read(char *buf, unsigned size) +{ + unsigned tail = readData.size() - readData.readPos(); + if (size > tail) size = tail; + if (size == 0) return 0; + readData.unpack(buf, size); + if (readData.readPos() == (unsigned)readData.size()) + readData.init(0); + return size; +} + +void JabberHttpPool::write(const char *buf, unsigned size) +{ + writeData.pack(buf, size); + if (!isDone()) + return; + Buffer *packet = new Buffer; + *packet << (const char*)m_cookie.toLocal8Bit().data(); + *packet << ";" << (const char*)getKey().toLocal8Bit().data(); + *packet << ","; + log(L_DEBUG, "%s;%s,", qPrintable(m_cookie), qPrintable(getKey())); + packet->pack(writeData.data(), writeData.writePos()); + char headers[] = "Content-Type: application/x-www-form-urlencoded"; + fetch(m_url, headers, packet); + writeData.init(0); +} + +void JabberHttpPool::close() +{ + writeData.init(0); + stop(); +} + +void JabberHttpPool::connect(const QString&, unsigned short) +{ + if (notify) + notify->connect_ready(); +} + +bool JabberHttpPool::done(unsigned code, Buffer &data, const QString &headers) +{ + if (code != 200){ + log(L_DEBUG, "HTTP result %u", code); + error("Bad result"); + return false; + } + QString cookie; + int idx = headers.indexOf("Set-Cookie:"); + if(idx != -1) { + int end = headers.indexOf("\n", idx); + if(end == -1) + m_cookie = headers.mid(idx); + else + m_cookie = headers.mid(end - idx + 1); + } + m_cookie = cookie; + int err_code = getToken(cookie, ':').toInt(); + if (cookie == "0"){ + const char *err = "Unknown poll error"; + switch (err_code){ + case -1: + err = "Server Error"; + break; + case -2: + err = "Bad Request"; + break; + case -3: + err = "Key Sequence Error"; + break; + } + error(err); + return false; + } + readData = data; + if (notify) + notify->read_ready(); + return false; +} + +unsigned long JabberHttpPool::localHost() +{ + return 0; +} + +void JabberHttpPool::pause(unsigned) +{ +} + +Socket *JabberClient::createSocket() +{ + m_bHTTP = getUseHTTP() && !getURL().isEmpty(); + if (m_bHTTP) + return new JabberHttpPool(getURL()); + return NULL; +} + + diff --git a/plugins/jabber/infoproxy.cpp b/plugins/jabber/infoproxy.cpp new file mode 100644 index 0000000..9e6cb1e --- /dev/null +++ b/plugins/jabber/infoproxy.cpp @@ -0,0 +1,49 @@ +/*************************************************************************** + infoproxy.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "infoproxy.h" + +#include + +using namespace SIM; + +InfoProxy::InfoProxy(QWidget *parent, QWidget *child, const QString &title) : QWidget(parent) + //: InfoProxyBase(parent) +{ + setupUi(this); + connect(this, SIGNAL(sig_apply()), child, SLOT(apply())); + connect(this, SIGNAL(sig_apply(SIM::Client*, void*)), child, SLOT(apply(SIM::Client*, void*))); + tabInfo->addTab(child, title); + tabInfo->removeTab(tabInfo->indexOf(tab)); +} + +void InfoProxy::apply() +{ + emit sig_apply(); +} + +void InfoProxy::apply(Client *client, void *data) +{ + emit sig_apply(client, data); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "infoproxy.moc" +#endif +*/ + diff --git a/plugins/jabber/infoproxy.h b/plugins/jabber/infoproxy.h new file mode 100644 index 0000000..9616f80 --- /dev/null +++ b/plugins/jabber/infoproxy.h @@ -0,0 +1,38 @@ +/*************************************************************************** + infoproxy.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _INFOPROXY_H +#define _INFOPROXY_H + +#include "event.h" +#include "ui_infoproxybase.h" + +class InfoProxy : public QWidget, public Ui::InfoProxyBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + InfoProxy(QWidget *parent, QWidget *child, const QString &title); +signals: + void sig_apply(); + void sig_apply(SIM::Client*, void*); +public slots: + void apply(); + void apply(SIM::Client*, void*); +}; + +#endif + diff --git a/plugins/jabber/infoproxybase.ui b/plugins/jabber/infoproxybase.ui new file mode 100644 index 0000000..a62dbe8 --- /dev/null +++ b/plugins/jabber/infoproxybase.ui @@ -0,0 +1,61 @@ + + + + + InfoProxyBase + + + + 0 + 0 + 429 + 279 + + + + Form1 + + + + 11 + + + 6 + + + + + + + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/jabber/jabber.cpp b/plugins/jabber/jabber.cpp new file mode 100644 index 0000000..c224394 --- /dev/null +++ b/plugins/jabber/jabber.cpp @@ -0,0 +1,423 @@ +/*************************************************************************** + jabber.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "jabberclient.h" +#include "jabber.h" +#include "misc.h" +#include "core_consts.h" +#include "contacts/protocolmanager.h" +#include "clientmanager.h" +#include "icons.h" + +#include + +using namespace SIM; + +Plugin *createJabberPlugin(unsigned base, bool, Buffer *cfg) +{ + Plugin *plugin = new JabberPlugin(base, cfg); + return plugin; +} + +static PluginInfo info = + { + NULL, + NULL, + VERSION, + createJabberPlugin, + PLUGIN_PROTOCOL + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +JabberProtocol::JabberProtocol(Plugin *plugin) + : Protocol(plugin) +{ + initStatuses(); +} + +JabberProtocol::~JabberProtocol() +{ +} + +void JabberProtocol::initStatuses() +{ + addStatus(JabberStatusPtr(new JabberStatus("online", "Online", true, "", Icon("Jabber_online"), QString::null, QString::null))); + addStatus(JabberStatusPtr(new JabberStatus("away", "Away", true, "", Icon("Jabber_away"), "away", QString::null))); + addStatus(JabberStatusPtr(new JabberStatus("n/a", "N/A", true, "", Icon("Jabber_na"), "xa", QString::null))); + addStatus(JabberStatusPtr(new JabberStatus("dnd", "Do not disturb", true, "", Icon("Jabber_dnd"), "dnd", QString::null))); + addStatus(JabberStatusPtr(new JabberStatus("occupied", "Occupied", true, "", Icon("Jabber_occupied"), "occupied", QString::null))); + addStatus(JabberStatusPtr(new JabberStatus("free_for_chat", "Free for chat", true, "", Icon("Jabber_ffc"), "chat", QString::null))); + addStatus(JabberStatusPtr(new JabberStatus("offline", "Offline", true, "", Icon("Jabber_offline"), QString::null, "unavailable"))); +} + +void JabberProtocol::addStatus(JabberStatusPtr status) +{ + m_statuses.append(status); +} + +QStringList JabberProtocol::statuses() +{ + QStringList list; + foreach(const JabberStatusPtr& status, m_statuses) { + list.append(status->id()); + } + return list; +} + +SIM::IMStatusPtr JabberProtocol::status(const QString& id) +{ + foreach(const JabberStatusPtr& status, m_statuses) { + if(status->id() == id) { + return status; + } + } + + return SIM::IMStatusPtr(); +} + +ClientPtr JabberProtocol::createClient(Buffer *cfg) +{ + ClientPtr jabber = ClientPtr(new JabberClient(this, cfg)); + getClientManager()->addClient(jabber); + return jabber; +} + +static CommandDef jabber_descr = + CommandDef ( + 0, + I18N_NOOP("Jabber"), + "Jabber_online", + "Jabber_invisible", + QString::null, + 0, + 0, + 0, + 0, + 0, + PROTOCOL_INFO | PROTOCOL_AR | PROTOCOL_INVISIBLE | PROTOCOL_SEARCH | PROTOCOL_AR_OFFLINE, + NULL, + QString::null + ); + +const CommandDef *JabberProtocol::description() +{ + return &jabber_descr; +} + +static CommandDef jabber_status_list[] = + { + CommandDef ( + STATUS_ONLINE, + I18N_NOOP("Online"), + "Jabber_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_AWAY, + I18N_NOOP("Away"), + "Jabber_away", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_NA, + I18N_NOOP("N/A"), + "Jabber_na", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_DND, + I18N_NOOP("Do not Disturb"), + "Jabber_dnd", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_OCCUPIED, + I18N_NOOP("Occupied"), + "Jabber_occupied", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_FFC, + I18N_NOOP("Free for chat"), + "Jabber_ffc", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_OFFLINE, + I18N_NOOP("Offline"), + "Jabber_offline", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef () + }; + +const CommandDef *JabberProtocol::statusList() +{ + return jabber_status_list; +} + +DataDef jabberData[] = + { + { "BrowserBar", DATA_LONG, 7, 0 }, + { "BrowserHistory", DATA_UTF, 1, 0 }, + { "AllLevels", DATA_BOOL, 1, 0 }, + { "BrowseType", DATA_ULONG, 1, DATA(BROWSE_DISCO | BROWSE_BROWSE | BROWSE_AGENTS) }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +JabberPlugin *JabberPlugin::plugin = NULL; + +JabberPlugin::JabberPlugin(unsigned base, Buffer *cfg) + : Plugin(base) +{ + plugin = this; + load_data(jabberData, &data, cfg); + JabberPacket = registerType(); + getContacts()->addPacketType(JabberPacket, jabber_descr.text, true); + + EventMenu(MenuSearchResult, EventMenu::eAdd).process(); + EventMenu(MenuJabberGroups, EventMenu::eAdd).process(); + EventMenu(MenuBrowser, EventMenu::eAdd).process(); + + EventToolbar(BarBrowser, EventToolbar::eAdd).process(); + + Command cmd; + cmd->id = CmdJabberMessage; + cmd->text = I18N_NOOP("&Message"); + cmd->icon = "message"; + cmd->menu_id = MenuSearchResult; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdBrowseInfo; + cmd->text = I18N_NOOP("User &info"); + cmd->icon = "info"; + cmd->menu_grp = 0x1001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGroups; + cmd->text = I18N_NOOP("&Add to group"); + cmd->icon = QString::null; + cmd->menu_grp = 0x1002; + cmd->popup_id = MenuJabberGroups; + EventCommandCreate(cmd).process(); + + cmd->id = CmdGroups; + cmd->text = "_"; + cmd->menu_id = MenuJabberGroups; + cmd->popup_id = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdBack; + cmd->text = I18N_NOOP("&Back"); + cmd->icon = "1leftarrow"; + cmd->bar_grp = 0x1000; + cmd->bar_id = BarBrowser; + cmd->menu_id = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdForward; + cmd->text = I18N_NOOP("&Next"); + cmd->icon = "1rightarrow"; + cmd->bar_grp = 0x1001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdUrl; + cmd->text = I18N_NOOP("JID"); + cmd->icon = "run"; + cmd->bar_grp = 0x2000; + cmd->flags = BTN_COMBO_CHECK; + EventCommandCreate(cmd).process(); + + cmd->id = CmdNode; + cmd->text = I18N_NOOP("Node"); + cmd->bar_grp = 0x2001; + cmd->flags = BTN_COMBO | BTN_NO_BUTTON; + EventCommandCreate(cmd).process(); + + cmd->id = CmdBrowseSearch; + cmd->text = I18N_NOOP("&Search"); + cmd->icon = "find"; + cmd->bar_grp = 0x3000; + cmd->menu_id = MenuSearchOptions; + cmd->menu_grp = 0x2000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdRegister; + cmd->text = I18N_NOOP("&Register"); + cmd->icon = "reg"; + cmd->bar_grp = 0x3001; + cmd->menu_grp = 0x2001; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdBrowseInfo; + cmd->text = I18N_NOOP("Info"); + cmd->icon = "info"; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->bar_grp = 0x3010; + EventCommandCreate(cmd).process(); + + cmd->id = CmdBrowseConfigure; + cmd->text = I18N_NOOP("Configure"); + cmd->icon = "configure"; + cmd->bar_grp = 0x3020; + cmd->menu_id = MenuSearchOptions; + cmd->menu_grp = 0x2002; + EventCommandCreate(cmd).process(); + + cmd->id = CmdBrowseMode; + cmd->text = I18N_NOOP("Browser mode"); + cmd->icon = "configure"; + cmd->bar_grp = 0x5000; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->flags = COMMAND_DEFAULT; + cmd->popup_id = MenuBrowser; + EventCommandCreate(cmd).process(); + + cmd->id = CmdOneLevel; + cmd->text = I18N_NOOP("Load one level"); + cmd->icon = QString::null; + cmd->bar_id = 0; + cmd->bar_grp = 0; + cmd->menu_id = MenuBrowser; + cmd->menu_grp = 0x1000; + cmd->popup_id = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = CmdAllLevels; + cmd->text = I18N_NOOP("Load all levels"); + cmd->menu_grp = 0x1001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdModeDisco; + cmd->text = "Discovery"; + cmd->menu_grp = 0x2000; + EventCommandCreate(cmd).process(); + + cmd->id = CmdModeBrowse; + cmd->text = "Browse"; + cmd->menu_grp = 0x2001; + EventCommandCreate(cmd).process(); + + cmd->id = CmdModeAgents; + cmd->text = "Agents"; + cmd->menu_grp = 0x2002; + EventCommandCreate(cmd).process(); + + m_protocol = ProtocolPtr(new JabberProtocol(this)); + getProtocolManager()->addProtocol(m_protocol); + registerMessages(); +} + +JabberPlugin::~JabberPlugin() +{ + unregisterMessages(); + + EventMenu(MenuSearchResult, EventMenu::eRemove).process(); + EventMenu(MenuJabberGroups, EventMenu::eRemove).process(); + EventMenu(MenuBrowser, EventMenu::eRemove).process(); + + EventToolbar(BarBrowser, EventToolbar::eRemove).process(); + + getProtocolManager()->removeProtocol(m_protocol); + getContacts()->removePacketType(JabberPacket); + + free_data(jabberData, &data); +} + +QByteArray JabberPlugin::getConfig() +{ + return save_data(jabberData, &data); +} + +// vim: set expandtab: + diff --git a/plugins/jabber/jabber.h b/plugins/jabber/jabber.h new file mode 100644 index 0000000..01c2b7b --- /dev/null +++ b/plugins/jabber/jabber.h @@ -0,0 +1,107 @@ +/*************************************************************************** + jabber.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBER_H +#define _JABBER_H + +#include "contacts.h" +#include "contacts/client.h" +#include "contacts/imstatus.h" +#include "jabberstatus.h" + +#include + +const unsigned JabberCmdBase = 0x00050000; + +#include "jabber_events.h" + +const unsigned long CmdJabberMessage = JabberCmdBase + 1; +const unsigned long CmdGroups = JabberCmdBase + 2; +const unsigned long CmdBack = JabberCmdBase + 3; +const unsigned long CmdForward = JabberCmdBase + 4; +const unsigned long CmdUrl = JabberCmdBase + 5; +const unsigned long CmdBrowseInfo = JabberCmdBase + 6; +const unsigned long CmdBrowseSearch = JabberCmdBase + 7; +const unsigned long CmdRegister = JabberCmdBase + 8; +const unsigned long CmdNode = JabberCmdBase + 9; +const unsigned long CmdBrowseMode = JabberCmdBase + 10; +const unsigned long CmdBrowseConfigure = JabberCmdBase + 11; +const unsigned long CmdOneLevel = JabberCmdBase + 12; +const unsigned long CmdAllLevels = JabberCmdBase + 13; +const unsigned long CmdModeDisco = JabberCmdBase + 14; +const unsigned long CmdModeBrowse = JabberCmdBase + 15; +const unsigned long CmdModeAgents = JabberCmdBase + 16; + +const unsigned long MenuSearchResult = JabberCmdBase + 1; +const unsigned long MenuJabberGroups = JabberCmdBase + 2; +const unsigned long MenuBrowser = JabberCmdBase + 3; + +const unsigned long BarBrowser = JabberCmdBase + 1; + +const unsigned BROWSE_DISCO = 1; +const unsigned BROWSE_BROWSE = 2; +const unsigned BROWSE_AGENTS = 4; + +class JabberProtocol : public SIM::Protocol +{ +public: + JabberProtocol(SIM::Plugin *plugin); + ~JabberProtocol(); + SIM::ClientPtr createClient(Buffer *cfg); + const SIM::CommandDef *description(); + const SIM::CommandDef *statusList(); + virtual const SIM::DataDef *userDataDef(); + + virtual QStringList statuses(); + virtual SIM::IMStatusPtr status(const QString& id); + +private: + void initStatuses(); + void addStatus(JabberStatusPtr status); + QList m_statuses; +}; + +struct JabberData +{ + SIM::Data browser_bar[7]; + SIM::Data BrowserHistory; + SIM::Data AllLevels; + SIM::Data BrowseType; +}; + +class JabberPlugin : public SIM::Plugin +{ +public: + JabberPlugin(unsigned base, Buffer *cfg); + virtual ~JabberPlugin(); + unsigned JabberPacket; + void registerMessages(); + void unregisterMessages(); + JabberData data; + PROP_UTF8(BrowserHistory); + PROP_BOOL(AllLevels); + PROP_ULONG(BrowseType); + static JabberPlugin *plugin; +protected: + virtual QByteArray getConfig(); + SIM::ProtocolPtr m_protocol; +}; + +#endif + +// vim: set expandtab: + diff --git a/plugins/jabber/jabber.rc b/plugins/jabber/jabber.rc new file mode 100644 index 0000000..bcc4f3d --- /dev/null +++ b/plugins/jabber/jabber.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Jabber plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "jabber\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "jabber.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/jabber/jabber.vcproj b/plugins/jabber/jabber.vcproj new file mode 100644 index 0000000..c187f4d --- /dev/null +++ b/plugins/jabber/jabber.vcproj @@ -0,0 +1,1635 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/jabber/jabber_auth.cpp b/plugins/jabber/jabber_auth.cpp new file mode 100644 index 0000000..c27afe3 --- /dev/null +++ b/plugins/jabber/jabber_auth.cpp @@ -0,0 +1,112 @@ +/*************************************************************************** + jabber_auth.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "jabberclient.h" + +#include +#include + +using namespace SIM; + +class AuthRequest : public JabberClient::ServerRequest +{ +public: + AuthRequest(JabberClient *client); +protected: + bool m_bFail; + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); +}; + +AuthRequest::AuthRequest(JabberClient *client) + : JabberClient::ServerRequest(client, _SET, NULL, client->VHost()) +{ + m_bFail = true; +} + +void AuthRequest::element_end(const QString& el) +{ + if (el != "iq") + return; + if (m_bFail){ + QTimer::singleShot(0, m_client, SLOT(auth_failed())); + }else{ + QTimer::singleShot(0, m_client, SLOT(auth_ok())); + } +} + +void AuthRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "iq"){ + QString value = attrs.value("type").toLower(); + if (value == "result") + m_bFail = false; + } +} + +void JabberClient::auth_plain() +{ + AuthRequest *req = new AuthRequest(this); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:auth"); + QString username = data.owner.ID.str(); + username = getToken(username, '@'); + req->text_tag("username", username); + req->text_tag("password", getPassword()); + req->text_tag("resource", data.owner.Resource.str()); + req->send(); + m_requests.push_back(req); +} + +void JabberClient::auth_register() +{ + AuthRequest *req = new AuthRequest(this); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:register"); + QString username = data.owner.ID.str(); + username = getToken(username, '@'); + req->text_tag("username", username); + req->text_tag("password", getPassword()); + req->send(); + m_requests.push_back(req); +} + +void JabberClient::auth_digest() +{ + AuthRequest *req = new AuthRequest(this); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:auth"); + QString username = data.owner.ID.str(); + username = getToken(username, '@'); + req->text_tag("username", username); + + QString digest = m_id; + digest += getPassword(); + QByteArray md = QCryptographicHash::hash(digest.toUtf8(), QCryptographicHash::Sha1); + digest = QString::null; + for (int i = 0; i < md.size(); i++){ + char b[3]; + sprintf(b, "%02x", md[i] & 0xFF); + digest += b; + } + req->text_tag("digest", digest); + req->text_tag("resource", data.owner.Resource.str()); + req->send(); + m_requests.push_back(req); +} diff --git a/plugins/jabber/jabber_events.h b/plugins/jabber/jabber_events.h new file mode 100644 index 0000000..46adcd5 --- /dev/null +++ b/plugins/jabber/jabber_events.h @@ -0,0 +1,116 @@ +#ifndef _JABBER_EVENTS_H +#define _JABBER_EVENTS_H + +#include + +#include "event.h" + +struct ClientLastInfo; +struct ClientTimeInfo; +struct ClientVersionInfo; +struct DiscoItem; +struct JabberAgentInfo; +struct JabberSearchData; +struct agentRegisterInfo; +struct JabberUserData; + +class EventAgentInfo : public SIM::Event +{ +public: + EventAgentInfo(JabberAgentInfo *info) + : Event(SIM::eEventAgentInfo), m_info(info) {} + + JabberAgentInfo *agentInfo() const { return m_info; } +protected: + JabberAgentInfo *m_info; +}; + +class EventAgentRegister : public SIM::Event +{ +public: + EventAgentRegister(agentRegisterInfo *info) + : Event(SIM::eEventAgentRegister), m_info(info) {} + + agentRegisterInfo *registerInfo() const { return m_info; } +protected: + agentRegisterInfo *m_info; +}; + +class EventSearch : public SIM::Event +{ +public: + EventSearch(JabberSearchData *data) + : Event(SIM::eEventJabberSearch), m_data(data) {} + + JabberSearchData *searchData() const { return m_data; } +protected: + JabberSearchData *m_data; +}; + +class EventSearchDone : public SIM::Event +{ +public: + EventSearchDone(const QString &userID) + : Event(SIM::eEventJabberSearchDone), m_id(userID) {} + + const QString &userID() const { return m_id; } +protected: + QString m_id; +}; + +class EventDiscoItem : public SIM::Event +{ +public: + EventDiscoItem(DiscoItem *item) + : Event(SIM::eEventDiscoItem), m_item(item) {} + + DiscoItem *item() const { return m_item; } +protected: + DiscoItem *m_item; +}; + +class EventVCard : public SIM::Event +{ +public: + EventVCard(JabberUserData *data) + : Event(SIM::eEventVCard), m_data(data) {} + + JabberUserData *data() const { return m_data; } +protected: + JabberUserData *m_data; +}; + +class EventClientVersion : public SIM::Event +{ +public: + EventClientVersion(ClientVersionInfo *info) + : Event(SIM::eEventClientVersion), m_info(info) {} + + ClientVersionInfo *info() const { return m_info; } +protected: + ClientVersionInfo *m_info; +}; + +class EventClientLastInfo : public SIM::Event +{ +public: + EventClientLastInfo(ClientLastInfo *info) + : Event(SIM::eEventClientLastInfo), m_info(info) {} + + ClientLastInfo *info() const { return m_info; } +protected: + ClientLastInfo *m_info; +}; + +class EventClientTimeInfo : public SIM::Event +{ +public: + EventClientTimeInfo(ClientTimeInfo *info) + : Event(SIM::eEventClientTimeInfo), m_info(info) {} + + ClientTimeInfo *info() const { return m_info; } +protected: + ClientTimeInfo *m_info; +}; + +#endif // _JABBER_EVENTS_H diff --git a/plugins/jabber/jabber_pch.h b/plugins/jabber/jabber_pch.h new file mode 100644 index 0000000..19a4cc0 --- /dev/null +++ b/plugins/jabber/jabber_pch.h @@ -0,0 +1,55 @@ +#ifndef JABBER_PCH_H +#define JABBER_PCH_H +#pragma once + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef NO_QT_MOC_HEADER +#include +//#include +//#include +#endif + +#include "discoinfo.h" +#include "infoproxy.h" +#include "jabber.h" +#include "jabber_ssl.h" +#include "jabberaboutinfo.h" +#include "jabberadd.h" +#include "jabberbrowser.h" +#include "jabberclient.h" +#include "jabberconfig.h" +#include "jabberhomeinfo.h" +#include "jabberinfo.h" +#include "jabbermessage.h" +#include "jabberpicture.h" +#include "jabbersearch.h" +#include "jabberworkinfo.h" +#include "jidadvsearch.h" +#include "jidsearch.h" + +#endif // JABBER_PCH_H diff --git a/plugins/jabber/jabber_rosters.cpp b/plugins/jabber/jabber_rosters.cpp new file mode 100644 index 0000000..1250cee --- /dev/null +++ b/plugins/jabber/jabber_rosters.cpp @@ -0,0 +1,2893 @@ +/*************************************************************************** + jabber_rosters.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include +#include +#include +#include + +#include "html.h" +#include "log.h" +#include "unquot.h" +#include "misc.h" +#include "core_events.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +#include "jabberclient.h" +#include "jabber.h" +#include "jabbermessage.h" + +using namespace std; +using namespace SIM; + +class RostersRequest : public JabberClient::ServerRequest +{ +public: + RostersRequest(JabberClient *client); + ~RostersRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString m_jid; + QString m_name; + QString m_grp; + QString m_subscription; + unsigned m_subscribe; + unsigned m_bSubscription; + QString *m_data; +}; + +RostersRequest::RostersRequest(JabberClient *client) + : JabberClient::ServerRequest(client, _GET, NULL, NULL) +{ + m_data = NULL; + ContactList::ContactIterator itc; + Contact *contact; + while ((contact = ++itc) != NULL){ + ClientDataIterator it(contact->clientData, client); + JabberUserData *data; + while ((data = m_client->toJabberUserData(++it)) != NULL) + data->bChecked.asBool() = false; + } + client->m_bJoin = false; +} + +RostersRequest::~RostersRequest() +{ + ContactList::ContactIterator itc; + Contact *contact; + list contactRemoved; + while ((contact = ++itc) != NULL){ + ClientDataIterator it(contact->clientData, m_client); + JabberUserData *data; + list dataRemoved; + while ((data = m_client->toJabberUserData(++it)) != NULL){ + if (!data->bChecked.toBool()){ + QString jid = data->ID.str(); + JabberListRequest *lr = m_client->findRequest(jid, false); + if (lr && lr->bDelete) + m_client->findRequest(jid, true); + dataRemoved.push_back(data); + } + } + if (dataRemoved.empty()) + continue; + for (list::iterator itr = dataRemoved.begin(); itr != dataRemoved.end(); ++itr) + contact->clientData.freeData(*itr); + if (contact->clientData.size() == 0) + contactRemoved.push_back(contact); + } + for (list::iterator itr = contactRemoved.begin(); itr != contactRemoved.end(); ++itr) + delete *itr; + m_client->processList(); + if (m_client->m_bJoin){ + EventJoinAlert(m_client).process(); + } +} + +void RostersRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "item"){ + m_subscribe = SUBSCRIBE_NONE; + m_grp = QString::null; + m_jid = attrs.value("jid"); + if (m_jid.length() == 0) + return; + m_name = attrs.value("name"); + m_subscription = QString::null; + m_bSubscription = false; + QString subscribe = attrs.value("subscription"); + if (subscribe == "none"){ + m_subscribe = SUBSCRIBE_NONE; + }else if (subscribe == "from"){ + m_subscribe = SUBSCRIBE_FROM; + }else if (subscribe == "to"){ + m_subscribe = SUBSCRIBE_TO; + }else if (subscribe == "both"){ + m_subscribe = SUBSCRIBE_BOTH; + }else{ + log(L_WARN, "Unknown attr subscribe=%s", qPrintable(subscribe)); + } + return; + } + if (el == "group"){ + m_grp = QString::null; + m_data = &m_grp; + return; + } + if (el == "subscription"){ + m_bSubscription = true; + m_subscription = QString::null; + m_data = &m_subscription; + return; + } +} + +void RostersRequest::element_end(const QString& el) +{ + if (el == "group"){ + m_data = NULL; + return; + } + if (el == "item"){ + if ( m_jid.indexOf('/') >= 0 ) + { + // If roster contains two contacts + // user@jabber.ru and user@jabber.ru/some_resource + // than it will be impossible, to move user@jabber.ru from one group to another because + // after reloading sim it will be merged with user@jabber.ru/some_resource + // because sim-im see no difference between them :-/ + // So the simplest way to fix this bus is to ignore roster records with explicit resource + // This is a nasty hack, but I see no way to fix it without rewriting all jabber stuff :-( + // N. Shaplov + log(L_DEBUG,"Ignoring contact with explicit resource: %s", qPrintable(m_jid)); + return; + } + bool bChanged = false; + JabberListRequest *lr = m_client->findRequest(m_jid, false); + Contact *contact; + QString resource; + JabberUserData *data = m_client->findContact(m_jid, m_name, false, contact, resource); + if (data == NULL){ + if (lr && lr->bDelete){ + m_client->findRequest(m_jid, true); + }else{ + bChanged = true; + data = m_client->findContact(m_jid, m_name, true, contact, resource); + if (m_bSubscription){ + contact->setFlags(CONTACT_TEMP); + EventContact eContact(contact, EventContact::eChanged); + eContact.process(); + m_client->auth_request(m_jid, MessageAuthRequest, m_subscription, true); + data = m_client->findContact(m_jid, m_name, false, contact, resource); + } + } + } + if (data == NULL) + return; + if (data->Subscribe.toULong() != m_subscribe){ + bChanged = true; + data->Subscribe.asULong() = m_subscribe; + } + data->Group.str() = m_grp; + data->bChecked.asBool() = true; + if (lr == NULL){ + unsigned grp = 0; + if (!m_grp.isEmpty()){ + Group *group = NULL; + ContactList::GroupIterator it; + while ((group = ++it) != NULL){ + if (m_grp == group->getName()){ + grp = group->id(); + break; + } + } + if (group == NULL){ + group = getContacts()->group(0, true); + group->setName(m_grp); + grp = group->id(); + EventGroup e(group, EventGroup::eChanged); + e.process(); + } + } + if (contact->getGroup() != (int)grp){ + if (grp == 0){ + void *d = NULL; + ClientDataIterator it_d(contact->clientData); + while ((d = ++it_d) != NULL){ + if (d != data) + break; + } + if (d){ + grp = contact->getGroup(); + Group *group = getContacts()->group(grp); + if (group) + m_client->listRequest(data, contact->getName(), group->getName(), false); + } + } + contact->setGroup(grp); + bChanged = true; + } + } + if (bChanged){ + EventContact e(contact, EventContact::eChanged); + e.process(); + } + } +} + +void RostersRequest::char_data(const QString& str) +{ + if (m_data != NULL) + *m_data += str; +} + +void JabberClient::rosters_request() +{ + RostersRequest *req = new RostersRequest(this); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:roster"); + req->send(); + m_requests.push_back(req); +} + +class InfoRequest : public JabberClient::ServerRequest +{ +public: + InfoRequest(JabberClient *client, JabberUserData *data, bool bVCard); + ~InfoRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString m_jid; + QString m_node; + QString m_host; + bool m_bStarted; + QString m_firstName; + QString m_nick; + QString m_desc; + QString m_email; + QString m_bday; + QString m_url; + QString m_orgName; + QString m_orgUnit; + QString m_title; + QString m_role; + QString m_phone; + QString m_street; + QString m_ext; + QString m_city; + QString m_region; + QString m_pcode; + QString m_country; + QString m_photo; // a bas64 encoded string + QString m_logo; // a bas64 encoded string + bool m_bPhoto; + bool m_bLogo; + bool m_bVCard; + + QString *m_data; +}; + +extern DataDef jabberUserData[]; + +InfoRequest::InfoRequest(JabberClient *client, JabberUserData *data, bool bVCard) + : JabberClient::ServerRequest(client, _GET, NULL, client->buildId(data)) +{ + m_jid = data->ID.str(); + m_node = data->Node.str(); + m_bStarted = false; + m_data = NULL; + m_bPhoto = false; + m_bLogo = false; + m_bVCard = bVCard; +} + +InfoRequest::~InfoRequest() +{ + if (m_bStarted){ + Contact *contact = NULL; + JabberUserData *data; + JabberUserData u_data; + if (m_bVCard){ + load_data(jabberUserData, &u_data, NULL); + data = &u_data; + data->ID.str() = m_jid; + data->Node.str() = m_node; + }else{ + if (m_jid == m_client->data.owner.ID.str()){ + data = &m_client->data.owner; + }else{ + QString jid = m_jid; + if (jid.indexOf('@') == -1){ + jid += '@'; + jid += m_host; + } + QString resource; + data = m_client->findContact(jid, QString::null, false, contact, resource); + if (data == NULL) + return; + } + } + bool bChanged = false; + bChanged |= data->FirstName.setStr(m_firstName); + bChanged |= data->Nick.setStr(m_nick); + bChanged |= data->Desc.setStr(m_desc); + bChanged |= data->Bday.setStr(m_bday); + bChanged |= data->Url.setStr(m_url); + bChanged |= data->OrgName.setStr(m_orgName); + bChanged |= data->OrgUnit.setStr(m_orgUnit); + bChanged |= data->Title.setStr(m_title); + bChanged |= data->Role.setStr(m_role); + bChanged |= data->Street.setStr(m_street); + bChanged |= data->ExtAddr.setStr(m_ext); + bChanged |= data->City.setStr(m_city); + bChanged |= data->Region.setStr(m_region); + bChanged |= data->PCode.setStr(m_pcode); + bChanged |= data->Country.setStr(m_country); + bChanged |= data->EMail.setStr(m_email); + bChanged |= data->Phone.setStr(m_phone); + + if (m_bVCard){ + EventVCard(data).process(); + free_data(jabberUserData, &u_data); + return; + } + QImage photo; + if (m_photo.length()){ + QString fName = m_client->photoFile(data); + QFile f(fName); + if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + QByteArray cstr = m_photo.toAscii(); // ok, base64 encoded + f.write(QByteArray::fromBase64(cstr)); + f.close(); + photo.load(fName); + }else{ + log(L_ERROR, "Can't create %s", qPrintable(fName)); + } + } + if (photo.width() && photo.height()){ + if ((photo.width() != (int)(data->PhotoWidth.toLong())) || + (photo.height() != (int)(data->PhotoHeight.toLong()))) + bChanged = true; + data->PhotoWidth.asLong() = photo.width(); + data->PhotoHeight.asLong() = photo.height(); + if (m_jid == m_client->data.owner.ID.str()) + m_client->setPhoto(m_client->photoFile(data)); + }else{ + if (data->PhotoWidth.toLong() || data->PhotoHeight.toLong()) + bChanged = true; + data->PhotoWidth.asLong() = 0; + data->PhotoHeight.asLong() = 0; + } + + QImage logo; + if (m_logo.length()){ + QString fName = m_client->logoFile(data); + QFile f(fName); + if (f.open(QIODevice::WriteOnly | QIODevice::Truncate)){ + QByteArray cstr = m_logo.toAscii(); // ok, base64 encoded + f.write(QByteArray::fromBase64(cstr)); + f.close(); + logo.load(fName); + }else{ + log(L_ERROR, "Can't create %s", qPrintable(fName)); + } + } + if (logo.width() && logo.height()){ + if ((logo.width() != (int)(data->LogoWidth.toLong())) || + (logo.height() != (int)(data->LogoHeight.toLong()))) + bChanged = true; + data->LogoWidth.asLong() = logo.width(); + data->LogoHeight.asLong() = logo.height(); + if (m_jid == m_client->data.owner.ID.str()) + m_client->setLogo(m_client->logoFile(data)); + }else{ + if (data->LogoWidth.toLong() || data->LogoHeight.toLong()) + bChanged = true; + data->LogoWidth.asLong() = 0; + data->LogoHeight.asLong() = 0; + } + + if (bChanged){ + if (contact){ + m_client->setupContact(contact, data); + EventContact(contact, EventContact::eChanged).process(); + }else{ + EventClientChanged(m_client).process(); + } + } + } +} + +void InfoRequest::element_start(const QString& el, const QXmlAttributes&) +{ + m_data = NULL; + if (el == "vcard"){ + m_bStarted = true; + return; + } + if (el == "nickname"){ + m_data = &m_nick; + return; + } + if (el == "fn"){ + m_data = &m_firstName; + return; + } + if (el == "desc"){ + m_data = &m_desc; + return; + } + if (el == "email"){ + m_data = &m_email; + return; + } + if (el == "bday"){ + m_data = &m_bday; + return; + } + if (el == "url"){ + m_data = &m_url; + return; + } + if (el == "orgname"){ + m_data = &m_orgName; + return; + } + if (el == "orgunit"){ + m_data = &m_orgUnit; + return; + } + if (el == "title"){ + m_data = &m_title; + return; + } + if (el == "role"){ + m_data = &m_role; + return; + } + if (el == "voice"){ + m_data = &m_phone; + return; + } + if (el == "street"){ + m_data = &m_street; + return; + } + if (el == "extadd"){ + m_data = &m_ext; + return; + } + if (el == "locality"){ + m_data = &m_city; + return; + } + if (el == "region"){ + m_data = &m_region; + return; + } + if (el == "pcode"){ + m_data = &m_pcode; + return; + } + if (el == "country"){ + m_data = &m_country; + return; + } + if (el == "photo"){ + m_bPhoto = true; + return; + } + if (el == "logo"){ + m_bLogo = true; + return; + } + if (el == "binval"){ + if (m_bPhoto) + m_data = &m_photo; + if (m_bLogo) + m_data = &m_logo; + } +} + +void InfoRequest::element_end(const QString& el) +{ + m_data = NULL; + if (el == "photo"){ + m_bPhoto = false; + return; + } + if (el == "logo"){ + m_bLogo = false; + return; + } + if(el == "vcard") + { + EventClientChanged(m_client).process(); + } +} + +void InfoRequest::char_data(const QString& str) +{ + if (m_data) + *m_data += str; +} + +void JabberClient::info_request(JabberUserData *user_data, bool bVCard) +{ + if (getState() != Connected) + return; + if (user_data == NULL) + user_data = &data.owner; + InfoRequest *req = new InfoRequest(this, user_data, bVCard); + req->start_element("vCard"); + req->add_attribute("prodid", "-//HandGen//NONSGML vGen v1.0//EN"); + req->add_attribute("xmlns", "vcard-temp"); + req->add_attribute("version", "2.0"); + if (!user_data->Node.str().isEmpty()) + req->add_attribute("node", user_data->Node.str()); + req->send(); + m_requests.push_back(req); +} + +class SetInfoRequest : public JabberClient::ServerRequest +{ +public: + SetInfoRequest(JabberClient *client, JabberUserData *data); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); +}; + +SetInfoRequest::SetInfoRequest(JabberClient *client, JabberUserData *data) + : JabberClient::ServerRequest(client, _SET, NULL, client->buildId(data)) +{ +} + +void SetInfoRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "iq"){ + QString type = attrs.value("type"); + if (type == "result") + m_client->setInfoUpdated(false); + } +} + +void JabberClient::setClientInfo(void *_data) +{ + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + if (data != &this->data.owner){ + this->data.owner.FirstName.str() = data->FirstName.str(); + this->data.owner.Nick.str() = data->Nick.str(); + this->data.owner.Desc.str() = data->Desc.str(); + this->data.owner.Bday.str() = data->Bday.str(); + this->data.owner.Url.str() = data->Url.str(); + this->data.owner.OrgName.str() = data->OrgName.str(); + this->data.owner.OrgUnit.str() = data->OrgUnit.str(); + this->data.owner.Title.str() = data->Title.str(); + this->data.owner.Role.str() = data->Role.str(); + this->data.owner.Street.str() = data->Street.str(); + this->data.owner.ExtAddr.str() = data->ExtAddr.str(); + this->data.owner.City.str() = data->City.str(); + this->data.owner.Region.str() = data->Region.str(); + this->data.owner.PCode.str() = data->PCode.str(); + this->data.owner.Country.str() = data->Country.str(); + } + setInfoUpdated(true); + if (getState() != Connected) + return; + SetInfoRequest *req = new SetInfoRequest(this, &this->data.owner); + req->start_element("vCard"); + req->add_attribute("prodid", "-//HandGen//NONSGML vGen v1.0//EN"); + req->add_attribute("xmlns", "vcard-temp"); + req->add_attribute("version", "2.0"); + req->add_attribute("node", data->Node.str()); + req->text_tag("FN", data->FirstName.str()); + req->text_tag("NICKNAME", data->Nick.str()); + req->text_tag("DESC", data->Desc.str()); + QString mails = getContacts()->owner()->getEMails(); + while (mails.length()){ + QString mailItem = getToken(mails, ';', false); + QString mail = getToken(mailItem, '/'); + if (mailItem.length()) + continue; + req->text_tag("EMAIL", mail); + break; + } + req->text_tag("BDAY", data->Bday.str()); + req->text_tag("URL", data->Url.str()); + req->start_element("ORG"); + req->text_tag("ORGNAME", data->OrgName.str()); + req->text_tag("ORGUNIT", data->OrgUnit.str()); + req->end_element(); + req->text_tag("TITLE", data->Title.str()); + req->text_tag("ROLE", data->Role.str()); + QString phone; + QString phones = getContacts()->owner()->getPhones(); + while (phones.length()){ + QString phoneItem = getToken(phones, ';', false); + QString phoneValue = getToken(phoneItem, '/', false); + if (phoneItem.length()) + continue; + QString number = getToken(phoneValue, ','); + QString type = getToken(phoneValue, ','); + if (type == "Hone Phone"){ + phone = number; + break; + } + } + if (phone.length()){ + req->start_element("TEL"); + req->start_element("HOME"); + req->end_element(); + req->text_tag("VOICE", phone); + req->end_element(); + } + req->start_element("ADDR"); + req->start_element("HOME"); + req->end_element(); + req->text_tag("STREET", data->Street.str()); + req->text_tag("EXTADD", data->ExtAddr.str()); + req->text_tag("LOCALITY", data->City.str()); + req->text_tag("REGION", data->Region.str()); + req->text_tag("PCODE", data->PCode.str()); + req->text_tag("COUNTRY", data->Country.str()); + req->end_element(); + if (!getPhoto().isEmpty()){ + QFile img(getPhoto()); + if (img.open(QIODevice::ReadOnly)){ + Buffer b; + b.init(img.size()); + img.read(b.data(), b.size()); + QByteArray packed = b.toBase64(); + req->start_element("PHOTO"); + req->text_tag("BINVAL", packed); + req->end_element(); + } + } + if (!getLogo().isEmpty()){ + QFile img(getLogo()); + if (img.open(QIODevice::ReadOnly)){ + Buffer b; + b.init(img.size()); + img.read(b.data(), b.size()); + QByteArray packed = b.toBase64(); + req->start_element("LOGO"); + req->text_tag("BINVAL", packed.data()); + req->end_element(); + } + } + req->send(); + m_requests.push_back(req); +} + +class AddRequest : public JabberClient::ServerRequest +{ +public: + AddRequest(JabberClient *client, const QString &jid, unsigned grp); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + QString m_jid; + unsigned m_grp; +}; + +AddRequest::AddRequest(JabberClient *client, const QString &jid, unsigned grp) + : JabberClient::ServerRequest(client, _SET, NULL, NULL) +{ + m_jid = jid; + m_grp = grp; +} + +void AddRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "iq"){ + QString type = attrs.value("type"); + if (type == "result"){ + Contact *contact; + QString resource; + JabberUserData *data = m_client->findContact(m_jid, QString::null, true, contact, resource); + if (data && (contact->getGroup() != (int)m_grp)){ + contact->setGroup(m_grp); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + } + } +} + +bool JabberClient::add_contact(const char *_jid, unsigned grp) +{ + Contact *contact; + QString resource; + QString jid = QString::fromUtf8(_jid); + if (findContact(jid, QString::null, false, contact, resource)){ + EventContact e(contact, EventContact::eChanged); + e.process(); + return false; + } + AddRequest *req = new AddRequest(this, jid, grp); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:roster"); + req->start_element("item"); + req->add_attribute("jid", jid); + Group *g = NULL; + if (grp) + g = getContacts()->group(grp); + if (g) + req->text_tag("group", g->getName()); + req->send(); + m_requests.push_back(req); + return true; +} + +JabberClient::PresenceRequest::PresenceRequest(JabberClient *client) + : ServerRequest(client, NULL, NULL, NULL) +{ +} + +//static unsigned get_number(QString &s, unsigned digits) +//{ +// if ((unsigned)s.length() < digits){ +// s = QString::null; +// return 0; +// } +// QString p = s.left(digits); +// s = s.mid(digits); +// return p.toUInt(); +//} + +static QDateTime fromDelay(const QString &t) +{ + QDateTime dt(QDateTime::currentDateTime()); + QRegExp reg("^(\\d{4})-?(\\d{2})-?(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(.(\\d{3}))?((Z)|([-+]\\d{2}:\\d{2}))?$"); + do { + if( reg.indexIn(t) == -1 ) + break; + int numcap = reg.numCaptures(); + if( numcap < 6 ) + break; + QDate date; + date.setYMD( + reg.cap(1).toUInt(), + reg.cap(2).toUInt(), + reg.cap(3).toUInt() + ); + QTime time; + time.setHMS( + reg.cap(4).toUInt(), + reg.cap(5).toUInt(), + reg.cap(6).toUInt() + ); + dt.setDate( date ); + dt.setTime( time ); + if( numcap < 9 ) + break; + QString sTZD = reg.cap(9); + if( sTZD == "Z" ) { + dt.setTimeSpec( Qt::UTC ); + } + else { + dt.setTimeSpec( Qt::OffsetFromUTC ); + int secs = QTime::fromString(sTZD.right(5),"hh:mm").secsTo(QTime(0,0,0,0)); + if( sTZD[0] == '+' ) + secs = -secs; + dt.setUtcOffset( secs ); + dt.toLocalTime(); + } + } while( false ); + + return dt; +} + +JabberClient::PresenceRequest::~PresenceRequest() +{ + unsigned status = STATUS_UNKNOWN; + bool bInvisible = false; + // RFC 3921 "XMPP IM": 2.2.1. Types of Presence + if (m_type == "unavailable"){ + status = STATUS_OFFLINE; + }else if (m_type == "subscribe"){ + m_client->auth_request(m_from, MessageAuthRequest, m_status, true); + }else if (m_type == "subscribed"){ + m_client->auth_request(m_from, MessageAuthGranted, m_status, true); + }else if (m_type == "unsubscribe"){ + m_client->auth_request(m_from, MessageRemoved, m_status, true); + }else if (m_type == "unsubscribed"){ + m_client->auth_request(m_from, MessageAuthRefused, m_status, true); + }else if (m_type == "probe"){ + // server want to to know if we're living + m_client->ping(); + }else if (m_type == "error"){ + log(L_DEBUG, "An error has occurred regarding processing or delivery of a previously-sent presence stanza"); + }else if (m_type.length() == 0){ + // RFC 3921 "XMPP IM": 2.2.2.1. Show + status = STATUS_ONLINE; + if (m_show == "away"){ + status = STATUS_AWAY; + }else if (m_show == "chat"){ + status = STATUS_FFC; + }else if (m_show == "xa"){ + status = STATUS_NA; + }else if (m_show == "dnd"){ + status = STATUS_DND; + }else if (m_show == "occupied"){ + status = STATUS_OCCUPIED; + }else if (m_show == "online"){ + status = STATUS_ONLINE; + }else if (m_show.isEmpty()){ + // RFC 3921 "XMPP IM": 2.2.2.2. Status + status = STATUS_ONLINE; + if (m_status == "Online"){ + status = STATUS_ONLINE; + }else if (m_status == "Disconnected"){ + status = STATUS_OFFLINE; + }else if (m_status == "Connected"){ + status = STATUS_ONLINE; + }else if (m_status == "Invisible"){ + status = STATUS_ONLINE; + bInvisible = true; + }else if (!m_status.isEmpty()){ + status = STATUS_ONLINE; + } + }else{ + log(L_DEBUG, "Unsupported available status %s", qPrintable(m_show)); + } + }else{ + log(L_DEBUG, "Unsupported presence type %s", qPrintable(m_type)); + } + QDateTime time1(QDateTime::currentDateTime()); + QDateTime time2; + if (!m_stamp1.isEmpty()) + time1 = fromDelay(m_stamp1); + if (!m_stamp2.isEmpty()){ + time2 = fromDelay(m_stamp2); + if (time2 > time1){ + QDateTime t = time1; + time1 = time2; + time2 = t; + } + } + + if (status != STATUS_UNKNOWN){ + Contact *contact; + QString resource; + JabberUserData *data = m_client->findContact(m_from, QString::null, false, contact, resource); + if (data){ + unsigned i; + for (i = 1; i <= data->nResources.toULong(); i++){ + if (resource == get_str(data->Resources, i)) + break; + } + bool bChanged = false; + if (status == STATUS_OFFLINE){ + if (i <= data->nResources.toULong()){ + bChanged = true; + vector resources; + vector resourceReply; + vector resourceStatus; + vector resourceStatusTime; + vector resourceOnlineTime; + vector resourceClientName; + vector resourceClientVersion; + vector resourceClientOS; + for (unsigned n = 1; n <= data->nResources.toULong(); n++){ + if (i == n) + continue; + resources.push_back(get_str(data->Resources, n)); + resourceReply.push_back(get_str(data->ResourceReply, n)); + resourceStatus.push_back(get_str(data->ResourceStatus, n)); + resourceStatusTime.push_back(get_str(data->ResourceStatusTime, n)); + resourceOnlineTime.push_back(get_str(data->ResourceOnlineTime, n)); + resourceClientName.push_back(get_str(data->ResourceClientName, n)); + resourceClientVersion.push_back(get_str(data->ResourceClientVersion, n)); + resourceClientOS.push_back(get_str(data->ResourceClientOS, n)); + } + data->Resources.clear(); + data->ResourceReply.clear(); + data->ResourceStatus.clear(); + data->ResourceStatusTime.clear(); + data->ResourceOnlineTime.clear(); + data->ResourceClientName.clear(); + data->ResourceClientVersion.clear(); + data->ResourceClientOS.clear(); + for (i = 0; i < resources.size(); i++){ + set_str(&data->Resources, i + 1, resources[i]); + set_str(&data->ResourceReply, i + 1, resourceReply[i]); + set_str(&data->ResourceStatus, i + 1, resourceStatus[i]); + set_str(&data->ResourceStatusTime, i + 1, resourceStatusTime[i]); + set_str(&data->ResourceOnlineTime, i + 1, resourceOnlineTime[i]); + set_str(&data->ResourceClientName, i + 1, resourceClientName[i]); + set_str(&data->ResourceClientVersion, i + 1, resourceClientVersion[i]); + set_str(&data->ResourceClientOS, i + 1, resourceClientOS[i]); + } + data->nResources.asULong() = resources.size(); + } + if (data->nResources.toULong() == 0) + data->AutoReply.str() = m_status; + }else{ + if (i > data->nResources.toULong()){ + bChanged = true; + data->nResources.asULong() = i; + set_str(&data->Resources, i, resource); + set_str(&data->ResourceOnlineTime, i, QString::number(!time2.isNull() ? time2.toTime_t() : time1.toTime_t())); + if (m_client->getUseVersion()) + m_client->versionInfo(m_from); + } + if (QString::number(status) != get_str(data->ResourceStatus, i)){ + bChanged = true; + set_str(&data->ResourceStatus, i, QString::number(status)); + set_str(&data->ResourceStatusTime, i, QString::number(time1.toTime_t())); + } + if (m_status != get_str(data->ResourceReply, i)){ + bChanged = true; + set_str(&data->ResourceReply, i, m_status); + } + } + bool bOnLine = false; + status = STATUS_OFFLINE; + for (i = 1; i <= data->nResources.toULong(); i++){ + unsigned rStatus = get_str(data->ResourceStatus, i).toUInt(); + if (rStatus > status) + status = rStatus; + } + if (data->Status.toULong() != status){ + bChanged = true; + if ((status == STATUS_ONLINE) && + (((int)(time1.toTime_t() - m_client->data.owner.OnlineTime.toULong()) > 60) || + (data->Status.toULong() != STATUS_OFFLINE))) + bOnLine = true; + if (data->Status.toULong() == STATUS_OFFLINE){ + data->OnlineTime.asULong() = time1.toTime_t(); + data->richText.asBool() = true; + } + if (status == STATUS_OFFLINE && data->IsTyping.toBool()){ + data->IsTyping.asBool() = false; + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + data->Status.asULong() = status; + data->StatusTime.asULong() = time1.toTime_t(); + } + if (data->invisible.toBool() != bInvisible){ + data->invisible.asBool() = bInvisible; + bChanged = true; + } + if (bChanged){ + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(m_client->dataName(data)); + m->setFlags(MESSAGE_RECEIVED); + m->setStatus(status); + EventMessageReceived e(m); + if(!e.process()) + delete m; + } + if (bOnLine && !contact->getIgnore() && !m_client->isAgent(data->ID.str())){ + EventContact e(contact, EventContact::eOnline); + e.process(); + } + } + } +} + +void JabberClient::PresenceRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "presence"){ + m_from = attrs.value("from"); + m_type = attrs.value("type"); + } + // XEP-0203: Delayed Delivery + if (el == "delay"){ + if (attrs.value("xmlns") == "http://www.xmpp.org/extensions/xep-0203.html#ns"){ + QString stamp = attrs.value("stamp"); + if (!stamp.isEmpty()){ + if (m_stamp1.isEmpty()){ + m_stamp1 = stamp; + }else if (m_stamp2.isEmpty()){ + m_stamp2 = stamp; + } + } + } + } else + if (el == "x"){ + // XEP-0091: Delayed Delivery + if (attrs.value("xmlns") == "jabber:x:delay"){ + QString stamp = attrs.value("stamp"); + if (!stamp.isEmpty()){ + if (m_stamp1.isEmpty()){ + m_stamp1 = stamp; + }else if (m_stamp2.isEmpty()){ + m_stamp2 = stamp; + } + } + } + } + m_data = QString::null; +} + +void JabberClient::PresenceRequest::element_end(const QString& el) +{ + if (el == "show"){ + m_show = m_data; + }else if (el == "status"){ + m_status = m_data; + } +} + +void JabberClient::PresenceRequest::char_data(const QString& str) +{ + m_data += str; +} + +JabberClient::IqRequest::IqRequest(JabberClient *client) + : ServerRequest(client, NULL, NULL, NULL) +{ + m_data = NULL; + m_file_size = 0; +} + +JabberClient::IqRequest::~IqRequest() +{ + JabberFileMessage *msg = NULL; + if (m_query == "jabber:iq:oob"){ + QString proto = m_url.left(7); + if (proto != "http://"){ + log(L_WARN, "Unknown protocol"); + return; + } + m_url = m_url.mid(7); + int n = m_url.indexOf(':'); + if (n < 0){ + log(L_WARN, "Port not found"); + return; + } + QString host = m_url.left(n); + unsigned short port = (unsigned short)m_url.mid(n + 1).toLong(); + n = m_url.indexOf('/'); + if (n < 0){ + log(L_WARN, "File not found"); + return; + } + QString file = m_url.mid(n + 1); + msg = new JabberFileMessage; + msg->setDescription(file); + msg->setText(m_descr); + msg->setHost(host); + msg->setPort(port); + }else if (!m_file_name.isEmpty()){ + msg = new JabberFileMessage; + msg->setDescription(m_file_name); + msg->setSize(m_file_size); + } + if (msg){ + Contact *contact; + QString resource; + JabberUserData *data = m_client->findContact(m_from, QString::null, false, contact, resource); + if (data == NULL){ + data = m_client->findContact(m_from, QString::null, true, contact, resource); + if (data == NULL) + return; + contact->setFlags(CONTACT_TEMP); + } + msg->setFrom(m_from); + msg->setID(m_id); + msg->setFlags(MESSAGE_RECEIVED | MESSAGE_TEMP); + msg->setClient(m_client->dataName(data)); + msg->setContact(contact->id()); + m_client->m_ackMsg.push_back(msg); + EventMessageReceived e(msg); + if (e.process()){ + for (list::iterator it = m_client->m_ackMsg.begin(); it != m_client->m_ackMsg.end(); ++it){ + if ((*it) == msg){ + m_client->m_ackMsg.erase(it); + break; + } + } + } + } +} + +void JabberClient::IqRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "iq"){ + m_from = attrs.value("from"); + m_id = attrs.value("id"); + m_type = attrs.value("type"); + return; + } + if (el == "query"){ + m_query = attrs.value("xmlns"); + } + if ( (el == "item") && (m_query == "jabber:iq:roster") ){ + QString jid = attrs.value("jid"); + QString subscription = attrs.value("subscription"); + QString name = attrs.value("name"); + if (!subscription.isEmpty()){ + unsigned subscribe = SUBSCRIBE_NONE; + if (subscription == "none"){ + subscribe = SUBSCRIBE_NONE; + }else if (subscription == "to"){ + subscribe = SUBSCRIBE_TO; + }else if (subscription == "from"){ + subscribe = SUBSCRIBE_FROM; + }else if (subscription == "both"){ + subscribe = SUBSCRIBE_BOTH; + }else if (subscription == "remove"){ + }else{ + log(L_DEBUG, "Unknown value subscription=%s", qPrintable(subscription)); + } + Contact *contact; + QString resource; + JabberUserData *data = m_client->findContact(jid, name, false, contact, resource); + if ((data == NULL) && (subscribe != SUBSCRIBE_NONE)){ + data = m_client->findContact(jid, name, true, contact, resource); + } + if (data && (data->Subscribe.toULong() != subscribe)){ + data->Subscribe.asULong() = subscribe; + EventContact e(contact, EventContact::eChanged); + e.process(); + if (m_client->getAutoSubscribe() && ((subscribe & SUBSCRIBE_FROM) == 0)){ + AuthMessage *msg = new AuthMessage(MessageAuthRequest); + msg->setContact(contact->id()); + msg->setFlags(MESSAGE_NOHISTORY); + m_client->send(msg, data); + } + } + } + } + // XEP-0092: Software Version + if ( (el == "query") && (m_query == "jabber:iq:version") ){ + if (m_type == "get" && m_client->getUseVersion()){ + // send our version + JabberClient::ServerRequest *req = new JabberClient::ServerRequest(m_client, JabberClient::ServerRequest::_RESULT, QString(), m_from, m_id); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:version"); + req->text_tag("name", PACKAGE); + req->text_tag("version", VERSION); + QString version = get_os_version(); + req->text_tag("os", version); + req->send(); + m_client->m_requests.push_back(req); + } + } + if (el == "url") + m_data = &m_url; + if (el == "desc") + m_data = &m_descr; + if (el == "file"){ + m_file_name = attrs.value("name"); + m_file_size = attrs.value("size").toUInt(); + } +} + +void JabberClient::IqRequest::element_end(const QString&) +{ + m_data = NULL; +} + +void JabberClient::IqRequest::char_data(const QString& str) +{ + if (m_data) + *m_data += str; +} + +JabberClient::StreamErrorRequest::StreamErrorRequest(JabberClient *client) + : ServerRequest(client, NULL, NULL, NULL) +{ +} + +JabberClient::StreamErrorRequest::~StreamErrorRequest() +{ + m_client->socket()->error_state(m_descr); +} + +void JabberClient::StreamErrorRequest::element_start(const QString& el, const QXmlAttributes&) +{ + if (el == "text"){ + m_data = &m_descr; + return; + } +} + +void JabberClient::StreamErrorRequest::element_end(const QString&) +{ + m_data = NULL; +} + +void JabberClient::StreamErrorRequest::char_data(const QString& str) +{ + if (m_data) + *m_data += str; +} + +class JabberBgParser : public HTMLParser +{ +public: + JabberBgParser(); + QString parse(const QString &text); + unsigned bgColor; +protected: + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &attrs); + virtual void tag_end(const QString &tag); + QString res; +}; + +JabberBgParser::JabberBgParser() +{ + bgColor = 0xFFFFFF; +} + +QString JabberBgParser::parse(const QString &text) +{ + res = QString::null; + HTMLParser::parse(text); + return res; +} + +void JabberBgParser::text(const QString &text) +{ + res += quoteString(text); +} + +void JabberBgParser::tag_start(const QString &tag, const list &attrs) +{ + if (tag == "body"){ + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + if (name.toLower() == "bgcolor"){ + QColor c(value); + bgColor = c.rgb(); + } + } + return; + } + res += '<'; + res += tag; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + res += ' '; + res += name; + if (name == "style"){ + list styles = parseStyle(value); + for (list::iterator it = styles.begin(); it != styles.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + if (name == "background-color"){ + QColor c; + c.setNamedColor(value); + bgColor = c.rgb() & 0xFFFFFF; + } + } + } + if (!value.isEmpty()){ + res += "=\'"; + res += quoteString(value); + res += "\'"; + } + } + res += '>'; +} + +void JabberBgParser::tag_end(const QString &tag) +{ + if (tag == "body"){ + return; + } + res += "'; +} + +JabberClient::MessageRequest::MessageRequest(JabberClient *client) + : ServerRequest(client, NULL, NULL, NULL) +{ + m_data = NULL; + m_errorCode = 0; + m_bBody = false; + m_bCompose = false; + m_bEvent = false; + m_bRichText = false; + m_bEnc = false; + m_bRosters = false; + m_bError = false; +} + +JabberClient::MessageRequest::~MessageRequest() +{ + if (m_from.isEmpty()) + return; + Contact *contact; + QString resource; + JabberUserData *data = m_client->findContact(m_from, QString::null, false, contact, resource); + if (data == NULL){ + data = m_client->findContact(m_from, QString::null, true, contact, resource); + if (data == NULL) + return; + contact->setFlags(CONTACT_TEMP); + } + Message *msg = NULL; + + if (!m_bError){ + // JEP-0022 composing event handling + if (m_bBody){ + // Msg contains normal message. + // here means "send me composing events, please", so we should do it. + // But if that tag is absent, we must not send them. + data->SendTypingEvents.asBool() = m_bCompose; + data->TypingId.str() = (m_bCompose ? m_id : QString::null); + + // also, incoming message implicitly means that user has stopped typing + if (data->IsTyping.toBool()){ + data->IsTyping.asBool() = false; + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + } + else{ + // Msg has no body ==> it is event message. + // Presence of here means "I'm typing", absence - "I'm not typing anymore". + data->IsTyping.asBool() = m_bCompose; + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + } + + if (m_errorCode || !m_error.isEmpty()){ + if (!m_bEvent){ + JabberMessageError *m = new JabberMessageError; + m->setError(m_error); + m->setCode(m_errorCode); + msg = m; + } + }else if (m_bBody){ + if (!m_contacts.isEmpty()){ + msg = new ContactsMessage; + static_cast(msg)->setContacts(m_contacts); + }else if (m_subj.isEmpty()){ + msg = new Message(MessageGeneric); + }else{ + JabberMessage *m = new JabberMessage; + m->setSubject(m_subj); + msg = m; + } + } + if (msg == NULL) + return; + if (m_bBody && m_contacts.isEmpty()){ + if (!m_enc.isEmpty()){ + data->richText.asBool() = false; + msg->setText(m_enc); + }else if (m_richText.isEmpty()){ + data->richText.asBool() = false; + msg->setText(m_body); + }else{ + JabberBgParser p; + msg->setText(p.parse(m_richText)); + msg->setFlags(MESSAGE_RICHTEXT); + msg->setBackground(p.bgColor); + } + if (m_targets.size()){ + if ((msg->getFlags() & MESSAGE_RICHTEXT) == 0){ + msg->setText(quoteString(msg->getText())); + msg->setFlags(MESSAGE_RICHTEXT); + } + QString text = msg->getText(); + for (unsigned i = 0; i < m_targets.size(); i++){ + text += "
    "; + text += quoteString(m_descs[i]); + text += ""; + } + } + }else{ + msg->setText(m_body); + } + msg->setFlags(msg->getFlags() | MESSAGE_RECEIVED); + msg->setClient(m_client->dataName(data)); + msg->setContact(contact->id()); + EventMessageReceived e(msg); + if (!e.process()) + delete msg; +} + +void JabberClient::MessageRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (m_bRichText){ + *m_data += '<'; + *m_data += el; + for (int i = 0; i < attrs.count(); i++){ + *m_data += ' '; + *m_data += attrs.qName(i); + QChar ch('\''); + if(attrs.value(i).contains(QChar('\''))) + ch = QChar('"'); + *m_data += "="; + *m_data += ch; + *m_data += attrs.value(i); + *m_data += ch; + } + *m_data += '>'; + return; + } + m_data = NULL; + if (el == "message"){ + m_from = attrs.value("from"); + m_id = attrs.value("id"); + if (attrs.value("type") == "error") + m_bError = true; + return; + } + if (el == "body"){ + m_data = &m_body; + m_bBody = true; + return; + } + if (el == "subject"){ + m_data = &m_subj; + return; + } + if (el == "error"){ + m_errorCode = attrs.value("code").toUInt(); + m_data = &m_error; + return; + } + if (m_bEvent){ + // Parsing tag, which contains JEP-0022 event info + if (el == "composing"){ + m_bCompose = true; + return; + } + } + if (el == "url-data"){ + m_target = attrs.value("target"); + m_desc = QString::null; + return; + } + if (el == "desc"){ + m_data = &m_desc; + return; + } + if (m_bRosters && el == "item"){ + QString jid = attrs.value("jid"); + QString name = attrs.value("name"); + if (!jid.isEmpty()){ + if (!m_contacts.isEmpty()) + m_contacts += ';'; + m_contacts += "jabber:"; + m_contacts += jid; + if (name.isEmpty()){ + int n = jid.indexOf('@'); + if (n >= 0){ + name = jid.left(n); + }else{ + name = jid; + } + } + m_contacts += '/'; + m_contacts += name; + m_contacts += ','; + m_contacts += name; + m_contacts += " ("; + m_contacts += jid; + m_contacts += ')'; + } + return; + } + if (el == "x"){ + if (attrs.value("xmlns") == "jabber:x:event") + m_bEvent = true; + else if (attrs.value("xmlns") == "jabber:x:roster") + m_bRosters = true; + else if (attrs.value("xmlns") == "jabber:x:encrypted"){ + m_data = &m_enc; + *m_data += "-----BEGIN PGP MESSAGE-----\n\n"; + m_bEnc = true; + } + return; + } + if (el == "html"){ + if (attrs.value("xmlns") == "http://jabber.org/protocol/xhtml-im"){ + m_bRichText = true; + m_data = &m_richText; + } + return; + } +} + +void JabberClient::MessageRequest::element_end(const QString& el) +{ + if (m_bRichText){ + if (el == "html"){ + m_bRichText = false; + m_data = NULL; + return; + } + *m_data += "'; + return; + } else + if (el == "x") { + if (m_bEnc){ + m_bEnc = false; + *m_data += "\n-----END PGP MESSAGE-----\n"; + }else + m_bRosters = false; + } else + if (el == "url-data"){ + if (!m_target.isEmpty()){ + if (m_desc.isEmpty()) + m_desc = m_target; + m_targets.push_back(m_target); + m_descs.push_back(m_desc); + } + m_target = QString::null; + m_desc = QString::null; + } + m_data = NULL; +} + +void JabberClient::MessageRequest::char_data(const QString& str) +{ + if (m_data) + *m_data += str; +} + +class AgentRequest : public JabberClient::ServerRequest +{ +public: + AgentRequest(JabberClient *client, const QString &jid); + ~AgentRequest(); +protected: + JabberAgentsInfo data; + QString m_data; + QString m_jid; + bool m_bError; + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); +}; + +class AgentsDiscoRequest : public JabberClient::ServerRequest +{ +public: + AgentsDiscoRequest(JabberClient *client); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); +}; + +class AgentDiscoRequest : public JabberClient::ServerRequest +{ +public: + AgentDiscoRequest(JabberClient *client, const QString &jid); + ~AgentDiscoRequest(); +protected: + JabberAgentsInfo data; + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + bool m_bError; +}; + +static DataDef jabberAgentsInfo[] = + { + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_BOOL, 1, 0 }, + { "", DATA_BOOL, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +AgentDiscoRequest::AgentDiscoRequest(JabberClient *client, const QString &jid) + : ServerRequest(client, _GET, NULL, jid) +{ + load_data(jabberAgentsInfo, &data, NULL); + data.ID.str() = jid; + m_bError = false; +} + +AgentDiscoRequest::~AgentDiscoRequest() +{ + if (data.Name.str().isEmpty()){ + QString jid = data.ID.str(); + int n = jid.indexOf('.'); + if (n > 0){ + jid = jid.left(n); + data.Name.str() = jid; + } + } + if (m_bError){ + data.Register.asBool() = true; + data.Search.asBool() = true; + } + if (!data.Name.str().isEmpty()){ + data.VHost.str() = m_client->VHost(); + data.Client = m_client; +// unhandled ... +// Event e(EventAgentFound, &data); +// e.process(); + } + free_data(jabberAgentsInfo, &data); +} + +void AgentDiscoRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "error"){ + m_bError = true; + return; + } + if (el == "identity"){ + data.Name.str() = attrs.value("name"); + return; + } + if (el == "feature"){ + QString s = attrs.value("var"); + if (s == "jabber:iq:register") + data.Register.asBool() = true; + if (s == "jabber:iq:search") + data.Search.asBool() = true; + } +} + +AgentsDiscoRequest::AgentsDiscoRequest(JabberClient *client) + : ServerRequest(client, _GET, NULL, client->VHost()) +{ +} + +void AgentsDiscoRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el != "item") + return; + QString jid = attrs.value("jid"); + if (!jid.isEmpty()){ + AgentDiscoRequest *req = new AgentDiscoRequest(m_client, jid); + req->start_element("query"); + req->add_attribute("xmlns", "http://jabber.org/protocol/disco#info"); + req->send(); + m_client->m_requests.push_back(req); + } +} + +AgentRequest::AgentRequest(JabberClient *client, const QString &jid) + : ServerRequest(client, _GET, NULL, jid) +{ + load_data(jabberAgentsInfo, &data, NULL); + m_bError = false; + m_jid = jid; +} + +AgentRequest::~AgentRequest() +{ + free_data(jabberAgentsInfo, &data); + if (m_bError){ + AgentsDiscoRequest *req = new AgentsDiscoRequest(m_client); + req->start_element("query"); + req->add_attribute("xmlns", "http://jabber.org/protocol/disco#items"); + req->send(); + m_client->m_requests.push_back(req); + } +} + +void AgentRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "agent"){ + free_data(jabberAgentsInfo, &data); + load_data(jabberAgentsInfo, &data, NULL); + m_data = attrs.value("jid"); + data.ID.str() = m_data; + }else if (el == "search"){ + data.Search.asBool() = true; + }else if (el == "register"){ + data.Register.asBool() = true; + }else if (el == "error"){ + m_bError = true; + } + m_data = QString::null; +} + +void AgentRequest::element_end(const QString& el) +{ + if (el == "agent"){ + if (!data.ID.str().isEmpty()){ + data.VHost.str() = m_client->VHost(); + data.Client = m_client; +// unhandled ... +// Event e(EventAgentFound, &data); +// e.process(); + } + }else if (el == "name"){ + data.Name.str() = m_data; + } +} + +void AgentRequest::char_data(const QString& str) +{ + m_data += str; +} + +QString JabberClient::get_agents(const QString &jid) +{ + AgentRequest *req = new AgentRequest(this, jid); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:agents"); + addLang(req); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +class AgentInfoRequest : public JabberClient::ServerRequest +{ +public: + AgentInfoRequest(JabberClient *client, const QString &jid); + ~AgentInfoRequest(); +protected: + JabberAgentInfo data; + bool m_bOption; + QString m_data; + QString m_jid; + QString m_error; + bool m_bError; + unsigned m_error_code; + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); +}; + +static DataDef jabberAgentInfo[] = + { + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRLIST, 1, 0 }, + { "", DATA_STRLIST, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, + { "", DATA_BOOL, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + + +AgentInfoRequest::AgentInfoRequest(JabberClient *client, const QString &jid) + : ServerRequest(client, _GET, NULL, jid) +{ + m_jid = jid; + m_bOption = false; + m_error_code = 0; + m_bError = false; + load_data(jabberAgentInfo, &data, NULL); +} + +AgentInfoRequest::~AgentInfoRequest() +{ + free_data(jabberAgentInfo, &data); + load_data(jabberAgentInfo, &data, NULL); + data.ID.str() = m_jid; + data.ReqID.str() = m_id; + data.nOptions.asULong() = m_error_code; + data.Label.str() = m_error; + EventAgentInfo(&data).process(); + free_data(jabberAgentInfo, &data); +} + +void AgentInfoRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "error"){ + m_bError = true; + m_error_code = attrs.value("code").toUInt(); + } + if (m_bError) + return; + if (el == "field"){ + free_data(jabberAgentInfo, &data); + load_data(jabberAgentInfo, &data, NULL); + data.ID.str() = m_jid; + m_data = attrs.value("var"); + data.Field.str() = m_data; + m_data = attrs.value("type"); + data.Type.str() = m_data; + m_data = attrs.value("label"); + data.Label.str() = m_data; + } + if (el == "option"){ + m_bOption = true; + m_data = attrs.value("label"); + set_str(&data.OptionLabels, data.nOptions.toULong(), m_data); + } + if (el == "x"){ + data.VHost.str() = m_client->VHost(); + data.Type.str() = "x"; + data.ReqID.str() = m_id; + data.ID.str() = m_jid; + EventAgentInfo(&data).process(); + free_data(jabberAgentInfo, &data); + load_data(jabberAgentInfo, &data, NULL); + } + m_data = QString::null; +} + +void AgentInfoRequest::element_end(const QString& el) +{ + if (el == "error"){ + m_error = m_data; + m_data = QString::null; + m_bError = false; + return; + } + if (m_bError) + return; + if (el == "desc"){ + data.Desc.str() = m_data; + return; + } + if (el == "field"){ + if (!data.Field.str().isEmpty()){ + data.VHost.str() = m_client->VHost(); + data.ReqID.str() = m_id; + data.ID.str() = m_jid; + EventAgentInfo(&data).process(); + free_data(jabberAgentInfo, &data); + load_data(jabberAgentInfo, &data, NULL); + } + }else if (el == "option"){ + m_bOption = false; + QString str = get_str(data.Options, data.nOptions.toULong()); + if (!str.isEmpty()) + data.nOptions.asULong()++; + }else if (el == "value"){ + if (m_bOption){ + set_str(&data.Options, data.nOptions.toULong(), m_data); + }else{ + data.Value.str() = m_data; + } + }else if (el == "required"){ + data.bRequired.asBool() = true; + }else if (el == "key" || el == "instructions"){ + data.Value.str() = m_data; + data.ID.str() = m_jid; + data.ReqID.str() = m_id; + data.Type.str() = el; + EventAgentInfo(&data).process(); + free_data(jabberAgentInfo, &data); + load_data(jabberAgentInfo, &data, NULL); + }else if (el != "error" && el != "iq" && el != "query" && el != "x"){ + data.Value.str() = m_data; + data.ID.str() = m_jid; + data.ReqID.str() = m_id; + data.Type.str() = el; + EventAgentInfo(&data).process(); + free_data(jabberAgentInfo, &data); + load_data(jabberAgentInfo, &data, NULL); + } +} + +void AgentInfoRequest::char_data(const QString& str) +{ + m_data += str; +} + +QString JabberClient::get_agent_info(const QString &jid, const QString &node, const QString &type) +{ + AgentInfoRequest *req = new AgentInfoRequest(this, jid); + req->start_element("query"); + QString xmlns = "jabber:iq:"; + xmlns += type; + req->add_attribute("xmlns", xmlns); + req->add_attribute("node", node); + addLang(req); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +typedef map VALUE_MAP; + +class SearchRequest : public JabberClient::ServerRequest +{ +public: + SearchRequest(JabberClient *client, const QString &jid); + ~SearchRequest(); +protected: + JabberSearchData data; + QString m_data; + QString m_attr; + list m_fields; + VALUE_MAP m_values; + bool m_bReported; + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); +}; + +static DataDef jabberSearchData[] = + { + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRLIST, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + + +SearchRequest::SearchRequest(JabberClient *client, const QString &jid) + : ServerRequest(client, _SET, NULL, jid) +{ + load_data(jabberSearchData, &data, NULL); + m_bReported = false; +} + +SearchRequest::~SearchRequest() +{ + EventSearchDone(m_id).process(); + free_data(jabberSearchData, &data); +} + +void SearchRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "reported"){ + m_bReported = true; + }else if (el == "item"){ + free_data(jabberSearchData, &data); + load_data(jabberSearchData, &data, NULL); + m_data = attrs.value("jid"); + data.JID.str() = m_data; + }else if (el == "field"){ + QString var = attrs.value("var"); + if (m_bReported){ + if (!var.isEmpty() && (var != "jid")){ + QString label = attrs.value("label"); + if (label.isEmpty()) + label = var; + m_values.insert(VALUE_MAP::value_type(var, label)); + m_fields.push_back(var); + } + }else{ + m_attr = var; + } + } + m_data = QString::null; +} + +void SearchRequest::element_end(const QString& el) +{ + if (el == "reported"){ + m_bReported = false; + free_data(jabberSearchData, &data); + load_data(jabberSearchData, &data, NULL); + for (list::iterator it = m_fields.begin(); it != m_fields.end(); ++it){ + QString value; + VALUE_MAP::iterator itv = m_values.find((*it)); + if (itv != m_values.end()) + value = (*itv).second; + set_str(&data.Fields, data.nFields.toULong() * 2, value); + set_str(&data.Fields, data.nFields.toULong() * 2 + 1, value); + data.nFields.asULong()++; + } + data.ID.str() = m_id; + EventSearch(&data).process(); + m_values.clear(); + }else if (el == "item"){ + if (!data.JID.str().isEmpty()){ + for (list::iterator it = m_fields.begin(); it != m_fields.end(); ++it){ + VALUE_MAP::iterator itv = m_values.find((*it)); + if (itv != m_values.end()){ + QString val = (*itv).second; + set_str(&data.Fields, data.nFields.toULong(), val); + } + data.nFields.asULong()++; + } + data.ID.str() = m_id; + EventSearch(&data).process(); + m_values.clear(); + } + }else if (el == "value" || el == "field"){ + if (!m_attr.isEmpty() && !m_data.isEmpty()){ + if (m_attr == "jid"){ + data.JID.str() = m_data; + }else{ + m_values.insert(VALUE_MAP::value_type(m_attr, m_data)); + } + } + m_attr = QString::null; + }else if (el == "first"){ + data.First.str() = m_data; + }else if (el == "last"){ + data.Last.str() = m_data; + }else if (el == "nick"){ + data.Nick.str() = m_data; + }else if (el == "email"){ + data.EMail.str() = m_data; + }else if (el == "status"){ + data.Status.str() = m_data; + } +} + +void SearchRequest::char_data(const QString& str) +{ + m_data += str; +} + +QString JabberClient::search(const QString &jid, const QString &node, const QString &condition) +{ + SearchRequest *req = new SearchRequest(this, jid); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:search"); + req->add_attribute("node", node); + req->add_condition(condition, false); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +#if 0 +I18N_NOOP("Password does not match"); +I18N_NOOP("Low level network error"); +#endif + +class RegisterRequest : public JabberClient::ServerRequest +{ +public: + RegisterRequest(JabberClient *client, const QString &jid); + ~RegisterRequest(); +protected: + QString m_error; + QString *m_data; + unsigned m_error_code; + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); +}; + +RegisterRequest::RegisterRequest(JabberClient *client, const QString &jid) + : ServerRequest(client, _SET, NULL, jid) +{ + m_data = NULL; + m_error_code = (unsigned)(-1); +} + +RegisterRequest::~RegisterRequest() +{ + agentRegisterInfo ai; + ai.id = m_id; + ai.err_code = m_error_code; + ai.error = m_error; + EventAgentRegister(&ai).process(); +} + +void RegisterRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "error"){ + m_error_code = attrs.value("code").toUInt(); + if (m_error_code == 0) + m_error_code = (unsigned)(-1); + m_data = &m_error; + return; + } + if (el == "iq"){ + QString type = attrs.value("type"); + if (type == "result") + m_error_code = 0; + } +} + +void RegisterRequest::element_end(const QString&) +{ + m_data = NULL; +} + +void RegisterRequest::char_data(const QString& str) +{ + if (m_data != NULL) + *m_data += str; +} + +QString JabberClient::process(const QString &jid, const QString &node, const QString &condition, const QString &type) +{ + RegisterRequest *req = new RegisterRequest(this, jid); + req->start_element("query"); + QString xmlns = "jabber:iq:" + type; + req->add_attribute("xmlns", xmlns); + bool bData = (type == "data"); + if (bData) + req->add_attribute("type", "submit"); + req->add_attribute("node", node); + req->add_condition(condition, bData); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +void JabberClient::processList() +{ + if (getState() != Connected) + return; + for (list::iterator it = m_listRequests.begin(); it != m_listRequests.end(); ++it){ + JabberListRequest &r = (*it); + JabberClient::ServerRequest *req = new JabberClient::ServerRequest(this, JabberClient::ServerRequest::_SET, NULL, NULL); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:roster"); + req->start_element("item"); + req->add_attribute("jid", r.jid); + if (it->bDelete) + req->add_attribute("subscription", "remove"); + if (!it->name.isEmpty()) + req->add_attribute("name", r.name); + if (!it->bDelete) + req->text_tag("group", r.grp); + req->send(); + m_requests.push_back(req); + } + m_listRequests.clear(); +} + +class SendFileRequest : public JabberClient::ServerRequest +{ +public: + SendFileRequest(JabberClient *client, const QString &jid, FileMessage *msg); + ~SendFileRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + FileMessage *m_msg; +}; + +SendFileRequest::SendFileRequest(JabberClient *client, const QString &jid, FileMessage *msg) + : JabberClient::ServerRequest(client, _SET, NULL, jid) +{ + m_msg = msg; +} + +SendFileRequest::~SendFileRequest() +{ +} + +void SendFileRequest::element_start(const QString&, const QXmlAttributes&) +{ +} + +void SendFileRequest::element_end(const QString&) +{ +} + +void SendFileRequest::char_data(const QString&) +{ +} + +void JabberClient::sendFileRequest(FileMessage *msg, unsigned short, JabberUserData *data, const QString &fname, unsigned size) +{ + QString jid = data->ID.str(); + if (msg->getResource().isEmpty()){ + if (!data->Resource.str().isEmpty()){ + jid += '/'; + jid += data->Resource.str(); + } + }else{ + jid += '/'; + jid += msg->getResource(); + } + SendFileRequest *req = new SendFileRequest(this, jid, msg); + req->start_element("si"); + req->add_attribute("xmlns", "http://jabber.org/protocol/si"); + req->add_attribute("profile", "http://jabber.org/protocol/si/profile/file-transfer"); + req->add_attribute("id", get_unique_id()); + req->start_element("file"); + req->add_attribute("xmlns", "http://jabber.org/protocol/si/profile/file-transfer"); + req->add_attribute("size", QString::number(size)); + req->add_attribute("name", fname); + req->start_element("range"); + req->end_element(); + req->end_element(); + req->start_element("feature"); + req->add_attribute("xmlns", "http://jabber.org/protocol/feature-neg"); + req->start_element("x"); + req->add_attribute("xmlns", "jabber:x:data"); + req->add_attribute("type", "form"); + req->start_element("field"); + req->add_attribute("type", "list-single"); + req->add_attribute("var", "stream-method"); + req->start_element("option"); + req->text_tag("value", "http://jabber.org/protocol/bytestreams"); +#if 0 + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:oob"); + QString url = "http://"; + struct in_addr addr; + addr.s_addr = socket()->localHost(); + url += inet_ntoa(addr); + url += ':'; + url += QString::number(port); + url += '/'; + url += fname; + QString desc; + desc = msg->getText(); + req->text_tag("url", url); + req->text_tag("desc", desc); +#endif + req->send(); + m_requests.push_back(req); +} + +void JabberClient::sendFileAccept(FileMessage *msg, JabberUserData *data) +{ + JabberFileMessage *m = static_cast(msg); + QString jid = data->ID.str(); + if (msg->getResource().isEmpty()){ + if (!data->Resource.str().isEmpty()){ + jid += '/'; + jid += data->Resource.str(); + } + }else{ + jid += '/'; + jid += msg->getResource(); + } + ServerRequest req(this, ServerRequest::_RESULT, NULL, jid, m->getID()); + req.start_element("si"); + req.add_attribute("xmlns", "http://jabber.org/protocol/si"); + req.start_element("feature"); + req.add_attribute("xmlns", "http://jabber.org/protocol/feature-neg"); + req.start_element("x"); + req.add_attribute("xmlns", "jabber:x:data"); + req.add_attribute("type", "submit"); + req.start_element("field"); + req.add_attribute("var", "stream-method"); + req.text_tag("value", "http://jabber.org/protocol/bytestreams"); + req.send(); +} + +class DiscoItemsRequest : public JabberClient::ServerRequest +{ +public: + DiscoItemsRequest(JabberClient *client, const QString &jid); + ~DiscoItemsRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString *m_data; + QString m_error; + unsigned m_code; +}; + +DiscoItemsRequest::DiscoItemsRequest(JabberClient *client, const QString &jid) + : JabberClient::ServerRequest(client, _GET, NULL, jid) +{ + m_data = NULL; + m_code = 0; +} + +DiscoItemsRequest::~DiscoItemsRequest() +{ + DiscoItem item; + item.id = m_id; + if (m_code){ + item.name = m_error; + item.node = QString::number(m_code); + } + EventDiscoItem(&item).process(); +} + +void DiscoItemsRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "item"){ + DiscoItem item; + item.id = m_id; + item.jid = attrs.value("jid"); + item.name = attrs.value("name"); + item.node = attrs.value("node"); + if (!item.jid.isEmpty()){ + EventDiscoItem(&item).process(); + } + } + if (el == "error"){ + m_code = attrs.value("code").toUInt(); + m_data = &m_error; + } +} + +void DiscoItemsRequest::element_end(const QString& el) +{ + if (el == "error") + m_data = NULL; +} + +void DiscoItemsRequest::char_data(const QString& str) +{ + if (m_data) + *m_data += str; +} + +QString JabberClient::discoItems(const QString &jid, const QString &node) +{ + if (getState() != Connected) + return QString::null; + DiscoItemsRequest *req = new DiscoItemsRequest(this, jid); + req->start_element("query"); + req->add_attribute("xmlns", "http://jabber.org/protocol/disco#items"); + req->add_attribute("node", node); + addLang(req); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +class DiscoInfoRequest : public JabberClient::ServerRequest +{ +public: + DiscoInfoRequest(JabberClient *client, const QString &jid); + ~DiscoInfoRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString *m_data; + QString m_error; + QString m_features; + QString m_name; + QString m_type; + QString m_category; + unsigned m_code; +}; + +DiscoInfoRequest::DiscoInfoRequest(JabberClient *client, const QString &jid) + : JabberClient::ServerRequest(client, _GET, NULL, jid) +{ + m_data = NULL; + m_code = 0; +} + +DiscoInfoRequest::~DiscoInfoRequest() +{ + if (m_code == 0){ + DiscoItem item; + item.id = m_id; + item.jid = "info"; + item.name = m_name; + item.category = m_category; + item.type = m_type; + item.features = m_features; + EventDiscoItem(&item).process(); + } + DiscoItem item; + item.id = m_id; + if (m_code){ + item.name = m_error; + item.node = QString::number(m_code); + } + EventDiscoItem(&item).process(); +} + +void DiscoInfoRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "identity"){ + m_category = attrs.value("category"); + m_name = attrs.value("name"); + m_type = attrs.value("type"); + } + if (el == "feature"){ + QString feature = attrs.value("var"); + if (!feature.isEmpty()){ + if (!m_features.isEmpty()) + m_features += '\n'; + m_features += feature; + } + } + if (el == "error"){ + m_code = attrs.value("code").toUInt(); + m_data = &m_error; + } +} + +void DiscoInfoRequest::element_end(const QString& el) +{ + if (el == "error") + m_data = NULL; +} + +void DiscoInfoRequest::char_data(const QString& str) +{ + if (m_data) + *m_data += str; +} + +QString JabberClient::discoInfo(const QString &jid, const QString &node) +{ + if (getState() != Connected) + return QString::null; + DiscoInfoRequest *req = new DiscoInfoRequest(this, jid); + req->start_element("query"); + req->add_attribute("xmlns", "http://jabber.org/protocol/disco#info"); + req->add_attribute("node", node); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +class BrowseRequest : public JabberClient::ServerRequest +{ +public: + BrowseRequest(JabberClient *client, const QString &jid); + ~BrowseRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString *m_data; + QString m_jid; + QString m_error; + QString m_name; + QString m_type; + QString m_category; + QString m_features; + QString m_ns; + unsigned m_code; +}; + +BrowseRequest::BrowseRequest(JabberClient *client, const QString &jid) + : JabberClient::ServerRequest(client, _GET, NULL, jid) +{ + m_data = NULL; + m_code = 0; + m_jid = jid; +} + +BrowseRequest::~BrowseRequest() +{ + if (!m_jid.isEmpty() && !m_name.isEmpty() && (m_code == 0)){ + DiscoItem item; + item.id = m_id; + item.jid = m_jid; + item.name = m_name; + item.type = m_type; + item.category = m_category; + item.features = m_features.toUtf8(); + EventDiscoItem(&item).process(); + } + DiscoItem item; + item.id = m_id; + if (m_code){ + item.name = m_error; + item.node = QString::number(m_code); + } + EventDiscoItem(&item).process(); +} + +void BrowseRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "error"){ + m_code = attrs.value("code").toUInt(); + m_data = &m_error; + } + if (el == "item" || el == "service" || el == "agent" || el == "headline"){ + if (!m_jid.isEmpty() && !m_name.isEmpty()){ + DiscoItem item; + item.id = m_id; + item.jid = m_jid; + item.name = m_name; + item.type = m_type; + item.category = m_category; + item.features = m_features; + EventDiscoItem(&item).process(); + } + m_jid = attrs.value("jid"); + m_name = attrs.value("name"); + m_type = attrs.value("type"); + m_category = attrs.value("category"); + if (el == "headline") + m_category = "headline"; + m_features = QString::null; + } + if (el == "query"){ + m_name = attrs.value("name"); + m_type = attrs.value("type"); + m_category = attrs.value("category"); + } + if (el == "ns") + m_data = &m_ns; +} + +void BrowseRequest::element_end(const QString& el) +{ + if (el == "error") + m_data = NULL; + if (el == "ns" && !m_ns.isEmpty()){ + if (!m_features.isEmpty()) + m_features += '\n'; + m_features += m_ns; + m_ns = QString::null; + m_data = NULL; + } + if ((el == "item" || el == "service" || + el == "agent" || el == "headline") + && !m_jid.isEmpty()){ + DiscoItem item; + item.id = m_id; + item.jid = m_jid; + item.name = m_name; + item.type = m_type; + item.category = m_category; + item.features = m_features; + EventDiscoItem(&item).process(); + m_jid = QString::null; + } +} + +void BrowseRequest::char_data(const QString& str) +{ + if (m_data) + *m_data += str; +} + +QString JabberClient::browse(const QString &jid) +{ + if (getState() != Connected) + return QString::null; + BrowseRequest *req = new BrowseRequest(this, jid); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:browse"); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +class VersionInfoRequest : public JabberClient::ServerRequest +{ +public: + VersionInfoRequest(JabberClient *client, const QString &jid, const QString &node); + ~VersionInfoRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString *m_data; + QString m_jid; + QString m_node; + QString m_name; + QString m_version; + QString m_os; +}; + +VersionInfoRequest::VersionInfoRequest(JabberClient *client, const QString &jid, const QString &node) + : JabberClient::ServerRequest(client, _GET, NULL, jid) +{ + m_data = NULL; + m_jid = jid; + m_node = node; +} + +VersionInfoRequest::~VersionInfoRequest() +{ + ClientVersionInfo info; + info.jid = m_jid; + info.node = m_node; + info.name = m_name; + info.version = m_version; + info.os = m_os; + EventClientVersion(&info).process(); +} + +void VersionInfoRequest::element_start(const QString& el, const QXmlAttributes&) +{ + if (el == "name") + m_data = &m_name; + if (el == "version") + m_data = &m_version; + if (el == "os") + m_data = &m_os; +} + +void VersionInfoRequest::element_end(const QString&) +{ + m_data = NULL; +} + +void VersionInfoRequest::char_data(const QString& str) +{ + if (m_data) + *m_data += str; +} + +QString JabberClient::versionInfo(const QString &jid, const QString &node) +{ + if (getState() != Connected) + return QString::null; + VersionInfoRequest *req = new VersionInfoRequest(this, jid, node); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:version"); + req->add_attribute("node", node); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +class TimeInfoRequest : public JabberClient::ServerRequest +{ +public: + TimeInfoRequest(JabberClient *client, const QString &jid); + ~TimeInfoRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString *m_data; + QString m_jid; + QString m_utc; + QString m_tz; + QString m_display; +}; + +TimeInfoRequest::TimeInfoRequest(JabberClient *client, const QString &jid) + : JabberClient::ServerRequest(client, _GET, NULL, jid) +{ + m_data = NULL; + m_jid = jid; +} + +TimeInfoRequest::~TimeInfoRequest() +{ + ClientTimeInfo info; + info.jid = m_jid; + info.utc = m_utc; + info.tz = m_tz; + info.display = m_display; + EventClientTimeInfo(&info).process(); +} + +void TimeInfoRequest::element_start(const QString& el, const QXmlAttributes&) +{ + if (el == "utc") + m_data = &m_utc; + if (el == "tz") + m_data = &m_tz; + if (el == "display") + m_data = &m_display; +} + +void TimeInfoRequest::element_end(const QString&) +{ + m_data = NULL; +} + +void TimeInfoRequest::char_data(const QString& str) +{ + if (m_data) + *m_data += str; +} + +QString JabberClient::timeInfo(const QString &jid, const QString &node) +{ + if (getState() != Connected) + return QString::null; + TimeInfoRequest *req = new TimeInfoRequest(this, jid); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:time"); + req->add_attribute("node", node); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +class LastInfoRequest : public JabberClient::ServerRequest +{ +public: + LastInfoRequest(JabberClient *client, const QString &jid); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + QString m_jid; +}; + +LastInfoRequest::LastInfoRequest(JabberClient *client, const QString &jid) + : JabberClient::ServerRequest(client, _GET, NULL, jid) +{ + m_jid = jid; +} + +void LastInfoRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "query"){ + ClientLastInfo info; + info.jid = m_jid; + info.seconds = attrs.value("seconds").toUInt(); + EventClientLastInfo(&info).process(); + } +} + +QString JabberClient::lastInfo(const QString &jid, const QString &node) +{ + if (getState() != Connected) + return QString::null; + LastInfoRequest *req = new LastInfoRequest(this, jid); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:last"); + req->add_attribute("node", node); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +class StatRequest : public JabberClient::ServerRequest +{ +public: + StatRequest(JabberClient *client, const QString &jid, const QString &id); + ~StatRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + QString m_id; +}; + +StatRequest::StatRequest(JabberClient *client, const QString &jid, const QString &id) + : JabberClient::ServerRequest(client, _GET, NULL, jid) +{ + m_id = id; +} + +StatRequest::~StatRequest() +{ + DiscoItem item; + item.id = m_id; + item.jid = QString::null; + EventDiscoItem(&item).process(); +} + +void StatRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "stat"){ + DiscoItem item; + item.id = m_id; + item.jid = attrs.value("name"); + item.name = attrs.value("units"); + item.node = attrs.value("value"); + EventDiscoItem(&item).process(); + } +} + +class StatItemsRequest : public JabberClient::ServerRequest +{ +public: + StatItemsRequest(JabberClient *client, const QString &jid, const QString &node); + ~StatItemsRequest(); +protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + list m_stats; + QString m_jid; + QString m_node; +}; + +StatItemsRequest::StatItemsRequest(JabberClient *client, const QString &jid, const QString &node) + : JabberClient::ServerRequest(client, _GET, NULL, jid) +{ + m_jid = jid; + m_node = node; +} + +StatItemsRequest::~StatItemsRequest() +{ + if (m_stats.empty()){ + DiscoItem item; + item.id = m_id; + item.jid = QString::null; + EventDiscoItem(&item).process(); + return; + } + StatRequest *req = new StatRequest(m_client, m_jid, m_id); + req->start_element("query"); + req->add_attribute("xmlns", "http://jabber.org/protocol/stats"); + req->add_attribute("node", m_node); + m_client->addLang(req); + for (list::iterator it = m_stats.begin(); it != m_stats.end(); ++it){ + req->start_element("stat"); + req->add_attribute("name", (*it)); + req->end_element(); + } + req->send(); + m_client->m_requests.push_back(req); +} + +void StatItemsRequest::element_start(const QString& el, const QXmlAttributes& attrs) +{ + if (el == "stat"){ + QString name = attrs.value("name"); + if (!name.isEmpty()) + m_stats.push_back(name); + } +} + +QString JabberClient::statInfo(const QString &jid, const QString &node) +{ + if (getState() != Connected) + return QString::null; + StatItemsRequest *req = new StatItemsRequest(this, jid, node); + req->start_element("query"); + req->add_attribute("xmlns", "http://jabber.org/protocol/stats"); + req->add_attribute("node", node); + addLang(req); + req->send(); + m_requests.push_back(req); + return req->m_id; +} + +static char XmlLang[] = I18N_NOOP("Please translate this to short language name like 'ru' or 'de'. Do not translate this sentence!)"); + +void JabberClient::addLang(ServerRequest *req) +{ + QString s = i18n(XmlLang); + if (s == XmlLang) + return; + req->add_attribute("xml:lang", s); +} + +class ChangePasswordRequest : public JabberClient::ServerRequest +{ +public: + ChangePasswordRequest(JabberClient *client, const QString &password); + ~ChangePasswordRequest(); +protected: + QString m_password; +}; + +ChangePasswordRequest::ChangePasswordRequest(JabberClient *client, const QString &password) + : JabberClient::ServerRequest(client, _SET, NULL, NULL) + , m_password(password) +{} + +ChangePasswordRequest::~ChangePasswordRequest() +{ + m_client->setPassword(m_password); +} + +void JabberClient::changePassword(const QString &password) +{ + if (getState() != Connected) + return; + QString id_name = data.owner.ID.str(); + int pos = id_name.indexOf('@'); + + if(pos != -1) + id_name = id_name.left(pos); + + ChangePasswordRequest *req = new ChangePasswordRequest(this, password); + req->start_element("query"); + req->add_attribute("xmlns", "jabber:iq:register"); + req->text_tag("username", id_name); + req->text_tag("password", password); + m_requests.push_back(req); + req->send(); +} + + diff --git a/plugins/jabber/jabber_ssl.cpp b/plugins/jabber/jabber_ssl.cpp new file mode 100644 index 0000000..1674f62 --- /dev/null +++ b/plugins/jabber/jabber_ssl.cpp @@ -0,0 +1,27 @@ +/*************************************************************************** + jabber_ssl.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "jabber_ssl.h" + +using namespace SIM; + +JabberSSL::JabberSSL(Socket *s, bool forceSSL) + : SSLClient(s), m_forceSSL(forceSSL) +{ +} diff --git a/plugins/jabber/jabber_ssl.h b/plugins/jabber/jabber_ssl.h new file mode 100644 index 0000000..79dfe3a --- /dev/null +++ b/plugins/jabber/jabber_ssl.h @@ -0,0 +1,35 @@ +/*************************************************************************** + jabber_ssl.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBER_SSL_H +#define _JABBER_SSL_H + +#include "simapi.h" +#include "socket/socket.h" +#include "socket/sslclient.h" + +class JabberSSL : public SIM::SSLClient +{ +public: + JabberSSL(SIM::Socket*, bool); +private: + bool m_forceSSL; + +}; + +#endif + diff --git a/plugins/jabber/jabberaboutinfo.cpp b/plugins/jabber/jabberaboutinfo.cpp new file mode 100644 index 0000000..24bafc8 --- /dev/null +++ b/plugins/jabber/jabberaboutinfo.cpp @@ -0,0 +1,83 @@ +/*************************************************************************** + jabberaboutinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "jabberclient.h" +#include "jabberaboutinfo.h" +#include "jabber.h" +#include "contacts/contact.h" + +using namespace SIM; + +JabberAboutInfo::JabberAboutInfo(QWidget *parent, JabberUserData *data, JabberClient *client) : QWidget(parent) + //: JabberAboutInfoBase(parent) +{ + setupUi(this); + m_client = client; + m_data = data; + if (m_data) + edtAbout->setReadOnly(true); + fill(m_data); +} + +void JabberAboutInfo::apply() +{ +} + +bool JabberAboutInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(m_data); + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(m_data); + } else + if (m_data && (e->type() == eEventVCard)){ + EventVCard *evc = static_cast(e); + JabberUserData *data = evc->data(); + if (m_data->ID.str() == data->ID.str() && m_data->Node.str() == data->Node.str()) + fill(data); + } + return false; +} + +void JabberAboutInfo::fill(JabberUserData *data) +{ + if (data == NULL) data = &m_client->data.owner; + edtAbout->setPlainText(data->Desc.str()); +} + +void JabberAboutInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + JabberUserData *data = m_client->toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->Desc.str() = edtAbout->toPlainText(); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "jabberaboutinfo.moc" +#endif +*/ + diff --git a/plugins/jabber/jabberaboutinfo.h b/plugins/jabber/jabberaboutinfo.h new file mode 100644 index 0000000..d484a7c --- /dev/null +++ b/plugins/jabber/jabberaboutinfo.h @@ -0,0 +1,44 @@ +/*************************************************************************** + jabberaboutinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERABOUTINFO_H +#define _JABBERABOUTINFO_H + +#include "ui_jabberaboutinfobase.h" +#include "event.h" + + +struct JabberUserData; +class JabberClient; + +class JabberAboutInfo : public QWidget, public Ui::JabberAboutInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + JabberAboutInfo(QWidget *parent, JabberUserData *data, JabberClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(JabberUserData *data); + JabberUserData *m_data; + JabberClient *m_client; +}; + +#endif + diff --git a/plugins/jabber/jabberaboutinfobase.ui b/plugins/jabber/jabberaboutinfobase.ui new file mode 100644 index 0000000..a7c67ff --- /dev/null +++ b/plugins/jabber/jabberaboutinfobase.ui @@ -0,0 +1,40 @@ + + + JabberAboutInfo + + + + 0 + 0 + 374 + 251 + + + + Form4 + + + + 6 + + + 11 + + + + + Additional information: + + + false + + + + + + + + + + + diff --git a/plugins/jabber/jabberadd.cpp b/plugins/jabber/jabberadd.cpp new file mode 100644 index 0000000..cd00e7c --- /dev/null +++ b/plugins/jabber/jabberadd.cpp @@ -0,0 +1,492 @@ +/*************************************************************************** + jabberadd.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include + +#include "icons.h" +#include "simgui/intedit.h" +#include "simgui/listview.h" +#include "misc.h" +#include "log.h" +#include "contacts/contact.h" + +#include "jabberclient.h" +#include "jabberadd.h" +#include "jabber.h" +#include "jabbersearch.h" +#include "jabberbrowser.h" + +using namespace std; +using namespace SIM; + +const unsigned FILL_FIRST = 0x0001; +const unsigned FILL_LAST = 0x0002; +const unsigned FILL_NICK = 0x0004; +const unsigned FILL_MAIL = 0x0008; +const unsigned FILL_ALL = (FILL_FIRST + FILL_LAST + FILL_NICK + FILL_MAIL); + +JabberAdd::JabberAdd(JabberClient *client, QWidget *parent) : QWidget(parent) + //: JabberAddBase(parent) +{ + setupUi(this); + m_client = client; + m_browser = NULL; + m_bBrowser = false; + connect(this, SIGNAL(setAdd(bool)), topLevelWidget(), SLOT(setAdd(bool))); + connect(this, SIGNAL(addResult(QWidget*)), topLevelWidget(), SLOT(addResult(QWidget*))); + connect(this, SIGNAL(showResult(QWidget*)), topLevelWidget(), SLOT(showResult(QWidget*))); + connect(grpJID, SIGNAL(toggled(bool)), this, SLOT(radioToggled(bool))); + connect(grpMail, SIGNAL(toggled(bool)), this, SLOT(radioToggled(bool))); + connect(grpName, SIGNAL(toggled(bool)), this, SLOT(radioToggled(bool))); + connect(btnBrowser, SIGNAL(clicked()), this, SLOT(browserClick())); + QIcon is = Icon("1rightarrow"); + btnBrowser->setIcon(is); +} + +JabberAdd::~JabberAdd() +{ + if (m_browser) + delete m_browser; +} + +void JabberAdd::browserDestroyed() +{ + m_browser = NULL; +} + +void JabberAdd::radioToggled(bool) +{ + setBrowser(false); + log(L_DEBUG, "JabberAdd::radioToggled() FIXMEEEE!!!!"); + /* + if (isVisible()) + emit setAdd(grpJID->isChecked()); + */ +} + +void JabberAdd::showEvent(QShowEvent *e) +{ + log(L_DEBUG, "JabberAdd::showEvent() FIXMEEEE!!!!"); + QWidget::showEvent(e); + /* + emit setAdd(grpJID->isChecked()); + if (m_browser && m_bBrowser) + emit showResult(m_browser); + */ +} + +void JabberAdd::browserClick() +{ + setBrowser(!m_bBrowser); +} + +void JabberAdd::setBrowser(bool bBrowser) +{ + if (m_bBrowser == bBrowser) + return; + m_bBrowser = bBrowser; + if (m_bBrowser && (m_browser == NULL)){ + m_browser = new JabberBrowser; + emit addResult(m_browser); + m_browser->setClient(m_client); + connect(m_browser, SIGNAL(destroyed()), this, SLOT(browserDestroyed())); + } + emit showResult(m_bBrowser ? m_browser : NULL); + QIcon is = Icon(m_bBrowser ? "1leftarrow" : "1rightarrow"); + btnBrowser->setIcon(is); + if (m_bBrowser){ + edtJID->setEnabled(false); + edtMail->setEnabled(false); + edtFirst->setEnabled(false); + edtLast->setEnabled(false); + edtNick->setEnabled(false); + lblFirst->setEnabled(false); + lblLast->setEnabled(false); + lblNick->setEnabled(false); + emit setAdd(false); + }else{ + log(L_DEBUG, "JabberAdd::setBrowser() FIXMEEEE!!!!"); + //grpJID->slotToggled(); + //grpName->slotToggled(); + //grpMail->slotToggled(); + } +} + +void JabberAdd::createContact(unsigned tmpFlags, Contact *&contact) +{ + log(L_DEBUG, "JabberAdd::createContact() FIXMEEEE!!!!"); + /* + if (!grpJID->isChecked() || edtJID->text().isEmpty()) + return; + QString resource; + if (m_client->findContact(edtJID->text(), QString::null, false, contact, resource)) + return; + QString name = edtJID->text(); + int n = name.indexOf('@'); + if (n > 0) + name = name.left(n); + m_client->findContact(edtJID->text(), name, true, contact, resource, false); + contact->setFlags(contact->getFlags() | tmpFlags); + */ +} + +void JabberAdd::search() +{ + log(L_DEBUG, "JabberAdd::search() FIXMEEEE!!!!"); + /* + if (m_bBrowser) + return; + if (grpName->isChecked()) + searchName(edtFirst->text(), edtLast->text(), edtNick->text()); + if (grpMail->isChecked()) + searchMail(edtMail->text()); + */ +} + +void JabberAdd::searchMail(const QString &mail) +{ + m_mail = mail; + m_first = QString::null; + m_last = QString::null; + m_nick = QString::null; + startSearch(); +} + +void JabberAdd::searchName(const QString &first, const QString &last, const QString &nick) +{ + m_first = first; + m_last = last; + m_nick = nick; + m_mail = QString::null; + startSearch(); +} + +void JabberAdd::startSearch() +{ + m_disco_items.clear(); + m_fields.clear(); + m_labels.clear(); + m_agents.clear(); + m_nFields = 0; + m_id_disco = QString::null; + QString url; + if (m_client->getUseVHost()) + url = m_client->getVHost(); + if (url.isEmpty()) + url = m_client->getServer(); + m_id_browse = m_client->browse(url); +} + +void JabberAdd::addAttr(const QString &name, const QString &label) +{ + for (unsigned i = 0; i < m_fields.size(); i++){ + if (m_fields[i] == name) + return; + } + m_fields.push_back(name); + m_labels.push_back(label); +} + +void JabberAdd::searchStop() +{ + m_id_browse = QString::null; + m_id_disco = QString::null; + m_disco_items.clear(); + m_fields.clear(); + m_labels.clear(); + m_agents.clear(); + m_nFields = 0; +} + +void JabberAdd::addAttrs() +{ + if (m_fields.size() <= m_nFields) + return; + QStringList attrs; + for (; m_nFields < m_fields.size(); m_nFields++){ + attrs.append(m_fields[m_nFields]); + attrs.append(m_labels[m_nFields]); + } + emit setColumns(attrs, 0, this); +} + +bool JabberAdd::processEvent(Event *e) +{ + if (e->type() == eEventDiscoItem){ + EventDiscoItem *edi = static_cast(e); + DiscoItem *item = edi->item(); + if (m_id_browse == item->id){ + if (item->jid.isEmpty()){ + if (!item->node.isEmpty()){ + QString url; + if (m_client->getUseVHost()) + url = m_client->getVHost(); + if (url.isEmpty()) + url = m_client->getServer(); + m_id_disco = m_client->discoItems(url, QString::null); + } + m_id_browse = QString::null; + checkDone(); + return true; + } + addSearch(item->jid, QString::null, item->features, item->type); + return true; + } + if (m_id_disco == item->id){ + if (item->jid.isEmpty()){ + m_id_disco = QString::null; + checkDone(); + return true; + } + ItemInfo info; + info.jid = item->jid; + info.node = item->node; + info.id = m_client->discoInfo(info.jid, info.node); + m_disco_items.push_back(info); + return true; + } + list::iterator it; + for (it = m_disco_items.begin(); it != m_disco_items.end(); ++it){ + if (it->id == item->id){ + addSearch(it->jid, it->node, item->features, item->type); + m_disco_items.erase(it); + checkDone(); + break; + } + } + } else + if (e->type() == eEventAgentInfo){ + EventAgentInfo *eai = static_cast(e); + JabberAgentInfo *data = eai->agentInfo(); + list::iterator it; + for (it = m_agents.begin(); it != m_agents.end(); ++it) + if (it->id_info == data->ReqID.str()) + break; + if (it == m_agents.end()) + return false; + if (data->Type.str().isEmpty()){ + it->id_info = QString::null; + if (m_first.isEmpty()) + it->fill |= FILL_FIRST; + if (m_last.isEmpty()) + it->fill |= FILL_LAST; + if (m_nick.isEmpty()) + it->fill |= FILL_NICK; + if (m_mail.isEmpty()) + it->fill |= FILL_MAIL; + if (it->fill != FILL_ALL){ + m_agents.erase(it); + checkDone(); + return true; + } + it->id_search = m_client->search(it->jid, it->node, it->condition); + if (it->condition.left(6) != "x:data"){ + addAttr("", i18n("JID")); + addAttr("first", i18n("First Name")); + addAttr("last", i18n("Last Name")); + addAttr("nick", i18n("Nick")); + addAttr("email", i18n("E-Mail")); + addAttrs(); + } + return true; + } + if (data->Type.str() == "x"){ + it->condition = "x:data"; + it->fill = 0; + return true; + } + QString value; + QString field; + if (!data->Field.str().isEmpty() && + (data->Type.str() == "text-single" || + data->Type.str() == "text-private" || + data->Type.str() == "text-multi")){ + field = data->Field.str(); + if ((data->Field.str() == "first") && !m_first.isEmpty()){ + value = m_first; + it->fill |= FILL_FIRST; + } + if ((data->Field.str() == "last") && !m_last.isEmpty()){ + value = m_last; + it->fill |= FILL_LAST; + } + if (((data->Field.str() == "nickname") || (data->Field.str() == "nick")) && !m_nick.isEmpty()){ + value = m_nick; + it->fill |= FILL_NICK; + } + if ((data->Field.str() == "email") && !m_mail.isEmpty()){ + value = m_mail; + it->fill |= FILL_MAIL; + } + } + if ((data->Type.str() == "first") && !m_first.isEmpty()){ + field = data->Type.str(); + value = m_first; + it->fill |= FILL_FIRST; + } + if ((data->Type.str() == "last") && !m_last.isEmpty()){ + field = data->Type.str(); + value = m_last; + it->fill |= FILL_LAST; + } + if (((data->Type.str() == "nickname") || (data->Type.str() == "nick")) && !m_nick.isEmpty()){ + field = data->Type.str(); + value = m_nick; + it->fill |= FILL_NICK; + } + if ((data->Type.str() == "email") && !m_mail.isEmpty()){ + field = data->Type.str(); + value = m_mail; + it->fill |= FILL_MAIL; + } + if (!value.isEmpty()){ + if (!it->condition.isEmpty()) + it->condition += ';'; + it->condition += field; + it->condition += '='; + it->condition += quoteChars(value, ";"); + } + return true; + } + if (e->type() == eEventJabberSearch){ + EventSearch *es = static_cast(e); + JabberSearchData *data = es->searchData(); + list::iterator it; + for (it = m_agents.begin(); it != m_agents.end(); ++it) + if (it->id_search == data->ID.str()) + break; + if (it == m_agents.end()) + return false; + if (data->JID.str().isEmpty()){ + addAttr("", i18n("JID")); + for (unsigned i = 0; i < data->nFields.toULong(); i++){ + addAttr(get_str(data->Fields, i * 2), get_str(data->Fields, i * 2 + 1)); + it->fields.push_back(get_str(data->Fields, i * 2)); + } + addAttrs(); + return true; + } + QString icon = "Jabber"; + if (it->type == "icq"){ + icon = "ICQ"; + }else if (it->type == "aim"){ + icon = "AIM"; + }else if (it->type == "msn"){ + icon = "MSN"; + }else if (it->type == "yahoo"){ + icon = "Yahoo!"; + }else if (it->type == "sms"){ + icon = "sms"; + }else if ((it->type == "x-gadugadu") || (it->type == "gg")){ + icon = "GG"; + } + if (!data->Status.str().isEmpty()){ + if (data->Status.str() == "online"){ + icon += "_online"; + }else{ + icon += "_offline"; + } + } + QStringList l; + l.append(icon); + l.append(data->JID.str()); + for (unsigned i = 0; i < m_fields.size(); i++){ + QString v; + if (m_fields[i].isEmpty()){ + v = data->JID.str(); + }else if ((m_fields[i] == "first") && !data->First.str().isEmpty()){ + v = data->First.str(); + }else if ((m_fields[i] == "last") && !data->Last.str().isEmpty()){ + v = data->Last.str(); + }else if ((m_fields[i] == "nick") && !data->Nick.str().isEmpty()){ + v = data->Nick.str(); + }else if ((m_fields[i] == "email") && !data->EMail.str().isEmpty()){ + v = data->EMail.str(); + }else{ + for (unsigned n = 0; n < it->fields.size(); n++){ + if (it->fields[n] == m_fields[i]){ + v = get_str(data->Fields, n); + break; + } + } + } + l.append(v); + } + emit addItem(l, this); + } else + if (e->type() == eEventJabberSearchDone){ + EventSearchDone *esd = static_cast(e); + QString id = esd->userID(); + list::iterator it; + for (it = m_agents.begin(); it != m_agents.end(); ++it) + if (it->id_search == id) + break; + if (it == m_agents.end()) + return false; + m_agents.erase(it); + checkDone(); + return true; + } + return false; +} + +void JabberAdd::addSearch(const QString &jid, const QString &node, const QString &features, const QString &type) +{ + if (features.isEmpty()) + return; + QString f = features; + while (!f.isEmpty()){ + QString feature = getToken(f, '\n'); + if (feature == "jabber:iq:search"){ + AgentSearch as; + as.jid = jid; + as.node = node; + as.id_info = m_client->get_agent_info(jid, node, "search"); + as.fill = 0; + as.type = type; + m_agents.push_back(as); + return; + } + } +} + +void JabberAdd::checkDone() +{ + if (m_id_browse.isEmpty() && m_id_disco.isEmpty() && + m_disco_items.empty() && m_agents.empty()) + emit searchDone(this); +} + +void JabberAdd::createContact(const QString &name, unsigned tmpFlags, Contact *&contact) +{ + QString resource; + if (m_client->findContact(name, QString::null, false, contact, resource)) + return; + if (m_client->findContact(name, QString::null, true, contact, resource, false) == NULL) + return; + contact->setFlags(contact->getFlags() | tmpFlags); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "jabberadd.moc" +#endif +*/ + diff --git a/plugins/jabber/jabberadd.h b/plugins/jabber/jabberadd.h new file mode 100644 index 0000000..15ac7b2 --- /dev/null +++ b/plugins/jabber/jabberadd.h @@ -0,0 +1,98 @@ +/*************************************************************************** + jabberadd.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERADD_H +#define _JABBERADD_H + +#include "jabberclient.h" +#include "ui_jabberaddbase.h" + +#include + +class JabberClient; +class JabberBrowser; +class GroupRadioButton; + +struct ItemInfo +{ + QString jid; + QString node; + QString id; +}; + +struct AgentSearch +{ + QString jid; + QString node; + QString id_info; + QString id_search; + QString condition; + unsigned fill; + std::vector fields; + QString type; +}; + +class JabberAdd : public QWidget, public Ui::JabberAdd, public SIM::EventReceiver +{ + Q_OBJECT +public: + JabberAdd(JabberClient *client, QWidget *parent); + ~JabberAdd(); +signals: + void setAdd(bool); + void addResult(QWidget*); + void showResult(QWidget*); + void setColumns(const QStringList&, int, QWidget*); + void addItem(const QStringList&, QWidget*); + void searchDone(QWidget*); +protected slots: + void radioToggled(bool); + void browserDestroyed(); + void browserClick(); + void search(); + void searchStop(); + void searchMail(const QString&); + void searchName(const QString&, const QString&, const QString&); + void createContact(const QString&, unsigned tmpFlags, SIM::Contact *&contact); + void createContact(unsigned tmpFlags, SIM::Contact *&contact); +protected: + virtual bool processEvent(SIM::Event *e); + void setBrowser(bool bBrowser); + void showEvent(QShowEvent*); + void startSearch(); + void checkDone(); + void addAttr(const QString &name, const QString &label); + void addAttrs(); + void addSearch(const QString &jid, const QString &node, const QString &features, const QString &type); + JabberClient *m_client; + JabberBrowser *m_browser; + bool m_bBrowser; + QString m_first; + QString m_last; + QString m_nick; + QString m_mail; + QString m_id_browse; + QString m_id_disco; + std::list m_disco_items; + std::list m_agents; + std::vector m_fields; + std::vector m_labels; + unsigned m_nFields; +}; + +#endif + diff --git a/plugins/jabber/jabberaddbase.ui b/plugins/jabber/jabberaddbase.ui new file mode 100644 index 0000000..78ca9a5 --- /dev/null +++ b/plugins/jabber/jabberaddbase.ui @@ -0,0 +1,145 @@ + + JabberAdd + + + + 0 + 0 + 196 + 381 + + + + + + + + 6 + + + 0 + + + + + &JID + + + + 6 + + + 11 + + + + + + + + + + + &E-Mail + + + + 6 + + + 11 + + + + + + + + + + + &Name + + + + 6 + + + 11 + + + + + First: + + + false + + + + + + + + + + Last: + + + false + + + + + + + + + + Nickname: + + + false + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Jabber &browser + + + + + + + + RadioGroup +
    simgui/intedit.h
    +
    +
    + + +
    diff --git a/plugins/jabber/jabberbrowser.cpp b/plugins/jabber/jabberbrowser.cpp new file mode 100644 index 0000000..2bf18d1 --- /dev/null +++ b/plugins/jabber/jabberbrowser.cpp @@ -0,0 +1,1023 @@ +/*************************************************************************** + jabberbrowser.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "jabberclient.h" +#include "jabberbrowser.h" +#include "jabbersearch.h" +#include "jabber.h" +#include "discoinfo.h" +#include "simgui/listview.h" +#include "simgui/toolbtn.h" +#include "jidsearch.h" +#include "simgui/ballonmsg.h" + +#include "core.h" + +#include "contacts/contact.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +const unsigned BROWSE_INFO = 8; + +JabberWizard::JabberWizard(QWidget *parent, const QString &title, const QString &icon, JabberClient *client, const QString &jid, const QString &node, const QString &type) + : QWizard(parent, Qt::Window) +{ + setAttribute(Qt::WA_DeleteOnClose, true); + m_type = type; + m_search = new JabberSearch; + m_search->init(this, client, jid, node, title, m_type == "register"); + addPage(m_search); + /* + m_result = new QLabel(this); + addPage(m_result); + */ + m_result->setText(i18n("Process")); + //helpButton()->hide(); + SET_WNDPROC("jbrowser") + setWindowIcon(Icon(icon)); + setWindowTitle(title); + connect(this, SIGNAL(selected(const QString&)), this, SLOT(slotSelected(const QString&))); +} + +void JabberWizard::search() +{ + //showPage(m_result); +} + +void JabberWizard::textChanged(const QString&) +{ + setNext(); +} + +void JabberWizard::slotSelected(const QString&) +{ + //if (currentPage() != m_result) + return; + //setFinishEnabled(m_result, false); + QString condition = m_search->condition(NULL); //Fixme unreachable code + m_id = m_search->m_client->process(m_search->m_jid, m_search->m_node, condition, m_type); +} + +bool JabberWizard::processEvent(Event *e) +{ + if (e->type() == eEventAgentRegister){ + EventAgentRegister *ear = static_cast(e); + agentRegisterInfo *ai = ear->registerInfo(); + if (m_id == ai->id){ + if (ai->err_code){ + QString err = i18n(ai->error); + if (err.isEmpty()) + err = i18n("Error %1").arg(ai->err_code); + m_result->setText(err); + }else{ + m_result->setText(i18n("Done")); + //setFinishEnabled(m_result, true); + QTimer::singleShot(0, this, SLOT(close())); + } + return true; + } + } + return false; +} + +void JabberWizard::setNext() +{ + //nextButton()->setEnabled(m_search->canSearch()); +} + +void JabberWizard::initTitle() +{ + if (m_search->m_title.isEmpty()) + return; + setWindowTitle(m_search->m_title); +} + +JabberBrowser::JabberBrowser() +{ + m_client = NULL; + m_info = NULL; + + m_list = new ListView(this); + m_list->addColumn(i18n("Name")); + m_list->addColumn(i18n("JID")); + m_list->addColumn(i18n("Node")); + m_list->setExpandingColumn(0); + m_list->setMenu(0); + connect(m_list, SIGNAL(currentChanged(ListViewItem*)), this, SLOT(currentChanged(ListViewItem*))); + connect(m_list, SIGNAL(selectionChanged()), this, SLOT(selectionChanged())); + connect(m_list, SIGNAL(dragStart()), this, SLOT(dragStart())); + + EventToolbar e(BarBrowser, this); + e.process(); + m_bar = e.toolBar(); + m_bar->setParam(this); + restoreToolbar(m_bar, JabberPlugin::plugin->data.browser_bar); + m_bar->show(); + resize(qApp->desktop()->width(), qApp->desktop()->height()); + setCentralWidget(m_list); + m_historyPos = -1; + + Command cmd; + cmd->id = CmdUrl; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolCombo *cmbUrl = dynamic_cast(eWidget.widget()); + if (cmbUrl){ + QString h = JabberPlugin::plugin->getBrowserHistory(); + while (h.length()) + cmbUrl->insertItem(INT_MAX,getToken(h, ';')); + cmbUrl->setText(QString::null); + } + + m_reg = NULL; + m_config = NULL; + m_search = NULL; + m_bInProcess = false; + m_list->setMenu(MenuSearchItem); +} + +JabberBrowser::~JabberBrowser() +{ + if (m_info) + delete m_info; + save(); +} + +void JabberBrowser::setClient(JabberClient *client) +{ + if (m_client == client) + return; + m_client = client; + QString url; + if (m_client->getUseVHost()) + url = m_client->getVHost(); + if (url.isEmpty()) + url = m_client->getServer(); + goUrl(url, QString::null); +} + +void JabberBrowser::goUrl(const QString &url, const QString &node) +{ + int i = 0; + vector::iterator it; + for (it = m_history.begin(); it != m_history.end(); ++it, i++){ + if (i > m_historyPos) + break; + } + m_history.erase(it, m_history.end()); + m_history.push_back(url); + i = 0; + for (it = m_nodes.begin(); it != m_nodes.end(); ++it, i++){ + if (i > m_historyPos) + break; + } + m_nodes.erase(it, m_nodes.end()); + m_nodes.push_back(node); + m_historyPos++; + go(url, node); +} + +void JabberBrowser::go(const QString &url, const QString &node) +{ + setNavigation(); + Command cmd; + m_list->clear(); + cmd->id = CmdBrowseInfo; + cmd->flags = COMMAND_DISABLED; + cmd->param = this; + EventCommandDisabled(cmd).process(); + + cmd->id = CmdBrowseSearch; + cmd->flags = COMMAND_DISABLED; + cmd->param = this; + EventCommandDisabled(cmd).process(); + + cmd->id = CmdRegister; + cmd->flags = COMMAND_DISABLED; + cmd->param = this; + EventCommandDisabled(cmd).process(); + + cmd->id = CmdBrowseConfigure; + cmd->flags = COMMAND_DISABLED; + cmd->param = this; + EventCommandDisabled(cmd).process(); + + m_bInProcess = true; + ListViewItem *item = new ListViewItem(m_list); + item->setText(COL_JID, url); + item->setText(COL_NAME, url); + item->setText(COL_NODE, node); + m_bError = false; + unsigned mode = 0; + if (JabberPlugin::plugin->getBrowseType() & BROWSE_DISCO){ + item->setText(COL_ID_DISCO_ITEMS, m_client->discoItems(url, node)); + item->setText(COL_ID_DISCO_INFO, m_client->discoInfo(url, node)); + mode = BROWSE_DISCO | BROWSE_INFO; + } + if (JabberPlugin::plugin->getBrowseType() & BROWSE_BROWSE){ + if (node.isEmpty()){ + item->setText(COL_ID_BROWSE, m_client->browse(url)); + mode |= BROWSE_BROWSE; + } + } + item->setText(COL_MODE, QString::number(mode)); + item->setPixmap(COL_NAME, Pict("empty")); + cmd->id = CmdUrl; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolCombo *cmbUrl = dynamic_cast(eWidget.widget()); + if (cmbUrl) + cmbUrl->setText(url); + cmd->id = CmdNode; + EventCommandWidget eWidget2(cmd); + eWidget2.process(); + CToolCombo *cmbNode = dynamic_cast(eWidget2.widget()); + if (cmbNode) + cmbNode->setText(node); + startProcess(); + if (item->text(COL_ID_DISCO_INFO).isEmpty()) + stop(i18n("Client offline")); +} + +void JabberBrowser::startProcess() +{ + Command cmd; + cmd->id = CmdUrl; + cmd->text = I18N_NOOP("Stop"); + cmd->icon = "cancel"; + cmd->bar_grp = 0x2000; + cmd->flags = BTN_COMBO_CHECK; + cmd->param = this; + EventCommandChange(cmd).process(); +} + +void JabberBrowser::showEvent(QShowEvent *e) +{ + QMainWindow::showEvent(e); + selectionChanged(); +} + +void JabberBrowser::selectionChanged() +{ + emit enableOptions(m_list->selectedItems().count() > 0); +} + +void JabberBrowser::save() +{ + saveToolbar(m_bar, JabberPlugin::plugin->data.browser_bar); +} + +bool JabberBrowser::processEvent(Event *e) +{ + if (e->type() == eEventAgentInfo){ + EventAgentInfo *eai = static_cast(e); + JabberAgentInfo *data = eai->agentInfo(); + if (m_search_id == data->ReqID.str()){ + if (data->Type.str().isEmpty()){ + if (data->nOptions.toULong()){ + QString err = i18n(data->Label.str()); + if (err.isEmpty()) + err = i18n("Error %1") .arg(data->nOptions.toULong()); + m_search_id = QString::null; + Command cmd; + cmd->id = CmdBrowseSearch; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *parent = eWidget.widget(); + if (parent == NULL) + parent = this; + BalloonMsg::message(err, parent); + delete m_search; + }else{ + m_search->jidSearch->addWidget(data); + connect(this, SIGNAL(addSearch(QWidget*, SIM::Client*, const QString&)), topLevelWidget(), SLOT(addSearch(QWidget*, SIM::Client*, const QString&))); + emit addSearch(m_search, m_client, m_search->m_jid); + disconnect(this, SIGNAL(addSearch(QWidget*, SIM::Client*, const QString&)), topLevelWidget(), SLOT(addSearch(QWidget*, SIM::Client*, const QString&))); + } + m_search_id = QString::null; + m_search = NULL; + return true; + } + m_search->jidSearch->addWidget(data); + return true; + } + if (m_reg_id == data->ReqID.str()) { + if (data->Type.str().isEmpty()){ + if (data->nOptions.toULong()){ + QString err = i18n(data->Label.str()); + if (err.isEmpty()) + err = i18n("Error %1") .arg(data->nOptions.toULong()); + m_reg_id = QString::null; + delete m_reg; + m_reg = NULL; + Command cmd; + cmd->id = CmdRegister; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *parent = eWidget.widget(); + if (parent == NULL) + parent = this; + BalloonMsg::message(err, parent); + }else if (m_reg){ + m_reg->m_search->addWidget(data); + QTimer::singleShot(0, this, SLOT(showReg())); + } + m_reg_id = QString::null; + return true; + } + if (m_reg) + m_reg->m_search->addWidget(data); + return true; + } + if (m_config_id == data->ReqID.str()){ + if (data->Type.str().isEmpty()){ + if (data->nOptions.toULong()){ + QString err = i18n(data->Label.str()); + if (err.isEmpty()) + err = i18n("Error %1") .arg(data->nOptions.toULong()); + m_config_id = QString::null; + delete m_config; + m_config = NULL; + Command cmd; + cmd->id = CmdBrowseConfigure; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *parent = eWidget.widget(); + if (parent == NULL) + parent = this; + BalloonMsg::message(err, parent); + }else if (m_config){ + m_config->m_search->addWidget(data); + QTimer::singleShot(0, this, SLOT(showConfig())); + } + m_config_id = QString::null; + return true; + } + if (m_config) + m_config->m_search->addWidget(data); + return true; + } + } else + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if ((cmd->menu_id == MenuSearchOptions) && isVisible()){ + cmd->flags &= ~COMMAND_CHECKED; + switch (cmd->id){ + case CmdBrowseSearch: + if (haveFeature("jabber:iq:search")) + return true; + break; + case CmdRegister: + if (haveFeature("jabber:iq:register")) + return true; + break; + case CmdBrowseConfigure: + if (haveFeature("jabber:iq:data")) + return true; + break; + } + return false; + } + if (cmd->param != this) + return false; + if (cmd->menu_id != MenuBrowser) + return false; + cmd->flags &= ~COMMAND_CHECKED; + switch (cmd->id){ + case CmdOneLevel: + if (!JabberPlugin::plugin->getAllLevels()) + cmd->flags |= COMMAND_CHECKED; + return true; + case CmdAllLevels: + if (JabberPlugin::plugin->getAllLevels()) + cmd->flags |= COMMAND_CHECKED; + return true; + case CmdModeDisco: + if (JabberPlugin::plugin->getBrowseType() & BROWSE_DISCO) + cmd->flags |= COMMAND_CHECKED; + return true; + case CmdModeBrowse: + if (JabberPlugin::plugin->getBrowseType() & BROWSE_BROWSE) + cmd->flags |= COMMAND_CHECKED; + return true; + case CmdModeAgents: + if (JabberPlugin::plugin->getBrowseType() & BROWSE_AGENTS) + cmd->flags |= COMMAND_CHECKED; + return true; + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (((cmd->menu_id == MenuSearchItem) || (cmd->menu_id == MenuSearchOptions)) && isVisible()){ + Command c; + c->id = cmd->id; + if (cmd->id == CmdSearchInfo) + c->id = CmdBrowseInfo; + c->param = this; + EventCommandExec(c).process(); + } + if (cmd->param != this) + return false; + ListViewItem *item = m_list->currentItem(); + if (cmd->menu_id == MenuBrowser){ + cmd->flags &= ~COMMAND_CHECKED; + unsigned mode = JabberPlugin::plugin->getBrowseType(); + switch (cmd->id){ + case CmdOneLevel: + JabberPlugin::plugin->setAllLevels(false); + changeMode(); + return true; + case CmdAllLevels: + JabberPlugin::plugin->setAllLevels(true); + changeMode(); + return true; + case CmdModeDisco: + mode ^= BROWSE_DISCO; + JabberPlugin::plugin->setBrowseType(mode); + changeMode(); + return true; + case CmdModeBrowse: + mode ^= BROWSE_BROWSE; + JabberPlugin::plugin->setBrowseType(mode); + changeMode(); + return true; + case CmdModeAgents: + mode ^= BROWSE_AGENTS; + JabberPlugin::plugin->setBrowseType(mode); + changeMode(); + return true; + } + return false; + } + if (item){ + if (cmd->id == CmdBrowseSearch){ + if (m_search) + delete m_search; + m_search = new JIDSearch(this, m_client, item->text(COL_JID), item->text(COL_NODE), item->text(COL_TYPE)); + m_search->jidSearch->init(this, m_client, m_search->m_jid, m_search->m_node, QString::null, false); + m_search_id = m_client->get_agent_info(item->text(COL_JID), item->text(COL_NODE), "search"); + return true; + } + if (cmd->id == CmdRegister){ + if (m_reg) + delete m_reg; + m_reg = new JabberWizard(this, i18n("%1 Register") .arg(item->text(COL_NAME)), "reg", m_client, item->text(COL_JID), item->text(COL_NODE), "register"); + connect(m_reg, SIGNAL(destroyed()), this, SLOT(regFinished())); + m_reg_id = m_client->get_agent_info(item->text(COL_JID), item->text(COL_NODE), "register"); + return true; + } + if (cmd->id == CmdBrowseConfigure){ + if (m_config) + delete m_config; + m_config = new JabberWizard(this, i18n("%1 Configure") .arg(item->text(COL_NAME)), "configure", m_client, item->text(COL_JID), item->text(COL_NODE), "data"); + connect(m_config, SIGNAL(destroyed()), this, SLOT(configFinished())); + m_config_id = m_client->get_agent_info(item->text(COL_JID), item->text(COL_NODE), "data"); + return true; + } + if (cmd->id == CmdBrowseInfo){ + if (m_info == NULL) + m_info = new DiscoInfo(this, m_list->currentItem()->text(COL_FEATURES), item->text(COL_NAME), item->text(COL_TYPE), item->text(COL_CATEGORY)); + m_info->reset(); + raiseWindow(m_info); + return true; + } + } + if (cmd->id == CmdBack){ + if (m_historyPos){ + m_historyPos--; + QString url = m_history[m_historyPos]; + QString node = m_nodes[m_historyPos]; + go(url, node); + } + } + if (cmd->id == CmdForward){ + if (m_historyPos + 1 < (int)(m_history.size())){ + m_historyPos++; + QString url = m_history[m_historyPos]; + QString node = m_nodes[m_historyPos]; + go(url, node); + } + } + if (cmd->id == CmdUrl){ + if (m_bInProcess){ + stop(QString::null); + return true; + } + QString jid; + QString node; + Command cmd; + cmd->id = CmdUrl; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolCombo *cmbUrl = dynamic_cast(eWidget.widget()); + if (cmbUrl) + jid = cmbUrl->lineEdit()->text(); + cmd->id = CmdNode; + EventCommandWidget eWidget2(cmd); + eWidget2.process(); + CToolCombo *cmbNode = dynamic_cast(eWidget2.widget()); + if (cmbNode) + node = cmbNode->lineEdit()->text(); + if (!jid.isEmpty()){ + addHistory(jid); + goUrl(jid, node); + } + return true; + } + } else + if (e->type() == eEventDiscoItem){ + if (!m_bInProcess) + return false; + EventDiscoItem *edi = static_cast(e); + DiscoItem *item = edi->item(); + ListViewItem *it = findItem(COL_ID_DISCO_ITEMS, item->id); + if (it){ + if (item->jid.isEmpty()){ + it->setText(COL_ID_DISCO_ITEMS, QString::null); + if (it != m_list->topLevelItem(0)){ + checkDone(); + adjustColumn(it); + return true; + } + QString err; + if (!item->name.isEmpty()){ + err = item->name; + }else if (!item->node.isEmpty()){ + err = i18n("Error %1") .arg(item->node.toULong()); + } + if (!err.isEmpty()){ + unsigned mode = it->text(COL_MODE).toLong(); + if (((mode & BROWSE_BROWSE) == 0) || (it->text(COL_ID_BROWSE).isEmpty() & m_bError)) + stop(err); + m_bError = true; + } + checkDone(); + adjustColumn(it); + return true; + } + if (it->child(0) == NULL){ + it->setExpandable(true); + if ((it == m_list->topLevelItem(0)) || (it == m_list->currentItem())) + it->setOpen(true); + } + ListViewItem *i; + for(int c = 0; c < m_list->topLevelItemCount(); c++) + { + ListViewItem *i= static_cast(m_list->topLevelItem(c)); + if ((i->text(COL_JID) == item->jid) && + (i->text(COL_NODE) == item->node)) + return true; + } + i = new ListViewItem(it); + i->setText(COL_JID, item->jid); + i->setText(COL_NAME, item->name.isEmpty() ? item->jid : item->name); + i->setText(COL_NODE, item->node); + int mode = 0; + if (JabberPlugin::plugin->getBrowseType() & BROWSE_DISCO){ + i->setText(COL_ID_DISCO_INFO, m_client->discoInfo(item->jid, item->node)); + mode |= BROWSE_INFO; + } + i->setText(COL_MODE, QString::number(mode)); + if (JabberPlugin::plugin->getAllLevels()) + loadItem(i); + return true; + } + it = findItem(COL_ID_DISCO_INFO, item->id); + if (it){ + if (item->jid.isEmpty()){ + it->setText(COL_ID_DISCO_INFO, QString::null); + checkDone(); + adjustColumn(it); + return true; + } + if (it->text(COL_NAME) == it->text(COL_JID)) + it->setText(COL_NAME, item->name); + it->setText(COL_CATEGORY, item->category); + it->setText(COL_TYPE, item->type); + it->setText(COL_FEATURES, item->features); + if ((JabberPlugin::plugin->getAllLevels()) || (it == m_list->currentItem())) + loadItem(it); + setItemPict(it); + if (it == m_list->currentItem()) + currentChanged(it); + return true; + } + it = findItem(COL_ID_BROWSE, item->id); + if (it){ + if (item->jid.isEmpty()){ + it->setText(COL_ID_BROWSE, QString::null); + if (it != m_list->topLevelItem(0)){ + checkDone(); + adjustColumn(it); + return true; + } + QString err; + if (!item->name.isEmpty()){ + err = item->name; + }else if (!item->node.isEmpty()){ + err = i18n("Error %1") .arg(item->node.toULong()); + } + if (!err.isEmpty()){ + unsigned mode = it->text(COL_MODE).toLong(); + if (((mode & BROWSE_DISCO) == 0) || (it->text(COL_ID_DISCO_ITEMS).isEmpty() & m_bError)) + stop(err); + m_bError = true; + } + checkDone(); + adjustColumn(it); + return true; + } + ListViewItem* i=NULL; + if (it->text(COL_JID) != item->jid){ + + for(int c = 0; c < it->childCount(); c++) + { + i= static_cast(it->child(0)); + if ((i->text(COL_JID) == item->jid) && + (i->text(COL_NODE) == item->node)) + break; + } + if (i) //Fixme warning C4701: potentially uninitialized local variable 'i' used + { + it = i; + }else{ + if (it->child(0) == NULL){ + it->setExpandable(true); + if ((it == m_list->topLevelItem(0)) || (it == m_list->currentItem())) + it->setOpen(true); + } + it = new ListViewItem(it); + it->setText(COL_JID, item->jid); + it->setText(COL_MODE, "0"); + if (JabberPlugin::plugin->getAllLevels()) + loadItem(it); + } + } + if (it->text(COL_NAME).isEmpty() || (it->text(COL_NAME) == it->text(COL_JID))) + it->setText(COL_NAME, item->name); + it->setText(COL_NODE, QString::null); + it->setText(COL_CATEGORY, item->category); + it->setText(COL_TYPE, item->type); + it->setText(COL_FEATURES, item->features); + if (JabberPlugin::plugin->getAllLevels() || (it == m_list->currentItem())) + loadItem(it); + setItemPict(it); + return true; + } + } + return false; +} + +void JabberBrowser::configFinished() +{ + m_config = NULL; +} + +void JabberBrowser::regFinished() +{ + m_reg = NULL; +} + +void JabberBrowser::setNavigation() +{ + Command cmd; + cmd->id = CmdBack; + cmd->flags = m_historyPos ? 0 : COMMAND_DISABLED; + cmd->param = this; + EventCommandDisabled(cmd).process(); + + cmd->id = CmdForward; + cmd->flags = (m_historyPos + 1 < (int)(m_history.size())) ? 0 : COMMAND_DISABLED; + cmd->param = this; + EventCommandDisabled(cmd).process(); +} + +void JabberBrowser::currentChanged(ListViewItem*) +{ + Command cmd; + cmd->id = CmdBrowseInfo; + cmd->flags = m_list->currentItem() ? 0 : COMMAND_DISABLED; + cmd->param = this; + EventCommandDisabled(cmd).process(); + + cmd->id = CmdBrowseSearch; + cmd->flags = haveFeature("jabber:iq:search") ? 0 : COMMAND_DISABLED; + EventCommandDisabled(cmd).process(); + + cmd->id = CmdRegister; + cmd->flags = haveFeature("jabber:iq:register") ? 0 : COMMAND_DISABLED; + EventCommandDisabled(cmd).process(); + + cmd->id = CmdBrowseConfigure; + cmd->flags = haveFeature("jabber:iq:data") ? 0 : COMMAND_DISABLED; + EventCommandDisabled(cmd).process(); + + ListViewItem *item = m_list->currentItem(); + if (item == NULL) + return; + loadItem(item); +} + +void JabberBrowser::loadItem(ListViewItem *item) +{ + bool bProcess = false; + unsigned mode = item->text(COL_MODE).toLong(); + if (JabberPlugin::plugin->getBrowseType() & BROWSE_DISCO){ + if (((mode & BROWSE_DISCO) == 0) && item->text(COL_ID_DISCO_ITEMS).isEmpty()){ + item->setText(COL_ID_DISCO_ITEMS, m_client->discoItems(item->text(COL_JID), item->text(COL_NODE))); + mode |= BROWSE_DISCO; + bProcess = true; + } + if (((mode & BROWSE_INFO) == 0) && item->text(COL_ID_DISCO_INFO).isEmpty()){ + item->setText(COL_ID_DISCO_INFO, m_client->discoInfo(item->text(COL_JID), item->text(COL_NODE))); + mode |= BROWSE_INFO; + bProcess = true; + } + } + if (JabberPlugin::plugin->getBrowseType() & BROWSE_BROWSE){ + if (((mode & BROWSE_BROWSE) == 0) && item->text(COL_ID_BROWSE).isEmpty() && haveFeature("iq:id:browse", item->text(COL_FEATURES))){ + item->setText(COL_ID_BROWSE, m_client->browse(item->text(COL_JID))); + mode |= BROWSE_BROWSE; + bProcess = true; + } + } + item->setText(COL_MODE, QString::number(mode)); + if (!m_bInProcess && bProcess){ + m_bInProcess = true; + startProcess(); + } +} + +void JabberBrowser::changeMode() +{ + if (JabberPlugin::plugin->getAllLevels()){ + if (m_list->firstChild()) + changeMode(m_list->firstChild()); + }else{ + if (m_list->firstChild()) + loadItem(m_list->firstChild()); + if (m_list->currentItem()) + loadItem(m_list->currentItem()); + } +} + +void JabberBrowser::changeMode(ListViewItem *item) +{ + loadItem(item); + for(int c = 0; c < item->childCount(); c++) + { +// ListViewItem *i = static_cast(item->child(c)); + changeMode(item); + } +} + +void JabberBrowser::dragStart() +{ +/* + ListViewItem *item = m_list->currentItem(); + if (item == NULL) + return; + Contact *contact; + QString resource; + JabberUserData *data = m_client->findContact(item->text(COL_JID), QString::null, false, contact, resource); + if (data == NULL){ + m_client->findContact(item->text(COL_JID), item->text(COL_NAME), true, contact, resource); + contact->setFlags(CONTACT_DRAG); + } + m_list->startDrag(new ContactDragObject(m_list, contact)); +*/ +} + +void JabberBrowser::stop(const QString &err) +{ + if (!m_bInProcess) + return; + m_bInProcess = false; + Command cmd; + cmd->id = CmdUrl; + cmd->text = I18N_NOOP("JID"); + cmd->icon = "run"; + cmd->bar_grp = 0x2000; + cmd->flags = BTN_COMBO_CHECK; + cmd->param = this; + EventCommandChange(cmd).process(); + if (!err.isEmpty()){ + Command cmd; + cmd->id = CmdUrl; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *parent = eWidget.widget(); + if (parent == NULL) + parent = this; + BalloonMsg::message(err, parent); + } +} + +const unsigned MAX_HISTORY = 10; + +void JabberBrowser::addHistory(const QString &str) +{ + QStringList l = JabberPlugin::plugin->getBrowserHistory().split(';'); + l.removeAll(str); + l.prepend(str); + QString res; + Command cmd; + cmd->id = CmdUrl; + cmd->param = this; + EventCommandWidget eWidget(cmd); + eWidget.process(); + CToolCombo *cmbUrl = dynamic_cast(eWidget.widget()); + if (cmbUrl) + cmbUrl->clear(); + unsigned i = 0; + Q_FOREACH(const QString &str, l) { + if (i++ > MAX_HISTORY) + break; + if (!res.isEmpty()) + res += ';'; + cmbUrl->addItem(str); + res += quoteChars(str, ";"); + } + JabberPlugin::plugin->setBrowserHistory(res); +} + +bool JabberBrowser::haveFeature(const char *feature) +{ + QString features; + if (m_list->currentItem()) + features = m_list->currentItem()->text(COL_FEATURES); + return haveFeature(feature, features); +} + +bool JabberBrowser::haveFeature(const char *feature, const QString &features) +{ + if (features.isEmpty()) + return false; + QString ff = features; + while (!ff.isEmpty()){ + QString f = getToken(ff, '\n'); + if (f == feature) + return true; + } + return false; +} + +void JabberBrowser::showReg() +{ + if (m_reg){ + m_reg->initTitle(); + QTimer::singleShot(0, m_reg, SLOT(setNext())); + m_reg->show(); + } +} + +void JabberBrowser::showConfig() +{ + if (m_config){ + m_config->initTitle(); + QTimer::singleShot(0, m_config, SLOT(setNext())); + m_config->show(); + } +} + +ListViewItem *JabberBrowser::findItem(unsigned col, const QString &id) +{ + if (m_list->firstChild() == NULL) + return NULL; + return findItem(col, id, m_list->firstChild()); +} + +ListViewItem *JabberBrowser::findItem(unsigned col, const QString &id, ListViewItem *item) +{ + if (item->text(col) == id) + return item; + for(int c = 0; c < item->childCount(); c++) + { + ListViewItem *i= static_cast(item->child(c)); + ListViewItem *res = findItem(col, id, i); + if (res) + return res; + } + return NULL; +} + +void JabberBrowser::checkDone() +{ + if (m_list->firstChild() && checkDone(m_list->firstChild())) + stop(QString::null); +} + +bool JabberBrowser::checkDone(ListViewItem *item) +{ + if (!item->text(COL_ID_DISCO_ITEMS).isEmpty() || + !item->text(COL_ID_DISCO_INFO).isEmpty() || + !item->text(COL_ID_BROWSE).isEmpty()){ + return false; + } + for(int c = 0; c < item->childCount(); c++) + { + ListViewItem *i= static_cast(item->child(c)); + if (!checkDone(i)) + return false; + } + return true; +} + +void JabberBrowser::setItemPict(ListViewItem *item) +{ + const char *name = "Jabber"; + QString category = item->text(COL_CATEGORY); + QString type = item->text(COL_TYPE); + if (category == "headline"){ + name = "info"; + }else if (category == "directory"){ + name = "find"; + }else if (category == "conference"){ + name = "chat"; + }else if (category == "proxy"){ + name = "connect"; + }else if (type == "icq"){ + name = "ICQ"; + }else if (type == "aim"){ + name = "AIM"; + }else if (type == "msn"){ + name = "MSN"; + }else if (type == "yahoo"){ + name = "Yahoo!"; + }else if (type == "jud"){ + name = "find"; + }else if (type == "sms"){ + name = "sms"; + }else if ((type == "x-gadugadu") || (type == "gg")){ + name = "GG"; + }else if ((type == "rss") || (type == "weather")){ + name = "info"; + } + item->setPixmap(COL_NAME, Pict(name)); +} + +void JabberBrowser::adjustColumn(ListViewItem *item) +{ + for (; item; item = static_cast(item->parent())){ + if (item->isExpandable() && !item->isOpen()) + return; + } + m_list->adjustColumn(); +} + +void JabberBrowser::search() +{ +} + +void JabberBrowser::textChanged(const QString&) +{ +} + +void JabberWizard::layOutButtonRow(QHBoxLayout *layout){} +void JabberWizard::layOutTitleRow(QHBoxLayout *layout, const QString &title){} + +#if 0 + +I18N_NOOP("Choose a user and password to register with the server"); + +#endif + +/* +#ifndef NO_MOC_INCLUDES +#include "jabberbrowser.moc" +#endif +*/ + diff --git a/plugins/jabber/jabberbrowser.h b/plugins/jabber/jabberbrowser.h new file mode 100644 index 0000000..85ec95e --- /dev/null +++ b/plugins/jabber/jabberbrowser.h @@ -0,0 +1,133 @@ +/*************************************************************************** + jabberbrowser.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERBROWSER_H +#define _JABBERBROWSER_H + +#include "jabberclient.h" + +#include +#include +#include +#include +#include + +class ListView; +class ListViewItem; +class QStatusBar; +class CToolBar; +class DiscoInfo; +class JabberWizard; +class QLabel; + +const unsigned COL_NAME = 0; +const unsigned COL_JID = 1; +const unsigned COL_NODE = 2; +const unsigned COL_CATEGORY = 3; +const unsigned COL_TYPE = 4; +const unsigned COL_FEATURES = 5; +const unsigned COL_ID_DISCO_ITEMS = 6; +const unsigned COL_ID_DISCO_INFO = 7; +const unsigned COL_ID_BROWSE = 8; +const unsigned COL_MODE = 9; + +class JabberSearch; +class JIDSearch; + +class JabberWizard : public QWizard, public SIM::EventReceiver +{ + Q_OBJECT +public: + JabberWizard(QWidget *parent, const QString &title, const QString &icon, JabberClient *client, const QString &jid, const QString &node, const QString &type); + JabberSearch *m_search; + QLabel *m_result; + void initTitle(); +protected slots: + void setNext(); + void search(); + void textChanged(const QString&); + void slotSelected(const QString&); +protected: + virtual bool processEvent(SIM::Event *e); + virtual void layOutButtonRow(QHBoxLayout *layout); + virtual void layOutTitleRow(QHBoxLayout *layout, const QString &title); + QString m_type; + QString m_id; +}; + +class JabberBrowser : public QMainWindow, public SIM::EventReceiver +{ + Q_OBJECT +public: + JabberBrowser(); + ~JabberBrowser(); + void goUrl(const QString &url, const QString &node); + void save(); + void setClient(JabberClient *client); + DiscoInfo *m_info; + ListView *m_list; +signals: + void enableOptions(bool); + void addSearch(QWidget*, SIM::Client*, const QString&); +protected slots: + void selectionChanged(); + void currentChanged(ListViewItem*); + void dragStart(); + void showReg(); + void showConfig(); + void search(); + void textChanged(const QString&); + void configFinished(); + void regFinished(); +protected: + virtual bool processEvent(SIM::Event *e); + void setNavigation(); + void stop(const QString &err); + void go(const QString &url, const QString &node); + void addHistory(const QString &str); + bool haveFeature(const char*); + bool haveFeature(const char*, const QString&); + ListViewItem *findItem(unsigned col, const QString &id); + ListViewItem *findItem(unsigned col, const QString &id, ListViewItem *item); + void setItemPict(ListViewItem *item); + void adjustColumn(ListViewItem *item); + void loadItem(ListViewItem *item); + void checkDone(); + bool checkDone(ListViewItem*); + void startProcess(); + void changeMode(); + void changeMode(ListViewItem *item); + void showEvent(QShowEvent*); + bool m_bInProcess; + JabberClient *m_client; + CToolBar *m_bar; + std::vector m_history; + std::vector m_nodes; + QString m_historyStr; + int m_historyPos; + JabberWizard *m_reg; + JabberWizard *m_config; + JIDSearch *m_search; + QString m_search_id; + QString m_reg_id; + QString m_config_id; + bool m_bError; + friend class DiscoInfo; +}; + +#endif + diff --git a/plugins/jabber/jabberbuffer.cpp b/plugins/jabber/jabberbuffer.cpp new file mode 100644 index 0000000..056ca76 --- /dev/null +++ b/plugins/jabber/jabberbuffer.cpp @@ -0,0 +1,52 @@ +/*************************************************************************** + jabberbuffer.h - description + ------------------- + begin : Mon Jan 08 2006 + copyright : (C) 2007 by Christian Ehrlicher + email : ch.ehrlicher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "jabberbuffer.h" + +#include + +using namespace SIM; + +JabberBuffer::JabberBuffer(unsigned size) + : Buffer(size) +{} + +JabberBuffer::JabberBuffer(const QByteArray &ba) + : Buffer(ba) +{} + +JabberBuffer::~JabberBuffer() +{} + +JabberBuffer &JabberBuffer::operator << (const QString &s) +{ + QByteArray utf8 = s.toUtf8(); + Buffer::pack(utf8.data(), utf8.length()); + return *this; +} + +JabberBuffer &JabberBuffer::operator << (const QByteArray &s) +{ + Buffer::pack(s.data(), s.length()); + return *this; +} + +JabberBuffer &JabberBuffer::operator << (const char *s) +{ + Buffer::pack(s, strlen(s)); + return *this; +} diff --git a/plugins/jabber/jabberbuffer.h b/plugins/jabber/jabberbuffer.h new file mode 100644 index 0000000..ca24655 --- /dev/null +++ b/plugins/jabber/jabberbuffer.h @@ -0,0 +1,51 @@ +/*************************************************************************** + jabberbuffer.h - description + ------------------- + begin : Mon Jan 08 2006 + copyright : (C) 2007 by Christian Ehrlicher + email : ch.ehrlicher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef _JABBERBUFFER_H +#define _JABBERBUFFER_H + +#include "buffer.h" +#include "socket/socket.h" +#include "socket/clientsocket.h" +#include + +class JabberBuffer : public Buffer +{ +public: + JabberBuffer(unsigned size = 0); + JabberBuffer(const QByteArray &ba); + virtual ~JabberBuffer(); + + JabberBuffer &operator << (const QString &s); + JabberBuffer &operator << (const QByteArray &s); + JabberBuffer &operator << (const char *s); // interpreted as utf-8 +}; + +class JabberClientSocket : public SIM::ClientSocket +{ +public: + JabberClientSocket(SIM::ClientSocketNotify *notify, SIM::Socket *sock = NULL) + : ClientSocket(notify, sock) {}; + ~JabberClientSocket() {}; + + virtual JabberBuffer &readBuffer() { return m_readJabberBuffer; } + virtual JabberBuffer &writeBuffer() { return m_writeJabberBuffer; } +protected: + JabberBuffer m_readJabberBuffer; + JabberBuffer m_writeJabberBuffer; +}; + +#endif // _JABBERBUFFER_H diff --git a/plugins/jabber/jabberclient.cpp b/plugins/jabber/jabberclient.cpp new file mode 100644 index 0000000..17e6d1b --- /dev/null +++ b/plugins/jabber/jabberclient.cpp @@ -0,0 +1,2816 @@ +/*************************************************************************** + jabberclient.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#ifndef WIN32 +#include +#endif + +#include + +#include "html.h" +#include "icons.h" +#include "log.h" +#include "unquot.h" +#include "core.h" +#include "core_events.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +#include "jabberclient.h" +#include "jabber.h" +#include "jabberconfig.h" +#include "jabber_ssl.h" +#include "jabberadd.h" +#include "jabberinfo.h" +#include "jabberhomeinfo.h" +#include "jabberworkinfo.h" +#include "jabberaboutinfo.h" +#include "jabberpicture.h" +#include "jabbermessage.h" +#include "jabberbrowser.h" +#include "infoproxy.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +#ifndef XML_STATUS_OK +#define XML_STATUS_OK 1 +#define XML_STATUS_ERROR 0 +#endif + +unsigned PING_TIMEOUT = 50; + +DataDef jabberUserData[] = + { + { "", DATA_ULONG, 1, DATA(2) }, // Sign + { "LastSend", DATA_ULONG, 1, 0 }, + { "ID", DATA_UTF, 1, 0 }, + { "Node", DATA_UTF, 1, 0 }, + { "Resource", DATA_UTF, 1, 0 }, + { "Name", DATA_UTF, 1, 0 }, + { "", DATA_ULONG, 1, DATA(1) }, // Status + { "FirstName", DATA_UTF, 1, 0 }, + { "Nick", DATA_UTF, 1, 0 }, + { "Desc", DATA_UTF, 1, 0 }, + { "BirthDay", DATA_UTF, 1, 0 }, + { "Url", DATA_UTF, 1, 0 }, + { "OrgName", DATA_UTF, 1, 0 }, + { "OrgUnit", DATA_UTF, 1, 0 }, + { "Role", DATA_UTF, 1, 0 }, + { "Title", DATA_UTF, 1, 0 }, + { "Street", DATA_UTF, 1, 0 }, + { "ExtAddr", DATA_UTF, 1, 0 }, + { "City", DATA_UTF, 1, 0 }, + { "Region", DATA_UTF, 1, 0 }, + { "PCode", DATA_UTF, 1, 0 }, + { "Country", DATA_UTF, 1, 0 }, + { "EMail", DATA_UTF, 1, 0 }, + { "Phone", DATA_UTF, 1, 0 }, + { "StatusTime", DATA_ULONG, 1, 0 }, + { "OnlineTime", DATA_ULONG, 1, 0 }, + { "Subscribe", DATA_ULONG, 1, 0 }, + { "Group", DATA_UTF, 1, 0 }, + { "", DATA_BOOL, 1, 0 }, // bChecked + { "", DATA_STRING, 1, 0 }, // TypingId + { "", DATA_BOOL, 1, 0 }, // SendTypingEvents + { "", DATA_BOOL, 1, 0 }, // IsTyping + { "", DATA_ULONG, 1, 0 }, // ComposeId + { "", DATA_BOOL, 1, DATA(1) }, // richText + { "", DATA_BOOL, 1, 0 }, + { "PhotoWidth", DATA_LONG, 1, 0 }, + { "PhotoHeight", DATA_LONG, 1, 0 }, + { "LogoWidth", DATA_LONG, 1, 0 }, + { "LogoHeight", DATA_LONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // nResources + { "", DATA_STRLIST, 1, 0 }, // Resources + { "", DATA_STRLIST, 1, 0 }, // ResourceStatus + { "", DATA_STRLIST, 1, 0 }, // ResourceReply + { "", DATA_STRLIST, 1, 0 }, // ResourceStatusTime + { "", DATA_STRLIST, 1, 0 }, // ResourceOnlineTime + { "AutoReply", DATA_UTF, 1, 0 }, + { "", DATA_STRLIST, 1, 0 }, // ResourceClientName + { "", DATA_STRLIST, 1, 0 }, // ResourceClientVersion + { "", DATA_STRLIST, 1, 0 }, // ResourceClientOS + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +static DataDef jabberClientData[] = + { + { "Server", DATA_STRING, 1, "jabber.org" }, + { "Port", DATA_ULONG, 1, DATA(5222) }, + { "UseSSL", DATA_BOOL, 1, 0 }, + { "UsePlain", DATA_BOOL, 1, 0 }, + { "UseVHost", DATA_BOOL, 1, 0 }, + { "", DATA_BOOL, 1, 0 }, + { "Priority", DATA_ULONG, 1, DATA(5) }, + { "ListRequest", DATA_UTF, 1, 0 }, + { "VHost", DATA_UTF, 1, 0 }, + { "Typing", DATA_BOOL, 1, DATA(1) }, + { "RichText", DATA_BOOL, 1, DATA(1) }, + { "UseVersion", DATA_BOOL, 1, DATA(1) }, + { "ProtocolIcons", DATA_BOOL, 1, DATA(1) }, + { "MinPort", DATA_ULONG, 1, DATA(1024) }, + { "MaxPort", DATA_ULONG, 1, DATA(0xFFFF) }, + { "Photo", DATA_UTF, 1, 0 }, + { "Logo", DATA_UTF, 1, 0 }, + { "AutoSubscribe", DATA_BOOL, 1, DATA(1) }, + { "AutoAccept", DATA_BOOL, 1, DATA(1) }, + { "UseHTTP", DATA_BOOL, 1, 0 }, + { "URL", DATA_STRING, 1, 0 }, + { "InfoUpdated", DATA_BOOL, 1, 0 }, + { "", DATA_STRUCT, sizeof(JabberUserData) / sizeof(Data), DATA(jabberUserData) }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +JabberClient::JabberClient(JabberProtocol *protocol, Buffer *cfg) : TCPClient(protocol, cfg) +{ + load_data(jabberClientData, &data, cfg); + QString jid = data.owner.ID.str(); + //log(L_DEBUG, "JID: %s", jid.toUtf8().data()); + + //For old configs, where server part in own jid is missing + if (!jid.isEmpty() && jid.indexOf('@')==-1) + { + jid += '@'; + if (getUseVHost()) + { + jid += getVHost(); + } + else + { + jid += getServer(); + } + data.owner.ID.str()=jid; + } + if (data.owner.Resource.str().isEmpty()) + { + QString resource = PACKAGE; + data.owner.Resource.str() = resource.simplified(); + } + + TCPClient::changeStatus(this->protocol()->status("offline")); + + QString listRequests = getListRequest(); + while (!listRequests.isEmpty()){ + QString item = getToken(listRequests, ';', false); + JabberListRequest lr; + lr.bDelete = false; + lr.jid = getToken(item, ','); + lr.grp = getToken(item, ','); + if (!item.isEmpty()) + lr.bDelete = true; + m_listRequests.push_back(lr); + } + setListRequest(QString::null); + + m_bSSL = false; + m_curRequest = NULL; + m_msg_id = 0; + m_bJoin = false; + init(); +} + +JabberClient::~JabberClient() +{ + TCPClient::changeStatus(this->protocol()->status("offline")); + //TCPClient::setStatus(STATUS_OFFLINE, false); + free_data(jabberClientData, &data); + freeData(); +} + +const DataDef *JabberProtocol::userDataDef() +{ + return jabberUserData; +} + +bool JabberClient::compareData(void *d1, void *d2) +{ + JabberUserData *data1 = toJabberUserData((SIM::clientData*)d1); // FIXME unsafe type conversion + JabberUserData *data2 = toJabberUserData((SIM::clientData*)d2); // FIXME unsafe type conversion + return (data1->ID.str().toLower() == data2->ID.str().toLower()); +} + +void JabberClient::setID(const QString &id) +{ + data.owner.ID.str() = id; +} + +QByteArray JabberClient::getConfig() +{ + QString lr; + for (list::iterator it = m_listRequests.begin(); it != m_listRequests.end(); ++it){ + if (!lr.isEmpty()) + lr += ';'; + lr += quoteChars(it->jid, ",;"); + lr += ','; + lr += quoteChars(it->grp, ",;"); + if (it->bDelete) + lr += ",1"; + } + setListRequest(lr); + QByteArray res = Client::getConfig(); + if (res.length()) + res += '\n'; + return res += save_data(jabberClientData, &data); +} + +QString JabberClient::name() +{ + QString res = "Jabber."; + res += data.owner.ID.str(); + return res; +} + +QWidget *JabberClient::setupWnd() +{ + return new JabberConfig(NULL, this, false); +} + +bool JabberClient::isMyData(clientData *&_data, Contact *&contact) +{ + if (_data->Sign.toULong() != JABBER_SIGN) + return false; + QString resource; + JabberUserData *data = toJabberUserData(_data); + JabberUserData *my_data = findContact(data->ID.str(), QString::null, false, contact, resource); + if (my_data){ + data = my_data; + }else{ + contact = NULL; + } + return true; +} + +bool JabberClient::createData(clientData *&_data, Contact *contact) +{ + JabberUserData *data = toJabberUserData(_data); + JabberUserData *new_data = toJabberUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + new_data->ID.str() = data->ID.str(); + _data = (clientData*)new_data; + return true; +} + +void JabberClient::connect_ready() +{ + if (!getUseSSL() || m_bSSL){ + connected(); + return; + } + m_bSSL = true; + // FIXME HACKHACKHACK!!!11 alarm + SSLClient *ssl = new JabberSSL(socket()->socket(), (bool)!(getServer().compare("talk.google.com"))); + socket()->setSocket(ssl); + ssl->startEncryption(); +} + +void JabberClient::connected() +{ + socket()->readBuffer().init(0); + socket()->readBuffer().packetStart(); + socket()->setRaw(true); + log(L_DEBUG, "Connect ready"); + startHandshake(); + TCPClient::connect_ready(); + reset(); +} + +void JabberClient::packet_ready() +{ + if (socket()->readBuffer().writePos() == 0) + return; + JabberPlugin *plugin = static_cast(protocol()->plugin()); + EventLog::log_packet(socket()->readBuffer(), false, plugin->JabberPacket); + //log(L_DEBUG, "JABBER PACKET: %s\n", socket()->readBuffer().data()); + if (!parse(socket()->readBuffer(), true)) + socket()->error_state("XML parse error"); + socket()->readBuffer().init(0); + socket()->readBuffer().packetStart(); +} + +bool JabberClient::processEvent(Event *e) +{ + TCPClient::processEvent(e); + switch (e->type()) { + case eEventAddContact: { + EventAddContact *ec = static_cast(e); + EventAddContact::AddContact *ac = ec->addContact(); + if (!ac->proto.isEmpty() && (protocol()->description()->text == ac->proto)){ + Contact *contact = NULL; + QString resource; + findContact(ac->addr, ac->nick, true, contact, resource); + if (contact && contact->getGroup() != (int)ac->group){ + contact->setGroup(ac->group); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + ec->setContact(contact); + return true; + } + break; + } + case eEventDeleteContact: { + EventDeleteContact *ec = static_cast(e); + QString addr = ec->alias(); + ContactList::ContactIterator it; + Contact *contact; + while ((contact = ++it) != NULL){ + JabberUserData *data; + ClientDataIterator itc(contact->clientData, this); + while ((data = toJabberUserData(++itc)) != NULL){ + if (data->ID.str() == addr){ + contact->clientData.freeData(data); + ClientDataIterator itc(contact->clientData); + if (++itc == NULL) + delete contact; + return true; + } + } + } + break; + } + case eEventGoURL: { + EventGoURL *u = static_cast(e); + QString url = u->url(); + QString proto; + int n = url.indexOf(':'); + if (n < 0) + return false; + proto = url.left(n); + if (proto != "jabber") + return false; + url = url.mid(n + 1); + while (url.startsWith("/")) + url = url.mid(1); + QString s = unquoteString(url); + QString jid = getToken(s, '/'); + if (!jid.isEmpty()){ + Contact *contact; + QString resource; + findContact(jid, s, true, contact, resource); + Command cmd; + cmd->id = MessageGeneric; + cmd->menu_id = MenuMessage; + cmd->param = (void*)(contact->id()); + EventCommandExec(cmd).process(); + return true; + } + break; + } + case eEventTemplateExpanded: { + EventTemplate *et = static_cast(e); + EventTemplate::TemplateExpand *t = et->templateExpand(); + setStatus((unsigned long)(t->param), quoteString(t->tmpl, quoteNOBR, false)); + break; + } + case eEventContact: { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + switch(ec->action()) { + case EventContact::eDeleted: { + ClientDataIterator it(contact->clientData, this); + JabberUserData *data; + while ((data = toJabberUserData(++it)) != NULL){ + listRequest(data, QString::null, QString::null, true); + } + break; + } + case EventContact::eChanged: { + QString grpName; + QString name; + name = contact->getName(); + Group *grp = NULL; + if (contact->getGroup()) + grp = getContacts()->group(contact->getGroup()); + if (grp) + grpName = grp->getName(); + ClientDataIterator it(contact->clientData, this); + JabberUserData *data; + while ((data = toJabberUserData(++it)) != NULL){ + if (grpName == data->Group.str()){ + listRequest(data, name, grpName, false); + continue; + } + if (!data->Name.str().isEmpty()){ + if (name == data->Name.str()) + listRequest(data, name, grpName, false); + continue; + } + if (name == data->ID.str()) + listRequest(data, name, grpName, false); + } + break; + } + default: + break; + } + break; + } + case eEventGroup: { + EventGroup *ev = static_cast(e); + if (ev->action() != EventGroup::eChanged) + return false; + Group *grp = ev->group(); + QString grpName = grp->getName(); + ContactList::ContactIterator itc; + Contact *contact; + while ((contact = ++itc) != NULL){ + if (contact->getGroup() != (int)grp->id()) + continue; + ClientDataIterator it(contact->clientData, this); + JabberUserData *data; + while ((data = toJabberUserData(++it)) != NULL){ + if (grpName == data->Group.str()) + listRequest(data, contact->getName(), grpName, false); + } + } + break; + } + case eEventMessageCancel: { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + for (list::iterator it = m_waitMsg.begin(); it != m_waitMsg.end(); ++it){ + if ((*it) == msg){ + m_waitMsg.erase(it); + delete msg; + return true; + } + } + break; + } + case eEventMessageAccept: { + EventMessageAccept *ema = static_cast(e); + for (list::iterator it = m_ackMsg.begin(); it != m_ackMsg.end(); ++it){ + if ((*it)->id() == ema->msg()->id()){ + JabberFileMessage *msg = static_cast(*it); + m_ackMsg.erase(it); + Contact *contact; + QString resource; + JabberUserData *data = findContact(msg->getFrom(), QString::null, false, contact, resource); + if (data){ + JabberFileTransfer *ft = new JabberFileTransfer(static_cast(msg), data, this); + ft->setDir(ema->dir()); + ft->setOverwrite(ema->mode()); + EventMessageAcked(msg).process(); + ft->connect(); + } + EventMessageDeleted(msg).process(); + if (data == NULL) + delete msg; + return true; + } + } + break; + } + case eEventMessageDecline: { + EventMessageDecline *emd = static_cast(e); + for (list::iterator it = m_ackMsg.begin(); it != m_ackMsg.end(); ++it){ + if ((*it)->id() == emd->msg()->id()){ + JabberFileMessage *msg = static_cast(*it); + m_ackMsg.erase(it); + QString reason = emd->reason(); + if (reason.isEmpty()) + reason = i18n("File transfer declined"); + ServerRequest req(this, "error", NULL, msg->getFrom(), msg->getID()); + req.start_element("error"); + req.add_attribute("code", "403"); + req.add_text(reason); + req.send(); + EventMessageDeleted(msg).process(); + delete msg; + return true; + } + } + break; + } + case eEventClientVersion: { + EventClientVersion *ecv = static_cast(e); + ClientVersionInfo* info = ecv->info(); + if (!info->jid.isEmpty()){ + Contact *contact; + QString resource; + JabberUserData* data = findContact(info->jid, QString::null, false, contact, resource); + if (!data) + return false; + unsigned i; + for (i = 1; i <= data->nResources.toULong(); i++){ + if (resource == get_str(data->Resources, i)) + break; + } + if (i <= data->nResources.toULong()){ + set_str(&data->ResourceClientName, i, info->name); + set_str(&data->ResourceClientVersion, i, info->version); + set_str(&data->ResourceClientOS, i, info->os); + } + } + break; + } + default: + break; + } + return false; +} + +void JabberClient::changeStatus(const SIM::IMStatusPtr& status) +{ + QDateTime now = QDateTime::currentDateTime(); + data.owner.StatusTime.asULong() = now.toTime_t(); + if (currentStatus()->id() == "offline") + data.owner.OnlineTime.asULong() = now.toTime_t(); + TCPClient::changeStatus(status); + QSharedPointer jabberstatus = status.dynamicCast(); + socket()->writeBuffer().packetStart(); + QString priority = QString::number(getPriority()); + QString show = jabberstatus->show(); + QString type = jabberstatus->type(); + + if (getInvisible()) { + type = "invisible"; + } + socket()->writeBuffer() << "writeBuffer() << " type=\'" << type << "\'"; + socket()->writeBuffer() << ">\n"; + if (!show.isEmpty()) + socket()->writeBuffer() << "" << show << "\n"; + if (!status->text().isEmpty()) + socket()->writeBuffer() << "" << status->text() << "\n"; + if (!priority.isEmpty()) + socket()->writeBuffer() << "" << priority << "\n"; + socket()->writeBuffer() << ""; + sendPacket(); + EventClientChanged(this).process(); + if (status->id() == "offline") { + if (socket()){ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "\n"; + sendPacket(); + } + // TODO + /* + Contact *contact; + ContactList::ContactIterator it; + QDateTime now(QDateTime::currentDateTime()); + data.owner.StatusTime.asULong() = now.toTime_t(); + while ((contact = ++it) != NULL) { + JabberUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toJabberUserData(++it)) != NULL){ + if (data->Status.toULong() == STATUS_OFFLINE) + continue; + data->StatusTime.asULong() = now.toTime_t(); + setOffline(data); + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(dataName(data)); + m->setFlags(MESSAGE_RECEIVED); + m->setStatus(STATUS_OFFLINE); + EventMessageReceived e(m); + if(!e.process()) + delete m; + } + } + */ + } +} + +void JabberClient::setStatus(unsigned status) +{ + if (getInvisible() && (status != STATUS_OFFLINE)) + { + if (m_status != status) + { + m_status = status; + EventClientChanged(this).process(); + } + return; + } + ARRequest ar; + ar.contact = NULL; + ar.status = status; + ar.receiver = this; + ar.param = (void*)(long)status; + EventARRequest(&ar).process(); +} + +void JabberClient::setStatus(unsigned status, const QString &ar) +{ + if (status != m_status) { + QDateTime now = QDateTime::currentDateTime(); + data.owner.StatusTime.asULong() = now.toTime_t(); + if (m_status == STATUS_OFFLINE) + data.owner.OnlineTime.asULong() = now.toTime_t(); + m_status = status; + socket()->writeBuffer().packetStart(); + QString priority = QString::number(getPriority()); + const char *show = NULL; + const char *type = NULL; + if (getInvisible()){ + type = "invisible"; + }else{ + switch (status){ + case STATUS_AWAY: + show = "away"; + break; + case STATUS_NA: + show = "xa"; + break; + case STATUS_DND: + show = "dnd"; + break; + case STATUS_OCCUPIED: + show = "occupied"; + break; + case STATUS_FFC: + show = "chat"; + break; + case STATUS_OFFLINE: + priority = QString::null; + type = "unavailable"; + break; + } + } + socket()->writeBuffer() << "writeBuffer() << " type=\'" << type << "\'"; + socket()->writeBuffer() << ">\n"; + if (show) + socket()->writeBuffer() << "" << show << "\n"; + if (!ar.isEmpty()) + socket()->writeBuffer() << "" << ar << "\n"; + if (!priority.isEmpty()) + socket()->writeBuffer() << "" << priority << "\n"; + socket()->writeBuffer() << ""; + sendPacket(); + EventClientChanged(this).process(); + } + if (status == STATUS_OFFLINE){ + if (socket()){ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "\n"; + sendPacket(); + } + Contact *contact; + ContactList::ContactIterator it; + QDateTime now(QDateTime::currentDateTime()); + data.owner.StatusTime.asULong() = now.toTime_t(); + while ((contact = ++it) != NULL){ + JabberUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toJabberUserData(++it)) != NULL){ + if (data->Status.toULong() == STATUS_OFFLINE) + continue; + data->StatusTime.asULong() = now.toTime_t(); + setOffline(data); + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(dataName(data)); + m->setFlags(MESSAGE_RECEIVED); + m->setStatus(STATUS_OFFLINE); + EventMessageReceived e(m); + if(!e.process()) + delete m; + } + } + } +} + +void JabberClient::disconnected() +{ + for (list::iterator it = m_requests.begin(); it != m_requests.end(); ++it) + delete *it; + m_requests.clear(); + if (m_curRequest){ + delete m_curRequest; + m_curRequest = NULL; + } + list::iterator itm; + for (itm = m_ackMsg.begin(); itm != m_ackMsg.end(); ++itm){ + Message *msg = *itm; + EventMessageDeleted(msg).process(); + delete msg; + } + for (itm = m_waitMsg.begin(); itm != m_waitMsg.end(); itm = m_waitMsg.begin()){ + Message *msg = *itm; + msg->setError(I18N_NOOP("Client go offline")); + EventMessageSent(msg).process(); + delete msg; + } + m_ackMsg.clear(); + init(); +} + +void JabberClient::init() +{ + m_id = QString::null; + m_depth = 0; + m_id_seed = 0xAAAA; + m_bSSL = false; +} + +void JabberClient::sendPacket() +{ + JabberPlugin *plugin = static_cast(protocol()->plugin()); + EventLog::log_packet(socket()->writeBuffer(), true, plugin->JabberPacket); + socket()->write(); +} + +void JabberClient::element_start(const QString& el, const QXmlAttributes& attrs) +{ + QString element = el.toLower(); + QString id; + if (m_depth) + { + if (m_curRequest) + { + m_curRequest->element_start(element, attrs); + } + else + { + if (element == "iq") + { + QString id = attrs.value("id"); + QString type = attrs.value("type"); + //log(L_DEBUG, "IQ: type = %s", type.toUtf8().data()); + if(id.isEmpty() || type == "set" || type == "get") + { + m_curRequest = new IqRequest(this); + m_curRequest->element_start(element, attrs); + } + else + { + list::iterator it; + for (it = m_requests.begin(); it != m_requests.end(); ++it) + { + if ((*it)->m_id == id) + break; + } + if (it != m_requests.end()) + { + m_curRequest = *it; + m_requests.erase(it); + m_curRequest->element_start(element, attrs); + } + else + { + log(L_WARN, "Packet %s not found", id.toLatin1().data()); + } + } + } + else if (element == "presence") + { + m_curRequest = new PresenceRequest(this); + m_curRequest->element_start(element, attrs); + } + else if (element == "message") + { + m_curRequest = new MessageRequest(this); + m_curRequest->element_start(element, attrs); + } + else if (element == "stream:error") + { + m_curRequest = new StreamErrorRequest(this); + m_curRequest->element_start(element, attrs); + } + else if (element != "a") + { + log(L_DEBUG, "Bad tag %s", qPrintable(element)); + } + } + }else{ + if (element == "stream:stream"){ + id = attrs.value("id"); + } + log(L_DEBUG, "Handshake %s (%s)", qPrintable(id), qPrintable(element)); + handshake(id); + } + m_depth++; +} + +void JabberClient::element_end(const QString& el) +{ + m_depth--; + if (m_curRequest){ + QString element = el.toLower(); + m_curRequest->element_end(element); + if (m_depth == 1){ + delete m_curRequest; + m_curRequest = NULL; + } + } +} + +void JabberClient::char_data(const QString& str) +{ + if (m_curRequest) + m_curRequest->char_data(str); +} + +QString JabberClient::get_unique_id() +{ + QString s("a"); + s += QString::number(m_id_seed,16); + m_id_seed += 0x10; + return s; +} + +JabberClient::ServerRequest::ServerRequest(JabberClient *client, const char *type, + const QString &from, const QString &to, const QString &id) +{ + m_client = client; + if (type == NULL) + return; + m_id = id.isEmpty() ? m_client->get_unique_id() : id; + + if (m_client->socket() == NULL) + return; + m_client->socket()->writeBuffer().packetStart(); + m_client->socket()->writeBuffer() << "socket()->writeBuffer() <<" id=\'" << encodeXMLattr(m_id) << "\'"; + + if (!from.isEmpty()) + m_client->socket()->writeBuffer() << " from=\'" << encodeXMLattr(from) << "\'"; + if (!to.isEmpty()) + m_client->socket()->writeBuffer() << " to=\'" << encodeXMLattr(to) << "\'"; + m_client->socket()->writeBuffer() << ">\n"; +} + +JabberClient::ServerRequest::~ServerRequest() +{ +} + +void JabberClient::ServerRequest::send() +{ + end_element(false); + while (!m_els.isEmpty()){ + end_element(false); + } + m_client->socket()->writeBuffer() + << "\n"; + m_client->sendPacket(); +} + +void JabberClient::ServerRequest::element_start(const QString&, const QXmlAttributes&) +{ +} + +void JabberClient::ServerRequest::element_end(const QString&) +{ +} + +void JabberClient::ServerRequest::char_data(const QString&) +{ +} + +void JabberClient::ServerRequest::start_element(const QString &name) +{ + end_element(true); + m_client->socket()->writeBuffer() << "<" << name; + m_element = name; +} + +void JabberClient::ServerRequest::add_attribute(const QString &name, const QString &value) +{ + if(value.isEmpty()) + return; + m_client->socket()->writeBuffer() + << " " << name + << "=\'" << JabberClient::encodeXMLattr(value) << "\'"; +} + +void JabberClient::ServerRequest::add_attribute(const QString &name, const char *value) +{ + if(value) + add_attribute(name, QString::fromUtf8(value)); +} + +void JabberClient::ServerRequest::end_element(bool bNewLevel) +{ + if (bNewLevel){ + if (m_element.length()){ + m_client->socket()->writeBuffer() << ">\n"; + m_els.push(m_element); + } + }else{ + if (m_element.length()){ + m_client->socket()->writeBuffer() << "/>\n"; + }else if (m_els.count()){ + m_element = m_els.top(); + m_els.pop(); + m_client->socket()->writeBuffer() << "\n"; + } + } + m_element = QString::null; +} + +void JabberClient::ServerRequest::add_text(const QString &value) +{ + if (m_element.length()){ + m_client->socket()->writeBuffer() << ">"; + m_els.push(m_element); + m_element = QString::null; + } + m_client->socket()->writeBuffer() << JabberClient::encodeXML(value); +} + +void JabberClient::ServerRequest::text_tag(const QString &name, const QString &value) +{ + if (value.isEmpty()) + return; + end_element(true); + m_client->socket()->writeBuffer() + << "<" << name << ">" + << JabberClient::encodeXML(value) + << "\n"; +} + +void JabberClient::ServerRequest::add_condition(const QString &condition, bool bXData) +{ + QString cond = condition; + while (cond.length()){ + QString item = getToken(cond, ';'); + if (item == "x:data"){ + bXData = true; + start_element("x"); + add_attribute("xmlns", "jabber:x:data"); + add_attribute("type", "submit"); + } + QString key = getToken(item, '='); + if (bXData){ + start_element("field"); + add_attribute("var", key); + text_tag("value", item); + end_element(); + }else{ + text_tag(key, item); + } + } +} + +const char *JabberClient::ServerRequest::_GET = "get"; +const char *JabberClient::ServerRequest::_SET = "set"; +const char *JabberClient::ServerRequest::_RESULT = "result"; + +void JabberClient::startHandshake() +{ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "\n" + << "\n"; + sendPacket(); +} + +void JabberClient::handshake(const QString &id) +{ + if (id.isEmpty()){ + socket()->error_state("Bad session ID"); + return; + } + m_id = id; + if (getRegister()){ + auth_register(); + }else{ + if (getUsePlain()){ + auth_plain(); + }else{ + auth_digest(); + } + } +} + +void JabberClient::auth_ok() +{ + if (getRegister()){ + setRegister(false); + setClientStatus(STATUS_OFFLINE); + TCPClient::setStatus(getManualStatus(), getCommonStatus()); + return; + } + setState(Connected); + setPreviousPassword(QString::null); + rosters_request(); + if (getInfoUpdated()){ + setClientInfo(&data.owner); + }else{ + info_request(NULL, false); + } + setStatus(m_logonStatus); + QTimer::singleShot(PING_TIMEOUT * 1000, this, SLOT(ping())); +} + +void JabberClient::auth_failed() +{ + m_reconnect = NO_RECONNECT; + socket()->error_state(I18N_NOOP("Login failed"), AuthError); +} + +QString JabberClient::encodeXML(const QString &str) +{ + return quoteString(str, quoteNOBR, false); +} +QString JabberClient::encodeXMLattr(const QString &str) +{ + return quoteString(str, quoteXMLattr, false); +} + +JabberUserData *JabberClient::findContact(const QString &_jid, const QString &name, bool bCreate, Contact *&contact, QString &resource, bool bJoin) +{ + resource = QString::null; + QString jid = _jid; + int n = jid.indexOf('/'); + if (n >= 0){ + resource = jid.mid(n + 1); + jid = jid.left(n); + } + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + JabberUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toJabberUserData(++it)) != NULL){ + if (jid.toUpper() != data->ID.str().toUpper()) + continue; + if (!resource.isEmpty()) + data->Resource.str() = resource; + if (!name.isEmpty()) + data->Name.str() = name; + return data; + } + } + if (!bCreate) + return NULL; + it.reset(); + QString sname; + if (!name.isEmpty()){ + sname = name; + }else{ + sname = jid; + int pos = sname.indexOf('@'); + if (pos > 0) + sname = sname.left(pos); + } + if (bJoin){ + while ((contact = ++it) != NULL){ + if (contact->getName().toLower() == sname.toLower()){ + JabberUserData *data = toJabberUserData((SIM::clientData*) contact->clientData.createData(this)); // FIXME unsafe type conversion + data->ID.str() = jid; + if (!resource.isEmpty()) + data->Resource.str() = resource; + if (!name.isEmpty()) + data->Name.str() = name; + info_request(data, false); + EventContact e(contact, EventContact::eChanged); + e.process(); + m_bJoin = true; + return data; + } + } + } + contact = getContacts()->contact(0, true); + JabberUserData *data = toJabberUserData((SIM::clientData*) contact->clientData.createData(this)); // FIXME unsafe type conversion + data->ID.str() = jid; + if (!resource.isEmpty()) + data->Resource.str() = resource; + if (!name.isEmpty()) + data->Name.str() = name; + contact->setName(sname); + info_request(data, false); + EventContact e(contact, EventContact::eChanged); + e.process(); + return data; +} + +static void addIcon(QSet *s, const QString &icon, const QString &statusIcon) +{ + if (!s || statusIcon == icon) + return; + s->insert(icon); +} + +QString JabberClient::get_icon(JabberUserData *data, unsigned status, bool invisible) +{ + const CommandDef *def = protocol()->statusList(); + for (; !def->text.isNull(); def++){ + if (def->id == status) + break; + } + if ((def == NULL) || (def->text.isNull())) + return "Jabber_offline"; + QString dicon = def->icon; + if (invisible) + dicon = "Jabber_invisible"; + if (getProtocolIcons()){ + QString id = data->ID.str(); + int host = id.indexOf( '@' ); + + QString h; + if (host != -1) + h = id.mid(host + 1); + else + h = id; + + int p = h.indexOf( '.' ); + if (p) + h = h.left( p ); + if (h == "icq"){ + if (invisible){ + dicon = "ICQ_invisible"; + }else{ + switch (status){ + case STATUS_ONLINE: + dicon = "ICQ_online"; + break; + case STATUS_OFFLINE: + dicon = "ICQ_offline"; + break; + case STATUS_AWAY: + dicon = "ICQ_away"; + break; + case STATUS_NA: + dicon = "ICQ_na"; + break; + case STATUS_DND: + dicon = "ICQ_dnd"; + break; + case STATUS_OCCUPIED: + dicon = "ICQ_occupied"; + break; + case STATUS_FFC: + dicon = "ICQ_ffc"; + break; + } + } + }else if (h == "aim"){ + switch (status){ + case STATUS_ONLINE: + dicon = "AIM_online"; + break; + case STATUS_OFFLINE: + dicon = "AIM_offline"; + break; + case STATUS_AWAY: + dicon = "AIM_away"; + break; + } + }else if (h == "msn"){ + if (invisible){ + dicon = "MSN_invisible"; + }else{ + switch (status){ + case STATUS_ONLINE: + dicon = "MSN_online"; + break; + case STATUS_OFFLINE: + dicon = "MSN_offline"; + break; + case STATUS_AWAY: + dicon = "MSN_away"; + break; + case STATUS_NA: + dicon = "MSN_na"; + break; + case STATUS_DND: + dicon = "MSN_dnd"; + break; + case STATUS_OCCUPIED: + dicon = "MSN_occupied"; + break; + } + } + }else if (h == "yahoo"){ + switch (status){ + case STATUS_ONLINE: + dicon = "Yahoo!_online"; + break; + case STATUS_OFFLINE: + dicon = "Yahoo!_offline"; + break; + case STATUS_AWAY: + dicon = "Yahoo!_away"; + break; + case STATUS_NA: + dicon = "Yahoo!_na"; + break; + case STATUS_DND: + dicon = "Yahoo!_dnd"; + break; + case STATUS_OCCUPIED: + dicon = "Yahoo!_occupied"; + break; + case STATUS_FFC: + dicon = "Yahoo!_ffc"; + break; + } + }else if (h == "sms"){ + switch (status){ + case STATUS_ONLINE: + dicon = "sms_online"; + break; + case STATUS_OFFLINE: + dicon = "sms_offline"; + break; + case STATUS_AWAY: + dicon = "sms_away"; + break; + case STATUS_NA: + dicon = "sms_na"; + break; + case STATUS_DND: + dicon = "sms_dnd"; + break; + case STATUS_OCCUPIED: + dicon = "sms_occupied"; + break; + case STATUS_FFC: + dicon = "sms_ffc"; + break; + } + }else if ((h == "x-gadugadu") || (h == "gg")){ + switch (status){ + case STATUS_ONLINE: + dicon = "GG_online"; + break; + case STATUS_OFFLINE: + dicon = "GG_offline"; + break; + case STATUS_AWAY: + dicon = "GG_away"; + break; + case STATUS_NA: + dicon = "GG_na"; + break; + case STATUS_DND: + dicon = "GG_dnd"; + break; + case STATUS_OCCUPIED: + dicon = "GG_occupied"; + break; + case STATUS_FFC: + dicon = "GG_ffc"; + break; + } + } + } + return dicon; +} + +void JabberClient::contactInfo(void *_data, unsigned long &curStatus, unsigned &style, QString &statusIcon, QSet *icons) +{ + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString dicon = get_icon(data, data->Status.toULong(), data->invisible.toBool()); + if (data->Status.toULong() > curStatus) + { + curStatus = data->Status.toULong(); + if(!statusIcon.isEmpty() && icons) + { + icons->insert(statusIcon); + } + statusIcon = dicon; + } + else + { + if (!statusIcon.isEmpty()) + { + addIcon(icons, dicon, statusIcon); + } + else + { + statusIcon = dicon; + } + } + for (unsigned i = 1; i <= data->nResources.toULong(); i++){ + QString dicon = get_icon(data, get_str(data->ResourceStatus, i).toUInt(), false); + addIcon(icons, dicon, statusIcon); + } + if (((data->Subscribe.toULong() & SUBSCRIBE_TO) == 0) && !isAgent(data->ID.str())) + style |= CONTACT_UNDERLINE; + if (icons && data->IsTyping.toBool()) + addIcon(icons, "typing", statusIcon); +} + +QString JabberClient::buildId(JabberUserData *data) +{ + return data->ID.str(); +} + +QWidget *JabberClient::searchWindow(QWidget *parent) +{ + if (getState() != Connected) + return NULL; + return new JabberAdd(this, parent); +} + +void JabberClient::ping() +{ + if (getState() != Connected) + return; + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() << "\n"; + sendPacket(); + QTimer::singleShot(PING_TIMEOUT * 1000, this, SLOT(ping())); +} + +QString JabberClient::contactName(void *clientData) +{ + QString res = Client::contactName(clientData); + res += ": "; + JabberUserData *data = toJabberUserData((SIM::clientData*)clientData); // FIXME unsafe type conversion + QString name = data->ID.str(); + if (!data->Nick.str().isEmpty()){ + res += data->Nick.str(); + res += " ("; + res += name; + res += ')'; + }else{ + res += name; + } + return res; +} + + +QString JabberClient::contactTip(void *_data) +{ + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString res; + if (data->nResources.toULong() == 0){ + res = "invisible.toBool()); + res += "\">"; + res += i18n("Offline"); + res += "
    "; + res += "ID: "; + res += data->ID.str(); + if (!data->Resource.str().isEmpty()){ + res += '/'; + res += data->Resource.str(); + } + res += ""; + + if (data->StatusTime.toULong()){ + res += "
    "; + res += i18n("Last online"); + res += ": "; + res += formatDateTime(data->StatusTime.toULong()); + } + QString &reply = data->AutoReply.str(); + if (!reply.isEmpty()){ + res += "
    "; + res += reply.replace('\n', "
    "); + } + }else{ + for (unsigned i = 1; i <= data->nResources.toULong(); i++){ + unsigned status = get_str(data->ResourceStatus, i).toUInt(); + res += ""; + QString statusText; + for (const CommandDef *cmd = protocol()->statusList(); !cmd->text.isEmpty(); cmd++){ + if (cmd->id == status){ + statusText = i18n(cmd->text); + res += statusText; + break; + } + } + res += "
    ID: "; + res += data->ID.str(); + QString resource = get_str(data->Resources, i); + if (!resource.isEmpty()){ + res += '/'; + res += resource; + } + res += ""; + + unsigned onlineTime = get_str(data->ResourceOnlineTime, i).toUInt(); + unsigned statusTime = get_str(data->ResourceStatusTime, i).toUInt(); + if (onlineTime){ + res += "
    "; + res += i18n("Online"); + res += ": "; + res += formatDateTime(onlineTime); + } + if (statusTime != onlineTime){ + res += "
    "; + res += statusText; + res += ": "; + res += formatDateTime(statusTime); + } + + QString clientName = get_str(data->ResourceClientName, i); + QString clientVersion = get_str(data->ResourceClientVersion, i); + QString clientOS = get_str(data->ResourceClientOS, i); + if (!clientName.isEmpty()) { + res += "
    " + clientName + ' ' + clientVersion; + if (!clientOS.isEmpty()) + res += " / " + clientOS; + } + + const QString &reply = get_str(data->ResourceReply, i); + if (!reply.isEmpty()){ + res += "

    "; + QString r = reply; + r = r.replace('\n', "
    "); + res += r; + } + if (i < data->nResources.toULong()) + res += "
    _________
    "; + } + } + + if (data->LogoWidth.toLong() && data->LogoHeight.toLong()){ + QString logoFileName = logoFile(data); + QImage img(logoFileName); + if (!img.isNull()){ + QPixmap pict = QPixmap::fromImage(img); + int w = pict.width(); + int h = pict.height(); + if (h > w){ + if (h > 60){ + w = w * 60 / h; + h = 60; + } + }else{ + if (w > 60){ + h = h * 60 / w; + w = 60; + } + } + res += "
    "; + } + } + if (data->PhotoWidth.toLong() && data->PhotoHeight.toLong()){ + QString photoFileName = photoFile(data); + QImage img(photoFileName); + if (!img.isNull()){ + QPixmap pict = QPixmap::fromImage(img); + int w = pict.width(); + int h = pict.height(); + if (h > w){ + if (h > 60){ + w = w * 60 / h; + h = 60; + } + }else{ + if (w > 60){ + h = h * 60 / w; + w = 60; + } + } + res += "
    "; + } + } + return res; +} + +void JabberClient::setOffline(JabberUserData *data) +{ + data->Status.asULong() = STATUS_OFFLINE; + data->composeId.asULong() = 0; + data->Resources.clear(); + data->ResourceReply.clear(); + data->ResourceStatus.clear(); + data->ResourceStatusTime.clear(); + data->ResourceOnlineTime.clear(); + data->nResources.asULong() = 0; + data->TypingId.str() = QString::null; + if (data->IsTyping.toBool()){ + data->IsTyping.asBool() = false; + Contact *contact; + QString resource; + if (findContact(data->ID.str(), QString::null, false, contact, resource)){ + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + } +} + +const unsigned MAIN_INFO = 1; +const unsigned HOME_INFO = 2; +const unsigned WORK_INFO = 3; +const unsigned ABOUT_INFO = 4; +const unsigned PHOTO_INFO = 5; +const unsigned LOGO_INFO = 6; +const unsigned NETWORK = 7; + +static CommandDef jabberWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "Jabber_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + HOME_INFO, + I18N_NOOP("Home info"), + "home", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + WORK_INFO, + I18N_NOOP("Work info"), + "work", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + ABOUT_INFO, + I18N_NOOP("About info"), + "info", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + PHOTO_INFO, + I18N_NOOP("Photo"), + "pict", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + LOGO_INFO, + I18N_NOOP("Logo"), + "pict", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +static CommandDef cfgJabberWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "Jabber_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + HOME_INFO, + I18N_NOOP("Home info"), + "home", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + WORK_INFO, + I18N_NOOP("Work info"), + "work", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + ABOUT_INFO, + I18N_NOOP("About info"), + "info", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + PHOTO_INFO, + I18N_NOOP("Photo"), + "pict", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + LOGO_INFO, + I18N_NOOP("Logo"), + "pict", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + NETWORK, + I18N_NOOP("Network"), + "network", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +CommandDef *JabberClient::infoWindows(Contact*, void *_data) +{ + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString name = i18n(protocol()->description()->text); + name += ' '; + name += data->ID.str(); + jabberWnd[0].text_wrk = name; + return jabberWnd; +} + +CommandDef *JabberClient::configWindows() +{ + QString title = name(); + int n = title.indexOf('.'); + if (n > 0) + title = title.left(n) + ' ' + title.mid(n + 1); + cfgJabberWnd[0].text_wrk = title; + return cfgJabberWnd; +} + +QWidget *JabberClient::infoWindow(QWidget *parent, Contact*, void *_data, unsigned id) +{ + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + switch (id){ + case MAIN_INFO: + return new JabberInfo(parent, data, this); + case HOME_INFO: + return new InfoProxy(parent, new JabberHomeInfo(parent, data, this), i18n("Home info")); + case WORK_INFO: + return new InfoProxy(parent, new JabberWorkInfo(parent, data, this), i18n("Work info")); + case ABOUT_INFO: + return new InfoProxy(parent, new JabberAboutInfo(parent, data, this), i18n("About info")); + case PHOTO_INFO: + return new JabberPicture(parent, data, this, true); + case LOGO_INFO: + return new JabberPicture(parent, data, this, false); + } + return NULL; +} + +QWidget *JabberClient::configWindow(QWidget *parent, unsigned id) +{ + switch (id){ + case MAIN_INFO: + return new JabberInfo(parent, NULL, this); + case HOME_INFO: + return new InfoProxy(parent, new JabberHomeInfo(parent, NULL, this), i18n("Home info")); + case WORK_INFO: + return new InfoProxy(parent, new JabberWorkInfo(parent, NULL, this), i18n("Work info")); + case ABOUT_INFO: + return new InfoProxy(parent, new JabberAboutInfo(parent, NULL, this), i18n("About info")); + case PHOTO_INFO: + return new JabberPicture(parent, NULL, this, true); + case LOGO_INFO: + return new JabberPicture(parent, NULL, this, false); + case NETWORK: + return new JabberConfig(parent, this, true); + } + return NULL; +} + +void JabberClient::updateInfo(Contact *contact, void *data) +{ + if (getState() != Connected){ + Client::updateInfo(contact, data); + return; + } + if (data == NULL) + data = &this->data.owner; + info_request(toJabberUserData((SIM::clientData*)data), false); // FIXME unsafe type conversion +} + +QString JabberClient::resources(void *_data) +{ + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString resource; + if (data->nResources.toULong() > 1){ + for (unsigned i = 1; i <= data->nResources.toULong(); i++){ + if (!resource.isEmpty()) + resource += ';'; + QString dicon = get_icon(data, get_str(data->ResourceStatus, i).toUInt(), false); + resource += dicon; //QString::number(dicon); + resource += ','; + resource += quoteChars(get_str(data->Resources, i), ";"); + } + } + return resource; +} + +bool JabberClient::canSend(unsigned type, void *_data) +{ + if ((_data == NULL) || (((clientData*)_data)->Sign.toULong() != JABBER_SIGN)) + return false; + if (getState() != Connected) + return false; + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + switch (type) + { + case MessageGeneric: + case MessageFile: + case MessageContacts: + case MessageUrl: + return true; + case MessageAuthRequest: + return ((data->Subscribe.toULong() & SUBSCRIBE_TO) == 0); + case MessageAuthGranted: + return ((data->Subscribe.toULong() & SUBSCRIBE_FROM) == 0); + case MessageAuthRefused: + return (data->Subscribe.toULong() & SUBSCRIBE_FROM); + case MessageJabberOnline: + return isAgent(data->ID.str()) && (data->Status.toULong() == STATUS_OFFLINE); + case MessageJabberOffline: + return isAgent(data->ID.str()) && (data->Status.toULong() != STATUS_OFFLINE); + } + return false; +} + +class JabberImageParser : public HTMLParser +{ +public: + JabberImageParser(unsigned bgColor); + QString parse(const QString &text); +protected: + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &attrs); + virtual void tag_end(const QString &tag); + void startBody(const list &attrs); + void endBody(); + QString res; + bool m_bPara; + bool m_bBody; + unsigned m_bgColor; +}; + +JabberImageParser::JabberImageParser(unsigned bgColor) +{ + m_bPara = false; + m_bBody = true; + m_bgColor = bgColor; +} + +QString JabberImageParser::parse(const QString &text) +{ + list attrs; + startBody(attrs); + HTMLParser::parse(text); + endBody(); + return res; +} + +void JabberImageParser::text(const QString &text) +{ + if (m_bBody) + res += quoteString(text); +} + +static const char *_tags[] = + { + "abbr", + "acronym", + "address", + "blockquote", + "cite", + "code", + "dfn", + "div", + "em", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "kbd", + "p", + "pre", + "q", + "samp", + "span", + "strong", + "var", + "a", + "dl", + "dt", + "dd", + "ol", + "ul", + "li", + NULL + }; + +static const char *_styles[] = + { + "color", + "background-color", + "font-family", + "font-size", + "font-style", + "font-weight", + "text-align", + "text-decoration", + NULL + }; + +void JabberImageParser::startBody(const list &attrs) +{ + m_bBody = true; + res = QString::null; + list newStyles; + list::const_iterator it; + for (it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + if (name == "style"){ + list styles = parseStyle(value); + for (list::iterator it = styles.begin(); it != styles.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + for (const char **s = _styles; *s; s++){ + if (name == *s){ + newStyles.push_back(name); + newStyles.push_back(value); + break; + } + } + } + } + } + for (it = newStyles.begin(); it != newStyles.end(); ++it){ + QString name = *it; + ++it; + if (name == "background-color") + break; + } + if (it == newStyles.end()){ + char b[15]; + sprintf(b, "#%06X", m_bgColor & 0xFFFFFF); + newStyles.push_back("background-color"); + newStyles.push_back(b); + } + res += ""; +} + +void JabberImageParser::endBody() +{ + if (m_bBody){ + res += ""; + m_bBody = false; + } +} + +void JabberImageParser::tag_start(const QString &tag, const list &attrs) +{ + if (tag == "html"){ + m_bBody = false; + res = QString::null; + return; + } + if (tag == "body"){ + startBody(attrs); + return; + } + if (!m_bBody) + return; + if (tag == "img"){ + QString src; + QString alt; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + if (name == "src") + src = value; + if (name == "alt") + alt = value; + } + if (!alt.isEmpty()){ + res += unquoteString(alt); + return; + } + if (src.left(10) == "sim:icons/"){ + QStringList smiles = getIcons()->getSmile(src.mid(10)); + if (!smiles.empty()){ + res += smiles.front(); + return; + } + } + text(alt); + return; + } + if (tag == "p"){ + if (m_bPara){ + res += "
    "; + m_bPara = false; + } + return; + } + if (tag == "br"){ + res += "
    "; + return; + } + for (const char **t = _tags; *t; t++){ + if (tag == *t){ + res += '<'; + res += tag; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + if (name == "style"){ + list styles = parseStyle(value); + list newStyles; + for (list::iterator it = styles.begin(); it != styles.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + for (const char **s = _styles; *s; s++){ + if (name == *s){ + newStyles.push_back(name); + newStyles.push_back(value); + break; + } + } + } + value = makeStyle(newStyles); + } + if ((name != "style") && (name != "href")) + continue; + res += ' '; + res += name; + if (!value.isEmpty()){ + res += "=\'"; + res += quoteString(value); + res += "\'"; + } + } + res += '>'; + return; + } + } + if (tag == "b"){ + res += ""; + return; + } + if (tag == "i"){ + res += ""; + return; + } + if (tag == "u"){ + res += ""; + return; + } + if (tag == "font"){ + res += "::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + if (name == "color"){ + if (!style.isEmpty()) + style += ';'; + style += "color: "; + style += value; + continue; + } + } + if (!style.isEmpty()){ + res += " style=\'"; + res += style; + res += "\'"; + } + res += '>'; + return; + } + return; +} + +void JabberImageParser::tag_end(const QString &tag) +{ + if (tag == "body"){ + endBody(); + return; + } + if (!m_bBody) + return; + if (tag == "p"){ + m_bPara = true; + return; + } + for (const char **t = _tags; *t; t++){ + if (tag == *t){ + res += "'; + return; + } + } + if ((tag == "b") || (tag == "i") || (tag == "u") || (tag == "font")){ + res += ""; + return; + } +} + +static QString removeImages(const QString &text, unsigned bgColor) +{ + JabberImageParser p(bgColor); + return p.parse(text); +} + +bool JabberClient::send(Message *msg, void *_data) +{ + if ((getState() != Connected) || (_data == NULL)) + return false; + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + switch (msg->type()){ + case MessageAuthRefused:{ + QString grp; + Group *group = NULL; + Contact *contact = getContacts()->contact(msg->contact()); + if (contact && contact->getGroup()) + group = getContacts()->group(contact->getGroup()); + if (group) + grp = group->getName(); + listRequest(data, data->Name.str(), grp, false); + if (data->Subscribe.toULong() & SUBSCRIBE_FROM){ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str() + << "\' type=\'unsubscribed\'>\n" + << encodeXML(msg->getPlainText()) + << "\n"; + sendPacket(); + if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + msg->setClient(dataName(data)); + EventSent(msg).process(); + } + EventMessageSent(msg).process(); + delete msg; + return true; + } + } + case MessageGeneric:{ + Contact *contact = getContacts()->contact(msg->contact()); + if ((contact == NULL) || (data == NULL)) + return false; + QString text = msg->getPlainText(); + EventSend e(msg, text.toUtf8()); + e.process(); + text = QString::fromUtf8( e.localeText() ); + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str(); + if(!msg->getResource().isEmpty()) + { + socket()->writeBuffer() << QString("/") << encodeXMLattr(msg->getResource()); + } + if (getTyping()){ + data->composeId.asULong() = ++m_msg_id; + QString msg_id = "msg"; + msg_id += QString::number(data->composeId.asULong()); + socket()->writeBuffer() + << "\' id=\'" << msg_id; + } + if (text.startsWith("-----BEGIN PGP MESSAGE-----")){ + socket()->writeBuffer() + << "\'>\nThis message is encrypted.\n"; + }else{ + socket()->writeBuffer() + << "\'>\n" << encodeXML(text) << "\n"; + if (data->richText.toBool() && getRichText() && (msg->getFlags() & MESSAGE_RICHTEXT)){ + socket()->writeBuffer() + << "\n" + << removeImages(msg->getRichText(), msg->getBackground()) + << "\n\n"; + } + } + if (getTyping()){ + socket()->writeBuffer() + << "\n" + << "\n" + << "\n"; + } + if (text.startsWith("-----BEGIN PGP MESSAGE-----")){ + text.truncate(text.indexOf("\n-----END PGP MESSAGE-----")); + socket()->writeBuffer() + << "" + << text.remove(0, text.indexOf("\n\n") + 2) + << "\n"; + } + socket()->writeBuffer() + << ""; + sendPacket(); + if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + if (data->richText.toBool()){ + msg->setClient(dataName(data)); + EventSent(msg).process(); + }else{ + Message m(MessageGeneric); + m.setContact(msg->contact()); + m.setClient(dataName(data)); + m.setText(msg->getPlainText()); + EventSent(msg).process(); + } + } + EventMessageSent(msg).process(); + delete msg; + return true; + } + case MessageUrl:{ + Contact *contact = getContacts()->contact(msg->contact()); + if ((contact == NULL) || (data == NULL)) + return false; + UrlMessage *m = static_cast(msg); + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str(); + if (!msg->getResource().isEmpty()){ + socket()->writeBuffer() + << QString("/") << encodeXMLattr(msg->getResource()); + } + socket()->writeBuffer() + << "\'>\n" << encodeXML(m->getUrl()); + QString t = m->getPlainText(); + if (!t.isEmpty()){ + socket()->writeBuffer() + << "\n" << encodeXML(m->getPlainText()); + } + socket()->writeBuffer() + << "\n"; + if (data->richText.toBool() && getRichText()){ + socket()->writeBuffer() + << "\n" + << "getUrl()) << "\'>" + << encodeXML(m->getUrl()) << ""; + if (!t.isEmpty()){ + socket()->writeBuffer() + << "
    \n" + << removeImages(msg->getRichText(), msg->getBackground()); + } + socket()->writeBuffer() + << "\n\n"; + } + socket()->writeBuffer() + << "
    "; + sendPacket(); + if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + if (data->richText.toBool()){ + msg->setClient(dataName(data)); + EventSent(msg).process(); + }else{ + Message m(MessageGeneric); + m.setContact(msg->contact()); + m.setClient(dataName(data)); + m.setText(msg->getPlainText()); + EventSent(msg).process(); + } + } + EventMessageSent(msg).process(); + delete msg; + return true; + } + case MessageContacts:{ + Contact *contact = getContacts()->contact(msg->contact()); + if ((contact == NULL) || (data == NULL)) + return false; + ContactsMessage *m = static_cast(msg); + QStringList jids; + QStringList names; + QString contacts = m->getContacts(); + QString nc; + while (!contacts.isEmpty()){ + QString item = getToken(contacts, ';'); + QString url = getToken(item, ','); + QString proto = getToken(url, ':'); + if (proto == "sim"){ + Contact *contact = getContacts()->contact(url.toLong()); + if (contact){ + clientData *data; + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL){ + Contact *c = contact; + if (!isMyData(data, c)) + continue; + JabberUserData *d = toJabberUserData(data); + jids.append(d->ID.str()); + names.append(c->getName()); + if (!nc.isEmpty()) + nc += ';'; + nc += "jabber:"; + nc += d->ID.str(); + nc += ','; + if (c->getName() == d->ID.str()){ + nc += d->ID.str(); + }else{ + nc += c->getName(); + nc += " ("; + nc += d->ID.str(); + nc += ')'; + } + } + } + } + } + if (jids.isEmpty()){ + msg->setError(I18N_NOOP("No contacts for send")); + EventMessageSent(msg).process(); + delete msg; + return true; + } + m->setContacts(nc); + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str(); + if (!msg->getResource().isEmpty()){ + socket()->writeBuffer() + << QString("/") << encodeXMLattr(msg->getResource()); + } + socket()->writeBuffer() + << "\'>\n\n"; + QStringList::ConstIterator iti = jids.constBegin(); + QStringList::ConstIterator itn = names.constBegin(); + for (; iti != jids.constEnd(); ++iti, ++itn){ + socket()->writeBuffer() + << "\n\n\n"; + } + socket()->writeBuffer() + << "\n"; + iti = jids.constBegin(); + for (; iti != jids.constEnd(); ++iti, ++itn){ + socket()->writeBuffer() + << encodeXML(*iti) + << "\n"; + } + socket()->writeBuffer() + << "\n"; + if (data->richText.toBool() && getRichText()){ + socket()->writeBuffer() + << "\n"; + iti = jids.constBegin(); + for (; iti != jids.constEnd(); ++iti, ++itn){ + socket()->writeBuffer() + << encodeXML(*iti) + << "
    \n"; + } + socket()->writeBuffer() + << "\n\n"; + } + socket()->writeBuffer() + << "
    "; + sendPacket(); + if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + if (data->richText.toBool()){ + msg->setClient(dataName(data)); + EventSent(msg).process(); + }else{ + Message m(MessageGeneric); + m.setContact(msg->contact()); + m.setClient(dataName(data)); + m.setText(msg->getPlainText()); + EventSent(&m).process(); + } + } + EventMessageSent(msg).process(); + delete msg; + return true; + } + case MessageFile:{ + m_waitMsg.push_back(msg); + JabberFileTransfer *ft = static_cast(static_cast(msg)->m_transfer); + if (ft == NULL) + ft = new JabberFileTransfer(static_cast(msg), data, this); + ft->listen(); + return true; + } + case MessageAuthRequest:{ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str() + << "\' type=\'subscribe\'>\n" + << encodeXML(msg->getPlainText()) + << "\n"; + sendPacket(); + if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + msg->setClient(dataName(data)); + EventSent(msg).process(); + } + EventMessageSent(msg).process(); + delete msg; + return true; + } + case MessageAuthGranted:{ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str() + << "\' type=\'subscribed\'>"; + sendPacket(); + if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + msg->setClient(dataName(data)); + EventSent(msg).process(); + } + EventMessageSent(msg).process(); + delete msg; + return true; + } + case MessageJabberOnline: + if (isAgent(data->ID.str()) && (data->Status.toULong() == STATUS_OFFLINE)){ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str() + << "\'>"; + sendPacket(); + delete msg; + return true; + } + break; + case MessageJabberOffline: + if (isAgent(data->ID.str()) && (data->Status.toULong() != STATUS_OFFLINE)){ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str() + << "\' type=\'unavailable\'>"; + sendPacket(); + delete msg; + return true; + } + break; + case MessageTypingStart: + if (getTyping()){ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str() + << "\'>\n\n\n" + << data->TypingId.str() + << "\n\n"; + sendPacket(); + delete msg; + return true; + } + break; + case MessageTypingStop: + if (getTyping()){ + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str() + << "\'>\n\n" + << data->TypingId.str() + << "\n\n"; + sendPacket(); + delete msg; + return true; + } + break; + } + return false; +} + +QString JabberClient::dataName(void *_data) +{ + QString res = name(); + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + res += '+'; + res += data->ID.str(); + res = res.replace('/', '_'); + return res; +} + +void JabberClient::listRequest(JabberUserData *data, const QString &name, const QString &grp, bool bDelete) +{ + QString jid = data->ID.str(); + list::iterator it; + for (it = m_listRequests.begin(); it != m_listRequests.end(); ++it){ + if (jid == it->jid){ + m_listRequests.erase(it); + break; + } + } + JabberListRequest lr; + lr.jid = jid; + lr.name = name; + lr.grp = grp; + lr.bDelete = bDelete; + m_listRequests.push_back(lr); + processList(); +} + +JabberListRequest *JabberClient::findRequest(const QString &jid, bool bRemove) +{ + list::iterator it; + for (it = m_listRequests.begin(); it != m_listRequests.end(); ++it){ + if (it->jid == jid){ + if (bRemove){ + m_listRequests.erase(it); + return NULL; + } + return &(*it); + } + } + return NULL; +} + + +bool JabberClient::isAgent(const QString &jid) +{ + if (jid.indexOf('@')==-1) + return true; + return false; +} + +class JabberClient::JabberAuthMessage : public AuthMessage +{ +public: + JabberAuthMessage(std::vector &tempMessages, unsigned type, Buffer *cfg=NULL) + : AuthMessage(type, cfg) + , tempMessages(tempMessages) + { + tempMessages.push_back(this); + } + virtual ~JabberAuthMessage() + { + remove(tempMessages, this); + } + + static bool remove(std::vector&messages, JabberAuthMessage *value) + { + std::vector::iterator it = find(messages.begin(), messages.end(), value); + if (it != messages.end()) + { + messages.erase(it); + return true; + } + return false; + } + JabberAuthMessage & operator=( const JabberAuthMessage & ) { return *this; } + +private: + std::vector &tempMessages; +}; + +void JabberClient::auth_request(const QString &jid, unsigned type, const QString &text, bool bCreate) +{ + Contact *contact; + QString resource; + JabberUserData *data = findContact(jid, QString::null, false, contact, resource); + if (isAgent(jid) || ((type == MessageAuthRequest) && getAutoAccept())){ + switch (type){ + case MessageAuthRequest:{ + if (data == NULL) + data = findContact(jid, QString::null, true, contact, resource); + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str() + << "\' type=\'subscribed\'>"; + sendPacket(); + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() + << "ID.str() + << "\' type=\'subscribe\'>\n" + << "\n"; + sendPacket(); + EventContact e(contact, EventContact::eChanged); + e.process(); + return; + } + case MessageAuthGranted:{ + if (data == NULL) + data = findContact(jid, QString::null, true, contact, resource); + data->Subscribe.asULong() |= SUBSCRIBE_TO; + EventContact e(contact, EventContact::eChanged); + e.process(); + return; + } + + } + } + if ((data == NULL) && bCreate){ + data = findContact(jid, QString::null, true, contact, resource); + contact->setFlags(CONTACT_TEMP); + } + if (data == NULL) + return; + if (((type == MessageAuthGranted) || (type ==MessageAuthRefused)) && + (contact->getFlags() & CONTACT_TEMP)){ + contact->setFlags(contact->getFlags() & ~CONTACT_TEMP); + EventContact e(contact, EventContact::eChanged); + e.process(); + return; + } + JabberAuthMessage *msg = new JabberAuthMessage(tempAuthMessages, type); + msg->setContact(contact->id()); + msg->setClient(dataName(data)); + msg->setFlags(MESSAGE_RECEIVED); + if(!text.isEmpty()) + msg->setText(unquoteString(text)); + EventMessageReceived e(msg); + e.process(); + if (JabberAuthMessage::remove(tempAuthMessages, msg)) + { + delete msg; + } + if (type == MessageAuthGranted) { + data->Subscribe.asULong() |= SUBSCRIBE_TO; + EventContact e(contact, EventContact::eChanged); + e.process(); + } else + if (type == MessageAuthRefused) { + data->Subscribe.asULong() &= ~SUBSCRIBE_TO; + EventContact e(contact, EventContact::eChanged); + e.process(); + } +} + +void JabberClient::setInvisible(bool bState) +{ + if (getInvisible() == bState) + return; + TCPClient::setInvisible(bState); + if (getStatus() == STATUS_OFFLINE) + return; + unsigned status = getStatus(); + m_status = STATUS_OFFLINE; + if (getInvisible()){ + setStatus(status, NULL); + return; + } + setStatus(status); +} + +QString JabberClient::VHost() +{ + if (data.UseVHost.toBool() && !data.VHost.str().isEmpty()) + return data.VHost.str(); + return data.Server.str(); +} + +static char PICT_PATH[] = "pictures/"; + +QString JabberClient::photoFile(JabberUserData *data) +{ + QString f = PICT_PATH; + f += "photo."; + f += data->ID.str(); + f = user_file(f); + return f; +} + +QString JabberClient::logoFile(JabberUserData *data) +{ + QString f = PICT_PATH; + f += "logo."; + f += data->ID.str(); + f = user_file(f); + return f; +} + +void JabberClient::setupContact(Contact *contact, void *_data) +{ + JabberUserData *data = toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString mail = data->EMail.str(); + contact->setEMails(mail, name()); + QString phones; + if (!data->Phone.str().isEmpty()){ + phones = data->Phone.str(); + phones += ",Home Phone,"; + phones += QString::number(PHONE); + } + contact->setPhones(phones, name()); + + if (contact->getFirstName().isEmpty() && !data->FirstName.str().isEmpty()) + contact->setFirstName(data->FirstName.str(), name()); + + if (contact->getName().isEmpty()) + contact->setName(data->ID.str()); +} + +QImage JabberClient::userPicture(JabberUserData *d) +{ + JabberUserData *_d = d ? d : &data.owner; + QImage img; + + if (_d->PhotoWidth.toLong() && _d->PhotoHeight.toLong()) { + img = QImage(photoFile(_d)); + } else if (_d->LogoWidth.toLong() && _d->LogoHeight.toLong()) { + img = QImage(logoFile(_d)); + } + if(img.isNull()) + return img; + + int w = img.width(); + int h = img.height(); + if (h > w){ + if (h > 60){ + w = w * 60 / h; + h = 60; + } + }else{ + if (w > 60){ + h = h * 60 / w; + w = 60; + } + } + + return img.scaled(w, h); +} + +QImage JabberClient::userPicture(unsigned id) +{ + if (id==0) + return QImage(); + Contact *contact = getContacts()->contact(id); + if(!contact) + return QImage(); + ClientDataIterator it(contact->clientData, this); + + JabberUserData *d; + while ((d = toJabberUserData(++it)) != NULL){ + QImage img = userPicture(d); + if(!img.isNull()) + return img; + } + return QImage(); +} + +JabberUserData* JabberClient::toJabberUserData(SIM::clientData * data) +{ + // This function is used to more safely preform type conversion from SIM::clientData* into JabberUserData* + // It will at least warn if the content of the structure is not JabberUserData + // Brave wariors may uncomment abort() function call to know for sure about wrong conversion ;-) + if (! data) return NULL; + if (data->Sign.asULong() != JABBER_SIGN) + { + QString Signs[] = { + "Unknown(0)" , // 0x0000 + "ICQ_SIGN", // 0x0001 + "JABBER_SIGN", // 0x0002 + "MSN_SIGN", // 0x0003 + "Unknown(4)" // 0x0004 + "LIVEJOURNAL_SIGN",// 0x0005 + "SMS_SIGN", // 0x0006 + "Unknown(7)", // 0x0007 + "Unknown(8)", // 0x0008 + "YAHOO_SIGN" // 0x0009 + }; + QString Sign; + if (data->Sign.toULong()<=9) // is always >=0 as it is unsigned int + Sign = Signs[data->Sign.toULong()]; + else + Sign = QString("Unknown(%1)").arg(Sign.toULong()); + + log(L_ERROR, + "ATTENTION!! Unsafly converting %s user data into JABBER_SIGN", + Sign.toLatin1().data()); +// abort(); + } + return (JabberUserData*) data; +} + +// vim: set expandtab: + diff --git a/plugins/jabber/jabberclient.h b/plugins/jabber/jabberclient.h new file mode 100644 index 0000000..668799b --- /dev/null +++ b/plugins/jabber/jabberclient.h @@ -0,0 +1,541 @@ +/*************************************************************************** + jabberclient.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERCLIENT_H +#define _JABBERCLIENT_H + +#include +#include +#include +#include + +#include "simapi.h" +#include "sax.h" +#include "socket/socket.h" +#include "socket/serversocketnotify.h" +#include "socket/tcpclient.h" +#include "jabberstatus.h" + +#include "jabberbuffer.h" + +using namespace std; + +class JabberProtocol; +class JabberClient; + +const unsigned JABBER_SIGN = 0x0002; + +const unsigned SUBSCRIBE_NONE = 0; +const unsigned SUBSCRIBE_FROM = 1; +const unsigned SUBSCRIBE_TO = 2; +const unsigned SUBSCRIBE_BOTH = (SUBSCRIBE_FROM | SUBSCRIBE_TO); + +struct JabberUserData : public SIM::clientData +{ + SIM::Data ID; + SIM::Data Node; + SIM::Data Resource; + SIM::Data Name; + SIM::Data Status; + SIM::Data FirstName; + SIM::Data Nick; + SIM::Data Desc; + SIM::Data Bday; + SIM::Data Url; + SIM::Data OrgName; + SIM::Data OrgUnit; + SIM::Data Title; + SIM::Data Role; + SIM::Data Street; + SIM::Data ExtAddr; + SIM::Data City; + SIM::Data Region; + SIM::Data PCode; + SIM::Data Country; + SIM::Data EMail; + SIM::Data Phone; + SIM::Data StatusTime; + SIM::Data OnlineTime; + SIM::Data Subscribe; + SIM::Data Group; + SIM::Data bChecked; + SIM::Data TypingId; + SIM::Data SendTypingEvents; + SIM::Data IsTyping; + SIM::Data composeId; + SIM::Data richText; + SIM::Data invisible; + SIM::Data PhotoWidth; + SIM::Data PhotoHeight; + SIM::Data LogoWidth; + SIM::Data LogoHeight; + SIM::Data nResources; + SIM::Data Resources; + SIM::Data ResourceStatus; + SIM::Data ResourceReply; + SIM::Data ResourceStatusTime; + SIM::Data ResourceOnlineTime; + SIM::Data AutoReply; + SIM::Data ResourceClientName; + SIM::Data ResourceClientVersion; + SIM::Data ResourceClientOS; +}; + +struct JabberClientData +{ + SIM::Data Server; + SIM::Data Port; + SIM::Data UseSSL; + SIM::Data UsePlain; + SIM::Data UseVHost; + SIM::Data Register; + SIM::Data Priority; + SIM::Data ListRequest; + SIM::Data VHost; + SIM::Data Typing; + SIM::Data RichText; + SIM::Data UseVersion; + SIM::Data ProtocolIcons; + SIM::Data MinPort; + SIM::Data MaxPort; + SIM::Data Photo; + SIM::Data Logo; + SIM::Data AutoSubscribe; + SIM::Data AutoAccept; + SIM::Data UseHTTP; + SIM::Data URL; + SIM::Data InfoUpdated; + JabberUserData owner; +}; + +struct JabberAgentsInfo +{ + SIM::Data VHost; + SIM::Data ID; + SIM::Data Name; + SIM::Data Search; + SIM::Data Register; + JabberClient *Client; +}; + +struct JabberAgentInfo +{ + SIM::Data ReqID; + SIM::Data VHost; + SIM::Data ID; + SIM::Data Field; + SIM::Data Type; + SIM::Data Label; + SIM::Data Value; + SIM::Data Desc; + SIM::Data Options; + SIM::Data OptionLabels; + SIM::Data nOptions; + SIM::Data bRequired; +}; + +struct JabberSearchData +{ + SIM::Data ID; + SIM::Data JID; + SIM::Data First; + SIM::Data Last; + SIM::Data Nick; + SIM::Data EMail; + SIM::Data Status; + SIM::Data Fields; + SIM::Data nFields; +}; + +struct JabberListRequest +{ + QString jid; + QString grp; + QString name; + bool bDelete; +}; + +struct DiscoItem +{ + QString id; + QString jid; + QString node; + QString name; + QString type; + QString category; + QString features; +}; + +// XEP-0092 Software Version +struct ClientVersionInfo +{ + QString jid; + QString node; + QString name; + QString version; + QString os; +}; + +// XEP-0012 Last Activity +struct ClientLastInfo +{ + QString jid; + unsigned int seconds; +}; + +// XEP-0090 Entity Time +struct ClientTimeInfo +{ + QString jid; + QString utc; + QString tz; + QString display; +}; + +class JabberClient : public SIM::TCPClient, public SAXParser +{ + Q_OBJECT +public: + class ServerRequest + { + public: + ServerRequest(JabberClient *client, const char *type, const QString &from, const QString &to, const QString &id=QString()); + virtual ~ServerRequest(); + void send(); + void start_element(const QString &name); + void end_element(bool bNewLevel = false); + void add_attribute(const QString &name, const char *value); + void add_attribute(const QString &name, const QString &value); + void add_condition(const QString &cond, bool bXData); + void add_text(const QString &text); + void text_tag(const QString &name, const QString &value); + static const char *_GET; + static const char *_SET; + static const char *_RESULT; + protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString m_element; + QStack m_els; + QString m_id; + JabberClient *m_client; + friend class JabberClient; + }; + + class IqRequest : public ServerRequest + { + public: + IqRequest(JabberClient *client); + ~IqRequest(); + public: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString *m_data; + QString m_url; + QString m_descr; + QString m_query; + QString m_from; + QString m_id; + QString m_type; + QString m_file_name; + unsigned m_file_size; + }; + + class PresenceRequest : public ServerRequest + { + public: + PresenceRequest(JabberClient *client); + ~PresenceRequest(); + protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString m_from; + QString m_data; + QString m_type; + QString m_status; + QString m_show; + QString m_stamp1; + QString m_stamp2; + }; + + class MessageRequest : public ServerRequest + { + public: + MessageRequest(JabberClient *client); + ~MessageRequest(); + protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString m_from; + QString *m_data; + QString m_body; + QString m_richText; + QString m_subj; + QString m_error; + QString m_contacts; + QString m_target; + QString m_desc; + QString m_enc; + vector m_targets; + vector m_descs; + + bool m_bBody; + bool m_bRosters; + bool m_bError; + QString m_id; + bool m_bCompose; + bool m_bEvent; + bool m_bRichText; + bool m_bEnc; + unsigned m_errorCode; + }; + + class StreamErrorRequest : public ServerRequest + { + public: + StreamErrorRequest(JabberClient *client); + ~StreamErrorRequest(); + protected: + virtual void element_start(const QString& el, const QXmlAttributes& attrs); + virtual void element_end(const QString& el); + virtual void char_data(const QString& str); + QString *m_data; + QString m_descr; + }; + + JabberClient(JabberProtocol*, Buffer *cfg); + ~JabberClient(); + virtual QString name(); + virtual QString dataName(void*); + virtual QWidget *setupWnd(); + virtual QByteArray getConfig(); + virtual QImage userPicture(unsigned id); + QImage userPicture(JabberUserData *d); + + void setID(const QString &id); + QString getID() + { + return data.owner.ID.str(); + } + PROP_STR(Server); + PROP_STR(VHost); + PROP_USHORT(Port); + PROP_BOOL(UseSSL); + PROP_BOOL(UsePlain); + PROP_BOOL(UseVHost); + PROP_BOOL(Register); + PROP_ULONG(Priority); + PROP_UTF8(ListRequest); + PROP_BOOL(Typing); + PROP_BOOL(RichText); + PROP_BOOL(UseVersion); + PROP_BOOL(ProtocolIcons); + PROP_USHORT(MinPort); + PROP_USHORT(MaxPort); + PROP_UTF8(Photo); + PROP_UTF8(Logo); + PROP_BOOL(AutoSubscribe); + PROP_BOOL(AutoAccept); + PROP_BOOL(UseHTTP); + PROP_STR(URL); + PROP_BOOL(InfoUpdated); + + QString buildId(JabberUserData *data); + JabberUserData *findContact(const QString &jid, const QString &name, bool bCreate, SIM::Contact *&contact, QString &resource, bool bJoin=true); + bool add_contact(const char *id, unsigned grp); + QString get_agents(const QString &jid); + QString get_agent_info(const QString &jid, const QString &node, const QString &type); + void auth_request(const QString &jid, unsigned type, const QString &text, bool bCreate); + QString search(const QString &jid, const QString &node, const QString &condition); + QString process(const QString &jid, const QString &node, const QString &condition, const QString &type); + + static QString get_attr(const char *name, const char **attrs); + virtual void setupContact(SIM::Contact*, void *data); + virtual void updateInfo(SIM::Contact *contact, void *data); + + JabberClientData data; + + JabberListRequest *findRequest(const QString &jid, bool bRemove); + + QString VHost(); + bool isAgent(const QString &jid); + virtual bool send(SIM::Message*, void*); + void listRequest(JabberUserData *data, const QString &name, const QString &grp, bool bDelete); + void sendFileRequest(SIM::FileMessage *msg, unsigned short port, JabberUserData *data, const QString &url, unsigned size); + void sendFileAccept(SIM::FileMessage *msg, JabberUserData *data); + + list m_ackMsg; + list m_waitMsg; + + QString photoFile(JabberUserData*); + QString logoFile(JabberUserData*); + list m_requests; + + QString discoItems(const QString &jid, const QString &node); + QString discoInfo(const QString &jid, const QString &node); + QString browse(const QString &jid); + QString versionInfo(const QString &jid, const QString &node = QString::null); + QString timeInfo(const QString &jid, const QString &node); + QString lastInfo(const QString &jid, const QString &node); + QString statInfo(const QString &jid, const QString &node); + void addLang(ServerRequest *req); + void info_request(JabberUserData *user_data, bool bVCard); + virtual void setClientInfo(void *data); + void changePassword(const QString &pass); + + // reimplement socket() to get correct Buffer + virtual JabberClientSocket *socket() { return static_cast(TCPClient::socket()); } + virtual JabberClientSocket *createClientSocket() { return new JabberClientSocket(this, createSocket()); } + + virtual void changeStatus(const SIM::IMStatusPtr& status); + + JabberUserData* toJabberUserData(SIM::clientData *); // More safely type conversion from generic SIM::clientData into JabberUserData +protected slots: + void ping(); + void auth_failed(); + void auth_ok(); +protected: + virtual bool processEvent(SIM::Event *e); + SIM::Socket *createSocket(); + + virtual QString contactName(void *clientData); + virtual void setStatus(unsigned status); + void setStatus(unsigned status, const QString &ar); + virtual void disconnected(); + virtual void connect_ready(); + virtual void packet_ready(); + virtual void setInvisible(bool bState); + virtual bool isMyData(SIM::clientData*&, SIM::Contact*&); + virtual bool createData(SIM::clientData*&, SIM::Contact*); + virtual bool compareData(void*, void*); + virtual bool canSend(unsigned, void*); + virtual void contactInfo(void *data, unsigned long &curStatus, unsigned &style, QString &statusIcon, QSet *icons = NULL); + virtual QString resources(void *data); + virtual QString contactTip(void *data); + virtual QWidget *searchWindow(QWidget *parent); + virtual SIM::CommandDef *infoWindows(SIM::Contact *contact, void *data); + virtual QWidget *infoWindow(QWidget *parent, SIM::Contact *contact, void *data, unsigned id); + virtual SIM::CommandDef *configWindows(); + virtual QWidget *configWindow(QWidget *parent, unsigned id); + + void init(); + void sendPacket(); + void startHandshake(); + void connected(); + void handshake(const QString &id); + void rosters_request(); + void setOffline(JabberUserData *data); + + static QString encodeXML(const QString &str); + static QString encodeXMLattr(const QString &str); + QString m_id; + unsigned m_depth; + + QString get_unique_id(); + unsigned m_id_seed; + unsigned m_msg_id; + + bool m_bHTTP; + + void element_start(const QString& el, const QXmlAttributes& attrs); + void element_end(const QString& el); + void char_data(const QString& str); + + list m_listRequests; + ServerRequest *m_curRequest; + + class JabberAuthMessage; + vector tempAuthMessages; + + QString get_icon(JabberUserData *data, unsigned status, bool invisible); + + void processList(); + + void auth_plain(); + void auth_digest(); + void auth_register(); + bool m_bSSL; + bool m_bJoin; + + friend class ServerRequest; + friend class RostersRequest; + friend class PresenceRequest; + friend class JabberBrowser; + +private: +}; + +class JabberFileTransfer : public SIM::FileTransfer, public SIM::ClientSocketNotify, public SIM::ServerSocketNotify +{ +public: + JabberFileTransfer(SIM::FileMessage *msg, JabberUserData *data, JabberClient *client); + ~JabberFileTransfer(); + void listen(); + void connect(); +protected: + JabberClient *m_client; + JabberUserData *m_data; + enum State + { + None, + Listen, + ListenWait, + Header, + Send, + Wait, + Connect, + ReadHeader, + Receive + }; + State m_state; + virtual bool error_state(const QString &err, unsigned code = 0); + virtual void packet_ready(); + virtual void connect_ready(); + virtual void write_ready(); + virtual void startReceive(unsigned pos); + virtual void bind_ready(unsigned short port); + virtual bool error(const QString &err); + virtual bool accept(SIM::Socket *s, unsigned long ip); + bool get_line(const QByteArray &str); + void send_line(const QString &str); + void send_line(const QByteArray &str); + void send_line(const char *str); + unsigned m_startPos; + unsigned m_endPos; + unsigned m_answer; + QString m_url; + JabberClientSocket *m_socket; +}; + +class JabberSearch; + +struct agentRegisterInfo +{ + QString id; + unsigned err_code; + QString error; +}; + +#endif + +// vim: set expandtab: + + diff --git a/plugins/jabber/jabberconfig.cpp b/plugins/jabber/jabberconfig.cpp new file mode 100644 index 0000000..433ea8b --- /dev/null +++ b/plugins/jabber/jabberconfig.cpp @@ -0,0 +1,195 @@ +/*************************************************************************** + jabberconfig.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include +#include +#include +#include +#include +#include + +#include "simgui/linklabel.h" +#include "misc.h" + +#include "jabberclient.h" +#include "jabberconfig.h" +#include "jabber.h" + +using namespace SIM; + +JabberConfig::JabberConfig(QWidget *parent, JabberClient *client, bool bConfig) : QWidget(parent) + //: JabberConfigBase(parent) +{ + setupUi(this); + m_client = client; + m_bConfig = bConfig; + QTimer::singleShot(0, this, SLOT(changed())); + edtID->setText(m_client->getID()); + edtPasswd->setText(m_client->getPassword()); + edtServer->setText(m_client->getServer()); + edtPort->setValue(m_client->getPort()); + edtPriority->setValue(m_client->getPriority()); + edtResource->setText(m_client->data.owner.Resource.str()); + edtVHost->setText(m_client->data.VHost.str()); + if (m_bConfig){ + tabCfg->removeTab(tabCfg->indexOf(tabJabber)); + }else{ + lblServer->hide(); + edtServer->hide(); + lblPort->hide(); + edtPort->hide(); + chkSSL1->hide(); + edtServer1->setText(i18n("jabber.org")); + edtPort1->setValue(m_client->getPort()); + } + chkSSL->setChecked(m_client->getUseSSL()); + chkSSL1->setChecked(m_client->getUseSSL()); + chkPlain->setChecked(m_client->getUsePlain()); + edtMinPort->setValue(m_client->getMinPort()); + edtMaxPort->setValue(m_client->getMaxPort()); + chkVHost->setChecked(m_client->getUseVHost()); + chkTyping->setChecked(m_client->getTyping()); + chkRichText->setChecked(m_client->getRichText()); + chkIcons->setChecked(m_client->getProtocolIcons()); + chkSubscribe->setChecked(m_client->getAutoSubscribe()); + chkAccept->setChecked(m_client->getAutoAccept()); + chkVersion->setChecked(m_client->getUseVersion()); + lnkPublic->setText(i18n("List of public servers")); + lnkPublic->setUrl("http://www.xmpp.net/servers"); + connect(edtID, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPasswd, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtServer, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPort, SIGNAL(valueChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(chkSSL, SIGNAL(toggled(bool)), this, SLOT(toggledSSL(bool))); + connect(chkSSL1, SIGNAL(toggled(bool)), this, SLOT(toggledSSL(bool))); + connect(chkVHost, SIGNAL(toggled(bool)), this, SLOT(toggledVHost(bool))); + chkHTTP->setChecked(m_client->getUseHTTP()); + edtUrl->setText(m_client->getURL()); + edtVHost->setEnabled(m_client->getUseVHost()); +} + +void JabberConfig::apply(Client*, void*) +{ +} + +void JabberConfig::apply() +{ + if (m_bConfig){ + m_client->setServer(edtServer->text()); + m_client->setPort(edtPort->text().toUShort()); + }else{ + m_client->setServer(edtServer1->text()); + m_client->setPort(edtPort1->text().toUShort()); + } + m_client->setUseVHost(false); + if (chkVHost->isChecked()){ + m_client->data.VHost.str() = edtVHost->text(); + if (!edtVHost->text().isEmpty()) + m_client->setUseVHost(true); + } + QString jid = edtID->text(); + int n = jid.indexOf('@'); + if (n >= 0){ + QString host = jid.mid(n + 1); + m_client->data.VHost.str() = host; + m_client->setUseVHost(true); + } else if (chkVHost->isChecked()){ + jid += '@'; + jid += edtVHost->text(); + } else { + jid += '@'; + jid += edtServer1->text(); + } + if (!m_bConfig){ + m_client->setID(jid); + m_client->setPassword(edtPasswd->text()); + m_client->setRegister(chkRegister->isChecked()); + } + if (m_bConfig){ + m_client->setUseSSL(chkSSL1->isChecked()); + }else{ + m_client->setUseSSL(chkSSL->isChecked()); + } + m_client->setUsePlain(chkPlain->isChecked()); + m_client->setMinPort(edtMinPort->text().toUShort()); + m_client->setMaxPort(edtMaxPort->text().toUShort()); + m_client->setTyping(chkTyping->isChecked()); + m_client->setRichText(chkRichText->isChecked()); + m_client->setUseVersion(chkVersion->isChecked()); + m_client->setAutoSubscribe(chkSubscribe->isChecked()); + m_client->setAutoAccept(chkAccept->isChecked()); + if (m_client->getProtocolIcons() != chkIcons->isChecked()){ + m_client->setProtocolIcons(chkIcons->isChecked()); + EventRepaintView e; + e.process(); + } + m_client->data.owner.Resource.str() = edtResource->text(); + m_client->setPriority(edtPriority->text().toLong()); + m_client->setUseHTTP(chkHTTP->isChecked()); + m_client->setURL(edtUrl->text()); +} + +void JabberConfig::toggledSSL(bool bState) +{ + unsigned port = edtPort1->text().toUShort(); + if (m_bConfig) + port = edtPort->text().toUShort(); + if (port == 0) + port = 5222; + if (bState){ + port++; + }else{ + port--; + } + edtPort->setValue(port); + edtPort1->setValue(port); +} + +void JabberConfig::toggledVHost(bool bState) +{ + edtVHost->setEnabled(bState); +} + +void JabberConfig::changed(const QString&) +{ + changed(); +} + +void JabberConfig::changed() +{ + bool bOK = !edtID->text().isEmpty() && + !edtPasswd->text().isEmpty(); + if (bOK){ + if (m_bConfig){ + bOK = !edtServer->text().isEmpty() && + edtPort->text().toUShort(); + }else{ + bOK = !edtServer1->text().isEmpty() && + edtPort1->text().toUShort(); + } + } + emit okEnabled(bOK); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "jabberconfig.moc" +#endif +*/ + diff --git a/plugins/jabber/jabberconfig.h b/plugins/jabber/jabberconfig.h new file mode 100644 index 0000000..d72f5e5 --- /dev/null +++ b/plugins/jabber/jabberconfig.h @@ -0,0 +1,47 @@ +/*************************************************************************** + jabberconfig.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERCONFIG_H +#define _JABBERCONFIG_H + +#include "ui_jabberconfigbase.h" +#include "event.h" + +class JabberClient; + +class JabberConfig : public QWidget, public Ui::JabberConfigBase +{ + Q_OBJECT +public: + JabberConfig(QWidget *parent, JabberClient *client, bool bConfig); +signals: + void okEnabled(bool); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected slots: + void changed(); + void changed(const QString&); + void toggledSSL(bool); + void toggledVHost(bool); +protected: + bool m_bConfig; + JabberClient *m_client; +}; + +#endif + diff --git a/plugins/jabber/jabberconfigbase.ui b/plugins/jabber/jabberconfigbase.ui new file mode 100644 index 0000000..5ce00d4 --- /dev/null +++ b/plugins/jabber/jabberconfigbase.ui @@ -0,0 +1,605 @@ + + + JabberConfigBase + + + + 0 + 0 + 388 + 375 + + + + Form1 + + + + 11 + + + + + 0 + + + + &Jabber + + + + 11 + + + + + &Register new account + + + + + + + + + Username: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + QLineEdit::Password + + + + + + + Server: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Port: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + 1 + + + 65355 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Use &SSL + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &Network + + + + 11 + + + + + + + Server: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Port: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + 1 + + + 65535 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + Use &SSL + + + + + + + Use &plain text login + + + + + + + Port range for direct connections: + + + false + + + + + + + + + 1024 + + + 65534 + + + + + + + - + + + false + + + + + + + 1024 + + + 65534 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + Use &HTTP polling + + + + + + + + + URL: + + + false + + + + + + + + + + + + + 0 + 0 + + + + Note: For HTTP-polling using proxy settings for HTTP + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &Options + + + + 11 + + + + + + + Resource: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Priority: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + Manualy specify Jabber host: + + + + + + + false + + + + + + + + + Enable &typing notification + + + Alt+T + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.xmpp.org/extensions/xep-0022.html"><span style=" text-decoration: underline; color:#0000ff;">(XEP-0022)</span></a></p></body></html> + + + + + + + + + + + Send &rich text messages if possible + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.xmpp.org/extensions/xep-0071.html"><span style=" text-decoration: underline; color:#0000ff;">(XEP-0071)</span></a></p></body></html> + + + + + + + + + + + Send and request version info + + + + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.xmpp.org/extensions/xep-0092.html"><span style=" text-decoration: underline; color:#0000ff;">(XEP-0092)</span></a></p></body></html> + + + + + + + + + Use protocol &icons for agents contacts + + + Alt+I + + + + + + + Automatically send &subscribe request + + + Alt+S + + + + + + + Automatically &accept subscribe requests + + + Alt+A + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + + LinkLabel + QWidget +
    simgui/linklabel.h
    +
    +
    + + chkRegister + chkSSL + chkPlain + edtMinPort + edtMaxPort + chkVHost + edtVHost + chkIcons + + + simgui/linklabel.h + + + +
    diff --git a/plugins/jabber/jabberfiletransfer.cpp b/plugins/jabber/jabberfiletransfer.cpp new file mode 100644 index 0000000..df99915 --- /dev/null +++ b/plugins/jabber/jabberfiletransfer.cpp @@ -0,0 +1,469 @@ +/*************************************************************************** + jabberclient.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" +#include "buffer.h" +#include "log.h" +#include "message.h" +#include "misc.h" + +#include "jabber.h" +#include "jabberclient.h" +#include "jabbermessage.h" + +#include + +#include +#include +#include + +using namespace SIM; +using namespace std; + +JabberFileTransfer::JabberFileTransfer(FileMessage *msg, JabberUserData *data, JabberClient *client) + : FileTransfer(msg) +{ + m_data = data; + m_client = client; + m_state = None; + m_socket = new JabberClientSocket(this); + m_startPos = 0; + m_endPos = 0xFFFFFFFF; +} + +JabberFileTransfer::~JabberFileTransfer() +{ + for (list::iterator it = m_client->m_waitMsg.begin(); it != m_client->m_waitMsg.end(); ++it){ + if ((*it) == m_msg){ + m_client->m_waitMsg.erase(it); + break; + } + } + if (m_socket) + delete m_socket; +} + +void JabberFileTransfer::listen() +{ + if (m_file == NULL){ + for (;;){ + if (!openFile()){ + if (FileTransfer::m_state == FileTransfer::Done) + m_socket->error_state(QString::null); + return; + } + if (!isDirectory()) + break; + } + } + bind(m_client->getMinPort(), m_client->getMaxPort(), m_client); +} + +void JabberFileTransfer::startReceive(unsigned pos) +{ + m_startPos = pos; + JabberFileMessage *msg = static_cast(m_msg); + m_socket->connect(msg->getHost(), msg->getPort(), m_client); + m_state = Connect; + FileTransfer::m_state = FileTransfer::Connect; + if (m_notify) + m_notify->process(); +} + +void JabberFileTransfer::bind_ready(unsigned short port) +{ + if (m_state == None){ + m_state = Listen; + }else{ + m_state = ListenWait; + FileTransfer::m_state = FileTransfer::Listen; + if (m_notify) + m_notify->process(); + } + QString fname = m_file->fileName(); + fname = fname.replace('\\', '/'); + int n = fname.lastIndexOf('/'); + if (n >= 0) + fname = fname.mid(n + 1); + m_url = fname; + m_client->sendFileRequest(m_msg, port, m_data, m_url, m_fileSize); +} + +bool JabberFileTransfer::error(const QString &err) +{ + error_state(err, 0); + return true; +} + +bool JabberFileTransfer::accept(Socket *s, unsigned long) +{ + if (m_state == Listen){ + EventMessageAcked(m_msg).process(); + m_state = ListenWait; + } + log(L_DEBUG, "Accept connection"); + m_startPos = 0; + m_endPos = 0xFFFFFFFF; + m_socket->setSocket(s); + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + m_socket->setRaw(true); + m_answer = 400; + return true; +} + +bool JabberFileTransfer::error_state(const QString &err, unsigned) +{ + if (m_state == Wait) + return false; + if (FileTransfer::m_state != FileTransfer::Done){ + m_state = None; + FileTransfer::m_state = FileTransfer::Error; + m_msg->setError(err); + } + m_msg->m_transfer = NULL; + m_msg->setFlags(m_msg->getFlags() & ~MESSAGE_TEMP); + EventMessageSent(m_msg).process(); + return true; +} + +void JabberFileTransfer::packet_ready() +{ + if (m_socket->readBuffer().writePos() == 0) + return; + if (m_state != Receive){ + JabberPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->readBuffer(), false, plugin->JabberPacket); + for (;;){ + QByteArray s; + if (!m_socket->readBuffer().scan("\n", s)) + break; + if (!s.isEmpty() && (s[(int)s.length() - 1] == '\r')) + s = s.left(s.length() - 1); + if (!get_line(s)) + break; + } + } + if (m_state == Receive){ + if (m_file == NULL){ + m_socket->error_state(QString::null, 0); + return; + } + unsigned size = m_socket->readBuffer().size() - m_socket->readBuffer().readPos(); + if (size > m_endPos - m_startPos) + size = m_endPos - m_startPos; + if (size){ + m_file->write(m_socket->readBuffer().data(m_socket->readBuffer().readPos()), size); + m_bytes += size; + m_totalBytes += size; + m_startPos += size; + m_transferBytes += size; + if (m_startPos == m_endPos){ + FileTransfer::m_state = FileTransfer::Done; + if (m_notify){ + m_notify->transfer(false); + m_notify->process(); + } + m_socket->error_state(QString::null); + } + if (m_notify) + m_notify->process(); + } + } + if (m_socket->readBuffer().readPos() == m_socket->readBuffer().writePos()) + m_socket->readBuffer().init(0); +} + +void JabberFileTransfer::connect_ready() +{ + JabberFileMessage *msg = static_cast(m_msg); + QString line; + line = "GET /"; + line += msg->getDescription(); + line += " HTTP/1.1\r\n" + "Host :"; + line += msg->getHost(); + line += "\r\n"; + if (m_startPos){ + line += "Range: "; + line += QString::number(m_startPos); + line += "-\r\n"; + } + m_startPos = 0; + m_endPos = 0xFFFFFFFF; + send_line(line); + FileTransfer::m_state = FileTransfer::Negotiation; + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + m_socket->setRaw(true); +} + +void JabberFileTransfer::write_ready() +{ + if (m_state != Send){ + ClientSocketNotify::write_ready(); + return; + } + if (m_transfer){ + m_transferBytes += m_transfer; + m_transfer = 0; + if (m_notify) + m_notify->process(); + } + if (m_startPos >= m_endPos){ + if (m_notify) + m_notify->transfer(false); + m_bytes += m_file->size() - m_endPos; + m_totalBytes += m_file->size() - m_endPos; + for (;;){ + if (!openFile()){ + m_state = None; + if (FileTransfer::m_state == FileTransfer::Done) + m_socket->error_state(QString::null); + break; + } + if (isDirectory()) + continue; + m_state = Wait; + FileTransfer::m_state = FileTransfer::Wait; + if (!((Client*)m_client)->send(m_msg, m_data)) + error_state(I18N_NOOP("File transfer failed"), 0); + break; + } + if (m_notify) + m_notify->process(); + m_socket->close(); + return; + } + QDateTime now(QDateTime::currentDateTime()); + if (now != m_sendTime){ + m_sendTime = now; + m_sendSize = 0; + } + if (m_sendSize > (m_speed << 18)){ + m_socket->pause(1); + return; + } + char buf[2048]; + unsigned tail = sizeof(buf); + if (tail > m_endPos - m_startPos) + tail = m_endPos - m_startPos; + int readn = m_file->read(buf, tail); + if (readn <= 0){ + m_socket->error_state("Read file error"); + return; + } + m_startPos += readn; + m_transfer = readn; + m_bytes += readn; + m_totalBytes += readn; + m_sendSize += readn; + m_socket->writeBuffer().pack(buf, readn); + m_socket->write(); +} + +bool JabberFileTransfer::get_line(const QByteArray &str) +{ + QByteArray line = str; + if (line.isEmpty()){ + if (m_state == Connect){ + m_socket->error_state(I18N_NOOP("File transfer failed")); + return true; + } + if (m_state == ReadHeader){ + if (m_endPos < m_startPos) + m_endPos = m_startPos; + if (m_file) + m_file->seek(m_startPos); + m_state = Receive; + FileTransfer::m_state = FileTransfer::Read; + m_bytes += m_startPos; + m_totalBytes += m_startPos; + m_fileSize = m_endPos; + m_totalSize = m_endPos; + if (m_notify){ + m_notify->process(); + m_notify->transfer(true); + } + return true; + } + if (m_file->size() < m_endPos) + m_endPos = m_file->size(); + if (m_startPos > m_endPos) + m_startPos = m_endPos; + if ((m_answer == 200) && (m_startPos == m_endPos)) + m_answer = 204; + if ((m_answer == 200) && ((m_startPos != 0) || (m_endPos < m_file->size()))) + m_answer = 206; + QString s; + s = "HTTP/1.0 "; + s += QString::number(m_answer); + switch (m_answer){ + case 200: + s += " OK"; + break; + case 204: + s += " No content"; + break; + case 206: + s += " Partial content"; + break; + case 400: + s += " Bad request"; + break; + case 404: + s += " Not found"; + break; + default: + s += " Error"; + } + send_line(s); + if ((m_answer == 200) || (m_answer == 206)){ + send_line("Content-Type: application/data"); + s = "Content-Length: "; + s += QString::number(m_endPos - m_startPos); + send_line(s); + } + if (m_answer == 206){ + s = "Range: "; + s += QString::number(m_startPos); + s += '-'; + s += QString::number(m_endPos); + send_line(s); + } + send_line(""); + if (m_answer < 300){ + m_file->seek(m_startPos); + FileTransfer::m_state = FileTransfer::Write; + m_state = Send; + m_bytes = m_startPos; + m_totalBytes += m_startPos; + if (m_notify){ + m_notify->process(); + m_notify->transfer(true); + } + write_ready(); + }else{ + m_socket->error_state("Bad request"); + } + return false; + } + if (m_state == ListenWait){ + QByteArray t = getToken(line, ' '); + if (t == "GET"){ + m_answer = 404; + t = getToken(line, ' '); + if (t[0] == '/'){ + if (m_url == QString::fromUtf8((t.data() + 1))) + m_answer = 200; + } + } + m_state = Header; + return true; + } + if (m_state == Connect){ + QByteArray t = getToken(line, ' '); + t = getToken(t, '/'); + if (t != "HTTP"){ + m_socket->error_state(I18N_NOOP("File transfer fail")); + return true; + } + unsigned code = getToken(line, ' ').toUInt(); + switch (code){ + case 200: + case 206: + m_startPos = 0; + m_endPos = 0xFFFFFFFF; + break; + case 204: + m_startPos = 0; + m_endPos = 0; + break; + } + m_state = ReadHeader; + return true; + } + if (m_state == ReadHeader){ + QByteArray t = getToken(line, ':'); + if (t == "Content-Length"){ + const char *p; + for (p = line.data(); *p; p++) + if ((*p > '0') && (*p < '9')) + break; + m_endPos = m_startPos + strtoul(p, NULL, 10); + } + if (t == "Range"){ + const char *p; + for (p = line.data(); *p; p++) + if ((*p > '0') && (*p < '9')) + break; + m_startPos = strtoul(p, NULL, 10); + for (; *p; p++) + if (*p == '-'){ + ++p; + break; + } + if ((*p > '0') && (*p < '9')) + m_endPos = m_startPos + strtoul(p, NULL, 10); + } + return true; + } + QByteArray t = getToken(line, ':'); + if (t == "Range"){ + const char *p = line.data(); + for (; *p; p++) + if (*p != ' ') + break; + m_startPos = strtoul(p, NULL, 10); + for (; *p; p++) + if (*p == '-'){ + p++; + break; + } + if ((*p >= '0') && (*p <= '9')) + m_endPos = strtoul(p, NULL, 10); + } + return true; +} + +void JabberFileTransfer::send_line(const QString &line) +{ + send_line(line.toUtf8().data()); +} + +void JabberFileTransfer::send_line(const QByteArray &line) +{ + send_line(line.data()); +} + +void JabberFileTransfer::send_line(const char *line) +{ + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer() << line << "\r\n"; + JabberPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->writeBuffer(), true, plugin->JabberPacket); + m_socket->write(); +} + +void JabberFileTransfer::connect() +{ + m_nFiles = 1; + if (static_cast(m_msg)->getPort() == 0) + m_client->sendFileAccept(m_msg, m_data); + if (m_notify) + m_notify->createFile(m_msg->getDescription(), 0xFFFFFFFF, false); +} diff --git a/plugins/jabber/jabberhomeinfo.cpp b/plugins/jabber/jabberhomeinfo.cpp new file mode 100644 index 0000000..810ae2e --- /dev/null +++ b/plugins/jabber/jabberhomeinfo.cpp @@ -0,0 +1,102 @@ +/*************************************************************************** + jabberhomeinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "jabberclient.h" +#include "jabberhomeinfo.h" +#include "jabber.h" +#include "contacts/contact.h" + +#include +#include + +using namespace SIM; + +JabberHomeInfo::JabberHomeInfo(QWidget *parent, JabberUserData *data, JabberClient *client) : QWidget(parent) + //: JabberHomeInfoBase(parent) +{ + setupUi(this); + m_client = client; + m_data = data; + if (m_data){ + edtStreet->setReadOnly(true); + edtExt->setReadOnly(true); + edtCity->setReadOnly(true); + edtState->setReadOnly(true); + edtZip->setReadOnly(true); + edtCountry->setReadOnly(true); + } + fill(m_data); +} + +void JabberHomeInfo::apply() +{ +} + +bool JabberHomeInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(m_data); + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(m_data); + } else + if (m_data && (e->type() == eEventVCard)){ + EventVCard *evc = static_cast(e); + JabberUserData *data = evc->data(); + if (m_data->ID.str() == data->ID.str() && m_data->Node.str() == data->Node.str()) + fill(data); + } + return false; +} + +void JabberHomeInfo::fill(JabberUserData *data) +{ + if (data == NULL) data = &m_client->data.owner; + edtStreet->setPlainText(data->Street.str()); + edtExt->setPlainText(data->ExtAddr.str()); + edtCity->setText(data->City.str()); + edtState->setText(data->Region.str()); + edtZip->setText(data->PCode.str()); + edtCountry->setText(data->Country.str()); +} + +void JabberHomeInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + JabberUserData *data = m_client->toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->Street.str() = edtStreet->toPlainText(); + data->ExtAddr.str() = edtExt->toPlainText(); + data->City.str() = edtCity->text(); + data->Region.str() = edtState->text(); + data->PCode.str() = edtZip->text(); + data->Country.str() = edtCountry->text(); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "jabberhomeinfo.moc" +#endif +*/ + diff --git a/plugins/jabber/jabberhomeinfo.h b/plugins/jabber/jabberhomeinfo.h new file mode 100644 index 0000000..cdb53c5 --- /dev/null +++ b/plugins/jabber/jabberhomeinfo.h @@ -0,0 +1,43 @@ +/*************************************************************************** + jabberhomeinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERHOMEINFO_H +#define _JABBERHOMEINFO_H + +#include "ui_jabberhomeinfobase.h" +#include "event.h" + +struct JabberUserData; +class JabberClient; + +class JabberHomeInfo : public QWidget, public Ui::LocationInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + JabberHomeInfo(QWidget *parent, JabberUserData *data, JabberClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(JabberUserData *data); + JabberUserData *m_data; + JabberClient *m_client; +}; + +#endif + diff --git a/plugins/jabber/jabberhomeinfobase.ui b/plugins/jabber/jabberhomeinfobase.ui new file mode 100644 index 0000000..ee0386d --- /dev/null +++ b/plugins/jabber/jabberhomeinfobase.ui @@ -0,0 +1,126 @@ + + + LocationInfo + + + + 0 + 0 + 409 + 283 + + + + Form2 + + + + 11 + + + 6 + + + + + + + + + + + + + + + + + City: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Zip code: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Country: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + State: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Address: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + + + diff --git a/plugins/jabber/jabberinfo.cpp b/plugins/jabber/jabberinfo.cpp new file mode 100644 index 0000000..2417e20 --- /dev/null +++ b/plugins/jabber/jabberinfo.cpp @@ -0,0 +1,261 @@ +/*************************************************************************** + jabberinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include "icons.h" +#include "misc.h" + +#include "contacts/contact.h" +#include "simgui/ballonmsg.h" +#include "simgui/datepicker.h" + +#include "jabberclient.h" +#include "jabberinfo.h" + +using namespace SIM; + +JabberInfo::JabberInfo(QWidget *parent, JabberUserData *data, JabberClient *client) : QWidget(parent) +{ + setupUi(this); + m_client = client; + m_data = data; + btnUrl->setWindowIcon(Icon("home")); + connect(btnUrl, SIGNAL(clicked()), this, SLOT(goUrl())); + edtOnline->setReadOnly(true); + edtNA->setReadOnly(true); + edtID->setReadOnly(true); + edtClient->setReadOnly(true); + if (m_data){ + edtFirstName->setReadOnly(true); + edtNick->setReadOnly(true); + disableWidget(edtDate); + edtUrl->setReadOnly(true); + edtAutoReply->setReadOnly(true); + tabWnd->removeTab(tabWnd->indexOf(password)); + }else{ + connect(edtUrl, SIGNAL(textChanged(const QString&)), this, SLOT(urlChanged(const QString&))); + connect(this, SIGNAL(raise(QWidget*)), topLevelWidget(), SLOT(raisePage(QWidget*))); + edtAutoReply->hide(); + } + fill(); + connect(cmbResource, SIGNAL(activated(int)), this, SLOT(resourceActivated(int))); +} + +void JabberInfo::apply() +{ + if ((m_data == NULL) && (m_client->getState() == Client::Connected)){ + QString errMsg; + QWidget *errWidget = edtCurrent; + if (!edtPswd1->text().isEmpty() || !edtPswd2->text().isEmpty()){ + if (edtCurrent->text().isEmpty()){ + errMsg = i18n("Input current password"); + }else{ + if (edtPswd1->text() != edtPswd2->text()){ + errMsg = i18n("Confirm password does not match"); + errWidget = edtPswd2; + }else if (edtCurrent->text() != m_client->getPassword()){ + errMsg = i18n("Invalid password"); + } + } + } + if (!errMsg.isEmpty()){ + for (QWidget *p = parentWidget(); p; p = p->parentWidget()){ + QTabWidget *tb = qobject_cast(p); + if (!tb) + continue; + tb->setCurrentIndex(tb->indexOf(this)); + break; + } + emit raise(this); + BalloonMsg::message(errMsg, errWidget); + return; + } + if (!edtPswd1->text().isEmpty()) + m_client->changePassword(edtPswd1->text()); + // clear Textboxes + edtCurrent->clear(); + edtPswd1->clear(); + edtPswd2->clear(); + } +} + +void JabberInfo::resourceActivated(int i) +{ + JabberUserData *data = m_data; + if (data == NULL) data = &m_client->data.owner; + unsigned n = i + 1; + unsigned status = STATUS_OFFLINE; + unsigned statusTime; + unsigned onlineTime; + QString autoReply; + QString clientName, clientVersion, clientOS; + if ((n == 0) || (n > data->nResources.toULong())){ + status = m_data ? m_data->Status.toULong() : m_client->getStatus(); + statusTime = data->StatusTime.toULong(); + onlineTime = data->OnlineTime.toULong(); + }else{ + status = get_str(data->ResourceStatus, n).toUInt(); + statusTime = get_str(data->ResourceStatusTime, n).toUInt(); + onlineTime = get_str(data->ResourceOnlineTime, n).toUInt(); + autoReply = get_str(data->ResourceReply, n); + clientName = get_str(data->ResourceClientName, n); + clientVersion = get_str(data->ResourceClientVersion, n); + clientOS = get_str(data->ResourceClientOS, n); + } + int current = 0; + const char *text = NULL; + for (const CommandDef *cmd = m_client->protocol()->statusList(); cmd->id; cmd++){ + if (cmd->flags & COMMAND_CHECK_STATE) + continue; + if (status == cmd->id){ + current = cmbStatus->count(); + text = cmd->text.toLocal8Bit().data(); + } + cmbStatus->addItem(Icon(cmd->icon), i18n(cmd->text)); + } + cmbStatus->setCurrentIndex(current); + disableWidget(cmbStatus); + if (status == STATUS_OFFLINE){ + lblOnline->setText(i18n("Last online") + ':'); + edtOnline->setText(formatDateTime(statusTime)); + lblOnline->show(); + edtOnline->show(); + lblNA->hide(); + edtNA->hide(); + }else{ + if (onlineTime){ + edtOnline->setText(formatDateTime(onlineTime)); + lblOnline->show(); + edtOnline->show(); + }else{ + lblOnline->hide(); + edtOnline->hide(); + } + if ((status == STATUS_ONLINE) || (text == NULL)){ + lblNA->hide(); + edtNA->hide(); + }else{ + lblNA->setText(i18n(text)); + edtNA->setText(formatDateTime(statusTime)); + lblNA->show(); + edtNA->show(); + } + } + if (autoReply.isEmpty()){ + edtAutoReply->hide(); + }else{ + edtAutoReply->show(); + edtAutoReply->setPlainText(autoReply); + } + if (clientName.isEmpty()){ + edtClient->setEnabled(false); + }else{ + edtClient->setEnabled(true); + QString clientString = clientName + ' ' + clientVersion; + if (!clientOS.isEmpty()) + clientString += " / " + clientOS; + edtClient->setText(clientString); + } +} + +bool JabberInfo::processEvent(Event *e) +{ + if ((e->type() == eEventMessageReceived) && m_data){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if ((msg->type() == MessageStatus) && (m_client->dataName(m_data) == msg->client())) + fill(); + } else + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +void JabberInfo::fill() +{ + JabberUserData *data = m_data; + if (data == NULL) data = &m_client->data.owner; + edtID->setText(data->ID.str()); + edtFirstName->setText(data->FirstName.str()); + edtNick->setText(data->Nick.str()); + edtDate->setDate(QDate::fromString(data->Bday.str(), Qt::ISODate)); + edtUrl->setText(data->Url.str()); + urlChanged(edtUrl->text()); + cmbResource->clear(); + if (data->nResources.toULong()){ + for (unsigned i = 1; i <= data->nResources.toULong(); i++) + cmbResource->addItem(get_str(data->Resources, i)); + cmbResource->setEnabled(data->nResources.toULong() > 1); + }else{ + if (!data->Resource.str().isEmpty()) + cmbResource->addItem(data->Resource.str()); + cmbResource->setEnabled(false); + } + resourceActivated(0); + if (m_data == NULL) + password->setEnabled(m_client->getState() == Client::Connected); +} + +void JabberInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + JabberUserData *data = m_client->toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->FirstName.str() = edtFirstName->text(); + data->Nick.str() = edtNick->text(); + data->Bday.str() = edtDate->getDate().toString(Qt::ISODate); + data->Url.str() = edtUrl->text(); +} + +void JabberInfo::goUrl() +{ + QString url = edtUrl->text(); + if (url.isEmpty()) + return; + EventGoURL e(url); + e.process(); +} + +void JabberInfo::urlChanged(const QString &text) +{ + btnUrl->setEnabled(!text.isEmpty()); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "jabberinfo.moc" +#endif +*/ + diff --git a/plugins/jabber/jabberinfo.h b/plugins/jabber/jabberinfo.h new file mode 100644 index 0000000..5d21253 --- /dev/null +++ b/plugins/jabber/jabberinfo.h @@ -0,0 +1,48 @@ +/*************************************************************************** + jabberinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERINFO_H +#define _JABBERINFO_H + +#include "ui_jabberinfobase.h" +#include "event.h" + +struct JabberUserData; +class JabberClient; + +class JabberInfo : public QWidget, public Ui::JabberInfo, public SIM::EventReceiver +{ + Q_OBJECT +public: + JabberInfo(QWidget *parent, JabberUserData *data, JabberClient *client); +signals: + void raise(QWidget*); +public slots: + void apply(); + void apply(SIM::Client*, void*); + void goUrl(); + void urlChanged(const QString&); + void resourceActivated(int); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + JabberUserData *m_data; + JabberClient *m_client; +}; + +#endif + diff --git a/plugins/jabber/jabberinfobase.ui b/plugins/jabber/jabberinfobase.ui new file mode 100644 index 0000000..b3d790a --- /dev/null +++ b/plugins/jabber/jabberinfobase.ui @@ -0,0 +1,441 @@ + + + JabberInfo + + + + 0 + 0 + 400 + 301 + + + + Form1 + + + + 6 + + + 11 + + + + + + &Names + + + + 11 + + + 6 + + + + + + 75 + true + + + + ID: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 75 + true + + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + First Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Nick: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Birth date: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Homepage: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + 6 + + + 0 + + + + + + + + + + + + + + + + + 6 + + + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + &Status + + + + + + Status: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 0 + 0 + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 16 + + + + + + + + Resource: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Online: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Client: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + + &Password + + + + 11 + + + 6 + + + + + New password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + QLineEdit::Password + + + + + + + QLineEdit::Password + + + + + + + Retype new password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + Current password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + QLineEdit::Password + + + + + + + + + + + + + DatePicker + QWidget +
    simgui/datepicker.h
    +
    +
    + + tabWnd + edtID + edtFirstName + edtNick + edtUrl + btnUrl + cmbStatus + cmbResource + edtOnline + edtNA + + + simgui/datepicker.h + + + +
    diff --git a/plugins/jabber/jabbermessage.cpp b/plugins/jabber/jabbermessage.cpp new file mode 100644 index 0000000..00a86f0 --- /dev/null +++ b/plugins/jabber/jabbermessage.cpp @@ -0,0 +1,243 @@ +/*************************************************************************** + jabbermessage.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "jabbermessage.h" +#include "jabber.h" +#include "core.h" + +#include + +using namespace SIM; + +static DataDef jabberMessageData[] = + { + { "Subject", DATA_UTF, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +JabberMessage::JabberMessage(Buffer *cfg) + : Message(MessageJabber, cfg) +{ + load_data(jabberMessageData, &data, cfg); +} + +JabberMessage::~JabberMessage() +{ + free_data(jabberMessageData, &data); +} + +QByteArray JabberMessage::save() +{ + QByteArray res = Message::save(); + QByteArray s = save_data(jabberMessageData, &data); + if (!s.isEmpty()){ + if (!res.isEmpty()) + res += '\n'; + res += s; + } + return res; +} + +QString JabberMessage::presentation() +{ + QString res = i18n("

    Subject: %1

    ") + .arg(getSubject()); + res += Message::presentation(); + return res; +} + +static Message *createJabberMessage(Buffer *cfg) +{ + return new JabberMessage(cfg); +} + +static MessageDef defJabber = + { + NULL, + NULL, + MESSAGE_DEFAULT, + NULL, + NULL, + createJabberMessage, + NULL, + NULL + }; + +static DataDef jabberMessageErrorData[] = + { + { "Error", DATA_UTF, 1, 0 }, + { "Code", DATA_ULONG, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +JabberMessageError::JabberMessageError(Buffer *cfg) + : Message(MessageJabberError, cfg) +{ + load_data(jabberMessageErrorData, &data, cfg); +} + +JabberMessageError::~JabberMessageError() +{ + free_data(jabberMessageErrorData, &data); +} + +QByteArray JabberMessageError::save() +{ + QByteArray res = Message::save(); + QByteArray s = save_data(jabberMessageErrorData, &data); + if (!s.isEmpty()){ + if (!res.isEmpty()) + res += '\n'; + res += s; + } + return res; +} + +QString JabberMessageError::presentation() +{ + QString res = "

    "; + res += i18n("Error"); + if (getCode()){ + res += ' '; + res += QString::number(getCode()); + } + QString err = getError(); + if (!err.isEmpty()){ + res += ": "; + res += err; + res += ""; + } + res += "
    "; + res += i18n("Original message:"); + res += "

    "; + res += Message::presentation(); + return res; +} + +static Message *createJabberMessageError(Buffer *cfg) +{ + return new JabberMessageError(cfg); +} + +#if 0 +i18n("Error", "%n errors", 1); +#endif + +static MessageDef defJabberError = + { + NULL, + NULL, + MESSAGE_DEFAULT, + "Error", + "%n errors", + createJabberMessageError, + NULL, + NULL + }; + +static Message *createJabberOnlineMessage(Buffer *cfg) +{ + return new AuthMessage(MessageJabberOnline, cfg); +} + +static MessageDef defJabberOnline = + { + NULL, + NULL, + MESSAGE_SILENT | MESSAGE_SENDONLY, + I18N_NOOP("Log On"), + NULL, + createJabberOnlineMessage, + NULL, + NULL + }; + +static Message *createJabberOfflineMessage(Buffer *cfg) +{ + return new AuthMessage(MessageJabberOffline, cfg); +} + +static MessageDef defJabberOffline = + { + NULL, + NULL, + MESSAGE_SILENT | MESSAGE_SENDONLY, + I18N_NOOP("Log Off"), + NULL, + createJabberOfflineMessage, + NULL, + NULL + }; + +static DataDef jabberMessageFileData[] = + { + { "", DATA_STRING, 1, 0 }, // ID + { "", DATA_STRING, 1, 0 }, + { "", DATA_STRING, 1, 0 }, // Host + { "", DATA_ULONG, 1, 0 }, // Port + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +JabberFileMessage::JabberFileMessage(Buffer *cfg) + : FileMessage(MessageFile, cfg) +{ + load_data(jabberMessageFileData, &data, cfg); +} + +JabberFileMessage::~JabberFileMessage() +{ + free_data(jabberMessageFileData, &data); +} + +void JabberPlugin::registerMessages() +{ + Command cmd; + cmd->id = MessageJabber; + cmd->text = "Jabber"; + cmd->icon = "message"; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defJabber; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageJabberOnline; + cmd->text = I18N_NOOP("Log On"); + cmd->icon = "Jabber_online"; + cmd->menu_grp = 0x3020; + cmd->param = &defJabberOnline; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageJabberOffline; + cmd->text = I18N_NOOP("Log Off"); + cmd->icon = "Jabber_offline"; + cmd->param = &defJabberOffline; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageJabberError; + cmd->text = I18N_NOOP("Error"); + cmd->icon = "error"; + cmd->param = &defJabberError; + EventCreateMessageType(cmd).process(); +} + +void JabberPlugin::unregisterMessages() +{ + EventRemoveMessageType(MessageJabber).process(); + EventRemoveMessageType(MessageJabberOnline).process(); + EventRemoveMessageType(MessageJabberOffline).process(); + EventRemoveMessageType(MessageJabberError).process(); +} + diff --git a/plugins/jabber/jabbermessage.h b/plugins/jabber/jabbermessage.h new file mode 100644 index 0000000..b069dae --- /dev/null +++ b/plugins/jabber/jabbermessage.h @@ -0,0 +1,91 @@ +/*************************************************************************** + jabbermessage.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERMESSAGE_H +#define _JABBERMESSAGE_H + +#include "cfg.h" +#include "message.h" + +#include + +const unsigned long MessageJabber = 0x201; +const unsigned long MessageJabberOnline = 0x202; +const unsigned long MessageJabberOffline = 0x203; +const unsigned long MessageJabberError = 0x204; + +struct JabberMessageData +{ + SIM::Data Subject; +}; + +class JabberMessage : public SIM::Message +{ +public: + JabberMessage(Buffer *cfg = NULL); + ~JabberMessage(); + PROP_UTF8(Subject); + virtual QByteArray save(); + virtual QString presentation(); + virtual unsigned baseType() { return SIM::MessageGeneric; } +protected: + JabberMessageData data; +}; + +struct JabberMessageErrorData +{ + SIM::Data Error; + SIM::Data Code; +}; + +class JabberMessageError : public SIM::Message +{ +public: + JabberMessageError(Buffer *cfg = NULL); + ~JabberMessageError(); + PROP_UTF8(Error); + PROP_ULONG(Code); + virtual QByteArray save(); + virtual QString presentation(); +protected: + JabberMessageErrorData data; +}; + +struct JabberMessageFileData +{ + SIM::Data ID; + SIM::Data From; + SIM::Data Host; + SIM::Data Port; +}; + +class JabberFileMessage : public SIM::FileMessage +{ +public: + JabberFileMessage(Buffer *cfg = NULL); + ~JabberFileMessage(); + PROP_STR(ID); + PROP_STR(From); + PROP_STR(Host); + PROP_USHORT(Port); + virtual unsigned baseType() { return SIM::MessageFile; } +protected: + JabberMessageFileData data; +}; + +#endif + diff --git a/plugins/jabber/jabberpicture.cpp b/plugins/jabber/jabberpicture.cpp new file mode 100644 index 0000000..ff922cb --- /dev/null +++ b/plugins/jabber/jabberpicture.cpp @@ -0,0 +1,178 @@ +/*************************************************************************** + jabberpicture.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include +#include +#include +#include +#include +#include + +#include "misc.h" + +#include "contacts/contact.h" +#include "simgui/ballonmsg.h" +#include "simgui/editfile.h" +#include "simgui/preview.h" + +#include "jabberclient.h" +#include "jabberpicture.h" + +using namespace SIM; + +#ifndef USE_KDE + +static FilePreview *createPreview(QWidget *parent) +{ + return new PictPreview(parent); +} + +#endif + +JabberPicture::JabberPicture(QWidget *parent, JabberUserData *data, JabberClient *client, bool bPhoto) : QWidget(parent) + //: JabberPictureBase(parent) +{ + setupUi(this); + m_data = data; + m_client = client; + m_bPhoto = bPhoto; + tabPict->setTabText(tabPict->indexOf(tab), m_bPhoto ? i18n("&Photo") : i18n("&Logo")); + if (m_data){ + edtPict->hide(); + btnClear->hide(); + }else{ + QString format = "*.bmp *.gif *.jpg *.jpeg"; +#ifdef USE_KDE + edtPict->setFilter(i18n("%1|Graphics") .arg(format)); +#else +edtPict->setFilter(i18n("Graphics(%1)") .arg(format)); + edtPict->setFilePreview(createPreview); +#endif + edtPict->setReadOnly(true); + connect(btnClear, SIGNAL(clicked()), this, SLOT(clearPicture())); + connect(edtPict, SIGNAL(textChanged(const QString&)), this, SLOT(pictSelected(const QString&))); + QString pict = m_bPhoto ? client->getPhoto() : client->getLogo(); + edtPict->setText(pict); + pictSelected(pict); + } + fill(); +} + +void JabberPicture::apply() +{ +} + +void JabberPicture::apply(Client *client, void*) +{ + if (client != m_client) + return; + QString pict = edtPict->text(); + if (lblPict->pixmap() == NULL) + pict = QString::null; + if (m_bPhoto){ + m_client->setPhoto(pict); + }else{ + m_client->setLogo(pict); + } +} + +bool JabberPicture::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } + return false; +} + +void JabberPicture::fill() +{ + if (m_data == NULL) + return; + if (m_bPhoto){ + if (m_data->PhotoHeight.toLong() && m_data->PhotoWidth.toLong()){ + QImage img(m_client->photoFile(m_data)); + setPict(img); + return; + } + }else{ + if (m_data->LogoHeight.toLong() && m_data->LogoWidth.toLong()){ + QImage img(m_client->logoFile(m_data)); + setPict(img); + return; + } + } + QImage img; + setPict(img); +} + +void JabberPicture::clearPicture() +{ + edtPict->setText(QString::null); +} + +void JabberPicture::pictSelected(const QString &file) +{ + if (file.isEmpty()){ + QImage img; + setPict(img); + return; + } + QFile f(file); + QImage img(file); + setPict(img); +} + +void JabberPicture::setPict(QImage &img) +{ + if (img.isNull()){ + lblPict->setText(i18n("Picture is not available")); + return; + } + int w = img.width(); + int h = img.height(); + if (h > w){ + if (h > 300){ + w = w * 300 / h; + h = 300; + } + }else{ + if (w > 300){ + h = h * 300 / w; + w = 300; + } + } + if ((w != img.width()) || (h != img.height())) + img = img.scaled(w, h, Qt::KeepAspectRatio, Qt::SmoothTransformation); + QPixmap pict; + pict = QPixmap::fromImage(img); + lblPict->setPixmap(pict); + lblPict->setMinimumSize(pict.size()); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "jabberpicture.moc" +#endif +*/ + diff --git a/plugins/jabber/jabberpicture.h b/plugins/jabber/jabberpicture.h new file mode 100644 index 0000000..c7f75e3 --- /dev/null +++ b/plugins/jabber/jabberpicture.h @@ -0,0 +1,50 @@ +/*************************************************************************** + jabberpicture.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERPICTURE_H +#define _JABBERPICTURE_H + +#include "ui_jabberpicturebase.h" +#include "event.h" + +struct JabberUserData; +class JabberClient; + +class QImage; + +class JabberPicture : public QWidget, public Ui::JabberPictureBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + JabberPicture(QWidget *parent, JabberUserData *data, JabberClient *client, bool bPhoto); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected slots: + void clearPicture(); + void pictSelected(const QString&); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + void setPict(QImage &img); + bool m_bPhoto; + JabberUserData *m_data; + JabberClient *m_client; +}; + +#endif + diff --git a/plugins/jabber/jabberpicturebase.ui b/plugins/jabber/jabberpicturebase.ui new file mode 100644 index 0000000..3af8f28 --- /dev/null +++ b/plugins/jabber/jabberpicturebase.ui @@ -0,0 +1,123 @@ + + + + + JabberPictureBase + + + + 0 + 0 + 460 + 324 + + + + Form1 + + + + 11 + + + 6 + + + + + + &Photo + + + + 11 + + + 6 + + + + + + 7 + 7 + + + + + + + Qt::AlignCenter + + + false + + + + + + + &Clear + + + + + + + + 7 + 5 + + + + + + + + + + + + + EditFile + QWidget +
    simgui/editfile.h
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 +
    + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image1 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/jabber/jabbersearch.cpp b/plugins/jabber/jabbersearch.cpp new file mode 100644 index 0000000..4b9fd19 --- /dev/null +++ b/plugins/jabber/jabbersearch.cpp @@ -0,0 +1,721 @@ +/*************************************************************************** + jabbersearch.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "simgui/ballonmsg.h" +#include "icons.h" +#include "misc.h" + +#include "jabberclient.h" +#include "jabbersearch.h" +#include "jabber.h" +#include "jidadvsearch.h" + +using namespace std; +using namespace SIM; + +class CComboBox : public QComboBox +{ +public: + CComboBox(QWidget *parent, const char *name); + void addItem(const QString &label, const QString &value); + QString value(); +protected: + vector m_values; +}; + +CComboBox::CComboBox(QWidget *parent, const char *name) + : QComboBox(parent) +{ + setObjectName(name); + setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); +} + +void CComboBox::addItem(const QString &label, const QString &value) +{ + m_values.push_back(value); + insertItem(INT_MAX,label); +} + +QString CComboBox::value() +{ + unsigned index = currentIndex(); + if (index >= m_values.size()) + return QString::null; + return m_values[index]; +} + +const unsigned MAX_ELEMENTS = 8; + +JabberSearch::JabberSearch(QWidget *parent, const char *name) + : QWizardPage(parent) + , m_vlay(NULL) + , m_lay(NULL) +{ +} + +void JabberSearch::init(QWidget *receiver, JabberClient *client, const QString &jid, const QString &node, const QString &name, bool bRegister) +{ + m_client = client; + m_jid = jid; + m_node = node; + m_name = name; + m_receiver = receiver; + m_bXData = false; + m_bFirst = true; + m_bRegister = bRegister; + m_bDirty = false; +} + +struct defFlds +{ + const char *tag; + const char *name; + bool bRequired; +}; + +static defFlds fields[] = + { + { "username", I18N_NOOP("Username"), true }, + { "nick", I18N_NOOP("Nick"), false }, + { "email", I18N_NOOP("EMail"), false }, + { "first", I18N_NOOP("First Name"), false }, + { "last", I18N_NOOP("Last Name"), false }, + { "age_min", I18N_NOOP("Age min"), false }, + { "age_max", I18N_NOOP("Age max"), false }, + { "city", I18N_NOOP("City"), false }, + { NULL, NULL, false } + }; + +void JabberSearch::addWidget(JabberAgentInfo *data) +{ + QWidget *widget = NULL; + bool bJoin = false; + if (!data->Type.str().isEmpty()) + { + if (data->Type.str() == "x") + { + m_bXData = true; + QWidget *w; + foreach(w,m_widgets) + { + if(w) delete(w); + } + m_widgets.clear(); + foreach(w,m_labels) + { + if(w) delete(w); + } + m_labels.clear(); + foreach(w,m_descs) + { + if(w) delete(w); + } + m_descs.clear(); + m_instruction = QString::null; + } + else if (data->Type.str() == "title") + { + if (!data->Value.str().isEmpty()) + m_title = data->Value.str(); + } + else if (data->Type.str() == "text-single") + { + widget = new QLineEdit(this); + widget->setObjectName(data->Field.str()); + connect(widget, SIGNAL(returnPressed()), m_receiver, SLOT(search())); + connect(widget, SIGNAL(textChanged(const QString&)), m_receiver, SLOT(textChanged(const QString&))); + if (!data->Value.str().isEmpty()) + static_cast(widget)->setText(data->Value.str()); + } + else if (data->Type.str() == "text-private") + { + widget = new QLineEdit(this); + widget->setObjectName(data->Field.str()); + static_cast(widget)->setEchoMode(QLineEdit::Password); + connect(widget, SIGNAL(returnPressed()), m_receiver, SLOT(search())); + connect(widget, SIGNAL(textChanged(const QString&)), m_receiver, SLOT(textChanged(const QString&))); + if (!data->Value.str().isEmpty()) + static_cast(widget)->setText(data->Value.str()); + } + else if (data->Type.str() == "text-multi") + { + widget = new QTextEdit(this); + widget->setObjectName(data->Field.str()); + connect(widget, SIGNAL(returnPressed()), m_receiver, SLOT(search())); + if (!data->Value.str().isEmpty()) + static_cast(widget)->setText(data->Value.str()); + } + else if (data->Type.str() == "boolean" && !data->Label.str().isEmpty()) + { + widget = new QCheckBox(data->Label.str(), this); + widget->setObjectName(qPrintable(data->Field.str())); + if (!data->Value.str().isEmpty() && !data->Value.str().startsWith("0")) + static_cast(widget)->setChecked(true); + data->Label.clear(); + bJoin = true; + } + else if (data->Type.str() == "fixed") + { + if (!data->Value.str().isEmpty()) + { + QString text = i18(data->Value.str()); + text = text.replace(QRegExp(" +"), "\n"); + if (m_bFirst) + { + if (!m_label.isEmpty()) + m_label += '\n'; + m_label += text; + } + else + { + QLabel *label = new QLabel(text, this); + label->setWordWrap(true); + widget = label; + bJoin = true; + } + } + } + else if (data->Type.str() == "instructions") + { + if (!data->Value.str().isEmpty()) + { + QString text = i18(data->Value.str()); + text = text.replace(QRegExp(" +"), "\n"); + if (!m_instruction.isEmpty()) + m_instruction += '\n'; + m_instruction += text; + } + } + else if (data->Type.str() == "list-single") + { + CComboBox *box = new CComboBox(this, qPrintable(data->Field.str())); + int cur = 0; + int n = 0; + for (unsigned i = 0; i < data->nOptions.toULong(); i++){ + QString label = get_str(data->OptionLabels, i); + QString val = get_str(data->Options, i); + if(!label.isEmpty() && !val.isEmpty()) + { + box->addItem(i18(label), val); + if (data->Value.str() == val) + cur = n; + n++; + } + } + box->setCurrentIndex(cur); + widget = box; + } + else if (data->Type.str() == "key") + { + if (!data->Value.str().isEmpty()) + m_key = data->Value.str(); + } + else if (data->Type.str() == "password") + { + widget = new QLineEdit(this); + widget->setObjectName("password"); + static_cast(widget)->setEchoMode(QLineEdit::Password); + connect(widget, SIGNAL(returnPressed()), m_receiver, SLOT(search())); + connect(widget, SIGNAL(textChanged(const QString&)), m_receiver, SLOT(textChanged(const QString&))); + data->Label.str() = "Password"; + } + else if (data->Type.str() == "online") + { + widget = new QCheckBox(this); + widget->setObjectName("online"); + static_cast(widget)->setText(i18n("Online only")); + bJoin = true; + } + else if (data->Type.str() == "sex") + { + CComboBox *box = new CComboBox(this, qPrintable(data->Field.str())); + box->addItem(QString::null, "0"); + box->addItem(i18n("Male"), "1"); + box->addItem(i18n("Female"), "2"); + data->Label.str() == I18N_NOOP("Gender"); + widget = box; + } + else + { + defFlds *f; + for (f = fields; f->tag; f++) + if (data->Type.str() == QString::fromUtf8(f->tag)) + break; + if (f->tag) + { + widget = new QLineEdit(this); + widget->setObjectName(f->tag); + connect(widget, SIGNAL(returnPressed()), m_receiver, SLOT(search())); + connect(widget, SIGNAL(textChanged(const QString&)), m_receiver, SLOT(textChanged(const QString&))); + if (!data->Value.str().isEmpty()) + static_cast(widget)->setText(data->Value.str()); + data->Label.str() = QString::fromUtf8(f->name); + if (f->bRequired && m_bRegister) + data->bRequired.asBool() = true; + } + else if (!data->Label.str().isEmpty()) + { + widget = new QLineEdit(this); + widget->setObjectName(data->Field.str()); + connect(widget, SIGNAL(returnPressed()), m_receiver, SLOT(search())); + connect(widget, SIGNAL(textChanged(const QString&)), m_receiver, SLOT(textChanged(const QString&))); + if (!data->Value.str().isEmpty()) + static_cast(widget)->setText(data->Value.str()); + } + } + } + else + { + createLayout(); + m_widgets.clear(); + m_labels.clear(); + m_descs.clear(); + m_bDirty = true; + QTimer::singleShot(0, this, SLOT(setSize())); + return; + } + if (widget) + { + m_bFirst = false; + if (data->bRequired.toBool()) + m_required.push_back(widget); + QLabel *label = NULL; + if (!bJoin && !data->Label.str().isEmpty()) + { + QString text = i18(data->Label.str()); + if (!text.isEmpty() && (text[(int)(text.length() - 1)] != ':')) + text += ':'; + label = new QLabel(text, this); + label->setAlignment(Qt::AlignRight); + } + QWidget *help = NULL; + if (!data->Desc.str().isEmpty()) + help = new HelpButton(data->Desc.str(), this); + m_labels.push_back(label); + m_widgets.push_back(widget); + m_descs.push_back(help); + } +} + +void JabberSearch::setSize() +{ + if (!m_bDirty || (parent() == NULL)) + return; + m_bDirty = false; + for (QWidget *p = this; p; p = p->parentWidget()){ + QSize s = p->sizeHint(); + QSize s1 = QSize(p->width(), p->height()); + if (s.isValid()) + p->setMinimumSize(s); + p->resize(qMax(s.width(), s1.width()), qMax(s.height(), s1.height())); + if (p->layout()) + p->layout()->invalidate(); + if (p == topLevelWidget()) + break; + } + QWidget *t = topLevelWidget(); + QSize s = t->sizeHint(); + t->resize(qMax(t->width(), s.width()), qMax(t->height(), s.height())); + t->adjustSize(); +} + +#if 0 +static const char *any_data[] = + { + I18N_NOOP("First (Given)"), + I18N_NOOP("Last (Family)"), + I18N_NOOP("Nick (Alias)"), + I18N_NOOP("Email"), + I18N_NOOP("Select the speed of the search. \"Fast\" matches your string to the beginning of the field only (ie. \"b\" would yield Bob,Bill,etc...) \"Slower\" matches your string anywhere in the field (ie. \"b\" would yield Bob, Bill, Caleb, Robbie, etc...)"), + I18N_NOOP("Search Speed"), + I18N_NOOP("Fast / Less accurate"), + I18N_NOOP("Slower / More extensive") + I18N_NOOP("Full name") + I18N_NOOP("First Name") + I18N_NOOP("Last Name") + I18N_NOOP("Nickname") + I18N_NOOP("E-mail") + I18N_NOOP("Username") + I18N_NOOP("Password") + I18N_NOOP("Enter your MSN Messenger account and password. Example: user@hotmail.com. Nickname is optional.") + I18N_NOOP("Enter your AIM screenname or ICQ UIN and the password for that account") + I18N_NOOP("Enter your YAHOO! Messenger Username and Password.") + I18N_NOOP("Please enter your UIN and password") + I18N_NOOP("You need a x:data capable client to register.") + I18N_NOOP("Enter nick you want to register.") + I18N_NOOP("Complete the form to submit your searchable attributes in the Jabber User Directory") + I18N_NOOP("Fill in all of the fields to add yourself to the JUD.") + I18N_NOOP("Fill in a field to search for any matching Jabber User (POSIX regular expressions allowed)") + I18N_NOOP("Fill in a field to search for any matching Jabber users.") + I18N_NOOP("To register, please fill out the following form. Be as accurate as possible to make it easier for people to search for you.") + }; +#endif + +QString JabberSearch::i18(const char *text) +{ + if ((text == NULL) || (*text == 0)) + return QString(); + return i18(QString::fromUtf8(text)); +} + +QString JabberSearch::i18(const QString &res) +{ + if (res.isEmpty()) + return QString(); + for (int i = 0; i < res.length(); i++){ + if (res[i].unicode() >= 0x80) + return res; + } + return i18n(res); +} + +bool JabberSearch::canSearch() +{ + bool bRes = true; + + QList l = findChildren(); + QLineEdit *edit; + foreach(edit,l) + { + if (edit->echoMode() == QLineEdit::Password){ + if (edit->text().isEmpty()) + return false; + continue; + } + if (edit->text().isEmpty()){ + foreach(QWidget *w, m_required){; + if (w == (QWidget*)edit){ + return false; + } + } + } + if (!edit->text().isEmpty()) + bRes = true; + } + return bRes; +} + +QString JabberSearch::condition(QWidget *w) +{ + QString res; + if (m_bXData && (w == NULL)) + res += "x:data"; + + if (w == NULL) + w = this; + + QList list_edit = w->findChildren(); + foreach( QLineEdit *edit, list_edit ) + { + if (!edit->text().isEmpty()){ + if (!res.isEmpty()) + res += ';'; + res += edit->objectName(); + res += '='; + res += quoteChars(edit->text(), ";"); + } + } + + QList list_combo = w->findChildren(); + foreach( QComboBox *box, list_combo ) + { + if (box->currentText().isEmpty()){ + continue; + } + if (!res.isEmpty()) + res += ';'; + res += box->objectName(); + res += '='; + res += quoteChars(box->currentText(), ";"); + } + + QList list_check = w->findChildren(); + foreach( QCheckBox *check, list_check ) + { + if (!res.isEmpty()) + res += ';'; + res += check->objectName(); + res += check->isChecked() ? "=1" : "=0"; + } + + QList list_tedit = w->findChildren(); + foreach( QTextEdit *edit, list_tedit ) + { + if (!edit->toPlainText().isEmpty()){ + if (!res.isEmpty()) + res += ';'; + res += edit->objectName(); + res += '='; + res += quoteChars(edit->toPlainText(), ";"); + } + } + + if (!m_key.isEmpty() && (w == NULL)){ + if (!res.isEmpty()) + res += ';'; + res += "key="; + res += quoteChars(m_key, ";"); + } + return res; +} + +void JabberSearch::createLayout() +{ + unsigned start = 0; + unsigned nCols = 0; + unsigned nRows = 0; + m_vlay = new QVBoxLayout(this); + m_lay = new QGridLayout(this); + m_vlay->addLayout(m_lay); + m_vlay->setMargin(11); + m_lay->setSpacing(6); + m_vlay->addStretch(); + if (!m_widgets.empty()){ + nCols = (m_widgets.size() + MAX_ELEMENTS - 1) / MAX_ELEMENTS; + nRows = (m_widgets.size() + nCols - 1) / nCols; + start = 0; + if (!m_label.isEmpty()) + { + QLabel *label = new QLabel(m_label, this); + label->setWordWrap(true); + m_lay->addWidget(label, 0, 0, 1, nCols * 3 + 1); + m_label = QString::null; + start = 1; + } + unsigned row = start; + unsigned col = 0; + for (int i = 0; i < m_widgets.size(); i++, row++) + { + if (row >= nRows + start){ + row = 0; + col += 3; + } + if (m_labels[i]) + { + static_cast(m_labels[i])->setAlignment( Qt::AlignVCenter | Qt::AlignRight); + m_lay->addWidget(m_labels[i], row, col); + if (m_descs[i]) + { + m_lay->addWidget(m_widgets[i], row, col + 1, Qt::AlignVCenter); + m_lay->addWidget(m_descs[i], row, col + 2, Qt::AlignVCenter); + m_descs[i]->show(); + } + else + { + m_lay->addWidget(m_widgets[i], row, col + 1, 1, 1, Qt::AlignVCenter); + } + m_labels[i]->show(); + } + else + { + if (m_descs[i]) + { + m_lay->addWidget(m_widgets[i], row, col, 1, 2, Qt::AlignVCenter); + m_lay->addWidget(m_descs[i], row, col + 2, Qt::AlignBottom); + m_descs[i]->show(); + } + else + m_lay->addWidget(m_widgets[i], row, col, 1, 3, Qt::AlignVCenter); + + } + m_widgets[i]->show(); + } + } + if (!m_instruction.isEmpty()) + { + QLabel *label = new QLabel(m_instruction, this); + label->setWordWrap(true); + m_lay->addWidget(label, nRows + start, 0, 1, nCols * 3 - 1); + m_instruction = QString::null; + } +} + +HelpButton::HelpButton(const QString &help, QWidget *parent) + : QPushButton(parent) +{ + QIcon p = Icon("help"); + setIcon(p); + m_help = help; + connect(this, SIGNAL(clicked()), this, SLOT(click())); +// setMinimumSize(p.width() + 2, p.height() + 2); +// setMaximumSize(p.width() + 2, p.height() + 2); +} + +void HelpButton::click() +{ + BalloonMsg::message(m_help, this); +} + +JIDJabberSearch::JIDJabberSearch(QWidget *parent, const char *name) + : JabberSearch(parent, name) +{ + m_adv = NULL; +} + +void JIDJabberSearch::setAdvanced(JIDAdvSearch *adv) +{ + m_adv = adv; +} + +static const char *names[] = + { + "username", + "email", + "nick", + "first", + "last", + "user", + "fn", + "given", + "online", + NULL + }; + +const unsigned MAX_MAIN = 6; + +void JIDJabberSearch::createLayout() +{ + unsigned rowMain = 0; + QGridLayout *lay = new QGridLayout(this); + QGridLayout *alay = NULL; + lay->setSpacing(6); + unsigned nAdv = 0; + unsigned nMain = 0; + if (m_widgets.size() > (int)MAX_MAIN){ + alay = new QGridLayout(m_adv->grpSearch); + alay->setMargin(11); + alay->setSpacing(6); + for (int i = 0; i < m_widgets.size(); i++){ + if (nMain > MAX_MAIN){ + nAdv++; + continue; + } + const char **p; + for (p = names; *p; p++) + if ( m_widgets[i]->objectName() == *p ) + break; + if (*p == NULL){ + nAdv++; + continue; + } + nMain++; + } + } + unsigned nCols = (nAdv + MAX_ELEMENTS - 1) / MAX_ELEMENTS; + unsigned nRows = nCols ? (nAdv + nCols - 1) / nCols : 0; + unsigned start = 0; + unsigned row = 0; + unsigned col = 0; + nMain = 0; + for (int i = 0; i < m_widgets.size(); i++){ + bool bMain = false; + if (alay){ + if (nMain < MAX_MAIN){ + const char **p; + for (p = names; *p; p++) + if ( m_widgets[i]->objectName() == *p ) + break; + if (*p){ + nMain++; + bMain = true; + } + } + }else{ + bMain = true; + } + if (bMain){ + if (m_labels[i]){ + static_cast(m_labels[i])->setAlignment(Qt::AlignVCenter); + lay->addWidget(m_labels[i], rowMain, 0, 1, 2, Qt::AlignVCenter); + m_labels[i]->show(); + rowMain++; + } + if (m_descs[i]){ + lay->addWidget(m_widgets[i], rowMain, 0, Qt::AlignVCenter); + lay->addWidget(m_descs[i], rowMain, 1, Qt::AlignVCenter); + m_descs[i]->show(); + }else{ + lay->addWidget(m_widgets[i], rowMain, 0, 1, 2, Qt::AlignVCenter); + } + m_widgets[i]->show(); + rowMain++; + }else{ + if (row >= nRows + start){ + row = 0; + col += 3; + } + m_widgets[i]->setParent(m_adv->grpSearch); + m_widgets[i]->move(QPoint(0, 0)); + if (m_descs[i]){ + m_descs[i]->setParent(m_adv->grpSearch); + m_descs[i]->move(QPoint(0, 0)); + } + if (m_labels[i]){ + m_labels[i]->setParent(m_adv->grpSearch); + m_labels[i]->move(QPoint(0, 0)); + static_cast(m_labels[i])->setAlignment(Qt::AlignVCenter | Qt::AlignRight); + alay->addWidget(m_labels[i], row, col); + if (m_descs[i]){ + alay->addWidget(m_widgets[i], row, col + 1, Qt::AlignVCenter); + alay->addWidget(m_descs[i], row, col + 2, Qt::AlignVCenter); + m_descs[i]->show(); + }else{ + alay->addWidget(m_widgets[i], row, col + 1, 1, 2, Qt::AlignVCenter); + } + m_labels[i]->show(); + }else{ + if (m_descs[i]){ + alay->addWidget(m_widgets[i], row, col, 1, 2, Qt::AlignVCenter); + alay->addWidget(m_descs[i], row, col + 2, Qt::AlignBottom); + m_descs[i]->show(); + }else{ + alay->addWidget(m_widgets[i], row, col, 1, 3, Qt::AlignVCenter); + } + } + m_widgets[i]->show(); + row++; + } + } + if (alay){ + m_adv->lblTitle->setText(m_title); + m_adv->lblInstruction->setText(m_instruction); + } + m_instruction = QString::null; +} + +/* +#ifndef NO_MOC_INCLUDES +#include "jabbersearch.moc" +#endif +*/ + diff --git a/plugins/jabber/jabbersearch.h b/plugins/jabber/jabbersearch.h new file mode 100644 index 0000000..410fa68 --- /dev/null +++ b/plugins/jabber/jabbersearch.h @@ -0,0 +1,93 @@ +/*************************************************************************** + jabbersearch.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERSEARCH_H +#define _JABBERSEARCH_H + +#include +#include +#include +#include + +class JabberClient; +struct JabberAgentInfo; + +class HelpButton : public QPushButton +{ + Q_OBJECT +public: + HelpButton(const QString &help, QWidget *parent); +protected slots: + void click(); +protected: + QString m_help; +}; + +class JabberSearch : public QWizardPage +{ + Q_OBJECT +public: + JabberSearch(QWidget *parent = NULL, const char *name = NULL); + void init(QWidget *receiver, JabberClient *client, const QString &jid, const QString &node, const QString &name, bool bRegister); + bool canSearch(); + QString condition(QWidget *w); + const QString &id() { return m_jid; } + void addWidget(JabberAgentInfo *data); + JabberClient *m_client; + QString m_jid; + QString m_node; + QString m_title; +protected slots: + void setSize(); +protected: + virtual void createLayout(); + QString i18(const char *text); + QString i18(const QString &text); + + QString m_name; + QString m_instruction; + QString m_label; + QWidget *m_receiver; + QString m_key; + bool m_bDirty; + bool m_bXData; + bool m_bFirst; + bool m_bRegister; + QList m_required; + QList m_widgets; + QList m_labels; + QList m_descs; +private: + QVBoxLayout *m_vlay; + QGridLayout *m_lay; +}; + +class JIDAdvSearch; + +class JIDJabberSearch : public JabberSearch +{ + Q_OBJECT +public: + JIDJabberSearch(QWidget *parent = NULL, const char *name = NULL); + void setAdvanced(JIDAdvSearch *adv); +protected: + void createLayout(); + JIDAdvSearch *m_adv; +}; + +#endif + diff --git a/plugins/jabber/jabberstatus.cpp b/plugins/jabber/jabberstatus.cpp new file mode 100644 index 0000000..3d56f37 --- /dev/null +++ b/plugins/jabber/jabberstatus.cpp @@ -0,0 +1,78 @@ + +#include "jabberstatus.h" + + +JabberStatus::JabberStatus(const QString& id, const QString& name, bool hasText, const QString& defaultText, const QIcon& icon, + const QString& show, const QString& type) : IMStatus(), + m_id(id), + m_name(name), + m_hasText(hasText), + m_text(defaultText), + m_icon(icon), + m_show(show), + m_type(type) +{ +} + +JabberStatus::~JabberStatus() +{ +} + + +QString JabberStatus::id() const +{ + return m_id; +} + +QString JabberStatus::name() const +{ + return m_name; +} + +void JabberStatus::setText(const QString& t) +{ + m_text = t; +} + +QString JabberStatus::text() const +{ + return m_text; +} + +QIcon JabberStatus::icon() const +{ + return m_icon; +} + +QStringList JabberStatus::substatuses() +{ + return QStringList(); +} + +SIM::IMStatusPtr JabberStatus::substatus(const QString& id) +{ + return SIM::IMStatusPtr(); +} + +SIM::IMStatusPtr JabberStatus::clone() +{ + return SIM::IMStatusPtr(new JabberStatus(m_id, m_name, m_hasText, m_text, m_icon, m_show, m_type)); +} + +bool JabberStatus::hasText() const +{ + return m_hasText; +} + +QString JabberStatus::show() +{ + return m_show; +} + +QString JabberStatus::type() +{ + return m_type; +} + +// vim: set expandtab: + diff --git a/plugins/jabber/jabberstatus.h b/plugins/jabber/jabberstatus.h new file mode 100644 index 0000000..dd411a1 --- /dev/null +++ b/plugins/jabber/jabberstatus.h @@ -0,0 +1,44 @@ + +#ifndef JABBERSTATUS_H +#define JABBERSTATUS_H + +#include "contacts/imstatus.h" + +class JabberStatus : public SIM::IMStatus +{ +public: + JabberStatus(const QString& id, const QString& name, bool hasText, const QString& defaultText, const QIcon& icon, + const QString& show, const QString& type); + virtual ~JabberStatus(); + + virtual QString id() const; + virtual QString name() const; + virtual bool hasText() const; + virtual void setText(const QString& t); + virtual QString text() const; + virtual QIcon icon() const; + + virtual QStringList substatuses(); + virtual SIM::IMStatusPtr substatus(const QString& id); + virtual SIM::IMStatusPtr clone(); + + QString show(); + QString type(); + +private: + QString m_id; + QString m_name; + bool m_hasText; + QString m_text; + QIcon m_icon; + QString m_show; + QString m_type; + +}; + +typedef QSharedPointer JabberStatusPtr; + +#endif + +// vim: set expandtab: + diff --git a/plugins/jabber/jabberworkinfo.cpp b/plugins/jabber/jabberworkinfo.cpp new file mode 100644 index 0000000..b567268 --- /dev/null +++ b/plugins/jabber/jabberworkinfo.cpp @@ -0,0 +1,96 @@ +/*************************************************************************** + jabberworkinfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "jabberclient.h" +#include "jabberworkinfo.h" +#include "jabber.h" +#include "contacts/contact.h" + +#include +#include + +using namespace SIM; + +JabberWorkInfo::JabberWorkInfo(QWidget *parent, JabberUserData *data, JabberClient *client) : QWidget(parent) + //: JabberWorkInfoBase(parent) +{ + setupUi(this); + m_client = client; + m_data = data; + if (m_data){ + edtCompany->setReadOnly(true); + edtDepartment->setReadOnly(true); + edtTitle->setReadOnly(true); + edtRole->setReadOnly(true); + } + fill(m_data); +} + +void JabberWorkInfo::apply() +{ +} + +bool JabberWorkInfo::processEvent(Event *e) +{ + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(m_data); + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(m_data); + } else + if (m_data && (e->type() == eEventVCard)){ + EventVCard *evc = static_cast(e); + JabberUserData *data = evc->data(); + if (m_data->ID.str() == data->ID.str() && m_data->Node.str() == data->Node.str()) + fill(data); + } + return false; +} + +void JabberWorkInfo::fill(JabberUserData *data) +{ + if (data == NULL) data = &m_client->data.owner; + edtCompany->setText(data->OrgName.str()); + edtDepartment->setText(data->OrgUnit.str()); + edtTitle->setText(data->Title.str()); + edtRole->setText(data->Role.str()); +} + +void JabberWorkInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + JabberUserData *data = m_client->toJabberUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->OrgName.str() = edtCompany->text(); + data->OrgUnit.str() = edtDepartment->text(); + data->Title.str() = edtTitle->text(); + data->Role.str() = edtRole->text(); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "jabberworkinfo.moc" +#endif +*/ + diff --git a/plugins/jabber/jabberworkinfo.h b/plugins/jabber/jabberworkinfo.h new file mode 100644 index 0000000..cc3c963 --- /dev/null +++ b/plugins/jabber/jabberworkinfo.h @@ -0,0 +1,43 @@ +/*************************************************************************** + jabberworkinfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JABBERWORKINFO_H +#define _JABBERWORKINFO_H + +#include "ui_jabberworkinfobase.h" +#include "event.h" + +struct JabberUserData; +class JabberClient; + +class JabberWorkInfo : public QWidget, public Ui::JabberWorkInfoBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + JabberWorkInfo(QWidget *parent, JabberUserData *data, JabberClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(JabberUserData *data); + JabberUserData *m_data; + JabberClient *m_client; +}; + +#endif + diff --git a/plugins/jabber/jabberworkinfobase.ui b/plugins/jabber/jabberworkinfobase.ui new file mode 100644 index 0000000..0b4bc45 --- /dev/null +++ b/plugins/jabber/jabberworkinfobase.ui @@ -0,0 +1,132 @@ + + + + + JabberWorkInfoBase + + + + 0 + 0 + 380 + 196 + + + + Form1 + + + + 11 + + + 6 + + + + + Department: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + Company: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + + + + + + + Role: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + Position: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/jabber/jidadvsearch.cpp b/plugins/jabber/jidadvsearch.cpp new file mode 100644 index 0000000..4824296 --- /dev/null +++ b/plugins/jabber/jidadvsearch.cpp @@ -0,0 +1,38 @@ +/*************************************************************************** + jidadvsearch.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "jidadvsearch.h" + +#include + +JIDAdvSearch::JIDAdvSearch(QWidget *parent) : QWidget(parent) + //: JIDAdvSearchBase(parent) +{ +} + +void JIDAdvSearch::showEvent(QShowEvent *e) +{ + QWidget::showEvent(e); + emit enableOptions(false); +} + +/* +#ifndef NO_MOC_INCLUDES +#include "jidadvsearch.moc" +#endif +*/ + diff --git a/plugins/jabber/jidadvsearch.h b/plugins/jabber/jidadvsearch.h new file mode 100644 index 0000000..93c1d72 --- /dev/null +++ b/plugins/jabber/jidadvsearch.h @@ -0,0 +1,37 @@ +/*************************************************************************** + jidadvsearch.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JIDADVSEARCH_H +#define _JIDADVSEARCH_H + +#include "ui_jidadvsearchbase.h" + +#include + +class JIDAdvSearch : public QWidget, public Ui::JIDAdvSearch +{ + Q_OBJECT +public: + JIDAdvSearch(QWidget *parent); +signals: + void enableOptions(bool); +protected: + void showEvent(QShowEvent*); +}; + +#endif + diff --git a/plugins/jabber/jidadvsearchbase.ui b/plugins/jabber/jidadvsearchbase.ui new file mode 100644 index 0000000..fc347a5 --- /dev/null +++ b/plugins/jabber/jidadvsearchbase.ui @@ -0,0 +1,76 @@ + + + JIDAdvSearch + + + + 0 + 0 + 415 + 331 + + + + Form1 + + + + 6 + + + 11 + + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + + diff --git a/plugins/jabber/jidsearch.cpp b/plugins/jabber/jidsearch.cpp new file mode 100644 index 0000000..6175031 --- /dev/null +++ b/plugins/jabber/jidsearch.cpp @@ -0,0 +1,202 @@ +/*************************************************************************** + jidsearch.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include + +#include "icons.h" +#include "misc.h" + +#include "jabberclient.h" +#include "jidsearch.h" +#include "jabbersearch.h" +#include "jidadvsearch.h" +#include "jabber.h" +#include "contacts/contact.h" + +using namespace SIM; + +JIDSearch::JIDSearch(QWidget *parent, JabberClient *client, const QString &jid, + const QString &node, const QString &type) : QWidget(parent) + //: JIDSearchBase(parent) +{ + setupUi(this); + m_client = client; + m_jid = jid; + m_node = node; + m_type = type; + connect(btnBrowser, SIGNAL(clicked()), this, SLOT(browserClicked())); + connect(btnAdvanced, SIGNAL(clicked()), this, SLOT(advancedClicked())); + QIcon is = Icon("1rightarrow"); + btnBrowser->setIcon(is); + btnAdvanced->setIcon(is); + m_bInit = false; + m_adv = new JIDAdvSearch(this); + jidSearch->setAdvanced(m_adv); + m_bAdv = false; +} + +void JIDSearch::browserClicked() +{ + connect(this, SIGNAL(showClient(SIM::Client*)), topLevelWidget(), SLOT(showClient(SIM::Client*))); + emit showClient(m_client); + disconnect(this, SIGNAL(showClient(SIM::Client*)), topLevelWidget(), SLOT(showClient(SIM::Client*))); +} + +void JIDSearch::showEvent(QShowEvent *e) +{ + QWidget::showEvent(e); + if (!m_bInit){ + m_bInit = true; + connect(this, SIGNAL(setAdd(bool)), topLevelWidget(), SLOT(setAdd(bool))); + connect(this, SIGNAL(showResult(QWidget*)), topLevelWidget(), SLOT(showResult(QWidget*))); + connect(this, SIGNAL(addResult(QWidget*)), topLevelWidget(), SLOT(addResult(QWidget*))); + if(!m_adv->grpSearch->children().empty()) + { + emit addResult(m_adv); + } + else + { + btnAdvanced->hide(); + m_adv->hide(); + } + } + if (m_bAdv) + { + m_bAdv = false; + advancedClicked(); + } + emit setAdd(false); +} + +void JIDSearch::advancedClicked() +{ + if (m_bAdv){ + m_bAdv = false; + QIcon is = Icon("1rightarrow"); + btnAdvanced->setIcon(is); + emit showResult(NULL); + }else{ + m_bAdv = true; + QIcon is = Icon("1leftarrow"); + btnAdvanced->setIcon(is); + emit showResult(m_adv); + } +} + +void JIDSearch::search() +{ + QString condition = jidSearch->condition(NULL); + if (m_bAdv){ + if (!condition.isEmpty()) + condition += ';'; + condition += jidSearch->condition(m_adv); + advancedClicked(); + } + m_search_id = m_client->search(m_jid, m_node, condition); +} + +void JIDSearch::searchStop() +{ + m_search_id = QString::null; +} + +bool JIDSearch::processEvent(Event *e) +{ + if (e->type() == eEventJabberSearch){ + EventSearch *es = static_cast(e); + JabberSearchData *data = es->searchData(); + if (m_search_id != data->ID.str()) + return false; + if (data->JID.str().isEmpty()){ + QStringList l; + l.append(QString::null); + l.append(i18n("JID")); + for (unsigned i = 0; i < data->nFields.toULong(); i++){ + l.append(get_str(data->Fields, i * 2)); + l.append(i18n(get_str(data->Fields, i * 2 + 1))); + } + emit setColumns(l, 0, this); + return true; + } + QString icon = "Jabber"; + if (m_type == "icq"){ + icon = "ICQ"; + }else if (m_type == "aim"){ + icon = "AIM"; + }else if (m_type == "msn"){ + icon = "MSN"; + }else if (m_type == "yahoo"){ + icon = "Yahoo!"; + }else if (m_type == "sms"){ + icon = "sms"; + }else if ((m_type == "x-gadugadu") || (m_type == "gg")){ + icon = "GG"; + } + if (!data->Status.str().isEmpty()){ + if (data->Status.str() == "online"){ + icon += "_online"; + }else{ + icon += "_offline"; + } + } + QStringList l; + l.append(icon); + l.append(data->JID.str()); + l.append(data->JID.str()); + for (unsigned n = 0; n < data->nFields.toULong(); n++) + l.append(get_str(data->Fields, n)); + emit addItem(l, this); + } + if (e->type() == eEventJabberSearchDone){ + EventSearchDone *esd = static_cast(e); + QString id = esd->userID(); + if (m_search_id == id){ + m_search_id = QString::null; + emit searchDone(this); + } + } + return false; +} + +void JIDSearch::createContact(const QString &name, unsigned tmpFlags, Contact *&contact) +{ + QString resource; + if (m_client->findContact(name, QString::null, false, contact, resource)) + return; + if (m_client->findContact(name, QString::null, true, contact, resource, false) == NULL) + return; + contact->setFlags(contact->getFlags() | tmpFlags); +} + +#if 0 +i18n("User") +i18n("Full Name") +i18n("Middle Name") +i18n("Family Name") +i18n("email") +i18n("Birthday") +i18n("Organization Name") +i18n("Organization Unit") +#endif + +/* +#ifndef NO_MOC_INCLUDES +#include "jidsearch.moc" +#endif +*/ + diff --git a/plugins/jabber/jidsearch.h b/plugins/jabber/jidsearch.h new file mode 100644 index 0000000..aecbd56 --- /dev/null +++ b/plugins/jabber/jidsearch.h @@ -0,0 +1,63 @@ +/*************************************************************************** + jidsearch.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JIDSEARCH_H +#define _JIDSEARCH_H + +#include "ui_jidsearchbase.h" +#include "event.h" + +#include + +struct JabberUserData; +class JabberClient; +class JIDAdvSearch; + +class JIDSearch : public QWidget, public Ui::JIDSearch, public SIM::EventReceiver +{ + Q_OBJECT +public: + JIDSearch(QWidget *parent, JabberClient *client, const QString &jid, const QString &m_node, const QString &type); + QString m_jid; + QString m_node; +signals: + void setAdd(bool); + void showClient(SIM::Client*); + void showResult(QWidget*); + void addResult(QWidget*); + void setColumns(const QStringList&, int, QWidget*); + void addItem(const QStringList&, QWidget*); + void searchDone(QWidget*); +protected slots: + void browserClicked(); + void advancedClicked(); + void search(); + void searchStop(); + void createContact(const QString&, unsigned tmpFlags, SIM::Contact *&contact); +protected: + virtual bool processEvent(SIM::Event *e); + void showEvent(QShowEvent*); + QString m_search_id; + QString m_type; + bool m_bInit; + bool m_bAdv; + JIDAdvSearch *m_adv; + JabberClient *m_client; +}; + +#endif + diff --git a/plugins/jabber/jidsearchbase.ui b/plugins/jabber/jidsearchbase.ui new file mode 100644 index 0000000..39a3110 --- /dev/null +++ b/plugins/jabber/jidsearchbase.ui @@ -0,0 +1,87 @@ + + + JIDSearch + + + + 0 + 0 + 184 + 355 + + + + Form1 + + + + 6 + + + 0 + + + + + GroupBox + + + + + + + 0 + 0 + + + + + + + + + + + &Advanced + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Jabber &browser + + + + + + + + JIDJabberSearch + QWidget +
    jabbersearch.h
    +
    +
    + + btnAdvanced + btnBrowser + + + +
    diff --git a/plugins/livejournal/CMakeLists.txt b/plugins/livejournal/CMakeLists.txt new file mode 100644 index 0000000..9a7db89 --- /dev/null +++ b/plugins/livejournal/CMakeLists.txt @@ -0,0 +1,26 @@ +####################### +# livejournal library # +####################### +IF(BUILD_DROPPED) +SET(livejournal_SRCS + journalsearch.cpp + livejournal.cpp + livejournalcfg.cpp + msgjournal.cpp +) + +SET(livejournal_HDRS + journalsearch.h + livejournal.h + livejournalcfg.h + msgjournal.h +) + +SET(livejournal_UICS + journalsearchbase.ui + livejournalcfgbase.ui + msgjournalbase.ui +) + +SIM_ADD_PLUGIN(livejournal) +ENDIF(BUILD_DROPPED) diff --git a/plugins/livejournal/configure.in.in b/plugins/livejournal/configure.in.in new file mode 100644 index 0000000..ef18b62 --- /dev/null +++ b/plugins/livejournal/configure.in.in @@ -0,0 +1,4 @@ +if test "$have_ssl" != yes; then + AC_MSG_WARN([OpenSSL library disabled. LiveJournal plugin is disabled]) +fi +AM_CONDITIONAL(ENABLE_LIVEJOURNAL, test "$have_ssl" = "yes") diff --git a/plugins/livejournal/journalsearch.cpp b/plugins/livejournal/journalsearch.cpp new file mode 100644 index 0000000..bd239e8 --- /dev/null +++ b/plugins/livejournal/journalsearch.cpp @@ -0,0 +1,49 @@ +/*************************************************************************** + msnsearch.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "journalsearch.h" +#include "livejournal.h" +#include "contacts/contact.h" + +#include +#include + +using namespace SIM; + +JournalSearch::JournalSearch(LiveJournalClient *client, QWidget *parent) : QWidget(parent) +{ + setupUi(this); + m_client = client; + connect(this, SIGNAL(setAdd(bool)), topLevelWidget(), SLOT(setAdd(bool))); +} + +void JournalSearch::showEvent(QShowEvent *e) +{ + showEvent(e); + emit setAdd(true); +} + +void JournalSearch::createContact(unsigned tmpFlags, Contact *&contact) +{ + if (edtCommunity->text().isEmpty()) + return; + if (m_client->findContact(edtCommunity->text(), contact, false)) + return; + m_client->findContact(edtCommunity->text(), contact, true, false); + contact->setFlags(contact->getFlags() | tmpFlags); +} + diff --git a/plugins/livejournal/journalsearch.h b/plugins/livejournal/journalsearch.h new file mode 100644 index 0000000..087e073 --- /dev/null +++ b/plugins/livejournal/journalsearch.h @@ -0,0 +1,44 @@ +/*************************************************************************** + journalsearch.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _JOURNALSEARCH_H +#define _JOURNALSEARCH_H + +#include "contacts.h" + +#include "ui_journalsearchbase.h" + +#include + +class LiveJournalClient; + +class JournalSearch : public QWidget, public Ui::JournalSearchBase +{ + Q_OBJECT +public: + JournalSearch(LiveJournalClient *client, QWidget *parent); +signals: + void setAdd(bool); +protected slots: + void createContact(unsigned tmpFlags, SIM::Contact *&contact); +protected: + void showEvent(QShowEvent*); + LiveJournalClient *m_client; +}; + +#endif + diff --git a/plugins/livejournal/journalsearchbase.ui b/plugins/livejournal/journalsearchbase.ui new file mode 100644 index 0000000..2792906 --- /dev/null +++ b/plugins/livejournal/journalsearchbase.ui @@ -0,0 +1,55 @@ + + + JournalSearchBase + + + + 0 + 0 + 212 + 355 + + + + Form1 + + + + 6 + + + 0 + + + + + Add community + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + diff --git a/plugins/livejournal/livejournal.cpp b/plugins/livejournal/livejournal.cpp new file mode 100644 index 0000000..3362ba4 --- /dev/null +++ b/plugins/livejournal/livejournal.cpp @@ -0,0 +1,1492 @@ +/*************************************************************************** + livejournal.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include +#include +#include +#include +#include + + +#include + +#include "clientmanager.h" +#include "fetch.h" +#include "html.h" +#include "log.h" +#include "unquot.h" +#include "core.h" + + +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" + +#include "livejournal.h" +#include "livejournalcfg.h" +#include "msgjournal.h" +#include "journalsearch.h" + +using namespace std; +using namespace SIM; + +Plugin *createLiveJournalPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new LiveJournalPlugin(base); + return plugin; +} + +static PluginInfo info = + { + NULL, + NULL, + VERSION, + createLiveJournalPlugin, + PLUGIN_PROTOCOL + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +static DataDef journalMessageData[] = + { + { "Subject", DATA_UTF, 1, 0 }, + { "Private", DATA_ULONG, 1, 0 }, + { "Time", DATA_ULONG, 1, 0 }, + { "ItemID", DATA_ULONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // oldID + { "Mood", DATA_ULONG, 1, 0 }, + { "Comments", DATA_ULONG, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +JournalMessage::JournalMessage(Buffer *cfg) + : Message(MessageJournal, cfg) +{ + load_data(journalMessageData, &data, cfg); +} + +JournalMessage::~JournalMessage() +{ + free_data(journalMessageData, &data); +} + +QByteArray JournalMessage::save() +{ + QByteArray cfg = Message::save(); + QByteArray my_cfg = save_data(journalMessageData, &data); + if (!my_cfg.isEmpty()){ + if (!cfg.isEmpty()) + cfg += "\n"; + cfg += my_cfg; + } + return cfg; +} + +QString JournalMessage::presentation() +{ + QString subj = getSubject(); + QString res; + if (!subj.isEmpty()) + res = i18n("

    Subject: %1

    ") .arg(subj); + res += Message::presentation(); + return res; +} + +#if 0 +i18n("LiveJournal post", "%n LiveJournal posts", 1); +i18n("Friends updated", "Friends updated %n", 1); +#endif + +static Message *createJournalMessage(Buffer *cfg) +{ + return new JournalMessage(cfg); +} + +static QObject* generateJournalMessage(MsgEdit *w, Message *msg) +{ + return new MsgJournal(w, msg); +} + +static CommandDef journalMessageCommands[] = + { + CommandDef ( + CmdDeleteJournalMessage, + I18N_NOOP("&Remove from journal"), + "remove", + QString::null, + QString::null, + ToolBarMsgEdit, + 0x1080, + MenuMessage, + 0, + 0, + COMMAND_DEFAULT, + NULL, + QString::null + ), + CommandDef () + }; + +static MessageDef defJournalMessage = + { + NULL, + journalMessageCommands, + MESSAGE_SENDONLY, + "LiveJournal post", + "%n LiveJournal posts", + createJournalMessage, + generateJournalMessage, + NULL + }; + +static MessageDef defWWWJournalMessage = + { + NULL, + NULL, + MESSAGE_SENDONLY | MESSAGE_SILENT, + NULL, + NULL, + createJournalMessage, + NULL, + NULL + }; + +static Message *createUpdatedMessage(Buffer *cfg) +{ + return new Message(MessageUpdated, cfg); +} + +static MessageDef defUpdatedMessage = + { + NULL, + NULL, + MESSAGE_SYSTEM, + "Friends updated", + "Friends updated %n", + createUpdatedMessage, + NULL, + NULL + }; + +unsigned LiveJournalPlugin::MenuCount = 0; + +LiveJournalPlugin::LiveJournalPlugin(unsigned base) + : Plugin(base) +{ + m_protocol = new LiveJournalProtocol(this); + + EventMenu(MenuWeb, EventMenu::eAdd).process(); + + Command cmd; + cmd->id = CmdMenuWeb; + cmd->text = "_"; + cmd->menu_id = MenuWeb; + cmd->menu_grp = 0x1000; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); + + cmd->id = MessageJournal; + cmd->text = I18N_NOOP("LiveJournal &post"); + cmd->icon = "LiveJournal"; + cmd->accel = "Ctrl+P"; + cmd->menu_grp = 0x3080; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defJournalMessage; + EventCreateMessageType(cmd).process(); + + cmd->id = CmdMenuWeb; + cmd->text = I18N_NOOP("LiveJournal &WWW"); + cmd->icon = QString::null; + cmd->accel = QString::null; + cmd->menu_grp = 0x3090; + cmd->popup_id = MenuWeb; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defWWWJournalMessage; + EventCreateMessageType(cmd).process(); + + cmd->id = MessageUpdated; + cmd->text = I18N_NOOP("Friends updated"); + cmd->icon = "LiveJournal_upd"; + cmd->accel = QString::null; + cmd->menu_grp = 0; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defUpdatedMessage; + EventCreateMessageType(cmd).process(); +} + +LiveJournalPlugin::~LiveJournalPlugin() +{ + EventMenu(MenuWeb, EventMenu::eRemove).process(); + + EventRemoveMessageType(MessageJournal).process(); + EventRemoveMessageType(CmdMenuWeb).process(); + EventRemoveMessageType(MessageUpdated).process(); + + delete m_protocol; +} + +LiveJournalProtocol::LiveJournalProtocol(Plugin *plugin) + : Protocol(plugin) +{ +} + +LiveJournalProtocol::~LiveJournalProtocol() +{ +} + +ClientPtr LiveJournalProtocol::createClient(Buffer *cfg) +{ + ClientPtr lj = ClientPtr(new LiveJournalClient(this, cfg)); + getClientManager()->addClient(lj); + return lj; +} + +static CommandDef livejournal_descr = + CommandDef ( + 0, + I18N_NOOP("LiveJournal"), + "LiveJournal", + QString::null, + "http://www.livejournal.com/lostinfo.bml", + 0, + 0, + 0, + 0, + 0, + PROTOCOL_NOSMS | PROTOCOL_NOPROXY, + NULL, + QString::null + ); + +const CommandDef *LiveJournalProtocol::description() +{ + return &livejournal_descr; +} + +static CommandDef livejournal_status_list[] = + { + CommandDef ( + STATUS_ONLINE, + I18N_NOOP("Online"), + "LiveJournal_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_OFFLINE, + I18N_NOOP("Offline"), + "LiveJournal_offline", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef () + }; + +const CommandDef *LiveJournalProtocol::statusList() +{ + return livejournal_status_list; +} + +static DataDef liveJournalUserData[] = + { + { "", DATA_ULONG, 1, DATA(5) }, // Sign + { "LastSend", DATA_ULONG, 1, 0 }, + { "User", DATA_UTF, 1, 0 }, + { "Shared", DATA_BOOL, 1, 0 }, + { "", DATA_BOOL, 1, 0 }, // bChecked + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +/* + char *Server; + char *URL; + unsigned Port; + unsigned Interval; +*/ + +static DataDef liveJournalClientData[] = + { + { "Server", DATA_STRING, 1, "www.livejournal.com" }, + { "URL", DATA_STRING, 1, "/interface/flat" }, + { "Port", DATA_ULONG, 1, DATA(80) }, + { "Interval", DATA_ULONG, 1, DATA(5) }, + { "Mood", DATA_STRLIST, 1, 0 }, + { "Moods", DATA_ULONG, 1, 0 }, + { "Menu", DATA_STRLIST, 1, 0 }, + { "MenuURL", DATA_STRLIST, 1, 0 }, + { "FastServer", DATA_BOOL, 1, 0 }, + { "UseFormatting", DATA_BOOL, 1, 0 }, + { "UseSignature", DATA_BOOL, 1, DATA(1) }, + { "Signature", DATA_UTF, 1, 0 }, + { "", DATA_STRING, 1, 0 }, // LastUpdate + { "", DATA_STRUCT, sizeof(LiveJournalUserData) / sizeof(Data), DATA(liveJournalUserData) }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +const DataDef *LiveJournalProtocol::userDataDef() +{ + return liveJournalUserData; +} + +LiveJournalClient::LiveJournalClient(Protocol *proto, Buffer *cfg) + : TCPClient(proto, cfg) +{ + load_data(liveJournalClientData, &data, cfg); + m_request = NULL; + m_timer = new QTimer(this); +} + +LiveJournalClient::~LiveJournalClient() +{ + if (m_request) + delete m_request; + free_data(liveJournalClientData, &data); +} + +QByteArray LiveJournalClient::getConfig() +{ + QByteArray cfg = TCPClient::getConfig(); + QByteArray my_cfg = save_data(liveJournalClientData, &data); + if (!my_cfg.isEmpty()){ + if (!cfg.isEmpty()) + cfg += "\n"; + cfg += my_cfg; + } + return cfg; +} + +class MessageRequest : public LiveJournalRequest +{ +public: + MessageRequest(LiveJournalClient *client, JournalMessage *msg, const QString &journal); + ~MessageRequest(); +protected: + void result(const QString &key, const QString &value); + JournalMessage *m_msg; + QString m_err; + unsigned m_id; + bool m_bResult; + bool m_bEdit; +}; + +class BRParser : public HTMLParser +{ +public: + BRParser(unsigned color); + QString m_str; + void parse(const QString&); +protected: + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &options); + virtual void tag_end(const QString &tag); + virtual void add_color(); + bool m_bSkip; + unsigned m_color; +}; + +BRParser::BRParser(unsigned color) +{ + m_color = color; + m_bSkip = false; + add_color(); +} + +void BRParser::parse(const QString &str) +{ + HTMLParser::parse(str); + m_str += "
    "; +} + +void BRParser::text(const QString &text) +{ + if (m_bSkip) + return; + QString s = text; + s = s.remove('\r'); + s = s.remove('\n'); + m_str += s; +} + +void BRParser::tag_start(const QString &tag, const list &attrs) +{ + if (m_bSkip) + return; + if (tag == "body"){ + m_str = ""; + add_color(); + return; + } + if (tag == "p"){ + return; + } + if (tag == "br"){ + m_str += "
    \n"; + add_color(); + return; + } + m_str += "<"; + m_str += tag; + for (list::const_iterator it = attrs.begin(); it != attrs.end(); ++it){ + QString name = *it; + ++it; + QString value = *it; + m_str += " "; + m_str += name; + if (!value.isEmpty()){ + m_str += "=\'"; + m_str += quoteString(value); + m_str += "\'"; + } + } + m_str += ">"; +} + +void BRParser::tag_end(const QString &tag) +{ + if (m_bSkip) + return; + if (tag == "body"){ + m_bSkip = true; + return; + } + if (tag == "p"){ + m_str += "
    \n"; + add_color(); + return; + } + m_str += ""; +} + +void BRParser::add_color() +{ + QString s; + s.sprintf("", m_color & 0xFFFFFF); + m_str += s; +} + +MessageRequest::MessageRequest(LiveJournalClient *client, JournalMessage *msg, const QString &journal) + : LiveJournalRequest(client, msg->getID() ? "editevent" : "postevent") +{ + m_msg = msg; + m_bEdit = (msg->getID() != 0); + m_bResult = false; + QString text; + if (msg->getRichText().isEmpty()){ + text = QString::null; + }else{ + // if (msg->getFlags() & MESSAGE_RICHTEXT){ + if (client->getUseFormatting()){ + BRParser parser(msg->getBackground()); + parser.parse(msg->getRichText()); + text = parser.m_str; + }else{ + text = msg->getPlainText(); + } + addParam("subject", msg->getSubject()); + } + if (!m_bEdit && client->getUseSignature()) + text += "\n" + client->getSignatureText(); + addParam("event", text); + addParam("lineendings", "unix"); + if (msg->getID()) + addParam("itemid", QString::number(msg->getID())); + if (msg->getTime() == 0) + msg->setTime(QDateTime::currentDateTime().toTime_t()); + QDateTime now = QDateTime::fromTime_t( msg->getTime() ); + now = now.toLocalTime(); + addParam("year", QString::number(now.date().year() + 1900)); + addParam("mon", QString::number(now.date().month() + 1)); + addParam("day", QString::number(now.date().day())); + addParam("hour", QString::number(now.time().hour())); + addParam("min", QString::number(now.time().minute())); + if (msg->getPrivate()){ + switch (msg->getPrivate()){ + case 0: + addParam("security", "public"); + break; + case 1: + addParam("security", "usemask"); + addParam("allowmask", "0"); + break; + case 2: + addParam("security", "private"); + break; + } + } + if (msg->getMood()) + addParam("prop_current_moodid", QString::number(msg->getMood())); + if (!journal.isEmpty()) + addParam("usejournal", journal); + if (msg->getComments() == COMMENT_NO_MAIL){ + addParam("prop%5Fopt%5Fnoemail", "1"); + }else if (msg->getComments() == COMMENT_DISABLE){ + addParam("prop%5Fopt%5Fnocomments", "1"); + } +} + +MessageRequest::~MessageRequest() +{ + if (m_bResult){ + if ((m_msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + if (m_bEdit){ + m_msg->setId(m_msg->getOldID()); + if (m_msg->getRichText().isEmpty()){ + EventDeleteMessage(m_msg).process(); + }else{ + EventRewriteMessage(m_msg).process(); + } + }else{ + m_msg->setID(m_id); + EventSent(m_msg).process(); + } + } + }else{ + if (m_err.isEmpty()) + m_err = I18N_NOOP("Posting failed"); + m_msg->setError(m_err); + } + EventMessageSent(m_msg).process(); + delete m_msg; +} + +void MessageRequest::result(const QString &key, const QString &value) +{ + if (key == "errmsg") + m_err = value; + if (key == "success" && value == "OK") + m_bResult = true; + if (key == "itemid") + m_id = value.toUInt(); +} + +bool LiveJournalClient::send(Message *msg, void *_data) +{ + if (!canSend(msg->type(), _data)) + return false; + LiveJournalUserData *data = toLiveJournalUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString journal; + if (data->User.str() != this->data.owner.User.str()) + journal = data->User.str(); + m_requests.push_back(new MessageRequest(this, static_cast(msg), journal)); + msg->setClient(dataName(_data)); + send(); + return true; +} + +bool LiveJournalClient::canSend(unsigned type, void *_data) +{ + if ((_data == NULL) || (((clientData*)_data)->Sign.toULong() != LIVEJOURNAL_SIGN)) + return false; + if (type == MessageJournal){ + if (getState() != Connected) + return false; + return true; + } + if (type == CmdMenuWeb){ + LiveJournalUserData *data = toLiveJournalUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + if (data->User.str() != this->data.owner.User.str()) + return false; + return true; + } + return false; +} + +void LiveJournalClient::setupContact(Contact*, void*) +{ +} + +bool LiveJournalClient::createData(clientData*&, Contact*) +{ + return false; +} + +bool LiveJournalClient::isMyData(clientData *&data, Contact*&) +{ + if (data->Sign.toULong() != LIVEJOURNAL_SIGN) + return false; + return false; +} + +QString LiveJournalClient::dataName(void *data) +{ + QString res = name(); + res += "."; + res += toLiveJournalUserData((SIM::clientData*)data)->User.str(); // FIXME unsafe type conversion + return res; +} + +QString LiveJournalClient::name() +{ + return "LiveJournal." + data.owner.User.str(); +} + +QWidget *LiveJournalClient::setupWnd() +{ + return new LiveJournalCfg(NULL, this, true); +} + +void LiveJournalClient::socketConnect() +{ + connect_ready(); + setStatus(STATUS_ONLINE); +} + +const unsigned MAIN_INFO = 1; + +static CommandDef cfgLiveJournalWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "LiveJournal", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef () + }; + +CommandDef *LiveJournalClient::configWindows() +{ + QString title =name(); + int n = title.indexOf('.'); + if (n > 0) + title = title.left(n) + ' ' + title.mid(n + 1); + cfgLiveJournalWnd[0].text_wrk = title; + return cfgLiveJournalWnd; +} + +QWidget *LiveJournalClient::configWindow(QWidget *parent, unsigned id) +{ + if (id == MAIN_INFO) + return new LiveJournalCfg(parent, this, false); + return NULL; +} + +bool LiveJournalClient::add(const QString &name) +{ + Contact *contact; + LiveJournalUserData *data = findContact(name, contact, false); + if (data) + return false; + findContact(name, contact); + return true; +} + +LiveJournalUserData *LiveJournalClient::findContact(const QString &user, Contact *&contact, bool bCreate, bool bJoin) +{ + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + LiveJournalUserData *data; + ClientDataIterator itc(contact->clientData, this); + while ((data = toLiveJournalUserData(++itc)) != NULL){ + if (data->User.str() == user) + return data; + } + } + if (!bCreate) + return NULL; + if (bJoin){ + it.reset(); + while ((contact = ++it) != NULL){ + if (contact->getName().toLower() == user.toLower()) + break;; + } + } + if (contact == NULL){ + contact = getContacts()->contact(0, true); + contact->setName(user); + } + LiveJournalUserData *data = toLiveJournalUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + data->User.str() = user; + EventContact e(contact, EventContact::eChanged); + e.process(); + return data; +} + +void LiveJournalClient::auth_ok() +{ + m_status = STATUS_ONLINE; + setState(Connected); + setPreviousPassword(QString::null); + statusChanged(); + list forDelete; + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + LiveJournalUserData *data; + ClientDataIterator itc(contact->clientData, this); + while ((data = toLiveJournalUserData(++itc)) != NULL){ + if (!data->Shared.toBool()) + continue; + if (data->bChecked.toBool()) + continue; + contact->clientData.freeData(data); + if (contact->clientData.size() == 0) + forDelete.push_back(contact); + break; + } + } + for (list::iterator itc = forDelete.begin(); itc != forDelete.end(); ++itc) + delete (*itc); + QTimer::singleShot(0, this, SLOT(timeout())); +} + +void LiveJournalClient::statusChanged() +{ + Contact *contact = NULL; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + ClientDataIterator itc(contact->clientData, this); + if ((++itc) != NULL){ + EventContact e(contact, EventContact::eChanged); + e.process(); + } + } + findContact(data.owner.User.str(), contact); +} + +QString LiveJournalClient::getSignatureText() +{ + QString res = getSignature(); + if (res.isEmpty()) + res = i18n(""); + return res; +} + +static void addIcon(QSet *s, const QString &icon, const QString &statusIcon) +{ + if (!s || statusIcon == icon) + return; + s->insert(icon); +} + +void LiveJournalClient::contactInfo(void*, unsigned long &curStatus, unsigned&, QString &statusIcon, QSet *icons) +{ + unsigned long status = STATUS_OFFLINE; + const char *dicon = "LiveJournal_offline"; + if ((getState() == Connected) && (m_status != STATUS_OFFLINE)){ + status = STATUS_ONLINE; + dicon = "LiveJournal_online"; + } + if (status > curStatus){ + curStatus = status; + if (!statusIcon.isEmpty() && icons){ + icons->insert(statusIcon); + } + statusIcon = dicon; + }else{ + if (!statusIcon.isEmpty()){ + addIcon(icons, dicon, statusIcon); + }else{ + statusIcon = dicon; + } + } +} + +struct Mood +{ + unsigned id; + QString name; +}; + +class LoginRequest : public LiveJournalRequest +{ +public: + LoginRequest(LiveJournalClient *client); + ~LoginRequest(); +protected: + void result(const QString &key, const QString &value); + bool m_bOK; + bool m_bResult; + vector m_moods; + QString m_err; +}; + +LoginRequest::LoginRequest(LiveJournalClient *client) + : LiveJournalRequest(client, "login") +{ + m_bOK = false; + m_bResult = false; +} + +LoginRequest::~LoginRequest() +{ + if (m_bOK){ + for (unsigned i = 0; i < m_moods.size(); i++){ + if (m_moods[i].name.isEmpty()) + continue; + if (m_client->getMoods() < m_moods[i].id) + m_client->setMoods(m_moods[i].id); + m_client->setMood(i, m_moods[i].name); + } + m_client->auth_ok(); + }else{ + if (!m_bResult) + return; + if (m_err.isEmpty()) + m_err = I18N_NOOP("Login failed"); + m_client->auth_fail(m_err); + } + EventClientChanged(m_client).process(); +} + +void LoginRequest::result(const QString &key, const QString &value) +{ + m_bResult = true; + if (key == "success" && value == "OK"){ + m_bOK = true; + return; + } + if (key == "errmsg"){ + m_err = value; + return; + } + QString k = key; + QString prefix = getToken(k, '_'); + if (prefix == "mood"){ + prefix = getToken(k, '_'); + unsigned id = prefix.toUInt(); + if (id == 0) + return; + while (m_moods.size() <= id){ + Mood m; + m_moods.push_back(m); + } + if (k == "id") + m_moods[id].id = value.toUInt(); + if (k == "name") + m_moods[id].name = value; + } + if (prefix == "menu"){ + prefix = getToken(k, '_'); + unsigned menu_id = prefix.toUInt(); + prefix = getToken(k, '_'); + unsigned item_id = prefix.toUInt(); + if (item_id == 0) + return; + unsigned id = menu_id * 0x100 + item_id; + if (k == "text") + m_client->setMenu(id, value); + if (k == "url") + m_client->setMenuUrl(id, value); + if (k == "sub"){ + QString v = "@"; + v += value; + m_client->setMenuUrl(id, v); + } + } + if (prefix == "access"){ + if (k.toULong() == 0) + return; + Contact *contact; + LiveJournalUserData *data = m_client->findContact(value, contact); + if (data){ + data->bChecked.asBool() = true; + data->Shared.asBool() = true; + } + } +} + +void LiveJournalClient::setStatus(unsigned status) +{ + if (status == STATUS_OFFLINE) + return; + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + LiveJournalUserData *data; + ClientDataIterator itc(contact->clientData, this); + while ((data = toLiveJournalUserData(++itc)) != NULL){ + data->bChecked.asBool() = false; + if (data->User.str() == this->data.owner.User.str()) + data->bChecked.asBool() = true; + } + } + LiveJournalRequest *req = new LoginRequest(this); + QString version; +#ifdef WIN32 + version = "Win32"; +#else +#ifdef Q_OS_MAC + version = "MacOS"; +#else + version = "Qt"; +#endif +#endif + version += "-" PACKAGE "/" VERSION; + req->addParam("clientversion", version); + req->addParam("getmoods", QString::number(getMoods())); + req->addParam("getmenus", "1"); + m_requests.push_back(req); + send(); +} + +void LiveJournalClient::disconnected() +{ + m_timer->stop(); + statusChanged(); +} + +void LiveJournalClient::packet_ready() +{ +} + +void LiveJournalClient::auth_fail(const QString &err) +{ + m_reconnect = NO_RECONNECT; + error_state(err, AuthError); +} + +QWidget *LiveJournalClient::searchWindow(QWidget *parent) +{ + return new JournalSearch(this, parent); +} + +bool LiveJournalClient::done(unsigned code, Buffer &data, const QString &) +{ + if (code == 200){ + m_request->result(&data); + }else{ + QString err = "Fetch error "; + err += QString::number(code); + error_state(err, 0); + statusChanged(); + } + delete m_request; + m_request = NULL; + send(); + return false; +} + +bool LiveJournalClient::processEvent(Event *e) +{ + TCPClient::processEvent(e); + if (e->type() == eEventOpenMessage){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if (msg->type() != MessageUpdated) + return false; + if (dataName(&data.owner) != msg->client()) + return false; + EventMessageDeleted(msg).process(); + QString url = "http://"; + url += getServer(); + if (getPort() != 80){ + url += ":"; + url += QString::number(getPort()); + } + url += '/'; + EventGoURL(url).process(); + if (getState() == Connected) { + m_timer->setSingleShot(true); + m_timer->start(getInterval() * 60 * 1000); + } + return true; + } + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->id == CmdDeleteJournalMessage){ + Message *msg = (Message*)(cmd->param); + Contact *contact = getContacts()->contact(msg->contact()); + if (contact == NULL) + return false; + LiveJournalUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toLiveJournalUserData(++it)) != NULL){ + if (dataName(data) == msg->client()){ + Buffer cfg; + cfg = "[Title]\n" + msg->save(); + cfg.setWritePos(0); + cfg.getSection(); + JournalMessage *m = new JournalMessage(&cfg); + m->setContact(msg->contact()); + m->setOldID(msg->id()); + m->setText(""); + if (!send(m, data)) + delete m; + return true; + } + } + return false; + } + unsigned menu_id = cmd->menu_id - MenuWeb; + if (menu_id > LiveJournalPlugin::MenuCount) + return false; + unsigned item_id = cmd->id - CmdMenuWeb; + if ((item_id == 0) || (item_id >= 0x100)) + return false; + QString url = getMenuUrl(menu_id * 0x100 + item_id); + if (url.isEmpty()) + return false; + EventGoURL eUrl(url); + eUrl.process(); + return true; + } else + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->id == CmdMenuWeb){ + unsigned menu_id = cmd->menu_id - MenuWeb; + if (menu_id > LiveJournalPlugin::MenuCount) + return false; + unsigned nItems = 0; + unsigned list_id = menu_id * 0x100 + 1; + for (;;){ + if (getMenu(list_id).isEmpty()) + break; + nItems++; + list_id++; + } + if (nItems == 0) + return false; + CommandDef *cmds = new CommandDef[nItems + 1]; + list_id = menu_id * 0x100 + 1; + for (unsigned i = 0;; i++){ + QString text = getMenu(list_id); + if (text.isEmpty()) + break; + cmds[i].text = "_"; + if (text != "-"){ + cmds[i].id = CmdMenuWeb + i + 1; + cmds[i].text = "_"; + cmds[i].text_wrk = i18n(text); + QString url = getMenuUrl(list_id); + if (url.startsWith("@")){ + url = url.mid(1); + unsigned nSub = url.toUInt(); + while (nSub > LiveJournalPlugin::MenuCount){ + unsigned long menu_id = MenuWeb + (++LiveJournalPlugin::MenuCount); + EventMenu(menu_id, EventMenu::eAdd).process(); + CommandDef c; + c.id = CmdMenuWeb; + c.text = "_"; + c.menu_id = menu_id; + c.menu_grp = 0x1000; + c.flags = COMMAND_CHECK_STATE; + EventCommandCreate(&c).process(); + } + cmds[i].popup_id = MenuWeb + nSub; + } + }else{ + cmds[i].id = 0; + } + list_id++; + } + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + } + return false; +} + +void LiveJournalClient::send() +{ + if ((m_requests.size() == 0) || m_request) + return; + m_request = m_requests.front(); + m_requests.erase(m_requests.begin()); + QString url; + url = "http://"; + url += getServer(); + if (getPort() != 80){ + url += ":"; + url += QString::number(getPort()); + } + url += getURL(); + QString headers = "Content-Type: application/x-www-form-urlencoded"; + if (getFastServer()) + headers += "\nCookie: ljfastserver=1"; + fetch(url, headers, m_request->m_buffer); + m_request->m_buffer = NULL; +} + +bool LiveJournalClient::error_state(const QString &err, unsigned code) +{ + return TCPClient::error_state(err, code); +} + +class CheckFriendsRequest : public LiveJournalRequest +{ +public: + CheckFriendsRequest(LiveJournalClient *client); + ~CheckFriendsRequest(); +protected: + void result(const QString &key, const QString &value); + bool m_bOK; + bool m_bChanged; + unsigned m_interval; + QString m_err; +}; + +CheckFriendsRequest::CheckFriendsRequest(LiveJournalClient *client) + : LiveJournalRequest(client, "checkfriends") +{ + m_bOK = false; + m_bChanged = false; + m_interval = 0; + addParam("lastupdate", client->getLastUpdate()); +} + +void LiveJournalClient::messageUpdated() +{ + Contact *contact; + LiveJournalUserData *data = findContact(this->data.owner.User.str(), contact); + if (data == NULL) + return; + Message *msg = new Message(MessageUpdated); + msg->setContact(contact->id()); + msg->setClient(dataName(data)); + msg->setFlags(MESSAGE_TEMP | MESSAGE_NOVIEW); + EventMessageReceived e(msg); + if (!e.process()) + delete msg; +} + +CheckFriendsRequest::~CheckFriendsRequest() +{ + if (m_bChanged){ + m_client->messageUpdated(); + return; + } + if (m_bOK){ + m_client->m_timer->setSingleShot( true ); + m_client->m_timer->start( m_interval ); + return; + } + m_client->error_state(m_err, 0); +} + +void CheckFriendsRequest::result(const QString &key, const QString &value) +{ + if (key == "success" && value == "OK"){ + m_bOK = true; + return; + } + if (key == "lastupdate"){ + m_client->setLastUpdate(value); + return; + } + if (key == "new"){ + if (value.toULong()) + m_bChanged = true; + return; + } + if (key == "interval"){ + m_interval = value.toUInt(); + return; + } + if (key == "errmsg"){ + m_err = value; + return; + } +} + +void LiveJournalClient::timeout() +{ + if (getState() != Connected) + return; + m_timer->stop(); + m_requests.push_back(new CheckFriendsRequest(this)); + send(); +} + + +LiveJournalUserData* LiveJournalClient::toLiveJournalUserData(SIM::clientData * data) +{ + // This function is used to more safely preform type conversion from SIM::clientData* into LiveJournalUserData* + // It will at least warn if the content of the structure is not LiveJournalUserData* + // Brave wariors may uncomment abort() function call to know for sure about wrong conversion ;-) + if (! data) return NULL; + if (data->Sign.asULong() != LIVEJOURNAL_SIGN) + { + QString Signs[] = { + "Unknown(0)" , // 0x0000 + "ICQ_SIGN", // 0x0001 + "JABBER_SIGN", // 0x0002 + "MSN_SIGN", // 0x0003 + "Unknown(4)" // 0x0004 + "LIVEJOURNAL_SIGN",// 0x0005 + "SMS_SIGN", // 0x0006 + "Unknown(7)", // 0x0007 + "Unknown(8)", // 0x0008 + "YAHOO_SIGN" // 0x0009 + }; + QString Sign; + if (data->Sign.toULong()<=9) // is always >=0 as it is unsigned int + Sign = Signs[data->Sign.toULong()]; + else + Sign = QString("Unknown(%1)").arg(Sign.toULong()); + + log(L_ERROR, + "ATTENTION!! Unsafly converting %s user data into LIVEJOURNAL_SIGN", + qPrintable(Sign)); +// abort(); + } + return (LiveJournalUserData*) data; +} + +LiveJournalRequest::LiveJournalRequest(LiveJournalClient *client, const char *mode) +{ + m_client = client; + m_buffer = new Buffer; + addParam("mode", mode); + addParam("ver", "1"); + if (!client->data.owner.User.str().isEmpty()) + addParam("user", client->data.owner.User.str()); + QByteArray pass = QCryptographicHash::hash(client->getPassword().toUtf8(), QCryptographicHash::Md5); + QString hpass; + for (int i = 0; i < pass.size(); i++){ + char b[5]; + sprintf(b, "%02x", pass[(int)i] & 0xFF); + hpass += b; + } + addParam("hpassword", hpass); +} + +LiveJournalRequest::~LiveJournalRequest() +{ + if (m_buffer) + delete m_buffer; +} + +void LiveJournalRequest::addParam(const QString &key, const QString &value) +{ + if (m_buffer->size()) + m_buffer->pack("&", 1); + m_buffer->pack(key.toUtf8(), key.toUtf8().length()); + m_buffer->pack("=", 1); + QByteArray cstr = value.toUtf8(); + for (int i = 0; i < cstr.length(); i++){ + char c = cstr[(int)i]; + if (((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')) || ((c >= '0') && (c <= '9')) || + (c == '.') || (c == '-') || (c == '/') || (c == '_')){ + m_buffer->pack(&c, 1); + }else{ + char buf[4]; + sprintf(buf, "%%%02X", c & 0xFF); + m_buffer->pack(buf, 3); + } + } +} + +void LiveJournalRequest::result(Buffer *b) +{ + for (;;){ + QByteArray key; + QByteArray value; + if (!getLine(b, key) || !getLine(b, value)) + break; + log(L_DEBUG, "Result: %s=%s", key.data(), value.data()); + result(QString::fromUtf8(key), QString::fromUtf8(value)); + } +} + +bool LiveJournalRequest::getLine(Buffer *b, QByteArray &line) +{ + if (b == NULL) + return false; + if (!b->scan("\n", line)) + return false; + if (line.length() && (line[(int)line.length() - 1] == '\r')) + line = line.left(line.length() - 1); + return true; +} + +#if 0 +I18N_NOOP("Invalid username") + +I18N_NOOP("aggravated") +I18N_NOOP("angry") +I18N_NOOP("annoyed") +I18N_NOOP("anxious") +I18N_NOOP("bored") +I18N_NOOP("confused") +I18N_NOOP("crappy") +I18N_NOOP("cranky") +I18N_NOOP("depressed") +I18N_NOOP("discontent") +I18N_NOOP("energetic") +I18N_NOOP("enraged") +I18N_NOOP("enthralled") +I18N_NOOP("exhausted") +I18N_NOOP("happy") +I18N_NOOP("high") +I18N_NOOP("horny") +I18N_NOOP("hungry") +I18N_NOOP("infuriated") +I18N_NOOP("irate") +I18N_NOOP("jubilant") +I18N_NOOP("lonely") +I18N_NOOP("moody") +I18N_NOOP("pissed off") +I18N_NOOP("sad") +I18N_NOOP("satisfied") +I18N_NOOP("sore") +I18N_NOOP("stressed") +I18N_NOOP("thirsty") +I18N_NOOP("thoughtful") +I18N_NOOP("tired") +I18N_NOOP("touched") +I18N_NOOP("lazy") +I18N_NOOP("drunk") +I18N_NOOP("ditzy") +I18N_NOOP("mischievous") +I18N_NOOP("morose") +I18N_NOOP("gloomy") +I18N_NOOP("melancholy") +I18N_NOOP("drained") +I18N_NOOP("excited") +I18N_NOOP("relieved") +I18N_NOOP("hopeful") +I18N_NOOP("amused") +I18N_NOOP("determined") +I18N_NOOP("scared") +I18N_NOOP("frustrated") +I18N_NOOP("indescribable") +I18N_NOOP("sleepy") +I18N_NOOP("groggy") +I18N_NOOP("hyper") +I18N_NOOP("relaxed") +I18N_NOOP("restless") +I18N_NOOP("disappointed") +I18N_NOOP("curious") +I18N_NOOP("mellow") +I18N_NOOP("peaceful") +I18N_NOOP("bouncy") +I18N_NOOP("nostalgic") +I18N_NOOP("okay") +I18N_NOOP("rejuvenated") +I18N_NOOP("complacent") +I18N_NOOP("content") +I18N_NOOP("indifferent") +I18N_NOOP("silly") +I18N_NOOP("flirty") +I18N_NOOP("calm") +I18N_NOOP("refreshed") +I18N_NOOP("optimistic") +I18N_NOOP("pessimistic") +I18N_NOOP("giggly") +I18N_NOOP("pensive") +I18N_NOOP("uncomfortable") +I18N_NOOP("lethargic") +I18N_NOOP("listless") +I18N_NOOP("recumbent") +I18N_NOOP("exanimate") +I18N_NOOP("embarrassed") +I18N_NOOP("envious") +I18N_NOOP("sympathetic") +I18N_NOOP("sick") +I18N_NOOP("hot") +I18N_NOOP("cold") +I18N_NOOP("worried") +I18N_NOOP("loved") +I18N_NOOP("awake") +I18N_NOOP("working") +I18N_NOOP("productive") +I18N_NOOP("accomplished") +I18N_NOOP("busy") +I18N_NOOP("full") +I18N_NOOP("grumpy") +I18N_NOOP("weird") +I18N_NOOP("nauseated") +I18N_NOOP("ecstatic") +I18N_NOOP("chipper") +I18N_NOOP("rushed") +I18N_NOOP("contemplative") +I18N_NOOP("nerdy") +I18N_NOOP("geeky") +I18N_NOOP("cynical") +I18N_NOOP("quixotic") +I18N_NOOP("crazy") +I18N_NOOP("creative") +I18N_NOOP("artistic") +I18N_NOOP("pleased") +I18N_NOOP("bitchy") +I18N_NOOP("guilty") +I18N_NOOP("irritated") +I18N_NOOP("blank") +I18N_NOOP("apathetic") +I18N_NOOP("dorky") +I18N_NOOP("impressed") +I18N_NOOP("naughty") +I18N_NOOP("predatory") +I18N_NOOP("dirty") +I18N_NOOP("giddy") +I18N_NOOP("surprised") +I18N_NOOP("shocked") +I18N_NOOP("rejected") +I18N_NOOP("numb") +I18N_NOOP("cheerful") +I18N_NOOP("good") +I18N_NOOP("distressed") +I18N_NOOP("intimidated") +I18N_NOOP("crushed") +I18N_NOOP("devious") +I18N_NOOP("thankful") +I18N_NOOP("grateful") +I18N_NOOP("jealous") +I18N_NOOP("nervous") + +I18N_NOOP("Recent Entries") +I18N_NOOP("Calendar View") +I18N_NOOP("Friends View") +I18N_NOOP("Your Profile") +I18N_NOOP("Your To-Do List") +I18N_NOOP("Change Settings") +I18N_NOOP("Support") +I18N_NOOP("Personal Info") +I18N_NOOP("Customize Journal") +I18N_NOOP("Journal Settings") +I18N_NOOP("Upgrade your account") + +#endif + + + diff --git a/plugins/livejournal/livejournal.h b/plugins/livejournal/livejournal.h new file mode 100644 index 0000000..04662e7 --- /dev/null +++ b/plugins/livejournal/livejournal.h @@ -0,0 +1,196 @@ +/*************************************************************************** + livejournal.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _LIVEJOURNAL_H +#define _LIVEJOURNAL_H + +#include "buffer.h" +#include "socket/socket.h" +#include "socket/tcpclient.h" +#include "fetch.h" +#include "contacts/client.h" + +#include + +const unsigned long JournalCmdBase = 0x00070000; +const unsigned long MessageJournal = JournalCmdBase; +const unsigned long MessageUpdated = JournalCmdBase + 1; +const unsigned long CmdDeleteJournalMessage = JournalCmdBase + 2; +const unsigned long CmdMenuWeb = JournalCmdBase + 3; +const unsigned long MenuWeb = JournalCmdBase + 0x10; + +const unsigned LIVEJOURNAL_SIGN = 5; + +const unsigned COMMENT_ENABLE = 0; +const unsigned COMMENT_NO_MAIL = 1; +const unsigned COMMENT_DISABLE = 2; + +struct LiveJournalUserData : public SIM::clientData +{ + SIM::Data User; + SIM::Data Shared; + SIM::Data bChecked; +}; + +struct JournalMessageData +{ + SIM::Data Subject; + SIM::Data Private; + SIM::Data Time; + SIM::Data ID; + SIM::Data OldID; + SIM::Data Mood; + SIM::Data Comments; +}; + +class JournalMessage : public SIM::Message +{ +public: + JournalMessage(Buffer *cfg = NULL); + ~JournalMessage(); + virtual QByteArray save(); + PROP_UTF8(Subject); + PROP_ULONG(Private); + PROP_ULONG(Time); + PROP_ULONG(ID); + PROP_ULONG(OldID); + PROP_ULONG(Mood); + PROP_ULONG(Comments); +protected: + QString presentation(); + JournalMessageData data; +}; + +class LiveJournalPlugin : public SIM::Plugin +{ +public: + LiveJournalPlugin(unsigned); + virtual ~LiveJournalPlugin(); + static unsigned MenuCount; +protected: + SIM::Protocol *m_protocol; +}; + +class LiveJournalProtocol : public SIM::Protocol +{ +public: + LiveJournalProtocol(SIM::Plugin *plugin); + ~LiveJournalProtocol(); + SIM::ClientPtr createClient(Buffer *cfg); + const SIM::CommandDef *description(); + const SIM::CommandDef *statusList(); + const SIM::DataDef *userDataDef(); +}; + +struct LiveJournalClientData +{ + SIM::Data Server; + SIM::Data URL; + SIM::Data Port; + SIM::Data Interval; + SIM::Data Mood; + SIM::Data Moods; + SIM::Data Menu; + SIM::Data MenuUrl; + SIM::Data FastServer; + SIM::Data UseFormatting; + SIM::Data UseSignature; + SIM::Data Signature; + SIM::Data LastUpdate; + LiveJournalUserData owner; +}; + +class LiveJournalClient; + +class LiveJournalRequest +{ +public: + LiveJournalRequest(LiveJournalClient *client, const char *mode); + virtual ~LiveJournalRequest(); + void addParam(const QString &key, const QString &value); + void result(Buffer*); + virtual void result(const QString &key, const QString &value) = 0; +protected: + LiveJournalClient *m_client; + Buffer *m_buffer; + bool getLine(Buffer *b, QByteArray &line); + friend class LiveJournalClient; +}; + +class QTimer; + +class LiveJournalClient : public SIM::TCPClient, public FetchClient +{ + Q_OBJECT +public: + LiveJournalClient(SIM::Protocol*, Buffer *cfg); + ~LiveJournalClient(); + PROP_STR(Server); + PROP_STR(URL); + PROP_USHORT(Port); + PROP_ULONG(Interval); + PROP_STRLIST(Mood); + PROP_ULONG(Moods); + PROP_STRLIST(Menu); + PROP_STRLIST(MenuUrl); + PROP_BOOL(FastServer); + PROP_BOOL(UseFormatting); + PROP_BOOL(UseSignature); + PROP_UTF8(Signature); + PROP_STR(LastUpdate); + QString getSignatureText(); + void auth_fail(const QString &err); + void auth_ok(); + LiveJournalUserData *findContact(const QString &user, SIM::Contact *&contact, bool bCreate=true, bool bJoin=true); + QTimer *m_timer; + virtual bool error_state(const QString &err, unsigned code); + bool add(const QString &name); + LiveJournalUserData* toLiveJournalUserData(SIM::clientData * data); // More safely type conversion from generic SIM::clientData into LiveJournalUserData +public slots: + void timeout(); + void send(); + void messageUpdated(); +protected: + virtual bool done(unsigned code, Buffer &data, const QString &headers); + virtual QByteArray getConfig(); + virtual QString name(); + virtual QString dataName(void*); + virtual QWidget *setupWnd(); + virtual bool isMyData(SIM::clientData*&, SIM::Contact*&); + virtual bool createData(SIM::clientData*&, SIM::Contact*); + virtual void setupContact(SIM::Contact*, void *data); + virtual bool send(SIM::Message*, void *data); + virtual bool canSend(unsigned type, void *data); + virtual void setStatus(unsigned status); + virtual void socketConnect(); + virtual void disconnected(); + virtual void packet_ready(); + virtual bool processEvent(SIM::Event *e); + virtual void contactInfo(void*, unsigned long &curStatus, unsigned&, QString &statusIcon, QSet *icons); + QWidget *searchWindow(QWidget *parent); + SIM::CommandDef *configWindows(); + QWidget *configWindow(QWidget *parent, unsigned id); + void statusChanged(); + std::list m_requests; + LiveJournalRequest *m_request; + LiveJournalClientData data; + friend class LiveJournalCfg; + friend class LiveJournalRequest; +}; + +#endif + diff --git a/plugins/livejournal/livejournal.rc b/plugins/livejournal/livejournal.rc new file mode 100644 index 0000000..4126418 --- /dev/null +++ b/plugins/livejournal/livejournal.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,0,0,0 + PRODUCTVERSION 0,0,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "LiveJournal plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "livejournal\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "livejournal.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/livejournal/livejournal.vcproj b/plugins/livejournal/livejournal.vcproj new file mode 100644 index 0000000..da71fd8 --- /dev/null +++ b/plugins/livejournal/livejournal.vcproj @@ -0,0 +1,601 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/livejournal/livejournalcfg.cpp b/plugins/livejournal/livejournalcfg.cpp new file mode 100644 index 0000000..80793b6 --- /dev/null +++ b/plugins/livejournal/livejournalcfg.cpp @@ -0,0 +1,99 @@ +/*************************************************************************** + livejournalcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include + +#include "simgui/linklabel.h" +#include "misc.h" + +#include "livejournalcfg.h" +#include "livejournal.h" + +using namespace SIM; + +LiveJournalCfg::LiveJournalCfg(QWidget *parent, LiveJournalClient *client, bool bConfig) + : QWidget(parent) +{ + setupUi(this); + m_client = client; + m_bConfig = bConfig; + edtName->setText(client->data.owner.User.str()); + if (bConfig){ + edtPassword->setText(client->getPassword()); + lblLnk->setText(i18n("Register new user")); + lblLnk->setUrl("http://www.livejournal.com/create.bml"); + }else{ + edtName->setReadOnly(true); + edtPassword->hide(); + lblPassword->hide(); + } + edtServer->setText(client->getServer()); + edtPath->setText(client->getURL()); + edtPort->setValue(client->getPort()); + edtInterval->setValue(client->getInterval()); + chkFastServer->setChecked(client->getFastServer()); + chkUseFormatting->setChecked(client->getUseFormatting()); + chkUseSignature->setChecked(client->getUseSignature()); + edtSignature->setPlainText(client->getSignatureText()); + connect(edtName, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPassword, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(chkUseSignature, SIGNAL(toggled(bool)), this, SLOT(useSigToggled(bool))); + useSigToggled(chkUseSignature->isChecked()); + changed(""); + QTimer::singleShot(0, this, SLOT(changed())); +} + +void LiveJournalCfg::changed(const QString&) +{ + changed(); +} + +void LiveJournalCfg::changed() +{ + emit okEnabled(!edtName->text().isEmpty() && !edtPassword->text().isEmpty()); +} + +void LiveJournalCfg::apply() +{ + if (m_bConfig){ + m_client->data.owner.User.str() = edtName->text(); + m_client->setPassword(edtPassword->text()); + } + m_client->setServer(edtServer->text()); + m_client->setURL(edtPath->text()); + m_client->setPort(edtPort->text().toUShort()); + m_client->setInterval(edtInterval->text().toULong()); + m_client->setFastServer(chkFastServer->isChecked()); + m_client->setUseFormatting(chkUseFormatting->isChecked()); + m_client->setUseSignature(chkUseSignature->isChecked()); + if (edtSignature->toPlainText() != m_client->getSignatureText()) + m_client->setSignature(edtSignature->toPlainText()); +} + +void LiveJournalCfg::apply(Client*, void*) +{ +} + +void LiveJournalCfg::useSigToggled(bool value) +{ + edtSignature->setEnabled(value); +} + + diff --git a/plugins/livejournal/livejournalcfg.h b/plugins/livejournal/livejournalcfg.h new file mode 100644 index 0000000..c1a0d1c --- /dev/null +++ b/plugins/livejournal/livejournalcfg.h @@ -0,0 +1,46 @@ +/*************************************************************************** + livejournalcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _LIVEJOURNALCFG_H +#define _LIVEJOURNALCFG_H + +#include "contacts.h" + +#include "ui_livejournalcfgbase.h" + +class LiveJournalClient; + +class LiveJournalCfg : public QWidget, public Ui::LiveJournalCfgBase +{ + Q_OBJECT +public: + LiveJournalCfg(QWidget*, LiveJournalClient*, bool bConfig); +signals: + void okEnabled(bool); +public slots: + void apply(); + void apply(SIM::Client*, void*); + void changed(const QString&); + void changed(); + void useSigToggled(bool); +protected: + LiveJournalClient *m_client; + bool m_bConfig; +}; + +#endif + diff --git a/plugins/livejournal/livejournalcfgbase.ui b/plugins/livejournal/livejournalcfgbase.ui new file mode 100644 index 0000000..97cca28 --- /dev/null +++ b/plugins/livejournal/livejournalcfgbase.ui @@ -0,0 +1,301 @@ + + + LiveJournalCfgBase + + + + 0 + 0 + 322 + 280 + + + + Form1 + + + + 6 + + + 11 + + + + + + &LiveJournal + + + + 11 + + + 6 + + + + + Username: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + QLineEdit::Password + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + &Network + + + + 11 + + + 6 + + + + + + + + Server: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Path: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Port: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + 1 + + + 65535 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + &Options + + + + 6 + + + 11 + + + + + 6 + + + 0 + + + + + Check interval: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + 0 + 0 + + + + minutes + + + false + + + + + + + + + Use &fast server - only for paying customers + + + + + + + Use formatted messages + + + + + + + Add signature to all messages + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + LinkLabel + QWidget +
    simgui/linklabel.h
    +
    +
    + + +
    diff --git a/plugins/livejournal/msgjournal.cpp b/plugins/livejournal/msgjournal.cpp new file mode 100644 index 0000000..c1a7b87 --- /dev/null +++ b/plugins/livejournal/msgjournal.cpp @@ -0,0 +1,212 @@ +/*************************************************************************** + msgjournal.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msgjournal.h" +#include "livejournal.h" +#include "msgedit.h" +#include "userwnd.h" + +#include "simgui/ballonmsg.h" +#include "simgui/toolbtn.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" + +#include +#include +#include + +using namespace SIM; + +MsgJournal::MsgJournal(MsgEdit *parent, Message *msg) + : QObject(parent) +{ + m_client = msg->client(); + m_edit = parent; + m_wnd = new MsgJournalWnd(m_edit); + connect(m_wnd, SIGNAL(finished()), this, SLOT(frameDestroyed())); + m_edit->m_layout->insertWidget(0, m_wnd); + m_wnd->show(); + JournalMessage *m = static_cast(msg); + m_ID = m->getID(); + m_oldID = m->id(); + m_time = m->getTime(); + m_wnd->edtSubj->setText(m->getSubject()); + m_wnd->cmbSecurity->setCurrentIndex(m->getPrivate()); + Contact *contact = getContacts()->contact(msg->contact()); + if (contact){ + clientData *data; + ClientDataIterator it(contact->clientData); + while ((data = ++it) != NULL){ + if ((m_client.isEmpty() && (data->Sign.toULong() == LIVEJOURNAL_SIGN)) || + (m_client == it.client()->dataName(data))){ + LiveJournalClient *client = static_cast(it.client()); + for (unsigned i = 1; i < client->getMoods(); i++){ + const QString mood = client->getMood(i); + if (mood.isEmpty()) + continue; + QString s = mood; + QString ts = i18n(mood); + if (s != ts){ + s += " ("; + s += ts; + s += ")"; + } + m_wnd->cmbMood->insertItem(INT_MAX,s); + } + m_wnd->cmbMood->setCurrentIndex(static_cast(msg)->getMood()); + m_wnd->cmbMood->setMinimumSize(m_wnd->cmbMood->sizeHint()); + break; + } + } + } + m_wnd->cmbComment->setCurrentIndex(m->getComments()); + QString text = msg->getRichText(); + if (!text.isEmpty()){ + m_edit->m_edit->setText(text); + m_edit->m_edit->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); + CorePlugin *core = GET_CorePlugin(); + if ((msg->getBackground() != msg->getForeground()) && !core->property("OwnColors").toBool()){ + m_edit->m_edit->setBackground(msg->getBackground()); + m_edit->m_edit->setForeground(msg->getForeground(), true); + } + } + connect(m_edit->m_edit, SIGNAL(emptyChanged(bool)), this, SLOT(emptyChanged(bool))); + emptyChanged(m_edit->m_edit->isEmpty()); + m_edit->m_edit->setParam(m_edit); +} + +MsgJournal::~MsgJournal() +{ + if (m_wnd) + delete m_wnd; +} + +void MsgJournal::init() +{ + m_wnd->edtSubj->setFocus(); +} + +void MsgJournal::emptyChanged(bool bEmpty) +{ + Command cmd; + cmd->id = CmdSend; + cmd->flags = bEmpty ? COMMAND_DISABLED : 0; + cmd->param = m_edit; + EventCommandDisabled(cmd).process(); +} + +bool MsgJournal::processEvent(Event *e) +{ + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->param == m_edit){ + unsigned id = cmd->bar_grp; + if ((id >= MIN_INPUT_BAR_ID) && (id < MAX_INPUT_BAR_ID)){ + cmd->flags |= BTN_HIDE; + if ((cmd->id == CmdDeleteJournalMessage + CmdReceived) && m_ID) + cmd->flags &= ~BTN_HIDE; + return true; + } + switch (cmd->id){ + case CmdSend: + case CmdSendClose: + e->process(this); + cmd->flags &= ~BTN_HIDE; + return true; + case CmdTranslit: + case CmdSmile: + case CmdNextMessage: + case CmdMsgAnswer: + e->process(this); + cmd->flags |= BTN_HIDE; + return true; + } + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->param == m_edit){ + if (cmd->id == CmdSend){ + QString msgText = m_edit->m_edit->toHtml(); + if (!msgText.isEmpty()) + send(msgText); + return true; + } + if (cmd->id == CmdDeleteJournalMessage + CmdReceived){ + QWidget *w = m_edit->m_bar; + Command cmd; + cmd->id = CmdDeleteJournalMessage + CmdReceived; + cmd->param = m_edit; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *btnRemove = eWidget.widget(); + if (btnRemove) + w = btnRemove; + BalloonMsg::ask(NULL, i18n("Remove record from journal?"), w, SLOT(removeRecord(void*)), NULL, NULL, this); + return true; + } + return false; + } + } + return false; +} + +void MsgJournal::removeRecord(void*) +{ + send(QString::null); +} + +void MsgJournal::send(const QString& msgText) +{ + JournalMessage *msg = new JournalMessage; + msg->setText(msgText); + msg->setContact(m_edit->m_userWnd->id()); + msg->setClient(m_client); + msg->setFlags(MESSAGE_RICHTEXT); + msg->setID(m_ID); + msg->setOldID(m_oldID); + msg->setTime(m_time); + msg->setForeground(m_edit->m_edit->foreground().rgb() & 0xFFFFFF); + msg->setBackground(m_edit->m_edit->background().rgb() & 0xFFFFFF); + CorePlugin *core = GET_CorePlugin(); + msg->setFont(core->property("EditFont").toString()); + msg->setSubject(m_wnd->edtSubj->text()); + msg->setPrivate(m_wnd->cmbSecurity->currentIndex()); + msg->setMood(m_wnd->cmbMood->currentIndex()); + msg->setComments(m_wnd->cmbComment->currentIndex()); + + EventRealSendMessage(msg, m_edit).process(); +} + +void MsgJournal::frameDestroyed() +{ + m_wnd = NULL; +} + +MsgJournalWnd::MsgJournalWnd(QWidget *parent) + : QWidget(parent) +{ + setupUi(this); +} + +MsgJournalWnd::~MsgJournalWnd() +{ + finished(); +} + diff --git a/plugins/livejournal/msgjournal.h b/plugins/livejournal/msgjournal.h new file mode 100644 index 0000000..72273f7 --- /dev/null +++ b/plugins/livejournal/msgjournal.h @@ -0,0 +1,60 @@ +/*************************************************************************** + msgjournal.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSGJOURNAL_H +#define _MSGJOURNAL_H + +#include "event.h" + +#include "ui_msgjournalbase.h" + +class MsgEdit; + +class MsgJournalWnd : public QWidget, public Ui::MsgJournalBase +{ + Q_OBJECT +public: + MsgJournalWnd(QWidget*); + ~MsgJournalWnd(); +signals: + void finished(); +}; + +class MsgJournal : public QObject, public SIM::EventReceiver +{ + Q_OBJECT +public: + MsgJournal(MsgEdit *parent, SIM::Message *msg); + ~MsgJournal(); +protected slots: + void init(); + void frameDestroyed(); + void emptyChanged(bool bEmpty); + void removeRecord(void*); +protected: + virtual bool processEvent(SIM::Event *e); + void send(const QString&); + QString m_client; + unsigned m_ID; + unsigned m_oldID; + unsigned m_time; + MsgEdit *m_edit; + MsgJournalWnd *m_wnd; +}; + +#endif + diff --git a/plugins/livejournal/msgjournalbase.ui b/plugins/livejournal/msgjournalbase.ui new file mode 100644 index 0000000..f8b2137 --- /dev/null +++ b/plugins/livejournal/msgjournalbase.ui @@ -0,0 +1,142 @@ + + MsgJournalBase + + + + 0 + 0 + 412 + 81 + + + + + 5 + 1 + 0 + 0 + + + + Form1 + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + Subject: + + + false + + + + + + + + + + + + 0 + + + 6 + + + + + Security: + + + false + + + + + + + + Public + + + + + Friends-Only + + + + + Private + + + + + + + + Mood: + + + false + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + + + + + + Enable comments + + + + + No email comments + + + + + Disable comments + + + + + + + + + + + diff --git a/plugins/logger/CMakeLists.txt b/plugins/logger/CMakeLists.txt new file mode 100644 index 0000000..eeca586 --- /dev/null +++ b/plugins/logger/CMakeLists.txt @@ -0,0 +1,21 @@ +################## +# logger library # +################## +SET(logger_SRCS + logconfig.cpp + logger.cpp +) + +SET(logger_HDRS + logconfig.h + logger.h +) + +SET(logger_UICS + logconfigbase.ui +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(logger) diff --git a/plugins/logger/logconfig.cpp b/plugins/logger/logconfig.cpp new file mode 100644 index 0000000..3f812a8 --- /dev/null +++ b/plugins/logger/logconfig.cpp @@ -0,0 +1,119 @@ +/*************************************************************************** + logconfig.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include "simgui/editfile.h" +#include "simgui/listview.h" +#include "log.h" +#include "misc.h" + +#include "logconfig.h" +#include "logger.h" + +using namespace SIM; + +const unsigned COL_NAME = 0; +const unsigned COL_CHECK = 1; +const unsigned COL_CHECKED = 2; +const unsigned COL_LEVEL = 3; +const unsigned COL_PACKET = 4; + +LogConfig::LogConfig(QWidget *parent, LoggerPlugin *plugin) + : QWidget(parent) + , m_plugin(plugin) +{ + setupUi(this); + + edtFile->setText(m_plugin->value("File").toString()); + edtFile->setCreate(true); + fill(); +} + +void LogConfig::apply() +{ + unsigned log_level = 0; + /* test if file exist */ + if(!edtFile->text().isEmpty()) { + QFile file(edtFile->text()); + if (!file.open(QIODevice::Append | QIODevice::ReadWrite)) { + log(L_DEBUG,"Logfile %s isn't a valid file - discarded!", qPrintable(edtFile->text())); + edtFile->setText(QString()); + } else { + file.close(); + } + m_plugin->setValue("File", edtFile->text()); + } + + /* check selected protocols */ + for (int row = 0; row < lstLevel->count(); ++row) { + QListWidgetItem *item = lstLevel->item(row); + unsigned level = item->data(Qt::UserRole).toUInt(); + unsigned packet = item->data(Qt::UserRole).toUInt(); + if (item->checkState() == Qt::Checked){ + if (level){ + log_level |= level; + }else{ + m_plugin->setLogType(packet, true); + } + }else{ + if (level == 0) + m_plugin->setLogType(packet, false); + } + } + m_plugin->setValue("LogLevel", log_level); + m_plugin->openFile(); +} + +static QListWidgetItem *createItem(const QString &text, bool bChecked, unsigned id, bool bPacket = false) +{ + QListWidgetItem *item = new QListWidgetItem(text); + item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled); + item->setCheckState(bChecked ? Qt::Checked : Qt::Unchecked); + item->setData(bPacket ? Qt::UserRole + 1 : Qt::UserRole, id); + return item; +} + +void LogConfig::fill() +{ + lstLevel->clear(); + + lstLevel->addItem(createItem(i18n("Error"), (m_plugin->value("LogLevel").toUInt() & L_ERROR ) != 0, L_ERROR)); + lstLevel->addItem(createItem(i18n("Warning"), (m_plugin->value("LogLevel").toUInt() & L_WARN ) != 0, L_WARN)); + lstLevel->addItem(createItem(i18n("Debug"), (m_plugin->value("LogLevel").toUInt() & L_DEBUG ) != 0, L_DEBUG)); + lstLevel->addItem(createItem(i18n("Packets"), (m_plugin->value("LogLevel").toUInt() & L_PACKETS) != 0, L_PACKETS)); + //lstLevel->addItem(createItem(i18n("Events"), (m_plugin->getLogLevel() & L_EVENTS ) != 0, L_EVENTS); + + PacketType *type; + ContactList::PacketIterator it; + while ((type = ++it) != NULL){ + lstLevel->addItem(createItem(type->name(), m_plugin->isLogType(type->id()), type->id(), true)); + } +} + +bool LogConfig::processEvent(Event *e) +{ + if ((e->type() == eEventPluginChanged) || (e->type() == eEventLanguageChanged)) + fill(); + return false; +} diff --git a/plugins/logger/logconfig.h b/plugins/logger/logconfig.h new file mode 100644 index 0000000..ab393c5 --- /dev/null +++ b/plugins/logger/logconfig.h @@ -0,0 +1,41 @@ +/*************************************************************************** + logconfig.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _LOGCONFIG_H +#define _LOGCONFIG_H + +#include "event.h" + +#include "ui_logconfigbase.h" + +class LoggerPlugin; + +class LogConfig : public QWidget, public Ui::LogConfigBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + LogConfig(QWidget *parent, LoggerPlugin *plugin); +public slots: + void apply(); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + LoggerPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/logger/logconfigbase.ui b/plugins/logger/logconfigbase.ui new file mode 100644 index 0000000..7cfb83d --- /dev/null +++ b/plugins/logger/logconfigbase.ui @@ -0,0 +1,71 @@ + + + LogConfigBase + + + + 0 + 0 + 360 + 308 + + + + Form1 + + + + + + 6 + + + 0 + + + + + File: + + + false + + + + + + + + 0 + 0 + + + + + + + + + + Log level: + + + false + + + + + + + + + + + EditFile + QWidget +
    simgui/editfile.h
    +
    +
    + + +
    diff --git a/plugins/logger/logger.cpp b/plugins/logger/logger.cpp new file mode 100644 index 0000000..8eb31c0 --- /dev/null +++ b/plugins/logger/logger.cpp @@ -0,0 +1,249 @@ +/*************************************************************************** + logger.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_WIN +# include +#endif + +#include "log.h" +#include "misc.h" +#include "profile.h" +#include "profilemanager.h" + +#include "logger.h" +#include "logconfig.h" + +using namespace std; +using namespace SIM; + +Plugin *createLoggerPlugin(unsigned base, bool, Buffer *add_info) +{ + LoggerPlugin *plugin = new LoggerPlugin(base, add_info); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Logger"), + I18N_NOOP("Plugin provides log output\n" + "You can set debug level from command line with -d\n" + "To log errors, set loglevel to 1, for warnings to 2 and for debug-messages to 4\n" + "If you want to log more than one you may add the levels"), + VERSION, + createLoggerPlugin, +#if defined(Q_OS_WIN) || defined(__OS2__) + PLUGIN_NOLOAD_DEFAULT +#else + PLUGIN_DEFAULT +#endif + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +LoggerPlugin::LoggerPlugin(unsigned base, Buffer *add_info) + : QObject() + , Plugin(base) + , m_file(NULL) + , m_bFilter(false) +{ + + m_propertyHub = PropertyHub::create("logger"); + EventArg e("-d:", I18N_NOOP("Set debug level")); + if (e.process()) + setValue("LogLevel", e.value().toUInt()); + const QStringList packets = value("LogPackets").toString().split(','); + Q_FOREACH (const QString &v, packets) { + setLogType(v.toULong(), true); + } + + openFile(); +} + +LoggerPlugin::~LoggerPlugin() +{ + delete m_file; +} + +QByteArray LoggerPlugin::getConfig() +{ + /* + QByteArray packets; + QSetIterator setIt(m_packets); + while(setIt.hasNext()) { + if (packets.length()) + packets += ','; + packets += QByteArray::number(setIt.next()); + } + setValue("LogPackets", packets); + */ + return QByteArray(); +} + +void LoggerPlugin::openFile() +{ +/* + if (m_bFilter){ + if ((getLogLevel() & L_EVENTS) == 0){ + qApp->removeEventFilter(this); + m_bFilter = false; + } + }else{ + if (getLogLevel() & L_EVENTS){ + qApp->installEventFilter(this); + m_bFilter = true; + } + } +*/ + delete m_file; + m_file = NULL; + QString fname = value("File").toString(); + if (fname.isEmpty()) + return; + // This is because sim crashes when a logfile is larger than 100MB ... + QFileInfo fileInfo(fname); + if (fileInfo.size() > 1024 * 1024 * 50) { // 50MB ... + QString desiredFileName = fileInfo.fileName() + ".old"; +#if defined(Q_OS_WIN) || defined(__OS2__) + fileInfo.dir().remove(desiredFileName); +#endif + if (!fileInfo.dir().rename(fileInfo.fileName(), desiredFileName)) { + // won't work --> simply delete... + fileInfo.dir().remove(fileInfo.fileName()); + } + } + // now open file + m_file = new QFile(fname); + if (!m_file->open(QIODevice::Append | QIODevice::ReadWrite)){ + delete m_file; + m_file = NULL; + log(L_WARN, "Can't open %s", qPrintable(fname)); + } +} + +bool LoggerPlugin::isLogType(unsigned id) +{ + return m_packets.contains(id); +} + +void LoggerPlugin::setLogType(unsigned id, bool bLog) +{ + if(bLog) + m_packets.insert(id); + else + m_packets.remove(id); +} +/* +bool LoggerPlugin::eventFilter(QObject *o, QEvent *e) +{ + if (strcmp(o->className(), "QTimer")) + log(L_DEBUG, "Event: %u %s %s", e->type(), o->className(), o->name()); + return QObject::eventFilter(o, e); +} +*/ +QWidget *LoggerPlugin::createConfigWindow(QWidget *parent) +{ + return new LogConfig(parent, this); +} + +bool LoggerPlugin::processEvent(Event *e) +{ + if(e->type() == eEventLog) + { + EventLog *l = static_cast(e); + if (((l->packetID() == 0) && (l->logLevel() & value("LogLevel").toUInt())) || + (l->packetID() && ((value("LogLevel").toUInt() & L_PACKETS) || isLogType(l->packetID())))) + { + QString s; + s = EventLog::make_packet_string(*l); + if (m_file) { +#if defined(Q_OS_WIN) || defined(__OS2__) + s += "\r\n"; +#else + s += "\n"; +#endif + m_file->write(s.toLocal8Bit()); + } +#ifdef Q_OS_WIN + const QStringList slist = s.split('\n'); + for(int i = 0 ; i < slist.count() ; i++) + { + QString out = slist[i]; + if (out.length() > 256){ + while (!out.isEmpty()){ + QString l; + if (out.length() < 256){ + l = out; + out.clear(); + }else{ + l = out.left(256); + out = out.mid(256); + } + OutputDebugStringW((LPCWSTR)l.utf16()); + } + } + else + { + OutputDebugStringW((LPCWSTR)out.utf16()); + } + OutputDebugStringW(L"\n"); + } +#else + fprintf(stderr, "%s\n", qPrintable(s)); +#endif + } + } + else if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("logger"); + if(!hub.isNull()) + setPropertyHub(hub); + } + return false; +} + +void LoggerPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr LoggerPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant LoggerPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void LoggerPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} + +// vim: set expandtab: + diff --git a/plugins/logger/logger.h b/plugins/logger/logger.h new file mode 100644 index 0000000..4ee8de2 --- /dev/null +++ b/plugins/logger/logger.h @@ -0,0 +1,63 @@ +/*************************************************************************** + logger.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _LOGGER_H +#define _LOGGER_H + +#include +#include + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" + +class QFile; +const unsigned short L_PACKETS = 0x08; +// const unsigned short L_EVENTS = 0x10; + +class QFile; + +class LoggerPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + LoggerPlugin(unsigned, Buffer*); + virtual ~LoggerPlugin(); + bool isLogType(unsigned id); + void setLogType(unsigned id, bool bLog); + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +protected: +// bool eventFilter(QObject *o, QEvent *e); + QSet m_packets; + virtual QWidget *createConfigWindow(QWidget *parent); + virtual QByteArray getConfig(); + virtual bool processEvent(SIM::Event *e); + void openFile(); + QFile *m_file; + bool m_bFilter; + friend class LogConfig; + + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/logger/logger.rc b/plugins/logger/logger.rc new file mode 100644 index 0000000..c439f61 --- /dev/null +++ b/plugins/logger/logger.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Logger plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "logger\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "logger.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/logger/logger.vcproj b/plugins/logger/logger.vcproj new file mode 100644 index 0000000..cab7fe8 --- /dev/null +++ b/plugins/logger/logger.vcproj @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/msn/CMakeLists.txt b/plugins/msn/CMakeLists.txt new file mode 100644 index 0000000..0febfe6 --- /dev/null +++ b/plugins/msn/CMakeLists.txt @@ -0,0 +1,33 @@ +############### +# msn library # +############### +IF(BUILD_DROPPED) +SET(msn_SRCS + msn.cpp + msnclient.cpp + msnconfig.cpp + msnfiletransfer.cpp + msnhttp.cpp + msninfo.cpp + msnpacket.cpp + msnsearch.cpp +) + +SET(msn_HDRS + msn.h + msnclient.h + msnconfig.h + msnhttp.h + msninfo.h + msnpacket.h + msnsearch.h +) + +SET(msn_UICS + msnconfigbase.ui + msninfobase.ui + msnsearchbase.ui +) + +SIM_ADD_PLUGIN(msn) +ENDIF(BUILD_DROPPED) diff --git a/plugins/msn/configure.in.in b/plugins/msn/configure.in.in new file mode 100644 index 0000000..63e9a8d --- /dev/null +++ b/plugins/msn/configure.in.in @@ -0,0 +1,5 @@ +if test "$have_ssl" != yes; then + AC_MSG_WARN([OpenSSL library disabled. MSN plugin is disabled]) +fi + +AM_CONDITIONAL(ENABLE_MSN, test "$have_ssl" = "yes") diff --git a/plugins/msn/msn.cpp b/plugins/msn/msn.cpp new file mode 100644 index 0000000..3ab436a --- /dev/null +++ b/plugins/msn/msn.cpp @@ -0,0 +1,232 @@ +/*************************************************************************** + msn.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#include "clientmanager.h" +#include "misc.h" + +#include "msn.h" +#include "msnclient.h" + + +using namespace SIM; + +Plugin *createMSNPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new MSNPlugin(base); + return plugin; +} + +static PluginInfo info = + { + NULL, + NULL, + VERSION, + createMSNPlugin, + PLUGIN_PROTOCOL + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +MSNProtocol::MSNProtocol(Plugin *plugin) + : Protocol(plugin) +{ +} + +MSNProtocol::~MSNProtocol() +{ +} + +ClientPtr MSNProtocol::createClient(Buffer *cfg) +{ + ClientPtr msn = ClientPtr(new MSNClient(this, cfg)); + getClientManager()->addClient(msn); + return msn; +} + +static CommandDef msn_descr = + CommandDef ( + 0, + I18N_NOOP("MSN"), + "MSN_online", + "MSN_invisible", + I18N_NOOP("https://accountservices.passport.net/uiresetpw.srf?lc=1033"), + 0, + 0, + 0, + 0, + 0, + PROTOCOL_INVISIBLE, + NULL, + QString::null + ); + +const CommandDef *MSNProtocol::description() +{ + return &msn_descr; +} + +static CommandDef msn_status_list[] = + { + CommandDef ( + STATUS_ONLINE, + I18N_NOOP("Online"), + "MSN_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_AWAY, + I18N_NOOP("Away"), + "MSN_away", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_NA, + I18N_NOOP("N/A"), + "MSN_na", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_DND, + I18N_NOOP("Busy"), + "MSN_dnd", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_BRB, + I18N_NOOP("Be right back"), + "MSN_onback", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_PHONE, + I18N_NOOP("On the phone"), + "MSN_onphone", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_LUNCH, + I18N_NOOP("On the lunch"), + "MSN_lunch", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_OFFLINE, + I18N_NOOP("Offline"), + "MSN_offline", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef () + }; + +const CommandDef *MSNProtocol::statusList() +{ + return msn_status_list; +} + +MSNPlugin::MSNPlugin(unsigned base) + : Plugin(base) +{ + MSNPacket = registerType(); + EventAddOk = registerType(); + EventAddFail = registerType(); + MSNInitMail = registerType(); + MSNNewMail = registerType(); + + getContacts()->addPacketType(MSNPacket, msn_descr.text, true); + + m_protocol = new MSNProtocol(this); +} + +MSNPlugin::~MSNPlugin() +{ + getContacts()->removePacketType(MSNPacket); + delete m_protocol; +} diff --git a/plugins/msn/msn.h b/plugins/msn/msn.h new file mode 100644 index 0000000..c90e93a --- /dev/null +++ b/plugins/msn/msn.h @@ -0,0 +1,50 @@ +/*************************************************************************** + msn.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSN_H +#define _MSN_H + +#include "contacts.h" +#include "contacts/client.h" + +class MSNProtocol : public SIM::Protocol +{ +public: + MSNProtocol(SIM::Plugin *plugin); + ~MSNProtocol(); + SIM::ClientPtr createClient(Buffer *cfg); + const SIM::CommandDef *description(); + const SIM::CommandDef *statusList(); + virtual const SIM::DataDef *userDataDef(); +}; + +class MSNPlugin : public SIM::Plugin +{ +public: + MSNPlugin(unsigned base); + virtual ~MSNPlugin(); + unsigned EventAddOk; + unsigned EventAddFail; + unsigned MSNPacket; + unsigned MSNInitMail; + unsigned MSNNewMail; +protected: + SIM::Protocol *m_protocol; +}; + +#endif + diff --git a/plugins/msn/msn.rc b/plugins/msn/msn.rc new file mode 100644 index 0000000..076c464 --- /dev/null +++ b/plugins/msn/msn.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "MSN plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "msn\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "msn.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/msn/msn.vcproj b/plugins/msn/msn.vcproj new file mode 100644 index 0000000..0080260 --- /dev/null +++ b/plugins/msn/msn.vcproj @@ -0,0 +1,748 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/msn/msn_pch.h b/plugins/msn/msn_pch.h new file mode 100644 index 0000000..872709a --- /dev/null +++ b/plugins/msn/msn_pch.h @@ -0,0 +1,47 @@ +#pragma once + +#include + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef NO_QT_MOC_HEADER +#include +//#include +//#include +#endif + +#include "msn.h" +#include "msnclient.h" +#include "msnconfig.h" +#include "ui_msnconfigbase.h" +#include "msnhttp.h" +#include "msninfo.h" +#include "ui_msninfobase.h" +#include "msnpacket.h" +#include "msnsearch.h" +#include "ui_msnsearchbase.h" diff --git a/plugins/msn/msnclient.cpp b/plugins/msn/msnclient.cpp new file mode 100644 index 0000000..e9a8c11 --- /dev/null +++ b/plugins/msn/msnclient.cpp @@ -0,0 +1,2757 @@ +/*************************************************************************** + msn.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include + +#include "log.h" +#include "core.h" +#include "core_events.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +#include "msnclient.h" +#include "msnconfig.h" +#include "msnpacket.h" +#include "msn.h" +#include "msninfo.h" +#include "msnsearch.h" + +#include "socket/clientsocket.h" + +#ifndef INADDR_NONE +#define INADDR_NONE 0xFFFFFFFF +#endif + +using namespace std; +using namespace SIM; + +const unsigned long PING_TIMEOUT = 60; + +const unsigned long TYPING_TIME = 10; + +static DataDef msnUserData[] = + { + { "", DATA_ULONG, 1, DATA(3) }, // Sign + { "LastSend", DATA_ULONG, 1, 0 }, + { "EMail", DATA_UTF, 1, 0 }, + { "Screen", DATA_UTF, 1, 0 }, + { "", DATA_ULONG, 1, DATA(1) }, // Status + { "StatusTime", DATA_ULONG, 1, 0 }, + { "OnlineTime", DATA_ULONG, 1, 0 }, + { "PhoneHome", DATA_UTF, 1, 0 }, + { "PhoneWork", DATA_UTF, 1, 0 }, + { "PhoneMobile", DATA_UTF, 1, 0 }, + { "Mobile", DATA_BOOL, 1, 0 }, + { "Group", DATA_ULONG, 1, 0 }, + { "Flags", DATA_ULONG, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // sFlags + { "", DATA_ULONG, 1, 0 }, + { "IP", DATA_IP, 1, 0 }, + { "RealIP", DATA_IP, 1, 0 }, + { "Port", DATA_ULONG, 1, 0 }, + { "", DATA_OBJECT, 1, 0 }, // sb + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +static DataDef msnClientData[] = + { + { "Server", DATA_STRING, 1, "messenger.hotmail.com" }, + { "Port", DATA_ULONG, 1, DATA(1863) }, + { "ListVer", DATA_ULONG, 1, 0 }, + { "ListRequests", DATA_UTF, 1, 0 }, + { "Version", DATA_STRING, 1, "5.0.0540" }, + { "MinPort", DATA_ULONG, 1, DATA(1024) }, + { "MaxPort", DATA_ULONG, 1, DATA(0xFFFF) }, + { "UseHTTP", DATA_BOOL, 1, 0 }, + { "AutoHTTP", DATA_BOOL, 1, DATA(1) }, + { "Deleted", DATA_STRLIST, 1, 0 }, + { "NDeleted", DATA_ULONG, 1, 0 }, + { "AutoAuth", DATA_BOOL, 1, DATA(1) }, + { "", DATA_STRUCT, sizeof(MSNUserData) / sizeof(Data), DATA(msnUserData) }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +MSNClient::MSNClient(Protocol *protocol, Buffer *cfg) + : TCPClient (protocol, cfg) + , m_bJoin (false) + , m_packetId (1) + , m_msg (NULL) + , m_bFirstTry (false) +{ + load_data(msnClientData, &data, cfg); + + m_bFirst = (cfg == NULL); + QString s = getListRequests(); + while (!s.isEmpty()){ + QString item = getToken(s, ';'); + MSNListRequest lr; + lr.Type = getToken(item, ',').toUInt(); + lr.Name = item; + } + setListRequests(QString::null); + +} + +MSNClient::~MSNClient() +{ + TCPClient::setStatus(STATUS_OFFLINE, false); + free_data(msnClientData, &data); + freeData(); +} + +QString MSNClient::name() +{ + return "MSN." + getLogin(); +} + +QWidget *MSNClient::setupWnd() +{ + return new MSNConfig(NULL, this, false); +} + +QByteArray MSNClient::getConfig() +{ + QString listRequests; + for (list::iterator it = m_requests.begin(); it != m_requests.end(); ++it){ + if (!listRequests.isEmpty()) + listRequests += ";"; + listRequests += QString::number(it->Type) + "," + it->Name; + } + setListRequests(listRequests); + QByteArray res = Client::getConfig(); + if (res.length()) + res += "\n"; + res += save_data(msnClientData, &data); + setListRequests(QString::null); + return res; +} + +const DataDef *MSNProtocol::userDataDef() +{ + return msnUserData; +} + +void MSNClient::connect_ready() +{ + m_bFirstTry = false; + socket()->readBuffer().init(0); + socket()->readBuffer().packetStart(); + socket()->setRaw(true); + log(L_DEBUG, "Connect ready"); + TCPClient::connect_ready(); + MSNPacket *packet = new VerPacket(this); + packet->send(); +} + +void MSNClient::setStatus(unsigned status) +{ + if (status == m_status) + return; + QDateTime now(QDateTime::currentDateTime()); + if (m_status == STATUS_OFFLINE) + data.owner.OnlineTime.asULong() = now.toTime_t(); + data.owner.StatusTime.asULong() = now.toTime_t(); + m_status = status; + data.owner.Status.asULong() = m_status; + EventClientChanged(this).process(); + if (status == STATUS_OFFLINE) + { + if (m_status != STATUS_OFFLINE) + { + m_status = status; + data.owner.Status.asULong() = status; + data.owner.StatusTime.asULong() = now.toTime_t(); + MSNPacket *packet = new OutPacket(this); + packet->send(); + } + return; + } + if (Client::m_state != Connected) + { + m_logonStatus = status; + return; + } + m_status = status; + MSNPacket *packet = new ChgPacket(this); + packet->send(); +} + +void MSNClient::connected() +{ + setState(Client::Connected); + setStatus(m_logonStatus); + processRequests(); +} + +void MSNClient::setInvisible(bool bState) +{ + if (bState == getInvisible()) + return; + TCPClient::setInvisible(bState); + if (getStatus() == STATUS_OFFLINE) + return; + MSNPacket *packet = new ChgPacket(this); + packet->send(); +} + +void MSNClient::disconnected() +{ + stop(); + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL) + { + bool bChanged = false; + MSNUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toMSNUserData(++it)) != NULL){ + if (data->Status.toULong() != STATUS_OFFLINE){ + data->Status.asULong() = STATUS_OFFLINE; + QDateTime now(QDateTime::currentDateTime()); + data->StatusTime.asULong() = now.toTime_t(); + SBSocket *sock = dynamic_cast(data->sb.object()); + if (sock) + { + delete sock; + data->sb.clear(); + } + bChanged = true; + } + if (bChanged) + { + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(dataName(data)); + m->setFlags(MESSAGE_RECEIVED); + m->setStatus(STATUS_OFFLINE); + EventMessageReceived e(m); + if(!e.process()) + delete m; + } + } + } + m_packetId = 0; + m_pingTime = 0; + m_state = None; + m_authChallenge = QString::null; + clearPackets(); +} + +void MSNClient::clearPackets() +{ + if (m_msg) + { + delete m_msg; + m_msg = NULL; + } + for (list::iterator it = m_packets.begin(); it != m_packets.end(); ++it) + { + delete *it; + } + m_packets.clear(); +} + +void MSNClient::packet_ready() +{ + if (socket()->readBuffer().writePos() == 0) + return; + MSNPlugin *plugin = static_cast(protocol()->plugin()); + EventLog::log_packet(socket()->readBuffer(), false, plugin->MSNPacket); + if (m_msg) + { + if (!m_msg->packet()) + return; + delete m_msg; + m_msg = NULL; + } + for (;;) + { + QByteArray s; + if (!socket()->readBuffer().scan("\r\n", s)) + break; + getLine(s); + } + if (socket()->readBuffer().readPos() == socket()->readBuffer().writePos()) + socket()->readBuffer().init(0); +} + +struct statusText +{ + unsigned status; + const char *name; +}; + +statusText st[] = + { + { STATUS_ONLINE, "NLN" }, + { STATUS_OFFLINE, "FLN" }, + { STATUS_OFFLINE, "HDN" }, + { STATUS_NA, "IDL" }, + { STATUS_AWAY, "AWY" }, + { STATUS_DND, "BSY" }, + { STATUS_BRB, "BRB" }, + { STATUS_PHONE, "PHN" }, + { STATUS_LUNCH, "LUN" }, + { 0, NULL } + }; + +static unsigned str2status(const QString &str) +{ + for (const statusText *s = st; s->name; s++){ + if (str == s->name) + return s->status; + } + return STATUS_OFFLINE; +} + +void MSNClient::processLSG(unsigned id, const QString &name) +{ + if (id == 0) + return; + Group *grp; + MSNListRequest *lr = findRequest(id, LR_GROUPxREMOVED); + if (lr) + return; + MSNUserData *data = findGroup(id, QString::null, grp); + if (data){ + lr = findRequest(grp->id(), LR_GROUPxCHANGED); + if (lr){ + data->sFlags.asULong() |= MSN_CHECKED; + return; + } + } + data = findGroup(id, name, grp); + data->sFlags.asULong() |= MSN_CHECKED; +} + +void MSNClient::processLST(const QString &mail, const QString &name, unsigned state, unsigned grp) +{ + if ((state & MSN_FORWARD) == 0){ + for (unsigned i = 1; i <= getNDeleted(); i++){ + if (getDeleted(i) == mail) + return; + } + } + + m_curBuddy = mail; + Contact *contact; + MSNListRequest *lr = findRequest(mail, LR_CONTACTxREMOVED); + if (lr) + return; + bool bNew = false; + MSNUserData *data = findContact(mail, contact); + if (data == NULL){ + data = findContact(mail, name, contact); + bNew = true; + }else{ + data->EMail.str() = mail; + data->ScreenName.str() = name; + if (name != contact->getName()) + contact->setName(name); + } + data->sFlags.asULong() |= MSN_CHECKED; + data->Flags.asULong() = state; + if (state & MSN_BLOCKED) + contact->setIgnore(true); + + lr = findRequest(mail, LR_CONTACTxCHANGED); + data->Group.asULong() = grp; + data->PhoneHome.clear(); + data->PhoneWork.clear(); + data->PhoneMobile.clear(); + data->Mobile.asBool() = false; + Group *group = NULL; + if ((grp == 0) || (grp == NO_GROUP)){ + group = getContacts()->group(0); + }else{ + findGroup(grp, QString::null, group); + } + if (lr == NULL){ + bool bChanged = ((data->Flags.toULong() & MSN_FLAGS) != (data->sFlags.toULong() & MSN_FLAGS)); + if (getAutoAuth() && (data->Flags.toULong() & MSN_FORWARD) && ((data->Flags.toULong() & MSN_ACCEPT) == 0) && ((data->Flags.toULong() & MSN_BLOCKED) == 0)) + bChanged = true; + int grp = 0; + if (group) + grp = group->id(); + if (grp != contact->getGroup()) + bChanged = true; + if (bChanged){ + MSNListRequest lr; + lr.Type = LR_CONTACTxCHANGED; + lr.Name = data->EMail.str(); + m_requests.push_back(lr); + } + if (data->Flags.toULong() & MSN_FORWARD) + contact->setGroup(grp); + } +} + +void MSNClient::checkEndSync() +{ + if (m_nBuddies || m_nGroups) + return; + ContactList::GroupIterator itg; + Group *grp; + list grpRemove; + list contactRemove; + while ((grp = ++itg) != NULL){ + ClientDataIterator it(grp->clientData, this); + MSNUserData *data = toMSNUserData(++it); + if (grp->id() && (data == NULL)){ + MSNListRequest lr; + lr.Type = LR_GROUPxCHANGED; + lr.Name = QString::number(grp->id()); + m_requests.push_back(lr); + continue; + } + if (data == NULL) + continue; + if ((data->sFlags.toULong() & MSN_CHECKED) == 0) + grpRemove.push_back(grp); + } + Contact *contact; + ContactList::ContactIterator itc; + while ((contact = ++itc) != NULL){ + MSNUserData *data; + ClientDataIterator it(contact->clientData, this); + list forRemove; + while ((data = toMSNUserData(++it)) != NULL){ + if (data->sFlags.toULong() & MSN_CHECKED){ + if ((data->sFlags.toULong() & MSN_REVERSE) && ((data->Flags.toULong() & MSN_REVERSE) == 0)) + auth_message(contact, MessageRemoved, data); + if (!m_bFirst && ((data->sFlags.toULong() & MSN_REVERSE) == 0) && (data->Flags.toULong() & MSN_REVERSE)){ + if ((data->Flags.toULong() & MSN_ACCEPT) || getAutoAuth()){ + auth_message(contact, MessageAdded, data); + }else{ + auth_message(contact, MessageAuthRequest, data); + } + } + setupContact(contact, data); + EventContact e(contact, EventContact::eChanged); + e.process(); + }else{ + forRemove.push_back(data); + } + } + if (forRemove.empty()) + continue; + for (list::iterator itr = forRemove.begin(); itr != forRemove.end(); ++itr) + contact->clientData.freeData(*itr); + if (contact->clientData.size() == 0) + contactRemove.push_back(contact); + } + for (list::iterator rc = contactRemove.begin(); rc != contactRemove.end(); ++rc) + delete *rc; + for (list::iterator rg = grpRemove.begin(); rg != grpRemove.end(); ++rg) + delete *rg; + if (m_bJoin){ + EventJoinAlert(this).process(); + } + m_bFirst = false; + connected(); +} + +void MSNClient::getLine(const QByteArray &line) +{ + QString l = QString::fromUtf8(line); + l = l.remove('\r'); + log(L_DEBUG, "Get: %s", qPrintable(l)); + QString cmd = getToken(l, ' '); + log(L_DEBUG, QString("Command: %1").arg(cmd)); + if ((cmd == "715") || (cmd == "228")) + return; + if (cmd == "XFR"){ + QString id = getToken(l, ' '); // ID + QString type = getToken(l, ' '); // NS + if (type == "NS"){ + l = getToken(l, ' '); // from + QString host = getToken(l, ':'); + unsigned short port = l.toUShort(); + if (host.isEmpty() || (port == 0)){ + log(L_WARN, "Bad host on XFR"); + socket()->error_state(I18N_NOOP("MSN protocol error")); + return; + } + clearPackets(); + socket()->close(); + socket()->readBuffer().init(0); + socket()->connect(host, port, this); + return; + } + l = id + " " + type + " " + l; + } + if (cmd == "MSG"){ + getToken(l, ' '); + getToken(l, ' '); + unsigned size = getToken(l, ' ').toUInt(); + if (size == 0){ + log(L_WARN, "Bad server message size"); + socket()->error_state(I18N_NOOP("MSN protocol error")); + return; + } + m_msg = new MSNServerMessage(this, size); + packet_ready(); + return; + } + if (cmd == "CHL"){ + getToken(l, ' '); + MSNPacket *packet = new QryPacket(this, getToken(l, ' ')); + packet->send(); + return; + } + if (cmd == "QNG") + return; + if (cmd == "BPR"){ + Contact *contact; + MSNUserData *data = findContact(getToken(l, ' '), contact); + if (data){ + QString info = getToken(l, ' '); + QString type = getToken(l, ' '); + bool bChanged = false; + if (type == "PHH"){ + bChanged = data->PhoneHome.setStr(unquote(info)); + }else if (type == "PHW"){ + bChanged = data->PhoneWork.setStr(unquote(info)); + }else if (type == "PHM"){ + bChanged = data->PhoneMobile.setStr(unquote(info)); + }else if (type == "MOB"){ + data->Mobile.asBool() = ((info[0] == 'Y') != 0); + }else{ + log(L_DEBUG, "Unknown BPR type %s", qPrintable(type)); + } + if (bChanged){ + setupContact(contact, data); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + } + return; + } + if (cmd == "ILN"){ + getToken(l, ' '); + unsigned status = str2status(getToken(l, ' ')); + Contact *contact; + MSNUserData *data = findContact(getToken(l, ' '), contact); + QDateTime now(QDateTime::currentDateTime()); + if (data && (data->Status.toULong() != status)) + { + data->Status.asULong() = status; + if (data->Status.toULong() == STATUS_OFFLINE){ + data->OnlineTime.asULong() = now.toTime_t(); + set_ip(&data->IP, 0); + set_ip(&data->RealIP, 0); + } + data->StatusTime.asULong() = now.toTime_t(); + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(dataName(data)); + m->setFlags(MESSAGE_RECEIVED); + m->setStatus(status); + EventMessageReceived e(m); + if(!e.process()) + delete m; + } + return; + } + if (cmd == "NLN"){ + unsigned status = str2status(getToken(l, ' ')); + Contact *contact; + MSNUserData *data = findContact(getToken(l, ' '), contact); + if (data && (data->Status.toULong() != status)) + { + QDateTime now(QDateTime::currentDateTime()); + if (data->Status.toULong() == STATUS_OFFLINE){ + data->OnlineTime.asULong() = now.toTime_t(); + set_ip(&data->IP, 0); + set_ip(&data->RealIP, 0); + } + data->StatusTime.asULong() = now.toTime_t(); + data->Status.asULong() = status; + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(dataName(data)); + m->setFlags(MESSAGE_RECEIVED); + m->setStatus(status); + EventMessageReceived e(m); + if(!e.process()) + delete m; + if ((status == STATUS_ONLINE) && !contact->getIgnore()){ + EventContact e(contact, EventContact::eOnline); + e.process(); + } + } + return; + } + if (cmd == "FLN"){ + Contact *contact; + MSNUserData *data = findContact(getToken(l, ' '), contact); + if (data && (data->Status.toULong() != STATUS_OFFLINE)){ + QDateTime now(QDateTime::currentDateTime()); + data->StatusTime.asULong() = now.toTime_t(); + data->Status.asULong() = STATUS_OFFLINE; + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(dataName(data)); + m->setFlags(MESSAGE_RECEIVED); + m->setStatus(STATUS_OFFLINE); + EventMessageReceived e(m); + if(!e.process()) + delete m; + } + return; + } + if (cmd == "ADD"){ + getToken(l, ' '); + if (getToken(l, ' ') == "RL"){ + setListVer(getToken(l, ' ').toUInt()); + Contact *contact; + MSNUserData *data = findContact(getToken(l, ' '), getToken(l, ' '), contact); + if (data){ + data->Flags.asULong() |= MSN_REVERSE; + if ((data->Flags.toULong() & MSN_ACCEPT) || getAutoAuth()){ + auth_message(contact, MessageAdded, data); + }else{ + auth_message(contact, MessageAuthRequest, data); + } + } + } + return; + } + if (cmd == "REM"){ + getToken(l, ' '); + if (getToken(l, ' ') == "RL"){ + setListVer(getToken(l, ' ').toUInt()); + Contact *contact; + MSNUserData *data = findContact(getToken(l, ' '), contact); + if (data){ + data->Flags.asULong() &= ~MSN_REVERSE; + auth_message(contact, MessageRemoved, data); + } + } + return; + } + if (cmd == "RNG"){ + QString session = getToken(l, ' '); + QString addr = getToken(l, ' '); + getToken(l, ' '); + QString cookie, email, nick; + cookie = getToken(l, ' '); + email = getToken(l, ' '); + nick = getToken(l, ' '); + Contact *contact; + MSNUserData *data = findContact(email, contact); + if (data == NULL){ + data = findContact(email, nick, contact); + contact->setFlags(CONTACT_TEMP); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + SBSocket *sock = dynamic_cast(data->sb.object()); + if (sock){ + delete sock; + } + sock = new SBSocket(this, contact, data); + sock->connect(addr, session, cookie, false); + data->sb.setObject(sock); + return; + } + if (cmd == "OUT"){ + m_reconnect = NO_RECONNECT; + socket()->error_state(I18N_NOOP("Your account is being used from another location")); + return; + } + if (cmd == "GTC") + return; + if (cmd == "BLP") + return; + if (cmd == "UUX") + { + // personal message + getToken(l, ' '); + getToken(l, ' '); + unsigned size = getToken(l, ' ').toUInt(); + if (size == 0){ + log(L_WARN, "Empty server personal message size"); + //return; + } + else + { + m_msg = new MSNServerMessage(this, size); + // only we post the message in log now..... + // ToDo: restore this + // Error: m_msg is not a string + //log(L_WARN, "Personal message: %s", m_msg); + //packet_ready(); + } + return; + } + if (cmd == "LSG"){ + unsigned id = getToken(l, ' ').toUInt(); + processLSG(id, unquote(getToken(l, ' '))); + m_nGroups--; + checkEndSync(); + return; + } + if (cmd == "LST"){ + QString mail = unquote(getToken(l, ' ')); + QString name = unquote(getToken(l, ' ')); + unsigned state = getToken(l, ' ').toUInt(); + unsigned grp = getToken(l, ' ').toUInt(); + processLST(mail, name, state, grp); + m_nBuddies--; + checkEndSync(); + return; + } + if (cmd == "PRP"){ + QString cmd = getToken(l, ' '); + if (cmd == "PHH") + data.owner.PhoneHome.str() = unquote(getToken(l, ' ')); + if (cmd == "PHW") + data.owner.PhoneWork.str() = unquote(getToken(l, ' ')); + if (cmd == "PHM") + data.owner.PhoneMobile.str() = unquote(getToken(l, ' ')); + if (cmd == "MBE") + data.owner.Mobile.asBool() = (getToken(l, ' ') == "Y"); + return; + } + if (cmd == "BPR"){ + Contact *contact; + MSNUserData *data = findContact(m_curBuddy, contact); + if (data == NULL) + return; + EventContact e(contact, EventContact::eChanged); + e.process(); + QString cmd = getToken(l, ' '); + if (cmd == "PHH") + data->PhoneHome.str() = unquote(getToken(l, ' ')); + if (cmd == "PHW") + data->PhoneWork.str() = unquote(getToken(l, ' ')); + if (cmd == "PHM") + data->PhoneMobile.str() = unquote(getToken(l, ' ')); + if (cmd == "MBE") + data->Mobile.asBool() = (getToken(l, ' ') == "Y"); + return; + } + unsigned code = cmd.toUInt(); + if (code){ + MSNPacket *packet = NULL; + unsigned id = getToken(l, ' ').toUInt(); + list::iterator it; + for (it = m_packets.begin(); it != m_packets.end(); ++it){ + if ((*it)->id() == id){ + packet = *it; + break; + } + } + if (it == m_packets.end()){ + socket()->error_state("Bad packet id"); + return; + } + m_packets.erase(it); + packet->error(code); + delete packet; + return; + } + if (m_packets.empty()){ + log(L_DEBUG, "Packet not found"); + return; + } + MSNPacket *packet = NULL; + unsigned id = getToken(l, ' ').toUInt(); + list::iterator it; + for (it = m_packets.begin(); it != m_packets.end(); ++it){ + if ((*it)->id() == id){ + packet = *it; + break; + } + } + if (it == m_packets.end()){ + socket()->error_state("Bad packet id"); + return; + } + if (cmd != packet->cmd()){ + socket()->error_state("Bad answer cmd"); + return; + } + QStringList args; + while (l.length()) + args.push_back(getToken(l, ' ', false)); + packet->answer(args); + m_packets.erase(it); + delete packet; +} + +void MSNClient::sendLine(const QString &line, bool crlf) +{ + log(L_DEBUG, "Send: %s", qPrintable(line)); + socket()->writeBuffer().packetStart(); + socket()->writeBuffer() << (const char*)line.toUtf8(); + if (crlf) + socket()->writeBuffer() << "\r\n"; + MSNPlugin *plugin = static_cast(protocol()->plugin()); + EventLog::log_packet(socket()->writeBuffer(), true, plugin->MSNPacket); + socket()->write(); +} + +void MSNClient::authFailed() +{ + m_reconnect = NO_RECONNECT; + socket()->error_state(I18N_NOOP("Login failed"), AuthError); +} + +void MSNClient::authOk() +{ + m_state = None; + m_authChallenge = QString::null; + QDateTime now(QDateTime::currentDateTime()); + m_pingTime = now.toTime_t(); + QTimer::singleShot(TYPING_TIME * 1000, this, SLOT(ping())); + setPreviousPassword(QString::null); + MSNPacket *packet = new SynPacket(this); + packet->send(); +} + +void MSNClient::ping() +{ + if (getState() != Connected) + return; + QDateTime now(QDateTime::currentDateTime()); + if (now.toTime_t() >= m_pingTime + PING_TIMEOUT){ + sendLine("PNG"); + m_pingTime = now.toTime_t(); + } + for (list::iterator it = m_SBsockets.begin(); it != m_SBsockets.end(); ++it) + (*it)->timer(now.toTime_t()); + QTimer::singleShot(TYPING_TIME * 1000, this, SLOT(ping())); +} + +QString MSNClient::getLogin() +{ + return data.owner.EMail.str(); +} + +void MSNClient::setLogin(const QString &str) +{ + data.owner.EMail.str() = str; +} + +const unsigned MAIN_INFO = 1; +const unsigned NETWORK = 2; + +static CommandDef msnWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "MSN_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +static CommandDef cfgMsnWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "MSN_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + NETWORK, + I18N_NOOP("Network"), + "network", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +CommandDef *MSNClient::infoWindows(Contact*, void *_data) +{ + MSNUserData *data = toMSNUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString name = i18n(protocol()->description()->text); + name += " "; + name += data->EMail.str(); + msnWnd[0].text_wrk = name; + return msnWnd; +} + +CommandDef *MSNClient::configWindows() +{ + QString name = i18n(protocol()->description()->text); + name += " "; + name += data.owner.EMail.str(); + cfgMsnWnd[0].text_wrk = name; + return cfgMsnWnd; +} + +QWidget *MSNClient::infoWindow(QWidget *parent, Contact*, void *_data, unsigned id) +{ + MSNUserData *data = toMSNUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + switch (id){ + case MAIN_INFO: + return new MSNInfo(parent, data, this); + } + return NULL; +} + +QWidget *MSNClient::configWindow(QWidget *parent, unsigned id) +{ + switch (id){ + case MAIN_INFO: + return new MSNInfo(parent, NULL, this); + case NETWORK: + return new MSNConfig(parent, this, true); + } + return NULL; +} + +bool MSNClient::canSend(unsigned type, void *_data) +{ + if ((_data == NULL) || (((clientData*)_data)->Sign.toULong() != MSN_SIGN)) + return false; + MSNUserData *data = toMSNUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + if (getState() != Connected) + return false; + switch (type){ + case MessageGeneric: + case MessageFile: + case MessageUrl: + if (getInvisible()) + return false; + return true; + case MessageAuthGranted: + case MessageAuthRefused: + return (data->Flags.toULong() & MSN_ACCEPT) == 0; + } + return false; +} + +bool MSNClient::send(Message *msg, void *_data) +{ + if ((_data == NULL) || (getState() != Connected)) + return false; + MSNUserData *data = toMSNUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + MSNPacket *packet; + switch (msg->type()){ + case MessageAuthGranted: + if (data->Flags.toULong() & MSN_ACCEPT) + return false; + packet = new AddPacket(this, "AL", data->EMail.str(), quote(data->ScreenName.str()), 0); + packet->send(); + case MessageAuthRefused: + if (data->Flags.toULong() & MSN_ACCEPT) + return false; + if (msg->getText().isEmpty()){ + if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + msg->setClient(dataName(data)); + EventSent(msg).process(); + } + EventMessageSent(msg).process(); + delete msg; + return true; + } + case MessageGeneric: + case MessageFile: + case MessageUrl: { + SBSocket *sock = dynamic_cast(data->sb.object()); + if (!sock){ + if (getInvisible()) + return false; + Contact *contact; + findContact(data->EMail.str(), contact); + sock = new SBSocket(this, contact, data); + sock->connect(); + data->sb.setObject(sock); + } + return sock->send(msg); + } + case MessageTypingStart: { + SBSocket *sock = dynamic_cast(data->sb.object()); + if (!sock){ + if (getInvisible()) + return false; + Contact *contact; + findContact(data->EMail.str(), contact); + sock = new SBSocket(this, contact, data); + sock->connect(); + data->sb.setObject(sock); + } + sock->setTyping(true); + delete msg; + return true; + } + case MessageTypingStop: { + SBSocket *sock = dynamic_cast(data->sb.object()); + if (!sock) + return false; + sock->setTyping(false); + delete msg; + return true; + } + } + return false; +} + +QString MSNClient::dataName(void *_data) +{ + QString res = name(); + MSNUserData *data = toMSNUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + res += "+"; + res += data->EMail.str(); + return res; +} + +bool MSNClient::isMyData(clientData *&_data, Contact *&contact) +{ + if (_data->Sign.toULong() != MSN_SIGN) + return false; + MSNUserData *data = toMSNUserData(_data); + if (data->EMail.str().toLower() == this->data.owner.EMail.str().toLower()) + return false; + MSNUserData *my_data = findContact(data->EMail.str(), contact); + if (my_data){ + data = my_data; + }else{ + contact = NULL; + } + return true; +} + +bool MSNClient::createData(clientData *&_data, Contact *contact) +{ + MSNUserData *data = toMSNUserData(_data); + MSNUserData *new_data = toMSNUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + new_data->EMail.str() = data->EMail.str(); + _data = (clientData*)new_data; + return true; +} + +void MSNClient::setupContact(Contact *contact, void *_data) +{ + MSNUserData *data = toMSNUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString phones; + if (!data->PhoneHome.str().isEmpty()){ + phones += data->PhoneHome.str(); + phones += ",Home Phone,1"; + } + if (!data->PhoneWork.str().isEmpty()){ + if (!phones.isEmpty()) + phones += ";"; + phones += data->PhoneWork.str(); + phones += ",Work Phone,1"; + } + if (!data->PhoneMobile.str().isEmpty()){ + if (!phones.isEmpty()) + phones += ";"; + phones += data->PhoneMobile.str(); + phones += ",Private Cellular,2"; + } + bool bChanged = contact->setPhones(phones, name()); + bChanged |= contact->setEMails(data->EMail.str(), name()); + if (contact->getName().isEmpty()){ + QString name = data->ScreenName.str(); + if (name.isEmpty()) + name = data->EMail.str(); + int n = name.indexOf('@'); + if (n > 0) + name = name.left(n); + + QString oldName(contact->getName()); + contact->setName(name); + bChanged |= (oldName != name ); + } + if (bChanged) + { + EventContact e(contact, EventContact::eChanged); + e.process(); + } +} + +QString MSNClient::unquote(const QString &s) +{ + QString res; + for (int i = 0; i < (int)(s.length()); i++){ + QChar c = s[i]; + if (c != '%'){ + res += c; + continue; + } + i++; + if (i + 2 > (int)(s.length())) + break; + res += QChar((char)((fromHex(s[i].toAscii()) << 4) + fromHex(s[i+1].toAscii()))); + i++; + } + return res; +} + +// FIXME: what's with non-latin1 characters here? +QString MSNClient::quote(const QString &s) +{ + QString res; + for (int i = 0; i < (int)(s.length()); i++){ + QChar c = s[i]; + if ((c == '%') || (c == ' ') || (c == '+')){ + char b[4]; + sprintf(b, "%%%2X", c.toLatin1()); + res += b; + }else{ + res += c; + } + } + return res; +} + +MSNUserData *MSNClient::findContact(const QString &mail, Contact *&contact) +{ + ContactList::ContactIterator itc; + while ((contact = ++itc) != NULL){ + MSNUserData *res; + ClientDataIterator it(contact->clientData, this); + while ((res = toMSNUserData(++it)) != NULL){ + if (res->EMail.str() == mail) + return res; + } + } + return NULL; +} + +QString MSNClient::contactName(void *clientData) +{ + MSNUserData *data = toMSNUserData((SIM::clientData*)clientData); // FIXME unsafe type conversion + return "MSN: " + data->EMail.str(); +} + +MSNUserData *MSNClient::findContact(const QString &mail, const QString &name, Contact *&contact, bool bJoin) +{ + unsigned i; + for (i = 1; i <= getNDeleted(); i++){ + if (getDeleted(i) == mail) + break; + } + if (i <= getNDeleted()){ + QStringList deleted; + for (i = 1; i <= getNDeleted(); i++){ + if (getDeleted(i) == mail) + continue; + deleted.push_back(getDeleted(i)); + } + setNDeleted(0); + for (QStringList::iterator it = deleted.begin(); it != deleted.end(); ++it){ + setNDeleted(getNDeleted() + 1); + setDeleted(getNDeleted(), (*it)); + } + } + QString name_str = unquote(name); + MSNUserData *data = findContact(mail, contact); + if (data){ + data->ScreenName.str() = name; + setupContact(contact, data); + return data; + } + if (bJoin){ + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + if (contact->getName() == name_str){ + data = toMSNUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + data->EMail.str() = mail; + data->ScreenName.str() = name; + setupContact(contact, data); + EventContact e(contact, EventContact::eChanged); + e.process(); + return data; + } + } + it.reset(); + while ((contact = ++it) != NULL){ + if (contact->getName().toLower() == name_str.toLower()){ + data = toMSNUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + data->EMail.str() = mail; + data->ScreenName.str() = name; + setupContact(contact, data); + EventContact e(contact, EventContact::eChanged); + e.process(); + m_bJoin = true; + return data; + } + } + int n = name_str.indexOf('@'); + if (n > 0){ + name_str = name_str.left(n); + it.reset(); + while ((contact = ++it) != NULL){ + if (contact->getName().toLower() == name_str.toLower()){ + data = toMSNUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + data->EMail.str() = mail; + data->ScreenName.str() = name; + setupContact(contact, data); + EventContact e(contact, EventContact::eChanged); + e.process(); + m_bJoin = true; + return data; + } + } + } + } + contact = getContacts()->contact(0, true); + data = toMSNUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + data->EMail.str() = mail; + data->ScreenName.str() = name; + contact->setName(name_str); + EventContact e(contact, EventContact::eChanged); + e.process(); + return data; +} + +MSNUserData *MSNClient::findGroup(unsigned long id, const QString &name, Group *&grp) +{ + ContactList::GroupIterator itg; + while ((grp = ++itg) != NULL){ + ClientDataIterator it(grp->clientData, this); + MSNUserData *res = toMSNUserData(++it); + if ((res == NULL) || (res->Group.toULong() != id)) + continue; + if (!name.isEmpty() && res->ScreenName.setStr(name)){ + grp->setName(name); + EventGroup e(grp, EventGroup::eChanged); + e.process(); + } + return res; + } + if (name.isEmpty()) + return NULL; + QString grpName = name; + itg.reset(); + while ((grp = ++itg) != NULL){ + if (grp->getName() != grpName) + continue; + MSNUserData *res = toMSNUserData((SIM::clientData*)grp->clientData.createData(this)); // FIXME unsafe type conversion + res->Group.asULong() = id; + res->ScreenName.str() = name; + return res; + } + grp = getContacts()->group(0, true); + MSNUserData *res = toMSNUserData((SIM::clientData*)grp->clientData.createData(this)); // FIXME unsafe type conversion + res->Group.asULong() = id; + res->ScreenName.str() = name; + grp->setName(grpName); + EventGroup e(grp, EventGroup::eChanged); + e.process(); + return res; +} + +void MSNClient::auth_message(Contact *contact, unsigned type, MSNUserData *data) +{ + AuthMessage *msg = new AuthMessage(type); + msg->setClient(dataName(data)); + msg->setContact(contact->id()); + msg->setFlags(MESSAGE_RECEIVED); + EventMessageReceived e(msg); + if(!e.process()) + delete msg; +} + +bool MSNClient::done(unsigned code, Buffer&, const QString &headers) +{ + switch (m_state){ + case LoginHost: + if (code == 200){ + QString h = getHeader("PassportURLs", headers); + if (h.isEmpty()){ + socket()->error_state("No PassportURLs answer"); + break; + } + QString loginHost = getValue("DALogin", h); + if (loginHost.isEmpty()){ + socket()->error_state("No DALogin in PassportURLs answer"); + break; + } + QString loginUrl = "https://" + loginHost; + requestTWN(loginUrl); + }else{ + socket()->error_state("Bad answer code"); + } + break; + case TWN: + if (code == 200){ + QString h = getHeader("Authentication-Info", headers); + if (h.isEmpty()){ + socket()->error_state("No Authentication-Info answer"); + break; + } + QString twn = getValue("from-PP", h); + if (twn.isEmpty()){ + socket()->error_state("No from-PP in Authentication-Info answer"); + break; + } + MSNPacket *packet = new UsrPacket(this, twn); + packet->send(); + }else if (code == 401){ + authFailed(); + }else{ + socket()->error_state("Bad answer code"); + } + break; + default: + log(L_WARN, "Fetch done in bad state"); + } + return false; +} + +bool MSNClient::processEvent(Event *e) +{ + TCPClient::processEvent(e); + switch(e->type()) { + case eEventCommandExec: { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->id == static_cast(protocol()->plugin())->MSNInitMail){ + EventGoURL(m_init_mail).process(); + return true; + } + if (cmd->id == static_cast(protocol()->plugin())->MSNNewMail){ + EventGoURL(m_new_mail).process(); + return true; + } + break; + } + case eEventAddContact: { + EventAddContact *ec = static_cast(e); + EventAddContact::AddContact *ac = ec->addContact(); + if (!ac->proto.isEmpty() && (protocol()->description()->text == ac->proto)) + { + Contact *contact = NULL; + findContact(ac->addr, ac->nick, contact); + if (contact && contact->getGroup() != ac->group) + { + contact->setGroup(ac->group); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + ec->setContact(contact); + return true; + } + break; + } + case eEventDeleteContact: { + EventDeleteContact *ec = static_cast(e); + QString addr = ec->alias(); + ContactList::ContactIterator it; + Contact *contact; + while ((contact = ++it) != NULL){ + MSNUserData *data; + ClientDataIterator itc(contact->clientData, this); + while ((data = toMSNUserData(++itc)) != NULL){ + if (data->EMail.str() == addr){ + contact->clientData.freeData(data); + ClientDataIterator itc(contact->clientData); + if (++itc == NULL) + delete contact; + return true; + } + } + } + break; + } + case eEventGetContactIP: { + EventGetContactIP *ei = static_cast(e); + Contact *contact = ei->contact(); + MSNUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toMSNUserData(++it)) != NULL){ + if (data->IP.ip()) { + ei->setIP(data->IP.ip()); + return true; + } + } + break; + } + case eEventMessageAccept: { + EventMessageAccept *ema = static_cast(e); + Contact *contact = getContacts()->contact(ema->msg()->contact()); + if (contact == NULL) + return false; + MSNUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toMSNUserData(++it)) != NULL){ + if (dataName(data) == ema->msg()->client()){ + SBSocket *sock = dynamic_cast(data->sb.object()); + if (sock) + sock->acceptMessage(ema->msg(), ema->dir(), ema->mode()); + return true; + } + } + break; + } + case eEventMessageDecline: { + EventMessageDecline *emd = static_cast(e); + Contact *contact = getContacts()->contact(emd->msg()->contact()); + if (contact == NULL) + return false; + MSNUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toMSNUserData(++it)) != NULL){ + if (dataName(data) == emd->msg()->client()){ + SBSocket *sock = dynamic_cast(data->sb.object()); + if (sock) + sock->declineMessage(emd->msg(), emd->reason()); + return true; + } + } + break; + } + case eEventContact: { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + switch(ec->action()) { + case EventContact::eDeleted: { + MSNUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toMSNUserData(++it)) != NULL){ + findRequest(data->EMail.str(), LR_CONTACTxCHANGED, true); + MSNListRequest lr; + if (data->Group.toULong() != NO_GROUP){ + lr.Type = LR_CONTACTxREMOVED; + lr.Name = data->EMail.str(); + lr.Group = data->Group.toULong(); + m_requests.push_back(lr); + } + if (data->Flags.toULong() & MSN_BLOCKED){ + lr.Type = LR_CONTACTxREMOVED_BL; + lr.Name = data->EMail.str(); + m_requests.push_back(lr); + } + } + processRequests(); + break; + } + case EventContact::eChanged: { + MSNUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toMSNUserData(++it)) != NULL){ + bool bChanged = false; + if (contact->getIgnore() != ((data->Flags.toULong() & MSN_BLOCKED) != 0)) + bChanged = true; + if (contact->getGroup() != (int)(data->Group.toULong())) + bChanged = true; + if (contact->getName() != data->ScreenName.str()) + bChanged = true; + if (!bChanged) + continue; + findRequest(data->EMail.str(), LR_CONTACTxCHANGED, true); + MSNListRequest lr; + lr.Type = LR_CONTACTxCHANGED; + lr.Name = data->EMail.str(); + m_requests.push_back(lr); + } + processRequests(); + break; + } + default: + break; + } + break; + } + case eEventGroup: { + EventGroup *ev = static_cast(e); + Group *grp = ev->group(); + switch (ev->action()) { + case EventGroup::eChanged: { + ClientDataIterator it(grp->clientData, this); + MSNUserData *data = toMSNUserData(++it); + if ((data == NULL) || (grp->getName() != data->ScreenName.str())){ + findRequest(grp->id(), LR_GROUPxCHANGED, true); + MSNListRequest lr; + lr.Type = LR_GROUPxCHANGED; + lr.Name = QString::number(grp->id()); + m_requests.push_back(lr); + processRequests(); + } + break; + } + case EventGroup::eDeleted: { + ClientDataIterator it(grp->clientData, this); + MSNUserData *data = toMSNUserData(++it); + if (data){ + findRequest(grp->id(), LR_GROUPxCHANGED, true); + MSNListRequest lr; + lr.Type = LR_GROUPxREMOVED; + lr.Name = QString::number(data->Group.toULong()); + m_requests.push_back(lr); + processRequests(); + } + break; + } + case EventGroup::eAdded: + break; + } + break; + } + case eEventMessageCancel: { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + for (list::iterator it = m_SBsockets.begin(); it != m_SBsockets.end(); ++it){ + if ((*it)->cancelMessage(msg)) + return msg; + } + break; + } + default: + break; + } + return false; +} + +void MSNClient::requestLoginHost(const QString &url) +{ + if (!isDone()) + return; + m_state = LoginHost; + fetch(url); +} + +void MSNClient::requestTWN(const QString &url) +{ + if (!isDone()) + return; + QString auth = "Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%%3A%%2F%%2Fmessenger%%2Emsn%%2Ecom,sign-in="; + auth += quote(getLogin()); + auth += ",pwd="; + auth += quote(getPassword()); + auth += ","; + auth += m_authChallenge; + m_state = TWN; + fetch(url, auth); +} + +QString MSNClient::getValue(const QString &key, const QString &str) +{ + QString s = str; + while (!s.isEmpty()){ + QString k = getToken(s, '='); + QString v; + if (s.startsWith("\'")){ + getToken(s, '\''); + v = getToken(s, '\''); + getToken(s, ','); + }else{ + v = getToken(s, ','); + } + if (k == key) + return v; + } + return QString::null; +} + +QString MSNClient::getHeader(const QString &name, const QString &headers) +{ + int idx = headers.indexOf(name + ':'); + if(idx != -1) { + int end = headers.indexOf('\n', idx); + QString res; + if(end == -1) + res = headers.mid(idx); + else + res = headers.mid(idx, end - idx + 1); + return res.trimmed(); + } + return QString::null; +} + +MSNListRequest *MSNClient::findRequest(unsigned long id, unsigned type, bool bDelete) +{ + if (m_requests.empty()) + return NULL; + return findRequest(QString::number(id), type, bDelete); +} + +MSNListRequest *MSNClient::findRequest(const QString &name, unsigned type, bool bDelete) +{ + if (m_requests.empty()) + return NULL; + for (list::iterator it = m_requests.begin(); it != m_requests.end(); ++it){ + if ((it->Type == type) && (it->Name == name)){ + if (bDelete){ + m_requests.erase(it); + return NULL; + } + return &(*it); + } + } + return NULL; +} + +void MSNClient::processRequests() +{ + if (m_requests.empty() || (getState() != Connected)) + return; + for (list::iterator it = m_requests.begin(); it != m_requests.end(); ++it){ + Group *grp; + Contact *contact; + MSNPacket *packet = NULL; + MSNUserData *data; + switch (it->Type){ + case LR_CONTACTxCHANGED: + data = findContact(it->Name, contact); + if (data){ + bool bBlock = (data->Flags.toULong() & MSN_BLOCKED) != 0; + if (contact->getIgnore() != bBlock){ + if (contact->getIgnore()){ + if (data->Flags.toULong() & MSN_FORWARD) + packet = new RemPacket(this, "FL", it->Name); + if (data->Flags.toULong() & MSN_ACCEPT){ + if (packet) + packet->send(); + packet = new RemPacket(this, "AL", it->Name); + } + data->Flags.asULong() &= ~(MSN_FORWARD | MSN_ACCEPT); + if (packet) + packet->send(); + packet = new AddPacket(this, "BL", data->EMail.str(), quote(contact->getName())); + data->ScreenName.str() = contact->getName(); + data->Flags.asULong() |= MSN_BLOCKED; + }else{ + packet = new RemPacket(this, "BL", data->EMail.str()); + data->Flags.asULong() &= ~MSN_BLOCKED; + } + } + if (data->Flags.toULong() & MSN_BLOCKED) + break; + unsigned grp_id = 0; + if (contact->getGroup()){ + Group *grp = getContacts()->group(contact->getGroup()); + if(grp) { + ClientDataIterator it(grp->clientData, this); + MSNUserData *res = toMSNUserData(++it); + if (res) + grp_id = res->Group.toULong(); + } + } + if (((data->Flags.toULong() & MSN_FORWARD) == 0) || (data->Group.toULong() == NO_GROUP)){ + if (packet) + packet->send(); + packet = new AddPacket(this, "FL", data->EMail.str(), quote(data->ScreenName.str()), grp_id); + data->Group.asULong() = grp_id; + data->Flags.asULong() |= MSN_FORWARD; + } + if (getAutoAuth() && (data->Flags.toULong() & MSN_FORWARD) && ((data->Flags.toULong() & MSN_ACCEPT) == 0) && ((data->Flags.toULong() & MSN_BLOCKED) == 0)){ + if (packet) + packet->send(); + packet = new AddPacket(this, "AL", data->EMail.str(), quote(data->ScreenName.str()), 0); + data->Group.asULong() = grp_id; + data->Flags.asULong() |= MSN_ACCEPT; + } + if (data->Group.toULong() != grp_id){ + if (packet) + packet->send(); + packet = new AddPacket(this, "FL", data->EMail.str(), quote(data->ScreenName.str()), grp_id); + packet->send(); + packet = NULL; + packet = new RemPacket(this, "FL", data->EMail.str(), data->Group.toULong()); + data->Group.asULong() = grp_id; + } + if (contact->getName() != data->ScreenName.str()){ + if (packet) + packet->send(); + packet = new ReaPacket(this, data->EMail.str(), quote(contact->getName())); + data->ScreenName.str() = contact->getName(); + } + } + break; + case LR_CONTACTxREMOVED: + packet = new RemPacket(this, "AL", it->Name); + packet->send(); + packet = new RemPacket(this, "FL", it->Name); + setNDeleted(getNDeleted() + 1); + setDeleted(getNDeleted(), it->Name); + break; + case LR_CONTACTxREMOVED_BL: + packet = new RemPacket(this, "BL", it->Name); + break; + case LR_GROUPxCHANGED: + grp = getContacts()->group(it->Name.toULong()); + if (grp){ + ClientDataIterator it(grp->clientData, this); + data = toMSNUserData(++it); + if (data){ + packet = new RegPacket(this, data->Group.toULong(), quote(grp->getName())); + }else{ + packet = new AdgPacket(this, grp->id(), quote(grp->getName())); + data = toMSNUserData((SIM::clientData*)grp->clientData.createData(this)); // FIXME unsafe type conversion + } + data->ScreenName.str() = grp->getName(); + } + break; + case LR_GROUPxREMOVED: + packet = new RmgPacket(this, it->Name.toULong()); + break; + } + if (packet) + packet->send(); + } + m_requests.clear(); +} + +bool MSNClient::add(const QString &mail, const QString &name, unsigned grp) +{ + Contact *contact; + MSNUserData *data = findContact(mail, contact); + if (data) + { + if (contact->getGroup() != (int)grp) + { + contact->setGroup(grp); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + return false; + } + data = findContact(mail, name, contact); + if (!data) + return false; + contact->setGroup(grp); + EventContact e(contact, EventContact::eChanged); + e.process(); + return true; +} + +bool MSNClient::compareData(void *d1, void *d2) +{ + return (toMSNUserData((SIM::clientData*)d1)->EMail.str() == (toMSNUserData((SIM::clientData*)d2)->EMail.str())); // FIXME unsafe type conversion +} + +static void addIcon(QSet *s, const QString &icon, const QString &statusIcon) +{ + if (!s || statusIcon == icon) + return; + s->insert(icon); +} + +void MSNClient::contactInfo(void *_data, unsigned long &curStatus, unsigned&, QString &statusIcon, QSet *icons) +{ + MSNUserData *data = toMSNUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + unsigned cmp_status = data->Status.toULong(); + const CommandDef *def; + for (def = protocol()->statusList(); !def->text.isEmpty(); def++){ + if (def->id == cmp_status) + break; + } + if ((cmp_status == STATUS_BRB) || (cmp_status == STATUS_PHONE) || (cmp_status == STATUS_LUNCH)) + cmp_status = STATUS_AWAY; + if (data->Status.toULong() > curStatus){ + curStatus = data->Status.toULong(); + if (!statusIcon.isEmpty() && icons){ + icons->insert(statusIcon); + } + statusIcon = def->icon; + }else{ + if (!statusIcon.isEmpty()){ + addIcon(icons, def->icon, statusIcon); + }else{ + statusIcon = def->icon; + } + } + if (icons && data->typing_time.toULong()) + addIcon(icons, "typing", statusIcon); +} + +QString MSNClient::contactTip(void *_data) +{ + MSNUserData *data = toMSNUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + unsigned long status = STATUS_UNKNOWN; + unsigned style = 0; + QString statusIcon; + contactInfo(data, status, style, statusIcon); + QString res; + res += ""; + QString statusText; + for (const CommandDef *cmd = protocol()->statusList(); !cmd->text.isEmpty(); cmd++){ + if (cmd->icon == statusIcon){ + res += " "; + statusText = i18n(cmd->text); + res += statusText; + break; + } + } + res += "
    "; + res += data->EMail.str(); + res += "
    "; + if (data->Status.toULong() == STATUS_OFFLINE){ + if (data->StatusTime.toULong()){ + res += "
    "; + res += i18n("Last online"); + res += ": "; + res += formatDateTime(data->StatusTime.toULong()); + } + }else{ + if (data->OnlineTime.toULong()){ + res += "
    "; + res += i18n("Online"); + res += ": "; + res += formatDateTime(data->OnlineTime.toULong()); + } + if (data->Status.toULong() != STATUS_ONLINE){ + res += "
    "; + res += statusText; + res += ": "; + res += formatDateTime(data->StatusTime.toULong()); + } + } + if (data->IP.ip()) + { + res += "
    "; + res += formatAddr(data->IP, data->Port.toULong()); + } + if (data->RealIP.ip() && ((data->IP.ip() == NULL) || (get_ip(data->IP) != get_ip(data->RealIP)))) + { + res += "
    "; + res += formatAddr(data->RealIP, data->Port.toULong()); + } + return res; +} + +QWidget *MSNClient::searchWindow(QWidget *parent) +{ + if (getState() != Connected) + return NULL; + return new MSNSearch(this, parent); +} + + +MSNUserData* MSNClient::toMSNUserData(SIM::clientData * data) +{ + // This function is used to more safely preform type conversion from SIM::clientData* into MSNUserData* + // It will at least warn if the content of the structure is not MSNUserData + // Brave wariors may uncomment abort() function call to know for sure about wrong conversion ;-) + if (! data) return NULL; + if (data->Sign.asULong() != MSN_SIGN) + { + QString Signs[] = { + "Unknown(0)" , // 0x0000 + "ICQ_SIGN", // 0x0001 + "JABBER_SIGN", // 0x0002 + "MSN_SIGN", // 0x0003 + "Unknown(4)" // 0x0004 + "LIVEJOURNAL_SIGN",// 0x0005 + "SMS_SIGN", // 0x0006 + "Unknown(7)", // 0x0007 + "Unknown(8)", // 0x0008 + "YAHOO_SIGN" // 0x0009 + }; + QString Sign; + if (data->Sign.toULong()<=9) // is always >=0 as it is unsigned int + Sign = Signs[data->Sign.toULong()]; + else + Sign = QString("Unknown(%1)").arg(Sign.toULong()); + + log(L_ERROR, + "ATTENTION!! Unsafly converting %s user data into MSN_SIGN", + qPrintable(Sign)); +// abort(); + } + return (MSNUserData*) data; +} + + +SBSocket::SBSocket(MSNClient *client, Contact *contact, MSNUserData *data) +{ + m_state = Unknown; + m_client = client; + m_contact = contact; + m_data = data; + m_socket = new ClientSocket(this, client->createSBSocket()); + m_packet_id = 0; + m_messageSize = 0; + m_invite_cookie = get_random(); + m_bTyping = false; + m_client->m_SBsockets.push_back(this); +} + +SBSocket::~SBSocket() +{ + if (m_packet) + m_packet->clear(); + if (m_socket) + delete m_socket; + list::iterator it = find(m_client->m_SBsockets.begin(), m_client->m_SBsockets.end(), this); + if (it != m_client->m_SBsockets.end()) + m_client->m_SBsockets.erase(it); + if (m_data){ + m_data->sb.clear(); + if (m_data->typing_time.toULong()){ + m_data->typing_time.asULong() = 0; + EventContact e(m_contact, EventContact::eStatus);; + e.process(); + } + } + list::iterator itm; + for (itm = m_queue.begin(); itm != m_queue.end(); ++itm){ + Message *msg = (*itm); + msg->setError(I18N_NOOP("Contact go offline")); + EventMessageSent(msg).process(); + delete msg; + } + list::iterator itw; + for (itw = m_waitMsg.begin(); itw != m_waitMsg.end(); ++itw){ + Message *msg = itw->msg; + msg->setError(I18N_NOOP("Contact go offline")); + EventMessageSent(msg).process(); + delete msg; + } + for (itw = m_acceptMsg.begin(); itw != m_acceptMsg.end(); ++itw){ + Message *msg = itw->msg; + EventMessageDeleted(msg).process(); + delete msg; + } +} + +void SBSocket::connect() +{ + m_packet = new XfrPacket(m_client, this); + m_packet->send(); +} + +void SBSocket::connect(const QString &addr, const QString &session, const QString &cookie, bool bDirection) +{ + m_packet = NULL; + if (m_state != Unknown){ + log(L_DEBUG, "Connect in bad state"); + return; + } + if (bDirection){ + m_state = ConnectingSend; + }else{ + m_state = ConnectingReceive; + } + m_cookie = cookie; + m_session = session; + QString ip = addr; + unsigned short port = 0; + int n = ip.indexOf(':'); + if (n > 0){ + port = ip.mid(n + 1).toUShort(); + ip = ip.left(n); + } + if (port == 0){ + m_socket->error_state("Bad address"); + return; + } + m_socket->connect(ip, port, m_client); +} + +bool SBSocket::send(Message *msg) +{ + + m_bTyping = false; + m_queue.push_back(msg); + switch (m_state){ + case Unknown: + connect(); + break; + case Connected: + process(); + break; + default: + break; + } + return true; +} + +bool SBSocket::error_state(const QString&, unsigned) +{ + if (m_queue.size()){ + m_socket->close(); + connect(); + return false; + } + return true; +} + +void SBSocket::connect_ready() +{ + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + m_socket->setRaw(true); + QString args = m_client->data.owner.EMail.str(); + args += ' '; + args += m_cookie; + m_cookie = QString::null; + switch (m_state){ + case ConnectingSend: + send("USR", args); + m_state = WaitJoin; + break; + case ConnectingReceive: + args += " "; + args += m_session; + send("ANS", args); + m_state = Connected; + process(); + break; + default: + log(L_WARN, "Bad state for connect ready"); + } +} + +void SBSocket::packet_ready() +{ + if (m_socket->readBuffer().writePos() == 0) + return; + MSNPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->readBuffer(), false, plugin->MSNPacket); + for (;;){ + if (m_messageSize && !getMessage()) + break; + QByteArray s; + if (!m_socket->readBuffer().scan("\r\n", s)) + break; + getLine(s); + } + if (m_socket->readBuffer().readPos() == m_socket->readBuffer().writePos()) + m_socket->readBuffer().init(0); +} + +void SBSocket::getMessage(unsigned size) +{ + m_messageSize = size; + m_message = QString::null; + getMessage(); +} + +bool SBSocket::getMessage() +{ + unsigned tail = m_socket->readBuffer().writePos() - m_socket->readBuffer().readPos(); + if (tail > m_messageSize) + tail = m_messageSize; + QString msg; + m_socket->readBuffer().unpack(msg, tail); + m_message += msg; + m_messageSize -= tail; + if (m_messageSize) + return false; + messageReady(); + return true; +} + +void SBSocket::send(const QString &cmd, const QString &args) +{ + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer() + << (const char*)cmd.toUtf8() + << " " + << (const char*)QString::number(++m_packet_id).toUtf8(); + if (!args.isEmpty()){ + m_socket->writeBuffer() + << " " + << (const char*)args.toUtf8(); + } + m_socket->writeBuffer() << "\r\n"; + MSNPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->writeBuffer(), true, plugin->MSNPacket); + m_socket->write(); +} + +void SBSocket::getLine(const QByteArray &_line) +{ + QString line = QString::fromUtf8(_line); + QString cmd = getToken(line, ' '); + if (cmd == "BYE"){ + m_socket->error_state(""); + return; + } + if (cmd == "MSG"){ + QString email = getToken(line, ' '); + getToken(line, ' '); + unsigned size = line.toUInt(); + getMessage(size); + } + if (cmd == "JOI"){ + if (m_state != WaitJoin){ + log(L_WARN, "JOI in bad state"); + return; + } + m_state = Connected; + process(); + } + if (cmd == "USR") + send("CAL", m_data->EMail.str()); + if ((cmd == "ACK") || (cmd == "NAK")){ + unsigned id = getToken(line, ' ').toUInt(); + if (id != m_msg_id){ + log(L_WARN, "Bad ACK id"); + return; + } + if (m_queue.empty()) + return; + Message *msg = m_queue.front(); + if (cmd == "NAK"){ + m_msgText = QString::null; + msg->setError(I18N_NOOP("Send message failed")); + EventMessageSent(msg).process(); + delete msg; + m_queue.erase(m_queue.begin()); + process(false); + return; + } + if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0){ + Message m(MessageGeneric); + m.setContact(m_contact->id()); + m.setClient(m_client->dataName(m_data)); + m.setText(m_msgPart); + m.setForeground(msg->getForeground()); + m.setBackground(0xFFFFFF); + m.setFont(msg->getFont()); + EventSent(&m).process(); + } + if (m_msgText.isEmpty()){ + if (msg->type() == MessageFile){ + sendFile(); + }else{ + EventMessageSent(msg).process(); + delete msg; + m_queue.erase(m_queue.begin()); + } + } + process(); + } +} + +typedef map STR_VALUES; + +static STR_VALUES parseValues(const QString &str) +{ + STR_VALUES res; + QString s = str.trimmed(); + while (!s.isEmpty()){ + QString p = getToken(s, ';', false).trimmed(); + QString key = getToken(p, '=', false); + STR_VALUES::iterator it = res.find(key); + if (it == res.end()){ + res.insert(STR_VALUES::value_type(key, p)); + }else{ + it->second = p; + } + s = s.trimmed(); + } + return res; +} + +static char FT_GUID[] = "{5D3E02AB-6190-11d3-BBBB-00C04F795683}"; + +void SBSocket::messageReady() +{ + log(L_DEBUG, "MSG: [%s]", qPrintable(m_message)); + QString content_type; + QString charset; + QString font; + QString typing; + unsigned color = 0; + bool bColor = false; + while (!m_message.isEmpty()){ + int n = m_message.indexOf("\r\n"); + if (n < 0){ + log(L_DEBUG, "Error parse message"); + return; + } + if (n == 0){ + m_message = m_message.mid(2); + break; + } + QString line = m_message.left(n); + m_message = m_message.mid(n + 2); + QString key = getToken(line, ':', false); + if (key == "Content-Type"){ + line = line.trimmed(); + content_type = getToken(line, ';').trimmed(); + STR_VALUES v = parseValues(line.trimmed()); + STR_VALUES::iterator it = v.find("charset"); + if (it != v.end()) + charset = it->second; + continue; + } + if (key == "X-MMS-IM-Format"){ + STR_VALUES v = parseValues(line.trimmed()); + STR_VALUES::iterator it = v.find("FN"); + if (it != v.end()) + font = m_client->unquote(it->second); + it = v.find("EF"); + if (it != v.end()){ + QString effects = it->second; + if (effects.indexOf('B') != -1) + font += ", bold"; + if (effects.indexOf('I') != -1) + font += ", italic"; + if (effects.indexOf('S') != -1) + font += ", strikeout"; + if (effects.indexOf('U') != -1) + font += ", underline"; + } + it = v.find("CO"); + if (it != v.end()) + color = it->second.toULong(&bColor, 16); + continue; + } + if (key == "TypingUser"){ + typing = line.trimmed(); + continue; + } + } + if (content_type == "text/plain"){ + if (m_data->typing_time.toULong()){ + m_data->typing_time.asULong() = 0; + EventContact e(m_contact, EventContact::eStatus);; + e.process(); + } + QString msg_text = m_message; + msg_text = msg_text.remove('\r'); + Message *msg = new Message(MessageGeneric); + msg->setFlags(MESSAGE_RECEIVED); + if (bColor){ + msg->setBackground(0xFFFFFF); + msg->setForeground(color); + } + msg->setFont(font); + msg->setText(msg_text); + msg->setContact(m_contact->id()); + msg->setClient(m_client->dataName(m_data)); + EventMessageReceived e(msg); + if (!e.process()) + delete msg; + return; + } + if (content_type == "text/x-msmsgscontrol"){ + if (typing.toLower() == m_data->EMail.str().toLower()){ + bool bEvent = (m_data->typing_time.toULong() == 0); + QDateTime now(QDateTime::currentDateTime()); + m_data->typing_time.asULong() = now.toTime_t(); + if (bEvent) + { + EventContact e(m_contact, EventContact::eStatus);; + e.process(); + } + } + } + if (content_type == "text/x-msmsgsinvite"){ + QString file; + QString command; + QString guid; + QString code; + QString ip_address; + QString ip_address_internal; + unsigned short port = 0; + unsigned short port_x = 0; + unsigned cookie = 0; + unsigned auth_cookie = 0; + unsigned fileSize = 0; + while (!m_message.isEmpty()){ + QString line; + int n = m_message.indexOf("\r\n"); + if (n < 0){ + line = m_message; + m_message = QString::null; + }else{ + line = m_message.left(n); + m_message = m_message.mid(n + 2); + } + QString key = getToken(line, ':', false); + line = line.trimmed(); + if (key == "Application-GUID"){ + guid = line; + continue; + } + if (key == "Invitation-Command"){ + command = line; + continue; + } + if (key == "Invitation-Cookie"){ + cookie = line.toULong(); + continue; + } + if (key == "Application-File"){ + file = line; + continue; + } + if (key == "Application-FileSize"){ + fileSize = line.toULong(); + continue; + } + if (key == "Cancel-Code"){ + code = line; + continue; + } + if (key == "IP-Address"){ + ip_address = line; + continue; + } + if (key == "IP-Address-Internal"){ + ip_address_internal = line; + continue; + } + if (key == "Port"){ + port = line.toUShort(); + continue; + } + if (key == "PortX"){ + port_x = line.toUShort(); + continue; + } + if (key == "AuthCookie"){ + auth_cookie = line.toULong(); + continue; + } + + } + if (cookie == 0){ + log(L_WARN, "No cookie in message"); + return; + } + if (command == "INVITE"){ + if (guid != FT_GUID){ + log(L_WARN, "Unknown GUID %s", qPrintable(guid)); + return; + } + if (file.isEmpty()){ + log(L_WARN, "No file in message"); + return; + } + FileMessage *msg = new FileMessage; + msg->setDescription(m_client->unquote(file)); + msg->setSize(fileSize); + msg->setFlags(MESSAGE_RECEIVED | MESSAGE_TEMP); + msg->setContact(m_contact->id()); + msg->setClient(m_client->dataName(m_data)); + msgInvite m; + m.msg = msg; + m.cookie = cookie; + m_acceptMsg.push_back(m); + EventMessageReceived e(msg); + if (e.process()){ + for (list::iterator it = m_acceptMsg.begin(); it != m_acceptMsg.end(); ++it){ + if (it->msg == msg){ + m_acceptMsg.erase(it); + break; + } + } + } + }else if (command == "ACCEPT"){ + unsigned ip = QHostAddress(ip_address).toIPv4Address(); + unsigned real_ip = QHostAddress(ip_address_internal).toIPv4Address(); + if (ip != INADDR_NONE) + set_ip(&m_data->IP, ip); + if (real_ip != INADDR_NONE) + set_ip(&m_data->RealIP, real_ip); + if (port) + m_data->Port.asULong() = port; + list::iterator it; + for (it = m_waitMsg.begin(); it != m_waitMsg.end(); ++it){ + if (it->cookie == cookie){ + Message *msg = it->msg; + if (msg->type() == MessageFile){ + m_waitMsg.erase(it); + FileMessage *m = static_cast(msg); + MSNFileTransfer *ft; + bool bNew = false; + if (m->m_transfer){ + ft = static_cast(m->m_transfer); + }else{ + ft = new MSNFileTransfer(m, m_client, m_data); + bNew = true; + } + ft->ip1 = real_ip; + ft->port1 = port; + ft->ip2 = ip; + ft->port2 = port_x; + ft->auth_cookie = auth_cookie; + + if (bNew){ + EventMessageAcked(msg).process(); + } + ft->connect(); + break; + } + msg->setError("Bad type"); + EventMessageSent(msg).process(); + delete msg; + return; + } + } + if (it == m_waitMsg.end()) + log(L_WARN, "No message for accept"); + return; + }else if (command == "CANCEL"){ + if (code == "REJECT"){ + list::iterator it; + for (it = m_waitMsg.begin(); it != m_waitMsg.end(); ++it){ + if (it->cookie == cookie){ + Message *msg = it->msg; + msg->setError(I18N_NOOP("Message declined")); + EventMessageSent(msg).process(); + delete msg; + m_waitMsg.erase(it); + break; + } + } + if (it == m_waitMsg.end()) + log(L_WARN, "No message for cancel"); + return; + } + list::iterator it; + for (it = m_acceptMsg.begin(); it != m_acceptMsg.end(); ++it){ + if (it->cookie == cookie){ + Message *msg = it->msg; + EventMessageDeleted(msg).process(); + delete msg; + m_acceptMsg.erase(it); + break; + } + } + if (it == m_acceptMsg.end()) + log(L_WARN, "No message for cancel"); + }else{ + log(L_WARN, "Unknown command %s", qPrintable(command)); + return; + } + } +} + +void SBSocket::timer(unsigned now) +{ + if (m_data->typing_time.toULong()){ + if (now >= m_data->typing_time.toULong() + TYPING_TIME){ + m_data->typing_time.asULong() = 0; + EventContact e(m_contact, EventContact::eStatus);; + e.process(); + } + } + sendTyping(); +} + +void SBSocket::setTyping(bool bTyping) +{ + if (m_bTyping == bTyping) + return; + m_bTyping = bTyping; + sendTyping(); +} + +void SBSocket::sendTyping() +{ + if (m_bTyping && (m_state == Connected)){ + QString message; + message += "MIME-Version: 1.0\r\n"; + message += "Content-Type: text/x-msmsgcontrol\r\n"; + message += "TypingUser: "; + message += m_client->data.owner.EMail.str(); + message += "\r\n"; + message += "\r\n"; + sendMessage(message, "U"); + } +} + +void SBSocket::sendMessage(const QString &str, const char *type) +{ + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer() + << "MSG " + << (const char*)QString::number(++m_packet_id).toUtf8() + << " " + << type + << " " + << (const char*)QString::number(str.toUtf8().length()).toUtf8() + << "\r\n" + << (const char*)str.toUtf8(); + MSNPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->writeBuffer(), true, plugin->MSNPacket); + m_socket->write(); +} + +bool SBSocket::cancelMessage(Message *msg) +{ + if (m_queue.empty()) + return false; + if (m_queue.front() == msg){ + m_msgPart = QString::null; + m_msgText = QString::null; + m_msg_id = 0; + m_queue.erase(m_queue.begin()); + process(); + return true; + } + list::iterator it = find(m_queue.begin(), m_queue.end(), msg); + if (it == m_queue.end()) + return false; + m_queue.erase(it); + delete msg; + return true; +} + +void SBSocket::sendFile() +{ + if (m_queue.empty()) + return; + Message *msg = m_queue.front(); + if (msg->type() != MessageFile) + return; + m_queue.erase(m_queue.begin()); + FileMessage *m = static_cast(msg); + if (++m_invite_cookie == 0) + m_invite_cookie++; + msgInvite mi; + mi.msg = msg; + mi.cookie = m_invite_cookie; + m_waitMsg.push_back(mi); + QString message; + message += "MIME-Version: 1.0\r\n"; + message += "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n" + "Application-Name: File Transfer\r\n" + "Application-GUID: "; + message += FT_GUID; + message += "\r\n" + "Invitation-Command: INVITE\r\n" + "Invitation-Cookie: "; + message += QString::number(m_invite_cookie); + message += "\r\n" + "Application-File: "; + QString name; + unsigned size; + if (m->m_transfer){ + name = m->m_transfer->m_file->fileName(); + size = m->m_transfer->fileSize(); + }else{ + FileMessage::Iterator it(*m); + if (it[0]) + name = *it[0]; + size = it.size(); + } + name = name.replace('\\', '/'); + int n = name.lastIndexOf('/'); + if (n >= 0) + name = name.mid(n + 1); + message += m_client->quote(name); + message += "\r\n" + "Application-FileSize: "; + message += QString::number(size); + message += "\r\n" + "Connectivity: N\r\n\r\n"; + sendMessage(message, "S"); +} + +void SBSocket::process(bool bTyping) +{ + if (bTyping) + sendTyping(); + if (m_msgText.isEmpty() && !m_queue.empty()){ + Message *msg = m_queue.front(); + EventSend e(msg, msg->getPlainText().toUtf8()); + e.process(); + m_msgText = QString::fromUtf8( e.localeText() ); + if (msg->type() == MessageUrl){ + UrlMessage *m = static_cast(msg); + QString msgText = m->getUrl(); + msgText += "\r\n"; + msgText += m_msgText; + m_msgText = msgText; + } + if ((msg->type() == MessageFile) && static_cast(msg)->m_transfer) + m_msgText = QString::null; + if (m_msgText.isEmpty()){ + if (msg->type() == MessageFile){ + sendFile(); + return; + } + EventMessageSent(msg).process(); + delete msg; + m_queue.erase(m_queue.begin()); + } + m_msgText = m_msgText.replace('\n', "\r\n"); + } + if (m_msgText.isEmpty()) + return; + m_msgPart = getPart(m_msgText, 1664); + Message *msg = m_queue.front(); + char color[10]; + sprintf(color, "%06lX", msg->getBackground()); + QString message; + message += "MIME-Version: 1.0\r\n"; + message += "Content-Type: text/plain; charset=UTF-8\r\n"; + message += "X-MMS_IM-Format: "; + if (!msg->getFont().isEmpty()){ + QString font = msg->getFont(); + if (!font.isEmpty()){ + QString font_type; + int n = font.indexOf(", "); + if (n > 0){ + font_type = font.mid(n + 2); + font = font.left(n); + } + message += "FN="; + message += m_client->quote(font); + QString effect; + while (!font_type.isEmpty()){ + QString type = font_type; + int n = font_type.indexOf(", "); + if (n > 0){ + type = font_type.mid(n); + font_type = font_type.mid(n + 2); + }else{ + font_type = QString::null; + } + if (type == "bold") + effect += "B"; + if (type == "italic") + effect += "I"; + if (type == "strikeout") + effect += "S"; + if (type == "underline") + effect += "U"; + } + if (!effect.isEmpty()){ + message += "; EF="; + message += effect; + } + } + } + message += "; CO="; + message += color; + message += "; CS=0\r\n"; + message += "\r\n"; + message += m_msgPart; + sendMessage(message, "A"); + m_msg_id = m_packet_id; +} + +void SBSocket::acceptMessage(unsigned short port, unsigned cookie, unsigned auth_cookie) +{ + QString message; + message += "MIME-Version: 1.0\r\n" + "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n" + "IP-Address: "; + message += QHostAddress(get_ip(m_client->data.owner.IP)).toString(); + message += "\r\n" + "IP-Address-Internal: "; + message += QHostAddress(m_client->socket()->localHost()).toString(); + message += "\r\n" + "Port: "; + message += QString::number(port); + message += "\r\n" + "AuthCookie: "; + message += QString::number(auth_cookie); + message += "\r\n" + "Sender-Connect: TRUE\r\n" + "Invitation-Command: ACCEPT\r\n" + "Invitation-Cookie: "; + message += QString::number(cookie); + message += "\r\n" + "Launch-Application: FALSE\r\n" + "Request-Data: IP-Address:\r\n\r\n"; + sendMessage(message, "N"); +} + +bool SBSocket::acceptMessage(Message *msg, const QString &dir, OverwriteMode mode) +{ + for (list::iterator it = m_acceptMsg.begin(); it != m_acceptMsg.end(); ++it){ + if (it->msg->id() != msg->id()) + continue; + Message *msg = it->msg; + unsigned cookie = it->cookie; + m_acceptMsg.erase(it); + MSNFileTransfer *ft = new MSNFileTransfer(static_cast(msg), m_client, m_data); + ft->setDir(dir); + ft->setOverwrite(mode); + ft->auth_cookie = get_random(); + ft->cookie = cookie; + EventMessageAcked(msg).process(); + ft->listen(); + EventMessageDeleted(msg).process(); + return true; + } + return false; +} + +void SBSocket::declineMessage(unsigned cookie) +{ + QString message; + message += "MIME-Version: 1.0\r\n" + "Content-Type: text/x-msmsgsinvite; charset=UTF-8\r\n\r\n" + "Invitation-Command: CANCEL\r\n" + "Invitation-Cookie: "; + message += QString::number(cookie); + message += "\r\n" + "Cancel-Code: REJECT\r\n\r\n"; + sendMessage(message, "S"); +} + +bool SBSocket::declineMessage(Message *msg, const QString &reason) +{ + for (list::iterator it = m_acceptMsg.begin(); it != m_acceptMsg.end(); ++it){ + if (it->msg->id() != msg->id()) + continue; + Message *msg = it->msg; + unsigned cookie = it->cookie; + m_acceptMsg.erase(it); + declineMessage(cookie); + if (!reason.isEmpty()){ + Message *msg = new Message(MessageGeneric); + msg->setText(reason); + msg->setFlags(MESSAGE_NOHISTORY); + if (!m_client->send(msg, m_data)) + delete msg; + } + delete msg; + return true; + } + return false; +} + diff --git a/plugins/msn/msnclient.h b/plugins/msn/msnclient.h new file mode 100644 index 0000000..c5c0501 --- /dev/null +++ b/plugins/msn/msnclient.h @@ -0,0 +1,329 @@ +/*************************************************************************** + msnclient.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSNCLIENT_H +#define _MSNCLIENT_H + +#include "socket/socket.h" +#include "socket/serversocketnotify.h" +#include "socket/tcpclient.h" +#include "fetch.h" +#include + +const unsigned MSN_SIGN = 0x0003; + +const unsigned STATUS_BRB = 101; +const unsigned STATUS_PHONE = 102; +const unsigned STATUS_LUNCH = 103; + +const unsigned MSN_FORWARD = 0x0001; +const unsigned MSN_ACCEPT = 0x0002; +const unsigned MSN_BLOCKED = 0x0004; +const unsigned MSN_REVERSE = 0x0008; + +const unsigned MSN_FLAGS = 0x000F; +const unsigned MSN_CHECKED = 0x1000; + +class SBSocket; + +struct MSNUserData : public SIM::clientData +{ + SIM::Data EMail; + SIM::Data ScreenName; + SIM::Data Status; + SIM::Data StatusTime; + SIM::Data OnlineTime; + SIM::Data PhoneHome; + SIM::Data PhoneWork; + SIM::Data PhoneMobile; + SIM::Data Mobile; + SIM::Data Group; + SIM::Data Flags; + SIM::Data sFlags; + SIM::Data typing_time; + SIM::Data IP; + SIM::Data RealIP; + SIM::Data Port; + SIM::Data sb; +}; + +struct MSNClientData +{ + SIM::Data Server; + SIM::Data Port; + SIM::Data ListVer; + SIM::Data ListRequests; + SIM::Data Version; + SIM::Data MinPort; + SIM::Data MaxPort; + SIM::Data UseHTTP; + SIM::Data AutoHTTP; + SIM::Data Deleted; + SIM::Data NDeleted; + SIM::Data AutoAuth; + MSNUserData owner; +}; + +class MSNClient; +class XfrPacket; + +struct msgInvite +{ + SIM::Message *msg; + unsigned cookie; +}; + +class SBSocket : public QObject, public SIM::ClientSocketNotify +{ + Q_OBJECT +public: + SBSocket(MSNClient *client, SIM::Contact *contact, MSNUserData *data); + ~SBSocket(); + void connect(const QString &addr, const QString &session, const QString &cookie, bool bDirection); + void connect(); + bool send(SIM::Message *msg); + void timer(unsigned now); + void setTyping(bool bTyping); + bool cancelMessage(SIM::Message *msg); + bool acceptMessage(SIM::Message *msg, const QString &dir, SIM::OverwriteMode mode); + bool declineMessage(SIM::Message *msg, const QString &reason); + void acceptMessage(unsigned short port, unsigned cookie, unsigned auth_cookie); + void declineMessage(unsigned cookie); +protected: + enum State + { + Unknown, + ConnectingSend, + ConnectingReceive, + WaitJoin, + Connected + }; + virtual bool error_state(const QString &err, unsigned code = 0); + virtual void connect_ready(); + virtual void packet_ready(); + void send(const QString &cmd, const QString &args); + void getLine(const QByteArray &line); + void getMessage(unsigned size); + bool getMessage(); + void messageReady(); + void process(bool bTyping=true); + void sendMessage(const QString &msg, const char *type); + void sendTyping(); + void sendFile(); + std::list m_acceptMsg; + std::list m_waitMsg; + + State m_state; + SIM::Contact *m_contact; + MSNClient *m_client; + MSNUserData *m_data; + QString m_session; + QString m_cookie; + SIM::ClientSocket *m_socket; + unsigned m_packet_id; + QString m_message; + unsigned m_messageSize; + bool m_bTyping; + XfrPacket *m_packet; + std::list m_queue; + QString m_msgText; + QString m_msgPart; + unsigned m_msg_id; + unsigned m_invite_cookie; +}; + +const unsigned LR_CONTACTxCHANGED = 0; +const unsigned LR_CONTACTxREMOVED = 1; +const unsigned LR_CONTACTxREMOVED_BL = 2; +const unsigned LR_GROUPxCHANGED = 3; +const unsigned LR_GROUPxREMOVED = 4; + +const unsigned NO_GROUP = (unsigned)(-1); + +struct MSNListRequest +{ + unsigned Type; + QString Name; + unsigned Group; +}; + +class MSNPacket; +class MSNServerMessage; + +class MSNClient : public SIM::TCPClient, public FetchClient +{ + Q_OBJECT +public: + MSNClient(SIM::Protocol*, Buffer *cfg); + ~MSNClient(); + virtual QString name(); + virtual QWidget *setupWnd(); + virtual QByteArray getConfig(); + PROP_STR(Server); + PROP_USHORT(Port); + PROP_ULONG(ListVer); + PROP_UTF8(ListRequests); + PROP_STR(Version); + PROP_USHORT(MinPort); + PROP_USHORT(MaxPort); + PROP_BOOL(UseHTTP); + PROP_BOOL(AutoHTTP); + PROP_STRLIST(Deleted); + PROP_ULONG(NDeleted); + PROP_BOOL(AutoAuth); + QString getLogin(); + QString unquote(const QString&); + QString quote(const QString&); + void sendLine(const QString &line, bool crlf = true); + void setLogin(const QString&); + MSNClientData data; + QString dataName(void*); + MSNUserData *findContact(const QString &mail, const QString &name, SIM::Contact *&contact, bool nJoin=true); + MSNUserData *findContact(const QString &mail, SIM::Contact *&contact); + MSNUserData *findGroup(unsigned long id, const QString &name, SIM::Group *&grp); + void auth_message(SIM::Contact *contact, unsigned type, MSNUserData *data); + std::list m_requests; + void processRequests(); + MSNListRequest *findRequest(unsigned long id, unsigned type, bool bDelete=false); + MSNListRequest *findRequest(const QString &name, unsigned type, bool bDelete=false); + bool add(const QString &mail, const QString &name, unsigned grp); + std::list m_SBsockets; + virtual void setupContact(SIM::Contact*, void *data); + bool m_bJoin; + SIM::Socket *createSBSocket(); + void connected(); + MSNUserData* toMSNUserData(SIM::clientData * data); +protected slots: + void ping(); + void authOk(); + void authFailed(); +protected: + virtual bool done(unsigned code, Buffer &data, const QString &headers); + virtual QString contactName(void *clientData); + virtual void setInvisible(bool bState); + virtual bool compareData(void*, void*); + virtual void contactInfo(void *_data, unsigned long &status, unsigned &style, QString &statusIcon, QSet *icons = NULL); + virtual QString contactTip(void *_data); + virtual SIM::CommandDef *infoWindows(SIM::Contact*, void *_data); + virtual SIM::CommandDef *configWindows(); + virtual QWidget *infoWindow(QWidget *parent, SIM::Contact*, void *_data, unsigned id); + virtual QWidget *configWindow(QWidget *parent, unsigned id); + virtual bool send(SIM::Message*, void*); + virtual bool canSend(unsigned, void*); + virtual bool processEvent(SIM::Event *e); + virtual QWidget *searchWindow(QWidget *parent); + virtual bool isMyData(SIM::clientData*&, SIM::Contact*&); + virtual bool createData(SIM::clientData*&, SIM::Contact*); + SIM::Socket *createSocket(); + void getLine(const QByteArray &line); + void clearPackets(); + void sendStatus(); + void checkEndSync(); + void processLSG(unsigned id, const QString &name); + void processLST(const QString &mail, const QString &alias, unsigned state, unsigned id); + virtual void packet_ready(); + virtual void connect_ready(); + virtual void setStatus(unsigned status); + virtual void disconnected(); + QString getValue(const QString &key, const QString &str); + QString getHeader(const QString &name, const QString &headers); + unsigned m_packetId; + unsigned m_pingTime; + std::listm_packets; + MSNServerMessage *m_msg; + QString m_curBuddy; + void requestLoginHost(const QString &url); + void requestTWN(const QString &url); + enum AuthState + { + None, + LoginHost, + TWN + }; + AuthState m_state; + QString m_authChallenge; + QString m_init_mail; + QString m_new_mail; + bool m_bFirstTry; + bool m_bHTTP; + bool m_bFirst; + unsigned m_nBuddies; + unsigned m_nGroups; + friend class MSNPacket; + friend class UsrPacket; + friend class QryPacket; + friend class SynPacket; + friend class MSNServerMessage; + friend class SBSocket; +}; + +class MSNFileTransfer : public QObject, public SIM::FileTransfer, public SIM::ClientSocketNotify, public SIM::ServerSocketNotify +{ + Q_OBJECT +public: + MSNFileTransfer(SIM::FileMessage *msg, MSNClient *client, MSNUserData *data); + ~MSNFileTransfer(); + void connect(); + void listen(); + void setSocket(SIM::Socket *s); + unsigned ip1; + unsigned ip2; + unsigned short port1; + unsigned short port2; + unsigned auth_cookie; + unsigned cookie; + +protected slots: + + void timeout(); +protected: + enum State + { + None, + ConnectIP1, + ConnectIP2, + ConnectIP3, + Connected, + Send, + Wait, + Listen, + Receive, + Incoming, + WaitDisconnect, + WaitBye + }; + virtual bool error_state(const QString &err, unsigned code = 0); + virtual void packet_ready(); + virtual void connect_ready(); + virtual void write_ready(); + virtual void startReceive(unsigned pos); + virtual bool accept(SIM::Socket*, unsigned long ip); + virtual void bind_ready(unsigned short port); + virtual bool error(const QString &err); + void send(const QString &line); + bool getLine(const QByteArray &line); + bool m_bHeader; + unsigned m_size; + State m_state; + SIM::ClientSocket *m_socket; + MSNClient *m_client; + MSNUserData *m_data; + QTimer *m_timer; +}; + +#endif + diff --git a/plugins/msn/msnconfig.cpp b/plugins/msn/msnconfig.cpp new file mode 100644 index 0000000..236da99 --- /dev/null +++ b/plugins/msn/msnconfig.cpp @@ -0,0 +1,95 @@ +/*************************************************************************** + msnconfig.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include + +#include "simgui/linklabel.h" +#include "misc.h" + +#include "msnconfig.h" +#include "msnclient.h" + +using namespace SIM; + +MSNConfig::MSNConfig(QWidget *parent, MSNClient *client, bool bConfig) : QWidget(parent) +{ + setupUi(this); + m_client = client; + m_bConfig = bConfig; + if (m_bConfig) + tabCfg->removeTab(tabCfg->indexOf(tabMsn)); + QTimer::singleShot(0, this, SLOT(changed())); + edtLogin->setText(m_client->getLogin()); + edtPassword->setText(m_client->getPassword()); + edtServer->setText(m_client->getServer()); + edtPort->setValue(m_client->getPort()); + connect(edtLogin, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPassword, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtServer, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPort, SIGNAL(valueChanged(const QString&)), this, SLOT(changed(const QString&))); + lnkReg->setText(i18n("Register in .NET Passport")); + lnkReg->setUrl(i18n("https://register.passport.net/reg.srf?lc=1033&langid=1033&sl=1")); + edtMinPort->setValue(m_client->getMinPort()); + edtMaxPort->setValue(m_client->getMaxPort()); + chkHTTP->setChecked(m_client->getUseHTTP()); + chkAuto->setChecked(m_client->getAutoHTTP()); + connect(chkAuto, SIGNAL(toggled(bool)), this, SLOT(autoToggled(bool))); + autoToggled(m_client->getAutoHTTP()); + chkAuth->setChecked(m_client->getAutoAuth()); +} + +void MSNConfig::apply(Client*, void*) +{ +} + +void MSNConfig::apply() +{ + if (!m_bConfig){ + m_client->setLogin(edtLogin->text()); + m_client->setPassword(edtPassword->text()); + } + m_client->setServer(edtServer->text()); + m_client->setPort(edtPort->text().toUShort()); + m_client->setMinPort(edtMinPort->text().toUShort()); + m_client->setMaxPort(edtMaxPort->text().toUShort()); + m_client->setUseHTTP(chkHTTP->isChecked()); + m_client->setAutoHTTP(chkAuto->isChecked()); + m_client->setAutoAuth(chkAuth->isChecked()); +} + +void MSNConfig::changed(const QString&) +{ + changed(); +} + +void MSNConfig::changed() +{ + emit okEnabled(!edtLogin->text().isEmpty() && + !edtPassword->text().isEmpty() && + !edtServer->text().isEmpty() && + edtPort->text().toUShort()); +} + +void MSNConfig::autoToggled(bool bState) +{ + chkHTTP->setEnabled(!bState); +} + diff --git a/plugins/msn/msnconfig.h b/plugins/msn/msnconfig.h new file mode 100644 index 0000000..76bd83d --- /dev/null +++ b/plugins/msn/msnconfig.h @@ -0,0 +1,47 @@ +/*************************************************************************** + msnconfig.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSNCONFIG_H +#define _MSNCONFIG_H + +#include "contacts.h" + +#include "ui_msnconfigbase.h" + +class MSNClient; + +class MSNConfig : public QWidget, public Ui::MSNConfigBase +{ + Q_OBJECT +public: + MSNConfig(QWidget *parent, MSNClient *client, bool bConfig); +signals: + void okEnabled(bool); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected slots: + void changed(); + void changed(const QString&); + void autoToggled(bool); +protected: + bool m_bConfig; + MSNClient *m_client; +}; + +#endif + diff --git a/plugins/msn/msnconfigbase.ui b/plugins/msn/msnconfigbase.ui new file mode 100644 index 0000000..35ba6c9 --- /dev/null +++ b/plugins/msn/msnconfigbase.ui @@ -0,0 +1,358 @@ + + + + + MSNConfigBase + + + + 0 + 0 + 302 + 297 + + + + Form2 + + + + 11 + + + 6 + + + + + + &MSN + + + + 11 + + + 6 + + + + + Login: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + Password: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + QLineEdit::Password + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + + + + &Network + + + + 11 + + + 6 + + + + + Server: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + Port: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + 0 + + + 6 + + + + + 65535 + + + 1 + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + Port range for direct connections: + + + false + + + + + + + 0 + + + 6 + + + + + 65534 + + + 1024 + + + + + + + - + + + false + + + + + + + 65534 + + + 1024 + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + Use &HTTP polling + + + + + + + &Automatically use HTTP polling if proxy required + + + + + + + + 5 + 1 + + + + Note: For HTTP-polling using proxy settings for HTTP + + + Qt::AlignVCenter|Qt::AlignLeft + + + false + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + QFrame::HLine + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + &Automatically add contacts in accept list + + + + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    + + LinkLabel + QWidget +
    simgui/linklabel.h
    + + -1 + -1 + + 0 + + 1 + 1 + + image1 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + +
    diff --git a/plugins/msn/msnfiletransfer.cpp b/plugins/msn/msnfiletransfer.cpp new file mode 100644 index 0000000..481fb82 --- /dev/null +++ b/plugins/msn/msnfiletransfer.cpp @@ -0,0 +1,407 @@ +/*************************************************************************** + msnfiltetransfer.cpp - description + ------------------- + begin : Fri Jan 05 2007 + copyright : (C) 2007 Christian Ehrlicher + email : ch.ehrlicher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "simapi.h" + +#include "log.h" +#include "message.h" +#include "misc.h" + +#include "msn.h" +#include "msnclient.h" +#include "socket/clientsocket.h" + +using namespace SIM; + +const unsigned long FT_TIMEOUT = 60; +const unsigned MAX_FT_PACKET = 2045; + +MSNFileTransfer::MSNFileTransfer(FileMessage *msg, MSNClient *client, MSNUserData *data) + : FileTransfer(msg) +{ + m_socket = new ClientSocket(this); + m_client = client; + m_state = None; + m_data = data; + m_timer = NULL; + m_size = msg->getSize(); + m_bHeader = false; + m_nFiles = 1; +} + +MSNFileTransfer::~MSNFileTransfer() +{ + if (m_socket) + delete m_socket; +} + + +void MSNFileTransfer::setSocket(Socket *s) +{ + m_state = Incoming; + m_socket->setSocket(s); + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + m_socket->setRaw(true); + send("VER MSNFTP"); + FileTransfer::m_state = FileTransfer::Negotiation; + if (m_notify) + m_notify->process(); +} + +void MSNFileTransfer::listen() +{ + if (m_notify) + m_notify->createFile(m_msg->getDescription(), m_size, false); +} + +void MSNFileTransfer::connect() +{ + FileTransfer::m_state = FileTransfer::Connect; + if (m_notify) + m_notify->process(); + if ((m_state == None) || (m_state == Wait)){ + m_state = ConnectIP1; + if (ip1 && port1){ + m_socket->connect(QHostAddress(ip1).toString(), port1, NULL); + return; + } + } + if (m_state == ConnectIP1){ + m_state = ConnectIP2; + if (ip2 && port2){ + m_socket->connect(QHostAddress(ip2).toString(), port2, NULL); + return; + } + } + if (m_state == ConnectIP2){ + m_state = ConnectIP3; + if (ip2 && port1){ + m_socket->connect(QHostAddress(ip2).toString(), port1, NULL); + return; + } + } + error_state(I18N_NOOP("Can't established direct connection"), 0); +} + +bool MSNFileTransfer::error_state(const QString &err, unsigned) +{ + if (m_state == WaitDisconnect) + FileTransfer::m_state = FileTransfer::Done; + if (m_state == ConnectIP1){ + connect(); + return false; + } + if (m_state == Wait) + return false; + if (FileTransfer::m_state != FileTransfer::Done){ + m_state = None; + FileTransfer::m_state = FileTransfer::Error; + m_msg->setError(err); + } + m_msg->m_transfer = NULL; + m_msg->setFlags(m_msg->getFlags() & ~MESSAGE_TEMP); + EventMessageSent(m_msg).process(); + return true; +} + +void MSNFileTransfer::packet_ready() +{ + if (m_state == Receive){ + if (m_bHeader){ + char cmd; + char s1, s2; + m_socket->readBuffer() >> cmd >> s1 >> s2; + log(L_DEBUG, "MSN FT header: %02X %02X %02X", cmd & 0xFF, s1 & 0xFF, s2 & 0xFF); + if (cmd != 0){ + m_socket->error_state(I18N_NOOP("Transfer canceled"), 0); + return; + } + unsigned size = (unsigned char)s1 + ((unsigned char)s2 << 8); + m_bHeader = false; + log(L_DEBUG, "MSN FT header: %u", size); + m_socket->readBuffer().init(size); + }else{ + unsigned size = m_socket->readBuffer().size(); + if (size == 0) + return; + log(L_DEBUG, "MSN FT data: %u", size); + m_file->write(m_socket->readBuffer().data(), size); + m_socket->readBuffer().incReadPos(size); + m_bytes += size; + m_totalBytes += size; + m_transferBytes += size; + if (m_notify) + m_notify->process(); + m_size -= size; + if (m_size <= 0){ + m_socket->readBuffer().init(0); + m_socket->setRaw(true); + send("BYE 16777989"); + m_state = WaitDisconnect; + if (m_notify) + m_notify->transfer(false); + return; + } + m_bHeader = true; + m_socket->readBuffer().init(3); + } + return; + } + if (m_socket->readBuffer().writePos() == 0) + return; + MSNPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->readBuffer(), false, plugin->MSNPacket); + for (;;){ + QByteArray s; + if (!m_socket->readBuffer().scan("\r\n", s)) + break; + if (getLine(s)) + return; + } + if (m_socket->readBuffer().readPos() == m_socket->readBuffer().writePos()) + m_socket->readBuffer().init(0); +} + +void MSNFileTransfer::connect_ready() +{ + log(L_DEBUG, "Connect ready"); + m_state = Connected; + FileTransfer::m_state = Negotiation; + if (m_notify) + m_notify->process(); + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + m_socket->setRaw(true); +} + +void MSNFileTransfer::startReceive(unsigned pos) +{ + if (pos > m_size){ + SBSocket *sock = dynamic_cast(m_data->sb.object()); + FileTransfer::m_state = FileTransfer::Done; + m_state = None; + if (sock) + sock->declineMessage(cookie); + m_socket->error_state("", 0); + return; + } + m_timer = new QTimer(this); + QObject::connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); + m_timer->start(FT_TIMEOUT * 1000); + m_state = Listen; + FileTransfer::m_state = FileTransfer::Listen; + if (m_notify) + m_notify->process(); + bind(m_client->getMinPort(), m_client->getMaxPort(), m_client); +} + +void MSNFileTransfer::send(const QString &line) +{ + log(L_DEBUG, "Send: %s", qPrintable(line)); + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer() << (const char*)line.toUtf8(); + m_socket->writeBuffer() << "\r\n"; + MSNPlugin *plugin = static_cast(m_client->protocol()->plugin()); + EventLog::log_packet(m_socket->writeBuffer(), true, plugin->MSNPacket); + m_socket->write(); +} + +bool MSNFileTransfer::getLine(const QByteArray &line) +{ + QString l = QString::fromUtf8(line); + l = l.remove('\r'); + log(L_DEBUG, "Get: %s", qPrintable(l)); + + QString cmd = getToken(l, ' '); + if ((cmd == "VER") && (l == "MSNFTP")){ + if (m_state == Incoming){ + QString usr = "USR "; + usr += m_client->quote(m_client->data.owner.EMail.str()); + usr += " "; + usr += QString::number(auth_cookie); + send(usr); + }else{ + send("VER MSNFTP"); + } + return false; + } + if (cmd == "USR"){ + QString mail = m_client->unquote(getToken(l, ' ')); + unsigned auth = l.toUInt(); + if (mail.toLower() != m_data->EMail.str().toLower()){ + error_state("Bad address", 0); + return false; + } + if (auth != auth_cookie){ + error_state("Bad auth cookie", 0); + return false; + } + if (m_file == NULL){ + for (;;){ + if (!openFile()){ + if (FileTransfer::m_state == FileTransfer::Done) + m_socket->error_state(""); + if (m_notify) + m_notify->transfer(false); + return false; + } + if (!isDirectory()) + break; + } + } + QString cmd = "FIL "; + cmd += QString::number(m_fileSize); + send(cmd); + return false; + } + if (cmd == "TFR"){ + FileTransfer::m_state = FileTransfer::Write; + m_state = Send; + if (m_notify) + m_notify->transfer(true); + write_ready(); + return false; + } + if (cmd == "FIL"){ + send("TFR"); + m_bHeader = true; + m_socket->readBuffer().init(3); + m_socket->readBuffer().packetStart(); + m_state = Receive; + m_socket->setRaw(false); + FileTransfer::m_state = FileTransfer::Read; + m_size = l.toULong(); + m_bytes = 0; + if (m_notify){ + m_notify->transfer(true); + m_notify->process(); + } + return true; + } + if (cmd == "BYE"){ + if (m_notify) + m_notify->transfer(false); + for (bool doloop=true;doloop;){ + if (!openFile()){ + if (FileTransfer::m_state == FileTransfer::Done) + m_socket->error_state(""); + return true; + } + if (isDirectory()){ + doloop=false; + continue; + } + m_state = Wait; + FileTransfer::m_state = FileTransfer::Wait; + if (!((Client*)m_client)->send(m_msg, m_data)) + error_state(I18N_NOOP("File transfer failed"), 0); + } + if (m_notify) + m_notify->process(); + m_socket->close(); + return true; + } + error_state("Bad line", 0); + return false; +} + +void MSNFileTransfer::timeout() +{ +} + +void MSNFileTransfer::write_ready() +{ + if (m_state != Send){ + ClientSocketNotify::write_ready(); + return; + } + if (m_transfer){ + m_transferBytes += m_transfer; + m_transfer = 0; + if (m_notify) + m_notify->process(); + } + if (m_bytes >= m_fileSize){ + m_state = WaitBye; + return; + } + QDateTime now(QDateTime::currentDateTime()); + if (now != m_sendTime){ + m_sendTime = now; + m_sendSize = 0; + } + if (m_sendSize > (m_speed << 18)){ + m_socket->pause(1); + return; + } + unsigned long tail = m_fileSize - m_bytes; + if (tail > MAX_FT_PACKET) tail = MAX_FT_PACKET; + m_socket->writeBuffer().packetStart(); + char buf[MAX_FT_PACKET + 3]; + buf[0] = 0; + buf[1] = (char)(tail & 0xFF); + buf[2] = (char)((tail >> 8) & 0xFF); + int readn = m_file->read(&buf[3], tail); + if (readn <= 0){ + m_socket->error_state("Read file error"); + return; + } + m_transfer = readn; + m_bytes += readn; + m_totalBytes += readn; + m_sendSize += readn; + m_socket->writeBuffer().pack(buf, readn + 3); + m_socket->write(); +} + +bool MSNFileTransfer::accept(Socket *s, unsigned long ip) +{ + log(L_DEBUG, "Accept direct connection %s", qPrintable(QHostAddress(ip).toString())); + m_socket->setSocket(s); + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + m_socket->setRaw(true); + FileTransfer::m_state = Negotiation; + m_state = Incoming; + if (m_notify) + m_notify->process(); + send("VER MSNFTP"); + return true; +} + +void MSNFileTransfer::bind_ready(unsigned short port) +{ + SBSocket *sock = dynamic_cast(m_data->sb.object()); + if (sock == NULL){ + error_state("No switchboard socket", 0); + return; + } + sock->acceptMessage(port, cookie, auth_cookie); +} + +bool MSNFileTransfer::error(const QString &err) +{ + return error_state(err, 0); +} diff --git a/plugins/msn/msnhttp.cpp b/plugins/msn/msnhttp.cpp new file mode 100644 index 0000000..b24b696 --- /dev/null +++ b/plugins/msn/msnhttp.cpp @@ -0,0 +1,172 @@ +/*************************************************************************** + msnhttp.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include + +#include "fetch.h" +#include "log.h" + +#include "msnhttp.h" +#include "msnclient.h" + +using namespace SIM; + +const unsigned POLL_TIMEOUT = 10; + +// ______________________________________________________________________________________ + +MSNHttpPool::MSNHttpPool(MSNClient *client, bool bSB) +{ + m_client = client; + m_bSB = bSB; + writeData = new Buffer; +} + +MSNHttpPool::~MSNHttpPool() +{ + delete writeData; +} + +int MSNHttpPool::read(char *buf, unsigned size) +{ + unsigned tail = readData.size() - readData.readPos(); + if (size > tail) size = tail; + if (size == 0) return 0; + readData.unpack(buf, size); + if (readData.readPos() == (unsigned)readData.size()) + readData.init(0); + return size; +} + +static char MSN_HTTP[] = "/gateway/gateway.dll?"; + +void MSNHttpPool::write(const char *buf, unsigned size) +{ + writeData->pack(buf, size); + if (!isDone()) + return; + QString url = "http://"; + if (m_session_id.isEmpty()){ + url += "gateway.messenger.hotmail.com"; + url += MSN_HTTP; + url += "Action=open&Server="; + url += m_bSB ? "SB" : "NS"; + url += "&IP="; + url += m_ip; + }else{ + url += m_host; + url += MSN_HTTP; + if (writeData->writePos() == 0) + url += "Action=poll&"; + url += "SessionID=" + m_session_id; + } + const char *headers = + "Content-Type: application/x-msn-messenger\n" + "Proxy-Connection: Keep-Alive"; + fetch(url, headers, writeData); + writeData = new Buffer; +} + +void MSNHttpPool::close() +{ + delete writeData; + writeData = new Buffer; + m_session_id = QString::null; + m_host = QString::null; + stop(); +} + +void MSNHttpPool::connect(const QString &host, unsigned short) +{ + m_ip = host; + if (notify) + notify->connect_ready(); +} + +void MSNHttpPool::idle() +{ + if (isDone() && (m_client->isDone())){ + log(L_DEBUG, "send idle"); + write("", 0); + } +} + +bool MSNHttpPool::done(unsigned code, Buffer &data, const QString &headers) +{ + if (code != 200){ + log(L_DEBUG, "HTTP result %u", code); + error("Bad result"); + return false; + } + const QStringList sl = headers.split(QLatin1Char('\0')); + Q_FOREACH(QString h, sl) { + if (getToken(h, ':') == QLatin1String("X-MSN-Messenger")){ + QString h = h.trimmed (); + while (!h.isEmpty()){ + QString part = getToken(h, ';'); + QString v = part.trimmed (); + QString k = getToken(v, '='); + if (k == "SessionID"){ + m_session_id = v; + }else if (k == "GW-IP"){ + m_host = v; + } + } + break; + } + } + if (m_session_id.isEmpty() || m_host.isEmpty()){ + error("No session in answer"); + return false; + } + readData.pack(data.data(), data.writePos()); + if (notify) + notify->read_ready(); + QTimer::singleShot(POLL_TIMEOUT * 1000, this, SLOT(idle())); + return false; +} + +unsigned long MSNHttpPool::localHost() +{ + return 0; +} + +void MSNHttpPool::pause(unsigned) +{ +} + +Socket *MSNClient::createSocket() +{ + m_bHTTP = getUseHTTP(); + if (getAutoHTTP()){ + m_bHTTP = m_bFirstTry; + if (!m_bFirstTry) + m_bFirstTry = true; + } + if (m_bHTTP) + return new MSNHttpPool(this, false); + return NULL; +} + +Socket *MSNClient::createSBSocket() +{ + if (m_bHTTP) + return new MSNHttpPool(this, true); + return NULL; +} + diff --git a/plugins/msn/msnhttp.h b/plugins/msn/msnhttp.h new file mode 100644 index 0000000..bb7be43 --- /dev/null +++ b/plugins/msn/msnhttp.h @@ -0,0 +1,54 @@ +/*************************************************************************** + msnhttp.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef MSNHTTP_H +#define MSNHTTP_H 1 + +#include "socket/socket.h" +#include "fetch.h" + +class MSNClient; + +class MSNHttpPool : public QObject, public SIM::Socket, public FetchClient +{ + Q_OBJECT +public: + MSNHttpPool(MSNClient *client, bool bSB); + ~MSNHttpPool(); + virtual void connect(const QString &host, unsigned short port); + virtual int read(char *buf, unsigned size); + virtual void write(const char *buf, unsigned size); + virtual void close(); + virtual Mode mode() const { return Web; } + virtual bool isEncrypted(){ return false; } + virtual bool startEncryption(){ return false; } +protected slots: + void idle(); +protected: + QString m_session_id; + QString m_host; + QString m_ip; + Buffer readData; + Buffer *writeData; + virtual bool done(unsigned code, Buffer &data, const QString &headers); + virtual unsigned long localHost(); + virtual void pause(unsigned); + bool m_bSB; + MSNClient *m_client; +}; + +#endif diff --git a/plugins/msn/msninfo.cpp b/plugins/msn/msninfo.cpp new file mode 100644 index 0000000..fdd2b1e --- /dev/null +++ b/plugins/msn/msninfo.cpp @@ -0,0 +1,128 @@ +/*************************************************************************** + msninfo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "icons.h" +#include "misc.h" + +#include "msninfo.h" +#include "msnclient.h" +#include "contacts/contact.h" + +using namespace SIM; + +MSNInfo::MSNInfo(QWidget *parent, MSNUserData *data, MSNClient *client) : QWidget(parent) +{ + setupUi(this); + m_client = client; + m_data = data; + edtOnline->setReadOnly(true); + edtNA->setReadOnly(true); + edtEMail->setReadOnly(true); + if (m_data){ + edtNick->setReadOnly(true); + } + fill(); +} + +void MSNInfo::apply() +{ +} + +bool MSNInfo::processEvent(Event *e) +{ + if ((e->type() == eEventMessageReceived) && m_data){ + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if ((msg->type() == MessageStatus) && (m_client->dataName(m_data) == msg->client())) + fill(); + } else + if (e->type() == eEventContact){ + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eChanged) + return false; + Contact *contact = ec->contact(); + if (contact->clientData.have(m_data)) + fill(); + } else + if ((e->type() == eEventClientChanged) && (m_data == 0)){ + EventClientChanged *ecc = static_cast(e); + if (ecc->client() == m_client) + fill(); + } + return false; +} + +void MSNInfo::fill() +{ + MSNUserData *data = m_data; + if (data == NULL) data = &m_client->data.owner; + edtEMail->setText(data->EMail.str()); + edtNick->setText(!data->ScreenName.str().isEmpty() ? data->ScreenName.str() : data->EMail.str()); + int current = 0; + QString text; + unsigned status = m_data ? m_data->Status.toULong() : m_client->getStatus(); + for (const CommandDef *cmd = m_client->protocol()->statusList(); cmd->id; cmd++){ + if (cmd->flags & COMMAND_CHECK_STATE) + continue; + if (status == cmd->id){ + current = cmbStatus->count(); + text = cmd->text; + } + cmbStatus->addItem(Icon(cmd->icon), i18n(cmd->text)); + } + cmbStatus->setCurrentIndex(current); + disableWidget(cmbStatus); + if (status == STATUS_OFFLINE){ + lblOnline->setText(i18n("Last online") + ":"); + edtOnline->setText(formatDateTime(data->StatusTime.toULong())); + lblNA->hide(); + edtNA->hide(); + }else{ + if (data->OnlineTime.toULong()){ + edtOnline->setText(formatDateTime(data->OnlineTime.toULong())); + }else{ + lblOnline->hide(); + edtOnline->hide(); + } + if ((status == STATUS_ONLINE) || (text.isEmpty())){ + lblNA->hide(); + edtNA->hide(); + }else{ + lblNA->setText(i18n(text)); + edtNA->setText(formatDateTime(data->StatusTime.toULong())); + } + } +} + +void MSNInfo::apply(Client *client, void *_data) +{ + if (client != m_client) + return; + QString nick = edtNick->text(); + if (nick == edtEMail->text()) + nick = QString::null; + MSNUserData *data = m_client->toMSNUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + data->ScreenName.str() = nick; +} + diff --git a/plugins/msn/msninfo.h b/plugins/msn/msninfo.h new file mode 100644 index 0000000..e4385f2 --- /dev/null +++ b/plugins/msn/msninfo.h @@ -0,0 +1,44 @@ +/*************************************************************************** + msninfo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSNINFO_H +#define _MSNINFO_H + +#include "ui_msninfobase.h" +#include "event.h" + +struct MSNUserData; +class MSNClient; + +class MSNInfo : public QWidget, public Ui::MSNInfoBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + MSNInfo(QWidget *parent, MSNUserData *data, MSNClient *client); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected: + virtual bool processEvent(SIM::Event *e); + void fill(); + MSNUserData *m_data; + MSNClient *m_client; +}; + + +#endif + diff --git a/plugins/msn/msninfobase.ui b/plugins/msn/msninfobase.ui new file mode 100644 index 0000000..2eac30c --- /dev/null +++ b/plugins/msn/msninfobase.ui @@ -0,0 +1,225 @@ + + + + + MSNInfoBase + + + + 0 + 0 + 342 + 316 + + + + Form1 + + + + 11 + + + 6 + + + + + + &Names + + + + 11 + + + 6 + + + + + + true + + + + EMail + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + true + + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + QFrame::HLine + + + + + + + Nick: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + &Status + + + + 11 + + + 6 + + + + + Status: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + 7 + 0 + + + + + + + + Online: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/msn/msnpacket.cpp b/plugins/msn/msnpacket.cpp new file mode 100644 index 0000000..b5842c9 --- /dev/null +++ b/plugins/msn/msnpacket.cpp @@ -0,0 +1,530 @@ +/*************************************************************************** + msnpacket.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include + +#include "log.h" +#include "misc.h" + +#include "msnpacket.h" +#include "msnclient.h" +#include "msn.h" +#include "socket/clientsocket.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +using namespace std; +using namespace SIM; + +MSNPacket::MSNPacket(MSNClient *client, const QString &cmd) +{ + m_cmd = cmd; + m_client = client; + m_id = ++m_client->m_packetId; + m_line = cmd; + m_line += ' '; + m_line += QString::number(m_id); +} + +void MSNPacket::addArg(const QString &str) +{ + m_line += ' '; + m_line += str; +} + +void MSNPacket::addArg(const char *str) +{ + m_line += ' '; + m_line += QString::fromUtf8(str); +} + +void MSNPacket::send() +{ + m_client->sendLine(m_line); + m_line = QString::null; + m_client->m_packets.push_back(this); +} + +struct err_str +{ + unsigned code; + const char *str; +}; + +static err_str msn_errors[] = + { + { 200, "Syntax error" }, + { 201, "Invalid parameter" }, + { 205, "Invalid user" }, + { 206, "FQDN missing" }, + { 207, "Already login" }, + { 208, "Invalid username" }, + { 209, "Invalid friendly name" }, + { 210, "List full" }, + { 215, "Already there" }, + { 216, "Not on list" }, + { 217, "User not on-line" }, + { 218, "Already in the mode" }, + { 219, "Already in opposite list" }, + { 223, "Too many groups" }, + { 224, "Invalid group" }, + { 225, "User not in group" }, + { 229, "Group name too long" }, + { 230, "Cannot remove group 0" }, + { 231, "Invalid group" }, + { 280, "Switchboard failed" }, + { 281, "Notify XFR failed" }, + { 300, "required fields missing" }, + { 302, "Not logged in" }, + { 500, "Internal server error" }, + { 501, "DB server error" }, + { 502, "Command disabled" }, + { 510, "File operation error" }, + { 520, "Memory allocation error" }, + { 540, "Challenge response failed" }, + { 600, "Server busy" }, + { 601, "Server unavailable" }, + { 602, "Peer NS down" }, + { 603, "DB connect error" }, + { 604, "Server going down" }, + { 605, "Server unavailable" }, + { 707, "Create connection error" }, + { 710, "Bad CVR parameters sent" }, + { 711, "Blocking write" }, + { 712, "Session overload" }, + { 713, "User too active" }, + { 714, "Too many sessions" }, + { 715, "Not expected (PRP)" }, + { 717, "Bad friend file" }, + { 731, "Not expected (CVR)" }, + { 800, "Changing too rapidly" }, + { 910, "Server too busy" }, + { 911, "Authentication failed" }, + { 912, "Server too busy" }, + { 913, "Not allowed when offline" }, + { 914, "Server unavailable" }, + { 915, "Server unavailable" }, + { 916, "Server unavailable" }, + { 917, "Authentication failed" }, + { 918, "Server too busy" }, + { 919, "Server too busy" }, + { 920, "Not accepting new users" }, + { 921, "Server too busy" }, + { 922, "Server too busy" }, + { 923, "Kids Passport without parental consent" }, + { 924, "Email address not verified" }, + { 928, "Bad ticket" }, + { 0, NULL } + }; + +void MSNPacket::error(unsigned code) +{ + switch (code){ + case 911: + m_client->authFailed(); + return; + } + const err_str *err; + for (err = msn_errors; err->code; err++) + if (err->code == code) + break; + if (err->code){ + m_client->socket()->error_state(err->str); + return; + } + log(L_WARN, "Unknown error code %u", code); + m_client->socket()->error_state("Protocol error"); +} + +VerPacket::VerPacket(MSNClient *client) + : MSNPacket(client, "VER") +{ + addArg("MSNP8 CVR0"); +} + +void VerPacket::answer(const QStringList&) +{ + MSNPacket *packet = new CvrPacket(m_client); + packet->send(); +} + +CvrPacket::CvrPacket(MSNClient *client) + : MSNPacket(client, "CVR") +{ + addArg("0x0409 winnt 5.1 i386 MSNMSGR"); + addArg(client->getVersion()); + addArg("MSMSGS"); + addArg(m_client->getLogin()); +} + +void CvrPacket::answer(const QStringList &arg) +{ + m_client->setVersion(arg[0]); + MSNPacket *packet = new UsrPacket(m_client); + packet->send(); +} + +UsrPacket::UsrPacket(MSNClient *client, const QString &digest) + : MSNPacket(client, "USR") +{ + addArg("TWN"); + if (!digest.isEmpty()){ + addArg("S"); + addArg(digest); + }else{ + addArg("I"); + addArg(m_client->getLogin()); + } +} + +void UsrPacket::answer(const QStringList &args) +{ + if (args[0] == "OK"){ + QTimer::singleShot(0, m_client, SLOT(authOk())); + return; + } + if (args[1] == "S"){ + m_client->m_authChallenge = args[2]; + m_client->requestLoginHost("https://nexus.passport.com/rdr/pprdr.asp"); + } +} + +OutPacket::OutPacket(MSNClient *client) + : MSNPacket(client, "OUT") +{ +} + +ChgPacket::ChgPacket(MSNClient *client) + : MSNPacket(client, "CHG") +{ + const char *status = "NLN"; + if (m_client->getInvisible()){ + status = "HDN"; + }else{ + switch (m_client->getStatus()){ + case STATUS_NA: + status = "IDL"; + break; + case STATUS_AWAY: + status = "AWY"; + break; + case STATUS_DND: + status = "BSY"; + break; + case STATUS_BRB: + status = "BRB"; + break; + case STATUS_PHONE: + status = "PHN"; + break; + case STATUS_LUNCH: + status = "LUN"; + break; + } + } + addArg(status); +} + +SynPacket::SynPacket(MSNClient *client) + : MSNPacket(client, "SYN") +{ + client->m_bJoin = false; + addArg("0"); +} + +void SynPacket::answer(const QStringList &args) +{ + unsigned m_ver = 0; + if (!args[0].isEmpty()) + m_ver = args[0].toUInt(); + m_client->m_nBuddies = 0; + m_client->m_nGroups = 0; + if ((args.size() > 1) && !args[1].isEmpty()) + m_client->m_nBuddies = args[1].toUInt(); + if ((args.size() > 2) && !args[2].isEmpty()) + m_client->m_nGroups = args[2].toUInt(); + m_client->setListVer(m_ver); + ContactList::GroupIterator itg; + Group *grp; + while ((grp = ++itg) != NULL){ + MSNUserData *data; + ClientDataIterator it(grp->clientData, m_client); + while ((data = m_client->toMSNUserData(++it)) != NULL){ + data->sFlags.asULong() = data->Flags.toULong(); + if (args.size() > 1) + data->Flags.asULong() = 0; + } + } + ContactList::ContactIterator itc; + Contact *contact; + while ((contact = ++itc) != NULL){ + MSNUserData *data; + ClientDataIterator it(contact->clientData, m_client); + while ((data = m_client->toMSNUserData(++it)) != NULL){ + data->sFlags.asULong() = data->Flags.toULong(); + if (args.size() > 1) + data->Flags.asULong() = 0; + } + } +} + +QryPacket::QryPacket(MSNClient *client, const QString &qry) + : MSNPacket(client, "QRY") +{ + addArg("PROD0038W!61ZTF9"); + addArg("32"); + m_line += "\r\n"; + char qry_add[] = "VT6PX?UQTM4WM%YR"; + QString md = qry; + md += qry_add; + QByteArray ba = QCryptographicHash::hash(md.toUtf8(), QCryptographicHash::Md5); + for (int i = 0; i < ba.size(); i++) + { + char b[3]; + sprintf(b, "%02x", ba[(int)i] & 0xFF); + m_line += b; + } +} + +void QryPacket::send() +{ + m_client->sendLine(m_line, false); + m_line = QString::null; + m_client->m_packets.push_back(this); +} + +AdgPacket::AdgPacket(MSNClient *client, unsigned grp_id, const QString &name) + : MSNPacket(client, "ADG") +{ + m_id = grp_id; + addArg(name); + addArg("0"); +} + +void AdgPacket::answer(const QStringList &args) +{ + Group *grp = getContacts()->group(m_id); + if (grp == NULL) + return; + MSNUserData *data; + ClientDataIterator it(grp->clientData, m_client); + data = m_client->toMSNUserData(++it); + if (data == NULL) + data = m_client->toMSNUserData((SIM::clientData*)grp->clientData.createData(m_client)); // FIXME unsafe type conversion + data->Group.asULong() = args[2].toULong(); +} + +RegPacket::RegPacket(MSNClient *client, unsigned id, const QString &name) + : MSNPacket(client, "REG") +{ + addArg(QString::number(id)); + addArg(name); + addArg("0"); +} + +RmgPacket::RmgPacket(MSNClient *client, unsigned long id) + : MSNPacket(client, "RMG") +{ + addArg(QString::number(id)); +} + +AddPacket::AddPacket(MSNClient *client, const QString &listType, const QString &mail, const QString &name, unsigned grp) + : MSNPacket(client, "ADD") +{ + m_mail = mail; + addArg(listType); + addArg(mail); + addArg(name); + if (listType == "FL") + addArg(QString::number(grp)); +} + +void AddPacket::error(unsigned) +{ + Contact *contact; + MSNUserData *data = m_client->findContact(m_mail, contact); + if (data){ + contact->clientData.freeData(data); + if (contact->clientData.size() == 0) + delete contact; + } +// not handled anywhere +// Event e(static_cast(m_client->protocol()->plugin())->EventAddFail, (void*)(m_mail.latin1())); +// e.process(); +} + +void AddPacket::answer(const QStringList&) +{ +// not handled anywhere +// Event e(static_cast(m_client->protocol()->plugin())->EventAddOk, (void*)(m_mail.latin1())); +// e.process(); +} + +RemPacket::RemPacket(MSNClient *client, const QString &listType, const QString &mail, unsigned group) + : MSNPacket(client, "REM") +{ + addArg(listType); + addArg(mail); + if (listType == "FL" && (group != NO_GROUP)) + addArg(QString::number(group)); +} + +ReaPacket::ReaPacket(MSNClient *client, const QString &mail, const QString &name) + : MSNPacket(client, "REA") +{ + addArg(mail); + addArg(name); +} + +void ReaPacket::error(unsigned code) +{ + if (code == 216) + return; + MSNPacket::error(code); +} + +BlpPacket::BlpPacket(MSNClient *client) + : MSNPacket(client, "BLP") +{ + addArg("BL"); +} + +XfrPacket::XfrPacket(MSNClient *client, SBSocket *socket) + : MSNPacket(client, "XFR") +{ + m_socket = socket; + addArg("SB"); +} + +void XfrPacket::clear() +{ + m_socket = NULL; +} + +void XfrPacket::answer(const QStringList &args) +{ + if (m_socket) + m_socket->connect(args[1], "", args[3], true); +} + +MSNServerMessage::MSNServerMessage(MSNClient *client, unsigned size) +{ + m_client = client; + m_size = size; +} + +typedef map KEY_MAP; + +MSNServerMessage::~MSNServerMessage() +{ + KEY_MAP values; + QString msg = QString::fromUtf8(m_msg); + for (;!msg.isEmpty();){ + QString line; + int n = msg.indexOf("\r\n"); + if (n >= 0){ + line = msg.left(n); + msg = msg.mid(n + 2); + }else{ + line = msg; + msg = QString::null; + } + n = line.indexOf(':'); + if (n < 0) + continue; + values.insert(KEY_MAP::value_type(line.left(n), line.mid(n + 1).trimmed())); + } + KEY_MAP::iterator it = values.find("ClientIP"); + if (it != values.end()) + set_ip(&m_client->data.owner.IP, QHostAddress(qPrintable(it->second)).toIPv4Address()); + it = values.find("Content-Type"); + if (it != values.end()){ + QString content_type = it->second; + content_type = getToken(content_type, ';'); + if (content_type == "text/x-msmsgsinitialemailnotification"){ + m_client->m_init_mail = QString::null; + it = values.find("Post-URL"); + if (it != values.end()) + m_client->m_init_mail = it->second; + it = values.find("Inbox-URL"); + if (it != values.end()) + m_client->m_init_mail += it->second; + it = values.find("Inbox-Unread"); + if (it == values.end()) + return; + unsigned nUnread = it->second.toUInt(); + if (nUnread){ + EventNotification::ClientNotificationData data; + data.client = m_client; + data.text = "%1"; + data.options = QString::null; + data.args = i18n("You have %n unread message.", "You have %n unread messages.", nUnread); + data.code = 0; + data.flags = EventNotification::ClientNotificationData::E_INFO; + data.id = static_cast(m_client->protocol()->plugin())->MSNInitMail; + EventShowNotification e(data); + e.process(); + } + } + if (content_type == "text/x-msmsgsemailnotification"){ + m_client->m_new_mail = QString::null; + it = values.find("Post-URL"); + if (it != values.end()) + m_client->m_new_mail = it->second; + it = values.find("Message-URL"); + if (it != values.end()) + m_client->m_new_mail += it->second; + QString from; + it = values.find("From-Addr"); + if (it != values.end()) + from = it->second; + QString msg = i18n("You have new mail"); + if (!from.isEmpty()) + msg = i18n("%1 from %2") .arg(msg) .arg(from); + EventNotification::ClientNotificationData data; + data.client = m_client; + data.text = "%1"; + data.options = QString::null; + data.args = msg; + data.code = 0; + data.flags = EventNotification::ClientNotificationData::E_INFO; + data.id = static_cast(m_client->protocol()->plugin())->MSNNewMail; + EventShowNotification e(data); + e.process(); + } + } +} + +bool MSNServerMessage::packet() +{ + Buffer &b = m_client->socket()->readBuffer(); + unsigned size = b.writePos() - b.readPos(); + if (size > m_size) + size = m_size; + if (size > 0){ + m_msg += QByteArray(b.data(b.readPos()), size); + b.incReadPos(size); + m_size -= size; + } + return (m_size == 0); +} + diff --git a/plugins/msn/msnpacket.h b/plugins/msn/msnpacket.h new file mode 100644 index 0000000..04ca8ff --- /dev/null +++ b/plugins/msn/msnpacket.h @@ -0,0 +1,164 @@ +/*************************************************************************** + msnpacket.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSNPACKET_H +#define _MSNPACKET_H + +#include "msnclient.h" + +#include + +class MSNPacket +{ +public: + MSNPacket(MSNClient *client, const QString &cmd); + virtual ~MSNPacket(){} + const QString &cmd() const { return m_cmd; } + unsigned id() const { return m_id; } + virtual void answer(const QStringList&) {}; + virtual void error(unsigned code); + void addArg(const QString &str); + void addArg(const char *str); + virtual void send(); +protected: + QString m_line; + QString m_cmd; + MSNClient *m_client; + unsigned m_id; +}; + +class VerPacket : public MSNPacket +{ +public: + VerPacket(MSNClient *client); + void answer(const QStringList &args); +}; + +class CvrPacket : public MSNPacket +{ +public: + CvrPacket(MSNClient *client); + void answer(const QStringList &args); +}; + +class UsrPacket : public MSNPacket +{ +public: + UsrPacket(MSNClient *client, const QString &hash = QString::null); + void answer(const QStringList &args); +}; + +class OutPacket : public MSNPacket +{ +public: + OutPacket(MSNClient *client); +}; + +class ChgPacket : public MSNPacket +{ +public: + ChgPacket(MSNClient *client); +}; + +class SynPacket : public MSNPacket +{ +public: + SynPacket(MSNClient *client); + void answer(const QStringList &args); +}; + +class QryPacket : public MSNPacket +{ +public: + QryPacket(MSNClient *client, const QString &qry); + virtual void send(); +}; + +class AdgPacket : public MSNPacket +{ +public: + AdgPacket(MSNClient *client, unsigned grp_id, const QString &name); + void answer(const QStringList &args); +protected: + unsigned m_id; +}; + +class RegPacket : public MSNPacket +{ +public: + RegPacket(MSNClient *client, unsigned id, const QString &name); +}; + +class RmgPacket : public MSNPacket +{ +public: + RmgPacket(MSNClient *client, unsigned long id); +}; + +class AddPacket : public MSNPacket +{ +public: + AddPacket(MSNClient *client, const QString &listType, const QString &mail, const QString &name, unsigned grp=0); + void answer(const QStringList &args); + virtual void error(unsigned code); +protected: + QString m_mail; +}; + +class RemPacket : public MSNPacket +{ +public: + RemPacket(MSNClient *client, const QString &listType, const QString &mail, unsigned group=NO_GROUP); +}; + +class ReaPacket : public MSNPacket +{ +public: + ReaPacket(MSNClient *client, const QString &mail, const QString &name); + virtual void error(unsigned code); +}; + +class BlpPacket : public MSNPacket +{ +public: + BlpPacket(MSNClient *client); +}; + +class XfrPacket : public MSNPacket +{ +public: + XfrPacket(MSNClient *client, SBSocket *socket); + void clear(); + void answer(const QStringList &args); +protected: + SBSocket *m_socket; +}; + +class MSNServerMessage +{ +public: + MSNServerMessage(MSNClient *client, unsigned size); + ~MSNServerMessage(); + bool packet(); +protected: + QByteArray m_msg; + MSNClient *m_client; + unsigned m_size; +}; + +#endif + diff --git a/plugins/msn/msnsearch.cpp b/plugins/msn/msnsearch.cpp new file mode 100644 index 0000000..53efc5f --- /dev/null +++ b/plugins/msn/msnsearch.cpp @@ -0,0 +1,61 @@ +/*************************************************************************** + msnsearch.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "msnsearch.h" +#include "msnclient.h" +#include "simgui/intedit.h" +#include "contacts/contact.h" + +#include +#include +#include +#include + +using namespace SIM; + +class MSNClient; + +MSNSearch::MSNSearch(MSNClient *client, QWidget *parent) : QWidget(parent) +{ + setupUi(this); + m_client = client; + connect(this, SIGNAL(setAdd(bool)), topLevelWidget(), SLOT(setAdd(bool))); + edtMail->setValidator(new EMailValidator(edtMail)); +} + +void MSNSearch::showEvent(QShowEvent *e) +{ + QWidget::showEvent(e); + emit setAdd(true); +} + +void MSNSearch::createContact(unsigned tmpFlags, Contact *&contact) +{ + QString mail = edtMail->text(); + int pos = 0; + if ((edtMail->validator()->validate(mail, pos) != QValidator::Acceptable)) + return; + if (m_client->findContact(mail, contact)) + return; + QString name = mail; + int n = name.indexOf('@'); + if (n > 0) + name = name.left(n); + m_client->findContact(mail, name, contact, false); + contact->setFlags(contact->getFlags() | tmpFlags); +} + diff --git a/plugins/msn/msnsearch.h b/plugins/msn/msnsearch.h new file mode 100644 index 0000000..7c5ec3e --- /dev/null +++ b/plugins/msn/msnsearch.h @@ -0,0 +1,45 @@ +/*************************************************************************** + msnsearch.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MSNSEARCH_H +#define _MSNSEARCH_H + +#include "contacts.h" + +#include "ui_msnsearchbase.h" + +#include + +class MSNClient; +class GroupRadioButton; + +class MSNSearch : public QWidget, public Ui::MSNSearch +{ + Q_OBJECT +public: + MSNSearch(MSNClient *client, QWidget *parent); +signals: + void setAdd(bool); +protected slots: + void createContact(unsigned tmpFlags, SIM::Contact *&contact); +protected: + MSNClient *m_client; + void showEvent(QShowEvent*); +}; + +#endif + diff --git a/plugins/msn/msnsearchbase.ui b/plugins/msn/msnsearchbase.ui new file mode 100644 index 0000000..cd3df6d --- /dev/null +++ b/plugins/msn/msnsearchbase.ui @@ -0,0 +1,68 @@ + + + MSNSearch + + + + 0 + 0 + 141 + 293 + + + + Form1 + + + + 6 + + + 0 + + + + + E-Mail + + + + + + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + LinkLabel + QWidget +
    simgui/linklabel.h
    +
    +
    + + +
    diff --git a/plugins/navigate/CMakeLists.txt b/plugins/navigate/CMakeLists.txt new file mode 100644 index 0000000..bf74098 --- /dev/null +++ b/plugins/navigate/CMakeLists.txt @@ -0,0 +1,25 @@ +#################### +# navigate library # +#################### +IF(BUILD_DROPPED) +SET(navigate_SRCS + navcfg.cpp + navigate.cpp +) + +SET(navigate_HDRS + navcfg.h + navigate.h +) + +SET(navigate_UICS + navcfgbase.ui +) + +ADD_FLEX_FILES(navigate_SRCS parseurl.ll) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(navigate) +ENDIF(BUILD_DROPPED) diff --git a/plugins/navigate/navcfg.cpp b/plugins/navigate/navcfg.cpp new file mode 100644 index 0000000..0c966e8 --- /dev/null +++ b/plugins/navigate/navcfg.cpp @@ -0,0 +1,74 @@ +/*************************************************************************** + navcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include +#include +#include + +#include "navcfg.h" +#include "navigate.h" + +NavCfg::NavCfg(QWidget *parent, NavigatePlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; +#ifdef WIN32 + chkNew->setChecked(plugin->value("NewWindow").toBool()); + edtBrowser->hide(); + edtMailer->hide(); + lblBrowser->hide(); + lblMailer->hide(); +#else + edtBrowser->setText(plugin->value("Browser").toString()); + edtMailer->setText(plugin->value("Mailer").toString()); + chkNew->hide(); +#endif +#ifdef USE_KDE + connect(chkKDE, SIGNAL(toggled(bool)), SLOT(useKDEtoggled(bool))); + chkKDE->setChecked(plugin->getUseKDE()); +#else + chkKDE->hide(); +#endif +} + +void NavCfg::apply() +{ +#ifdef WIN32 + m_plugin->setValue("NewWindow", chkNew->isChecked()); +#else + m_plugin->setValue("Browser", edtBrowser->text()); + m_plugin->setValue("Mailer", edtMailer->text()); +#endif +#ifdef USE_KDE + m_plugin->setUseKDE(chkKDE->isChecked()); +#endif +} + +void NavCfg::useKDEtoggled(bool on) +{ + bool off = !on; +#ifdef USE_KDE + edtBrowser->setEnabled(off); + edtMailer->setEnabled(off); + lblBrowser->setEnabled(off); + lblMailer->setEnabled(off); +#endif + off=false; +} + diff --git a/plugins/navigate/navcfg.h b/plugins/navigate/navcfg.h new file mode 100644 index 0000000..f57fa4c --- /dev/null +++ b/plugins/navigate/navcfg.h @@ -0,0 +1,39 @@ +/*************************************************************************** + navcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _NAVCFG_H +#define _NAVCFG_H + +#include "ui_navcfgbase.h" + +class NavigatePlugin; + +class NavCfg : public QWidget, public Ui::NavCfgBase +{ + Q_OBJECT +public: + NavCfg(QWidget *w, NavigatePlugin *plugin); +public slots: + void apply(); +protected: + NavigatePlugin *m_plugin; +protected slots: + void useKDEtoggled(bool on); +}; + +#endif + diff --git a/plugins/navigate/navcfgbase.ui b/plugins/navigate/navcfgbase.ui new file mode 100644 index 0000000..621b911 --- /dev/null +++ b/plugins/navigate/navcfgbase.ui @@ -0,0 +1,108 @@ + + + + + NavCfgBase + + + + 0 + 0 + 278 + 192 + + + + Form1 + + + + 11 + + + 6 + + + + + Use KDE settings + + + + + + + Browser: + + + false + + + + + + + + + + Mailer: + + + false + + + + + + + + + + Open links in &new window (Win32: When unchecked, Explorer is used, else your installed default programs.) + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/navigate/navigate.cpp b/plugins/navigate/navigate.cpp new file mode 100644 index 0000000..0e6936a --- /dev/null +++ b/plugins/navigate/navigate.cpp @@ -0,0 +1,623 @@ +/*************************************************************************** + navigate.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#include +#include +#include + +#include "navigate.h" +#include "navcfg.h" +#include "log.h" +#include "core.h" +#include "core_consts.h" + +#include "profile.h" +#include "profilemanager.h" + +#include "contacts/contact.h" + +#ifdef USE_KDE + #include +#endif + +#ifndef WIN32 + #include + #include +#endif + +using namespace std; +using namespace SIM; + +#ifdef WIN32 +#include +#include + +class DDEbase +{ +public: + DDEbase(); + ~DDEbase(); + operator DWORD() { return m_idDDE; } + static DDEbase *base; +protected: + DWORD m_idDDE; + static HDDEDATA CALLBACK DDECallback(UINT, UINT, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD); +}; + +DDEbase *DDEbase::base = NULL; + +DDEbase::DDEbase() +{ + m_idDDE = 0; + FARPROC lpDdeProc = MakeProcInstance((FARPROC) DDECallback, hInstance); + DdeInitialize((LPDWORD) &m_idDDE, (PFNCALLBACK) lpDdeProc, APPCMD_CLIENTONLY, 0L); + base = this; +} + +DDEbase::~DDEbase() +{ + base = NULL; + if (m_idDDE) + DdeUninitialize(m_idDDE); +} + +HDDEDATA CALLBACK DDEbase::DDECallback(UINT, UINT, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD) +{ + return NULL; +} + +class DDEstring +{ +public: + DDEstring(const QString &name); + ~DDEstring(); + operator HSZ() { return hSz; } +protected: + HSZ hSz; +}; + +DDEstring::DDEstring(const QString &name) : hSz(NULL) +{ + hSz = DdeCreateStringHandle(*DDEbase::base, (WCHAR*)name.utf16(), CP_WINUNICODE); +} + +DDEstring::~DDEstring() +{ + if (hSz) + DdeFreeStringHandle(*DDEbase::base, hSz); +} + +class DDEdataHandle +{ +public: + DDEdataHandle(const char *text); + DDEdataHandle(HDDEDATA data); + ~DDEdataHandle(); + operator HDDEDATA() { return hData; } + operator const char *(); +protected: + HDDEDATA hData; +}; + +DDEdataHandle::DDEdataHandle(const char *text) +{ + hData = DdeCreateDataHandle(*DDEbase::base, (unsigned char*)text, strlen(text) + 1, 0, NULL, CF_TEXT, 0); +} + +DDEdataHandle::DDEdataHandle(HDDEDATA data) +{ + hData = data; +} + +DDEdataHandle::~DDEdataHandle() +{ + if (hData) DdeFreeDataHandle(hData); +} + +DDEdataHandle::operator const char*() +{ + if (hData == NULL) + return NULL; + return (const char*)DdeAccessData(hData, NULL); +} + +class DDEconversation +{ +protected: + HCONV hConv; +public: + DDEconversation(const QString &_server, const QString &_topic); + ~DDEconversation(); + operator HCONV() { return hConv; } + HDDEDATA Execute(const QString &cmd); +}; + +DDEconversation::DDEconversation(const QString &_server, const QString &_topic) + : hConv(NULL) +{ + DDEstring server(_server); + DDEstring topic(_topic); + hConv = DdeConnect(*DDEbase::base, server, topic, NULL); +} + +DDEconversation::~DDEconversation() +{ + if (hConv) + DdeDisconnect(hConv); +} + +HDDEDATA DDEconversation::Execute(const QString &cmd) +{ + if (hConv == NULL) + return NULL; + DDEstring c(cmd); + DWORD res = 0; + HDDEDATA hData = DdeClientTransaction(NULL, 0, hConv, c, CF_TEXT, XTYP_REQUEST, 30000, &res); + if (hData == NULL) + DdeGetLastError((DWORD)DDEbase::base); + return hData; +} + +class RegEntry +{ +public: + RegEntry(HKEY hRootKey, const QString &path); + ~RegEntry(); + operator HKEY() { return hKey; } + QString value(const QString &key); +protected: + HKEY hKey; +}; + +QString getCurrentUrl() +{ + RegEntry r(HKEY_CLASSES_ROOT, "HTTP\\Shell\\open\\ddeexec\\application"); + QString topic = r.value(""); + if (topic.isEmpty()) + return QString::null; + + DDEbase b; + DDEconversation conv(topic, "WWW_GetWindowInfo"); + DDEdataHandle answer(conv.Execute("-1")); + const char *url = answer; + return url; +} + +RegEntry::RegEntry(HKEY hRootKey, const QString &path) +{ + if (RegOpenKey(hRootKey, (LPCWSTR)path.utf16(), &hKey) != ERROR_SUCCESS) + hKey = NULL; +} + +RegEntry::~RegEntry() +{ + if (hKey) + RegCloseKey(hKey); +} + +QString RegEntry::value(const QString &key) +{ + if (hKey == NULL) + return QString::null; + long size = 0; + if (RegQueryValue(hKey, (LPCWSTR)key.utf16(), NULL, &size) != ERROR_SUCCESS) + return QString::null; + QVarLengthArray ba(size + 1); + if (RegQueryValue(hKey, (LPCWSTR)key.utf16(), (LPWSTR)ba.data(), &size) != ERROR_SUCCESS) + return QString(); + return QString::fromUtf16(ba.constData()); +} + +#endif + +#ifdef __OS2__ + +static char browserExe[ CCHMAXPATH ] = ""; + +static char *detectBrowser() +{ + char *prfApp = "WPURLDEFAULTSETTINGS"; + + if ( browserExe[0] == 0 ) { + PrfQueryProfileString( HINI_USER, prfApp, "DefaultBrowserExe", "", + browserExe, CCHMAXPATH ); + } + + if ( browserExe[0] == 0 ) + { + APIRET rc; + rc = DosSearchPath( SEARCH_CUR_DIRECTORY | SEARCH_ENVIRONMENT | SEARCH_IGNORENETERRS, + "PATH", "NETSCAPE.EXE", browserExe, CCHMAXPATH ); + if ( rc != 0 ) { + strcpy( browserExe , "" ); + } + } + + return browserExe; +} + +// Starts the browser, returns 1 if started, 0 otherwise. +int startBrowser( const char *browser, const char *url ) +{ + PROGDETAILS pd = { 0 }; + HAPP happ = NULL; + + if ( url == NULL ) { + return 0; + } + if ( browser == NULL ) { + return 0; + } + if ( browser[0] == 0 ) { + return 0; + } + + log(L_WARN, "Strarting '%s', url '%s'", browser, url ); + + char startupDir[ CCHMAXPATH ]; + strcpy( startupDir, browser ); + char *slash = strrchr( startupDir, '\\' ); + if ( slash != NULL ) { + *slash = 0; + } + + pd.Length = sizeof( PROGDETAILS ); + pd.progt.progc = PROG_DEFAULT; + pd.progt.fbVisible = SHE_VISIBLE; + pd.pszTitle = NULL; + pd.pszExecutable = (char *)browser; + pd.pszParameters = NULL; + pd.pszStartupDir = startupDir; + pd.pszIcon = NULL; + pd.pszEnvironment = NULL; + pd.swpInitial.fl = SWP_ACTIVATE; + pd.swpInitial.cy = 0; + pd.swpInitial.cx = 0; + pd.swpInitial.y = 0; + pd.swpInitial.x = 0; + pd.swpInitial.hwndInsertBehind = HWND_TOP; + pd.swpInitial.hwnd = NULLHANDLE; + pd.swpInitial.ulReserved1 = 0; + pd.swpInitial.ulReserved2 = 0; + happ = WinStartApp( NULLHANDLE, &pd, url, NULL, 0 ); + if ( happ == NULL ) { + log(L_ERROR, "Can't start '%s', error 0x%X", browser, WinGetLastError(0) ); + } + return ( happ != NULL ); +} + +#endif + +Plugin *createNavigatePlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new NavigatePlugin(base, config); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Navigate"), + I18N_NOOP("Plugin provides navigation on hyperlinks, call an external browser and mailer"), + VERSION, + createNavigatePlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + + +NavigatePlugin::NavigatePlugin(unsigned base, Buffer *config) + : QObject(), Plugin(base) +{ + m_propertyHub = SIM::PropertyHub::create("navigate"); + CmdMail = registerType(); + CmdMailList = registerType(); + MenuMail = registerType(); + CmdCopyLocation = registerType(); + + EventMenu(MenuMail, EventMenu::eAdd).process(); + + Command cmd; + cmd->id = CmdMail; + cmd->text = I18N_NOOP("Send mail"); + cmd->icon = "mail_generic"; + cmd->menu_id = MenuContact; + cmd->menu_grp = 0x30F0; + cmd->popup_id = 0; + cmd->flags = COMMAND_DEFAULT; + EventCommandCreate(cmd).process(); + + cmd->id = CmdMailList; + cmd->text = "_"; + cmd->menu_grp = 0x1000; + cmd->menu_id = MenuMail; + EventCommandCreate(cmd).process(); + + cmd->id = CmdCopyLocation; + cmd->text = I18N_NOOP("Copy &location"); + cmd->icon = QString::null; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x7010; + cmd->menu_id = MenuMsgView; + EventCommandCreate(cmd).process(); + + + //EventCommandCreate(cmd).process(); +} + +NavigatePlugin::~NavigatePlugin() +{ + EventCommandRemove(CmdMail).process(); + EventMenu(MenuMail, EventMenu::eRemove).process(); + +} + +bool NavigatePlugin::processEvent(Event *e) +{ +#ifdef WIN32 + if (e->type() == eEventGetURL){ + EventGetURL *u = static_cast(e); + u->setUrl(getCurrentUrl()); + return true; + } +#endif + if (e->type() == eEventGoURL){ + EventGoURL *u = static_cast(e); + QString url = u->url(); + QString proto; + if (url.length() == 0) + return false; + int n = url.indexOf(':'); + if (n < 0) + return false; + proto = url.left(n); + if ((proto != "http") && + (proto != "https") && + (proto != "ftp") && + (proto != "file") && + (proto != "mailto") && + (proto != "file")) + return false; +#ifdef WIN32 + bool bExec = false; + if (value("NewWindow").toBool()){ + QString key_name = proto + "\\Shell\\Open"; + RegEntry rp(HKEY_CLASSES_ROOT, key_name); + QString prg = rp.value("command"); + QString action = rp.value("ddeexec"); + QString topic = rp.value("ddeexec\\Topic"); + QString server = rp.value("ddeexec\\Application"); + + int pos = action.indexOf("%l"); + if (!action.isEmpty() && pos >= 0) + action = action.left(pos) + url + action.mid(pos + 2); + + //prg=prg.replace("\%l","\%1"); + if (proto=="file") { + pos = prg.indexOf("%l"); + if (pos >= 0) + prg = prg.left(pos) + url + prg.mid(pos + 2); + } + else + prg = QString(prg).arg(url); + + if (!prg.isEmpty()){ + STARTUPINFO si; + PROCESS_INFORMATION pi; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + if (CreateProcess(NULL, (LPWSTR)prg.utf16(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){ + WaitForInputIdle(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + bExec = true; + } + } + if(!bExec) { + DDEbase b; + DDEconversation conv(server, topic); + if (conv.Execute(action)) + bExec = true; + } + } + if (!bExec) + { + if (proto == "file") + url = url.mid(5); + //ShellExecuteA(NULL, NULL, url.data(), NULL, NULL, SW_SHOWNORMAL); //Fixme: Bug, does not work + QString program = "explorer"; + QStringList arguments; + arguments << url; + + QProcess *openPathInExplorer = new QProcess(this); + openPathInExplorer->start(program, arguments); + + //QProcess openPathInExplorer; + //QString path(url); + //path.replace("%20", " "); + + /*openPathInExplorer .addArgument("explorer"); + openPathInExplorer.addArgument(path); + if (openPathInExplorer.start()) + qDebug() << i18n("Explorer started for Path"); + else + qDebug() << i18n("ERR: Explorer started for Path FAILED!"); */ + } +#else +#ifdef USE_KDE + if (getUseKDE()) + { + if (proto == "mailto") + kapp->invokeMailer(QString(url.mid(proto.length() + 1)), QString::null); + else + kapp->invokeBrowser(url); + return true; + } +#endif // USE_KDE +#ifdef __OS2__ + startBrowser( (proto == "mailto") ? value("Mailer") : value("Browser").toString(), url ); +#else + QString param; + if (proto == "mailto"){ + param = value("Mailer").toString(); + url = url.mid(proto.length() + 1); + }else{ + param = value("Browser").toString(); + QUrl qurl(url); + QString encodedUrl = qurl.toString(); + url = encodedUrl; + } + QStringList ul; + ul.append(url); + EventExec(param, ul).process(); +#endif +#endif // WIN32 + return true; + } else + if (e->type() == eEventAddHyperlinks){ + EventAddHyperlinks *h = static_cast(e); + h->setText(parseUrl(h->text())); + return true; + } else + if (e->type() == eEventCheckCommandState){ + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if (cmd->id == CmdMail){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + QString mails = contact->getEMails(); + if (mails.length() == 0) + return false; + int nMails = 0; + while (mails.length()){ + getToken(mails, ';'); + nMails++; + } + cmd->popup_id = (nMails <= 1) ? 0 : MenuMail; + return true; + } + if (cmd->id == CmdMailList){ + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact == NULL) + return false; + QString mails = contact->getEMails(); + if (mails.length() == 0) + return false; + int nMails = 0; + while (mails.length()){ + getToken(mails, ';'); + nMails++; + } + CommandDef *cmds = new CommandDef[nMails + 1]; + unsigned n = 0; + mails = contact->getEMails(); + while (mails.length()){ + QString mail = getToken(mails, ';', false); + mail = getToken(mail, '/'); + cmds[n] = *cmd; + cmds[n].id = CmdMailList + n; + cmds[n].flags = COMMAND_DEFAULT; + cmds[n].text_wrk = mail; + n++; + } + cmds[n].clear(); + cmd->param = cmds; + cmd->flags |= COMMAND_RECURSIVE; + return true; + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->id == CmdMail){ + QString mail; + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact) + mail = contact->getEMails(); + mail = getToken(mail, ';', false); + mail = getToken(mail, '/'); + if (mail.length()){ + QString addr = "mailto:" + mail; + EventGoURL eMail(addr); + eMail.process(); + } + return true; + } + if (cmd->menu_id == MenuMail){ + unsigned n = cmd->id - CmdMailList; + QString mails; + Contact *contact = getContacts()->contact((unsigned long)(cmd->param)); + if (contact) + mails = contact->getEMails(); + while (mails.length()){ + QString mail = getToken(mails, ';', false); + if (n-- == 0){ + mail = getToken(mail, '/'); + if (mail.length()){ + QString addr = "mailto:" + mail; + EventGoURL(addr).process(); + } + break; + } + } + return true; + } + } + if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("navigate"); + if(!hub.isNull()) + setPropertyHub(hub); + // TODO defaults + } + return false; +} + +QByteArray NavigatePlugin::getConfig() +{ + return QByteArray();//Fixme +} + +QWidget *NavigatePlugin::createConfigWindow(QWidget *parent) +{ + return new NavCfg(parent, this); +} + + +void NavigatePlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr NavigatePlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant NavigatePlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void NavigatePlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/navigate/navigate.h b/plugins/navigate/navigate.h new file mode 100644 index 0000000..363bfed --- /dev/null +++ b/plugins/navigate/navigate.h @@ -0,0 +1,54 @@ +/*************************************************************************** + navigate.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _NAVIGATE_H +#define _NAVIGATE_H + +#include "simapi.h" + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" +#include + + +class NavigatePlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ +public: + NavigatePlugin(unsigned, Buffer *name); + virtual ~NavigatePlugin(); + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +protected: + virtual bool processEvent(SIM::Event *e); + QString parseUrl(const QString &text); + unsigned long CmdMail; + unsigned long CmdMailList; + unsigned long CmdCopyLocation; + unsigned long MenuMail; + virtual QByteArray getConfig(); + virtual QWidget *createConfigWindow(QWidget *parent); + friend class NavCfg; +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/navigate/navigate.rc b/plugins/navigate/navigate.rc new file mode 100644 index 0000000..3209c06 --- /dev/null +++ b/plugins/navigate/navigate.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Navigate plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "navigate\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "navigate.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/navigate/navigate.vcproj b/plugins/navigate/navigate.vcproj new file mode 100644 index 0000000..22b6d18 --- /dev/null +++ b/plugins/navigate/navigate.vcproj @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/navigate/parseurl.ll b/plugins/navigate/parseurl.ll new file mode 100644 index 0000000..70ff59a --- /dev/null +++ b/plugins/navigate/parseurl.ll @@ -0,0 +1,114 @@ +%{ +/*************************************************************************** + parse.ll - description + ------------------- + begin : Sun Mar 10 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "unquot.h" + +#include "navigate.h" +//Added by qt3to4: +#include + +#define TXT 1 +#define URL 2 +#define MAIL_URL 3 +#define HTTP_URL 4 +#define FTP_URL 5 + +#define YY_NEVER_INTERACTIVE 1 +#define YY_ALWAYS_INTERACTIVE 0 +#define YY_MAIN 0 + +%} + +%option nounput +%option nostack +%option prefix="parseurl" + +%x x_tag +%x x_word +%x x_link +%% + +(http|https|ftp)"://"[A-Za-z0-9/\,\.\?\@\&:\;\(\)\-_\+\'\%=~\#]+ { return URL; } +"file:///"[A-Za-z0-9/\,\.\?\@\&:\;\(\)\-_\+\'\%=\\~\#]+ { return URL; } +(mailto:)?[A-Za-z0-9\-_][A-Za-z0-9\-_\.]*\@([A-Za-z0-9\-]+\.)+[A-Za-z]+ { return MAIL_URL; } +"www."[A-Za-z0-9/\,\.\?\&:\;\(\)\-_\+\%=~\#\']+ { return HTTP_URL; } +"ftp."[A-Za-z0-9/\,\.:\;\-_\+~\']+ { return FTP_URL; } +""" { BEGIN(INITIAL); return TXT; } +"&" { BEGIN(INITIAL); return TXT; } +"<" { BEGIN(INITIAL); return TXT; } +">" { BEGIN(INITIAL); return TXT; } +"\t" { BEGIN(INITIAL); return TXT; } +" " { BEGIN(INITIAL); return TXT; } +[\:\.\,\ \(\)] { BEGIN(INITIAL); return TXT; } +"" { BEGIN(x_link); return TXT; } +"<" { BEGIN(x_tag); return TXT; } +">" { BEGIN(INITIAL); return TXT; } +. { return TXT; } +"" { BEGIN(INITIAL); return TXT; } +. { return TXT; } +[\xC0-\xDF][\x80-\xBF] { BEGIN(x_word); return TXT; } +[\xE0-\xEF][\x00-\xFF]{2} { BEGIN(x_word); return TXT; } +[\xF0-\xF7][\x00-\xFF]{3} { BEGIN(x_word); return TXT; } +[\xF8-\xFB][\x00-\xFF]{4} { BEGIN(x_word); return TXT; } +[\xFC-\xFD][\x00-\xFF]{5} { BEGIN(x_word); return TXT; } +"\n" { BEGIN(INITIAL); return TXT; } +. { BEGIN(x_word); return TXT; } +%% + +int yywrap() { return 1; } + +QString NavigatePlugin::parseUrl(const QString &text) +{ + QByteArray str = text.toUtf8(); + YY_BUFFER_STATE yy_current_buffer = yy_scan_string(str); + yy_start = 1; /* == BEGIN(INITIAL) - go to initial state since yy_start + is static and can have an old invalid value */ + QString res; + int r; + while ((r = yylex())) {; + if (r == TXT){ + res += QString::fromUtf8(yytext); + continue; + } + QString url = yytext; + QString link = SIM::unquoteString(QString::fromUtf8(yytext)); + switch (r){ + case MAIL_URL: + if (link.left(7) != "mailto:") + link = QString("mailto:") + link; + break; + case HTTP_URL: + link = QString("http://") + link; + break; + case FTP_URL: + link = QString("ftp://") + link; + break; + } + res += ""; + res += url; + res += ""; + }; + yy_delete_buffer(yy_current_buffer); + return res; +} + + + + diff --git a/plugins/netmonitor/CMakeLists.txt b/plugins/netmonitor/CMakeLists.txt new file mode 100644 index 0000000..09306ce --- /dev/null +++ b/plugins/netmonitor/CMakeLists.txt @@ -0,0 +1,21 @@ +###################### +# netmonitor library # +###################### +IF(BUILD_DROPPED) +PROJECT(netmonitor) + +SET(netmonitor_SRCS + monitor.cpp + netmonitor.cpp +) + +SET(netmonitor_HDRS + monitor.h + netmonitor.h +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(netmonitor) +ENDIF(BUILD_DROPPED) diff --git a/plugins/netmonitor/monitor.cpp b/plugins/netmonitor/monitor.cpp new file mode 100644 index 0000000..392505b --- /dev/null +++ b/plugins/netmonitor/monitor.cpp @@ -0,0 +1,279 @@ +/*************************************************************************** + monitor.cpp - description + ------------------- + begin : Sun Mar 24 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "icons.h" +#include "log.h" +#include "misc.h" +#include "unquot.h" + +#include "monitor.h" +#include "netmonitor.h" + +using namespace SIM; + +MonitorWindow *monitor = NULL; + +MonitorWindow::MonitorWindow(NetmonitorPlugin *plugin) + : QMainWindow(NULL, Qt::Window) + , m_plugin(plugin) +{ + bPause = true; // no debug output during creation + SET_WNDPROC("monitor") + setWindowTitle(i18n("Network monitor")); + setWindowIcon(Icon("network")); + + edit = new QTextEdit(this); + edit->setLineWrapMode(QTextEdit::NoWrap); + edit->setReadOnly(true); + setCentralWidget(edit); + QMenuBar *menu = menuBar(); + + QMenu *menuFile = new QMenu(i18n("&File"), menu); + connect(menuFile, SIGNAL(aboutToShow()), this, SLOT(adjustFile())); + m_saveAction = menuFile->addAction(Icon("filesave"), i18n("&Save"), this, SLOT(save())); + menuFile->addSeparator(); + m_autoscrollAction = menuFile->addAction(i18n("&Autoscroll"), this, SLOT(toggleAutoscroll())); + m_autoscrollAction->setCheckable(true); + m_pauseAction = menuFile->addAction(i18n("&Pause"), this, SLOT(pause())); + menuFile->addSeparator(); + menuFile->addAction(Icon("exit"), i18n("E&xit"), this, SLOT(exit())); + menu->addMenu(menuFile); + + QMenu *menuEdit = new QMenu(i18n("&Edit"), menu); + connect(menuEdit, SIGNAL(aboutToShow()), this, SLOT(adjustEdit())); + m_copyAction = menuEdit->addAction(i18n("&Copy"), this, SLOT(copy())); + m_eraseAction = menuEdit->addAction(i18n("&Erase"), this, SLOT(erase())); + menu->addMenu(menuEdit); + + m_menuLog = new QMenu(i18n("&Log"), menu); + connect(m_menuLog, SIGNAL(aboutToShow()), this, SLOT(adjustLog())); + connect(m_menuLog, SIGNAL(triggered(QAction*)), this, SLOT(toggleType(QAction*))); + menu->addMenu(m_menuLog); + + bPause = false; + bAutoscroll = true; + edit->append( "
    " );
    +}
    +
    +void MonitorWindow::closeEvent(QCloseEvent *e)
    +{
    +    QMainWindow::closeEvent(e);
    +    emit finished();
    +}
    +
    +void MonitorWindow::save()
    +{
    +    QString s = QFileDialog::getSaveFileName (this, QString(), QString(), "sim.log");
    +    if (s.isEmpty())
    +        return;
    +    QFile f(s);
    +    if (!f.open(QIODevice::WriteOnly)){
    +        QMessageBox::warning(this, i18n("Error"), i18n("Can't create file %1") .arg(s));
    +        return;
    +    }
    +    QTextStream ts(&f);
    +    QString t;
    +    if (edit->textCursor().hasSelection()){
    +        t = unquoteText(edit->textCursor().selectedText());
    +    }else{
    +        t = unquoteText(edit->toPlainText());
    +    }
    +#if defined(WIN32) || defined(__OS2__)
    +    t.replace('\n',"\r\n");
    +#endif
    +    ts << t;
    +    f.close();
    +}
    +
    +void MonitorWindow::exit()
    +{
    +    close();
    +}
    +
    +void MonitorWindow::adjustFile()
    +{
    +    m_saveAction->setEnabled(edit->textCursor().hasSelection());
    +    m_pauseAction->setText(bPause ? i18n("&Resume") : i18n("&Pause"));
    +    m_autoscrollAction->setChecked(bAutoscroll);
    +}
    +
    +void MonitorWindow::copy()
    +{
    +    edit->copy();
    +}
    +
    +void MonitorWindow::erase()
    +{
    +    edit->clear();
    +}
    +
    +void MonitorWindow::adjustEdit()
    +{
    +    m_copyAction->setEnabled(edit->textCursor().hasSelection());
    +    m_eraseAction->setEnabled(!edit->textCursor().hasSelection());
    +}
    +
    +void MonitorWindow::toggleType(QAction *a)
    +{
    +    int id = a->data().toInt();
    +    switch (id){
    +    case L_DEBUG:
    +    case L_WARN:
    +    case L_ERROR:
    +    case L_PACKETS:
    +        m_plugin->setValue("LogLevel", m_plugin->value("LogLevel").toUInt() ^ id);
    +        return;
    +    }
    +    m_plugin->setLogType(id, !m_plugin->isLogType(id));
    +}
    +
    +void MonitorWindow::toggleAutoscroll()
    +{
    +    bAutoscroll = !bAutoscroll;
    +}
    +
    +void MonitorWindow::pause()
    +{
    +    bPause = !bPause;
    +}
    +
    +struct level_def
    +{
    +    unsigned	level;
    +    const char	*name;
    +};
    +
    +static level_def levels[] =
    +    {
    +        { L_DEBUG, I18N_NOOP("&Debug") },
    +        { L_WARN, I18N_NOOP("&Warnings") },
    +        { L_ERROR, I18N_NOOP("&Errors") },
    +        { L_PACKETS, I18N_NOOP("&Packets") },
    +        { 0, NULL }
    +    };
    +
    +void MonitorWindow::adjustLog()
    +{
    +    m_menuLog->clear();
    +    PacketType *packet;
    +    ContactList::PacketIterator it;
    +    while ((packet = ++it) != NULL){
    +        QAction *a = m_menuLog->addAction(i18n(packet->name()));
    +        a->setCheckable(true);
    +        a->setChecked(m_plugin->isLogType(packet->id()));
    +        a->setData(packet->id());
    +    }
    +    m_menuLog->addSeparator();
    +    for (const level_def *d = levels; d->name; d++){
    +        QAction *a = m_menuLog->addAction(i18n(d->name));
    +        a->setCheckable(true);
    +        a->setChecked((m_plugin->value("LogLevel").toUInt() & d->level) != 0);
    +        a->setData(d->level);
    +    }
    +}
    +
    +struct LevelColorDef
    +{
    +    unsigned	level;
    +    const char	*color;
    +};
    +
    +static LevelColorDef levelColors[] =
    +    {
    +        { L_DEBUG,	"008000" },
    +        { L_WARN,	"808000" },
    +        { L_ERROR,	"800000" },
    +        { L_PACKET_IN,	"000080" },
    +        { L_PACKET_OUT, "000000" },
    +        { 0,		 NULL 	 }
    +    };
    +
    +bool MonitorWindow::processEvent(Event *e)
    +{
    +    if (!e) {
    +        return false;
    +    }
    +
    +	EventLog *l = static_cast(e);
    +
    +    if (e->type() == eEventLog && !bPause &&
    +			(
    +                        ((l->packetID() == 0 && (l->logLevel() & m_plugin->value("LogLevel").toUInt())) ||
    +                        ( l->packetID()      && ((m_plugin->value("LogLevel").toUInt() & L_PACKETS) || m_plugin->isLogType(l->packetID()))))
    +			)
    +		)
    +	{
    +
    +		const char *font = NULL;
    +        for (const LevelColorDef *d = levelColors; d->color; d++)
    +			if (l->logLevel() == d->level){
    +				font = d->color;
    +				break;
    +			}
    +		
    +        QString logString;
    +		if (font)
    +			logString += QString("") .arg(font);
    +		QString s = EventLog::make_packet_string(*l);
    +		logString += quoteString(s);
    +		if (font)
    +			logString += QString("");
    +		QMutexLocker lock(&m_mutex);
    +		m_logStrings += logString;
    +		QTimer::singleShot(10, this, SLOT(outputLog()));
    +    }
    +    return false;
    +}
    +
    +void MonitorWindow::outputLog()
    +{
    +    if(m_logStrings.isEmpty())
    +        return;
    +    setLogEnable(false);
    +
    +    QMutexLocker lock(&m_mutex);
    +
    +    for(int i = 0; i < m_logStrings.count(); i++)
    +        edit->append(m_logStrings[i]);
    +
    +    m_logStrings.clear();
    +    if (bAutoscroll)
    +    {
    +        QScrollBar *sb = edit->verticalScrollBar();
    +        if (NULL != sb)
    +        {
    +            sb->setValue(sb->maximum());
    +        }
    +    }
    +    setLogEnable(true);
    +}
    +
    diff --git a/plugins/netmonitor/monitor.h b/plugins/netmonitor/monitor.h
    new file mode 100644
    index 0000000..426b7f5
    --- /dev/null
    +++ b/plugins/netmonitor/monitor.h
    @@ -0,0 +1,71 @@
    +/***************************************************************************
    +                          monitor.h  -  description
    +                             -------------------
    +    begin                : Sun Mar 17 2002
    +    copyright            : (C) 2002 by Vladimir Shutoff
    +    email                : vovan@shutoff.ru
    + ***************************************************************************/
    +
    +/***************************************************************************
    + *                                                                         *
    + *   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.                                   *
    + *                                                                         *
    + ***************************************************************************/
    +
    +#ifndef _MONITOR_H
    +#define _MONITOR_H
    +
    +#include 
    +#include 
    +
    +#include "event.h"
    +
    +class QAction;
    +class QMenu;
    +class QTextEdit;
    +class NetmonitorPlugin;
    +
    +const unsigned short L_PACKETS = 0x08;
    +
    +class MonitorWindow : public QMainWindow, public SIM::EventReceiver
    +{
    +    Q_OBJECT
    +public:
    +    MonitorWindow(NetmonitorPlugin*);
    +signals:
    +    void finished();
    +protected slots:
    +    void save();
    +    void exit();
    +    void copy();
    +    void erase();
    +    void pause();
    +    void toggleType(QAction*);
    +    void toggleAutoscroll();
    +    void adjustFile();
    +    void adjustEdit();
    +    void adjustLog();
    +protected:
    +    virtual bool processEvent(SIM::Event *e);
    +    void closeEvent(QCloseEvent*);
    +    bool bPause;
    +    bool bAutoscroll;
    +    QTextEdit  *edit;
    +    QAction *m_saveAction;
    +    QAction *m_autoscrollAction;
    +    QAction *m_pauseAction;
    +    QAction *m_copyAction;
    +    QAction *m_eraseAction;
    +    QMenu *m_menuLog;
    +    NetmonitorPlugin *m_plugin;
    +    QMutex m_mutex;
    +    QStringList m_logStrings;
    +protected slots:
    +    void outputLog();
    +};
    +
    +#endif
    +
    diff --git a/plugins/netmonitor/netmonitor.cpp b/plugins/netmonitor/netmonitor.cpp
    new file mode 100644
    index 0000000..cdbf910
    --- /dev/null
    +++ b/plugins/netmonitor/netmonitor.cpp
    @@ -0,0 +1,198 @@
    +/***************************************************************************
    +  netmonitor.cpp  -  description
    +  -------------------
    +begin                : Sun Mar 17 2002
    +copyright            : (C) 2002 by Vladimir Shutoff
    +email                : vovan@shutoff.ru
    + ***************************************************************************/
    +
    +/***************************************************************************
    + *                                                                         *
    + *   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.                                   *
    + *                                                                         *
    + ***************************************************************************/
    +
    +#include 
    +#include 
    +
    +#include "misc.h"
    +#include "core_consts.h"
    +
    +#include "profile.h"
    +#include "profilemanager.h"
    +
    +#include "netmonitor.h"
    +#include "monitor.h"
    +
    +using namespace std;
    +using namespace SIM;
    +
    +Plugin *createNetmonitorPlugin(unsigned base, bool, Buffer *config)
    +{
    +    Plugin *plugin = new NetmonitorPlugin(base, config);
    +    return plugin;
    +}
    +
    +static PluginInfo info =
    +{
    +    I18N_NOOP("Network monitor"),
    +    I18N_NOOP("Plugin provides monitoring of net and messages\n"
    +            "For show monitor on start run sim -m"),
    +    VERSION,
    +    createNetmonitorPlugin,
    +    PLUGIN_DEFAULT
    +};
    +
    +EXPORT_PROC PluginInfo* GetPluginInfo()
    +{
    +    return &info;
    +}
    +
    +//static DataDef monitorData[] =
    +//{
    +    //        { "LogLevel", DATA_ULONG, 1, DATA(7) },
    +    //        { "LogPackets", DATA_STRING, 1, 0 },
    +//    { "Geometry", DATA_LONG, 5, DATA(-1) },
    +//    { "Show", DATA_BOOL, 1, 0 },
    +//    { NULL, DATA_UNKNOWN, 0, 0 }
    +//};
    +
    +NetmonitorPlugin::NetmonitorPlugin(unsigned base, Buffer *config)
    +    : QObject(), Plugin(base)
    +    , monitor(NULL)
    +{
    +    m_propertyHub = SIM::PropertyHub::create("netmonitor");
    +
    +    const QStringList packets = value("LogPackets").toString().split(',');
    +    Q_FOREACH( const QString &v, packets)
    +        setLogType(v.toULong(), true);
    +    
    +    CmdNetMonitor = registerType();
    +
    +    Command cmd;
    +    cmd->id          = CmdNetMonitor;
    +    cmd->text        = I18N_NOOP("Network monitor");
    +    cmd->icon        = "network";
    +    cmd->bar_id      = ToolBarMain;
    +    cmd->menu_id     = MenuMain;
    +    cmd->menu_grp    = 0x8000;
    +    cmd->flags		= COMMAND_DEFAULT;
    +    EventCommandCreate(cmd).process();
    +
    +    EventArg e("-m", I18N_NOOP("Show network monitor"));
    +    if (e.process() || value("Show").toBool())
    +        showMonitor();
    +}
    +
    +NetmonitorPlugin::~NetmonitorPlugin()
    +{
    +    saveState();
    +    setValue("Show", monitor != NULL);
    +    QString packets;
    +    QSetIterator it(m_packets);
    +    while (it.hasNext()) {
    +        if (packets.length())
    +            packets += ',';
    +        packets += QString::number(it.next());
    +    }
    +    setValue("LogPackets", packets);
    +    EventCommandRemove(CmdNetMonitor).process();
    +
    +    delete monitor;
    +
    +}
    +
    +QByteArray NetmonitorPlugin::getConfig()
    +{
    +    return QByteArray();
    +}
    +
    +bool NetmonitorPlugin::isLogType(unsigned id)
    +{
    +    return ( m_packets.contains( id ) );
    +}
    +
    +void NetmonitorPlugin::setLogType(unsigned id, bool bLog)
    +{
    +    if (bLog){
    +        m_packets.insert(id);
    +    }else{
    +        m_packets.remove(id);
    +    }
    +}
    +
    +const unsigned NO_DATA = (unsigned)(-1);
    +
    +void NetmonitorPlugin::showMonitor()
    +{
    +    if (monitor == NULL)
    +    {
    +        monitor = new MonitorWindow(this);
    +        //bool bPos = (data.geometry[LEFT].toLong() != NO_DATA) && (data.geometry[TOP].toLong() != NO_DATA);
    +        //bool bSize = (data.geometry[WIDTH].toLong() != NO_DATA) && (data.geometry[HEIGHT].toLong() != NO_DATA);
    +        //restoreGeometry(monitor, data.geometry, bPos, bSize);
    +        connect(monitor, SIGNAL(finished()), this, SLOT(finished()));
    +    }
    +    raiseWindow(monitor);
    +}
    +
    +bool NetmonitorPlugin::processEvent(Event *e)
    +{
    +    if (e->type() == eEventCommandExec){
    +        EventCommandExec *ece = static_cast(e);
    +        CommandDef *cmd = ece->cmd();
    +        if (cmd->id == CmdNetMonitor){
    +            showMonitor();
    +            return true;
    +        }
    +    }
    +    else if(e->type() == eEventPluginLoadConfig)
    +    {
    +        PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("netmonitor");
    +        if(!hub.isNull())
    +            setPropertyHub(hub);
    +    }
    +    return false;
    +}
    +
    +void NetmonitorPlugin::finished()
    +{
    +    saveState();
    +    QTimer::singleShot(0, this, SLOT(realFinished()));
    +}
    +
    +void NetmonitorPlugin::realFinished()
    +{
    +    delete monitor; //Fixme: Crash
    +    monitor = NULL;
    +}
    +
    +void NetmonitorPlugin::saveState()
    +{
    +    if (monitor == NULL)
    +        return;
    +    //saveGeometry(monitor, data.geometry);
    +}
    +
    +void NetmonitorPlugin::setPropertyHub(SIM::PropertyHubPtr hub)
    +{
    +	m_propertyHub = hub;
    +}
    +
    +SIM::PropertyHubPtr NetmonitorPlugin::propertyHub()
    +{
    +	return m_propertyHub;
    +}
    +
    +QVariant NetmonitorPlugin::value(const QString& key)
    +{
    +	return m_propertyHub->value(key);
    +}
    +
    +void NetmonitorPlugin::setValue(const QString& key, const QVariant& v)
    +{
    +	m_propertyHub->setValue(key, v);
    +}
    diff --git a/plugins/netmonitor/netmonitor.h b/plugins/netmonitor/netmonitor.h
    new file mode 100644
    index 0000000..dde01e7
    --- /dev/null
    +++ b/plugins/netmonitor/netmonitor.h
    @@ -0,0 +1,74 @@
    +/***************************************************************************
    +                          netmonitor.h  -  description
    +                             -------------------
    +    begin                : Sun Mar 17 2002
    +    copyright            : (C) 2002 by Vladimir Shutoff
    +    email                : vovan@shutoff.ru
    + ***************************************************************************/
    +
    +/***************************************************************************
    + *                                                                         *
    + *   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.                                   *
    + *                                                                         *
    + ***************************************************************************/
    +
    +#ifndef _NETMONITOR_H
    +#define _NETMONITOR_H
    +
    +#include 
    +#include 
    +
    +#include "cfg.h"
    +#include "event.h"
    +#include "plugins.h"
    +#include "propertyhub.h"
    +
    +struct NetMonitorData
    +{
    +//    SIM::Data	LogLevel;
    +//    SIM::Data	LogPackets;
    +//    SIM::Data	geometry[5];
    +//    SIM::Data	Show;
    +};
    +
    +class MonitorWindow;
    +
    +class NetmonitorPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver
    +{
    +    Q_OBJECT
    +public:
    +    NetmonitorPlugin(unsigned, Buffer *name);
    +    virtual ~NetmonitorPlugin();
    +//    PROP_ULONG(LogLevel);
    +//    PROP_STR(LogPackets);
    +//    PROP_BOOL(Show);
    +    bool isLogType(unsigned id);
    +    void setLogType(unsigned id, bool bLog);
    +        
    +    void setPropertyHub(SIM::PropertyHubPtr hub);
    +    SIM::PropertyHubPtr propertyHub();
    +    QVariant value(const QString& key);
    +    void setValue(const QString& key, const QVariant& v);
    +
    +protected slots:
    +    void finished();
    +    void realFinished();
    +
    +protected:
    +    virtual bool processEvent(SIM::Event *e);
    +    virtual QByteArray getConfig();
    +    void showMonitor();
    +    void saveState();
    +    unsigned long CmdNetMonitor;
    +    QSet m_packets;
    +    MonitorWindow *monitor;
    +
    +private:
    +    SIM::PropertyHubPtr m_propertyHub;
    +};
    +
    +#endif
    +
    diff --git a/plugins/netmonitor/netmonitor.vcproj b/plugins/netmonitor/netmonitor.vcproj
    new file mode 100644
    index 0000000..11eb244
    --- /dev/null
    +++ b/plugins/netmonitor/netmonitor.vcproj
    @@ -0,0 +1,349 @@
    +
    +
    +	
    +		
    +	
    +	
    +	
    +	
    +		
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +		
    +		
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +		
    +	
    +	
    +	
    +	
    +		
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +		
    +		
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +		
    +	
    +	
    +	
    +
    diff --git a/plugins/ontop/CMakeLists.txt b/plugins/ontop/CMakeLists.txt
    new file mode 100644
    index 0000000..78fee32
    --- /dev/null
    +++ b/plugins/ontop/CMakeLists.txt
    @@ -0,0 +1,23 @@
    +#################
    +# ontop library #
    +#################
    +IF(BUILD_DROPPED)
    +SET(ontop_SRCS
    +        ontop.cpp
    +        ontopcfg.cpp
    +)
    +
    +SET(ontop_HDRS
    +        ontop.h
    +        ontopcfg.h
    +)
    +
    +SET(ontop_UICS
    +        ontopcfgbase.ui
    +)
    +
    +REMOVE_DEFINITIONS(-DQT3_SUPPORT)
    +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB)
    +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS)
    +SIM_ADD_PLUGIN(ontop)
    +ENDIF(BUILD_DROPPED)
    diff --git a/plugins/ontop/configure.in.in b/plugins/ontop/configure.in.in
    new file mode 100644
    index 0000000..7751bd9
    --- /dev/null
    +++ b/plugins/ontop/configure.in.in
    @@ -0,0 +1 @@
    +AM_CONDITIONAL(ENABLE_ONTOP, test "$use_kde" = "yes" || test "$kde_use_qt_win" = "yes")
    diff --git a/plugins/ontop/ontop.cpp b/plugins/ontop/ontop.cpp
    new file mode 100644
    index 0000000..ca82463
    --- /dev/null
    +++ b/plugins/ontop/ontop.cpp
    @@ -0,0 +1,346 @@
    +/***************************************************************************
    +                          ontop.cpp  -  description
    +                             -------------------
    +    begin                : Sun Mar 17 2002
    +    copyright            : (C) 2002 by Vladimir Shutoff
    +    email                : vovan@shutoff.ru
    + ***************************************************************************/
    +
    +/***************************************************************************
    + *                                                                         *
    + *   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.                                   *
    + *                                                                         *
    + ***************************************************************************/
    +
    +#include "simapi.h"
    +#include "mainwin.h"
    +#include "core.h"
    +
    +#include "profile.h"
    +#include "profilemanager.h"
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +#ifdef WIN32
    +#include 
    +#else
    +#if defined(USE_KDE)
    +#include "kdeisversion.h"
    +#include 
    +#endif
    +#endif
    +
    +#include "misc.h"
    +#include "core_consts.h"
    +
    +#include "ontop.h"
    +#include "ontopcfg.h"
    +
    +using namespace SIM;
    +
    +Plugin *createOnTopPlugin(unsigned base, bool, Buffer *config)
    +{
    +#if defined(WIN32) || defined(USE_KDE)
    +    return new OnTopPlugin(base, config);
    +#else
    +    return NULL;
    +#endif
    +}
    +
    +static PluginInfo info =
    +    {
    +        I18N_NOOP("On Top"),
    +        I18N_NOOP("Plugin provides main window and containers always on top"),
    +        VERSION,
    +        createOnTopPlugin,
    +        PLUGIN_DEFAULT
    +    };
    +
    +EXPORT_PROC PluginInfo* GetPluginInfo()
    +{
    +    return &info;
    +}
    +
    +//static DataDef onTopData[] =
    +//    {
    +//        { "OnTop", DATA_BOOL, 1, DATA(1) },
    +//        { "InTask", DATA_BOOL, 1, 0 },
    +//        { "ContainerOnTop", DATA_BOOL, 1, 0 },
    +//        { NULL, DATA_UNKNOWN, 0, 0 }
    +//    };
    +
    +OnTopPlugin::OnTopPlugin(unsigned base, Buffer *config)
    +    : QObject(), Plugin(base)
    +{
    +    m_propertyHub = SIM::PropertyHub::create("ontop");
    +
    +    CmdOnTop = registerType();
    +
    +    Command cmd;
    +    cmd->id          = CmdOnTop;
    +    cmd->text        = I18N_NOOP("Always on top");
    +    cmd->menu_id     = MenuMain;
    +    cmd->menu_grp    = 0x7000;
    +    cmd->flags		= COMMAND_CHECK_STATE;
    +    EventCommandCreate(cmd).process();
    +
    +#ifdef WIN32
    +    m_state = HWND_NOTOPMOST;
    +#endif
    +
    +#if defined(WIN32) || defined (USE_KDE)
    +    qApp->installEventFilter(this);
    +#endif
    +
    +    setState();
    +}
    +
    +OnTopPlugin::~OnTopPlugin()
    +{
    +    EventCommandRemove(CmdOnTop).process();
    +
    +    setValue("OnTop", false);
    +    setState();
    +}
    +
    +bool OnTopPlugin::processEvent(Event *e)
    +{
    +    // FIXME what a mess...
    +    if (e->type() == eEventInit)
    +        setState();
    +    else if(e->type() == eEventPluginLoadConfig)
    +    {
    +        PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("ontop");
    +        if(!hub.isNull())
    +            setPropertyHub(hub);
    +        if(!value("OnTop").isValid())
    +            setValue("OnTop", true);
    +    }
    +    else
    +    if (e->type() == eEventCommandExec){
    +        EventCommandExec *ece = static_cast(e);
    +        CommandDef *cmd = ece->cmd();
    +        if (cmd->id == CmdOnTop){
    +            setValue("OnTop", !value("OnTop").toBool());
    +            setState();
    +            return true;
    +        }
    +    } else
    +    if (e->type() == eEventCheckCommandState){
    +        EventCheckCommandState *ecs = static_cast(e);
    +        CommandDef *cmd = ecs->cmd();
    +        if (cmd->id == CmdOnTop){
    +            getState();
    +            cmd->flags &= ~COMMAND_CHECKED;
    +            if (value("OnTop").toBool())
    +                cmd->flags |= COMMAND_CHECKED;
    +            return true;
    +        }
    +    }
    +#ifdef WIN32
    +    if (e->type() == eEventOnTop){
    +        EventOnTop *eot = static_cast(e);
    +        QWidget *main = getMainWindow();
    +        if (main == NULL)
    +            return false;
    +        HWND hState = HWND_NOTOPMOST;
    +        if (value("OnTop").toBool())
    +            hState = HWND_TOPMOST;
    +        if (eot->showOnTop())
    +            hState = HWND_BOTTOM;
    +        if (m_state != hState)
    +        {
    +            SetWindowPos(main->winId(), hState, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
    +            m_state = hState;
    +        }
    +    } else
    +    if (e->type() == eEventInTaskManager){
    +        EventInTaskManager *eitm = static_cast(e);
    +        QWidget *main = getMainWindow();
    +        if (main == NULL)
    +            return false;
    +        if (IsWindowUnicode(main->winId())){
    +            if (eitm->showInTaskmanager() && value("InTask").toBool()){
    +                SetWindowLongW(main->winId(), GWL_EXSTYLE,
    +                               (GetWindowLongW(main->winId(), GWL_EXSTYLE) | WS_EX_APPWINDOW) & (~WS_EX_TOOLWINDOW));
    +            }else{
    +                DWORD exStyle = GetWindowLongW(main->winId(), GWL_EXSTYLE);
    +                if ((exStyle & WS_EX_TOOLWINDOW) == 0){
    +                    SetWindowLongW(main->winId(), GWL_EXSTYLE, (exStyle  & ~WS_EX_APPWINDOW) | WS_EX_TOOLWINDOW);
    +                    QPoint p = main->pos();
    +                    QSize s = main->size();
    +                    main->resize(s.width() + 1, s.height());
    +                    main->resize(s.width(), s.height());
    +                    main->move(p);
    +                }
    +            }
    +        }else{
    +            if (eitm->showInTaskmanager() && value("InTask").toBool()){
    +                SetWindowLongA(main->winId(), GWL_EXSTYLE,
    +                               (GetWindowLongA(main->winId(), GWL_EXSTYLE) | WS_EX_APPWINDOW) & (~WS_EX_TOOLWINDOW));
    +            }else{
    +                DWORD exStyle = GetWindowLongA(main->winId(), GWL_EXSTYLE);
    +                if ((exStyle & WS_EX_TOOLWINDOW) == 0){
    +                    SetWindowLongA(main->winId(), GWL_EXSTYLE, (exStyle  & ~WS_EX_APPWINDOW) | WS_EX_TOOLWINDOW);
    +                    QSize s = main->size();
    +                    main->resize(s.width() + 1, s.height());
    +                    main->resize(s.width(), s.height());
    +                }
    +            }
    +        }
    +        return true;
    +    }
    +#endif
    +    return false;
    +}
    +
    +QByteArray OnTopPlugin::getConfig()
    +{
    +    getState();
    +    return QByteArray();
    +}
    +
    +QWidget *OnTopPlugin::getMainWindow()
    +{
    +    CorePlugin *core = GET_CorePlugin();
    +    return core->getMainWindow();
    +}
    +
    +void OnTopPlugin::getState()
    +{
    +#ifdef USE_KDE
    +    QWidget *main = getMainWindow();
    +    if (main == NULL) return;
    +#if KDE_IS_VERSION(3,2,0)
    +    setOnTop(KWin::windowInfo(main->winId()).state() & NET::StaysOnTop);
    +#else
    +    setOnTop(KWin::info(main->winId()).state & NET::StaysOnTop);
    +#endif
    +#endif
    +}
    +
    +void OnTopPlugin::setState()
    +{
    +    QWidget *main = getMainWindow();
    +    if (main){
    +#ifdef WIN32
    +        EventOnTop(false).process();
    +        EventInTaskManager(value("InTask").toBool()).process();
    +#else
    +#ifdef USE_KDE
    +        if (getOnTop()){
    +            KWin::setState(main->winId(), NET::StaysOnTop);
    +        }else{
    +            KWin::clearState(main->winId(), NET::StaysOnTop);
    +        }
    +        if (getInTask()){
    +            KWin::clearState(main->winId(), NET::SkipTaskbar);
    +        }else{
    +            KWin::setState(main->winId(), NET::SkipTaskbar);
    +        }
    +#endif
    +#endif
    +    }
    +    QWidgetList list = QApplication::topLevelWidgets();
    +    QWidget *w;
    +    foreach(w,list)
    +	{
    +			if (w->inherits("Container")){
    +#ifdef WIN32
    +				HWND hState = HWND_NOTOPMOST;
    +                                if (value("ContainerOnTop").toBool()) hState = HWND_TOPMOST;
    +				SetWindowPos(w->winId(), hState, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    +#else
    +#ifdef USE_KDE
    +				if (getContainerOnTop())
    +				{
    +					KWin::setState(w->winId(), NET::StaysOnTop);
    +				}
    +				else
    +				{
    +					KWin::clearState(w->winId(), NET::StaysOnTop);
    +				}
    +#endif
    +#endif
    +			}
    +		}
    +	}
    +
    +#if defined(USE_KDE) || defined(WIN32)
    +QWidget *OnTopPlugin::createConfigWindow(QWidget *parent)
    +{
    +    return new OnTopCfg(parent, this);
    +}
    +#endif
    +
    +bool OnTopPlugin::eventFilter(QObject *o, QEvent *e)
    +{
    +#ifdef WIN32
    +    if ((e->type() == QEvent::WindowActivate) &&
    +            (value("OnTop").toBool() || value("ContainerOnTop").toBool() ) &&
    +            o->inherits("QDialog")){
    +        QWidget *w = static_cast(o);
    +        SetWindowPos(w->winId(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    +    }
    +    if ((e->type() == QEvent::WindowDeactivate) &&
    +            (value("OnTop").toBool() || value("ContainerOnTop").toBool()) &&
    +            o->inherits("QDialog")){
    +        QWidget *w = static_cast(o);
    +        SetWindowPos(w->winId(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    +    }
    +    if ((e->type() == QEvent::Show) &&
    +            value("ContainerOnTop").toBool() &&
    +            o->inherits("Container")){
    +        QWidget *w = static_cast(o);
    +        SetWindowPos(w->winId(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    +    }
    +#endif
    +#ifdef USE_KDE
    +    if ((e->type() == QEvent::WindowActivate) &&
    +            (value("OnTop").toBool() || value("ContainerOnTop").toBool()) &&
    +            o->inherits("QDialog")){
    +        QWidget *w = static_cast(o);
    +        KWin::setState(w->winId(), NET::StaysOnTop);
    +    }
    +    if ((e->type() == QEvent::WindowDeactivate) &&
    +            (value("OnTop").toBool() || value("ContainerOnTop").toBool()) &&
    +            o->inherits("QDialog")){
    +        QWidget *w = static_cast(o);
    +        KWin::clearState(w->winId(), NET::StaysOnTop);
    +    }
    +    if ((e->type() == QEvent::Show) &&
    +            value("ContainerOnTop").toBool() &&
    +            o->inherits("Container")){
    +        QWidget *w = static_cast(o);
    +        KWin::setState(w->winId(), NET::StaysOnTop);
    +    }
    +#endif
    +    return QObject::eventFilter(o, e);
    +}
    +
    +void OnTopPlugin::setPropertyHub(SIM::PropertyHubPtr hub)
    +{
    +	m_propertyHub = hub;
    +}
    +
    +SIM::PropertyHubPtr OnTopPlugin::propertyHub()
    +{
    +	return m_propertyHub;
    +}
    +
    +QVariant OnTopPlugin::value(const QString& key)
    +{
    +	return m_propertyHub->value(key);
    +}
    +
    +void OnTopPlugin::setValue(const QString& key, const QVariant& v)
    +{
    +	m_propertyHub->setValue(key, v);
    +}
    +
    diff --git a/plugins/ontop/ontop.h b/plugins/ontop/ontop.h
    new file mode 100644
    index 0000000..5e2b290
    --- /dev/null
    +++ b/plugins/ontop/ontop.h
    @@ -0,0 +1,101 @@
    +/***************************************************************************
    +                          ontop.h  -  description
    +                             -------------------
    +    begin                : Sun Mar 17 2002
    +    copyright            : (C) 2002 by Vladimir Shutoff
    +    email                : vovan@shutoff.ru
    + ***************************************************************************/
    +
    +/***************************************************************************
    + *                                                                         *
    + *   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.                                   *
    + *                                                                         *
    + ***************************************************************************/
    +
    +#ifndef _ONTOP_H
    +#define _ONTOP_H
    +
    +#ifdef WIN32
    +#include 
    +#endif
    +
    +#include 
    +#include 
    +#include 
    +
    +#include "cfg.h"
    +#include "event.h"
    +#include "plugins.h"
    +#include "propertyhub.h"
    +
    +class EventInTaskManager : public SIM::Event
    +{
    +public:
    +    EventInTaskManager(bool bShowInTask)
    +        : Event(SIM::eEventInTaskManager), m_bShowInTask(bShowInTask) {}
    +
    +    bool showInTaskmanager() const { return m_bShowInTask; }
    +protected:
    +    bool m_bShowInTask;
    +};
    +
    +class EventOnTop : public SIM::Event
    +{
    +public:
    +    // bShowOnTop is maybe wrong, rename if someone knows what it means
    +    EventOnTop(bool bShowOnTop)
    +        : Event(SIM::eEventOnTop), m_bShowOnTop(bShowOnTop) {}
    +
    +    bool showOnTop() const { return m_bShowOnTop; }
    +protected:
    +    bool m_bShowOnTop;
    +};
    +
    +struct OnTopData
    +{
    +//    SIM::Data	OnTop;
    +//    SIM::Data	InTask;
    +//    SIM::Data	ContainerOnTop;
    +};
    +
    +class OnTopPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver
    +{
    +    Q_OBJECT
    +public:
    +    OnTopPlugin(unsigned, Buffer*);
    +    virtual ~OnTopPlugin();
    +
    +    void setPropertyHub(SIM::PropertyHubPtr hub);
    +    SIM::PropertyHubPtr propertyHub();
    +    QVariant value(const QString& key);
    +    void setValue(const QString& key, const QVariant& v);
    +
    +protected:
    +    virtual bool eventFilter(QObject*, QEvent*);
    +    virtual bool processEvent(SIM::Event *e);
    +#if defined(USE_KDE) || defined(WIN32)
    +    virtual QWidget *createConfigWindow(QWidget *parent);
    +#endif
    +    virtual QByteArray getConfig();
    +    void getState();
    +    void setState();
    +    QWidget *getMainWindow();
    +    unsigned CmdOnTop;
    +//    PROP_BOOL(OnTop);
    +//    PROP_BOOL(InTask);
    +//    PROP_BOOL(ContainerOnTop);
    +//    OnTopData data;
    +#ifdef WIN32
    +    HWND m_state;
    +#endif
    +    friend class OnTopCfg;
    +
    +private:
    +    SIM::PropertyHubPtr m_propertyHub;
    +};
    +
    +#endif
    +
    diff --git a/plugins/ontop/ontop.rc b/plugins/ontop/ontop.rc
    new file mode 100644
    index 0000000..f959ba1
    --- /dev/null
    +++ b/plugins/ontop/ontop.rc
    @@ -0,0 +1,97 @@
    +//Microsoft Developer Studio generated resource script.
    +//
    +#include "resource.h"
    +/////////////////////////////////////////////////////////////////////////////
    +// Neutral resources
    +
    +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)
    +#ifdef _WIN32
    +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
    +#pragma code_page(1251)
    +#endif //_WIN32
    +
    +#ifdef APSTUDIO_INVOKED
    +/////////////////////////////////////////////////////////////////////////////
    +//
    +// TEXTINCLUDE
    +//
    +
    +1 TEXTINCLUDE DISCARDABLE
    +BEGIN
    +    "resource.h\0"
    +END
    +
    +2 TEXTINCLUDE DISCARDABLE
    +BEGIN
    +    "\0"
    +END
    +
    +3 TEXTINCLUDE DISCARDABLE
    +BEGIN
    +    "\r\n"
    +    "\0"
    +END
    +
    +#endif    // APSTUDIO_INVOKED
    +
    +
    +#ifndef _MAC
    +/////////////////////////////////////////////////////////////////////////////
    +//
    +// Version
    +//
    +
    +VS_VERSION_INFO VERSIONINFO
    + FILEVERSION 0,9,6,0
    + PRODUCTVERSION 0,9,6,0
    + FILEFLAGSMASK 0x3fL
    +#ifdef _DEBUG
    + FILEFLAGS 0x1L
    +#else
    + FILEFLAGS 0x0L
    +#endif
    + FILEOS 0x40004L
    + FILETYPE 0x2L
    + FILESUBTYPE 0x0L
    +BEGIN
    +    BLOCK "StringFileInfo"
    +    BEGIN
    +        BLOCK "000004b0"
    +        BEGIN
    +            VALUE "Comments", "\0"
    +            VALUE "CompanyName", "Vladimir Shutoff\0"
    +            VALUE "FileDescription", "OnTop plugin\0"
    +            VALUE "FileVersion", "0, 9, 6, 0\0"
    +            VALUE "InternalName", "ontop\0"
    +            VALUE "LegalCopyright", "Copyright © 2002-2003\0"
    +            VALUE "LegalTrademarks", "\0"
    +            VALUE "OriginalFilename", "ontop.dll\0"
    +            VALUE "PrivateBuild", "\0"
    +            VALUE "ProductName", "SIM\0"
    +            VALUE "ProductVersion", "0, 9, 6, 0\0"
    +            VALUE "SpecialBuild", "\0"
    +        END
    +    END
    +    BLOCK "VarFileInfo"
    +    BEGIN
    +        VALUE "Translation", 0x0, 1200
    +    END
    +END
    +
    +#endif    // !_MAC
    +
    +#endif    // Neutral resources
    +/////////////////////////////////////////////////////////////////////////////
    +
    +
    +
    +#ifndef APSTUDIO_INVOKED
    +/////////////////////////////////////////////////////////////////////////////
    +//
    +// Generated from the TEXTINCLUDE 3 resource.
    +//
    +
    +
    +/////////////////////////////////////////////////////////////////////////////
    +#endif    // not APSTUDIO_INVOKED
    +
    diff --git a/plugins/ontop/ontop.vcproj b/plugins/ontop/ontop.vcproj
    new file mode 100644
    index 0000000..84eefb2
    --- /dev/null
    +++ b/plugins/ontop/ontop.vcproj
    @@ -0,0 +1,406 @@
    +
    +
    +	
    +		
    +	
    +	
    +		
    +	
    +	
    +		
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +		
    +		
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
    +		
    +	
    +	
    +	
    +	
    +		
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +		
    +		
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +		
    +		
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +		
    +		
    +			
    +				
    +					
    +				
    +				
    +					
    +				
    +			
    +		
    +	
    +	
    +	
    +
    diff --git a/plugins/ontop/ontopcfg.cpp b/plugins/ontop/ontopcfg.cpp
    new file mode 100644
    index 0000000..ef5d6f0
    --- /dev/null
    +++ b/plugins/ontop/ontopcfg.cpp
    @@ -0,0 +1,37 @@
    +/***************************************************************************
    +                          ontopcfg.cpp  -  description
    +                             -------------------
    +    begin                : Sun Mar 17 2002
    +    copyright            : (C) 2002 by Vladimir Shutoff
    +    email                : vovan@shutoff.ru
    + ***************************************************************************/
    +
    +/***************************************************************************
    + *                                                                         *
    + *   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.                                   *
    + *                                                                         *
    + ***************************************************************************/
    +
    +#include "ontopcfg.h"
    +#include "ontop.h"
    +
    +#include 
    +
    +OnTopCfg::OnTopCfg(QWidget *parent, OnTopPlugin *plugin) : QWidget(parent)
    +{
    +	setupUi(this);
    +    m_plugin = plugin;
    +    chkInTask->setChecked(m_plugin->value("InTask").toBool());
    +    chkContainer->setChecked(m_plugin->value("ContainerOnTop").toBool());
    +}
    +
    +void OnTopCfg::apply()
    +{
    +    m_plugin->setValue("InTask", chkInTask->isChecked());
    +    m_plugin->setValue("ContainerOnTop", chkContainer->isChecked());
    +    m_plugin->setState();
    +}
    +
    diff --git a/plugins/ontop/ontopcfg.h b/plugins/ontop/ontopcfg.h
    new file mode 100644
    index 0000000..f4bd611
    --- /dev/null
    +++ b/plugins/ontop/ontopcfg.h
    @@ -0,0 +1,37 @@
    +/***************************************************************************
    +                          ontopcfg.h  -  description
    +                             -------------------
    +    begin                : Sun Mar 17 2002
    +    copyright            : (C) 2002 by Vladimir Shutoff
    +    email                : vovan@shutoff.ru
    + ***************************************************************************/
    +
    +/***************************************************************************
    + *                                                                         *
    + *   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.                                   *
    + *                                                                         *
    + ***************************************************************************/
    +
    +#ifndef _ONTOPCFG_H
    +#define _ONTOPCFG_H
    +
    +#include "ui_ontopcfgbase.h"
    +
    +class OnTopPlugin;
    +
    +class OnTopCfg : public QWidget, public Ui::OnTopCfgBase
    +{
    +    Q_OBJECT
    +public:
    +    OnTopCfg(QWidget *w, OnTopPlugin *plugin);
    +public slots:
    +    void apply();
    +protected:
    +    OnTopPlugin *m_plugin;
    +};
    +
    +#endif
    +
    diff --git a/plugins/ontop/ontopcfgbase.ui b/plugins/ontop/ontopcfgbase.ui
    new file mode 100644
    index 0000000..422dabe
    --- /dev/null
    +++ b/plugins/ontop/ontopcfgbase.ui
    @@ -0,0 +1,82 @@
    +
    +  
    +  
    +  
    +  OnTopCfgBase
    +  
    +    
    +      
    +        0
    +        0
    +        320
    +        140
    +      
    +    
    +    
    +      Form1
    +    
    +    
    +      
    +        11
    +      
    +      
    +        6
    +      
    +      
    +        
    +          
    +            Show &main window in task manager
    +          
    +        
    +      
    +      
    +        
    +          
    +            &Container always on top
    +          
    +        
    +      
    +      
    +        
    +          
    +            
    +              20
    +              20
    +            
    +          
    +          
    +            QSizePolicy::Expanding
    +          
    +          
    +            Qt::Vertical
    +          
    +        
    +      
    +    
    +  
    +  
    +    
    +      QWidget
    +      QWidget
    +      
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    +
    + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + +
    diff --git a/plugins/osd/CMakeLists.txt b/plugins/osd/CMakeLists.txt new file mode 100644 index 0000000..bf553e8 --- /dev/null +++ b/plugins/osd/CMakeLists.txt @@ -0,0 +1,24 @@ +############### +# osd library # +############### +SET(osd_SRCS + osd.cpp + osdconfig.cpp + osdiface.cpp +) + +SET(osd_HDRS + osd.h + osdconfig.h + osdiface.h +) + +SET(osd_UICS + osdconfigbase.ui + osdifacebase.ui +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(osd) diff --git a/plugins/osd/osd.cpp b/plugins/osd/osd.cpp new file mode 100644 index 0000000..b70dab4 --- /dev/null +++ b/plugins/osd/osd.cpp @@ -0,0 +1,847 @@ +/************************************************************************** + osd.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + *************************************************************************** + + Check screen saver state from xscreensaver-command, Copyright (c) 1991-1998 + by Jamie Zawinski + + Set the LEDS Methods are taken from setleds. + CapsLED-Notification, Copyright (c) 2007 by Tobias Franz + +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "simgui/fontedit.h" +#include "contacts/contact.h" + +#include "core.h" + +#include "log.h" +#include "icons.h" + + +#include "osd.h" +#include "osdconfig.h" + +#ifdef WIN32 + #include +#else // assume POSIX + #include +#endif + + +#ifndef Q_WS_WIN + /*#include + #include + #include + #include + #include + #include + + #include "local.h" + #include "utils.h" + #define KD "/dev/console" */ + + #if !defined(Q_OS_MAC) && !defined(__OS2__) + #include + #include + #include + #endif +#endif + +using namespace std; +using namespace SIM; + +const unsigned SHADOW_DEF = 1; +const unsigned XOSD_MARGIN = 5; +static const int cTCD = 5; +static const int cFadeTime = 10; + + + +Plugin *createOSDPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new OSDPlugin(base); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("OSD"), + I18N_NOOP("Plugin provides on screen notification about messages and contacts status"), + VERSION, + createOSDPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +static OSDPlugin *osdPlugin = NULL; + +static QWidget *getOSDSetup(QWidget *parent, SIM::PropertyHubPtr data) +{ + return new OSDConfig(parent, data, osdPlugin); +} + +OSDPlugin::OSDPlugin(unsigned base) + : Plugin(base) + , m_osd(NULL) + , bCapsState(false) + , bHaveUnreadMessages(false) + , bTimerActive(false) +{ + osdPlugin = this; + + Command cmd; + cmd->id = 0; + cmd->text = I18N_NOOP("&OSD"); + cmd->icon = "alert"; + cmd->param = (void*)getOSDSetup; + cmd->accel = "OSD"; + EventAddPreferences(cmd).process(); + + m_request.contact = 0; + m_request.type = OSD_NONE; + + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); +} + +OSDPlugin::~OSDPlugin() +{ + delete m_osd; + osdPlugin = NULL; + EventRemovePreferences(user_data_id).process(); + getContacts()->unregisterUserData(user_data_id); +} + +QWidget *OSDPlugin::createConfigWindow(QWidget *parent) +{ + return new OSDConfig(parent, getContacts()->getUserData("OSD"), this); +} + +void OSDPlugin::timeout() +{ + m_osd->hide(); + m_timer->stop(); bTimerActive=false; //Due to a fucking bug in QTimer::isActive() + processQueue(); +} + +QFont OSDPlugin::getBaseFont(QFont font) +{ + QFont baseFont; + + baseFont = font; + int size = baseFont.pixelSize(); + if (size <= 0) + { + size = baseFont.pointSize(); + baseFont.setPointSize(size * 2); + } + else + { + baseFont.setPixelSize(size * 2); + } + baseFont.setBold(true); + + return baseFont; +} + +OSDWidget::OSDWidget(OSDPlugin *plugin) + : QLabel(NULL, Qt::Tool | + Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint ) +{ + m_plugin = plugin; + baseFont = m_plugin->getBaseFont(font()); + setFocusPolicy(Qt::NoFocus); + setAttribute(Qt::WA_TranslucentBackground, true); + setAttribute(Qt::WA_NoSystemBackground, true); + setAttribute(Qt::WA_OpaquePaintEvent, true); + setAttribute(Qt::WA_MacAlwaysShowToolWindow, true); + setAutoFillBackground(false); + connect(&m_transTimer, SIGNAL(timeout()), this, SLOT(slotTimerFadeInTimeout())); + QPalette pal = palette(); + pal.setColor(QPalette::Background,Qt::transparent); + setPalette(pal); +} + +bool OSDWidget::isScreenSaverActive() +{ +#if defined( Q_WS_WIN ) && defined( SPI_GETSCREENSAVERRUNNING ) + BOOL pvParam; + if (SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &pvParam, 0)){ + if (pvParam) + return true; + } +#endif + return false; +} + +static const char * const close_h_xpm[] = { + "8 8 3 1", + " c None", + ". c #000000", + "+ c none", + ".++++++.", + "+.++++.+", + "++.++.++", + "+++..+++", + "+++..+++", + "++.++.++", + "+.++++.+", + ".++++++."}; + +void OSDWidget::showOSD(const QString &str, SIM::PropertyHubPtr data) +{ + currentData = data; + m_bFading = data->value("Fading").toBool(); + m_sText = str; + if (isScreenSaverActive()) + { + hide(); + return; + } + m_text_y = 0; + m_bBackground = data->value("Background").toBool(); + m_bShadow = data->value("Shadow").toBool(); + + setFont(FontEdit::str2font(data->value("Font").toString(), baseFont)); + + //int SHADOW_OFFS = SHADOW_DEF; + + recalcGeometry(); + resize(m_Rect.size()); + + QImage image(size(),QImage::Format_ARGB32); + image.fill(Qt::transparent); + + QPainter p(&image); + p.setRenderHints(QPainter::HighQualityAntialiasing|QPainter::TextAntialiasing|QPainter::Antialiasing); + draw(p); + p.end(); + setPixmap(QPixmap::fromImage(image)); + if (m_bFading) + setMask(QPixmap::fromImage(image.createAlphaMask(), Qt::MonoOnly)); + + transCounter = 0; + transCounterDelta = cTCD; + setWindowOpacity(transCounter/100.); + + QLabel::show(); + raise(); + + if (m_bFading) + m_transTimer.start(cFadeTime); + +} + +QRect OSDWidget::recalcGeometry() +{ + int SHADOW_OFFS = SHADOW_DEF; + unsigned nScreen = currentData->value("Screen").toUInt(); + unsigned nScreens = screens(); + if (nScreen >= nScreens) + nScreen = 0; + QRect rcScreen = screenGeometry(nScreen); + rcScreen = QRect(0, 0, + rcScreen.width() - SHADOW_OFFS - XOSD_MARGIN * 2 - currentData->value("Offset").toUInt(), + rcScreen.height() - SHADOW_OFFS - XOSD_MARGIN * 2 - currentData->value("Offset").toUInt()); + QFontMetrics fm(font()); + QRect rc = fm.boundingRect(rcScreen, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, m_sText); + if (rc.height() >= rcScreen.height() / 2){ + rcScreen = QRect(0, 0, + rcScreen.width() - SHADOW_OFFS - XOSD_MARGIN * 2 - currentData->value("Offset").toUInt(), + rcScreen.height() - SHADOW_OFFS - XOSD_MARGIN * 2 - currentData->value("Offset").toUInt()); + rc = fm.boundingRect(rcScreen, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, m_sText); + } + if (currentData->value("EnableMessageShowContent").toBool() && currentData->value("ContentLines").toUInt()) + { + QFontMetrics fm(font()); + int maxHeight = fm.height() * (currentData->value("ContentLines").toUInt() + 1); + if (rc.height() > maxHeight) + rc.setHeight(maxHeight); + } + int x = rcScreen.left(); + int y = rcScreen.top(); + int w = rc.width() + 1; + int h = rc.height() + 1; + m_text_y = 0; + if (m_bBackground) + { + w += XOSD_MARGIN * 2; + h += XOSD_MARGIN * 2; + if (m_imageButton.isNull()) + { + m_imageButton = Image("button_cancel"); + if( m_imageButton.isNull() ) + m_imageButton = QPixmap((const char **)close_h_xpm).toImage(); + } + m_rectButton = QRect(QPoint(w - m_imageButton.width() - 3, 3),m_imageButton.size()); + m_text_y = m_imageButton.height() + 4; + h += m_text_y; + } + if (m_bShadow) + { + w += SHADOW_OFFS; + h += SHADOW_OFFS; + } + switch (currentData->value("Position").toUInt()){ + case 1: + move(x + currentData->value("Offset").toUInt(), y + currentData->value("Offset").toUInt()); + break; + case 2: + move(x + rcScreen.width() - currentData->value("Offset").toUInt() - w, y + rcScreen.height() - currentData->value("Offset").toUInt() - h); + break; + case 3: + move(x + rcScreen.width() - currentData->value("Offset").toUInt() - w, y + currentData->value("Offset").toUInt()); + break; + case 4: + move(x + (rcScreen.width() - w) / 2, y + rcScreen.height() - currentData->value("Offset").toUInt() - h); + break; + case 5: + move(x + (rcScreen.width() - w) / 2, y + currentData->value("Offset").toUInt()); + break; + case 6: + move(x + (rcScreen.width() - w) / 2, y + (rcScreen.height() - h) /2); + break; + default: + move(x + currentData->value("Offset").toUInt(), y + rcScreen.height() - currentData->value("Offset").toUInt() - h); + } + + m_Rect = QRect(x,y,w,h); + return m_Rect; +} + +QSize OSDWidget::sizeHint() const +{ + return m_Rect.size(); +} + +void OSDWidget::slotTimerFadeInTimeout() +{ + transCounter += transCounterDelta; + if (transCounter>100) + { + transCounter = 100; + m_transTimer.stop(); + } + else if (transCounter<=0) + { + transCounter = 0; + m_transTimer.stop(); + QLabel::hide(); + } + setWindowOpacity(transCounter/100.); + update(); +} + +void OSDWidget::draw(QPainter &p) +{ + QSize s = size(); + int w = s.width(); + int h = s.height(); + QRect rc(0, 0, w, h); + + if (m_bBackground) + { + if (m_bShadow) + { + w -= SHADOW_DEF; + h -= SHADOW_DEF; + rc = QRect(0, 0, w, h); + } + p.setPen(QPen(QColor(0x00,0x00,0x00))); + p.setBrush(QBrush(currentData->value("BgColor").toUInt())); + p.drawRoundedRect(rc,7,7); + p.drawImage(m_rectButton,m_imageButton); + rc = QRect(XOSD_MARGIN, XOSD_MARGIN, w - XOSD_MARGIN * 2, h - XOSD_MARGIN * 2); + } + + rc.translate(0,m_text_y); + p.setFont(font()); + + if( m_bShadow ) + { + p.setPen(Qt::darkGray); + QRect src(rc); + src.translate(SHADOW_DEF,SHADOW_DEF); + p.drawText(src, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, m_sText); + } + + p.setPen(currentData->value("Color").toUInt()); + p.drawText(rc, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, m_sText); +} + +void OSDWidget::mouseDoubleClickEvent(QMouseEvent*) +{ + emit dblClick(); + close(); +} + +void OSDWidget::mousePressEvent(QMouseEvent *event) +{ + if(m_rectButton.contains(event->pos())) + emit closeClick(); +} + +void OSDWidget::slotCloseClick() +{ + emit closeClick(); +} + +void OSDWidget::hide() +{ + if( m_bFading ) + { + transCounter = 100; + transCounterDelta = -cTCD; + m_transTimer.start(cFadeTime); + } + else + QLabel::hide(); +} + +#if 0 +i18n("male", "%1 is online") +i18n("female", "%1 is online") +i18n("male", "%1 is away") +i18n("female", "%1 is away") +i18n("male", "%1 is not available") +i18n("female", "%1 is not available") +i18n("male", "%1 doesn't want to be disturbed") +i18n("female", "%1 doesn't want to be disturbed") +i18n("male", "%1 is occupied") +i18n("female", "%1 is occupied") +i18n("male", "%1 is free for chat") +i18n("female", "%1 is free for chat") +i18n("male", "%1 is offline") +i18n("female", "%1 is offline") +i18n("male", "%1 is typing") +i18n("female", "%1 is typing") +#endif + +typedef map TYPE_MAP; + +void OSDPlugin::processQueue() +{ + if (bTimerActive /*m_timer->isActive()*/) //Due to a fucking bug in QTimer::isActive() + return; + while (m_queue.size()){ + m_request = m_queue.takeFirst(); + Contact *contact = getContacts()->contact(m_request.contact); + if ((contact == NULL) || contact->getIgnore()) + continue; + QString text; + SIM::PropertyHubPtr data = contact->getUserData("OSD"); + uint ms = STATUS_ONLINE; + switch (m_request.type){ + case OSD_ALERTONLINE: + if (data->value("EnableAlert").toBool() && data->value("EnableAlertOnline").toBool()){ + unsigned style = 0; + QString statusIcon; + if (contact->contactInfo(style, statusIcon) == STATUS_ONLINE) + text = g_i18n("%1 is online", contact) .arg(contact->getName()); + } + break; + case OSD_ALERTAWAY: + if (data->value("EnableAlert").toBool() && data->value("EnableAlertAway").toBool()){ + text = g_i18n("%1 is away", contact) .arg(contact->getName()); + } + break; + case OSD_ALERTNA: + if (data->value("EnableAlert").toBool() && data->value("EnableAlertNA").toBool()){ + text = g_i18n("%1 is not available", contact) .arg(contact->getName()); + } + break; + case OSD_ALERTDND: + if (data->value("EnableAlert").toBool() && data->value("EnableAlertDND").toBool()){ + text = g_i18n("%1 doesn't want to be disturbed", contact) .arg(contact->getName()); + } + break; + case OSD_ALERTOCCUPIED: + if (data->value("EnableAlert").toBool() && data->value("EnableAlertOccupied").toBool()){ + text = g_i18n("%1 is occupied", contact) .arg(contact->getName()); + } + break; + case OSD_ALERTFFC: + if (data->value("EnableAlert").toBool() && data->value("EnableAlertFFC").toBool()){ + text = g_i18n("%1 is free for chat", contact) .arg(contact->getName()); + } + break; + case OSD_ALERTOFFLINE: + if (data->value("EnableAlert").toBool() && data->value("EnableAlertOffline").toBool() && (ms-1) ){ + text = g_i18n("%1 is offline", contact) .arg(contact->getName()); + } + break; + case OSD_TYPING: + if (data->value("EnableTyping").toBool()){ + unsigned style = 0; + QSet wrkIcons; + QString statusIcon; + contact->contactInfo(style, statusIcon, &wrkIcons); + if (wrkIcons.contains("typing")) + text = g_i18n("%1 is typing", contact) .arg(contact->getName()); + } + break; + case OSD_MESSAGE: +/* if (data->EnableMessage.toBool() && core ){ + * list::iterator it; + * TYPE_MAP types; + * TYPE_MAP::iterator itc; + * QString msg_text; + * for (it = core->unread.begin(); it != core->unread.end(); ++it){ + * if (it->contact != m_request.contact) + * continue; + * unsigned type = it->type; + * itc = types.find(type); + * if (itc == types.end()){ + * types.insert(TYPE_MAP::value_type(type, 1)); + * }else{ + * (*itc).second++; + * } + * if (!data->EnableMessageShowContent.toBool()) + * continue; + * EventLoadMessage e(it->id, it->client, it->contact); + * e.process(); + * Message *msg = e.message(); + * if (msg == NULL) + * continue; + * QString msgText = msg->getPlainText().trimmed(); + * if (msgText.isEmpty()) + * continue; + * if (!msg_text.isEmpty()) + * msg_text += "\n"; + * msg_text += msgText; + * } + * if (types.empty()) + * break; + * for (itc = types.begin(); itc != types.end(); ++itc){ + * CommandDef *def = core->messageTypes.find((*itc).first); + * if (def == NULL) + * continue; + * MessageDef *mdef = (MessageDef*)(def->param); + * QString msg = i18n(mdef->singular, mdef->plural, (*itc).second); + * if ((*itc).second == 1){ + * int pos = msg.indexOf("1 "); + * if (pos > 0){ + * msg = msg.left(pos); + * }else if (pos == 0){ + * msg = msg.mid(2); + * } + * msg = msg.left(1).toUpper() + msg.mid(1); + * } + * if (!text.isEmpty()) + * text += ", "; + * text += msg; + * } + * + * + * if ( core->getManualStatus()==STATUS_NA && + * data->EnableCapsLockFlash.toBool() && + * ! this->isRunning() + * ) + * this->start(); //Start flashing the CapsLock if enabled + * text = i18n("%1 from %2") .arg(text) .arg(contact->getName()); + * if (msg_text.isEmpty()) + * break; + * text += ":\n"; + * text += msg_text; + * } + */ + break; + default: + break; + } + if (!text.isEmpty()){ + if (m_osd == NULL){ + m_osd = new OSDWidget(this); + connect(m_osd, SIGNAL(dblClick()), this, SLOT(dblClick())); + connect(m_osd, SIGNAL(closeClick()), this, SLOT(closeClick())); + } + static_cast(m_osd)->showOSD(text, data); + m_timer->start(data->value("Timeout").toUInt() * 1000); + bTimerActive=true; //Due to a fucking bug in QTimer::isActive() + return; + } + } + m_timer->stop(); bTimerActive=false; //Due to a fucking bug in QTimer::isActive() + m_request.contact = 0; + m_request.type = OSD_NONE; +} + +void OSDPlugin::run(){ + while ( bHaveUnreadMessages ) { + flashCapsLockLED(!bCapsState); + +#ifdef WIN32 + // milliseconds + Sleep(200); +#else + // microseconds + usleep(200*1000); +#endif + } + if (bCapsState) flashCapsLockLED(!bCapsState); //switch LED off +} + +void OSDPlugin::flashCapsLockLED(bool bCapsState){ + +#ifdef WIN32 + BYTE keyState[256]; + + GetKeyboardState((LPBYTE)&keyState); + if( ( !(keyState[VK_CAPITAL] & 1))) + //|| + //(!bCapsState && (keyState[VK_CAPITAL] & 1)) ) + + // Simulate a key press + keybd_event( VK_CAPITAL, + 0x45, + KEYEVENTF_EXTENDEDKEY | 0, + 0 ); + + // Simulate a key release + keybd_event( VK_CAPITAL, + 0x45, + KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, + 0); + +#elif defined(__OS2__) + // TODO: add OS/2 code to switch leds +#else + if (bCapsState) + system("xset led 3"); + else + system("xset -led 3"); +#endif + this->bCapsState= bCapsState; +} + +void OSDPlugin::closeClick() +{ +/* if (m_request.type == OSD_MESSAGE){ + * for (list::iterator it = core->unread.begin(); it != core->unread.end(); ){ + * if (it->contact != m_request.contact){ + * ++it; + * continue; + * } + * EventLoadMessage e(it->id, it->client, it->contact); + * e.process(); + * Message *msg = e.message(); + * core->unread.erase(it); + * if (msg){ + * EventMessageRead(msg).process(); + * delete msg; + * } + * it = core->unread.begin(); + * } + * } + * timeout(); + */ +} + +void OSDPlugin::dblClick() +{ + EventDefaultAction(m_request.contact).process(); + m_timer->stop(); bTimerActive=false; + m_timer->start(100); bTimerActive=true; +} + +bool OSDPlugin::processEvent(Event *e) +{ + OSDRequest osd; + switch (e->type()){ + case eEventContact: { + EventContact *ec = static_cast(e); + Contact *contact = ec->contact(); + if (contact->getIgnore()) + break; + switch(ec->action()) { + case EventContact::eOnline: { + osd.contact = contact->id(); + osd.type = OSD_ALERTONLINE; + m_queue.push_back(osd); + processQueue(); + break; + } + case EventContact::eStatus: + { + SIM::PropertyHubPtr data = contact->getUserData("OSD"); + if(!data.isNull()) { + unsigned style = 0; + QSet wrkIcons; + QString statusIcon; + contact->contactInfo(style, statusIcon, &wrkIcons); + if (wrkIcons.contains("typing")){ + if (!m_typing.contains(contact->id())) { + m_typing += contact->id(); + osd.contact = contact->id(); + osd.type = OSD_TYPING; + m_queue.push_back(osd); + processQueue(); + } + }else{ + m_typing.remove(contact->id()); + if ((m_request.type == OSD_TYPING) && (m_request.contact == contact->id())){ + m_timer->stop(); bTimerActive=false; + m_timer->start(100); bTimerActive=true; + } + } + } + break; + } + default: + break; + } + break; + } + case eEventMessageReceived: + { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + Contact *contact = getContacts()->contact(msg->contact()); + if (contact == NULL) + break; + SIM::PropertyHubPtr data = contact->getUserData("OSD"); + if(data.isNull()) + break; + osd.contact = msg->contact(); + CorePlugin* core = GET_CorePlugin(); + if (!core->unread.empty()) + bHaveUnreadMessages=true; + if (msg->type() == MessageStatus) { + StatusMessage *smsg = (StatusMessage*)msg; + switch (smsg->getStatus()) { + case STATUS_AWAY: + osd.type = OSD_ALERTAWAY; + break; + case STATUS_NA: + osd.type = OSD_ALERTNA; + break; + case STATUS_DND: + osd.type = OSD_ALERTDND; + break; + case STATUS_OCCUPIED: /* STATUS_OCCUPIED, took over from contacts.h! */ + osd.type = OSD_ALERTOCCUPIED; + break; + case STATUS_FFC: + osd.type = OSD_ALERTFFC; + break; + case STATUS_OFFLINE: + osd.type = OSD_ALERTOFFLINE; + break; + case STATUS_ONLINE: + osd.type = OSD_NONE; + return false; + default: + log(L_DEBUG,"OSD: Unknown status %ld",smsg->getStatus()); + osd.type = OSD_NONE; + return false; + } + m_queue.push_back(osd); + processQueue(); + }else{ + osd.type = OSD_MESSAGE; + if ((m_request.type == OSD_MESSAGE) && (m_request.contact == msg->contact())){ + m_queue.push_front(osd); + m_timer->stop(); bTimerActive=false; + m_timer->start(100);bTimerActive=true; + }else{ + m_queue.push_back(osd); + processQueue(); + } + } + break; + } + case eEventMessageDeleted: + case eEventMessageRead: { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + Contact *contact = getContacts()->contact(msg->contact()); + if (contact == NULL) + break; + SIM::PropertyHubPtr data = contact->getUserData("OSD"); + if (data.isNull()) + break; + osd.contact = msg->contact(); + CorePlugin* core = GET_CorePlugin(); + if (core->unread.empty()) + bHaveUnreadMessages=false; + if (msg->type() == MessageStatus) { + StatusMessage *smsg = (StatusMessage*)msg; + switch (smsg->getStatus()) { + case STATUS_AWAY: + osd.type = OSD_ALERTAWAY; + break; + case STATUS_NA: + osd.type = OSD_ALERTNA; + break; + case STATUS_DND: + osd.type = OSD_ALERTDND; + break; + case STATUS_OCCUPIED: /* STATUS_OCCUPIED, took over from contacts.h! */ + osd.type = OSD_ALERTOCCUPIED; + break; + case STATUS_FFC: + osd.type = OSD_ALERTFFC; + break; + case STATUS_OFFLINE: + osd.type = OSD_ALERTOFFLINE; + break; + case STATUS_ONLINE: + osd.type = OSD_NONE; + return false; + default: + log(L_DEBUG,"OSD: Unknown status %ld",smsg->getStatus()); + osd.type = OSD_NONE; + return false; + } + m_queue.push_back(osd); + processQueue(); + }else{ + osd.type = OSD_MESSAGE; + if ((m_request.type == OSD_MESSAGE) && (m_request.contact == msg->contact())){ + m_queue.push_front(osd); + m_timer->stop(); bTimerActive=false; + m_timer->start(100);bTimerActive=true; + }else{ + m_queue.push_back(osd); + processQueue(); + } + } + break; + } + default: + break; + } + return false; +} + diff --git a/plugins/osd/osd.h b/plugins/osd/osd.h new file mode 100644 index 0000000..be2e866 --- /dev/null +++ b/plugins/osd/osd.h @@ -0,0 +1,129 @@ +/*************************************************************************** + osd.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _OSD_H +#define _OSD_H + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +enum OSDType +{ + OSD_NONE, + OSD_ALERTONLINE, + OSD_ALERTAWAY, + OSD_ALERTNA, + OSD_ALERTDND, + OSD_ALERTOCCUPIED, + OSD_ALERTFFC, + OSD_ALERTOFFLINE, + OSD_TYPING, + OSD_MESSAGE +}; + +struct OSDRequest +{ + unsigned long contact; + OSDType type; +}; + +class OSDPlugin; + +class OSDWidget : public QLabel +{ + Q_OBJECT +public: + OSDWidget(OSDPlugin* plugin); + void showOSD(const QString &text, SIM::PropertyHubPtr data); + + virtual QSize sizeHint () const; + +signals: + void dblClick(); + void closeClick(); +protected slots: + void slotCloseClick(); + void slotTimerFadeInTimeout(); +public slots: + void hide(); + +private: + SIM::PropertyHubPtr currentData; + bool isScreenSaverActive(); + virtual void mouseDoubleClickEvent(QMouseEvent *e); + virtual void mousePressEvent(QMouseEvent *event); + QRect recalcGeometry(); + void draw(QPainter &p); + + QFont baseFont; + QPixmap bgPict; + OSDPlugin *m_plugin; + QTimer m_transTimer; + int transCounter; + int transCounterDelta; + bool m_bBackground; + bool m_bShadow; + int m_text_y; + QString m_sText; + bool m_bFading; + QRect m_Rect; + QImage m_imageButton; + QRect m_rectButton; +}; + +class OSDPlugin : public QThread, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + OSDPlugin(unsigned); + QFont getBaseFont(QFont font); + virtual ~OSDPlugin(); + unsigned long user_data_id; +protected slots: + void timeout(); + void dblClick(); + void closeClick(); +protected: + virtual QWidget *createConfigWindow(QWidget *parent); + virtual bool processEvent(SIM::Event *e); + virtual void run(); + void processQueue(); + void flashCapsLockLED(bool); + OSDRequest m_request; + QList m_queue; + QSet m_typing; + OSDWidget *m_osd; + QTimer *m_timer; + bool bCapsState; + bool bHaveUnreadMessages; // Should use this flag in OSDPlugin::run instead of core->unread.size() + // see patch #2304 for more info. + bool bTimerActive; +}; + +#endif + diff --git a/plugins/osd/osd.rc b/plugins/osd/osd.rc new file mode 100644 index 0000000..ba4e580 --- /dev/null +++ b/plugins/osd/osd.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "OSD plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "osd\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "osd.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/osd/osd.vcproj b/plugins/osd/osd.vcproj new file mode 100644 index 0000000..a61b8d7 --- /dev/null +++ b/plugins/osd/osd.vcproj @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/osd/osdconfig.cpp b/plugins/osd/osdconfig.cpp new file mode 100644 index 0000000..606bc5a --- /dev/null +++ b/plugins/osd/osdconfig.cpp @@ -0,0 +1,116 @@ +/*************************************************************************** + osdconfig.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include + +#include "simgui/fontedit.h" +#include "misc.h" +#include "simgui/qcolorbutton.h" + +#include "osdconfig.h" +#include "osdiface.h" +#include "osd.h" + +using SIM::getContacts; + +OSDConfig::OSDConfig(QWidget *parent, SIM::PropertyHubPtr data, OSDPlugin *plugin) + : QWidget(parent) + , m_plugin(plugin) +{ + setupUi(this); + chkMessage->setChecked(data->value("EnableMessage").toBool()); + chkMessageContent->setChecked(data->value("EnableMessageShowContent").toBool()); + chkCapsLockFlash->setChecked(data->value("EnableCapsLockFlash").toBool()); + chkStatus->setChecked(data->value("EnableAlert").toBool()); + chkStatusOnline->setChecked(data->value("EnableAlertOnline").toBool()); + chkStatusAway->setChecked(data->value("EnableAlertAway").toBool()); + chkStatusNA->setChecked(data->value("EnableAlertNA").toBool()); + chkStatusDND->setChecked(data->value("EnableAlertDND").toBool()); + chkStatusOccupied->setChecked(data->value("EnableAlertOccupied").toBool()); + chkStatusFFC->setChecked(data->value("EnableAlertFFC").toBool()); + chkStatusOffline->setChecked(data->value("EnableAlertOffline").toBool()); + chkTyping->setChecked(data->value("EnableTyping").toBool()); + for (QObject *p = parent; p != NULL; p = p->parent()){ + QTabWidget *tab = qobject_cast(p); + if (!tab) + continue; + SIM::PropertyHubPtr data = getContacts()->getUserData("OSD"); + m_iface = new OSDIface(tab, data, plugin); + tab->addTab(m_iface, i18n("&Interface")); + break; + } + edtLines->setValue(data->value("ContentLines").toUInt()); + connect(chkStatus, SIGNAL(toggled(bool)), this, SLOT(statusToggled(bool))); + connect(chkMessage, SIGNAL(toggled(bool)), this, SLOT(showMessageToggled(bool))); + connect(chkMessageContent, SIGNAL(toggled(bool)), this, SLOT(contentToggled(bool))); + showMessageToggled(chkMessage->isChecked()); + contentToggled(chkMessageContent->isChecked()); + statusToggled(data->value("EnableAlert").toBool()); +} + +void OSDConfig::apply() +{ + apply(getContacts()->getUserData("OSD")); +} + +void OSDConfig::apply(SIM::PropertyHubPtr data) +{ + data->setValue("EnableMessage", chkMessage->isChecked()); + data->setValue("EnableMessageShowContent", chkMessageContent->isChecked()); + data->setValue("EnableCapsLockFlash", chkCapsLockFlash->isChecked()); + data->setValue("EnableAlert", chkStatus->isChecked()); + data->setValue("EnableAlertOnline", chkStatusOnline->isChecked()); + data->setValue("EnableAlertAway", chkStatusAway->isChecked()); + data->setValue("EnableAlertNA", chkStatusNA->isChecked()); + data->setValue("EnableAlertDND", chkStatusDND->isChecked()); + data->setValue("EnableAlertOccupied", chkStatusOccupied->isChecked()); + data->setValue("EnableAlertFFC", chkStatusFFC->isChecked()); + data->setValue("EnableAlertOffline", chkStatusOffline->isChecked()); + data->setValue("EnableTyping", chkTyping->isChecked()); + data->setValue("ContentLines", (uint)edtLines->text().toULong()); + m_iface->apply(data); +} + +void OSDConfig::statusToggled(bool bState) +{ + chkStatusOnline->setEnabled(bState); + chkStatusAway->setEnabled(bState); + chkStatusNA->setEnabled(bState); + chkStatusDND->setEnabled(bState); + chkStatusOccupied->setEnabled(bState); + chkStatusFFC->setEnabled(bState); + chkStatusOffline->setEnabled(bState); + chkCapsLockFlash->setEnabled(bState); +} + +void OSDConfig::showMessageToggled(bool bState) +{ + chkMessageContent->setEnabled(bState); + edtLines->setEnabled(bState && chkMessageContent->isChecked()); + lblLines->setEnabled(bState && chkMessageContent->isChecked()); +} + +void OSDConfig::contentToggled(bool bState) +{ + edtLines->setEnabled(bState && chkMessage->isChecked()); + lblLines->setEnabled(bState && chkMessage->isChecked()); +} + diff --git a/plugins/osd/osdconfig.h b/plugins/osd/osdconfig.h new file mode 100644 index 0000000..8e219f2 --- /dev/null +++ b/plugins/osd/osdconfig.h @@ -0,0 +1,44 @@ +/*************************************************************************** + osdconfig.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _OSDCONFIG_H +#define _OSDCONFIG_H + +#include "ui_osdconfigbase.h" +#include "propertyhub.h" + +class OSDPlugin; +class OSDIface; + +class OSDConfig : public QWidget, public Ui::OSDConfigBase +{ + Q_OBJECT +public: + OSDConfig(QWidget *parent, SIM::PropertyHubPtr data, OSDPlugin *plugin); +public slots: + void apply(SIM::PropertyHubPtr data); + void apply(); + void statusToggled(bool); + void showMessageToggled(bool); + void contentToggled(bool); +protected: + OSDIface *m_iface; + OSDPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/osd/osdconfigbase.ui b/plugins/osd/osdconfigbase.ui new file mode 100644 index 0000000..020dcce --- /dev/null +++ b/plugins/osd/osdconfigbase.ui @@ -0,0 +1,163 @@ + + + OSDConfigBase + + + + 0 + 0 + 588 + 346 + + + + Form1 + + + + 11 + + + 6 + + + + + Enable &messages notification + + + + + + + Enable &status notification + + + + + + + Online + + + + + + + Away + + + + + + + N/A + + + + + + + Do not Disturb + + + + + + + Occupied + + + + + + + Free for chat + + + + + + + Offline + + + + + + + Enable &typing notification + + + + + + + Show message &content + + + + + + + Show lines of content: + + + false + + + + + + + All + + + 0 + + + + + + + Enable keyboard LED-notification in N/A state + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + diff --git a/plugins/osd/osdiface.cpp b/plugins/osd/osdiface.cpp new file mode 100644 index 0000000..4b89c11 --- /dev/null +++ b/plugins/osd/osdiface.cpp @@ -0,0 +1,120 @@ +/*************************************************************************** + osdiface.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include + +#include "simgui/fontedit.h" +#include "misc.h" +#include "simgui/qcolorbutton.h" + +#include "osdiface.h" +#include "osd.h" + +using namespace SIM; + +OSDIface::OSDIface(QWidget *parent, SIM::PropertyHubPtr data, OSDPlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; +#ifndef WIN32 + chkFading->setChecked(false); + chkFading->hide(); +#endif + cmbPos->addItem(i18n("Left-bottom")); + cmbPos->addItem(i18n("Left-top")); + cmbPos->addItem(i18n("Right-bottom")); + cmbPos->addItem(i18n("Right-top")); + cmbPos->addItem(i18n("Center-bottom")); + cmbPos->addItem(i18n("Center-top")); + cmbPos->addItem(i18n("Center")); + cmbPos->setCurrentIndex(data->value("Position").toUInt()); + spnOffs->setMinimum(0); + spnOffs->setMaximum(500); + spnOffs->setValue(data->value("Offset").toUInt()); + spnTimeout->setMinimum(1); + spnTimeout->setMaximum(60); + spnTimeout->setValue(data->value("Timeout").toUInt()); + btnColor->setColor(data->value("Color").toUInt()); + if (data->value("Font").toString().isEmpty()){ + edtFont->setFont(FontEdit::font2str(plugin->getBaseFont(font()), false)); + }else{ + edtFont->setFont(data->value("Font").toString()); + } + chkShadow->setChecked(data->value("Shadow").toBool()); + chkFading->setChecked(data->value("Fading").toBool()); + if (data->value("Background").toBool()){ + chkBackground->setChecked(true); + btnBgColor->setColor(data->value("BgColor").toUInt()); + }else{ + chkBackground->setChecked(false); + } + bgToggled(data->value("Background").toBool()); + connect(chkBackground, SIGNAL(toggled(bool)), this, SLOT(bgToggled(bool))); + unsigned nScreens = screens(); + if (nScreens <= 1){ + lblScreen->hide(); + cmbScreen->hide(); + }else{ + for (unsigned i = 0; i < nScreens; i++) + cmbScreen->addItem(QString::number(i)); + unsigned curScreen = data->value("Screen").toUInt(); + if (curScreen >= nScreens) + curScreen = 0; + cmbScreen->setCurrentIndex(curScreen); + } +} + +void OSDIface::bgToggled(bool bState) +{ + if (bState){ + btnBgColor->setEnabled(true); + return; + } + btnBgColor->setColor(palette().color(QPalette::Base)); + btnBgColor->setEnabled(false); +} + +void OSDIface::apply(SIM::PropertyHubPtr data) +{ + data->setValue("Position", cmbPos->currentIndex()); + data->setValue("Offset", spnOffs->text().toUInt()); + data->setValue("Timeout", spnTimeout->text().toUInt()); + data->setValue("Color", btnColor->color().rgb()); + QString f = edtFont->getFont(); + QString base = FontEdit::font2str(m_plugin->getBaseFont(font()), false); + if (f == base) + f.clear(); + data->setValue("Font", f); + data->setValue("Shadow", chkShadow->isChecked()); + data->setValue("Fading", chkFading->isChecked()); + data->setValue("Background", chkBackground->isChecked()); + if (data->value("Background").toBool()){ + data->setValue("BgColor", btnBgColor->color().rgb()); + }else{ + data->setValue("BgColor", 0); + } + unsigned nScreens = screens(); + if (nScreens <= 1){ + data->setValue("Screen", 0); + }else{ + data->setValue("Screen", cmbScreen->currentIndex()); + } +} + diff --git a/plugins/osd/osdiface.h b/plugins/osd/osdiface.h new file mode 100644 index 0000000..d4ba25d --- /dev/null +++ b/plugins/osd/osdiface.h @@ -0,0 +1,40 @@ +/*************************************************************************** + osdiface.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _OSDIFACE_H +#define _OSDIFACE_H + +#include "ui_osdifacebase.h" +#include "propertyhub.h" + +class OSDPlugin; + +class OSDIface : public QWidget, public Ui::OSDIfaceBase +{ + Q_OBJECT +public: + OSDIface(QWidget *parent, SIM::PropertyHubPtr data, OSDPlugin *plugin); +public slots: + void apply(SIM::PropertyHubPtr data); +protected slots: + void bgToggled(bool); +protected: + OSDPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/osd/osdifacebase.ui b/plugins/osd/osdifacebase.ui new file mode 100644 index 0000000..d375925 --- /dev/null +++ b/plugins/osd/osdifacebase.ui @@ -0,0 +1,201 @@ + + + OSDIfaceBase + + + + 0 + 0 + 375 + 330 + + + + Form2 + + + + 11 + + + 6 + + + + + Offset: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Show time: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Color: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Font: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Show sha&dow + + + + + + + Show F&ading + + + + + + + Show &background + + + + + + + Background color: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Place: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Shown on screen: + + + false + + + + + + + + + + + FontEdit + QWidget +
    simgui/fontedit.h
    +
    + + QColorButton + QWidget +
    simgui/qcolorbutton.h
    +
    +
    + + +
    diff --git a/plugins/proxy/CMakeLists.txt b/plugins/proxy/CMakeLists.txt new file mode 100644 index 0000000..844ace7 --- /dev/null +++ b/plugins/proxy/CMakeLists.txt @@ -0,0 +1,28 @@ +################# +# proxy library # +################# +IF(BUILD_DROPPED) +PROJECT(proxy) + +SET(proxy_SRCS + proxy.cpp + proxycfg.cpp + proxyerror.cpp +) + +SET(proxy_HDRS + proxy.h + proxycfg.h + proxyerror.h +) + +SET(proxy_UICS + proxycfgbase.ui + proxyerrorbase.ui +) + +# some needed include dirs +INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/plugins/_core) + +SIM_ADD_PLUGIN(proxy) +ENDIF(BUILD_DROPPED) diff --git a/plugins/proxy/proxy.cpp b/plugins/proxy/proxy.cpp new file mode 100644 index 0000000..afd815f --- /dev/null +++ b/plugins/proxy/proxy.cpp @@ -0,0 +1,1311 @@ +/*************************************************************************** + proxy.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#include +#include +#include +#endif + +#include "fetch.h" +#include "log.h" +#include "misc.h" +#include "socket/socket.h" +#include "socket/serversocketnotify.h" +#include "socket/serversocket.h" +#include "socket/clientsocket.h" +#include "socket/tcpclient.h" +#include "socket/socketfactory.h" + +#include "proxy.h" +#include "proxycfg.h" +#include "newprotocol.h" +#include "proxyerror.h" + +using namespace std; +using namespace SIM; + +#ifndef INADDR_NONE +#define INADDR_NONE 0xFFFFFFFF +#endif + +static const char *CONNECT_ERROR = I18N_NOOP("Can't connect to proxy"); +static const char *ANSWER_ERROR = I18N_NOOP("Bad proxy answer"); +static const char *AUTH_ERROR = I18N_NOOP("Proxy authorization failed"); +static const char *STATE_ERROR = "Connect in bad state"; + +static DataDef _proxyData[] = + { + { "Client", DATA_STRING, 1, 0 }, + { "Clients", DATA_STRLIST, 1, 0 }, + { "Type", DATA_ULONG, 1, DATA(0) }, + { "Host", DATA_STRING, 1, "proxy" }, + { "Port", DATA_ULONG, 1, DATA(1080) }, + { "Auth", DATA_BOOL, 1, 0 }, + { "User", DATA_STRING, 1, 0 }, + { "Password", DATA_STRING, 1, 0 }, + { "", DATA_BOOL, 1, 0 }, + { "NoShow", DATA_BOOL, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +ProxyData::ProxyData() +{ + bInit = false; + load_data(_proxyData, this, NULL); +} + +ProxyData::ProxyData(const ProxyData &d) +{ + bInit = false; + *this = d; +} + +ProxyData::ProxyData(const char *cfg) +{ + bInit = false; + if (cfg) { + Buffer config; + config << "[Title]\n" << cfg; + config.setWritePos(0); + config.getSection(); + load_data(_proxyData, this, &config); + bInit = true; + }else{ + load_data(_proxyData, this, NULL); + } +} + +ProxyData::~ProxyData() +{ + if (bInit) + free_data(_proxyData, this); +} + +bool ProxyData::operator == (const ProxyData &d) const +{ + if (Type.toULong() != d.Type.toULong()) + return false; + if (Type.toULong() == PROXY_NONE) + return true; + if ((Port.toULong() != d.Port.toULong()) && (Host.str() != d.Host.str())) + return false; + if (Type.toULong() == PROXY_SOCKS4) + return true; + if (Auth.toBool() != d.Auth.toBool()) + return false; + if (!d.Auth.toBool()) + return true; + return ((User.str() == d.User.str()) && (Password.str() == d.Password.str())); +} + +ProxyData& ProxyData::operator = (const ProxyData &d) +{ + if (bInit){ + free_data(_proxyData, this); + bInit = false; + } + if (d.bInit){ + Buffer cfg; + cfg = "[Title]\n" + save_data(_proxyData, (void*)(&d)); + cfg.setWritePos(0); + cfg.getSection(); + load_data(_proxyData, this, &cfg); + bInit = true; + Default = d.Default; + }else{ + load_data(_proxyData, this, NULL); + } + + return *this; +} + +ProxyData& ProxyData::operator = (Buffer *cfg) +{ + if (bInit){ + free_data(_proxyData, this); + bInit = false; + } + load_data(_proxyData, this, cfg); + bInit = true; + return *this; +} + +class Proxy : public Socket, public SocketNotify +{ +public: + Proxy(ProxyPlugin *plugin, ProxyData *data, TCPClient *client); + ~Proxy(); + virtual int read(char *buf, unsigned int size); + virtual void write(const char *buf, unsigned int size); + void setSocket(ClientSocket*); + virtual void close(); + virtual unsigned long localHost(); + virtual void pause(unsigned); + virtual Mode mode() const { return Indirect; } + virtual bool isEncrypted(){ return false; } + virtual bool startEncryption(){ return false; } + PROP_ULONG(Type); + PROP_STR(Host); + PROP_USHORT(Port); + PROP_BOOL(Auth); + PROP_STR(User); + PROP_STR(Password); + PROP_BOOL(NoShow); + ProxyPlugin *m_plugin; +protected: + virtual void write(); + virtual void write_ready(); + virtual void error_state(const QString &text, unsigned code = 0); + virtual void proxy_connect_ready(); + void read(unsigned size, unsigned minsize=0); + bool m_bClosed; + TCPClient *m_client; + Socket *m_sock; + Buffer bOut; + Buffer bIn; + ProxyData data; + QString m_host; + unsigned short m_port; +}; + +class Listener : public SocketNotify, public ServerSocket +{ +public: + Listener(ProxyPlugin *plugin, ProxyData *data, ServerSocketNotify *notify, unsigned long ip); + ~Listener(); + PROP_ULONG(Type); + PROP_STR(Host); + PROP_USHORT(Port); + PROP_BOOL(Auth); + PROP_STR(User); + PROP_STR(Password); +protected: + virtual void write(); + virtual void write_ready(); + virtual void bind(unsigned short mixPort, unsigned short maxPort, TCPClient *client); +#ifndef WIN32 + virtual void bind(const char *path); +#endif + virtual void close(); + void read(unsigned size, unsigned minsize=0); + unsigned long m_ip; + Socket *m_sock; + ProxyData data; + ProxyPlugin *m_plugin; + Buffer bOut; + Buffer bIn; +}; + +Proxy::Proxy(ProxyPlugin *plugin, ProxyData *d, TCPClient *client) +{ + data = *d; + m_plugin = plugin; + m_sock = NULL; + m_client = client; + m_bClosed = false; + m_plugin->proxies.push_back(this); + bIn.packetStart(); + bOut.packetStart(); +} + +Proxy::~Proxy() +{ + if (notify) + static_cast(notify)->setSocket(m_sock); + if (m_sock) + delete m_sock; + for (list::iterator it = m_plugin->proxies.begin(); it != m_plugin->proxies.end(); ++it){ + if (*it == this){ + m_plugin->proxies.erase(it); + break; + } + } +} + +void Proxy::setSocket(ClientSocket *s) +{ + m_sock = s->socket(); + s->setSocket(this); + m_sock->setNotify(this); +} + +int Proxy::read(char*, unsigned int) +{ + return 0; +} + +void Proxy::write(const char*, unsigned int) +{ + log(L_WARN, "Proxy can't write"); + if (notify) + notify->error_state("Error proxy write"); +} + +void Proxy::close() +{ + if (m_bClosed) + return; + m_bClosed = true; + if (m_sock){ + m_sock->setNotify(notify); + m_sock->close(); + } +} + +unsigned long Proxy::localHost() +{ + return m_sock->localHost(); +} + +void Proxy::pause(unsigned n) +{ + m_sock->pause(n); +} + +void Proxy::write_ready() +{ +} + +void Proxy::error_state(const QString &err, unsigned code) +{ + if (notify){ + if (code == m_plugin->ProxyErr){ + if (getNoShow()){ + code = 0; + }else{ + if (m_client != (TCPClient*)(-1)) + m_client->m_reconnect = NO_RECONNECT; + } + } + notify->error_state(err, code); + } +} + +void Proxy::read(unsigned size, unsigned minsize) +{ + bIn.init(size); + bIn.packetStart(); + int readn = m_sock->read(bIn.data(0), size); + if ((readn != (int)size) || (minsize && (readn < (int)minsize))){ + if (notify) + notify->error_state("Error proxy read"); + return; + } + EventLog::log_packet(bIn, false, m_plugin->ProxyPacket); +} + +void Proxy::write() +{ + EventLog::log_packet(bOut, true, m_plugin->ProxyPacket); + m_sock->write(bOut.data(0), bOut.size()); + bOut.init(0); + bOut.packetStart(); +} + +void Proxy::proxy_connect_ready() +{ + if (notify){ + SocketNotify *n = notify; + static_cast(n)->setSocket(m_sock); + m_sock = NULL; + n->connect_ready(); + } + getSocketFactory()->remove(this); +} + +Listener::Listener(ProxyPlugin *plugin, ProxyData *_data, ServerSocketNotify *notify, unsigned long ip) +{ + m_ip = ip; + m_plugin = plugin; + m_sock = getSocketFactory()->createSocket(); + m_sock->setNotify(this); + data = *_data; + notify->setListener(this); +} + +Listener::~Listener() +{ + if (m_sock) + delete m_sock; +} + +void Listener::bind(unsigned short, unsigned short, TCPClient*) +{ +} + +#ifndef WIN32 + +void Listener::bind(const char*) +{ +} + +#endif + +void Listener::close() +{ +} + +void Listener::write() +{ + EventLog::log_packet(bOut, true, m_plugin->ProxyPacket); + m_sock->write(bOut.data(0), bOut.size()); + bOut.init(0); + bOut.packetStart(); +} + +void Listener::read(unsigned size, unsigned minsize) +{ + bIn.init(size); + bIn.packetStart(); + int readn = m_sock->read(bIn.data(0), size); + if ((readn != (int)size) || (minsize && (readn < (int)minsize))){ + if (notify && notify->error("Error proxy read")) + delete notify; + return; + } + EventLog::log_packet(bIn, false, m_plugin->ProxyPacket); +} + +void Listener::write_ready() +{ +} + +// ______________________________________________________________________________________ + +class SOCKS4_Proxy : public Proxy +{ +public: + SOCKS4_Proxy(ProxyPlugin *plugin, ProxyData *data, TCPClient *client); + virtual void connect(const QString &host, unsigned short port); +protected: + virtual void connect_ready(); + virtual void read_ready(); + virtual void error_state(const QString &text, unsigned code); + enum State + { + None, + Connect, + WaitConnect + }; + State m_state; +}; + +class SOCKS4_Listener : public Listener +{ +public: + SOCKS4_Listener(ProxyPlugin *plugin, ProxyData *data, ServerSocketNotify *notify, unsigned long ip); +protected: + virtual void connect_ready(); + virtual void read_ready(); + virtual void error_state(const QString &text, unsigned code = 0); + enum State + { + Connect, + WaitListen, + Accept + }; + State m_state; +}; + +SOCKS4_Proxy::SOCKS4_Proxy(ProxyPlugin *plugin, ProxyData *data, TCPClient *client) + : Proxy(plugin, data, client) +{ + m_state = None; +} + +void SOCKS4_Proxy::connect(const QString &host, unsigned short port) +{ + if (m_state != None){ + if (notify) notify->error_state(STATE_ERROR); + return; + } + m_host = host; + m_port = port; + log(L_DEBUG, "Connect to proxy SOCKS4 %s:%u", qPrintable(getHost()), getPort()); + m_sock->connect(getHost(), getPort()); + m_state = Connect; +} + +void SOCKS4_Proxy::error_state(const QString &text, unsigned code) +{ + if (m_state == Connect){ + Proxy::error_state(CONNECT_ERROR, m_plugin->ProxyErr); + return; + } + Proxy::error_state(text, code); +} + +void SOCKS4_Proxy::connect_ready() +{ + if (m_state != Connect){ + error_state(STATE_ERROR, 0); + return; + } + unsigned long addr = inet_addr(qPrintable(m_host)); + if (addr == INADDR_NONE){ + struct hostent *hp = gethostbyname(qPrintable(m_host)); + if (hp) addr = *((unsigned long*)(hp->h_addr_list[0])); + } + if (notify) + notify->resolve_ready(QHostAddress(addr)); + bOut + << (char)4 + << (char)1 + << m_port + << (unsigned long)htonl(addr) + << (char)0; + m_state = WaitConnect; +} + +void SOCKS4_Proxy::read_ready() +{ + if (m_state != WaitConnect) return; + read(9, 4); + char b1, b2; + bIn >> b1 >> b2; + if (b2 != 90){ + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return; + } + proxy_connect_ready(); +} + +SOCKS4_Listener::SOCKS4_Listener(ProxyPlugin *plugin, ProxyData *data, ServerSocketNotify *notify, unsigned long ip) + : Listener(plugin, data, notify, ip) +{ + log(L_DEBUG, "Connect to proxy SOCKS4 %s:%u", qPrintable(getHost()), getPort()); + m_sock->connect(getHost(), getPort()); + m_state = Connect; +} + +void SOCKS4_Listener::connect_ready() +{ + bOut + << (char)4 + << (char)2 + << (unsigned short)0 + << (unsigned long)m_ip + << (char)0; + m_state = WaitListen; +} + +void SOCKS4_Listener::read_ready() +{ + char b1, b2; + unsigned short port; + unsigned long ip; + switch (m_state){ + case WaitListen: + read(8); + bIn >> b1 >> b2; + if (b2 != 90){ + error_state("bad proxy answer", 0); + return; + } + bIn >> port; + m_state = Accept; + if (notify) + notify->bind_ready(port); + break; + case Accept: + read(8); + bIn >> b1 >> b2; + if (b2 != 90){ + error_state("bad proxy answer", 0); + return; + } + bIn >> port >> ip; + if (notify){ + notify->accept(m_sock, ip); + m_sock = NULL; + }else{ + error_state("Bad state", 0); + } + break; + default: + break; + } +} + +void SOCKS4_Listener::error_state(const QString &err, unsigned) +{ + if (notify) + notify->error(err); +} + +// ______________________________________________________________________________________ + +class SOCKS5_Proxy : public Proxy +{ +public: + SOCKS5_Proxy(ProxyPlugin*, ProxyData*, TCPClient*); + virtual void connect(const QString &host, unsigned short port); +protected: + virtual void connect_ready(); + virtual void read_ready(); + virtual void error_state(const QString &text, unsigned code); + enum State + { + None, + Connect, + WaitAnswer, + WaitAuth, + WaitConnect + }; + State m_state; + void send_connect(); +}; + +class SOCKS5_Listener : public Listener +{ +public: + SOCKS5_Listener(ProxyPlugin *plugin, ProxyData *data, ServerSocketNotify *notify, unsigned long ip); +protected: + virtual void connect_ready(); + virtual void read_ready(); + virtual void error_state(const QString &text, unsigned code = 0); + void send_listen(); + enum State + { + Connect, + WaitAnswer, + WaitAuth, + WaitListen, + Accept + }; + State m_state; +}; + +SOCKS5_Proxy::SOCKS5_Proxy(ProxyPlugin *plugin, ProxyData *d, TCPClient *client) + : Proxy(plugin, d, client) +{ + m_state = None; +} + +void SOCKS5_Proxy::connect(const QString &host, unsigned short port) +{ + if (m_state != None){ + error_state(STATE_ERROR, 0); + return; + } + m_host = host; + m_port = port; + log(L_DEBUG, "Connect to proxy SOCKS5 %s:%u", qPrintable(getHost()), getPort()); + m_sock->connect(getHost(), getPort()); + m_state = Connect; +} + +void SOCKS5_Proxy::connect_ready() +{ + if (m_state != Connect){ + error_state(STATE_ERROR, 0); + return; + } + bOut << 0x05020002L; + m_state = WaitAnswer; + write(); +} + +void SOCKS5_Proxy::read_ready() +{ + char b1, b2; + unsigned long ip; + switch (m_state){ + case WaitAnswer: + read(2); + bIn >> b1 >> b2; + if ((b1 != 0x05) || (b2 == '\xFF')) { + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return; + } + if (b2 == 0x02) { + const QByteArray user = getUser().toUtf8(); + const QByteArray pswd = getPassword().toUtf8(); + bOut + << (char)0x01 + << (char)user.length() + << user.data() + << (char)pswd.length() + << pswd.data(); + m_state = WaitAuth; + write(); + return; + } + send_connect(); + return; + case WaitAuth: + read(2); + bIn >> b1 >> b2; + if ((b1 != 0x01) || (b2 != 0x00)) { + error_state(AUTH_ERROR, m_plugin->ProxyErr); + return; + } + send_connect(); + return; + case WaitConnect: + read(10); + bIn >> b1 >> b2; + if ((b1 != 0x05) || (b2 != 0x00)) { + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return; + } + bIn >> b1 >> b2; + bIn >> ip; + if (notify) + notify->resolve_ready(QHostAddress(ip)); + proxy_connect_ready(); + return; + default: + break; + } +} + +void SOCKS5_Proxy::error_state(const QString &text, unsigned code) +{ + if (m_state == Connect){ + Proxy::error_state(CONNECT_ERROR, m_plugin->ProxyErr); + return; + } + Proxy::error_state(text, code); +} + +void SOCKS5_Proxy::send_connect() +{ + unsigned long addr = inet_addr(qPrintable(m_host)); + bOut << (char)0x05 + << (char)0x01 /* CONNECT */ + << (char)0x00; /* reserved */ + if (addr != INADDR_NONE){ + bOut << (char)0x01 /* address type -- ip addr */ + << (unsigned long)htonl(addr); + }else{ + bOut << (char)0x03 /* address type -- host name */ + << (char)m_host.length(); + const QByteArray ba = m_host.toLocal8Bit(); + bOut.pack(ba.data(), ba.length()); + } + bOut << m_port; + m_state = WaitConnect; + write(); +} + +SOCKS5_Listener::SOCKS5_Listener(ProxyPlugin *plugin, ProxyData *data, ServerSocketNotify *notify, unsigned long ip) + : Listener(plugin, data, notify, ip) +{ + log(L_DEBUG, "Connect to proxy SOCKS5 %s:%u", qPrintable(getHost()), getPort()); + m_sock->connect(getHost(), getPort()); + m_state = Connect; +} + +void SOCKS5_Listener::connect_ready() +{ + if (m_state != Connect){ + error_state(STATE_ERROR, 0); + return; + } + bOut << 0x05020002L; + m_state = WaitAnswer; + write(); +} + +void SOCKS5_Listener::read_ready() +{ + char b1, b2; + unsigned short port; + unsigned long ip; + switch (m_state){ + case WaitAnswer: + read(2); + bIn >> b1 >> b2; + if ((b1 != 0x05) || (b2 == '\xFF')) { + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return; + } + if (b2 == 0x02) { + const QByteArray user = getUser().toUtf8(); + const QByteArray pswd = getPassword().toUtf8(); + bOut + << (char)0x01 + << (char)user.length() + << user.data() + << (char)pswd.length() + << pswd.data(); + m_state = WaitAuth; + write(); + return; + } + send_listen(); + return; + case WaitAuth: + read(2); + bIn >> b1 >> b2; + if ((b1 != 0x01) || (b2 != 0x00)) { + error_state(AUTH_ERROR, m_plugin->ProxyErr); + return; + } + send_listen(); + return; + case WaitListen: + read(10); + bIn >> b1 >> b2; + if ((b1 != 0x05) || (b2 != 0x00)) { + error_state(AUTH_ERROR, m_plugin->ProxyErr); + return; + } + bIn >> b1 >> b2; + bIn >> ip; + bIn >> port; + m_state = Accept; + if (notify) + notify->bind_ready(port); + return; + case Accept: + read(10); + bIn >> b1 >> b2; + if ((b1 != 0x05) || (b2 != 0x02)) { + error_state("Bad accept code", 0); + return; + } + bIn >> b1 >> b2; + bIn >> ip; + if (notify){ + notify->accept(m_sock, ip); + m_sock = NULL; + }else{ + error_state("Bad accept code", 0); + return; + } + return; + default: + break; + } +} + +void SOCKS5_Listener::send_listen() +{ + bOut << 0x05020001L << m_ip << (unsigned short)0; + write(); + m_state = WaitListen; +} + +void SOCKS5_Listener::error_state(const QString &err, unsigned) +{ + if (notify) + notify->error(err); +} + +// ______________________________________________________________________________________ + +class HTTPS_Proxy : public Proxy +{ +public: + HTTPS_Proxy(ProxyPlugin *plugin, ProxyData*, TCPClient *client); + virtual void connect(const QString &host, unsigned short port); +protected: + virtual void connect_ready(); + virtual void read_ready(); + void error_state(const QString &text, unsigned code); + void send_auth(); + enum State + { + None, + Connect, + WaitConnect, + WaitEmpty + }; + State m_state; + bool readLine(QByteArray &s); +}; + +HTTPS_Proxy::HTTPS_Proxy(ProxyPlugin *plugin, ProxyData *d, TCPClient *client) + : Proxy(plugin, d, client) +{ + m_state = None; +} + +void HTTPS_Proxy::connect(const QString &host, unsigned short port) +{ + if (m_state != None){ + error_state(STATE_ERROR, 0); + return; + } + m_host = host; + m_port = port; + if ((m_client != (TCPClient*)(-1)) && (m_client->protocol()->description()->flags & PROTOCOL_ANY_PORT)) + m_port = 443; + log(L_DEBUG, "Connect to proxy HTTPS %s:%u", qPrintable(getHost()), getPort()); + m_sock->connect(getHost(), getPort()); + m_state = Connect; +} + +void HTTPS_Proxy::connect_ready() +{ + if (m_state != Connect){ + log(L_WARN, "Proxy::connect_ready in bad state"); + error_state(CONNECT_ERROR, 0); + return; + } + bIn.packetStart(); + bOut << "CONNECT " + << qPrintable(m_host) + << ":" + << QByteArray::number(m_port).data() + << " HTTP/1.0\r\n" + << "User-Agent: " + << qPrintable(get_user_agent()) + << "\r\n"; + send_auth(); + bOut << "\r\n"; + m_state = WaitConnect; + write(); +} + +static char HTTP[] = "HTTP/"; + +void HTTPS_Proxy::send_auth() +{ + if (getAuth()){ + QByteArray s = basic_auth(getUser(), getPassword()); + bOut << "Proxy-Authorization: Basic "; + bOut << s.constData(); + bOut << "\r\n"; + } +} + +void HTTPS_Proxy::error_state(const QString &text, unsigned code) +{ + if (m_state == Connect){ + Proxy::error_state(CONNECT_ERROR, m_plugin->ProxyErr); + return; + } + Proxy::error_state(text, code); +} + +void HTTPS_Proxy::read_ready() +{ + if (m_state == WaitConnect){ + QByteArray s; + if (!readLine(s)) + return; + if ((unsigned)s.length() < strlen(HTTP)){ + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return; + } + int idx = s.indexOf(' '); + if (idx == -1){ + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return; + } + s = s.mid(idx + 1); + idx = s.indexOf(' '); + if (idx!=-1) + s=s.left(idx+1); + int code = s.toInt(); + if (code == 407){ + error_state(AUTH_ERROR, m_plugin->ProxyErr); + return; + } + if (code != 200){ + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return; + } + m_state = WaitEmpty; + } + if (m_state == WaitEmpty){ + for (;;){ + QByteArray s; + if (!readLine(s)) + return; + if (s.length() == 0) + break; + } + proxy_connect_ready(); + } +} + +bool HTTPS_Proxy::readLine(QByteArray &s) +{ + for (;;){ + char c; + int n = m_sock->read(&c, 1); + if (n < 0){ + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return false; + } + if (n == 0) + return false; + if (c == '\r') + continue; + if (c == '\n') + break; + bIn << c; + } + bIn << '\0'; + EventLog::log_packet(bIn, false, m_plugin->ProxyPacket); + if(bIn.size()) + s = bIn; + bIn.init(0); + bIn.packetStart(); + return true; +} + +// ______________________________________________________________________________________ + +class HTTP_Proxy : public HTTPS_Proxy +{ +public: + HTTP_Proxy(ProxyPlugin *plugin, ProxyData*, TCPClient *client); + void connect(const QString &host, unsigned short port); +protected: + virtual void write(const char *buf, unsigned int size); + virtual int read(char *buf, unsigned int size); + void read_ready(); + void write_ready(); + void connect_ready(); + enum State + { + WaitHeader, + Headers, + Data + }; + State m_state; + Buffer m_out; + bool m_bHTTP; + unsigned m_size; + QByteArray m_head; +}; + +HTTP_Proxy::HTTP_Proxy(ProxyPlugin *plugin, ProxyData *data, TCPClient *client) + : HTTPS_Proxy(plugin, data, client) +{ + m_bHTTP = true; + m_state = WaitHeader; + m_size = 0; +} + +void HTTP_Proxy::read_ready() +{ + if (!m_bHTTP){ + HTTPS_Proxy::read_ready(); + return; + } + if (!m_head.isEmpty()) + return; + if (!readLine(m_head)) + return; + if ((unsigned)m_head.length() < strlen(HTTP)){ + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return; + } + int idx = m_head.indexOf(' '); + if (idx == -1){ + error_state(ANSWER_ERROR, m_plugin->ProxyErr); + return; + } + QByteArray str = m_head.mid(idx + 1); + int code = str.toInt(); + if (code == 407){ + error_state(AUTH_ERROR, m_plugin->ProxyErr); + return; + } + m_head += "\r\n"; + if (notify) + notify->read_ready(); +} + +void HTTP_Proxy::connect(const QString &host, unsigned short port) +{ + if (port == 443) + m_bHTTP = false; + HTTPS_Proxy::connect(host, port); +} + +void HTTP_Proxy::connect_ready() +{ + if (!m_bHTTP){ + HTTPS_Proxy::connect_ready(); + return; + } + bIn.packetStart(); + if (notify) + notify->connect_ready(); +} + +void HTTP_Proxy::write_ready() +{ + if ((m_state == Data) && notify) + notify->write_ready(); +} + +int HTTP_Proxy::read(char *buf, unsigned int size) +{ + if (!m_bHTTP) + return HTTPS_Proxy::read(buf, size); + if (m_head.isEmpty()) + return 0; + if (size > (unsigned)m_head.length()) + size = m_head.length(); + memcpy(buf, m_head.data(), size); + m_head = m_head.mid(size); + if (m_head.isEmpty()){ + static_cast(notify)->setSocket(m_sock); + m_sock = NULL; + getSocketFactory()->remove(this); + } + return size; +} + +void HTTP_Proxy::write(const char *buf, unsigned int size) +{ + if (!m_bHTTP){ + HTTPS_Proxy::write(buf, size); + return; + } + if (m_state == Data){ + unsigned out_size = size; + if (out_size > m_size) + out_size = m_size; + if (out_size == 0) + return; + bOut.pack(buf, out_size); + m_size -= out_size; + HTTPS_Proxy::write(); + return; + } + m_out.pack(buf, size); + QByteArray line; + if (m_state == WaitHeader){ + if (!m_out.scan("\r\n", line)) + return; + bOut + << getToken(line, ' ', false).data() + << " http://" + << qPrintable(m_host); + if (m_port != 80) + bOut << ":" << QByteArray::number(m_port).data(); + bOut << getToken(line, ' ', false).data(); + bOut << " HTTP/1.1\r\n"; + m_state = Headers; + } + if (m_state == Headers){ + for (;;){ + if (!m_out.scan("\r\n", line)){ + HTTPS_Proxy::write(); + return; + } + if (line.isEmpty()) + break; + QByteArray param = getToken(line, ':'); + if (param == "Content-Length"){ + QByteArray p = line.trimmed(); + m_size = p.toUInt(); + } + bOut << param.data() << ":" << line.data() << "\r\n"; + } + send_auth(); + bOut << "\r\n"; + if (m_out.readPos() < m_out.writePos()){ + unsigned out_size = m_out.writePos() - m_out.readPos(); + if (out_size > m_size) + out_size = m_size; + bOut.pack(m_out.data(m_out.readPos()), out_size); + m_size -= out_size; + } + m_out.init(0); + m_state = Data; + HTTPS_Proxy::write(); + } +} + +// ______________________________________________________________________________________ + + +Plugin *createProxyPlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new ProxyPlugin(base, config); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Proxy"), + I18N_NOOP("Plugin provides proxy support (SOCKS4, SOCKS5, HTTPS/HTTP)"), + VERSION, + createProxyPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +ProxyPlugin::ProxyPlugin(unsigned base, Buffer *config) + : Plugin(base) +{ + data = config; + ProxyPacket = registerType(); + ProxyErr = registerType(); + getContacts()->addPacketType(ProxyPacket, info.title); +} + +ProxyPlugin::~ProxyPlugin() +{ + while (proxies.size()){ + delete proxies.front(); + } + getContacts()->removePacketType(ProxyPacket); +} + +QString ProxyPlugin::clientName(TCPClient *client) +{ + if (client == (TCPClient*)(-1)) + return "HTTP"; + return static_cast(client)->name(); +} + +void ProxyPlugin::clientData(TCPClient *client, ProxyData &cdata) +{ + for(unsigned i = 1;; i++) + { + const QString proxyCfg = getClients(i); + if (proxyCfg.isEmpty()) + break; + ProxyData wdata(qPrintable(proxyCfg)); + if (clientName(client) == wdata.Client.str()) + { + cdata = wdata; + cdata.Default.asBool() = false; + cdata.Client.str() = clientName(client); + return; + } + } + cdata = data; + cdata.Client.str() = clientName(client); + cdata.Default.asBool() = true; + cdata.Clients.clear(); +} + +bool ProxyPlugin::processEvent(Event *e) +{ + switch (e->type()) { + case eEventSocketConnect: { + EventSocketConnect *esc = static_cast(e); + list::iterator it; + for (it = proxies.begin(); it != proxies.end(); ++it){ + if ((*it)->getNotify() == esc->socket()) + return false; + } + ProxyData data; + clientData(esc->client(), data); + Proxy *proxy = NULL; + switch (data.Type.toULong()){ + case PROXY_SOCKS4: + proxy = new SOCKS4_Proxy(this, &data, esc->client()); + break; + case PROXY_SOCKS5: + proxy = new SOCKS5_Proxy(this, &data, esc->client()); + break; + case PROXY_HTTPS: + if (esc->client() == (TCPClient*)(-1)){ + proxy = new HTTP_Proxy(this, &data, esc->client()); + }else{ + proxy = new HTTPS_Proxy(this, &data, esc->client()); + } + break; + } + if (proxy){ + proxy->setSocket(esc->socket()); + return true; + } + break; + } + case eEventSocketListen: { + EventSocketListen *esl = static_cast(e); + ProxyData data; + clientData(esl->client(), data); + Listener *listener = NULL; + switch (data.Type.toULong()) + { + case PROXY_SOCKS4: + listener = new SOCKS4_Listener(this, &data, esl->notify(), esl->client()->ip()); + break; + case PROXY_SOCKS5: + listener = new SOCKS5_Listener(this, &data, esl->notify(), esl->client()->ip()); + break; + } + if (listener) + return true; + break; + } + case eEventRaiseWindow: { + EventRaiseWindow *win = static_cast(e); + QWidget *w = win->widget(); + if (!w || !w->inherits("NewProtocol")) + return false; + NewProtocol *p = static_cast(w); + if (p->m_client->protocol()->description()->flags & PROTOCOL_NOPROXY) + return false; + ProxyConfig *cfg = w->findChild(); + if (cfg) + return false; + QTabWidget *tab = w->findChild(); + if (tab){ + cfg = new ProxyConfig(tab, this, tab, p->m_client); + QObject::connect(tab->topLevelWidget(), SIGNAL(apply()), cfg, SLOT(apply())); + } + break; + } + case eEventClientNotification: { + EventClientNotification *ee = static_cast(e); + const EventNotification::ClientNotificationData &data = ee->data(); + if (data.code == ProxyErr){ + QString msg; + if (!data.text.isEmpty()) + msg = i18n(data.text).arg(data.args); + ProxyError *err = new ProxyError(this, static_cast(data.client), msg); + raiseWindow(err); + return true; + } + break; + } + default: + break; + } + return false; +} + +QByteArray ProxyPlugin::getConfig() +{ + return save_data(_proxyData, &data); +} + +QWidget *ProxyPlugin::createConfigWindow(QWidget *parent) +{ + return new ProxyConfig(parent, this, NULL, static_cast (NULL)); +} + +const DataDef *ProxyPlugin::proxyData = _proxyData; diff --git a/plugins/proxy/proxy.h b/plugins/proxy/proxy.h new file mode 100644 index 0000000..6c73172 --- /dev/null +++ b/plugins/proxy/proxy.h @@ -0,0 +1,87 @@ +/*************************************************************************** + proxy.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _PROXY_H +#define _PROXY_H + +#include + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include + +using namespace std; + +const unsigned PROXY_NONE = 0; +const unsigned PROXY_SOCKS4 = 1; +const unsigned PROXY_SOCKS5 = 2; +const unsigned PROXY_HTTPS = 3; + +struct ProxyData +{ + SIM::Data Client; + SIM::Data Clients; + SIM::Data Type; + SIM::Data Host; + SIM::Data Port; + SIM::Data Auth; + SIM::Data User; + SIM::Data Password; + SIM::Data Default; + SIM::Data NoShow; + bool bInit; + ProxyData(); + ProxyData(const ProxyData&); + ProxyData(const char *cfg); + ~ProxyData(); + bool operator == (const ProxyData&) const; + ProxyData& operator = (const ProxyData&); + ProxyData& operator = (Buffer *cfg); +}; + +class Proxy; +class Listener; + +class ProxyPlugin : public SIM::Plugin, public SIM::EventReceiver +{ +public: + ProxyPlugin(unsigned, Buffer*); + virtual ~ProxyPlugin(); + PROP_STRLIST(Clients); + PROP_ULONG(Type); + PROP_STR(Host); + PROP_USHORT(Port); + PROP_BOOL(Auth); + PROP_BOOL(NoShow); + PROP_STR(User); + PROP_STR(Password); + unsigned ProxyPacket; + list proxies; + ProxyData data; + void clientData(SIM::TCPClient*, ProxyData &data); + static const SIM::DataDef *proxyData; + unsigned ProxyErr; + QString clientName(SIM::TCPClient *client); +protected: + virtual bool processEvent(SIM::Event *e); + virtual QWidget *createConfigWindow(QWidget *parent); + virtual QByteArray getConfig(); +}; + +#endif + diff --git a/plugins/proxy/proxy.rc b/plugins/proxy/proxy.rc new file mode 100644 index 0000000..5081022 --- /dev/null +++ b/plugins/proxy/proxy.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Proxy plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "proxy\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "proxy.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/proxy/proxy.vcproj b/plugins/proxy/proxy.vcproj new file mode 100644 index 0000000..d430bea --- /dev/null +++ b/plugins/proxy/proxy.vcproj @@ -0,0 +1,451 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/proxy/proxycfg.cpp b/plugins/proxy/proxycfg.cpp new file mode 100644 index 0000000..fe62e1a --- /dev/null +++ b/plugins/proxy/proxycfg.cpp @@ -0,0 +1,245 @@ +/*************************************************************************** + proxycfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "icons.h" +#include "misc.h" +#include "socket/socket.h" +#include "socket/tcpclient.h" +#include "fetch.h" + +#include "proxycfg.h" +#include "proxy.h" + +using namespace SIM; + +ProxyConfig::ProxyConfig(QWidget *parent, ProxyPlugin *plugin, QTabWidget *tab, ClientPtr client) + : QWidget(parent) + , m_client(client) + , m_plugin(plugin) + , m_current(~0U) +{ + setupUi(this); + cmbType->addItem(i18n("None")); + cmbType->addItem("SOCKS4"); + cmbType->addItem("SOCKS5"); + cmbType->addItem("HTTP/HTTPS"); + if (tab){ + tab->addTab(this, i18n("&Proxy")); + for (QWidget *p = this; p; p = p->parentWidget()){ + QSize s = p->sizeHint(); + QSize s1 = QSize(p->width(), p->height()); + p->setMinimumSize(s); + p->resize(qMax(s.width(), s1.width()), qMax(s.height(), s1.height())); + if (p->layout()) + p->layout()->invalidate(); + if (p == topLevelWidget()) + break; + } + } + connect(cmbType, SIGNAL(activated(int)), this, SLOT(typeChanged(int))); + connect(chkAuth, SIGNAL(toggled(bool)), this, SLOT(authToggled(bool))); + if (m_client){ + lblClient->hide(); + cmbClient->hide(); + ProxyData data; + plugin->clientData(static_cast(m_client.data()), data); + fill(&data); + }else{ + fillClients(); + connect(cmbClient, SIGNAL(activated(int)), this, SLOT(clientChanged(int))); + clientChanged(0); + } +} + +void ProxyConfig::apply() +{ + if (m_client){ + ProxyData nd(NULL); + get(&nd); + nd.Client.str() = QString::null; + if (getContacts()->nClients() <= 1){ + m_plugin->clearClients(); + m_plugin->data = nd; + return; + } + ProxyData d; + m_plugin->clientData(static_cast(m_client.data()), d); + m_data.clear(); + if (d.Default.toBool()){ + d = nd; + }else{ + d = m_plugin->data; + } + m_data.push_back(d); + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (client == m_client){ + nd.Client.str() = m_client->name(); + m_data.push_back(nd); + }else{ + ProxyData d; + m_plugin->clientData(static_cast(client), d); + m_data.push_back(d); + } + } + }else{ + clientChanged(0); + } + m_plugin->data = m_data[0]; + m_plugin->clearClients(); + unsigned nClient = 1; + for (unsigned i = 1; i < m_data.size(); i++){ + if (m_data[i] == m_data[0]) + continue; + m_plugin->setClients(nClient++, save_data(ProxyPlugin::proxyData, &m_data[i])); + } +} + +void ProxyConfig::typeChanged(int type) +{ + if (type){ + edtHost->show(); + edtPort->show(); + lblHost->show(); + lblPort->show(); + }else{ + edtHost->hide(); + edtPort->hide(); + lblHost->hide(); + lblPort->hide(); + } + if (type > 1){ + chkAuth->show(); + edtUser->show(); + edtPswd->show(); + lblUser->show(); + lblPswd->show(); + }else{ + chkAuth->hide(); + edtUser->hide(); + edtPswd->hide(); + lblUser->hide(); + lblPswd->hide(); + } + authToggled(chkAuth->isChecked()); +} + +void ProxyConfig::authToggled(bool bState) +{ + edtUser->setEnabled(bState); + edtPswd->setEnabled(bState); + lblUser->setEnabled(bState); + lblPswd->setEnabled(bState); +} + +void ProxyConfig::clientChanged(int) +{ + if (m_current < m_data.size()){ + get(&m_data[m_current]); + if (m_current == 0){ + for (unsigned i = 1; i < m_data.size(); i++){ + if (m_data[i].Default.toBool()){ + QString client = m_data[i].Client.str(); + m_data[i] = m_data[0]; + m_data[i].Default.asBool() = true; + m_data[i].Client.str() = client; + }else{ + if (m_data[i] == m_data[0]) + m_data[i].Default.asBool() = true; + } + } + }else{ + ProxyData &d = m_data[m_current]; + d.Default.asBool() = (d == m_data[0]); + } + } + m_current = cmbClient->currentIndex(); + if (m_current < m_data.size()) + fill(&m_data[m_current]); +} + +bool ProxyConfig::processEvent(Event *e) +{ + if ((m_client == NULL) && (e->type() == eEventClientsChanged)) + fillClients(); + return false; +} + +void ProxyConfig::fillClients() +{ + m_current = (unsigned)(-1); + m_data.clear(); + cmbClient->clear(); + cmbClient->insertItem(INT_MAX,i18n("Default")); + ProxyData d(m_plugin->data); + d.Clients.clear(); + m_data.push_back(d); + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (client->protocol()->description()->flags & PROTOCOL_NOPROXY) + continue; + QString name = client->name(); + int pos = name.indexOf("."); + if (pos > 0) + name = name.replace(pos, 1, " "); + cmbClient->addItem(Icon(client->protocol()->description()->icon), name); + ProxyData d; + m_plugin->clientData(static_cast(client), d); + m_data.push_back(d); + } + bool bState; + if (!get_connection_state(bState)){ + cmbClient->insertItem(INT_MAX,i18n("HTTP requests"));; + ProxyData d; + m_plugin->clientData((TCPClient*)(-1), d); + m_data.push_back(d); + } + clientChanged(0); +} + +void ProxyConfig::fill(ProxyData *data) +{ + cmbType->setCurrentIndex(data->Type.toULong()); + edtHost->setText(data->Host.str()); + edtPort->setValue(data->Port.toULong()); + chkAuth->setChecked(data->Auth.toBool()); + edtUser->setText(data->User.str()); + edtPswd->setText(data->Password.str()); + typeChanged(data->Type.toULong()); + chkNoShow->setChecked(data->NoShow.toBool()); +} + +void ProxyConfig::get(ProxyData *data) +{ + data->Type.asULong() = cmbType->currentIndex(); + data->Host.str() = edtHost->text(); + data->Port.asULong() = edtPort->text().toULong(); + data->Auth.asBool() = chkAuth->isChecked(); + data->User.str() = edtUser->text(); + data->Password.str() = edtPswd->text(); + data->NoShow.asBool()= chkNoShow->isChecked(); + data->bInit = true; +} diff --git a/plugins/proxy/proxycfg.h b/plugins/proxy/proxycfg.h new file mode 100644 index 0000000..517105d --- /dev/null +++ b/plugins/proxy/proxycfg.h @@ -0,0 +1,53 @@ +/*************************************************************************** + proxycfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _PROXYCFG_H +#define _PROXYCFG_H + +#include "contacts/client.h" +#include "proxy.h" +#include "ui_proxycfgbase.h" + +#include + +class ProxyPlugin; +class QTabWidget; + +class ProxyConfig : public QWidget, public Ui::ProxyConfigBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + ProxyConfig(QWidget *parent, ProxyPlugin *plugin, QTabWidget *tab, SIM::ClientPtr client); +public slots: + void apply(); +protected slots: + void clientChanged(int client); + void typeChanged(int type); + void authToggled(bool auth); +protected: + virtual bool processEvent(SIM::Event *e); + void fillClients(); + void fill(ProxyData*); + void get(ProxyData*); + std::vector m_data; + SIM::ClientPtr m_client; + ProxyPlugin *m_plugin; + unsigned m_current; +}; + +#endif + diff --git a/plugins/proxy/proxycfgbase.ui b/plugins/proxy/proxycfgbase.ui new file mode 100644 index 0000000..ede61b3 --- /dev/null +++ b/plugins/proxy/proxycfgbase.ui @@ -0,0 +1,189 @@ + + + ProxyConfigBase + + + + 0 + 0 + 331 + 267 + + + + Form1 + + + + 11 + + + 6 + + + + + Host: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Port: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + 1 + + + 65535 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Proxy require &authorization + + + + + + + User: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + QLineEdit::Password + + + + + + + Proxy type: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Client: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Do not show error dialog (automatically reconnect) + + + + + + + cmbClient + cmbType + edtHost + edtPort + chkAuth + edtUser + edtPswd + + + + diff --git a/plugins/proxy/proxyerror.cpp b/plugins/proxy/proxyerror.cpp new file mode 100644 index 0000000..8f896c7 --- /dev/null +++ b/plugins/proxy/proxyerror.cpp @@ -0,0 +1,79 @@ +/*************************************************************************** + proxyerror.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include + +#include "icons.h" +#include "misc.h" + +#include "proxyerror.h" +#include "proxycfg.h" +#include "socket/tcpclient.h" + +using namespace SIM; + +ProxyError::ProxyError(ProxyPlugin *plugin, TCPClient *client, const QString& msg) + : QDialog(NULL) + , m_plugin(plugin) + , m_client(client) +{ + setupUi(this); + setModal(false); + setAttribute(Qt::WA_DeleteOnClose); + setWindowIcon(Icon("error")); + setButtonsPict(this); + lblMessage->setText(msg); + if (layout() && layout()->inherits("QBoxLayout")){ + QBoxLayout *lay = static_cast(layout()); + ProxyConfig *cfg = new ProxyConfig(this, m_plugin, NULL, static_cast (m_client)); + lay->insertWidget(1, cfg); + cfg->show(); + setMinimumSize(sizeHint()); + connect(this, SIGNAL(apply()), cfg, SLOT(apply())); + } +} + +ProxyError::~ProxyError() +{ + if (m_client && (m_client->getState() == Client::Error)) + m_client->setStatus(STATUS_OFFLINE, false); +} + +bool ProxyError::processEvent(Event *e) +{ + if (e->type() == eEventClientsChanged){ + for (unsigned i = 0; i < getContacts()->nClients(); i++){ + if (getContacts()->getClient(i) == m_client) + return false; + } + m_client = NULL; + close(); + } + return false; +} + +void ProxyError::accept() +{ + if (m_client){ + emit apply(); + m_client->setStatus(m_client->getManualStatus(), m_client->getCommonStatus()); + } + QDialog::accept(); +} diff --git a/plugins/proxy/proxyerror.h b/plugins/proxy/proxyerror.h new file mode 100644 index 0000000..6f28ded --- /dev/null +++ b/plugins/proxy/proxyerror.h @@ -0,0 +1,43 @@ +/*************************************************************************** + proxyerror.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _PROXYERROR_H +#define _PROXYERROR_H + +#include "socket/socket.h" +#include "ui_proxyerrorbase.h" + +class ProxyConfig; +class ProxyPlugin; + +class ProxyError : public QDialog, public Ui::ProxyErrorBase, public SIM::EventReceiver +{ + Q_OBJECT +public: + ProxyError(ProxyPlugin *plugin, SIM::TCPClient *client, const QString& msg); + ~ProxyError(); +signals: + void apply(); +protected: + virtual bool processEvent(SIM::Event *e); + virtual void accept(); + ProxyPlugin *m_plugin; + SIM::TCPClient *m_client; +}; + +#endif + diff --git a/plugins/proxy/proxyerrorbase.ui b/plugins/proxy/proxyerrorbase.ui new file mode 100644 index 0000000..1248085 --- /dev/null +++ b/plugins/proxy/proxyerrorbase.ui @@ -0,0 +1,129 @@ + + + ProxyErrorBase + + + + 0 + 0 + 450 + 87 + + + + Proxy error + + + true + + + + + + + 0 + 0 + + + + + 75 + true + + + + + + + false + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + qPixmapFromMimeSource + + + + buttonOk + clicked() + ProxyErrorBase + accept() + + + 20 + 20 + + + 20 + 20 + + + + + buttonCancel + clicked() + ProxyErrorBase + reject() + + + 20 + 20 + + + 20 + 20 + + + + + diff --git a/plugins/remote/CMakeLists.txt b/plugins/remote/CMakeLists.txt new file mode 100644 index 0000000..da4d2d0 --- /dev/null +++ b/plugins/remote/CMakeLists.txt @@ -0,0 +1,78 @@ +################## +# remote library # +################## +IF(BUILD_DROPPED) +PROJECT(remote) + +SET(remote_LIB_SRCS + remote.cpp + remotecfg.cpp +) + +SET(remote_LIB_HDRS + remote.h + remotecfg.h +) + +SET(remote_UI_FILES + remotecfgbase.ui +) + +# moc, if needed +QT4_WRAP_CPP(remote_mocs ${remote_LIB_HDRS}) + +# don't forget our ui's +QT4_WRAP_UI(remote_uis ${remote_UI_FILES}) + +ADD_LIBRARY(remote SHARED ${remote_LIB_SRCS} ${remote_mocs} ${remote_uis}) + +# some needed include dirs +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + +TARGET_LINK_LIBRARIES(remote simlib _core) + +SET_TARGET_PROPERTIES(remote PROPERTIES PREFIX "") + +# install target +INSTALL(TARGETS remote LIBRARY DESTINATION ${SIM_PLUGIN_DIR} RUNTIME DESTINATION ${SIM_PLUGIN_DIR}) + +######################### +# next target - simctrl # +######################### + +IF(0) +ADD_EXECUTABLE(simctrl simctrl.cpp) +IF(SIM_ENABLE_FPIE) + SET_TARGET_PROPERTIES(simctrl PROPERTIES COMPILE_FLAGS "${SIM_CXX_FPIE_FLAGS}") + SET_TARGET_PROPERTIES(simctrl PROPERTIES LINK_FLAGS "${SIM_PIE_LDFLAGS}") +ENDIF(SIM_ENABLE_FPIE) +TARGET_LINK_LIBRARIES(simctrl simlib) +INSTALL(TARGETS simctrl RUNTIME DESTINATION ${BINDIR}) +IF(NOT WIN32) + INSTALL(FILES simctrl.desktop DESTINATION ${SERVICES_INSTALL_DIR}) +ENDIF(NOT WIN32) + +#doesn't work yet +######################## +# next target - simext # +######################## + +ADD_EXECUTABLE(simext simext.idl SIM_ext.cpp simext.cpp simext.rc) +INSTALL(TARGETS simext RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) + +######################## +# next target - simipc # +######################## + +ADD_EXECUTABLE(simipc simipc.cpp) +INSTALL(TARGETS simipc RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) + +########################### +# next target - simremote # +########################### + +ADD_EXECUTABLE(simremote simremote.idl sim_remote.cpp simControl.cpp simremote.rc) +INSTALL(TARGETS simremote RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) + +ENDIF(0) +ENDIF(BUILD_DROPPED) diff --git a/plugins/remote/IContextMenuImpl.h b/plugins/remote/IContextMenuImpl.h new file mode 100644 index 0000000..96de6a4 --- /dev/null +++ b/plugins/remote/IContextMenuImpl.h @@ -0,0 +1,49 @@ +// IContextMenuImpl.h +// +////////////////////////////////////////////////////////////////////// +#include +#include + + +class ATL_NO_VTABLE IContextMenuImpl : public IContextMenu3 +{ +public: + + // IUnknown + // + STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject) = 0; + _ATL_DEBUG_ADDREF_RELEASE_IMPL( IContextMenuImpl ) + + + // IContextMenu + // + STDMETHOD(GetCommandString)(UINT, UINT, UINT*, LPSTR, UINT) + { + return S_FALSE; + } + + STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO) + { + return S_FALSE; + } + + STDMETHOD(QueryContextMenu)(HMENU, UINT, UINT , UINT, UINT) + { + return S_FALSE; + } + + // IContextMenu2 + // + STDMETHOD(HandleMenuMsg)(UINT, WPARAM, LPARAM) + { + return S_FALSE; + } + + // IContextMenu3 + // + STDMETHOD(HandleMenuMsg2)(UINT, WPARAM, LPARAM, LRESULT *) + { + return S_FALSE; + } +}; + diff --git a/plugins/remote/IShellExtInitImpl.h b/plugins/remote/IShellExtInitImpl.h new file mode 100644 index 0000000..3d56e8e --- /dev/null +++ b/plugins/remote/IShellExtInitImpl.h @@ -0,0 +1,26 @@ +// IShellExtInitImpl.h +// +////////////////////////////////////////////////////////////////////// +#include +#include + + +class ATL_NO_VTABLE IShellExtInitImpl : public IShellExtInit +{ +public: + + // IUnknown + // + STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject) = 0; + _ATL_DEBUG_ADDREF_RELEASE_IMPL( IShellExtInitImpl ) + + + // IShellExtInit + // + STDMETHOD(Initialize)(LPCITEMIDLIST, LPDATAOBJECT, HKEY) + { + return S_FALSE; + }; + +}; + diff --git a/plugins/remote/SIM_ext.cpp b/plugins/remote/SIM_ext.cpp new file mode 100644 index 0000000..05940b3 --- /dev/null +++ b/plugins/remote/SIM_ext.cpp @@ -0,0 +1,391 @@ +// SIM_ext.cpp : Implementation of CSIM_ext +#include +extern CComModule _Module; +#include +#include "Simext.h" +#include "SIM_ext.h" +#include + +using namespace std; + +static bool (*ProcessStr)(BSTR in_str, BSTR *out_str) = NULL; + +static string getToken(string &from, char c) +{ + string res; + unsigned i; + for (i = 0; i < from.length(); i++){ + if (from[i] == c) + break; + if (from[i] == '\\'){ + i++; + if (i >= from.length()) + break; + res += from[i]; + continue; + } + res += from[i]; + } + if (i < from.length()){ + from = from.substr(i + 1); + }else{ + from = ""; + } + return res; +} + +HINSTANCE CSIM_ext::hInstance; + +///////////////////////////////////////////////////////////////////////////// +// CSIM_ext + +CSIM_ext::CSIM_ext() +{ + lpData = NULL; + if (ProcessStr == NULL){ + WCHAR name[512]; + GetModuleFileName(hInstance, name, sizeof(name)); + + char* namestr=(char *)malloc( 512 ); + size_t i; + wcstombs_s(&i, namestr, (size_t)512, name, (size_t)512 ); + + char *r = strrchr(namestr, '\\'); + if (r){ + r++; + }else{ + r = namestr; + } + strcpy(r, "simremote.dll"); + HINSTANCE hLib = LoadLibrary(name); + (DWORD&)ProcessStr = (DWORD)GetProcAddress(hLib, "ProcessStr"); + } +} + +CSIM_ext::~CSIM_ext() +{ + for (ICON_MAP::iterator it = m_icons.begin(); it != m_icons.end(); ++it) + DestroyIcon((*it).second); + if (lpData) + lpData->Release(); +} + +HRESULT CSIM_ext::QueryContextMenu(HMENU hmenu, + UINT indexMenu, + UINT idCmdFirst, + UINT idCmdLast, + UINT uFlags) +{ + if ((lpData == NULL) || (uFlags & CMF_DEFAULTONLY)) + return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); + + CmdBase = idCmdFirst; + + if (((uFlags & 0x0000000F) == CMF_NORMAL) || (uFlags & CMF_EXPLORE)){ + STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL }; + FORMATETC formatetc = { CF_HDROP, + NULL, + DVASPECT_CONTENT, + -1, + TYMED_HGLOBAL + }; + HRESULT hr = lpData->GetData(&formatetc, &stgmedium); + if (!SUCCEEDED(hr)) + return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); + //char *drop_files = (char*)GlobalLock(stgmedium.hGlobal); + GlobalUnlock(stgmedium.hGlobal); + + CComBSTR in("CONTACTS 3"); + CComBSTR out; + unsigned cmd_id = idCmdFirst; + if (ProcessStr && ProcessStr(in, &out)){ + HMENU hMain = NULL; + HMENU hSub = NULL; + size_t size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), 0, 0, NULL, NULL); + char *res = new char[size + 1]; + size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), res, size, NULL, NULL); + res[size] = 0; + if (res[0] == '>'){ + string r = res + 1; + string line = getToken(r, '\n'); + unsigned nContacts = atol(getToken(line, ' ').c_str()); + unsigned nGroups = atol(line.c_str()); + bool bSubMenu = false; + if ((nContacts > 20) && (nGroups > 1)){ + hMain = CreatePopupMenu(); + bSubMenu = true; + } + unsigned old_grp = (unsigned)(-1); + while (!r.empty()){ + line = getToken(r, '\n'); + if (line.empty()) + continue; + unsigned id = atol(getToken(line, ' ').c_str()); + unsigned grp = atol(getToken(line, ' ').c_str()); + string icon = getToken(line, ' '); + if (!line.empty()){ + if (hMain){ + if (grp != old_grp){ + old_grp = grp; + if (bSubMenu){ + char *res = NULL; + hSub = CreatePopupMenu(); + char *grp = "Group"; + char cmd[64]; + sprintf(cmd, "GROUP %u", old_grp); + CComBSTR in(cmd); + CComBSTR out; + if (ProcessStr && ProcessStr(in, &out)){ + size_t size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), 0, 0, NULL, NULL); + char *res = new char[size + 1]; + size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), res, size, NULL, NULL); + res[size] = 0; + if (res[0] == '>') + grp = res + 1; + } + + wchar_t *grpLPCWSTR = (wchar_t *)malloc( sizeof( wchar_t )); + wcstombs( grp, grpLPCWSTR, size + 1 ); + AppendMenu(hMain, MF_POPUP | MF_STRING, (unsigned)hSub, grpLPCWSTR); + if (res) + delete[] res; + }else{ + AppendMenu(hSub, MF_SEPARATOR, 0, NULL); + } + } + }else{ + hMain = CreatePopupMenu(); + hSub = hMain; + } + ItemInfo info; + info.text = line.c_str(); + info.icon = createIcon(icon.c_str()); + info.id = id; + m_items.insert(ITEM_MAP::value_type(cmd_id, info)); + + const char* linestr = line.c_str(); + + AppendMenuA(hSub, MF_STRING | MF_OWNERDRAW, cmd_id, linestr); + cmd_id++; + } + } + } + delete[] res; + if (hMain != NULL) + InsertMenu(hmenu, indexMenu++, MF_POPUP|MF_BYPOSITION, + (UINT)hMain, L"Send to SIM contact"); + } + return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, cmd_id - idCmdFirst); + } + return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); +} + +static char fromHex(char c) +{ + if ((c >= '0') && (c <= '9')) return (char)(c - '0'); + if ((c >= 'A') && (c <= 'F')) return (char)(c + 10 - 'A'); + if ((c >= 'a') && (c <= 'f')) return (char)(c + 10 - 'a'); + return (char)0; +} + +static void *unpackData(const char *p) +{ + char *res = (char*)malloc(strlen(p) / 2); + char *t = res; + for (; p[0] && p[1]; p += 2) + *(t++) = (fromHex(p[0]) << 4) + fromHex(p[1]); + return res; +} + +HBITMAP CSIM_ext::createBitmap(string &info) +{ + BITMAPINFO *bmp = (BITMAPINFO*)unpackData(getToken(info, '\n').c_str()); + void *bits = unpackData(getToken(info, '\n').c_str()); + HDC hDC = CreateCompatibleDC(NULL); + HBITMAP hRes = CreateBitmap(bmp->bmiHeader.biWidth, bmp->bmiHeader.biHeight, bmp->bmiHeader.biPlanes, bmp->bmiHeader.biBitCount, NULL); + SetDIBits(hDC, hRes, 0, bmp->bmiHeader.biHeight, bits, bmp, DIB_RGB_COLORS); + DeleteDC(hDC); + free(bmp); + free(bits); + return hRes; +} + +HICON CSIM_ext::createIcon(const char *name) +{ + ICON_MAP::iterator it = m_icons.find(name); + if (it != m_icons.end()) + return (*it).second; + string cmd = "ICON "; + cmd += name; + CComBSTR in(cmd.c_str()); + CComBSTR out; + if (!ProcessStr || !ProcessStr(in, &out)) + return NULL; + size_t size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), 0, 0, NULL, NULL); + char *res = new char[size + 1]; + size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), res, size, NULL, NULL); + res[size] = 0; + if (res[0] != '>') + return NULL; + string r = res + 1; + ICONINFO info; + info.fIcon = TRUE; + info.xHotspot = 8; + info.yHotspot = 8; + info.hbmMask = createBitmap(r); + info.hbmColor = createBitmap(r); + HICON hIcon = CreateIconIndirect(&info); + m_icons.insert(ICON_MAP::value_type(name, hIcon)); + DeleteObject(info.hbmMask); + DeleteObject(info.hbmColor); + return hIcon; +} + +#ifndef CF_HDROP +#define CF_HDROP 15 +#endif + +HRESULT CSIM_ext::InvokeCommand(LPCMINVOKECOMMANDINFO lpici) +{ + if (lpData == NULL) + return S_OK; + STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL }; + FORMATETC formatetc = { CF_HDROP, + NULL, + DVASPECT_CONTENT, + -1, + TYMED_HGLOBAL + }; + HRESULT hr = lpData->GetData(&formatetc, &stgmedium); + if (SUCCEEDED(hr)){ + char *drop_files = (char*)GlobalLock(stgmedium.hGlobal); + DROPFILES *files = (DROPFILES*)drop_files; + drop_files += files->pFiles; + CComBSTR in("SENDFILE \""); + if (files->fWide){ + in += CComBSTR(drop_files); + }else{ + in += drop_files; + } + in += "\" "; + ItemInfo info = getItemInfo(LOWORD(lpici->lpVerb) + CmdBase); + char b[12]; + sprintf(b, "%u", info.id); + in += b; + GlobalUnlock(stgmedium.hGlobal); + CComBSTR out; + if (ProcessStr) + ProcessStr(in, &out); + } + GlobalFree(stgmedium.hGlobal); + if (lpData){ + lpData->Release(); + lpData = NULL; + } + return S_OK; +} + +HRESULT CSIM_ext::HandleMenuMsg(UINT uMsg,WPARAM wParam, LPARAM lParam) +{ + return HandleMenuMsg2(uMsg, wParam, lParam, NULL); +} + +HRESULT CSIM_ext::HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) +{ + switch(uMsg) + { + case WM_DRAWITEM: + DrawMenuItem((LPDRAWITEMSTRUCT) lParam); + break; + + case WM_MEASUREITEM: + MeasureItem((LPMEASUREITEMSTRUCT) lParam); + break; + } + + return S_OK; +} + + +HRESULT CSIM_ext::GetCommandString(UINT idCmd, + UINT uType, + UINT * pwReserved, + LPSTR pszName, + UINT cchMax) +{ + return S_OK; +} + +HRESULT CSIM_ext::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT lpdobj, HKEY hkeyProgID) +{ + if (lpData) + lpData->Release(); + lpData = lpdobj; + lpData->AddRef(); + return S_OK; +} + +ItemInfo CSIM_ext::getItemInfo(unsigned id) +{ + ITEM_MAP::iterator it = m_items.find(id); + if (it != m_items.end()) + return (*it).second; + ItemInfo info; + info.icon = NULL; + return info; +} + +void CSIM_ext::MeasureItem(LPMEASUREITEMSTRUCT lpmis) +{ + if (lpmis->CtlType != ODT_MENU) + return; + ItemInfo info = getItemInfo(lpmis->itemID); + if (info.icon == NULL) + return; + HDC hDC = CreateCompatibleDC(NULL); + SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); + SIZE s; + GetTextExtentPoint32A(hDC, info.text.c_str(), info.text.length(), &s); + lpmis->itemWidth = s.cx + GetSystemMetrics(SM_CXMENUCHECK) + GetSystemMetrics(SM_CXFRAME) * 2; + lpmis->itemHeight = GetSystemMetrics(SM_CYMENU); + DeleteDC(hDC); +} + +void CSIM_ext::DrawMenuItem(LPDRAWITEMSTRUCT lpdis) +{ + if (lpdis->CtlType != ODT_MENU) + return; + ItemInfo info = getItemInfo(lpdis->itemID); + if (info.icon == NULL) + return; + if (lpdis->itemAction & (ODA_DRAWENTIRE|ODA_SELECT)){ + COLORREF crText = 0, crBack = 0; + int bgColor; + if (lpdis->itemState & ODS_SELECTED) + { + bgColor = COLOR_HIGHLIGHT; + crText = SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); + crBack = SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)); + }else{ + bgColor = COLOR_MENU; + } + FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(bgColor)); + ICONINFO icon_info; + GetIconInfo(info.icon, &icon_info); + BITMAP bmp; + GetObject(icon_info.hbmColor, sizeof(BITMAP), (LPSTR)&bmp); + DrawIconEx(lpdis->hDC, + lpdis->rcItem.left + (GetSystemMetrics(SM_CXMENUCHECK) - bmp.bmWidth) / 2, + lpdis->rcItem.top + (lpdis->rcItem.bottom - lpdis->rcItem.top - bmp.bmHeight) / 2, + info.icon, bmp.bmWidth, bmp.bmHeight, 0, 0, DI_NORMAL); + RECT rt = lpdis->rcItem; + rt.left += GetSystemMetrics(SM_CXMENUCHECK) + GetSystemMetrics(SM_CXFRAME); + DrawTextA(lpdis->hDC, info.text.c_str(), info.text.length(), &rt, DT_LEFT | DT_EXPANDTABS | DT_VCENTER | DT_SINGLELINE); + if (lpdis->itemState & ODS_SELECTED) + { + SetTextColor(lpdis->hDC, crText); + SetBkColor(lpdis->hDC, crBack); + } + } +} + diff --git a/plugins/remote/SIM_ext.h b/plugins/remote/SIM_ext.h new file mode 100644 index 0000000..db90ed5 --- /dev/null +++ b/plugins/remote/SIM_ext.h @@ -0,0 +1,129 @@ +// SIM_ext.h : Declaration of the CSIM_ext + +#ifndef __SIM_EXT_H_ +#define __SIM_EXT_H_ + +#include "resource.h" // main symbols +#include "comdef.h" +#include "shlobj.h" +#include "IShellExtInitImpl.h" // IShellExtInit +#include "IContextMenuImpl.h" // IContextMenu +#include +#include +#include + +#if _MSC_VER > 1020 +#include +#pragma warning(disable: 4097) +#pragma warning(disable: 4244) +#pragma warning(disable: 4275) +#pragma warning(disable: 4514) +#pragma warning(disable: 4710) +#pragma warning(disable: 4786) +#pragma warning(push) +#pragma warning(disable: 4018) +#pragma warning(disable: 4100) +#pragma warning(disable: 4146) +#pragma warning(disable: 4511) +#pragma warning(disable: 4512) +#pragma warning(disable: 4530) +#pragma warning(disable: 4663) +#endif + +#include +#include +#include + +struct ItemInfo +{ + std::string text; + HICON icon; + unsigned id; +}; + +typedef std::map ICON_MAP; +typedef std::map ITEM_MAP; + +struct __declspec(uuid("000214e4-0000-0000-c000-000000000047")) +IContextMenu; + +_COM_SMARTPTR_TYPEDEF(IContextMenu, __uuidof(IContextMenu)); + +struct __declspec(uuid("000214e4-0000-0000-c000-000000000048")) +IContextMenu2; + +_COM_SMARTPTR_TYPEDEF(IContextMenu2, __uuidof(IContextMenu2)); + +struct __declspec(uuid("000214e4-0000-0000-c000-000000000049")) +IContextMenu3; + +_COM_SMARTPTR_TYPEDEF(IContextMenu3, __uuidof(IContextMenu3)); + +///////////////////////////////////////////////////////////////////////////// +// CSIM_ext +class ATL_NO_VTABLE CSIM_ext : + public CComObjectRootEx, + public CComCoClass, + public ISIM_ext, + public IObjectWithSiteImpl, + public IShellExtInitImpl, + public IContextMenuImpl +{ +public: + CSIM_ext(); + ~CSIM_ext(); + LPDATAOBJECT lpData; + static HINSTANCE hInstance; + + DECLARE_REGISTRY_RESOURCEID(IDR_SIM_EXT) + DECLARE_NOT_AGGREGATABLE(CSIM_ext) + + DECLARE_PROTECT_FINAL_CONSTRUCT() + + BEGIN_COM_MAP(CSIM_ext) + COM_INTERFACE_ENTRY(ISIM_ext) + COM_INTERFACE_ENTRY(IShellExtInit) + COM_INTERFACE_ENTRY(IContextMenu) + COM_INTERFACE_ENTRY(IContextMenu2) + COM_INTERFACE_ENTRY(IContextMenu3) + COM_INTERFACE_ENTRY(IObjectWithSite) + END_COM_MAP() + + ICON_MAP m_icons; + ITEM_MAP m_items; + ItemInfo getItemInfo(unsigned id); + HICON createIcon(const char *name); + HBITMAP createBitmap(std::string &info); + unsigned CmdBase; + + // ISIM_ext +public: + STDMETHOD(QueryContextMenu)(THIS_ + HMENU hmenu, + UINT indexMenu, + UINT idCmdFirst, + UINT idCmdLast, + UINT uFlags); + + STDMETHOD(InvokeCommand)(THIS_ + LPCMINVOKECOMMANDINFO lpici); + + STDMETHOD(HandleMenuMsg)(UINT, WPARAM, LPARAM); + + STDMETHOD(HandleMenuMsg2)(UINT, WPARAM, LPARAM, LRESULT *); + + STDMETHOD(GetCommandString)(THIS_ + UINT idCmd, + UINT uType, + UINT * pwReserved, + LPSTR pszName, + UINT cchMax); + + STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST pidlFolder, + LPDATAOBJECT lpdobj, HKEY hkeyProgID); +private: + void MeasureItem(LPMEASUREITEMSTRUCT); + void DrawMenuItem(LPDRAWITEMSTRUCT); +}; + +#endif //__SIM_EXT_H_ diff --git a/plugins/remote/SIM_ext.rgs b/plugins/remote/SIM_ext.rgs new file mode 100644 index 0000000..c8d0eed --- /dev/null +++ b/plugins/remote/SIM_ext.rgs @@ -0,0 +1,45 @@ +HKCR +{ + Simext.SIM_ext.1 = s 'SIM_ext Class' + { + CLSID = s '{8DD848D4-81E7-490E-9A3D-CE9058956208}' + } + Simext.SIM_ext = s 'SIM_ext Class' + { + CLSID = s '{8DD848D4-81E7-490E-9A3D-CE9058956208}' + CurVer = s 'Simext.SIM_ext.1' + } + NoRemove * + { + NoRemove shellex + { + NoRemove ContextMenuHandlers + { + ForceRemove SIMMenu = s '{8DD848D4-81E7-490E-9A3D-CE9058956208}' + } + } + } + NoRemove Folder + { + NoRemove shellex + { + NoRemove ContextMenuHandlers + { + ForceRemove SIMMenu = s '{8DD848D4-81E7-490E-9A3D-CE9058956208}' + } + } + } + NoRemove CLSID + { + ForceRemove {8DD848D4-81E7-490E-9A3D-CE9058956208} = s 'SIM_ext Class' + { + ProgID = s 'Simext.SIM_ext.1' + VersionIndependentProgID = s 'Simext.SIM_ext' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{F67751E0-1470-447C-8B3E-000D155711A2}' + } + } +} diff --git a/plugins/remote/SimControl.cpp b/plugins/remote/SimControl.cpp new file mode 100644 index 0000000..56a455c --- /dev/null +++ b/plugins/remote/SimControl.cpp @@ -0,0 +1,184 @@ +/*************************************************************************** + SimControl.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +extern CComModule _Module; +#include +#include "Simremote.h" +#include "SimControl.h" + +#include "remote.h" + +using namespace std; + +class IPC +{ +public: + IPC(); + ~IPC(); + string prefix(); + bool isInit(); + bool process(const BSTR &in_str, BSTR *out_str); +protected: + unsigned *s; + HANDLE hMem; + HANDLE hMutex; + HANDLE hEventIn; + HANDLE hEventOut; + friend class IPCLock; +}; + +class IPCLock +{ +public: + IPCLock(IPC *ipc); + ~IPCLock(); +protected: + IPC *m_ipc; +}; + +IPC::IPC() +{ + s = NULL; + string name = prefix() + "mem"; + hMem = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, name.c_str()); + if (hMem) + s = (unsigned*)MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, 0); + if (s) + memset(s, 0, N_SLOTS * sizeof(unsigned)); + name = prefix() + "mutex"; + hMutex = OpenMutexA(MUTEX_ALL_ACCESS, FALSE, name.c_str()); + name = prefix() + "in"; + hEventIn = OpenEventA(EVENT_ALL_ACCESS, FALSE, name.c_str()); + name = prefix() + "out"; + hEventOut = OpenEventA(EVENT_ALL_ACCESS, FALSE, name.c_str()); +} + +IPC::~IPC() +{ + if (s) + UnmapViewOfFile(s); + if (hMem) + CloseHandle(hMem); + if (hMutex) + CloseHandle(hMutex); + if (hEventIn) + CloseHandle(hEventIn); + if (hEventOut) + CloseHandle(hEventOut); +} + +#ifndef SM_REMOTECONTROL +#define SM_REMOTECONTROL 0x2001 +#endif +#ifndef SM_REMOTESESSION +#define SM_REMOTESESSION 0x1000 +#endif + +string IPC::prefix() +{ + string res; + if (GetSystemMetrics(SM_REMOTECONTROL) || GetSystemMetrics(SM_REMOTESESSION)) + res = "Global/"; + res += SIM_SHARED; + return res; +} + +bool IPC::isInit() +{ + return hMem && hMutex && hEventIn && hEventOut; +} + +bool IPC::process(const BSTR &in_str, BSTR *out_str) +{ + unsigned i = 0; + HANDLE hMem = NULL; + unsigned short *mem; + { + IPCLock lock(this); + for (i = 0; i < N_SLOTS; i++){ + if (s[i] != SLOT_NONE) + continue; + string name = prefix(); + char b[5]; + sprintf(b, "%u", i); + name += b; + hMem = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x8000, name.c_str()); + if (hMem == NULL) + return false; + mem = (unsigned short*)MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, 0); + if (mem == NULL) + return false; + memcpy(mem, in_str, (wcslen(in_str) + 1) * 2); + s[i] = SLOT_IN; + break; + } + if (i >= N_SLOTS) + return false; + } + SetEvent(hEventIn); + for (;;){ + WaitForSingleObject(hEventOut, INFINITE); + IPCLock lock(this); + if (s[i] == SLOT_IN) + continue; + if (s[i] == SLOT_OUT){ + CComBSTR res((int)mem); + *out_str = res.Copy(); + } + UnmapViewOfFile(mem); + CloseHandle(hMem); + break; + } + return true; +} + +IPCLock::IPCLock(IPC *ipc) +{ + m_ipc = ipc; + WaitForSingleObject(m_ipc->hMutex, INFINITE); +} + +IPCLock::~IPCLock() +{ + ReleaseMutex(m_ipc->hMutex); +} + +extern "C" __declspec(dllexport) bool ProcessStr(BSTR in_str, BSTR *out_str) +{ + IPC ipc; + if (!ipc.isInit()) + return false; + if (!ipc.process(in_str, out_str)) + return false; + return true; +} + +STDMETHODIMP CSimControl::get_Running(BOOL *pVal) +{ + IPC ipc; + *pVal = ipc.isInit(); + return S_OK; +} + +STDMETHODIMP CSimControl::Process(BSTR in_str, BSTR *out_str) +{ + if (ProcessStr(in_str, out_str)) + return S_OK; + return S_FALSE; +} + diff --git a/plugins/remote/SimControl.h b/plugins/remote/SimControl.h new file mode 100644 index 0000000..6d48c64 --- /dev/null +++ b/plugins/remote/SimControl.h @@ -0,0 +1,35 @@ +// SimControl.h : Declaration of the CSimControl + +#ifndef __SIMCONTROL_H_ +#define __SIMCONTROL_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// CSimControl +class ATL_NO_VTABLE CSimControl : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + CSimControl() + { + } + + DECLARE_REGISTRY_RESOURCEID(IDR_SIMCONTROL) + + DECLARE_PROTECT_FINAL_CONSTRUCT() + + BEGIN_COM_MAP(CSimControl) + COM_INTERFACE_ENTRY(ISimControl) + COM_INTERFACE_ENTRY(IDispatch) + END_COM_MAP() + + // ISimControl +public: + STDMETHOD(Process)(/*[in]*/ BSTR in_str, /*[out, retval]*/ BSTR *out_str); + STDMETHOD(get_Running)(/*[out, retval]*/ BOOL *pVal); +}; + +#endif //__SIMCONTROL_H_ diff --git a/plugins/remote/SimControl.rgs b/plugins/remote/SimControl.rgs new file mode 100644 index 0000000..c8e149c --- /dev/null +++ b/plugins/remote/SimControl.rgs @@ -0,0 +1,26 @@ +HKCR +{ + Simremote.SimControl.1 = s 'SimControl Class' + { + CLSID = s '{0B4C5D94-61D9-41C6-AD05-4750A0E86C2E}' + } + Simremote.SimControl = s 'SimControl Class' + { + CLSID = s '{0B4C5D94-61D9-41C6-AD05-4750A0E86C2E}' + CurVer = s 'Simremote.SimControl.1' + } + NoRemove CLSID + { + ForceRemove {0B4C5D94-61D9-41C6-AD05-4750A0E86C2E} = s 'SimControl Class' + { + ProgID = s 'Simremote.SimControl.1' + VersionIndependentProgID = s 'Simremote.SimControl' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{C4826912-0E46-445E-8B03-9683AAF5143F}' + } + } +} diff --git a/plugins/remote/configure.in.in b/plugins/remote/configure.in.in new file mode 100644 index 0000000..7fd49fc --- /dev/null +++ b/plugins/remote/configure.in.in @@ -0,0 +1 @@ +AM_CONDITIONAL(ENABLE_REMOTE, test "$kde_use_qt_win" != "yes") diff --git a/plugins/remote/remote.cpp b/plugins/remote/remote.cpp new file mode 100644 index 0000000..9593401 --- /dev/null +++ b/plugins/remote/remote.cpp @@ -0,0 +1,1080 @@ +/*************************************************************************** + remote.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "icons.h" +#include "log.h" + +#include "profile.h" +#include "profilemanager.h" + +#include "socket/clientsocket.h" +#include "contacts/contact.h" +#include "contacts/group.h" +#include "contacts/client.h" +#include "remote.h" +#include "remotecfg.h" +#include "core.h" + +using namespace std; +using namespace SIM; + +Plugin *createRemotePlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new RemotePlugin(base, config); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Remote control"), + I18N_NOOP("Plugin provides remote control"), + VERSION, + createRemotePlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +//static DataDef remoteData[] = +// { +//#ifdef WIN32 +// { "Path", DATA_STRING, 1, "auto:" }, +// { "EnableMenu", DATA_BOOL, 1, DATA(1) }, +//#else +// { "Path", DATA_STRING, 1, "/tmp/sim.%user%" }, +//#endif +// { NULL, DATA_UNKNOWN, 0, 0 } +// }; + +#ifdef WIN32 + +#include + +static RemotePlugin *remote = NULL; + +class IPC : public QThread +{ +public: + IPC(); + ~IPC(); + QString prefix(); + void process(); +protected: + unsigned *s; + Qt::HANDLE hMem; + Qt::HANDLE hMutex; + Qt::HANDLE hEventIn; + Qt::HANDLE hEventOut; + bool bExit; + virtual void run(); + friend class IPCLock; +}; + +class IPCLock +{ +public: + IPCLock(IPC *ipc); + ~IPCLock(); +protected: + IPC *m_ipc; +}; + +IPC::IPC() +{ + s = NULL; + QString name = prefix() + "mem"; + hMem = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, N_SLOTS * sizeof(unsigned), name.toLatin1()); + if (hMem) + s = (unsigned*)MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, 0); + if (s) + memset(s, 0, N_SLOTS * sizeof(unsigned)); + name = prefix() + "mutex"; + hMutex = CreateMutexA(NULL, FALSE, name.toLatin1()); + name = prefix() + "in"; + hEventIn = CreateEventA(NULL, TRUE, FALSE, name.toLatin1()); + name = prefix() + "out"; + hEventOut = CreateEventA(NULL, TRUE, FALSE, name.toLatin1()); + bExit = false; + start(); +} + +IPC::~IPC() +{ + bExit = true; + SetEvent(hEventIn); + if (s) + UnmapViewOfFile(s); + if (hMem) + CloseHandle(hMem); + if (hMutex) + CloseHandle(hMutex); + if (hEventIn) + CloseHandle(hEventIn); + if (hEventOut) + CloseHandle(hEventOut); + wait(2000); +} + +void IPC::run() +{ + for (;;){ + ResetEvent(hEventIn); + WaitForSingleObject(hEventIn, INFINITE); + if (bExit) + break; + QTimer::singleShot(0, remote, SLOT(command())); + } +} + +void IPC::process() +{ + IPCLock(this); + for (unsigned i = 0; i < N_SLOTS; i++){ + if (s[i] != SLOT_IN) + continue; + QString in; + QString out; + QString name = prefix() + QString::number(i); + Qt::HANDLE hMem = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, name.toLatin1()); + if (hMem == NULL){ + s[i] = SLOT_NONE; + PulseEvent(hEventOut); + continue; + } + unsigned short *mem = (unsigned short*)MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, 0); + if (mem == NULL){ + log(L_WARN, "Map error"); + s[i] = SLOT_NONE; + PulseEvent(hEventOut); + continue; + } + unsigned short *p; + for (p = mem; *p; p++) + in += QChar(*p); + + bool bError = false; + bool bRes = remote->command(in, out, bError); + p = mem; + unsigned size = 0; + if (!bError){ + if (bRes){ + *(p++) = QChar('>').unicode(); + }else{ + *(p++) = QChar('?').unicode(); + } + size = out.length(); + if (size > 0x3F00) + size = 0x3F00; + memcpy(p, out.unicode(), size * sizeof(unsigned short)); + size++; + } + p[size] = 0; + UnmapViewOfFile(mem); + CloseHandle(hMem); + s[i] = SLOT_OUT; + PulseEvent(hEventOut); + } +} + +#ifndef SM_REMOTECONTROL +#define SM_REMOTECONTROL 0x2001 +#endif +#ifndef SM_REMOTESESSION +#define SM_REMOTESESSION 0x1000 +#endif + +QString IPC::prefix() +{ + QString res; + if (GetSystemMetrics(SM_REMOTECONTROL) || GetSystemMetrics(SM_REMOTESESSION)) + res = "Global/"; + res += SIM_SHARED; + return res; +} + +IPCLock::IPCLock(IPC *ipc) +{ + m_ipc = ipc; + WaitForSingleObject(m_ipc->hMutex, INFINITE); +} + +IPCLock::~IPCLock() +{ + ReleaseMutex(m_ipc->hMutex); +} + +#endif + +RemotePlugin::RemotePlugin() + : Plugin(NULL) +{ +} + +RemotePlugin::RemotePlugin(unsigned base, Buffer *config) + : QObject(), Plugin(base) +{ + m_propertyHub = SIM::PropertyHub::create("remote"); + bind(); +#ifdef WIN32 + remote = this; + ipc = new IPC; +#endif +} + +RemotePlugin::~RemotePlugin() +{ +#ifdef WIN32 + delete ipc; +#endif + while (!m_sockets.empty()) + delete m_sockets.front(); +} + +QByteArray RemotePlugin::getConfig() +{ + return QByteArray(); //Fixmeee +} + +QWidget *RemotePlugin::createConfigWindow(QWidget *parent) +{ + return new RemoteConfig(parent, this); +} + +bool RemotePlugin::processEvent(Event* e) +{ + if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("remote"); + if(!hub.isNull()) + setPropertyHub(hub); + } + return false; +} + +static char TCP[] = "tcp:"; + +void RemotePlugin::bind() +{ + QString path = value("Path").toString(); + if (path.startsWith(TCP)){ + unsigned short port = path.mid(strlen(TCP)).toUShort(); + ServerSocketNotify::bind(port, port, NULL); +// ToDo: Restore this +//#ifndef WIN32 +// }else{ +// ServerSocketNotify::bind(path.toLatin1()); +//#endif + } +} + +bool RemotePlugin::accept(Socket *s, unsigned long) +{ + log(L_DEBUG, "Accept remote control"); + new ControlSocket(this, s); + return false; +} + +void RemotePlugin::bind_ready(unsigned short) +{ +} + +bool RemotePlugin::error(const QString &err) +{ + if (!err.isEmpty()) + log(L_DEBUG, "Remote: %s", qPrintable(err)); + return true; +} + +void RemotePlugin::command() +{ +#ifdef WIN32 + ipc->process(); +#endif +} + +const unsigned CMD_STATUS = 0; +const unsigned CMD_INVISIBLE = 1; +const unsigned CMD_MAINWND = 2; +const unsigned CMD_SEARCHWND = 3; +const unsigned CMD_QUIT = 4; +const unsigned CMD_CLOSE = 5; +const unsigned CMD_HELP = 6; +const unsigned CMD_ADD = 7; +const unsigned CMD_DELETE = 8; +const unsigned CMD_OPEN = 9; +const unsigned CMD_FILE = 10; +const unsigned CMD_CONTACTS = 11; +const unsigned CMD_SENDFILE = 12; +const unsigned CMD_GROUP = 13; +const unsigned CMD_SHOW = 14; +const unsigned CMD_SMS = 15; +#ifdef WIN32 +const unsigned CMD_ICON = 16; +#endif + +struct cmdDef +{ + const char *cmd; + const char *shortDescr; + const char *longDescr; + unsigned minArgs; + unsigned maxArgs; +}; + +static cmdDef cmds[] = + { + { "STATUS", "set status", "STATUS [status]", 0, 1 }, + { "INVISIBLE", "set invisible mode", "INVISIBLE [on|off]", 0, 1 }, + { "MAINWINDOW", "show/hide main window", "MAINWINDOW [on|off|toggle]", 0, 1 }, + { "SEARCHWINDOW", "show/hide search window", "SEARCHWINDOW [on|off]", 0, 1 }, + { "QUIT", "quit SIM", "QUIT", 0, 0 }, + { "CLOSE", "close session", "CLOSE", 0, 0 }, + { "HELP", "command help information", "HELP []", 0, 1 }, + { "ADD", "add contact", "ADD
    [] []", 2, 4 }, + { "DELETE", "delete contact", "DELETE [
    | ]", 1, 1 }, + { "OPEN", "open contact", "OPEN
    [] []", 2, 4 }, + { "FILE", "process UIN file", "FILE ", 1, 1 }, + { "CONTACTS", "print contact list", "CONTACTS []", 0, 1 }, + { "SENDFILE", "send file", "SENDFILE ", 2, 2 }, + { "GROUP", "get group name", "GROUP id", 1, 1 }, + { "SHOW", "open unread message", "SHOW", 0, 0 }, + { "SMS", "send SMS", "SMS ", 2, 2 }, +#ifdef WIN32 + { "ICON", "get used icon", "ICON name", 1, 1 }, +#endif + { NULL, NULL, NULL, 0, 0 } + }; + +#if 0 +{ "MESSAGE", "send message", "MESSAGE ", 2, 2 }, +{ "SMS", "send SMS", "SMS ", 2, 2 }, +{ "DOCK", "show/hide dock", "DOCK [on|off]", 0, 1 }, +{ "NOTIFY", "set notify mode", "NOTIFY [on|off]", 0, 1 }, +{ "ICON", "get icon in xpm format", "ICON nIcon", 1, 1 }, +{ "POPUP", "show popup", "POPUP x y", 2, 2 }, +#endif + +static bool isOn(const QString &s) +{ + return (s == "1") || (s == "on") || (s == "ON"); +} + +static bool cmpStatus(const QString &s1, const QString &s2) +{ + QString ss1 = s1; + QString ss2 = s2; + ss1 = ss1.remove('&'); + ss2 = ss2.remove('&'); + return ss1.toLower() == ss2.toLower(); +} + +static QWidget *findWidget(const char *className) +{ + QWidgetList list = QApplication::topLevelWidgets(); + QWidget* w; + foreach (w,list) + { + if (w->inherits(className)) + return w; + } + return NULL; +} + +struct ContactInfo +{ + QString name; + unsigned id; + unsigned group; + QString key; + QString icon; +}; + +static bool cmp_info(const ContactInfo &p1, const ContactInfo &p2) +{ + return p1.key < p2.key; +} + +#ifdef WIN32 + +void packData(QString &out, void *data, unsigned size) +{ + unsigned char *p = (unsigned char*)data; + for (unsigned i = 0; i < size; i++, p++){ + char b[3]; + sprintf(b, "%02X", *p); + out += b; + } +} + +void packBitmap(QString &out, HBITMAP hBmp) +{ + BITMAP bmp; + BITMAPINFO *pbmi; + WORD cClrBits; + if (!GetObjectA(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) + return; + + cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); + if (cClrBits == 1) + cClrBits = 1; + else if (cClrBits <= 4) + cClrBits = 4; + else if (cClrBits <= 8) + cClrBits = 8; + else if (cClrBits <= 16) + cClrBits = 16; + else if (cClrBits <= 24) + cClrBits = 24; + else cClrBits = 32; + + unsigned size = sizeof(BITMAPINFOHEADER); + if (cClrBits != 24) + size += sizeof(RGBQUAD) * (1<< cClrBits); + pbmi = (BITMAPINFO*)malloc(size); + + pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + pbmi->bmiHeader.biWidth = bmp.bmWidth; + pbmi->bmiHeader.biHeight = bmp.bmHeight; + pbmi->bmiHeader.biPlanes = bmp.bmPlanes; + pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; + if (cClrBits < 24) + pbmi->bmiHeader.biClrUsed = (1<bmiHeader.biCompression = BI_RGB; + pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8 + * pbmi->bmiHeader.biHeight; + + HDC hDC = CreateCompatibleDC(NULL); + void *bits = malloc(pbmi->bmiHeader.biSizeImage); + GetDIBits(hDC, hBmp, 0, (WORD) pbmi->bmiHeader.biHeight, bits, pbmi, DIB_RGB_COLORS); + + packData(out, pbmi, size); + out += "\n"; + packData(out, bits, pbmi->bmiHeader.biSizeImage); + + DeleteDC(hDC); + free(bits); + free(pbmi); +} + +class IconWidget : public QWidget +{ +public: + IconWidget(const QPixmap &p); + HICON icon(); +}; + +IconWidget::IconWidget(const QPixmap &p) +{ + setWindowIcon(p); +} + +HICON IconWidget::icon() +{ + HWND hWnd = (HWND)effectiveWinId(); + if(NULL == hWnd) + return NULL; + return (HICON)::SendMessage( hWnd, WM_GETICON, ICON_SMALL, 0 ); +} + +#endif + +bool RemotePlugin::command(const QString &in, QString &out, bool &bError) +{ + QString cmd; + vector args; + int i = 0; + for (; i < (int)(in.length()); i++) + if (in[i] != ' ') + break; + for (; i < (int)(in.length()); i++){ + if (in[i] == ' ') + break; + cmd += in[i].toUpper(); + } + for (; i < (int)(in.length()); ){ + for (; i < (int)(in.length()); i++) + if (in[i] != ' ') + break; + if (i >= (int)(in.length())) + break; + QString arg; + if ((in[i] == '\'') || (in[i] == '\"')){ + QChar c = in[i]; + for (i++; i < (int)(in.length()); i++){ + if (in[i] == c){ + i++; + break; + } + arg += in[i]; + } + }else{ + for (; i < (int)(in.length()); i++){ + if (in[i] == '\\'){ + i++; + if (i >= (int)(in.length())) + break; + arg += in[i]; + continue; + } + if (in[i] == ' ') + break; + arg += in[i]; + } + } + args.push_back(arg); + } + unsigned nCmd = 0; + const cmdDef *c; + for (c = cmds; c->cmd; c++, nCmd++) + if (QString(cmd) == QString(c->cmd)) + break; + + if (c->cmd == NULL){ + out = "Unknown command "; + out += cmd; + return false; + } + if ((args.size() < c->minArgs) || (args.size() > c->maxArgs)){ + out = "Bad arguments number. Try help "; + out += cmd; + return false; + } + QWidget *w; + unsigned n; + CorePlugin *core = GET_CorePlugin(); + switch (nCmd){ +#ifdef WIN32 + case CMD_ICON:{ + IconWidget w(Pict(args[0].toUtf8())); + HICON icon = w.icon(); + ICONINFO info; + if (!GetIconInfo(icon, &info)) + return false; + packBitmap(out, info.hbmMask); + out += "\n"; + packBitmap(out, info.hbmColor); + return true; + } +#endif + case CMD_SENDFILE:{ //fix me, concepted only for ICQ-Proto + FileMessage *msg = new FileMessage; + msg->setContact(args[1].toUInt()); //anyhow + msg->setFile(args[0]); //this should + EventOpenMessage(msg).process(); //be tested, or be rewritten + delete msg; + return true; + } + case CMD_GROUP:{ + Group *grp = getContacts()->group(args[0].toUInt()); + if (grp == NULL) + return false; + if (grp->id() == 0){ + out += i18n("Not in list"); + }else{ + out += grp->getName(); + } + return true; + } + case CMD_CONTACTS:{ +#ifdef WIN32 + if (value("EnableMenu").toBool()){ +#endif + unsigned type = 0; + if (args.size()) + type = args[0].toUInt(); + ContactList::ContactIterator it; + Contact *contact; + vector contacts; + list groups; + while ((contact = ++it) != NULL){ + if ((contact->getFlags() & CONTACT_TEMPORARY) || contact->getIgnore()) + continue; + if (type){ + Command cmd; + cmd->id = type; + cmd->menu_id = MenuMessage; + cmd->param = (void*)(contact->id()); + if (!EventCheckCommandState(cmd).process()) + continue; + } + unsigned style = 0; + QString statusIcon; + unsigned status = contact->contactInfo(style, statusIcon); + if ((status == STATUS_OFFLINE) && core->value("ShowOnLine").toBool()) + continue; + unsigned mode = core->value("SortMode").toUInt(); + ContactInfo info; + QString active; + active.sprintf("%08lX", (long unsigned int)(0xFFFFFFFF - contact->getLastActive())); + if (core->value("GroupMode").toUInt()){ + unsigned index = 0xFFFFFFFF; + if (contact->getGroup()){ + Group *grp = getContacts()->group(contact->getGroup()); + if (grp) + index = getContacts()->groupIndex(grp->id()); + } + QString grpIndex; + grpIndex.sprintf("%08X", index); + info.key += grpIndex; + } + for (;;){ + if ((mode & 0xFF) == 0) + break; + switch (mode & 0xFF){ + case SORT_STATUS: + info.key += QString::number(9 - status); + break; + case SORT_ACTIVE: + info.key += active.toLower(); + break; + case SORT_NAME: + info.key += contact->getName().toLower(); + break; + } + mode = mode >> 8; + } + info.name = contact->getName(); + info.id = contact->id(); + info.icon = statusIcon; + info.group = contact->getGroup(); + if (core->value("GroupMode").toUInt()){ + info.group = contact->getGroup(); + list::iterator it; + for (it = groups.begin(); it != groups.end(); ++it) + if ((*it) == (unsigned)contact->getGroup()) + break; + groups.push_back(contact->getGroup()); + } + contacts.push_back(info); + } + sort(contacts.begin(), contacts.end(), cmp_info); + out += QString::number(contacts.size()); + out += " "; + out += QString::number(groups.size()); + out += "\n"; + for (vector::iterator itl = contacts.begin(); itl != contacts.end(); ++itl){ + out += "\n"; + out += QString::number((*itl).id); + out += " "; + out += QString::number((*itl).group); + out += " "; + out += (*itl).icon; + out += " "; + out += (*itl).name; + } +#ifdef WIN32 + } +#endif + return true; + } + case CMD_FILE:{ + QFile f(args[0]); + if (!f.open(QIODevice::ReadOnly)){ + out = "Can't open "; + out += args[0]; + return false; + } + bool bOpen = false; + unsigned uin = 0; + Buffer sf; + sf = f.readAll(); + while (sf.readPos() < (unsigned)sf.size()){ + QByteArray line; + sf.scan("\n", line); + if (!line.isEmpty() && (line[(int)line.length() - 1] == '\r')) + line = line.left(line.length() - 1); + if (line == "[ICQ Message User]") + bOpen = true; + if (line.left(4) == "UIN=") + uin = line.mid(4).toUInt(); + } + if (uin == 0){ + out = "Bad file "; + out += args[0]; + return false; + } + EventAddContact::AddContact ac; + ac.proto = "ICQ"; + ac.addr = QString::number(uin); + ac.nick = QString::null; + ac.group = 0; + EventAddContact e(&ac); + e.process(); + Contact *contact = e.contact(); + if (contact == NULL){ + out = "Can't add user"; + return false; + } + if (bOpen){ + Message *m = new Message(MessageGeneric); + m->setContact(contact->id()); + EventOpenMessage(m).process(); + delete m; + } + return true; + } + case CMD_STATUS: + if (args.size()){ + unsigned status = STATUS_UNKNOWN; + for (n = 0; n < getContacts()->nClients(); n++){ + Client *client = getContacts()->getClient(n); + for (const CommandDef *d = client->protocol()->statusList(); !d->text.isEmpty(); d++){ + if (cmpStatus(d->text, args[0])){ + status = d->id; + break; + } + } + if (status != STATUS_UNKNOWN) + break; + } + if (status == STATUS_UNKNOWN){ + out = "Unknown status "; + out += args[0]; + return false; + } + for (n = 0; n < getContacts()->nClients(); n++){ + Client *client = getContacts()->getClient(n); + if (client->getCommonStatus()) + client->setStatus(status, true); + } + if (core->getManualStatus() == status) + return true; + //core->data.ManualStatus.asULong() = status; + core->setValue("ManualStatus", (unsigned int)status); + core->setValue("StatusTime", (unsigned int)time(NULL)); + EventClientStatus().process(); + return true; + } + for (n = 0; n < getContacts()->nClients(); n++){ + Client *client = getContacts()->getClient(n); + if (client->getCommonStatus()){ + const CommandDef *d = NULL; + for (d = client->protocol()->statusList(); !d->text.isEmpty(); d++){ + if (d->id == core->getManualStatus()) + break; + } + if (d){ + out = "STATUS "; + QString tmp = d->text; + tmp = tmp.remove('&'); + out += tmp; + break; + } + } + } + return true; + + case CMD_INVISIBLE: + if (args.size()){ + bool bInvisible = isOn(args[0]); + if (core->value("Invisible").toBool() != bInvisible){ + core->setValue("Invisible", bInvisible); + for (unsigned i = 0; i < getContacts()->nClients(); i++) + getContacts()->getClient(i)->setInvisible(bInvisible); + } + }else{ + out = "INVISIBLE "; + out += core->value("Invisible").toBool() ? "on" : "off"; + } + return true; + case CMD_MAINWND: + w = findWidget("MainWindow"); + if (args.size()){ + if (args[0].toLower() == "toggle"){ + if (w){ + if (w->isVisible()){ + w->hide(); + }else{ + w->show(); + } + } + }else if (isOn(args[0])){ + if (w) + raiseWindow(w); + }else{ + if (w) + w->hide(); + } + }else{ + out += "MAINWINDOW "; + out += (w ? "on" : "off"); + } + return true; + case CMD_SEARCHWND: + w = findWidget("SearchDialog"); + if (args.size()){ + if (isOn(args[0])){ + if (w){ + raiseWindow(w); + }else{ + Command cc; + cc->id = CmdSearch; + EventCommandExec(cc).process(); + } + }else{ + if (w) + w->close(); + } + }else{ + out = "SEARCHWINDOW "; + out += (w ? "on" : "off"); + } + return true; + case CMD_QUIT:{ + Command cc; + cc->id = CmdQuit; + EventCommandExec(cc).process(); + break; + } + case CMD_CLOSE: + bError = true; + return false; + case CMD_OPEN: + case CMD_ADD:{ + Group *grp = NULL; + bool bNewGrp = false; + if (args.size() > 3){ + ContactList::GroupIterator it; + while ((grp = ++it) != NULL){ + if (grp->getName() == args[3]) + break; + } + if (grp == NULL){ + grp = getContacts()->group(0, true); + grp->setName(args[3]); + bNewGrp = true; + } + } + EventAddContact::AddContact ac; + ac.proto = args[0]; + ac.addr = args[1]; + if (args.size() > 2) + ac.nick = args[2]; + ac.group = grp ? grp->id() : 0; + EventAddContact e(&ac); + e.process(); + Contact *contact = e.contact(); + if (contact){ + if (bNewGrp){ + EventGroup e(grp, EventGroup::eChanged); + e.process(); + } + if (nCmd == CMD_OPEN){ + Message *m = new Message(MessageGeneric); + m->setContact(contact->id()); + EventOpenMessage(m).process(); + delete m; + } + return true; + } + if (bNewGrp) + delete grp; + out += "Can't create "; + out += args[1]; + return false; + } + case CMD_DELETE:{ + ContactList::ContactIterator it; + Contact *contact; + while ((contact = ++it) != NULL){ + if (contact->getName() == args[0]){ + delete contact; + return true; + } + } + EventDeleteContact e(args[0]); + if (e.process()) + return true; + out = "Contact "; + out += args[0]; + out += " not found"; + return false; + } + case CMD_SHOW:{ + Command cmd; + if (core->unread.size()) + cmd->id = CmdUnread; + else + return false; + EventCommandExec(cmd).process(); + return true; + } + case CMD_SMS:{ + SMSMessage *m = new SMSMessage; + m->setPhone(args[0]); + m->setText(args[1]); + unsigned i; + for (i = 0; i < getContacts()->nClients(); i++){ + Client *client = getContacts()->getClient(i); + if (client->send(m, NULL)) + return true; + } + return false; + } + case CMD_HELP: + if (args.size() == 0){ + for (c = cmds; c->cmd; c++){ + out += c->cmd; + out += "\t"; + out += c->shortDescr; + out += "\r\n"; + } + }else{ + args[0] = args[0].toUpper(); + for (c = cmds; c->cmd; c++) + if (args[0] == c->cmd) + break; + if (c->cmd == NULL){ + out = "Unknown command "; + out += args[0]; + return false; + } + out = c->cmd; + out += "\t"; + out += c->shortDescr; + out += "\r\n"; //Fixme WIN32 + out += c->longDescr; + } + return true; + } + return false; +} + +void RemotePlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr RemotePlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant RemotePlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void RemotePlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} + +static char Prompt[] = "\r\n>"; + +ControlSocket::ControlSocket(RemotePlugin *plugin, Socket *socket) +{ + m_plugin = plugin; + m_plugin->m_sockets.push_back(this); + m_socket = new ClientSocket(this); + m_socket->setSocket(socket); + m_socket->setRaw(true); + m_socket->readBuffer().init(0); + m_socket->readBuffer().packetStart(); + write(Prompt); +} + +ControlSocket::~ControlSocket() +{ + for (list::iterator it = m_plugin->m_sockets.begin(); it != m_plugin->m_sockets.end(); ++it){ + if ((*it) == this){ + m_plugin->m_sockets.erase(it); + break; + } + } + delete m_socket; +} + +void ControlSocket::write(const char *msg) +{ + log(L_DEBUG, "Remote write %s", msg); + m_socket->writeBuffer().packetStart(); + m_socket->writeBuffer().pack(msg, strlen(msg)); + m_socket->write(); +} + +bool ControlSocket::error_state(const QString &err, unsigned) +{ + if (!err.isEmpty()) + log(L_WARN, "ControlSocket error %s", qPrintable(err)); + return true; +} + +void ControlSocket::connect_ready() +{ +} + +void ControlSocket::packet_ready() +{ + QByteArray line; + if (!m_socket->readBuffer().scan("\n", line)) + return; + if (line.isEmpty()) + return; + QString strLine=QString(line.data()).trimmed(); + /*if (line[(int)line.length() - 1] == '\r') + line = line.left(line.size() - 1);*/ + log(L_DEBUG, "Remote read: %s", qPrintable(strLine)); + QString out; + bool bError = false; + bool bRes = m_plugin->command(strLine.toLatin1(), out, bError); + if (bError){ + m_socket->error_state(""); + return; + } + if (!bRes) + write("? "); + QByteArray s; + if (!out.isEmpty()) + s = out.toLocal8Bit(); + QByteArray res; + strLine=QString(s).trimmed(); + + //if (!strLine.contains('\n')) + strLine += "\r\n"; + if (strLine.trimmed().isEmpty()) return; + res=strLine.toLocal8Bit(); + + /*for (const char *p = s.data(); *p ; p++){ + if (*p == '\r') + continue; + if (*p == '\n') + res += '\r'; + res += *p; + }*/ + write(res); + write(Prompt); +} + diff --git a/plugins/remote/remote.h b/plugins/remote/remote.h new file mode 100644 index 0000000..fd31ab9 --- /dev/null +++ b/plugins/remote/remote.h @@ -0,0 +1,89 @@ +/*************************************************************************** + remote.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _REMOTE_H +#define _REMOTE_H + +#include "socket/socket.h" +#include "socket/serversocketnotify.h" +#include "propertyhub.h" +#include + +class ControlSocket; + +#ifdef WIN32 + +const unsigned N_SLOTS = 16; + +class IPC; +#define SIM_SHARED "SIMremote." + +const unsigned SLOT_NONE = 0; +const unsigned SLOT_IN = 1; +const unsigned SLOT_OUT = 2; + +#endif + +class RemotePlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver, public SIM::ServerSocketNotify +{ + Q_OBJECT +public: + RemotePlugin(); + RemotePlugin(unsigned, Buffer*); + ~RemotePlugin(); + void bind(); + std::list m_sockets; + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +public slots: + void command(); + bool command(const QString&, QString&, bool &bError); +protected: + virtual bool accept(SIM::Socket*, unsigned long ip); + virtual void bind_ready(unsigned short port); + virtual bool error(const QString &err); + + virtual bool processEvent(SIM::Event *e); + virtual QByteArray getConfig(); + virtual QWidget *createConfigWindow(QWidget *parent); +#ifdef WIN32 + IPC *ipc; +#endif +// RemoteData data; +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +class ControlSocket : public SIM::ClientSocketNotify +{ +public: + ControlSocket(RemotePlugin *plugin, SIM::Socket *s); + ~ControlSocket(); +protected: + SIM::ClientSocket *m_socket; + RemotePlugin *m_plugin; + void write(const char*); + virtual bool error_state(const QString &err, unsigned code = 0); + virtual void connect_ready(); + virtual void packet_ready(); +}; + +#endif + diff --git a/plugins/remote/remote.rc b/plugins/remote/remote.rc new file mode 100644 index 0000000..722df8f --- /dev/null +++ b/plugins/remote/remote.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Remote control plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "remote\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "remote.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/remote/remote.vcproj b/plugins/remote/remote.vcproj new file mode 100644 index 0000000..6a03751 --- /dev/null +++ b/plugins/remote/remote.vcproj @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/remote/remotecfg.cpp b/plugins/remote/remotecfg.cpp new file mode 100644 index 0000000..5466970 --- /dev/null +++ b/plugins/remote/remotecfg.cpp @@ -0,0 +1,113 @@ +/*************************************************************************** + remotecfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "remotecfg.h" +#include "remote.h" + +#include +#include +#include +#include +#include + +static char TCP[] = "tcp:"; + +RemoteConfig::RemoteConfig(QWidget *parent, RemotePlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; + QString path = m_plugin->value("Path").toString(); + edtPort->setValue(3000); +#ifdef WIN32 + if (path.startsWith(TCP)){ + edtPort->setValue(path.mid(strlen(TCP)).toUShort()); + chkTCP->setChecked(true); + }else{ + edtPort->setValue(3000); + chkTCP->setChecked(false); + } + btnUNIX->hide(); + btnTCP->hide(); + edtPath->hide(); + connect(chkTCP, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); + toggled(chkTCP->isChecked()); +#else + chkTCP->hide(); + edtPath->setText("/tmp/sim.%user%"); + if (path.startsWith(TCP)){ + btnTCP->setChecked(true); + + edtPort->setValue(path.mid(strlen(TCP)).toUShort()); + edtPath->setEnabled(false); + }else{ + btnUNIX->setChecked(true); + edtPath->setText(path); + edtPort->setEnabled(false); + } + connect(grpRemote, SIGNAL(clicked(int)), this, SLOT(selected(int))); +#endif +#ifdef WIN32 + chkIE->setChecked(m_plugin->value("EnableMenu").toBool()); +#else + chkIE->hide(); +#endif +} + +void RemoteConfig::apply() +{ + QString path; +#ifdef WIN32 + if (chkTCP->isChecked()){ + path = TCP; + path += edtPort->text(); + }else{ + path = "auto:"; + } + m_plugin->setValue("EnableMenu", chkIE->isChecked()); +#else + if (btnTCP->isChecked()){ + path = TCP; + path += edtPort->text(); + }else{ + path = edtPath->text(); + } +#endif + if (path != m_plugin->value("Path").toString()){ + m_plugin->setValue("Path", path); + m_plugin->bind(); + } +} + +void RemoteConfig::selected(int id) +{ + switch (id){ + case 1: + edtPath->setEnabled(true); + edtPort->setEnabled(false); + break; + case 2: + edtPath->setEnabled(false); + edtPort->setEnabled(true); + break; + } +} + +void RemoteConfig::toggled(bool state) +{ + edtPort->setEnabled(state); +} + diff --git a/plugins/remote/remotecfg.h b/plugins/remote/remotecfg.h new file mode 100644 index 0000000..746ca04 --- /dev/null +++ b/plugins/remote/remotecfg.h @@ -0,0 +1,39 @@ +/*************************************************************************** + remotecfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _REMOTECFG_H +#define _REMOTECFG_H + +#include "ui_remotecfgbase.h" + +class RemotePlugin; + +class RemoteConfig : public QWidget, public Ui::RemoteCfg +{ + Q_OBJECT +public: + RemoteConfig(QWidget *parent, RemotePlugin*); +public slots: + void apply(); + void selected(int); + void toggled(bool); +protected: + RemotePlugin *m_plugin; +}; + +#endif + diff --git a/plugins/remote/remotecfgbase.ui b/plugins/remote/remotecfgbase.ui new file mode 100644 index 0000000..1dfdcd9 --- /dev/null +++ b/plugins/remote/remotecfgbase.ui @@ -0,0 +1,128 @@ + + + RemoteCfg + + + + 0 + 0 + 367 + 216 + + + + Form1 + + + + 6 + + + 11 + + + + + + + + + + + Use &UNIX socket + + + 1 + + + + + + + + + + Use &TCP socket + + + + + + + Use &TCP socket + + + 2 + + + + + + + Port: + + + false + + + + + + + 1 + + + 65535 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 220 + 20 + + + + + + + + + + + + + + Enable IE context menu extension + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + diff --git a/plugins/remote/resource.h b/plugins/remote/resource.h new file mode 100644 index 0000000..7eaaebd --- /dev/null +++ b/plugins/remote/resource.h @@ -0,0 +1,21 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by sim.rc +#include + +#define IDI_ICON1 1 +#define IDS_PROJNAME 100 +#define IDR_SIMCTRL 101 +#define IDR_SIMCONTROL 102 +#define IDR_SIM_EXT 103 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 200 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 201 +#endif +#endif diff --git a/plugins/remote/sim_remote.cpp b/plugins/remote/sim_remote.cpp new file mode 100644 index 0000000..e0a897f --- /dev/null +++ b/plugins/remote/sim_remote.cpp @@ -0,0 +1,83 @@ +// simremote.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f simremoteps.mk in the project directory. + +#define STRICT +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0400 +#endif +#define _ATL_APARTMENT_THREADED + +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include + +#include "resource.h" +#include +#include "simremote.h" + +#include "simremote_i.c" +#include "SimControl.h" + + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_SimControl, CSimControl) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" + BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_SIMREMOTELib); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} + + diff --git a/plugins/remote/simctrl.cpp b/plugins/remote/simctrl.cpp new file mode 100644 index 0000000..c99306e --- /dev/null +++ b/plugins/remote/simctrl.cpp @@ -0,0 +1,477 @@ +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#ifdef HAVE_STDLIB_H + #include +#endif +#ifdef HAVE_STDDEF_H + #include +#endif +#ifdef HAVE_INTTYPES_H + #include +#else +#ifdef HAVE_STDINT_H +#include +#endif +#endif +#ifdef HAVE_UNISTD_H + #include +#endif + +#include +#include + +#ifndef WIN32 + #include + #include + #include + #include + #include + #include + #include + #include +#endif + +#include +#include +#include + +#ifdef WIN32 + #include + #define socklen_t int + #define in_addr_t int +#endif + +#ifndef INADDR_NONE + #define INADDR_NONE 0xFFFFFFFF +#endif + +using namespace std; + +class Processor +{ +public: + Processor() { bInit = false; }; + virtual ~Processor() {}; + virtual bool process(const char *in_str, string &out_str) = 0; + bool bInit; +}; + +class SocketProcessor : public Processor +{ +public: + SocketProcessor(int s); + ~SocketProcessor(); + virtual bool process(const char *in_str, string &out_str); +protected: + int m_s; +}; + +SocketProcessor::SocketProcessor(int s) +{ + m_s = s; + if (s == -1) + return; + bool bCR = false; + for (;;){ + char c; + int rs = recv(m_s, &c, 1, 0); + if (rs <= 0) + return; + if (bCR && (c == '>')) + break; + bCR = (c == '\n'); + } + bInit = true; +} + +SocketProcessor::~SocketProcessor() +{ + if (m_s != -1) +#ifdef WIN32 + closesocket(m_s); +#else + close(m_s); +#endif +} + +bool SocketProcessor::process(const char *in_str, string &out_str) +{ + if (m_s == -1) + return false; + string ss; + ss = in_str; + ss += "\n"; + unsigned size = ss.length(); + const char *p = ss.c_str(); + while (size){ + int ws = send(m_s, p, size, 0); + if (ws <= 0) + return false; + size -= ws; + } + string out; + bool bCR = false; + for (;;){ + char c; + int rs = recv(m_s, &c, 1, 0); + if (rs <= 0) + return false; + if (c == '\r') + continue; + if (bCR && (c == '>')) + break; + out += c; + bCR = (c == '\n'); + } + out = out.substr(0, out.length() - 1); + if ((out.length() >= 2) && (out.substr(0, 2) == "? ")){ + out_str = "?"; + out_str += out.substr(2); + }else{ + out_str += ">"; + out_str += out; + } + return true; +} + +#ifdef WIN32 +#define WS_VERSION_REQD 0x0101 +#endif + +Processor *createTCPProcessor(const char *addr_str) +{ + string addr; + if (addr_str) + addr = addr_str; + if (addr.length() <= 4) + return NULL; + if (addr.substr(0, 4) != "tcp:") + return NULL; +#ifdef WIN32 + WSADATA wsaData; + WSAStartup(WS_VERSION_REQD, &wsaData); +#endif + int s = socket(AF_INET, SOCK_STREAM, 0); + if (s != -1){ + sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = 0; + socklen_t addr_len = sizeof(addr); + if (bind(s, (sockaddr*)&addr, addr_len) == -1){ +#ifdef WIN32 + closesocket(s); +#else + close(s); +#endif + s = -1; + } + } + if (s != -1){ + addr = addr.substr(4); + string host; + unsigned port; + int n = addr.find(':'); + if (n > 0){ + host = addr.substr(0, n); + port = atol(addr.substr(n + 1).c_str()); + }else{ + port = atol(addr.c_str()); + } + in_addr_t ip = INADDR_NONE; + if (port){ + if (!host.empty()){ + ip = inet_addr(host.c_str()); + hostent *h = gethostbyname(host.c_str()); + if (h) + ip = *((int*)(*(h->h_addr_list))); + }else{ + ip = inet_addr("127.0.0.1"); + } + } + if (ip == INADDR_NONE){ +#ifdef WIN32 + closesocket(s); +#else + close(s); +#endif + s = -1; + }else{ + sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = ip; + addr.sin_port = htons((u_short)port); + socklen_t addr_len = sizeof(addr); + if (connect(s, (sockaddr*)&addr, addr_len) == -1){ +#ifdef WIN32 + closesocket(s); +#else + close(s); +#endif + s = -1; + } + } + } + return new SocketProcessor(s); +} + +#ifdef WIN32 + +#include +#include +extern CComModule _Module; +#include +#include + +class AutoProcessor : public Processor +{ +public: + AutoProcessor(); + virtual bool process(const char *in_str, string &out_str); +protected: + CComDispatchDriver disp; +}; + +AutoProcessor::AutoProcessor() +{ + CoInitialize(NULL); + + CLSID clsid; + HRESULT hResult; + hResult = CLSIDFromProgID(L"Simremote.SimControl", &clsid); + if (FAILED(hResult)) + return; + + CComPtr pUnk; + hResult = pUnk.CoCreateInstance(clsid); + if (FAILED(hResult)) + return; + disp = pUnk; + bInit = true; +} + +bool AutoProcessor::process(const char *in_str, string &out_str) +{ + if (!bInit) + return false; + CComBSTR str(in_str); + CComVariant vArg(str); + CComVariant vRes; + HRESULT hResult = disp.Invoke1(L"Process", &vArg, &vRes); + if (FAILED(hResult)) + return false; + CComBSTR out(vRes.bstrVal); + if (out.Length()){ + size_t size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), 0, 0, NULL, NULL); + char *res = new char[size + 1]; + size = WideCharToMultiByte(CP_ACP, 0, out, wcslen(out), res, size, NULL, NULL); + res[size] = 0; + out_str = res; + delete[] res; + }else{ + return false; + } + return true; +} + +Processor *createProcessor(const char *addr_str) +{ + Processor *processor = createTCPProcessor(addr_str); + if (processor) + return processor; + string addr; + if (addr_str) + addr = addr_str; + if (addr.empty()) + addr = "auto:"; + int n = addr.find(':'); + if (n < 0) + return NULL; + string proto = addr.substr(0, n); + addr = addr.substr(n + 1); + if (proto == "auto") + return new AutoProcessor; + return NULL; +} + +#else + +Processor *createProcessor(const char *addr_str) +{ + Processor *processor = createTCPProcessor(addr_str); + if (processor != NULL) + return processor; + string addr = "/tmp/sim.%user%"; + if (addr_str) + addr = addr_str; + int n = addr.find("%user%"); + if (n >= 0){ + uid_t uid = getuid(); + struct passwd *pwd = getpwuid(uid); + string user; + if (pwd){ + user = pwd->pw_name; + }else{ + char b[32]; + sprintf(b, "%u", uid); + user = b; + } + addr = addr.substr(0, n) + user + addr.substr(n + 6); + } + int s = socket(PF_UNIX, SOCK_STREAM, 0); + if (s < 0){ + fprintf(stderr, "Can't create socket: %s\n", strerror(errno)); + return NULL; + } + + char local_name[256]; + int tmpfd; + strcpy(local_name, "/tmp/sim.XXXXXX"); + if ((tmpfd = mkstemp(local_name)) == -1) + return NULL; + close(tmpfd); + + struct sockaddr_un sun_local; + sun_local.sun_family = AF_UNIX; + strcpy(sun_local.sun_path, local_name); + unlink(local_name); + if (bind(s, (struct sockaddr*)&sun_local, sizeof(sun_local)) < 0){ + fprintf(stderr, "Can't bind socket %s: %s\n", local_name, strerror(errno)); + return NULL; + } + + struct sockaddr_un sun_remote; + sun_remote.sun_family = AF_UNIX; + strcpy(sun_remote.sun_path, addr.c_str()); + if (connect(s, (struct sockaddr*)&sun_remote, sizeof(sun_remote)) < 0){ + fprintf(stderr, "Can't connect to %s: %s\n", addr.c_str(), strerror(errno)); + unlink(local_name); + return NULL; + } + unlink(local_name); + return new SocketProcessor(s); +} + +#endif + +static void usage(char *s) +{ +#ifndef WIN32 + uid_t uid = getuid(); + struct passwd *pwd = getpwuid(uid); + char uid_buf[256]; + char *name = NULL; + if (pwd){ + name = pwd->pw_name; + }else{ + snprintf(uid_buf, sizeof(uid_buf), "%u", uid); + name = uid_buf; + } +#endif + fprintf(stderr, + "usage: %s [options] [uin files]\n" + "Options are: [followed by default value]:\n" +#ifndef WIN32 + " -s socket [/tmp/sim.%s] Control socket\n" +#endif + // " -d Debug mode\n" + " -c command Command\n" + " -h Show this help\n" + "\n", + s +#ifndef WIN32 + ,name +#endif + ); +} + +int main(int, char **argv) +{ + list uins; + const char *cmd = NULL; + const char *addr = NULL; + for (char **p = argv + 1; *p; p++){ + if (!strcmp(*p, "-h")){ + usage(argv[0]); + return 0; + } + if (!strcmp(*p, "-s")){ + p++; + if (*p == NULL){ + usage(argv[0]); + return 1; + } + addr = *p; + continue; + } + if (!strcmp(*p, "-c")){ + p++; + if (*p == NULL){ + usage(argv[0]); + return 1; + } + cmd = *p; + continue; + } + uins.push_back(*p); + } + auto_ptr processor(createProcessor(addr)); + if ((processor.get() == NULL) || !processor->bInit){ + fprintf(stderr, "Can't create processor\n"); + return 1; + } + if (uins.size()){ + for (list::iterator it = uins.begin(); it != uins.end(); ++it){ + string in_str; + in_str = "FILE \""; + in_str += *it; + in_str += "\""; + string out_str; + if (!processor->process(in_str.c_str(), out_str)) + break; + } + return 0; + } + if (cmd){ + string out_str; + if (!processor->process(cmd, out_str)){ + fprintf(stderr, "Can't execute %s\n", cmd); + exit(1); + } + if (out_str.empty()){ + fprintf(stderr, "No answer\n"); + exit(1); + } + if (out_str[0] != '>'){ + fprintf(stderr, "Execute %s fail\n", cmd); + exit(1); + } + printf("%s\n", out_str.c_str() + 1); + exit(0); + } + FILE *f = stdin; + while (!feof(f) && !ferror(f)){ + printf(">"); + char buf[4096]; + char *line = fgets(buf, sizeof(buf), f); + if (line == NULL) + break; + if (strlen(line) && (line[strlen(line) - 1] == '\n')) + line[strlen(line) - 1] = 0; + if (strlen(line) && (line[strlen(line) - 1] == '\r')) + line[strlen(line) - 1] = 0; + string out_str; + if (!processor->process(line, out_str)) + break; + if (out_str.empty()) + break; + bool bBad = (out_str[0] == '?'); + out_str = out_str.substr(1); + if (bBad) + printf("? "); + printf("%s\n", out_str.c_str()); + } + return 0; +} diff --git a/plugins/remote/simctrl.desktop b/plugins/remote/simctrl.desktop new file mode 100644 index 0000000..659b447 --- /dev/null +++ b/plugins/remote/simctrl.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=simctrl +Icon=licq +Type=Service +MimeType=application/x-icq; +GenericName=SIM remote control +Terminal=false +Exec=simctrl +X-KDE-StartupNotify=true +X-DCOP-ServiceType=Unique diff --git a/plugins/remote/simctrl.vcproj b/plugins/remote/simctrl.vcproj new file mode 100644 index 0000000..40b3fe9 --- /dev/null +++ b/plugins/remote/simctrl.vcproj @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/remote/simext.cpp b/plugins/remote/simext.cpp new file mode 100644 index 0000000..afb6977 --- /dev/null +++ b/plugins/remote/simext.cpp @@ -0,0 +1,76 @@ +// simext.cpp : Implementation of DLL Exports. + + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f simextps.mk in the project directory. + +#include +extern CComModule _Module; +#include + +#include "resource.h" +#include +#include "simext.h" + +#include "simext_i.c" +#include "SIM_ext.h" + + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_SIM_ext, CSIM_ext) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" + BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + CSIM_ext::hInstance = hInstance; + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_SIMEXTLib); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} + + diff --git a/plugins/remote/simext.def b/plugins/remote/simext.def new file mode 100644 index 0000000..61d74b0 --- /dev/null +++ b/plugins/remote/simext.def @@ -0,0 +1,9 @@ +; simext.def : Declares the module parameters. + +LIBRARY "simext.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/plugins/remote/simext.idl b/plugins/remote/simext.idl new file mode 100644 index 0000000..ff32f0c --- /dev/null +++ b/plugins/remote/simext.idl @@ -0,0 +1,38 @@ +// simext.idl : IDL source for simext.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (simext.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; + [ + object, + uuid(7A6FBB28-B284-4731-97AF-9AE32EA0BB89), + + helpstring("ISIM_ext Interface"), + pointer_default(unique) + ] + interface ISIM_ext : IUnknown + { + }; + +[ + uuid(F67751E0-1470-447C-8B3E-000D155711A2), + version(1.0), + helpstring("simext 1.0 Type Library") +] +library SIMEXTLib +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + [ + uuid(8DD848D4-81E7-490E-9A3D-CE9058956208), + helpstring("SIM_ext Class") + ] + coclass SIM_ext + { + [default] interface ISIM_ext; + }; +}; diff --git a/plugins/remote/simext.rc b/plugins/remote/simext.rc new file mode 100644 index 0000000..d196c84 --- /dev/null +++ b/plugins/remote/simext.rc @@ -0,0 +1,140 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Russian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_SIM_EXT REGISTRY DISCARDABLE "SIM_ext.rgs" +#endif // Russian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "1 TYPELIB ""simext.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,9 + PRODUCTVERSION 1,0,0,9 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "\0" + VALUE "FileDescription", "simext Module\0" + VALUE "FileVersion", "1, 0, 0, 9\0" + VALUE "InternalName", "simext\0" + VALUE "LegalCopyright", "Copyright 2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OLESelfRegister", "\0" + VALUE "OriginalFilename", "simext.DLL\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "simext Module\0" + VALUE "ProductVersion", "1, 0, 0, 9\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_PROJNAME "simext" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "simext.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/remote/simext.vcproj b/plugins/remote/simext.vcproj new file mode 100644 index 0000000..80db281 --- /dev/null +++ b/plugins/remote/simext.vcproj @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/remote/simipc.cpp b/plugins/remote/simipc.cpp new file mode 100644 index 0000000..9da8dbf --- /dev/null +++ b/plugins/remote/simipc.cpp @@ -0,0 +1,29 @@ +/*************************************************************************** + simipc.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +extern "C" bool ProcessStr(BSTR in_str, BSTR *out_str); + +int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR cmdLine, int) +{ + CComBSTR in("FILE "); + in.Append(cmdLine); + CComBSTR out; + ProcessStr(in, &out); + return 0; +} diff --git a/plugins/remote/simipc.vcproj b/plugins/remote/simipc.vcproj new file mode 100644 index 0000000..cf35b82 --- /dev/null +++ b/plugins/remote/simipc.vcproj @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/remote/simremote.def b/plugins/remote/simremote.def new file mode 100644 index 0000000..0e0218a --- /dev/null +++ b/plugins/remote/simremote.def @@ -0,0 +1,9 @@ +; simremote.def : Declares the module parameters. + +LIBRARY "simremote.DLL" + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/plugins/remote/simremote.idl b/plugins/remote/simremote.idl new file mode 100644 index 0000000..2b52c01 --- /dev/null +++ b/plugins/remote/simremote.idl @@ -0,0 +1,38 @@ +// simremote.idl : IDL source for simremote.dll +// + +// This file will be processed by the MIDL tool to +// produce the type library (simremote.tlb) and marshalling code. + +import "oaidl.idl"; +import "ocidl.idl"; + [ + object, + uuid(1FE1EEB0-0BC8-4D7F-B0E4-B57AC5DC5E52), + dual, + helpstring("ISimControl Interface"), + pointer_default(unique) + ] + interface ISimControl : IDispatch + { + [propget, id(1), helpstring("property Running")] HRESULT Running([out, retval] BOOL *pVal); + [id(2), helpstring("method Process")] HRESULT Process([in] BSTR in_str, [out, retval] BSTR *out_str); + }; +[ + uuid(C4826912-0E46-445E-8B03-9683AAF5143F), + version(1.0), + helpstring("simremote 1.0 Type Library") +] +library SIMREMOTELib +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + [ + uuid(0B4C5D94-61D9-41C6-AD05-4750A0E86C2E), + helpstring("SimControl Class") + ] + coclass SimControl + { + [default] interface ISimControl; + }; +}; diff --git a/plugins/remote/simremote.rc b/plugins/remote/simremote.rc new file mode 100644 index 0000000..e74e1a7 --- /dev/null +++ b/plugins/remote/simremote.rc @@ -0,0 +1,140 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Russian resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) +#ifdef _WIN32 +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +#pragma code_page(1251) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_SIMCONTROL REGISTRY DISCARDABLE "SimControl.rgs" +#endif // Russian resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "1 TYPELIB ""simremote.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,6 + PRODUCTVERSION 1,0,0,6 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "\0" + VALUE "FileDescription", "simremote Module\0" + VALUE "FileVersion", "1, 0, 0, 6\0" + VALUE "InternalName", "simremote\0" + VALUE "LegalCopyright", "Copyright 2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OLESelfRegister", "\0" + VALUE "OriginalFilename", "simremote.DLL\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "simremote Module\0" + VALUE "ProductVersion", "1, 0, 0, 6\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_PROJNAME "simremote" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "simremote.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/remote/simremote.vcproj b/plugins/remote/simremote.vcproj new file mode 100644 index 0000000..9ea545e --- /dev/null +++ b/plugins/remote/simremote.vcproj @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/remote/x-icq.desktop b/plugins/remote/x-icq.desktop new file mode 100644 index 0000000..697acec --- /dev/null +++ b/plugins/remote/x-icq.desktop @@ -0,0 +1,51 @@ +[Desktop Entry] +Encoding=UTF-8 +Comment=ICQ Contact +Comment[ar]=جهة اتصال على ICQ +Comment[be]=Кантакт ICQ +Comment[bg]=Връзка Ñ ICQ Contact +Comment[br]=Darempred ICQ +Comment[bs]=ICQ kontakt +Comment[ca]=Contacte ICQ +Comment[cs]=ICQ kontakt +Comment[cy]=Cysylltiad ICQ +Comment[da]=ICQ-Kontakt +Comment[de]=ICQ-Kontakt +Comment[el]=Επαφή ICQ +Comment[es]=Contacto de ICQ +Comment[et]=ICQ kontakt +Comment[eu]=ICQ kontaktua +Comment[fi]=ICQ-kontakti +Comment[fr]=Contact ICQ +Comment[gl]=Contacto ICQ +Comment[he]=×יש-קשר ICQ +Comment[hi]=आईसीकà¥à¤¯à¥‚ समà¥à¤ªà¤°à¥à¤• +Comment[hr]=ICQ kontakt +Comment[hu]=ICQ-kapcsolat +Comment[is]=ICQ tengiliður +Comment[it]=Contatto ICQ +Comment[ja]=ICQコンタクト +Comment[mk]=Контакт на ICQ +Comment[nb]=ICQ kontakt +Comment[nl]=ICQ contact +Comment[nn]=ICQ-kontakt +Comment[pl]=Kontakt ICQ +Comment[pt]=Contacto de ICQ +Comment[pt_BR]=Contato ICQ +Comment[ru]=Контакт ICQ +Comment[se]=ICQ-oktavuohta +Comment[sk]=Kontakt ICQ +Comment[sl]=Stik ICQ +Comment[sr]=ICQ контакт +Comment[sr@Latn]=ICQ kontakt +Comment[sv]=ICQ-kontakt +Comment[ta]=ICQ தொடரà¯à®ªà¯ +Comment[tg]=ПайваÑтшавии ICQ +Comment[tr]=ICQ BaÄŸlantısı +Comment[uk]=Контакт ICQ +Comment[xx]=xxICQ Contactxx +Comment[zh_CN]=ICQ è”系人 +Type=MimeType +MimeType=application/x-icq +Patterns=*.uin;*.icq +Icon=licq diff --git a/plugins/replace/CMakeLists.txt b/plugins/replace/CMakeLists.txt new file mode 100644 index 0000000..238d67a --- /dev/null +++ b/plugins/replace/CMakeLists.txt @@ -0,0 +1,20 @@ +################### +# replace library # +################### +IF(BUILD_DROPPED) +SET(replace_SRCS + replace.cpp + replacecfg.cpp +) + +SET(replace_HDRS + replace.h + replacecfg.h +) + +SET(replace_UICS + replacecfgbase.ui +) + +SIM_ADD_PLUGIN(replace) +ENDIF(BUILD_DROPPED) diff --git a/plugins/replace/replace.cpp b/plugins/replace/replace.cpp new file mode 100644 index 0000000..3ca15cf --- /dev/null +++ b/plugins/replace/replace.cpp @@ -0,0 +1,172 @@ +/*************************************************************************** + replace.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "replace.h" +#include "replacecfg.h" +#include "simgui/textshow.h" +#include "html.h" +#include "misc.h" + +#include "profile.h" +#include "profilemanager.h" + +#include +#include + +using namespace std; +using namespace SIM; + +Plugin *createReplacePlugin(unsigned base, bool, Buffer *cfg) +{ + Plugin *plugin = new ReplacePlugin(base, cfg); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Replace text"), + I18N_NOOP("Plugin provides text replacing in message edit window"), + VERSION, + createReplacePlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + + +ReplacePlugin::ReplacePlugin(unsigned base, Buffer *cfg) + : QObject(), Plugin(base) + , EventReceiver() +{ + m_propertyHub = SIM::PropertyHub::create("replace"); + qApp->installEventFilter(this); +} + +ReplacePlugin::~ReplacePlugin() +{ + +} + +QByteArray ReplacePlugin::getConfig() +{ + return QByteArray(); +} + +QWidget *ReplacePlugin::createConfigWindow(QWidget *parent) +{ + return new ReplaceCfg(parent, this); +} + +class _UnquoteParser : public HTMLParser +{ +public: + _UnquoteParser(const QString &text); + QString m_text; +protected: + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &options); + virtual void tag_end(const QString &tag); +}; + +_UnquoteParser::_UnquoteParser(const QString &text) +{ + parse(text); +} + +void _UnquoteParser::text(const QString &text) +{ + m_text += text; +} + +void _UnquoteParser::tag_start(const QString &tag, const list&) +{ + if (tag == "img") + m_text += ' '; + if (tag == "br") + m_text += '\n'; +} + +void _UnquoteParser::tag_end(const QString&) +{ +} + +bool ReplacePlugin::eventFilter(QObject *o, QEvent *e) +{ + if ((e->type() == QEvent::KeyPress) && o->inherits("MsgTextEdit")){ + QKeyEvent *ke = (QKeyEvent*)e; + if ((ke->key() == Qt::Key_Enter) || (ke->key() == Qt::Key_Return) || (ke->key() == Qt::Key_Space)){ +/* + TextEdit *edit = (TextEdit*)o; + int paraFrom, paraTo, indexFrom, indexTo; + edit->getSelection(¶From, &indexFrom, ¶To, &indexTo); + if ((paraFrom == paraTo) && (indexFrom == indexTo)){ + int parag, index; + edit->getCursorPosition(¶g, &index); + _UnquoteParser p(edit->text(parag)); + QString text = p.m_text.left(index); + for (unsigned i = 1; i <= value("Keys").toUInt(); i++){ + QString key = value("Key").toStringList().value(i); + if (key.length() > text.length()) + continue; + if (key != text.mid(text.length() - key.length())) + continue; + if ((key.length() < text.length()) && !text[(int)(text.length() - key.length() - 1)].isSpace()) + continue; + edit->setSelection(parag, index - key.length(), parag, index, 0); + edit->insert(value("Value").toStringList().value(i), false, false); + break; + } + } +*/ + } + } + return QObject::eventFilter(o, e); +} + +bool ReplacePlugin::processEvent(SIM::Event *e) +{ + if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("replace"); + if(!hub.isNull()) + setPropertyHub(hub); + } + return false; +} + +void ReplacePlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr ReplacePlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant ReplacePlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void ReplacePlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/replace/replace.h b/plugins/replace/replace.h new file mode 100644 index 0000000..6ea74d8 --- /dev/null +++ b/plugins/replace/replace.h @@ -0,0 +1,50 @@ +/*************************************************************************** + replace.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _REPLACE_H +#define _REPLACE_H + +#include + +#include "cfg.h" +#include "plugins.h" +#include "propertyhub.h" +#include "event.h" + +class ReplacePlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + ReplacePlugin(unsigned, Buffer *cfg); + virtual ~ReplacePlugin(); + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); + +protected: + virtual bool processEvent(SIM::Event *e); + virtual QByteArray getConfig(); + virtual QWidget *createConfigWindow(QWidget *parent); + bool eventFilter(QObject *o, QEvent *e); + +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/replace/replace.rc b/plugins/replace/replace.rc new file mode 100644 index 0000000..1cd33cb --- /dev/null +++ b/plugins/replace/replace.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Replace text plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "replace\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "replace.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/replace/replace.vcproj b/plugins/replace/replace.vcproj new file mode 100644 index 0000000..14887cc --- /dev/null +++ b/plugins/replace/replace.vcproj @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/replace/replacecfg.cpp b/plugins/replace/replacecfg.cpp new file mode 100644 index 0000000..c4e9e86 --- /dev/null +++ b/plugins/replace/replacecfg.cpp @@ -0,0 +1,111 @@ +/*************************************************************************** + replacecfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "replacecfg.h" + +#include "replace.h" + +ReplaceCfg::ReplaceCfg(QWidget *parent, ReplacePlugin *plugin) + : QWidget(parent) + , m_plugin( plugin ) +{ + setupUi(this); + unsigned uCount = m_plugin->value("Keys").toUInt(); + for (unsigned i = 0; i < uCount; i++){ + QString sKey = m_plugin->value("Key").toStringList().value(i); + QString sValue = m_plugin->value("Value").toStringList().value(i); + if (!sKey.isEmpty()) { + addString( sKey, sValue ); + } + } + addString( QString(), QString() ); + connect(lstKeys,SIGNAL(cellChanged(int,int)),SLOT(cellChanged(int,int))); + autosizeColumns(); +} + +ReplaceCfg::~ReplaceCfg() +{ +} + +void ReplaceCfg::apply() +{ + QStringList keys; + QStringList values; + for( int row = 0 ; row < lstKeys->rowCount() ; row++ ){ + QString sKey; + QString sValue; + if( string( row, sKey, sValue ) && !sKey.isEmpty() ) { + keys.push_back(sKey); + values.push_back(sValue); + } + } + m_plugin->setValue("Key", keys); + m_plugin->setValue("Value", values); + m_plugin->setValue("Keys", keys.count()); +} + +bool ReplaceCfg::string( int row, QString &sKey, QString &sValue ) { + QTableWidgetItem *item = lstKeys->item( row, 0 ); + if( NULL == item ) + sKey.clear(); + else + sKey = item->data( Qt::DisplayRole ).toString(); + item = lstKeys->item( row, 1 ); + if( NULL == item ) + sValue.clear(); + else + sValue = item->data( Qt::DisplayRole ).toString(); + + return true; +} + +void ReplaceCfg::addString( QString sKey, QString sValue ) { + int row = lstKeys->rowCount(); + lstKeys->insertRow( row ); + if( !sKey.isEmpty() ) + lstKeys->setItem( row, 0, new QTableWidgetItem( sKey ) ); + if( !sValue.isEmpty() ) + lstKeys->setItem( row, 1, new QTableWidgetItem( sValue ) ); +} + +void ReplaceCfg::cellChanged( int row, int column ) { + autosizeColumns(); + QString sKey; + QString sValue; + if( !string( row, sKey, sValue ) ) + return; + if( sKey.isEmpty() && sValue.isEmpty() ) { + lstKeys->removeRow( row ); + } + if( lstKeys->rowCount() == 0 ) { + addString( QString(), QString() ); + return; + } + if( !string( lstKeys->rowCount()-1, sKey, sValue ) ) + return; + if( !sKey.isEmpty() || !sValue.isEmpty() ) { + addString( QString(), QString() ); + } +} + +void ReplaceCfg::autosizeColumns() { + lstKeys->resizeColumnToContents( 0 ); + int width = lstKeys->columnWidth( 0 ); + if( width < 100 ) { + lstKeys->setColumnWidth( 0, 100 ); + } +} diff --git a/plugins/replace/replacecfg.h b/plugins/replace/replacecfg.h new file mode 100644 index 0000000..bb62d42 --- /dev/null +++ b/plugins/replace/replacecfg.h @@ -0,0 +1,46 @@ +/*************************************************************************** + replacecfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _REPLACECFG_H +#define _REPLACECFG_H + +#include "ui_replacecfgbase.h" + +class ReplacePlugin; + +class ReplaceCfg : public QWidget, public Ui::ReplaceCfgBase +{ + Q_OBJECT + +public: + ReplaceCfg(QWidget *parent, ReplacePlugin *plugin); + virtual ~ReplaceCfg(); + +public slots: + void apply(); + void cellChanged( int row, int column ); + +protected: + bool string( int row, QString &sKey, QString &sValue ); + void addString( QString sKey, QString sValue ); + void autosizeColumns(); + + ReplacePlugin *m_plugin; +}; + +#endif + diff --git a/plugins/replace/replacecfgbase.ui b/plugins/replace/replacecfgbase.ui new file mode 100644 index 0000000..6fe8477 --- /dev/null +++ b/plugins/replace/replacecfgbase.ui @@ -0,0 +1,68 @@ + + + ReplaceCfgBase + + + + 0 + 0 + 301 + 226 + + + + Form1 + + + + 6 + + + 11 + + + + + 2 + + + 100 + + + 100 + + + true + + + false + + + 18 + + + 18 + + + true + + + 100 + + + + You type + + + + + You send + + + + + + + + + diff --git a/plugins/shortcuts/CMakeLists.txt b/plugins/shortcuts/CMakeLists.txt new file mode 100644 index 0000000..7d5e7cf --- /dev/null +++ b/plugins/shortcuts/CMakeLists.txt @@ -0,0 +1,23 @@ +##################### +# shortcuts library # +##################### +IF(BUILD_DROPPED) +SET(shortcuts_SRCS + mousecfg.cpp + shortcutcfg.cpp + shortcuts.cpp +) + +SET(shortcuts_HDRS + mousecfg.h + shortcutcfg.h + shortcuts.h +) + +SET(shortcuts_UICS + mousecfgbase.ui + shortcutcfgbase.ui +) + +SIM_ADD_PLUGIN(shortcuts) +ENDIF(BUILD_DROPPED) diff --git a/plugins/shortcuts/configure.in.in b/plugins/shortcuts/configure.in.in new file mode 100644 index 0000000..f247526 --- /dev/null +++ b/plugins/shortcuts/configure.in.in @@ -0,0 +1 @@ +AM_CONDITIONAL(ENABLE_SHORTCUTS, test "$kde_use_qt_mac" != "yes") diff --git a/plugins/shortcuts/mousecfg.cpp b/plugins/shortcuts/mousecfg.cpp new file mode 100644 index 0000000..b4e9ab5 --- /dev/null +++ b/plugins/shortcuts/mousecfg.cpp @@ -0,0 +1,184 @@ +/*************************************************************************** + mousecfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "cmddef.h" +#include "misc.h" +#include "core_consts.h" + +#include "mousecfg.h" +#include "shortcuts.h" + +using namespace SIM; + +MouseConfig::MouseConfig(QWidget *parent, ShortcutsPlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; + //lstCmd->setSorting(0); + loadMenu(MenuMain); + loadMenu(MenuGroup); + loadMenu(MenuContact); + adjustColumns(); + cmbButton->insertItem(INT_MAX,""); + cmbButton->insertItem(INT_MAX,i18n("Left click")); + cmbButton->insertItem(INT_MAX,i18n("Right click")); + cmbButton->insertItem(INT_MAX,i18n("Middle click")); + cmbButton->insertItem(INT_MAX,i18n("Left dblclick")); + cmbButton->insertItem(INT_MAX,i18n("Right dblclick")); + cmbButton->insertItem(INT_MAX,i18n("Middle dblclick")); + selectionChanged(); + connect(lstCmd, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged())); + connect(cmbButton, SIGNAL(activated(int)), this, SLOT(buttonChanged(int))); + connect(chkAlt, SIGNAL(toggled(bool)), this, SLOT(changed(bool))); + connect(chkCtrl, SIGNAL(toggled(bool)), this, SLOT(changed(bool))); + connect(chkShift, SIGNAL(toggled(bool)), this, SLOT(changed(bool))); +} + +MouseConfig::~MouseConfig() +{ +} + +void MouseConfig::apply() +{ + QMap map; + for(int i = 0; i < lstCmd->topLevelItemCount(); i++) + { + QTreeWidgetItem* item = lstCmd->topLevelItem(i); + map.insert(item->text(2), item->text(1).toLatin1()); + } + m_plugin->setValue("Mouse", map); +} + +void MouseConfig::resizeEvent(QResizeEvent *e) +{ + QWidget::resizeEvent(e); + adjustColumns(); +} + +void MouseConfig::adjustColumns() +{ + QScrollBar *bar = lstCmd->verticalScrollBar(); + int wScroll = 0; + if (bar && bar->isVisible()) + wScroll = bar->width(); + lstCmd->setColumnWidth(0, lstCmd->width() - + lstCmd->columnWidth(1) - 4 - wScroll); +} + +void MouseConfig::loadMenu(unsigned long id) +{ + EventMenuGetDef eMenu(id); + eMenu.process(); + CommandsDef *def = eMenu.defs(); + if (def){ + CommandsList list(*def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + if ((s->id == 0) || (s->popup_id == 0)) + continue; + QString title = i18n(s->text); + if (title == "_") + continue; + QTreeWidgetItem *item = NULL; + for(int i = 0; i < lstCmd->topLevelItemCount(); i++) + { + item = lstCmd->topLevelItem(i); + if (QString::number(s->popup_id) == item->text(3)) + break; + } + if ( NULL != item) + continue; + title = title.remove('&'); + QTreeWidgetItem* it = new QTreeWidgetItem(lstCmd, QStringList(title)); + it->setText(1, m_plugin->value("Mouse").toMap().value(QString::number(s->id)).toString()); + it->setText(2, QString::number(s->id)); + it->setText(3, QString::number(s->popup_id)); + } + } +} + +void MouseConfig::selectionChanged() +{ + QTreeWidgetItem *item = lstCmd->currentItem(); + if (item == NULL){ + lblCmd->setText(""); + cmbButton->setCurrentIndex(0); + cmbButton->setEnabled(false); + return; + } + lblCmd->setText(item->text(0)); + int n = ShortcutsPlugin::stringToButton(item->text(1).toLatin1()); +// ToDo: Restore this +// if (n == 0) +// chkAlt->setChecked((n & Qt::AltButton) != 0); +// chkCtrl->setChecked((n & Qt::ControlButton) != 0); +// chkShift->setChecked((n & Qt::ShiftButton) != 0); + cmbButton->setEnabled(true); + cmbButton->setCurrentIndex(n); + buttonChanged(0); +} + +void MouseConfig::buttonChanged(int) +{ + if (cmbButton->currentIndex()){ + chkAlt->setEnabled(true); + chkCtrl->setEnabled(true); + chkShift->setEnabled(true); + }else{ + chkAlt->setChecked(false); + chkAlt->setEnabled(false); + chkCtrl->setChecked(false); + chkCtrl->setEnabled(false); + chkShift->setChecked(false); + chkShift->setEnabled(false); + } + changed(false); +} + +void MouseConfig::changed(bool) +{ + QString res; +// ToDo: Restore this +/* + int n = cmbButton->currentIndex(); + if (n){ + if (chkAlt->isChecked()) + n |= Qt::AltButton; + if (chkCtrl->isChecked()) + n |= Qt::ControlButton; + if (chkShift->isChecked()) + n |= Qt::ShiftButton; + res = ShortcutsPlugin::buttonToString(n); + } +*/ + QTreeWidgetItem *item = lstCmd->currentItem(); + if (item == NULL) + return; + item->setText(1, res); + adjustColumns(); +} + +// vim: set expandtab: diff --git a/plugins/shortcuts/mousecfg.h b/plugins/shortcuts/mousecfg.h new file mode 100644 index 0000000..493a863 --- /dev/null +++ b/plugins/shortcuts/mousecfg.h @@ -0,0 +1,45 @@ +/*************************************************************************** + mousecfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _MOUSECFG_H +#define _MOUSECFG_H + +#include "ui_mousecfgbase.h" + +class ShortcutsPlugin; + +class MouseConfig : public QWidget, public Ui::MouseCfg +{ + Q_OBJECT +public: + MouseConfig(QWidget *parent, ShortcutsPlugin *plugin); + ~MouseConfig(); +public slots: + void apply(); +protected slots: + void selectionChanged(); + void buttonChanged(int); + void changed(bool); +protected: + ShortcutsPlugin *m_plugin; + void resizeEvent(QResizeEvent *e); + void adjustColumns(); + void loadMenu(unsigned long id); +}; + +#endif + diff --git a/plugins/shortcuts/mousecfgbase.ui b/plugins/shortcuts/mousecfgbase.ui new file mode 100644 index 0000000..60e5d86 --- /dev/null +++ b/plugins/shortcuts/mousecfgbase.ui @@ -0,0 +1,95 @@ + + + MouseCfg + + + + 0 + 0 + 354 + 265 + + + + Form1 + + + + 6 + + + 11 + + + + + 2 + + + + Command + + + + + Button + + + + + + + + + + + false + + + + + + + 6 + + + 0 + + + + + + 0 + 0 + + + + + + + + Alt + + + + + + + Ctrl + + + + + + + Shift + + + + + + + + + + diff --git a/plugins/shortcuts/shortcutcfg.cpp b/plugins/shortcuts/shortcutcfg.cpp new file mode 100644 index 0000000..d605ddf --- /dev/null +++ b/plugins/shortcuts/shortcutcfg.cpp @@ -0,0 +1,259 @@ +/*************************************************************************** + shortcutcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "shortcutcfg.h" +#include "shortcuts.h" +#include "simgui/qkeybutton.h" + +#include "mousecfg.h" +#include "core.h" +#include "core_consts.h" +#include "cmddef.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace SIM; + +ShortcutsConfig::ShortcutsConfig(QWidget *parent, ShortcutsPlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; + //lstKeys->setSorting(0); + loadMenu(MenuMain, true); + loadMenu(MenuGroup, false); + loadMenu(MenuContact, false); + loadMenu(MenuStatus, true); + adjustColumns(); + selectionChanged(); + connect(lstKeys, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged())); + connect(edtKey, SIGNAL(changed()), this, SLOT(keyChanged())); + connect(btnClear, SIGNAL(clicked()), this, SLOT(keyClear())); + connect(chkGlobal, SIGNAL(toggled(bool)), this, SLOT(globalChanged(bool))); + for (QObject *p = parent; p != NULL; p = p->parent()){ + if (!p->inherits("QTabWidget")) + continue; + QTabWidget *tab = static_cast(p); + mouse_cfg = new MouseConfig(tab, plugin); + tab->addTab(mouse_cfg, i18n("Mouse")); + break; + } +} + +ShortcutsConfig::~ShortcutsConfig() +{ +} + +void ShortcutsConfig::loadMenu(unsigned long id, bool bCanGlobal) +{ + EventMenuGetDef eMenu(id); + eMenu.process(); + CommandsDef *def = eMenu.defs(); + if (def) + { + CommandsList list(*def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + if ((s->id == 0) || s->popup_id || (s->flags & COMMAND_TITLE)) + continue; + QString title = i18n(s->text); + if (title == "_") + continue; + title = title.remove('&'); + QString accel; + int key = 0; + const QString cfg_accel = m_plugin->value("Key").toMap().value(QString::number(s->id)).toString(); + if (!cfg_accel.isEmpty()) + key = QKeySequence::fromString(cfg_accel); + if ((key == 0) && !s->accel.isEmpty()) + key = QKeySequence::fromString(i18n(s->accel)); + if (key) + accel = QKeySequence(key).toString(); + QString global; + bool bGlobal = m_plugin->getOldGlobal(s); + const QString cfg_global = m_plugin->value("Global").toMap().value(QString::number(s->id)).toString(); + if (!cfg_global.isEmpty()) + bGlobal = !bGlobal; + if (bGlobal) + global = i18n("Global"); + QTreeWidgetItem *item = NULL; + for(int i = 0; i < lstKeys->topLevelItemCount(); i++) + { + item = lstKeys->topLevelItem(i); + if (item->text(3).toUInt() == s->id) + break; + } + if (item == NULL) + { + QTreeWidgetItem* it = new QTreeWidgetItem(lstKeys, + QStringList(title)); + it->setText(1, accel); + it->setText(2, global); + it->setText(3, QString::number(s->id)); + it->setText(4, bCanGlobal ? "1" : ""); + } + } + } +} + +void ShortcutsConfig::apply() +{ + mouse_cfg->apply(); + saveMenu(MenuMain); + saveMenu(MenuGroup); + saveMenu(MenuContact); + saveMenu(MenuStatus); + m_plugin->releaseKeys(); + m_plugin->applyKeys(); +} + +void ShortcutsConfig::saveMenu(unsigned long id) +{ + EventMenuGetDef eMenu(id); + eMenu.process(); + CommandsDef *def = eMenu.defs(); + if (def){ + CommandsList list(*def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + if ((s->id == 0) || s->popup_id) + continue; + QTreeWidgetItem *item; + for(int i = 0; i < lstKeys->topLevelItemCount(); i++) + { + item = lstKeys->topLevelItem(i); + if (item->text(3).toUInt() != s->id) continue; + int key = QKeySequence::fromString(item->text(1)); + const QString cfg_key = m_plugin->getOldKey(s); + if (key == QKeySequence::fromString(cfg_key)){ + QVariantMap map; + map = m_plugin->value("Key").toMap(); + map.remove(QString::number(s->id)); + m_plugin->setValue("Key", map); + }else{ + QString t = item->text(1); + if (t.isEmpty()) + t = "-"; + QVariantMap map; + map = m_plugin->value("Key").toMap(); + map.insert(QString::number(s->id), t); + m_plugin->setValue("Key", map); + } + bool bGlobal = !item->text(2).isEmpty(); + bool bCfgGlobal = m_plugin->getOldGlobal(s); + if (item->text(1).isEmpty()){ + bGlobal = false; + bCfgGlobal = false; + } + if (bGlobal == bCfgGlobal){ + QVariantMap map; + map = m_plugin->value("Global").toMap(); + map.remove(QString::number(s->id)); + m_plugin->setValue("Global", map); + }else{ + QVariantMap map; + map = m_plugin->value("Global").toMap(); + map.insert(QString::number(s->id), bGlobal ? "1" : "-1"); + m_plugin->setValue("Global", map); + } + } + } + } +} + +void ShortcutsConfig::resizeEvent(QResizeEvent *e) +{ + QWidget::resizeEvent(e); + adjustColumns(); +} + +void ShortcutsConfig::adjustColumns() +{ + QScrollBar *bar = lstKeys->verticalScrollBar(); + int wScroll = 0; + if (bar && bar->isVisible()) + wScroll = bar->width(); + lstKeys->setColumnWidth(0, lstKeys->width() - + lstKeys->columnWidth(2) - lstKeys->columnWidth(1) - 4 - wScroll); +} + +void ShortcutsConfig::selectionChanged() +{ + QTreeWidgetItem *item = lstKeys->currentItem(); + if (item == NULL){ + lblKey->setText(QString::null); + edtKey->setEnabled(false); + btnClear->setEnabled(false); + chkGlobal->setEnabled(false); + return; + } + lblKey->setText(item->text(0)); + edtKey->setEnabled(true); + btnClear->setEnabled(true); + edtKey->setText(item->text(1)); + if (!item->text(1).isEmpty() && !item->text(4).isEmpty()){ + chkGlobal->setEnabled(true); + chkGlobal->setChecked(!item->text(2).isEmpty()); + }else{ + chkGlobal->setEnabled(false); + chkGlobal->setChecked(false); + } +} + +void ShortcutsConfig::keyClear() +{ + QTreeWidgetItem *item = lstKeys->currentItem(); + if (item == NULL) + return; + item->setText(1, QString::null); + edtKey->setText(QString::null); + edtKey->clearFocus(); +} + +void ShortcutsConfig::keyChanged() +{ + QTreeWidgetItem *item = lstKeys->currentItem(); + if (item == NULL) + return; + QString key = edtKey->text(); + if (key.isEmpty() || item->text(4).isEmpty()){ + chkGlobal->setChecked(false); + chkGlobal->setEnabled(false); + }else{ + chkGlobal->setEnabled(true); + } + item->setText(1, key); + edtKey->clearFocus(); +} + +void ShortcutsConfig::globalChanged(bool) +{ + QTreeWidgetItem *item = lstKeys->currentItem(); + if ((item == NULL) || item->text(4).isEmpty()) + return; + item->setText(2, chkGlobal->isChecked() ? i18n("Global") : QString::null); +} + +// vim: set expandtab: + diff --git a/plugins/shortcuts/shortcutcfg.h b/plugins/shortcuts/shortcutcfg.h new file mode 100644 index 0000000..2abd87e --- /dev/null +++ b/plugins/shortcuts/shortcutcfg.h @@ -0,0 +1,49 @@ +/*************************************************************************** + shortcutcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SHORTCUTCFG_H +#define _SHORTCUTCFG_H + +#include "ui_shortcutcfgbase.h" + +class MouseConfig; +class ShortcutsPlugin; + +class ShortcutsConfig : public QWidget, public Ui::ShortcutCfg +{ + Q_OBJECT +public: + ShortcutsConfig(QWidget *parent, ShortcutsPlugin *plugin); + ~ShortcutsConfig(); +public slots: + void apply(); +protected slots: + void selectionChanged(); + void keyChanged(); + void keyClear(); + void globalChanged(bool); +protected: + virtual void resizeEvent(QResizeEvent*); + void adjustColumns(); + void loadMenu(unsigned long id, bool bCanGlobal); + void saveMenu(unsigned long id); + ShortcutsPlugin *m_plugin; + MouseConfig *mouse_cfg; +}; + +#endif + diff --git a/plugins/shortcuts/shortcutcfgbase.ui b/plugins/shortcuts/shortcutcfgbase.ui new file mode 100644 index 0000000..db47a77 --- /dev/null +++ b/plugins/shortcuts/shortcutcfgbase.ui @@ -0,0 +1,109 @@ + + + ShortcutCfg + + + + 0 + 0 + 309 + 180 + + + + Form1 + + + + 6 + + + 11 + + + + + 3 + + + + Command + + + + + Key + + + + + Global + + + + + + + + + + + false + + + + + + + 6 + + + 0 + + + + + + + + &Clear + + + + + + + Global + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + QKeyButton + QWidget +
    simgui/qkeybutton.h
    +
    +
    + + +
    diff --git a/plugins/shortcuts/shortcuts.cpp b/plugins/shortcuts/shortcuts.cpp new file mode 100644 index 0000000..7d7400e --- /dev/null +++ b/plugins/shortcuts/shortcuts.cpp @@ -0,0 +1,870 @@ +/*************************************************************************** + shortcuts.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include "log.h" +#include "cmddef.h" +#include "core.h" + +#include "profile.h" +#include "profilemanager.h" + +#include "shortcuts.h" +#include "shortcutcfg.h" +#include "mainwin.h" + +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 + #include +#else + #if !defined(Q_OS_MAC) + #include + #ifdef USE_KDE + #include + #else + #define XK_MISCELLANY 1 + #include + #include + #include + #include + #endif + #endif +#endif + +using namespace std; +using namespace SIM; + +Plugin *createShortcutsPlugin(unsigned base, bool, Buffer *config) +{ + return new ShortcutsPlugin(base, config); +} + +static PluginInfo info = + { + I18N_NOOP("Shortcuts"), + I18N_NOOP("Plugin provides keyboards shortcuts and global mouse functions"), + VERSION, + createShortcutsPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +//static DataDef shortcutsData[] = +// { +// { "Key", DATA_STRLIST, 1, 0 }, +// { "Global", DATA_STRLIST, 1, 0 }, +// { "Mouse", DATA_STRLIST, 1, 0 }, +// { NULL, DATA_UNKNOWN, 0, 0 } +// }; + +void GlobalKey::execute() +{ + EventCommandExec(&m_cmd).process();; +} + +list *globalKeys = NULL; + +#ifdef WIN32 + +struct vkCode +{ + int vk; + Qt::Key key; +}; + +static vkCode vkCodes[] = + { + { VK_BACK, Qt::Key_Backspace }, + { VK_TAB, Qt::Key_Tab }, + { VK_RETURN, Qt::Key_Return }, + { VK_SHIFT, Qt::Key_Shift }, + { VK_CONTROL, Qt::Key_Control }, + { VK_MENU, Qt::Key_Menu }, + { VK_PAUSE, Qt::Key_Pause }, + { VK_ESCAPE, Qt::Key_Escape }, + { VK_SPACE, Qt::Key_Space }, + { VK_PRIOR, Qt::Key_PageUp }, + { VK_NEXT, Qt::Key_PageDown }, + { VK_END, Qt::Key_End }, + { VK_HOME, Qt::Key_Home }, + { VK_LEFT, Qt::Key_Left }, + { VK_UP, Qt::Key_Up }, + { VK_RIGHT, Qt::Key_Right }, + { VK_DOWN, Qt::Key_Down }, + { VK_PRINT, Qt::Key_Print }, + { VK_INSERT, Qt::Key_Insert }, + { VK_DELETE, Qt::Key_Delete }, + { VK_HELP, Qt::Key_Help }, + { '0', Qt::Key_0 }, + { '1', Qt::Key_1 }, + { '2', Qt::Key_2 }, + { '3', Qt::Key_3 }, + { '4', Qt::Key_4 }, + { '5', Qt::Key_5 }, + { '6', Qt::Key_6 }, + { '7', Qt::Key_7 }, + { '8', Qt::Key_8 }, + { '9', Qt::Key_9 }, + { 'A', Qt::Key_A }, + { 'B', Qt::Key_B }, + { 'C', Qt::Key_C }, + { 'D', Qt::Key_D }, + { 'E', Qt::Key_E }, + { 'F', Qt::Key_F }, + { 'G', Qt::Key_G }, + { 'H', Qt::Key_H }, + { 'I', Qt::Key_I }, + { 'J', Qt::Key_J }, + { 'K', Qt::Key_K }, + { 'L', Qt::Key_L }, + { 'M', Qt::Key_M }, + { 'N', Qt::Key_N }, + { 'O', Qt::Key_O }, + { 'P', Qt::Key_P }, + { 'Q', Qt::Key_Q }, + { 'R', Qt::Key_R }, + { 'S', Qt::Key_S }, + { 'T', Qt::Key_T }, + { 'U', Qt::Key_U }, + { 'V', Qt::Key_V }, + { 'W', Qt::Key_W }, + { 'X', Qt::Key_X }, + { 'Y', Qt::Key_Y }, + { 'Z', Qt::Key_Z }, + { VK_ADD, Qt::Key_Plus }, + { VK_SUBTRACT, Qt::Key_Minus }, + { VK_DECIMAL, Qt::Key_Period }, + { VK_F1, Qt::Key_F1 }, + { VK_F2, Qt::Key_F2 }, + { VK_F3, Qt::Key_F3 }, + { VK_F4, Qt::Key_F4 }, + { VK_F5, Qt::Key_F5 }, + { VK_F6, Qt::Key_F6 }, + { VK_F7, Qt::Key_F7 }, + { VK_F8, Qt::Key_F8 }, + { VK_F9, Qt::Key_F9 }, + { VK_F10, Qt::Key_F10 }, + { VK_F11, Qt::Key_F11 }, + { VK_F12, Qt::Key_F12 }, + { VK_F13, Qt::Key_F13 }, + { VK_F14, Qt::Key_F14 }, + { VK_F15, Qt::Key_F15 }, + { VK_F16, Qt::Key_F16 }, + { VK_F17, Qt::Key_F17 }, + { VK_F18, Qt::Key_F18 }, + { VK_F19, Qt::Key_F19 }, + { VK_F20, Qt::Key_F20 }, + { VK_F21, Qt::Key_F21 }, + { VK_F22, Qt::Key_F22 }, + { VK_F23, Qt::Key_F23 }, + { VK_F24, Qt::Key_F24 }, + { VK_NUMLOCK, Qt::Key_NumLock }, + { VK_SCROLL, Qt::Key_ScrollLock }, + { 0, (Qt::Key)0 } + }; + +static void getKey(const QString &key_str, int &mod, int &key) +{ + mod = 0; + key = 0; + int kkey = QKeySequence::fromString(key_str); + if (kkey & Qt::ALT) mod |= MOD_ALT; + if (kkey & Qt::CTRL) mod |= MOD_CONTROL; + if (kkey & Qt::SHIFT) mod |= MOD_SHIFT; + kkey &= ~(Qt::MODIFIER_MASK | Qt::UNICODE_ACCEL); + for (const vkCode *k = vkCodes; k->vk; k++){ + if (k->key == kkey){ + key = k->vk; + break; + } + } +} + +GlobalKey::GlobalKey(CommandDef *cmd) +{ + m_cmd = *cmd; + int mod, key; + getKey(cmd->accel, mod, key); + QWidget *main = ShortcutsPlugin::getMainWindow(); + if (key && main){ + QString atom = "sim_" + QString::number(cmd->id); + m_key = GlobalAddAtom((LPCWSTR)atom.utf16()); + RegisterHotKey(main->winId(), m_key, mod, key); + } +} + +GlobalKey::~GlobalKey() +{ + QWidget *main = ShortcutsPlugin::getMainWindow(); + if (m_key && main){ + UnregisterHotKey(main->winId(), m_key); + DeleteAtom((unsigned short)m_key); + } +} + +static WNDPROC oldProc = NULL; + +LRESULT CALLBACK keysWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (msg == WM_HOTKEY){ + if (globalKeys){ + for (list::iterator it = globalKeys->begin(); it != globalKeys->end(); ++it){ + if ((UINT)((*it)->key()) == wParam){ + (*it)->execute(); + break; + } + } + } + } + if (oldProc) + return oldProc(hWnd, msg, wParam, lParam); + return 0; +} + +#else // WIN32 +#ifdef USE_KDE + +GlobalKey::GlobalKey(CommandDef *cmd) +{ + m_cmd = *cmd; + QKeySequence keys(cmd->accel); + if (keys != QKeySequence(0)){ + QString shortName = "sim_" + QString::number(cmd->id); + accel = new KGlobalAccel(this); + accel->insert(shortName, + i18n(cmd->text), i18n(cmd->text), + keys, keys, this, SLOT(execute())); + accel->updateConnections(); + } +} + +GlobalKey::~GlobalKey() +{ + if (accel) + delete accel; +} + +#else // USE_KDE +#if !defined(Q_OS_MAC) + +struct TransKey +{ + unsigned qt_key; + unsigned x_key; +}; + +static const TransKey g_rgQtToSymX[] = + { + { Qt::Key_Escape, XK_Escape }, + { Qt::Key_Tab, XK_Tab }, + { Qt::Key_Backspace, XK_BackSpace }, + { Qt::Key_Return, XK_Return }, + { Qt::Key_Enter, XK_KP_Enter }, + { Qt::Key_Insert, XK_Insert }, + { Qt::Key_Delete, XK_Delete }, + { Qt::Key_Pause, XK_Pause }, + { Qt::Key_Print, XK_Print }, + { Qt::Key_SysReq, XK_Sys_Req }, + { Qt::Key_Home, XK_Home }, + { Qt::Key_End, XK_End }, + { Qt::Key_Left, XK_Left }, + { Qt::Key_Up, XK_Up }, + { Qt::Key_Right, XK_Right }, + { Qt::Key_Down, XK_Down }, + { Qt::Key_PageUp, XK_Prior }, + { Qt::Key_PageDown, XK_Next }, + { Qt::Key_CapsLock, XK_Caps_Lock }, + { Qt::Key_NumLock, XK_Num_Lock }, + { Qt::Key_ScrollLock, XK_Scroll_Lock }, + { Qt::Key_F1, XK_F1 }, + { Qt::Key_F2, XK_F2 }, + { Qt::Key_F3, XK_F3 }, + { Qt::Key_F4, XK_F4 }, + { Qt::Key_F5, XK_F5 }, + { Qt::Key_F6, XK_F6 }, + { Qt::Key_F7, XK_F7 }, + { Qt::Key_F8, XK_F8 }, + { Qt::Key_F9, XK_F9 }, + { Qt::Key_F10, XK_F10 }, + { Qt::Key_F11, XK_F11 }, + { Qt::Key_F12, XK_F12 }, + { Qt::Key_F13, XK_F13 }, + { Qt::Key_F14, XK_F14 }, + { Qt::Key_F15, XK_F15 }, + { Qt::Key_F16, XK_F16 }, + { Qt::Key_F17, XK_F17 }, + { Qt::Key_F18, XK_F18 }, + { Qt::Key_F19, XK_F19 }, + { Qt::Key_F20, XK_F20 }, + { Qt::Key_F21, XK_F21 }, + { Qt::Key_F22, XK_F22 }, + { Qt::Key_F23, XK_F23 }, + { Qt::Key_F24, XK_F24 }, + { Qt::Key_F25, XK_F25 }, + { Qt::Key_F26, XK_F26 }, + { Qt::Key_F27, XK_F27 }, + { Qt::Key_F28, XK_F28 }, + { Qt::Key_F29, XK_F29 }, + { Qt::Key_F30, XK_F30 }, + { Qt::Key_F31, XK_F31 }, + { Qt::Key_F32, XK_F32 }, + { Qt::Key_F33, XK_F33 }, + { Qt::Key_F34, XK_F34 }, + { Qt::Key_F35, XK_F35 }, + { Qt::Key_Super_L, XK_Super_L }, + { Qt::Key_Super_R, XK_Super_R }, + { Qt::Key_Menu, XK_Menu }, + { Qt::Key_Hyper_L, XK_Hyper_L }, + { Qt::Key_Hyper_R, XK_Hyper_R }, + { Qt::Key_Help, XK_Help }, + { '/', XK_KP_Divide }, + { '*', XK_KP_Multiply }, + { '-', XK_KP_Subtract }, + { '+', XK_KP_Add }, + { Qt::Key_Return, XK_KP_Enter }, + { 0, 0 } + }; + +extern "C" { + static int XGrabErrorHandler( Display *, XErrorEvent *e ) { + if ( e->error_code != BadAccess ) { + log(L_DEBUG, "grabKey: got X error %u instead of BadAccess", e->type); + } + return 0; + } +} + +// from KGlobalAccel +static uint g_keyModMaskXOnOrOff = 0; +static void initializeMods() +{ + uint g_modXNumLock, g_modXScrollLock, g_modXModeSwitch; + g_modXNumLock = g_modXScrollLock = g_modXModeSwitch = 0; + int min_keycode, max_keycode; + int keysyms_per_keycode = 0; + + XModifierKeymap* xmk = XGetModifierMapping(QX11Info::display() ); + XDisplayKeycodes(QX11Info::display(), &min_keycode, &max_keycode ); + XFree( XGetKeyboardMapping(QX11Info::display(), min_keycode, 1, &keysyms_per_keycode )); + for( int i = Mod2MapIndex; i < 8; i++ ) { + uint mask = (1 << i); + uint keySymX = NoSymbol; + for( int j = 0; j < xmk->max_keypermod && keySymX == NoSymbol; ++j ) + for( int k = 0; k < keysyms_per_keycode && keySymX == NoSymbol; ++k ) + keySymX = XKeycodeToKeysym(QX11Info::display(), xmk->modifiermap[xmk->max_keypermod * i + j], k ); + switch(keySymX) + { + case XK_Num_Lock: g_modXNumLock = mask; break; // Normally Mod2Mask + case XK_Scroll_Lock: g_modXScrollLock = mask; break; // Normally Mod5Mask + case XK_Mode_switch: g_modXModeSwitch = mask; break; + } + } + XFreeModifiermap(xmk); + g_keyModMaskXOnOrOff = LockMask | g_modXNumLock | g_modXScrollLock | g_modXModeSwitch; +} + +GlobalKey::GlobalKey(CommandDef *cmd) +{ + m_cmd = *cmd; + m_key = QKeySequence::fromString(cmd->accel); + m_state = 0; + if (m_key & Qt::SHIFT){ + m_key &= ~Qt::SHIFT; + m_state |= 1; + } + if (m_key & Qt::CTRL){ + m_key &= ~Qt::CTRL; + m_state |= 4; + } + if (m_key & Qt::ALT){ + m_key &= ~Qt::ALT; + m_state |= 8; + } + m_key &= ~Qt::UNICODE_ACCEL; + for (const TransKey *t = g_rgQtToSymX; t->x_key; t++){ + if (t->qt_key == m_key){ + m_key = t->x_key; + break; + } + } + + if(!g_keyModMaskXOnOrOff) + initializeMods(); + + m_key = XKeysymToKeycode(QX11Info::display(), m_key); + XSync(QX11Info::display(), 0 ); + XErrorHandler savedErrorHandler = XSetErrorHandler(XGrabErrorHandler); + + uint keyModMaskX = ~g_keyModMaskXOnOrOff; + /* + for( uint irrelevantBitsMask = 0; irrelevantBitsMask <= 0xff; irrelevantBitsMask++ ) + if( (irrelevantBitsMask & keyModMaskX) == 0 ) + XGrabKey(QX11Info::display(), m_key, m_state | irrelevantBitsMask, qt_xrootwin(), True, GrabModeAsync, GrabModeSync); + */ + + XSync(QX11Info::display(), 0 ); + XSetErrorHandler( savedErrorHandler ); +} + +GlobalKey::~GlobalKey() +{ + uint keyModMaskX = ~g_keyModMaskXOnOrOff; + + /* + for( uint irrelevantBitsMask = 0; irrelevantBitsMask <= 0xff; irrelevantBitsMask++ ) + if( (irrelevantBitsMask & keyModMaskX) == 0 ) + XUngrabKey( qt_xdisplay(), m_key, m_state | irrelevantBitsMask, qt_xrootwin()); + */ +} + +typedef int (*QX11EventFilter) (::XEvent*); +//QX11EventFilter qt_set_x11_event_filter (QX11EventFilter filter); +static QX11EventFilter oldFilter; + +static int X11EventFilter(::XEvent *e) +{ + if ((e->type == KeyPress) && globalKeys){ + if ( !QWidget::keyboardGrabber() && !QApplication::activePopupWidget() ) { + XUngrabKeyboard(QX11Info::display(), e->xkey.time ); + XFlush(QX11Info::display()); + } + unsigned state = e->xkey.state & (ShiftMask | ControlMask | Mod1Mask | Mod4Mask | 0x2000); + + for (list::iterator it = globalKeys->begin(); it != globalKeys->end(); ++it){ + if (((*it)->key() == e->xkey.keycode) && + ((*it)->state() == state)){ + (*it)->execute(); + return true; + } + } + } + if (oldFilter) + return oldFilter(e); + return false; +} + +#else // !Q_OS_MAC + +GlobalKey::GlobalKey(SIM::CommandDef *cmd) +{ +} + +GlobalKey::~GlobalKey() +{ +} + +#endif // !Q_OS_MAC +#endif // USE_KDE +#endif // WIN32 + +ShortcutsPlugin::ShortcutsPlugin(unsigned base, Buffer *config) + : QObject(), Plugin(base) +{ + m_propertyHub = SIM::PropertyHub::create("shortcuts"); +#ifdef WIN32 + m_bInit = false; + init(); +#else + applyKeys(); +#ifndef USE_KDE +// oldFilter = qt_set_x11_event_filter(X11EventFilter); +#endif +#endif +} + +ShortcutsPlugin::~ShortcutsPlugin() +{ +#ifdef WIN32 + QWidget *main = getMainWindow(); + if (main && oldProc){ + if (IsWindowUnicode(main->winId())){ + SetWindowLongW(main->winId(), GWL_WNDPROC, (LONG)oldProc); + }else{ + SetWindowLongA(main->winId(), GWL_WNDPROC, (LONG)oldProc); + } + } +#else +#ifndef USE_KDE + //qt_set_x11_event_filter(oldFilter); +#endif +#endif + releaseKeys(); +} + +QByteArray ShortcutsPlugin::getConfig() +{ + return QByteArray();//Fixmee +} + +QWidget *ShortcutsPlugin::createConfigWindow(QWidget *parent) +{ + return new ShortcutsConfig(parent, this); +} + +#ifdef WIN32 + +void ShortcutsPlugin::init() +{ + if (m_bInit) + return; + QWidget *main = getMainWindow(); + if (main){ + if (IsWindowUnicode(main->winId())){ + oldProc = (WNDPROC)SetWindowLongW(main->winId(), GWL_WNDPROC, (LONG)keysWndProc); + }else{ + oldProc = (WNDPROC)SetWindowLongA(main->winId(), GWL_WNDPROC, (LONG)keysWndProc); + } + m_bInit = true; + applyKeys(); + } +} + +#endif + +bool ShortcutsPlugin::processEvent(Event *e) +{ +#ifdef WIN32 + if (e->type() == eEventInit){ + init(); + return false; + } else +#endif + if (e->type() == eEventCommandCreate){ + EventCommandCreate *ecc = static_cast(e); + CommandDef *cmd = ecc->cmd(); + if ((cmd->menu_id == MenuMain) || + (cmd->menu_id == MenuContact) || + (cmd->menu_id == MenuStatus) || + (cmd->menu_id == MenuGroup)){ + applyKey(cmd); + } + } else + if (e->type() == eEventCommandRemove){ + EventCommandRemove *ecr = static_cast(e); + unsigned long id = ecr->id(); + MAP_STR::iterator it_key = oldKeys.find(id); + if (it_key != oldKeys.end()) + oldKeys.erase(it_key); + MAP_BOOL::iterator it_global = oldGlobals.find(id); + if (it_global != oldGlobals.end()) + oldGlobals.erase(it_global); + if (globalKeys){ + list::iterator it; + for (it = globalKeys->begin(); it != globalKeys->end();){ + if ((*it)->id() != id){ + ++it; + continue; + } + delete *it; + globalKeys->erase(it); + it = globalKeys->begin(); + } + } + for (MAP_CMDS::iterator it = mouseCmds.begin(); it != mouseCmds.end();){ + if (it->second.id != id){ + ++it; + continue; + } + mouseCmds.erase(it); + it = mouseCmds.begin(); + } + if (mouseCmds.size() == 0) + qApp->removeEventFilter(this); + } + if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("shortcut"); + if(!hub.isNull()) + setPropertyHub(hub); + } + return false; +} + +QString ShortcutsPlugin::getOldKey(CommandDef *cmd) +{ + MAP_STR::iterator it = oldKeys.find(cmd->id); + if (it != oldKeys.end()) + return it->second; + return cmd->accel; +} + +bool ShortcutsPlugin::getOldGlobal(CommandDef *cmd) +{ + MAP_BOOL::iterator it = oldGlobals.find(cmd->id); + if (it != oldGlobals.end()) + return it->second; + return ((cmd->flags & COMMAND_GLOBAL_ACCEL) != 0); +} + +void ShortcutsPlugin::applyKeys() +{ + applyKeys(MenuMain); + applyKeys(MenuGroup); + applyKeys(MenuContact); + applyKeys(MenuStatus); +} + +void ShortcutsPlugin::releaseKeys() +{ + releaseKeys(MenuMain); + releaseKeys(MenuGroup); + releaseKeys(MenuContact); + releaseKeys(MenuStatus); + oldKeys.clear(); + oldGlobals.clear(); + if (globalKeys){ + list::iterator it; + for (it = globalKeys->begin(); it != globalKeys->end(); ++it){ + delete *it; + } + delete globalKeys; + globalKeys = NULL; + } + mouseCmds.clear(); + qApp->removeEventFilter(this); +} + +void ShortcutsPlugin::applyKeys(unsigned long id) +{ + EventMenuGetDef eMenu(id); + eMenu.process(); + CommandsDef *def = eMenu.defs(); + if (def){ + CommandsList list(*def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + if (s->id == 0) continue; + applyKey(s); + } + } +} + +static const char *states[] = + { + "Left", + "Right", + "Mid", + "LeftDbl", + "RightDbl", + "MidDbl", + NULL + }; + +unsigned ShortcutsPlugin::stringToButton(const QString &cfg) +{ + Qt::KeyboardModifiers res = Qt::NoModifier; + QStringList config = cfg.split('+'); + Q_FOREACH(const QString &t, config) { + if (t == QLatin1String("Alt")){ + res |= Qt::AltModifier; + continue; + } + if (t == QLatin1String("Ctrl")){ + res |= Qt::ControlModifier; + continue; + } + if (t == QLatin1String("Shift")){ + res |= Qt::ShiftModifier; + continue; + } + unsigned i = 1; + for (const char **p = states; *p; p++, i++) { + if (t == *p){ + res |= (Qt::KeyboardModifier)i; + return res; + } + } + return 0; + } + return 0; +} + +QString ShortcutsPlugin::buttonToString(unsigned n) +{ + QString res; +// ToDo: Restore this +/* + if (n & Qt::AltButton) + res = "Alt+"; + if (n & Qt::ControlButton) + res = "Ctrl+"; + if (n & Qt::ShiftButton) + res = "Shift+"; +*/ + n = n & 7; + if (n == 0) + return QString::null; + n--; + const char **p; + for (p = states; *p && n; p++, n--) {} + if (*p == NULL) + return QString::null; + res += *p; + return res; +} + +void ShortcutsPlugin::applyKey(CommandDef *s) +{ + if (s->popup_id){ + QString cfg = value("Mouse").toMap().value(QString::number(s->id)).toString(); + if (!cfg.isEmpty()){ + unsigned btn = stringToButton(cfg); + if (mouseCmds.size() == 0) + qApp->installEventFilter(this); + mouseCmds.insert(MAP_CMDS::value_type(btn, *s)); + } + return; + } + QString cfg = value("Key").toMap().value(QString::number(s->id)).toString(); + if (!cfg.isEmpty()){ + oldKeys.insert(MAP_STR::value_type(s->id, s->accel)); + if (cfg != "-"){ + s->accel = cfg; + }else{ + s->accel = QString::null; + } + } + cfg = value("Global").toMap().value(QString::number(s->id)).toString(); + if (!cfg.isEmpty()){ + oldGlobals.insert(MAP_BOOL::value_type(s->id, (s->flags & COMMAND_GLOBAL_ACCEL) != 0)); + if (cfg.startsWith("-")){ + s->flags &= ~COMMAND_GLOBAL_ACCEL; + }else{ + s->flags |= COMMAND_GLOBAL_ACCEL; + } + } + if (!s->accel.isEmpty() && (s->flags & COMMAND_GLOBAL_ACCEL)) + { + if (globalKeys == NULL) + globalKeys = new list; + globalKeys->push_back(new GlobalKey(s)); + } +} + +void ShortcutsPlugin::releaseKeys(unsigned long id) +{ + EventMenuGetDef eMenu(id); + eMenu.process(); + CommandsDef *def = eMenu.defs(); + if (def){ + CommandsList list(*def, true); + CommandDef *s; + while ((s = ++list) != NULL){ + if ((s->id == 0) || s->popup_id) + continue; + MAP_STR::iterator it_key = oldKeys.find(s->id); + if (it_key != oldKeys.end()) + s->accel = (*it_key).second; + MAP_BOOL::iterator it_global = oldGlobals.find(s->id); + if (it_global != oldGlobals.end()){ + s->flags &= ~COMMAND_GLOBAL_ACCEL; + if ((*it_global).second) + s->flags |= COMMAND_GLOBAL_ACCEL; + } + } + } +} + +bool ShortcutsPlugin::eventFilter(QObject *o, QEvent *e) +{ + unsigned button = 0; + QMouseEvent *me = NULL; + if (e->type() == QEvent::MouseButtonPress){ + me = static_cast(e); + switch (me->button()){ + case Qt::LeftButton: + button = 1; + break; + case Qt::RightButton: + button = 2; + break; + case Qt::MidButton: + button = 3; + break; + default: + break; + } + } + if (e->type() == QEvent::MouseButtonDblClick){ + me = static_cast(e); + switch (me->button()){ + case Qt::LeftButton: + button = 4; + break; + case Qt::RightButton: + button = 5; + break; + case Qt::MidButton: + button = 6; + break; + default: + break; + } + } + if (me){ + button |= me->modifiers(); + MAP_CMDS::iterator it = mouseCmds.find(button); + if (it != mouseCmds.end()){ + CommandDef *cmd = &it->second; + EventMenuGet e(cmd); + e.process(); + QMenu *popup = e.menu(); + if (popup){ + popup->popup(me->globalPos()); + return true; + } + } + } + return QObject::eventFilter(o, e); +} + +QWidget *ShortcutsPlugin::getMainWindow() +{ + CorePlugin *core = GET_CorePlugin(); + return core->getMainWindow(); +} + +void ShortcutsPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr ShortcutsPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant ShortcutsPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void ShortcutsPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/shortcuts/shortcuts.h b/plugins/shortcuts/shortcuts.h new file mode 100644 index 0000000..6c3fc4e --- /dev/null +++ b/plugins/shortcuts/shortcuts.h @@ -0,0 +1,122 @@ +/*************************************************************************** + shortcuts.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SHORTCUTS_H +#define _SHORTCUTS_H + +#include +#include "simapi.h" + +#include +#include +#include + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" + +using namespace std; + +struct ShortcutsData +{ +// SIM::Data Key; +// SIM::Data Global; +// SIM::Data Mouse; +}; + +typedef map MAP_STR; +typedef map MAP_BOOL; +typedef map MAP_CMDS; + +class KGlobalAccel; + +class GlobalKey : public QObject +{ + Q_OBJECT +public: + GlobalKey(SIM::CommandDef *cmd); + ~GlobalKey(); + unsigned id() { return m_cmd.id; } +#ifdef WIN32 + int key() { return m_key; } +#else +#ifndef USE_KDE + unsigned key() { return m_key; } + unsigned state() { return m_state; } +#endif +#endif +public slots: + void execute(); +protected: + SIM::CommandDef m_cmd; +#ifdef WIN32 + int m_key; +#else +#ifdef USE_KDE + KGlobalAccel *accel; +#else + unsigned m_key; + unsigned m_state; +#endif +#endif +}; + +class ShortcutsPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + ShortcutsPlugin(unsigned, Buffer*); + virtual ~ShortcutsPlugin(); +// PROP_STRLIST(Key); +// PROP_STRLIST(Global); +// PROP_STRLIST(Mouse); + void applyKeys(); + void releaseKeys(); + QString getOldKey(SIM::CommandDef *cmd); + bool getOldGlobal(SIM::CommandDef *cmd); + static QWidget *getMainWindow(); + static unsigned stringToButton(const QString &cfg); + static QString buttonToString(unsigned button); + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +protected: + virtual bool eventFilter(QObject*, QEvent*); + virtual bool processEvent(SIM::Event *e); + virtual QByteArray getConfig(); + virtual QWidget *createConfigWindow(QWidget *parent); + void applyKeys(unsigned long); + void applyKey(SIM::CommandDef*); + void releaseKeys(unsigned long); +#ifdef WIN32 + void init(); + bool m_bInit; +#endif + ShortcutsData data; + MAP_STR oldKeys; + MAP_BOOL oldGlobals; + MAP_CMDS mouseCmds; + +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/shortcuts/shortcuts.rc b/plugins/shortcuts/shortcuts.rc new file mode 100644 index 0000000..5dd45d0 --- /dev/null +++ b/plugins/shortcuts/shortcuts.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Shortcuts plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "shortcuts\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "shortcuts.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/shortcuts/shortcuts.vcproj b/plugins/shortcuts/shortcuts.vcproj new file mode 100644 index 0000000..066924e --- /dev/null +++ b/plugins/shortcuts/shortcuts.vcproj @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/skype/call_end b/plugins/skype/call_end new file mode 100644 index 0000000..a3605ef --- /dev/null +++ b/plugins/skype/call_end @@ -0,0 +1,4 @@ +#!/bin/bash + +kill `ps -A | grep artsd` +artsd & diff --git a/plugins/skype/call_start b/plugins/skype/call_start new file mode 100644 index 0000000..9f75be6 --- /dev/null +++ b/plugins/skype/call_start @@ -0,0 +1,5 @@ +#!/bin/bash + +kill -9 `ps -A | grep artsd` && artsd -a null & +sleep 0.2 + diff --git a/plugins/skype/icons/cr16-action-call.png b/plugins/skype/icons/cr16-action-call.png new file mode 100644 index 0000000000000000000000000000000000000000..53a25d5a9965e69f8ec659fa408d64c1951ec1be GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr`%JCp&T-P~c%v|GVSc z)7#FXTdt@`2?)+r)az0yV+-kh-Q8=n+w`16oPpEiH@UBUHeEfqs&74mf~Ys=zXv7k z+7Vh}TuL`YQyzF4Fhxq-vi{)oDS@H6iibJoUK)$@>4Z{^riY)!tHdNXTxSl6&3+#G S>w+@Sat2RVKbLh*2~7aT^*eU} literal 0 HcmV?d00001 diff --git a/plugins/skype/icons/cr16-action-contact_ffc_overlay.png b/plugins/skype/icons/cr16-action-contact_ffc_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..51f51623e44a3dcdf12fe4222ae3d3007ebcfb3b GIT binary patch literal 884 zcmV-)1B?8LP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;>PbXFRCwBA{Qv(y10?_;fLK5TBO@b<;Q!6S3P8aC zAX5M;^nv03{|$`3Zy%tj16mFcK#X7lYQX!QJ!gPyIjpGy_K7Ye2=PfcO&7ipN0w zj)9TkE6|W{42-N78UC9{7=YBmv;hPV*ag3*GAb}>y5DEA`3MXUL54TSe=z*{`jbJz znFDCRBZjxffd>8g!yuv$ve!{1vU6j`(XKL7|IunT^DX9)N&^%rRCRiK6s z3{N+lWVqRP4CwzGK>UQ^#)O{?Pc{J+{u2ip^q=9sAQM;*NH0JDferZajX{7>02q+} z9T^yz5*fHfe=ul-uro0HeaXP^`wxSV1`~s{A<%ZV5C#SoD+WeBh#rt$fB*tV;}4J* zfBj(i{X&M}$>t^o)l85uFn#=B1scM{pq0-IG>C=a!HVq+GIqj1Z~h1C0ReyjVu8Bg z!_UWW8UFq_&+uyhR|ZygRt9;0pbP#1UG)#>$Un>sPj>%gcysCo1CIbd1E<(;upW?J zfB*sq;`J0p1zuB``!epp!1?~0;o0tQ44-cPWDw9|WBB#?Kg0VQe;BxB*cp`lgcw*j z85y1)ddBeS{9i@QIsYF31Q0wOoDE~>*C-TNcsls?lcDiS_oEA6KK%nanT3Igk)44{oQr{5k_#LT zAVa?b6X2CepDuvZ!t?CKmef_00TgS6o3?JW@2F20Mv+)nE(Qak<#o85MTfR_BKHAoqwzV0000< KMNUMnLSTaME_&Vo literal 0 HcmV?d00001 diff --git a/plugins/skype/icons/cr16-app-skype_protocol.png b/plugins/skype/icons/cr16-app-skype_protocol.png new file mode 100644 index 0000000000000000000000000000000000000000..33ff90e4136be08c0becd175f709c4943a1b9d02 GIT binary patch literal 379 zcmV->0fhdEP)%qEUu2L6Myq6Pqrbt2yVAqH^Tya%D>;RbXui|Gge?Ll5P zy#OD`YgtiaF&#Y(xMvP#v8lpYQN!7ueJ$8Ig#o~6_K>(_{;K3>J@H40GP&G-? zO5Eyr7heUoXJ2-pyGWrb*g%hM(1H%s#0H1Jfq|`rk1C`jtz_^#*^J>NtpotRzusE@ Ze*lD6sVV+mN{0Xd002ovPDHLkV1g}1nZf`7 literal 0 HcmV?d00001 diff --git a/plugins/skype/icons/cr22-action-call.png b/plugins/skype/icons/cr22-action-call.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc014c5e78d3de164c623fa288c6036da736642 GIT binary patch literal 515 zcmV+e0{s1nP)BjU6otS0B+>*DFrkBn4mEV>R*zW&9W!=lpiuWGWJ;G>R_RdFp}(MH33Tz0Y~ET( z2LFU?_RukdAqqr_^lk@7j*u8l( zSvx6YpPh;V7G|Ereptnj#F=cZ{L{0E_C_8)Y@B60u#002ovPDHLk FV1l{u^Rxf} literal 0 HcmV?d00001 diff --git a/plugins/skype/icons/cr32-action-call.png b/plugins/skype/icons/cr32-action-call.png new file mode 100644 index 0000000000000000000000000000000000000000..9a610b93d9463f16764772de44eeb5e74d301203 GIT binary patch literal 1017 zcmVu_2gNyO%_F>85kLv)H5^LUAE2dh~VS( zI3jq-aquoPZ^`Aj-&F&~Fp0niAhZds4nUm5R`lG*IVQCAGuw$mhnC^J4U zHMU{{9#5>38Lx@pY_Ty);jB{h&=muYgSSP{SuCFjT}siPTB~uug*Gfj9KcPb&{tbq z{m0_srwO3U3|LmIlex5$YfViR?*mm;-C<)mlE3p((*BK7G`rrn6$6Px8dtCWMZLWb zv~4?d?%eBU@7^5(0C(>`rYl!|x0vxFGomFF+#MneYmKBE<)l!VMw}8FT5^jYumQSUt}HgvQ5bKS`&vPXS7z$qaavk-7CeE)j5aK-&e00Q`vD9SVTcHi#>PHeEH=;r za0pAQbJ-xmuu_O`R_z-a@Osq|+vW}tTrNl4>s3u!tJ$h5Yu!FC1QHQw9cvdsn+Uo~ zjK3*z>8)~vmtg^b-*1f?!!x$c^NxeBi-_wZLciANt3({gPs8^1#;I_)=5Nc=eMGoe zFi7D?ttq~HckMu>23DTpg9pD?_wG$@%VbQ1Sz6cD1QE^?A-QCL9%`+|mq)5A23Ete nx+0DvKjXjd_-CWv>q_x2A`!I^fJ9K&00000NkvXXu0mjf%}wF0 literal 0 HcmV?d00001 diff --git a/plugins/skype/icons/hi16-action-call.png b/plugins/skype/icons/hi16-action-call.png new file mode 100644 index 0000000000000000000000000000000000000000..53a25d5a9965e69f8ec659fa408d64c1951ec1be GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr`%JCp&T-P~c%v|GVSc z)7#FXTdt@`2?)+r)az0yV+-kh-Q8=n+w`16oPpEiH@UBUHeEfqs&74mf~Ys=zXv7k z+7Vh}TuL`YQyzF4Fhxq-vi{)oDS@H6iibJoUK)$@>4Z{^riY)!tHdNXTxSl6&3+#G S>w+@Sat2RVKbLh*2~7aT^*eU} literal 0 HcmV?d00001 diff --git a/plugins/skype/icons/hi16-action-contact_ffc_overlay.png b/plugins/skype/icons/hi16-action-contact_ffc_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..d31ee4809ce7c0636a72b3b6f6d46a9c53e283a7 GIT binary patch literal 702 zcmV;v0zv(WP)7fIv*>CdOofA`BLaUL@%Vx(_ud5U-rMnBD|}AYPVvQJLL! z(YmNRQDI&PP8T?e4Cc_ohECgD?1zWJ(KF9EZx^SXX<*OI`@YZfexC31ec(Ug9rofK z_Fh?cURCe~d;~*5l&XSpYOwuro0bPH0O+cYye4z4_PKMslO}Hy*?1Q3u$TVPe)g0- zqK8q+8)X`r8vvMiHGyQVpCAP1~aaWYsK*-wD*5YELuzVw6}u#%^-=^4R&a zJpLg+EAuNnZmkNwu5zPtY!y2ockiKN`EVI!Ut#C<4yB)^%gY&wjW9RYDuh@ULM#Zw zcp`*o6sGAEfdHcWeK+nNcYR^LfDc160BGJ?7s23L1_$o~5DvG|+m{F6%V(IJ+z=7m zjv6chgr0{O2oC&BCGE~aBkV4Y^w#MR}pl;dyW%xbfA40X^{ImR?&gu`t%xEgVi zO6e4fP%24yraUP7N?qAFHHf~9S_$a~y?xuZVkV>0KLF{p^;Y&3w1Q?Sw?ArUY-)^j zB@N392$5hl;-t^7b8=z<glIW@q zfV?K-?r|gE_dC>_O726>hHuH=QGcmm)GbIgNM4ie + + + SIM-Skype Icons + 0.9.6 + SIM icons. + Tobias Franz + 2006-10-31 + http://sim-im.org/ + + + cr16-action-call.png + + + cr16-action-contact_ffc_overlay.png + + + cr16-app-skype_protocol.png + + + cr22-action-call.png + + + cr32-action-call.png + + + hi16-action-call.png + + + hi16-action-contact_ffc_overlay.png + + + hi16-action-contact_unknown_overlay.png + + + hi16-action-skype_connect.png + + + + + + + + + + + + diff --git a/plugins/skype/libskype/skype.cpp b/plugins/skype/libskype/skype.cpp new file mode 100644 index 0000000..d724209 --- /dev/null +++ b/plugins/skype/libskype/skype.cpp @@ -0,0 +1,797 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#include "skype.h" +#include +#include + +#include +#include +#include +#include +#include +#include + +#define PROTOCOL_MAX 5 +#define PROTOCOL_MIN 5 +#define TEST_QUIT if (!d->connection.connected()) return; + +///This one indicates, weather the Skype is connected (does not mean weather it is marked as online, just if it has connection to the site) +typedef enum { + csOffline, + csConnecting, + csPausing, + csOnline, + csLoggedOut +} connectionStatus; + +///This describes what the user is marked as. If online here and not connected to skype site, he is probably offline +typedef enum { + usUnknown, + usOffline, + usOnline, + usSkypeMe, + usAway, + usNA, + usDND, + usInvisible +} userStatus; + +class SkypePrivate { + public: + ///The connection + SkypeConnection connection; + ///The queue + QValueList messageQueue; + ///How do we start skype? + int launchType; + ///What is our name? + QString appName; + ///Should the skypeconnection start skype automatically if it is not running? + bool start; + ///Is the skype connected? + connectionStatus connStatus; + ///What is the online status for the user? + userStatus onlineStatus; + ///This contains last search request to know, what we were searching for + QString searchFor; + ///Is the hitch-mode enabled? + bool hitch; + ///Is the mark read messages mode enabled? + bool mark; + ///The skype account this connection belongs to + SkypeAccount &account; + ///Should we show the message that Skype died? It if off when going offline, this removes that onnoying message when logging off and skype finishes first. + bool showDeadMessage; + ///Do we automatically scan for unread messages on login? + bool scanForUnread; + ///Constructor + SkypePrivate(SkypeAccount &_account) : account(_account) {};//initialize all that needs it + ///List of known calls, so they are not showed twice + QValueList knownCalls; + ///Are the pings enabled? + bool pings; + ///Pinging timer + QTimer *pingTimer; + ///What bus is used now? + int bus; + ///Do we start DBus as well if needed? + bool startDBus; + ///The launch timeout (after that no connection -> unsuccessfull -> error) + int launchTimeout; + ///By what command is skype started? + QString skypeCommand; + ///Do we wait before connecting? + int waitBeforeConnect; + ///List of alredy received messages (IDs) + QValueList recvMessages; +}; + +Skype::Skype(SkypeAccount &account) : QObject() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d = new SkypePrivate(account);//create the d-pointer + + //initial values + d->connStatus = csOffline; + d->onlineStatus = usOffline; + d->searchFor = ""; + d->pings = false; + d->pingTimer = new QTimer; + + connect(&d->connection, SIGNAL(connectionClosed(int)), this, SLOT(closed(int)));//tell me if you close/lose the connection + connect(&d->connection, SIGNAL(connectionDone(int, int)), this, SLOT(connectionDone(int, int)));//Do something whe he finishes connecting + connect(&d->connection, SIGNAL(error(const QString&)), this, SLOT(error(const QString&)));//Listen for errors + connect(&d->connection, SIGNAL(received(const QString&)), this, SLOT(skypeMessage(const QString&)));//Take all incoming messages + connect(d->pingTimer, SIGNAL(timeout()), this, SLOT(ping())); +} + + +Skype::~Skype() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->connection.connected()) + d->connection << QString("SET USERSTATUS OFFLINE"); + + d->pingTimer->stop(); + d->pingTimer->deleteLater(); + + delete d;//release the memory +} + +void Skype::setOnline() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + d->showDeadMessage = true; + + if ((d->onlineStatus == usOnline) && (d->connStatus == csOnline) && (d->connection.connected())) + return;//Already online + + queueSkypeMessage("SET USERSTATUS ONLINE", true);//just send the message +} + +void Skype::setOffline() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + d->showDeadMessage = false; + + d->connection << QString("SET USERSTATUS OFFLINE");//this one special, do not connect to skype because of that + d->connection.disconnectSkype(); +} + +void Skype::setAway() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + d->showDeadMessage = true; + + queueSkypeMessage("SET USERSTATUS AWAY", true); +} + +void Skype::setNotAvailable() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + d->showDeadMessage = true; + + queueSkypeMessage("SET USERSTATUS NA", true); +} + +void Skype::setDND() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + d->showDeadMessage = true; + + queueSkypeMessage("SET USERSTATUS DND", true); +} + +void Skype::setInvisible() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + d->showDeadMessage = true; + + queueSkypeMessage("SET USERSTATUS INVISIBLE", true); +} + +void Skype::setSkypeMe() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + d->showDeadMessage = true; + + queueSkypeMessage("SET USERSTATUS SKYPEME", true); +} + +void Skype::queueSkypeMessage(const QString &message, bool deleteQueue) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->connection.connected()) {//we are connected, so just send it + d->connection << message;//just send it + } else { + emit statusConnecting();//Started connecting to skype + if (deleteQueue) + d->messageQueue.clear();//delete all old messages + d->messageQueue << message;//add the new one + d->connection.connectSkype((d->start) ? d->skypeCommand : "", d->appName, PROTOCOL_MAX, d->bus, d->startDBus, d->launchTimeout, d->waitBeforeConnect);//try to connect + } +} + +void Skype::setValues(int launchType, const QString &appName) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->appName = appName; + if (d->appName.isEmpty()) //The defaut one? + d->appName = "SIM-IM"; + d->launchType = launchType; + switch (launchType) { + case 0: //start the skype if it is needed + d->start = true;//just set autostart + break; + case 1: //do not start + d->start = false;//do not start + break; + } +} + +void Skype::closed(int) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + emit wentOffline();//No longer connected + d->messageQueue.clear();//no messages will wait, it was lost + d->pingTimer->stop(); +} + +void Skype::connectionDone(int error, int protocolVer) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->pings) { + d->pingTimer->start(1000); + } + + if (error == seSuccess) {//It worked + if (protocolVer < PROTOCOL_MIN) {//The protocol is too old, it is not useable + this->error(i18n("This version of Skype is too old, consider upgrading")); + connectionDone(seUnknown, 0);//So act like there was an error + return;//and it is all fo now + } + + while (d->messageQueue.size()) {//It isn't empty yet? + QValueList::iterator it = d->messageQueue.begin();//take the first one + d->connection << (*it);//send the message + d->messageQueue.remove(it);//remove this one + } + emit updateAllContacts();//let all contacts update their information + search("FRIENDS");//search for friends - to add them all + TEST_QUIT;//if it failed, do not continue + d->connection.send("GET USERSTATUS"); + TEST_QUIT; + d->connection.send("GET CONNSTATUS");// + } else { + closed(crLost);//OK, this is wrong, justclose the connection/atempt and delete the queue + } +} + +void Skype::error(const QString &message) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + disconnect(&d->connection, SIGNAL(error(const QString&)), this, SLOT(error(const QString&)));//One arror at a time is enough, stop flooding the user + + if (d->showDeadMessage)//just skip the error message if we are going offline, none ever cares. + KMessageBox::error(0L, message, i18n("Skype protocol"));//Show the message + + connect(&d->connection, SIGNAL(error(const QString&)), this, SLOT(error(const QString&)));//Continue showing more errors in future +} + +void Skype::skypeMessage(const QString &message) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + QString messageType = message.section(' ', 0, 0).stripWhiteSpace().upper();//get the first part of the message + if (messageType == "CONNSTATUS") {//the connection status + QString value = message.section(' ', 1, 1).stripWhiteSpace().upper();//get the second part of the message + if (value == "OFFLINE") + d->connStatus = csOffline; + else if (value == "CONNECTING") + d->connStatus = csConnecting; + else if (value == "PAUSING") + d->connStatus = csPausing; + else if (value == "ONLINE") + d->connStatus = csOnline; + else if (value == "LOGGEDOUT") + d->connStatus = csLoggedOut; + + resetStatus();//set new status + } else if (messageType == "USERSTATUS") {//Status of this user + QString value = message.section(' ', 1, 1).stripWhiteSpace().upper();//get the second part + if (value == "UNKNOWN") + d->onlineStatus = usUnknown; + else if (value == "OFFLINE") + d->onlineStatus = usOffline; + else if (value == "ONLINE") + d->onlineStatus = usOnline; + else if (value == "SKYPEME") + d->onlineStatus = usSkypeMe; + else if (value == "AWAY") + d->onlineStatus = usAway; + else if (value == "NA") + d->onlineStatus = usNA; + else if (value == "DND") + d->onlineStatus = usDND; + else if (value == "INVISIBLE") + d->onlineStatus = usInvisible; + + resetStatus(); + } else if (messageType == "USERS") {//some user info + QString theRest = message.section(' ', 1).stripWhiteSpace();//take the rest + if (d->searchFor == "FRIENDS") {//it was initial search for al users + QStringList names = QStringList::split(",", theRest);//divide it into names by comas + kdDebug(14311) << "Names: " << names << endl;//write what you have done with that + for (QStringList::iterator it = names.begin(); it != names.end(); ++it) {//run trough the names + QString name = (*it).stripWhiteSpace();//get the name only + if (name.isEmpty()) + continue;//just skip the empty names + emit newUser(name);//add the user to list + } + if (d->scanForUnread) + search("MISSEDMESSAGES"); + } + } else if (messageType == "USER") {//This is for some contact + const QString &contactId = message.section(' ', 1, 1);//take the second part, it is the user name + const QString &type = message.section(' ', 2, 2).stripWhiteSpace().upper();//get what it is + if ((type == "FULLNAME") || (type == "DISPLAYNAME") || (type == "SEX") || + (type == "PHONE_HOME") || (type == "PHONE_OFFICE") || + (type == "PHONE_MOBILE") || + (type == "ONLINESTATUS") || (type == "BUDDYSTATUS") || (type == "HOMEPAGE")) { + const QString &info = message.section(' ', 2);//and the rest is just the message for that contact + emit contactInfo(contactId, info);//and let the contact know + } else kdDebug(14311) << "Unknown message for contact, ignored" << endl; + } else if (messageType == "CHATMESSAGE") {//something with message, maebe incoming/sent + QString messageId = message.section(' ', 1, 1).stripWhiteSpace();//get the second part of message - it is the message ID + QString type = message.section(' ', 2, 2).stripWhiteSpace().upper();//This part significates what about the message are we talking about (status, body, etc..) + QString chatMessageType = (d->connection % QString("GET CHATMESSAGE %1 TYPE").arg(messageId)).section(' ', 3, 3).stripWhiteSpace().upper(); + if (chatMessageType == "ADDEDMEMBERS") { + QString status = message.section(' ', 3, 3).stripWhiteSpace().upper(); + if (d->recvMessages.find(messageId) != d->recvMessages.end()) + return; + d->recvMessages << messageId; + const QString &users = (d->connection % QString("GET CHATMESSAGE %1 USERS").arg(messageId)).section(' ', 3).stripWhiteSpace(); + QStringList splitUsers = QStringList::split(' ', users); + const QString &chatId = (d->connection % QString("GET CHATMESSAGE %1 CHATNAME").arg(messageId)).section(' ', 3, 3).stripWhiteSpace(); + for (QStringList::iterator it = splitUsers.begin(); it != splitUsers.end(); ++it) { + if ((*it).upper() == getMyself().upper()) + continue; + emit joinUser(chatId, *it); + } + return; + } else if (chatMessageType == "LEFT") { + QString status = message.section(' ', 3, 3).stripWhiteSpace().upper(); + if (d->recvMessages.find(messageId) != d->recvMessages.end()) + return; + d->recvMessages << messageId; + const QString &chatId = (d->connection % QString("GET CHATMESSAGE %1 CHATNAME").arg(messageId)).section(' ', 3, 3).stripWhiteSpace(); + const QString &chatType = (d->connection % QString("GET CHAT %1 STATUS").arg(chatId)).section(' ', 3, 3).stripWhiteSpace().upper(); + if ((chatType == "DIALOG") || (chatType == "LEGACY_DIALOG")) + return; + const QString &user = (d->connection % QString("GET CHATMESSAGE %1 FROM_HANDLE").arg(messageId)).section(' ', 3, 3).stripWhiteSpace(); + const QString &reason = (d->connection % QString("GET CHATMESSAGE %1 LEAVEREASON").arg(messageId)).section(' ', 3, 3).stripWhiteSpace().upper(); + QString showReason = i18n("Unknown"); + if (reason == "USER_NOT_FOUND") { + showReason = i18n("User not found"); + } else if (reason == "USER_INCAPABLE") { + showReason = i18n("Does not have multi-user chat capability"); + } else if ((reason == "ADDER_MUST_BE_FRIEND") || ("ADDER_MUST_BE_AUTHORIZED")) { + showReason = i18n("Chat denied"); + } else if (reason == "UNSUBSCRIBE") { + showReason = ""; + } + if (user.upper() == getMyself().upper()) + return; + emit leftUser(chatId, user, showReason); + return; + } + if (type == "STATUS") {//OK, status of some message has changed, check what is it + QString value = message.section(' ', 3, 3).stripWhiteSpace().upper();//get the last part, what status it is + if (value == "RECEIVED") {//OK, received new message, possibly read it + if (chatMessageType == "SAID") {//OK, it is some IM + hitchHike(messageId);//receive the message + } + } else if (value == "SENDING") { + if ((d->connection % QString("GET CHATMESSAGE %1 TYPE").arg(messageId)).section(' ', 3, 3).stripWhiteSpace().upper() == "SAID") { + emit gotMessageId(messageId); + } + } else if (value == "SENT") {//Sendign out some message, that means it is a new one + if ((d->connection % QString("GET CHATMESSAGE %1 TYPE").arg(messageId)).section(' ', 3, 3).stripWhiteSpace().upper() == "SAID")//it is some message I'm interested in + emit gotMessageId(messageId);//Someone may be interested in its ID + if (d->recvMessages.find(messageId) != d->recvMessages.end()) + return;//we already got this one + d->recvMessages << messageId; + const QString &chat = (d->connection % QString("GET CHATMESSAGE %1 CHATNAME").arg(messageId)).section(' ', 3, 3).stripWhiteSpace(); + const QString &body = (d->connection % QString("GET CHATMESSAGE %1 BODY").arg(messageId)).section(' ', 3); + if (!body.isEmpty())//sometimes skype shows empty messages, just ignore them + emit outgoingMessage(body, chat); + } + } + } else if (messageType == "CHATMESSAGES") { + if (d->searchFor == "MISSEDMESSAGES") {//Theese are messages we did not read yet + QStringList messages = QStringList::split(' ', message.section(' ', 1));//get the meassage IDs + for (QStringList::iterator it = messages.begin(); it != messages.end(); ++it) { + QString Id = (*it).stripWhiteSpace(); + if (Id.isEmpty()) + continue; + skypeMessage(QString("CHATMESSAGE %1 STATUS RECEIVED").arg(Id));//simulate incoming message notification + } + } + } else if (messageType == "CALL") { + const QString &callId = message.section(' ', 1, 1).stripWhiteSpace(); + if (message.section(' ', 2, 2).stripWhiteSpace().upper() == "CONF_ID") { + if (d->knownCalls.findIndex(callId) == -1) {//new call + d->knownCalls << callId; + const QString &userId = (d->connection % QString("GET CALL %1 PARTNER_HANDLE").arg(callId)).section(' ', 3, 3).stripWhiteSpace(); + emit newCall(callId, userId); + } + const QString &confId = message.section(' ', 3, 3).stripWhiteSpace().upper(); + if (confId != "0") {//It is an conference + emit groupCall(callId, confId); + } + } + if (message.section(' ', 2, 2).stripWhiteSpace().upper() == "STATUS") { + if (d->knownCalls.findIndex(callId) == -1) {//new call + d->knownCalls << callId; + const QString &userId = (d->connection % QString("GET CALL %1 PARTNER_HANDLE").arg(callId)).section(' ', 3, 3).stripWhiteSpace(); + emit newCall(callId, userId); + } + const QString &status = message.section(' ', 3, 3).stripWhiteSpace().upper(); + if (status == "FAILED") { + int reason = (d->connection % QString("GET CALL %1 FAILUREREASON").arg(callId)).section(' ', 3, 3).stripWhiteSpace().toInt(); + QString errorText = i18n("Unknown error"); + switch (reason) { + case 1: + errorText = i18n("Misc error"); + break; + case 2: + errorText = i18n("User or phone number does not exist"); + break; + case 3: + errorText = i18n("User is offline"); + break; + case 4: + errorText = i18n("No proxy found"); + break; + case 5: + errorText = i18n("Session terminated"); + break; + case 6: + errorText = i18n("No common codec found"); + break; + case 7: + errorText = i18n("Sound I/O error"); + break; + case 8: + errorText = i18n("Problem with remote sound device"); + break; + case 9: + errorText = i18n("Call blocked by recipient"); + break; + case 10: + errorText = i18n("Recipient not a friend"); + break; + case 11: + errorText = i18n("User not authorized by recipient"); + break; + case 12: + errorText = i18n("Sound recording error"); + break; + } + emit callError(callId, errorText); + } + emit callStatus(callId, status); + } + } else if (messageType == "CURRENTUSERHANDLE") { + QString user = message.section(' ', 1, 1).stripWhiteSpace(); + QString name = (d->connection % QString("GET USER %1 DISPLAYNAME").arg(user)).section(' ', 3).stripWhiteSpace(); + if (name.isEmpty()) + name = (d->connection % QString("GET USER %1 FULLNAME").arg(user)).section(' ', 3).stripWhiteSpace(); + if (name.isEmpty()) + name = user; + emit setMyselfName(name); + } +} + +void Skype::getContactBuddy(const QString &contact) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->connection << QString("GET USER %1 BUDDYSTATUS").arg(contact);//just make a message asking for the buddystatus of user and send it +} + +void Skype::resetStatus() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + switch (d->connStatus) { + case csOffline: + case csLoggedOut: + emit wentOffline();//Do not care what is the user marked as, this is more importatnt + return; + case csConnecting: + if (d->onlineStatus == usOffline)//not connecting, user wants to be offline + break; + emit statusConnecting();//still connecting, wait a minute + return; + default://just remove the compile-time warning about not handled value + break; + } + + switch (d->onlineStatus) { + case usUnknown: + emit statusConnecting(); + break; + case usOffline: + emit wentOffline(); + break; + case usOnline: + emit wentOnline(); + break; + case usSkypeMe: + emit wentSkypeMe(); + break; + case usAway: + emit wentAway(); + break; + case usNA: + emit wentNotAvailable(); + break; + case usDND: + emit wentDND(); + break; + case usInvisible: + emit wentInvisible(); + break; + } +} + +void Skype::search(const QString &what) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->searchFor = what.section(' ', 0, 0).stripWhiteSpace().upper(); + d->connection << QString("SEARCH %1").arg(what.upper());//search for that +} + +void Skype::getContactInfo(const QString &contact) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->connection << QString("GET USER %1 FULLNAME").arg(contact)//ask for full name + << QString("GET USER %1 SEX").arg(contact)//ask for sex + << QString("GET USER %1 DISPLAYNAME").arg(contact) + << QString("GET USER %1 PHONE_HOME").arg(contact) + << QString("GET USER %1 PHONE_OFFICE").arg(contact) + << QString("GET USER %1 PHONE_MOBILE").arg(contact) + << QString("GET USER %1 ONLINESTATUS").arg(contact) + << QString("GET USER %1 HOMEPAGE").arg(contact) + << QString("GET USER %1 BUDDYSTATUS").arg(contact);//and the rest of info +} + +bool Skype::canComunicate() { + return d->connection.connected(); +} + +void Skype::setHitchMode(bool value) { + d->hitch = value; +} + +void Skype::setMarkMode(bool value) { + d->mark = value; +} + +void Skype::hitchHike(const QString &messageId) { + kdDebug(14311) << k_funcinfo << "Message: " << messageId << endl;//some debug info + + const QString &chat = (d->connection % QString("GET CHATMESSAGE %1 CHATNAME").arg(messageId)).section(' ', 3, 3).stripWhiteSpace(); + + const QString &chatType = (d->connection % QString("GET CHAT %1 STATUS").arg(chat)).section(' ', 3, 3).stripWhiteSpace().upper(); + + if ((chatType == "LEGACY_DIALOG") || (chatType == "DIALOG")) { + + const QString &user = (d->connection % QString("GET CHATMESSAGE %1 FROM_HANDLE").arg(messageId)).section(' ', 3, 3).stripWhiteSpace();//ask skyp for a sender of that message and filter out the blouat around (like CHATMESSAGE 123...) + + if ((d->hitch) || (d->account.userHasChat(user))) {//it can be read eather if the hitchhiking non-chat messages is enabled or if the user already has opened a chat + emit receivedIM(user, (d->connection % QString("GET CHATMESSAGE %1 BODY").arg(messageId)).section(' ', 3), messageId);//ask skype for the body and filter out the bload, we want only the text and make everyone aware that we received a message + if (d->mark) //We should mark it as read + d->connection << QString("SET CHATMESSAGE %1 SEEN").arg(messageId);//OK, just tell skype it is read + } + } else { + if ((d->hitch) || (d->account.chatExists(chat))) { + const QString &user = (d->connection % QString("GET CHATMESSAGE %1 FROM_HANDLE").arg(messageId)).section(' ', 3, 3).stripWhiteSpace(); + emit receivedMultiIM(chat, (d->connection % QString("GET CHATMESSAGE %1 BODY").arg(messageId)).section(' ', 3), messageId, user); + if (d->mark) + d->connection << QString("SET CHATMESSAGE %1 SEEN").arg(messageId); + } + } +} + +void Skype::send(const QString &user, const QString &message) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->connection << QString("MESSAGE %1 %2").arg(user).arg(message);//just ask skype to send it +} + +void Skype::setScanForUnread(bool value) { + d->scanForUnread = value; +} + +void Skype::makeCall(const QString &userId) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->connection << QString("CALL %1").arg(userId); +} + +void Skype::acceptCall(const QString &callId) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->connection << QString("SET CALL %1 STATUS INPROGRESS").arg(callId); +} + +void Skype::hangUp(const QString &callId) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->connection << QString("SET CALL %1 STATUS FINISHED").arg(callId); +} + +void Skype::toggleHoldCall(const QString &callId) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + const QString &status = (d->connection % QString("GET CALL %1 STATUS").arg(callId)).section(' ', 3, 3).stripWhiteSpace().upper(); + if ((status == "ONHOLD") || (status == "LOCALHOLD")) + d->connection << QString("SET CALL %1 STATUS INPROGRESS").arg(callId); + else + d->connection << QString("SET CALL %1 STATUS ONHOLD").arg(callId); +} + +bool Skype::isCallIncoming(const QString &callId) { + const QString &type = (d->connection % QString("GET CALL %1 TYPE").arg(callId)).section(' ', 3, 3).stripWhiteSpace().upper(); + return ((type == "INCOMING_P2P") || (type == "INCOMING_PSTN")); +} + +void Skype::getSkypeOut() { + const QString &curr = (d->connection % QString("GET PROFILE PSTN_BALANCE_CURRENCY")).section(' ', 2, 2).stripWhiteSpace().upper(); + if (curr.isEmpty()) { + emit skypeOutInfo(0, ""); + } else { + int value = (d->connection % QString("GET PROFILE PSTN_BALANCE")).section(' ', 2, 2).stripWhiteSpace().toInt(); + emit skypeOutInfo(value, curr); + } +} + +void Skype::enablePings(bool enabled) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->pings = enabled; + + if (!enabled) { + d->pingTimer->stop(); + return; + } + + if (d->connStatus != csOffline) { + d->pingTimer->start(1000); + } +} + +void Skype::ping() { + d->connection << QString("PING"); +} + +void Skype::setBus(int bus) { + d->bus = bus; +} + +void Skype::setStartDBus(bool enabled) { + d->startDBus = enabled; +} + +void Skype::setLaunchTimeout(int seconds) { + d->launchTimeout = seconds; +} + +void Skype::setSkypeCommand(const QString &command) { + d->skypeCommand = command; +} + +void Skype::setWaitConnect(int value) { + d->waitBeforeConnect = value; +} + +void Skype::sendToChat(const QString &chat, const QString &message) { + kdDebug(14311) << k_funcinfo << endl;//some debug info` + + if (d->connection.protocolVer() <= 4) {//Not able to handle it by the API, let Skype do it for me + d->connection << QString("OPEN CHAT %1 %2").arg(chat).arg(message); + emit gotMessageId(""); + } else { + d->connection << QString("CHATMESSAGE %1 %2").arg(chat).arg(message); + } +} + +void Skype::getTopic(const QString &chat) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + emit setTopic(chat, (d->connection % QString("GET CHAT %1 FRIENDLYNAME").arg(chat)).section(' ', 3).stripWhiteSpace()); +} + +QString Skype::getMessageChat(const QString &message) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + return (d->connection % QString("GET CHATMESSAGE %1 CHATNAME").arg(message)).section(' ', 3, 3).stripWhiteSpace(); +} + +QStringList Skype::getChatUsers(const QString &chat) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + const QString &me = getMyself(); + const QString &rawUsers = (d->connection % QString("GET CHAT %1 MEMBERS").arg(chat)).section(' ', 3).stripWhiteSpace(); + const QStringList &users = QStringList::split(' ', rawUsers); + QStringList readyUsers; + for (QStringList::const_iterator it = users.begin(); it != users.end(); ++it) { + const QString &user = (*it).stripWhiteSpace(); + if (user.upper() != me.upper()) + readyUsers.append(user); + } + + return readyUsers; +} + +QString Skype::getMyself() { + return (d->connection % QString("GET CURRENTUSERHANDLE")).section(' ', 1, 1).stripWhiteSpace(); +} + +void Skype::inviteUser(const QString &chatId, const QString &userId) { + kdDebug(14311) << k_funcinfo << " " << chatId << " " << userId << endl;//some debug info + + if (d->connection.protocolVer() <= 4) { + KMessageBox::error(0L, i18n("This version of Skype does not support adding users to chat."), i18n("Skype Protocol")); + return; + } + + d->connection << QString("ALTER CHAT %1 ADDMEMBERS %2").arg(chatId).arg(userId); +} + +QString Skype::createChat(const QString &users) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + const QString &chatDesc = d->connection % QString("CHAT CREATE %1").arg(users); + kdDebug(14311) << "New chat ID: " << chatDesc.section(' ', 1, 1) << endl; + return chatDesc.section(' ', 1, 1); +} + +void Skype::leaveChat(const QString &chatId) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->connection << QString("ALTER CHAT %1 LEAVE").arg(chatId); +} + +void Skype::removeContact(const QString &contactId) { + kdDebug(14311) << k_funcinfo << endl; + + d->connection << QString("SET USER %1 BUDDYSTATUS 1").arg(contactId); +} + +void Skype::addContact(const QString &contactId) { + kdDebug(14311) << k_funcinfo << endl; + + d->connection % QString("SET USER %1 BUDDYSTATUS 2").arg(contactId);//do NOT parse this so the contact won't be created automatically +} + +void Skype::setAuthor(const QString &contactId, AuthorType author) { + kdDebug(14311) << k_funcinfo << endl; + + switch (author) { + case Author: + d->connection << QString("SET USER %1 ISBLOCKED FALSE").arg(contactId); + d->connection << QString("SET USER %1 ISAUTHORIZED TRUE").arg(contactId); + break; + case Deny: + d->connection << QString("SET USER %1 ISBLOCKED FALSE").arg(contactId); + d->connection << QString("SET USER %1 ISAUTHORIZED FALSE").arg(contactId); + break; + case Block: + d->connection << QString("SET USER %1 ISBLOCKED TRUE").arg(contactId); + break; + } +} + +Skype::AuthorType Skype::getAuthor(const QString &contactId) { + if ((d->connection % QString("GET USER %1 ISBLOCKED").arg(contactId)).section(' ', 3, 3).stripWhiteSpace().upper() == "TRUE") + return Block; + else if ((d->connection % QString("GET USER %1 ISAUTHORIZED").arg(contactId)).section(' ', 3, 3).stripWhiteSpace().upper() == "TRUE") + return Author; + else + return Deny; +} + +bool Skype::ableConference() { + return false; +} + +#include "skype.moc" diff --git a/plugins/skype/libskype/skype.h b/plugins/skype/libskype/skype.h new file mode 100644 index 0000000..11241a8 --- /dev/null +++ b/plugins/skype/libskype/skype.h @@ -0,0 +1,466 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef SKYPE_H +#define SKYPE_H + +#include + +class SkypePrivate; +class SkypeAccount; + +/** + * This class is internal backend for skype. It provides slots for such things like "send a IM" and so + * @author SIM Developers + */ +class Skype : public QObject +{ + Q_OBJECT + private: + ///The d pointer for private things + SkypePrivate *d; + /** + * Will try to hitchhike a message. It will hitchhike it, show it in the proper chat session and so on, but just when it is enabled by hitchhike mode and will maker it as read if enabled + * @param messageId ID of the message to hitchHike + */ + void hitchHike(const QString &messageId); + private slots: + /** + * Adds new message do be sent to skype (normaly is sent imediatelly). + * If there is no connection to skype, it is created before it is sent. + * @param message Message to send to skype + * @param deleteQueue If this is true, all message waiting to be sent are deleted and only this one stays in the queue + */ + void queueSkypeMessage(const QString &message, bool deleteQueue); + /** + * Listens for closed skype connection + */ + void closed(int reason); + /** + * Listens for finishing the connecting attempt and sending the queue if it was successful + * @param error - Did it work or was there some error? + * @param protocolVer - Version of protocol used by this connection + */ + void connectionDone(int error, int protocolVer); + /** + * This one showes an error message + * @param message What to write on the dialog box + */ + void error(const QString &message); + /** + * This one scans messages from Skype API and acts acordingly to them (changing online status, showing messages.... + * @param message What the skype said + */ + void skypeMessage(const QString &message); + /** + * This one resets the online status showed on the icon in SIM depending on last values from skype. + * Used when the status changes + */ + void resetStatus(); + /** + * Makes the Skype search for something and saves what it was to decide later, what to do with it + * @param what What are we searching for + */ + void search(const QString &what); + public: + /** + * Constructor + * @param account The account that this connection belongs to + */ + Skype(SkypeAccount &account); + /** + * Destructor + */ + ~Skype(); + ///Can we comunicate with the skype program right now? + bool canComunicate(); + /** + * Enables or disables hitchhake mode of incoming messages + * @see SkypeAccount::setHitchHike + */ + void setHitchMode(bool value); + /** + * Enables or disables mark read messages mode + * @see SkypeAccount::setMarkRead + */ + void setMarkMode(bool value); + /** + * Enables/disables scanning for unread messages after login + * @see SkypeAccount::setScanForUnread + */ + void setScanForUnread(bool value); + /** + * Is that call incoming call? + * @param callId What call you mean? + * @return true if the call is incoming + */ + bool isCallIncoming(const QString &callId); + /** + * Returns ID of chat to what given message belongs + * @param messageId Id of the wanted message + * @return ID of the chat. For unexisten message the result is not defined. + */ + QString getMessageChat(const QString &messageId); + /** + * Returns list of users in that chat without actual user + * @param chat ID of that chat you want to know + */ + QStringList getChatUsers(const QString &chat); + /** + * This will return ID of the actual user this one that uses this skype) + */ + QString getMyself(); + /** + * Create a chat with that members + * @param users List of users separated by coma (user_1, user_2, user...) + * @return Id of the new chat + */ + QString createChat(const QString &users); + /** + * Says if the contact should be authorize, not authorized or blocked + */ + enum AuthorType { + Author, + Deny, + Block + }; + /** + * Ask if the user how is the user authorized + * @param contactId What user are you interested in? + */ + AuthorType getAuthor(const QString &contactId); + /** + * Is this version of protocol able to create conference calls? + */ + bool ableConference(); + public slots: + /** + * Tell the skype to go online + */ + void setOnline(); + /** + * Tell the skype to go offline + */ + void setOffline(); + /** + * Tell the skype to go offline + */ + void setAway(); + /** + * Tell the skype to go not available + */ + void setNotAvailable(); + /** + * Tell the skype to go to Do not disturb + */ + void setDND(); + /** + * Tell the skype to go to Skype me mode + */ + void setSkypeMe(); + /** + * Tell the skype to go invisible + */ + void setInvisible(); + /** + * This sets the values of the account. + * @see SkypeAccount + */ + void setValues(int launchType, const QString &appName); + /** + * Retrieve info of that contact + * @param contact What contact wants it + */ + void getContactInfo(const QString &contact); + /** + * Asks skype for buddy status of some contact. Buddystatus is some property that ondicates, weather it is in contact list, awaiting authorization, just been mentioned or what exactly happened with it.. + * After skype responses, you will get the response by emiting the received signal + * @param contact It is the contact id of the user you want to check. + */ + void getContactBuddy(const QString &contact); + /** + * Sends a message trough skype + * @param user To who it should be sent + * @param body What to send + */ + void send(const QString &user, const QString &body); + /** + * Send a message to a given chat + * @param chat What chat to send it in + * @param body Text of that message + */ + void sendToChat(const QString &chat, const QString &body); + /** + * Begins new call. + * @param userId ID of user to call (or multiple users separated by comas) + * @see acceptCall + * @see hangUp + * @see holdCall + * @see callStatus + * @see callError + */ + void makeCall(const QString &userId); + /** + * Accept an incoming call + * @param callId ID of call to accept. + * @see makeCall + * @see hangUp + * @see holdCall + * @see callStatus + * @see callError + * @see newCall + */ + void acceptCall(const QString &callId); + /** + * Hang up (finish) call in progress or deny an incoming call + * @param callId Which one + * @see makeCall + * @see acceptCall + * @see holdCall + * @see callStatus + * @see callError + * @see newCall + */ + void hangUp(const QString &callId); + /** + * Hold call in progress or resume holded call. That call will not finish, you just leave it for later. + * @param callId Which call + * @see makeCall + * @see acceptCall + * @see hangUp + * @see callStatus + * @see callError + * @see newCall + */ + void toggleHoldCall(const QString &callId); + /** + * Get the skoype out balance + */ + void getSkypeOut(); + /** + * Sets if the Skype is checked in short intervals by pings. If you turn that off, you will not know when skype exits. + * @param enabled Ping or not? + */ + void enablePings(bool enabled); + /** + * Sends one ping and takes actions if it can not be delivered (skype is down) + */ + void ping(); + /** + * What DBus bus is used? + */ + void setBus(int bus); + /** + * Start DBus if not wunning? + */ + void setStartDBus(bool value); + /** + * Set the launch timeout - after that launch of Skype will be considered as unsuccessfull if connection can not be established + */ + void setLaunchTimeout(int seconds); + /** + * Set a command to start skype by + */ + void setSkypeCommand(const QString &command); + /** + * Sets if we wait a bit before connecting to Skype after it's start-up + */ + void setWaitConnect(int value); + /** + * This gets a topic for given chat session + * @param chat What chat wants that + */ + void getTopic(const QString &chat); + /** + * Invites a user to a chat + * @param chatId What chat + * @param userId What user + */ + void inviteUser(const QString &chatId, const QString &userId); + /** + * Closes/leaves a chat + * @param chatId What chat + */ + void leaveChat(const QString &chatId); + /** + * Removes a contact from the contact list + * @param contactId Id of the contact you want to remove + */ + void removeContact(const QString &contactId); + /** + * Adds a contact to the list + * @param contactId Id of the contact to add + * @param contactId + */ + void addContact(const QString &contactId); + /** + * Sets users authorization + * @param contactId ID of that user + * @param author for what is he authorized + */ + void setAuthor(const QString &contactId, AuthorType author); + signals: + /** + * Emitted when the skype changes to online (or says it goes online) + */ + void wentOnline(); + /** + * Emitted when the skype goes offline + */ + void wentOffline(); + /** + * Emitted when the skype goes away + */ + void wentAway(); + /** + * Emitted when the skype goes to Not awailable + */ + void wentNotAvailable(); + /** + * Emitted when the skype goes to DND mode + */ + void wentDND(); + /** + * Emitted when skype changes to skype me mode + */ + void wentSkypeMe(); + /** + * Emitted when skype becomes invisible + */ + void wentInvisible(); + /** + * Emitted when atempt to connect started + */ + void statusConnecting(); + /** + * Emitted when new user should be added to the list + * @param name The skype name of the user + */ + void newUser(const QString &name); + /** + * All contacts should be asked to request update of their information. This is emitted after the connection to skype is made. + */ + void updateAllContacts(); + /** + * This is emitted whenever some contact should be notified of info change + * @param contact What contact is it + * @param change The change. The syntax is [property (displayname, onlinestatus..)] [value] + */ + void contactInfo(const QString &contact, const QString &change); + /** + * This is emitted when a new message is received + * @param user Contact ID of user that sent it. It is NOT guaranteed that the user is in list! + * @param body The message body that was received + * @param messageId ID of that message + */ + void receivedIM(const QString &user, const QString &body, const QString &messageId); + /** + * This is emitted when a new message from multi-user chat is received + * @param chat Id of the chat + * @param body Tect of the message + * @param messageId Id of this message to get information about it if needed + * @param user Who sent it to that chat (ID) + */ + void receivedMultiIM(const QString &chat, const QString &body, const QString &messageId, const QString &user); + /** + * This is emitted when an Id of the last outgoing message is known + * @param id The ID of that message + */ + void gotMessageId(const QString &id); + /** + * This slot notifies about call status (onhold, in progress, routing, finished..) + * @param callId WHat call is it? + * @param status New status of the call. + * @see makeCall + * @see acceptCall + * @see hangUp + * @see holdCall + * @see callError + * @see newCall + */ + void callStatus(const QString &callId, const QString &status); + /** + * This slot informs of error that happened to the call. It is translated error and can be directly showed to user. + * @param callId ID of the call that has an error. + * @param message The error text + * @see makeCall + * @see acceptCall + * @see hangUp + * @see holdCall + * @see callStatus + * @see newCall + */ + void callError(const QString &callId, const QString &message); + /** + * Indicates a new call is established (is being established, incoming or so). In short, there is some new call. + * @param callId ID of the new call + * @param userId ID of the other user, or list of users (if more than one) divided by spaces + * @see makeCall + * @see acceptCall + * @see hangUp + * @see holdCall] + * @see callStatus + * @see callError + */ + void newCall(const QString &callId, const QString &userId); + /** + * Skype out balance info + * @param balance How much does the user have + * @param currency And what is it that he has + */ + void skypeOutInfo(int balance, const QString ¤cy); + /** + * Tells that my name is known or changed + * @param name The new name + */ + void setMyselfName(const QString &name); + /** + * Some topic has to be set + * @param chat What chat should change its topic + * @param topic The new topic + */ + void setTopic(const QString &chat, const QString &topic); + /** + * This is emitted when a new user joins a chat + * @param chat What chat he joined + * @param userId ID of the new user + */ + void joinUser(const QString &chat, const QString &userId); + /** + * This is emitted when user leaves a chat + * @param chat What chat did he leave + * @param userId ID of that user + * @param reason Reason why he left + */ + void leftUser(const QString &chat, const QString &userd, const QString &reason); + /** + * Emitted when some message is being sent out right now + * @param body Text of the message + * @param chat Id of the chat it has been sent to + */ + void outgoingMessage(const QString &body, const QString &chat); + /** + * Put this call into a group, where other calls are (will be), used with conference calls + * @param callId Id of the call + * @param groupId The id of a group + * Note: the group should be closed when all it's calls are closed + */ + void groupCall(const QString &callId, const QString &groupId); +}; + +#endif diff --git a/plugins/skype/libskype/skypedbus/connection.cpp b/plugins/skype/libskype/skypedbus/connection.cpp new file mode 100644 index 0000000..9608e4e --- /dev/null +++ b/plugins/skype/libskype/skypedbus/connection.cpp @@ -0,0 +1,426 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; -*- + +/* connection.cpp: Qt wrapper for DBusConnection +* +* Copyright (C) 2003 Zack Rusin +* +* Licensed under the Academic Free License version 2.0 +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +*/ + +#include +#include +#include + +#define DBUS_API_SUBJECT_TO_CHANGE +#include "connection.h" + +using namespace DBusQt; + +#include "integrator.h" +using Internal::Integrator; + +struct Connection::Private +{ + Private( Connection * qq ); + ~Private( ); + void setConnection( DBusConnection * c, bool tmp = FALSE ); + DBusConnection *connection; + int connectionSlot; + DBusError error; + Integrator *integrator; + int timeout; + Connection *q; +}; + +Connection::Private::Private( Connection * qq ):connection( 0 ), connectionSlot( -1 ), integrator( 0 ), timeout( -1 ), q( qq ) +{ + dbus_error_init( &error ); +} + +Connection::Private::~Private( ) +{ + delete integrator; +} + +void Connection::Private::setConnection( DBusConnection * c, bool tmp ) +{ + if ( !c ) + { + return; + } + + connection = c; + integrator = new Integrator( c, q, tmp ); + connect( integrator, SIGNAL( readReady( ) ), q, SLOT( dispatchRead( ) ) ); +} + +Connection::Connection( QObject * parent ):QObject( parent ) +{ + d = new Private( this ); + + dbus_error_init( &d->error ); +} + +Connection::Connection( const QString & host, QObject * parent ):QObject( parent ) +{ + d = new Private( this ); + + if ( !host.isEmpty( ) ) + { + DBusConnection *cn = dbus_connection_open( host.ascii( ), &d->error ); + + if ( error( ) ) + { + qDebug( "dbus_connection_open failed." ); + return; + } + + d->setConnection( cn, TRUE ); + } +} + +Connection::Connection( DBusBusType type, QObject * parent, bool temporary ):QObject( parent ) +{ + + qDebug( "Connection::Connection" ); + d = new Private( this ); + DBusConnection *cn = dbus_bus_get( type, &d->error ); + + if ( error( ) ) + { + qDebug( "dbus_bus_get failed." ); + return; + } + + d->setConnection( cn, temporary ); + + //QTimer *timer = new QTimer(this); + + //connect(timer, SIGNAL(timeout()), this, SLOT(dispatchRead())); + + //timer->start(500, FALSE); +} + +Connection::~Connection( ) +{ + delete d->integrator; + d->integrator = 0L; + + dbus_connection_unref( d->connection ); + delete d; +} + +void Connection::init( const QString & host ) +{ + d->setConnection( dbus_connection_open( host.ascii( ), &d->error ) ); + dbus_connection_allocate_data_slot( &d->connectionSlot ); + dbus_connection_set_data( d->connection, d->connectionSlot, 0, 0 ); +} + +bool Connection::isConnected( ) const +{ + return dbus_connection_get_is_connected( d->connection ); +} + +bool Connection::isAuthenticated( ) const +{ + return dbus_connection_get_is_authenticated( d->connection ); +} + +void Connection::open( const QString & host ) +{ + if ( host.isEmpty( ) ) + return; + + init( host ); +} + +void Connection::close( ) +{ + dbus_connection_disconnect( d->connection ); +} + +void Connection::flush( ) +{ + dbus_connection_flush( d->connection ); +} + +bool Connection::event( QEvent * e ) +{ + if ( e->type( ) == DBUS_EVENT_WAKEUP ) + { + qDebug( "Custom event received." ); + + dispatchRead( ); + + return TRUE; + } + else + return QObject::event( e ); +} + +void Connection::dispatchRead( ) +{ + qDebug( "API: dispatchRead" ); + + //dbus_connection_flush(d->connection); + + /*DBusDispatchStatus status = dbus_connection_get_dispatch_status(d->connection); + + if (status == DBUS_DISPATCH_DATA_REMAINS) + dbus_connection_dispatch( d->connection ); + */ + + /*DBusDispatchStatus status = dbus_connection_get_dispatch_status(d->connection); + + switch(status) + { + case DBUS_DISPATCH_DATA_REMAINS: + qDebug("DBUS_DISPATCH_DATA_REMAINS"); + break; + case DBUS_DISPATCH_COMPLETE: + qDebug("DBUS_DISPATCH_COMPLETE"); + break; + case DBUS_DISPATCH_NEED_MEMORY: + qDebug("DBUS_DISPATCH_NEED_MEMORY"); + break; + default: + qDebug("UNKNOWN"); + break; + } */ + + while ( dbus_connection_dispatch( d->connection ) == DBUS_DISPATCH_DATA_REMAINS ) ; + + // status; + //while(1) + /* + do + { + status = dbus_connection_dispatch(d->connection);//DBUS_DISPATCH_COMPLETE; + // + + switch(status) + { + case DBUS_DISPATCH_DATA_REMAINS: + qDebug("DBUS_DISPATCH_DATA_REMAINS"); + break; + case DBUS_DISPATCH_COMPLETE: + qDebug("DBUS_DISPATCH_COMPLETE"); + break; + case DBUS_DISPATCH_NEED_MEMORY: + qDebug("DBUS_DISPATCH_NEED_MEMORY"); + break; + default: + qDebug("UNKNOWN"); + break; + } + + if (status == DBUS_DISPATCH_DATA_REMAINS) + { + qDebug("dispatching ..."); + + dbus_connection_dispatch(d->connection); + } + + } while (status != DBUS_DISPATCH_COMPLETE); + */ +} + +DBusConnection *Connection::connection( ) +{ + return d->connection; +} + +Connection::Connection( DBusConnection * connection, QObject * parent ):QObject( parent ) +{ + d = new Private( this ); + d->setConnection( connection ); +} + +void Connection::send( const Message & m ) +{ + (void) getError(); + dbus_connection_send( d->connection, m.message( ), 0 ); +} + +void Connection::sendWithReply( const Message & ) +{ +} + +Message Connection::sendWithReplyAndBlock( const Message & m ) +{ + (void) getError(); + DBusMessage *reply; + + reply = dbus_connection_send_with_reply_and_block( d->connection, m.message( ), d->timeout, &d->error ); + + if ( error( ) ) + return m; + else + return Message( reply ); +} + +bool Connection::error( ) +{ + return dbus_error_is_set( &d->error ); +} + +QString Connection::getError( ) +{ + QString err; + + if ( dbus_error_is_set( &d->error ) ) + { + err = d->error.name; + dbus_error_free( &d->error ); + } + + return err; +} + +void *Connection::virtual_hook( int, void * ) +{ + return 0; +} + +static DBusHandlerResult nm_message_handler( DBusConnection * connection, DBusMessage * message, void *user_data ) +{ + const char *method; + const char *path; + const char *sender; + const char *signature; + + //DBusMessage *reply_message = NULL; + //gboolean handled = TRUE; + Connection *c = static_cast < Connection * >( user_data ); + + //g_return_val_if_fail (connection != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); + //g_return_val_if_fail (message != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); + + qDebug( "nm_message_handler" ); + + c->dbusMessage( message ); + + method = dbus_message_get_member( message ); + path = dbus_message_get_path( message ); + sender = dbus_message_get_sender( message ); + signature = dbus_message_get_signature( message ); + + qDebug( "nm_dbus_nm_message_handler() got method %s for path %s, sender %s", method, path, sender ); + + /* + if (strcmp("testFunction", method) == 0) + return DBUS_HANDLER_RESULT_HANDLED; + else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + */ + //Connection c(connection, NULL); + //Message in(message); + //Message out(in); + + //out << "Success."; + + //c->send(out); + + /* + if (strcmp ("setKeyForNetwork", method) == 0) + set_user_key_for_network (connection, message, user_data); + else + handled = FALSE; + + return (handled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED); + */ + return DBUS_HANDLER_RESULT_HANDLED; +} + +static void nm_unregister_handler( DBusConnection * connection, void *user_data ) +{ + /* do nothing */ + qDebug( "nm_unregister_handler" ); +} + +void Connection::dbusMessage( DBusMessage * message ) +{ + qDebug( "Connection::dbusMessage" ); + + Message *m = new Message( message ); + + /*if (m->expectReply()) + { + qDebug("Message expects reply. Generating."); + Message* reply = new Message(*m); + (*reply) << QString("OLLEH"); + send(*reply); + flush(); + } */ + + emit messageArrived( *m ); +} + +bool Connection::registerObjectPath( const QString & path, const QString & service ) +{ + DBusObjectPathVTable vtable = { &nm_unregister_handler, &nm_message_handler, NULL, NULL, NULL, + NULL + }; + + //dbus_bus_acquire_service(d->connection, service, 0, &d->error); + //dbus_bus_activate_service( d->connection, "org.freedesktop.DBus", 0, NULL, &d->error ); + + //dbus_bus_set_base_service(d->connection, "com.Skype.API"); + + if ( error( ) ) + { + return FALSE; + } + + //qDebug("Connection base name: %s", dbus_bus_get_base_service(d->connection)); + + /*dbus_bus_acquire_service(d->connection, "com.Skype.API", 0, &d->error); + + if (dbus_error_is_set (&d->error)) + { + qDebug("Could not acquire its service. dbus_bus_acquirebool success = dbus_connection_register_fallback(d->connection, path.ascii(), &vtable, this);_service() says: '%s'", d->error.message); + + return FALSE; + } */ + + //dbus_bus_add_match(d->connection, "type='method_call',interface='com.Skype.API'", &d->error); + + //if (dbus_error_is_set (&d->error)) + //{ + // qDebug("Could not add match. Error is: '%s'", d->error.message); + + // return FALSE; + //} + + //bool success = dbus_connection_register_object_path(d->connection, path.ascii(), &vtable, this); + //success = dbus_connection_register_fallback(d->connection, "/org/freedesktop/DBus", &vtable, this); + + bool success = dbus_connection_register_object_path(d->connection, service.utf8(), &vtable, this); + + //success = dbus_connection_add_filter(d->connection, nm_message_handler, this, NULL); + if (!success) + { + qDebug("Could not register a handler for NetworkManager. Not enough memory?"); + return FALSE; + } + + return TRUE; +} + +#include "connection.moc" diff --git a/plugins/skype/libskype/skypedbus/connection.h b/plugins/skype/libskype/skypedbus/connection.h new file mode 100644 index 0000000..5e6afb1 --- /dev/null +++ b/plugins/skype/libskype/skypedbus/connection.h @@ -0,0 +1,95 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; -*- + +/* connection.h: Qt wrapper for DBusConnection + * + * Copyright (C) 2003 Zack Rusin + * + * Licensed under the Academic Free License version 2.1 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef DBUS_QT_CONNECTION_H +#define DBUS_QT_CONNECTION_H + +#include "message.h" + +#include +#include +#include +#include + +const int DBUS_EVENT_WAKEUP = QEvent::User + 100; + +namespace DBusQt +{ + namespace Internal + { + class Integrator; + } + + class Connection : public QObject + { + Q_OBJECT + public: + Connection( QObject * parent = 0 ); + Connection( const QString & host, QObject * parent = 0 ); + Connection( DBusBusType type, QObject * parent = 0, bool temporary = FALSE ); + virtual ~ Connection( ); + + bool isConnected( ) const; + bool isAuthenticated( ) const; + + Message borrowMessage( ); + Message popMessage( ); + void stealBorrowMessage( const Message & ); + void dbusMessage( DBusMessage * message ); + bool error( ); + QString getError( ); + + public slots: + void open( const QString & ); + void close( ); + void flush( ); + void send( const Message & ); + void sendWithReply( const Message & ); + Message sendWithReplyAndBlock( const Message & ); + bool registerObjectPath( const QString & path, const QString & service ); + + protected slots: + void dispatchRead( ); + + protected: + void init( const QString & host ); + virtual void *virtual_hook( int id, void *data ); + bool event( QEvent * ); + + private: + friend class Internal::Integrator; + DBusConnection *connection( ); + Connection( DBusConnection * connection, QObject * parent ); + + private: + struct Private; + Private *d; + + signals: + void messageArrived( const DBusQt::Message & m ); + }; + +} + +#endif diff --git a/plugins/skype/libskype/skypedbus/integrator.cpp b/plugins/skype/libskype/skypedbus/integrator.cpp new file mode 100644 index 0000000..e766b66 --- /dev/null +++ b/plugins/skype/libskype/skypedbus/integrator.cpp @@ -0,0 +1,450 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; -*- +/* integrator.h: integrates D-BUS into Qt event loop + * + * Copyright (C) 2003 Zack Rusin + * + * Licensed under the Academic Free License version 2.0 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#define DBUS_API_SUBJECT_TO_CHANGE + +#include "integrator.h" +#include "connection.h" + +#include +#include +#include +#include +#include +#include + +namespace DBusQt +{ +namespace Internal { + +struct Watch{ + Watch(): readSocket( 0 ), writeSocket( 0 ) { } + //~Watch(); + + DBusWatch *watch; + QSocketNotifier *readSocket; + QSocketNotifier *writeSocket; +}; + +/*Watch::~Watch() +{ + if (readSocket) + delete readSocket; + + if (writeSocket) + delete writeSocket; +}*/ + +////////////////////////////////////////////////////////////// +dbus_bool_t dbusAddWatch(DBusWatch* watch, void* data) +{ + int fd = dbus_watch_get_fd(watch); + + qDebug ("API: fd is %d", fd); + + Integrator *con = static_cast( data ); + con->addWatch( watch ); + + return true; +} + +void dbusRemoveWatch( DBusWatch *watch, void *data ) +{ + Integrator *con = static_cast( data ); + con->removeWatch( watch ); +} + +void dbusToggleWatch( DBusWatch *watch, void *data ) +{ + //return; + Integrator *itg = static_cast( data ); + //Watch* qw = itg->m_watches.find(dbus_watch_get_fd(watch)); + + qDebug("API: dbusToggleWatch"); + + int fd = dbus_watch_get_fd(watch); + + qDebug ("API: fd is %d", fd); + + if (dbus_watch_get_enabled(watch)) + { + //if (qw->readSocket) qw->readSocket->setEnabled(TRUE); + //if (qw->writeSocket) qw->writeSocket->setEnabled(TRUE); + itg->addWatch(watch); + qDebug("enabling"); + } + else + { + //if (qw->readSocket) qw->readSocket->setEnabled(FALSE); + //if (qw->writeSocket) qw->writeSocket->setEnabled(FALSE); + itg->removeWatch(watch); + qDebug("disabling"); + } + + /* + bool en = dbus_watch_get_enabled(watch); + int flags = dbus_watch_get_flags(watch); + + Integrator *itg = static_cast( data ); + Watch* qw = itg->m_watches.find(dbus_watch_get_fd(watch)); + + + if ( flags && DBUS_WATCH_READABLE ) + { + qw->readSocket->setEnabled(en); + } + + if (flags && DBUS_WATCH_WRITABLE) + { + qw->writeSocket->setEnabled(en); + } + */ + /* + if (dbus_watch_get_enabled(watch)) + { + //itg->addWatch(watch); + + if (qw) + { + qw->readSocket->setEnabled(TRUE); + qw->writeSocket->setEnabled(TRUE); + } + else + itg->addWatch( watch ); + } + else + { + //itg->removeWatch(watch); + + if (qw) + { + qw->readSocket->setEnabled(FALSE); + qw->writeSocket->setEnabled(FALSE); + } + else + itg->removeWatch( watch ); + } + */ +} + +dbus_bool_t dbusAddTimeout( DBusTimeout *timeout, void *data ) +{ + if ( !dbus_timeout_get_enabled(timeout) ) + return true; + + Integrator *itg = static_cast( data ); + itg->addTimeout( timeout ); + return true; +} + +void dbusRemoveTimeout( DBusTimeout *timeout, void *data ) +{ + Integrator *itg = static_cast( data ); + itg->removeTimeout( timeout ); +} + +void dbusToggleTimeout( DBusTimeout *timeout, void *data ) +{ + Integrator *itg = static_cast( data ); + + if ( dbus_timeout_get_enabled( timeout ) ) + itg->addTimeout( timeout ); + else + itg->removeTimeout( timeout ); +} + +void dbusWakeupMain(void* c) +{ + qDebug("wake up!"); + + //Connection* conn = static_cast(c); + + //conn->flush(); + + //if (conn) + // QApplication::postEvent(conn, new QCustomEvent(DBUS_EVENT_WAKEUP)); + + qApp->eventLoop()->wakeUp(); +} + +void dbusDispatchStatusChanged(DBusConnection *connection, DBusDispatchStatus new_status, void *data) +{ + qDebug("dbusDispatchStatusChanged invoked"); + + switch(new_status) + { + case DBUS_DISPATCH_DATA_REMAINS: + qDebug("DBUS_DISPATCH_DATA_REMAINS"); + break; + case DBUS_DISPATCH_COMPLETE: + qDebug("DBUS_DISPATCH_COMPLETE"); + break; + case DBUS_DISPATCH_NEED_MEMORY: + qDebug("DBUS_DISPATCH_NEED_MEMORY"); + break; + default: + qDebug("UNKNOWN"); + break; + } +} + +static dbus_bool_t dbusUidHandler(DBusConnection* c, unsigned long uid, void* data) +{ + qDebug("API: dbusUidHandler uid is %lu", uid); + + return TRUE; +} + +static void dbusNewConnection( DBusServer *server, + DBusConnection *new_connection, + void *data ) +{ + qDebug("dbusNewConnection() invoked"); + + dbus_connection_set_unix_user_function(new_connection, &dbusUidHandler, data, 0); + + Integrator *itg = static_cast( data ); + itg->handleConnection( new_connection ); +} + +///////////////////////////////////////////////////////////// + +Timeout::Timeout( QObject *parent, DBusTimeout *t ) + : QObject( parent ), m_timeout( t ) +{ + m_timer = new QTimer( this ); + connect( m_timer, SIGNAL(timeout()), + SLOT(slotTimeout()) ); +} + +void Timeout::slotTimeout() +{ + emit timeout( m_timeout ); +} + +void Timeout::start() +{ + m_timer->start( dbus_timeout_get_interval( m_timeout ) ); +} + +Integrator::Integrator(DBusConnection *conn, QObject *parent, bool tmp) + :QObject(parent), + m_connection(conn) +{ + qDebug("Integrator::Integrator(DBusConnection*) invoked"); + + m_timeouts.setAutoDelete( true ); + + dbus_connection_set_watch_functions( m_connection, + dbusAddWatch, + dbusRemoveWatch, + /*dbusToggleWatch*/0, + this, 0 ); + dbus_connection_set_timeout_functions( m_connection, + dbusAddTimeout, + dbusRemoveTimeout, + dbusToggleTimeout, + this, 0 ); + + //if (!tmp) + dbus_connection_set_wakeup_main_function(m_connection, dbusWakeupMain, parent, 0); + + //dbus_connection_set_dispatch_status_function(m_connection, dbusDispatchStatusChanged, this, 0); +} + +Integrator::Integrator( DBusServer *server, QObject *parent ) + : QObject( parent ), m_server( server ) +{ + qDebug("Integrator::Integrator(DBusServer*) invoked"); + + //m_connection = reinterpret_cast( m_server ); + m_timeouts.setAutoDelete( true ); + + dbus_server_set_watch_functions( m_server, + dbusAddWatch, + dbusRemoveWatch, + /*dbusToggleWatch*/0, + this, 0 ); + /*dbus_server_set_timeout_functions( m_server, + dbusAddTimeout, + dbusRemoveTimeout, + dbusToggleTimeout, + this, 0 );*/ + dbus_server_set_new_connection_function( m_server, + dbusNewConnection, + this, 0 ); +} + +Integrator::~Integrator() +{ + for (int nC = 0; nC < m_watches.count(); nC++) + delete m_watches[nC]; +} + +void Integrator::slotRead(int fd) +{ + qDebug("slotRead"); + QIntDictIterator it(m_watches); + + for (; it.current(); ++it) + dbus_watch_handle(it.current()->watch, DBUS_WATCH_READABLE); + + emit readReady(); + + /*if (Watch* ww = m_watches.find(fd)) + dbus_watch_handle(ww->watch, DBUS_WATCH_READABLE); + + if (m_connection) + { + //_dbus_connection_acquire_dispatch(m_connection); + //dbus_connection_dispatch(m_connection); + //_dbus_connection_release_dispatch(m_connection); + + emit readReady(); +}*/ +} + +void Integrator::slotWrite(int fd) +{ + //qDebug("slotWrite"); + + QIntDictIterator it(m_watches); + + for (; it.current(); ++it) + dbus_watch_handle(it.current()->watch, DBUS_WATCH_WRITABLE); + + /*Watch* ww = m_watches.find(fd); + + dbus_watch_handle(ww->watch, DBUS_WATCH_WRITABLE);*/ + + //if (m_connection) + //{ + //dbus_connection_flush(m_connection); + + //emit readReady(); + //} +} + +void Integrator::slotTimeout( DBusTimeout *timeout ) +{ + qDebug("Integrator::slotTimeout"); + dbus_timeout_handle( timeout ); +} + +void Integrator::addWatch( DBusWatch *watch ) +{ + qDebug("Integrator::addWatch invoked"); + + if ( !dbus_watch_get_enabled( watch ) ) + { + return; + } + + int flags = dbus_watch_get_flags(watch); + int fd = dbus_watch_get_fd(watch); + + Watch* ww = m_watches.find(fd); + + if (ww && (dbus_watch_get_flags(ww->watch) == flags)) + { + qDebug("API: not adding duplicate watch"); + return; + } + + Watch *qtwatch = new Watch; + qtwatch->watch = watch; + + //qDebug("flags == %d fd == %d", flags, fd); + + if ( flags & DBUS_WATCH_READABLE ) + { + qtwatch->readSocket = new QSocketNotifier( fd, QSocketNotifier::Read, this); + QObject::connect( qtwatch->readSocket, SIGNAL(activated(int)), this, SLOT(slotRead(int)) ); + } + + if (flags & DBUS_WATCH_WRITABLE) + { + qtwatch->writeSocket = new QSocketNotifier( fd, QSocketNotifier::Write, this); + QObject::connect( qtwatch->writeSocket, SIGNAL(activated(int)), this, SLOT(slotWrite(int)) ); + } + + m_watches.insert( fd, qtwatch ); +} + +void Integrator::removeWatch( DBusWatch *watch ) +{ + int key = dbus_watch_get_fd( watch ); + + Watch *qtwatch = m_watches.take( key ); + + if ( qtwatch ) + { + delete qtwatch->readSocket; + qtwatch->readSocket = 0; + delete qtwatch->writeSocket; + qtwatch->writeSocket = 0; + delete qtwatch; + } +} + +void Integrator::addTimeout( DBusTimeout *timeout ) +{ + qDebug("add timeout"); + Timeout *mt = new Timeout( this, timeout ); + m_timeouts.insert( timeout, mt ); + connect( mt, SIGNAL(timeout(DBusTimeout*)), + SLOT(slotTimeout(DBusTimeout*)) ); + mt->start(); +} + +void Integrator::removeTimeout( DBusTimeout *timeout ) +{ + m_timeouts.remove( timeout ); +} + +void Integrator::handleConnection( DBusConnection *c ) +{ + //dbus_connection_ref(c); + //int fd; + //dbus_connection_get_unix_fd(c, &fd); + + //qDebug("Integrator::handleConnection() invoked, fd is %d", fd); + //qDebug("Connection base name: %s", dbus_bus_get_base_service(c)); + + dbus_connection_ref(c); + + //dbus_bus_set_base_service(c, "/com/Skype/API"); + + Connection *con = new Connection( c, this ); + + dbus_connection_set_wakeup_main_function(c, &dbusWakeupMain, con, 0); + //dbus_connection_set_dispatch_status_function(c, dbusDispatchStatusChanged, this, 0); + + + emit newConnection( con ); +} + +}//end namespace Internal +}//end namespace DBusQt + +#include "integrator.moc" diff --git a/plugins/skype/libskype/skypedbus/integrator.h b/plugins/skype/libskype/skypedbus/integrator.h new file mode 100644 index 0000000..475b42f --- /dev/null +++ b/plugins/skype/libskype/skypedbus/integrator.h @@ -0,0 +1,94 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; -*- +/* integrator.h: integrates D-BUS into Qt event loop + * + * Copyright (C) 2003 Zack Rusin + * + * Licensed under the Academic Free License version 2.1 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef DBUS_QT_INTEGRATOR_H +#define DBUS_QT_INTEGRATOR_H + +#include + +#include +#include + +#include + +class QTimer; + +namespace DBusQt +{ + class Connection; + + namespace Internal + { + struct Watch; + + class Timeout : public QObject + { + Q_OBJECT + public: + Timeout( QObject *parent, DBusTimeout *t ); + public: + void start(); + signals: + void timeout( DBusTimeout* ); + protected slots: + void slotTimeout(); + private: + QTimer *m_timer; + DBusTimeout *m_timeout; + }; + + class Integrator : public QObject + { + Q_OBJECT + public: + Integrator( DBusConnection *connection, QObject *parent, bool tmp = FALSE ); + Integrator( DBusServer *server, QObject *parent ); + virtual ~Integrator(); + + signals: + void readReady(); + void newConnection( DBusQt::Connection* ); + + protected slots: + void slotRead( int ); + void slotWrite( int ); + void slotTimeout( DBusTimeout *timeout ); + + public: + void addWatch( DBusWatch* ); + void removeWatch( DBusWatch* ); + + void addTimeout( DBusTimeout* ); + void removeTimeout( DBusTimeout* ); + + void handleConnection( DBusConnection* ); + + QIntDict m_watches; + private: + QPtrDict m_timeouts; + DBusConnection *m_connection; + DBusServer *m_server; + }; + } +} + +#endif diff --git a/plugins/skype/libskype/skypedbus/message.cpp b/plugins/skype/libskype/skypedbus/message.cpp new file mode 100644 index 0000000..a7cf5ad --- /dev/null +++ b/plugins/skype/libskype/skypedbus/message.cpp @@ -0,0 +1,738 @@ + +/* -*- mode: C++; c-file-style: "gnu" -*- */ + +/* message.cpp: Qt wrapper for DBusMessage + * + * Copyright (C) 2003 Zack Rusin + * + * Licensed under the Academic Free License version 2.0 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#define DBUS_API_SUBJECT_TO_CHANGE + +#include "message.h" + +#include + +#include + +namespace DBusQt +{ + + struct Message::iterator::IteratorData + { + DBusMessageIter *iter; + QVariant var; + bool end; + DBusMessage *mesg; + }; + +/** + * Iterator. + */ + Message::iterator::iterator( ) + { + d = new IteratorData; + d->iter = 0; + d->end = true; + } + +/** + * Constructs iterator for the message. + * @param msg message whose fields we want to iterate + */ + Message::iterator::iterator( DBusMessage * msg ) + { + d = new IteratorData; + d->mesg = msg; + d->iter = + static_cast < + DBusMessageIter * >( malloc( sizeof( DBusMessageIter ) ) ); + dbus_message_iter_init( d->mesg, d->iter ); + if ( !d->iter ) + { + qDebug( "No iterator??" ); + } + fillVar( ); + d->end = false; + } + +/** + * Copy constructor for the iterator. + * @param itr iterator + */ + Message::iterator::iterator( const iterator & itr ) + { + d = new IteratorData; + d->iter = itr.d->iter; + d->var = itr.d->var; + d->end = itr.d->end; + } + +/** + * Destructor. + */ + Message::iterator::~iterator( ) + { + free( d->iter ); + delete d; + + d = 0; + } + +/** + * Creates an iterator equal to the @p itr iterator + * @param itr other iterator + * @return + */ + Message::iterator & Message::iterator::operator=( const iterator & itr ) + { + IteratorData *tmp = new IteratorData; + + tmp->iter = itr.d->iter; + tmp->var = itr.d->var; + tmp->end = itr.d->end; + delete d; + + d = tmp; + return *this; + } + +/** + * Returns the constant QVariant held by the iterator. + * @return the constant reference to QVariant held by this iterator + */ + const QVariant & Message::iterator::operator*( ) const + { + return d->var; + } + +/** + * Returns the QVariant held by the iterator. + * @return reference to QVariant held by this iterator + */ + QVariant & Message::iterator::operator*( ) + { + return d->var; + } + +/** + * Moves to the next field and return a reference to itself after + * incrementing. + * @return reference to self after incrementing + */ + Message::iterator & Message::iterator::operator++( ) + { + if ( d->end ) + return *this; + + if ( dbus_message_iter_next( d->iter ) ) + { + fillVar( ); + } + else + { + d->end = true; + d->var = QVariant( ); + } + return *this; + } + +/** + * Moves to the next field and returns self before incrementing. + * @return self before incrementing + */ + Message::iterator Message::iterator::operator++( int ) + { + iterator itr( *this ); + + operator++( ); + return itr; + } + +/** + * Compares this iterator to @p it iterator. + * @param it the iterator to which we're comparing this one to + * @return true if they're equal, false otherwise + */ + bool Message::iterator::operator==( const iterator & it ) + { + if ( d->end == it.d->end ) + { + if ( d->end == true ) + { + return true; + } + else + { + return d->var == it.d->var; + } + } + else + return false; + } + +/** + * Compares two iterators. + * @param it The other iterator. + * @return true if two iterators are not equal, false + * otherwise + */ + bool Message::iterator::operator!=( const iterator & it ) + { + return !operator==( it ); + } + +#ifdef OLD_DBUS + QVariant Message::iterator::marshallBaseType( DBusMessageIter * i ) + { + QVariant ret; + + switch ( dbus_message_iter_get_arg_type( i ) ) + { + case DBUS_TYPE_INT32: + ret = QVariant( dbus_message_iter_get_int32( i ) ); + break; + case DBUS_TYPE_UINT32: + ret = QVariant( dbus_message_iter_get_uint32( i ) ); + break; + case DBUS_TYPE_DOUBLE: + ret = QVariant( dbus_message_iter_get_double( i ) ); + break; + case DBUS_TYPE_BOOLEAN: + ret = QVariant( dbus_message_iter_get_boolean( i ) ); + break; + case DBUS_TYPE_STRING: + { + char *str = dbus_message_iter_get_string( i ); + + ret = QVariant( QString::fromUtf8( str ) ); + dbus_free( str ); + } + break; + default: + ret = QVariant( ); + break; + } + + return ret; + } +#else + + QVariant Message::iterator::marshallBaseType( DBusMessageIter* i ) { + QVariant ret; + switch (dbus_message_iter_get_arg_type(i)) { + case DBUS_TYPE_INT32: + { + dbus_int32_t v; + dbus_message_iter_get_basic (i, &v); + ret = QVariant( v ); + } + break; + case DBUS_TYPE_UINT32: + { + dbus_uint32_t v; + dbus_message_iter_get_basic (i, &v); + ret = QVariant( v ); + } + break; + case DBUS_TYPE_DOUBLE: + { + double v; + dbus_message_iter_get_basic (i, &v); + ret = QVariant( v ); + } + break; + case DBUS_TYPE_STRING: + { + const char *v; + dbus_message_iter_get_basic (i, &v); + ret = QVariant( v ); + } + break; + default: + ret = QVariant(); + break; + } + return ret; + } +#endif + +/** + * Fills QVariant based on what current DBusMessageIter helds. + */ +#ifdef OLD_DBUS + void Message::iterator::fillVar( ) + { + switch ( dbus_message_iter_get_arg_type( d->iter ) ) + { + case DBUS_TYPE_INT32: + case DBUS_TYPE_UINT32: + case DBUS_TYPE_DOUBLE: + case DBUS_TYPE_STRING: + case DBUS_TYPE_BOOLEAN: + qDebug( "Message::iterator::fillVar, type == DBUS_TYPE_STRING" ); + d->var = marshallBaseType( d->iter ); + break; + case DBUS_TYPE_ARRAY: + { + switch ( dbus_message_iter_get_array_type( d->iter ) ) + { + case DBUS_TYPE_STRING: + { + QStringList tempList; + int count; + char **charArray; + + dbus_message_iter_get_string_array( d->iter, + &charArray, &count ); + + for ( int i = 0; i < count; i++ ) + { + tempList.append( QString( charArray[i] ) ); + } + + d->var = QVariant( tempList ); + dbus_free( charArray ); + break; + } + default: + qDebug( "Array of type not implemented" ); + d->var = QVariant( ); + break; + } + break; + } + case DBUS_TYPE_DICT: + { + qDebug( "Got a hash!" ); + QMap < QString, QVariant > tempMap; + DBusMessageIter dictIter; + + dbus_message_iter_init_dict_iterator( d->iter, &dictIter ); + do + { + char *key = dbus_message_iter_get_dict_key( &dictIter ); + + tempMap[key] = marshallBaseType( &dictIter ); + dbus_free( key ); + dbus_message_iter_next( &dictIter ); + } + while ( dbus_message_iter_has_next( &dictIter ) ); + d->var = QVariant( tempMap ); + break; + qDebug( "Hash/Dict type not implemented" ); + d->var = QVariant( ); + break; + } + default: + qDebug( "not implemented" ); + d->var = QVariant( ); + break; + } + } +#else + + void Message::iterator::fillVar() { + switch ( dbus_message_iter_get_arg_type( d->iter ) ) { + case DBUS_TYPE_INT32: + case DBUS_TYPE_UINT32: + case DBUS_TYPE_DOUBLE: + case DBUS_TYPE_STRING: + d->var = marshallBaseType( d->iter ); + break; + case DBUS_TYPE_ARRAY: { + switch ( dbus_message_iter_get_element_type( d->iter ) ) { + case DBUS_TYPE_STRING: { + QStringList tempList; + DBusMessageIter sub; + dbus_message_iter_recurse (d->iter, &sub); + while (dbus_message_iter_get_arg_type (&sub) != DBUS_TYPE_INVALID) + { + const char *v; + dbus_message_iter_get_basic (&sub, &v); + tempList.append( QString( v ) ); + dbus_message_iter_next (&sub); + } + d->var = QVariant( tempList ); + break; + } + default: + qDebug( "Array of type not implemented" ); + d->var = QVariant(); + break; + } + break; + } +#if 0 + /* DICT is gone for now, but expected to be reintroduced, or else + * reintroduced as a flag on the introspection data that can + * apply to array of struct of two fields + */ + case DBUS_TYPE_DICT: { + qDebug( "Got a hash!" ); + QMap tempMap; + DBusMessageIter dictIter; + dbus_message_iter_init_dict_iterator( d->iter, &dictIter ); + do { + char *key = dbus_message_iter_get_dict_key( &dictIter ); + tempMap[key] = marshallBaseType( &dictIter ); + dbus_free( key ); + dbus_message_iter_next( &dictIter ); + } while( dbus_message_iter_has_next( &dictIter ) ); + d->var = QVariant( tempMap ); + break; + qDebug( "Hash/Dict type not implemented" ); + d->var = QVariant(); + break; + } +#endif + default: + qDebug( "not implemented" ); + d->var = QVariant(); + break; + } + } +#endif + +/** + * Returns a QVariant help by this iterator. + * @return QVariant held by this iterator + */ + QVariant Message::iterator::var( ) const + { + return d->var; + } + + struct Message::Private + { + DBusMessage *msg; + }; + + Message::Message( DBusMessage * m ) + { + d = new Private; + d->msg = m; + } + +/** + * + */ + Message::Message( int messageType ) + { + d = new Private; + d->msg = dbus_message_new( messageType ); + } + +/** + * Constructs a new Message with the given service and name. + * @param service service service that the message should be sent to + * @param name name of the message + */ + Message::Message( const QString & service, const QString & path, + const QString & interface, const QString & method ) + { + d = new Private; + d->msg = + dbus_message_new_method_call( service.latin1( ), path.latin1( ), + interface.latin1( ), + method.latin1( ) ); + } + +/** + * Constructs a message that is a reply to some other + * message. + * @param name the name of the message + * @param replayingTo original_message the message which the created + * message is a reply to. + */ + Message::Message( const Message & replayingTo ) + { + d = new Private; + d->msg = dbus_message_new_method_return( replayingTo.d->msg ); + } + + Message::Message( const QString & path, const QString & interface, + const QString & name ) + { + qDebug( "Message::Message" ); + d = new Private; + d->msg = dbus_message_new_signal( path.ascii( ), interface.ascii( ), + name.ascii( ) ); + } + + Message::Message( const Message & replayingTo, const QString & errorName, + const QString & errorMessage ) + { + d = new Private; + d->msg = + dbus_message_new_error( replayingTo.d->msg, errorName.utf8( ), + errorMessage.utf8( ) ); + } + + Message Message::operator=( const Message & other ) + { + //FIXME: ref the other.d->msg instead of copying it? + } + +/** + * Destructs message. + */ + Message::~Message( ) + { + if ( d->msg ) + { + dbus_message_unref( d->msg ); + } + delete d; + + d = 0; + } + + int Message::type( ) const + { + return dbus_message_get_type( d->msg ); + } + + void Message::setAutoActivation( bool aa ) + { +#ifdef OLD_DBUS + dbus_message_set_auto_activation( d->msg, aa ); +#else + dbus_message_set_auto_start(d->msg, aa); +#endif + } + + bool Message::autoActication( ) + { +#ifdef OLD_DBUS + return dbus_message_get_auto_activation( d->msg ); +#else + return dbus_message_get_auto_start(d->msg); +#endif + } + + void Message::setPath( const QString & path ) + { + dbus_message_set_path( d->msg, path.ascii( ) ); + } + + QString Message::path( ) const + { + return dbus_message_get_path( d->msg ); + } + + void Message::setInterface( const QString & iface ) + { + dbus_message_set_interface( d->msg, iface.ascii( ) ); + } + + QString Message::interface( ) const + { + return dbus_message_get_interface( d->msg ); + } + + void Message::setMember( const QString & member ) + { + dbus_message_set_member( d->msg, member.ascii( ) ); + } + + QString Message::member( ) const + { + return dbus_message_get_member( d->msg ); + } + + void Message::setErrorName( const QString & err ) + { + dbus_message_set_error_name( d->msg, err.utf8() ); + } + + QString Message::errorName( ) const + { + return dbus_message_get_error_name( d->msg ); + } + + void Message::setDestination( const QString & dest ) + { + dbus_message_set_destination( d->msg, dest.utf8() ); + } + + QString Message::destination( ) const + { + return dbus_message_get_destination( d->msg ); + } + +/** + * Sets the message sender. + * @param sender the sender + * @return false if unsuccessful + */ + bool Message::setSender( const QString & sender ) + { + return dbus_message_set_sender( d->msg, sender.latin1( ) ); + } + +/** + * Returns sender of this message. + * @return sender + */ + QString Message::sender( ) const + { + return dbus_message_get_sender( d->msg ); + } + + bool Message::expectReply( ) const + { + return !dbus_message_get_no_reply( d->msg ); + } + + QString Message::signature( ) const + { + return dbus_message_get_signature( d->msg ); + } + +/** + * Returns the starting iterator for the fields of this + * message. + * @return starting iterator + */ + Message::iterator Message::begin( ) const + { + return iterator( d->msg ); + } + +/** + * Returns the ending iterator for the fields of this + * message. + * @return ending iterator + */ + Message::iterator Message::end( ) const + { + return iterator( ); + } + +/** + * Returns the field at position @p i + * @param i position of the wanted field + * @return QVariant at position @p i or an empty QVariant + */ + QVariant Message::at( int i ) + { + iterator itr( d->msg ); + + while ( i-- ) + { + if ( itr == end( ) ) + return QVariant( ); //nothing there + ++itr; + } + return *itr; + } + +/** + * The underlying DBusMessage of this class. + * @return DBusMessage pointer. + */ + DBusMessage *Message::message( ) const + { + return d->msg; + } + + Message & Message::operator<<( bool b ) + { +#ifdef OLD_DBUS + dbus_message_append_args( d->msg, DBUS_TYPE_BOOLEAN, b, +#else + const dbus_bool_t right_size_bool = b; + dbus_message_append_args( d->msg, DBUS_TYPE_BOOLEAN, &right_size_bool, +#endif + DBUS_TYPE_INVALID ); + return *this; + } + +#ifdef OLD_DBUS +#define APER +#else +#define APER & +#endif + + Message & Message::operator<<( Q_INT8 byte ) + { + dbus_message_append_args( d->msg, DBUS_TYPE_BYTE, APER byte, + DBUS_TYPE_INVALID ); + return *this; + } + + Message & Message::operator<<( Q_INT32 num ) + { + dbus_message_append_args( d->msg, DBUS_TYPE_INT32, APER num, + DBUS_TYPE_INVALID ); + return *this; + } + + Message & Message::operator<<( Q_UINT32 num ) + { + dbus_message_append_args( d->msg, DBUS_TYPE_UINT32, APER num, + DBUS_TYPE_INVALID ); + return *this; + } + + Message & Message::operator<<( Q_INT64 num ) + { + dbus_message_append_args( d->msg, DBUS_TYPE_INT64, APER num, + DBUS_TYPE_INVALID ); + return *this; + } + + Message & Message::operator<<( Q_UINT64 num ) + { + dbus_message_append_args( d->msg, DBUS_TYPE_UINT64, APER num, + DBUS_TYPE_INVALID ); + return *this; + } + + Message & Message::operator<<( double num ) + { + dbus_message_append_args( d->msg, DBUS_TYPE_DOUBLE, APER num, + DBUS_TYPE_INVALID ); + return *this; + } + + Message & Message::operator<<( const QString & str ) + { +#ifdef OLD_DBUS + dbus_message_append_args( d->msg, + DBUS_TYPE_STRING, + ( const char * ) ( str.utf8( ) ), 0 ); +#else + const char *u = str.utf8(); + dbus_message_append_args( d->msg, + DBUS_TYPE_STRING, + u, 0 ); +#endif + return *this; + } + + Message & Message::operator<<( const QVariant & custom ) + { + //FIXME: imeplement + return *this; + } + +} + diff --git a/plugins/skype/libskype/skypedbus/message.h b/plugins/skype/libskype/skypedbus/message.h new file mode 100644 index 0000000..5134ccd --- /dev/null +++ b/plugins/skype/libskype/skypedbus/message.h @@ -0,0 +1,136 @@ +/* -*- mode: C++; c-file-style: "gnu" -*- */ +/* message.h: Qt wrapper for DBusMessage + * + * Copyright (C) 2003 Zack Rusin + * + * Licensed under the Academic Free License version 2.1 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef DBUS_QT_MESSAGE_H +#define DBUS_QT_MESSAGE_H + +#include +#include +#include + +#include + +namespace DBusQt { + + class Message + { + public: + class iterator { + public: + iterator(); + iterator( const iterator& ); + iterator( DBusMessage* msg ); + ~iterator(); + + iterator& operator=( const iterator& ); + const QVariant& operator*() const; + QVariant& operator*(); + iterator& operator++(); + iterator operator++(int); + bool operator==( const iterator& it ); + bool operator!=( const iterator& it ); + + QVariant var() const; + protected: + QVariant marshallBaseType( DBusMessageIter* i ); + void fillVar(); + struct IteratorData; + IteratorData *d; + }; + + Message( int messageType ); + Message( DBusMessage * );//hide this one from the public implementation + Message( const QString& service, const QString& path, + const QString& interface, const QString& method ); + Message( const Message& replayingTo ); + Message( const QString& path, const QString& interface, + const QString& name ); + Message( const Message& replayingTo, const QString& errorName, + const QString& errorMessage ); + + Message operator=( const Message& other ); + + virtual ~Message(); + + int type() const; + + void setPath( const QString& ); + QString path() const; + + void setInterface( const QString& ); + QString interface() const; + + void setMember( const QString& ); + QString member() const; + + void setErrorName( const QString& ); + QString errorName() const; + + void setDestination( const QString& ); + QString destination() const; + + bool setSender( const QString& sender ); + QString sender() const; + + void setAutoActivation(bool aa); + bool autoActication(); + + bool expectReply() const; + + QString signature() const; + + iterator begin() const; + iterator end() const; + + QVariant at( int i ); + + + public: + Message& operator<<( bool ); + Message& operator<<( Q_INT8 ); + Message& operator<<( Q_INT32 ); + Message& operator<<( Q_UINT32 ); + Message& operator<<( Q_INT64 ); + Message& operator<<( Q_UINT64 ); + Message& operator<<( double ); + Message& operator<<( const QString& ); + Message& operator<<( const QVariant& ); + //Message& operator<<(); + //Message& operator<<(); + //Message& operator<<(); + //Message& operator<<(); + //Message& operator<<(); + //Message& operator<<(); + //Message& operator<<(); + + protected: + friend class Connection; + DBusMessage* message() const; + + private: + struct Private; + Private *d; + }; + +} + +#endif diff --git a/plugins/skype/libskype/skypedbus/skypeconnection.cpp b/plugins/skype/libskype/skypedbus/skypeconnection.cpp new file mode 100644 index 0000000..5014494 --- /dev/null +++ b/plugins/skype/libskype/skypedbus/skypeconnection.cpp @@ -0,0 +1,391 @@ +// +// C++ Implementation: skypeconnection +// +// Description: +// +// +// Author: SIM Developers , (C) 2005 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#define DBUS_API_SUBJECT_TO_CHANGE +#include "skypeconnection.h" + +///@todo When QT 4 is used, the signal-slot wrapper will be better, replace it +#include "connection.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +typedef enum { + cfConnected, + cfNotConnected, + cfNameSent, + cfProtocolSent, + cfWaitingStart +} connFase; + +class SkypeConnectionPrivate { + public: + ///Are we connected/connecting? + connFase fase; + ///How will we be known to skype? + QString appName; + ///What is the protocol version used (wanted if not connected yet) + int protocolVer; + ///The connection to DBus + DBusQt::Connection *conn; + ///This timer will keep trying until Skype starts + QTimer *startTimer; + ///How much time rest? (until I say starting skype did not work) + int timeRemaining; + ///Wait a while before we conect to just-started skype? + int waitBeforeConnect; +}; + +SkypeConnection::SkypeConnection() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d = new SkypeConnectionPrivate;//create the d pointer + d->fase = cfNotConnected;//not connected yet + d->conn = 0L;//No connetion created + d->startTimer = 0L; + + connect(this, SIGNAL(received(const QString&)), this, SLOT(parseMessage(const QString&)));//look into all messages +} + +SkypeConnection::~SkypeConnection() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + disconnectSkype();//disconnect before you leave + delete d;//Remove the D pointer +} + +void SkypeConnection::startLogOn() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->startTimer) { + d->startTimer->deleteLater(); + d->startTimer = 0L; + } + + DBusQt::Message ping("com.Skype.API", "/com/Skype", "com.Skype.API", "Ping");//create a ping message + ping.setAutoActivation(true); + DBusQt::Message reply = d->conn->sendWithReplyAndBlock(ping);//send it there + + DBusQt::Message::iterator it = reply.begin(); + if (it == reply.end()) { + emit error(i18n("Could not ping Skype")); + disconnectSkype(crLost); + emit connectionDone(seNoSkype, 0); + return; + } + + d->fase = cfNameSent; + send(QString("NAME %1").arg(d->appName)); +} + +void SkypeConnection::gotMessage(const DBusQt::Message &message) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (message.member() == "Ping") {//Skype wants to know if we are alive + kdDebug(14311) << "Skype sent us ping, responding" << endl; + DBusQt::Message reply(message);//Create the reply + reply << getpid();//respond with our PID + d->conn->send(reply);//send it + d->conn->flush(); + return;//It is enough + } + + if (message.member() == "Notify") {//Something importatnt? + for (DBusQt::Message::iterator it = message.begin(); it != message.end(); ++it) {//run trough the whole message + emit received((*it).toString());//Take out the string and use it + } + + if (message.expectReply()) { + kdDebug(14311) << "Message expects reply, sending a dummy one" << endl; + DBusQt::Message *reply = new DBusQt::Message(message);//generate a reply for that message + (*reply) << QString("ERROR 2");//write there seme error + d->conn->send(*reply);//send the message + d->conn->flush(); + } + } +} + +void SkypeConnection::parseMessage(const QString &message) { + kdDebug(14311) << k_funcinfo << QString("(message: %1)").arg(message) << endl;//some debug info + + switch (d->fase) { + case cfNameSent: { + + if (message == "OK") {//Accepted by skype + d->fase = cfProtocolSent;//Sending the protocol + send(QString("PROTOCOL %1").arg(d->protocolVer));//send the protocol version + } else {//Not accepted by skype + emit error(i18n("Skype did not accept this application"));//say there is an error + emit connectionDone(seAuthorization, 0);//Problem with authorization + disconnectSkype(crLost);//Lost the connection + } + break; + } + case cfProtocolSent: { + if (message.contains("PROTOCOL", false)) {//This one inform us what protocol do we use + bool ok; + int version = message.section(' ', 1, 1).stripWhiteSpace().toInt(&ok, 0);//take out the protocol version and make it int + if (!ok) { + emit error(i18n("Skype API syntax error")); + emit connectionDone(seUnknown, 0); + disconnectSkype(crLost);//lost the connection + return;//I have enough + } + d->protocolVer = version;//this will be the used version of protocol + d->fase = cfConnected; + emit connectionDone(seSuccess, version);//tell him that we are connected at last + } else {//the API is not ready yet, try later + emit error(i18n("Skype API not ready yet, wait a bit longer")); + emit connectionDone(seUnknown, 0); + disconnectSkype(crLost); + return; + } + break;//Other messages are ignored, waiting for the protocol response + } + } +} + +void SkypeConnection::connectSkype(const QString &start, const QString &appName, int protocolVer, int bus, bool startDBus, int launchTimeout, int waitBeforeConnect) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->fase != cfNotConnected) + return; + + d->appName = appName; + d->protocolVer = protocolVer; + + if (bus == 0) + d->conn = new DBusQt::Connection(DBUS_BUS_SESSION, this); + else + d->conn = new DBusQt::Connection(DBUS_BUS_SYSTEM, this); + + if ((!d->conn) || (!d->conn->isConnected())) { + if ((bus == 0) && (startDBus)) { + KProcess bus_launch; + bus_launch << "dbus_launch"; + bus_launch << "--exit-with-session"; + connect(&bus_launch, SIGNAL(receivedStdout(KProcess *, char *, int)), this, SLOT(setEnv(KProcess *, char*, int ))); + bus_launch.start(KProcess::Block, KProcess::Stdout); + connectSkype(start, appName, protocolVer, bus, false, launchTimeout, waitBeforeConnect);//try it once again, but if the dbus start did not work, it won't work that time ether, so do not cycle + return; + } + emit error(i18n("Could not connect to DBus")); + disconnectSkype(crLost); + emit connectionDone(seNoDBus, 0); + return; + } + + d->conn->registerObjectPath("org.kde.SIM.skype", "/com/Skype/Client"); + + connect(d->conn, SIGNAL(messageArrived(const DBusQt::Message&)), this, SLOT(gotMessage(const DBusQt::Message &))); + + { + DBusQt::Message m("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "ServiceExists"); + m << QString("com.Skype.API"); + m.setAutoActivation(true); + + DBusQt::Message reply = d->conn->sendWithReplyAndBlock(m); + + DBusQt::Message::iterator it = reply.begin(); + if ((it == reply.end()) || ((*it).toBool() != true)) { + if (!start.isEmpty()) {//try starting Skype by the given command + KProcess sk; + QStringList args = QStringList::split(' ', start); + for (QStringList::iterator i = args.begin(); i != args.end(); ++i) { + sk << (*i); + } + if (!sk.start(KProcess::DontCare, KProcess::NoCommunication)) { + emit error(i18n("Could not launch Skype")); + disconnectSkype(crLost); + emit connectionDone(seNoSkype, 0); + return; + } + d->fase = cfWaitingStart; + d->startTimer = new QTimer(); + connect(d->startTimer, SIGNAL(timeout()), this, SLOT(tryConnect())); + d->startTimer->start(1000); + d->timeRemaining = launchTimeout; + d->waitBeforeConnect = waitBeforeConnect; + return; + } + emit error(i18n("Could not find Skype")); + disconnectSkype(crLost); + emit connectionDone(seNoSkype, 0); + return; + } + } + + startLogOn(); +} + +void SkypeConnection::disconnectSkype(skypeCloseReason reason) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (!d->conn) //nothing to disconnect + return; + d->conn->close();//close the connection + delete d->conn;//destroy it + d->conn = 0L;//andmark it as empty + if (d->startTimer) { + d->startTimer->stop(); + d->startTimer->deleteLater(); + d->startTimer = 0L; + } + + d->fase = cfNotConnected;//No longer connected + emit connectionDone(seCanceled, 0); + emit connectionClosed(reason);//we disconnect +} + +void SkypeConnection::send(const QString &message) { + kdDebug(14311) << k_funcinfo << QString("(message: %1)").arg(message) << endl;//some debug info + + if (d->fase == cfNotConnected) + return;//not connected, posibly because of earlier error, do not show it again + + DBusQt::Message m("com.Skype.API", "/com/Skype", "com.Skype.API", "Invoke"); + m << message; + m.setAutoActivation(true); + DBusQt::Message reply = d->conn->sendWithReplyAndBlock(m); + + d->conn->flush(); + if (d->conn->error()) {//There was some error + emit error(i18n("Error while sending a message to skype (%1)").arg(d->conn->getError()));//say there was the error + if (d->fase != cfConnected) + emit connectionDone(seUnknown, 0);//Connection attempt finished with error + disconnectSkype(crLost);//lost the connection + + return;//this is enough, no more errors please.. + } + + for (DBusQt::Message::iterator it = reply.begin(); it != reply.end(); ++it) { + emit received((*it).toString());//use the message + } +// d->conn->send(m); +} + +bool SkypeConnection::connected() const { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + return d->fase == cfConnected; +} + +int SkypeConnection::protocolVer() const { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + return d->protocolVer;//just give him the protocol version +} + +SkypeConnection &SkypeConnection::operator <<(const QString &message) { + send(message);//just send it + return *this;//and return yourself +} + +QString SkypeConnection::operator %(const QString &message) { + kdDebug(14311) << k_funcinfo << "message: " << message << endl;//some debug info + + if (d->fase == cfNotConnected) + return "";//not connected, posibly because of earlier error, do not show it again + + DBusQt::Message m("com.Skype.API", "/com/Skype", "com.Skype.API", "Invoke"); + m << message; + m.setAutoActivation(true); + DBusQt::Message reply = d->conn->sendWithReplyAndBlock(m); + + d->conn->flush(); + if (d->conn->error()) {//There was some error + emit error(i18n("Error while sending a message to skype (%1)").arg(d->conn->getError()));//say there was the error + if (d->fase != cfConnected) + emit connectionDone(seUnknown, 0);//Connection attempt finished with error + disconnectSkype(crLost);//lost the connection + return "";//this is enough, no more errors please.. + } + + for (DBusQt::Message::iterator it = reply.begin(); it != reply.end(); ++it) { + kdDebug(14311) << (*it).toString() << endl;//show what we have received + return (*it).toString();//ok, just return it + } + + return "";//the skype did not respond, which is unusual but what can I do.. +} + +void SkypeConnection::setEnv(KProcess *, char *buffer, int length) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + char *myBuff = new char[length + 1]; + myBuff[length] = '\0'; + memcpy(myBuff, buffer, length);//copy the output from there + + char *next; + + for (char *c = myBuff; *c; c++) if (*c == '=') { + *c = '\0';//Split the string + next = c + 1;//This is the next one + break; + } + + if (strcmp(myBuff, "DBUS_SESSION_BUS_ADDRESS") != 0) { + delete[] myBuff; + return;//something I'm not interested in + } + + //strip the apostrophes or quotes given by the dbus-launch command + if ((next[0] == '\'') || (next[0] == '"')) ++next; + int len = strlen(next); + if ((next[len - 1] == '\'') || (next[len - 1] == '"')) next[len - 1] = '\0'; + + setenv(myBuff, next, false);//and set the environment variable + + delete[] myBuff; +} + +void SkypeConnection::tryConnect() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + { + DBusQt::Message m("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "ServiceExists"); + m << QString("com.Skype.API"); + m.setAutoActivation(true); + + DBusQt::Message reply = d->conn->sendWithReplyAndBlock(m); + + DBusQt::Message::iterator it = reply.begin(); + if ((it == reply.end()) || ((*it).toBool() != true)) { + if (--d->timeRemaining == 0) { + d->startTimer->stop(); + d->startTimer->deleteLater(); + d->startTimer = 0L; + emit error(i18n("Could not find Skype")); + disconnectSkype(crLost); + emit connectionDone(seNoSkype, 0); + return; + } + return;//Maybe next time + } + } + + d->startTimer->stop(); + d->startTimer->deleteLater(); + d->startTimer = 0L; + if (d->waitBeforeConnect) { + QTimer::singleShot(1000 * d->waitBeforeConnect, this, SLOT(startLogOn())); + //Skype does not like being bothered right after it's start, give it a while to breathe + } else + startLogOn();//OK, it's your choise +} + +#include "skypeconnection.moc" diff --git a/plugins/skype/libskype/skypedbus/skypeconnection.h b/plugins/skype/libskype/skypedbus/skypeconnection.h new file mode 100644 index 0000000..ff4c9e8 --- /dev/null +++ b/plugins/skype/libskype/skypedbus/skypeconnection.h @@ -0,0 +1,171 @@ +// +// C++ Interface: skypeconnection +// +// Description: +// +// +// Author: SIM Developers , (C) 2005 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef SKYPECONNECTION_H +#define SKYPECONNECTION_H + +#include + +typedef enum { + ///The connection was successful + seSuccess = 0, + ///No runnign DBUS found + seNoDBus, + ///No running skype found and launching disabled or did not worked + seNoSkype, + ///User did not accept this app + seAuthorization, + ///Some other error + seUnknown, + ///It was canceled (by disconnectSkype) + seCanceled +} skypeConnectionError; + +///This describes why was the connection closed +typedef enum { + ///It was closed by this application + crLocalClosed, + ///It was closed by skype (reserverd for future versions of protocol, does not work yet) + crRemoteClosed, + ///The connection was lost, skype does not respond for the ping command or messages can not be sent + crLost, +} skypeCloseReason; + +class SkypeConnectionPrivate; +namespace DBusQt { + class Message; +}; +class KProcess; + +/** + * This class is classs wrapping DBUS so it can be used easilly to connect to skype, disconnect send and receive messages from it. + * @author SIM Developers +*/ +class SkypeConnection : public QObject +{ + Q_OBJECT + private: + ///The D-pointer for internal things + SkypeConnectionPrivate *d; + private slots: + ///This one listens for incoming messages + void gotMessage(const DBusQt::Message &); + ///This one takes care of incoming messages if they have some sence for the connection (protocol, pings and so on) + void parseMessage(const QString &message); + ///Set environment variables set from dbus-launch command (private DBus session) + void setEnv(KProcess *, char *buff, int len); + ///Starts logging into skype + void startLogOn(); + ///Another interval try to connect to just started Skype + void tryConnect(); + public slots: + /** + * Connects to skype + * After connection (both successful or unsuccessful) connectionDone is emitted + * @see connectionDone + * @param start By what command start Skype if it is not running (empty string means nothing is started) + * @param appName tells as what application it should authorise itself (this will user see on the "do you want to allow" dialog box) + * @param protocolVer Maximal protocol version that this app manages + * @param bus 0 - session bus, 1 - system bus + * @param startDbus Start session DBUs if needed (etc. not running and session DBus should be used) + * @param launchTimeout How long max. should wait to tell that launching skype did not work + * @param waitBeforeConnect Do we need to wait a while after skype starts? + */ + void connectSkype(const QString &start, const QString &appName, int protocolVer, int bus, bool startDBus, int launchTimeout, int waitBeforeConnect); + /** + * Disconnects from skype + * @see connectionClosed + */ + void disconnectSkype(skypeCloseReason reason = crLocalClosed); + /** + * Sends a message to skype. You must be connected before ! + * @param message Contains the message to send + */ + void send(const QString &message); + public: + /** + * Constructor. Creates UNCONECTED connection (sounds oddly ?) + */ + SkypeConnection(); + /** + * Destructor + */ + ~SkypeConnection(); + /** + * This enables/disables pings to skype and sets interval of the pings and timeout + * @param enable Enable or not the pings? If this is false, no pings are done and the rest of parameters has no effect + * @param interval Interval in witch pings should be sent, in miliseconds + * @param timeout When the ping should be considered unanwsered? (should be shorter than interval), in miliseconds + */ + void setPing(bool enable, int interval, int timeout); + /** + * @return Are the pings enabled? + */ + bool getPing() const; + /** + * @return What is the interval of pings? (ms) + */ + int getPingInterval() const; + /** + * @return What is the timeout od pings? (ms) + */ + int getPingTimeout() const; + /** + * @return Are we connected to the skype? + */ + bool connected() const; + /** + * @return What is the protocol version? + */ + int protocolVer() const; + /** + * This operator makes it possible to just send messages by writing connection << SomeString << anotherString. They are sent as separate objects; + * @param message What will be sent + */ + SkypeConnection &operator<<(const QString &message); + /** + * This operator sends a message to skype and returns the response from it. Note that this one blocks. + * @param message What should be sent to skype + * @return The response from skype + */ + QString operator%(const QString &message); + signals: + /** + * This signal is emitted when an attempt to connect to skype application is done. It is done in both cases, success or not. + * @param error Indicates error code. seSuccess means there was no error and the connection was successful. + * @param protocolVer Protocol version used by this connection. Is less or equal to the version set in connect + * @see connect + */ + void connectionDone(int error, int protocolVer); + /** + * This signal is emitted when the connection is closed due to error or because it was disconnetcted + * @param reason Describes why it was closed (you can typecast it to skypeCloseReason if you are interested, or just use the numeric values) + */ + void connectionClosed(int reason); + /** + * This slot is emitted when something is coming from skype. + * It contains pongs as well (responses to ping) and if you do not care about them, you should ignore them. + * @param message The message that arrived + */ + void received(const QString &message); + /** + * This is emitted when some error occurs + * @param message Describes the error + */ + void error(const QString &message); + /** + * This is provided for debugging so you can see what you have sent to skype + * @param message The message that was sent to skype + */ + void sent(const QString &message); +}; + +#endif diff --git a/plugins/skype/skypeaccount.cpp b/plugins/skype/skypeaccount.cpp new file mode 100644 index 0000000..7c00a8a --- /dev/null +++ b/plugins/skype/skypeaccount.cpp @@ -0,0 +1,828 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include "skypeaccount.h" +#include "skypeprotocol.h" +#include "skypecontact.h" +#include "skype.h" +#include "skypecalldialog.h" +#include "skypechatsession.h" +#include "skypeconference.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class SkypeAccountPrivate { + public: + ///The skype protocol pointer + SkypeProtocol *protocol; + ///ID of this account (means my skype name) + QString ID; + ///The skype back-end + Skype skype; + ///The hitchhike mode of incoming messages + bool hitch; + ///The mark read messages mode + bool markRead; + ///Search for unread messages on login? + bool searchForUnread; + ///Do we show call control window? + bool callControl; + ///Metacontact for all users that aren't in the list + SIM::MetaContact notInListUsers; + ///Constructor + SkypeAccountPrivate(SkypeAccount &account) : skype(account) {};//just an empty constructor + ///Automatic close of call window when the call finishes (in seconds, 0 -> disabled) + int callWindowTimeout; + ///Are the pings enabled? + bool pings; + ///What bus are we using, session (0) or system (1)? + int bus; + ///Do we start DBus if needed? + bool startDBus; + ///How long can I keep trying connect to newly started skype, before I give up (seconds) + int launchTimeout; + ///By what command is the skype started? + QString skypeCommand; + ///What is my name, by the way? + QString myName; + ///Do we wait before connecting? + int waitBeforeConnect; + ///List of chat all chat sessions + QDict sessions; + ///Last used chat session + SkypeChatSession *lastSession; + ///List of the conference calls + QDict conferences; + ///List of existing calls + QDict calls; + ///Shall chat window leave the chat whenit is closed + bool leaveOnExit; + ///Executed before making the call + QString startCallCommand; + ///Executed after finished the call + QString endCallCommand; + ///Wait for the start call command to finitsh? + bool waitForStartCallCommand; + ///Execute the end call command only if no other calls exists? + bool endCallCommandOnlyLats; + ///How many calls are opened now? + int callCount; + ///Command executed on incoming call + QString incommingCommand; +}; + +SkypeAccount::SkypeAccount(SkypeProtocol *protocol) : SIM::Account(protocol, "Skype", (char *)0) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + //keep track of what accounts the protocol has + protocol->registerAccount(this); + + //the d pointer + d = new SkypeAccountPrivate(*this); + d->calls.setAutoDelete(false); + d->conferences.setAutoDelete(false); + //remember the protocol, it will be needed + d->protocol = protocol; + + //load the properties + KConfigGroup *config = configGroup(); + author = config->readEntry("Authorization");//get the name how to authorize myself + launchType = config->readNumEntry("Launch");//launch the skype? + setScanForUnread(config->readBoolEntry("ScanForUnread")); + setCallControl(config->readBoolEntry("CallControl")); + setPings(config->readBoolEntry("Pings", true)); + setBus(config->readNumEntry("Bus", 1)); + //setStartDBus(config->readBoolEntry("StartDBus", false)); + ///@todo Once Dbus launching works, remove this v and uncomment this ^ + setStartDBus(false); + setLaunchTimeout(config->readNumEntry("LaunchTimeout", 30)); + d->myName = config->readEntry("MyselfName", "Skype"); + setSkypeCommand(config->readEntry("SkypeCommand", "artsdsp skype --use-session-dbus")); + setWaitBeforeConnect(config->readNumEntry("WaitBeforeConnect", 10)); + setLeaveOnExit(config->readBoolEntry("LeaveOnExit", true)); + setStartCallCommand(config->readEntry("StartCallCommand", "")); + setEndCallCommand(config->readEntry("EndCallCommand", "")); + setWaitForStartCallCommand(config->readBoolEntry("WaitForStartCallCommand", false)); + setEndCallCommandOnlyForLast(config->readBoolEntry("EndCallCommandOnlyLast", false)); + setIncomingCommand(config->readEntry("IncomingCall", "")); + + //create myself contact + SkypeContact *_myself = new SkypeContact(this, "Skype", SIM::ContactList::self()->myself(), false); + setMyself(_myself); + //and set default online status (means offline) + myself()->setOnlineStatus(protocol->Offline); + + //Now, connect the signals + QObject::connect(&d->skype, SIGNAL(wentOnline()), this, SLOT(wentOnline())); + QObject::connect(&d->skype, SIGNAL(wentOffline()), this, SLOT(wentOffline())); + QObject::connect(&d->skype, SIGNAL(wentAway()), this, SLOT(wentAway())); + QObject::connect(&d->skype, SIGNAL(wentNotAvailable()), this, SLOT(wentNotAvailable())); + QObject::connect(&d->skype, SIGNAL(wentDND()), this, SLOT(wentDND())); + QObject::connect(&d->skype, SIGNAL(wentInvisible()), this, SLOT(wentInvisible())); + QObject::connect(&d->skype, SIGNAL(wentSkypeMe()), this, SLOT(wentSkypeMe())); + QObject::connect(&d->skype, SIGNAL(statusConnecting()), this, SLOT(statusConnecting())); + QObject::connect(&d->skype, SIGNAL(newUser(const QString&)), this, SLOT(newUser(const QString&))); + QObject::connect(&d->skype, SIGNAL(contactInfo(const QString&, const QString& )), this, SLOT(updateContactInfo(const QString&, const QString& ))); + QObject::connect(&d->skype, SIGNAL(receivedIM(const QString&, const QString&, const QString& )), this, SLOT(receivedIm(const QString&, const QString&, const QString& ))); + QObject::connect(&d->skype, SIGNAL(gotMessageId(const QString& )), this, SLOT(gotMessageId(const QString& )));//every time some ID is known inform the contacts + QObject::connect(&d->skype, SIGNAL(newCall(const QString&, const QString&)), this, SLOT(newCall(const QString&, const QString&))); + QObject::connect(&d->skype, SIGNAL(setMyselfName(const QString&)), this, SLOT(setMyselfName(const QString& ))); + QObject::connect(&d->skype, SIGNAL(receivedMultiIM(const QString&, const QString&, const QString&, const QString& )), this, SLOT(receiveMultiIm(const QString&, const QString&, const QString&, const QString& ))); + QObject::connect(&d->skype, SIGNAL(outgoingMessage(const QString&, const QString&)), this, SLOT(sentMessage(const QString&, const QString& ))); + QObject::connect(&d->skype, SIGNAL(groupCall(const QString&, const QString& )), this, SLOT(groupCall(const QString&, const QString& ))); + + //set values for the connection (should be updated if changed) + d->skype.setValues(launchType, author); + setHitchHike(config->readBoolEntry("Hitch", true)); + setMarkRead(config->readBoolEntry("MarkRead", true));//read the modes of account + d->callWindowTimeout = config->readNumEntry("CloseWindowTimeout", 3); + setPings(config->readBoolEntry("Pings", true)); + d->sessions.setAutoDelete(false); + d->lastSession = 0L; + d->callCount = 0; +} + + +SkypeAccount::~SkypeAccount() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + save(); + + d->protocol->unregisterAccount();//This account no longer exists + + //free memory + delete d; +} + +bool SkypeAccount::createContact(const QString &contactID, SIM::MetaContact *parentContact) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (!contact(contactID)) {//check weather it is not used already + SkypeContact *newContact = new SkypeContact(this, contactID, parentContact);//create the contact + + return newContact != 0L;//test weather it was created + } else { + kdDebug(14311) << k_funcinfo << "Contact already exists:" << contactID << endl;//Tell that it is not OK + + return false; + } +} + +void SkypeAccount::setAway(bool away, const QString &reason) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (away) + setOnlineStatus(d->protocol->Away, reason); + else + setOnlineStatus(d->protocol->Online, reason); +} + +void SkypeAccount::setOnlineStatus(const SIM::OnlineStatus &status, const QString &) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (status == d->protocol->Online) + d->skype.setOnline();//Go online + else if (status == d->protocol->Offline) + d->skype.setOffline();//Go offline + else if (status == d->protocol->Away) + d->skype.setAway(); + else if (status == d->protocol->NotAvailable) + d->skype.setNotAvailable(); + else if (status == d->protocol->DoNotDisturb) + d->skype.setDND(); + else if (status == d->protocol->Invisible) + d->skype.setInvisible(); + else if (status == d->protocol->SkypeMe) + d->skype.setSkypeMe(); + else + kdDebug(14311) << "Unknown online status" << endl;//Just a warning that I do not know that status +} + +void SkypeAccount::disconnect() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + setOnlineStatus(d->protocol->Offline, ""); +} + +SkypeContact *SkypeAccount::contact(const QString &id) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + return static_cast(contacts()[id]);//get the contact and convert it into the skype contact, there are no other contacts anyway +} + +void SkypeAccount::connect(const SIM::OnlineStatus &Status) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if ((Status != d->protocol->Online) && (Status != d->protocol->Away) && + (Status != d->protocol->NotAvailable) && (Status != d->protocol->DoNotDisturb) && + (Status != d->protocol->SkypeMe))//some strange online status, taje a default one + setOnlineStatus(d->protocol->Online, ""); + else + setOnlineStatus(Status, "");//just change the status +} + +void SkypeAccount::save() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + KConfigGroup *config = configGroup();//get the config + config->writeEntry("Authorization", author);//write the authorization name + config->writeEntry("Launch", launchType);//and the launch type + config->writeEntry("Hitch", getHitchHike());//save the hitch hike messages mode + config->writeEntry("MarkRead", getMarkRead());//save the Mark read messages mode + config->writeEntry("ScanForUnread", getScanForUnread()); + config->writeEntry("CallControl", getCallControl()); + config->writeEntry("CloseWindowTimeout", d->callWindowTimeout); + config->writeEntry("Pings", getPings()); + config->writeEntry("Bus", getBus()); + config->writeEntry("StartDBus", getStartDBus()); + config->writeEntry("LaunchTimeout", getLaunchTimeout()); + config->writeEntry("SkypeCommand", getSkypeCommand()); + config->writeEntry("MyselfName", d->myName); + config->writeEntry("WaitBeforeConnect", getWaitBeforeConnect()); + config->writeEntry("LeaveOnExit", leaveOnExit()); + config->writeEntry("StartCallCommand", startCallCommand()); + config->writeEntry("EndCallCommand", endCallCommand()); + config->writeEntry("WaitForStartCallCommand", waitForStartCallCommand()); + config->writeEntry("EndCallCommandOnlyLast", endCallCommandOnlyLast()); + config->writeEntry("IncomingCall", incomingCommand()); + + //save it into the skype connection as well + d->skype.setValues(launchType, author); +} + +void SkypeAccount::wentOnline() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + myself()->setOnlineStatus(d->protocol->Online);//just set the icon + d->skype.enablePings(d->pings); + emit connectionStatus(true); +} + +void SkypeAccount::wentOffline() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + myself()->setOnlineStatus(d->protocol->Offline);//just change the icon + emit connectionStatus(false); +} + +void SkypeAccount::wentAway() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + myself()->setOnlineStatus(d->protocol->Away);//just change the icon + emit connectionStatus(true); +} + +void SkypeAccount::wentNotAvailable() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + myself()->setOnlineStatus(d->protocol->NotAvailable); + emit connectionStatus(true); +} + +void SkypeAccount::wentDND() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + myself()->setOnlineStatus(d->protocol->DoNotDisturb); + emit connectionStatus(true); +} + +void SkypeAccount::wentInvisible() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + myself()->setOnlineStatus(d->protocol->Invisible); + emit connectionStatus(true); +} + +void SkypeAccount::wentSkypeMe() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + myself()->setOnlineStatus(d->protocol->SkypeMe); + emit connectionStatus(true); +} + +void SkypeAccount::statusConnecting() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + myself()->setOnlineStatus(d->protocol->Connecting); + emit connectionStatus(false); +} + +void SkypeAccount::newUser(const QString &name) { + kdDebug(14311) << k_funcinfo << QString("name = %1").arg(name) << endl;//some debug info + if (contacts().find(name)) + return; + addContact(name); +} + +void SkypeAccount::prepareContact(SkypeContact *contact) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + QObject::connect(&d->skype, SIGNAL(updateAllContacts()), contact, SLOT(requestInfo()));//all contacts will know that + QObject::connect(contact, SIGNAL(infoRequest(const QString& )), &d->skype, SLOT(getContactInfo(const QString& )));//How do we ask for info? + QObject::connect(this, SIGNAL(connectionStatus(bool )), contact, SLOT(connectionStatus(bool ))); + QObject::connect(contact, SIGNAL(setCallPossible(bool )), d->protocol, SLOT(updateCallActionStatus())); +} + +void SkypeAccount::updateContactInfo(const QString &contact, const QString &change) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + SkypeContact *cont = static_cast (contacts().find(contact));//get the contact + if (cont) + cont->setInfo(change);//give it the message + else {//it does not yet exist, create it if it is in skype contact list (can be got by buddystatus) + const QString &type = change.section(' ', 0, 0).stripWhiteSpace().upper();//get the first part of the message, it should be BUDDYSTATUS + const QString &value = change.section(' ', 1, 1).stripWhiteSpace();//get the second part if it is some reasonable value + if ((type == "BUDDYSTATUS") && ((value == "2") || (value == "3"))) {//the user is in skype contact list + newUser(contact); + } else if (type != "BUDDYSTATUS")//this is some other info + d->skype.getContactBuddy(contact);//get the buddy status for the account and check, if it is in contact list or not + } +} + +bool SkypeAccount::canComunicate() { + return d->skype.canComunicate(); +} + +SkypeProtocol * SkypeAccount::protocol() { + return d->protocol; +} + +void SkypeAccount::sendMessage(SIM::Message &message, const QString &chat) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (chat.isEmpty()) { + const QString &user = message.to().at(0)->contactId();//get id of the first contact, messages to multiple people are not yet possible + const QString &body = message.plainBody();//get the text of the message + + d->skype.send(user, body);//send it by skype + } else { + const QString &body = message.plainBody(); + + d->skype.sendToChat(chat, body); + } +} + +bool SkypeAccount::getHitchHike() const { + return d->hitch; +} + +bool SkypeAccount::getMarkRead() const { + return d->markRead; +} + +void SkypeAccount::setHitchHike(bool value) { + d->hitch = value;//save it + d->skype.setHitchMode(value);//set it in the skype +} + +void SkypeAccount::setMarkRead(bool value) { + d->markRead = value;//remember it + d->skype.setMarkMode(value); +} + +bool SkypeAccount::userHasChat(const QString &userId) { + SkypeContact *cont = static_cast (contacts().find(userId));//get the contact + + if (cont)//it exists + return cont->hasChat();//so ask it + else + return false;//if it does not exist it can not have a chat opened +} + +void SkypeAccount::receivedIm(const QString &user, const QString &message, const QString &messageId) { + kdDebug(14311) << k_funcinfo << "User: " << user << ", message: " << message << endl;//some debug info + getContact(user)->receiveIm(message, getMessageChat(messageId));//let the contact show the message +} + +void SkypeAccount::setScanForUnread(bool value) { + d->searchForUnread = value; + d->skype.setScanForUnread(value); +} + +bool SkypeAccount::getScanForUnread() const { + return d->searchForUnread; +} + +void SkypeAccount::makeCall(SkypeContact *user) { + makeCall(user->contactId()); +} + +void SkypeAccount::makeCall(const QString &users) { + startCall(); + d->skype.makeCall(users); +} + +bool SkypeAccount::getCallControl() const { + return d->callControl; +} + +void SkypeAccount::setCallControl(bool value) { + d->callControl = value; +} + +void SkypeAccount::newCall(const QString &callId, const QString &userId) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->callControl) {//Show the skype call control window + SkypeCallDialog *dialog = new SkypeCallDialog(callId, userId, this);//It should free itself when it is closed + QObject::connect(&d->skype, SIGNAL(callStatus(const QString&, const QString& )), dialog, SLOT(updateStatus(const QString&, const QString& ))); + QObject::connect(dialog, SIGNAL(acceptTheCall(const QString& )), &d->skype, SLOT(acceptCall(const QString& ))); + QObject::connect(dialog, SIGNAL(hangTheCall(const QString& )), &d->skype, SLOT(hangUp(const QString& ))); + QObject::connect(dialog, SIGNAL(toggleHoldCall(const QString& )), &d->skype, SLOT(toggleHoldCall(const QString& ))); + QObject::connect(&d->skype, SIGNAL(callError(const QString&, const QString& )), dialog, SLOT(updateError(const QString&, const QString& ))); + QObject::connect(&d->skype, SIGNAL(skypeOutInfo(int, const QString& )), dialog, SLOT(skypeOutInfo(int, const QString& ))); + QObject::connect(dialog, SIGNAL(updateSkypeOut()), &d->skype, SLOT(getSkypeOut())); + QObject::connect(dialog, SIGNAL(callFinished(const QString& )), this, SLOT(removeCall(const QString& ))); + d->skype.getSkypeOut(); + + d->calls.insert(callId, dialog); + } + + if ((!d->incommingCommand.isEmpty()) && (d->skype.isCallIncoming(callId))) { + kdDebug(14311) << "Running ring command" << endl; + KProcess *proc = new KProcess(); + (*proc) << QStringList::split(' ', d->incommingCommand); + QObject::connect(proc, SIGNAL(processExited(KProcess* )), proc, SLOT(deleteLater())); + proc->start(); + } +} + +bool SkypeAccount::isCallIncoming(const QString &callId) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + return d->skype.isCallIncoming(callId); +} + +void SkypeAccount::setCloseWindowTimeout(int timeout) { + d->callWindowTimeout = timeout; +} + +int SkypeAccount::closeCallWindowTimeout() const { + return d->callWindowTimeout; +} + +QString SkypeAccount::getUserLabel(const QString &userId) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (userId.find(' ') != -1) {//there are more people than just one + QStringList users = QStringList::split(' ', userId); + for (QStringList::iterator it = users.begin(); it != users.end(); ++it) { + (*it) = getUserLabel((*it).stripWhiteSpace()); + } + return users.join("\n"); + } + + SIM::Contact *cont = contact(userId); + + if (!cont) { + addContact(userId, QString::null, 0L, Temporary);//create a temporary contact + + cont = (contacts().find(userId));//It should be there now + if (!cont) + return userId;//something odd,.but better do nothing than crash + } + + return QString("%1 (%2)").arg(cont->nickName()).arg(userId); +} + +void SkypeAccount::setPings(bool enabled) { + d->skype.enablePings(enabled); + d->pings = enabled; +} + +bool SkypeAccount::getPings() const { + return d->pings; +} + +int SkypeAccount::getBus() const { + return d->bus; +} + +void SkypeAccount::setBus(int bus) { + d->bus = bus; + d->skype.setBus(bus); +} + +void SkypeAccount::setStartDBus(bool enable) { + d->startDBus = enable; + d->skype.setStartDBus(enable); +} + +bool SkypeAccount::getStartDBus() const { + return d->startDBus; +} + +void SkypeAccount::setLaunchTimeout(int seconds) { + d->launchTimeout = seconds; + d->skype.setLaunchTimeout(seconds); +} + +int SkypeAccount::getLaunchTimeout() const { + return d->launchTimeout; +} + +void SkypeAccount::setSkypeCommand(const QString &command) { + d->skypeCommand = command; + d->skype.setSkypeCommand(command); +} + +const QString &SkypeAccount::getSkypeCommand() const { + return d->skypeCommand; +} + +void SkypeAccount::setMyselfName(const QString &name) { + d->myName = name; + myself()->setNickName(name); +} + +void SkypeAccount::setWaitBeforeConnect(int value) { + d->waitBeforeConnect = value; + d->skype.setWaitConnect(value); +} + +int SkypeAccount::getWaitBeforeConnect() const { + return d->waitBeforeConnect; +} + +SkypeContact *SkypeAccount::getContact(const QString &userId) { + SkypeContact *cont = static_cast (contacts().find(userId));//get the contact + if (!cont) {//We do not know such contact + addContact(userId, QString::null, 0L, Temporary);//create a temporary contact + + cont = static_cast (contacts().find(userId));//It should be there now + } + return cont; +} + +void SkypeAccount::prepareChatSession(SkypeChatSession *session) { + QObject::connect(session, SIGNAL(updateChatId(const QString&, const QString&, SkypeChatSession* )), this, SLOT(setChatId(const QString&, const QString&, SkypeChatSession* ))); + QObject::connect(session, SIGNAL(wantTopic(const QString& )), &d->skype, SLOT(getTopic(const QString& ))); + QObject::connect(&d->skype, SIGNAL(joinUser(const QString&, const QString& )), session, SLOT(joinUser(const QString&, const QString& ))); + QObject::connect(&d->skype, SIGNAL(leftUser(const QString&, const QString&, const QString& )), session, SLOT(leftUser(const QString&, const QString&, const QString& ))); + QObject::connect(&d->skype, SIGNAL(setTopic(const QString&, const QString& )), session, SLOT(setTopic(const QString&, const QString& ))); + QObject::connect(session, SIGNAL(inviteUserToChat(const QString&, const QString& )), &d->skype, SLOT(inviteUser(const QString&, const QString& ))); + QObject::connect(session, SIGNAL(leaveChat(const QString& )), &d->skype, SLOT(leaveChat(const QString& ))); +} + +void SkypeAccount::setChatId(const QString &oldId, const QString &newId, SkypeChatSession *sender) { + d->sessions.remove(oldId);//remove the old one + if (!newId.isEmpty()) { + d->sessions.insert(newId, sender); + } +} + +bool SkypeAccount::chatExists(const QString &chat) { + return d->sessions.find(chat); +} + +void SkypeAccount::receiveMultiIm(const QString &chatId, const QString &body, const QString &messageId, const QString &user) { + SkypeChatSession *session = d->sessions.find(chatId); + + if (!session) { + QStringList users = d->skype.getChatUsers(chatId); + SIM::ContactPtrList list; + for (QStringList::iterator it = users.begin(); it != users.end(); ++it) { + list.append(getContact(*it)); + } + + session = new SkypeChatSession(this, chatId, list); + } + + SIM::Message mes(getContact(user), myself(), body, SIM::Message::Inbound); + session->appendMessage(mes); +} + +QString SkypeAccount::getMessageChat(const QString &messageId) { + return d->skype.getMessageChat(messageId); +} + +void SkypeAccount::registerLastSession(SkypeChatSession *lastSession) { + d->lastSession = lastSession; +} + +void SkypeAccount::gotMessageId(const QString &messageId) { + if ((d->lastSession) && (!messageId.isEmpty())) { + d->lastSession->setChatId(d->skype.getMessageChat(messageId)); + } + + d->lastSession = 0L; +} + +void SkypeAccount::sentMessage(const QString &body, const QString &chat) { + kdDebug(14311) << k_funcinfo << "chat: " << chat << endl;//some debug info + + SkypeChatSession *session = d->sessions.find(chat); + const QStringList &users = d->skype.getChatUsers(chat); + QPtrList *recv = 0L; + + if (!session) + if (d->hitch) { + recv = constructContactList(users); + if (recv->count() == 1) { + SkypeContact *cont = static_cast (recv->at(0)); + cont->startChat(); + session = cont->getChatSession(); + session->setChatId(chat); + } else { + session = new SkypeChatSession(this, chat, *recv); + } + } else { + return; + } + + if (!recv) + recv = constructContactList(users); + + session->sentMessage(recv, body); + delete recv; +} + +QPtrList *SkypeAccount::constructContactList(const QStringList &users) { + QPtrList *list= new QPtrList (); + for (QStringList::const_iterator it = users.begin(); it != users.end(); ++it) { + list->append(getContact(*it)); + } + + return list; +} + +void SkypeAccount::groupCall(const QString &callId, const QString &groupId) { + kdDebug(14311) << k_funcinfo << endl; + + //TODO: Find out a way to embet qdialog into another one after creation + return; + + if (!d->callControl) + return; + + SkypeConference *conf; + if (!(conf = d->conferences[groupId])) {//does it already exist? + conf = new SkypeConference(groupId);//no, create one then.. + d->conferences.insert(groupId, conf); + + QObject::connect(conf, SIGNAL(removeConference(const QString& )), this, SLOT(removeCallGroup(const QString& ))); + } + + conf->embedCall(d->calls[callId]); +} + +void SkypeAccount::removeCall(const QString &callId) { + kdDebug(14311) << k_funcinfo << endl; + d->calls.remove(callId); +} + +void SkypeAccount::removeCallGroup(const QString &groupId) { + kdDebug(14311) << k_funcinfo << endl; + d->conferences.remove(groupId); +} + +QString SkypeAccount::createChat(const QString &users) { + return d->skype.createChat(users); +} + +bool SkypeAccount::leaveOnExit() const { + return d->leaveOnExit; +} + +void SkypeAccount::setLeaveOnExit(bool value) { + d->leaveOnExit = value; +} + +void SkypeAccount::chatUser(const QString &userId) { + SkypeContact *contact = getContact(userId); + + contact->execute(); +} + +void SkypeAccount::setStartCallCommand(const QString &value) { + d->startCallCommand = value; +} + +void SkypeAccount::setEndCallCommand(const QString &value) { + d->endCallCommand = value; +} + +void SkypeAccount::setWaitForStartCallCommand(bool value) { + d->waitForStartCallCommand = value; +} +void SkypeAccount::setEndCallCommandOnlyForLast(bool value) { + d->endCallCommandOnlyLats = value; +} + +QString SkypeAccount::startCallCommand() const { + return d->startCallCommand; +} + +QString SkypeAccount::endCallCommand() const { + return d->endCallCommand; +} + +bool SkypeAccount::waitForStartCallCommand() const { + return d->waitForStartCallCommand; +} + +bool SkypeAccount::endCallCommandOnlyLast() const { + return d->endCallCommandOnlyLats; +} + +void SkypeAccount::startCall() { + kdDebug(14311) << k_funcinfo << endl; + + KProcess *proc = new KProcess(); + QObject::connect(proc, SIGNAL(processExited(KProcess* )), proc, SLOT(deleteLater())); + QStringList args = QStringList::split(' ', d->startCallCommand); + (*proc) << args;//set what will be executed + KProcess::RunMode mode = d->waitForStartCallCommand ? KProcess::Block : KProcess::NotifyOnExit; + proc->start(mode); + ++d->callCount; +} + +void SkypeAccount::endCall() { + kdDebug(14311) << k_funcinfo << endl; + + if ((--d->callCount == 0) || (!d->endCallCommandOnlyLats)) { + KProcess *proc = new KProcess(); + QObject::connect(proc, SIGNAL(processExited(KProcess* )), proc, SLOT(deleteLater())); + (*proc) << QStringList::split(' ', d->endCallCommand); + proc->start(); + } + if (d->callCount < 0) + d->callCount = 0; +} + +void SkypeAccount::setIncomingCommand(const QString &command) { + d->incommingCommand = command; +} + +QString SkypeAccount::incomingCommand() const { + return d->incommingCommand; +} + +void SkypeAccount::registerContact(const QString &contactId) { + kdDebug(14311) << k_funcinfo << endl; + d -> skype.addContact(contactId); +} + +void SkypeAccount::removeContact(const QString &contactId) { + d -> skype.removeContact(contactId); +} + +bool SkypeAccount::ableMultiCall() { + return (d->skype.ableConference()); +} + +bool SkypeAccount::canAlterAuth() { + return (d->skype.canComunicate()); +} + +void SkypeAccount::authorizeUser(const QString &userId) { + d->skype.setAuthor(userId, Skype::Author); +} + +void SkypeAccount::disAuthorUser(const QString &userId) { + d->skype.setAuthor(userId, Skype::Deny); +} + +void SkypeAccount::blockUser(const QString &userId) { + d->skype.setAuthor(userId, Skype::Block); +} + +int SkypeAccount::getAuthor(const QString &contactId) { + switch (d->skype.getAuthor(contactId)) { + case Skype::Author: + return 0; + case Skype::Deny: + return 1; + case Skype::Block: + return 2; + } +} + +#include "skypeaccount.moc" diff --git a/plugins/skype/skypeaccount.h b/plugins/skype/skypeaccount.h new file mode 100644 index 0000000..8d836f6 --- /dev/null +++ b/plugins/skype/skypeaccount.h @@ -0,0 +1,509 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef SKYPEACCOUNT_H +#define SKYPEACCOUNT_H + +#include + +class SkypeProtocol; +class QString; +class SkypeAccountPrivate; +class SkypeContact; +class SkypeChatSession; +template class QPtrList; + +namespace SIM { + class MetaContact; + class OnlineStatus; + class Message; + class Kontact; +} + +#define DBUS_SESSION 0 +#define DBUS_SYSTEM 1 + +/** + * @author Michal Vaner + * @short Skype account + * Account to use external skype program. At this time, it only supports one skype account at one, may be more in future. + */ +class SkypeAccount : public SIM::Account +{ +Q_OBJECT + private: + ///Some internal things + SkypeAccountPrivate *d; + ///Constructs list of users from their ID list. Have to be deleted later! + QPtrList *constructContactList(const QStringList &users); + private slots: + /** + * This sets the right icon for the status - online + */ + void wentOnline(); + /** + * This changes the account icon to offline + */ + void wentOffline(); + /** + * This changes the account icon to away + */ + void wentAway(); + /** + * This changes the account icon to not available + */ + void wentNotAvailable(); + /** + * This changes the account icon to Do not disturb + */ + void wentDND(); + /** + * This changes the status icon of account to Invisible + */ + void wentInvisible(); + /** + * This changes the status indicator to Skype me + */ + void wentSkypeMe(); + /** + * The status changed to actually connecting + */ + void statusConnecting(); + /** + * This adds user to the contact list if it is not there + * @param name The skype name of the contact + */ + void newUser(const QString &name); + /** + * This is used for receiving messages from skype network + * @param user The user that sent it + * @param message The text of the message + * @param messageId Id of that message + */ + void receivedIm(const QString &user, const QString &message, const QString &messageId); + /** + * New cal to show (or not, depending on setup) the call control window. + * @param callId ID of the new call + * @param userId User that is on the other end. If conference, list of IDs divided by spaces. + */ + void newCall(const QString &callId, const QString &userId); + /** + * This one sets name of myself + * @param name What the new name is. + */ + void setMyselfName(const QString &name); + /** + * This one keeps track of chat sessions that know their chat id + * @param oldId The old chat ID, or empty if no chat ID was known before + * @param newId The new chat ID, or empty if the chat just exists + * @param sender Pointer to the session + */ + void setChatId(const QString &oldId, const QString &newId, SkypeChatSession *sender); + /** + * Some message is meing sent out by Skype, it should be showed + * @param body Text of the message + * @param chat Id of the chat it was sent to + */ + void sentMessage(const QString &body, const QString &chat); + /** + * An Id of some message is known, use it + * @param messageId New id of that message + */ + void gotMessageId(const QString &messageId); + /** + * This is used to group conference call participants together + * @param callId What call to add to the group + * @param groupIt to what group to add it + */ + void groupCall(const QString &callId, const QString &groupId); + /** + * Remove that call from list + * @param callId what call + */ + void removeCall(const QString &callId); + /** + * Remove reference to a call group + * @param groupId What group to remove + */ + void removeCallGroup(const QString &groupId); + protected: + /** + * Creates new skype contact and adds it into the parentContact. + * @param contactID ID of the contact (the skype name) + * @param parentContact Metacontact to add it into. + * @return True if it worked, false otherwise. + */ + virtual bool createContact(const QString &contactID, SIM::MetaContact *parentContact); + public: + /** + * Constructor. + * @param protocol The skype protocol pointer. + */ + SkypeAccount(SkypeProtocol *protocol); + /** + * Destructor + */ + ~SkypeAccount(); + /** + * Finds contact of given id + * @param id id of the wanted contact + * @return eather pointer to that contact or 0L of it was not found. + */ + SkypeContact *contact(const QString &id); + /** + * How to launch the Skype + */ + int launchType; + /** + * Is this verson of protocol able to create call conferences? + */ + bool ableMultiCall(); + /** + * Is it possible to alter the authorization now? + */ + bool canAlterAuth(); + /** + * How shoul SIM authorize it self? (empty means as SIM) + */ + QString author; + /** + * This saves properties to the config file + */ + void save(); + /** + * Prepares this contact for life and integrates it into this account. Should be called only by the contact in its constructor. + * @param conntact The contact to prepare + */ + void prepareContact(SkypeContact *contact); + ///Can we comunicate with the skype? (not with the network, just with the program) + bool canComunicate(); + ///returns the protocol + SkypeProtocol * protocol(); + /** + * @return Is the HitchHike mode enabled or not? + * @see setHitchHike + */ + bool getHitchHike() const; + /** + * @return Is the MarkRead mode enabled or not? + * @see setMarkRead + */ + bool getMarkRead() const; + /** + * Is the scan for unread message on login enabled? + * @return Is it enabled or not? + * @see setSearchForUnread + */ + bool getScanForUnread() const; + /** + * @return true if this user already has opened chat session, false if he doesn't have opened chat session or the user do not exist + * @param userId ID of the user in interest + */ + bool userHasChat(const QString &userId); + /** + * @return Should a control window be showed for calls? + */ + bool getCallControl() const; + /** + * Is that call incoming or not? + * @param callId What call you want to know? + * @return true if the call is incoming call (someone calls you), false otherwise (outgoing, not a call at all..) + */ + bool isCallIncoming(const QString &callId); + /** + * @return The time after the call finished to auto-closing the window. If auto-closing is disabled, 0 is returned + * @see setCallWindowTimeout + */ + int closeCallWindowTimeout() const; + /** + * @return Returns name that shouls be showed by a call window + */ + QString getUserLabel(const QString &userId); + /** + * Are pings to Skype enabled? + * @return You guess.. + */ + bool getPings() const; + /** + * What bus is set to use now? + * @return 0 as session bus, 1 as system wide + */ + int getBus() const; + /** + * Is starting Dbus when it is not running enabled? + * @return You guess.. + */ + bool getStartDBus() const; + /** + * How long does it try to connect to newly started skype, until it gives up (seconds) + */ + int getLaunchTimeout() const; + /** + * What is the command that launches skype? + */ + const QString &getSkypeCommand() const; + /** + * Do we wait before connecting? + */ + int getWaitBeforeConnect() const; + /** + * Do we have that chat opened? + * @param chatId What chat are you interested in? + */ + bool chatExists(const QString &chatId); + /** + * This one returns contact of that name. If that contact does not exist in the contact list, a temporary one is created + * @param userId ID of that user + */ + SkypeContact *getContact(const QString &userId); + /** + * @param messageId ID of a message + * @return ID of chat the message belongs to. If no such message exists, the result is not defined. + */ + QString getMessageChat(const QString &messageId); + /** + * This will mark last active chat (last that sent out some message). It will be set an ID soon after that, user will not have time to write another message anyway + * @param session Pointer to that chat session + */ + void registerLastSession(SkypeChatSession *session); + /** + * Create a chat with given members + * @param users Comma sepparated list of members + * @return ID of the chat + */ + QString createChat(const QString &users); + /** + * Should chat leave when it's window is closed? + */ + bool leaveOnExit() const; + /** + * Returns the call that should be executed before making a call. + * @return The command or empty string if nothing should be executed + */ + QString startCallCommand() const; + /** + * Should we wait for the startCallCommand to finish before making the call. + */ + bool waitForStartCallCommand() const; + /** + * The command that should be executed after the call is finished. + * @return The command or empty string if user does not want to execute anything. + */ + QString endCallCommand() const; + /** + * Should be tha command executed only for the last call? + */ + bool endCallCommandOnlyLast() const; + /** + * Command that should be executed on incoming call, or empty string if nothing to execute + */ + QString incomingCommand() const; + /** + * Registers this contact to the skype contact list + * @param contactId What user should be added? + */ + void registerContact(const QString &contactId); + /** + * returns how is user authorized + * @return 0 if he is authorized, 1 if not and 2 if he is blocked + */ + int getAuthor(const QString &contactId); + public slots: + /** + * Disconnects from server. + */ + virtual void disconnect(); + /** + * Sets online status to away/online. + * @param away If true, it sets to away, otherwise it sets to online. + * @param reason Message to set. Ignored with skype as it does not support away messages. (Or I don't know about it)) + */ + virtual void setAway(bool away, const QString &reason); + /** + * Sets online status for the account. + * @param status Status to set. + * @param reason Away message. Ignored by skype. + */ + virtual void setOnlineStatus(const SIM::OnlineStatus &status, const QString &reason); + /** + * Connect to the skype with given status + * @param status The status to connect with. If it is something unusual (like offline or something unknown), online is used + */ + virtual void connect(const SIM::OnlineStatus &status); + /** + * This notifies contact of some change of its information + * @param contact What contact is it? + * @param change And what happende. + */ + void updateContactInfo(const QString &contact, const QString &change); + /** + * This will send message by the skype connection. Will take care of all notifications when it is done and so. (means it will emit messageSent when it is sent) + * @param message What to send. + * @param chat Chat to send it to. If it is empty, it is sent just to that person listed in the message + */ + void sendMessage(SIM::Message &message, const QString &chat); + /** + * Enables or disables the HitchHike mode of getting messages. If it is enabled, a new message to unstarted chat will be showed. If not, they will be ignored and you will have to open them in Skype + * @param value True enables HitchHike mode, false disables. + * @see getHitchHike + */ + void setHitchHike(bool value); + /** + * Enables reading messages by SIM. If it is on, all messages showed in SIM will be marked as read, if disable, you will have to read them in Skype/something else. + * If HitchHike mode is disabled, messages that creates chats are NOT marked as read, because they are not showed. + * @param value Enable or disable the mode + * @see getMarkRead + * @see getHitchHake + * @see setHitchHike + */ + void setMarkRead(bool value); + /** + * Set if there should be scan for unread messages when SIM connects to Skype. + * @param value Enable or disable the scan. + * @see getScanForUnread + */ + void setScanForUnread(bool value); + /** + * Make a call to that user + * @param user To who we call. + */ + void makeCall(SkypeContact *user); + /** + * Make conference call to more than one user (possibly) + * @param users comma separated list of user IDs + */ + void makeCall(const QString &users); + /** + * Set if a control window will be showed for calls. + * @param value Is it enabled or disabled now? + */ + void setCallControl(bool value); + /** + * Sets timeout in seconds how long will be call window visible after the call finished. If you want to disable it, set to 0. + */ + void setCloseWindowTimeout(int timeout); + /** + * Turns pinging skype on/off + * If it is on, every second a ping message is sent to skype so track of if Skype is running is still hold. f it is off, skype can be turned off and you won't know it. + * @param enabled Are they on or off from now? + */ + void setPings(bool enabled); + /** + * Sets bus on which Skype listens + * @param bus 0 -> session bus, 1 -> system wide bus + */ + void setBus(int bus); + /** + * Should be DBus started when needed? + */ + void setStartDBus(bool enabled); + /** + * Set the timeout for giving up launching Skype + */ + void setLaunchTimeout(int seconds); + /** + * Set command by what the Skype will be started + */ + void setSkypeCommand(const QString &command); + /** + * Set if we wait a while before connecting to just started skype + */ + void setWaitBeforeConnect(int value); + /** + * This should be called with all new chat sessions to connect all signals to them + * @param session The chat session + */ + void prepareChatSession(SkypeChatSession *session); + /** + * This receives a multi-user chat message and delivers it to the chat session + * @param chatId What chat should get it + * @param boty Text of that message + * @param messageId ID of the received message + * @param user The one who sent it + */ + void receiveMultiIm(const QString &chatId, const QString &body, const QString &messageId, const QString &user); + /** + * Set if chat window should close a chat window when you close it + */ + void setLeaveOnExit(bool value); + /** + * Open chat to the user + * @param userId + */ + void chatUser(const QString &userId); + /** + * Sets the command to be executed before making/accepting call (or empty if nothing) + */ + void setStartCallCommand(const QString &value); + /** + * Set the command that will be executed when a call is finished + */ + void setEndCallCommand(const QString &value); + /** + * Do we wait for the command to be executed before making the call? + */ + void setWaitForStartCallCommand(bool value); + /** + * Should be the end command executed only for the last closed call or for every call that is closed? + */ + void setEndCallCommandOnlyForLast(bool value); + /** + * Notify me when a call has begun and I should run the start call command + */ + void startCall(); + /** + * Notify me when the call ends to run the end call command + */ + void endCall(); + /** + * Sets a command to be executed for incoming call + */ + void setIncomingCommand(const QString &command); + /** + * Removes a given contact from skype + */ + void removeContact(const QString &contactId); + /** + * authorizes a user + * @param userId what user + */ + void authorizeUser(const QString &userId); + /** + * removes authorization from user + * @param userId what user + */ + void disAuthorUser(const QString &userId); + /** + * Blocks a user (no more messages will be accepted) + * @param userId what user + */ + void blockUser(const QString &userId); + signals: + /** + * This is emited when the message has been sent by skype + * @param messageId Id of the message that has been sent + */ + void sentMessage(const QString &messageId); + /** + * This slot notifies of connecting/disconnecting. Needed to be sure, if alling is possible. + * @param online Are we online now? + */ + void connectionStatus(bool online); +}; + +#endif diff --git a/plugins/skype/skypeaddcontact.cpp b/plugins/skype/skypeaddcontact.cpp new file mode 100644 index 0000000..b322a10 --- /dev/null +++ b/plugins/skype/skypeaddcontact.cpp @@ -0,0 +1,93 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#include "skypeaddcontact.h" +#include "skypeprotocol.h" +#include +#include "skypeaccount.h" + +#include +#include +#include +#include +#include + +class SkypeAddContactWidget : public SkypeAddContactBase { + private: + public: + SkypeAddContactWidget(QWidget *parent, const char *name = 0L) : SkypeAddContactBase(parent, name) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + } +}; + +class SkypeAddContactPrivate { + public: + SkypeProtocol *protocol; + SkypeAddContactWidget *widget; + SkypeAccount *account; +}; + +SkypeAddContact::SkypeAddContact(SkypeProtocol *protocol, QWidget *parent, SkypeAccount *account, const char *name) : AddContactPage(parent, name) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d = new SkypeAddContactPrivate();//create the d ponter + d->protocol = protocol;//remember the protocol + d->account = account; + + (new QVBoxLayout(this))->setAutoAdd(true);//create the layout and add there automatically + d->widget = new SkypeAddContactWidget(this);//create the insides +} + + +SkypeAddContact::~SkypeAddContact() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + //free everything (the widget is deleted automatically) + delete d; +} + +bool SkypeAddContact::validateData() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (!d->account->canComunicate()) { + KMessageBox::sorry(d->widget, i18n("You must connect to Skype first"), i18n("Not Connected")); + return false; + } + + if (d->widget->NameEdit->text().isEmpty()) {//He wrote nothing + KMessageBox::sorry(d->widget, i18n("You must write the contact's name"), i18n("Wrong Information"));//Tell the user I don't like this at all + return false;//and don't allow to continue + } + + if (d->account->contact(d->widget->NameEdit->text())) {//this contact already exists in this account + KMessageBox::sorry(d->widget, i18n("This contact already exists in this account"), i18n("Wrong Information"));//Tell the user + return false;//do not proceed + } + + return true; +} + +bool SkypeAddContact::apply(SIM::Account *, SIM::MetaContact *metaContact) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->account->registerContact(d->widget->NameEdit->text()); + d->account->addContact(d->widget->NameEdit->text(), metaContact, SIM::Account::ChangeKABC); + return true;//all OK +} + +#include "skypeaddcontact.moc" diff --git a/plugins/skype/skypeaddcontact.h b/plugins/skype/skypeaddcontact.h new file mode 100644 index 0000000..dc0e808 --- /dev/null +++ b/plugins/skype/skypeaddcontact.h @@ -0,0 +1,66 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef SKYPEADDCONTACT_H +#define SKYPEADDCONTACT_H + +#include + +class SkypeAddContactPrivate; +class QString; +class SkypeProtocol; +class SkypeAccount; + +/** + * @author Michal Vaner (vorner) + * Just a widget with a line and label ;-) + */ +class SkypeAddContact : public AddContactPage +{ + Q_OBJECT + private: + ///internal things + SkypeAddContactPrivate *d; + public: + /** + * Constructor. + * @param protocol Pointer to the Skype protocol. + * @param parent Widget inside which I will be showed. + * @param name My name I can be found by. + */ + SkypeAddContact(SkypeProtocol *protocol, QWidget *parent, SkypeAccount *account, const char *name); + /** + * Destructor. + */ + ~SkypeAddContact(); + /** + * Check, weather user wrote something sane. + * @return True if it is useable, false otherwise. + */ + virtual bool validateData(); + public slots: + /** + * Adds it into the account.kdDebug(14311) << k_funcinfo << endl;//some debug info + * @param account Where to add it. + * @param metaContact Metacontact which will hold it. + * @return True if it worked, false if not. + */ + virtual bool apply(SIM::Account *account, SIM::MetaContact *metaContact); +}; + +#endif diff --git a/plugins/skype/skypeaddcontactbase.ui b/plugins/skype/skypeaddcontactbase.ui new file mode 100644 index 0000000..0d71b52 --- /dev/null +++ b/plugins/skype/skypeaddcontactbase.ui @@ -0,0 +1,144 @@ + +SkypeAddContactBase + + + SkypeAddContactBase + + + + 0 + 0 + 362 + 372 + + + + Add Skype Contact + + + + unnamed + + + + layout2 + + + + unnamed + + + + textLabel1 + + + Skype name: + + + + + NameEdit + + + + + + + groupBox1 + + + Search + + + + unnamed + + + + textLabel2 + + + Sorry, but the search function was not yet implemented. + + + WordBreak|AlignVCenter + + + + + layout3 + + + + unnamed + + + + spacer3 + + + Vertical + + + Expanding + + + + 20 + 0 + + + + + + SearchButton + + + false + + + Se&arch + + + + + spacer5 + + + Vertical + + + Expanding + + + + 20 + 0 + + + + + + + + + + spacer4 + + + Vertical + + + Expanding + + + + 20 + 61 + + + + + + + diff --git a/plugins/skype/skypecalldialog.cpp b/plugins/skype/skypecalldialog.cpp new file mode 100644 index 0000000..e6c30d0 --- /dev/null +++ b/plugins/skype/skypecalldialog.cpp @@ -0,0 +1,295 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. 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 "skypecalldialog.h" +#include "skypeaccount.h" + +typedef enum { + csNotRunning, + csOnHold, + csInProgress, + csShuttingDown +} callStatus; + +class SkypeCallDialogPrivate { + public: + ///The call is done by some account + SkypeAccount *account; + ///The other side + QString userId; + ///Id of the call + QString callId; + ///Was there some error? + bool error; + ///The timer for updating call info + QTimer *updater; + ///The status of the call + callStatus status; + ///The time the call is running or on hold (in halfes of seconds) + int totalTime; + ///The time the call is actually running (in halfes of seconds) + int callTime; + ///Did I reported the ed of call already? + bool callEnded; + ///Report that the call has ended, please + void endCall() { + if (!callEnded) { + callEnded = true; + account->endCall(); + } + }; +}; + +SkypeCallDialog::SkypeCallDialog(const QString &callId, const QString &userId, SkypeAccount *account) : SkypeCallDialogBase() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + //Initialize values + d = new SkypeCallDialogPrivate(); + d->account = account; + d->callId = callId; + d->userId = userId; + d->error = false; + d->status = csNotRunning; + d->totalTime = 0; + d->callTime = 0; + d->callEnded = false; + + d->updater = new QTimer(); + connect(d->updater, SIGNAL(timeout()), this, SLOT(updateCallInfo())); + d->updater->start(500); + + NameLabel->setText(account->getUserLabel(userId)); + + //Show the window + show(); + KWin::activateWindow(winId()); +} + + +SkypeCallDialog::~SkypeCallDialog(){ + kdDebug(14311) << k_funcinfo << endl;//some debug info + + emit callFinished(d->callId); + d->endCall(); + + delete d->updater; + delete d; +} + +void SkypeCallDialog::updateStatus(const QString &callId, const QString &status) { + kdDebug(14311) << k_funcinfo << "Status: " << status << endl;//some debug info + + if (callId == d->callId) { + if (status == "CANCELLED") { + HoldButton->setEnabled(false); + HangButton->setEnabled(false); + AcceptButton->setEnabled(false); + StatusLabel->setText(i18n("Canceled")); + closeLater(); + d->status = csNotRunning; + } else if (status == "BUSY") { + HoldButton->setEnabled(false); + HangButton->setEnabled(false); + AcceptButton->setEnabled(false); + StatusLabel->setText(i18n("Other person is busy")); + closeLater(); + d->status = csNotRunning; + } else if (status == "REFUSED") { + HoldButton->setEnabled(false); + HangButton->setEnabled(false); + AcceptButton->setEnabled(false); + StatusLabel->setText(i18n("Refused")); + closeLater(); + d->status = csNotRunning; + } else if (status == "MISSED") { + HoldButton->setEnabled(false); + HangButton->setEnabled(false); + AcceptButton->setEnabled(true); + AcceptButton->setText(i18n("Call Back")); + StatusLabel->setText(i18n("Missed")); + d->status = csNotRunning; + disconnect(AcceptButton, SIGNAL(clicked()), this, SLOT(acceptCall())); + connect(AcceptButton, SIGNAL(clicked()), this, SLOT(callBack())); + } else if (status == "FINISHED") { + HoldButton->setEnabled(false); + HangButton->setEnabled(false); + AcceptButton->setEnabled(false); + StatusLabel->setText(i18n("Finished")); + closeLater(); + d->status = csNotRunning; + } else if (status == "LOCALHOLD") { + HoldButton->setEnabled(true); + HoldButton->setText(i18n("Resume")); + HangButton->setEnabled(true); + AcceptButton->setEnabled(false); + StatusLabel->setText(i18n("On hold (local)")); + d->status = csOnHold; + } else if (status == "REMOTEHOLD") { + HoldButton->setEnabled(false); + HangButton->setEnabled(true); + AcceptButton->setEnabled(false); + StatusLabel->setText(i18n("On hold (remote)")); + d->status = csOnHold; + } else if (status == "ONHOLD") { + HoldButton->setEnabled(true); + HangButton->setEnabled(true); + AcceptButton->setEnabled(false); + StatusLabel->setText(i18n("On hold")); + d->status = csOnHold; + } else if (status == "INPROGRESS") { + HoldButton->setEnabled(true); + HoldButton->setText(i18n("Hold")); + HangButton->setEnabled(true); + AcceptButton->setEnabled(false); + StatusLabel->setText(i18n("In progress")); + d->status=csInProgress; + } else if (status == "RINGING") { + HoldButton->setEnabled(false); + AcceptButton->setEnabled(d->account->isCallIncoming(callId)); + HangButton->setEnabled(true); + StatusLabel->setText(i18n("Ringing")); + d->status = csNotRunning; + } else if (status == "FAILED") { + if (d->error) //This one is already handled + return; + HoldButton->setEnabled(false); + AcceptButton->setEnabled(false); + HangButton->setEnabled(false); + StatusLabel->setText(i18n("Failed")); + d->status = csNotRunning; + } else if (status == "ROUTING") { + HoldButton->setEnabled(false); + AcceptButton->setEnabled(false); + HangButton->setEnabled(true); + StatusLabel->setText(i18n("Connecting")); + d->status = csNotRunning; + } else if (status == "EARLYMEDIA") { + HoldButton->setEnabled(false); + AcceptButton->setEnabled(false); + HangButton->setEnabled(true); + StatusLabel->setText(i18n("Early media (waitong for operator..)")); + d->status = csNotRunning; + } else if (status == "UNPLACED") {//Ups, whats that, how that call got here? + deleteLater();//Just give up, this one is odd + } + } +} + +void SkypeCallDialog::acceptCall() { + d->account->startCall(); + emit acceptTheCall(d->callId); +} + +void SkypeCallDialog::hangUp() { + emit hangTheCall(d->callId); +} + +void SkypeCallDialog::holdCall() { + emit toggleHoldCall(d->callId); +} + +void SkypeCallDialog::closeEvent(QCloseEvent *) { + emit hangTheCall(d->callId);//Finish the call before you give up + deleteLater();//some kind of suicide +} + +void SkypeCallDialog::deathTimeout() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + deleteLater();//OK, the death is here :-) +} + +void SkypeCallDialog::closeLater() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->endCall(); + + if ((d->account->closeCallWindowTimeout()) && (d->status != csShuttingDown)) { + QTimer::singleShot(1000 * d->account->closeCallWindowTimeout(), this, SLOT(deathTimeout())); + d->status = csShuttingDown; + } +} + +void SkypeCallDialog::updateError(const QString &callId, const QString &message) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + if (callId == d->callId) { + AcceptButton->setEnabled(false); + HangButton->setEnabled(false); + HoldButton->setEnabled(false); + StatusLabel->setText(i18n("Failed (%1)").arg(message)); + closeLater(); + d->error = true; + } +} + +void SkypeCallDialog::updateCallInfo() { + switch (d->status) { + case csInProgress: + if (d->callTime % 20 == 0) + emit updateSkypeOut();//update the skype out + ++d->callTime; + //Do not break, do that as well + case csOnHold: + ++d->totalTime; + default: + ;//Get rid of that stupid warning about not handled value in switch + } + const QString &activeTime = KGlobal::locale()->formatTime(QTime().addSecs(d->callTime / 2), true, true); + const QString &totalTime = KGlobal::locale()->formatTime(QTime().addSecs(d->totalTime / 2), true, true); + TimeLabel->setText(i18n("%1 active\n%2 total").arg(activeTime).arg(totalTime)); +} + +void SkypeCallDialog::skypeOutInfo(int balance, const QString ¤cy) { + float part;//How to change the balance before showing (multiply by this) + QString symbol;//The symbol of the currency is + int digits; + if (currency == "EUR") { + part = 0.01;//It's in cent's not in euros + symbol = i18n("€"); + digits = 2; + } else { + CreditLabel->setText(i18n("Skypeout inactive")); + return; + } + float value = balance * part; + CreditLabel->setText(KGlobal::locale()->formatMoney(value, symbol, digits)); +} + +void SkypeCallDialog::chatUser() { + d->account->chatUser(d->userId); +} + +void SkypeCallDialog::callBack() { + deleteLater();//close this window + + d->account->makeCall(d->userId); +} + + +#include "skypecalldialog.moc" diff --git a/plugins/skype/skypecalldialog.h b/plugins/skype/skypecalldialog.h new file mode 100644 index 0000000..9b0405b --- /dev/null +++ b/plugins/skype/skypecalldialog.h @@ -0,0 +1,103 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef SKYPECALLDIALOG_H +#define SKYPECALLDIALOG_H + +#include + +class SkypeAccount; +class SkypeCallDialogPrivate; + +/** + * This class is a window that can control a call (show information about it, hang up, hold, ...) + * @author Michal Vaner (Vorner) + */ +class SkypeCallDialog : public SkypeCallDialogBase +{ + Q_OBJECT + private: + SkypeCallDialogPrivate *d; + ///Start timeout to close + void closeLater(); + private slots: + ///Close it after timeout after finishing the call + void deathTimeout(); + ///Update the call info now + void updateCallInfo(); + ///Call the user back + void callBack(); + protected slots: + ///The accept button was clicked, accept the call + virtual void acceptCall(); + ///Hold or release the call + virtual void holdCall(); + ///Hang up the call + virtual void hangUp(); + ///Start chat to the user + virtual void chatUser(); + protected: + ///I want to know when I'm closed + virtual void closeEvent(QCloseEvent *e); + public: + /** + * Constructor + */ + SkypeCallDialog(const QString &callId, const QString &userId, SkypeAccount *account); + ///Destructor + ~SkypeCallDialog(); + public slots: + ///Update the status of call and disable/enable the right buttons and show it in the labels + void updateStatus(const QString &callId, const QString &status); + ///Updates an error message when some error occurred + void updateError(const QString &callId, const QString &status); + /** + * Incoming skype-out balance info + * @param balance How much of that ddoes user have + * @param currency What currency is it (actually only euro-cents are used) + */ + void skypeOutInfo(int balance, const QString ¤cy); + signals: + /** + * accept an incoming call + * @param callId What call is it + */ + void acceptTheCall(const QString &callId); + /** + * Hang up this call for me, please + * @param callId What call are we talking about + */ + void hangTheCall(const QString &callId); + /** + * Hold or resume a call (depending on its actual status + * @param callId What call are we tlking about + */ + void toggleHoldCall(const QString &callId); + /** + * Tell me the skype out balance, please + */ + void updateSkypeOut(); + /** + * This is emited when a call dialog is closed and is going to be deleted + * @param callId Id of it's call + */ + void callFinished(const QString &callId); +}; + +#endif diff --git a/plugins/skype/skypecalldialogbase.ui b/plugins/skype/skypecalldialogbase.ui new file mode 100644 index 0000000..1fb4932 --- /dev/null +++ b/plugins/skype/skypecalldialogbase.ui @@ -0,0 +1,300 @@ + +SkypeCallDialogBase + + + SkypeCallDialogBase + + + + 0 + 0 + 430 + 235 + + + + Skype Call + + + false + + + + unnamed + + + + layout3 + + + + unnamed + + + + NameLabel + + + + + + WordBreak|AlignVCenter + + + Partners name + + + Name of the other person of call (or list of names if the call is conference). + + + + + textLabel1 + + + Name: + + + AlignVCenter|AlignRight + + + Partners + + + Name + + + + + textLabel2 + + + Time: + + + AlignVCenter|AlignRight + + + Time elapsed + + + together. + + + + + CreditLabel + + + + + + WordBreak|AlignVCenter + + + Skype-out credits left + + + Skype-ou credits left + + + + + TimeLabel + + + + + + WordBreak|AlignVCenter + + + Time elapsed + + + Total time elapsed by the call/<br />time elapsed by the call and on hold together. + + + + + StatusLabel + + + + + + WordBreak|AlignVCenter + + + + + textLabel1_2 + + + Status: + + + AlignVCenter|AlignRight + + + + + textLabel3 + + + Skype-out credits: + + + AlignVCenter|AlignRight + + + Skype-out credits left + + + Skype-ou credits left + + + + + + + layout9 + + + + unnamed + + + + spacer3 + + + Horizontal + + + Expanding + + + + 48 + 20 + + + + + + AcceptButton + + + Accept + + + + + + Accept call + + + Accept incoming call + + + + + HangButton + + + H&ang up + + + Finish the call + + + Terminate the call + + + + + HoldButton + + + H&old + + + Hold the call + + + Interrupt the call for a moment and resume (or hang up) it later + + + + + pushButton4 + + + Chat + + + + + + Open chat to the person + + + Open chat to the person you are talking with + + + + + spacer2 + + + Horizontal + + + Expanding + + + + 49 + 20 + + + + + + + + + + AcceptButton + clicked() + SkypeCallDialogBase + acceptCall() + + + HangButton + clicked() + SkypeCallDialogBase + hangUp() + + + HoldButton + clicked() + SkypeCallDialogBase + holdCall() + + + pushButton4 + clicked() + SkypeCallDialogBase + chatUser() + + + + acceptCall() + holdCall() + hangUp() + chatUser() + + + diff --git a/plugins/skype/skypechatsession.cpp b/plugins/skype/skypechatsession.cpp new file mode 100644 index 0000000..21b6681 --- /dev/null +++ b/plugins/skype/skypechatsession.cpp @@ -0,0 +1,222 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include "skypechatsession.h" +#include "skypeaccount.h" +#include "skypeprotocol.h" +#include "skypecontact.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +static SIM::MetaContact *dummyContacts = new SIM::MetaContact(); + +class ChatDummyContact : public SIM::Contact { + public: + ChatDummyContact(SkypeAccount *account, const QString &name) : SIM::Contact(account, name, dummyContacts) {}; + virtual SIM::ChatSession *manager (CanCreateFlags canCreate) {return 0L;}; +}; + +class SkypeChatSessionPrivate { + private: + ///Dummy contact representing this chat + SIM::Contact *dummyContact; + public: + ///Referenco to the protocol + SkypeProtocol *protocol; + ///Reference to the account + SkypeAccount *account; + ///Am I connected to the messageSent signal? + bool connectedSent; + ///ID of this chat session + QString chatId; + /** + * Constructor + * @param _protocol Reference to the Skype protocol + * @param _account Reference to the account this chat belongs to + */ + SkypeChatSessionPrivate(SkypeProtocol *_protocol, SkypeAccount *_account) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + //save given values + account = _account; + protocol = _protocol; + + connectedSent = false; + chatId = ""; + dummyContact = 0L; + }; + ///Is it multi-user chat? + bool isMulti; + ///Please give me a contact that stands for the whole chat so I can send it to it + SIM::Contact *getDummyContact() { + if (dummyContact) + return dummyContact; + else { + return dummyContact = new ChatDummyContact(account, chatId); + } + }; + ///The action to call the user(s) + KAction *callAction; + ///The contact if any (and one) + SkypeContact *contact; +}; + +static SIM::ContactPtrList constructList(SkypeContact *contact) { + SIM::ContactPtrList list;//create the contact + list.append(contact);//add there the contact + + return list;//and return the list +} + +SkypeChatSession::SkypeChatSession(SkypeAccount *account, SkypeContact *contact) : + SIM::ChatSession(account->myself(), constructList(contact), account->protocol(), (char *)0L) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + setInstance(KGenericFactory::instance()); + + //create the D-pointer + d = new SkypeChatSessionPrivate(account->protocol(), account); + SIM::ChatSessionManager::self()->registerChatSession( this ); + connect(this, SIGNAL(messageSent(SIM::Message&, SIM::ChatSession*)), this, SLOT(message(SIM::Message& )));//this will send the messages from this user going out + account->prepareChatSession(this); + d->isMulti = false; + + d->callAction = new KAction(i18n("Call"), QString::fromLatin1("call"), 0, this, SLOT(callChatSession()), actionCollection(), "callSkypeContactFromChat"); + connect(contact, SIGNAL(setCallPossible(bool )), d->callAction, SLOT(setEnabled(bool ))); + connect(this, SIGNAL(becameMultiChat(const QString&, SkypeChatSession* )), this, SLOT(disallowCall())); + + d->contact = contact; + + setMayInvite(true);//It is possible to invite people to chat with Skype + setXMLFile("skypechatui.rc"); +} + +SkypeChatSession::SkypeChatSession(SkypeAccount *account, const QString &session, const SIM::ContactPtrList &users) : + SIM::ChatSession(account->myself(), users, account->protocol(), (char *) 0L) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + setInstance(KGenericFactory::instance()); + + d = new SkypeChatSessionPrivate(account->protocol(), account); + SIM::ChatSessionManager::self()->registerChatSession(this); + connect(this, SIGNAL(messageSent(SIM::Message&, SIM::ChatSession*)), this, SLOT(message(SIM::Message& ))); + account->prepareChatSession(this); + d->isMulti = true; + d->chatId = session; + emit updateChatId("", session, this); + + + d->callAction = new KAction(i18n("Call"), QString::fromLatin1("call"), 0, this, SLOT(callChatSession()), actionCollection(), "callSkypeContactFromChat"); + disallowCall();//TODO I hope it will not be needed in future + + setMayInvite(true);//It is possible to invite people to chat with Skype + setXMLFile("skypechatui.rc"); +} + +SkypeChatSession::~SkypeChatSession() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->account->leaveOnExit() && (d->isMulti)) + emit leaveChat(d->chatId); + emit updateChatId(d->chatId, "", this); + delete d;//remove the D pointer +} + +void SkypeChatSession::message(SIM::Message &message) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->account->registerLastSession(this); + d->account->sendMessage(message, (d->isMulti) ? (d->chatId) : "");//send it + messageSucceeded(); +} + +void SkypeChatSession::setTopic(const QString &chat, const QString &topic) { + ///TODO This function +} + +void SkypeChatSession::joinUser(const QString &chat, const QString &userId) { + kdDebug(14311) << k_funcinfo << "Chat: " << chat << endl;//some debug info + + if (chat == d->chatId) { + addContact(d->account->getContact(userId)); + d->isMulti = true; + emit becameMultiChat(d->chatId, this); + } +} + +void SkypeChatSession::leftUser(const QString &chat, const QString &userId, const QString &reason) { + kdDebug(14311) << "User: " << userId<< k_funcinfo << endl;//some debug info + + if (chat == d->chatId) { + removeContact(d->account->getContact(userId), reason, SIM::Message::PlainText); + } +} + +void SkypeChatSession::setChatId(const QString &chatId) { + kdDebug(14311) << k_funcinfo << "ID: " << chatId << endl;//some debug info + + if (d->chatId != chatId) { + emit updateChatId(d->chatId, chatId, this); + d->chatId = chatId; + emit wantTopic(chatId); + } +} + +void SkypeChatSession::sentMessage(const QPtrList *recv, const QString &body) { + SIM::Message *mes; + /*if (recv->count() == 1) { + mes = new SIM::Message(d->account->myself(), *recv->begin(), body, SIM::Message::Outbound); + } else { + mes = new SIM::Message(d->account->myself(), d->account->myself(), body, SIM::Message::Outbound); + }*/ + mes = new SIM::Message(d->account->myself(), *recv, body, SIM::Message::Outbound); + appendMessage(*mes); + delete mes; +} + +void SkypeChatSession::disallowCall() { + d->callAction->setEnabled(false); + + if (d->contact) { + disconnect(d->contact, SIGNAL(setCallPossible(bool )), d->callAction, SLOT(setEnabled(bool ))); + d->contact = 0L; + } +} + +void SkypeChatSession::callChatSession() { + if (d->contact)///@todo find a better way to do it later to allow multiple people to call + d->contact->call(); +} + +void SkypeChatSession::inviteContact(const QString &contactId) { + if (d->chatId.isEmpty()) { + d->chatId = d->account->createChat(d->contact->contactId()); + emit updateChatId("", d->chatId, this); + } + + emit inviteUserToChat(d->chatId, contactId); +} + +#include "skypechatsession.moc" diff --git a/plugins/skype/skypechatsession.h b/plugins/skype/skypechatsession.h new file mode 100644 index 0000000..b6b9fa8 --- /dev/null +++ b/plugins/skype/skypechatsession.h @@ -0,0 +1,133 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef SKYPECHATSESSION_H +#define SKYPECHATSESSION_H + +#include + +class SkypeProtocol; +class SkypeAccount; +class SkypeContact; +class SkypeChatSessionPrivate; + +/** + * The chat session for the Skype protocol + * @author Michal Vaner (VORNER) + */ +class SkypeChatSession : public SIM::ChatSession +{ + Q_OBJECT + private: + ///The insides of the chat session + SkypeChatSessionPrivate *d; + private slots: + ///sends message to the skype user who this chat belongs to + void message(SIM::Message&); + /**This disables permanently the call button when the chat becomes a multi-user chat + * @todo make this unneeded and allow multiple-user calls + */ + void disallowCall(); + ///Do a call to all participants of the chat (in future, now it allows only one at onece) + void callChatSession(); + public: + /** + * Constructor. The chat session will be created with first message coming out. + * @param account The account it belongs to + * @param other The other side. There it no way user could create chat with more than one user at once. If user is invited to chat by someone, the other constructor should be used. It is automatically registered in the manager. + */ + SkypeChatSession(SkypeAccount *account, SkypeContact *other); + /** + * Constructor from chat session. + * Use this one if user is invited to an existing chat or if the first message in that chat was incoming message. The list of users will be loaded at startup. It is automatically registered in the manager. + * @param account The account this belongs to. + * @param session Identificator of the chat session in skype. The list of users will be loaded in startup and therefore they are not needed to be specified. + */ + SkypeChatSession(SkypeAccount *account, const QString &session, const SIM::ContactPtrList &contacts); + ///Destructor + ~SkypeChatSession(); + /** + * Invites a contact to the chat + * @param contactId What contact + */ + virtual void inviteContact(const QString &contactId); + public slots: + /** + * Update the chat topic + * @param chat What chat is it about? Maybe me? + * @param topic What to set as topic + */ + void setTopic(const QString &chat, const QString &topic); + /** + * Set this chat's ID + * @param chatId The new ID + */ + void setChatId(const QString &chatId); + /** + * Add new user to chat + * @param chat To know if he joined this chat + * @param userId ID of that user + */ + void joinUser(const QString &chat, const QString &userId); + /** + * Some user left the chat + * @param chat Is it this chat? + * @param userId ID of that user + * @param reason Why he left + */ + void leftUser(const QString &chat, const QString &userId, const QString &reason); + /** + * This will add message that has been sent out by this user + * @param recv List of receivers. If there are more than one, replaced by an dummy contact of that chat, because it does crash SIM otherwise + * @param body Text to show + */ + void sentMessage(const QPtrList *recv, const QString &body); + signals: + /** + * This is emited when it become a multi-user chat. It should be removed from the contact so when user clicks on the contact, new one with only that one should be created + * @param chatSession Identificator of the chat + * @param previousUser Id of the other user before it became a multichat or empty string if no such user ever was + * @param sender Pointer to the chat session that emited this + */ + void becameMultiChat(const QString &chatSession, SkypeChatSession *sender); + /** + * This is emited when there is an request to get a frindly name of a chat + * @param chat Id of that chat + */ + void wantTopic(const QString &chat); + /** + * This chat's ID has changed + * @param oldId What was before? If it is the first set of the ID, it is empty + * @param newId The new ID. If it is empty, it means that this chat is being deleted right now and should be removed from all lists + * @param sender Pointer to that chat + */ + void updateChatId(const QString &oldId, const QString &newId, SkypeChatSession *sender); + /** + * Request inviting user to a chat + * @param chatId What chat + * @param userId What user + */ + void inviteUserToChat(const QString &chatId, const QString &userId); + /** + * Request leaving the chat + * @param chatId What chat + */ + void leaveChat(const QString &chatId); +}; + +#endif diff --git a/plugins/skype/skypeconference.cpp b/plugins/skype/skypeconference.cpp new file mode 100644 index 0000000..fd66e3f --- /dev/null +++ b/plugins/skype/skypeconference.cpp @@ -0,0 +1,76 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include "skypeconference.h" +#include "skypecalldialog.h" + +#include +#include +#include +#include +#include + +class SkypeConferencePrivate { + public: + //my id + QString id; + //The layout + QHBoxLayout *layout; +}; + +SkypeConference::SkypeConference(const QString &id) : QDialog() { + kdDebug(14311) << k_funcinfo << endl; + + //create the d pointer + d = new SkypeConferencePrivate(); + + //some UI + setCaption(i18n("Conference Call")); + d->layout = new QHBoxLayout(this); + + //remember all things + d->id = id; + + //show myself + show(); +} + +SkypeConference::~SkypeConference() { + kdDebug(14311) << k_funcinfo << endl; + + //free all memory + delete d->layout; + delete d; +} + +void SkypeConference::closeEvent(QCloseEvent *) { + emit removeConference(d->id); + + deleteLater(); +} + +void SkypeConference::embedCall(SkypeCallDialog *dialog) { + dialog->hide(); + insertChild(dialog); + d->layout->add(dialog); + + connect(this, SIGNAL(destroyed()), dialog, SLOT(hangUp())); +} + +#include "skypeconference.moc" diff --git a/plugins/skype/skypeconference.h b/plugins/skype/skypeconference.h new file mode 100644 index 0000000..e34af9f --- /dev/null +++ b/plugins/skype/skypeconference.h @@ -0,0 +1,64 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef SKYPECONFERENCE_H +#define SKYPECONFERENCE_H + +#include + +class SkypeConferencePrivate; +class SkypeCallDialog; + +class QString; + +/** + * @author Michal Vaner + * @short Dialog to group calls + * This dialog can group calls that belongs + */ +class SkypeConference : public QDialog +{ + Q_OBJECT + private: + ///Here are stored the private things, just for better readibility + SkypeConferencePrivate *d; + protected: + ///Make a suicide when closed + virtual void closeEvent(QCloseEvent *e); + public: + /** + * Constructor, also shows itself + * @param id My ID + */ + SkypeConference(const QString &id); + ///Destrucotr + ~SkypeConference(); + /** + * Add a call to this group + * @param dialog What to add there + */ + void embedCall(SkypeCallDialog *dialog); + signals: + /** + * The conference is being removed right now + * @param conferenceId what conference + */ + void removeConference(const QString &conferenceId); +}; + +#endif diff --git a/plugins/skype/skypecontact.cpp b/plugins/skype/skypecontact.cpp new file mode 100644 index 0000000..9140a3d --- /dev/null +++ b/plugins/skype/skypecontact.cpp @@ -0,0 +1,421 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#include "skypecontact.h" +#include "skypeaccount.h" +#include "skypeprotocol.h" +#include "skypechatsession.h" +#include "skypedetails.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef enum { + osOffline, + osOnline, + osAway, + osNA, + osDND, + osSkypeOut, + osSkypeMe +} onlineStatus; + +typedef enum { + bsNotInList, + bsNoAuth, + bsInList +} buddyStatus; + +class SkypeContactPrivate { + public: + ///Full name of the contact + QString fullName; + ///Acount that this contact belongs to + SkypeAccount *account; + ///Is it some user or is it something special (myself contact or such) + bool user; + ///Online status + onlineStatus status; + ///Buddy status + buddyStatus buddy; + ///The chat session + SkypeChatSession *session; + ///The action to call the user + KAction *callContactAction; + ///Authorization action + KAction *authorizeAction; + ///Remove authorization action + KAction *disAuthorAction; + ///Block user action + KAction *blockAction; + ///The private phone + QString privatePhone; + ///The private mobile phone + QString privateMobile; + ///The work phone + QString workPhone; + ///The homepage + QString homepage; + ///The contacts sex + QString sex; +}; + +SkypeContact::SkypeContact(SkypeAccount *account, const QString &id, SIM::MetaContact *parent, bool user) + : SIM::Contact(account, id, parent, QString::null) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d = new SkypeContactPrivate;//create the insides + d->session = 0L;//no session yet + d->account = account;//save the account for future, it will be needed + connect(this, SIGNAL(setCallPossible(bool )), this, SLOT(enableCall(bool ))); + account->prepareContact(this);//let the account prepare us + d->user = user; + + d->callContactAction = new KAction(i18n("Call Contact"), "call", KShortcut(), this, SLOT(call()), this, "call_contact"); + d->authorizeAction = new KAction(i18n("(Re)send Authorization To"), "mail_forward", KShortcut(), this, SLOT(authorize()), this, "authorize_contact"); + d->disAuthorAction = new KAction(i18n("Remove Authorization From"), "mail_delete", KShortcut(), this, SLOT(disAuthor()), this, "dis_authorize_contact"); + d->blockAction = new KAction(i18n("Block"), "cancel", KShortcut(), this, SLOT(block()), this, "block_contact"); + statusChanged();//This one takes care of disabling/enabling this action depending on the user's status. + + connect(this, SIGNAL(onlineStatusChanged(SIM::Contact*,const SIM::OnlineStatus&,const SIM::OnlineStatus&)), this, SLOT(statusChanged())); + if (account->canComunicate() && user) + emit infoRequest(contactId());//retrieve information + + setNickName(id);//Just default, should be replaced later by something.. + + setOnlineStatus(account->protocol()->Offline); +} + +SkypeContact::~SkypeContact() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + //free memory + delete d; +} + +SIM::ChatSession *SkypeContact::manager(SIM::Contact::CanCreateFlags CanCreate) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if ((!d->session) && (CanCreate)) {//It is not there and I can create it + d->session = new SkypeChatSession(d->account, this); + connect(d->session, SIGNAL(destroyed()), this, SLOT(removeChat()));//Care about loosing the session + connect(d->session, SIGNAL(becameMultiChat(const QString&, SkypeChatSession* )), this, SLOT(removeChat()));//This means it no longer belongs to this user + } + + return d->session;//and return it +} + +void SkypeContact::serialize(QMap &serializedData, QMap &) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + serializedData["contactId"] = contactId();//save the ID +} + +void SkypeContact::requestInfo() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->user) + emit infoRequest(contactId());//just ask for the info +} + +void SkypeContact::setInfo(const QString &change) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + kdDebug(14311) << "info is: " << change << endl;//some debug info + + const QString &receivedProperty = change.section(' ', 0, 0).stripWhiteSpace().upper();//get the first part + if (receivedProperty == "FULLNAME") { + setProperty( SIM::Global::Properties::self()->fullName(), change.section(' ', 1).stripWhiteSpace() );//save the name + } else if (receivedProperty == "DISPLAYNAME") { + const QString &name = change.section(' ', 1).stripWhiteSpace();//get the name + if (name.isEmpty()) + setNickName( property( SIM::Global::Properties::self()->fullName() ).value().toString() ); + else + setNickName(name);//set the display name + } else if (receivedProperty == "ONLINESTATUS") {//The online status eather changed or we just logged in and I asked for it + const QString &status = change.section(' ', 1, 1).stripWhiteSpace().upper();//get the status + + if (status == "OFFLINE") { + d->status = osOffline; + } else if (status == "ONLINE") { + d->status = osOnline; + } else if (status == "AWAY") { + d->status = osAway; + } else if (status == "NA") { + d->status = osNA; + } else if (status == "DND") { + d->status = osDND; + } else if (status == "SKYPEOUT") { + d->status = osSkypeOut; + } else if (status == "SKYPEME") { + d->status = osSkypeMe; + } + + resetStatus(); + } else if (receivedProperty == "BUDDYSTATUS") { + int value = change.section(' ', 1, 1).stripWhiteSpace().toInt();//get the value + + switch (value) { + case 0: + d->buddy = bsNotInList; + break; + case 1: + d->buddy = bsNotInList; + return; + case 2: + d->buddy = bsNoAuth; + break; + case 3: + d->buddy = bsInList; + break; + } + + resetStatus(); + } else + { + QString propValue = change.section(' ', 1).stripWhiteSpace(); + if ( !propValue.isEmpty() ) + { + if ( receivedProperty == "PHONE_HOME" ) { + setProperty( d->account->protocol()->propPrivatePhone, change.section(' ', 1).stripWhiteSpace() ); + d->privatePhone = change.section(' ', 1).stripWhiteSpace(); + } else if ( receivedProperty == "PHONE_OFFICE" ) { + setProperty( d->account->protocol()->propWorkPhone, change.section(' ', 1).stripWhiteSpace() ); + d->workPhone = change.section(' ', 1).stripWhiteSpace(); + } else if ( receivedProperty == "PHONE_MOBILE" ) { + setProperty(d->account->protocol()->propPrivateMobilePhone, change.section(' ', 1).stripWhiteSpace()); + d->privateMobile = change.section(' ', 1).stripWhiteSpace(); + } else if ( receivedProperty == "HOMEPAGE" ) { + //setProperty( d->account->protocol()->propPrivateMobilePhone, change.section(' ', 1).stripWhiteSpace() ); << This is odd, isn't it? + d->homepage = change.section(' ', 1).stripWhiteSpace(); + } else if (receivedProperty == "SEX") { + if (change.section(' ', 1).stripWhiteSpace().upper() == "MALE") { + d->sex = i18n("Male"); + } else if (change.section(' ', 1).stripWhiteSpace().upper() == "FEMALE") { + d->sex = i18n("Female"); + } else + d->sex = ""; + } + } + } +} + +QString SkypeContact::formattedName() const { + if (!d->user) + return nickName(); + return d->fullName; +} + +void SkypeContact::resetStatus() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + SkypeProtocol * protocol = d->account->protocol();//get the protocol + + if (d->status == osSkypeOut) { + setOnlineStatus(protocol->Phone);//this is the SkypeOut contact, in many ways special + return; + } + + switch (d->buddy) { + case bsNotInList: + setOnlineStatus(protocol->NotInList); + return; + case bsNoAuth: + setOnlineStatus(protocol->NoAuth); + return; + case bsInList://just put there normal status + break; + } + + switch (d->status) { + case osOffline: + setOnlineStatus(protocol->Offline); + break; + case osOnline: + setOnlineStatus(protocol->Online); + break; + case osAway: + setOnlineStatus(protocol->Away); + break; + case osNA: + setOnlineStatus(protocol->NotAvailable); + break; + case osDND: + setOnlineStatus(protocol->DoNotDisturb); + break; + case osSkypeOut: + setOnlineStatus(protocol->Phone); + break; + case osSkypeMe: + setOnlineStatus(protocol->SkypeMe); + break; + } +} + +bool SkypeContact::isReachable() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + const SIM::OnlineStatus &st = d->account->myself()->onlineStatus(); + if ((st == d->account->protocol()->Offline) || (st == d->account->protocol()->Connecting)) + return false; + + switch (d->buddy) { + case bsNotInList: + case bsNoAuth://I do not know, weather he is online, but I will send it trough the server + return true; + case bsInList: + break;//Do it by online status + } + + switch (d->status) { + //case osOffline://he is offline + case osSkypeOut://This one can not get messages, it is skype-out contact + return false; + default://some kind of online + return true; + } +} + +void SkypeContact::removeChat() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->session = 0L;//it exists no more or it is no longer of this contact +} + +bool SkypeContact::hasChat() const { + return d->session;//does it have a chat session? +} + +void SkypeContact::receiveIm(const QString &message, const QString &chat) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (!hasChat()) { + manager(CanCreate);//create it + if (!hasChat())//something failed + return; + } + + SIM::Message mes(this, d->account->myself(), message, SIM::Message::Inbound);//create the message + d->session->setChatId(chat); + d->session->appendMessage(mes);//add it to the session +} + +QPtrList *SkypeContact::customContextMenuActions() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->account->myself() == this) + return 0L; + + QPtrList *actions = new QPtrList(); + + actions->append(d->callContactAction); + actions->append(d->authorizeAction); + actions->append(d->disAuthorAction); + actions->append(d->blockAction); + + return actions; +} + +void SkypeContact::enableCall(bool value) { + d->callContactAction->setEnabled(value); +} + +void SkypeContact::statusChanged() { + SkypeProtocol * protocol = d->account->protocol(); + const SIM::OnlineStatus &myStatus = (d->account->myself()) ? d->account->myself()->onlineStatus() : protocol->Offline; + if (d->account->canAlterAuth()) { + d->authorizeAction->setEnabled(true); + d->disAuthorAction->setEnabled(true); + d->blockAction->setEnabled(true); + } else { + d->authorizeAction->setEnabled(false); + d->disAuthorAction->setEnabled(false); + d->blockAction->setEnabled(false); + } + if (this == d->account->myself()) { + emit setCallPossible(false); + } else if ((myStatus == protocol->Online) || (myStatus == protocol->Away) || (myStatus == protocol->NotAvailable) || (myStatus == protocol->DoNotDisturb) || (myStatus == protocol->NoAuth) || (myStatus == protocol->NotInList) || (myStatus == protocol->Phone) || (myStatus == protocol->SkypeMe)) + emit setCallPossible(true); + else + emit setCallPossible(false); +} + +void SkypeContact::call() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->account->makeCall(this); +} + +void SkypeContact::connectionStatus(bool connected) { + if (connected) { + statusChanged(); + } else + emit setCallPossible(false); +} + +SkypeChatSession *SkypeContact::getChatSession() { + return d->session; +} + +bool SkypeContact::canCall() const { + if (!d->account->canComunicate()) + return false; + if (!d->callContactAction) + return false; + return d->callContactAction->isEnabled(); +} + +void SkypeContact::slotUserInfo() { + kdDebug(14311) << k_funcinfo << endl; + + (new SkypeDetails)->setNames(contactId(), nickName(), formattedName()).setPhones(d->privatePhone, d->privateMobile, d->workPhone).setHomepage(d->homepage).setAuthor(d->account->getAuthor(contactId()), d->account).setSex(d->sex).exec(); +} + +void SkypeContact::deleteContact() { + d->account->removeContact(contactId()); + deleteLater(); +} + +void SkypeContact::sync(unsigned int changed) { + kdDebug(14311) << k_funcinfo << endl; + + if (changed & MovedBetweenGroup) { + d->account->registerContact(contactId()); + } +} + +void SkypeContact::authorize() { + d->account->authorizeUser(contactId()); +} + +void SkypeContact::disAuthor() { + d->account->disAuthorUser(contactId()); +} + +void SkypeContact::block() { + d->account->blockUser(contactId()); +} + +#include "skypecontact.moc" diff --git a/plugins/skype/skypecontact.h b/plugins/skype/skypecontact.h new file mode 100644 index 0000000..d9ee277 --- /dev/null +++ b/plugins/skype/skypecontact.h @@ -0,0 +1,150 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef SKYPECONTACT_H +#define SKYPECONTACT_H + +#include + +class SkypeAccount; +class QString; +class SkypeContactPrivate; +namespace SIM { + class MetaContact; + class ChatSession; +} +class KAction; +template class QPtrList; +class SkypeChatSession; + +/** + * @author Michal Vaner (VORNER) + */ +class SkypeContact : public SIM::Contact +{ + Q_OBJECT + private: + ///some internal things + SkypeContactPrivate *d; + ///This examines all factors of users online status and sets the status acordingly + void resetStatus(); + private slots: + ///This will note that the session was destroyed and therefore can't be used again. As well used when the chat becomes multi-user so it no longer belongs to this contact + void removeChat(); + ///Enables or disables the call action depending on if it can be called or not. + void enableCall(bool value); + ///The status changed, so there should be update of the availiblity of some things + void statusChanged(); + public: + /** + * Constructor. + * @param account Account to which it belongs + * @param id ID of the new contact + * @param parent Metacontact to put it inside + */ + SkypeContact(SkypeAccount *account, const QString &id, SIM::MetaContact *parent, bool user = true); + /** + * Destructor. + */ + ~SkypeContact(); + /** + * Creates a chat session. + * @param flags Can I create it? + * @return Pointer to that session + */ + virtual SIM::ChatSession *manager(SIM::Contact::CanCreateFlags flags); + /** + * Save this contact (resp. set what should be saved and it will be written automatically by SIM) + */ + virtual void serialize(QMap &serializedData, QMap &addressBookData); + ///Returns full name for the contact + virtual QString formattedName() const; + ///Is it reachable now? + virtual bool isReachable(); + ///Does this contact has opened chat session? + bool hasChat() const; + ///Tell SIM which actions to show in the contact pop-up menu + QPtrList *customContextMenuActions(); + ///Give me actually existing chat session + SkypeChatSession *getChatSession(); + ///Can this contact be called now? + bool canCall() const; + private slots: + /** + * Authorize the user to see if I'm online + */ + void authorize(); + /** + * Remove authorization from that user + */ + void disAuthor(); + /** + * Block this user, no more messages + */ + void block(); + public slots: + /** + * Please ask for the contact information (emit infoReques with your name) + */ + void requestInfo(); + /** + * Chnages something in the contact. + * @param change What change was it? It looks like [property] [value] + */ + void setInfo(const QString &change); + /** + * This one showes message in the chat session. + * @param message The message to show + * @param chat The chat ID of the chat the message belongs to + */ + void receiveIm(const QString &message, const QString &chat); + /** + * connection status changed + * @param connected Are we connected now? + */ + void connectionStatus(bool connected); + ///This slot calls a contact + void call(); + /** + * This slot should show the user info + * TODO: Implement this + * Now it only shows a messagebox + */ + virtual void slotUserInfo(); + /** + * Remove the contact from skype server + */ + virtual void deleteContact(); + /** + * Save me to the Skype + */ + virtual void sync(unsigned int changed); + signals: + /** + * There is a request to get/refresh the contact info from skype + * @param contact Which contact wants it? + */ + void infoRequest(const QString &contact); + /** + * The possibility to call this contact has changed, so GUI should enable/disable some buttons. + * @param value Is it possible to call it now? + */ + void setCallPossible(bool value); +}; + +#endif diff --git a/plugins/skype/skypedetails.cpp b/plugins/skype/skypedetails.cpp new file mode 100644 index 0000000..3280f98 --- /dev/null +++ b/plugins/skype/skypedetails.cpp @@ -0,0 +1,88 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include "skypedetails.h" +#include "skypeaccount.h" + +#include +#include +#include +#include + +SkypeDetails::SkypeDetails() : SkypeDetailsBase() { + kdDebug(14311) << k_funcinfo << endl; +} + + +SkypeDetails::~SkypeDetails() { + kdDebug(14311) << k_funcinfo << endl; +} + +void SkypeDetails::closeEvent(QCloseEvent *) { + kdDebug(14311) << k_funcinfo << endl; + deleteLater(); +} + +void SkypeDetails::changeAuthor(int item) { + kdDebug(14311) << k_funcinfo << endl; + switch (item) { + case 0: + account->authorizeUser(idEdit->text()); + break; + case 1: + account->disAuthorUser(idEdit->text()); + break; + case 2: + account->blockUser(idEdit->text()); + break; + } +} + +SkypeDetails &SkypeDetails::setNames(const QString &id, const QString &nick, const QString &name) { + setCaption(i18n("Details for User %1").arg(id)); + idEdit->setText(id); + nickEdit->setText(nick); + nameEdit->setText(name); + return *this; +} + +SkypeDetails &SkypeDetails::setPhones(const QString &priv, const QString &mobile, const QString &work) { + privatePhoneEdit->setText(priv); + mobilePhoneEdit->setText(mobile); + workPhoneEdit->setText(work); + return *this; +} + +SkypeDetails &SkypeDetails::setHomepage(const QString &homepage) { + homepageEdit->setText(homepage); + return *this; +} + +SkypeDetails &SkypeDetails::setAuthor(int author, SkypeAccount *account) { + authorCombo->setCurrentItem(author); + this->account = account; + return *this; +} + +SkypeDetails &SkypeDetails::setSex(const QString &sex) { + sexEdit->setText(sex); + return *this; +} + +#include "skypedetails.moc" diff --git a/plugins/skype/skypedetails.h b/plugins/skype/skypedetails.h new file mode 100644 index 0000000..aaa8a72 --- /dev/null +++ b/plugins/skype/skypedetails.h @@ -0,0 +1,76 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#ifndef SKYPEDETAILS_H +#define SKYPEDETAILS_H + +#include + +class QString; +class SkypeAccount; + +/** + * @author Michal Vaner (VORNER) + * Dialog that shows users details + */ +class SkypeDetails : public SkypeDetailsBase { + Q_OBJECT + private: + SkypeAccount *account; + protected slots: + void changeAuthor(int item); + protected: + ///Make sure it is deleted after it is closed + void closeEvent(QCloseEvent *e); + public: + ///Just constructor + SkypeDetails(); + ///Only a destructor + ~SkypeDetails(); + public slots: + /** + * Sets the ID, the nick and the name + * @param id The ID of the user + * @param nick user's nick + * @param name user's full name + */ + SkypeDetails &setNames(const QString &id, const QString &nick, const QString &name); + /** + * Sets the phone numbers what will be showed + * @param priv The private phone number + * @param mobile The mobile phone + * @param work The work phone + */ + SkypeDetails &setPhones(const QString &priv, const QString &mobile, const QString &work); + /** + * Sets the homepage + * @param homepage The value to set + */ + SkypeDetails &setHomepage(const QString &homepage); + /** + * Sets the users authorization + * @param author The authorization - 0 = authorized, 1 = not authorized, 2 = blocked + */ + SkypeDetails &setAuthor(int author, SkypeAccount *account); + /** + * Sets the string to show in 'sex' edit box + */ + SkypeDetails &setSex(const QString &sex); +}; + +#endif diff --git a/plugins/skype/skypedetailsbase.ui b/plugins/skype/skypedetailsbase.ui new file mode 100644 index 0000000..9bc7f5e --- /dev/null +++ b/plugins/skype/skypedetailsbase.ui @@ -0,0 +1,277 @@ + +SkypeDetailsBase + + + SkypeDetailsBase + + + + 0 + 0 + 365 + 331 + + + + Users Details + + + + unnamed + + + + textLabel1 + + + Skype ID: + + + AlignVCenter|AlignRight + + + + + idEdit + + + true + + + + + privatePhoneEdit + + + true + + + + + layout4 + + + + unnamed + + + + spacer6 + + + Horizontal + + + Expanding + + + + 40 + 20 + + + + + + pushButton3 + + + &Close + + + + + spacer7 + + + Horizontal + + + Expanding + + + + 40 + 20 + + + + + + + + + Authorized + + + + + Not Authorized + + + + + Blocked + + + + authorCombo + + + + + textLabel5 + + + Mobile phone: + + + AlignVCenter|AlignRight + + + + + textLabel6 + + + Work phone: + + + AlignVCenter|AlignRight + + + + + homepageEdit + + + true + + + + + textLabel4 + + + Private phone: + + + AlignVCenter|AlignRight + + + + + textLabel7 + + + Is authorized: + + + AlignVCenter|AlignRight + + + + + mobilePhoneEdit + + + true + + + + + workPhoneEdit + + + true + + + + + textLabel2 + + + Nick: + + + AlignVCenter|AlignRight + + + + + nameEdit + + + true + + + + + nickEdit + + + true + + + + + textLabel3 + + + Full name: + + + AlignVCenter|AlignRight + + + + + textLabel1_2 + + + Homepage: + + + AlignVCenter|AlignRight + + + + + textLabel1_3 + + + Sex: + + + AlignVCenter|AlignRight + + + + + sexEdit + + + true + + + + + + + pushButton3 + clicked() + SkypeDetailsBase + close() + + + authorCombo + activated(int) + SkypeDetailsBase + changeAuthor(int) + + + + changeAuthor(int) + + + diff --git a/plugins/skype/skypeeditaccount.cpp b/plugins/skype/skypeeditaccount.cpp new file mode 100644 index 0000000..eef8dea --- /dev/null +++ b/plugins/skype/skypeeditaccount.cpp @@ -0,0 +1,158 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + + +#include "skypeeditaccount.h" +#include "skypeprotocol.h" +#include "skypeaccount.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class SkypeEditAccountPrivate { + public: + ///The protocol + SkypeProtocol *protocol; + ///The account + SkypeAccount *account; +}; + +skypeEditAccount::skypeEditAccount(SkypeProtocol *protocol, SIM::Account *account, QWidget *parent) : SkypeEditAccountBase(parent), SIMEditAccountWidget(account) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d = new SkypeEditAccountPrivate();//the d pointer + d->protocol = protocol;//I may need the protocol later + + d->account = (SkypeAccount *) account;//save the account + + //Now, check weather it is existing account or just an old one to modify + if (account) {//it is old one + excludeCheck->setChecked(account->excludeConnect());//Check, weather it should be excluded + LaunchGroup->setButton(d->account->launchType);//set the launch type + AuthorCheck->setChecked(!d->account->author.isEmpty());//set the check box that allows you to change authorization + if (AuthorCheck->isChecked()) + AuthorEdit->setText(d->account->author);//set the name + MarkCheck->setChecked(d->account->getMarkRead());//set the get read mode + HitchCheck->setChecked(d->account->getHitchHike()); + ScanCheck->setChecked(d->account->getScanForUnread()); + CallCheck->setChecked(d->account->getCallControl()); + PingsCheck->setChecked(d->account->getPings()); + BusGroup->setButton(d->account->getBus()); + DBusCheck->setChecked(d->account->getStartDBus()); + LaunchSpin->setValue(d->account->getLaunchTimeout()); + CommandEdit->setText(d->account->getSkypeCommand()); + WaitSpin->setValue(d->account->getWaitBeforeConnect()); + if (d->account->closeCallWindowTimeout()) { + AutoCloseCallCheck->setChecked(true); + CloseTimeoutSpin->setValue(d->account->closeCallWindowTimeout()); + } else AutoCloseCallCheck->setChecked(false); + LeaveCheck->setChecked(d->account->leaveOnExit()); + const QString &startCallCommand = d->account->startCallCommand(); + StartCallCommandCheck->setChecked(!startCallCommand.isEmpty()); + StartCallCommandEdit->setText(startCallCommand); + WaitForStartCallCommandCheck->setChecked(d->account->waitForStartCallCommand()); + const QString &endCallCommand = d->account->endCallCommand(); + EndCallCommandCheck->setChecked(!endCallCommand.isEmpty()); + EndCallCommandEdit->setText(endCallCommand); + OnlyLastCallCommandCheck->setChecked(d->account->endCallCommandOnlyLast()); + const QString &incomingCommand = d->account->incomingCommand(); + IncomingCommandCheck->setChecked(!incomingCommand.isEmpty()); + IncomingCommandEdit->setText(incomingCommand); + } else { + //KMessageBox::information(this, i18n("Please note that this version of Skype plugin is a development version and it is probable it will cause more problems than solve. You have been warned"), i18n("Version info")); - I hope it is not needed any more + } +} + +skypeEditAccount::~skypeEditAccount() { + kdDebug(14311) << k_funcinfo << endl;//some debug info +} + +bool skypeEditAccount::validateData() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + if (d->protocol->hasAccount() && (!account())) {//he wants to create some account witch name is already used + KMessageBox::sorry(this, i18n("You can have only one skype account"), i18n("Wrong Information"));//Tell him to use something other + return false; + } + + return true;//It seems OK +} + +SIM::Account *skypeEditAccount::apply() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + //first, I need a pointer to that account + if (!account()) //it does not exist + setAccount(new SkypeAccount(d->protocol));//create a new one + SkypeAccount *skype = static_cast(account());//get the account + + //set it's values + skype->setExcludeConnect(excludeCheck->isChecked());//Save the "exclude from connection" setup + skype->launchType = LaunchGroup->selectedId();//get the type how to launch skype + if (AuthorCheck->isChecked()) + skype->author = AuthorEdit->text();//put there what user wrote + else + skype->author = "";//nothing unusual + skype->setHitchHike(HitchCheck->isChecked());//save the hitch hike mode and activat ethe new value + skype->setMarkRead(MarkCheck->isChecked());//set the mark read messages mode and activate it + skype->setScanForUnread(ScanCheck->isChecked()); + skype->setCallControl(CallCheck->isChecked()); + skype->setPings(PingsCheck->isChecked()); + skype->setBus(BusGroup->selectedId()); + skype->setStartDBus(DBusCheck->isChecked()); + skype->setLaunchTimeout(LaunchSpin->value()); + skype->setSkypeCommand(CommandEdit->text()); + skype->setWaitBeforeConnect(WaitSpin->value()); + skype->setLeaveOnExit(LeaveCheck->isChecked()); + if (AutoCloseCallCheck->isChecked()) { + skype->setCloseWindowTimeout(CloseTimeoutSpin->value()); + } else { + skype->setCloseWindowTimeout(0); + } + if (StartCallCommandCheck->isChecked()) { + skype->setStartCallCommand(StartCallCommandEdit->text()); + } else { + skype->setStartCallCommand(""); + } + skype->setWaitForStartCallCommand(WaitForStartCallCommandCheck->isChecked()); + if (EndCallCommandCheck->isChecked()) { + skype->setEndCallCommand(EndCallCommandEdit->text()); + } else { + skype->setEndCallCommand(""); + } + if (IncomingCommandCheck->isChecked()) { + skype->setIncomingCommand(IncomingCommandEdit->text()); + } else { + skype->setIncomingCommand(""); + } + + skype->setEndCallCommandOnlyForLast(OnlyLastCallCommandCheck->isChecked()); + skype->save();//save it to config + return skype;//return the account +} + +#include "skypeeditaccount.moc" diff --git a/plugins/skype/skypeeditaccount.h b/plugins/skype/skypeeditaccount.h new file mode 100644 index 0000000..3936cad --- /dev/null +++ b/plugins/skype/skypeeditaccount.h @@ -0,0 +1,65 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef SKYPEEDITACCOUNT_H +#define SKYPEEDITACCOUNT_H + +#include +#include "editaccountwidget.h" + +class SkypeEditAccountPrivate; +class SkypeProtocol; + +/** + * @author Michal Vaner + * @short Skype account edit-widget + * This widget will be showed inside the add account wizard when adding skype account or in edit account dialog, when editing skype account. + */ +class skypeEditAccount : public SkypeEditAccountBase, public SIMEditAccountWidget +{ +Q_OBJECT + private: + ///Some internal things + SkypeEditAccountPrivate *d; + public: + /** + * Constructor. + * @param account The account we are editing. 0 if new should be created. + * @param parent Inside what it will be showed. + */ + skypeEditAccount(SkypeProtocol *protocol, SIM::Account *account, QWidget *parent = 0L); + /** + * Destructor. + */ + virtual ~skypeEditAccount(); + /** + * Check, weather the written data can be used. + * @return True if the data are OK, false if not. + */ + virtual bool validateData(); + /** + * Aply all changes. Will change the actual account or create new one, if no was given. + * @return Pointer to that account. + */ + virtual SIM::Account *apply(); + public slots: +}; + +#endif + diff --git a/plugins/skype/skypeeditaccountbase.ui b/plugins/skype/skypeeditaccountbase.ui new file mode 100644 index 0000000..9c3efbc --- /dev/null +++ b/plugins/skype/skypeeditaccountbase.ui @@ -0,0 +1,1125 @@ + +SkypeEditAccountBase + + + SkypeEditAccountBase + + + + 0 + 0 + 561 + 444 + + + + + 7 + 7 + 0 + 0 + + + + If you have problems with arts and sound, you can use this to turn off arts for the call only. There are scripts duing this bundled with the SIM plugin (somewhere in you kde_folder/share/apps/skype) you can use. + + + + unnamed + + + + TabWidget + + + + 1 + 1 + 0 + 0 + + + + + tab + + + &Basic Setup + + + + unnamed + + + + groupBox1 + + + Account Information + + + + unnamed + + + + layout6 + + + + unnamed + + + + excludeCheck + + + E&xclude from connection + + + Check this if you do not want to connect with other protocols + + + + + spacer7 + + + Horizontal + + + Expanding + + + + 71 + 20 + + + + + + + + + + groupBox3 + + + Important Note + + + + unnamed + + + + textLabel3 + + + + 5 + 5 + 0 + 0 + + + + NoFrame + + + Plain + + + 0 + + + <p align="left">This is just a bridge to external running skype. This hase some consequences, like you need running instance of skype and thet only one skype account is possible</p> + + + AutoText + + + + + + + spacer10_2 + + + Vertical + + + MinimumExpanding + + + + 20 + 0 + + + + + + + + TabPage + + + Lau&nch + + + + unnamed + + + + LaunchGroup + + + Launch Skype + + + 0 + + + You can set weather and when should SIM launch skype. + + + + unnamed + + + + LaunchNeededRadio + + + When &not running + + + true + + + + + LaunchNeverRadio + + + N&ever + + + + + + + layout5 + + + + unnamed + + + + textLabel1 + + + Command: + + + + + CommandEdit + + + artsdsp skype --use-session-dbus + + + + + + + layout12 + + + + unnamed + + + + textLabel1_4 + + + Launch timeout: + + + + + LaunchSpin + + + 60 + + + 3 + + + 30 + + + + + textLabel2_3 + + + s + + + + + spacer23 + + + Horizontal + + + Expanding + + + + 151 + 20 + + + + + + + + DBusCheck + + + false + + + Laun&ch DBus + + + Launches DBus when not running + + + This will start session DBus if connection is set to session and it is not running. The prefered way is to set it in startup script, thought, so this if off by default. + + + + + layout18 + + + + unnamed + + + + textLabel2_4 + + + Wait before connect: + + + + + WaitSpin + + + 120 + + + 0 + + + 10 + + + trying + + + trying + + + + + textLabel1_5 + + + s + + + + + spacer21 + + + Horizontal + + + Expanding + + + + 218 + 20 + + + + + + + + textLabel2 + + + If you get error that Skype was not found and it is running, check instructions at http://www.skype.com/community/devzone/SkypeAPIforLinux.html or use session bus. (start skype with --use-session-dbus) + + + WordBreak|AlignVCenter + + + + + spacer8 + + + Vertical + + + Expanding + + + + 20 + 30 + + + + + + + + TabPage + + + C&onnection + + + + unnamed + + + + groupBox3_2 + + + Authorization + + + Each application that wants to use skype must tell a name to it and user is asked weather to allow such application to access it.<br> +By default, SIM provides SIM as its name, but if you suspect another application that it access skype with this name, you can set another and disallow applications that tries to log in as SIM. + + + + unnamed + + + + AuthorCheck + + + &Non-standard authorization + + + + + AuthorEdit + + + false + + + + + + + BusGroup + + + Bus + + + 0 + + + What bus do you want to use + + + What bus do you want to use to connect to Skype.<br>Session: Your own, other people can not get to that. (use --use-session-dbus to start skype on that bus).<br>System: This one is shared by all people on the same computer. Oddly, this one is used by default by Skype.it.<br>You have to use the same as uses Skype + + + + unnamed + + + + radioButton4 + + + Sessi&on + + + true + + + + + radioButton5 + + + S&ystem + + + + + + + textLabel1_2 + + + Note that SIM will freeze while Skype asks you if it can let SIM in. This is usual and if you allow it for ever (check that "Remember" checkbox on the Skype's dialog), it will not happen again. + + + WordBreak|AlignVCenter + + + + + spacer7_2 + + + Vertical + + + Expanding + + + + 20 + 50 + + + + + + + + TabPage + + + &Activity + + + + unnamed + + + + HitchCheck + + + Hitchhike incoming &messages + + + true + + + Show all incoming messages + + + This will show all skype incoming messages. If this is off, they are showed only if the message belongs to chat that is started by SIM. + + + + + MarkCheck + + + Mar&k as read + + + true + + + This will mark incoming messages as read so if you have Skype set up not to automatically pop-up chats, it will not flash that exclamation icon. + + + + + ScanCheck + + + Scan f&or unread + + + true + + + If this is checked, SIM will ask Skype on login, if it has any unshowed messages and show them. This is handy if you start SIM later than Skype and Skype is configured not to show incoming messages. + + + + + CallCheck + + + S&how call control + + + true + + + Show call control window for all cals + + + This will show a call control window for every call (both incoming and outgoing). If it is off, you can call from SIM, byt you have to control that call from Skype. + + + + + layout9 + + + + unnamed + + + + spacer9 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + AutoCloseCallCheck + + + Autoc&lose + + + true + + + Auto close the call control window + + + This will close tha call control window automatically when the call finishes + + + + + spacer14 + + + Horizontal + + + Expanding + + + + 361 + 20 + + + + + + + + layout8 + + + + unnamed + + + + spacer10 + + + Horizontal + + + Expanding + + + + 31 + 20 + + + + + + textLabel1_3 + + + + 5 + 0 + 0 + 0 + + + + Timeout: + + + + + CloseTimeoutSpin + + + + 7 + 0 + 0 + 0 + + + + 120 + + + 1 + + + 5 + + + + + textLabel2_2 + + + + 5 + 0 + 0 + 0 + + + + s + + + + + spacer12 + + + Horizontal + + + Expanding + + + + 301 + 20 + + + + + + + + PingsCheck + + + Pi&ng Skype + + + true + + + If this is enabled, SIM keeps track of wether the Skype is running. + + + This keeps track of wether Skype is running. Turning this off makes only sence it you're trying to get some not-flooded debug output. + + + + + LeaveCheck + + + Leave on e&xit + + + true + + + Leave a chat on window exit + + + Leave a chat when it's chat window is closed. Makes difference only with multi-user chats, if it is unchecked, you will continue receiving messages from that chat even after closing the window. + + + + + spacer13 + + + Vertical + + + Expanding + + + + 20 + 70 + + + + + + + + TabPage + + + &Calls + + + + unnamed + + + + StartCallCommandCheck + + + E&xecute before call + + + + + layout7 + + + + unnamed + + + + spacer12_2 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + StartCallCommandEdit + + + false + + + + + + + layout8 + + + + unnamed + + + + spacer13_2 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + WaitForStartCallCommandCheck + + + false + + + Wait for fi&nish + + + This will wait before making/accepting the call for the command to finish + + + This will wait for the command to finish before accepting/making the call.<br> +Note that it will freeze SIM for the time. + + + + + + + EndCallCommandCheck + + + Execute after call + + + + + + + + layout9 + + + + unnamed + + + + spacer14_2 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + EndCallCommandEdit + + + false + + + + + + + layout10 + + + + unnamed + + + + spacer15 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + OnlyLastCallCommandCheck + + + false + + + Onl&y for last call + + + Ususally makes no difference, just when there are some other calls on hold, it is executend only for the last ended one. + + + + + + + IncomingCommandCheck + + + Execute on inco&ming call + + + + + layout12 + + + + unnamed + + + + spacer15_2 + + + Horizontal + + + Fixed + + + + 20 + 20 + + + + + + IncomingCommandEdit + + + false + + + + + + + textLabel1_6 + + + If you have problems with arts while calling, you can use this to turn off arts for the call (I bundled scripts doing that, somewhere in kde_folder/share/apps/skype, names call_start and call_end) + + + WordBreak|AlignVCenter + + + + + spacer16 + + + Vertical + + + Expanding + + + + 21 + 20 + + + + + + + + + + + AuthorCheck + toggled(bool) + AuthorEdit + setEnabled(bool) + + + CallCheck + toggled(bool) + AutoCloseCallCheck + setEnabled(bool) + + + AutoCloseCallCheck + toggled(bool) + CloseTimeoutSpin + setEnabled(bool) + + + CallCheck + toggled(bool) + AutoCloseCallCheck + setChecked(bool) + + + StartCallCommandCheck + toggled(bool) + StartCallCommandEdit + setEnabled(bool) + + + StartCallCommandCheck + toggled(bool) + WaitForStartCallCommandCheck + setEnabled(bool) + + + EndCallCommandCheck + toggled(bool) + EndCallCommandEdit + setEnabled(bool) + + + EndCallCommandCheck + toggled(bool) + OnlyLastCallCommandCheck + setEnabled(bool) + + + IncomingCommandCheck + toggled(bool) + IncomingCommandEdit + setEnabled(bool) + + + + diff --git a/plugins/skype/skypeeditaccountwidget.cpp b/plugins/skype/skypeeditaccountwidget.cpp new file mode 100644 index 0000000..b742e2d --- /dev/null +++ b/plugins/skype/skypeeditaccountwidget.cpp @@ -0,0 +1,17 @@ +// +// C++ Implementation: $MODULE$ +// +// Description: +// +// +// Author: SIM Developers , (C) 2005 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "skypeeditaccountwidget.h" + +skypeEditAccountWidget::skypeEditAccountWidget(QWidget *parent, const char *name):skypeEditAccountWidget(parent, name) { +} + +#include "skypeeditaccountwidget.moc" diff --git a/plugins/skype/skypeprotocol.cpp b/plugins/skype/skypeprotocol.cpp new file mode 100644 index 0000000..3b7d026 --- /dev/null +++ b/plugins/skype/skypeprotocol.cpp @@ -0,0 +1,194 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ +#include "skypeprotocol.h" +#include "skypeeditaccount.h" +#include "skypeaccount.h" +#include "skypeaddcontact.h" +#include "skypecontact.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef KGenericFactory SkypeProtocolFactory; +K_EXPORT_COMPONENT_FACTORY( skype, SkypeProtocolFactory( "skype" ) ) + +class SkypeProtocolPrivate { + private: + public: + ///The "call contact" action + KAction *callContactAction; + ///Pointer to the account + SkypeAccount *account; + ///Constructor + SkypeProtocolPrivate() { + account = 0L;//no account yet + callContactAction = 0L; + } +}; + +SkypeProtocol::SkypeProtocol(QObject *parent, const char *name, const QStringList &) : + SIM::Protocol(SkypeProtocolFactory::instance(), parent, name),//create the parent + Offline(SIM::OnlineStatus::Offline, 0, this, 1, QString::null, i18n("Offline"), i18n("Offline"), SIM::OnlineStatusManager::Offline),//and online statuses + Online(SIM::OnlineStatus::Online, 1, this, 2, QString::null, i18n("Online"), i18n("Online"), SIM::OnlineStatusManager::Online), + SkypeMe(SIM::OnlineStatus::Online, 0, this, 3, "contact_ffc_overlay", i18n("Skype Me"), i18n("Skype Me"), SIM::OnlineStatusManager::FreeForChat), + Away(SIM::OnlineStatus::Away, 2, this, 4, "contact_away_overlay", i18n("Away"), i18n("Away"), SIM::OnlineStatusManager::Away), + NotAvailable(SIM::OnlineStatus::Away, 1, this, 5, "contact_xa_overlay", i18n("Not Available"), i18n("Not Available"), SIM::OnlineStatusManager::Away), + DoNotDisturb(SIM::OnlineStatus::Away, 0, this, 6, "contact_busy_overlay", i18n("Do Not Disturb"), i18n("Do Not Disturb"), SIM::OnlineStatusManager::Busy), + Invisible(SIM::OnlineStatus::Invisible, 0, this, 7, "contact_invisible_overlay", i18n("Invisible"), i18n("Invisible"), SIM::OnlineStatusManager::Invisible), + Connecting(SIM::OnlineStatus::Connecting, 0, this, 8, "skype_connect", i18n("Connecting")), + NotInList(SIM::OnlineStatus::Offline, 0, this, 9, "contact_unknown_overlay", i18n("Not in skype list")), + NoAuth(SIM::OnlineStatus::Offline, 0, this, 10, "contact_unknown_overlay", i18n("Not authorized")), + Phone(SIM::OnlineStatus::Online, 0, this, 11, "contact_phone_overlay", i18n("SkypeOut contact")), + /** Contact property templates */ + propFullName(SIM::Global::Properties::self()->fullName()), + propPrivatePhone(SIM::Global::Properties::self()->privatePhone()), + propPrivateMobilePhone(SIM::Global::Properties::self()->privateMobilePhone()), + propWorkPhone(SIM::Global::Properties::self()->workPhone()), + propLastSeen(SIM::Global::Properties::self()->lastSeen()) + +{ + kdDebug(14311) << k_funcinfo << endl;//some debug info + //create the d pointer + d = new SkypeProtocolPrivate(); + //add address book field + addAddressBookField("messaging/skype", SIM::Plugin::MakeIndexField); + + setXMLFile("skypeui.rc"); + + d->callContactAction = new KAction(i18n("Call (by Skype)"), QString::fromLatin1("call"), 0, this, SLOT(callContacts()), actionCollection(), "callSkypeContact"); + + updateCallActionStatus(); + connect(SIM::ContactList::self(), SIGNAL(metaContactSelected(bool)), this, SLOT(updateCallActionStatus())); +} + +SkypeProtocol::~SkypeProtocol() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + //release the memory + delete d; +} + +SIM::Account *SkypeProtocol::createNewAccount(const QString &) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + //just create one + return new SkypeAccount(this); +} + +AddContactPage *SkypeProtocol::createAddContactWidget(QWidget *parent, SIM::Account *account) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + return new SkypeAddContact(this, parent, (SkypeAccount *)account, 0L); +} + +SIMEditAccountWidget *SkypeProtocol::createEditAccountWidget(SIM::Account *account, QWidget *parent) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + return new skypeEditAccount(this, account, parent);//create the widget and return it +} + +void SkypeProtocol::registerAccount(SkypeAccount *account) { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->account = account; +} + +void SkypeProtocol::unregisterAccount() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + d->account = 0L;//forget everything about the account +} + +bool SkypeProtocol::hasAccount() const { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + return (d->account); +} + +SIM::Contact *SkypeProtocol::deserializeContact(SIM::MetaContact *metaContact, const QMap &serializedData, const QMap &) { + kdDebug(14311) << k_funcinfo << "Name: " << serializedData["contactId"] << endl;//some debug info + + QString contactID = serializedData["contactId"];//get the contact ID + + if (!d->account) { + kdDebug(14311) << "Account does not exists, skiping contact creation" << endl;//write error for debugging + return 0L;//create nothing + } + + return new SkypeContact(d->account, contactID, metaContact);//create the contact +} + +void SkypeProtocol::updateCallActionStatus() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + bool enab = false; + + if ((SIM::ContactList::self()->selectedMetaContacts().count() != 1) && ((!d->account) || (!d->account->ableMultiCall()))) { + d->callContactAction->setEnabled(false); + return; + } + + //Run trough all selected contacts and find if there is any skype contact + const QPtrList &selected = SIM::ContactList::self()->selectedMetaContacts(); + for (QPtrList::const_iterator met = selected.begin(); met != selected.end(); ++met) { + const QPtrList &metaCont = (*met)->contacts(); + for (QPtrList::const_iterator con = metaCont.begin(); con != metaCont.end(); ++con) { + if ((*con)->protocol() == this) {//This is skype contact, ask it if it can be called + SkypeContact *thisCont = static_cast (*con); + if (thisCont->canCall()) { + enab = true; + goto OUTSIDE; + } + } + } + } + OUTSIDE: + d->callContactAction->setEnabled(enab); +} + +void SkypeProtocol::callContacts() { + kdDebug(14311) << k_funcinfo << endl;//some debug info + + QString list; + + const QPtrList &selected = SIM::ContactList::self()->selectedMetaContacts(); + for (QPtrList::const_iterator met = selected.begin(); met != selected.end(); ++met) { + const QPtrList &metaCont = (*met)->contacts(); + for (QPtrList::const_iterator con = metaCont.begin(); con != metaCont.end(); ++con) { + if ((*con)->protocol() == this) {//This is skype contact, ask it if it can be called + SkypeContact *thisCont = static_cast (*con); + if (thisCont->canCall()) { + if (!list.isEmpty()) + list += ", "; + list += thisCont->contactId(); + } + } + } + } + + if (!list.isEmpty()) { + d->account->makeCall(list); + } +} + +#include "skypeprotocol.moc" diff --git a/plugins/skype/skypeprotocol.h b/plugins/skype/skypeprotocol.h new file mode 100644 index 0000000..cc24d68 --- /dev/null +++ b/plugins/skype/skypeprotocol.h @@ -0,0 +1,133 @@ +/* This file is part of the KDE project + Copyright (C) 2005 Michal Vaner + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ +#ifndef SKYPEPROTOCOL_H +#define SKYPEPROTOCOL_H + +#include "SIMprotocol.h" +#include + +class SkypeAccount; +class SkypeProtocolPrivate; + +namespace SIM { + class OnlineStatus; +}; + +#define LAUNCH_ALLWAYS 0 +#define LAUNCH_NEEDED 1 +#define LAUNCH_NEVER 2 + +/** + * @author Michal Vaner + * @short Protocol to use external skype + * This protocol is only binding for exteral skype program. The reason to write this was I did not like the skype as it was. + */ +class SkypeProtocol : public SIM::Protocol +{ + Q_OBJECT + private: + SkypeProtocolPrivate *d; + public: + const SIM::OnlineStatus Offline; + const SIM::OnlineStatus Online; + const SIM::OnlineStatus SkypeMe; + const SIM::OnlineStatus Away; + const SIM::OnlineStatus NotAvailable; + const SIM::OnlineStatus DoNotDisturb; + const SIM::OnlineStatus Invisible; + const SIM::OnlineStatus Connecting; + const SIM::OnlineStatus NotInList; + const SIM::OnlineStatus NoAuth; + const SIM::OnlineStatus Phone; + // contact properties +/* const SIM::ContactPropertyTmpl propAwayMessage; + const SIM::ContactPropertyTmpl propFirstName; + const SIM::ContactPropertyTmpl propLastName;*/ + const SIM::ContactPropertyTmpl propFullName; +// const SIM::ContactPropertyTmpl propEmailAddress; + const SIM::ContactPropertyTmpl propPrivatePhone; + const SIM::ContactPropertyTmpl propPrivateMobilePhone; + const SIM::ContactPropertyTmpl propWorkPhone; +// const SIM::ContactPropertyTmpl propWorkMobilePhone; + const SIM::ContactPropertyTmpl propLastSeen; + /** + * Constructor. This is called automatically on library load. + * @param parent Parent of the object. + * @param name Name of the object. + * @param args Arguments to allow creation by KGenericFactory. + * @see KGenericFactory + */ + SkypeProtocol(QObject *parent, const char *name, const QStringList &args); + /** + * Destructor. + */ + ~SkypeProtocol(); + /** + * Reimplementation of the methot that creates a new skype account. + * @param accountID ID of the account. + * @return At the moment NULL, but it will change soon. + */ + virtual SIM::Account *createNewAccount(const QString &accountID); + /** + * Reimplementation of the method that creates widget for adding contact to skype account. + * @param parent Parent widget. It will be showed inside. + * @param account Account to witch it aplies. + * @return At the moment NULL, but it will change soon. + */ + virtual AddContactPage *createAddContactWidget(QWidget *parent, SIM::Account *account); + /** + * Reimplementation of the method that creates widget for editing/creation of the skype account. + * @param account Account to what it applies. (0 means we create a new one) + * @param parent Parent widget. It will be showed inside it. + * @return NULL at the moment, but it will change soon. + */ + virtual SIMEditAccountWidget* createEditAccountWidget(SIM::Account *account, QWidget *parent); + /** + * Skype plugin allows only one skype account at once. This answers weather one exists or not. + * @return true if some account exists and false if not + */ + bool hasAccount() const; + /** + * Tells skype to remember this account + * @param account Pointer to the instance of the account + */ + void registerAccount(SkypeAccount *account); + /** + * Removes account is some exists + */ + void unregisterAccount(); + /** + * Creates a contact from provided data + * @param metaContact Metacontact to add the contact into + * @param serializedData Some data to store the contact + * @param addressBookData Data inside the address book + * @return Brand new loaded contact + */ + virtual SIM::Contact *deserializeContact(SIM::MetaContact *metaContact, const QMap &serializedData, const QMap &addressBokkData); + public slots: + /** + * This enables or disables the "Call by skype" action depending on weather a contact(s) are selected and have skype contacts + */ + void updateCallActionStatus(); + /** + * This calls all selected skype contacts + */ + void callContacts(); +}; + +#endif diff --git a/plugins/sms/CMakeLists.txt b/plugins/sms/CMakeLists.txt new file mode 100644 index 0000000..bf5328a --- /dev/null +++ b/plugins/sms/CMakeLists.txt @@ -0,0 +1,31 @@ +############### +# sms library # +############### +IF(BUILD_DROPPED) +SET(sms_SRCS + gsm_ta.cpp + serial.cpp + sms.cpp + smssetup.cpp +) + +SET(sms_HDRS + gsm_ta.h + serial.h + sms.h + smssetup.h +) + +SET(sms_UICS + smssetupbase.ui +) + +SET(sms_LIBS + _core +) + +# some needed include dirs +INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/plugins/_core) + +SIM_ADD_PLUGIN(sms) +ENDIF(BUILD_DROPPED) diff --git a/plugins/sms/gsm_ta.cpp b/plugins/sms/gsm_ta.cpp new file mode 100644 index 0000000..b45c5db --- /dev/null +++ b/plugins/sms/gsm_ta.cpp @@ -0,0 +1,680 @@ +/*************************************************************************** + gsm_ta.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + + Based on gsmlib by Peter Hofmann (software@pxh.de) + + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include +#include + +#include + +#include "log.h" + +#include "gsm_ta.h" +#include "serial.h" +#include "sms.h" + +using namespace std; +using namespace SIM; + +const unsigned PING_TIMEOUT = 20000; +const unsigned UNKNOWN = (unsigned)(-1); + +const unsigned OP_PHONEBOOK = 0; +const unsigned OP_PHONEBOOK_ENTRY = 1; + +GsmTA::GsmTA(QObject *parent) + : QObject(parent) +{ + m_state = None; + m_bPing = false; + m_port = new SerialPort(this); + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), this, SLOT(ping())); + connect(m_port, SIGNAL(write_ready()), this, SLOT(write_ready())); + connect(m_port, SIGNAL(read_ready()), this, SLOT(read_ready())); + connect(m_port, SIGNAL(error()), this, SLOT(port_error())); +} + +GsmTA::~GsmTA() +{ +} + +bool GsmTA::open(const char *device, int baudrate, bool bXonXoff) +{ + m_state = Open; + return m_port->openPort(device, baudrate, bXonXoff, 100); +} + +void GsmTA::write_ready() +{ + switch (m_state){ + case Open: + at("Z"); + m_state = Init; + break; + default: + break; + } +} + +void GsmTA::read_ready() +{ + QByteArray line = m_port->readLine(); + if (!line.isEmpty() && (line[(int)line.length() - 1] == '\r')) + line = line.left(line.length() - 1); + if (!line.isEmpty()){ + Buffer b(line); + EventLog::log_packet(b, false, SMSPlugin::SerialPacket); + } + OpInfo opInfo; + unsigned value1; + unsigned value2; + switch (m_state){ + case Init: + if (!isOK(line)) + return; + m_state = Init2; + at("E0"); + break; + case Init2: + if (!isOK(line)) + return; + m_state = Init3; + at("+CMEE=1"); + break; + case Init3: + if (!isChatOK(line, "", true, true)) + return; + m_state = Init4; + at("+CMGF=0"); + break; + case Init4: + if (!isChatOK(line)) + return; + m_state = Init5; + at("+CLIP=1"); + break; + case Init5: + if (!isChatOK(line)) + return; + m_state = Init6; + at("+CBC"); + break; + case Init6: + if (!isChatResponse(line, "+CBC:", false)) + return; + value1 = normalize(getToken(m_response, ',')).toUInt(); + value2 = normalize(m_response).toUInt(); + emit charge(value1 != 0, value2); + m_state = Init7; + at("+CSQ"); + break; + case Init7: + if (!isChatResponse(line, "+CSQ:", false)) + return; + value1 = normalize(m_response).toUInt(); + if (value1 == 99) + value1 = 0; + emit quality(value1); + m_state = Info1; + at("+CGMI"); + break; + case Info1: + if (!isChatResponse(line, "+CGMI:", false)) + return; + m_manufacturer = m_response; + m_state = Info2; + at("+CGMM"); + break; + case Info2: + if (!isChatResponse(line, "+CGMM:", false)) + return; + m_model = m_response; + m_state = Info3; + at("+CGMR"); + break; + case Info3: + if (!isChatResponse(line, "+CGMR:", false)) + return; + m_revision = m_response; + m_state = Info4; + at("+CGSN"); + break; + case Info4: + if (!isChatResponse(line, "+CGSN:", false)) + return; + m_serialNumber = m_response; + m_state = Charset1; + at("+CSCS=\"UCS2\""); + break; + case Charset1: + if (!isChatResponse(line, "+CSCS:", false)) + return; + m_state = Charset2; + at("+CSCS?"); + break; + case Charset2: + if (!isChatResponse(line, "+CSCS:", false)) + return; + m_charset = normalize(m_response); + if (m_charset.length() && (m_charset[0] == '\"')){ + getToken(m_charset, '\"'); + m_charset = getToken(m_charset, '\"'); + } + m_state = OpInfo1; + at("+COPS=3,0"); + break; + case OpInfo1: + if (!isChatOK(line, "", true, true)) + return; + m_state = OpInfo2; + at("+COPS?"); + break; + case OpInfo2: + if (!isChatResponse(line, "+COPS:", false)) + return; + getToken(m_response, ','); + getToken(m_response, ','); + if (m_response.length() && (m_response[0] == '"')){ + getToken(m_response, '\"'); + m_operator = getToken(m_response, '\"'); + } + m_port->setTimeout(~0U); + m_state = Connected; + emit init_done(); + processQueue(); + break; + case Connected: + if (isError(line)) + return; + break; + case Ping: + if (m_bPing){ + if (!isChatResponse(line, "+CBC:", false)) + return; + value1 = normalize(getToken(m_response, ',')).toUInt(); + value2 = normalize(m_response).toUInt(); + emit charge(value1 != 0, value2); + m_bPing = false; + }else{ + if (!isChatResponse(line, "+CSQ:", false)) + return; + value1 = normalize(m_response).toUInt(); + if (value1 == 99) + value1 = 0; + emit quality(value1); + m_bPing = true; + } + m_port->setTimeout((unsigned)(-1)); + m_state = Connected; + processQueue(); + break; + case PhoneBook: + if (!isChatOK(line, "", true, true)) + return; + m_state = PhoneBook1; + at("+CPBS?"); + break; + case PhoneBook1: + if (!isChatResponse(line, "+CPBS:")) + return; + m_state = PhoneBook2; + getToken(m_response, ','); + m_book->m_used = normalize(getToken(m_response, ',')).toUInt(); + m_book->m_size = normalize(getToken(m_response, ',')).toUInt(); + at("+CPBR=?"); + break; + case PhoneBook2: + if (!isChatResponse(line, "+CPBR:")) + return; + parseEntriesList(getToken(m_response, ',')); + if (m_book->m_entries.empty() && m_book->m_size){ + for (unsigned i = 0; i < m_book->m_size; i++) + m_book->m_entries.push_back(true); + } + m_book->m_size = 0; + m_book->m_numberSize = getToken(m_response, ',').toUInt(); + m_book->m_nameSize = m_response.toUInt(); + if (m_queue.empty()){ + getNextEntry(); + break; + } + opInfo.oper = OP_PHONEBOOK_ENTRY; + m_queue.push_back(opInfo); + m_state = Connected; + processQueue(); + break; + case PhoneBook3: + if (!isChatResponse(line, "+CPBR:")) + return; + parseEntry(m_response); + if (m_queue.empty()){ + getNextEntry(); + break; + } + opInfo.oper = OP_PHONEBOOK_ENTRY; + m_queue.push_back(opInfo); + m_state = Connected; + processQueue(); + break; + default: + break; + } +} + +void GsmTA::ping() +{ + if (m_state != Connected) + return; + m_timer->stop(); + m_state = Ping; + if (m_bPing){ + at("+CBC"); + }else{ + at("+CSQ"); + } +} + +void GsmTA::port_error() +{ + m_timer->stop(); + emit error(); +} + +void GsmTA::at(const QByteArray &str, unsigned timeout) +{ + QByteArray cmd = "AT"; + cmd += str; + m_cmd = cmd; + Buffer b(cmd); + EventLog::log_packet(b, true, SMSPlugin::SerialPacket); + cmd += "\r\n"; + m_tries = 5; + m_response = ""; + m_port->writeLine(cmd.data(), timeout); +} + +bool GsmTA::isOK(const QByteArray &answer) +{ + if (isIncoming(answer)) + return false; + if (answer == "OK" || answer.contains("CABLE: GSM")) + return true; + if (--m_tries == 0) + emit error(); + return false; +} + +QByteArray GsmTA::normalize(const QByteArray &ans) +{ + QByteArray answer = ans; + size_t start = 0, end = answer.length(); + bool changed = true; + while (start < end && changed){ + changed = false; + if (isspace(answer[(int)start])){ + ++start; + changed = true; + }else if (isspace(answer[(int)end - 1])){ + --end; + changed = true; + } + } + answer = answer.mid(start, end - start); + return answer; +} + +bool GsmTA::isError(const QByteArray &ans) +{ + if (isIncoming(ans)) + return false; + QByteArray answer = normalize(ans); + if (answer.isEmpty()) + return false; + if (matchResponse(answer, "+CME ERROR:") || + matchResponse(answer, "+CMS ERROR:") || + matchResponse(answer, "ERROR")){ + emit error(); + return true; + } + return false; +} + +bool GsmTA::isChatOK(const QByteArray &ans, const char *response, bool bIgnoreErrors, bool bAcceptEmptyResponse) +{ + if (isIncoming(ans)) + return false; + QByteArray answer = normalize(ans); + if (answer.isEmpty() || (answer == m_cmd)) + return false; + if (matchResponse(answer, "+CME ERROR:") || + matchResponse(answer, "+CMS ERROR:") || + matchResponse(answer, "ERROR")){ + if (bIgnoreErrors) + return true; + emit error(); + return false; + } + if (bAcceptEmptyResponse && (answer == "OK")) + return true; + if (response == NULL){ + if (answer == "OK") + return true; + log(L_DEBUG, "Unexpected answer %s", answer.data()); + emit error(); + return false; + } + if (matchResponse(answer, response)) + return true; + log(L_DEBUG, "Unexpected answer %s", answer.data()); + emit error(); + return false; +} + +bool GsmTA::isChatResponse(const QByteArray &ans, const char *response, bool bIgnoreErrors) +{ + if (isIncoming(ans)) + return false; + QByteArray answer = normalize(ans); + if (answer.isEmpty() || (answer == m_cmd)) + return false; + if (matchResponse(answer, "+CME ERROR:") || + matchResponse(answer, "+CMS ERROR:") || + matchResponse(answer, "ERROR")){ + if (bIgnoreErrors) + return true; + emit error(); + return false; + } + if (answer == "OK") + return true; + if (answer.isEmpty()) + return false; + matchResponse(answer, response); + if (!m_response.isEmpty()) + m_response += "\n"; + m_response += answer; + return false; +} + +bool GsmTA::isIncoming(const QByteArray &ans) +{ + QByteArray answer = normalize(ans); + if (matchResponse(answer, "+CLIP:")){ + QString number = getToken(answer, ','); + if (!number.isEmpty() && (number[0] == '\"')){ + getToken(number, '\"'); + number = getToken(number, '\"'); + } + unsigned type = answer.toUInt(); + if (type) + emit phoneCall(number); + return true; + } + return false; +} + +bool GsmTA::matchResponse(QByteArray &answer, const char *responseToMatch) +{ + if (answer.left(strlen(responseToMatch)) == responseToMatch){ + answer = normalize(answer.data() + strlen(responseToMatch)); + return true; + } + return false; +} + +QByteArray GsmTA::model() const +{ + QByteArray res = m_manufacturer; + if (!m_model.isEmpty()){ + if (!res.isEmpty()) + res += " "; + res += m_model; + } + return res; +} + +QByteArray GsmTA::oper() const +{ + return m_operator; +} + +void GsmTA::processQueue() +{ + if (m_queue.empty()){ + m_timer->setSingleShot( true ); + m_timer->start( PING_TIMEOUT ); + return; + } + m_timer->stop(); + list::iterator it = m_queue.begin(); + OpInfo info = *it; + m_queue.erase(it); + switch (info.oper){ + case OP_PHONEBOOK: + getPhoneBook(); + break; + case OP_PHONEBOOK_ENTRY: + getNextEntry(); + break; + default: + log(L_DEBUG, "Unknown oper"); + break; + } +} + +void GsmTA::getNextEntry() +{ + for (; m_book->m_size < m_book->m_entries.size(); m_book->m_size++){ + if (!m_book->m_entries[m_book->m_size]) + continue; + m_state = PhoneBook3; + QString cmd = "+CPBR="; + cmd += QString::number(m_book->m_size); + at(cmd.toLatin1(), 20000); + m_book->m_size++; + return; + } + if (m_bookType == 0){ + m_bookType = 1; + m_state = PhoneBook; + m_book = m_books + 1; + at("+CPBS=ME"); + return; + } + m_port->setTimeout((unsigned)(-1)); + m_state = Connected; + processQueue(); +} + +void GsmTA::parseEntry(const QByteArray &answ) +{ + QByteArray answer = normalize(answ); + unsigned index = getToken(answer, ',').toUInt(); + answer = normalize(answer); + if (answer.isEmpty()) + return; + QByteArray phone; + if (answer[0] == '\"'){ + getToken(answer, '\"'); + phone = getToken(answer, '\"'); + getToken(answer, ','); + }else{ + phone = getToken(answer, ','); + } + if (phone.isEmpty() || (phone == "EMPTY")) + return; + answer = normalize(answer); + getToken(answer, ','); + answer = normalize(answer); + QByteArray name; + if (answer[0] == '\"'){ + getToken(answer, '\"'); + name = getToken(answer, '\"'); + }else{ + name = getToken(name, ','); + } + QString nameString; + if (m_charset == "UCS2"){ + for (; name.length() >= 4; ){ + unsigned short unicode = (fromHex(name[0]) << 12) + + (fromHex(name[1]) << 8) + + (fromHex(name[2]) << 4) + + fromHex(name[3]); + name = name.mid(4); + nameString += QChar(unicode); + } + }else if (m_charset == "GSM"){ + nameString = gsmToLatin1(name); + }else{ + nameString = name; + } + if (nameString.isEmpty()) + return; + emit phonebookEntry(index, m_bookType, phone, nameString); +} + +void GsmTA::getPhoneBook() +{ + if (m_state != Connected){ + OpInfo info; + info.oper = OP_PHONEBOOK; + m_queue.push_back(info); + return; + } + m_bookType = 0; + m_timer->stop(); + m_state = PhoneBook; + m_book = m_books; + at("+CPBS=SM"); +} + +void GsmTA::parseEntriesList(const QByteArray &str) +{ + for (int i = 0; i < str.length(); i++){ + char c = str[i]; + if ((c >= '0') && (c <= '9')){ + unsigned n = c - '0'; + unsigned n1 = 0; + for (i++; str[i]; i++){ + c = str[i]; + if ((c < '0') || (c >= '9')) + break; + n = (n * 10) + (c - '0'); + } + if (str[i] == '-'){ + for (i++; str[i]; i++){ + c = *str; + if ((c < '0') || (c >= '9')) + break; + n1 = (n1 * 10) + (c - '0'); + } + }else{ + n1 = n; + } + if (n1 >= n){ + for (; n <= n1; n++){ + while (m_book->m_entries.size() <= n) + m_book->m_entries.push_back(false); + m_book->m_entries[n] = true; + } + } + } + } +} + +Phonebook::Phonebook() +{ + m_size = 0; + m_used = 0; + m_numberSize = 0; + m_nameSize = 0; +} + +// Latin-1 undefined character (code 172 (Latin-1 boolean not, "¬")) +const unsigned char NOP = 172; + +// GSM undefined character (code 16 (GSM Delta)) +const unsigned char GSM_NOP = 16; + +static unsigned char gsmToLatin1Table[] = + { + '@', 163, '$', 165, 232, 233, 249, 236, + 242, 199, 10, 216, 248, 13, 197, 229, + NOP, '_', NOP, NOP, NOP, NOP, NOP, NOP, + NOP, NOP, NOP, NOP, 198, 230, 223, 201, + ' ', '!', '"', '#', 164, '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + 161, 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', 196, 214, 209, 220, 167, + 191, 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', 228, 246, 241, 252, 224 + }; + +class GsmLatin1 +{ +public: + GsmLatin1(); + unsigned char latin1ToGsmTable[256]; +}; + +GsmLatin1::GsmLatin1() +{ + memset(latin1ToGsmTable, GSM_NOP, 256); + for (unsigned char i = 0; i < 128; i++){ + if (gsmToLatin1Table[i] == NOP) + continue; + latin1ToGsmTable[gsmToLatin1Table[i]] = i; + } +} + +static GsmLatin1 gsmTable; + +QByteArray GsmTA::gsmToLatin1(const QByteArray &str) +{ + QByteArray res; + for (unsigned char *p = (unsigned char*)str.data(); *p; p++){ + if (*p >= 0x80) + continue; + unsigned char c = gsmToLatin1Table[*p]; + if (c == NOP) + continue; + res += (char)c; + } + return res; +} + +QByteArray GsmTA::latin1ToGsm(const QByteArray &str) +{ + QByteArray res; + for (unsigned char *p = (unsigned char*)str.data(); *p; p++){ + unsigned char c = gsmTable.latin1ToGsmTable[*p]; //warning C6385: Invalid data: accessing 'gsmTable.latin1ToGsmTable', the readable size is '256' bytes, but '1001' bytes might be read: Lines: 671, 672, 673 + if (c == GSM_NOP) + continue; + res += (char)c; + } + return res; +} + diff --git a/plugins/sms/gsm_ta.h b/plugins/sms/gsm_ta.h new file mode 100644 index 0000000..a9b6ee1 --- /dev/null +++ b/plugins/sms/gsm_ta.h @@ -0,0 +1,137 @@ +/*************************************************************************** + gsm_ta.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _GSM_TA_H +#define _GSM_TA_H + +#include +#include +#include +#include +#include +#include "simapi.h" + +using namespace std; + +class SerialPort; +class QTimer; + +struct OpInfo +{ + unsigned oper; + string param; +}; + +class Phonebook +{ +public: + Phonebook(); + unsigned m_size; + unsigned m_used; + unsigned m_numberSize; + unsigned m_nameSize; + vector m_entries; +}; + +class GsmTA : public QObject +{ + Q_OBJECT +public: + GsmTA(QObject *parent); + ~GsmTA(); + bool open(const char *device, int baudrate, bool bXonXoff); + QByteArray model() const; + QByteArray oper() const; + void getPhoneBook(); + void setPhoneBookEntry(unsigned index, const QString &phone, const QString &name); +signals: + void init_done(); + void error(); + void phoneCall(const QString &phone); + void phonebookEntry(int index, int type, const QString &phone, const QString &name); + void quality(unsigned); + void charge(bool, unsigned); +protected slots: + void write_ready(); + void read_ready(); + void port_error(); + void ping(); +protected: + enum State + { + None, + Open, + Init, + Init2, + Init3, + Init4, + Init5, + Init6, + Init7, + Info1, + Info2, + Info3, + Info4, + Charset1, + Charset2, + OpInfo1, + OpInfo2, + Connected, + Ping, + PhoneBook, + PhoneBook1, + PhoneBook2, + PhoneBook3, + PhoneBookStore + }; + unsigned m_tries; + void at(const QByteArray &str, unsigned timeout=10000); + bool isOK(const QByteArray &answer); + bool isError(const QByteArray &answer); + bool isChatOK(const QByteArray &answer, const char *response = NULL, + bool bIgnoreErrors = false, bool bAcceptEmptyResponse = false); + bool isChatResponse(const QByteArray &answer, const char *response = NULL, + bool bIgnoreErrors = false); + bool isIncoming(const QByteArray &answer); + bool matchResponse(QByteArray &answer, const char *responseToMatch); + void processQueue(); + void parseEntriesList(const QByteArray &answ); + void parseEntry(const QByteArray &answ); + void getNextEntry(); + QByteArray normalize(const QByteArray &answ); + QByteArray gsmToLatin1(const QByteArray &str); + QByteArray latin1ToGsm(const QByteArray &str); + State m_state; + QByteArray m_cmd; + QByteArray m_manufacturer; + QByteArray m_model; + QByteArray m_revision; + QByteArray m_serialNumber; + QByteArray m_operator; + QByteArray m_response; + QByteArray m_charset; + listm_queue; + Phonebook m_books[2]; + Phonebook *m_book; + bool m_bPing; + unsigned m_bookType; + QTimer *m_timer; + SerialPort *m_port; +}; + +#endif + diff --git a/plugins/sms/serial.cpp b/plugins/sms/serial.cpp new file mode 100644 index 0000000..6dfab93 --- /dev/null +++ b/plugins/sms/serial.cpp @@ -0,0 +1,646 @@ +/*************************************************************************** + serial.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +//#ifdef HAVE_UNISTD_H +#include +//#endif + +#include "buffer.h" +#include "log.h" +#include "serial.h" + +using namespace SIM; + +#ifdef WIN32 + +#include + +const unsigned SERIAL_TIMEOUT = 1000; + +class SerialEvent : public QEvent +{ +public: + SerialEvent(unsigned reason); + unsigned reason() { return m_reason; } +protected: + unsigned m_reason; +}; + +SerialEvent::SerialEvent(unsigned reason) + : QEvent(User) +{ + m_reason = reason; +} + +const unsigned SerialEventComplete = 0; +const unsigned SerialEventError = 1; +const unsigned SerialEventTimeout = 2; + +enum PortState +{ + None, + Read, + Write, + StartRead, + StartWrite, + Setup, + Close +}; + +class SerialPortPrivate +{ +public: + SerialPortPrivate(SerialPort *port); + ~SerialPortPrivate(); + void close(); + Qt::HANDLE hPort; + Qt::HANDLE hEvent; + Qt::HANDLE hThread; + OVERLAPPED over; + QTimer *m_timer; + SerialPort *m_port; + int m_baudrate; + bool m_bXonXoff; + QByteArray m_line; + PortState m_state; + Buffer m_buff; + int m_time; + int m_read_time; + char m_char; +}; + +static DWORD __stdcall SerialThread(LPVOID lpParameter) +{ + log(L_DEBUG, "SerialThread: %X", (unsigned int)GetCurrentThreadId()); + SerialPortPrivate *p = (SerialPortPrivate*)lpParameter; + DWORD timeout = INFINITE; + for (;;){ + DWORD res = WaitForSingleObject(p->hEvent, timeout); + if ((res == WAIT_ABANDONED) || (p->m_state == Close)) + break; + timeout = INFINITE; + switch (p->m_state){ + case StartRead:{ + DWORD bytesReadn = 0; + memset(&p->over, 0, sizeof(p->over)); + p->over.hEvent = p->hEvent; + p->m_state = Read; + if (ReadFile(p->hPort, &p->m_char, 1, &bytesReadn, &p->over)) + break; + DWORD err = GetLastError(); + if (err != ERROR_IO_PENDING){ + p->m_state = None; + QApplication::postEvent(p->m_port, new SerialEvent(SerialEventError)); + }else{ + timeout = p->m_read_time; + } + break; + } + case StartWrite:{ + DWORD bytesWritten = 0; + memset(&p->over, 0, sizeof(p->over)); + p->over.hEvent = p->hEvent; + p->m_state = Write; + if (WriteFile(p->hPort, p->m_line.data(), p->m_line.length(), &bytesWritten, &p->over)) + break; + DWORD err = GetLastError(); + if (err != ERROR_IO_PENDING){ + p->m_state = None; + QApplication::postEvent(p->m_port, new SerialEvent(SerialEventError)); + }else{ + timeout = SERIAL_TIMEOUT; + } + break; + } + case Read: + case Write: + if (res == WAIT_TIMEOUT){ + QApplication::postEvent(p->m_port, new SerialEvent(SerialEventTimeout)); + }else{ + QApplication::postEvent(p->m_port, new SerialEvent(SerialEventComplete)); + } + break; + default: + break; + } + } + return 0; +} + +SerialPort::SerialPort(QObject *parent) + : QObject(parent) +{ + d = new SerialPortPrivate(this); + connect(d->m_timer, SIGNAL(timeout()), this, SLOT(timeout())); +} + +SerialPortPrivate::SerialPortPrivate(SerialPort *port) +{ + hPort = INVALID_HANDLE_VALUE; + hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + m_timer = new QTimer(NULL); + m_port = port; + m_state = None; + DWORD threadId; + hThread = CreateThread(NULL, 0, SerialThread, this, 0, &threadId); +} + +SerialPortPrivate::~SerialPortPrivate() +{ + close(); + delete m_timer; + m_state = Close; + SetEvent(hEvent); + CloseHandle(hEvent); + WaitForSingleObject(hThread, INFINITE); +} + +void SerialPortPrivate::close() +{ + if (hPort != INVALID_HANDLE_VALUE){ + CloseHandle(hPort); + hPort = INVALID_HANDLE_VALUE; + m_buff.init(0); + } + m_state = None; +} + +SerialPort::~SerialPort() +{ + delete d; +} + +void SerialPort::close() +{ + d->close(); +} + +void SerialPort::readReady(int) +{ +} + +bool SerialPort::openPort(const char *device, int baudrate, bool bXonXoff, int DTRtime) +{ + close(); + d->m_time = DTRtime; + d->m_baudrate = baudrate; + d->m_bXonXoff = bXonXoff; + QByteArray port; // = "\\\\.\\"; + port += device; + port += ":"; + d->hPort = CreateFileA(port.data(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (d->hPort == INVALID_HANDLE_VALUE){ + close(); + log(L_WARN, "Can' open %s", port.data()); + return false; + } + FlushFileBuffers(d->hPort); + if (!EscapeCommFunction(d->hPort, CLRDTR)){ + close(); + log(L_WARN, "Clear DTR error"); + return false; + } + d->m_timer->setSingleShot(true); + d->m_timer->start(d->m_time); + return true; +} + +void SerialPort::timeout() +{ + if (d->m_state == Setup){ + if (!SetupComm(d->hPort, 1024, 1024)){ + log(L_WARN, "SetupComm error"); + close(); + emit error(); + return; + } + PurgeComm(d->hPort, PURGE_RXABORT | PURGE_RXCLEAR); + d->m_state = None; + emit write_ready(); + return; + } + if (!EscapeCommFunction(d->hPort, SETDTR)){ + log(L_WARN, "Set DTR error"); + close(); + emit error(); + return; + } + DCB dcb; + memset(&dcb, 0, sizeof(dcb)); + dcb.DCBlength = sizeof(dcb); + if (GetCommState(d->hPort, &dcb) == 0){ + log(L_WARN, "Get status error"); + close(); + emit error(); + return; + } + dcb.fBinary = TRUE; + dcb.BaudRate = d->m_baudrate; + dcb.fParity = FALSE; + dcb.Parity = 0; + dcb.ByteSize = 8; + dcb.StopBits = 0; + if (!d->m_bXonXoff) + { + dcb.fInX = FALSE; + dcb.fOutX = FALSE; + dcb.fOutxDsrFlow = FALSE; + dcb.fOutxCtsFlow = FALSE; + } + else + { + dcb.fInX = TRUE; + dcb.fOutX = TRUE; + dcb.fOutxDsrFlow = FALSE; + dcb.fOutxCtsFlow = FALSE; + } + dcb.fDtrControl = DTR_CONTROL_ENABLE; + dcb.fRtsControl = RTS_CONTROL_ENABLE; + if (SetCommState(d->hPort, &dcb) == 0){ + log(L_WARN, "Set status error"); + close(); + emit error(); + return; + } + d->m_state = Setup; + d->m_timer->setSingleShot(true); + d->m_timer->start(d->m_time); +} + +void SerialPort::writeLine(const char *data, unsigned read_time) +{ + if (d->hPort == INVALID_HANDLE_VALUE){ + emit error(); + return; + } + switch (d->m_state){ + case Read: + case Write: + CancelIo(d->hPort); + break; + default: + break; + } + d->m_state = StartWrite; + d->m_line = data; + d->m_read_time = read_time; + FlushFileBuffers(d->hPort); + SetEvent(d->hEvent); +} + +void SerialPort::setTimeout(unsigned read_time) +{ + switch (d->m_state){ + case Read: + case Write: + CancelIo(d->hPort); + break; + default: + break; + } + d->m_state = StartRead; + d->m_read_time = read_time; + SetEvent(d->hEvent); +} + +QByteArray SerialPort::readLine() +{ + QByteArray res; + if (d->hPort == INVALID_HANDLE_VALUE) + return res; + if (d->m_buff.scan("\n", res)){ + if (d->m_buff.readPos() == d->m_buff.writePos()) + d->m_buff.init(0); + } + return res; +} + +bool SerialPort::event(QEvent *e) +{ + if (e->type() != QEvent::User) + return QObject::event(e); + switch (static_cast(e)->reason()){ + case SerialEventComplete:{ + DWORD bytes; + if (GetOverlappedResult(d->hPort, &d->over, &bytes, true)){ + if (d->m_state == Read){ + d->m_buff.pack(&d->m_char, 1); + if (d->m_char == '\n') + emit read_ready(); + } + if (d->m_state == Write){ + emit write_ready(); + d->m_state = Read; + } + if (d->m_state == Read){ + d->m_state = StartRead; + SetEvent(d->hEvent); + } + break; + } + close(); + emit error(); + break; + } + case SerialEventTimeout:{ + log(L_WARN, "IO timeout"); + CancelIo(d->hPort); + close(); + emit error(); + break; + } + case SerialEventError:{ + log(L_WARN, "IO error"); + close(); + emit error(); + } + } + return true; +} + +void SerialPort::readTimeout() +{ +} + +QStringList SerialPort::devices() +{ + QStringList res; + for (unsigned i = 1; i <= 8; i++){ + QString port = "COM" + QString::number(i); + QString fullPort = "\\\\.\\" + port; + Qt::HANDLE hPort = CreateFile((LPCWSTR)fullPort.utf16(),GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL ); + if (hPort == INVALID_HANDLE_VALUE) + continue; + res.append(port); + CloseHandle(hPort); + } + return res; +} + +#else + +#include +#include +#include +#include +#include +#include + +enum PortState +{ + None, + Setup +}; + +class SerialPortPrivate +{ +public: + SerialPortPrivate(SerialPort*); + ~SerialPortPrivate(); + void close(); + QTimer *m_timer; + QTimer *m_readTimer; + QSocketNotifier *m_notify; + int fd; + int m_time; + int m_timeout; + int m_baudrate; + bool m_bXonXoff; + Buffer m_buf; + PortState m_state; +}; + +SerialPortPrivate::SerialPortPrivate(SerialPort *port) +{ + fd = -1; + m_timer = new QTimer(port); + m_readTimer = new QTimer(port); + m_timeout = 0; + m_notify = NULL; + m_state = None; +} + +SerialPortPrivate::~SerialPortPrivate() +{ + close(); +} + +void SerialPortPrivate::close() +{ + if (m_notify){ + delete m_notify; + m_notify = NULL; + } + if (fd == -1) + return; + ::close(fd); + fd = -1; +} + +SerialPort::SerialPort(QObject *parent) + : QObject(parent) +{ + d = new SerialPortPrivate(this); + connect(d->m_timer, SIGNAL(timeout()), this, SLOT(timeout())); + connect(d->m_readTimer, SIGNAL(timeout()), this, SLOT(readTimeout())); +} + +SerialPort::~SerialPort() +{ + delete d; +} + +bool SerialPort::openPort(const char *device, int baudrate, bool bXonXoff, int DTRtime) +{ + close(); + QByteArray fname = "/dev/"; + fname += device; + d->m_time = DTRtime; + d->m_baudrate = baudrate; + d->m_bXonXoff = bXonXoff; + d->fd = open(fname.data(), O_RDWR | O_NOCTTY | O_NONBLOCK); + if (d->fd == -1){ + log(L_WARN, "Can't open %s: %s", fname.data(), strerror(errno)); + return false; + } + int fdFlags; + if ((fdFlags = fcntl(d->fd, F_GETFL)) == -1){ + log(L_WARN, "Can't get flags %s: %s", fname.data(), strerror(errno)); + close(); + return false; + } + fdFlags &= ~O_NONBLOCK; + if (fcntl(d->fd, F_SETFL, fdFlags) == -1){ + log(L_WARN, "Can't set flags %s: %s", fname.data(), strerror(errno)); + close(); + return false; + } + int mctl = TIOCM_DTR; + if (ioctl(d->fd, TIOCMBIC, &mctl) < 0){ + log(L_WARN, "Clear failed %s: %s", fname.data(), strerror(errno)); + close(); + return false; + } + d->m_timer->setSingleShot( true ); + d->m_timer->start( d->m_time ); + return true; +} + +void SerialPort::readReady(int) +{ + d->m_readTimer->stop(); + for (;;){ + char c; + int res = read(d->fd, &c, 1); + if ((res < 0) && (errno == EAGAIN)) + return; + if (res <= 0){ + log(L_DEBUG, "Read serial error: %s", (res < 0) ? strerror(errno) : "connection closed"); + close(); + emit error(); + return; + } + d->m_readTimer->setSingleShot( true ); + d->m_readTimer->start( d->m_timeout ); + d->m_buf.pack(&c, 1); + if (c == '\n') + emit read_ready(); + } +} + +void SerialPort::close() +{ + d->close(); +} + +void SerialPort::writeLine(const char *data, unsigned timeRead) +{ + d->m_readTimer->stop(); + int res = write(d->fd, data, strlen(data)); + if (res < 0){ + log(L_DEBUG, "Write serial error: %s", strerror(errno)); + close(); + emit error(); + return; + } + d->m_timeout = timeRead; + d->m_readTimer->setSingleShot( true ); + d->m_readTimer->start( d->m_timeout ); +} + +void SerialPort::setTimeout(unsigned timeRead) +{ + d->m_readTimer->stop(); + d->m_timeout = timeRead; + d->m_readTimer->setSingleShot( true ); + d->m_readTimer->start( d->m_timeout ); +} + +QByteArray SerialPort::readLine() +{ + QByteArray res; + if (d->fd == -1) + return res; + if (d->m_buf.scan("\n", res)){ + if (d->m_buf.readPos() == d->m_buf.writePos()) + d->m_buf.init(0); + } + return res; +} + +void SerialPort::readTimeout() +{ + close(); + emit error(); +} + +void SerialPort::timeout() +{ + if (d->m_state == Setup){ + tcflush(d->fd, TCIFLUSH); + d->m_state = None; + d->m_notify = new QSocketNotifier(d->fd, QSocketNotifier::Read, this); + connect(d->m_notify, SIGNAL(activated(int)), this, SLOT(readReady(int))); + emit write_ready(); + return; + } + int mctl = TIOCM_DTR; + if (ioctl(d->fd, TIOCMBIS, &mctl) < 0){ + log(L_WARN, "setting DTR failed: %s", strerror(errno)); + close(); + return; + } + + struct termios t; + if (tcgetattr(d->fd, &t) < 0){ + log(L_WARN, "Getattr failed: %s", strerror(errno)); + close(); + return; + } + cfsetispeed(&t, d->m_baudrate); + cfsetospeed(&t, d->m_baudrate); + + t.c_iflag |= IGNPAR | (d->m_bXonXoff ? IXON | IXOFF : 0); + t.c_iflag &= ~(INPCK | ISTRIP | IMAXBEL | + (d->m_bXonXoff ? 0 : IXON | IXOFF) + | IXANY | IGNCR | ICRNL | IMAXBEL | INLCR | IGNBRK); + t.c_oflag &= ~(OPOST); + t.c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD | + (d->m_bXonXoff ? CRTSCTS : 0 )); + t.c_cflag |= CS8 | CREAD | HUPCL | (d->m_bXonXoff ? 0 : CRTSCTS) | CLOCAL; + t.c_lflag &= ~(ECHO | ECHOE | ECHOPRT | ECHOK | ECHOKE | ECHONL | + ECHOCTL | ISIG | IEXTEN | TOSTOP | FLUSHO | ICANON); + t.c_lflag |= NOFLSH; + t.c_cc[VMIN] = 1; + t.c_cc[VTIME] = 0; + t.c_cc[VSUSP] = 0; + + if(tcsetattr (d->fd, TCSANOW, &t) < 0){ + log(L_WARN, "Setattr failed: %s", strerror(errno)); + close(); + return; + } + d->m_state = Setup; + d->m_timer->setSingleShot( true ); + d->m_timer->start( d->m_time ); +} + +bool SerialPort::event(QEvent *e) +{ + return QObject::event(e); +} + +QStringList SerialPort::devices() +{ + QStringList res; + QDir dev("/dev"); + QStringList entries = dev.entryList( QStringList( "cuaa*" ), QDir::System); + for (QStringList::Iterator it = entries.begin(); it != entries.end(); ++it) + res.append(*it); + return res; +} + +#endif + diff --git a/plugins/sms/serial.h b/plugins/sms/serial.h new file mode 100644 index 0000000..97b7fa5 --- /dev/null +++ b/plugins/sms/serial.h @@ -0,0 +1,52 @@ +/*************************************************************************** + serial.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SERIAL_H +#define _SERIAL_H + +#include + +class SerialPortPrivate; +class QEvent; + +class SerialPort : public QObject +{ + Q_OBJECT +public: + SerialPort(QObject *parent); + ~SerialPort(); + bool openPort(const char *device, int baudrate, bool bXonXoff, int DTRtime); + void close(); + static QStringList devices(); + void writeLine(const char *data, unsigned timeRead); + void setTimeout(unsigned timeRead); + QByteArray readLine(); +signals: + void write_ready(); + void read_ready(); + void error(); +protected slots: + void timeout(); + void readReady(int); + void readTimeout(); +protected: + bool event(QEvent *e); + SerialPortPrivate *d; +}; + +#endif + diff --git a/plugins/sms/sms.cpp b/plugins/sms/sms.cpp new file mode 100644 index 0000000..ad0fc5e --- /dev/null +++ b/plugins/sms/sms.cpp @@ -0,0 +1,638 @@ +/*************************************************************************** + sms.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "sms.h" +#include "smssetup.h" +#include "serial.h" +#include "gsm_ta.h" +#include "core.h" + +#include "maininfo.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "clientmanager.h" + +#include +#include +#include +#include + +using namespace SIM; + +const unsigned COL_TYPE = 3; + +static DataDef _smsUserData[] = + { + { "", DATA_ULONG, 1, DATA(6) }, // Sign + { "", DATA_ULONG, 1, 0 }, // LastSend + { "", DATA_UTF, 1, 0 }, // Name + { "", DATA_UTF, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // Index + { "", DATA_ULONG, 1, 0 }, // Type + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +Plugin *createSMSPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new SMSPlugin(base); + return plugin; +} + +static PluginInfo info = + { + 0, + 0, + VERSION, + createSMSPlugin, + PLUGIN_PROTOCOL + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +unsigned SMSPlugin::SerialPacket = 0; + +static Message *createPhoneCall(Buffer *cfg) +{ + return new Message(MessagePhoneCall, cfg); +} + +static MessageDef defPhoneCall = + { + NULL, + NULL, + MESSAGE_INFO, + "Phone call", + "%n phone calls", + createPhoneCall, + NULL, + NULL + }; + +#if 0 +i18n("Phone call", "%n phone calls", 1); +#endif + +SMSPlugin::SMSPlugin(unsigned base) + : Plugin(base) +{ + SerialPacket = registerType(); + getContacts()->addPacketType(SerialPacket, "Serial port", true); + + Command cmd; + cmd->id = MessagePhoneCall; + cmd->text = I18N_NOOP("Phone call"); + cmd->icon = "phone"; + cmd->flags = COMMAND_DEFAULT; + cmd->param = &defPhoneCall; + EventCreateMessageType(cmd).process(); + + m_protocol = new SMSProtocol(this); + + qApp->installEventFilter(this); + setPhoneCol(); +} + +SMSPlugin::~SMSPlugin() +{ + removePhoneCol(); + delete m_protocol; + getContacts()->removePacketType(SerialPacket); + EventRemoveMessageType(MessagePhoneCall).process(); +} + +void SMSPlugin::setPhoneCol() +{ + QWidgetList list = QApplication::topLevelWidgets(); + Q_FOREACH(QWidget *w, list) { + QList l = qFindChildren(w); + Q_FOREACH(MainInfo *obj,l) { + setPhoneCol(obj); + } + } +} + +void SMSPlugin::removePhoneCol() +{ + QWidgetList list = QApplication::topLevelWidgets(); + Q_FOREACH(QWidget *w, list) { + QList l = qFindChildren(w); + Q_FOREACH(MainInfo *obj,l) { + removePhoneCol(obj); + } + } +} + +void SMSPlugin::setPhoneCol(MainInfo *w) +{ + w->lstPhones->addColumn(" "/*, 16*/); +} + +void SMSPlugin::removePhoneCol(MainInfo *w) +{ + //w->lstPhones->removeColumn(COL_TYPE); +} + +bool SMSPlugin::eventFilter(QObject *obj, QEvent *e) +{ + if (e->type() == QEvent::ChildAdded){ + QChildEvent *ce = static_cast(e); + if (ce->child()->inherits("MainInfo")) + setPhoneCol(static_cast(ce->child())); + } + return QObject::eventFilter(obj, e); +} + +SMSProtocol::SMSProtocol(Plugin *plugin) + : Protocol(plugin) +{ +} + +SMSProtocol::~SMSProtocol() +{ +} + +ClientPtr SMSProtocol::createClient(Buffer *cfg) +{ + ClientPtr sms = ClientPtr(new SMSClient(this, cfg)); + getClientManager()->addClient(sms); + return sms; +} + +static CommandDef sms_descr = + CommandDef ( + 0, + I18N_NOOP("SMS"), + "SMS", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + PROTOCOL_NOPROXY | PROTOCOL_TEMP_DATA | PROTOCOL_NODATA | PROTOCOL_NO_AUTH, + NULL, + QString::null + ); + +const CommandDef *SMSProtocol::description() +{ + return &sms_descr; +} + +static CommandDef sms_status_list[] = + { + CommandDef ( + STATUS_ONLINE, + I18N_NOOP("Online"), + "SMS_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_OFFLINE, + I18N_NOOP("Offline"), + "SMS_offline", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef () + }; + +const CommandDef *SMSProtocol::statusList() +{ + return sms_status_list; +} + +const DataDef *SMSProtocol::userDataDef() +{ + return _smsUserData; +} + +static DataDef smsClientData[] = + { +#ifdef WIN32 + { "Port", DATA_STRING, 1, "COM1" }, +#else + { "Port", DATA_STRING, 1, "cuaa0" }, +#endif + { "BaudRate", DATA_ULONG, 1, DATA(19200) }, + { "XonXoff", DATA_BOOL, 1, 0 }, + { "", DATA_ULONG, 1, 0 }, // Charge + { "", DATA_BOOL, 1, 0 }, // Charging + { "", DATA_ULONG, 1, 0 }, // Quality + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +SMSClient::SMSClient(Protocol *protocol, Buffer *cfg) + : TCPClient(protocol, cfg) +{ + load_data(smsClientData, &data, cfg); + m_ta = NULL; + m_call = NULL; + m_callTimer = new QTimer(this); + connect(m_callTimer, SIGNAL(timeout()), this, SLOT(callTimeout())); +} + +SMSClient::~SMSClient() +{ + free_data(smsClientData, &data); +} + +QByteArray SMSClient::getConfig() +{ + QByteArray cfg = TCPClient::getConfig(); + QByteArray my_cfg = save_data(smsClientData, &data); + if (!my_cfg.isEmpty()){ + if (!cfg.isEmpty()) + cfg += "\n"; + cfg += my_cfg; + } + return cfg; +} + +QByteArray SMSClient::model() const +{ + if (getState() == Connected) + return m_ta->model(); + return QByteArray(); +} + +QByteArray SMSClient::oper() const +{ + if (getState() == Connected) + return m_ta->oper(); + return QByteArray(); +} + +QString SMSClient::name() +{ + QString res = "SMS."; + if (getState() == Connected){ + res += model(); + res += " "; + res += oper(); + }else{ + res += getDevice(); + } + return res; +} + +QString SMSClient::dataName(void*) +{ + return QString(); +} + +bool SMSClient::isMyData(clientData*&, Contact*&) +{ + return false; +} + +bool SMSClient::createData(clientData*&, Contact*) +{ + return false; +} + +void SMSClient::setupContact(Contact*, void*) +{ +} + +bool SMSClient::send(Message*, void*) +{ + return false; +} + +bool SMSClient::canSend(unsigned type, void *data) +{ + if ((data == NULL) && (type == MessageSMS)) + return true; + return false; +} + +QWidget *SMSClient::setupWnd() +{ + return new SMSSetup(NULL, this); +} + +const unsigned MAIN_INFO = 1; + +static CommandDef cfgSmsWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "SMS", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef () + }; + +CommandDef *SMSClient::configWindows() +{ + QString title = name(); + int n = title.indexOf('.'); + if (n > 0) + title = title.left(n) + ' ' + title.mid(n + 1); + cfgSmsWnd[0].text_wrk = title; + return cfgSmsWnd; +} + +QWidget *SMSClient::configWindow(QWidget *parent, unsigned id) +{ + if (id == MAIN_INFO) + return new SMSSetup(parent, this); + return NULL; +} + +void SMSClient::packet_ready() +{ +} + +void SMSClient::disconnected() +{ + setStatus(STATUS_OFFLINE); +} + +void SMSClient::setStatus(unsigned status) +{ + if (status == STATUS_OFFLINE){ + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL) + contact->clientData.freeClientData(this); + if (m_ta){ + delete m_ta; + m_ta = NULL; + } + return; + } + if (m_ta) + return; + m_ta = new GsmTA(this); + connect(m_ta, SIGNAL(init_done()), this, SLOT(init())); + connect(m_ta, SIGNAL(error()), this, SLOT(error())); + connect(m_ta, SIGNAL(phonebookEntry(int, int, const QString&, const QString&)), this, SLOT(phonebookEntry(int, int, const QString&, const QString&))); + connect(m_ta, SIGNAL(charge(bool, unsigned)), this, SLOT(charge(bool, unsigned))); + connect(m_ta, SIGNAL(quality(unsigned)), this, SLOT(quality(unsigned))); + connect(m_ta, SIGNAL(phoneCall(const QString&)), this, SLOT(phoneCall(const QString&))); + if (!m_ta->open(qPrintable(getDevice()), getBaudRate(), getXonXoff())){ + error_state("Can't open port", 0); + return; + } +} + +void SMSClient::phonebookEntry(int index, int type, const QString &phone, const QString &name) +{ + bool bNew = false; + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + smsUserData *data; + ClientDataIterator itd(contact->clientData); + while ((data = tosmsUserData(++itd)) != NULL){ + if (name == data->Name.str()) + break; + } + if (data) + break; + } + if (contact == NULL){ + contact = getContacts()->contactByPhone(phone); + if (contact->getFlags() & CONTACT_TEMPORARY){ + bNew = true; + contact->setFlags(contact->getFlags() & ~CONTACT_TEMPORARY); + contact->setName(name); + } + } + QString phones = contact->getPhones(); + bool bFound = false; + while (!phones.isEmpty()){ + QString item = getToken(phones, ';', false); + QString number = getToken(item, ','); + if (number == phone){ + bFound = true; + break; + } + } + if (!bFound){ + phones = contact->getPhones(); + if (!phones.isEmpty()) + phones += ";"; + contact->setPhones(phones + phone + ",,2/-"); + } + smsUserData *data = tosmsUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + data->Phone.str() = phone; + data->Name.str() = name; + data->Index.asULong() = index; + data->Type.asULong() = type; + if (bNew){ + EventContact e(contact, EventContact::eChanged); + e.process(); + } +} + +QString SMSClient::getServer() const +{ + return QString::null; +} + +unsigned short SMSClient::getPort() const +{ + return 0; +} + +void SMSClient::socketConnect() +{ + connect_ready(); + setStatus(STATUS_ONLINE); +} + +void SMSClient::error() +{ + QTimer::singleShot(0, this, SLOT(ta_error())); +} + +void SMSClient::ta_error() +{ + error_state(I18N_NOOP("Port error"), 0); +} + +void SMSClient::init() +{ + m_status = STATUS_ONLINE; + setState(Connected); + m_ta->getPhoneBook(); +} + +void SMSClient::charge(bool bCharge, unsigned capacity) +{ + bool bChange = false; + if (bCharge != getCharging()){ + bChange = true; + setCharging(bCharge); + } + if (capacity != getCharge()){ + bChange = true; + setCharge(capacity); + } + if (bChange){ + EventClientChanged(this).process(); + } +} + +void SMSClient::quality(unsigned quality) +{ + if (quality != getQuality()){ + setQuality(quality); + EventClientChanged(this).process(); + } +} + +void SMSClient::phoneCall(const QString &number) +{ + if (m_call && (number == m_callNumber)) + return; + if (m_call){ + m_callTimer->stop(); + EventMessageDeleted(m_call).process(); + delete m_call; + m_call = NULL; + } + m_callNumber = number; + m_call = new Message(MessagePhoneCall); + if (!number.isEmpty()){ + bool bNew = false; + Contact *contact = getContacts()->contactByPhone(number); + if (contact->getFlags() & CONTACT_TEMPORARY){ + bNew = true; + contact->setFlags(contact->getFlags() & ~CONTACT_TEMPORARY); + contact->setName(number); + } + QString phones = contact->getPhones(); + bool bFound = false; + while (!phones.isEmpty()){ + QString item = getToken(phones, ';', false); + QString phone = getToken(item, ','); + if (number == phone){ + bFound = true; + break; + } + } + if (!bFound){ + phones = contact->getPhones(); + if (!phones.isEmpty()) + phones += ";"; + contact->setPhones(phones + number + ",,2/-"); + } + if (bNew){ + EventContact e(contact, EventContact::eChanged); + e.process(); + } + m_call->setContact(contact->id()); + } + m_call->setFlags(MESSAGE_RECEIVED | MESSAGE_TEMP); + EventMessageReceived e(m_call); + if (e.process()){ + m_call = NULL; + return; + } + m_bCall = false; + m_callTimer->start(12000); +} + +void SMSClient::callTimeout() +{ + if (m_bCall){ + m_bCall = false; + return; + } + if (m_call == NULL) + return; + EventMessageDeleted(m_call).process(); + delete m_call; + m_call = NULL; + m_callTimer->stop(); + m_callNumber = ""; +} + +smsUserData* SMSClient::tosmsUserData(SIM::clientData * data) +{ + // This function is used to more safely preform type conversion from SIM::clientData* into smsUserData* + // It will at least warn if the content of the structure is not smsUserData + // Brave wariors may uncomment abort() function call to know for sure about wrong conversion ;-) + if (! data) return NULL; + if (data->Sign.asULong() != SMS_SIGN) + { + QString Signs[] = { + "Unknown(0)" , // 0x0000 + "ICQ_SIGN", // 0x0001 + "JABBER_SIGN", // 0x0002 + "MSN_SIGN", // 0x0003 + "Unknown(4)" // 0x0004 + "LIVEJOURNAL_SIGN",// 0x0005 + "SMS_SIGN", // 0x0006 + "Unknown(7)", // 0x0007 + "Unknown(8)", // 0x0008 + "YAHOO_SIGN" // 0x0009 + }; + QString Sign; + if (data->Sign.toULong()<=9) // is always >=0 as it is unsigned int + Sign = Signs[data->Sign.toULong()]; + else + Sign = QString("Unknown(%1)").arg(Sign.toULong()); + + log(L_ERROR, + "ATTENTION!! Unsafly converting %s user data into SMS_SIGN", + qPrintable(Sign)); +// abort(); + } + return (smsUserData*) data; +} + +QWidget *SMSClient::searchWindow(QWidget*) +{ + return NULL; +} + diff --git a/plugins/sms/sms.h b/plugins/sms/sms.h new file mode 100644 index 0000000..862ed57 --- /dev/null +++ b/plugins/sms/sms.h @@ -0,0 +1,133 @@ +/*************************************************************************** + sms.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SMS_H +#define _SMS_H + +#include "contacts/client.h" +#include "log.h" +#include "socket/socket.h" +#include "socket/tcpclient.h" + +class SMSProtocol; +class GsmTA; +class MainInfo; + +const unsigned long SMSCmdBase = 0x00080000; +const unsigned long MessagePhoneCall = SMSCmdBase; + +class SMSPlugin : public QObject, public SIM::Plugin +{ + Q_OBJECT +public: + SMSPlugin(unsigned); + virtual ~SMSPlugin(); + static unsigned SerialPacket; + void setPhoneCol(); + void setPhoneCol(MainInfo *w); + void removePhoneCol(); + void removePhoneCol(MainInfo *w); +protected: + bool eventFilter(QObject *obj, QEvent *e); + SMSProtocol *m_protocol; +}; + +class SMSProtocol : public SIM::Protocol +{ +public: + SMSProtocol(SIM::Plugin *plugin); + ~SMSProtocol(); + SIM::ClientPtr createClient(Buffer *cfg); + const SIM::CommandDef *description(); + const SIM::CommandDef *statusList(); + const SIM::DataDef *userDataDef(); +}; + +struct SMSClientData +{ + SIM::Data Device; + SIM::Data BaudRate; + SIM::Data XonXoff; + SIM::Data Charge; + SIM::Data Charging; + SIM::Data Quality; +}; + +const unsigned SMS_SIGN = 6; + +struct smsUserData : public SIM::clientData +{ + SIM::Data Name; + SIM::Data Phone; + SIM::Data Index; + SIM::Data Type; +}; + +class SMSClient : public SIM::TCPClient +{ + Q_OBJECT +public: + SMSClient(SIM::Protocol *protocol, Buffer *cfg); + ~SMSClient(); + PROP_STR(Device); + PROP_ULONG(BaudRate); + PROP_BOOL(XonXoff); + PROP_ULONG(Charge); + PROP_BOOL(Charging); + PROP_ULONG(Quality); + QByteArray model() const; + QByteArray oper() const; + smsUserData* tosmsUserData(SIM::clientData * data); +protected slots: + void error(); + void init(); + void ta_error(); + void charge(bool, unsigned); + void quality(unsigned); + void phoneCall(const QString&); + void phonebookEntry(int, int, const QString&, const QString&); + void callTimeout(); +protected: + virtual QString getServer() const; + virtual unsigned short getPort() const; + virtual void setStatus(unsigned status); + virtual void disconnected(); + virtual QByteArray getConfig(); + virtual QString name(); + virtual QString dataName(void*); + virtual bool isMyData(SIM::clientData*&, SIM::Contact*&); + virtual bool createData(SIM::clientData*&, SIM::Contact*); + virtual void setupContact(SIM::Contact*, void *data); + virtual bool send(SIM::Message*, void *data); + virtual bool canSend(unsigned type, void *data); + virtual void packet_ready(); + virtual void socketConnect(); + virtual SIM::CommandDef *configWindows(); + virtual QWidget *configWindow(QWidget *parent, unsigned id); + virtual QWidget *setupWnd(); + virtual QWidget *searchWindow(QWidget*); + virtual void contactInfo(void *,unsigned long &,unsigned int &,QString &,QSet *) {} + QString m_callNumber; + QTimer *m_callTimer; + SIM::Message *m_call; + bool m_bCall; + GsmTA *m_ta; + SMSClientData data; +}; + +#endif + diff --git a/plugins/sms/sms.rc b/plugins/sms/sms.rc new file mode 100644 index 0000000..45f7abe --- /dev/null +++ b/plugins/sms/sms.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "SMS plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "sms\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "sms.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/sms/sms.vcproj b/plugins/sms/sms.vcproj new file mode 100644 index 0000000..90cec8c --- /dev/null +++ b/plugins/sms/sms.vcproj @@ -0,0 +1,550 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/sms/smssetup.cpp b/plugins/sms/smssetup.cpp new file mode 100644 index 0000000..9a1e8d1 --- /dev/null +++ b/plugins/sms/smssetup.cpp @@ -0,0 +1,89 @@ +/************************************************************************** + smssetup.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "misc.h" + +#include "sms.h" +#include "smssetup.h" +#include "serial.h" + +using namespace SIM; + +SMSSetup::SMSSetup(QWidget *parent, SMSClient *client) : QWidget(parent) +{ + setupUi(this); + m_client = client; + QStringList res = SerialPort::devices(); + unsigned n = 0; + unsigned cur = 0; + if (m_client->getState() == Client::Connected){ + cmbPort->insertItem(INT_MAX,m_client->getDevice()); + cur = 0; + n++; + } + for (QStringList::Iterator it = res.begin(); it != res.end(); ++it, n++){ + if ((*it) == m_client->getDevice()) + cur = cmbPort->count(); + cmbPort->insertItem(INT_MAX,*it); + } + cmbPort->setCurrentIndex(cur); + for (unsigned i = 0; i < (unsigned)(cmbBaud->count()); i++){ + if (cmbBaud->itemText(i).toULong() == m_client->getBaudRate()){ + cmbBaud->setCurrentIndex(i); + } + } + chkXonXoff->setChecked(m_client->getXonXoff()); + if (client->getState() == Client::Connected){ + if (client->getCharging()){ + lblCharge->setText(i18n("Charging:")); + }else{ + lblCharge->setText(i18n("Battery:")); + } + barCharge->setValue(client->getCharge()); + barQuality->setValue(client->getQuality()); + edtModel->setReadOnly(true); + edtModel->setText(client->model()); + edtOper->setText(client->oper()); + }else{ + tabSMS->removeTab(tabSMS->indexOf(tabPhone)); + } + QTimer::singleShot(0, this, SLOT(init())); +} + +void SMSSetup::apply() +{ + m_client->setDevice(cmbPort->currentText()); + m_client->setBaudRate(cmbBaud->currentText().toULong()); + m_client->setXonXoff(chkXonXoff->isChecked()); +} + +void SMSSetup::apply(Client*, void*) +{ +} + +void SMSSetup::init() +{ + emit okEnabled(true); +} + diff --git a/plugins/sms/smssetup.h b/plugins/sms/smssetup.h new file mode 100644 index 0000000..37db944 --- /dev/null +++ b/plugins/sms/smssetup.h @@ -0,0 +1,45 @@ +/*************************************************************************** + smssetup.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SMSSETUP_H +#define _SMSSETUP_H + +#include + +#include "contacts.h" + +#include "ui_smssetupbase.h" + +class SMSClient; + +class SMSSetup : public QWidget, public Ui::SMSSetup +{ + Q_OBJECT +public: + SMSSetup(QWidget*, SMSClient*); +signals: + void okEnabled(bool); +public slots: + void init(); + void apply(); + void apply(SIM::Client*, void*); +protected: + SMSClient *m_client; +}; + +#endif + diff --git a/plugins/sms/smssetupbase.ui b/plugins/sms/smssetupbase.ui new file mode 100644 index 0000000..b2429f4 --- /dev/null +++ b/plugins/sms/smssetupbase.ui @@ -0,0 +1,304 @@ + + + SMSSetup + + + + 0 + 0 + 334 + 241 + + + + SMSSetup + + + + 6 + + + 11 + + + + + + Hand&y + + + + 11 + + + 6 + + + + + Port: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Baudrate: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + 6 + + + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + 6 + + + 0 + + + + + + 115200 + + + + + 38400 + + + + + 19200 + + + + + 9600 + + + + + 4800 + + + + + 2400 + + + + + 1200 + + + + + 600 + + + + + 300 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Software handshake + + + + + + + + &Phone + + + + 11 + + + 6 + + + + + Model: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Signal quality: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Operator: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + 0 + + + + + + + + + + 0 + + + + + + + + + + + + + + + diff --git a/plugins/sms/xpm/simcard.xpm b/plugins/sms/xpm/simcard.xpm new file mode 100644 index 0000000..abe9981 --- /dev/null +++ b/plugins/sms/xpm/simcard.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static const char *simcard[]={ +"16 16 4 1", +"# c #040000", +". c None", +"b c #dcd620", +"a c #ffffff", +"................", +"....#########...", +"...#aaaaaaaa#...", +"..#aaaaaaaaa#...", +"..#aaaaaaaaa#...", +"..#aabbbbbaa#...", +"..#aab...baa#...", +"..#aabbbbbaa#...", +"..#aab...baa#...", +"..#aabbbbbaa#...", +"..#aaaaaaaaa#...", +"..#aaaaaaaaa#...", +"..#aaaaaaaaa#...", +"..#aaaaaaaaa#...", +"..###########...", +"................"}; diff --git a/plugins/sound/CMakeLists.txt b/plugins/sound/CMakeLists.txt new file mode 100644 index 0000000..13f1729 --- /dev/null +++ b/plugins/sound/CMakeLists.txt @@ -0,0 +1,53 @@ +################# +# sound library # +################# +SET(sound_SRCS + sound.cpp + soundconfig.cpp + sounduser.cpp +) + +SET(sound_HDRS + sound.h + soundconfig.h + sounduser.h +) + +SET(sound_UICS + soundconfigbase.ui + sounduserbase.ui +) + +SET(sound_LIBS + ${QT_PHONON_LIBRARY} +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +IF(QT_PHONON_FOUND) + SIM_ADD_PLUGIN(sound) +ELSE(QT_PHONON_FOUND) + MESSAGE(STATUS "Cannot build sound plugin because Phonon is missing on your system") +ENDIF(QT_PHONON_FOUND) + +# install new sounds with known licence +INSTALL(FILES sounds/added.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/alert.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/auth.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/authrequest.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/contacts.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/contactrequest.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/deleted.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/error.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/file.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/filedone.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/mailpager.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/message.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/msgsent.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/refused.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/sms.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/startup.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/url.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/vip-online.ogg DESTINATION ${SIM_SOUND_DIR}) +INSTALL(FILES sounds/web.ogg DESTINATION ${SIM_SOUND_DIR}) diff --git a/plugins/sound/ogg.rules b/plugins/sound/ogg.rules new file mode 100644 index 0000000..7c80c05 --- /dev/null +++ b/plugins/sound/ogg.rules @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/plugins/sound/sound.cpp b/plugins/sound/sound.cpp new file mode 100644 index 0000000..6bf564c --- /dev/null +++ b/plugins/sound/sound.cpp @@ -0,0 +1,287 @@ +/*************************************************************************** + sound.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include "simapi.h" + +#include "exec.h" +#include "log.h" +#include "core.h" + +#include "sound.h" +#include "soundconfig.h" +#include "sounduser.h" +#include "contacts/contact.h" +#include "contacts/group.h" +#include "profile.h" +#include "profilemanager.h" + +using namespace std; +using namespace SIM; + +const unsigned CHECK_SOUND_TIMEOUT = 200; +const unsigned WAIT_SOUND_TIMEOUT = 1000; + +Plugin *createSoundPlugin(unsigned base, bool bFirst, Buffer *config) +{ + return new SoundPlugin(base, bFirst, config); +} + +static PluginInfo info = + { + I18N_NOOP("Sound"), + I18N_NOOP("Plugin provides sounds on any events"), + VERSION, + createSoundPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +static SoundPlugin *soundPlugin = NULL; + +static QWidget *getSoundSetup(QWidget *parent, SIM::PropertyHubPtr data) +{ + return new SoundUserConfig(parent, data, soundPlugin); +} + +SoundPlugin::SoundPlugin(unsigned base, bool bFirst, Buffer *config) + : QObject(), Plugin(base) +{ + m_propertyHub = SIM::PropertyHub::create("sound"); + soundPlugin = this; + m_media = Phonon::createPlayer(Phonon::NotificationCategory); + + CmdSoundDisable = 1000022; // FIXME + + Command cmd; + cmd->id = 0; + cmd->flags = COMMAND_CONTACT; + cmd->text = I18N_NOOP("&Sound"); + cmd->icon = "sound"; + cmd->accel = "sound"; + cmd->icon_on = QString(); + cmd->param = (void*)getSoundSetup; + EventAddPreferences(cmd).process(); + + cmd->id = CmdSoundDisable; + cmd->text = I18N_NOOP("&Sound"); + cmd->icon = "nosound"; + cmd->icon_on = "sound"; + cmd->bar_id = ToolBarMain; + cmd->bar_grp = 0; + cmd->menu_id = 0; + cmd->menu_grp = 0; + cmd->flags = COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); +} + +SoundPlugin::~SoundPlugin() +{ + soundPlugin = NULL; +} + +QWidget *SoundPlugin::createConfigWindow(QWidget *parent) +{ + return new SoundConfig(parent, this); +} + +bool SoundPlugin::processEvent(SIM::Event *e) +{ + switch (e->type()) + { + case eEventLoginStart: + { + playSound(value("StartUp").toString()); + break; + } + case eEventPluginLoadConfig: + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("sound"); + if(!hub.isNull()) + setPropertyHub(hub); + if(!value("StartUp").isValid()) + setValue("StartUp", "sounds/startup.ogg"); + if(!value("MessageSent").isValid()) + setValue("MessageSent", "sounds/msgsent.ogg"); + if(!value("FileDone").isValid()) + setValue("FileDone", "sounds/filedone.ogg"); + break; + } + case eEventContact: + { + EventContact *ec = static_cast(e); + if(ec->action() != EventContact::eOnline) + break; + Contact *contact = ec->contact(); + bool disable = contact->getUserData()->root()->value("sound/Disable").toBool(); + QString alert = contact->getUserData()->root()->value("sound/Alert").toString(); + if(alert.isEmpty()) + alert = getContacts()->getUserData()->root()->value("sound/Alert").toString(); + if (!alert.isEmpty() && !disable) + { + EventPlaySound(alert).process(); + } + break; + } + case eEventMessageSent: + { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + QString err = msg->getError(); + if (!err.isEmpty()) + return false; + QString sound; + if (msg->type() == MessageFile) + { + sound = value("FileDone").toString(); + } + else if ((msg->getFlags() & MESSAGE_NOHISTORY) == 0) + { + if ((msg->getFlags() & MESSAGE_MULTIPLY) && ((msg->getFlags() & MESSAGE_LAST) == 0)) + return false; + sound = value("MessageSent").toString(); + } + if (!sound.isEmpty()) + { + EventPlaySound(sound).process(); + } + break; + } + case eEventMessageReceived: + { + EventMessage *em = static_cast(e); + Message *msg = em->msg(); + if(msg->type() == MessageStatus) + return false; + Contact *contact = getContacts()->contact(msg->contact()); + bool nosound, disable; + if(contact) + { + nosound = contact->getUserData()->root()->value("sound/NoSoundIfActive").toBool(); + disable = contact->getUserData()->root()->value("sound/Disable").toBool(); + } + else + { + nosound = getContacts()->getUserData()->root()->value("sound/NoSoundIfActive").toBool(); + disable = getContacts()->getUserData()->root()->value("sound/Disable").toBool(); + } + if(!disable && nosound) + { + EventActiveContact e; + e.process(); + if (e.contactID() == contact->id()) + disable = true; + } + if(!disable) + { + QString sound = messageSound(msg->baseType(), contact->id()); + playSound(sound); + } + break; + } + case eEventPlaySound: + { + EventPlaySound *s = static_cast(e); + playSound(s->sound()); + return true; + } + default: + break; + } + return false; +} + +void SoundPlugin::playSound(const QString& path) +{ + QString snd; + log(L_DEBUG, "Sound: %s", qPrintable(path)); + QDir d(path); + if(d.isRelative()) + snd = app_file(path); + else + snd = path; + m_media->setCurrentSource(Phonon::MediaSource(snd)); + Phonon::State state = m_media->state(); + if( state == Phonon::ErrorState ) { + QString sError = m_media->errorString(); + log(L_DEBUG, "Sound playing error: %s", qPrintable(sError)); + return; + } + m_media->play(); +} + +QString SoundPlugin::messageSound(unsigned type, unsigned long contact_id) +{ + SIM::PropertyHubPtr data; + if(!contact_id) + { + data = getContacts()->userdata(); + } + else + { + Contact* c = getContacts()->contact(contact_id); + if(c) + { + data = c->getUserData()->root(); + if(!data->value("sound/override").toBool()) + { + Group* g = getContacts()->group(c->getGroup(), false); + if(g->userdata()->value("sound/override").toBool()) + data = g->userdata(); + else + data = getContacts()->userdata(); + } + } + } + QString sound; + if(data) + { + sound = data->value("sound/Receive" + QString::number(type)).toString(); + } + if(sound == "(nosound)") + { + return QString(); + } + return sound; +} + +void SoundPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr SoundPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant SoundPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void SoundPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} + +// vim : expandtab + diff --git a/plugins/sound/sound.h b/plugins/sound/sound.h new file mode 100644 index 0000000..5c70513 --- /dev/null +++ b/plugins/sound/sound.h @@ -0,0 +1,69 @@ +/*************************************************************************** + sound.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SOUND_H +#define _SOUND_H + +#include "simapi.h" + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" + +#include +#include +#include +#include "phonon/mediaobject.h" +#include "phonon/audiooutput.h" + + +class CorePlugin; +class QTimer; +class QSound; + +class SoundPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + SoundPlugin(unsigned, bool, Buffer*); + virtual ~SoundPlugin(); + + void playSound(const QString& path); + + SIM::SIMEvent EventSoundChanged; + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +protected: + QString messageSound(unsigned type, unsigned long contact_id); + virtual bool processEvent(SIM::Event *e); + virtual QWidget *createConfigWindow(QWidget *parent); + friend class SoundConfig; + friend class SoundUserConfig; + +private: + Phonon::MediaObject* m_media; + unsigned long CmdSoundDisable; + SIM::PropertyHubPtr m_propertyHub; + +}; + +#endif + diff --git a/plugins/sound/sound.rc b/plugins/sound/sound.rc new file mode 100644 index 0000000..f734180 --- /dev/null +++ b/plugins/sound/sound.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Sound plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "sound\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "sound.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/sound/sound.vcproj b/plugins/sound/sound.vcproj new file mode 100644 index 0000000..5d4c4df --- /dev/null +++ b/plugins/sound/sound.vcproj @@ -0,0 +1,613 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/sound/soundconfig.cpp b/plugins/sound/soundconfig.cpp new file mode 100644 index 0000000..5efdd27 --- /dev/null +++ b/plugins/sound/soundconfig.cpp @@ -0,0 +1,78 @@ +/*************************************************************************** + soundconfig.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "simapi.h" + +#include + +#include +#include + +#include "simgui/editfile.h" +#include "contacts.h" +#include "misc.h" + +#include "soundconfig.h" +#include "sounduser.h" +#include "sound.h" + +using SIM::getContacts; + +SoundConfig::SoundConfig(QWidget *parent, SoundPlugin *plugin) + : QWidget(parent) + , m_plugin(plugin) + , user_cfg(NULL) +{ + setupUi(this); + + edtStartup->setText(plugin->value("StartUp").toString()); + edtFileDone->setText(plugin->value("FileDone").toString()); + edtSent->setText(plugin->value("MessageSent").toString()); + + for (QObject *p = parent; p != NULL; p = p->parent()) + { + QTabWidget *tab = qobject_cast(p); + if (!tab) + continue; + + user_cfg = new SoundUserConfig(tab, getContacts()->userdata(), plugin); + tab->addTab(user_cfg, i18n("Events")); + tab->adjustSize(); + break; + } +} + +SoundConfig::~SoundConfig() +{ +} + +void SoundConfig::apply() +{ + if(user_cfg) + { + SIM::PropertyHubPtr data = getContacts()->userdata(); + user_cfg->apply(data, true); + } + m_plugin->setValue("StartUp", edtStartup->text()); + m_plugin->setValue("FileDone", edtFileDone->text()); + m_plugin->setValue("MessageSent", edtSent->text()); +} + +void SoundConfig::artsToggled(bool) +{ +} + diff --git a/plugins/sound/soundconfig.h b/plugins/sound/soundconfig.h new file mode 100644 index 0000000..ef54b06 --- /dev/null +++ b/plugins/sound/soundconfig.h @@ -0,0 +1,44 @@ +/*************************************************************************** + soundconfig.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SOUNDCONFIG_H +#define _SOUNDCONFIG_H + +#include "ui_soundconfigbase.h" + +class SoundUserConfig; +class SoundPlugin; + +class SoundConfig : public QWidget, public Ui::SoundConfigBase +{ + Q_OBJECT +public: + SoundConfig(QWidget *parent, SoundPlugin *plugin); + ~SoundConfig(); +signals: + void addTab(const char *text, QWidget *w); +public slots: + void apply(); +protected slots: + void artsToggled(bool); +protected: + SoundPlugin *m_plugin; + SoundUserConfig *user_cfg; +}; + +#endif + diff --git a/plugins/sound/soundconfigbase.ui b/plugins/sound/soundconfigbase.ui new file mode 100644 index 0000000..6cb986a --- /dev/null +++ b/plugins/sound/soundconfigbase.ui @@ -0,0 +1,98 @@ + + + SoundConfigBase + + + + 0 + 0 + 409 + 204 + + + + Form1 + + + + 11 + + + 6 + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + File transfer done: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Message sent: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + Sound on startup: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + + + + + EditSound + QWidget +
    simgui/editfile.h
    +
    +
    + + +
    diff --git a/plugins/sound/sounds/added.ogg b/plugins/sound/sounds/added.ogg new file mode 100644 index 0000000000000000000000000000000000000000..501a635f64f16c89ec58f9e551a7c88e8684b157 GIT binary patch literal 103653 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%0DiK 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%0DFCus8}$v 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

    Y&Q6iu_NL?~9iO+nOs6)Gu3K3f&SB7}n# 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 D{8LS` literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/alert.ogg b/plugins/sound/sounds/alert.ogg new file mode 100644 index 0000000000000000000000000000000000000000..155dae8c7acc7b832ab47746f038796e7ae9c6d6 GIT binary patch literal 51573 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 literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/auth.ogg b/plugins/sound/sounds/auth.ogg new file mode 100644 index 0000000000000000000000000000000000000000..660b6bf58ba991707f5092111b38dddbab9fafbf GIT binary patch literal 62278 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 literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/authrequest.ogg b/plugins/sound/sounds/authrequest.ogg new file mode 100644 index 0000000000000000000000000000000000000000..09df55ebe64c6aa1f00b36620ddf9992847a0594 GIT binary patch literal 35026 zcmeEuWmr_-yXcx3hVC3dQjicS2}Ohf5lKNp>9Rm16eI+Op#%v*L_u<-JCu|fKu|$i zK@=E5TIr6NyYcrwalhR2+~=J8?e1qYv-aL=ul26CV+{s(?-~O*_}4+C`lq2tO??5z z3-fY&=-}jWd<(8o{I4$i|9scN436LY_v83Y7<4sRvEssbhV;K3Er@>x;(?xP{2byfVKj9kWsV#wD<&y1WnZ^j+B7`AXQd&2mcj;LB~sz*`Pt5-Lp z3OwU==7etPscVUa#p_Vy7++P_l7BU1B*x=mWOPq$9-30Unm?2-xG&E17*0Hzk?Sor zFa&@x@(n5y9{Qvh4rBo!!-+nd5`A{^eEdyq_P<>qd@}-ocW2dp&ic7RNOwR&cTnS+ zX}~uHQ`7B7*2BjqzuYah<5AICd9QQ0_*-djp(yFhk$@jUk)~)XBjVrC0~|!pN1Uph z_4jxda_79Gc>AoUyWqE3ZCCNx*;J37^CBr89p~m!Jt808k#U6jrFt-j+!6bymHuH? z&AIUSUdQ>okO!J5s9$pBtlB+=A?O}^W$yWVlI>7SaAsE9Me-Ze>NyW}`TJ4Gk>}xl z^?2mW?O6*~bq=Vd!kOpip?-YtKl=TH9%#L4D1|2v^7yqfvVu^TBb+{EQ;cP`2|3a} zq%OFUmG#_ckw3wtLt8BEpOsSrAP~xGq$Lpcua5|UCn$$cVtJ{-)Zzu%nUS)c67Rmq zb{&5#mA~sz`Yru|@e*xGC9|%6)i<-7C3SPD&h!HoP9;@CI$}8xmBs$z4-1iplJi!a zn&$Dy5dyiX4?D&3aqz$BgdQG?g7Rk%jVqr2aenkrzLKD!4V{&GU0?MK*i65@w6+|& zJ+|#)&*3$;^N6tXXnHuz-u%_=|Ly!|>Cj5BjOvvCEF=eY^NY+J?uDWHzb%s=nh<~O zMEe7wD-VS}$4h9xkkfsq+&!qQzo~JJRe#Xr@(s_+W0jXj67+{X^+!BS&8w`_V~t2kx{V;~=JoIR0O2G}wd?YTb|g&jbKKTByxP;);iy zc7lm+m5F|pi7uO|f$4vB$m7mlyuJw{Wy(H2)-WT$ass0{WwQ(-+4EL#G04%L54- z08VHRNC4n2q&o=d#sRr&WB@=GlIj0E+JF5N4UL9H05q2BHm)!3B|x(RteT86ot-)8 zf;)1d2SGZ;sxlUm4oL2i^pG}GaMY2YH+1}@1Nf-{9w!PZ_;dU6^o&{cSt2r>s39%t4gh7jnz6$JETr7vKmZ2FuT)4FY$*4# zTplzrbxfXnnkgEY>r^N%*S+yq*~^)-CC~aE-z+FBq}Jb1zQ%go(=_b3XEM~YaH;j* zdVYH(5Si(ieB5*CJsPqUa*%qo=78o-&MkajDuK8r2U!o(;g`4Vk_(|@>HS+;Lw%?Z zbO&4b9=eA5n3zJ&#>?BB6Od}}e0%>Vuo`}Jd!!oDo+r*ht_w;{gwvGWK8uQj_jnCt z;2K0S89lMw1baPoQ31I~ZA!6FJsq8bmnLdj!Z}9blm*!)I+{6rFftNn3pLRZ z&jFwuK>__8(-}fLFXRkF7)8r;q$U`Nb)52KIjrhBVxb8}lwvuI%#dlDfLstebxu*aTbBVN1U(3|AJsN-~|I$h=?e?q)PRAWMqwsuJs%1@jpE8a*~W_w&$OgQJe z!|%qtIQ3^|I==h$%H*(H7FF!n+|;S~hPt`ZxP!V`R53K}w<1%0-T4_3*eRR?Xrb@r zO0C-cW_FMt0>eUHR4eM(VLTRqt2&=i9zAN50-=mLVw}*uW)uwixu3@=d6rk(gN6 zv6l)Bpd*~~x5cQVm6Hvz?eRpEISC0y)WQkSYj3jSAwGq`pnQ{UVkBOWz^qOw92&2q zBlgln=Xg*^%LW~5Stif;YqyyclHDg^5U>B^lW|h;B)sCr#y$LM5q=_+)sp7CsIsW2q)0RSzEjfl8Y+ByY4dFf_IR@*c}7$WDBnnvKg#f0dq? zmRXWqko&HnyrR7DS6}?A#*NURi^^EiUD}CSD+cfV{K_a1A|b(h+mA1>vxu6j^XT+6 zOZE#X${e86760l)eG4|Umhejn74b1*?%;k6ctz1erM~ek}Cmx9V={Mtj^t&Oy#HviKn=L0C`tvXuX+Fh1JQAj_C+2>d1%w zc*((?Xrf!IWr9T)QW$Z?PF+^+dQCqW>hNhN>}{ib!z>rGjO59$ zVGBzZC#gmG$#0{V$S4>M0^gO-H8JO+t%-y7s1uQF9Za3kI#-X+Q(e;wY*MFjV#kvxzyx!d3A2~1k?ETG<-I*JW4^)G)Jm>T> zw_nE>TQpdA|DanT6Ed|JXnzPJS`wKKSd6=uSx&l;cU+Jl<|K-ARxTr9lk>z!BI39- z;o5Z`DLRqSP_9r?M#TE{9~Z3ws|y@_y`ZR-$mD)rnxXHA3lf#~JaWKaT8pI2uH$|p zt5f2g7Pj|fCyA@P=q6je$GInO>7%7D+HSaIY<|?cQ#@LqUU)Uw-d`f^QgwaFO5qQ+ zt6kyF$<$elw8N<2DM5Z<<2+tDG1^cx6oAXtryRCgV;D{JW~(Rg=X~fVY|l-dNG$>R22Z7i&T8=%d7u`jJqV8Z_~C72C-EaFaF0C-DSrSd!qX7~m&OSDP z=1!8}#AL7yU0OJ?{zGTuEMe!)s0=;p>$StJP11G`#U;gp9?QAmZi23nip%SdYwzxf zc1(20l;tGoe0Zt$@VqI@x>Xbk2Epe!wO=Y`MEpQ|j%s*fU8KRv;YMrMkcoT!(byJT z1T;*va>3h4fw$IIzMrSL#MAwVza(S5Px_bN#Xp^>IYidfTWjv3 z|WFawj`iT3ZbXt{B#O)8m zq*hA%_V;&llE|iwT`PHSYjn!k-#VR<7RrDWFN9MX^v|i53UBhA*RPfDdS>0<@E9~K4-?oxx|CVfSvQhu7V7s~FKQ>c37P+zG zZS^koTX}HaO&X0UYB8Y=3i3oV|tvJyK!JN!!^GE zdssncjNn76fWQ!Wbj5z`plkE99kSU~06w$OeZSR>Kpl~Q72S2n*ZBD348Zmuu3(*T zYvP}xO(f?}+7x~m_gh`|3&<_#CcQ}eQs7@?d@6y^kmY6GIkA$}sE~T`&PU9~UPS9B z%=IVh)ohm}@;;(aPp>`O6qTH%rs8OFCX&@y^Ewwq2*3_sDe_nw7_P5q$=+{RCaoBP zg=ttMjsMpZQmb;`v6M_;g2dE#zSf#4q74qbeCJBZd4?IvwYXr)Hm-1hy^v7~fX{kz zA|4Bcl-L!+D)W~31yge+!pIL}`7f&8Io9{{J}P^C3BRi}I{Hv=%S@TiCRg6(=F8Ka z@8x4ysqQvkkwZ<77rh5WKTOD+n3q#N>?GGC+0u_Q`fZXcUmG9V$vwp%m7!z!dCMd= zx6Y=zs$F5^EG7efJM4EY~o0Q?YMQ*_BLtp7B` zjJ(>HBA2ebSB$zQWCfc1F)4GgDMg6riBNZnDBIl!Kb)R0R0Hi3qs=`Tw2x~JZqh_& zgvG+=U>u{tNPdJCDdR2i#_C=CJ3ff&PEF_L`(UU;C9++E$B_5L+6d*pS9^B)fH(`l z&%Q%$FMN73dQoL@zG=2isb(o#CwAceYhxv1MxlI@imX&OoV#yn_})H#lqaV#@2lzM zn=g}QPEMba=KByV>uzlNAc$JUpNOxC70V)aa54v5tiSXxE>4LLlu7wIQC8Jd%ZFp= zv$W{CaDB?zpUjjgwYlR=J{Ojfg=8>oFc(d~ss#Sryv4>*a33hcaGQT17jajr5z0(N z_t?PPe_en;#`MHq&VFtLZ_oDqq7-OBP)ZP+xq6qBFLR%_=83kY*5YQe?0`k5s{H8C znZYs79@{|WSUQrPt)6M%4^K0;w6c3uZKx>u2Fx}*N!WK$F&suVk1LZnm8T^o<>YD;2H{nNow%@o;yL9LL$}HhNxGe9LaUYf2<{Q1| z@wNf;#v{Dtr5BS%OUoZbiamj0awE zPnu`_qTlQW0b~9^24J^Hhpr6hdKM7+4hoC01gRBRU+08)>2UU(jC!?OHKyy7FI2crz_H~r@)QK($!fc{3pXbho`V142 zF0dys1>3I0H1?R}ejrq8pJF^QrfLZu&&%|!bEL!y5&+@?r&&lSNlticW`z&->m29` zbbg%w*ze41MqLi9^1^2T9QTs^5a9ZS&hx#)46lfj_kKPvTBD1SG*xBR8xs~$o{l;>fsF`H7x1*yT zAw54woFMX)OPvJK!*!w6X)j~dVwlh^M{FRDxZ?>cU;Dy=#Kn>z<>RP$xK|5FQ=eNm zQ5idXu`x)lfp{2y?(UbpyT21INK;YVsQIu-*{)Ve|8rnZ$}fjewUI zi6{j7838gld|Ez69D_R$$n|0mv(Hl=yozu(2Rp*j5sfDZrX`7;&riWj1%OBV-@=A*GI}9I!8t2M8 zo6WmUlJ6o$Rnku5Sv=>ma#`Hv&(Rf|hqRJnMe3$SkZ@05di-=_8}qaKT2Vc}D$F!s zy9W(WP$vh;IgWJ5jkMdk0Rz~Ym3_y%kX8jpNgM|V!y*PhhDL!kXP5_+514QF9xMi&Y35$$x)s&&W=Bb9-GiYD(KgU0M>EWpKkA17$lfLLKmjm zRBOq<`#TpOaaB>|#*h5q?<-@Bj%9|P>Q$YkH!tn`x?Z3zdYI!Q-9%Dm9bCNE9sZMg zam#El)9*zbg6T4UEr1aGbk57^>#|>$%JRT>K}@&7;|m}4Vh&SgE^>#i$h`ah$8D|q z&m{_;+MK|qmWLDJTlX(vs8{9A6?1;aflkt(d9EaQh>*6No|}S7&DT0%C!n$~w(cS? zKnMC)QcQG1s=$9~#N`Gbu^!U7lFGx2Bo5g8!*^e<7#bW=STNGv6Mg0Gr@(GDwoGI$ zdb62&3B@&xvMts#@2cGqoDq4RRQ#CDf?T~LtjYw8M>T!k@j4%AZo7Y$+wPiLt6YlW zWt*lw)UF}n>@PvhvrQy1Y@(``P2L3`E_Q_T5Cr4M$ES5$@(7$WVpT~XuuaLX+ZNxt zPs0aOU?`;p+=&WennD2YDO9)nDcYKE`}fTFd1z=CO%W& z4>Nz>efOX}Z{{K*Tffki5QxDxqgN+*X|FmD6|2GINFteKb=+L;k`(x^A6>miE%arC zDGTDkK0wtF`N5}6Rgl_qs0K4Tf@W6^zziP*66c^MVgIXN*(iJ}dw_nT`3uk7t zV-qaqMQDE1e9r!A)6h&{$0PRDvi16m;;v9A6Ne1vD=mwc*>K*}rlk~)i4Og=r6$C^ z6z13C8$21#@AO;4iAN`%rOZ5y;>%E?VE+EA-MGbv@>7|jGQWLyG95MgwFaZA;KH2S zcYY-3`GZycIsfNU>3WX+o48w$P*#TnV09z{9zu%FXLizsFO^u52x$@G@2o2%6bwI- zQL{}B`gXEO9DR|F;hkx`&Cv+t%WSgw&TJ-Q)s#Rz9+t0M?VlQN3-^7%B2`i`$teu@ zupigUWDwESikyww59)1Q(+(H5l$GX^uh;a(;Gh2T@nuZC;ej%HM~>vz`!aQ9G@YL2 z3_j5qD8J5p$L*NW+6$6v7Doi0m`l-s$A_FiGqwqVWuO7r9ZS+)|GPO`C@Lm)joh$h zjkuBbjRagWN(jBIah063)Ei=g>^slMTF??kB_>8s{hUo+Tt@3VUlR@Eq8HCT25_N- z179WGmPeSQnipK{e6a7d{by19Q?v5&9C~2V&lVZ{!fE#vgD1mko2y+n7b{j)Z0d>- z8=-v#Ilm9X5=yR$+<2JMb2HfYiODzE$-&pJkqA&3#STD^>P2y|16em;kDa-xqZ?37 z#(&BG9s|0hG?w5E(Cc2`4mrR}EA=ojW5(o^atR$zw-aB5FSfn0waJ)qh_T~DKaB&t z5Dv$9Rv#y?-M}{?-iKB_OdS`hb4yIL-|be)$f98ka3vg=Je>L!Q@eu=S06o zOAAtWJomW5SuP8P?#=Eb>i={UG6UwljTLhZA37Yak5Y2 z0dR>>fcu+nz-$lVyP8fFmGvjwkRdQ$IXbls z%A~r=pybGtqA&~(aM6Gr_ONZmr>Vo8wEH@H<`AXSZzAv1>KRhNAT5(*J_-Xy8!3;{ zv9sU&ipOs?IyRG|bclT``e1i&)bLu%#O?`ACRY_ugMIsimOlj#G&Nd8yq2Wy0?|&` z#K}jQ1Bda0!|Zn7R3TjnK{LB7p_^t+RNq^_834zxZz=*GKMXDS!wnE`UKSbv#`I^| zH2`dtSkE~F#u)I)a-ak29YY2}%yYJKHGMB5*+MjeIvZ(DY9NuA)bS6skr(*;z7DKR zZ6uM6-`+YkWO_i3D^!Fa4qe)4>5{lv*&*^#a11@B748tu>cvNYifma@!m53fk2HM_MmZoK&$mJj$|W2N24wjsivuTM<;wwZbiFi`ND^;> zU$xmfB=G=#V(Oq9R)-oy>-#^SkLyqblJ|%|)@4xWN{dYuD`3;uq@OjOh_%f0C&a87 zC4GM6+enq;)J$KVP5A1|AlA9PHyAJk@4-j%%@-HFiWOv7#lNRil*0bQhP3=#8qp?m zz1TX~r*8V|`qzG}Ui~uhQ3c<169dtDOc^%uMHQkZ0ICf<*tB4nl^4Lr5=aH4-$?iE zNuLH11L#v_SxW(wE@WS?MFo-4smZJ-iNDW9kHQLS2U&o z_J9VIwz~;x7f+YLJY7pvDBBL^I3caqkZ^d}9$CJ>asp_n+47a2qDEgO1#SKMyp;$* z>M}#GYpxptw8l=ipS1-gWUIHc0x>YbA7cH_E1GDiwK|qRnIUMJQpc;S-3EjYOM50W z2h^TVY!-HXk1m5tCufiR@vynv-Zi-DQ5&MDQS18>n}RmIL>}jY2h{w`Fuhf)22OPM zNg#Q;c~ny`r9>CfA(>R5NBP1r6GA&%guh4;E=~@%OIgQ4@(oU z{%cB=9q_C8zs(_KfQUE>G$Dq0T&{@*tK)a@aK$FytHx-No+CX~#rgc%1L{Q`V`DkS z&+{cu{nBGX3GJ;p*VNS42HzjB)-K^+c%~%^awsrC$U8XJeON|*W;m@}t|fV@Kd_1B z$+qYVvOF4w8RT= zn61lKfD6lR`q9)WO2@mr;iZwA#B=%01SBTf#%Rpt#DJUnY=Q}hnA)&Ee3chPkRVgK zjJ&m$mT-ch;YB13=DP-Daq0ZwV1%3&g%%<+46^XAp~dY40vp8sRSLs&;HCl)E zJe8mL&9UQ3!hW+k!7!6mRwjz;O-6LcA$G6dB{c0qQ55ejy zul&b*)-p);A8zS^sYbAdo1%!xBQFXFIO8A8MU@8e$YDES5ipGw(8*}%`FQk|r@%T5_&5a($atl%hiKbD-mgj2OrzZX0Y8dz~Q_Z4l!&`jckoJ<{Fc zfDYJ^dUhTXYC)n`>33ynLprQL^b9vygCgfH!sdQy)1S;7CSD_LX7SVq}Jom!mn$nb#t?KFWr^kpCh4KHy!e|*=u^?2SZ?^p-eYpZ3%<$29x@U)5 z)xb{d^n)hl5wg|so#7aFkF_~!{0;zXA?Mw%Skg!T{P;U71abin_nu*tpz3NbEpfBt zCstGFIRZVdBt$6ul)r|=(x@c5={yJI7pz=CgD`U-oz4B_g5Rgq-*pNj<=7YnPpa_7 z3YVPtc*z+~srk+?;|lEPYD1QHQ_!GfYjVm&9hEHhHz23wrxwIA)1Tw~KFaZFryIoW z(Xw#tzJhF9^W8h09jmc5-R=6@G(cdy2jEg{VQ2;h757?U$uG-k2;e@s*__u*#B&2vMvkC9nY9h%#I9 z9|z7r<+QrK?cwmfk2}h?bgyAwAm0T`dTD(R%!{Xu5r?1{Y#Z{W_yCRvn~mVx-)iR@ z&R~H0tcE{WCmo2?07*s`fbMv<)~qwl4PeF&6(c%_M~D1zJDucBFaX(M;~%o;WA>fs zPB^?KYo9s0Sf&4BH-(Grdl6w0KBQ(C`tS%aaz-A|+F`W- z+6?5R7~ddIHG{2MM$eEq$ECgys(eE3-*dFPI0DH9+BxJ{AsXNQa~qWV`+;l z+>;BiXl7i%7{#(sKUQ#Dl^Vu(iiCnX#^j}^A+Tyofo#5tg`m7Iqw#PW(7wA+IG@oU zig^Rli<^9!8MaY-gD0u@gK)bIN;M4I%qqV^MJEna)p4s6bI6cxJVbUemcL||23o)l z-EUthg5?FuzXzLK&NVRZAU)YvD=xO|{_=qY1&`U>nm4T_jX)%!V5r2=bEFAfF9=&yl3)e$)Y1ex|9rOTO>@2G6Z|1z?Js zoIHMXpKa@M^Dso&Kj|&<@_QBYgdpKT&PcsGN+}HmBvyEC$fOjj{bTTes2Ul{vEsGV z$1LqGQL-o$1`~At)I{i@SddAT$tUsQd|+89aZZ z0zmCx9!!+7P;eC+@C7=tK9|@J3;xhtLk=En`higj9I|}bl6Zf2d>9fDw~O@${`huX z1Hy+ta4=xocKWCg#KfWDxDNkVi3X?B043KG(0@%_%p`y7(=IJgDQ>zK;98v(Z-Y_& zn4kal+-?J^hHm7_?(MN~2YF(Hym`xa{E%%^&JvG}j*@+3c^xuAo)sH^3kw8j8STFQ zX>`ythT-aae6Dol-%qiR54*UrdF%+51_rK!$-`|+usYcsOb`+~fm*2Hi#-~n0hE;B z`lA2=RXB)0jKLP1s06rP|6z_4T(Hk0uB;~{1bN3w8*1zAzojE2ArlWB$LWY;S0s#6 zN0;+WW@c(hCN2j$vJ0|t1-ZDKH#wPErP(UQ80u=5GR=~P!|D}*r>0!~HkFo_wzV+} z%XjbH{<1q>^O0)n^*!ShU=7Lx_^!mC z6G!W4h=RBZ!umQARlfG9EB{*=7RJ1!2f?THj!0^qcI(wMRYUu=-AS-!*tnA3bqrDJm_0@huN~7_q3SulDXR{Y>Hvrprn;q<+_*>m6On z^VK)$s?OefehU(aQhg2)PjPO%eN|h#)3xpV2tO>NU=_> zBKH(a1wx{XPnwa6A@lNf7AgY({3EYTSL}smFu{eUhR=N*3m-01g`*jPK?&yJ);x(C zL_8Wl=OqFvg@BL?=^cscjoo@~r@bcpB_Vca8g5hE6j3+`Kam#@G53?-5a%V5CDrpg z<$;jZ{zgV?TG5Is0_nrW#cSf(D(7wtbEoM;!zj6#Sn+Q0O+QvBVDpxgBwSbOVUUxvLYD=O7#57Qb0I5S7fNyu=+tLjJ=y0~o0x_Dr z)W4HCbDDsiwDjlHo_8$NChV+!uZXY6Ac5E5d^7_FwfLqEY|)$*8rzatZl7Il+~CM~ z#L8cXZ-l^OGfVoF-Y{`;v}LWea+cjt0b)RHvapC?CYFjsgV;;_V^)ZXi&w7=uoLdd zl=n>0C@sBhxA%vj+lTy1DD#v!Dmfy6UofBmKU#2fSldA3;*E{69?(aLi{Ht3JOd@* z2?q}?Y2tD@PuG=~_&Rrp;*qcydtT!oTM%qI4^>sC%|0U8Ak7(>+Xa`H7C1T@q>gIn zUdVg(!vk;5v|n3*wEDiWN2IV@mC1vIgl6K@D%~g0sY!N{J^Cb~+4|%s>KnkPzi;XV zOGWtO;Z*Ua{D0&$FmQa_-`8C&bUP1obk+}4lY`W)6*BBL4;;?ld^H0+A?+DIrU7Wu z{JSYhEc5vY=`po8+L{C)X=W%YV41RT#e}>IJMLN{Qwn2BFK&8TN`YODmEBp=o`{F1UL$3t5-MK|{#%C*4vSdQHu@Ir%noS`y_@vPriG}pjRIB%c14jI0 z*?Cw*GK~5Q_f{ik3cy7$R-oc|x&60M)a*6V}`a_;4trO%E7maO^bFfCs`R&lh2Q`&t4UVE%V(cDxHdLpCZT`YJb7z&-Z zBT%3CctbW?pn>I*#~@w`3M1rvpyDl#7zk?bQ&k_s3-Fg^b$LP-wa~E2BR>{kLTGMY zDL=6xD2AqN5riFlJGUz=N+Usg?d`(uVuvToX_hzm9QDgEn^a7MwjX`vno(~?w%s7a zq38dMR4voqxk!o@;U+BILtz5fa(*HCZdS|=aZj9b=Yu4gxx(yO===9w98~UmT-YG& z9=FY;{)RpCr&|Y?gyJoE;Wt8}{{n^GX~~_WoS5xah2j4MScB5wU?~5;dtL+dCpJG^ zQhVu^Ycj`WaI|=b*wko8y8LClz zypY7BONg8+bjGZ}s_I0Mo{euS3Yf;Ag}1vqYl zv?DHnmTG&G2zO)=gUfM8ncY_*>!hPK(K7TH>HQh`z~+5%yM!jqOE~0Q-s-Q4#Sg6- zW{|8pBnsX(jBC`Ct;rTN*KcQBPcT{YsNa>qe_t)+^Y0Cbca!Ea^PsWf679>D2oOvj z!-NRHCZ@lR+GSW(h(^NDYxGeoIb0BoBsVW3Z0!jeFsDj_<1Ri90=sQ5Vh<0sVf^sb z#jPS$BJncI*XG^^34U#%D9RKiU9+!q)aZlOV9Q{G&gDH33C`-z!sAgUX5xj^P?mAh z^nfzS;xK1}E&}^&>s0McZmGh@<;#3$#GX&xU0Gw_ykO|IKI=(AckKUml9R{j$FCv{ zJ_OXl_L9N(#?1o)TVj|)E+Y(>_s1Vo*@i~-dWX+0pOpI1#xOlt&1fRS#jrqeO# zbaM?Av>|fU+1H1N1oPqJKS2Vy8QMD$&aBU?4{-dVA6QpwCN%xLu!ikHTC!N3_Ty~X zE#;+3Y|dV{eBf7M*|x=$bJc%tGusTUowdr5mLb+2ZJsEe!_RJ*UKyVZRu37&at`BoM5jg_e=+Y%U95dO@7LJXO@uRMgDHky%0nKy z>{HZHXak#68O`b~Dr`5OLr#|!!?%TIGJtj6kOOm8uNsT2_NCll<;h2icp^J+tdWB| zd)6LO0wliKcErd98=cpmV7{?>8>HXw%%N(`hP@`x0G73|Et>99H>PKCYe1yb#7dvD^)WToRN&b_7uqsm1v>^G@qYVhL^#GgcW zg+z{zP@piez1bYVwa|j-i)dEf(t&~f$u}p>snU-q`+2-!W;9gAy<jhoz}Wd~RNu)%(jM?*<wc2eB$^VV15`kwjO@uzQg$^%gJND$Z{ z0d3o$!4A?e0&ANwam*Mia0b!KC#;(?f%4v16tN0V4X}3(J-)=k94X7~hRSN2;a1Y+ zpM_6}-Fd(K^QnpM%GFq53ptcpYA_bf455>!PfaIVC__~;j;pl? zR8|uo)A!9a&D$;*r9XIfrhrR1$ZY12E#|?;f$6Nq>|gkq}k7^ zL^1GsB^HM7C6ExfMH(~>K5&%r!Q=)fkb`o~yLqz1;tlZB5(PJsa}X13^WcFFEL&ER zxyQKSVK6?TGpy=fVUew{j7$gDpUl)S4`I)OHk`Nw90IVSt9&?mS9i>yomskZmS+4E zU({~OZRK!gVI%)uZg2cIRyiy87K9F}c8|OkA%fJxX>S^6WNgdAXnVk_VA zZb>A-_2<<oqI>^3i)^|O^@xZiaXtBR@Fg@98rTd^(r0eoQpV_U5QS- z&OJ|i*wI)3*;$V!s4#>Ly26K=c%6CytS*j#zM>2mE4qOYa>n)!0?6S(d0~z71WQoc zbQdkqPeCHfjKdtl2hh>qn8m&Xr+k0n;pi>6=q{qpQ^QCj^ir)7*g(dx>y<4hZ|R1~ z?Nht{i9ahEMg7fIE})}C3#P_jugUb7HRQOJQ21z`#_y7ASiGBM_o2oyzSRy5R8KI& zkfCCxfZY6Otirx->*{U%up%TDa-;tX~P3)L2n8X;|+wF)`409}yo1y60a1?7tnl>_~;UQG& zz(H>Cu87d~{*JS|f+00tul=5~8rNgu69g=E%!R2?a|2>bes&|OiGl+Jn92y`1eFF* z$%C{T%TUUJ1Z0%bAgz6Jd*|#I0RDsr<~_`$Vg8NT`*B$)$8m)EnwIcM0hP9Ooi#m~ z;8JcQ{R!EB-^lRnKQaeUN*0K?KSiVR^NK18ic1R1E6Xa1%StLr3*QwM7v>g@M`P-L zzOcQ~7VezdF`pUqbaMUDXwRgeSjMYHHlfqY1|nbQeYcSU4J_5STga%$Aa$ ztch;xWjIs_jXLmpU>};;?peqG+I}r+tn9E;n{UYeD>FOK80j`_-ZF!hoIs|sdPchZ zc$)wxniF?;GM+q=hKS7l3@Sf1iIASKSfa_Ym^xyop?|f|cQ{W6uuzG!xEc->5}R#T zlp8OkBKW~-ma2c^HS}Qbfh{$Nv$B3jh1QA`(mZsQ*2`aMW0oxN?ON(}Z20=JCt4s( zH)bz^($r9DAZP!n6}0IE+F^FKIX5!AopxTCym?Zw$z~zBhP6_G?p%)OLVqJSEMTeG zd0=Y>PtyZ!74V>$#{#TuU@~RR_$w=zj|Vlj3e!XOT;@7sB?DR9EFVO_iHEa)`a!RM zARRDB-=_yL^axO!o)U}kH35`{0u+5U74;7gQ0Y6d>?)F9A16vFHrzjV&m|=A$;1Qk z@llK9H=!m*qnPUvnbWeTAIIg{J(DRG1mk|h4~Z9>Wj*}OzO)1!XyV=W#FqUq_H2d( z9Yi0qB>LBHKb~f?)B*utO`2T?Zyz*_eCR$LbWV_Jtt}ycd0^=S$Vuz}?NL$?QdNm; zc>#{AEq$*?AeZl3EHA8272169EraB+Cvpjj;ld_4R%S7MhzJ9x!#{EWYa8&o2u@}c zjK6pK^Tz&B+Qg|mk(6RC>ABq8{wTFnt#-*VtHloG_Q>9AZweU6+u==qn5mzyY{SlT z93>_9ce?F;=C$;43bkDnvzU1C;$SC)`of%Swht;$PQhK)83t6E(hz8Z8w@0oU>$rl01Z_Me)oKc2SXe4 zvD;w($oXov@_;EaB*ukso^@A4SbK1)JM6>IW<+<|g~xokgPZN-nNjN(OX{cMYvUqe z80V&-xmVUKKf>RKlRa(Wk$_mYvy_!j4^~3ScjUX|j~x&C+RR{4*|TP}c7`2+;HFL5 z6VdtLx5oKP7~U5$@L{#j4A>!l=2peK(t#Dy>`xqam_&_MNH(nQWT@^JwwCjnu)epHGGk3VnF_^d~pa$QCB&g1QdY8@@xD*^YDiI!cW zifmKvc^q?LQ##*dLAo<0q^q;^{7mAK9;cPyY)wPK=6kp5X9i=APgoe6yep=H3ifiOi5n)6*Pc*?J#r9%SQh%>7Dk*A zPt3A~V@cnU_=_%34%z*{nrRk1epzIDS_q&witYwm%g_wWjnjX;;JU?h54C0&I93~E zs(z`AG3E6myq(I&l4+mql$}CDGpg=LA$vR=Xb^`e4`Sprz~)%w&C-B#YoJQ zqSqi7vb9u2aU$HKC52))8*krTsYYIYsQQQXPb&51BXcq^$hGUnL)K4)DxE_P=_~qE z0ixLoY+|#w2H-CM@OWF#M5SRAKtDZm@JT1O*uW?1M`ka&BLM%3m_b%Mmo=S4an-vH z>H)&=gJCcKof(Njqxz@Z%VXaj-?TF=$rGZ&oMtxuX~wo7h`t6Jx5Nw{NS1}ZE%bI` z)Y#y)ifVWBCDaWB4}C^nTJPUcLU@PKN%G=aBIRprjuWwGNg}^Wc2^&fjaN0mr3-ng zWu0SI(WW{4?{KM(Q-sbP^ z$nwDl-$4XFeU@+(u7PLZ$y$;dsedr5t;N1c@xy~>Z{BPs=JG#Lh}K(+vw1osT%&$X zTgS|VifB1*5@31f=9h4yT;t7rG#H*-&l_KE%P~a{OD5Yt{r>H!Xi1ojeKRjae<|nH zprak6VDYo0=Ud^VlXm$k2zPf2u5$?)()1Kd@31z1da1Fhd*`951~+h30<06>fn&6! z-6A+6HE`c&khNjww{9M5&_n{^qX0()fBfV#)34kK%Y^s0f91YDd^dzroIk9c6;MvZ zywhmp`*WCo+2+AaI+NJAecDT|GoQPy1(U%zH_>jV+e&Ol>Zk{a7?c#P6 z&FP7LGA(Al!@3Pl_hGdtpPFFhwv9-73xd$^q5DJph+Ptsv)Sq%C$K&&TI5!2PxzPw zeEzV2hJY0}z({%zu&wEm&>putE9%XuFf<%&sk(6hy^kTb8Ch`P>AzGi_d#6yr1#8F zEoq!kyH-lSRF`qVx;bVg#m%v{#B@%+lTmJbAnA2>lK?w=qX${Nv6WnCl9$gc2#wdF9BBX4>3+`buoZA0#pH8-CpG6 zUSS6F){roAxZ3z#pa37r#;<~kMJ97qZkvoMTY4YLk{I12&l`vmrVujvli!27|)SSWZ3ZN?CNx<0*+W*BpSi{uz%!+RO_yU1d)# zshtRF!+Wwgq6I<^*L0t@QiRMr0>nAdkeFG>#MXQqf^y(sG4lcyM=7CjEbS|F5FHGA^nwYWK|0F*Jf8-618RG^l`}fOLZ*(%lV$fHX)WDc#-OptOW^O6QOR z%-r*T@4dhG>o^~*lS5Pith71@rq z>zuU!$WZ@O41e0#mvR#0J@)R~uYYW; z>iEOutroxtiG5MoNI}R-%ahjC$j!OZ24s3rK?iQn6S6p`NtnC@zC z+*jE0N_KLM(EDUQYlN8)Lssxs1dm%5qlhIh8i8^LMp5xlk@}^MzXNsW>Gx!d4rVE9 zYv#OuM<%wA#xH5!>RX2BYvf)3V<8g!pG+T10t!-qZ)wN#GDFzp+IK**LY6y!umg+^ zpYZ`}n;Jl#6vzW=SUD*C3RNWrZjz~=X2%#u7^{Vazo%MJuGi4VtO*(V_q-^h(B(?_ z&-uKwSESS3=4WyDZW22y+mYipqg2J-Un3UPWrV(bS|h>p!$+PkRyOmoJdi|B@Y2T* z8l38{TsfMm-PWyy^Yn3xA|7}6;kjY8l)R8E>`e<4Vn0QFkKe-d!36e9u3Ueo!>H&e ze~cAhA*4_?m;u{^>VVFJJ0#W=%pa2*N^lLfOt9`PtOo@?f?qY-f$r_ zYt{LC|J%k!7;hdB>!GA}ma4_~L@J;d^kp0>QUt&jl2E#x1`2lVF5BDhS1j;odiKt;f>T^31JzGtDm3h&yjqDCep+s+5Ci?}|+MAi+6WV@~ex*#2} zB<iWCBhNUv=?z_IcaK%D|~XI^et0KL&YK5)VT0JJCv zT0beUJKp84B5aJcix}TI0rK$`P(EIm;7InR^Y@J8o)3d!RI|(dhXXpI7r&0t?d5cbf|(f-PT>>Tn}%(z3hbkt{U@RznOOpW?vOC|-?ghz70RYd0uzmU z7+}!gOaNrwVu88LBWd8`>@u0`iVQ5nir-J(vjexDXNBgF?4HWw97cGC!0ftDQHvjp zCBr)O+zn@a8~)rHVLLKCqID1~Ml4X*a+Ic$d}D5+<=vGggY${iYarZ_pzG1Jk83a0UItcUH18A8)nm0|E!4 z9J+E<_g9~Qc1p(5yduybn21bE1BJ3jwuDIuU;;BCP8?HLUJxJN0jVCds$9VW&IYNy}t z5UVOa9N<%&;ngoQ#+55`B0%GFM4(V8X02YP)@xU`74}c z%%hAW2EDK$M(QLMXy)C+pPiA=yfzQG2|dHdR`<5$sn|qSU))_rf;HzksC|lur$_gW zV;ZI%6eG49Re76q5Grg@=Ys{X`}f9qyngo@u&FqK;P-*mBOr6x78+~708Ct(0~h`v zJtBp|JdOM}pk@F|- zmxw6qqh=4S5%hc^v|Rj02^LQ&j1GK9e(|xE1bC?Tvy?AkEzea&g^7U`kLNG=4CeF|Fma+&*ByzP(zh(xtPfQLpy zAkqlDW2K!U4+pFOKsj511zqRAl1vL$rJ6qLc-Oe9Z2!{vQqDXhrhxii@Kv9m+ zLC=@xKopUFeBN~Q%l;h(42d(bUfUeXGWcr4N3QzhMwcaN_kC zuX1g>kTTE!?%OUN-K+$TC;Dt-40dz$bWxEZQJggx6Mn$Tkv$DRugfJ4u$V}^wvm+# zbaB%GI?G-#0JOb;+I*!;;u8?;j{k50cpXQdiz={#uD? zU@1|IMxe1%!o|9wcgu86Z%`Dq=~~8MKkF7*!5{x2SYxS)Hoo8bJr#Co-5aRih{RTd zIY$ZBLvqBt;+t)w_3BTLW>l{q(Z3Jq%5uiMss5sDUGwGaQK&01=B&v*DzQ@nt&I<` z2=#CIxLL*6S32|jPS*_hW-dx00}U`VgJ_*?7yxd%(G|-zX1~WZFEqyjDnL3 z$IcU!#Qb6xY-i7%zx3v56dZP-(NV^JrQWu4n;_!)nR%1n4NiV%`uJN)%(>ly7nMLi zO|DwR*d$Ez@gw{>Lcfvr8q*X8#R-3g>_qR-!OtN@=o{ae9ZoQPzGS}DdURob3Q)MA zp;^bCqU^zfgB02!e?Z=v1&yFdW_?1 z`EjViw2L=1KC#5)ghC~879NOn(s?LK8+xD~(97~K(c63{HJ;RuB9l4D zo80e$EKYAeYn@})#2@BH%!r>I`#{&|A8|pTpiPV)DJ>pE7*2tC0V#?C0*t(YuKn&g zv;Zv?UI4&teb`%F1d~k@#D_*zY4=X4j-c+ppQ;wq8z0<@D?-KowiCQw4Lk||Yu#z1 zs`&11Y*A%lx};jFiQQ6Ntn?#A>{)ZQl?69zZEoS&Zs86}KHmcJYc{M3HA zZasm^9Jbx@x5YY>ru&b6KpgfeY7G_?(HkC!jm8e1zkU()w@o$1kIRFLrVv2t65#iX zx-3PV%LC$-bii88Qw(}A2sS^4T{=Fxdct_2T#-bu*ZgQ>&Q*7t> z;@0OKIB~>#&u^Dw4K;}ScPBCt zK_AwI;Ec6ZXTRy#0zwy&aixOfW-Naa$Gld#+KzdZl67%f7TbeEmu2C?JQm46iQfnV zZ8-KanAKsk3l=61r;Ah>_J&4J|5Mq`_vsijymaR5j170h$?%bo4fSimACIvh9dn>k z{HQEg&(G@t`Kdx4x2Uq!>oiD%cPHiiK|R)vA_0!AJm8@RV7!0;=KfB2V9L4zNXvlE zPAhD66wKL9gP1#r!MO@~W$BHQ%A6;Xw{D%UQ&pVaC5Px6|6I^KFBUs4GItD4);hAO zN!NN=w76G>>=<@LE-=UneY}0D`#uVzUPd9nIBU<*@G`XhFYsRiHNhouyH)Mrnp4+dsS-pOr&@U{uPQg5Jp34qT!@zlg$;Hu6UU)+S@f^kD#g zz-mmHJ;0$LRAdoNq~@@@jT+Fzz3;K+R97FsOK>WG+Zop5_#hlkt@MM!>%-EKZ5Wro z4}m)e&aD#8oAU0{v-4azJ^)18a+FEjx7sg4(fde!@xkqvb6ouSo+G~AmPzE@ToCCR zr&dP@g-f3WeGewi3~FbiqTU-X=guc?EW%O(j_t1RRb-}UuqXXZZ&Tco9;o;y>eDlouTVc8$k69r_o8x`! zsKKkB>|8CYv-70?oayXW!}1PvzvNteRgbXHjtrxhgPm}X1`ZHsj`-I2*3Q1^)U_iR z5U5;IsXa{JBJbLKl>OE1+esbyVCXwVBh?R$pG|VH=h)yL6 z*Gwv_6MDYE+B*>oNRG5mnc_UIQ#s)Gp&MkUoE-5@cg+{)Buvr|c;pJKIip#{E(J}q z_jCay#i+_7`Jbwo!Um9RE+mP%2Q7l<=|$?s)OY(14nQT!7YlfRQvfZlprpU{8%ef; z*@g*xS{T69z|_Riq4}ouQg?iIfb?OEpJpk0_H$Xx0kKNc729!IVfep;+JkC+wply- ztMOaUg#y3Y!!$?bYNht=jhs${@V55}Vn50$VNZBzN7{SMSiYREFF*}w!xWX938m)n zs1s$b1+9iI7up zPBzJXMxYm7(MbL&%5)GH*9Gy zym(2wonP_BFzdZOM5-J1HL+db{ToekC9)#GXjo#1r5V-}dOVEr6@#dBiID%q6c_xQ zV8ljmLecris7Nk93KAcDreM*I7KaHEpb;oX16%)30S8dPZ^sy?HT}vYy9q7Q8x8oW zjs;vS;RSejXM+)1rS^rC9(WO3fBI2N`<4=Furf%FUGoq4iDr1ge+$}n3?gyV#WTf| z*GF}PTyWblwcNafmP9JA%MCpEx%i(T=xpBP4{)-U&gC-js|j@O6%gt2&yZ`TV6F_e zPq;?1I)F*Kb_#leld;Rf;1XVVBR~Nm0DKB5?7DXpd5oxN4;k_QgR6ag6lm7f@)T+! zIdZZfwaUmPfwAUoitpDvnF(3jZwCkAgBpQsP~e&RhJV4v_S)Ual@z|ovKBru$Ij_l zlR&M%vTo}99rB+8t1IzUhmMHPF(o!s$6n$GFzb9TcH<%>!EaEBeRTC}V;XUrsslEuWmz&bs>Rf2Tgk5)qHGf^DCbFdnDam1r( z3}y{RKE4RXfIN!qORQ>|-Z_rJs>+4_%5C&&t}SfdmJNx|=YPcR63z199%M7uo+%4k79t<;+Jb{tTHmTa9s&Mcz3HqhdN!H>&x7C zyr!PW@w42(3Wu{6tB#MLHUq^7R3ZVEJp@KNN9m!nUA?sV*5bX5G?okcQQ!}JfFkKP zK;Iz-WG_pB%z@&~GX&`Q0y3hdRKw^G_6P>)D6%X%^7~;db)nn^P z&%CJIKf04#RQugyK)d-89nf2r1^$2?`nGn0K`<~5xN$PDzDLVVh_Du~^yK;8>fhZV zSRec^XV*1olvbF9I`5vRt60=c`K{0^kw0i=Pw751z)Hld91f24e%r!c6^F8iQ92Si z1GFQ)J=->^jT#B7;XGri^x5CN%{Mb6%EI?Qyp24`%K_-tDV0M5v8`i~C@)Uf01(kh z3}6|H&fo2nF|onXD0ylJFaL&O0o(@FcmP)?RshJ9>w0j{wfk>$m(s6!1j>B;(J`Dt z$ZOf1w%K3BM@m_B3U+2TnE%4E^TWqgAmB zerdahyJjtlgD$1G&3+y*i_4R``+j&qk^K&V>5(dKhdeDV1t^P%e9GG)Ksp)>2rHH3 z23#P}E{v~dlmB_V2;&i)0OwU{>`Ba>g{+J=RAJI>MJsAx=|JU;b>lEo{WH%JeMDpa zEJda3q?$1vQ?9s;$g*sUzn!jOU`e6 zrO3=A`@_^irK7jhHPfZtHG0gSVMjto#O%_G{HxEd&K$BN*7!|KX8jfK6BA>}H>IHr zQRtwTJ8*5>*OZaM5XbEYmDZv~pPF2H`4e`qqdga}2{+k3Cnz*j4Tg~*QJO1R{Yj8x z3_#^%Yhta#WJy;b^eLSrdRH}vIlzY)P6o2^fR^k^aOc(9QSYQ6L|S9Hi<4CI-|2GI zvY)$2cu?o_yF`TF+r62or*`I!L{w^0Y67L{)+=ZCh&x~VMHTjD1zxWrE0IXJbN*!* zh8(ArjewRNZ0one|DU2z{;xCgf2Sxwu>h~J>w_qN=9gCF6jha!mX}wSmRFb7m6eo~ z7T1(Zj`%j2>E^;}Fqi@25#MP)5n-;hV~0MB8v}OP>-d-#M~tuL=`~SO%NZS!NHZkKtM(!5f|7-ZXP_E_{7MQGxseu{BON`QdI3 z4Urb)+>nKz5ah6LlP3#Fr!yrf0(W<>71ZjJicPKefkP}+ zL!T1QtcB8i7FC|X2{#)*!Y8iD-nuL8PKW=zE{YXhvig%J;vKmhIjQ6Ao-*m0q!ANL zX|n41<_*qRGzM=sZ#IA&Zcler65xcY2T<{6EVZUKbfe$8FF!J2?%9d5UsL+h`(O2> z57ntRvU=KqabpOQ{*Pk<(f2qb27SA@wBLQ$@dm1Hy77RU(}+;u6l}%C_QbBLfGAh{ zBk;bK(sMdzxzeT29!Dd`ecx6dViG8^!r^n&y*ZUA`;r)<4W@g~si@-h=_J~}dzatD zMn7;jPOu>~zl5p>3N^e;%ZZ-pDhrdbfc*z`*esbUF|e0|EMRYIWx2^IZYI6y4X*T! zcz1;QBdX(347^rsvnXv;r=ou$5)wuToQib4pKKMSU~L3*Cy|kP`bgE3h)`JLyO&z=`=l zMo&Q`X9GeMC6+!~>DOcg zaaP?5c)b2z06cblzQr>_`BUar6_Wx+G4O!HSvI`0Xh(eg{0OrEJa_+X5rNBAAzBt( z{OqSYv$r0?CT=r~A*s&*8;J!p>2v!^C_M`RQz|5-Jeaa#uFJ$NRo(DQ zo<4V~U5;=jjG^z2ZEOi9#Euu>hYR*8ZsUb{3ZuZW9Sd>~UlgB*2ItE#Mbe(aFXO*!$*3Lk|=~ zCvK4ZXvaM{E31eWM5Ba|#o>*6%+j^Miu@>vX8U>6q|CEf!52m!ws+1_d-CS5_J^tx zmXW9e%Y|H?>06(etk~U-9TuTo2Z`g;OZ2PKOWDb(mG;HrM)#Kf-i*U0gc+@b$0bVw+tH=He_7P)cs6FoJ%>YiP zK2>sve5&HHexY;K`w96ClP5L?K0#SnH`wXeX2`6}R^ON@Ot`iM30iioopk3UMiqQs z8^zxq9)`Es0Ruv>ReH{+F2qF03 zCtI;`tsnJ9lDWsm^7_STF{&?zXBDOL&jgUBb^cj?gTLv<%=T{D7~5a{mZ~^08^sTo zHB=Z07t#eJhub&KBwsb4$G*8ylo3c@D%{JG!Q4#lz?pdbKE=`TWp4yl6ESG1kf>gU zH_kM3$7LHA%XJJ=#A~Hm(C&+6wiq7o?sb<{UI4Kn1pH{frv*kJUDB;Fvrs@>OEvh1 z6mlS!A|n_GR1eH`Mr`U@JY&<+_((_r2D zvGiFdh0d29;s+MaVuQE6dKZN==OFoXxPAIe;?;!YCI0df{wod83@m-e&g^s<)>*P< z9cag*|AE?6#^Vz2I;zIwgl9c4q1IvNk8FV5)#TDF2T63+-#BX$R%p`xH;)0knk)!C zO#o($+dhOoHbB;nF0)*XiOObG?kPu}(1Yau)S~@QRLtMlca5yoOP9w&rpwG?_NVgO zE)~wc%iAk+XwN!FAGLno@2;+c6{`-i-_pnBF1~vp8Fb}k;v2(DdJ5jIscl5CxbiiB$auiGo@}>fE-8 zH|Dh=RMKU>&2Wzlo$~0t6{879Y^l}B!hQ>uJ z9)F+pJ*D>zU_SN2ViU)<`=~AafXbo{>9U>$OpKcZf_thp>AOb#X<&ROF@`nQ+Y*tNXXa_efi=ykOi_S_Z z*|gQ;Zuj+<7B23i4r62REGhP}oWo|`NcnKHIVPu4_(K|VX+(qB$JgKDWaH(&1X^B0 zJBA-}wlmcx{BYh)ko$}oIMLM{1z}1iO3!Xajt7x)^B6gNjtozKfkN%Mxi4k$BT!gf z50Y;rPucU~)6lL47j*VHD8T1U4NOQ8iU4&cXnfbl?;DEyQN!dma=;F+>2QtH;yv4; z=+^A#BKnl~+cWW7Tg*!EMIw}M`mw;?6V~-wu8n6r+mA6mv`Kz<+7+hVbk2509U10j zuMda_E#+_u;N_6pw;92{Sis6stYkpUzTeLHY3o!HrISvl0ZxW8B!h zhJcMg^@;96>bLp7XHavw-Y9J8Ul_op&`dR|>aBMLXr=%ieE`6N1SsDDC)H?Wbm#~S zB5A{_FCOjZf;t%K)P0^p4+5geSkhH)=~FpUI-^8|zs^*Qr&}fRo18T%D>u=P+gfN= zn@|?Yqi<8qz13(|lqQ8LRLVMClXE_zC%D2U1xIx#;nkVspuMg3W6700eNyMT7Jo-# zOO1U`689J#Oa-K?*Y#<$duYhA6A&m~ZlS0I;&c-JkTDjsriMK)>M(g!y!ZLRqd`dG5`u=rQAWR^EMmv;W% zxE7*yQh{HxuAl4(mK)oIvZDgW~1AJGVUytWUzejAjd9_Y$mCtCVp9V zEFU;#VZz_~fgCy19&x1urCY;)^nJL!_3W_(dzJvKStwu}Pb%C@vrb&vy^PCD{{dB# zY+TvJU4aPqNK;grz;_e<4J69I)(5?;1 zN{zSbMR1nCSBib(F$*a3es&jfhSNQ*#1v}F)S4ELu2zifHMc=-Zo8KB+AjZ=smOc$ z)!RYJ?j>&y+frTpyn>9}Qur`s=13HfIV92NK}9%aPu9hJ-M^8TUIq~qpgQ$DmGgaJ zMECrt1cAzWd|L>0gGYTtbJ42LS}N&~qAd5JESvSd7^Qm(WNRNnyH3q1fC;ZID7`OD z!>6>ral;4r!TJ8Bk>+b68Zo|SM}f6yyv}DABg19tsbyn3@}8M?l^*m++Y76vz5&d- zV0XI;8PsfxWVFg8?Ptt-VG|2%#r>AAKi}Z1#c^-6H`S|wK-(wWSmNqd^JU{mW0qRW zRQ|~z&{Ll`kx9uqv|zwAoFD#X9f=W+7g%L&Y=d#C3!DVt?l}96(J0<>3il^QukB=` zGL66sxPbG-Zj@sDWT7E6CcOW6+eY)<{VHduPuKV+jlMt3z6@MXkZzV z&#bI;)Hb`O+p$v|C+i=nkP#_2k2+{DWsMel`VL(qr~D`-Nszq}p~1pK=_(q`LUhIv zbfC!rtbn5R84SAOpvakHq-qYOzSdZeP9~cd?ZJvh%PJ{;9+ikd#pJ9*=Zm*dxlELq z=Z+5~^^=b8o7-x(v3*3)y9PRsAZx~UfCJXr<;u1GoG%og_!-&)c6&L+pVB`z*VpnT zNd)OVI6=MsF4lwlw@>_i_T|Cocy?tW+BAJnr+(Nrf-+>qOVDP?fLr@O>efkl+Mvg7 z>5#9{n?S~PZjeZP`FDWY%k34s|F;^l=6|aQV5Jq1#S;7ZxV+?NR#tIwQCWFW{?DSK zs?yx@^8B2<>S9oLEd2}2x4TRf-ZEV?-hKBZ@khg0!+d%m0^t!Qa95SKtUyX3I{RiQ z#qoi)zq9~%w8uT;!U2*CTXBx?6WWpVm8Idx9$To-LO8_&6!>gVJC!u2q}>yZ!}qStC9 z;!gItKKXBZ?D27N99~8|{2gJ{deWeXLcvQm7o=wv%TqZ$Z(76UL;LXpDEvJrCP8^V zzek`4+|E)2tk!GJPB%k_0ew)7bnNkv9YwXk0@A<^{zgW2lXh#>9gzL5)Q{J{U^*OE#f?+CRT&``f!}^e8b;O*?1URs_sNMa zB%3Z3B7N@z0XXUD`Eb$joQ$ZyU4NR%_&juQ zYCt#U{?(x)M=kiM3Khib!#^<9%3)lm^@b)kkSkaU%F~lmAD)u{H&b1b=7xaq($AFz zu(R;PUou^P9{En}5h%L`4(3n50m1?`6v~tah7XA$;05j{z8i&Lb9BagqW?6+IF+c! z0WNxZ0S^hRs&WjaFFibE8YDs5jLWrxi(gf0uX&IUf~5zuf>g6EB?Gye2jaM?HgK26 zx26g$)5T?S8UEHurSn%M@1Ol#IZ~=jm!*96wK^pP^J{KjLTv7rzC_mu$mBLua@cne zu|gD##f}devf>!>^&6USf#7cWxQgz=$#1&K16}%9-2A9RKPiR}iw`nOsqJ9XaKxhV?Z24f8 zbMs_jws`m-Y9!HzkhI|be0ev>TEAF;66WDuuy1a!CzjW>a>3{`z2zT!i&c!p3|SeE zkuvF0SuuRx+K zBb#~JKQ-1yXORT8BZGK}=lpNDFp_7@!{+=S9s})2O>iC!uS-BQaY-y^bv2U$nEWix z@KecB^od+_i$t=wy0xTtE7k0$`mF71xp277irRQa!;asIi{dzHoyYn}@!8vqV`ODF zc6q~mdSpWm{%C+%SnkSV2z&6;BYm6@52bj|QBS(~^0Z3YMb$uVfJ<8w0xiUyR`5(uowYd-tW+8k@aY79E!??cLL z$LavR!Q6lV?LLm0WaIj-eO3l(&FAV(p}a`y{d2!-V%>xq*Iz9gvBqfH7yn%%@LUP&+z6a6cp-=n_)4jkwDO+pcJ`d%|>&2Y+k^}sA#=M+enoh ze9eQ-v<@pd>M#!v@N@dz*!QIY*u3#u_B`oGlG0)* z*drpy*BUKmD7cH<>(|36ot>js{V7^CppI<>=@|0u^Xg29HU@LP#tO+GHc6H`vePdl zydI`nR!CI(WItL`NNo;et%56HZWiWIect)Kor;%WlH*t2 zA*D<`LwJOlOysbhnJ&h=4C)Du&{ejuG%JoldCSO8{~DM|92D5P@bqzR9shaEwq$@8 zDxAbyC}CXN{M@qcH`+zwDy8Xqi1yw z9|nc!NUQKo+H*h*c5>sp=yZDEg@#DT5wWor1<_TZr$SwQ1c;7UpY zm@&^XuaxOEP@xCd+)dj)k1%J^7Q=7jMxITz|D+(}tRfnxqZYL2{EcgTO?sT+D`(+8 zZ9}PzFGAWfNT%gu*Ez7T`opd{i|E+Y$3Un?;>lsZTms4W1bcZkQYM?>s6GxP=qS&U zJ?Hm6OmGLjIu=SYe`&G(8q(BM{cp4vXQ#Ko<1*Qwmx}pV@-$;Vl^O3wUtoT&oqlnYAcaq>uRBF~}n4PNenOc5F~PK}4Y{;XQY_k&sf-N_C=@ z2Q$2w#-EKyzChnsPE^nRpW^KCN>p>*Rz#SWgrC(?ieISgOlEjSvL1o@F=B0w zSIf(ALycDDbc(j+_Ot0Y`K$&8!0C>`-nSfTMH$?Slx%-_ctA=oUgQ^bf)+m<{f0!K8%(cN@YpvvhX_35LC8 zA(+mHPYV@KXVWG=9*vpm*7S1X?x?9k{D#^GoL0TkwlT_c_?VsS3p$*aC<#@u4P1C% z1QGtA^XM)py+su^(({j1eYorfD2y?ma|?id!fYVLiHvKO_)fdC5_&;sOs11{VmV_I z&zxDDIr)S%T`GpqdwtQGYIbt#(&SnEin|e4K~?Y+zU5;daXR?e%Y?(8mwsYygbR5y zo?aqm8)+i`lf@Hfhxv2X$(RFgC*P75Hj_*-mMApjxa0Atc$EK_xb!3BdJX*`u|w^9 z9^-Fu?}8YL0fTVD=yA(mzfdY?tuxfR`mL8Qxf+REtnT_7ne0kEnh2UsyPpETCFjwk z@A0z>YBc{@Q^9Cx)gY`xvpY(pDlB)_z4!L7e>bfMsp9RXObk! z_W@NH4nxZb#F$`8RyI-7A43*%hcrD7%?JOdk~bVJUA*A4dl^SmGje^6@}URG6UC5H zQVeO70|g+8rlDVbywUn}LlTPpX_q-EzK6=P=SSFdD}#Y7_T7M0=uOHw_Bv$;PR{qM zzb7!6P0^Ne3GMO4xr}?99WzBKopjeLK(U%F9=UYZfUYK7_ad5j>l!ql=92vk-{>uJ;{kbRhnuTsy z8?2uwUS<)d8g6d9f%VPc1zaYB;axir@Vbdf=$MX-QkH{_Ls#Jtoj`Dq)DEFv9mh;` z{+(bOwJJa}$3`afx1=s=n0@9eSQ4WkXYf(b z{&$IPw>+^+Z;R#Pb;)R^B*Tg@h6TlC!?SYF!4(F~1=J(gPuf%>Z)?ImQ#L$A-*D7M z!-UEvxpVvy;F<9)FjI=3`qNgp=)^O*zc`LVtLV$qhS89qf?mZX>fK>X;;qHqS)AFv z-f+jRCu;K07X0yVA2mpu^upUSESpAmMfBxiZWPFF_yAp_0Cs~VfGq@#s?y-}SDVjY z#|FKTxrl|&j4~qO3qSn+d5e@a`#9cpU|^W zwQub6cw1kPoNzqr(U7Xl5RxlWBG5TPvn+j1{Y9)(L0r9xLKEsYBr$#Qjw(3RkUiif zXqgJJdrs)70SfKW$A^j>5~vt+^%kx(J?vuDmsrPY>G8)Gx%a^b63V%D5-_8e<{nEsgc=+@CZrpg!rBGE^k@kYeVKb+mK~d&go#8+R=-je|Gu z%n6>%+nK`!3QW@w18%OzE`@tZp;qyQ!uvw^84r`9^~YpX1mbw_SiGbbmd~-yY}W+7 z{7WL?l?gkdWaNsIgP?(`IpY=;T!=>&^zwLi&fP)-GnSvZheEZRemcPrTXSu zdrlU{j`iV7{Y5_>y~9d|j+<{#`V8DIGS=d24WvTGrpr|m*T+)QzPGk#nX`7gG;n`$ z{mb1xCvowE!84`ni@u}%A0rYjry`2hf94Ev&pNb^&;G;?G~ZrJzxW`!JkeA?+0OCY z@OEfIUy)^?k7y1v>7Pzr*;bRu2Rsm7KSG(&Mgj<3s#nfxTcTl4>3Xd_+?!i*gOZm$ zb2xkXc|nQycS6*0xr@YQGk+ zevQ5HbZqAwr(!U53zD0Q@FeDuRoT6Tk=hwrQf%t^4J{A2sXWb)?ZFRSdNy-MX(<>h z3=fD9@jLDcisI^rqj>E_o48mFQ{*^mbfclFqm)B)>=M3LYwl7yH1Xg9YM={g3;9Vg zwRt-bMr5o1MMsGAfnJvB?%#J~oftaf5LEI`cdH&@X)r35D#l-=f4wvqNi|b+IS`r4 z`4RCYMe}1Jzr@x-R1NI(()~wbEbM*LP_eZp?0_d_>@j&NixY*_e@>wPY8cxcD$VGw zzu+IqCkI$|zs4fJ{-|AopzHkmXRbTt5FZ!IL@{t{?H+4kvHuPpV2nHx2NXaOO96gW zp+B>Gw|BeTo?S219Zn-2{jQV#fnl#zp-!W$jyr9Ti#&|Rcx7*X`LBz*!r-rOgfj_y zu@!2@rM=B#m(8nE*I$qS=u*CKDDC*J94cdT>tmId*Har%YaBr0zeR+J9P+(%8pn~6 zE?SHAZn=sh9%&O0$fo%|tmj>Iu7Ob;l5kIp#Urz??jHa7pp6DoC$9 z{@}9;T_c$YpahH*UT3Tp(`MNrKK_W(_-tKvLfu$ej}TE1E{Yd-63hHCY!t%W-l`cgH^(8cXxxfh5i$iRFp0kv@X5?r)2@ z<_tMxSDRvq|2ybegfi{%Y)~1$xYLQLCt>j8N7(7;JS#HVOMzJGmSZTCWTMxk=C28# zc?i1;#&d0S2jkH2-8s=_pM)vz z>7Urz>HO%0I%;oE2v9+Z)~VlwBH+WbSQm?YZ7Y} z`Kwzx&5+LM5?PWQV%DP!$;(VEP`%K##M(7}J%vD)8ABmeK0r)Ov1!nrCoxb;R= z_Sl%c4$;7e>(f|QV|MI14KixzO6ZrB8=V)*-G(ehm-W%s#vboVzwoJfz!|*6K5l%c z%jMnaC>L#4SZwTrr?o_8Z*fi7ci&BK$!C8Ljh0oO7k6p?La_iO5 SpNS8^QEyXoFR_R;`u_nPe>jBz literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/contactrequest.ogg b/plugins/sound/sounds/contactrequest.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d252dca4678c7bd69cd808612957f65dd10b5013 GIT binary patch literal 73699 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

    i>ZsG<0W(;6D9g+o9X|Nv}z;_teXJy-5!zby4WU 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

    AquSFW}iJNsJ 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 T!`ZKLhdWy*StqmfIhl0?Y^I1l literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/deleted.ogg b/plugins/sound/sounds/deleted.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bef5864bbb1a513b132c7d6cdba0e9279f10f27e GIT binary patch literal 40432 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 literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/error.ogg b/plugins/sound/sounds/error.ogg new file mode 100644 index 0000000000000000000000000000000000000000..64f823d2e79a3ca19997327fc098ee6ce3ead549 GIT binary patch literal 118424 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�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

    {XiDu}4iMMk;-E8d}u36w7MA+lp4A4gYj}3SG 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

    Gk-5GpbJ`a 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

    P z_U1;-A!p(u^CZgq3~ax)H6z(tFdB;ygfC6uRN~9MQ6BVEH;VEr)5KkyY|hI)IcF!q ze;-TXVLSt>aqwYafBG;g|Jj*5UZV1RCQ&$Wcw@&iVGwJ5Gscc#r|4q#K26N_Xj*%dU*mYi;e2rFK3^qHG;A=C>!SKeAYI}RKILxkk0 zPFZk^R?4mLT?(f-o2>*_3V24iqf#t>Ed2dfghYmZS;O!Nx*F*b;+|s=x7am>8N$)A z((3G~IXFv2Gsde=y{#R?Vp4=y(k+2QX$?Y1SErGuMDUGf*Y zcZwsL+ognOr{!tPG31vI+nmRdmcNb1SyQH0U`cl0MvLY07>OTko!EyfM*}xCl7^fR z&>48d2_D&+NA8!?XFFAN(fpgqh8gY2n?PO8_=nUrP;Rj@wd&|g9xn|WxSOdT=f7j2;n)Xes5eIP6wUXqWlGyYw%$31%1uKqEOho5TDnt80q3M*J0Jm+AAs z$}HM&s@Ed4QY_$K#L#M)mXg56tr%SD!syyb7bGTR!PEyMyKz2+K+RwereEjJkCt=g z2!p3)6K)47GeL)`rZYKGyT&Uj8mYH2^V#iau!ByP&{^KNce-lfj>IXAi$m@fS#E|A zNG7G<%3<;KZ$9KB$oJ9vfbGNE3l;9D!veWA=Zy`f z%coA({O8A%#JAl`r?Jxn?Kyg$!E|Ym3Z;MsQ<8in7T9lYZ<=?uBo2%CN>iw5^+7K> zAG5{T?TVDXB4_opB}1sL;5mCgY10-k@t$oqD)@R%a`a znyYH|(s~kufA$NnJm7a`hI=hOTnsLD=1 zWUxSV=;;@eq}7r%h$2e zWOpr0h*4;LteM)3t*(XLFQoHs1Ba7llM<1fAC4s-0zV{M)yx-$p7o27ubq59y}hWk zSxR3yn{;$82ONiaT0|sz>7m`+u5?u@q^ySxEOyf{UU_v5rdyNH^t*N-3Z>e;7`y~@ z_>wIUP#DQwmS?Edg{1PoZQX{&4@kyjRMbq%%CEbn*;m0tWsxo?`1uHg@=q(_@5{wo z1V5$cE7V@A&OTU4(=PxVmAnJbLo65a~3dx^G&rdi*?uTRf3oB!lGD?#ggo_+cOV zm`TY|{1DK^M^2}$IM1yNmgVaXcx}7}fBr+SK_u>&(|VOlPo(dEu2wLlFY;+hP^ZT> z9{d@BWc>7TYE^pW1pTvkWlNEWNEb_J`;C4m++qU`cQ2!M!6rJavnsHZ(8n7D_Ac)ERxp!69)Ea6z_L#)sgn(1=?Dm(a##?_;su|PHMGYZP#NIE%v6?_FJ%$mSP0$EZxFpBZ8Ahgg~;45Dbp9Q zA10GDA?SoQxZXSuPm}wQR}1Ve%UJ+UHW7wC5kPte_*a-Cm$ZwGv?Ki{_jZ54C0MG1 z#_!RUQz4lag)s&Z!lZphA9<>&-R865-ERMDFR3{Q^7&BWDYpY!I$)~R}&!dL3NQbQl{Tu)9BCUvG?9DJ2QSwaxKk+FW)fe#Mt3{#`-^^ z&MGL5K<%~>2q6S__uwAfg1a;LKya4<2A2ev;O@a4f;$s*aCdjN!F_Jdxu@#yhp+mz zAA8l_Yafe(aGwaw2$Nq4_$NLN@U5sy3H>~Dx4*XmTiD3nSL(e0W z-lFW2cWad6=r&UFfeN&^^Q}UNuT7=C=vSNQl^o@qA6l|AXbJntygha)gIUz@W|bFJ z6eV@6_HJ{ji0Xcj>2)AK~+wrbEe!dzZ z(8Kc)LHO_Ml2GME6Zp*MWR;Q#u6VG-`*hHw_4RyjuZY#di-V+XHI0Ap87y`G$M#mn zf_!P;dij+nSTaRPo6z)H_8t(Uq3tF|9F}4{WMM>2oB<~*sB|`}`Or^0Ku`J07s3#V zA~u=A7v}?IkB+=ZY$WH@={FqZoOEp*b$t7Zf7~n%ka%alW@LwjIfU}&Yz{5yFX)l_ z6;$;_S>N5Ym^^jSgR03#iAEOa&vAZ*pT-o5r+x#>6U7jtHS(w8e7n1yD>Ek`cYhK) z&x6R^`~YK>oNPg#Eh&?JR-0V8D-n!E12vi~DRAI#@m*_YwTp5gP4nrx9)LPQ#eC9B?7rD^6;KM1!=i%PdAVpFCWhz{J(4cMaTug(zK+{PKg|Z<)f7CiyQB@Dngv8+c^xMEavmJGI=Qd;B~EsHbAO%!V4!C=dlEJWh;+%f=G$t;{yt>2 zdz}=<5Z8}P)*YOT_5Cv!p=yt$KeeyCVRKy(6)P1i?Hr-J1Lcr@n)vRAk{=EEwc)ANc8Kc{0G`K*YYut~+Q2NE|Glcag z8fT*2U>W+WD*4z%&BtcIyu??^qpiK4`(+(2exgTa6DOAPaCzG%5#|hBz`QhjDY^N~ z!{*A$A4O~@H#8qx7e~csu~SbKTR%{^F!x4QTXULoGB2_>F74~!#t*>=7yWk@z7TNv z<*XNeN6!h>IuE)xK~`QW z?vGtQ4?l6=Q7^`XmKw@quRjUnlhq2lXYcUc`<-`VUyaq={`wg-dXAL_Aj_MARwqED ziUske`|(ba8+II{+4MxaOy~70ygiuZE?*=S?c2*v5?-3%24{z+9d8{wx|8`m61VyN zBPF!W2YW~?IM1LCS_Ym9zHj+?-Q1_Ji>ZcBas96nQW>(4`8v$Ft+(fY z%CTBrEwa5`;H^@^7>fFm@NjOaTuDp{?~7T!EUqCU4=u>7vxzSzJw9IV1}-6F`SQP5vF8g zeE!P-!mp4b9k+d>V~Gk~mf^H&Hc-G{8kbKW6)VOL-z&)N*Fjd8Zp7r&3&jNnoDDLi zEFlBTTe^h#-iC-Pu!Tv1tK(j)_23fy;3E)PSHJes(9!ug)zLY5Js-0SSBnF?AG=Vm zl;jQQyI=zmL+Blqk@qp*0~V%&60lY!4|d|!PhUpaYL)*(lEW9lR)!>EFV#Sem{uO5 zRQDz*e6M8H!&K7E6Ad$7fC@-87Ru!^TEeVU^~(J()5Tj}r9e{mRDfZ+hQq!`jpC(# z&v%;VQ(hjE&ic!|C`X4kNnZ*;ZL(@kJ~Ybhz8?MX(cg;<}c<3jtXo?3q)gxrwd6Mz=0^dC8XZrG`)+W z(}*_5g|2WCQC^O>DjG{t@AixE^{W=0pjFi7u$Pi;#!!E%HU3+cKl>_GSES!x^%I)E z3izXixbSK}j;s7)P=hr?E1a;ij|b1P`=mT8zkVT)0y0%rN4X2$z`UBsuZ2-m8~i>% zWYVZf8TD&yCR*}G6?W@Its!5mZrTR7GWgHCFe_Q3r&vh3q=EzN3q2n&-o`;#W@~Xkilr&B)Qy*_xVdgg;hnF>*2? zS0fKKE<&T)-#x=U+=uyMy)i{U`>j3es=(#ExT48owvz?*DqMER$c2heRkC1AcVCVSQRZd}wIGoe9iXeH zhUYx*Ve+P5&QhmS_%y!GSn9q%w~$v%@bAr}k$1YExd8Go>DUyVl>@So=fJz3VNK-@8%bbB#Ffa`mi?-nX6j z`ah7Y-dx<8F!8*}(h}o7*E6$E-W26u`(d^UYcrnup=^#CX=?gR=wZIwsf#1TRTnwJNw@73sGW0tSG(2g(?=5LlS>%z#uJbd zk{To-Sr>^B%?wN^Q1_0t@u~W^oI}di6Vyw5>s?@hdT3>aH}pX@i{@@jJ0SWkre=Tw zCYFtthO`aHCbyux*1Lf_)TiGTbZK)vzrE-P7QAGNh{sgD5m!!%yG$=6)|}ivJRF>r z`9RM|S4)z$x^>}dsQapqYB&{sKuhZHMExL0wfa&gE-RSQ)isAAfzRp>%!kqgqYHuR~Ua>f4$UrR1t4i*BGcz>*t~fl4OnPr0lUAY*P%2dOs6SGMDRp4d`qM z*NCbZFzWpyjIWtcogjZa{zRLKKEhHfWhOdzCiXbq zU{m9)c(|cKbBF=_tr|r1&5Gh$Z6YrJpK94W5@Tw^SVNHZciLDOoCPjiSkFioH`)lGmPhZ9H zVc{oznE4#Axc&i0al)S%R{D@tom$$X%vq*nSaPRyNYvgBEPdMf@pr{z+;EumxSiwV z7S!ER*TVW`4zU6Mc%kH;a^=YOyZ5_Mwwg(A&P4>CkhSc+1n$){p-;;iYDT`33m(fL zxeuK-H`aMvd+u<|l}6-I811ePVZqt*cZnEOwv_TBzxX~Ol#k7_M@=QTVY^b;9Y$XX zKC3UWzOGuh3k8_Q2hHqR1*IFj-v(!RS~oXK7uYt;vG7{V&gX>J*^f~$=wCl)don!h zN-V7Dz>kATTtuIXCBid~OfCKm_)ymODnG6Dd1Hp%?BPVe{iR2z%%rhkw5dM82COBS zM*B72rTToCnrE6FE<7trJcuv5+rU`3MGr-RS7)aTe`iYO}hWnIp(vOlwt^)65nN2kUQDMqgZA0 zldq(eEp3Uutl-SgjZ4>YO_z3_4DEZo>V>=clGDgm9avtti;QGno>*gn<*FasP5jyU z6;NxgoU>g>#`tsYOQ%b|MY2XDgecSfsBiTmogKb;9K&~{zoN-tVJ*D<_sf11!99o% z(rT)%x_p?FYV1(fHz-DVmh$ln7>mtc_GBM^_)_WnF@9_={rP2qTmS4#RB%Via`#UZ zcJBwKpcoP3h`$>2pg{b)TPWrAG*o5RIT)#FU_8LsbolQ61zAe^2HrUx^Ruy=H3%*IHD0$=8|Hq%uZg zh1g!4v_n}?eH>WzEmE1YYfe9uWE&|IYMsNMHU3>__0R@0aYCeQZiz$E{zuA~7M;zW ztZlo7U{>A?BU5S8Ygq&hSGr8eKtbu08q&nr06q=CMn0;nqm_?!bfQK&#MSq$a-q6; zA+^<=6#^#U>yV>5RVzxA#z$)#?Rv(t?(AuQ9L$kZ2 zO7b&OSl89$_3*IRG5Vq~Q?dMM3E(I~Gj3;xZ~SuhYJGqb-GwCIQrT$bW+Zl9%u)^X z6j}fD1rL4a+1| zs!SzZu$#AE%Dea;C+7vsIMu~bl0#_Fikj%Jxi4v-CsSuy@r13C1>|}sU8$ z-rN(#zGbfXu2fEU_nQ|Pio<{96mzDwXIGKm?z~C{GBn%HD;yR`Yh~f}_0Co^VgJIq zr&!_&auRrLr5Iehl05v-PkK4|fS>pEd94GEcrr z!B1D+SiTXRR*s(b>?dq3>s+Mwvo=DGlNgg;GIvLPtljWmt<%7kx-1A&E2G}-B<7kj zW^3R_ITj!Y5O;X}6Vrga1Xuauaz)~wk>c)Nn?ccfR-&H(a(&9_Xd?!0z7(Yu!!pku zBJZ-*It~K3^+l+B>=|4#e6l=$^Lf%tC-Ig<%=ajC2|AOMS2!T@ z{xY`sfe-myMO-C{OY`F>sbjCOF?h`7eQ;A6PJZ?sIqa^E_dM+%bpsg)t{tP$lR&YMeD7 zM*_Tu6fiGk@8sd>ePGAv^dfq`c-}GvSq@kE$(HoZj}YyPbg%oFj{B`EKx$i~G_XDl zy))9Mwkr2sG)h9|AGpBfQeDgQXE&Hv=K~b!d+44XL(#B}d*|u5$oql&Mbv!nUH36c zUw@}67xpSO>Z}^loDPBClgqLx_zv*QFHG;61FLFBL7&3O?S)Nhl62kZJjuQ4&NV!K z$+Z^Uw7e$4bM)p(hs0V>pKAuSedtu3qHSKm$9({?4$z|Y+On_t9Z5Te;zIt=gK(;k z6_*1Fo#%j%vu~3dZ#D<-L3*{eT&P*(T2qKYoEO5$`%hT(c>tx)mln>4mk~J#=2cTZ z+1g`}PMWp~`yg%t$WkI#{%=$luekS4JV6%d`3+spnXe%(dY=vMgWgBwW0sKYeaNO? zetg%9@M9i7L-JkayC3ePVL>tD`qeUT&f|6XdHK)QNj4%5{p6FgZ?4HB|Ba_Y76I@xiu-dHY77i7xY$R&&C!QxAmFIas4Z^;H|gkOu$SNBDdNF^ z%O34nQ*kaS85qy9h*V~*A(G@o4wvAdY#}KdZ5(Z+;df zcdUt#=2MeYVnI9$8Ru^egp(va>?n5}Pe~P;T+(;4m;{wcg@@-8v@2fbe8^&zDwr}P z^A+4EgU=K8vtz0NN*fPc%!7gUvG4bC;!GMf3YJL}5oiM)6F4#wd)^1@;{q{L&M(LD z50`txFBQ9E`5`cNW&af9YUejc{PDGWk~ez$nF0y!$YzJ~mVqJ3Kw?IQxXXA)H;M!_ z#0A8>_$(T3*I%v8(SRJoyuNHrg&J45w&Xyy5SzRRMQ*WVJY!TVk*f@&AY)H)7+DVH z^m7F{Fb_5y3!3m03J>H_lKhd%n4nN|bkeQjqM|*Tc6>is?fi`e$(mYgdy!3=bm`GY zLvma#Nk7xf(5X=Ld?cqI}u_F3r|$Q+Xr@$^m7BdSsUAF25Kf26|hAF24! z*xB}v7!Fo^Q(!k)t>3a8YAW

    8(|gJ4~73JRUS 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 I-GxSd0DLUow*UYD literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/url.ogg b/plugins/sound/sounds/url.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a6fb26fa0efaa5142df249923b742c493677ea9b GIT binary patch literal 51421 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 literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/vip-online.ogg b/plugins/sound/sounds/vip-online.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b91b45931ae8f18d5f95e3139725e7137aee5033 GIT binary patch literal 25044 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≠Iy7|?(2j@?BF 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 literal 0 HcmV?d00001 diff --git a/plugins/sound/sounduser.cpp b/plugins/sound/sounduser.cpp new file mode 100644 index 0000000..b8d3e1b --- /dev/null +++ b/plugins/sound/sounduser.cpp @@ -0,0 +1,139 @@ +/*************************************************************************** + sounduser.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "icons.h" +#include "sounduser.h" +#include "sound.h" +#include "simgui/editfile.h" +#include "core.h" +#include "log.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace SIM; + +unsigned ONLINE_ALERT = 0x10000; + +static void addRow(QTableWidget *lstSound, int row, const QIcon &icon, const QString &text, + quint64 id, const QString &sound) +{ + QTableWidgetItem *item; + lstSound->setRowCount(row+1); + + item = new QTableWidgetItem(icon, text); + item->setData(Qt::UserRole, id); + item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); + lstSound->setItem(row, 0, item); + + item = new QTableWidgetItem(sound); + item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled|Qt::ItemIsEditable); + lstSound->setItem(row, 1, item); +} + +SoundUserConfig::SoundUserConfig(QWidget *parent, SIM::PropertyHubPtr data, SoundPlugin *plugin) + : QWidget(parent) + , m_plugin(plugin) +{ + setupUi(this); + + setProperty("override", data->value("sound/override").toBool()); + + int row = 0; + addRow(lstSound, row, Icon("SIM"), i18n("Online alert"), ONLINE_ALERT, data->value("sound/Alert").toString()); + + // Well, basically, this mess means that core plugin shouldn't keep messageTypes + PluginPtr coreplugin = getPluginManager()->plugin("_core"); + CorePlugin* core = static_cast(coreplugin.data()); + CommandDef *cmd; + CommandsMapIterator it(core->messageTypes); + while((cmd = ++it) != NULL) + { + MessageDef *def = (MessageDef*)(cmd->param); + if ((def == NULL) || (cmd->icon.isEmpty()) || + (def->flags & (MESSAGE_HIDDEN | MESSAGE_SENDONLY | MESSAGE_CHILD))) + { + continue; + } + if ((def->singular == NULL) || (def->plural == NULL) || + (*def->singular == 0) || (*def->plural == 0)) + { + continue; + } + QString type = i18n(def->singular, def->plural, 1); + int pos = type.indexOf("1 "); + if (pos == 0){ + type = type.mid(2); + }else if (pos > 0){ + type = type.left(pos); + } + type = type.left(1).toUpper() + type.mid(1); + + row++; + addRow(lstSound, row, Icon(cmd->icon), type, cmd->id, m_plugin->messageSound(cmd->id, data->value("id").toUInt())); + } + chkActive->setChecked(data->value("sound/NoSoundIfActive").toBool()); + chkDisable->setChecked(data->value("sound/Disable").toBool()); + connect(chkDisable, SIGNAL(toggled(bool)), this, SLOT(toggled(bool))); + toggled(data->value("sound/Disable").toBool()); + lstSound->resizeColumnsToContents(); + lstSound->setItemDelegate(new EditSoundDelegate(1, lstSound)); + lstSound->sortByColumn(0, Qt::AscendingOrder); +} + +void SoundUserConfig::apply(SIM::PropertyHubPtr data, bool override) +{ + for(int row = 0; row < lstSound->rowCount(); ++row) + { + quint64 id = lstSound->item(row, 0)->data(Qt::UserRole).toULongLong(); + QString text = lstSound->item(row, 1)->data(Qt::EditRole).toString(); + if (text.isEmpty()) + text = "(nosound)"; + if (id == ONLINE_ALERT) + { + data->setValue("sound/Alert", text); + } + else + { + data->setValue("sound/Receive" + QString::number(id), text); + } + } + data->setValue("sound/NoSoundIfActive", chkActive->isChecked()); + data->setValue("sound/Disable", chkDisable->isChecked()); + data->setValue("sound/override", override); + Event e(m_plugin->EventSoundChanged); + e.process(); +} + +void SoundUserConfig::resizeEvent(QResizeEvent *e) +{ + QWidget::resizeEvent(e); + lstSound->resizeRowsToContents(); + lstSound->resizeColumnsToContents(); +} + +void SoundUserConfig::toggled(bool bState) +{ + lstSound->setEnabled(!bState); +} + diff --git a/plugins/sound/sounduser.h b/plugins/sound/sounduser.h new file mode 100644 index 0000000..dc1bbae --- /dev/null +++ b/plugins/sound/sounduser.h @@ -0,0 +1,44 @@ +/*************************************************************************** + sounduser.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SOUNDUSER_H +#define _SOUNDUSER_H + +#include "ui_sounduserbase.h" +#include "propertyhub.h" + +class SoundPlugin; + +class SoundUserConfig : public QWidget, public Ui::SoundUserConfigBase +{ + Q_OBJECT +public: + SoundUserConfig(QWidget *parent, SIM::PropertyHubPtr data, SoundPlugin *plugin); + +public slots: + void apply(SIM::PropertyHubPtr data, bool override); + void toggled(bool); + +protected: + void resizeEvent(QResizeEvent*); + +private: + SoundPlugin* m_plugin; +}; + +#endif + diff --git a/plugins/sound/sounduserbase.ui b/plugins/sound/sounduserbase.ui new file mode 100644 index 0000000..a4a705b --- /dev/null +++ b/plugins/sound/sounduserbase.ui @@ -0,0 +1,89 @@ + + + SoundUserConfigBase + + + + 0 + 0 + 350 + 187 + + + + Form1 + + + + 11 + + + + + &Disable all sounds + + + + + + + No sound if windows has &focus + + + + + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + true + + + false + + + 2 + + + true + + + false + + + 25 + + + 25 + + + + Sound + + + + + File + + + + + + + + chkDisable + chkActive + + + + diff --git a/plugins/spell/CMakeLists.txt b/plugins/spell/CMakeLists.txt new file mode 100644 index 0000000..baecae5 --- /dev/null +++ b/plugins/spell/CMakeLists.txt @@ -0,0 +1,53 @@ +IF(BUILD_DROPPED) +IF(ASPELL_FOUND AND NOT ENABLE_KDE3) + + ################# + # spell library # + ################# + SET(spell_SRCS + spell.cpp + spellcfg.cpp + speller.cpp + spellhighlight.cpp + ) + + SET(spell_HDRS + spell.h + spellcfg.h + speller.h + spellhighlight.h + ) + + IF(WIN32) + SET(spell_SRCS + ${spell_SRCS} + spellfind.cpp + ) + SET(spell_HDRS + ${spell_HDRS} + spellfind.h + ) + ENDIF(WIN32) + + SET(spell_UICS + spellcfgbase.ui + spellfindbase.ui + ) + + SET(spell_LIBS + ${ASPELL_LIBRARIES} + ) + + # some needed include dirs + INCLUDE_DIRECTORIES(${ASPELL_INCLUDE_DIR}) + + SIM_ADD_PLUGIN(spell) + +ELSE(ASPELL_FOUND AND NOT ENABLE_KDE3) + IF(ENABLE_KDE3) + MESSAGE(STATUS "Spell plugin is disabled when building with KDE") + ELSE(ENABLE_KDE3) + MESSAGE(STATUS "Cannot build spell plugin because aspell is missing on your system") + ENDIF(ENABLE_KDE3) +ENDIF(ASPELL_FOUND AND NOT ENABLE_KDE3) +ENDIF(BUILD_DROPPED) diff --git a/plugins/spell/configure.in.in b/plugins/spell/configure.in.in new file mode 100644 index 0000000..eaccb91 --- /dev/null +++ b/plugins/spell/configure.in.in @@ -0,0 +1,17 @@ +compile_plugin="no" +if test "$use_kde" != "yes" ; then + AC_CHECK_HEADER(aspell.h, compile_plugin="yes") +fi + +if test "x$compile_plugin" = "xyes"; then + compile_plugin="no" + AC_CHECK_LIB(aspell, get_aspell_dict_info_list, [compile_plugin="yes"; LIB_ASPELL="-laspell"]) + AC_SUBST(LIB_ASPELL) +fi + +if test "$kde_use_qt_win" = "yes"; then + SPELL_OBJ=spellfind.lo + AC_SUBST([SPELL_OBJ]) +fi +AM_CONDITIONAL(ENABLE_SPELL, test "x$compile_plugin" != "xno") + diff --git a/plugins/spell/spell.cpp b/plugins/spell/spell.cpp new file mode 100644 index 0000000..7b0a62f --- /dev/null +++ b/plugins/spell/spell.cpp @@ -0,0 +1,330 @@ +/*************************************************************************** + spell.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "spell.h" +#include "spellcfg.h" +#include "speller.h" +#include "spellhighlight.h" +#include "core.h" + +#include "profile.h" +#include "profilemanager.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace SIM; + +class PSpellHighlighter : public SpellHighlighter +{ +public: + PSpellHighlighter(QTextEdit *edit, SpellPlugin *plugin); + ~PSpellHighlighter(); +}; + +PSpellHighlighter::PSpellHighlighter(QTextEdit *edit, SpellPlugin *plugin) + : SpellHighlighter(edit, plugin) +{ +} + +PSpellHighlighter::~PSpellHighlighter() +{ +} + +SIM::Plugin *createSpellPlugin(unsigned base, bool, Buffer *config) +{ + SIM::Plugin *plugin = new SpellPlugin(base, config); + return plugin; +} + +static SIM::PluginInfo info = + { + I18N_NOOP("Spell check"), + I18N_NOOP("Plugin provides check spelling"), + VERSION, + createSpellPlugin, + SIM::PLUGIN_DEFAULT + }; + +EXPORT_PROC SIM::PluginInfo* GetPluginInfo() +{ + return &info; +} + +SpellPlugin::SpellPlugin(unsigned base, Buffer *config) + : QObject(), Plugin(base) + , EventReceiver() + , m_bActive (false) + , m_base (NULL) +{ + m_propertyHub = SIM::PropertyHub::create("replace"); + + CmdSpell = registerType(); + + SIM::Command cmd; + cmd->id = CmdSpell; + cmd->text = "_"; + cmd->menu_id = MenuTextEdit; + cmd->menu_grp = 0x0100; + cmd->flags = SIM::COMMAND_CHECK_STATE; + EventCommandCreate(cmd).process(); +} + +SpellPlugin::~SpellPlugin() +{ + EventCommandRemove(CmdSpell).process(); + deactivate(); + while( !m_spellers.empty() ) { + delete m_spellers.first(); + m_spellers.removeFirst(); + } + delete m_base; +} + +void SpellPlugin::reset() +{ + while( !m_spellers.empty() ) { + delete m_spellers.first(); + m_spellers.removeFirst(); + } + if (m_base) + delete m_base; +#ifdef WIN32 + m_base = new SpellerBase(value("Path").toString()); +#else + m_base = new SpellerBase(QString()); +#endif + SpellerConfig cfg(*m_base); + QString ll = value("Lang").toString(); + while (!ll.isEmpty()){ + QString l = SIM::getToken(ll, ';'); + cfg.setKey("lang", l); + cfg.setKey("encoding", "utf-8"); + Speller *speller = new Speller(&cfg); + if (speller->created()){ + m_spellers.push_back(speller); + continue; + } + delete speller; + } + if (m_spellers.empty()){ + deactivate(); + }else{ + activate(); + } + configChanged(); +} + +void SpellPlugin::activate() +{ + if( m_bActive ) + return; + m_bActive = true; + qApp->installEventFilter(this); + QWidgetList list = QApplication::allWidgets(); + foreach( QWidget *w, list ) { + if (w->inherits("TextEdit")) + new PSpellHighlighter(static_cast(w), this); + } +} + +void SpellPlugin::deactivate() +{ + if (!m_bActive) + return; + m_bActive = false; + qApp->removeEventFilter(this); +} + +QByteArray SpellPlugin::getConfig() +{ + return QByteArray(); +} + +QWidget *SpellPlugin::createConfigWindow(QWidget *parent) +{ + return new SpellConfig(parent, this); +} + +bool SpellPlugin::processEvent(SIM::Event* e) +{ + if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("spell"); + if(!hub.isNull()) + setPropertyHub(hub); + reset(); + } + return false; +} + +class NewChildEvent : public QEvent +{ +public: + NewChildEvent() : QEvent( (QEvent::Type)( QEvent::User + 100 ) ) {}; +}; + +bool SpellPlugin::eventFilter(QObject *o, QEvent *e) +{ + if (e->type() == QEvent::ChildAdded){ + QChildEvent *ce = static_cast(e); + QObject *pChild = ce->child(); + connect( pChild, SIGNAL(destroyed(QObject*)), SLOT(tempChildDestroyed(QObject*)) ); + m_listTempChilds.push_back( pChild ); + QApplication::postEvent( this, new NewChildEvent() ); + } + return QObject::eventFilter(o, e); +} + +void SpellPlugin::tempChildDestroyed( QObject *pObject ) { + int index = m_listTempChilds.indexOf( pObject ); + if( -1 != index ) { + m_listTempChilds.removeAt( index ); + pObject->disconnect( this ); + } +} + +bool SpellPlugin::event( QEvent *e ) { + if( ( e->type() == ( QEvent::User + 100 ) ) && ( m_listTempChilds.count() > 0 ) ) { + QObject *pChild = m_listTempChilds.first(); + pChild->disconnect( this ); + m_listTempChilds.pop_front(); + if( pChild->inherits( "MsgTextEdit" ) ) { + QTextEdit *edit = static_cast( pChild ); + new PSpellHighlighter(edit, this); + } + return true; + } + QObject::event( e ); + return false; +} + +void SpellPlugin::textEditFinished(QTextEdit *edit) +{ +} + +bool SpellPlugin::check(const QString &word) +{ + if( -1 != m_listIgnore.indexOf( word ) ) + return true; + + foreach( Speller *pSpeller, m_spellers ) { + if( pSpeller->check(word.toUtf8()) == 1 ) + return true; + } + + return false; +} + +void SpellPlugin::add(const QString &word) +{ + foreach( Speller *pSpeller, m_spellers ) { + if( pSpeller->add(word.toUtf8()) ) + return; + } +} + +void SpellPlugin::ignore(const QString &word) { + if( -1 != m_listIgnore.indexOf( word ) ) + m_listIgnore.push_back( word ); +} + +struct WordWeight +{ + QString word; + unsigned weight; +}; + +bool operator < (const WordWeight &w1, const WordWeight &w2) { return w1.weight > w2.weight; } + +static unsigned weight(const QString &s1, const QString &s2) +{ + QString s = s2; + unsigned res = 0; + for (int i = 0; i < (int)(s1.length()); i++){ + for (int j = 0; j < (int)(s.length()); j++){ + if (s1[i] == s[j]){ + s = s.left(j) + s.mid(j + 1); + res++; + break; + } + } + } + return res; +} + +QStringList SpellPlugin::suggestions(const QString &word) +{ + QStringList res; + foreach( Speller *pSpeller, m_spellers ) { + QStringList wl = pSpeller->suggestions(word.toUtf8()); + for (QStringList::Iterator it = wl.begin(); it != wl.end(); ++it){ + QString wrd = (*it); + QStringList::Iterator itr; + for (itr = res.begin(); itr != res.end(); ++itr){ + if ((*itr) == wrd) + break; + } + if (itr == res.end()) + res.append(wrd); + } + } + std::vector words; + for (QStringList::Iterator itw = res.begin(); itw != res.end(); ++itw){ + unsigned w = weight(word, *itw); + if (w == 0) + continue; + WordWeight ww; + ww.word = *itw; + ww.weight = w; + words.push_back(ww); + } + sort(words.begin(), words.end()); + unsigned size = words.size(); + if (size > 15) + size = 15; + res.clear(); + for (unsigned i = 0; i < size; i++) + res.append(words[i].word); + return res; +} + +void SpellPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr SpellPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant SpellPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void SpellPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/spell/spell.h b/plugins/spell/spell.h new file mode 100644 index 0000000..01a39d0 --- /dev/null +++ b/plugins/spell/spell.h @@ -0,0 +1,87 @@ +/*************************************************************************** + spell.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SPELL_H +#define _SPELL_H + +#include "cfg.h" +#include "event.h" +#include "misc.h" +#include "plugins.h" +#include "propertyhub.h" + +#include +#include +#include +#include + +class QTextEdit; +class QSyntaxHighlighter; +class SpellerBase; +class Speller; + +typedef QMap MAP_BOOL; + +class SpellPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + SpellPlugin(unsigned, Buffer*); + virtual ~SpellPlugin(); + + void reset(); + + unsigned CmdSpell; + + QStringList suggestions(const QString &word); + void add(const QString &word); + bool check(const QString &word); + void ignore(const QString &word); + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); + +signals: + void misspelling(const QString &word); + void configChanged(); + +protected slots: + void textEditFinished(QTextEdit*); + void tempChildDestroyed(QObject*); + +protected: + bool eventFilter(QObject *o, QEvent *e); + virtual bool event( QEvent *e ); + virtual bool processEvent(SIM::Event *e); + virtual QByteArray getConfig(); + virtual QWidget *createConfigWindow(QWidget *parent); + void activate(); + void deactivate(); + bool m_bActive; + SpellerBase *m_base; + QList m_spellers; + QList m_listTempChilds; + QStringList m_listIgnore; + +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/spell/spell.rc b/plugins/spell/spell.rc new file mode 100644 index 0000000..95f9f4c --- /dev/null +++ b/plugins/spell/spell.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,0,9,2 + PRODUCTVERSION 0,0,9,2 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Core plugin\0" + VALUE "FileVersion", "0, 0, 9, 4\0" + VALUE "InternalName", "spell\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "spell.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 0, 9, 4\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/spell/spell.vcproj b/plugins/spell/spell.vcproj new file mode 100644 index 0000000..7fd5d42 --- /dev/null +++ b/plugins/spell/spell.vcproj @@ -0,0 +1,596 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/spell/spellcfg.cpp b/plugins/spell/spellcfg.cpp new file mode 100644 index 0000000..a8aa10d --- /dev/null +++ b/plugins/spell/spellcfg.cpp @@ -0,0 +1,137 @@ +/*************************************************************************** + spellcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "spellcfg.h" +#include "spell.h" +#include "speller.h" +#ifdef WIN32 +#include "spellfind.h" +#endif + +#include "log.h" +#include "simgui/editfile.h" + +using namespace SIM; + +SpellConfig::SpellConfig(QWidget *parent, SpellPlugin *plugin) : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; +#ifdef WIN32 + edtPath->setText(m_plugin->value("Path").toString()); + edtPath->setFilter(i18n("ASpell(aspell.exe)")); + m_find = NULL; +#else + lblPath->hide(); + edtPath->hide(); +#endif + connect(edtPath, SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + connect(btnFind, SIGNAL(clicked()), this, SLOT(find())); + textChanged(edtPath->text()); +} + +SpellConfig::~SpellConfig() +{ +#ifdef WIN32 + delete m_find; +#endif +} + +void SpellConfig::apply() +{ +#ifdef WIN32 + m_plugin->setValue("Path", edtPath->text()); +#endif + QString lang; + for(int c = 0; c < lstLang->count(); c++) + { + QListWidgetItem *item = lstLang->item( c ); + if (item->checkState() == Qt::Unchecked) + continue; + if (!lang.isEmpty()) + lang += ';'; + lang += item->text(); + } + m_plugin->setValue("Lang", lang); + m_plugin->reset(); +} + +void SpellConfig::textChanged(const QString &str) +{ + QString langs; +#ifdef WIN32 + if (str.isEmpty()){ + lnkAspell->show(); + btnFind->show(); + }else{ +#endif + lnkAspell->hide(); + btnFind->hide(); + SpellerBase base(str); + SpellerConfig cfg(base); + langs = cfg.getLangs(); +#ifdef WIN32 + } +#endif + lstLang->clear(); + if (langs.isEmpty()){ + lblLang->setEnabled(false); + lstLang->setEnabled(false); + }else{ + lblLang->setEnabled(true); + lstLang->setEnabled(true); + int r = 0; + while (!langs.isEmpty()){ + QString l = SIM::getToken(langs, ';'); + bool bCheck = false; + QString ll = m_plugin->value("Lang").toString(); + while (!ll.isEmpty()){ + QString lc = SIM::getToken(ll, ';'); + if (l == lc){ + bCheck = true; + break; + } + } + QListWidgetItem* item = new QListWidgetItem(); + item->setText(l); + item->setFlags( item->flags() | Qt::ItemIsUserCheckable ); + item->setCheckState( bCheck ? Qt::Checked : Qt::Unchecked ); + lstLang->insertItem( r, item ); + r++; + } + } +} + +void SpellConfig::find() +{ +#ifdef WIN32 + if (m_find == NULL){ + m_find = new SpellFind(edtPath); + connect(m_find, SIGNAL(finished()), this, SLOT(findFinished())); + } + raiseWindow(m_find); +#endif +} + +void SpellConfig::findFinished() +{ +#ifdef WIN32 + m_find = NULL; +#endif +} + +// vim: set expandtab: diff --git a/plugins/spell/spellcfg.h b/plugins/spell/spellcfg.h new file mode 100644 index 0000000..22e99ab --- /dev/null +++ b/plugins/spell/spellcfg.h @@ -0,0 +1,48 @@ +/*************************************************************************** + spellcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SPELLCFG_H +#define _SPELLCFG_H + +#include "ui_spellcfgbase.h" + +class SpellPlugin; + +#ifdef WIN32 +class SpellFind; +#endif + +class SpellConfig : public QWidget, public Ui::SpellConfigBase +{ + Q_OBJECT +public: + SpellConfig(QWidget *parent, SpellPlugin*); + ~SpellConfig(); +public slots: + void apply(); + void find(); + void findFinished(); + void textChanged(const QString &str); +protected: +#ifdef WIN32 + SpellFind *m_find; +#endif + SpellPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/spell/spellcfgbase.ui b/plugins/spell/spellcfgbase.ui new file mode 100644 index 0000000..dcdf48e --- /dev/null +++ b/plugins/spell/spellcfgbase.ui @@ -0,0 +1,98 @@ + + + SpellConfigBase + + + + 0 + 0 + 420 + 212 + + + + Form1 + + + + 11 + + + + + Path: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 0 + 0 + + + + + + + + Language: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + + + + 0 + 0 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://aspell.net/win32/"><span style=" text-decoration: underline; color:#0000ff;">Download ASpell</span></a></p></body></html> + + + + + + + &Find + + + + + + + + + + + + + EditFile + QWidget +
    simgui/editfile.h
    +
    +
    + + +
    diff --git a/plugins/spell/speller.cpp b/plugins/spell/speller.cpp new file mode 100644 index 0000000..4755345 --- /dev/null +++ b/plugins/spell/speller.cpp @@ -0,0 +1,229 @@ +/*************************************************************************** + speller.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "speller.h" + +#include "log.h" + +#include +#include + +#ifdef Q_OS_WIN + +#include + +SpellerBase::SpellerBase(const QString &path) +{ + init(); + QString p = path; + int n = p.lastIndexOf('\\'); + if (n >= 0) + p = p.left(n); + p += "\\aspell-15.dll"; + m_aspellLib = new QLibrary(p); + + if (m_aspellLib->load() && m_aspellLib->isLoaded()){ + (void*&)_new_aspell_config = m_aspellLib->resolve("new_aspell_config"); + (void*&)_delete_aspell_config = m_aspellLib->resolve("new_aspell_config"); + (void*&)_get_aspell_dict_info_list = m_aspellLib->resolve("get_aspell_dict_info_list"); + (void*&)_aspell_dict_info_list_elements = m_aspellLib->resolve("aspell_dict_info_list_elements"); + (void*&)_delete_aspell_dict_info_enumeration = m_aspellLib->resolve("delete_aspell_dict_info_enumeration"); + (void*&)_aspell_dict_info_enumeration_next = m_aspellLib->resolve("aspell_dict_info_enumeration_next"); + (void*&)_aspell_config_replace = m_aspellLib->resolve("aspell_config_replace"); + (void*&)_new_aspell_speller = m_aspellLib->resolve("new_aspell_speller"); + (void*&)_to_aspell_speller = m_aspellLib->resolve("to_aspell_speller"); + (void*&)_delete_aspell_speller = m_aspellLib->resolve("delete_aspell_speller"); + (void*&)_aspell_error_message = m_aspellLib->resolve("aspell_error_message"); + (void*&)_aspell_error = m_aspellLib->resolve("aspell_error"); + (void*&)_delete_aspell_can_have_error = m_aspellLib->resolve("delete_aspell_can_have_error"); + (void*&)_aspell_speller_check = m_aspellLib->resolve("aspell_speller_check"); + (void*&)_aspell_speller_suggest = m_aspellLib->resolve("aspell_speller_suggest"); + (void*&)_aspell_word_list_elements = m_aspellLib->resolve("aspell_word_list_elements"); + (void*&)_aspell_string_enumeration_next = m_aspellLib->resolve("aspell_string_enumeration_next"); + (void*&)_aspell_speller_add_to_personal = m_aspellLib->resolve("aspell_speller_add_to_personal"); + if ((_new_aspell_config == NULL) || + (_delete_aspell_config == NULL) || + (_get_aspell_dict_info_list == NULL) || + (_aspell_dict_info_list_elements == NULL) || + (_delete_aspell_dict_info_enumeration == NULL) || + (_aspell_dict_info_enumeration_next == NULL) || + (_aspell_config_replace == NULL) || + (_new_aspell_speller == NULL) || + (_to_aspell_speller == NULL) || + (_delete_aspell_speller == NULL) || + (_aspell_error_message == NULL) || + (_aspell_error == NULL) || + (_delete_aspell_can_have_error == NULL) || + (_aspell_speller_check == NULL) || + (_aspell_speller_suggest == NULL) || + (_aspell_word_list_elements == NULL) || + (_aspell_string_enumeration_next == NULL) || + (_aspell_speller_add_to_personal == NULL)){ + delete m_aspellLib; + m_aspellLib = NULL; + init(); + } + } +} + +SpellerBase::~SpellerBase() +{ + delete m_aspellLib; +} + +void SpellerBase::init() +{ + _new_aspell_config = NULL; + _delete_aspell_config = NULL; + _get_aspell_dict_info_list = NULL; + _aspell_dict_info_list_elements = NULL; + _delete_aspell_dict_info_enumeration = NULL; + _aspell_dict_info_enumeration_next = NULL; + _aspell_config_replace = NULL; + _new_aspell_speller = NULL; + _to_aspell_speller = NULL; + _delete_aspell_speller = NULL; + _aspell_error_message = NULL; + _aspell_error = NULL; + _delete_aspell_can_have_error = NULL; + _aspell_speller_check = NULL; + _aspell_speller_suggest = NULL; + _aspell_word_list_elements = NULL; + _aspell_string_enumeration_next = NULL; + _aspell_speller_add_to_personal = NULL; +} + +#define new_aspell_config() m_base._new_aspell_config() +#define delete_aspell_config(cfg) m_base._delete_aspell_config(cfg) +#define get_aspell_dict_info_list(cfg) m_base._get_aspell_dict_info_list(cfg) +#define aspell_dict_info_list_elements(dlist) m_base._aspell_dict_info_list_elements(dlist) +#define delete_aspell_dict_info_enumeration(dlist) m_base._delete_aspell_dict_info_enumeration(dlist) +#define aspell_dict_info_enumeration_next(dlist) m_base._aspell_dict_info_enumeration_next(dlist) +#define aspell_config_replace(c, k, v) m_base._aspell_config_replace(c, k, v) +#define new_aspell_speller(dlist) m_base._new_aspell_speller(dlist) +#define to_aspell_speller(dlist) m_base._to_aspell_speller(dlist) +#define delete_aspell_speller(dlist) m_base._delete_aspell_speller(dlist) +#define aspell_error_message(dlist) m_base._aspell_error_message(dlist) +#define aspell_error(dlist) m_base._aspell_error(dlist) +#define delete_aspell_can_have_error(dlist) m_base._delete_aspell_can_have_error(dlist) +#define aspell_speller_check(c, v, s) m_base._aspell_speller_check(c, v, s) +#define aspell_speller_suggest(c, v, s) m_base._aspell_speller_suggest(c, v, s) +#define aspell_word_list_elements(c) m_base._aspell_word_list_elements(c) +#define aspell_string_enumeration_next(c) m_base._aspell_string_enumeration_next(c) +#define aspell_speller_add_to_personal(c, v, s) m_base._aspell_speller_suggest(c, v, s) + +#else + +SpellerBase::SpellerBase(const QString &) +{} + +SpellerBase::~SpellerBase() +{} + +#endif + + +SpellerConfig::SpellerConfig(SpellerBase &base) + : m_base(base) +{ +#ifdef WIN32 + cfg = NULL; + if (m_base._new_aspell_config) + cfg = new_aspell_config(); +#else + cfg = new_aspell_config(); +#endif +} + +SpellerConfig::~SpellerConfig() +{ + if (cfg) + delete_aspell_config(cfg); +} + +QString SpellerConfig::getLangs() +{ + QString res; + if (cfg == NULL) + return res; + AspellDictInfoList *dlist = get_aspell_dict_info_list(cfg); + AspellDictInfoEnumeration *dels = aspell_dict_info_list_elements(dlist); + const AspellDictInfo *entry; + while ((entry = aspell_dict_info_enumeration_next(dels)) != NULL){ + if (!res.isEmpty()) + res += ';'; + res += entry->name; + } + delete_aspell_dict_info_enumeration(dels); + return res; +} + +int SpellerConfig::setKey(const char *key, const QString &val) +{ + if (cfg == NULL) + return -1; + return aspell_config_replace(cfg, key, val.toUtf8()); +} + +Speller::Speller(SpellerConfig *cfg) + : m_base(cfg->m_base) +{ + speller = NULL; + if (cfg->cfg){ + AspellCanHaveError *ret = new_aspell_speller(cfg->cfg); + if (aspell_error(ret) != 0){ + SIM::log(SIM::L_WARN, "Spell: %s", aspell_error_message(ret)); + delete_aspell_can_have_error(ret); + return; + } + speller = to_aspell_speller(ret); + } +} + +Speller::~Speller() +{ + if (speller) + delete_aspell_speller(speller); +} + +int Speller::check(const char *word) +{ + if (speller == NULL) + return -1; + return aspell_speller_check(speller, word, strlen(word)); +} + +bool Speller::add(const char *word) +{ + if (speller == NULL) + return false; + return aspell_speller_check(speller, word, strlen(word)) != 0; +} + +QStringList Speller::suggestions(const char *word) +{ + QStringList res; + const AspellWordList *wl = aspell_speller_suggest(speller, word, -1); + if (wl){ + AspellStringEnumeration *els = aspell_word_list_elements(wl); + const char *word; + while ((word = aspell_string_enumeration_next(els)) != NULL) { + res.append(QString::fromUtf8(word)); + } + } + return res; +} diff --git a/plugins/spell/speller.h b/plugins/spell/speller.h new file mode 100644 index 0000000..e21c30c --- /dev/null +++ b/plugins/spell/speller.h @@ -0,0 +1,88 @@ +/*************************************************************************** + speller.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SPELLER_H +#define _SPELLER_H + +#include "simapi.h" + +#include +#include +#include + +class SpellerBase +{ +public: + SpellerBase(const QString &path); + ~SpellerBase(); + +#ifdef WIN32 + struct AspellConfig *(*_new_aspell_config)(); + void (*_delete_aspell_config)(struct AspellConfig * ths); + struct AspellDictInfoList *(*_get_aspell_dict_info_list)(struct AspellConfig * config); + struct AspellDictInfoEnumeration *(*_aspell_dict_info_list_elements)(const struct AspellDictInfoList * ths); + void (*_delete_aspell_dict_info_enumeration)(struct AspellDictInfoEnumeration * ths); + const struct AspellDictInfo *(*_aspell_dict_info_enumeration_next)(struct AspellDictInfoEnumeration * ths); + int (*_aspell_config_replace)(struct AspellConfig * ths, const char * key, const char * value); + struct AspellCanHaveError *(*_new_aspell_speller)(struct AspellConfig * config); + struct AspellSpeller *(*_to_aspell_speller)(struct AspellCanHaveError * obj); + void (*_delete_aspell_speller)(struct AspellSpeller * ths); + const char *(*_aspell_error_message)(const struct AspellCanHaveError * ths); + const struct AspellError *(*_aspell_error)(const struct AspellCanHaveError * ths); + void (*_delete_aspell_can_have_error)(struct AspellCanHaveError * ths); + int (*_aspell_speller_check)(struct AspellSpeller * ths, const char * word, int word_size); + const struct AspellWordList *(*_aspell_speller_suggest)(struct AspellSpeller * ths, const char * word, int word_size); + struct AspellStringEnumeration *(*_aspell_word_list_elements)(const struct AspellWordList * ths); + const char *(*_aspell_string_enumeration_next)(struct AspellStringEnumeration * ths); + int (*_aspell_speller_add_to_personal)(struct AspellSpeller * ths, const char * word, int word_size); +protected: + void init(); + class QLibrary *m_aspellLib; +#endif +}; + +class SpellerConfig +{ + COPY_RESTRICTED(SpellerConfig); +public: + SpellerConfig(SpellerBase &base); + ~SpellerConfig(); + QString getLangs(); + int setKey(const char *key, const QString &val); +protected: + struct AspellConfig *cfg; + SpellerBase &m_base; + friend class Speller; +}; + +class Speller +{ + COPY_RESTRICTED(Speller); +public: + Speller(SpellerConfig *cfg); + ~Speller(); + bool created() { return speller != NULL; } + int check(const char *word); + QStringList suggestions(const char *word); + bool add(const char *word); +protected: + struct AspellSpeller *speller; + SpellerBase &m_base; +}; + +#endif + diff --git a/plugins/spell/spellfind.cpp b/plugins/spell/spellfind.cpp new file mode 100644 index 0000000..77bd876 --- /dev/null +++ b/plugins/spell/spellfind.cpp @@ -0,0 +1,121 @@ +/*************************************************************************** + spellfind.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include + +#include "simgui/editfile.h" +#include "icons.h" +#include "misc.h" + +#include "spellfind.h" + +using namespace std; +using namespace SIM; + +SpellFind::SpellFind(EditFile *edt) + : QDialog(NULL) + , m_edit(edt) +{ + setupUi(this); + setModal(false); + setAttribute(Qt::WA_DeleteOnClose); + SET_WNDPROC("find") + setWindowIcon(Icon("find")); + setButtonsPict(this); + connect(btnCancel, SIGNAL(clicked()), this, SLOT(close())); + m_drives = QDir::drives(); + m_drive = m_drives.first(); + QTimer::singleShot(0, this, SLOT(next())); +} + +SpellFind::~SpellFind() +{ + emit finished(); +} + +void SpellFind::next() +{ + if (!m_tree.empty()){ + QStringList &subDirs = m_tree.top(); + int pos = (int)m_pos.top(); + if (pos >= subDirs.count()){ + m_tree.pop(); + m_pos.pop(); + m_path = m_path.left(m_path.length() - 1); + m_path = m_path.left(m_path.lastIndexOf('\\') + 1); + QTimer::singleShot(0, this, SLOT(next())); + return; + } + QString subDir = subDirs[pos++]; + m_pos.pop(); + m_pos.push(pos); + if (!subDir.startsWith(".")){ + m_path += subDir; + m_path += '\\'; + if (checkPath()) + return; + } + QTimer::singleShot(0, this, SLOT(next())); + return; + } + m_path = m_drive.absoluteFilePath(); + m_path = m_path.replace('/', '\\'); + if ((GetDriveTypeW((LPCWSTR)m_path.utf16()) == DRIVE_FIXED) && checkPath()) + return; + m_drives.removeFirst(); + if(m_drives.count() == 0) { + close(); + return; + } + m_drive = m_drives.first(); + QTimer::singleShot(0, this, SLOT(next())); +} + +bool SpellFind::checkPath() +{ + QDir d(m_path); + if (!d.exists()) + return false; + QString p = m_path; + if (p.length() > 40){ + p = "..."; + p += m_path.mid(m_path.length() - 38); + } + lblPath->setText(p); + QFile f(m_path + "aspell.exe"); + if (f.exists()){ + m_edit->setText(m_path + "aspell.exe"); + QTimer::singleShot(0, this, SLOT(close())); + return true; + } + QStringList subDirs = d.entryList(QDir::Dirs); + if (!subDirs.isEmpty()){ + m_tree.push(subDirs); + m_pos.push(0); + }else{ + m_path = m_path.left(m_path.lastIndexOf('\\')); + } + return false; +} + diff --git a/plugins/spell/spellfind.h b/plugins/spell/spellfind.h new file mode 100644 index 0000000..ae80f4f --- /dev/null +++ b/plugins/spell/spellfind.h @@ -0,0 +1,48 @@ +/*************************************************************************** + spellfind.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SPELLFIND_H +#define _SPELLFIND_H + +#include +#include +#include "ui_spellfindbase.h" + +class EditFile; + +class SpellFind : public QDialog, public Ui::SpellFindBase +{ + Q_OBJECT +public: + SpellFind(EditFile *edt); + ~SpellFind(); +signals: + void finished(); +protected slots: + void next(); +protected: + bool checkPath(); + QString m_path; + std::stack m_tree; + std::stack m_pos; + QFileInfoList m_drives; + QFileInfo m_drive; + EditFile *m_edit; +}; + +#endif + diff --git a/plugins/spell/spellfindbase.ui b/plugins/spell/spellfindbase.ui new file mode 100644 index 0000000..178cb68 --- /dev/null +++ b/plugins/spell/spellfindbase.ui @@ -0,0 +1,86 @@ + + + + + SpellFindBase + + + + 0 + 0 + 354 + 97 + + + + Find ASpell + + + true + + + + 11 + + + 6 + + + + + + 1 + 7 + + + + + + + false + + + + + + + &Cancel + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + qPixmapFromMimeSource + diff --git a/plugins/spell/spellhighlight.cpp b/plugins/spell/spellhighlight.cpp new file mode 100644 index 0000000..e653ffd --- /dev/null +++ b/plugins/spell/spellhighlight.cpp @@ -0,0 +1,158 @@ +/*************************************************************************** + spellhighlight.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "log.h" +#include "simgui/textshow.h" + +#include "spellhighlight.h" +#include "spell.h" +#include "msgedit.h" + +#include +#include + +using namespace std; +using namespace SIM; +const unsigned ErrorColor = 0xFF0101; + +SpellHighlighter::SpellHighlighter(QTextEdit *edit, SpellPlugin *plugin) + : QSyntaxHighlighter(edit) + , EventReceiver(SIM::HighPriority) + , m_plugin( plugin ) +{ +} + +SpellHighlighter::~SpellHighlighter() +{ +} + +void SpellHighlighter::highlightBlock( const QString &sText ) +{ + QTextCharFormat format; + format.setUnderlineColor( Qt::red ); + format.setUnderlineStyle( QTextCharFormat::SpellCheckUnderline ); + + QRegExp expression( "\\b(\\w+)\\W+" ); + QRegExp expression2( "\\b(\\w+)" ); + int index = expression.indexIn( sText ); + while (index >= 0) { + int length = expression.matchedLength(); + QString s = sText.mid( index, length ); + expression2.indexIn( s ); + QString sWord = s.left( expression2.matchedLength() ); + if( !m_plugin->check( sWord ) ) { + setFormat( index, expression2.matchedLength(), format ); + } + index = expression.indexIn( sText, index + length ); + } +} + +bool SpellHighlighter::processEvent(SIM::Event *e) +{ + if (e->type() == SIM::eEventCheckCommandState){ + SIM::EventCheckCommandState *ecs = static_cast(e); + SIM::CommandDef *cmd = ecs->cmd(); + if (cmd->id == m_plugin->CmdSpell){ + TextEdit *pEdit = (TextEdit*)(cmd->param); + if( pEdit->document() != document() ) + return false; + m_listSuggestions.clear(); + QTextCursor cursor = pEdit->cursorForPosition( pEdit->m_popupPos ); + cursor.select( QTextCursor::WordUnderCursor ); + QString sWord = cursor.selectedText(); + if( sWord.isEmpty() ) + return false; + if( m_plugin->check( sWord ) ) + return false; + + m_listSuggestions = m_plugin->suggestions( sWord ); + SIM::CommandDef *cmds = new SIM::CommandDef[m_listSuggestions.count() + 3]; + unsigned i = 0; + for (QStringList::Iterator it = m_listSuggestions.begin(); it != m_listSuggestions.end(); ++it, i++){ + cmds[i].id = m_plugin->CmdSpell + i + 2; + cmds[i].text = "_"; + cmds[i].text_wrk = (*it); + if (i >= 10){ + i++; + break; + } + } + cmds[i].id = m_plugin->CmdSpell; + cmds[i].text = "_"; + cmds[i].text_wrk = i18n("Add '%1'").arg( sWord ); + i++; + cmds[i].id = m_plugin->CmdSpell + 1; + cmds[i].text = "_"; + cmds[i].text_wrk = i18n("Ignore '%1'").arg( sWord ); + + cmd->param = cmds; + cmd->flags |= SIM::COMMAND_RECURSIVE; + + return true; + } + } else + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->id >= m_plugin->CmdSpell) && (cmd->id < m_plugin->CmdSpell + m_listSuggestions.count() + 1)){ + TextEdit *pEdit = (TextEdit*)(cmd->param); + if( pEdit->document() != document() ) + return false; + QTextCursor cursor = pEdit->cursorForPosition( pEdit->m_popupPos ); + cursor.select( QTextCursor::WordUnderCursor ); + QString sWord = cursor.selectedText(); + if( sWord.isEmpty() ) + return false; + if (cmd->id == m_plugin->CmdSpell){ + m_plugin->add( sWord ); +/* + MAP_BOOL::iterator it = m_words.find(SIM::my_string( sWord )); + if (it == m_words.end()){ + m_words.insert(MAP_BOOL::value_type(SIM::my_string(m_word), true)); + }else{ + if (it->second) + return false; + it->second = true; + } + m_bDirty = true; + QTimer::singleShot(300, this, SLOT(reformat())); +*/ + }else if (cmd->id == m_plugin->CmdSpell + 1){ +/* + MAP_BOOL::iterator it = m_plugin->m_ignore.find(SIM::my_string(m_word)); + if (it == m_plugin->m_ignore.end()) + m_plugin->m_ignore.insert(MAP_BOOL::value_type(SIM::my_string(m_word), true)); + it = m_words.find(SIM::my_string(m_word)); + if (it == m_words.end()){ + m_words.insert(MAP_BOOL::value_type(SIM::my_string(m_word), true)); + }else{ + if (it->second) + return false; + it->second = true; + } + m_bDirty = true; + QTimer::singleShot(300, this, SLOT(reformat())); +*/ + }else{ + sWord = m_listSuggestions[cmd->id - m_plugin->CmdSpell - 2]; + cursor.insertText( sWord ); + } + } + } + + return false; +} diff --git a/plugins/spell/spellhighlight.h b/plugins/spell/spellhighlight.h new file mode 100644 index 0000000..7a61019 --- /dev/null +++ b/plugins/spell/spellhighlight.h @@ -0,0 +1,44 @@ +/*************************************************************************** + spellhighlight.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SPELLHIGHLIGHT_H +#define _SPELLHIGHLIGHT_H + +#include "spell.h" + +#include +#include + +class SpellHighlighter + : public QSyntaxHighlighter + , public SIM::EventReceiver +{ + Q_OBJECT +public: + SpellHighlighter(QTextEdit *edit, SpellPlugin *m_plugin); + virtual ~SpellHighlighter(); + + virtual void highlightBlock( const QString &sText ); + +protected: + virtual bool processEvent(SIM::Event *e); + SpellPlugin *m_plugin; + QStringList m_listSuggestions; +}; + +#endif + diff --git a/plugins/splash/CMakeLists.txt b/plugins/splash/CMakeLists.txt new file mode 100644 index 0000000..c8bbe56 --- /dev/null +++ b/plugins/splash/CMakeLists.txt @@ -0,0 +1,20 @@ +################## +# splash library # +################## +IF(BUILD_DROPPED) +SET(splash_SRCS + splash.cpp +) + +SET(splash_HDRS + splash.h +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(splash) + +# splash.png +INSTALL(FILES splash.png DESTINATION ${SIM_PICT_DIR}) +ENDIF(BUILD_DROPPED) diff --git a/plugins/splash/SIM-IM.svg b/plugins/splash/SIM-IM.svg new file mode 100644 index 0000000..01a5315 --- /dev/null +++ b/plugins/splash/SIM-IM.svg @@ -0,0 +1,976 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Simple Instant Messenger + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + Simple Instant Messenger + Sim-IM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/splash/simsvg-template.png b/plugins/splash/simsvg-template.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7a57e03773b83cdc2f8a219bc272b1e38bde4c GIT binary patch literal 5797 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 +#include +#include +#include +#include +#include +#include +#include + +#include "aboutdata.h" +#include "misc.h" +#include "log.h" + +#include "splash.h" + + +using namespace SIM; + +Plugin *createSplashPlugin(unsigned base, bool bStart, Buffer*) +{ + Plugin *plugin = new SplashPlugin(base, bStart); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Splash"), + I18N_NOOP("Plugin provides splash screen"), + VERSION, + createSplashPlugin, + PLUGIN_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +SplashPlugin::SplashPlugin(unsigned base, bool bStart) : QObject(NULL), Plugin(base) +{ + splash = NULL; + m_bStart = bStart; + if (m_bStart) + { + QPixmap pict(app_file("pict/splash.png")); + // FIXME: better use QSplash with QSplashScreen::drawContents() + if(!pict.isNull()) + { + //KAboutData *about_data = getAboutData(); + QString text = "";// about_data->programName(); + text += " "; + //text += about_data->version(); + QPainter p(&pict); + QFont f = qApp->font(); + f.setBold(true); + p.setFont(f); + QRect rc = p.boundingRect(0, 0, pict.width(), pict.height(), Qt::AlignLeft | Qt::AlignTop, text); + int x = pict.width() - 7 - rc.width(); + int y = 7 + rc.height(); + p.setPen(QColor(0x80, 0x80, 0x80)); + p.drawText(x, y, text); + x -= 2; + y -= 2; + p.setPen(QColor(0xFF, 0xFF, 0xE0)); + p.drawText(x, y, text); + splash = new QWidget(NULL, Qt::SplashScreen); + splash->setObjectName("splash"); + + QDesktopWidget *desktop = qApp->desktop(); //QApplication::desktop(); + int desk_width = desktop->geometry().width(); + int desk_height = desktop->geometry().height(); + if ((desk_width/desk_height)==2) //widescreen or double screen + splash->move((desktop->width()/2 - pict.width()) / 2, (desktop->height() - pict.height()) / 2); + else //normal screen + splash->move((desktop->width() - pict.width()) / 2, (desktop->height() - pict.height()) / 2); + QPalette palette = splash->palette(); + palette.setBrush(splash->backgroundRole(), QBrush(pict)); + splash->setPalette(palette); + splash->resize(pict.width(), pict.height()); + splash->repaint(); + const QBitmap mask = pict.mask(); + p.end(); + if (!mask.isNull()) + splash->setMask(mask); + splash->show(); + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); + m_timer->start(5000); + } + } +} + +SplashPlugin::~SplashPlugin() +{ + delete splash; +} + +void SplashPlugin::timeout() //Anywhere is definitly a bug. Splash is going to be unloaded and not fulltime displayed... +{ + splash->hide(); +} + diff --git a/plugins/splash/splash.h b/plugins/splash/splash.h new file mode 100644 index 0000000..0c78d89 --- /dev/null +++ b/plugins/splash/splash.h @@ -0,0 +1,46 @@ +/*************************************************************************** + splash.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _SPLASH_H +#define _SPLASH_H + +#include + +#include "event.h" +#include "plugins.h" + +class QWidget; + +class SplashPlugin : public QObject, public SIM::Plugin +{ + Q_OBJECT +public: + SplashPlugin(unsigned base, bool bStart); + virtual ~SplashPlugin(); + +protected: + + QWidget *splash; + bool m_bStart; + QTimer *m_timer; +protected slots: + void timeout(); + +}; + +#endif + diff --git a/plugins/splash/splash.png b/plugins/splash/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..93160c50bd7d2a14df295043ebc81dd4677ed0a9 GIT binary patch literal 6386 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/styles/CMakeLists.txt b/plugins/styles/CMakeLists.txt new file mode 100644 index 0000000..f940e00 --- /dev/null +++ b/plugins/styles/CMakeLists.txt @@ -0,0 +1,27 @@ +################## +# styles library # +################## + +IF(BUILD_DROPPED) +SET(styles_SRCS + fontconfig.cpp + styles.cpp + stylescfg.cpp +) + +SET(styles_HDRS + fontconfig.h + styles.h + stylescfg.h +) + +SET(styles_UICS + fontconfigbase.ui + stylescfgbase.ui +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(styles) +ENDIF(BUILD_DROPPED) diff --git a/plugins/styles/fontconfig.cpp b/plugins/styles/fontconfig.cpp new file mode 100644 index 0000000..57987cf --- /dev/null +++ b/plugins/styles/fontconfig.cpp @@ -0,0 +1,112 @@ +/*************************************************************************** + fontconfig.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "fontconfig.h" +#include "simgui/fontedit.h" +#include "styles.h" +#include "simgui/qcolorbutton.h" + +#include +#include +#include + +FontConfig::FontConfig(QWidget *parent, StylesPlugin *plugin) + : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; + connect(chkSystem, SIGNAL(toggled(bool)), this, SLOT(systemToggled(bool))); + connect(chkColors, SIGNAL(toggled(bool)), this, SLOT(colorsToggled(bool))); + chkSystem->setChecked(m_plugin->value("SystemFonts").toBool()); + systemToggled(chkSystem->isChecked()); + if (!chkSystem->isChecked()){ + QMenu m; + QFont base = QApplication::font(); + QFont menu = QApplication::font(&m); + base = FontEdit::str2font(m_plugin->value("BaseFont").toString(), base); + menu = FontEdit::str2font(m_plugin->value("MenuFont").toString(), menu); + edtFont->setFont(FontEdit::font2str(base, true)); + edtMenu->setFont(FontEdit::font2str(menu, true)); + } + + chkColors->setChecked(m_plugin->value("SystemColors").toBool()); + colorsToggled(chkColors->isChecked()); +} + +FontConfig::~FontConfig() +{ +} + +void FontConfig::apply() +{ + QString base; + QString menu; + if (chkSystem->isChecked()){ + m_plugin->setValue("SystemFonts", true); + }else{ + m_plugin->setValue("SystemFonts", false); + base = edtFont->getFont(); + menu = edtMenu->getFont(); + } + m_plugin->setValue("BaseFont", base); + m_plugin->setValue("MenuFont", menu); + m_plugin->setFonts(); + + bool bChanged = false; + if (chkColors->isChecked()){ + if (!m_plugin->value("SystemColors").toBool()){ + m_plugin->setValue("SystemColors", true); + bChanged = true; + } + }else{ + if (m_plugin->value("SystemColors").toBool()){ + bChanged = true; + }else{ + bChanged = ((btnBtnColor->color().rgb() & 0xFFFFFF) != m_plugin->value("BtnColor").toUInt()) || + ((btnBgColor->color().rgb() & 0xFFFFFF) != m_plugin->value("BgColor").toUInt()); + } + m_plugin->setValue("SystemColors", false); + if (bChanged){ + m_plugin->setValue("BtnColor", btnBtnColor->color().rgb() & 0xFFFFFF); + m_plugin->setValue("BgColor", btnBgColor->color().rgb() & 0xFFFFFF); + } + } + if (bChanged) + m_plugin->setColors(); +} + +void FontConfig::systemToggled(bool bState) +{ + edtFont->setEnabled(!bState); + edtMenu->setEnabled(!bState); + if (bState){ + m_plugin->setupDefaultFonts(); + edtFont->setFont(FontEdit::font2str(*m_plugin->m_saveBaseFont, true)); + edtMenu->setFont(FontEdit::font2str(*m_plugin->m_saveMenuFont, true)); + } +} + +void FontConfig::colorsToggled(bool bState) +{ + btnBtnColor->setEnabled(!bState); + btnBgColor->setEnabled(!bState); + if (!bState){ + btnBtnColor->setColor(QColor(m_plugin->value("BtnColor").toUInt() & 0xFFFFFF)); + btnBgColor->setColor(QColor(m_plugin->value("BgColor").toUInt() & 0xFFFFFF)); + } +} + diff --git a/plugins/styles/fontconfig.h b/plugins/styles/fontconfig.h new file mode 100644 index 0000000..b0073c3 --- /dev/null +++ b/plugins/styles/fontconfig.h @@ -0,0 +1,40 @@ +/*************************************************************************** + fontconfig.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _FONTCONFIG_H +#define _FONTCONFIG_H + +#include "ui_fontconfigbase.h" + +class StylesPlugin; + +class FontConfig : public QWidget, public Ui::FontConfigBase +{ + Q_OBJECT +public: + FontConfig(QWidget *parent, StylesPlugin *plugin); + ~FontConfig(); +public slots: + void apply(); + void systemToggled(bool); + void colorsToggled(bool); +protected: + StylesPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/styles/fontconfigbase.ui b/plugins/styles/fontconfigbase.ui new file mode 100644 index 0000000..e7530cb --- /dev/null +++ b/plugins/styles/fontconfigbase.ui @@ -0,0 +1,151 @@ + + + FontConfigBase + + + + 0 + 0 + 365 + 244 + + + + Form1 + + + + + + Use &system fonts + + + + + + + + + Base font: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + + + + Menu font: + + + false + + + + + + + + + + + + Use system &colors + + + + + + + + + + 0 + 0 + + + + Button color: + + + false + + + + + + + + + + + 0 + 0 + + + + Background color: + + + false + + + + + + + + + + + + Qt::Horizontal + + + + 154 + 20 + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + QColorButton + QWidget +
    simgui/qcolorbutton.h
    +
    + + FontEdit + QWidget +
    simgui/fontedit.h
    +
    +
    + + +
    diff --git a/plugins/styles/metal/CMakeLists.txt b/plugins/styles/metal/CMakeLists.txt new file mode 100644 index 0000000..66a8935 --- /dev/null +++ b/plugins/styles/metal/CMakeLists.txt @@ -0,0 +1,31 @@ +################# +# metal library # +################# +PROJECT(metal) + +SET(metal_LIB_SRCS + metal.cpp +) + +SET(metal_LIB_HDRS + metal.h +) + +# moc, if needed +KDE3_AUTOMOC(${metal_LIB_SRCS}) + +ADD_LIBRARY(metal SHARED ${metal_LIB_SRCS} ${metal_LIB_HDRS}) + +# some needed include dirs +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + +TARGET_LINK_LIBRARIES(metal simlib) + +SET_TARGET_PROPERTIES(metal PROPERTIES PREFIX "") + +# install target +INSTALL(TARGETS metal LIBRARY DESTINATION ${SIM_PLUGIN_DIR}/styles RUNTIME DESTINATION ${SIM_PLUGIN_DIR}/styles) + +IF(WIN32) + SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/plugins/styles) +ENDIF(WIN32) diff --git a/plugins/styles/metal/marble.xpm b/plugins/styles/metal/marble.xpm new file mode 100644 index 0000000..1c08049 --- /dev/null +++ b/plugins/styles/metal/marble.xpm @@ -0,0 +1,470 @@ +/* XPM */ +static const char *marble_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 240 240 223 2", +/* colors */ +".. c #959595", +".# c #c5c5c5", +".a c #adadad", +".b c #dedede", +".c c #b7b7b7", +".d c #d2d2d2", +".e c #bebebe", +".f c #c9c9c9", +".g c #b8b8b8", +".h c #d6d6d6", +".i c #9e9e9e", +".j c #eaeaea", +".k c #b2b2b2", +".l c #cecece", +".m c #a5a5a5", +".n c #e4e4e4", +".o c #c4c4c4", +".p c #d9d9d9", +".q c #b1b1b1", +".r c #d8d8d8", +".s c #e0e0e0", +".t c #d6d6d6", +".u c #b6b6b6", +".v c #bfbfbf", +".w c #cbcbcb", +".x c #a5a5a5", +".y c #d1d1d1", +".z c #cdcdcd", +".A c #aaaaaa", +".B c #9a9a9a", +".C c #dedede", +".D c #aeaeae", +".E c #e6e6e6", +".F c #d3d3d3", +".G c #c8c8c8", +".H c #bababa", +".I c #c4c4c4", +".J c #cccccc", +".K c #bcbcbc", +".L c #f0f0f0", +".M c #b5b5b5", +".N c #e3e3e3", +".O c #c2c2c2", +".P c #adadad", +".Q c #c9c9c9", +".R c #e1e1e1", +".S c #a2a2a2", +".T c #d1d1d1", +".U c #bebebe", +".V c #dbdbdb", +".W c #dbdbdb", +".X c #c8c8c8", +".Y c #b9b9b9", +".Z c #a8a8a8", +".0 c #d3d3d3", +".1 c #9f9f9f", +".2 c #c1c1c1", +".3 c #ebebeb", +".4 c #b4b4b4", +".5 c #d9d9d9", +".6 c #cecece", +".7 c #e8e8e8", +".8 c #d6d6d6", +".9 c #c5c5c5", +"#. c #b0b0b0", +"## c #dadada", +"#a c #c5c5c5", +"#b c #d1d1d1", +"#c c #afafaf", +"#d c #b1b1b1", +"#e c #cbcbcb", +"#f c #c1c1c1", +"#g c #eeeeee", +"#h c #9b9b9b", +"#i c #c6c6c6", +"#j c #c0c0c0", +"#k c #cbcbcb", +"#l c #bdbdbd", +"#m c #a1a1a1", +"#n c #b7b7b7", +"#o c #a7a7a7", +"#p c #e6e6e6", +"#q c #c9c9c9", +"#r c #bbbbbb", +"#s c #e2e2e2", +"#t c #b8b8b8", +"#u c #cdcdcd", +"#v c #d3d3d3", +"#w c #cfcfcf", +"#x c #e0e0e0", +"#y c #d5d5d5", +"#z c #bdbdbd", +"#A c #cecece", +"#B c #c0c0c0", +"#C c #b7b7b7", +"#D c #e5e5e5", +"#E c #c4c4c4", +"#F c #e3e3e3", +"#G c #d3d3d3", +"#H c #dddddd", +"#I c #dddddd", +"#J c #acacac", +"#K c #a3a3a3", +"#L c #eaeaea", +"#M c #e1e1e1", +"#N c #b9b9b9", +"#O c #d5d5d5", +"#P c #bababa", +"#Q c #d7d7d7", +"#R c #b5b5b5", +"#S c #d1d1d1", +"#T c #c6c6c6", +"#U c #dcdcdc", +"#V c #b4b4b4", +"#W c #c6c6c6", +"#X c #a8a8a8", +"#Y c #a0a0a0", +"#Z c #cbcbcb", +"#0 c #bfbfbf", +"#1 c #cbcbcb", +"#2 c #a4a4a4", +"#3 c #c0c0c0", +"#4 c #bbbbbb", +"#5 c #9c9c9c", +"#6 c #a2a2a2", +"#7 c #dcdcdc", +"#8 c #c3c3c3", +"#9 c #9d9d9d", +"a. c #aaaaaa", +"a# c #d5d5d5", +"aa c #eeeeee", +"ab c #b6b6b6", +"ac c #b0b0b0", +"ad c #b3b3b3", +"ae c #c9c9c9", +"af c #e9e9e9", +"ag c #bdbdbd", +"ah c #a0a0a0", +"ai c #b0b0b0", +"aj c #e8e8e8", +"ak c #cacaca", +"al c #c3c3c3", +"am c #dbdbdb", +"an c #d0d0d0", +"ao c #d8d8d8", +"ap c #c7c7c7", +"aq c #dcdcdc", +"ar c #c7c7c7", +"as c #f0f0f0", +"at c #a3a3a3", +"au c #bfbfbf", +"av c #d9d9d9", +"aw c #dfdfdf", +"ax c #d3d3d3", +"ay c #c0c0c0", +"az c #cacaca", +"aA c #b3b3b3", +"aB c #cfcfcf", +"aC c #dadada", +"aD c #b2b2b2", +"aE c #e2e2e2", +"aF c #d7d7d7", +"aG c #c4c4c4", +"aH c #b8b8b8", +"aI c #cdcdcd", +"aJ c #a6a6a6", +"aK c #d2d2d2", +"aL c #cecece", +"aM c #acacac", +"aN c #dfdfdf", +"aO c #d5d5d5", +"aP c #c9c9c9", +"aQ c #bcbcbc", +"aR c #c6c6c6", +"aS c #cdcdcd", +"aT c #bebebe", +"aU c #f2f2f2", +"aV c #b6b6b6", +"aW c #e4e4e4", +"aX c #c3c3c3", +"aY c #e2e2e2", +"aZ c #d2d2d2", +"a0 c #dddddd", +"a1 c #dcdcdc", +"a2 c #ececec", +"a3 c #eaeaea", +"a4 c #cccccc", +"a5 c #c7c7c7", +"a6 c #c2c2c2", +"a7 c #cccccc", +"a8 c #a8a8a8", +"a9 c #e7e7e7", +"b. c #e4e4e4", +"b# c #d9d9d9", +"ba c #bababa", +"bb c #cfcfcf", +"bc c #d4d4d4", +"bd c #d0d0d0", +"be c #aeaeae", +"bf c #e1e1e1", +"bg c #d7d7d7", +"bh c #cfcfcf", +"bi c #b8b8b8", +"bj c #e6e6e6", +"bk c #c5c5c5", +"bl c #e4e4e4", +"bm c #d4d4d4", +"bn c #dfdfdf", +"bo c #dedede", +"bp c #ececec", +"bq c #bababa", +"br c #bcbcbc", +"bs c #b0b0b0", +"bt c #cccccc", +"bu c #a6a6a6", +"bv c #c1c1c1", +"bw c #bcbcbc", +"bx c #ababab", +"by c #d7d7d7", +"bz c #b7b7b7", +"bA c #b2b2b2", +"bB c #b4b4b4", +"bC c #bfbfbf", +/* pixels */ +"aYbla9a9a9.7#D.N#L#La9.7a9#D#D.7#D#D#DaY#x#xa0ama0ama0am#xbnbnbnaYaYaYaYaY#DaYaYaYbn#x#x#xaY.N#Da9a9a9a9a9a9a9a9a9.7a9a9a9#Da9#D#L#L#L#L#L#La2#La2a2a2a2a2a2#ga2#ga2#ga2a2#ga2a2#L#L#L#Lafa9a9a9bl#Dbl#Da9a9a9#L#L#Laf#L#Laf#L#L#L#L#L#L#L#L#L#La2#La2a2a2#La2#L#L#Laf#L#Laf#L#Laf#L#Laf#L#Laf#Laf#Laf#Laf#Laf#L#D#DblblaYaYaCa0.t.Fb#bnbnaCbnblblblblblaYaY.RaYblblblblblblblbla9a9a9a9a9a9#pa9a9#pa9#pa9#pa9#pa9#pa9a9bl#D#D#D#pa9#pafa9a9a9a9#L#Lafa9a9a9#D#D#pbl#U.V.Vb#.8am#xbn#IaYbl.N.N#x", +"am#I#Da9a9a9bj#D#La9.7#D#Da9#D#D#p#DaYaY#xbna0amamamb#a0a0a0a0bnawaYaYaYaYaYaYaY#xbnaY.R#xaYaY.Nafa9afa9afa9afa9.7a9.7a9bja9bja9#Lafa2afa2af#L#L.3#La2#La2bpa2#La2#ga2a2#ga2a2#g#L#Laf#L#La9afa9bl#Dbl#Da9afa9#L#Laf#L#Laf#L#Laf#L#L#L#L#L#L#L.7a2#La2a2#La2#La2#Laf#L#Laf#Laf#Lafajaf#L#Laf#L#L#Lafajafajafajaf.na9#s#Daw#xbnaCb#bg.Vbnbn.RaYaY#Mbl#pblaYblaYaYaYblblbl#D#Dbl#D#paf#pafa9#pa9afbla9#pa9#pa9#pa9#pa9#p#D#p#Da9#D#pa9#pa9#Da9#Da9af#L#La9.7#D#s#D#MaYbnaCb#aOb#aC#x#UaYaY#M#DaYbf", +"aOambn.sa9bja9.7a9.7a9#Da9bj#D#D#D#DaYaY#x#xa0amaFaFbgb#aF.Va0.VaYaYaYaYaYaYaYaYbn#xaY#xaY.N#D#Da9a9a9a9a9a9a9a9a9bja9#Da9#Da9#D#L#L#L#L#L#La2#La2afa2a2a2a2#ga2#g#La2bpa2bpa2#L#L#L#L#Lafa9a9#p#DaY#D#Da9a9.7a9af#Laf#L#Laf#Laf#L.7#L#L.7#L#L#L#La2a2a2#La2#L.3#Laf#Laf#Lajaf#Laja9#Lajaf#Lajafaja9#La9#La9#La9a9a9blaYaYaYawa0b#b#.paYaYblaY.Rbla9#pblblaYblaYa9#p#D#pa9#pa9#pa9a9a9#pa9a9#pa9bl#pa9#pa9#pa9#pa9#pa9a9#D#Dbla9a9a9a9a9#pa9a9a9#L#Lafa9a9#D#D#Da9awbn.pb#bgamaCbn#xaw#D#D#D.N#x", +"amamaC#x#D#s.7.7a9#Da9#D#D#D.N.N#xaYaYaY#xbna0a0aOaFb#aOb#bg.Vambna0bnaCa0aYaYaY#U.RaYaYaY#Dbl#Da9a9#La9af.7afa9.7a9.7a9bja9bja9#L#L.3#L.3#Laf#Lafa2#L#La2#La2bpa2a2#ga2#ga2a2#g#L#L#L#Lafa9afa9.Nblbl#Da9a9afa9#Laf#L#Laf#Laf#L#L#L#L#L#L#L.7#L#La2#L#La2aja2#Laj#Lafaj#Laf#L#Laf#Lafafajafaf#Lafaj#Lafajafaj#Laja9.n#D#MaY.R#xbga0bnbn.RaYbl#Ua9#pa9#D#Dbl#D#Dbl#Dbl#Dbla9#Da9a9#pafa9af#pa9#p#pa9#pa9#pa9#pa9#pa9#p#D#pa9#Da9a9af#pafa9af.7a9#Laf#L.7a9#s#D#saYaY#Ua0aObgao#x#IaYbl#D#s#D.sbf", +"amaOama0.N.Na9a9bja9#Dbj#D#D#DaY.N#x#x#x#xbnaCa0#H.Vbgb#b#aFbgambnbn#Ubnbnbnbnbn#xaYawaYbl#Da9#Da9a9a9a9a9a9a9a9a9bja9#Da9#sa9#D#Laf#L#L#L#La2a2a2afa2#La2#ga2a2#g#L#g#La2bpa2#L#L#L#Laf#La9a9#pbl#Dbl#Da9a9.7a9#Lajaf#Lajaf#Lajafafajafafajafaf.j#L.3a2#Laf#La2af#Laf#Laf#Laf#L.n#L.n#La9#L#Lafa9afa9aja9#La9af.7afa9#Dbl#IaYawa0a0#UbnaYblblaY#pa9#pa9#D#D#D#Dafa9afa9af#pa9#pa9afa9#pa9a9a9a9#pa9#pa9#p#pa9#pa9#pa9a9#D#Dbla9a9a9a9a9a9.7a9.7af#Laja9a9#D#D#saYawbnaCb#aobn#x.Nbl#s#D#D#D.N.N", +".CamaOao.WaY#D.7#s#Da9#D#D.NaY.N#x#I#xbn#xaY#x#U#xa0a0a0bgamb#ambga0ama0am#xa0a0.RaYaY#Dbl#Dbl#Da9a9a9a9afa9afa9.7a9#D.7#Dbja9.7af#La2#La2af#L#La2a2a2a2a2#L#g#L#ga2a2#ga2#ga2#g#L#L#L#Lafa9a9a9#Dawbl#Da9a9a9.7af#Laf#Laf#L#Laf#L#Laf#L#Laf#L#Laf#L.j#La2afajaf#Lafajaf.Eafaj#Laf#Laf#Lafaja9aj#Lajaf#Laf#Lafajafajaf.n#DblaYaYaCbn#xbnaYaYaY.Rbla9#p#Da9a9.7#La9a9a9a9a9afa9afa9a9afa9afa9afa9#p#pa9#pa9a9#pa9#pa9#p#D#pa9#Da9afafafaf.7a9a9.7#L#Lafa9.n#D#s#D#D#x#Ua0aCaC#x.saY.s#D.7a9.Ebj.N", +"#xa0.8a#.8.Cbf.N#D#D.N.NaY.N.saY#x#xaY#IaYaYaYaYaYaY#x#x#xa0aCam.Vb#bg#yb#.Va0bnaYaYblaY#Da9#D#Da9afa9af.7a9a9a9.7a9bja9#s#Da9.7ajaf#Laf#L#La2#L.3#La2#La2a2#ga2a2bpa2#L#g#La2bp#L#L#Laf#La9af#paYbl#D#Da9a9a9a9#L#L#Laf#Laf#L#Lafafafafaf#Lafaf#La2#La2afajaf#Lajaf.7af#Lafa9aja9aja9#L.n#Lafafa9#L.n#L.n#La9#Laf#La9a9#Mbl#xaY#x#IaYawaYaYaYaYblbl#pa9a9.7#L.7afaf#Laf#Lafa9afa9a9a9a9a9a9a9a9a9#pa9#pa9#pa9#pa9#pa9a9#D#D#Da9af#Lafa9a9a9.7af#Laja9a9#D#D#D#M.N#I#xaCa0#UaY#D.NaY#D.n.7bj#Dbj", +"#x#xa0#vbcaq#xbf#D#D.Nbl.s.NaYbf#x#x#xaYaYaYaYaYaY#M.NaY#x#x.Ca0b#bgb#bgbg.V.p.VawaYblbl#Dbl#Dafa9a9a9a9afa9afa9.7a9#Da9#D#s#Da9af#La2#La2#Laf#La2#La2#La2bpa2bpa2#ga2#ga2#ga2a2#L#L#L#Lafa9a9a9aYaYbl#Da9afa9a9ajaf#Lajaf#Lajafafaj#Lafajafafajafa2#La2#Laf#Lafa9#Lafaja9aj#Laf#Lafajaf#Laf.7afaj#Laf#Lafajaf.Eafajaf.n#Dbl#MaY#IaY#xaY.RaY.RaY#FaYa9a9a9#L#L#Lafa9afafa9#Laf#L#La9afa9afa9afa9#pa9#pa9#pa9#pa9#pa9#p#D#p#Da9a9afa9a9.7a9#L.7.7.naf#La9.n#D#s.N.N#x#UaCbnaY#s#DaY#sa9.7b..7#DaW", +".7aw#x.CaoaB.y.5#s.N#I.Ca0a0ama0#x.N.NaY.NaY#D#Dbl#DblaYawaY#U.CbgbmaBaSaZbma0a0blaYaY#Dbla9a9#Da9af.7afa9a9a9a9bl#D#D#D#D.N#D#D.7a9a9a9a9a9#La9afafafafafaf#Lafa2#La2#L#L#L#La2a2a2af#La9a9#D#DawaY#sbla9b..7#La9a9a9a9.7a9a9a9afa9af.nafafafafafajafajafajafajafaja9a9bl#MaY#s#Da9#Da9#sa9.na9.7af.Eaf.7af#Lafafa9a9bl#M.NaY#Ibn#UaYaYaw#Da9a9.n#p#pa9a9.7.7.7.7a9.7a9.7a9a9#Lafafaf#Lafa9a9a9#pa9a9#pa9#pa9a9a9a9afa9.7af.7.7.7afa9a9a9a9a9a9#L.na9.na9.na9.n#Maw.Nawaw.N#D#D.E.7bj.7#Dbjb.#D", +".7#D.s#x.5.y#va#.NaYbf.Ca0ao#xbn.s.N.N#D#D#Da9#Dbl#Dbl#DaYaYaYbn.p.taBan#uaZ.FbgbnawaYawbl#D#D#D#D#Dbl#D#D#D#D#D#Dblblawbl.N#D#Da9a9a9.7af.7a9a9afafafajafaf#L#L#La2a2a2a2a2#La2#La2af#La9#D#D#DaYaY#D#D#Da9a9.7a9a9.7a9a9a9.7a9#Lafafafaf#Lafafaja9af#pafa9af#pajaf.na9#s#DblaYa9a9.na9a9a9#Da9aj#Lafaj#La9aja9ajaf.nbl#DaYaw#xa0#x.b#xaY#D#D#p#p#p.na9a9a9#L.7a9a9a9a9a9.7a9#Lafafafafafafa9af#p.na9#pa9a9a9afa9af.7a9#L.7#L#La9a9.7a9a9.7.na9a9a9.na9.na9.na9#D#MaYaw.N#s#D.n.7.7.n.7.E#D#D.7", +".7a9aY#xaCam#v#vaCaqa0aqama0#UaY.NaY#D#D#D#D#D#Da9#D#D#Dbl.NaY#Ibnambm#SaZa#a#b#aCa0a0#x#x#xaYbl#D#Da9#Dbl#Dbl#DblaYaYaYaYbl#D#Da9a9a9afa9afafafafafafafafaf#Laf#L#L#Laf#Laf#Laf.j#L#L.n.7a9#s#Daw#x#M#Da9#Daj.7a9.na9.7.na9a9.naf#Lafajafafajafafafajafajafafaf#pa9bl#Mbl#Daw#D.n#Da9#D.na9.na9a9af.7afafajaf#Lafa9a9#sblaY#x#IbnbnaYaYawbla9a9#p#pbl#pa9#D.7.7a9.7a9.7a9a9#L#Lafaf#Lafafa9a9a9a9#pa9.n#pa9a9a9afa9a9#L#Laf.7afa9a9a9a9.7a9a9a9.naf.na9.na9.na9#M.Nawaw#D#s#D#Daj.7aj.7#D.7b.a9", +"a9#saY.s.Ca0aF#v#v.5#vaF.8a0#x#D#D.N#D#Da9bja9.7a9a9bl#D#DaYaY.N.R#Uama#aFaOaFaFb#b#b#a0aCa0#I#xaYblaYblbl#DblaYaw.R#IaYawaY#D#Da9a9a9a9a9a9a9a9a9#p.na9af#La9.7af#Laf#Lafajaf#L#L.3#La9#D#D.NaYaYaYbl#D#D.7a9.7a9.7a9a9a9.7a9.7a9a9a9a9.na9#pa9.n#pa9#pa9#p.na9#sbl#s#Dbl#DblaYa9a9a9.Ea9a9bja9a9.na9#sa9#Da9#Da9.nblbl#D#M#x#x#U#x#UaYaY#Da9#sa9#p.na9a9.7a9a9#La9a9#La9#L#L#L#Lafafa9#La9afa9#pa9#pa9a9a9a9.7#Laf#L#L#L.7#L.7.7a9.7.na9a9.na9.7.n#D#D#s#D#M#D#Mbl.s#D.s#Da9#D.7.na9a9.n.7#D.7", +".N.N.NaY#Uaqamaoa#aB.0a#ambn#xbl#D#D#D#D#Da9.7a9a9.7a9#D#D.s.NaYaY.RaCamamaF.5b#amaob#amama0a0a0#IaYawaYaYaYaYaYbnbnbnaYaYaYbl#D.na9a9.7afa9a9a9a9af#paf.na9afa9.n.7#La9.7a9#L#Laf#La9a9#D#D.N.NaYaY#Dbl.n#D.7af.7a9.na9.na9a9.na9.na9a9#pa9.na9a9a9.na9.na9a9a9aY#MaYbl#sbl#s#D.n#Da9#Da9#sa9.n#Da9a9.7a9.na9.na9a9#DawaY#x#x#xbnbnaYawaYbla9a9a9a9#pa9#Da9a9.7a9.7af#L#L#La9#Laf#Laja9.7a9.7a9a9.n#pa9a9.7#Da9a9#L#La9#Laf.7afa9a9a9.7a9a9bja9#sa9#D#M#D#M#D#sbl#saY#saY#s#D#s.7a9.E.7#D#D#D#D", +"#I.N#I#xamaCamaFaB.Gaz#u.8am#xaY#D#D#D.7a9bja9.7.7a9.7a9#D#D#D.N#Ubna0aCama0amao.Va0amaCama0aC.Cbnbnbnbn#x#Ubn#Uam#Ua0awaYaYaw#D#pa9a9#pa9a9a9#p.na9a9a9a9a9.7a9.7a9af.7afa9a9a9aj#La9.E#D#D#saYaY#Mbl#Dbja9.7.7a9a9a9.7a9#sa9#D#p#D#pbl#sbla9#D#sblbl#Dblbl#sblawaY.N#MaYbl#Dbla9.Ea9.na9.7a9a9#D#s#D#s#D#D#D#D#D#MaYbl.Naw#x#Ibn#I.R#xaY#Da9#Da9a9a9a9.na9a9a9.7a9a9#La9#La9a9#L#Laf#La9a9#Dbj#pa9a9a9#Da9.7.7afafa9.7a9.7#L.7a9.7a9a9#sa9.na9#D#D#D#s#D.sbl#Dawbl#saY#sbj#Da9#s#D.Nbl.saY.s.N", +".Cbf.C.Cam.5aoa#.la5.G.waZ#va0.C#D#D#D.7a9a9#L#La9#L.7.7.7#D#D#D#x#x#x#x#x#xa0bnam.Va0.Va0a0#xbnaY#x#Ia0a0aCa0aCa0ambnbnaYawblbl#Dbl#M#Dblbl#D#Mbl#pa9a9#Da9a9.7a9.7a9.7a9.7a9a9#La9.n#D#D.NaY.NaYaY#D#Da9#Daja9.7a9a9a9a9.7a9.n#D#M#D#sbl#sblbl#D#M#D#M#D#M#D#M#x#xawaY#Dawa9#Ma9#Da9#Da9#sa9#s#D#D#D#D#D#s#D#sbla9blaw#x#x#xa0#UbnaYawaYbl#D.na9a9a9a9a9#Da9#pa9#La9#L#La9.7af#L#L#L.7#L.7.7.na9a9#D#s.7#D.7.7afa9#La9af.7a9.7.na9.na9a9a9#Da9#s#Dawblaw#D.sbl#sbl.s#D#D#s#D#saY.Naw#xaYbf#x#x", +"aqaoamavam.8a##v.5#Saza7.w#u#vam#Da9#D.7a9.7a9a9.7#L.7#La9bj#D#D.Cbn#xbnaYaY#x#x.pb#.Vamaobnbn#xbnbn#xbn#xbn#xa0a0b#aCa0aw.R.Nblaw#Dbl#Dbl#Dblbl#pa9#Ma9a9.nbja9a9a9#La9a9a9.7a9.na9#D#D#DaY.N.NaYaYbl#D#sa9a9#La9.Ea9.7a9a9#Da9#M#Dbl#Mbl#sbl#s#Mbl#sbl#D#MaY#sa0#I.NaYaYblbl#Da9a9.na9.Ea9a9a9#D#D#s#D#s#D#D#D#Dbl#saY#x#xaC.Ca0#x.R#xaY#D#Da9a9a9a9a9a9#p.na9a9a9a9#La9#La9a9#L#L#L.7#La9.7.7a9a9a9#Da9.7af.7a9afa9.7a9.7#L.7a9a9bja9#s.7.na9#sbl.s.saYaw#saY#saY#saY#s#D#s#D#xaY#x.W.C.C.Waq", +"amaFaOaFaOaFama0aY#x.8.0#u#uan#uam#xaY#Da9a9.7a9#Laf#L#La9#D#D.sbl#D#sbl#xaYaw#x.Rbn#Ub#.Va0b#b##Ubnbnbnbna0#xbnbnaYaYaYbnbn#UbnaYaYblaYblawblawa9.n#p#pa9#pafafa9a9a9.na9a9a9a9bl#Dbl#Dbl#sblblawaY#D#Da9.7.7#Laf#Laf.n.7#D.7#D.NaYawaY#xbn#Ua0#U#Ubn#UbnaC#UaY#xawaY#M#D.na9ajaY.N#Dbla9a9.na9.nbl#DblaYaYaw#x#MblaYawbn#Ibna0.b#U.RawaY#Mblbl.na9a9a9a9a9afa9#Dbj#D#D#D#D#D.7#Lafa9afa9.7#Da9#sa9a9a9#Da9.7.7afa9a9a9a9#D#s#D#D#Daw.N.NaY.NaY#D#sbl#saY#saY.N.na9#D#s#DaY.N.N#I#x.CamaoaFbya#", +"bgb#amam.5aCa0.C#M#xa0aFaZ#uaB.0aO#xaY#Dafa9a9a9#L#L.7af.7#D#D#D#D#DaY#D.N.N#xaY.Cbna0a0b#aFb#aF.Vbnbna0#Ubnbn#x#U#x.R#xawaYbn#x.R#I.Raw.RaY#x.R#p#p#pbl.na9a9a9a9a9a9#Da9#s#D#M#Dblbl#sblbl#DblaY#Dbla9#Da9af.7ajaf#L.7a9.n#Da9#M#DaYaYaYaYbnaCbn.paCa0bgaoaC#UaC#I#xaY#MaYblbl#Mbl#M#D.na9a9.n#D#M#D#M#DaY#DaY#M#pawaY#Ibn.Ca0aYbnaY.RaYblbl#Da9a9.na9afa9a9af#D#D#D#D#D#Da9#Daf#L.7a9.7#Da9#D#pa9.na9a9b.a9.7.7a9.7a9bja9#D#D#D#D#DaY#Daw#Daw#D#D#M.N#saY.saY#sbl#sbl.Naw.Nawbna0aCa0.8a#aF.5", +"amamaCa0a0#x#xaYblaY#Ia0bc#u#ua#amam#x#D#Da9.7a9#Laf#La9a9.7#D#Dbl#D#D#MaYaYboaYbna0a0aoamb#aOb#b#am.Va0bnbn#Ubnbn#xaYaY.R#xawaYbn#UbnaCbn#Ubn#U.RawaYblaYblawbl#D#D#D#Dbl#Dbl#Dbl#Dblbl#Dblbl#DaYaw#D#Da9bj.7#La9#Lafa9a9bja9bj#D#MblawaYaw.R#Ubn.V.8#vaB#S#waOaoa0aC#x#x.N#I.NaY.NaY#D#D#D.n#Dbl#sbl#Dbl#saYaYblawaYaYbnbnaCbn#U.baYawaY#M#Dbla9.na9a9.na9.na9#s#D#s#D#s#D#D#D.na9a9a9a9#D#D#D#pa9a9#Da9#D#L.7a9.na9#D.n#D#D#D.saY.saY.NaY.saY#sbl#s#Daw#DaY.NaY.NaY.saY.NaY#x.Wa0a0a0aOam.8a#", +"#x#x#x#xaYaY.N.N.7#D#x#xb#aZ.ya#amaObn#Da9#Da9bj#L#L#D.7#Da9.7a9a9.nbl#D#DaYaY.NaC#xa0.Vamb#aFaF#vaFbga0a0bn#xaY#Ubn#U#xaYaYaYaYbn#xa0a0a0a0aCa0bn#Ubn.baYaYaYaYbl#D#M#Dbl#D#Dbl#Dbl#s#D#D#D#D#MaY#Dbl#D#Da9.7a9ajafaj.7a9a9#sa9a9#M#DaYaYaY.b#xbgb##vaBa7.Q.z#S.5aO.8aoao.Ca0.W#x#I.Naw.NawaY#DawaYblawaYaYawaYawaYaY#U.C#U.Ca0aY#x.RaY#xblbl#D#Dbla9a9a9a9a9a9#D#D#D.NaY.N#s#Da9a9#sa9a9#M#Dbl.na9a9a9a9bja9.7a9a9a9.7#D#D#D#saY#DaY#Daw#DaY.N#M#D#s#Dbl.s.N#M.Naw.N#xaY#x#I#x#Ua0a0aCamama0am", +"aYaYbl.s#D#D#D#Da9#D#s.N.CaOa#aF.5ao#x#Dbl#Da9#Da9a9.7a9.7a9a9.7a9a9a9#Dbl.NblaY#x#xbna0a0amaFaFbmaFaFamaCbn#U#xbnbnbnaY.b#x.R#xaYbn#xbnaCa0bna0#Ubn#Ubnbn#I#xaY.NblaYaYawaYaw#Dbl#Dbl#D#M#Dbl#DaYaY#Dbl.na9.7a9#La9#La9a9bja9#D#MaYblawaY.R#x#U#S#SaB#uaz#u#vaO.8aOaOaOaOaOaOaO.Caoa0.W.C#I#x#I#x#I#x#x#I#x.NaY#x#Ubn#UbnaCbnaC#I.R#IaYawbl.sbl#M#D#Ma9#D.n#Dbl#D#D#s#D#D#D#D#D#Ma9bl#D#D#DblaYa9#p#sa9#D.n.7.7.na9#s#D#s#D.NaY.saY.saY.NaY.saY#s#D#p.s#saYaY.N#IaYaYaw#x#IaY#I#x#x#I#x#x#x#x#x", +"#D#D#D.7.7.7.7.7.7a9a9#DaY.CaO.y.5.5bnaY#D#D#D#D#D#Da9bja9a9.7a9a9a9#Da9#sbl.N#MaYaY#xawbna0aCb#aOaFbgb#b#a0a0bn#Ibnaw#xaYaYaYaY#Ubn#IaYaYaYaYbnbn.R#xaw#x.R#Ibnaw#IaY.sbl.Nbl.N#D#M#Dbl#D#M#DblawaY#M#D#D#s.7a9aj#L.na9.n#D#s#D#DaY#IbnaY#UbnaCaB#SaB#u#uaBaO.5amaoam.8.5aO.y#1#1#u.yaOamamaoamamamaC.C.C#xbn#x#Ua0aC.CaCa0#Ia0.R#x#UaYaYblaY.N#D#p#D#sbl#Dbl#D#s#D#D#D#D#s#D#Da9#p#MblblawaYaY#Ma9bl#sa9bja9.7#Da9a9.7a9#Daw#DaY.saY#Daw#DaY#D#M#D#sbl.N#saY.saY#xbo.N.N.s.N.Naw.N#D#D#D#Da9#D", +"a9.7.7af#Lajbp#L.7#L#La9#DaYa0#va#a0a0.Cbl#D#D#Dbj#D#Da9.7a9#L#L.na9a9a9a9#D#D#Dbl#DaYaY#xaYbna0b#aFb#b#aob#aoambnbnbnbn#U#x.R#xaY.RaY.R#IaYaYawblblaYblaYaYaYawbn#I#x#UaYawbl#Daw.N#D#D.NaY.NawaY#xbl#D#D#Da9.Eafaf#La9#D#D#D#D#I#x#xaCa0aCaoaO.FaO#v#u#u#uaFbgaC.Caoa0ao.5aB.z.U.Oaz.y.y#vbm.y#v#v.5amaoamao.8amaoa0aoa0#Ua0#x#U#xbnaw.N.saY#sbl#Dbl#Dbl#D#M#D#D#D#D#D#D#D#D#D.nbl#Dbl#xaYaYaY#pbla9bl#D#s.7.7.na9#Da9#s#D.NaY.NaY.Naw.Naw.Naw#D#M#D#D#Maw.Naw#x#IaYaY#s#Da9.nbj.7.7b..7.7bp#L", +"#L.7#L#Lbpbp#Lbp.7#L#L.n#D.N.C.5a#amaCaoaY#D#D.N#Da9#Da9#La9#Lafafa9a9#Da9bl#Dbl.n#D.nblawaY#x.Ra0.Vbgamb#amaFaF#Ubn#U#xbnbnaYaYawaYawaYaYblaYaY.bblaYblblblaYaYaYaYaY#I#x#I#x#I.NaYaY.sbl.sbl.NaYaw.N#M#D#sa9.7a9a9.na9.n#D#s#D#xaCa0aoaob##SaBaOaF#S#uaB#v.5aoa0aCamaoao.8#v#v#3ar.wanazaz#3#C#3aX.w.yaOam.8amaCambga0aoa0aCbn#U#x#IaYaw.NaY.NaYaY#sbl#sbl#D#M#D#D#D#D#s#D#D#DblblaY#MaY#IaYawbl.nbl.n#D#Da9#D#Da9.Ea9#D#D#Daw#D#saY.Naw.NaY.N#M#D#s#D.saYawaY#I.N.N#sa9a9.7af#L.E#L#Laj#L#L#g", +"#L#L#L#L#La2bpa2#L.j.7.7#D.Nbf#IaFaBa7an.5a0#Daf#D.7#D.7a9a9#L#L#D#Da9#D#M#D#Dbl#Dbl#Dbl#Dbl#sblaw.RbnaCb#aOaFa#bg.VambnaCbnaw#x.RaYaYaY.baYawbl#pbl.n#Da9a9#D.7#s#D#D#D#D#D#MaYaw#IawaY#x.N#I#x#IaYaY#D#Da9.na9aja9.n#D.N.N#x.CaCb##vaB#uaBaB#v#SaOaOaOaObg.8am.W.WaCaCamaOaB#u#a#faz#Sa#aBaBaz#u#u#uaz.w.wa7#u#uaB.yao.5aC.C#Ia0.pa0aCbnawaY.sbl#saYaYaY#DaYaY#D#s#D#D#D#D#D#D#s#D#sblaY#x#I#x#D#D#D#Da9.n#D#sa9#D#D#D#s#D#D#D#sbl#s#D#saY.saY#MblaY.C.W#I.N#s#Da9#sa9.7.na9.7#L#L#L#L#L#L#L#L", +"bpaj#Lbp#Lbp#Lbpa2#L#L.7#D.Nbfbf.Va#an#uaB.8bn#D#Da9#Da9.7a9ajafa9bl#Dbl#D#D#M#D#D#Dbl#D#Dbl.NblaYawbnamb#aFbm#Sb#.Vaobn#xbnaYaY.baY#MaYblaYblaY#pbl#p.n#Da9.n#D#D#D#s#D#s#D#D#saY.s#x.s#I#x#Ibn.W#I#xaw.N#s#D#D#D#D.NaY#I#x.WaCaCaCaF#SaB#v#SaOaOaOb#aOb#bgamao#x#I.CaCao.8#u.w.OaG.G#SaBaBbmaB#v#v#va#aB#u.G.Galbk#Taz.w#v#v.5bg.5bga0ao.C#IaYaY#Dbl#DawaY#D#M.NaY#D#s#D#D#s#D#D#MaYblaY#I#x#x#M#s#D#s#D#D#D#D#Dbj#s#D#D#D#s#D#D#s#D#Daw#Daw.N#M#s#x#I.Cbf.s#D#D.n.7a9.7a9.7.E.7#L.7#L.7#L#L#L", +"#Lbp#L#g#La2bpa2a2#g#La9bj#D.Nbf.RaCaOaZ.yaFa0aY#D#D#s#Da9a9a9a9#D#Da9#Dbl#D#Dbl#D#M#D#D#M#Dbl#saY#xbnaCa0aOaF#Sb#bg.VbnaCbnaY#xaYaYaY.baYblaYbl#Ma9#p#Da9a9#D.7#D#sbl#Da9#Da9#D#D#D#saY.N#I#I#Iaoao.W#xaY.Naw.N#I#I#U.WaCaoamaobnaCaO#vaF#vaOaFbgambgambg.5.8amav.WaC.CaoaF#uaza6.OazaZaB#vaF#vaFaFam.5aF#v#SaB.G.O#3bv.G.GaPaP.w#u#vaFama0.C.C#IawaYawaY.NaYaYaY#MaYaYaYblaYawblaYaw.NaY#I#x#I#D.N#M#D#D#s#D#s#D#s#D#D#s#D#Dbl#s#p#saY#s.Naw.Nblaw#I#xaY.N.N#sa9.7a9.Ea9.Ea9#L#L#L#L#L#L#L#L#L", +"#La2bp#L#Lbp#Lbp#L#L#L.7#Dbj#D.NaYbna0aoa##vam.C#D#D#D#D.7#D.7a9a9#D#Dbl#D#Dbl#Dbl#Dbl#Dbl#D#DaYaYaYawbna0b#aO.Fbgb#ama0bnbn#IaY.bblawblaYaY#MaYa9#p#sa9a9#Da9#Da9a9a9a9a9.na9a9#s#D#D.saY.NaY#x.C.C.C.W#I#x#I.WaF.8a0a0a0a0aCa0aCaCb##vaFaO#vbgaob#aoaoamaoaCam.W.Caoa0.8#v#ubkab#aan#vaZ#vaFa#aoaobga0aoamamaOa#aBaZ#u.w.w.G#3#3#a.w.y.yaOb#aCbnbn#I#xbn#UaYawbfaYbfaw#x.s#xaY.NawaYbl#x#Ibn#I#Daw#D.s#D#s#D#D#D#D#D#D#D#D#s#D#D#Dbl#saY#saY.saYaw#xaw.N#s#D#D.7.n.7a9.7a9.7#La9aj.7#L.E#L.7#L", +"bp#L#L#g#L#g#La2#g#L#L#L.7#D#DbjawaYaCamaoa#.8aF.N.s#D#D#D.n#Da9#sbl#D#D#M#D#D#M#D#M#D#Dbl#sbl#saYaY#x#UbnaCb#b#bgb#bga0aCbn#x.RaYaYaYaYawblaYbl#p.n#pa9a9.nbja9.7a9.7#sa9#D.7.na9a9#D#D#D#saY.s#x#I#I#x.C.Wa0aoaoama0.W.C.Wa0#Ibn.paO#S#v#v#S#Sbgaoaoa0aoa0avaCaqaoavao.8#v.w#T.Y#3an#va#aOamaOa0bnaoambgamaoam.pa0bgb#aoaFaO.ybk#T.GaXaz.waBbyaCa0a0bnaCa0#Ibn#I#x#x#x#x#x#xaC#x#I#x#I#x#I.C#IaY#saY#saY#D#M#D#s#D#M#D#M#D#D#D.n#M#D.s#DawaYaw#x#IaYaw#sa9.7.n.7#L.7aj.7#L#L#L#L#L#L#L#L#L#L#L", +"#L#g#L#g#g#gbp#L#L#L#L.7af.7.7.7#D.N#xaob#.8a#a##DaY#D#D#D#Da9bjbl#D#Dbl#Dbl#D#DaY#DaY#D#M#DaYaYaYawaY#x#Ibna0aCbgb#bg.VaCbn#U#xaw.Raw#FaYblaYbl#D#p#Da9#Da9a9#Dafaj#Laf#Lajaf.7a9#Da9#sa9#D.Nbl.NaY.NaYaY#I.C.Wamaoaoaobga0aoa0aCam#vaBa##SaBaBaobgaoaoaC.Waqaoav.8ao.5aOaBazaX#4alaza##vaOam.5aC.Wa0.Wa0aob#.8bnaCaCaCaC.W.WaC.y.yaB#ubkbkaX.Oazae#vaO.5ao.pbga0a0a0#Ua0aCa0ao.CaCaCa0#IaCa0#IaYaw#D.sbl#s.N#s#Dbl#D#s#D#D#sbl#D#D#saYaw.saw.NaC#xaw#D#sa9.n.7a9aja9#La9aja9#L#L#L#L#L#L#L#L#L", +"#Lbp#ga2bpa2#L#g#L#L#L#L#L#L#LafbjaYaY#xama0.5aO.N.NaY.s#D#D#Da9#Dbl#s#Dbl#Dbl#D#M#D#M#DaYblaw#D#MaY#I.R#U#x#U#Ub#b#bga0aCa0#x.R.Raw.RaYawaYblaw#p.n#pa9.na9#Da9aja9af.Eaf#Lafajafaja9#Da9#s#Daw#D#s#D#s.NaY.NaY#U#Ua0.paobgb#bgaO#vaB#u#u.y#ua5aObgaoamaoamaoavam.8.8#v#v#u.w.GaTbw.G.0#vaFaoamaoa0aoama0aqamaoamaCaqaC.W.W#I#Iaxbgaobg#va7.Oau.U#3#3a5#uaB#vaFaoaoa0amaCamaob#aoamaoaoa0aC#Ibn.sawaY.sbl#saY#s#D#s#DaY#saY#D#D#s#p#s#DawaY#Iaw.C#I.N.naf.Ea9.7aj#L#Laj#L#L#Laj#L#L#L#L#L#L#L#L", +"a2#L#g#g#g#gbp#L#L#L#L#L.7#L.7#L.N.N.s#x#xao.5b#.NaY.N#D#D#D#D#D#M#D#Dbl#D#D#sbl#D#Dbl#Dbl.sblaY.NaY#x#I#x#U#UaC.Vbgb#bgaCaC#U#I.R#x.baY.RaYblaYa9#pa9#Da9#Da9bjaf#Laf#Laf#L#La9#La9a9a9.7#Da9#D#sa9a9a9#D.NaY.Na9#paY#Ua0aoaO.yaBaBazazan#u.Gbk.daOaO.8aoavao.8.8.8bd.yaL#uazaX#0#4#TaZaOaO.5aoa0.Camaoamaoamambcby.8.C.C.W.W.W#U.rbgaO#S.yaB#uaP#3.U#3arbk#u#vaFbgbgaob#aob#bgamaOaoaoaoaC#U#IawaY.sbl.s#D#Daw#DaY#s.N#M#D#s#D#s#D#M.NawaY.s#xaC.C#Ma9aj#L.7.naf#Laf#Lafaj#Laf#L#L#L#L#L#L#L#L", +"#g#g#Lbp#Lbp#Lbpa2a2#L#L#L#L.7#L#D.N.NaYbo.C.C.W.Vbn.N#Dbjbj.E.7#D#D#D#D#s#D#D#D#D#s#D#s#D#D#D#sawawaYaw#x#U#xaCa0aCa0aC.Vamb#a0aYaw.RaY#M#p#M#pajafaj#pa9a9#Mbl.na9a9a9a9a9a9afajafaja9#D#s#D#Dbl#D#s#D#s#D.n#Dbl#saYaYaw#x#IaCaOaB#1a5.w.wbkaV.Qbt.ybcbc.8bcbcaBaB#u#uaz.waP#T.O#zbw.6aF#vaOaFambga0amamaOaoaOaoaCa0.WaC.W.C#I.WaCaoaOaoaOaobg#v#v#S#1.Q#3agaV#1aB.8aOamaoaCbg#v.8aoa0aC#x#U#Iawaw#D.s#D#s#D#s.N#saY#s#Daw#D#Mbl#saYaw#x#I#xaC#D#sbj#D#D.7#s.7.7.E#L.7#Laf#L#La2a2a2#ga2#g#g#g", +"#gasbp#g#Lbp#Lbp#L#g#L#L#L.7af.7#D.NaYbf#x#x#x#xaCbn#I.N#Dbja9.7#D#D#D#D#D#D#D#D#D#D#D#D#D#s#D#DblawaYawbn#I.WbnaCa0.pa0aoa0aoam#UbnaYaYaYblblbl#paf#p.n#pa9bl#Da9a9a9aja9af.na9.7af.7a9a9a9#D#sa9#M#D#D#D#D#D#D#D#D#M.NaY#x#x#xa0am#vaB.z#u#Ebi#nbCaX.Q.y.y.QaXbka5#u#u.w.wbkaP.O#4#4.wa##v.5a#aoamambg.5aO.5a#aoamaC.WaC.W.W#IaCaC.WaCaoaoaoao.8bg.8#v#v#u#uaPagagaXbka5aBaBaB.y.z#S.8bgaoamaC#x#IaYaw#D#sbj#D.sbl.sbl.N#saY.s#D#MaYawaY#U#x#Ibj#s#Db.#Db.#Dbj.na9#La9aj.7#L#La2#ga2a2#g#gas#g", +"#ga2#ga2#g#g.7bpa2a2#L#L#L#L.7#L#D#D.N#M.N#I#x#xa0a0#x.s.N.N#D#D#D#s#D#D#D#D#D#s#D#s#D#D#s#D#D#M#D#MblawaYaw#x#I#Ubn#Ua0.pa0.pa0aCbn#Ubnaw.Rawbl.n#p#p#pa9a9bl#Dafa9a9#pa9a9a9afajafaja9.7#D.n#D#Dbl#D#s#D.n#D#s#D#D#DaY#saYaw.N#UbnaCaOaO#vaBbkbq#Rbqag#3.U#zaVau#Tazazbkbkbv#3#E#0ab.2#uaOaF#vaFaOaOaFaObyaO.8aCaCaC.C.W.W#I.W.WaCaC.WaC.WaCaCaCaCaoao.8.8#v#vbbbbap#3.U.U.U#4a5#E#1#SaFaOaOaFaC.W#x#IaY.s#D#saY.s#xawawaY.saY.sbl.NaY.s#x#x#Ia9.7.E.7.E.7.n.7a9#L.E#L.7#L#L.7#L#L#L#L#ga2bpbp", +"#g#g#L#gbp#g#Lbp#L#g#L#L#L#Laf.7#Da9#D#DaY.N.N.sbn#Ua0.C#x.N#s#D#D#D#D#D#s#D#D#Da9a9.na9a9a9a9#Dawbl#saYawaY#U#x#U#x#Ubn#Ibna0aCa0a0#UbnbnbnaY.Rbl.n#D#p.n#pa9bla9af.nafa9afa9a9#Laf#La9a9a9bja9a9a9.na9a9.7a9.7a9a9#s#D#DaY.Naw#xaw#xaCamaoaOaB.v.O.Obqadbx.abzbi.U#3#T#3bvagag#3#4#caT.w#vaF.y#v.5#vaOa#ao.5.5aC.CaC#I#I#I#Ibo#I#Iaw#Iawaw#I#U#7.W#IaC.WaCav.W.8#v#v.y.w.G#T#3.Oag.O.w#uaB.ya#aoamaC#x#I#x.N.s#xaw#I#x#Ibfaw.Nbl.s.Naw.NaY.saY.E.7af.Eaf.7#L.E.7aj.7#La9aj#Lafajafaja2#L#ga2#g", +"#ga2#ga2#Lbp#Lbpa2a2#L#L#L#L.7#La9.7a9#D#D#DaY.NaY#xa0#U.CaYbl#D#D#D#D#D#D#D#D#Da9a9#Da9#sa9.na9#D#M#Dbl#saYawaYawaYaYawbn#Ibn#IbnaC#xbn#Ibna0bnblblbl#Dblbla9a9.na9a9a9a9.na9a9af#L#L.na9bja9#D.na9a9a9.n.7.n.7.Ea9.7a9#s#D#D#D#sblaw#IaCaobg.d.O#ia5.G#zadadadabadaVaVbq#3#3bvbqaba8.YbkaBaO#uaFaOaFao.5aoaqaC#I#I#Iaw#I.s.sawbobo.sbo.sbobo.s#M#M.s#7aw#Iaw#I#U#IaCao.8aO#v#u.Q#3biag#3aXazaZ#vaOam.C#x#I#IaY#I#x#I#I#x#I#xaw.Naw#D#s#D#s#Da9#Laj#L#Laj#Laj#L#La9#L.E#L#L.7#Laf#Laf.7#L#L#L#L", +"a2a2#L#g#L#L#L#La2bp#L#L#L#L#L#L#L.7#La9.7#Da9#D#DaYbnama0#xaY#s#D#D#s#D#D#D#D#Daj#Lafajaf#La9a9.na9#M#D#MaY#MaYbl#MawaYaYaYaw#x.RaY.b#xbnbn#Ibnaw#xawbl#D#Ma9#pafa9afa9afa9afa9aj#Laf.7a9.n#Da9ajafa9aja9#L.7#Laf#L.E#L.7.Ea9#sblawaw#xaCaCaO.8aBazbka5.Gbk.U#3biad.a.a.DaVaVaV.M#d.S.Yaz#u.0.y#vaF.8a0.W.C#I.C#Iaw.Naw.s.s.s#s#s#s#s#s#s#s#s#s#s#s#s#M#s#s#s#s.n.n#M.raC#OaO#w#u#E.vbkazbkbkbk.w.yaOamaC.C.C#I#I#I#x#I#x#I#x#Ibf.s.N#s#D.7a9.E#L.E#L.E#L#L#L#L.7aj.7af#L#L#L#Laf.nafaj#L#L#Lbp", +"#gaa#ga2#L#L#L#Lbpa2#L#L#L.7#L.7#Laf#L#L#La9.7#D#saY#xa0ama0aYaY#D#D#D#D#Da9#D#Daf.7aja9#L.n#Laj#p.n#p#Dbl#s#DaY#sbl#D#MawaYaYaY#Mblbl.baYawbnbnaYaYaYaYbl#D#pa9a9a9a9a9a9a9a9a9afafaja9a9bja9#Dafafajaf#L.Eaf.Ea2#Lafaja9a9#s#D#sawaw#IaC.WaoaoaO#uae#1#u#uaz#u.O.Ubi.D#d.D#J.D.abu#6.Y.G.w.yaZ.8aoam.W#xaw#I.saw.saw.s.s#s#sbj.Eb.#sb.b.#sb..E#s#s#s#s.s#s.E#s#s#s#s.r#U#IaCaCbd#1#SaOao.ya5bkaza5.waOamaoaC#x.WaC.W#I#x#I#x#I.Naw#D#D#s.7#L.7#Laj#L#Laj#Laj#Laja9#L.E.7.n.7.Ea9a9a9a9a9.7#Laf", +"a2#g#L#g#L#L.7#La2#g#L#L#L#L#L#L#La2#Laf#Lbja9a9#DaY.C.VaFa0#xaw#D#D#D#D#D#D#D#Dajafaf#Laf#Lafaf#p.nbl.n#Dbl#M#D#Ma9#M#DaYaw#Dawbl#MaY#Mbn.RaYawbn#xaw#x#Mbla9.naf#paja9af.nafa9aja9#La9a9a9#s#Daja9#La9#Laf.7#L#Laj.n#L.7.n.7#s#Daw#x#I.CaC.8.8#v#v#v#vaO.z#1.z.Gbk.O#zbibBbBad.x#5#9.YaPaz.y.0bgaoam#Iaw.N#s#Dawaw.s#s#D#s#s#s.E.7.E.7.E.E.E.Eb..Eb..E.E.E.E.E.s.saw#IaC.WaC#Oam.d#vao.8aFaO.8.G#3.OaB.8amaCaCaC.Wa0#I#I#I#I#x.s.N#s#D.na9.n#Laj#L#Laj#Laj#Laj.7#L.7af#L#Laf#Lafa9a9.na9a9.7.7", +"#L#L#L#L#L#L#L#L#La2bpa2#ga2bp#L#L#L#L#L.7a9.7.7.NaY#xbnao.VaF.V#xaY#Ma9.na9a9#D#La9aja9aja9aj.7.na9.na9.na9.na9#p#s#p#D.na9a9.n#p.nbla9#sbl#saYaYaYaYaYaYaYaYaY#pa9#p#pa9#pa9.nafafaja9#D#D.N.N.nafajafaja9ajafajaf.7.na9#D.n#D#Dawaw#I.W#IaCaCaobdaO#v#v.y.y.y#u.QaX.9#TbC#r#r.aatatbB.2aX.GanaC.W#Ibobf.sbf#I#s#s#s#sb.b.bj#s.7.E.E.E.7.Ea9.Eaj#Lajajajajajaj.s#s#I.s.s#I.s.WaCaCaCaCa0.W.W.W#v#vbtbkbk#uaB.0aObgaoaoamaC.C.W.n.na9.E.7.E.7#Lbjb..Ea9aj#L#La2a2.jbpaj#L.E.7bjajaf#La9#Laf#Laf", +"#L#L#L#L#L#L#L#L#L#ga2a2bpa2a2a2#L#L#L#L#L.7#L.7#DaY#Ibnb#b#aOb##xaY#D#Da9.n.7#Dafajaf#Laf#Lafafa9aja9a9.na9.na9.na9.na9#p.na9a9afa9.n#p#D#M#DblaYawaYaw#xaw#xaY#p.na9a9a9a9#p#pafaf#pa9#D#s.N#sa9a9#La9#Laf#Laf.7aja9.n.7.n#Da9.saYaw#x#I#x.W.WaCao.8.8aObc#v.y#v#ubkbvbvaXbvbC.k.Dai.UaXbv.Ga7aOaoaNboaWbo.s.Nb.#sb.#D#s#sbjb.b.a9b.a9.E.7.Ebjajaja2aj#Laj.naj#D#s.sbo#I.sbo.saCaCaC#I#I#I.W#xavaoaO.y.z#1bkbkaBaBaO.5aoaoav.Wa9#s#L.E#L#L.7.E.7#D.7.E#L#L#Laja2bpa2#L#L#L#L.7af.7afajafaj#L#L", +"a2#La2#ga2#ga2#ga2#L#ga2a2#g#L#g#L#L#L.7af.7a9.7#Daw#x#xam#SaZa#aC#xaYa9a9a9#Da9aja9#L.n#L.n#Lajafa9.naf.na9a9.na9a9.na9.na9a9.n.na9a9.na9#D#D#saY#x.R#xaYbn#x#xblblbl#Mblbl#Dbl.n#p.nbl#D#D.N.N.naf.nafaja9#L.n#L#La9.7.n#D#s#saYaw#I#I#I#U#Ia0.Wao.8aObc.8.y.y#u#ubk#3bCapbkag.kbqaX.Q.Qbka5#u#v#vamava1bob..E.na9b..E#s.7.E.E.7.E.7.E.7.E.7.naj#L.jaja2ajajaj.n#D.s#I.s#I.saY#I#U#x#I#x#x#Ibo#x#I.CaoaO#v.y#1bkbk#u#vbcam.C#I#sa9.n.7.E#L.E.7#s#s.7.n#Lajbpa2bp.jbp.j#Laj#L#Lajafajaf#La2afa2", +"#ga2#ga2a2a2#g#La2#ga2#g#L#ga2a2#L#L#L#L.7.7#La9#D#D#xaCaF.0aZana0#xaYbla9.na9#D#Laf#Laf#Laf#La9af#L.na9af.nafa9ajaf#Laf#Lajaf#Lafajaf#L#D.n#D#DawaYaY#IaY#I#x#IaYawaYaYaYawaYawbl#Mbl#D#sbl.s#Da9.na9.7afajaf#Laf.Ea9.Ea9#sa9#s.N#I#x#I#x#Ia0#I.Wao.8.8aObc.ybba5bkaXaX#3bvag#n.c.#bt#baLbcbdaBaB.y#vam.Wbfb..7#s#s#s.7.E.E.E.7#s.E.E.7.n.7.E.7aj#g.ja2.jaja2#L.E.n#s.s.s#I.s.s#x#I#I#x.s#I.Nbo#x#I#I.CaoaoamaObkaz.Q.z#v.8.Wbf.N#s.N#s#D.sa9.E#D#D.E.7#L#Laj#Laj#g#L#g#L#gbp#L#L#L#L#L#La2bpa2", +"a2bpa2bpa2bpa2a2#g#La2bpa2a2bpa2#L#L#La9#L.7a9.E.7aYaY.Cam#vaZaZaobn#xbla9a9a9#s#L.n#L.n#L.n#Lajaf#Laf.na9a9ajaf#L#Laj#Laf#L#Laj#L#L#Laj.7a9.7a9#D#Dbl.NaYaY#xaY#xaY#x#U#xbn#IbnblaY#MaY.NaY#s#D.na9aja9af.7af.E#Laja9a9b.#D#s#Daw#x#I#I#x#I.Wbn.Wa0aoao.5.8.y.QazaX#3.O#3aVai#n#8aLax#O.W.Wao.8#1aB.y.5.Ca1bo.sbo#D#sb.#D.E.7aj.7.E#D.E.7.E.7.7.ja2.j#gbp.jaj.j.7#s#s#s#s.N.s#Iawaw#D.saw.N.s.s#D.s#x.W.WaoaC.8.0.y#v#v#v.d.8ao#I#Ibf.s#Db.bj.7#Dbj#L#Laj#L#L#La2aj#gaj#ga2asasa2a2a2a2#La2a2#g", +"#ga2a2a2#ga2a2#ga2a2#ga2a2#L#ga2#L#L#L#La9.7.7a9.7.N.s#xamaF#va#.5am#x.N#D.na9.7af#Laf#Laf#Lafa9#L.n#La9.naf#Laf#Lajaf#L#Laj#Lafa2ajaf#Laf.7.7.na9.n#D.nbl#D#DawaYawaY#U#x#U#x#UaYaw.Nblaw#D#D#sa9.na9.nafajaf#Lafaj.7.na9#sa9#saY#I#I#xaC#xao.CaCavaoao#v.yaI.Qae.O#zaV.Dah#Xag#b#O.r#7#7#7.W#QaObdaB.y#vaoaqbo#Ibobf.N.Ebj.E.7.E.E.7.E.7.E.7.Ebp.j#g#g.ja2#L.j.E.7#s.nb.#s#D.saw.Naw.s#D.s#s.N.s.sbo#I.C.Wam.8bgbgamao.C.8axbcaxaoaobo.N#s#Db.#s.7.E#L#L#L#Laj#L#g#La2#gas.jasbp.j#L#g.j#g#L#g", +"a2asa2asa2aa#ga2#g#L#g#Lbpa2#L#L#L#L#L.7.7.n.7.7a9.saYaY.Wa0amam.5am#IaYbla9a9a9aja9aja9aja9ajaf#Laf#L.na9#L.n#Lajaf#L.jafa2a2.ja2a2#Laj#Laja9#L#Laf#Lafa9.n#D#DaY#xaYaYaYawaY#U#xbnawaY.Naw#D#sa9.na9af.na9.na9.Ea9.na9.E#D#s#D#I#x#I#x.WaCaoaoao.8.8.8.y#1#1.Q#T#3bq.D#m#haibkavao#7aE.sbo.W.W.s.Wbd.GazaBbc.8##avbobfbobjbjb..7.7.E.7.E.7.E.7#g.j#g.j#g.jaja2.Eaj.n#D.nb.#sb.#D#s#s#D#s#D#s#s.s.N.N#I#x.Wam.WaC#x#I#xaCa0av.8.8.8ao.W#Ibo#s#s#Dbj.7#Lajaj#L#Laj#gaj#g#gasasaU#g#g#ga2bp#ga2#g", +"a2a2#ga2a2#ga2a2a2#ga2aja2bp.ja2#L.7#L#L.7a9.7a9bj.N.N.N#xa0a0aCaF.5bnaY#D.na9.7af#Laf#Laf#Laf#L.n#L.na9.naf#Laf#Laja2#La2aja2#La2aja2#Laf#L.E#L#Lajafaj#La9#L.nblblbl#MblaYaYawbn#U#x#xaw.N.s#D.nafa9.na9a9a9.na9aj.7#sa9#sa9#s#x#I#x.Wbnavamaoao.8aObd.ybt#ubbag.O#3bA.iaJ#3bbav.h#7b.b.boa1#IaE#I#QaB#uaPaz.Gbcbcavavbobfb.bj.E.7.E.7.7.E.7#L.j#g#g#gaj#g.jajaf.E.n#s#s#D.E#D#s#s#D.s#Db.aW#sbf.Nbo.C.Wav.Cam#Mblaw#x#Iaoaqaoaqavavaoav.s.Nb.#D#s.7.E#L#Laj#g#Lbpa2asas.jaUaU#ga2bpa2#g.jbpa2", +"#ga2#g#g#ga2#g#ga2#g#g#ga2#g#Lbpa2#L#L#L#L#La9.Ea9a9#saY#I.C.Wam#x#U#x#IaY.N#D#Daj#Laj.7.7a9.7.7a9#Laf#L#L#L.n#Lafafafajafaf#Laj#L#L#Laj#Laf#Laf.jaf#Laf#Laja9#Da9.na9#Da9.n#D#DawaYawawaYaY#MaY.7.n.7.n.7.Ea9.7ajaf.Ea9#s#D#D#D#Ibn#UaCaoao.8#vao.d.d.y.z.y#1bbagaX#3aAbx.caLav#7#I.s#7b.#sb.b..sbo#Iav#QaOaKbtau.GaZaFaq#Ibf.s.7.n#L.E#L.7aja3.Ebp.jbpbpajbpa3#s#D#s#s#s#s#D#sa9.n#D#s#D#s#D#s#x#Iaw#I.N#s#s#D#saY#saYaY#I#I#I#I#U.W#IaC.8ao.C#sa9#L.7.n#L#L#L.ja2.j#gasasas.jas#g.jas#gas#gas", +"a2#ga2#ga2#g#ga2#ga2a2bp#ga2bp#Lbpa2#L#Laja9.7#La9#D#D.N#x#x.C.CbnbnbnaYaY#D#D#D#L#La9aja9.7.E#D.nafajaf.Eafafaj#Lajaf#Lafajafaf#Lafajaf#L#Laj#L#La2afaj#La9a9.na9bja9.na9#D.na9awblaYawaYawaYawa9.na9.Ea9a9.na9ajaj#L.n#D#s#s.N#U#Ibn.WamaO.8#v#OaObdbd.yaLbb.Q#8.v#3aV.abCbd.8#7#7.sb..sb..sbj#s.s.s#I.Cav.8.8#u#uaB.ybcao.Wbf#D#s#D.7.E.7.Ea3ajbpajbpajbp#L.E#s#D#s#D#s#D#s#D.n.7#s#D#s#D.s.N#x#I.NaY.s.N#s#D#s#D#M.N.s#I#x#I#x#I#x#IaCbd.8ao#s#D#s#L.7aj#L#L.j#gas#g#g.j#gas.jas#gas#g.j#g#g", +"#g#La2#ga2#ga2bpa2bpa2#L#L#L#g#La2aj#L#L.7.7a9.7.n#D#saY.s.N#x#I#x#xawaY#Ibl.N.Naf.E#La9.7#sa9#D.n#Laf#Laf#La9afaf#Lajaf#Lafaj#Laj#L#L#Lajaf#Laf.j#Laf#Laf#La9a9a9a9.n#Da9.na9#D#D#s.N#s#D#s.N#s#D.Ea9a9.Ea9.7.na9.na9#s#D.s.N#x#Ibnbn.Waobg.8.8.d.d#vbd#v.z#1bb.QaX#3aA.kaXbcao#7.s.sb.b.b.b.#s#s#D.s.N.s#x.CavaFam#v.y#u.ybyby#Ibf.s.Nb..7.E#L.7.E#L.7.E.7.E.7#s#s#D#s#D#s#D#s#D#s#D#s#D.s.N.s#x#IaYbo.s#D#saW.n.7#s#D#s.N.s.s#I#I#I.CaCax#vaO.saw#s#D.n#Lafaja2a2.j#gas#g#g#g#g#g.j#g#gas#g.j", +"#ga2#ga2#g#L#ga2#ga2#g#L#g#L#L#L#g#L#L#L#L.n#L.7#D#D#D#DaYaY.N.NawaY#xaY#x.NaY#Ma9.7a9.Ea9#D#Da9a9af.7af.Eafaj#Lajafafafaj#Lafaf#Lafaj#Laf#Laj#La2af.j#Laf#La9.7a9.7a9.7a9#Da9a9#s#Dbl.saY#saY#s#D#s#D.na9.Ea9.7a9.n#D#s.N.s#xbobna0aCa0am.8aOaO.8#vbd#vbd.yaL#1.Qbk.Obi#R#8#v.rbo.saE#sb.#sbjb..7.E.n.E#s.s#I#xbo.Wavbc.y#u.yanaoaq.Cbo.N#D.E.7.E.7#L.E.7.E.7#s#D#s#D#s#D#s#D#D#s#s#s.N#s.Naw.N#x#xaw.N#s#D#sbj.n.7.E#DaE#saYboaCaCaoaoaoao#Oao#Iawaw#s#D.n.7a9aj#g#L#g.j#ga2#g.jas#gas.j#gasas", +"a2bp.jbpa2#ga2bpa2bpa2#L#Lbp#L#L#La2#L.7#L.7a9.7#s#D#D#D#D#s.NaYaYaY.s#x.s#xaYaY#D#s#D#D#D#s#D#sa9ajaf#Laf#La9af#Lajaf#Lafajafaj#L#Lafaj#L#L#L#L#L.jafa2#Laja9a9.na9a9.na9.na9#s#D#D#s#D#s#D#s#D#sa9#sa9#Da9.n#D#s#D#D.saY#xaY#IamaCamaobgaObcbdaOax#vbd#v#v.yaL#1.Qa5#3#R.vbc.W#7#s.sb.b.bjb.bj.E.7.Ea9bj#s#Daw#s.Nbo.C.8#van#ubc#v.8a0bf.s#D#sbj.7bj.7#D.7#sbjawaY#saY#s#D#s#Daw#DaY.saY.NaY.saY.saY.N.s#D#s#D.Ea9#s#s.N.sboawao.8.d.daoaC#I#x.sawbo#M#D#Daj.7#L#L.jbpa2bpa2#g#g#g.j#gas#gas#g", +"#ga2#ga2#g#L#g.ja2#g.jbpa2aj#Lbpaj#L#Laj#Laf.7af#D#D#s#D#D#D#D#D.N.saYaY#xaY#x#IaY.N#D#D#s#D#Da9#L.na9.na9ajafajaf#Lafajaf#Laf#Lafaj#L#Lajaf#L#La2a2a2#Laf#La9a9.7a9.7#Da9bja9a9.7#sa9#D#s#D#s#D#s#D#D#s#D#s#D#sa9#s.NawaY#I.C.WaF.8b#ao.8bg#vbd.8#vbd#vbd#v.d#v#1#1.wagbi#8ao#O.saE.sb.#sb.#s.Eaf.Ea9.E.n#D#s#Db.#s.N#Iaqambca#aB.y#vaO#I.Cbf#I#s#Db.#Db.#Dbj#saYawaw#D.saY#M.N#M.N#saY.s#x.s#x.s#x.s.N#s#Db.#D#Db..N.s.N#Ibo.W.CaoaxaoaxaCaC#I#x#I#I#Iaw#s#D.n#Laj#L#Lbp#L#L#L.j#ga2#g.ja2.j#g", +"#L#g#L#g.j#ga2bp#g#L#g#L#Lbp#L#L#La2.7#L.7.Ea9.EaY#D#D#s#D#s#D#saYbl.NawaY#UbnbnawaYawbl#D#p.na9afa9.n#La9#La9#Lajaf#Lafajafajaf#L#Laf#L#L#La2.ja2#La2#L#Laf.7a9a9a9a9.na9.na9a9.7a9#s#D.n#D#s#D#s.N#sbj#D#D#s#DblaYaw#x#I.CaCamaOaF.8.8aO#vbdaO#v.d#vaO.8aObd#v.zaBa5.O#r.Q#O.Wbo.s.sb.aEbjb.bjb.a9.E.7.n#s#D#s#D#D.s.N#Ibf.W.C#v#va#aOaF.8aoam.s#D#s#D#s#D#s.saYawaYaYawblaYaw#DaYaYaYbl.N#x#xaY.saY.N#s.N#saWawaY#I#x#I#x#IaC.C.WamaCaC.W#I#I#I#x#I#I#I.s#sa9.E#L.E#Laja2bpa2a2.j#ga2#ga2#ga2", +"aj#g.ja2#g#L#ga2#ga2#ga2bpa2#L#L#Lajaf.Eaf.7a9.7aY#s#D#D#D#Da9a9.saY.saYbn#x#xa0#I#x.NaY#M#Da9.na9aja9a9.nafajafafafajaf#Laf#Lafaj#Lajafaja2#L#La2.3#L.jaf#L.na9.7.n.7a9bja9#D.n.7#sa9.n#D#s#D#s#D#s#D#D#s#D#s#DawaY#Ibn#Ia0aoa0#v#vaOaFaObd#vax.ybc.d.8.8.8.8bd.y#1a5aX.v#1ao.W#7.saE.s#sb.#Db.#s.7.E#D#s#D#sa9#s#D#s#D#s#D.s.saFaFamaO.y#v#v.5#I#Iawbf.s#x.s#xawaYawaYblaw#DblaY#Mbl#saYaw#x#I#x.Naw.N#sbj#s#D#I.WaC.WaC.Wamao.8aoao.W#IaY.NaY.N.N.s#D.saw#s#D.n.Ea9aj#Laj#Laj#ga2#gas.j#g.j#g", +"a2#ga2#ga2aj#L#L.ja2a2aj#L.E#Laj#pa9a9#pa9.n#pa9#M#Dbl#Dbl#MaYaYaYawaYaYawaY#UaYa0.p.VbnaYawa9#La9a9ajaf#L#Lafaj#L#L#Laj#Laj#L#Laf#L#L#L#L#La2#La2a2#La2#La2#L#L#L#L#L.Ea9.7#s#D#La9.E#D.na9.na9.n#s#D#saw.Naw#xaw#I#x#I#U.CaCaoao.VaoaoaO.8aO.8#Oaoaxao.haC#Oao.daO#uagbibk#vav.W#I#s.E.Eaj.Ea3aj.n#L.E.7.nb.#s.N.saY.N#I.N#IaY#I#I.C.8#v.yaBaPaBa#aFa#.5aqaqaN#xbfbf.N.NaY.Naw.NaYaY.Naw.NbfaYawaYaYaw#x#I#xa1#U#I#U#I#x#I.N.s#D#s#D#Dbj#sbj.E.7.Ea9.7.7#L.7.7.7.7.E.7#L.7#Lbpa2.jas#g#gas#gas", +"a2.ja2#L.j#L#La2a2#g#L#Laf#L.7#La9#pa9a9#pa9#pa9bl#Dbl#sbl.NblawblaYblaY#xaYaY#Ubna0b##UbnaY.n.7#s#Da9.na9.n#Laf#Lajaf#Laf#Lafaj#Lajafaj#L#L#L.j#L.j#La2af#La9a9#L.7#L#La9.7a9#Da9.Ea9.n.7.n.7#s.na9#M#Daw#x.s#xawbn#I#U.CaCaCaCaobgaCaoaOaOax#vao.hao.W.W.Wav.haoax.y#E#zagapbc.Wbo.s#s.E.Ea3.E.7aja9.Ea9b.a9.EaY.Naw.Naw.Naw.N#I#x#Ia0amaF.yaBa7#u.ya#aoaqavaq#x.C#x#I.Naw.NaYaw#x#I#I#x.s#xboaYaY#I#x#I#x#IbfblaYbl.NaY#D.N.N#Dbj#sbj.Ebj.7bja9#L.E#Laj#Laj#L.E#L#L.7aj#La3ajas#g.jas.j#g.j#g", +"a2#gas.ja2#L#Laja2#Laj#L#L#La9.7.na9a9#Da9#Da9a9#s#D#D#s#D#s#D#Dbl#sbl#D#M#DaYaYaY#Ubga0bnaY#s#D#s#Da9a9.na9ajafaj#Laj#Laj#L#Laf#L#L#Laf#L.j#L#La2a2#La2#Lafa9a9ajafaja9a9#s#D#s#Da9.n#D#sbl#s#D#M#s#D#Maw.N#I#I#I#I#x#I#IaC.CaC.paCaCaoao#O.8ao.h.W.W.W.W.W.W.W#I#Q#v.w.Obiagbk.W.r#I#sb..E.E.Eaja9.E.n.7.n#D.saY.saY.Naw.NaY.Naw.N.s#xaCaq.8aF#Sa7a7#u.yaFam.5ao.Ca0.C#x#x#x#Ibn.R#x#x#xaY#xaY#Ibn#UaC.W#xbf.sbl#s#D#sa9.Ea9.7.E.7.7#L#L#Laj#Laj#L#L#L#L#L#L#Lbpajbp#Lbpbp#Lbp#g#gas#g#gas#gas", +"a2.ja2#La2aja2#L#L#Laf#L.Ea9aja9a9a9a9.na9a9.na9#D.n#Da9#Da9a9.na9a9#sa9#D#D#D#saY#xaCa0#U#x.N#s#D#D.na9a9.n#La9#L.n#Laf#Laf#Lajafaj#Laj#Laf#L#Lafajafafaj#L.Ea9#La9a9.n#D#D#D#D#D#s.Nbl#D#s.N#M#D#M#D.saYawaw#IaY#I#U#I#x#IaC.WaC.CaC#IaCavao.W.Wav.W.Wbo#I.W.Wbo.W#Q.y.w.Uau#3bd.8bo.s#s#sbjb.a9.E.n.7b.#sbj#s.Naw.Naw.NaY.saY#s#s#D#I#x#Ia0aoaFa#aBaBaBa##va#aoa0aoa0aoa0aC.Ca0#xaCbn#I#xaw#xa0aCa0#x.Caw.N.Na9a9a9a9.7a9.Ebj#L#Laj#L.E#L.7#L#L#Laj#L#Laj#Lajbp#L#Lbpajbpaj#Las.j#g.jas#g.j#g", +"a2a2a2.ja2#Laf#Lajaf#Laja9a9.7a9a9.na9a9a9a9a9a9.7a9.7.n.7.7a9.7.7#L.7a9#s#D#D#D#D#Mbnbn#x#xaY.N.s#D#D#sa9a9#Laj#L#L#Laj#Laj#L#L#Laf#Lafaj#Laj#La2a2afajafafa9a9a9.na9#Da9#s#D#D#MaYblawaYawaYbl.s.Naw#D.saYawawawaw.s#I#I.C.W.W#U#I#I#x.WaC.W.W.W#I#Ibo#xbo#I#Ibo.Wavbc.y#u.G#3.Qbc.Wbfaw.s#sbj.n.7.n.7#s#D.s#D.saY.NaY.N#M.NaYb.#D#s#Daw#Ia0#UaFaOamam.5.8.yaB.8aO.5ao.5amam.8amaCa0a0#x.C#I#Iaoam#I#xaY#D.N#Da9.7.7.7a9.7.7.7aj#L#L#L#L#Lajbp#Lbp#L#Laj#L#L#L#Lajbpaj#L#Lbp#L.j#gas#gas#gas#g", +"a2a2.j#La2#L#L#Laf#Lafa9a9a9#D#D.7#Laf#L#Lajafaj.7aj#L#L#L#Laj.7aj#Laj#Lbj.7.7b.a9#D#D#xaCa0.W.NaYaw#D#Da9.na9af#Lafajaf#Laf#Lafaj#Laj#L#L#Laf#L.3ajaf#La9aj.7a9a9a9a9a9bl#DblaY#DaY.NawaYblawaY.NaYaw.sbl#s#Maw.N.saw#x#I#I#I.C#I#x#I#I.W#Ibo#Ibo.Wbf#Ibo#Ibfbo#Ibo.W.8#Qbc.ybkbv.Q.8#I.s.s#s#sb..nbj#s.N#sbj#saY.Naw.saY.NaY.s#D#s.Nbo.N#I#I#xaCamao.Ca0b#aobyaOaF#v#vaB.y.ya#aOaF.5aCa0aC.CaCbn#xaY#D#D#D.7#D#Laj#L#Laj#L.7#L#Laj#L#Lajbp#Laj#L#gaja2bpa2bp#g.jas#gas#gas.j#gas#g#g#g.j#g.j#g", +"a2.ja2#L.j#Lajafajafa9a9a9#Da9.n#L#L.7#L#L#L.7#Laf#L#L#Laf#Laf#L#L#L#Laj#Laj.7.7#L.n#DaY#x.W.C.C.s.NaY#s#D#Da9#s#Laj#L#Laj#Laj#Laf#Laf#Lajafaj#Laja2afajafafa9.na9#pa9#M#Dbl#DaYaYaYawaY#xaYaYaYaw.Naw#D#sbl#s#M#s#saY.s.s#x#I#I#Iawawawbo.N.s#I.s.s.sbo.N.s.s#I#I#x#Ia1.Wao#vaLbkap.yaobo.N.N.s.7#s#sbj#s#D.sbjaY.saY.Nbl.saY.N.s.N.s.N.N#I#x.sbfbf.C.WaCaqamaq.5aoa##v.0#u#u#ua##vaOaFama0#x#xaYaY#D#Da9.7#L.Eaf#Lafaj#Lbpbp#Lbpa2bp.jbpa2#L#ga2aj#g#L.jbp.j#L#g#g.j#g.j#gas#g.j#g.jas#gas#gas", +"a2#L.ja2a2#L#L#Lafafa9.na9a9a9#D.7#L#Laj.7#L#L#L#L#Laj#L#Laj#Lajbpaj#Lbp#L.7.7bj#L.7#DaY#xa0.C.WaYaw.N#D#D#D#sa9aj#L.Eafajaf#Laf#Laj#Laj#L#L#L#L.3#L#Laf.7#La9a9a9a9#p#Dblbl.NblawaYaYaYaYawaYawaY.NaY.sbl#sa9.n#D#D#saw.s#I#I#xaw#x.saY.s.s.N.s.N.s.Naw#D.s.N.sbn#I#Iboa1#b.d.8#Tap.Qbcbo#D#sbo.nb.#D#s.Nb.#D.s.Naw.Naw.NaY.Naw.Nbf.s.N.sbfaY.N.saY.sbf.C.Waqavbga#a#a#.yaZ.0anaBbm#vaOaobn#I#xblaY#Ma9a9af#La2#L#L#Lbp#Lbpaj#L#g.ja2bpa2aj#gaja2#g#L#g#L#g#L#g.j#gas#gas#g.j#gas#gas.j#g#g.j#g", +"as.j#g#La2aj#Laja9ajaf#L#L.n#Laf#Laj#L#L#La2#ga2#ga2a2a2#ga2a2#g#L#Lbpaj#Laj#Laj#D.s#DblaY.VaObm.C#IaYaw#D#s#D#Dbl#Ma9a9af.7aj#Lajaf#Laf#Lajafaj#Lajafaj#Laj#L#Lajafa9a9.7#sa9#DaYaYaYaYaY#xaY#x.N#s#D#s#D#s#Db..n#sbj.n#D.sbfbo.s.s.N.s.N.s.s.N#s#D#s#D.s.N#Ibf.s#Ibo#I.Wav.8bcbta5.U#3aB.5.W.N#x#I#x.saY.s.N.N.s#D#Ma9b..E.7.nbfaw.NaY#xaY#Ibf#D#s.N.N#x.Waqavb#ambga#aO.0.y.yaoaCa0#x#xaY.N#D.Ebj.7.7.7.7.7.7#ga2#ga2#ga2#g#ga2#ga2aj#g#g#L#g#g#L.jbp#Lajbp#L#g.jas.jas#gas.j#ga2#ga2#g.jas#g", +".ja2#Laj#L#L.7.7af#Lafajaf#Laf#Lbpa2#La2#L#L#Lbp.ja2#g#ga2#ga2#g#L#L#L#L#L#L#L#L.7#D.NaYaYaobmaZamaCbn#x.NaY.N.N#Mbla9.nafajaf.7a9#Laj#Lajaf#L#Laf#L#L#Laf#Lafaja9af.7.n#Da9bja9#xawaYaYawaYaYaw#Dbl#s#D#D#s.7.n.7b..nbj#sbj.s.saw.s#D#saw#D.s#D#s#s.s.N.sbfawbf#Ibf.sbo#Iav.8bc#uaz#3bi.G#vaq.W#I#x#I#x#x#x.s#DaY#s#D#s#D#s#Db.aY.saY.N#I#I#x#x#I#x#I.C.WaqamamaFaObm#vaBaZ#va#bna0#xaYaw#D#D#Dbj.7.7.7.7.7.7.7#g.ja2#g.j#ga2bpa2a2a2#g#La2#L#g.j#g#gajbpbp#Lbp.j#gas#g#g.j#gas#g.j#g.ja2a2#ga2", +"#L#L#L#L#L.na9.n#Lafajaf#L#L.ja2#L#Lbp#Laj#g#L#L#gbp.j#L#gaj#ga2aj#g#Lbpajbp#Laj.7#D#sblaYb#aOa7b#amaoa0aC#x.baYbl#Mbla9#D#L.na9aj#Laf#L#Laj#Laj#Lajafaj#L#Laj#Lafajaf.7a9a9#Da9#Dblblblblblblbl#D#s#D#D.n.7.E.7.E.7.7.E#s#s#D.s.N.s#Db.#D#s#D#sbj#s#D#s.N.sbfboaYbo#Ibf.Wavbcbc.wa5au.M#3.w#v.5#Ibn#I#IaY.s.N.N#saY#s#D.s#D.s.NawaYawaY#I.C#Ibn.Wa0amamao.5.8.5#uanaB.ya#aoama0awaYaY.NaY#D#D#D#L#L#Lbp#L#L#L#Laj#gbpa2bpa2.j#g.j#L.j#L.jbp#g#Las#ga2#ga2aj#L#L#g.j#g.j#ga2#g.ja2#ga2#g#Laj#Laj", +"#D.na9#sa9#Da9#Daj#L#L#Lajaf#L#L#g.ja2#g#g#g.j#ga2a2#g#ga2#ga2bp#ga2#ga2#ga2#g#g#Lb.a9aY#UambmaZaO.t#SaFb#a0a0#UblaY#s#D.na9.7.n.7aj#Lajaf#Laf#Laf#L#Lafaj#Laf#L#Laf.7af.7.n.7#D#M#D#D#D#D#D#D#s#D#Da9#sa9.Ea9aj.7.E.E.7.7b.#sbj.s#s#D#s.N#saW#s.N#s.Nb..N.Nbo.N#xbo#x#I.Wav.8.yaz#T#3#z#z.O#uaF.CaC.C#x#I.Naw#D.sbl.saY.s.Nbo#Ibn#U#x#Ua0#Ua0aCb#am.8a##va#aBan#u#u.0aFama0#xaY.NaY#D#s#D.7.7.7#Lbpaj#Lbpajbp#Lbp#L#L#L#Lbp#L#L#L#L#Lbp#L#Lajbpas.ja2.j#ga2bp#Laja2#L#La2aja2#L#L#L#Laj#L#Laj#L", +"a9a9a9a9a9.na9a9#Lafajaf#L#La2a2aj#g#ga2#L#g#L#g.j#g#g.j#g#g.j#ga2#gaj#ga2#ga2#g#L#L#L#s#xb#aOa#.t#SaZaBbmbga0bnawaYblbl#Da9.n.7#Laf#L#Laj#Laj#L#Lajaf#L#L#Laj#Lajafajaf#La9a9a9#D#D.na9a9.na9a9a9.na9.7a9.E#L.Eafaj.7.E.7.nbj#s#Db.#Dbj#sbj#sbj#sbj#D#s.N.s.N#x.W#xbo#xavambcbb.O.O#a#a.Oba#3aBamaoa0.W#x.s.N#saY#saY#I#x#I#x#IaCa0aoamaob#aoamaF#v#vaB.0aB.0#ua#a#.5ao#xaY.Nbl#sbl#Da9.7.n.7.7aj#L#L#L#L#La2#Laj#Laj#L#g#L#L#Laj#Laj#L#L#Lbp#L.j#g#L#L#Laj.7#L#Laj#Laj#Laj#Laj.7aja9#La9aja9a9", +"#Da9#s#L.n#L#L#Laj#L#L#g#L.jbpa2#ga2#g.j#gas#gas#g#g#g#g.j#g#gas.j#g#g#g#g.jas#g#gaj#L#D#xaOaZan.FbmaBaZbmaFb##UaYblawaY#s#Da9.7.n#Laj#Laf#Lafajaf#L#Lajafajaf#L.3#Laf#La9aj.7a9#Ma9a9#Da9#Da9#Da9#D#La9aj.7aj#L.E#Laj.7.Ebj.nb.#s#D#sbj#s.N#s#D.s#D#sbj.N.sbf.s.C.Wa0.Wam.8.ybb#a.O.GaPaz.M#C.faOaoaq.W#xaw#D.s#D#I.N#I#xaCamaoaFaO#vaO#S.y#S#v#v#S#va#aOaFaOaFamaoa0#xaY#D#sa9#D#Da9.7.7#L#L#La2#L#g#L#g#Lajbp#L#Lbp#Laj#Laj#L#Laf#L#Laj#Lajbp#L#Laj#L.n.7a9#sa9.n.7.nbj.nbj.na9a9a9.na9#Da9a9", +".7#L#L#L#L#Laja2#L.jbp.j#L#g#L.j#g#g#gasas.jas#g.jas.jasasas.jas#gas.jasas#gas#gasbp#L.7awam.yan.Fbm.TaZaBaFam.R#IaYawbl.N#s#D#D#Lajaf#Laj#L#L#L#Lajaf#L#L#L#Laj#L.jafajafafafaja9#Da9a9a9a9a9.n#Lajaf.E#L#Laj.7.j#Laj#L.E.7.E#D#saW#D#sbj#sbj#Db.#DaE#D.sbf#IbfaCaq.Waoao#v.y.wbkaz.w.waz#3biau#uaOamao#xboaw.N.s#x#I#xaCambgbg#uaBa7#ua7an#ubh#vaFaOama0aCa0a0a0bn#UaY#sa9af#L#sa9.7a9aj#Lbpaj#g#L.j#gaj#g#L#Laj#Laj#L#L#Lbp#L.E#L.E#L#L#L.7#L.n.7a9#D#D.N.s.Na9#s#Da9#sa9#D.n#D#D#s#D#D#s#D.7", +"aj.7aj#gaj#gas.ja2bpa2#L#gaja2bpas.jas#gas#g.jasasasasas.jasaU.j#gas#gas#gas#gas#g.ja2#LaYa0.0aZ.Fa#aBaZa#aFbn#UaYaY.N#MaY#D#D#Daj#L#Laf#Lafajafajaf#L#Lajafaj#L.3#La2af#L.Eaf.7a9a9.n.7a9.n.7a9af#Laf#Lafaj#L#L.j#g.E#L.E.7#s.Ebj#s#sbj#D.s#Db..N#s#D.s.sbf.s#Iaqa0ao.C.8#vbbaPbk#u.w.Q.w.wau#N.Q.yavam#I#x.sawaY#I#IaCaoaoaO#vaz.Gaz.GazaS#uanaoaCa0.Wa0.CaC.CawaY#Da9a9#La9aja9a9.7aj#L#L#Lbpaja2bpa2bpa2#Laj#L#L#L#L#Laj#Laj#La9#L.7.7.E.7.E#D#D.N.s.N.s.N#x.7.7.n.7a9#sa9#D#s#D#D#D#D.7#D#D", +"#g#g.j#g#g#g.j#g#g.j#g.j#g#g#g.j#g#gas#gas#gas#g.jasasasas#gasasas#gas.jas#g.jas#g#g#ga2a9.C#SbhaFbgamam.8amaCa0aYaYaY#Da9.E#Laja9#Laj#Laj#L#L#L#L#Lajaf#L#Laf#Laja2ajaf#Lafa9a9.na9a9a9a9.7a9a9af.n#Lajaf.7#L.E#Lbpaj#g.n.7#s.N.s#DaY.saY.Naw#x.saYbo#x#x#I#x#I.8amaob##v#u.G.2bkaz#ubbaP.w.G.2.u.Oa#aoav#Ibfboawbo#xaoamaBan.Gba#a#ua#ao.5#Qaq.W#x#x#x#I#x#xaY#xawaYbl#D#M#Da9a9a9a9a9.7a9a9a9#L#Lajaf#Lajaf#La9.n#D#saY.NaYaY.N#sbl#D#MaY#M#D#D.n#Da9#D#D#D.n#Laj#L#L.E#Laj#L.7aj#Laj#Laj#Laj", +"#g.j#gas.j#gas.j#ga2a2#ga2.jas#gas.j#g.jas#g.jas#g#g.j#gas#gas#g.jas#gas#gasas#g#g#La2.j.7bnaF#ub#b#amb#ama0bn.CaY#M.N#sa9.na9#Lajaf#Laf#Lafajafaj#Laf#Laj#Laj#La2afafaj#L#La9.7a9.7a9.7a9a9a9.7afafafa9#L.n#L.7ajaja2.j.7.E#D.N#Daw.Naw.N#I#x#x#I#x#I#x#IaC.CaC.5bg.8aO.0.w#T.2.G#u.ybbbb#u.GaX.e#z#SaoaC.s.W.W#I#Iaoam#v#u.G#TarazbmaoamavaN.C#x#xawaY#x#IaY.saY#Daw#D#Da9a9a9#sa9.na9a9.na9.na9a9a9#sa9#Da9#sa9a9a9#D#Mbl.NawblblaY#MaYaYaYaw#D#D#s#D#D.n#D#D.n#La9ajaf#Laf#Laj#L#L#L#L#L#L#L", +"#g#g#g#gas#g#g#ga2.j#g.j#gas#g.j#g#gasas#g.jas#g.jas#gas.jas#gasas#gas#gas#g#gasa2aj#g#La9aYa0bmbgambgama0.C#x#xawaY.N#Da9.7#L#Laf#Laj#Laj#Laf#L#Lafaj#Laf#Laf#Laja2#Lafaf#L.na9.na9a9a9.Ea9a9.7ajafajaf#L.7#L.7bp.Ebp.Eaj.7#s.Naw.Naw.Naw#x#I.N#I#x#I.C.Wa0aoamao.5ao#vaBazal#3aB#vaF.y.yaB#u.wa6#z.w.8.C.Wam.CaoamaO#v#uaz.G.GaBaFama0#xawbfa1aY.NaY.NaYaY.NaY.N#D#D#D#Da9a9a9a9.7#D.n#D.7a9a9#D#s#D#D#D#s#D#Da9.na9a9#D#Daw.N#D#s#D#D#D#s#D#D.7.7.7.7.E.7.7.7#L#Laj#L#Laj#L#L#Laj#Lajbpaj#Lbp", +"as.jas.j#g.jas.ja2#ga2as#g.j#gas.j#g#g.jas#g#gas#g.j#g#gas#gas#gas.j#gas.jasas.j#ga2#gaj#LaY#Uamb#ama0a0aCbn#Ibn.Nblaw#Da9aja9aj#Laj#L#Laf#L#Lafaj#L#Laj#L#Laj#L.3aj.3#L#L#La9.7a9a9.7a9a9.7a9a9afa9#La9aj#L.n#L.E.7aj#L.E#D.sbfaw#M.NaY.s#x#IaY.C.W.C.W.Caqaqao.5aoaF#v#uaz#T.o#vaO.8.8bcbcaB#ualbaa5#vaoa0avaoaF#vbm#uaz#u#uaZa0am#x#M.N.N.N.N#D.Naw.N#s#D#D#D#D#sa9#Da9.n#L#L.na9a9.7a9a9.7#s#D#D#Da9#Da9#D#s#Laf.7a9.n#Da9a9#L.7#L.7aj.7#L#Laj#Laj#L#L#Laj#L.j#L#La2#La2#La2ajbp#Lbpa2#L#ga2", +"#g#g#g#gas#g#gas.j#g.j#g#gas#ga2#gas.j#g#g.jas.j#gas#g.jas#gas#gas#gas#gas#gas#gaa.j#g#L#LbjaY#Ua0aCa0a0#xbn#xawbl.N#D#Da9.7#L#Laf#Lafaj#Laj#L#Laf#Laf#Lafajaf#L#La2#Lajaf#La9a9.n.7a9a9a9a9a9#Lafafajafaf.7#L.7#L.7#Laja9#saY#IaY.saY.saY#I#x.s.C#xaC#x.Caoaqamao.8a##v#u.Ga5azaOaOaoao.8#v.ya5ba#z.w#vao.Wam#vaB#uaB#uaZa#aF.5#xawaYbla9.E#D#sa9#sa9#D.7.7a9#s.7a9.7.7#L#L#L#L#L#Lajaf#L#Lajafa9.7.na9a9.7a9a9.7aj#L.7#L.E#Lajafajaf#Laf#Lajaf#L#L#L#Laj#L#L#L#La2aj#gaj#gaj#g#La2.jbp.jbp.jbp", +"as.jas#g.jas.j#ga2as#gas.j#g.j#g.j#gas#ga2#g#gas#g.jas#gas#gas.j#gas#gas#gas#gas#g#ga2bp#L.na9bla0bnbn#UaYawaYaYaYbl#Da9.n.7afaj#Laj#L#L#L#Lafaj#Laj#Laj#L#L#L#L.ja2a2a2af#L.n.7a9a9a9a9.7.n.7a9afaf#Lafaj.7af.E#Laj#L.Ea9aw#x#IaY.saY.NawbfaY#x#I#x#I.C#I.C.Wa0.8am#v.0#u.G.w#uaO#v.8#Q.8bdbb.Q.K#z#u#vaFaoaBa7a7#u#SaFaoamaCbnaYaY#Da9aja9a9bj.7a9.7a9.Ea9.7.7af.7#L#Laj#L#La2ajafaf#L#Lafafafaj#Laf#Lajaf#L#La9#L#Laj#La2a2a2#ga2.j#g.ja2a2#gaj#gaj#g#La2bp.j#g.j#ga2#ga2#g#g#g.j#g#g#ga2a2#g", +"#g#g#g.jas#g#gas.j#g.jas#gas#ga2as.j#g.j#g.jas#ga2#g#g.jas#gasasas.jas#g.jas#g.jasaa#g#Lbp.7afajbn.RaYaYaYaYaYaYbl.N#D#D.7#L#L#Laf#Lafaj#L#L#L#Laf#Laf#L#La2#L.3#La2#L#L#Lafa9a9.n.7a9.7a9a9a9.7afaf#Laf#La9aj.7.7.7aja9#saw#x#I.N#saY#I.NaY.s#I#x#I#x#I#xaC.CaoamaO.yaB.waz#uaZ.8bc.8.8#Q.y.Q.w#4#4.wa##vaB.Qaz#vaFama0#x#x.N.s.N#D#sa9.7a9.E#D.E#L.7aj.7#Laja9aj.7#L#L#La2.ja2af#Lajafajafaj#Lafafajaf#Lafajaf#L#L#La2a2.j#ga2.jas#gas#g.jas#gasa2#g.j#g.j#g#g#g#g#g.j#g.jas.ja2#gas.ja2.j#g#g", +"as.jas#g#gas.j#ga2as#g#gas.j#g.j#g#g#ga2a2#g#g.j#g.jas#gas.jas#g#gas#gasas#gasasa2#g.jbp#LajafafaYbnaYaYblaYaY#MaY#D#sa9a9.7#L#L#Laj#L#La2afa2#L#L#Laja2#Laf#L#La2.j#L.3aj#La9.7a9a9a9a9.n.7a9a9afaj#La9aj#L.7#L#D.na9#s.naw#x#Ibl.Naw.Naw.NaY#xawaYaw#x#I#xaC#I.8aO.yan.w.G.w#vb#by.8.8bc.ybb.Qay.Y.G#u#1a5.GaBamamaobn.s#Da9.7aY#Da9.7a9.7.7#Da9aj.7af.7af.7#L.7afaj#La2a2a2.j#Laf#Laf#Laf#Laf#La2#La2#La2a2a2.7.j#La2#gaa.jasas#gas.jasasas.j#g.j#gas#gas#gas.jas.j#gas#g#gas#ga2.j#ga2#ga2a2", +"a2#ga2.jas#gasas#gas.j#g#g#gas#g.ja2a2a2.ja2a2#ga2#ga2.jas#gas#gas#gas.j#gas#gas#g.j#ga2bp#L#Laj#L.naY.R#xaYaY#D#Dbl#D.7#saf.7.n#L#L#L#L#Laj#L#Laja9#La9aj#L#L#La2a2a2.j#L#Lajafa9#sa9.7a9a9a9.E#Lafafajafa9.na9aj.na9#s#D.N#IaY#s.sbl.s#D#s#D#s.N#I#x.W.Cavam.5.8aF.0azal#T.w.0.8#v.8byaKbbaIaP#aba#N.O.GazaB.5#xaw.N.NaY#D#D#s.7.n.7#L#La9.7a9#L.7af.E#L.E#L#L#L#L#La2#La2bpa2#L#Laj#La2#L#Laja2aja2#ga2.jbpa2as#gas#gas#gas#g.j#g.j#g#g.j#gas#ga2.j#g.j#g.j#g#ga2#g#ga2.j#ga2a2#g#ga2#g.j#g#g", +"#g.j#g#g#g.j#gas.j#g#gas.j#g.j#ga2a2#ga2#g.ja2a2#g.jas#g#gas#gasas.j#gas#gas.j#gasasas#g.j#g#Lbp#La9#Dbl.RaYaY#D#D#Da9#D.7a9.7#L#L#Lbp#L#Lbp#L#L#L#L#L#g#La2a2#Las.ja2a2#Laf#L.7a9.7.na9a9.7a9a9af#L#La9#Lafaja9.na9.n#D.s.s#x#I.Nbl.s#D#M#DaY.saY#I#xaC.Caqao.5bgaO#uaz.G.G#u.y#x.W.8#v#v.y.0.ybabaay.f#uaB.8a0bfaYaY.N.N#D#D#Da9.7.7af.7.7af.E.7aj.7#La9#L.n#L#L.jaf#L#gaja2#L#La2#Lafaj#La2#L#g#g#L#g#L#ga2#g#gas#gas.jas#gasasas#gas#gas#g#g.j#g#gas#ga2as#g#ga2#g#L#gbpa2bp.j#L#gajbpa2bpa2", +"a2a2#g.jas#gas#g#gas.j#g#gas#g#g.ja2a2.ja2a2a2.jas#gas#gas#g.jas#gasas#gas#gasas#g#g#ga2#g#L#La2#La9a9#DaYbl#Dbl#Da9#Da9a9.7#L#La2#g.j#g#ga2#ga2.j#ga2.j#g#g#g#ga2a2#g#La2aj#L#L.n#Da9a9.na9a9.7#Lajafajaf.7a9.naf.na9aE.N#I#Ibn.saY.Naw.NaY.saY#x#I#x.Wa0ao.5.8aoaO#u.G.Gaz#ua##IaCaCaobg#va7azaH#zaz#uaFam#x#xaw.N.N#D#D.n#D.7.E#L#L#Laj#L#L#Laf.7#L#L.E#L#L#L#L#La2#La2#L#gaja2#L#La2#L#L#La2a2#g.j#ga2#g#L.jas#g.jas#gas#gas#g#g.j#gas.j#g.j#ga2.jas.j#g.j#g.j#ga2.j#ga2#g#L#g#gaja2bp.j#L#g", +"a2#g.jas#g#g.jas.j#gasa2#g.j#g.ja2a2#ga2#La2a2#g.jas#gas.jas#gas#gas#gas#gas#gasas.j#ga2#gaj#Lbp.j#La9a9#D#Dbl#Dbl#D.7a9.7.7af.7a2a2a2a2a2a2.ja2bpaj#Lbp#Lbpa2#L.j#g#La2#L.7#L.7a9a9a9.7a9.7a9.n#Lafaf.7afafaja9.na9.n#D#s#I#x#IaY.sawaY.saYaw.N#I#x#I.C.W.5av.5bgaOaB.G.O.G.y.5aO.8bgaFaB.Gau#N#zaz.0aFa0#x.NaY.N.N#D.n#D.7.7a9#L#La9#L.7#L.7#L.E#L#L#L#Laf.7#L#La2#L.jbpa2#La2#La2#Lajafa2#L.j#L#g#L#gaja2#g#g#gasasas#gasasas.jasasas#gas#gasa2.j#g#gas#gas#g#ga2bpa2bpaja2aj#ga2#L#g#La2bpa2", +"a2#ga2#g.jas#g#g#gas.j#ga2a2as#ga2aja2.j#g.j#La2#g#g.j#gas#g.j#g.jas#g.jas#g.jas#gas#ga2#g#La2#L#L#g#La2a9a9#D#D#Da9#Da9.7a9#L.7a2.j#g.ja2aja2#L#L#g#ga2.j#L.j#g#La2#Laj#L#La9.7.na9.na9a9a9a9a9#L#Lajafaja9a9.naf.n#s#s.N#I#x#U#I#x#x#I#x#I#x#I#x#I#x.Wamao.5.8ao#v#u.Garaz#ua#.y.0#u#u#aau#3alaza#b##I#xaw#D#sa9#s.7a9.7a9aj#L#La2aj#L#Laf#La2#L#La9aj.7#L#Laja2#L#g#La2#L#g#Laj#L#La2#L#La2#L#ga2#ga2#g#g#L#gas#g#gas#gasasasas#g#g.jasas.j#g#gas#g.j#g.j#ga2.jbpa2bpa2bpa2bp.jbp.jbp.jbp.jbp", +".j#g.ja2#g.j#ga2.j#ga2.j#g.j#g.ja2#ga2a2a2a2a2#g.j#gas#g.j#gas#gas#gasas#gas#gasa2.j#gaj#g#Lbp#La2#La2#L#La9#Dblbl#Da9bja9#L.7#L#L#Laf#L#L#Laf#Laj#L#L.7#L#L#L#L#L#L#L#L#La9#L.7a9#Da9a9.7a9.Ea9#Lafaf#Lafa9.na9.na9.E#D#s#x#I#I#I#I#x#I#x#I#x#I#x#I#x.WaC.5.8.8.5aBa5#a#TaPaPbk.U#3al#3#T.G.w.0aFaC#x#x.N#D#Dbj#Dbj.7.7aj#L#L#La2#L#La2#La2aj#L.7#L#L#L#L#Laf#Lbp.j#La2bpa2aja2#La2af#L#Laja2#L#g.jbpa2bpa2#g.j#gas.jasas.j#gas#gasasas#g#gas#ga2.jas#ga2#g.j#g#L#gaja2aj#gaja2bpa2#L#L#L#g#La2", +"a2#ga2#ga2a2#g.j#ga2#ga2a2#g#g#g.j#L.j#L.j#La2a2#gas.j#gas#g.jas#g.j#g.j#g.j#gas.j#ga2a2#gaj#L#L.ja2#g.j#g#L#Dbl#Da9a9a9.7a9.7a9a9a9a9a9a9#sa9#Da9a9.na9a9a9#Laf#Laj#L.7a9.E.7a9.n.7.n#Da9a9a9a9#Lajaf.Eaf.na9.naf#Ma9.s.s#I#x#I#x#I#x#I#x#I#x#I#x#I.CaCaq.8am#vaO#u.G.Uay#3#3bv.M#C.O#u.y.5am.C#UaYaYaw.N#D.7.7.7.7aj.7#L#Laj#ga2#ga2a2.ja2a2a2ajaf.7#L.7aj.7#La2a2bpa2aja2bpa2#L#Laja2#La2#L#ga2bpa2.j#g#ga2#gas#gas#gasasas.jas#g.j#gas.j#g.j#ga2a2.ja2a2#gas.j#L#g#L#g#L#gaj#Laj#L.j#La2aj#g", +"#g.j#g.j#g.ja2a2#ga2.j#g.j#g.j#ga2a2a2a2#g.ja2#g.j#gas.j#gas#gas#gas#gas#gas#g#ga2#g.j#L#g#La2bp#La2#gas#g#La9bl#D#Da9bja9.7.n.7a9b.#D#s#D#D#D#s#p.nbl#p.na9a9a9#L.7#L#L#La9.7.7a9#Da9.na9.n.7a9#Laf#Laf#Lafa9.na9.n.E#s.N.s#x#U#I#x#x#I#x#x#I#x#I#xaC.Wa0.8.8.8.yaB#T#4beaM.Y#T.fa7#uaOa0bf.s.N#Mbl#s#D#D.s#DaW.E#L#L#Laj#L#g#ga2a2.ja2a2a2aja2.7#Laj#Laf#L#L#L#L#ga2#L#g#La2#L#La2#L#L#L#La2aj#ga2#g#g#ga2#ga2as#gas#gas#g#gas#gasas.j#g#gas#g#g.ja2#g#g.ja2.j#L#g#L.jbp.j#La2aj#L#Lbpaj#g#L#g", +"a2a2a2#La2a2.j#ga2.ja2a2a2a2#ga2#ga2#ga2a2a2#ga2asaa#ga2#ga2#L.j#La2#L#Lajafa2#L.ja2#ga2#La2#L#L#L#Laf#Laj#L#L#La9bl#Da9blaYaYaYblbl#DaYaYawaYaYblblblblblblbla9#Da9#D#sa9#Da9#D.na9.7a9.7a9a9.n#Laf.Eaf.Eaf.naf.na9#M#D#saY.saw.N#s#s#D#s#s#D#s.C#I#I.C#Iao.5#v#u.OaVadbi#3#1aBbdaO.W.C#IaYbf.N#D#s.7#L#L#Laj#L#Lbp#Lbpbpa2bpa2.j#g#g#Lbp#Lbp#L#L#L.7.7.E#L.7#La2a2a2.ja2#ga2.ja2#L.3a2a2#g#g#g#L#ga2#ga2#g#ga2#ga2#ga2.j#ga2#g#gas#gas#g.jas.ja2#g#L.j#L#g#g#L.ja2a2#L#L#L.7#L#L#L#La2#L#Laj#L", +"a2a2.j#L.j#La2a2a2a2a2a2#ga2a2a2.ja2a2.ja2#ga2a2asa2asa2.j#L#g#La2#L.jaf.3#L#La2aa#ga2a2#L#Laj#Lafaj#L#L#Lbpaj#La9#D#p#Dbl#DaYaYbl#DblaYaw#xaYaYbl#Dbl#Dbl#Dbl#Da9#sa9#D.7#D.7#D.7a9a9a9a9a9.7a9.n#Laf#Laf#La9a9.n#s#D#M#DawaY#I#s#D#s#s#D#s#D#sbf#Ibf#I#Ia0bc.y.G#zad#4aXbk#v.8bgao.C#x.N#x.N.s.7bj#L.7aj#Lbp#Lajbp.j#L#gaj#g#L#gbpa2bp#L#La2#L#L#L#Laf#La9#L#L.j#ga2#ga2a2a2a2a2#La2aj#L#g#L#ga2#g#ga2#ga2#ga2#g#ga2#g#ga2bpa2as.j#g#g.j#ga2#g#L#Laj#Laj#Laj#L#gaja2ajafaj#L.Eafaj#L#Lajaf#L#L", +"a2#La2a2a2.j#ga2.j#L.j#ga2a2#ga2#ga2#ga2#ga2a2asa2.jasa2#ga2#La2#La2#L#L#Laf.j#L.j#L.jafaj#Laf#Lafafaf.7#L#L#Lbpa9#pa9#D#Dbl.sbl#D#MblaYaYaYaYawbl#D#M#Dbl#D#Mblbja9bja9#D.n#Da9.na9.7a9.7a9.na9#Laf.Eaf.Ea9.n.n#D#M#saYaw#IaY#IaY.s#D#s#D#s#D#s#I#x#I#I.Cao.y#1#T#rbq.G#u.yaOaCamaC#xawaY.s.N.N.7aj#Lbp#Lbpa2#ga2#Lbp#L#g#L#g#L#ga2#gaja2bp#Lbp#Laj.7aj.7aja9#L#L#L#L#L#Laj#L#L#L.j#La2#ga2#g#g#L#ga2#g#g#ga2#g#ga2#g#ga2#g.j#g#gas#g.jasa2.j#gaj#L#Laj#L#Laj#La2a2a2#L#L#La9#Lajaf#Lajaf#Laj#L", +"a2.ja2.ja2a2a2#ga2a2#ga2a2#g.ja2a2a2a2a2a2.ja2a2asas#ga2a2#L.j#La2aja2a2a2#Laf#Lafa2af#Laf#Lafajaf.E#Laj#L#Lbpa2a9.na9#Da9a9#D#Dblbl#DaYaYaYaYaY#Dbl#Dbla9#D#D#Da9#Da9#Da9bja9bja9.7a9a9.na9#Da9#D.na9a9a9a9#D#sbl#saYaw.s#x#I#I.saw.saY.s.Naw.N.s.s#IaCaoao#u.G#z.UaX#uaOaOao.W#x#IaY.N.N.N#D#D#L.7#Laj#La2#ga2#gbpa2bp.jbpa2bp.ja2#g#L#Laj#L#La9.7a9.7a9.7.7a9#L#L#Laj#L#L#La2af#La2#L#L#g#L#ga2#g#ga2#ga2#g#ga2#g#ga2bpa2bpa2#g.ja2#ga2#g.ja2#Laj#Laj#Laj#L#La2.j#Lajafaj#L.E#L#Laf#L#L#Laf#L", +"a2bpa2#La2.j#ga2aja2a2a2.ja2#ga2#g.j#ga2#ga2#ga2a2aa#ga2#ga2bpa2#La2afaja2afa2#Lajafajafajafa9a9af#Laf#L#L#L#Lbpafa9a9a9a9a9#D#D#Dbl#DblawaYaYaY#D#Dbl#D#Dbl#D#Da9b.a9.7a9#Da9#Da9.na9.7#D.na9.na9a9#D.n#D#s#D#M.NawaY#I#x#I#Ia0#IaY#Iaw.Nawbo#x.s#x#I.WaF.yaz#3.a#4a5#v#vaoaC#IaYaY.saYaw#D#sbj#Laj#Lbp#L.j#g.jbpa2aj#g#L#g#L#g#g#L#g#L#g#Lbp#L.na9a9.na9a9.na9#Lajaf#L#L#L#Laj#Lafa2#L#g#L#g#g#L#ga2#g#ga2#ga2#ga2#ga2.j#ga2#g.jas#g.j#g.j#ga2aj#L#Laj#L#Laj#Laj#La2#L#Laf.7af#Laj#Lajafaj#L#L", +"a2.ja2.j#L#ga2a2a2#ga2#ga2#ga2a2a2a2a2a2a2a2.ja2as.jasa2.j#La2#La2#La2a2#La2afajafafafafaf#pa9.n#Laf#L#L#L#L#g#Lafa9a9a9a9a9a9a9a9#DblaY#DaYawaY#D#M#D#D#M#Da9#Da9#Da9bja9.7#s.7a9.7a9.na9a9.7#D#s#D#s#D#Dbl#s.N#M.Naw#I#I#IaC.W#I#xbo#xbo.N#IaYbo.W.Wa0#vaz.Y#.aVapaOaO#O#I#I#xawbl.N#D#D.7a9.E#L#L#L#gaj#g#g#ga2bp#gbpa2bp.j#La2#g.j#L#La2#Lbpa9.7#D#D#s#Da9#D#L#L#L#L#L#L#L#L#L#La2#L.j#Lbpa2#ga2#g#g#L#ga2#g#g#ga2#gbp#g#L#g#g#g#ga2a2#g.ja2aj#Laj#L#Laj#Laja2#Lajafaj#Laj.7aj#Laf#L#L#Laf#L", +"a2#La2#ga2.ja2#ga2.ja2a2a2a2#g.j#ga2#g.j#ga2#ga2#gaa#ga2#ga2aja2#L.j#La2#L.jafaf.3ajaf.n#p.n#pa9afajaf#L.7#L#L#L#L#La9a9#D.7a9#Da9a9bl#DblaYaYaY#D#D#D#D#D#D#D#Da9bja9a9.7#Da9#Da9a9a9#Da9#sa9a9#D#D#D#D#s#D#saYaw#I#x#IaC#x.WaC#I#I#x#I#x#I#I#xa1ao#Q.8.w#4.P.4#u#Sao.WaCa0bobfbl#s#D.na9#L.7#L#Lajbpa2a2#g.jasbpa2#L#g#g#L#gbp#ga2#g#Lajbp#Laja9a9#M#Dbl#D.na9.7a9.7a9.Ea9a9.7af.jaf#La2#L#L#g.j#ga2#ga2#g#L#ga2#ga2bpa2a2.j#g.j#g.j#g.ja2#g.j#Laj#Laj#L#Laj#L#Lajaf#L#Laf.7af#Laj#Lajafaj#Laj", +"a2.j#L.j#La2#L.ja2a2#ga2#g.ja2a2a2a2a2a2a2a2a2a2asa2asa2a2a2bpa2af#La2afa2#L#Lajaf#pafafa9#p.n#p.7af#L#L#Laj#Lbpaf#La9.7a9a9bja9a9#D#Dbl#DaYaYaY#D#D#D#Da9#Da9#D#sa9a9bja9a9bja9.Ea9.7a9.Ea9a9a9#s#D#s#D#Dbl.s#Daw#x#IaC.WaCaCao.Wav#Ia1#I.Ca1#I.Cav.8aO.G#dbs#BaLaB.8aC#I.WaYbf#sbl#Da9a9.n#L.E#L#L.jbp.j#gasasa2bp.j#L#ga2bpa2#g#L#g#L#g#L#L#La9#Da9bl#s#p#Da9.7a9.E.7a9.7.7.n#Laf#L#L#gaj#L#g#ga2#g#gbp.j#ga2#g#ga2#g.jbp#gbpas#ga2#ga2#g.ja2.E#Laj#L#Laja2#Laja2aj#Laj#L.E#L.Eafajaf#L#Laf#L", +"#L#L#L#L#La2bpa2#Laj#L#La2bpa2bp.L.L.jasaa#ga2#gaja2a2a2a2#La2#La2a2#L.j#La2afa2.3aj#p#Mbl#D#D.7ajaf#Laj#L#Lbp#Laj#Laf.n.7a9a9.7#pa9#p.NaYaYbl#Dbl#D#Da9#Da9.7a9a9a9a9afa9.7a9.7#Dbl#Dbl#D#D#D#D#xaYaYawaYaYaY#Ubn#I#I#I.Wao#v#vaC#I#x.W#Ibo.C.WavaoaZ.o.Yab#3.QaOaoaC.W#I#x.s.Nbl#sa9a9aj#La9#L#L#g#L#ga2#g#L.j#g#g#g#ga2bp#ga2.ja2#L#Laf#La9.7bl#DblblaYaYaYaYaj#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La2#ga2a2a2#g#La2#La2#g#La2a2#L#L.ja2.ja2.j#L#Laj#L#L#Laj#Laj#Laj.3#Lafajaf#Lajafa9.na9a9.na9.na9", +"#L#Laj#L#Laj#La2bp#L#gaj#L#L#Lajaa.jaaaaa2#ga2bp.3#L#L#La2#L.j#La2a2a2#La2#La2#L.3af#pblbl#Da9a9afaja2#La2#La2#L#Laf#L.7a9a9bja9a9#p#DblaYaw.Nbl#Dbl#Dbl#D#D.7a9a9afa9a9a9a9aj.7bl#D#D#sbl#Dbl#MaYawaY#xaY#xawaY#x#U#x#I.Cao.8aBaxav.W.C.Waoao.8aO#vaPay#daVbk.0#OaoaC.W#x#I.N.N#Dbl.na9a9#L.7aj#g.j#ga2bpa2#g#gasas#g.j#g#ga2#g#La2.ja2#Laja9a9a9a9bl#DaYawaYaY#La9.Eaf#L#Laj#L#L#Laj#L#L#L#L#Lbpa2#L#g#La2#g#L#gaja2#ga2#ga2#La2a2a2#La2a2.3#L.jaf.jaf.j#L.3#Laj.3aja2#Laj.3#Laja9af.n#L#Laf#L", +"a9ajafaf#L#L#L#L#L#L#L#L#L#L#L#Laa#ga2#g.j#gbp#La2#L.ja2#La2#La2a2#La2a2a2#L.j#L.jaf.n#pbl#sa9.Eaf#Lafaj#Laj#L#Lajaf#La9a9bja9a9#Ma9bl#DaYaYbl#DaYbl#Dbl#Da9a9a9a9#p.naf.7a9.7a9.n#Da9#D#D#s#D#DaYblaY#MaY#MaYaY#MaYaw#I#IaC.8aObgaoaoao.8ambc#v#uar.M#d#4.G.y.8bgaoaC#x#I.N.N#s#pa9a9.7ajaf#L#La2bpa2.j#g#gaj#g#g#gas#ga2#g#L#La2a2#Laf#Laf#La9a9a9a9#D#Dbl.Nbl.E#L.7#L.7af.7#La9#L.7#L#L#L#L#La2#ga2#ga2#g#La2#L#ga2#L#g#L#Laj#L#Laj#Laj#Laj#Laf#L#La2afaj#Lajaf#Lajaf#Laj#Laja9afajaf#Lajafaj", +"afaf#Lafajafajafajaf.Eaf#Laj#L#L#La2#L#L#gbpa2bp#La2#L.3#L.jafa2#La2a2#La2a2#L.3afaf#p#Mbla9a9.7afajaf#L#L#L#g#L#La9aja9a9#Da9.7#pbl#DaYaYaYbl#DaYblaY#Dbl#D#D#Dafa9afa9a9a9.7.7.7#Da9bja9#D#D#s#D#D#saYbl.NblaY#M#D.saw#I.WaOaB#vaO#v.8aOaO#v.y#3ad.Z#.#T#vav.haoaC#x#IaY.s#D#D.n#Dajaf.7#Laj#L#ga2#g#gbpa2#ga2a2as#ga2#ga2bp#La2a2a2a2a2#L#L#La9afa9#M#DblawaY#L.7af.E#Laj#L#L#Lajaf#L#L#L#L#Lbpa2#L#g#La2#gaja2#L#ga2#g#La2a2aj#L#L#L#L#Laf#L#Laj#Laj#L#Laf#Laj#L.7aj#L.Eaf.7.na9#D.n#Da9#Da9", +"a9.na9a9a9a9#pa9a9a9a9a9a9a9a9.nafaj#L#L#L#Lbp#La2aja2#La2#La2a2#La2a2a2a2a2#La2aj#p#pbla9a9#Lajaf#Lafajafaj#L#Lajaf#La9.7.nbj#Da9blaYaY#x.N#DblaYblaY#DaY#Dbl#Da9a9a9a9.7a9.7.7a9.7.E.7.7.7.7a9#D#D#D#D#s#D#s#D.sbl#s.s#xaoaO#S.yaBaB#u#u#ubk#E#.ab#4#3.G.y.8bo#U#I#x.s.N#D#s#Da9#L.7aj#L#La2bp.jbpa2#La2#g#L#g.jas#g#ga2#Laja2#L.j#La2af#L#L#La9.7a9bj#Daw.Nbl.E#L.7#La9#L.7#L.7#L.7#L#L#L#L#La2#ga2a2#ga2#L#g#La2bpa2#La2bp#L#Laf#L#Lafaj.7ajaf#Laf#L#Laj#Laja9.na9.7afa9.Ea9a9a9a9a9a9.na9a9", +"a9a9a9a9a9a9a9.n#paf#paf#p.n#p#pbl#D.na9a9#L#L#L#La2#La2#La2#La2a2a2a2#La2#La2afa9#p#M#pa9.nafa2afajaf#L#Lbp#L#L#Laf#La9a9#Da9a9#D#DaY#x#xaYaY#DblaYblaY#Dbl#Dblafa9afa9#Da9.7a9#L.7a9#Laf.7.n.7a9a9#s#D#D#D#D#D#s#D.s#x#I.8#Saz#u#u#uaZ.w.GbiaV#4.U#3ara5#vao.W#x#IaYaw#D#sa9a9#L.n#Laf#L#gaj#L#ga2#g.ja2#g.j#gas#gas#gaja2bp#La2a2a2a2#L#Laf#L#L#La9a9#Dbl.NaY.7#L.n#L.E#L#Lafaj#L#L#L#L#L#L#Lbpa2#L#g#L#ga2#ga2#ga2a2#gaja2#L#L#L#Laj.7#La9#L#L#Lajafaj#Laf#L.n.7a9.Ea9.Ea9.n#D#s#D#s#D#D#s#D", +"a9.n#pa9.n#pa9#pa9.n#p.n#p#p#p.nblblbla9.na9#Laf#Lafa2aj.3#L.j#La2#La2#La2aja2#La9.nblbl#pa9#L.j#Laf#Laja2#La2aj#L#Laja9a9.7#D#s#p#DaY#x#x#xaY#DblblaYaYbl.Nbl#D#Dbl#D#Da9#Dbj#D.7#L.7#L.7af.7#L.7.na9a9.na9a9.n.NaYbobfaoaFaBazaz.w#uaP#3#4ad#4ap.O.O.O.w#S.8.5#Uaw#x.saY#s#D.n.7#L#Laja2aj#gas#L#gbp#gbpa2bpa2#gas.j#g#g#L#La2#La2#La2#L#L#L#L.7#L.7.7.E#D#s#D.na9#L.7af#L.7#L.7#La9#L#L#L#L#La2#ga2a2#ga2#L#g#La2bpa2#ga2#ga2.7a9.7#La9.7.7a9ajaf#L#Laf.7.na9#D.Ea9.7a9.7a9b.#D#D#D#D#D#D#D#D", +".n#pa9#paf#p.n#p.n#p#p#p#p#p.n#p.b.R#Mbl#p.nafajafaja2#La2#L.3#La2a2aja2#L.3#L.ja9#pbl#Mbl.nafa2afajaf#La2#Lbp#L#Laf#La9.n#D#s#DblaYaY#xbn#xaY#DblaYblaYblaY#Dbla9bla9#D#D#D#Dbja9#La9#La9.7.7a9.7a9.7.7.7.E.7#D.N.sbf.Wam.y#uaz.Oar.Gal.Mbxadalbkbkbkbkbka7.yaF#I#IaY#s#Da9#s#Daj#Laj#L#g#L#g#g#gaja2a2a2#ga2#gas#gas#ga2#g#gaja2a2a2af#Laf#La9#Lajaf.7a9#D#s#Da9.Ea9.E#L.E#Laj#L#L#L#L#L#L#L#L#L#g#L#g#La2#ga2#ga2#ga2#L#g#La2#L#L#L.7#Laf#La9#L.E.7.7.Ea9.n.7.n.7a9.7.n.7.na9#D#D#s#D#s#D#s#D", +"#Lafaj#L.7#L#L#Lafafajafaja9#pa9aYawaYaYawblblblafafaf#Laf#L#L#L.jaaafa2#L#Lafaf.n#F#M#pa9afaj.7#Lbp#Lbpbpaj#L.Eaf#Laj#D#D.N#D.N.naYaYbna0a0bnaY#DblaY#x#xaYaYblbl#D#Da9a9.7#L#L.7.7.7.7.7.7.E.7#Dbj#D.s.N.N#DboaY#MaY.W.8aZal#P#PaT#P#.a.ad.ObkaX.G.O#Taz#SaoaC#x#x#I.N.s#D.E.7af.7#L.E#L.Eaf#Laj#g#gbp.jbpa2aj#ga2#g#L#ga2#ga2#L#L#L#L#L#L#L#L.7#L.7a9.E#Da9#D.Ea9.7a9.7a9#La9#L.7aj#L#L#L#L#L#L#L#L#L#Lbpa2#L#L#g#L#ga2a2#ga2bpa2#La2#L#Laj#L#Laf#Laj#L.7#L.7af.7.E#L.7#L.7#L#sa9.7a9.7#L.7#L", +".E.7.7#La9aj.7#Lafajafafafa9a9.nblbl#MaYblbl#Dblafajafaj#L.E#L#Laaa2a2aja2afajaf#p#p#pa9.naf.7#L#gaj#Lajbp.7#L.7ajafa9#D#D.NaY#xblaY#x#xama0a0aY#p#Dbl#xbnaYblaY#Dbl#Da9a9.7af.7.7.7.7.7.7.7.7.7#D#s#D.N.N.N.N.N#IaY.N#Iamanay.P.PaDaD#..M.O.G#u#u.w.GaP#u.ybgaCaC#x#IaY.N#s.7a9.7aja9#La9#L.E#L#L#ga2a2#ga2#ga2#g#L#ga2#ga2#g#g.7#L.7#L.7#L.7.7af#L#L#La9#Db.#Da9.7a9.Eaf.7a9.7#L#L#L#L#L#L#L#L#L#L#L#L#La2#L#L#ga2a2#g#L#g#La2#ga2#g#L#ga2#La2#L.7#L.7a9aja9#L.E#La9aja9#L.n#L.na9aj#Laja9aj.7", +"#L#Lafaj#L#Laf#Lajafaf.Eaf#sa9a9a9a9#pbl.nbl.n#p.nafa9#Laf.7#L#L#L.ja2#La2af#L.n#p#Mbla9a9aja9#Laj#Lbp#L#L#L.7.7#D#D#saYaw.N#xbf#MaYaw#xbna0a0aYblaYaY#xbn#xaYaYbl#D#D#Da9#D.7#L.7.7.7.7.7.7.7bj#s.7#D#s#D.N.sbfa0#UaoaO.yan.2.g#m.AbA#4ar#u.0#u#S#vaBaB#uaB#v.5aoamaC#x#IaY.N.na9.7.E#L.7af#L#La2#g#L#g#L#gbp#ga2#ga2#g#g#ga2#g#L#L#L#L#L#L#L#L#L.E#L.7.7a9#Da9.Ea9.7a9.7.7#L#L#L.7#L#L#L#L#L#L#L#L#L#L#Lbpa2#La2bpa2a2#ga2#ga2#L#ga2a2a2#g#La2#Laj#L#L#L#L#L#La9#L.7#L.7aj.7#La9.7#La9.7#La9#L", +"#L#L.7#L.7#L.7#Lafaf#Laf#La9a9.na9#Da9.n#Da9#D#Dafaf#Lafaja9aj#La2a2af#Laf#Laja9#p#D#p.na9.7aj#L#L#L#L#Laj.7.7b.#D#saY.NaYbf#x#x#DaYaYaY#xbna0#xaYaYaY#xaYaYaYaY#Dblbl#D#Da9.7.7a9.7.7.7.7.7a9.7af.7#D.N.s.N#x#IaF.8amaF.0#uaybe#.ba#aaz#ua##vaOaOaO#v#v.y#uaBa#b#bga0a0awaYbl#D.Ea9a9a9.E.7a9.7#Laj#L#gaja2a2a2#ga2#g#ga2#ga2#g#L#L#L#L#L#L#L#L#L#L#L#La9.Ea9.7.7.n.7.n#La9.n.7af#L#L#L#L#L#L#L#L#L#L#L#La2bp#La2#ga2#g#La2bpa2#ga2#L#g#L#ga2#g#L#L#Laf.7#L.7#L#L#Laj#L#L#Laf#L.7#L.E#L.n#L.E#L", +"#L#Laj#L#L#Laj#L#L#Laj#L.7.7a9.7a9a9a9#Da9a9.na9.naf.Eaf#L.7#La9ajaf#Lajaf#La9a9#M#pbla9a9#L#L.7aj#Laj#Lbjbj#sbjaY.N.Naw.N.Nawbf#DblaYaYaY#xbn.CbnaYaYaYaY#xaYa0bl#D#D#Da9#D.7#L.7#La9#La9#L.7.7a9#sblaYaYbnaCa0.5amaFaB#u#a#4abarazaBa#aO.5ao.5aoaoamaOaB#u#uaZaCa0bn#xaYaY#Dbla9a9.na9a9a9#La9#La2a2#L#g#g#L#g#g#ga2#ga2#g#ga2#ga2a2#ga2a2#La2#L#L#Laf.7.7.7a9a9.7a9.7.7.7#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#g#La2bpa2#ga2a2bpa2#ga2a2#g#La2#L#L.7#Laj#L#Laj.7af.7#La9#L.7ajaf.7#L#L#L.7af#L", +"#L.7af.7#La9#L.7a2#L#L.7#L.n.7.na9a9.na9a9a9a9a9afaf#Laf#Laf.E#Lafajafaf#La9.na9#D#p#sa9.n.7aj#L.7#L.7a9.Ea9#Da9.NawaY.N.NaY.N.N#D#D#D#MaY#x#xa0ama0#xbnaYaYbn.CaYaYaY#D#D#D#D#Da9a9a9a9.7#Da9#s#D.NaY#x.Ca0amamaFaB.f.Oau#aazan#v#vaFam.5aCav.CavaoaoamaOaB#uan.Ca0#xawaY.s#D#s#Dbja9bja9.7a9a9a2#La2#La2a2a2a2#ga2#ga2#g#ga2#ga2#ga2a2#ga2#ga2#L#L#L.7a9.7a9.7.Ea9.Ea9.7af.7af#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La2a2#ga2#ga2#L#ga2#g#La2bpa2a2bp#L#L#L#L.7#L.7af#L#L#L#Laj#L#L#L#Laj#L#La9aj.7#L", +"#L#L#L#Laj#L#L#Lajaf#Laja9.7.7a9.7a9a9a9a9.na9a9aja9#Laja9#L.7#Laf#Lafaja9a9#D#D.nblbla9b.#L.7.E.7.n.7.n#D#D#s#D#D#D#D#s#D#D.n#D#D#D#s#Dblawa0.Cama0a0aYaY#xa0amblaY#D.N#D#Dbj#Dbj#D#D#D#D#D#D#D.N#x#x#xbg#vbmaBbk#a#Ea7a7aZ#va#amb#ao.C.W.Cbf#IaqaoaoaoaO#SaZ#ubn#I#xaY.Na9a9.7a9a9a9a9a9a9a9a9#Lajaf#L#L#L#La2a2#g#g#ga2#ga2#ga2a2#ga2a2#ga2a2#L#L#L#L.7.Ea9.7a9.7a9#La9#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#g#L#g#La2bpa2#g#La2#ga2#ga2#ga2#L#L#Lajaf#L#L#L.E#L.7#L.7#L.7#L.7af.7aj.7af.7#L", +".E.7.n#L.7#L.7af#L#L#L.7aj.7a9.Ea9a9a9.7a9a9.7a9afafafafaja9aj.7afaja9#La9a9#s#D#p#M#D#s#D.n.E.7a9.na9#D#sa9#D#D#D#s#D#D#Da9a9.n.N#D#D#Dbl#xa0ama0ambnaYaYbnama0aYaYaY.N#D#D#Dbj#D#D#D#D#s#D#Daw.C#I.Caobm.G#faG.yaBbh.l.taFb#.5a0a0aoa0#xbo#xboaqavaoamaC#Sa7an#I#x.N.s#Dbjaj#L.n#Da9#sa9a9a9a9#Laf#L#Laf#Laf#L#ga2#ga2#ga2#g#g#ga2#ga2#ga2a2#g#L#L#La9.7a9.7.7.7.n.7.7.7#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La2#ga2a2#ga2#ga2a2#g#L#g#La2bpa2#L#L#L#L.7#L.7#L#Lafaj#L#Lafaj#L#L#L#La9#L.7aj#L", +"#L#L#L#Lajafaj#Laf#Lafaf#Lafajaf#L.jafajaf#Laja9aj#Laj#L#L#L#Laj.7.7.E#Laj#L.7.7bl.NawaY.NaY.N.s#s#D#sa9bj.Ea9.Ea9.na9.n#D#s#D#Da9.n#D#D.saY.s#x.R.Rbn#x#x#xaY.NbnaYblbl.na9.7.7#D.N.N.N.Nbfbfbfavama#aSaG#z.G.0aoa0aC#xaCbn.Wbn#I#xaY#I#x#x#I#x#Ia0avao#v.0aBa7#IaYa9.7.E.7#D#Da9a9a9a9.7a9.7afa2a2a2a2a2#g#ga2#ga2#g#ga2#g#ga2#ga2#g#ga2#g#ga2a2#g#L#L#L.7a9.7.na9a9afaj#La2a2#L#Laf#L#L#La2#L#L#La2#La2#La2#La2#L#L#L#L#L#L#La2a2a2a2#g#ga2#g#La2#La2#Lajafa2.7#L.7af.7#L.7afaj#L#Lajafafaf#L", +"#Lafajaf#L#Laf#Lajafaj#L#Laf#Laf#Laf#Lafajaf#Da9.7a9.7.7af.Eaf.7.na9a9a9.7.7.n.7awaYawaYaw.s.N#D#Da9#D.na9.7a9.7.n.7.7.7#D#D.7.7#Da9#s#D.N#x.N#x#Ua0a0bna0bn#IaYb#am#xaY.N.N.N.Nbj#D.N#I#xaqaoa0a0a#a7#fa6az.0.5bnaCbnbn#x#x#x#xaYboaYbfaw.NaY#I#x#Iao.8.5#v#u.T#I.N#sbja9bj.7bj#sa9.Ea9a9.7a9a9#L.ja2a2.j#ga2#g.j#ga2#g#ga2#ga2#g#ga2#g#ga2#g#g#ga2#L#L#La9aja9a9af.7af#L#L#L#gafa2#La2afa2#La2.3#La2#La2#La2#La2#La2a2a2a2a2#La2a2#L#g#La2bpa2bpa2#ga2#L#La2#L#L#L#L#Laj#L#L#La2a2afafaj#Lajaf", +"#L#L#L#L#L#Laj.7af#Laf#Lajaf.Eafajaf#Lafa9a9.n#D#D.n#Da9#s#D#D#D#D#s#D#s#D#D#D#sbl#s#D.s#D#s#D#s.7aj.7#L.7aj.7#L.7af.Ea9#L.7a9.7.na9#D#D#D.NaY#xa0.Vaoamama0ambna#b#amambn#x.C.Cawbf#xa0amamaF#v#vaBazaSa7a#aq.W#x#x.s#xaw#xaw#x.N.NaY#xaY#x#I.N#I#xavam.8.yana7#U#x#D.7b..7a9#Da9a9a9a9.7a9af.7a2#La2#L#ga2#g#g#ga2#ga2#g#ga2#ga2#g#ga2#g#ga2#ga2#L#L#L#L.7a9.7a9a9a9#La2#La2a2#L#Lafa2#La2#La2#L#L#La2#La2#La2#La2#L#L#L#La2#La2a2a2a2#g#ga2#g#La2bpa2a2#Laj#L#L#L#L.7#L.7#L.7af#L#Laf#Laf#L#L", +".7#L#Laj#L#La9#La9a9a9a9a9a9a9a9af#L#D.n#D.7#D.7#D#D.N.s.N.N.N.sbl.NblaYblaYawaY#M#D#Ma9#D.nbj.7#L#L#Laj#L#Laj#Laj#L#L#L.7a9.E.7a9a9a9#DaY.s.N#xaCb#a#aFa#amamam#vaFamam#xa0#xam.CaCamamaObma7aza7aZbm.tam.C.Cbfaw#xaYaY.NaY.NaY#DaY.s#xawbfaY#x#x#Iaqao.8aZ#ua7ao#xaw#Da9b..7#Da9#s.7a9af.7a9a9a2#La2#La2#ga2#ga2#g#g#ga2#g#ga2#g#ga2#ga2#ga2#ga2#g#L#L.E#L.7afa9afa9#Laf#L#ga2#La2#La2#La2#La2af#La2#La2#La2#La2#La2a2a2#La2#La2a2#La2#La2bp#g#L#ga2a2#g#La2#L#L#L#L#L#L#Lafaj#Lafaj#Laf#Laf#L", +"a9a9a9a9a9a9a9.n.7a9.n.7a9a9.n#D.na9#s#D#D#D#D#D#D#D.sblaY#saY#DaY#MaY#saYblaY#D#D#s#D.7.n.7bj.E#L#Laj#La2#La2#L#L#L#L#L.n.7a9.7a9.E#D#D.NaY.N#Iamam#v.0a#aFa#a#bmbgamaCbna0aoa0amaF#vaBa7a7.l.TaFb#b#amam#x.Nbj#x.N.s.NaY.NaY.N.N.NaY#x.N#IaY#I#x#Iaoaq.8.ybhazb#bn.N.N.7a9#D#s.7a9a9a9.7a9#La9#Lajaf#L#L#Lbp#L#ga2#ga2#ga2#g#ga2#g#ga2#g#ga2#ga2#L#L#L#L.7a9.Ea9a9a9a2#L#La2#g#La2#La2#La2#La2#La2#La2#La2#La2#La2#L#La2#La2#La2a2a2#ga2#g#ga2#ga2bpa2a2#L#L#L#L#L#L#L#L.E#L.7a9a9a9a9a9a9.7a9", +".7a9a9a9.n.7a9a9#s#Da9#Da9#D#D#D.7#D#D#DaY.Naw.Naw.NaY.NaY.NaY#s#D#D#D#D#s#D#s#D.na9a9.n.7.7.7#L#g.ja2#g.j#g.j#g.j.3aj#L.7aja9.Ea9a9a9#D.N.s#x#x.Cb#aF.yaZa#a##Sa##SaFamamaOa#aZazazaza7a7bmaFaFa0a0a0bn#IaYaY.Naw.NaYaY.N.N.Naw.NaY.Naw#x.N#x.N#x#I.Cao.5.ya7az.5aoaY.s#D.E#D#Da9.na9.7.na9a9a9#Laf#L#L#L#L#Lbpa2#g#ga2#g#ga2#ga2#ga2#g#ga2#g#ga2#g#L#L#Laf.7#La9afa9#L#L#La2a2#La2#La2#La2#La2#La2#L#L#L#La2#La2#La2#La2#La2#La2a2#L#g#L#g#L#g#La2a2bpa2#g.j#L#L#L#L.7af#L#L#La9.7a9a9.Ea9a9a9", +"a9a9a9a9a9a9.na9#D#D#s#D#s#D#s#D#D#D.saY.s#xaY#x#D#M#D.nbl.nbl#Da9.Ea9.7a9.7a9.7#Laj#Laj#Laj#Laj#gas#gas#g#gas#ga2#L#La2af.7#L.7a9#s#D#D.NaYaYboa0a0aOa#a#a#aBbh.GaPa7az#uaS#TalbaaGa7aZaFaoambnaCa0#x#I#D#DaYaw.N.N.s.N.N#D.N.N.N.N#I.NaY.saY#I.N#I.C.8.5.ya7azaOb##x.N#Da9a9#sa9a9#D.na9.7a9.7a9a9.7#L#L.7bp#L#ga2#g#ga2#g#ga2#g#ga2#ga2#ga2#ga2#L#L#L#L.7a9.7.na9.7a2af#L#ga2#La2#La2#La2#La2#La2#L.3#La2#La2a2#La2#La2#La2#La2a2a2a2a2#g#ga2#ga2bp.ja2bpa2#L#Laj#L#Laj.7#L.7.na9a9.7a9a9.7a9", +"afa9afa9.na9a9a9#s#D#D#D#D#D#D#D.saY.NaY.Naw.NaY.n#Da9a9a9a9a9#Daj.7#L#Laj#Laj#Laj#L#L#Laj.7bp.7as.jas.jas.jas.ja2.ja2#L#Laja9aja9a9#D#D.Naw.N#x#xa0am#va#a#bmaB#l#0.2.2.2#0ab.4arazaZa#aFa0.W.C#x#x.NaYaYaYblbl.N.N.N.Nbj#Dbj.NaY.NaY.N.NaY.NaY.NaY.Waqao.0#ua7aBaO.Waw#D.na9#Da9.na9a9a9a9a9af.7afa9.7#L.7.7bpa2#g#ga2#ga2#g#ga2#ga2#g#ga2#g#ga2#g#L#L#L.7.Eafa9afa9#L#L#La2#g#La2#La2#La2#La2#La2#L#L#L#La2#La2a2#La2#La2#La2a2#La2#L#g#L#g#L#g#La2#Lbpa2#La2#La9#L.7#Laf#L#La9.7.na9a9a9.na9", +"#D#Ma9#Da9bl#M#DaYaYawaYblawaYaYaYawaYaYbl#D#D#s.7af.E#L.7aj.7#L#Lajbp#Lbp#L#L#L#ga2.j#g#g.j#g.j#g#g#g#g#g#g#g#g#ga2a2aj.7a9.7.7a9.na9#M#DaY.Nawbn#UaoaF#v.8am#va6a6ba#V.Z#oab.I.TbmaFaoam.C.C#I#x.s.N.N#D#D#D#DaY#DaYbl.NaY.N.s#D#M#D#D#s#D#D#s#Daw#x.CaC.5bc.yaBaZ#vam.Nbj#Db.#D#D.7a9.7#D#D.Na9a9.7a9#L#L#L#La2a2a2#ga2#ga2a2#L#L#L#L#L#L#L#L#Laf#L.na9a9#D#Da9a9a9a9#L#L#L#La2#La2#L#L#L#L#La2#La2a2a2a2#L#La2#La2#La2#La2#La2a2a2a2a2a2a2a2#L#L#L#L#L#L#L#L#L#L#L#L#L.7a9.7af#La9.7a9bja9#D", +"bl#D#D#M#D#Dbl#D#MaYbl.saY.NblawaYaYaY#M#D#s#D#D.7#L.7#L#L#L#Laj#g#L#gaja2aj#gajas.jas#gas#g.j#gas.jas.jas.jas.ja2.j#L#Laf.E#D#Daja9a9#DaY.s#x#IaCamama##uazaz.G#.a..Z#Valarak#aaZ#Sa#ama0#U.C.CaYaY.NawaY#D#D#DaYaY.sbl.N.s.N.Na9a9a9a9#D#D#D#D#s.N.N#I.CaobybcbhaB#vaF.WaY.s.Nbl.s#D.na9#D#DaYafa9a9a9#L#L#L#L#ga2#ga2#gaaa2as#L#L#L#L#L#L#L#L#L#L#La9a9#D.7#D.na9#D#L#L#L#L#L#L#L#L#La2a2a2a2#L#La2#L#L#La2#La2#La2#La2#La2#La2a2#La2#La2#La2#L#L#L#L#L#L#L#L#Laj#L#Laja9.7.Eafaja9a9#sa9#D#D", +"#D#M#Dbl#D#M#DblaY.NaYbl.NawaYaYaY#M#D#D#D#D.7afaja9#Lajbp#Lbpbp#Lajbp#Lbpbpa2bp#g#g#g.j#g#gas#g.j#g#g#g#g#g#g#ga2a2aj.7a9#Da9#Da9a9#s#D.s#x#I.Ca0aO#uazal.Y.A.1a.aHaGaz.Ta#bma##SaFaFbgama0.C#x.s.NaY.N.N#s#D#Dblbl#Dbl#D#D#D#D#Da9#D#D.7.E.7a9#D.saY#x.Wa0.8.5#S#uaB#S.5.C#x#x.NaYbl#Da9#D#D.Na9a9.7a9#L#L#L#La2asa2aaa2#ga2a2#L#L#L#L#L#L#L#La2af#L#La9.7a9#Da9a9.7#La9#L#L#L#L.3#La2#L#L#La2#Lafa2#La2a2#La2#La2#La2#La2#La2a2a2a2a2a2a2a2a2#L#L#L#L#L#L#L#L#La2.7#L#L.7af.7a9a9a9bja9#D#D#D", +"aYaYaYawaYaYaY.saY#M.NawblaY#Daw#Dbl#D#s#D#La9.7#L#L#L#L#L#L#Lbpa2bpa2aj#ga2bpa2as.j#gas.j#g.j#g#gbp.j#L#gaja2bp.j#Laf#L.7#s.N#sbjb..N#Ibf.Waq.8#vaz#zaHbs.m.B.BauaSa#aFaFbgama0ambga#aFamam.W.CaYaY.NawaY#D#D#D#sbl#D#D#D#D.Nb.a9a9.n.7#La9.7b.#Da9.s.Nbo.C.Cava#aZaBaBaOaOb#ao#x#IaY#D.n#Da9#Da9a9a9#L#L#L#L#La2a2#ga2#ga2#ga2bpa2#ga2a2#ga2a2#La2af#L.7a9a9.7a9a9#D#L#L#L#L#Laf#L#L#La2a2a2#La2#La2#La2#La2#La2#La2#La2#La2#La2#La2#La2#La2#L#L#L#L#L#L#L#L#L#L#Laf#L#La9.7.7a9.7a9#D#D#s#D#D", +"aYboaY#x#x#I#x#x#I#xaYawaY.NaYaY#D#M#Da9.7.7aj#L#L.E#L#Lbp#L#L#Lajbp#Lbp#Lajbpaj#gas#g#gas#gas.j#L#Lbp#Laj#gbp#L#Laj.7a9.7#Dbj.N.N.sbo.Caq.8#v#u#3adbe.A#Y#9.PbranaBb#amamaYaYaYa0am#vbmaOb#.C#x.s.N.NaY.N#Da9#D#pa9.na9#Da9.7a9.7a9.7a9.7.7.7.7a9#D#D.N.N#xbo.Cb#aOaF#vbma##vbmamam#xbl#D#D#D#Da9a9.7#Laf#L#L#L#g#La2bpa2#L#ga2a2bp#Lbp#L#Lbpa2#L#L#La9a9.7a9.7a9af.7af.7#L#L#La2#La2a2#L#La2a2#La2#La2#La2#L#La2#La2#La2#La2#La2a2a2a2a2a2a2a2#L#L#L#L#L#L#Laj#Laj#L.7aja9#L.na9#D#s#D#D#D.N.N", +"#x#x#x#I#x#x#IbnaYaY#IaYaY#MaY#M#D#D#Da9.7#L#L#L#L#L#L#L#Lbp.E#Lbpa2bp.j#L#g#L#g.j#gas.j#g.j#g#g#Lbpajbp#Lbp#Laj#L#Laj.7.n.N.N.sbf.C.Caoa#.w.ObB.u#.#oa8aMabalanaBa#a#a0#xaYaYaY.Wamb##Sa#b#a0.C#xaY.NaY.s#D#D#D.nbla9a9#D.n.7a9#L#L#L#Laj#L#L.7.E.7b.a9.s.N.N.s.Camam.8aF#vaZ#uaFb##xaYaY#D#D#sa9a9a9.7#L#L#L#La2a2#ga2#ga2a2#g#L#L#L#L#L#L#L#L#La2af.7a9a9.7a9a9a9#D#L#L#L#L#La2#La2#La2#La2a2a2a2a2#La2#L.3#L#La2#La2#La2#La2a2#La2#La2#La2#L#L#L#L#L#L#L.7#L#Laf#L#L#L.7a9.7bja9#D#s#D.N.saY", +".CaC.Ca0.Ca0#x.CawaYaY.Nbl.N#D#D#Da9.E.7aj#Lbp#L#L.7#Laj#L#Lbp#Lajbpaj#Lbpaj#Lbp#gas.j#gas#gas.jbpaj.7#Lajbp#Lbp#La9a9#D.N.s.N#x.WaqaO#ubk#zaHbA#Pbsbeab#a#ua#ambm.Fa0bn#xaY.N.s.Nbnb#bmaBa#aC.Caw.NaY.NaY#D#D#D#pa9a9a9a9.7a9#Laj.7#L#L#L#L#L#Lbja9bjbj#D.7.N.Nbo.C.Ca0a##vana7an#Sa0aYawbl#D#Da9a9.7af#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#Laf#La9.n.7#Da9.7afa9#L.7a2#L#g#La2#La2#La2#L#L#La2a2#La2#La2#La2#La2#La2#La2#La2a2a2a2a2a2a2#L#L#L#L#L#Laj#Lafaj#L#L.Eaf.7#La9#s#D#DaY.NawaY#x", +".C#xa0#x.W#x#x#x#DaY#Dbl.sblaY.Na9#D#L.7#L#L#Laj#Laj#L#Lbp#L.7#Lbpa2#L#g#L#g#L#g.j#gas#g#g.j#g.jbp.7#La3#La3aj.7.7aj.7#s.N.N#Ibf.8aF.y#3ad.A.MaT.P#V#P#Tan.5.C#Ia0b#bga0#xbf#xbf.N#xa0bm.T#Sao#x#x.NaY#s.N#D#D#D#p.nafa9.na9#L.7#L#L#L#Lbpaja3#L.Ebj.E.7#sbj#sbjbf.s#xavama#aBana7aZbgbnaY#D#D.7.na9a9.7#L#L#L#L#L#L#L#Lbp#L#L#L#L#L#L#L#L#L#L#La2a2#L.7a9a9a9.7a9a9a9#L#L#L#g#La2#La2#La2#La2a2#La2#La2#La2#La2#La2#La2#La2#La2a2#La2#La2#La2a2#L#L#L#L#L.7#L.7afaj#L#L#L.7a9#LaY.Naw.Naw#x#x#I", +"aY.saY.NaY#DaY.N.na9.na9a9a9a9aja9a9a9a9.7a9.7a9#Laf#L#Laj#L#gaj#Lajbpaj#Lajbpaj#Lafaj#L#L.7.Ea3#L.Ebj#D.s.N#Db..7.7.N.N.WamamaOakaybs#Y.maDbaaHaga7#SamamaC.C.CaYamb#aFb##xaY#D.n.Nawa0#vaZaZa##xaw.N#Daf.na9#s#Da9a9a9.7af#Laf#La2#g#g#L#Lbp#L#L#L#L#L#L.7.7.7.7bj.N.Caoam#vaZaz.fanama0aY#Ma9aY#D#Da9a9.7.7#D#L#La2#La2#L#L#La2a2a2a2a2a2a2a2.7afa9a9#D.7#D.7af#L#L#L#La2#ga2a2a2a2a2#ga2#ga2a2a2a2a2a2a2a2a2#La2#La2#L#L#L#La2#La2#La2a2a2#La2#L#Lafa9a9a9bja9#D#D#DaY.s.N#x#Ibn#x#x#x#x#U#x", +"aY.Naw#D#D#s#D#Da9a9a9a9a9afa9a9a9a9.Ea9a9.na9a9afajaf#La2#L#L#Lbp.7bp.7bp.7bp.7a2a2#Laj.7.E.7.E#L.E#D.s.N.Nbjbj.N.s.N#xa0aO#u#E#V#2....#KaD.YaGa7bmaFaFaoama0.CbnaCb#aOama0.N#D#Dbl#xa0bmaB#ua##x#xaY#sa9.7a9.7#D#D.7a9a9aj#L#L.j#La2bpa2#Lbp.E#Laj#L.E#L.7b.#Db.#D.s#xa0.8a##v.6azbhaOam#xaYbl#Dbl#Da9#Da9.7.7#La2#La2a2a2a2#La2a2a2a2a2a2#La2#L#L#L#D.7a9#Da9#L.3afa2#La2bpa2bp#g#L#g#La2#L#g#La2#La2#La2#La2a2#La2#La2a2a2#La2a2a2aja2#L#La2#Lafaj#La9.E#Da9#s#D#Daw.NaY#IaYaYaYawaYawaYaYaY", +"a9a9a9a9.na9a9.na9.na9.na9.na9a9a9.7a9a9.7a9.7a9#L#L#L#L#Laj#L#Laj#Laj#Laj#Laj#L.jbp#L#L.E#L.Ea3.n#D.Nbf.Cbo.Caobf.CamaOaBaz#EaraQ#.#o.Abzay.Gana#aFaFaOamam.C.Wbna0a0b#ama0#I.N#D#M#x.CaoaZbhaBa0#IaY#Da9#s.7a9#sa9#Da9a9#Laf#L#L#ga2#g#L#Lbpbp#L#L#L#L#L.7.7.7.7#D.NaY.Cambga#a7.6#ua#b#aoa0#xbl#D#Da9.7a9#Laf#L#La2#La2a2a2a2#L#L#L#L#La2#La2.7afa9a9#D.7#D.7afaf#L#La2#L#L#ga2a2#ga2#ga2#ga2a2a2a2a2a2a2a2a2#La2#La2#L#La2#L#L#Laf#L#Lafajaf#L#Lafa9a9a9#Db.#D#DaY#DaY.N.N.N.s#D.N#D.N#D#s#D", +"aj.7aj.7.7.7.7.7#Da9#Da9a9a9a9.7a9#Da9#s#D#D.n#Da9a9.na9.7.7bj.7bp#L#L#L#L#L#L#Laj#Laj.E.Ebjb..N#MawaCaoaoama0.Cb##va7#a.Oaz#uaZaZanaz#e.6anaZaFaBaOaF.5amama0a0#xaCa0ama0a0#xaYbl.NaY#xa0#vaZ.lama0#x#Mbl#D.7#D#Dbja9.Ea9af#L#La2#L#La2bp.j#Lbp#Laj#Lbpaj.7bj.7#s#D.s#x.Wa0amamanaB.0a##va#bgamaYaY#Da9a9a9#L#L#L#Laf#L#L#L.7#La2a2#La2#L#La2#L#L#L.7a9.7a9#Da9#L.3#La2#L#L#La2bpa2#g#La2bpa2bpa2#La2#La2#La2#La2#La2#La2a2#La2.3#L#La2#Laf#L#Lafaja9a9.7#s#D#D#Da9.s.N.s.Naw#Dbj.7b..7b..7bjbj", +"#L#Laf#Lajafaj#Laf.7.7.7.7.7a9.Ea9bja9#D.7a9bja9a9.7a9.7a9.7.Ebjaj#Laj.7.E.E.7.E.7.E#D.s#xbo.C.WaCamb#a#.y.0.yaB.Gazazazbhbma#aFaFa#a#aZaBa#.5.5#SaFambgama0amam#x#xbna0a0aCa0#xaYawaY#Ia0aO.lbh#vb#bnaY#s#D#s#D#Da9#Da9.7ajaf#Laja2bp#g#L#Lbp#Lajbp#L#L#Lbj.7.7#Da9#DaY#x.CaCam.5a#aOa#a##va#a##xawaY#Da9.7#L#L.7af.7#La9#Laf#L.7af#Laf#L#Laf#Laf.7a9.7a9a9#D#Daf#L#La2#L#L#L#La2a2a2#ga2a2#ga2a2a2a2a2a2a2a2a2#La2#La2#L#L#L#L#Laf#Lafa9a9a9a9a9a9a9bj#D#D#D#D#D#D#Da9#Da9#D#s#L.7#L.7#L.E#L#L", +"#Laj#Laj#L#L#L#L.7.n#La9aja9#L.7a9#s.7#Da9#Da9bj.n#Da9.7.E#Dbj#D#D#D#Da9#Da9#Da9.N#I#x.Wam.8.5#va#aBaP.G#a.U#4.Uaza7aZa#aFaFbmb#a#b#aFa#.8ama0ama0a0a0a0a0aC.Ca0#I#x#xa0b#a0a0a0aYaY.N.N#Iambm.lbmaFaobnaYaY#Dbj#D#s.7a9a9af#L#L#La2aj#ga2bp#Lbp#L#L#Lbp#L.7.E.7#D#D#D.saY#x.C.CaC.5am#v.5a#.0#va0bn#x.N#D#D.7.7a9.7a9.7a9.7.7a9#L#L#L.7af.7#L.7#L#L.7a9a9bja9#Da2afa2#La2#L#L#L#L#g#L#g#L#g#La2#La2#La2#La2#La2a2#L#L#La2afa2af#L#L#L.7a9.Ea9.7.n.7#Da9#s#D#D.N.N.sbj#sbjb..7bj#Laj#Laj#L#L.7#L", +"bjbj.7bj.7.E.7.7.7.7a9.7a9.7a9.7#D#D#D#D#s#D#D#D#D#D#D#D#D.N.s.N.sbfbobf#Ibf#xboa0.8.5#v.yan.w.G#TabaMa8#cabalaZa#aFa#b#b#a0b#b#ama0aoa0a0#x#x.CawaYaY#Ubn#xaYaY#x#x#x.Rbna0a0amaYaY#D#DaY#UaF#GaZ#S.V#UaY.s#Dbj#s#Da9.n.7#La2af#L#La2#g#gajbp#L#Lbp#L#L#L.7bj.7a9#s#Dbl.N#x#x#x#x.C.Cam#va#a#.0aF.8a0#x#x#D#D#Da9#D.7#Da9a9.7.7#Laf#L#L#L#Laf#Laf.7a9a9.7a9#D#Daf#La2#La2#L#L#L#ga2#ga2a2#ga2bpa2a2a2a2a2a2a2a2#Lafa2#L#L#L#L#Laf#La9a9#La9a9a9a9#D.7#D#D#D#D#D.s.Nbja9.7.7a9.E#L.7.7.7.7aj.7aj", +".7a9b..7.7bjbj#D.Eaf.7#L.7af.E#L#D#D#D#D#D#D#s#D#D#s#Dbj#D.s.N.N.C#x.C.C.C.W.C.Wby#vaBaz#T#4aH#..ga8bsbr.2al#TaZaFaFb#b#ama0a0a0.Cama0#xaY#x#x#xaYbl.NaYaYaYblaYbf#x#x#xbna0a0aobn#xaw#D.sa0.t#SbmbmaOa0#U.N#D#D#D#D#Da9a9#Laf#L#L#La2#L#g#L#Lbpa2ajbp#Laj.7.7.7#Dbl#DaY.N.N#Ibf.Naw.Cao.5.5a#a##va#ama0bf#D.N.N.7#Da9#D.7a9.7a9#L.7#La9#La9#L.7#L#La9.7a9bja9#Da2af#La2#L#L#L#L#g#La2bpa2bpa2#La2a2#La2#La2#La2#L#L#Laf#L.3#Laf.7a9af.7a9a9.7a9.7#D.n#D#D#D#D#Dbjbj#Dbj#s.7.E#La9.n.7.na9.7a9.7", +"#Laj#Lafajafaj#La9#D#s#D#D#D#DaYaYaYawaYaY.NaY.N.C.C#x#IaYaY#M.namav.8.5#v.0.w.G#aau#4#4#z#3.Ga7#Z#0aM.gaTayaZa0a0a0a0#xbn#x#U#xawblawaY#D#M#D#D#D#Da9#D#sblaY#Mbl#Mblbl#DaYaYaYa0#IaY.N.NaY#Ua0.t.tbm.Fam#x.Nb.#Da9a9.7af#L#La2aj#L#L#L#L#Laj#L.7#L#L#L.7#L.7af.7.7a9.7.n#D#D.NawaYaY#x.CaCamao.0a#aB.0.taFb#.VaY#Da9a9af.7#D.N#Laf#L#L#L#L#Lafa9a9a9a9a9.7.7.7a2#La2a2a2a2a2a2a2a2a2a2a2a2a2a2#g#L#ga2a2#ga2a2a2a2a2a2#L#Laf.7#pa9a9a9#Dbj#D.N.na9a9a9b.#D#D#D#D#s#D#D#D#s#D#D.n.7#L#L#Laj#L.7", +"aja2afaj#L.7.7#L#sa9#D#D#s#D#D.N#D#D#D.N.N.N.N#DaY.N#x#xaCamb#aF#SaZanaz.Galba.4.O#aaz#uaB.0aBan#Tbz.mab.2az.5#xa0bnaYaYaYaYaYaY#DaY.NaYbl#D#D#D#D.n#D#Dbl#Dbl.Na9bl#Dbl#DawaYaYbnaYaY#D.s.N#xaCbm.Fbm.tb#aC.N.Nbl.na9a9aj#L#L#L.7#L.7#L.E#L.7#L#L#L#L#L#L#Laj#La9aj.7.7.7#D.N#D#Dbl.N#xbn.Ca0ama##va##v#vbm#vaF#x#x#Da9a9#D#D#D#L#La9#L.7af.7#L#pa9afa9.7#D#La9#La2a2#La2#La2#La2#La2#La2#La2#La2#ga2a2bpa2bpa2a2a2a2a2a2#La9afa9.na9a9#D#D#Dbja9.nbj#D#D.NaY.saY.Nbl.sblaYaY.Na9.7#Laj.7.7#L.7", +"#Laj#L#Laja9.E.7#La9.Ea9#D#D#s#Db.#D#D.Nbo.Caqaq.bbnbga#aZaS.G#q#t.HaQauaGar#a#a#vaOaF.5b#.8#vaB.2.A.1aDaka#amaYaYaYaYaYaYaY#D#D#D#D#s#D#D#D#D#D.7.7a9#D#D#D#Dbla9a9.n#D#D#D#Dblaw#xaw.N#DaYaYbnb#aF.taOb#.C#I.Na9a9.7a9a9#L.7#L#L#L#L#Laf#L#L#L.n#L#L#L#L#L#L#L#La9a9.7a9.Ebj#D#D#D.s.N#x#x.W.Ca0amamaFa##vbmaBb#bnaY#D#D#Da9bjaf#L#L#Laf#L#L#La9a9a9a9a9a9.7.7a2af#L#L#L#L#L#L#L#La2#La2#L#L#L#L#L#L#L#L#L#L#La2#L#Laf#La9.7a9a9afa9a9bj#s#D.Nbl.NblaY.NaY#xaYawaYawaYbl.sbl#M.7.E#L.7#L.Ea3.E", +".7.7.E.7.Ebj.7.7.n.7a9.7#s.N.N#DaY.N#x.Cam.5a#aZaF#SaZa7arala6ay#W#W#kbhbmaFa#.5#x#x.CaCaoamaOaB#P#obsba#uam.C.NaYaYaY#D#D#D#D#Da9#Da9#D.7#Da9a9#La9.7.7a9bl#s#Da9a9a9bla9bl#D#DaY.NaYawaYaY#IaYa0aCb#.Va0a0#U.N#D#Da9.7a9.7aj#L#L#L#Laj.7#L#L#L#L#L#L#L#L#L#L.7#L#L.E#La9.7.7.7#D#D#DaY.s#x.C.C#x#Ia0aCama#a#aZa#.8a0#xaY#Da9af.7#Da9#D.7#Da9#Dafa9afa9.7a9#La9#L#L.3#L.3#L.3#L.3#Laf#L#L#L.3#L#L#L#L#L#L#L#L#L#L#L#L#La9.7a9a9a9#D.na9bl#DaY#s#x#x#x#Ia0#I#x#xawaYblaw.NaYaYaY.7#D.7.Ebja3.7.7", +"#Db.#D#D#s.N.s.NaY.Naw.N.NaYbo#xa0b#a#bmaS#aa6.Kbaba#a.faZaFb#amb#b#ama0.C#xbf#xbobf.NaY#xao#v#u.q.qaGanamaYaY#DaY#sbl#Da9.7#L.7.7.E.7a9.E#L.7.E#L#L#La9.nbjbl#Da9a9.7a9.7#D#D#DblaY#xaYaY#IaYaY#xbna0bnbna0aCbn#sbl#Da9.7af.7a9#L#L.7#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#La9.7af.7a9aj.7#D#D.N.Nbo#x.Nbl#Ia0am.5aO.0aB.0b#.CaYbla9a9a9.7a9.7a9.7a9a9a9#pa9a9a9bj.7.7#L#L#L#L#L#L#L#L#L#L#Laf#L#L#L#L#L#L#L#L#L.7#La9#Lafa9bja9#D#D#D#Dbl#DaYaYaYaYaY.C#xama0.CaC.C.C#x#xboaYaY.NaY.N#s.N#D.N.s.NaEaW", +".N.N.s.N.Nbf#xbfaCa0a0a0a0amam.8aZbhazaGau#j.e.e.6ana#.5ambn#xaY#I#x#xbo.N.N#saW#x#Ibfaw#x.5aZ.G.q.KaBam#xaY.s#D.7#Da9.7.E#L#L#L#Laf#L#L#L#L#L#L#Laj#L#L.7#Da9#Da9.7a9#D#D#Da9#D#DawaY#IbnaYaY.Naw#xbnbnbna0bna0aY#D#D#Da9.7#L.7#L#L#L#La9#L#L#L#L#L#L#L#L#L#L#Laj#L#L#L.n.7.7.7#La9.E.7#D.N.N.N#saY.N#x.Wa0.5aF.0aZ#v.5a0aY#Da9.7#Da9bja9#D.7#Dafa9afa9.7a9#La9#La9#La9#La9#La9#La9#L.7a9af.7af.7#L.7.7#L.7af.7.7a9.7#D#D#D#D.N.saYaY#x#I#xbnbnaOaoaoamaCa0a0bn#Ibn#x#x#x#x#I#x#xaYboaY.N#xbf#x", +"#x#xa0.CaCa0aoa0aFa##v#vaZ#uaZaZarazazanbmaF.5a0.C#x#x.N#D#D#D#D#D#D.Nblbj#D.N.sbf#x#I.CbgaBaz.2baazaF#x.n.7#Dbla9.7.7#L#L#Lajbp#L#L.E#La9#L.7#L#Lbp#L#L.7#L#D.E#L#L.E.7.7.7.7#Dbj.N#xbna0#I.N#DaYawbna0bnbn.V#U#D#D#D#D#D.7a9.7#Laja9#Laj#L#L#L#L#L#L#L#L#L#L#L#La2#L#L#L#Laf.7#L#L#La9.7#s.N.N.7#D.N.N#x.CaCaq#vaZaBa#aF#xaYbl#D#D#D#D#D#D#D#Da9a9a9a9a9a9.7.7#L#La9.7a9a9#L#L#La9a9a9.7a9.7#L.7af.7af.7a9.7.7#D#D#D#D#D.N.NaY#x#x.Ca0b#ambgamaOb#aCa0.C#I#xaYa0a0#xbn#x#xbna0aCa0a0a0ao.CaCaq", +"aoa0aoaO.5.8aFaO#u#uaSazaG#3araza#a#amam.C#x.s.Nafaf#La9bjaWbfbf.N.NaY#xawaYaYaY#x.C#xaCamaB#aaT.GaF.C#D#La9#L#D.7#Laj#L#Lbpbp#Lajaf#L#La2#L.j#Lbp#L#Lbpa9.7#Da9.7#La9#La9.7a9.7#Dbl#xaCbn#xaY.s#D.N#Ubnbnbnbna0bl#D#D.7a9.7#L.7a9#L#L#L#L#L#L#L#L#L#L.7#L#L#L#L#L#Laj#L.7#L#L.7a2.7#L.7.7#D.N.Nbj#D.s.N.N#I.Ca0aFaZaBaZ#vam#xaY.7#Da9#D.7#Da9#Dafa9afa9.7a9.7a9#L#Lafa9#La9#L#La9af.7a9a9a9afa9a9#L.7.7a9#L.7af#D#D#D.N.N.NaY.s#xama0.8aF#Sa##va0a0a0#xbnaYaYawbn.WbnaCbnaCa0aCaFb#aO.5aOaF.8aF", +"aZ.ya#amaoaFaB.Taka6aGaraBaFa0#xbnaYaYaw#D#Da9#D#L.Eaf.7a9aj.7.7aja9.n.7#D#D.sbfaw.N.Wam#v.w.Ga7.C#IaY#D#s.7.n#Laja2#L#ga2#ga2#g#L#Lajafaj#L#L#Laj#L#L.na9a9.na9a9a9.na9a9#L.Ea9a9#saYaY#x.C#x#xaYbn#x#U#x#xa0aCbn#D.7#L.7a9a9#paj#L#L#L#L#L#L#L#L#L#L#L#g#L#L#L#L#L#L#L#L#L#L#Laj#Laf.Ea9.7.7a9#Da9#D#D#DaY.NawaY.pa#.0.0a#ambn.N.N#D#D#D#D#D.7a9af#L#L.7#L#L#L#L#L#La9a9.7a9#Da9a9#Da9bja9bj#D#D#D#D#D#D#D#D#D#s#D.saY#xbn.8aFaZaBaZa#aFama0aqaC#x.N#MaY#x.Ca0aFb#b#amamb#.5aFaoaOaFaOa#bmaZ.y", +"aZa#aOa##v#vaB.T#4#z#a#uaFa0aC#xaYawaYbl#Da9#Da9.7a9.7#L.7a9.7a9af.Ea9.7#s.N.N.N#D#Ia0.8a#bkaraZ#IaY.s#D#Da9.7#Lbpa2bpa2#g.j#ga2ajaf#L#L#Laja2#Laf.7#L.7a9.7#Da9afa9a9a9a9.7a9#La9#Dbl#x#x#I#x#xawaY#U#xbn#Ia0.CbgaYa9#L#L#Lafa9#Laj#Lbp#Lbp#Lbp#Lbp#L#ga2#g#La2#L#L#Laj#Lbpaj#L#L.7#La9.7.7a9.7.E#D#D#D#D.saY.N#Ua0#va##S.0aOamaY.N#D#D#Da9#D#Dafa9a9af#L#L#L.7af#Laf#La9#Da9.7a9a9.7#D#D#D#D#Da9bja9a9#D#D#s#D.N.N#x.Ca0aoaF#vaZbmbmaOa0.W.C#x.C#xbl.NawaY.CamaCamaCamamambgamb#.5aOa##Sa#.yaZ", +"#vaFaO#v.ybmaZazbaauazb#a0#x#xaYaYaY#D#sa9#D.E.7aj#L.7aja9aj#L.7aja9.n.7#D#D.sbfaY.WaCam#u#3a7aFaYaY#D#D.n.7ajafaj#gaj#g#L#g#Laj#L#Lajaf#Laf#Laj#L#L#La9a9#Da9a9.na9a9.7.n.7.7a9.na9aY#x#x#x#x#xaYaY#x.R#IbnbnaC.t.VaYa9.7aj#L#L#Lbp#L#Laj#La2#L.j#La2#g#g#g#gajbp#Lbp#L#L#L#Lbp#L#L#L.7a9.7.7.7a9#D#s#D#DaY.NaYaYa0ama#a#.yb#a0.N.N#D#Dbj#D#Da9a9a9.7a9bja9.7.7a9a9a9#D.7#D#D#D#D#Da9#Da9#D#D#Da9a9.n#D#DblaYaY.8b#.8aOaFaOaFaOb#bgama0#x#x#x.N#U#x#I#x#x#xaoama0bna0bnaoam.5amaOaFaFaF#va##vaZ", +"aOaOaF#va#a#az#faS#ubmb#a0#xaY#Dbl.n#Da9a9.7#L#L#L#L#L#L#L#Laj#L#L.Ea9a9#s.N.N.s#x.Wb##v#Ebk#va0aw#D#D#Da9#L#L#Lbpa2#L#ga2#ga2#g#Laf#L#L#Laj#Laf#L.7#L.n.7#D.na9a9a9a9a9a9.7a9#La9#sbl.NaY#xaYaYblaYaw#x#x#x.C.C.Fb#bnbl#Da9.E#L#Laj#L#Lbp#Lbp#Lbp#Lbp#L#g#L#g#L#Laj#Lbp#Lbp#L#L.7#L.n#L#L.7af.7#Da9#D#D#D.NaY.saY#Ibn.5a#a#aFambf#x.NaY#D#D#D#Da9a9a9.7a9.7.7#L#D.nbj#D#D#D#D.Na9b.bl#Daw#xaYaYaYaYaY#Ia0a0aoam#uanaBa##vb#bgb#bnbnaYaYaYaYblaw#x#x#x#Ua0.Wa0a0.W.C.Wama0ambg.5aFaFa##va#a##va#", +"b#ao#vbmaB#uaz.Gb#b#ama0#xaw.N#D#Da9a9a9.E#L#Laj#L#Laj#L#L#L#L#L.Ea9.n#D#D.N.N#x#Iao.5#u.Oazam.C#Dbl#sa9ajaf#La2.jbp.j#L#gajbpaj#Laj#Lajaf#L#Laj#L.n#La9a9a9a9#D.na9a9.Ea9.n.7a9a9#DaYaw#x.sbl#D#sblaYbl#I#x#Ua0b#bgb#bn#D#D.7#Lbj.7.7.7.7.E.7.7#L.j#La2#g#L#La2bp#L#Laj#L#Laj#L#L#L#L.7af.7.7.7a9.7#D#D#s.Nbl.NaYaY.CaCby#va#.8#xbfaY.N.s#D#Dbj#D#D#D#D#D#D#D#D#D#D#D#D.Naw.NaY#D.NaYaw#x#xa0aoamamaFaF#v.0bbanaBaZ#vaFb#am#x#xaYaYaYaY#IaY#D#D#x#x.Ca0avamama0.C#x.Ca0aoamaFa##uaZaBaZ.y#S.0.y", +".8aOa##Sazar#ua#a0am#x#x#x.N#D.7.na9#L#L#Laj#Lbp#L#Lbp#L#Laj#Laj#La9.7.n#D.sbo#x.Wao#v.f#f.ya0bf#M#D#Da9a9#L.ja2#La2bp.j#L#ga2a2#Laf#Laf#Laj#Laf#L.7aj#Da9b.bl#Da9.na9a9a9a9.7.n#D#MaYbfaYaY#Da9#D#D#Daw.NaY#x#Ib#b#bg.VaYbl#s#L.Ebj.7b..7.7.7.7#Lbp#Lbp#L.jbp#L#L#Lbp#Lbp#Lbp#L.7aj#La9.7a9#L.7a9#s#D#D#DaY.Naw.N.s.CamamaOa#a#.W#xbf#xaY#D#D#Da9#Da9#Da9bj#Dbj#D.N.Naw.N#x#xbfaYaw#x.Ca0a0aFbma#aBaZbbaZ#uaZ.0bgb#a0am#x#x#xaYblaY#MaYaY#Dbl#DaY#xaCamamaoaqaC.C.Wamao.5a#a#.yaSazaZ#uaZ.yaOaF", +".5aF#Sbhaza7aFa0a0bn#xaw.N#D.7.7af#L#L#L#La2#L.j#g#Lajbp#Lbp#Lbpaja9.n#D#s.N#I#I.WaF#uarazaF.W.Nbl#D.n#Laj#La2a2aj#g#L#g#L.jbpaj#Laj#L#Lajaf#Laj.7afa9.na9#D#D#Ma9#p#s#D#sa9.na9#DblawaYaw#Da9a9#D#D#saY.Naw#x#xaCb#.VaC.V#xaY#Dbj.nbja9bj#s.7.7aja2#L.j#Lbp#La2ajbp#L#L#L#L#L#L#L#L#L.Ea9.7.7a9#D.7#D#D#D#DaY.N.N.N#I.CaoaFa#aB.C#x#xbf#x.N.NaY#Dbl#D#D#D.N#D.NaY.saYaY.C.W.C.W.Caqa0.8a#aZaBan#u#uan#Sa#b#ama0bnaY#xaYaY.NaY.N#s#DaY#DblaY#Dbl#I#xam.8.5aOam.Cama0aoaFbmaBbha7#a#ea7an.y.yaF.8", +"bc.y.wara7b#a0aoaYaYaYbl#Da9.7.7#Laja2#L#g.j#g#ga2bpa2bp.jbpaj#Laf.Ea9#s#D#I#I.C.WaOaz#EaZb#.C.N#sbla9afafaj#L.j#L#g#L.jbpa2bpa2#Lafajaf#L#L#Laf.E.7.n#Da9#D#sbl.n#D#M#s#D#s#D#s#DawaY.NaY#Da9.n#D#D#D#DaY.NaY#I.CaCam.Vb##U#xawa9bj.7b..7bj.7bj#Laj#Lbp#La2#L#Lbp#L#Lbpaj#Lbpaj.7#L.7af.7a9.7.Ea9#D#D#s#D.N.saYb..Nbf.Wa0aF.0#ua0.W.C#Ibfaw.NaY#saY.N.N.N.N.N.N.N#xaY#I#x.W#x.C.Wam.8aZ.waz#ubha#aFaFb#ambn.bblawaY#MaY.N.s.N.N#D#D#D#DaY.saY#I#xaCam.8aFbyaoaCaoamama#a7azararaya6.G.Gaz#u#v.8", +".J.far.laobn#xaY#D#sa9#D.7a9aj#L#L#L#L#L#Lbp#Laj#g.j#ga2#L#L#Lbp.na9.7#s.N#I.Caobh#EaBaCbn.s#IaY#Ma9.n.7#L#L#L#Laj#Laj#L#Laj#L#L#L#L#L.7aja9.Ea9bl#M#D#M#DblaYblaYawaYaYawaY.NaYawaY#Mbl#D#D#D#Da9.n#D#s.Nbl.saY#x.RaY.N#xa0aFbm#IaYaY.N#s.7.E#L#L#La2#L#L#Lajbp#L#La2#L#L#L.7#La9a9a9.7#L.7.7.7#Da9#D#D#DaY.N.NaYaY#Ia0.5.8a#an.0.5bn#xbl.N#x.C#Dbl.sblaY#I#x.W.R#Ibna0aOa##vaZazararaz#ua#aFaO#x#I#x#Ibn#x#xaYaYaY#DblaY#Dbl#Dbl.NblaY.NaY#x#xaoaobnaY#xaCa#.0aOaOaOaFaFaFaFaF.l.Ta7bh.G.G#q#e", +"araza7aFam#xaYawa9#Da9a9a9#L#L#L#L#Lbp.j#L#La2#Las#ga2#gbp#Laj#L.7.7.n#D#M#xaCaFbk#iaOaC#xblaY.Na9a9a9afaja9aj#L#L#Laf#Laf#Laf#Lajafaja9#L.7a9.Ebl.n#D#M#DawaYawbn#Ubn#I#x#I#xawaYawaYaY#D#s#D#D#D.n#D#DaY.s#x.N#U#IawaY#xbna0aF#x.W#xaw.N#D.7b.afajaf#L#Lbp#L#La2#L#L.E#L.7a9.7a9a9.na9.7a9.7.7#D#s#D#D#D.Nbl.Naw.N#x.CamaF.0.y.yaF.CaYaw#x.Caq#Ibn#x#x#x#xbna0aoamaF#vana7.wazaZan#uaZaOamamamaY.RaYaYawaYaYaYaYblaY#D#Dbl#DaY#DblaY.N#xaY#I#xbnbnawaYbnam#va#ama0a0aoamamaoam.taFbmaZ.6ar.2#4", +".faBb#a0aY#xbl#Da9a9#D.E.7#L#L#L#g#ga2#g#g#g#g#g#g#g#ga2#L#L#L#L.n.7a9a9.N#Iam.8#f.Gb#bn#UaYaw.Na9.na9.7af#Laf#Lajafaj#Laj#Laj#Laf#Laf#L.na9a9#D#Mbl#M#DawaYaw#x#I#U#x#U#Ibn#I.NawblaY#s#D#D.N.sa9#s#D#M.NaY.s#xawaY#D.s#D.Nbnama0a0aC#x#xbl.NaY#La9#L.E#L#L#L#Laj#L#L#La9.7aja9a9a9a9#D.n.7a9.7#s#D#D.Naw.N.NaY#Dbl#I#xaC.5#va#aBaFa0aC.C.Caoa#ama0a0ambgaF#va##uan.w.wan.wanaZ#vaFb#ama0a0#x#xaYbfaY#xaY.Nbl.Nbl#D#D#Dbl#D#D#D#DaY#saY.N#x#x#xaYaYaYaY#Ia0bg.5bn#xbn#xbna0a0amaCb#ao.t#SaZar#a", +"aFama0aY#xaY#Da9#D#Da9a9#L#L#L#g#ga2#gbpa2bpa2bpa2#ga2#gbpajbp#L#Da9.7#saYaY.W.5#EaraFa0#U.NblaYa9a9a9ajaf.E#La2#L#L#L#Laf#Lafaj#Lafaja9#D.n#D#D#s#DblawaY#I#x#Ibnbn#I#U#x#IaY.N.Rawbl#D#D#D.s.N#D#D.saY.saY#I#x.N#s#s.7bj.N#xa0aob#amaoa0#I#xaY#D.na9.7a9bpaj#L#L#L#La9.Ea9#D#D#D#D#D#D#D#Dbj#DaY.Nbl.N.N#x#xbfaw.NaY#xama0aOa#aBa#bgama0.5a#.0aFaOaF#SaZan#ua7bhazaBbhaBa#aFb#b#aCbnbn#x#xaYaw.Nblaw#D#Dbl#D#D#s#D#p#Da9#D#D#Dbl#DaY#x#xaw#x#xaY.NaY#x#x.C.C.CawaYaw#xaw#x#Ibn#x#Ua0a0amaFbmbm", +"bn#xaYaYaY#Ma9af.7.n#L#L.7#L#ga2bp#ga2#g#ga2#ga2#ga2#L#L#L#L.7.7#s#D#s#D.N#xamaoaS.OaBam#xaYaw.N.na9a9#Laf#L#La2ajafaj#L#Laj#Lafaf.na9a9a9bl#D#Mbl#saYaw#x.b#x#x#U#Ibn#I#xawaY.saYaYbl#D#D#D.N#D#M#sblaw.N#I#x#I#D#sbj#Db..N.N.Camamb#am.pa0a0bn#D#Da9.7.7aj#Lbp#L#La9.7a9a9#s#D#MaY#D#Dbl.saY.N.N.N.s#x#xbf#I#x.NaY#I.CaCamam#vaBbm#SaF#va#a#aB#ubh#uanaBaBbmaZ.FaFb#b#a0aCbn#I#x.RaYawaYawaY.N#D#D#D#D#D#D#D#Da9#Da9#Da9#Da9a9.saYaw.Naw.N#xaY.N#x#xaY#xaC#xaYblaYaYaYaYaYaY#xaYblaY#Ua0a0.Vbn", +".NaY#D#Da9a9a9#La9.7.7#L#L#g#L#ga2bpa2bpa2bp#gbp#g#Lbpaj#L.7.Ebjbj#D#Dbl.s#xaoa##TalaBam#x.NaY#Da9a9a9af#L#L#L#L#L#Lafaj#Laf#Lajafa9a9#p.n#D#M.NblaYaYawaY#x#I#x#Ibn#U#Ibn#I.NaYawaY#sbl#saY.s.N#sbl#s.NawaY#I#x#I.N#D#s#D.N#Ibnaoa0#Ia0a0b#aoamaw.N#Da9.7#L#L#L.7.n#L.7#s#DaW#DaYaYaY#I.NaY.N.N#I#x#xbf#x.C.C.C#x#I.Ca0amama#a#a7azaza7aZaB#uan#uan.laZ#SbmaFaF.V#Ubn#UaYaYawaYaYawaY.NaY.N#D.N.n#Da9#D.n#D.7a9#Da9bj.nbja9#s#DblaY#D#x#xaYaY#x#M.N#x#I#x#x#xaY#Dbl#DaYaYaY#xaw#x#IaYaYaY.baYaY", +"#D#D#Da9a9#Lafaj#L#L#Laj#Lbp#ga2#g#ga2#g#ga2#ga2#g#L#Lbp.7.7.7#D#D#s#D.saY.C.8aB#4#zaZa0#xaYaw#Da9.na9#L#L#Laja2#Laj#L#Lafaj#L#L#p.n#pa9blblaYaYawawaYaY#I#x#x#Ibn#Ibn#I#x#U#x#IaYblaYaY.Nbl.saY#s#Daw#Dawbf#I#x#I#x.s.N.s#xa0aC.C.Ca0.CaCa0ambg#x.N.s#D.7aj.7aja9.7a9#sa9#D.s.NaYawaYaYaY.NaYaYbf#x.C#x.W.C.Caqavaqa0ao.5#va##vaS#W#aazazanbm#SaFaFa#aFaOaFbgb#aCbnbnaw#x#x.N.N#sbl#D#s.N.N.N.N.7.7.7.7.7.7a9.7.7.7a9.7a9.7.7.7aY#DawaY.NbfaY#x.NaY#x#x.C.WaY#D#M#DaY.NaY#x#x#x#x#x#xaYaY#Da9#D", +"a9.7.7.7afaj#Laf#L#L#L#La2#La2#gbpa2bp#g#L#g#L#g#Lbp#L#L.7.7.7bj.s#D.NaY.Nao#v.QaD#za#am#xaY.N#D#pa9a9ajaf#Laf#L#Lafa2#La2#Lafaja9#p.na9#MblawblawaYaY#I#x#I#x#x#Ubn#Ibnaw#x#IaYaYawaY#M.saY.N.s#D#M#D.s.Naw#x#I.W#x#I.s#x.W#Ua0.Cava0.W.Ca0a0a0#I#IaY#D.7#L#L#La9.E#D#D#D.N#D.sbnbn#x#x#x#x#I#x.C#x.W.Caqamavam.C.5.5aFbya#.y.0.Gakar#e.TaBaFaF.5aFaOamb#a0aoambn#Ua0.C.Ca1bfbf.Nbl.N#D.N.N.N.Na9aj.7af#Laf#L.Eaf#L#L#L.7.n.7.n#DaYblbfaYaY#x#x.s#xbo#x.C#x.Na9#D#DaY.N#x#IaY#xama0bn#x#D#D.7#L", +"#Laj#L#L.7#L#L#Laj#L#Lbp#g#g#g#La2a2a2a2#ga2#L#L#L#L#L#L.7a9.7a9#Da9.s#Iama##u#.bA.faFaYawaYaYbfa9a9afa9#L#L#Lajafajafafajaf#Lafafafa9a9bl#Dbl#s.RawaYaY.R#U.R#Ubn#Ubn#Ibn#U#x#x#M#D#D#Daw#D#s#DaYaw#s.n#D.s#I.Caoaoam.8.5aO##am#va#byaFbcaqav.CaFaOaFaC#x.N.saW.N#D.N.s.N#I#xbn#U#xaw.R#x#xbna0#U.Vamb#b#aFa#bmaBaZ#vaZ#v.0aB.yaFaO.5bgamamamaobn#U.C#Ua0aCbnbnawaY#MaYblaY.saY.7.n.7.na9.E.7.7#La9#Laj.7#L.7af#Lafaja9a9a9#Da9.Nbl.Naw#x.s#xaY#x#xbn#x.baYaY#Da9.na9#DaY#x#x#x#IaYaY#sbla9.na9", +".7af.7#Lajaf.7#L#Lbp.j#L#g#L#g#ga2#ga2#g#La2#L#Laj#L#L.7a9.7.n.7#sbl.NaYaoa#azbAa6a7am.RaYaYaY#xafa9a9af#Laf#L#L#Lafaj#Laf#Lafajafaja9.n#D#M#DaYaw.R.RaY.baY#UaY#Ubn#UaYbn#x#I#x#M#D#M#D.s#D#s#D.s#Dbl#s#s#MbfavaCbgaCaoaC.5ao.5#vaOaOam.8.8amavb#b#aoaC#xaw.N.N#s.s.NaYaw#xbnbnaCa0a0a0amamaoaFaFaFa#.yan#u.G.6aBaBbmaO.5b#.5b#amaoa0a0amaCa0a0aY#xbn#Ibn#Ibn#IblawaYaY#M.Nbl.N.n.7a9.7a9.7afa9.7aj.7#L#L#L#L.7#Laf#La9a9#D.7#D#s#DaYaY.NaY#x#xbn#x#x#U#xaYawaYa9a9a9bl.NaY#x#x#xaYaYbl#Da9.7a9", +"#L#L#L#L.7#L#L#L#La2#L#L#ga2#g#L#ga2a2a2#ga2#L#L#L.7#Laf.E.7.7#DawaY#I.CaoaBazbaaSa#.VbnawaYaY.N#pa9afa9a9#Laja9af#Lafafajaf#Lafa9#pa9blblbl#MaYaYaYaw.R#x#UaYbnaw#x.R#I.R#I#x#xaYaw.NaYaw.N.N.s#D.s.saw#I.CaoaoaO.F#vaOaO.8#vbc#va#aO#vaO.5.8aCaFaO#SaOaOao#I#x#MaYawbnbnaCa0b#a##va#a##vaZaZ#uazazbh.Galay.2alaFaOaFamaCa0aC.C#I#x#x#I#x#xaY#IaY#I#x#I#x#x#I#xbl#D#M#D#D#s#D#D.n.7.n.7.n.7.7.Eaf#L#L#L.7aj#L#Lajaf#La9.7a9a9.7bl#DaY.NaYaY#x#xaCa0#x#xbnawaY#D#Da9#D#DawaY#x#I#xaYaY#D#Da9a9a9", +".7#L.Eaf#L#Laj#L#L#L#g#L#g#L#g#g.ja2a2#ga2bp#L#L#Laf#L.7.7a9.7#Dblaw#x.W.5az#aalaZb#a0bnaYaY#DaY#p#Da9afa9a9#L#Laja9aja9#La9aja9.na9#sbl.n.NblaYaw.R#xawbnaY#U#U#x.R#Ibn#I#x#I#xawaYaY.saY.s.N.N.s.saw.W.Waobc.yaBaB#u#S.y.y#va#aB#u.Qaz.waBaZ.yaZaB.0aBaB#vaO.5bn.Vb#am#Sa#aB#u.wbhazazbh.waz.GarazaSaz#a#a#a#ea0a0#Ubn#x#I#x#xaY#MaYblblawbl.NblaYaYaY#U#IaYaY#D#M#D#s#D#D.n#D.7a9.7a9.7a9.7a9#L#L.7af#L.7af.7af#L#L.na9a9bja9#D#D#DawaYbfaw#xbna0#x#UaYaYaYbl.n#Dbl#DaY.N#xaY#xaYaY#D#Da9a9.7", +"#L#L#L#L.7#L#L#L#g#ga2#g#g#ga2bpa2#ga2a2#ga2#L#L.7#Laja9#La9#sa9.NaYaY.Wambk#zaraFamambnaYblaYbl#Dbla9a9.7a9.7a9a9.7a9a9.na9a9a9#Da9bl#DblawaY.N.RaYbnbnbn#Ubnbn#I#U#x#x#x#I#x#Ibl.Naw.NaYbf#I#x.s#x.WamaO.y#uazal.U#z.U#T.G.GaP#Tal#z.U#3al.Ualal#T.G#T.G#e.w.wa7#ua7a7aS.G#e#TaS.w.wanaz.wazaS#vaOa##va#aFaFam#UaY#xaYaY.NaY.s#D#D#D#s#D#D#D#s#D#saY.saY.NaY#sbl#D#M#D#D#Dbj#D.n#L.E#L.E#L#L#L.E#L#Laj#L#L#L#L#Laf#La9.7#Da9#D#D#DblbfaY.N#xaY.C#I#x#xaYaYaY#Dbl#D#D#Dblaw.NaYaYaYaY#D#pa9#La9", +"#L#L.7aj#L#L#L#L#g#L#gbpa2bpa2#ga2asa2#g#La2#L#L#L#L#La9.7.7#D#sbl.N#Ia0#vaz#z#eam.Va0bnaYaYaYaY#Dbl#D#Da9a9.7.7a9a9a9.7#Da9#sa9bl#sbl.sbl.NblawaYbn#Ubn#Ibn.C#Ubn#x#U#x#I#x#IbfaYaw.NaY.N.saYboaYaCam.y#u#aau#4aH.4#..4aHbrbw#0.2bw.2aT.2ay.YaH#4#zal.o#T#Tal.U#aar.G.Ga4aPa4a4.ya#aZ.ya#a#a#aOa0bnaCbnaCbn#I#xblaYaY.s#D#sa9#Da9.na9a9a9.na9a9#D#D#D#D#s#D#s#D#D#s#D#D.n.7.E.7.n.7#La9#La9.E#Laf#La9#L.7#L.7afaj#L#La9a9.n#D.7bl#D#DaY.NaY#x#xbn#x.R#xaYaYaY#DaY#Dbl#D#D#DaYaYaYaYaY#D#Da9a9a9", +"#L#Laf#L#L#L#L#La2#ga2#g#ga2#g#La2a2#ga2#ga2#L#L#L.E#L.7.n.7a9#D#D#I#xaoby.w#zaSa0aCa0bn#x.Rblblbl#D#D#D#D.7a9.Ea9.7a9a9.n.7a9a9#sbl#DblaYaw#x#x#xa0#xa0a0a0aCa0#I#U#x#I#x#I#xawaY#x#I.Nawbf#x#IaCbgaBaza6aT#P.uaybaay#3#aar.Gazaz.Gazaz.Gar#aa6.w#u#uaBaZaB#uazazazaS.0#S.0aFa#am.5aoa0am.Wam.C#I#x#x#I#x#I#xaw.N.N#s.N.N#Dbj#s#D#D.7.7.7#D#s.7a9.Ea9a9a9a9a9a9#s#p.na9bj#Dbjbj#Lajafaj#L#L#Laf.E#L#L#L#Laj#L#Laf#Laf.7a9bja9#D#D#DawaY#x.s#xaY#x#x#x#IaYaYawaYbl#D#D#DblaY#s#DaYaYaw#D#Daf.7af", +"#L.7#L#L#L#L#L#L#L#gbpa2bp#g#L#La2#ga2a2#g#L#L#L#L#L.7a9#L.7#D#saY#x.C.8#va7albh.Ca0a0bnaY.RblblaY#Dbla9#Da9.7.7a9a9a9a9a9#D.n#Dbl#Dblaw#DaY#x#IbnbnaCa0#Ua0aCa0.CaC#x#I#x#I#Ibf#x#I#x#I#x#Ibo.C.paOa7#aay.K.K.K#Ear.faZa7#uaBaB#vbmaBaZa7an.TaZaOaF.FaFaOb#b##SaZ#va#aOama0.W#xavam.C.W.C#xaw#x#x#Ibfbf#xbf.N.N.saYaY#D.N.E#D.7a9#D#s.7#s#D#D#sa9.7a9.7.E.7.Ea9#s#D#s#D#s#D.Ea9.Eaf.E#Lajafaj#L.7#L.n.7#La9#L.E#Laf#L.na9#D.7a9#Dbl.NaY.NaY#x#x#x#U#x.RaYaYaYaY.N#xbl#D#D#D#DblaYaYaYbl#Da9a9.7", +"#L.3a2a2a2a2asa2#ga2a2#ga2a2#ga2#ga2#ga2a2#ga2#L#L#Laj#L#L.7b..7#x#I#x#xaC#uar#e#Sa0.CaYaY#DaYaYa9#p#pa9a9a9a9a9#s#D#sbj#D#D#D#D#saYaY.Naw#x#x.Ca0aoa0a0aCbn#Ibnaw#U#U.CaCamaCaCaw#Mbn#UbnaCbgaoaZanaral.2alaPan.y.0.yaB.0a#a#a#.8aF#v.0#u.0#v.5aCam.8amaOamaoam.F.tbg#x.C.C#xaY.NaY.saY.Nawbf.N.N.N#D.s#D.N#D.Nbl#sbl#s#D#D#D.7.Ea9.7a9.7a9.7.7a9#s#D#D#Da9#D#D.na9.na9.na9a9.na9a9a9.naf#Lafaf.E#L.7#L#L#L#L#Lafaj#L#L#La9.na9bl#MblaYaY.baYaYbl#Dbl#DaYawaYaY#M#D#DaY#Dbl#D#DaYblbl#D#p#Dafa9", +"afa2#La2a2#gaa#ga2a2bpa2#L#g#L#ga2a2#g#L#g#La2#g#L#L#Lbpaj#D.7bjaY.N.N#Iao#u#aayaFa0bnaYaYblaYaY#pa9a9blbl#D#M#D#Da9#Da9#Da9#s#Dbl#D#MaY#x#x#x.Wama0a0aCa0a0amao#Uaobg.8am.8amama0bgb#.8aFa#.0aZ#ua7#uaS#uanaBa#.8aFaOamaOamaCamb#ao.5a#.0#vaF.5a0a0aC.Ca0.Wa0am#ybgaC#xbf#I.NawaY.NaY.saY.NaYaw#D.s.N.N.N.s.N.sbl#sbl#D#D#D.n#D.7a9.7.n.7.n.7.n#D#D#s#D#s#Da9#Daja9a9.nafa9aja9aja9aja9af#L.n#L.7af.Eaf.E#L.7#Laf#Lafaf#La9.7a9blblblawaYaY.baY#Mbl#DaYaYaYaYaY.NaY#Dbl#s#Dbl#D#MaYa9bl#D#Da9a9", +"afaf#La2a2a2#ga2#ga2a2#ga2a2#ga2bpa2a2#ga2#ga2#g#L#g#L#L#Lbj.Ebjaw#D.s#xaoana6abaOam#xaYaY#DaY.N#pa9#p#sbl#Dbl#D.n#D.na9.na9a9a9#sbl#DaY#I#x.Wbnb#bgb#amamao.8aFamaO.yaZ#u#u#S#vaZan.yaZaZ.6aSa4aBaZbma#aF.5ama0aCa0.CaCa0a0a0.Wbna0a0aoam.5aoa0#I#x#xbn#I#x#x#x.p.Vbn#x#I.NaYbl.N.NaY.N.NaY.N.NaYaY#DawblaY#DaYblaYblawaY.s#D#D.na9a9a9a9a9a9a9a9#D#D#Da9a9bja9a9.nafa9.Ea9a9.na9.na9.n#Lajaf#L.n#L.7#L#L#Laj#Lajaf#L#Laja9a9a9blblblaYaYaYaYaYbl#D#MblaYaYaYaYbl#saY#D#D#D.NaYblaYbl#D#p#Dafa9", +"afajaf#La2a2a2a2a2#g#L#g#L#g#La2#ga2bpa2#La2bpa2aj#Lbp#Lajbj.7#s#D#Daw.C#v.GaTaD#vb#a0bnawaYaYaYaYblaYaYaYawaYaw#D#D#D#D#D#D#s#Dbl#saYaw#xa0a0a0bgamaOamaOa#a#a#.yan#u.G.Gaz.w.w#u#uan#uan.w.6.GaFaOaFaoaobn#I#x#I#x#I#x#x#I#xaY#x#I#xbn.CaC.Ca0#x#x#IaY#xawaYaw.R.bbnawblaYaw#DaY.saY.Naw.N#M.N#D#s#DaY.N.saY.NawaYaw#Dbl#DaYaY#D#s#D#s#D#s#Db.a9#D#s#D#s#D.n#Daf#L.na9aja9aja9afa9aja9afaf.7af.7#La9aj.7a9#L.7afaj#Laf#La9a9a9.na9blblaYawaYaYblbl#Dbl.saYaYawblaY#D#Dbl#DblblaYblbl#Dbl#Da9a9", +"a9a9#L#L#L#L.jbpa2a2aja2#ga2#ga2#L#ga2#ga2#ga2#L#g#L#L#L#Lbj#s#D#saw#Iaq.y#3aH#Pa#bga0#UaYaY#xaYaYawaYaYaY#x.N#x.Naw.Naw.N.NaY.s#DblawbnaCamb#bgaFbma##S.0aB#u.yaz.w.waz.w#u.0a##SaFbma##Sa##Sa#amamaoa0#x#IaYawaYblawaYawaY#M.NaYaYawaY#I#x#x#U#x#x#xawaYaY#D#MaY#x.b#x#UaYaY#Daw#DaY#D#D#D#D#Dbl#Dbl#sblblbl#MaY.RaYaYawaY.s.Nbl#Dbl#D#Dbl#Dbl#D#s#D#D#D.7#D#Dajaf#La9.na9a9.na9.na9a9.n#Lajaf.E#L.7#La9aj.7#Lafaf#Laf#La9.Ea9a9#p.nblblaYaYaY#Dblbl.NblaYaYaY.Nbl#D#D#D#DaY#DaYblblbla9#Dafa9", +"a9afa9ajafbpa2#L#ga2bpa2#L#g#La2bpa2a2bpa2#L#ga2#L#Lbp.7aj.7#Db.bl#x.Waobb.2a6ak#vb#a0#x.RaY#xaYaYaY.R#x#x#x#I#xawaYaYaYaY#xaw#xaYaw.Ca0b#aF#vaZaZana7.waz.G.Ga7#uaBaB.0a#aFamambnbnaCa0a0aCa0a0aoa0#IaYaw.Nbl.NaY#MaYbl#DblaY#DawaY.Nblbl#xbn.Ca0#I#xaY.N#Mbl#DawaY#Ibn#Ubn#I#x#D#D#D#D#D#D#s#D#D#saY#Dbl.s#DaYblaYaYawaYaYaYblbl.nbl.nbl.nbl.n#D#D#D#s#D#D#s#D#Lafaja9#paja9aja9af.naf.naf#Laf.7aja9aj.7#Laf.7afajaf#Laja9a9a9afa9#Dbl#sbl.Nblbl#sblaYaYaYaYaY#DaYaY#Dbl#DaYblaY#MaY#Dbl#Da9a9", +"a9a9afa9#L#L#La2#ga2#La2#ga2a2#ga2#ga2a2#ga2a2bp#L.j#L#L.7#sbj#saY#Iaq.y.waXaraS#vb#a0#UaYaYawaYaYaYbn#x#U.Cbn.Caqaqavaqavaqaqaq#Ia0ao.5#vana7bh.Ga6al#aarbkaz#uaOamam.Cao#x#IaY#I#x#I#x#I#x#xawbn#xaw#D#D#D.sbfaY.N.saY.saY#D#D.Naw.N#saY.s.Cava0am.C#IaYaY#D#M.N#x.bbnaCa0a0#x#s#D#s#D#Da9#Da9blblbl#Mblblbl#MaYawblaYaYawaY.saYaYaYaYblblblbl#s#D#D#D#D#s#D#Daja9af.nafa9.na9.na9a9.na9#Lajaf.7af.7#L.n#L.E#Laf#L#Laf#La9a9.7a9a9a9a9#D#D#M#Dbl#Dblaw#DaYawaYaY#saYbl.Naw#DaYawblaYblbla9a9af", +"afa9.7a9#L#L#L#L#La2#g#La2bpa2bpa2#L#g#L#g#L#ga2#Lbp#Laj.7bj.s#D.Waoao.waX#aazaSaFa0#xaYaYaYaYaYaYaY#xa0a0.Caoa0.8.8.5ao.5amaoamaCaoam#v#ubh.G#eayaTay.Gaza7aBa#aoaC.CaC.CaYaY#Mbf#x#xaY#xawaYaY.NaYaw#D#s.N#xaNaw.Nbl.Nbl.N.N#s#x.NaY#D.NaY#xaqa0aoa0#x.NaY#MaY#x#xbnbn.Vamaoam#D#D#D#s#D#sbja9.N#M.Nbl.N#M.NblblaY.RawaYaYaYaYblawblaYawaYawaY#D#s#D#M#D#D#D#Daf#L#La9a9.naf#La9af.n#L.nafafa9aj.7aj.7#L.7#L.Eafaj#Laf#La9a9a9aja9a9.na9bl#D#D#DblblaYaYaYaYaYaY#DaY#DaYblbl#DaYaYbl#sbl#Da9a9", +".7a9a9.7a9a9.7a9#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#L#Lafa9a9#D#sbl.s.Waoan.G#Ea7aBaZ#vaFama0aCamamamb#.Va0aC.VaO.0#uaSaSazazan.Gak#a.Iay.Iar.Xar.Gazaz#uaB.yaO.5aoa0#Iaw.NaY.saY.N.N#D#s#D.N.N.N.N.s.NaY.NaY.NaY.saYa9bl#sbl#sbl.nbl#D#s#DawaY.saYawaY#x#U.CaC#xbf.N.s#I#x#Ia0aoamambf#I.N#D#DaYaY#Dbl#D#Dbl#D#Dbl#D#M#Dbl#Daw#D#M#DaYaYawaYblblaY#D.na9a9.na9.najaf.nafajaj#L#L#Laj#L.E#L.n#L.E#Lajaf#Laja9aja9.7a9#Lafafaj#L#Lajafa9a9a9bja9#D#D#sblaY#MaYaYaYaYaYaYaYawaYaYaY#xaY#UaYaYbl#Dafa9#L", +"a9bja9a9.7a9a9.7#L#L#L#L#L#L#L#L.E#L#L#L#L#L#L.7aj#L#sa9#saY.saYbo.5.w.GazaB#San.l#vbgama0#xama0ama0a0bgaFbmanazak#aar#eazaz#aa6.e.e.XaraSazbhan#S#v#vaFaoa0aC.Cawaw.Naw.Naw.Naw#Da9#s#D.s.N.s.N.NaY.s.Naw.NaY.Nbl#saYblbl#Dbl#D#D#DaY#D.NaY.N#x#Ibna0a0a0.C#I#x#x#I#xaCamaFaOamaYaYaYaY.N.Nawbl#s#Dbl#D#sbl#D#Dbl#Daw#Dbl#Dbl#D#Mblblblaw#Dawbl.na9.na9.na9a9.naf.n#L.7aj#Laj#Laja9aj.7aja9aj.7#L.Eaf.7#L.7af.7afaj#L#Laf#Laf#La9.7a9a9b.a9#D#DaYblaYaYblaYaYaw.RaYbnaY#U#xbnbna0aYaYaYbl#Da9a9", +"a9a9a9a9a9a9a9a9#L#L#L#L#L#Laf#Laf#Laf#L#Laf#Lafa9a9a9#D#D.Naw.N#x.8.w#e.lbma#az#uaZaFa0aC#x#x#x#x.WamamaF.y#ealayaG.G#eanaS#e#a.I#a.X.JanaZ#Sa#aOambga0.W#x#x.saY#saY.NaY.NaY.N#D#D#DaY.NaYaY#xawaYaYaYaYaY.saY#Dbl.N#M.Nawbl#D#M#D#MaYawaY#x#xbnaCam.8.5amamaCa0a0aob#aOaObm#v#x#I#x#xaY.N.NaY#Dbl#Dbl#D#Dbl#D#Dbl#Dbl#Dbl.sbl.N#Daw.NblaYblaYa9.n#p#sbl#Ma9bl.na9.na9.7.E.7.7.na9.na9a9.Ea9.n.7aja9.na9.Ea9.7af.7af#Laf#L#Lafa9a9a9#Da9#D#D#DblaYblaYawaYaY.R#xawaYaYaYbn.Cbn#xaYaYaY#D#D#D#D", +"a9a9a9a9a9.7a9a9a9a9a9#Laf#L#L#La9.7.na9a9a9a9a9a9a9#s#D#s#D.Nbl#I#v.G.G#uaF#van#uaZ.8a0bnbnawbnavam.5#van#ealbra6#a#e.wana7#e#e.fakaz.TaBa#a#aFa0aoa0.Wbn.s#M.N#saY.sbl.saY.saY#s.Naw.Naw.N#I.N#x#I#x#x#IaYaY#IaYawaYawaYaY#xawaYaYaY.NaY#x#x#Iamb#aFa#a#aOamamamaob#b#aF#Sbmbmaoa0#x#xawbl#D#D#Dbl#D#sbl#Dbl#sbl#D#D#sbl#D#D#D#Mbl#DawblaY#saY#Mbl#Dbl#M#D#M#M#Da9#sa9.n#D#D#sa9.Ea9b..na9.7a9.na9.n.7.7a9.7a9aj#Lafaj#Lafaj#La9.Ea9.7#D.E#D#DblaY#MaYaYaYaYaYaY.R#x.R#xbn#U#xbnbnaYaYbl#Dbl#D", +"a9a9a9a9afa9afa9af.nafaf#Lafa9a9afa9a9a9a9.na9.n#D#D#D#D#D#Daw.N#I.y.GazaZb#aOa#anaBa#aoa0aCbna0a0.5.8an.G.2.K#P#q#e.6anan.wazakazbha7aZaFam.8am#xaC.C#I#IaY#D#saY#saY.NaY.NaY.NblaYblaYaY#I#x#x#x#x#I#x#x#x#xaYaYbn#xbn#U#x.baY#x.s#x#x#I.Ca0.CbgaF#vbma#a#aOambgamb#aoaFaFaOaF#va0#x#I#x.Na9#D#s#Dbl#D#Dbl#D#Dbl#Dbl#D#Dbl#Dbl#DaYblaY#Dawbl#DaYaY#MaYawaYawaY.nbl#p#sa9#sa9#D#s#D#Da9#D.n#D.na9.na9a9.n#Da9#D#Lajaf#Laf#Laf#La9a9a9#Da9#Da9#DaYblaYaYblaYawbnawaYaYaYaYbn.Cbna0.Cbn#xaYaY#Da9", +"#pa9a9a9a9a9a9a9a9a9a9a9a9a9a9.na9a9a9a9a9a9#Da9#D#s#D#s#DaY.NaYaCaZ.6az.0aOaF#van#uan#vamamamamaOa#analba.g#P#P#a#Tan.y#uaZaza7an.laZa#bgama0.C#U.C#U#I.N#s#s#D#s.Naw.N#M.NaY.saYaw.Naw#x#x#x#U#x.baYbnaw#xawaY#Ubn#U#x#Ubn#xbn#xbn#Ia0a0a0aCa0b#.t.tbma#aFaFb#amamamam.Vb#b#.V#Sbga0#x#xbl#D#Dbl#Dbl#Dbl#s#Dbl#D#M#D#Dbl#sbl#Dblaw#DawblaY#DaYawaYaYaY#Ibn#Ibn#Mbl#s#D#D#Db.#D#sa9#s#s#s#D#s#D.n#D.na9#D#D#s#Dafafaf#L#Laf#L#La9a9.7.nbja9bj#DblawblaYaYaYaYaYaYaY#x.R#x#xbnbnbnawaYaYbl#Da9a9", +"a9a9#pa9#pa9#pa9a9a9a9a9a9a9#pa9a9.n#p.nbl.n#pa9#D#D#D#D#D.Nawbfbn#vazaS#SaF.8#vaZ.6aBa##va##v.0a7.faG#PaD#V.Kay.XazanaB.0#vbm#SbmaZ#vamama0aC#xa0.W#x#x#I.N#D#s.N#M.NaY.NaY.saYaYaYaYaYawbn#x#x#x#xbn#Ibn#x#x#xbn#xa0bna0bnaCbn#xa0#x#xbn.Ca0am.V.Vb#aOaFb#bgamaC.C.CaCa0a0aCa0a#aFbgbnaY.N#D.7#D#M#D#Dbl#Dbl#D#D#Dbl#D#Dbl#D#D#M.NblaY#DawblaYaY#Ibn#Ibn#Ubn#IaYawaYawaYawaY.s#D#s#Da9#sa9#s#D#sa9#Dbl#s#D#D#Daj#L#Lafaj#Lafaja9a9a9#Da9#D#Da9blaYblaYawaY.R#xaY#M.RaYawbna0#IaYbl#Da9a9afafa2", +"#pafa9afa9a9a9a9#pa9#pa9afa9a9a9#p#p#D#pbl#p.na9#D#D#D#DaY.NaY#Ia0#v.Gaz.0#vaF#vanaz.w#u.0#u.waP#A.f.Xa6.Ia6akaSanaZa#aFaoaFaOaF#SaFaFama0aC#x#x.Wa0.W#Ibf.N#sbj#M.N.saY#s.NaY.NaYaYaw#xaY#x#I#x.R#x#x#x#xaYbnaY.Cbnbn#xbn#x#xbn#x#I#xbn#xa0.Ca0.pb#b#aFb#aFb#.V.C.C#x.CaCa0#xa0.FaFaOa0aYbl#D#sbl#D#Dbl#Dbl#s#Dbl#D#M#Dbl#D#M.Nbl#DaYblawaY.saY#UaYbn#x#U#x#Ubnaw.Rawblaw.NawaY#s#s#s#s#D#s#D#sbl#Mbl.n#Dblbl#Dafaj#Laf#Laf#L#La9.7a9.7#s.7#DbjblaYblaYaYaYaYaYblaY#xaY#x#xbnaYbla9#p#p.naf#La2", +"#L#La9a9a9afa9af.j#L#La2af#La9a9#sa9#s#D#DaYaYblawaYaY#I#xbn.Ca0#Ubg.laz#uaBanaBa6#a.Xa6#aak#ebh#Sbm.Fa#aFb#amaoa0aCa0aoa0amb#.8b#aoa0aCa0#xaC#x#I#xaY.N#M#D#D#s#D#sa9.7a9.7.n.7#D#D#D#s#DaYaYaY#sbl#Mbl#Dbl#D#Dawbl.Naw.NaYaYawaYaYaYaw#DaYbl#DaY.RaYaYbnbna0a0#Ubnbn#x#x#x#I#xa0bgaBb#a0.s.s#L.NaY.N.saY.N.NaYbl.NblaY#I#x#x#x#Mbl#MaYaY#x.b#x#xbn.Wambgamamam#Ua0bnaCa0a0amaoaw#x#x#x#I#Iaw#Mblbl#sblbl#D#D#Da9#pa9a9a9a9#Laf.na9a9a9a9#paf#pa9a9#MaYaY#x#xbnaw.RaYbna0a0a0aY#D#pa9a9#La9#L#L", +"#L.7#Laf.7a9.7a9#Laf#Laf#La9.7#Da9a9blbl.Nbl#DaY#xaYaY#xaCa0amam.t#uazar#e#T#a#zacbaayaraS#uaZa#aFaFaFb#amaoama0a0a0aCa0a0ama0amaoa0a0a0aC#xaC#xbn#I.saY.s#D#sa9a9#sa9a9.Ea9.7a9#D#s#DaY#D#D#s.Nbl#D#D#D#D#Dbl#DaY#DaY#Dblbl#DaY#D#Dbl#DaYbl.NaY.baYaYaYa0#Ia0a0#x#UaY#x#U#x#xaYbnam.FaOa0#x.s.7aY.saY.NaY.NaY.sblawaY.N#x#Ibn#xaYawaY#xawbnaY#U#x#IaCa0aCbg.paobn#U#Ua0aCaCaCb#aCaC.C.Wa0.C.baYawawaYblaw#D.s.Nbla9#p.nafa9ajafa9#pa9#pafa9a9a9#pa9blaYaY.b#xaYaYawa0#xa0a0#UaYbla9a9a9a9#L.7#L", +"#Laf#La9.7af.7af#L#Laja9.7a9a9bj#D#D#D#MaY.NaYaY#MaY#Ua0amam.5.5aSal#PabbrayaTaTaGara7aZaZaZbm#vb#amamaCa0#x.C#x#I#x#x.CaC.CaC.5b#aob#aCamaC#xbn#I#xaY.s#D#sa9#s#Da9.Ea9.7a9.Ea9#D#D#D#D#s#D#D#D#Dbl#D#M#Dbl#sbl#DaYblaY.saY#DaY#MaY.Nbl.sbl#D#DaYaY.baYaYbn.CbnbnaYaYbn#x#x#x#xaYbnam#Sama0.N#s.NaY.Naw.Naw.NaY.NblaYaw#x#x#x#IaYaYawbl#x#I#xa0#Ia0aC.pbgb#bgb#.pa0.V.pb#.Vb#bgbm.taOaFaFao#U#x.bbn#IaYaYaY.NaYbl#Dbl#Da9a9a9a9a9a9a9a9a9a9.na9a9a9bl#DblaY#x#xaY.R#xaCama0#x#xbl#s#Daf.7af.7#L", +"#L#L.7a9.7a9a9.7af#La9a9a9#D#D#D#D#MaYaY.N#x#I#x#xaY#x#xamaO.0bbaT#PaD#VaTaRar#eaBaZbmaFaFamb#ama0aCama0.C.C#x#I#xaY#I#x#x.W.CaCaOaFaob#aoamaC.C#I.b.NaY#s#Da9.7.n.7a9.7.n.7a9.7#D#D#D#D#D#D#D#D#D#M#D#Dbl#D#Dbl#D#D#sbl#Dbl#D#D#D#D#Dbl#D#Dbl#DaYaYaYbn#x#x#x#IaYbnaY#IaY#xaY#IaYbna0aBbmao#x.NaY.saY.NaY.NaY.saYaw.NaY#x#I#x#xaw#x.N#I.C.CavaCaFaOa#aBa##vbm#Sbm.taFbmbmaZaBbh#kbhbhaZ#Sa#b#a0aCa0a0#U#xaYaw.Nbl#Mbl.n#D.n.7a9a9.na9a9#sa9#Da9a9a9.n#D#D#xaY#xawaYbnama0ambnaYblbl#Da9#Da9#L.7", +"a9a9a9afa9#La9a9.na9a9bj.n#D#D#saY.NaY#x#x#x#x#x#Ubnambga#.0#u#uaH#4#aazanaBaZbm#SaFaOb#bgamamama0.C.C.W.C#Ibf#xbf#I#x#x.C.Cao.8a#aOaOamaoa0.Wa0aY#xaw.N#D#s.7a9.7.n.7a9.7#L.7aj#D#D#s#D#D#D#s#D#D#Dbl#D#Dbl#D#Dbl#D#D#Dbl#D#Dbl#D#Dbl#D#D#D#DblaY.NaYawaY#xbn#xaYaYaYbn#x#x#x#x#U#xamaBaBaBa0.Caw#xaY#IaY#xaY#x#x#x#Ibn#xa0.Wa0.CaoamamaCamao.5azaz.G.Gar#e.G#a#eaz#ear#e#a.X#a#jaGak.faSaZ#vb#ambga0a0a0#I#x#xaw#xblaY#Da9#Da9#D#D#Da9#Da9#Da9.na9a9#D#DblaY#x.Rbna0.Cama0#x#xbl#Dbla9#D.7.7a9", +"a9.7a9.7a9.na9.7a9.7#s#D#D#D#D.N#x#x#x#I#x#x.Ca0amaOa#.yanaBan#u.6aBa#amb#a0b#amamb#amamamaoa0aoa0aCambn.C.C#x#Ia0.C.CaCamao.5aO#vaFaOb#aoa0a0.WaYaw.NaY#s#D.7.n.7a9.7.n.7a9.7a9#D#D#D#D#D#D#D#Dbl#D#Dbl#D#Dbl#D#D#Dbl#D#D#D#D#Dbl#D#D#D#Dbl#D#D#sbl#D.NaYaYaY#xaYaYaY#xaYaYaY#xaYa0a0bmaz#uaOam.C.W.C.C.C.C.W#x.W#xamamamaoam.5aoaF#v.y.0#uaB.wal.2ayal.2aya6aTa6alaR.2ayayaT#P#t.K.e.X.GaSaZaBaFb#amaoa0a0bna0aYaYawblbl#sa9bj.n.7#D.7a9bja9#Dafa9afa9bl.Naw.N#U.CaCaFaoamama0aYaY#D#D#Da9#L.7", +"a9a9.na9.7a9a9a9a9#D#D.N#s#DaY.saY#x.C.Ca0aoamao.0aZaBaZaB.0aBa#amb#a0aCaC.pa0a0aob#ama0am.C.Ca0.5b#amaCam.W.C.CaCa0ao.5amaOaF#vaF.8amamama0aqa0aYaw.Naw#D#Da9.7.n.7a9.7.7af.E#L#Da9#Da9#Da9#Da9#Da9#Da9#Da9#Da9a9a9afa9afa9afa9a9a9a9a9a9a9a9a9bl#D#Dbl.N.NaYaYaY.RawbnaY#x#I#xawa0b##Sazbha##vamaqao.Cavamao.5ao.5.8.8aF#v.0.yaZaB.waza7az.G.G#aararar.X#a.Xar#eazazaralalalayayaya6.Ial.XaSaS#va#aFaO.5aC.CaC#xbnaY.N#M#D#D#D.7a9.7.Ea9.7.7.Eaf#La9#D#D.N.NaYbnbnamamb#aoama0aYawblaY#D#D#D.7", +".7a9.7a9a9a9.Ea9bja9#s.NaYaw.NaYa0.Wa0aCamamao.5a7az.waZa#aFaFaFamamaC#xbn#xam.5amamamaoama0aoa0aOaFaoambgamaCam.8aFaOaFaOaFaF#vaFaFaOb#aoamaCamawaY.Naw#D#D.Ea9.7a9.7.n.7.7a9.7#D#D#D#D#D#D#D#D#D#Dbl#D#Mbl#D#Ma9a9a9a9a9a9a9a9.na9a9.na9a9.na9#D#D#D#DblaY.saYaYaYaY#xaY#xaY#xaYbnaObmazaZ#Sa#.8.8.8.5am.8.5.8a##va#.ybbbb.w#uazarar#a#eazaSaz#ua7aZaZaZaZ.Tbm#SbmbmaZan#uaSaz#aalaR.2.IaGaraSaZaBa#aFaoama0aC.R#IawaYbl#D#D#Da9.7.7a9.7.7a9.7af#L.na9#D#s.N.NaYaCamaoaFamama0aYaYaY#D#D#Dbj#D", +".N.N.N.N#D#D#D#DawaY.Nbf#xaqaqavamamaF#v.0#u.w#e#va#b#.5amamamaF#I#x#x#x#Ia0#x#x#x#I#x#xa0ao.5amamaoaFa#a#aBaZaZ.TaBaZ#SaFaFaF.5ao.5aoam.C.W#x#xaYaY.saY.N#s#D#Dajafaja9a9a9.7a9#Da9bja9#D.7#Da9#Dbl#Dbl#D#Dbl#D#Da9.7a9.7a9a9bja9#Da9#D#D#Dbl.Nbl#Dbl#D#D#Dbl.NaYaYaYaYaYawaYaY.Nbfa0b#bmaBana#bma#bm#u.6#T.oaR.Gararal#aalalal#Taraz.6#uan.0.0b#.8b#aob#aoambgamam.8aoamaO.8aFaBbhaz.Gar.X.X#abhazan.TaZbmbma#aCa0#xaYbfaY#s#D.s.N#D#D#sa9.7.7#s.7.7.7a9a9#D.7#DaYam.5aOa#amambf.N.N#s#D.NaYbf", +"aYaYaY.saY#s#D#D#D.s#x.Wao.8aq.5.yaB#uanaBan#uanaFaOamaob#aoamaobn#x#U.Ca0.C.C.Wbna0a0aoaF.5#va#.ya#.yaBaZaBbh#u#SaBaZaOa#.8aFbg.5aoamaobn.Cbn#x.sbl.NaY#D#Da9#Daf#L#La9.7a9a9.7#D#D#D#D#D#D#D#Dbl#Dbl#DaY#DaY#D#Da9a9.7a9#D.7a9a9a9a9#Dbl#D#D#D#D#D#D#D#D#D#D#DaYaYaYaYaYaYaYaY.N#x#xbgaFaZ#ua#bgaF#vanaz#ealalazazaz.Garaz#q#ebhananaZaZa#a#a#aCama0a0aoa0ama0aqaoamamaFaoam.8a##SaZ#uana7aSbhaBaZaZbmaOaFaOaFb#ambnbn#IaY.NaY#D#D#D#D.7.7b..7#D#Da9.7#s#D.n#D#MaY#Iama#aFaoa0#x.saY#D#Dbl.N#x", +".Nbo.N.N#xbf#xbf#x#Ia0a0aOa#aBaz.GaP.wan.ya#a#a#aCamambgama0a0a0.Wa0.C#xa0a0a0amamaoaFama#a#.0#vaSazbh#uanaBanaZa#aOaFaO.5aOaqamaoama0.C.C#Ibn#IaYaYaw#D#s#D.E.7#Laf#La9a9.7a9a9.7a9.7a9.7a9.7a9#D#D#D#D#Dbl#D#Da9.7#Da9.7a9.7#Da9.na9a9#D#Dbl#Dbl#Dbl#Dbl#D#D#p#D#D#D#D#D#D#D#D.N#DaYa0b##SaBaZamamaF#v.0#u.6.wan#u#uaSananaZaBa##vaFaFaoamamama0a0aCa0bna0#xaCa0a0.Cao.CaoamaoaF.5aOaFaFa#aFaFaF.5aoamaFamaFaob#bga0aobnbn#x#x#M#Dbl#s#Da9.7a9.s#D#D#D.N#DaY.N#Daw#xa0aoaF.5b##IaYaY#DawaYaw#x", +".N.N#Ibf#x.W.C.W.5#v.yaZ.G#z.Kba.o#e.w.0a#a##va#amamaOaFaOaFbgamama0amaoam.8.5.5a#aFaFa#aBan#ubh#a.Xar.Gbh#uaZaBaO.5aoamamaC.C.Wa0a0.W.C#I#x#x#xaY#saY#D#D.7af.7af#L#La9a9.7#D.7#Da9.7a9.7a9bja9a9a9a9a9a9a9a9afa9.7a9.7#L.7a9afa9a9a9a9a9#Da9#D#Dbl#D#D#D#p#D#D#D#D#Dbl#Dbl#Dbl.s.NaY#xa0a#aB.0amamamaFa#a#a#a#aBaZaZaZ#va#.0a#b#b#bgamambn.Cbn.Wa0.C.C.C.Wa0.C.C.C.Wa0.Ca0.Ca0aoamama0a0bn#Ubn.Wa0.Ca0.W.C#U#xb#.Vb#b#a0ama0a0aYaY#D#D#D#s#D#saYaY.s.NaYaw.NawaYaY#Ia0amamaOam.C#x#xaYaw#x#x.C", +".C.W.Caqaq.5.5.5anaP.o.Ya8#obs.g#TaS.wan.0#va##v.0bm.0a#.0a#a#.yamaoaFamaOa#aOa##va##S.0aZ#uaSaz#aaG#a.Gaz#uan#u#vaOam.8aCaq.W.C.C.Wa0#x#x#x#IaYawbl#D#sa9a9#L#Lajaf#L.na9a9.7a9.7a9#D.7#Da9.7a9a9a9af.7afa9.7a9.7af#L#Laf#La9.7afafa9.na9a9bl#Da9.na9a9a9a9a9afa9.na9a9.7a9a9a9.N#D.N#M#xaOaZaBamaOam.8am.8a#.5a##va#aoaFaFamamaoa0a0bnaC#x#x#x#x#I#xaY#xaY#xaY#I#x#x#x#I#x#I#xa0bn#I#xawbl.Nbl.Naw.NaY.NaY#xaYaCa0ao.Vbgb#b#b#awbnaYaYblblaYbl.NawblaY.NaYaYaYawaY#x#Ia0bga#aOamaC.C#xa0.Wa0am", +"aoaFa#aOa##v.y.ya4.2#4.4a8aDaTaRanananaZaBaFaFaF#v.0#v.0#v.0#v.0amb#aob#amam.5aFamaOaFa##v.0.yaZaz.wanazaz.w.w.waO#vao.5aoamaCam.Wa0#x#xaw#xaYaY#D#M#Da9a9.E#L#L#L#Laf.7a9.7#Da9.7a9#L#L#L#L.7#L#L#L#L#L#L#L#La2#La2#L#L#L#L#L#Lafajafafa9a9a9afa9a9a9a9a9afa9a9a9.7a9.7a9a9.7a9.N#D#D#DaYam#SaZaF.5aFamamamamaoaFamamb#amamaoa0a0bnaC#x#x#xaY#IaYaYaYaYaYaYaYaY#xaY#IaYaYaYaYaY.s#xaY#D#D#D.7.n#D#D#D#M#D.N.saY#xa0a0amamambgambnbn#UaY#x#xaY.saY#x.NaYaw#x#I#x#x#I#xa0a0aF#vaZ.5a#amaCa0am#v.5", +"an#uan#uan#ua7#uaz#a.Gaz.GaSaZaZ#vbybca#.5aoamb#.5b#amb#amb#amb#aCama0amamaob#amaCa0a0aoaFaFa#byaOby#v.yaZaB#u#ua##v#S#v.5ao.5aoa0#I#xaY#x#IaYaw#Dbla9#s#L#L#La9#Laf#La9#La9.7a9#L#L.7af.7af#Laf#L#L#L#L#L#L#L#Laf#Lafa2af#L.3#Lafafafafa9afa9a9#Laf#Laf#L#Laf#L#L#L#L#L#L#L#L#L.s#D#s.7#DaCa##ua#.0.5.5amama0a0amaoamaCamaCa0#xbn#x#x#x#xawbfaY.N.N.N.s.N.N.s.Nbl.Nbl.NaY.NaY.Nbl#D#D#s.7.7#D.7a9.n#p#Dbl#DblaY#x#x#xbnbnama0am.Vama0b#aCa0#x#xbn#I#x#x#xbnbn#x.Ca0a0aCam#van.wan#vbyaF#va#.yan", +"alal.Ga7bhaZaZaZa##Sa#aFb#ao.5.8aFaFamama0amamaobn#Ubn#Ua0#Ibn#Ua0a0a0aCa0amamao#x#xaCa0aoamao.5avam.8.8#v.yaB#u#SaBaB#u#S#vaO.8amaCbn#x#I#xawaYbl#sa9a9#La9.7ajafaj#La9#L.7#Da9.7#Laf#L#L#L#L.7a2#ga2a2a2a2a2a2#La2#L#La2#L#L#La2af#Laf.na9a9a9af#Laf#La9af.7af#L#L#L#L#Laj#L#L#D#D.7#s#D.CaBbhbb.y.0aOama0aoa0ama0ama0bnbn#xaYaCbnbn#x#xaYaY.Naw.NaY.NaY.NaY.NaY#DaY#M#Dbl#M#D#Da9.7a9#Dbjb..7afa9.na9bl#DaY.N#Ibf.W#xaC.Ca0amamb#b#a0ama0ama0#xbn#x#U#x#U.C#UamaCama0ao.0.w.6.wan.yan.yan.waP", +"#q.6a#aF.5aCa0a0bnbna0aCa0amb#am#U.Vbnbn#xa0.C#x#x.NaY.NaY.N.N.N#D#s.NaY.NawaY.N#M.s.N#x.C.Wamaq#UaCaCb#bgaOa##vbg#v#v#u.w#uaZ.yaO.5aoama0.RaYaw#D#D.7.n#Laj#L#L#L#La2#La2#La2#g#Laf#L#L#L#La2#La2#L#La2#La2#L#La2af#L.3#Laf#Lafajaf#La2#La2#La2#L#L#Laf#La2#L#L#L#La2#L#Laf#L#La2#La9#D#x#xaoaO.Xbha#ama0#x#x.CaC.Ca0aC.C#x#IbnaYaYawaYaYaYaYaY.N#D#D#D#D#D#D#D#D#D#D#D#D#D#D#D.7.E.7.7.7af.7.7aj#L#L.7.E.N.N.NaY.N.N.N.NaY.NaYbl#IaYbna0aoaFaOamaoamamamaFaF.5b#aOa#a#aZ#u#a.2.waP.w.w.waZan#u", +".GanaB.5a0a0#xaCbn#Ibna0a0a0amam.Va0bnbn#x#x#I.C.NaY.Naw.N#s#D#D#D#D#s#D#D#D#saY#D#DaY.saY#x.W.Cbn#Ua0aCaoamaOaFaob##v#uaB.y#vaOa#aO.5bga0#U#x.R#D#D.n.7.7#Lbp#L#La2#L#g#L#g#La2#L#L#Lafa2a2#La2#L#La2#La2#La2#Lafa2#L#La2#La2#Laf#L#Laf#Laf#L#L#Laf#L#La2#La2#La2af#Lafa2#L.3#L.j#La9#DaY#xa0#v#aa7a#b#a0bn#x.C#x#x#x#x#xbn#x#x#IaYaYaYaYaYawaY#D#D#D#D#D#D#D#D#Da9#D#D#Dbj#Da9a9#La9af.E.7a9#Laf#Laf.7a9#D.N.N.saY.Nbl#DaY#D.NaYaYaY#xa0b#.5aFbga#aFaFbma#.ybm#vaZ#SaBan.G#q.2.w#u.6#uan.y.0.0", +".6#u.0b#a0#x#xa0bnbn#x#xbn#Ibn#x.RawaY#x#I#x#xbfaYaw.N#D#D.7.7.7a9#D#Da9#Da9#D#Da9a9#D#D.N.N#x#x#I#x#Ia0ao.8am.8aCa0bg#v#vaOb#aoaFaOaFama0a0#Ubn#s#D#Da9.E#L#Lajbpa2#ga2a2aja2#gafa2#La2#La2#La2#Laf#La2#L#Laf#La2#Laf#Laf#Laf#L#Laf#L#Laf#La2afa2#La2af#La2#L.3#La2a2#L#L#L#L#La2#La9#s.N#xa0bg.Xana#aFamam.C#xbn#xbn#x#x#x#xbnaYaYaYawaYaYaYaY#Da9#Da9#Da9#Da9.7#D.7a9.7a9a9.7.7.7.7.7a9#L.7.n#L#Laja9a9#D.saY#D.N#D#D#D#D.saY#DaYaYa0a0amb#aFbm#SbmaBaB#ubha7aB#u#uazaz#Tal#q#uanaB.0a#.0a##u", +"azaBa#aobn#x#x#x#x#x#Ibn#xaY#xaYaYaYaYaY.NaY.NaY#D#D#D#D#D.7a9.7#sa9a9bja9.7#D.Ea9bj.n#D#D.NaY.N#MaYaY#Ia0aoaoam#IaCa0ao.5ao.CaCbg.5b#aoa0aC#xa0aYaY#s.7a9#Lbp#La2bpa2#L#g#L#ga2#Laf#L#La2#La2#La2#La2#La2#La2#Lafa2#Laf#L#L#L.3aj#L#La2ajaf#L#La2#L#La2#La2#La2#La2#La2a2a2afa2#La2#L#DblaY#IamazaSaBaFama0#x.C#xaY#xaY#x#U#x#xaYaYaYaYaYaYaY#D#D#D#Dbj#D#Dbj#Da9a9a9.7a9a9bja9.7afa9aja9.7af.7#Lafa9a9#D#D#D#D#D#D#D#D#D#D#D.NaY#I#xbnaoamam.5a#bma#aZaZaZaZ#uaZanaz#q#TaR.o#q#uaB.0a#.0#uaZ#u", +"an#vb#a0#x#x#xaYaYblaYaYaYaYaYaYaYaYaYblaY.N.N.sbl#D#Da9#D.7a9#L#D.7#sa9.7a9.7#Da9a9#Da9a9#s#D.Naw#Daw#xaCa0.C#x#U#xaCaoaCa0#Ibna0a0aoa0aCa0a0#UaY#M#D#Da9.7#L.7a2a2#ga2a2#ga2#g#La2#La2#La2#La2#La2#La2#Laf#L#Laf#Lafaj#Laf#L#Lafa2af#L#La2#Lafa2#Laf#La2#La2#La2#La2#L#La2#L#La2#Laj#Dbl.NaY#UaZ.TaBaFam.C.C#xaYaYaYaYaYaY#x#xawaYaYaYaYaY#Dbl#D.Ea9a9.7a9a9.7#D.7#Da9bja9.7a9a9.n.7a9a9a9.na9a9a9a9.na9a9a9#D#D#D#D#D.7#D#D#DaY#x#x#xbna0aCamaFaOa#bma#bmaBaZaZaB.6.Gal.o#e.GazanaBaZ#u#u#uan", +"#vaFama0awbnaYaYaY.NaY#D#DaY#D#M#Dbl#s#D#D#s#D#D#Dbl#D.n#Daf.E.7a9a9.7a9a9a9a9a9.7a9.7a9.7a9a9a9#D.n#D.N#x#I#I.W.C#I.Caoam#U#xaw#Ia0#I#x#x#I#x#IaYaY#Dblbja9a9#L#La2bpa2bpa2#La2#Laf#Laf#La2#La2af#L#La2#La2afa2#Laf#L#Lafaj#Laf#L#L#La2#Laf#La2#L#La2#La2#La2#L#La2#La2#L#La2#L#L#Lafa9#sblaY#xb#bm#SaFambn#xaYaYaYaYaYaYaYaYaYaYaYaYawaYaY#Dbl.7a9bja9.7a9bja9#L#L#La9.7a9a9.7a9.7a9a9.7a9.7a9a9a9a9a9a9a9a9a9#D#Da9#D#Da9#Da9.N.NaYaY#x#x#xaYa0ama0am.5aF.5a##vaZan#TaR.Gazana7.wan#uaZan#uaZ", +"b#a0#xaYaYaYaY#x#DaY#D#D#M#Da9a9#D#D#D#D#Da9#D#p#Da9#D.7a9.7#L#La9a9a9.7#L#L.7a9.na9a9.7af#L#L#L#La9.7#s.N#I#x#x.C.CaCa0.W.W#xawaYawaYawaY.NaYaYaYawaY#sbl.7#D.7#L.ja2#ga2#ga2#g#La2#La2#Laf#L#L#La2af#L#L#L#Laf#Lajaf#Laf#Laf#Lajafaf#Laf#L#La2#Laf#Lafa2#La2#La2#L#L#L.3#Laf#La2#L#La9a9#D#MaY.b#yaFbgam#x.N#saYaYaYaYaYaYaYaYaYaYaYaYaYaY#Dbla9.7#L#L.7#L#L#L.7af#La9#La9#La9afafafafa9a9a9a9a9.na9a9a9.n#pa9.n.7a9.7a9.7a9.7#D#D#D#s#DblaYblaY#x#xaCa0aCa0amaOaZ#u#q.G.6#uaBana7azaZaZaZaZa#", +"a0a0a0aYblaYaY#xaYaY#Dbl#Da9a9af.7.7#Da9a9a9a9a9a9a9.n#Da9.7#L#L#La9.7af#L#Lafa9.7a9#L#Lajafa2aj#L.7.n#D.N#xbo#I#x.Waq.8aoa0#I.Nawbl#sbl#DaY#saYawaYaYbl#D#Da9a9#L#Lbpa2#L#g#La2#Laf#Laf#La2#L.3#Laf#L#Lafaf#Laf#Laf#L#Laf#L#Lafaf#L#Laf#Laf#Lafa2#La2#L#La2#Laf#L#L.3#L#L#L#L#L#L#L#L.na9a9blblbn#Hbga0#xaYaYa9blaYblaYblaYblaYaYawaYaYaYaYbl#Da9a9a9a9a9a9a9a9#L#L#L.7a9.7a9a9#La9a9a9a9af.nafa9#pa9#pa9#pa9a9#Da9#D.7#Da9bja9a9.7a9a9a9#D#Dbl#D#saYaY#x.Cbn.WaF#San.Ga4aZa#a#aZ#uanaZaBa#bma#", +"bnaYaYawaYaY#M.N#D#D#D#D#D#D#Da9a9#D.nbja9.7a9.7a9.7.7a9#La9a9a9.7a9#L#L.7af.7a9#Laf#Lafa9.7a9a9#L.7#La9a9#DaY#Ua0#UaCa0#I#x#I#I.N#s#D#D#sa9#D#Da9#D#s#D#Daw#DaYajaf#L#L#Laf#L#La2a2a2#La2#La2#L#La2a2a2a2bpaj#Lajaf#Lajaf#Lajafaja9ajafajaf#L#Lafafafafa2#L#L#La2#L#L#L.3#L.3#L#La2#L#Lafa9.na9aYbnb#b#am.C.NaWa9bj#D#Dbj#D.N.NaYaY#DawaY#DaY#D#D.7a9.7a9.7a9a9#Laf#Laf#Laf#L#Lafafaf#La9#D#D#D#L#Lafajaf#Laf#L#L#L#L#L#L.7.7.7a9a9.7a9#D#D#D#DaYaY.N#x#Ia0.Ca0aF#vaF#vaOb#aob#aoaFaBaZ.0a#.5am", +"#U#x.RaYaYaYbl#D#D#D#D#s#D#Da9#D#D.7#Da9.7a9bja9.7a9af.7a9a9.7a9af.7a9af#L#L#La9a2afaj#L#La9.7a9aj#L#La9.nblaYaY#Ia0aC.W#x#I.N.s#D#s#D.n#D#D#D#sa9a9a9#Dbl#D#D.Na9a9a9a9a9#La9#L#Laf#Laf#Laf#Laf#Laj#L.7aj#L#L.7afajafaf#Laf#Laf#Laf#L#Laf#L#Lafafafaf#Lafa2#L#L#L#La2af#L#L#L#La2a2af#L#La9bja9.Rawa0.8a0.C.Nbj#Da9a9#Da9#D#DaY#DaYbl.Nblaw#Dbl#D.7a9a9.7a9a9bjaf#Lajaf#L#Laf#Lafafafa9a9#Da9#D#Laf#Laf#L#L#Lafaj#L#L.7#L.7af.7#La9a9.7#D#D#D#D#D.NaY#x#x.C.CaoaFaFaOaOamamamamaCaF#v#v.0#vb#am", +"bnbnawaYaYaY#Dbl.n#D#D#Da9bja9bj.n#D.7a9#D.7a9a9a9.7a9a9#La9a9a9#L#L#L#L#Laf#L#La2a2a2af#La9a9a9#L#Laf.7a9#D#IaY#UbnaC#xaY.N.saY.s#D#Db.#D.n#D.7a9a9#Da9#D#D#D#Da9bja9#Da9#Da9#Da9a9a9a9a9a9a9a9#Laf#L#Lafafajaf#La9#Lajaf#Lajaf.7#Laf#L#Lajaf#Lajafaf.3#L#L#L#Laf#Laf#La2a2#La2#La2#La2af.Ea9.naY#xaCamam#x.Nbj#s.7#D#D#D#Dbj#D#Dbl#Dbl.Nbl#Dbla9a9a9a9a9a9a9a9afafafafajafafajafaf.na9a9a9#D#D#Lajaf#L#Lafa2#L#Laf#L#L#La9.7a9a9.7a9a9#Da9#D#D#D#MaY#x#x.CaCa0aFaOaFamaFaCa0a0bnaCb#aOaFaOama0", +"#IaYaYaYawaYaw#D#D#D#s#D#sa9#sa9.7a9a9a9.7a9#L.7#La9af.7a9a9.Ea9afaj#Laf#L#La2#La2a2a2#La2#La9#L#L#Laja9a9blaYaY#I#U#xaw.Naw#D#Da9#sa9#sa9.7a9.7ajaf.Ea9a9.7a9#D#D#D#D#Dbj#D#D#Da9#D#D#D#sbl#D#sa9a9a9a9a9#Da9#Dafajafaf.Eaf.7afajaf#Lajafaf#Lafafafajaf#Laf#L#L#Laf#L#L#Lafa2#La2a2af#L#La9a9a9aw#x.Vaoa0#x.Nbja9#D#D.7#D#D#D#Dbl#DaY#DblaYaY.Na9a9a9a9a9.7a9a9#La9afa9afa9af#pafa9#pa9a9a9.7a9#Laf#Laf#L#L#L#Laf#L#Laf.7a9#D.7a9.7a9.7#D#Dbj#Dbl.NaY#x#I.Ca0aqbgaFamaoambn.Cbn#U#xbna0aCama0a0", +"aYaY#IaYbl.N.N#D#s#D#D#D#D#D#Da9a9a9.7a9a9a9a9#Laf#L#Laf#L#Laf#L#Lafa2a2a2a2a2a2a2a2a2a2a2#L#Lafa2#L#La9a9#DaY#Ubn#I#xaYaw#D#s.sa9bj.n#Da9.Ea9.7#L.7#L#L.7a9.7#L#Da9#Da9#Da9#Da9#Dbl#Dbl#D#Dbl#Dbl#s#D.na9#s#D#Ma9a9.n#Laf#Lajaf#Laf#Laf#L#Lafajafafafaf#Laf#L#L#La2#L.3#L#L#Lafa2a2#L#Lafa9.na9#Dawa0bga0#x.N#s#Da9#D#D#D#D#D#D.Nbl#DaYaYaYawaYa9.na9#La9afa9afa9a9a9a9a9a9a9a9a9#pa9a9a9a9a9a9#L#Lafaj#L.3#La2afafa2af#La9a9a9afa9.7a9#D#D#D#D#DaY.N#x#xa0a0aoaFbgama0a0a0aCa0aYaY.baYbnbnaC#x", +"aYaYblbl#D#Da9.7a9a9a9a9.na9a9.7ajafaj#L#L#La2#L#L#L#L#Lafaj#Lafa2a2#L.j#La2#La2a2a2a2#La2af#L#L#L#L#L#La9#MaYaY#Ibn#MaY#D.s#D#s.7.na9.Ea9.7aj#La2aj#L#Laj#L#L.7.7a9.7.7a9.7a9.7#M#Dbl#MblblaYbl.sbl#Dbl#D#Dbl#Daf.Ea9af.Eafa9af#Lafaj#L#Laf#Lafafafafafaf#Laj#L#Laf#L#La2afa2#La2#L.3#L#L.7#Da9#DaYaCama0#Ibla9#Dbj#D#Da9#D#D.N#MaY#DblawaYaYaY#pa9a9a9#pa9a9a9afa9afa9#p.na9a9#Mbla9a9a9#La9.7afaj#Laf#L#Laf#Laf#Laf.7afa9afa9a9.7a9#D.7#D#D#D#Dblaw#x#x.WamamaOb#aOa0aC.Cbn.C#U.RaYaY.b#xbna0", +"aYaY#D#D#D#s.7.7a9.7a9.7a9a9.7a9#Laf#Laf#Laf#Lafa2a2a2a2#La2a2aja2a2.3a2a2a2a2a2aaaaa2a2a2a2a2#La2#L#La9a9#DaY#I.RaYaw#D#M#D#s#D.n.7a9.n#L.7af#La2a2a2#La2#L#L#La9a9.7a9a9.7a9a9a9#pa9a9a9.n#pblaYaY#IaY#IaYaw#x.na9af#Laf#Laj#Laf#La9afajaf#L#Lafafafaj#Laf#L#Lafa2#L.3#L#L#L#La2a2#L#Laf.na9.n#D.NbnaCaobn#D#s#D.n#D#D#D.N.NaY#DaY#Dbl.NaYaYaw#D#pa9#p.n#pa9#pa9a9.n#pa9#pa9#pa9#D#pa9afafajaf#Laf#L#Laf#L#Laj.3af.3afafa9a9a9.7a9.7a9#D#D#D#D.NaY.N#xa0ama0aob#ama0a0a0bn#Ibna0#x.bbnaY#Uamam", +"#MaY#s#D#D.7#La9#L.7.na9a9.7a9a9#L#L#L#La2#La2#La2a2a2aja2#La2afa2aja2#La2a2a2a2#gaaa2a2a2a2a2a2a2#L#La9a9blaYaYaY#MaY#M.N#D.n#D.na9.n.7#L.E#L#L.ja2a2a2#g#L#L#L#Lajaf#Lajaf#L#La9a9#pa9#pbla9.naYawaYaYaY.RaYaY.na9.na9aj.7af.n#Lafaj#Laf#Lajafafajafafaf#L#L#L#Laf#L#La2afa2af#L#La2af#L.7a9a9.7aw#xaCa0#IaYa9#D#D#D#D#D.NaY.saY#Dbl#DaYaYaYaY.na9#pa9a9#p.na9af#p#pa9a9a9#pa9#Dbl#Da9.na9#L#Laf#L#Lafajaf#Lafafafafafafafa9a9afa9a9bja9bj#D#D#D#DaY#x.Wa0av.5.pamaCa0#Ua0#x#xa0bnaYaw.R.Cb#am", +"amam#xbla9a9a9a9a9a9.7a9.7afa2#Laf#Laf#La2#La2#La2a2a2a2a2a2a2a2#Laf#Laf#La2#L.3a2a2a2a2asa2#La2#gafa9blaYawaYaYawbn#IaYawaw#D#Da9.Ea9#Lafaf#L#L#L#La2a2a2a2a2a2a2a2#La2af#L#Lafajaf#L.na9bja9#D#p#pbl#M#x#Ia0bn#I.NaY#D#Da9a9.7af.Eafa9aja9#Lafa9a9a9a9#Lafa9afajafafafaf#Lafafa2.ja2afajaf#L.na2a9aY.Cbgam#x#Ma9.n#Lajafa9.N.N#pa9bl.N#MaYaYaY#p#pa9#pa9#pa9#p#pa9#p.n#p#p.n#pa9#pa9a9#paf#pa9a9.n#pafafafafafafafa9afa9afa9a9.na9a9a9a9a9#D#D.n#paYaYa0amb#amb#a0a0a0.Ca0#I#xaw#xaY#x#xaCa0aC", +"ama0#xbla9.na9a9bja9#Da9a9ajaf#La2aj#Lafa2#La2#La2a2#La2#La2#La2af#Lafa2#Laf#L#La2a2a2asa2a2a2a2a2#La9blaYaYaYawaYaY#xawaY.N#s#Daja9#Lafajaf#Laf#L.j#La2#La2#La2#La2#La2#L#L#L#L#L#Laf.7a9#D.n#Da9.nblblaYaY#xaC#x#IaY.s#D#sa9.na9a9a9a9a9a9a9a9a9afa9afa9a9#La9afafaj#Lafaf#Lafa2#La2#Lafafaj#La2.naw.CamaC#xaY#D#D#La9a9#sbl.Na9#M#DblaYaYaY#xbla9#p#pa9#pa9#pa9#pa9#p#pa9#p#p#pa9.n#pa9a9a9af#pafa9afa9a9afa9#La9af.7afa9afafa9afa9a9.na9#Dbl#p#pblbn#U.5bg.5a0aoa0a0#Ua0#xbnaYaYaY#U#xbn#xa0", +"amaCaYaYaw#Dbl#sa9#D.7a9.7af#L#Lafaf#L#La2#La2#La2a2a2a2a2a2a2a2#L#L#Lafaja2#L.3a2a2a2#La2a2a2a2#ga9#D#MaYaY#UaY#xaw#Ibl.Naw#D#Dafafaja9#L#Laf#La2#La2a2a2a2a2a2a2.jafa2#Laf#Laf#Laf#La9a9.7#Da9a9a9#sblawaY#x#x#IaY.NaY#D#D#D#D#sbl#s#D#sa9a9.na9.na9a9.nafa9afafafafafafafajafa2#L.3#L#Laja9#Daj#DaY.Ca0aoa0aY#D#Ma9.na9#D#DaYblblblaYaYaYaYaYbl#pa9#pa9#pa9#pa9#p#Ma9bl#p#D#pa9a9#pa9#pa9#pa9#pa9#pa9#paf#pa9afa9afa9afa9afa9a9a9a9a9a9a9#Da9bla9awaYa0a0ama0b#a0a0a0#x#U#x#xaw#xaw#xbn#I#xa0", +"b#b#aCaYaYbl#Dblbja9#D.na9#Lajaf#L#L#Lafa2#La2#La2a2#La2#La2#La2afafaj#L#Laf#L#La2#La2a2a2a2#La2#La9blaYbnbn.R#IaY#U#xaYaw.N#D#s#L.Eaf#Lafaj#L#L#La2#La2#La2#La2afa2a2a2#L#L#L#Lafajaf.7.n#Da9b.afa9a9a9#DaY#I#x.NaY#saY#s#D#s#DaYaYaYblaY#DaY#Dbla9a9a9a9a9a9a9.na9a9.na9a9a9a9#La2aj#Lafa9a9a9af#Mawa0aCa0a0bn.NaYbl#D#M#DaY.NaYaYaYawaYaYawaYbl.na9#pa9#pa9#pblbla9#p#pa9#p.na9#pa9.n#pafa9af.naf#pajafafafafa9a9a9afa9af.7afaf.nafa9a9af#D#DblblaYaY#xaCa0.Ca0aobnaCbn#xawaYaY.RaYaYaY#xbn#x", +"a0bnbnbnaYaYbl#D.n#D#sa9a9#Laf#L#L.3#L#L#La2#Lafa2a2a2a2a2a2a2a2#L#Lafaf#L#La2#L#La2#L#L#La2#L#Laf.nblaY.bbn#U#x#Ubn#Ibl.NaYa9.7a9afaja9#Lafaf#La2a2aja2a2a2a2a2a2a2a2a2af#Laf#L#L#L#La9a9.7#Da9#Laja9#D#D.NaYaY#s#D#D#DaY.NaY.saY.saY.NblaY#DaY#sbl#sbla9#Da9#Da9a9.na9a9afa9ajafaf#Lafa9a9#D#sa9blaY#Ua0aob#aC#xaYaw#D#DblaY#IaYawaYaYaYaYaYaYbl#pbla9#pa9#pa9bl#M#p#D#p#M#p#pa9#pa9#pa9a9#pa9#p#pa9#p#pafafaf.nafa9a9#La9afafa9afa9a9afa9#Da9bl.NaYawbn#x#x#x#Ubna0#xbnaY#xaYawaYaw#xawaY#x#U", +"#Ubn#Uam#UaYaYbl#Da9bja9a9#L#Laf#L#Laf#Laf#La2#La2a2#La2#La2#La2af#L#L#L#Laf#La2af#L#La2#L#La2#Lafa9bl.Ra0.pa0bn#U#xawaY#M.N#s.7.na9#Lafaj#L#Lafa2a2a2a2#La2#La2a2a2a2a2#L#L#L#Laf#Laf.7a9#D.7#Dafaf#L.na9#Daw.N.n#D#D#s#Daw#DaYaYaYaYawaYaYawbla9bla9bla9.n#D#Ma9a9a9#Da9#sa9#p#Laf#La9.7.n#D#D#DaYawa0a0aob#amaCa0aYaYaY#DaY#xaYaYaYaYaYbl#Dbl#p#pa9#pa9#pa9#p#pbl#p#pa9#pa9bl#p.na9a9#pa9#pa9af#pafa9af.na9afa9a9aja9a9afa9#Laf.7afa9.7afbl#D#D#DaYaYaY#xaY#xa0bnbn#U.RawaY.baYaYblaY.R#IaYaY", +".Rbnb#a0a0#xaYbl#s#D#sa9.Eaf#L#La2#Laj#La2a2#L#La2a2a2a2a2a2a2a2#La2afa2afa2#Laf.7af#La9a9#Lafa9a9a9.R.Ra0.V#UbnaYaYaY#D#D#D#D.7afajaf.Eafaf#L#La2#La2#La2a2a2a2a2a2#La2#L.3.7#Lafaj#La9a9.n#Da9#Laj.7a9.7#D.N.Na9.n#D#DaY.NaY.sbl#Mblbl#Dbl#Dbl#D#Dbl#s#Dbl#Dbla9#Da9.nbla9a9#Dajaf.na9#D#D#D#sblawaY#x#Ub#b#aO.5a0aCaYaYawaY#x#xaYaYaY.sblbl.na9#pa9#pa9#pa9#pblbla9#M#p#Dblbl.n#p#p.na9#p.n#p.na9#pa9#pa9af#pa9afa9a9af#Laf#Lafafa9afa9a9#Da9bl#D#M.NaY.Naw#x#UbnbnaYaYaY#xaYbl#MblaYaYaYaY#I", +"#Fbn.Vaoa0bnaYblbja9#Da9a9#Lajaf#Laf#Laf#L#L.3#La2a2#La2#La2#La2af#L#L#L#Lafaj#La9#L#La9a9#L#Lafa9blaw.R#Ua0bnbn#IaYaw#D#s#Da9#s#La9#Laf#L#L#L#La2a2a2.j#L#La2#La2a2a2a2#L#Laf#L#Laf#Laf.7#D.7#s#L#L#La9.7#D.sbf.n#Da9#Daw#DaY.N#pbl#M#D#p.n#pa9#sbl#D#D#Dbl#D#D.na9#Dbl.n#Da9a9af#La9.7a9#s#DaYaY#x.baYbnaoamaFaFaoa0#IbnaYaY.R#x#xaYaYbl#Da9#pa9#pa9#pa9#pbla9#M#pa9#pa9#p#Mbl#pa9a9a9#pa9a9#pa9#paf.naf#pafafa9a9a9afa9af.7afa9#L#La9a9af#D#D#D#DaY#D#DaY.NaYbnbn#U#x.baYaYaw#paY#D#MaY#IaYaY", +"blaw#xa0ambn#xaYawblbl#D#pa9afafa2a2a2a2a2a2#La2#L#La2#La2#La2#La2a2a2afa2#La9a9a9a9a9#D#D#D#D#D#pbl#paY.Rbn#I#x#pa9a9a9a9.7.7a9afajaf.n#Laf#L#L#L#L#La2a2a2#ga2a2bpa2#L#L#L#L.7af#Laf.7a9a9a9#Da9a9#sa9#D#D#D.Na9a9a9#sbl#D#Ma9bl#Dblbl#Dblblbla9a9a9afa9a9a9a9a9a9afa9a9a9a9.nafa9a9.na9a9#D.naY.RaYbna0a0b#aobgb#bg.Va0aCaY#D#Mbl#Mbl#Dblbl#Dbl#Dbl#Dbl#Dblbla9#pbla9#p#pa9#p#p#p#p#p#pa9#pa9#p#p#p#pa9a9afa9aja9afaf#Lafaf#La9afa9#Lafa9a9af#sa9#Dbl#DaYbl.N#UbnbnbnaYaY#IaYaY#MaY#xaYaYaYaY", +"aYaYbn.Ca0a0#I#xaYaYblbl.naf#Lafaja2#La2#La2a2a2#La2#La2#La2#La2a2a2#L#L#L#L#L#Lafa9af#D#p#Dbl#D#F.nblblaYaYaYaYa9.n.7a9a9.7a9.7afafaf#L#L#L#L#La2#ga2#ga2bpa2#L#ga2a2#L#L#L#L#L#Laj#Laf.7a9bja9.7#D.7#D#D#D.Naw#D#M#D#p#D#p#D#Dbl#sbl#Dblbl#Dbla9.na9.naf#paja9afa9.na9a9afa9a9afajafa9a9a9blblaYawaY#Ua0aC.5am.V.Vb#ama0aYaY#xblaY#DaYbl#M#Dbl#Dbla9bla9bla9bl#D#p.n#pbla9bl#p#p.na9#p.na9#p.na9bl.na9afa9a9a9a9afa9#La9af.7afa9a9#Laf#Lafa9a9a9a9a9#D#DaY#saYbnbn#U#x#UaYaYaYaYaYaYawaYaYaY#x", +"aY#xbna0a0a0a0bnaYaY#Mbla9a9a9af#L#Laf#L#L#L#Lafa2#La2#La2#La2a2#La2afa2af#L.7#La9a9#D#D#D#D#DaY#pblbl#MaYaYbl.Na9a9a9.7a9#L.Eaf.naf#Laf#L#L#L#La2a2bpa2#ga2#ga2a2#L#L#L#L.7a9a9a9a9afa9a9#D#D#sa9.nbl#DaYblaYaYbl#D#D#D#M#Dbl#sblbl#Dbl#sbl#D#Ma9a9a9a9a9a9a9a9a9a9a9a9.na9a9a9.n#pa9a9#D#sbl#saYaY.RaY#xa0a0aCa0#Ua0aCbnaYaYawbl#sbl#M#Dblbl#D#pa9a9a9a9a9a9a9#p#p#D#p.n#pa9.n#p#p#pbl#pa9a9#p#pa9#p#pa9a9afa9af#Lafaf#Lafaf#La9a9afa9af#La9afa9a9bl#D#p#DaY#DbnaCbnbnaYaY#IaYaYaw#xaYaYbn#I.R", +".Raw#xa0aC.Ca0a0.baYaYblbla9a9af#Laf#L#La2afa2#L#La2#Lafa2#La2a2a2a2a2#L#L#Laf#L#D#p#Dbl#DblaYaY#pblblbl#Dbl#D#Dafa9af#L#La9#L.7afaf#Lajaf#L#L#L#L#ga2a2#La2bpa2#L#L#Laf#La9.7#Da9a9a9#D#Dbl#DaYblblaYaYaYawaYaY#xawaYaYaYaYaYaYaYaYaYaYaY.NblaYa9a9#pa9a9#pa9#p.n#Da9a9a9#Da9#D#pa9bl.na9blaYblblaYaY#IaYbnbna0#Ua0b#b#a0aYaYblblbl.Nblbl#Dbl#Da9a9afa9afa9afa9#Ma9#pa9#pbl#pbl#p#p#pa9#pa9#pa9a9bl#p.na9a9a9a9#La9af.7afa9#La9afa9a9af.7afafafa9a9a9#D#D#DblaYbnbn#Ibn#IaY.RawaYaYaYaYaYaY#x#x", +"bnbnbnbna0a0a0amaYaYaYaY#D.na9a9afa9afa9#L#L#Laf#L#L#La2#La2#L#La2#L#Laf#L#L#Laf#D#Dbl#DblaYaYaYa9.nblbl#D#D#Dblafaf#L#L#L#L#L#L.naf#Laf#L#L#L#L#ga2bpa2#ga2a2#gaf.3af.7afa9a9.n#D#Dbl#sblbl.NaYaYaYaYawaY#x#xaYaYaYaYaYawaYawaYaYawaYawaYblaYblblbl#Dbl#M#Dblbl#Dbl#D#Dbl#s#Dbl.n#pa9blawblawaYaw.RaY.RaY#U#xbn#UbnaCaOama0aYbl#Dbl#Mbl.Nblbl#Da9.na9a9a9a9a9a9a9#pbl#pa9#pa9#p#p#p#M#p#p.n#pa9.n#pa9#pa9a9afa9#Lafa9afa9#Lafafa9afafa9af#La9#La9af#Dbl#Daw.NawbnbnbnbnaYaY#xaYbn.baY.RaY#xbnbn", +"ama0bna0#Uambgb#aY.RawaYbl#Da9a9a9.7a9.7a9af.7#L#La2af#Laf#L#L#La2a2#La2#Laf#L.7#pblblaYaYblaYaYblblbl#Da9a9a9.7afajaf#L.3#L#L#L#Lafaf#L#L#L#L#L#L#ga2a2bpa2bpa2#La9#Lafa9af#D#D#Dbl#DaYaYaw#xaYaYawaYaY#xbnbnaYawaYaYaYaYbnaYaYaY.RaY.RaY.baYawbl#Mblblblbl#Mblbl#D#D#M#Dbl#D#D#pbl#MblblaYaYaY.RaYaYawbnaYbnawaYaYa0aO.Fa0#x.R#Dbl.Nbl#Mbl#sbla9a9a9a9afafafaf#p#p.na9bl.nbl#p.n#p#pa9#pa9a9#p#pbl#pa9a9a9a9a9#La9afa9a9afa9#Laf#La9afa9af#Lafa9a9#D#Dbl#DblaYbna0#Ubn#I.RawaYawaYaYaY#UbnaCbn", +".Va0bna0.V.Vb#.5bn#xaYaYaY#Da9a9a9#La9#La9#L#Laf#L#L#La2#La2afa2#La2#Laf#La9a9a9blaY#MaYaYaYaYaYbl#Dbl#Dafa9#L#Lafa2a2a2a2a2#L#Lafaj#Laf#L#L#L#La2a2bpa2#ga2a2#gafafafa9a9a9bl#pbl#DblaYaYaYaY#xaY.Rbnbn#Ua0a0a0aYaYaYaYaYaYaY#U.R.b.R.R#U.Rbn.RaYaYawblaYblaYbl.N#MaY#DaYblaYbl#sblblblawblaYaYawbnaY.RaYaw.RaY#IbnaCb#aOb#.Vbn#DblblawaYblbl#Da9a9a9a9.7a9.7a9#D#pbl#p#p#pa9#p#p#p#pbla9#pa9a9#pa9.n#pa9.na9a9afafa9a9afa9#Laf.7af#La9afa9#Lafa9a9a9bl#s#DaY#sbnbnbnbnaYaY#x.Rbnbnbnbnbn#xa0a0", +"a0.Vbn.bbna0b#b##UbnaYaY#D#Ma9a9.Ea9a9a9.7a9.7#Lafa2a2#La2af#L#La2a2#L#L#Laf.7.7blblaYblaYaYaYaY#DaYa9a9a9#La2#La2a2#La2#L#ga2#Lafafafa2#L#L#L#L#L#ga2#g#La2bpa2afafa9af#p#Da9#D#DaY#D#DaYaYaY#x.RaYaYbnbna0a0a0aYaYaY.RaY#UaYaYaYaYaYaYaYaYaYaYawblaYaYaYblaYblaYbl.NblaY#s.Nblblbl#MblaYawaYaY.Raw.RawaY.b#x.baY#xa0aob#bga0bnbl#sblaYaYbl#sbla9.n.7a9.n.7a9a9#pa9#pa9#p#D#pbl#p#p.na9#p.na9#p.n#pbl#pa9a9a9af.7a9afa9.na9a9afaf#Lafa9afa9af#La9.nbl#D#D#DblaYbnbn#UaYaYaYawaY.RaY.Rawbnbna0a0", +"aYaYaYaYaYaY.N#xaYaYawbnaYaYaYaYbl#Dafa9afa9.7#L#L#L#L#L#L#L#L#L.3a2afafa9#D#DaY.R.R#x.RaYawaYaYa9.7a9#L#L#Lafa2a2a2a2a2#g#L#L#Lafafajafafa2#L#L#L#L.7#L#L#L#L#L#L#L#Laf.7#La9a9a9.7a9#D#D#D#D#Dblbl#IaY#xaY#xaYaYaYaYawaYaYaYaYaYawaYaYawaYaYaw#Fbl#M#FblaYaYaY.R.R.R.R.R.R.R.RawaYaYaYaYaYaYawaYbl.NaYaYaYbn#Ibn.baY#Ua0aOb#.Vbg#HaY.bbla9a9.na9a9a9a9.7a9a9.Ea9#p.na9a9.n#pa9#pbl#p#pa9#p#pa9#p#pa9#pa9#pa9a9#pa9.na9afafaf#L#Laf#L#L#L#L#Lafa9a9a9#pblbl.Nbl#x.R#xaY.R#x#xaYaw.RaYaYaYaYaY#D", +"aYblaYaYaY#IaY.NblawaYaYaYaYaYaY#Dbla9a9a9a9a9#L#L#L#L#L#L#L#L#L#Laf#Lafa9#Dbl.N.R.Raw.RaYaYaYaY.7#Da9.7af#La2#La2#ga2#ga2#L#L#Lafafafaf#L#L#L#L.7#L#L#L#L.7#L.7a2a2#L#Laf#La9bja9#D.7#D#D#D#D#D#D#DaYaYaYaYaY#xaYaYaYaYaYaYaYaw#xaY#xaYaYawaYaYbl#FblaY#MaYblaw.R.b.R#MaY#FaY#FaYaYaYblaY#MaYaYblawaY.RawaYawaYbnaY#Ibnao#SaBaF.p#H#U.RaY#Ma9#Da9a9.7a9a9a9a9a9a9a9a9#pa9#pa9.na9#pa9a9#pa9#pa9#p#D#p#s#pa9a9afa9af#pafafafafaf#L#L#Lafaj#Lafaja9#pa9a9#Dbl#DblaY#UaYaYaw#x#xbnaYblaw.RaYaY#Dbl", +"blaYblaYaY#D.NaY#pblblaY.RaYaYaYbl#Dbl#Da9a9.7a9#L#L#L#L#L#Laf#Laf.nafa9#D#DaYaYbn.RbnaYaY.R#xaYa9.7a9#L#L#La2#La2a2#g#L#L#L#L.7afajafaf#Laf#L#L#L#L#L#L#L#L#L#La2#La2a2#L#L#L#L#L#La9.7#Da9bj#DblblaYaYaYaYaYaYbl#Dbl#D#Dbl#Dblbl#Mbl#MaYblaY#Mbl.nbl#pa9aYblaYblaYaYaY.RawaYaY#M#F#M#Fbl#F#F#M#p#p#p#MblaYaYaY#UbnbnaCam#SaBbm#H.p.p.RaYaYbla9.na9a9.na9a9a9a9a9#pa9a9#pa9#pa9#pbla9#pa9#pa9#pa9#p#p#pa9#pa9#pa9#pa9a9afafafaf.3afajafafafafafa9.n#pa9#p#Dbl.N.RbnaY.RaYbnaY#x.b.RaYaYblbl#Dbl", +"#DblblaY#Dbl#D#Dbl#DawaYaYawaYaYaYaYbl#Dbl#D#Da9#Da9#Da9#Da9.7a9a9#p#Dbl#DaYaYaw.R.RaYbnaYaY#xaY#D#Da9.7#L#L#L#La2#ga2#L#L#L.7afafafafafaj#L#L#L#L#L#L#La2#L#L#La2a2a2#La2#L.7#La9#L.7a9.7#D#D#D.N#Dbl.sbl#D#Dbl#D#D#D#Dbl#D#D#Da9#D#D#Da9#D.n#D#pa9#pa9a9blblblblaYblblblblblbl#p#Fbl#p#pbl#pbl#p#M#pblbl#Faw#FbnbnaCamaCaF#SaZ#Hb#bgbnaw.Raw#Da9a9a9a9a9a9.na9afa9a9#p.na9a9#p.na9#pa9#pa9#pa9#M#p#D#p.na9a9a9af#pajafafafafaf#Lafa9afa9a9afaf#paf#p.n#Dbl#DblbnaYbn#Ubn#x#U#xbn.baYblaY#DaY#D", +"blblaY#DaY#D#D#Dbl#Dbl#DblaYaYaYaYaYaYaY#M#Dbla9#D#D#D#D#D#D#D#Dbl#Dbl#DaYaYaYaYbn.R#U.RaY.R#xaY.7a9.7#Laf#La2#La2a2#L#L#L#La9.7afafafaf#Laf#L#La2#g#L#g#L#ga2a2a2a2#La2a2#La2#L#L#Laf.7a9a9#Da9#DblaYaYbl.Nbl#Da9a9a9a9a9a9a9a9.na9.na9a9.na9a9ajafa9.na9a9.na9blblbl#Dblblblbl#M#p#p#p#p#p.n#p#p#p#p#M#pblbl#MbnbnbnaCa0aF#SaZ.V.V.VbgbnaYaYaYbl#D#D#D#D#D#Dbla9#p.na9#pa9#pa9#pbla9#pa9#pa9#pa9#pa9#pa9#pa9af#pa9#pafafaf#Lafa9a9a9a9a9afa9a9afafa9#p#Dbl#saY#x.bbn#xbn#I#xbnbnbnbnawbl#Dblbl", +"a9#pa9bl#M#Dbl#Da9a9#D#D#D#D#D.Nbn#U.RaYaYaY#D#Dbl#D#Dbl#D#Dbl#DaYblaYaYaYawaYaYaY.RaYbn#xaw#xaY.7a9#D#L.7a2#Laf#L#Laf#La9a9#Da9afafajaf#L#L#L#Lbpa2a2a2#ga2a2bpa2a2a2a2a2a2#La2.3#L#L#La9.7a9.7bl.NaYaY#D#pa9#pa9a9a9afafa9a9a9afafafajafafafafafajaf#La9a9a9bj.na9#D.n#Da9#s#D#p#p#p#p.n#pbl#p#p.n#pa9bl#Mblbl#UaY#U#x#Ub#aB.l.V.V.V.VaCbnaY.R#D#Mblbl#Mblblbla9#pa9#pafa9a9#pa9#p#pa9#pa9#pa9#pbl.n#D#pa9#pa9afafafafafafafafafa9#p.na9a9a9a9afafafa9#p#DaYaY.Rbn#x#Ubnbn#xaCa0aCbnaYaYblbla9", +"#pa9#p#Dbl#Da9#Da9afa9bla9bl#DblaYaYbnaYaYaYaYaYblaYblaYblaYaYblaYaYaYaYaYaYaYaY.Rbn.R#xaY.RaYaYa9.7a9#Laf#L#L#Lafaf#Lafa9a9a9.nafafafaf#Laf#L#Laa#ga2#ga2a2#ga2aaasa2a2#La2a2#L#L#L.3#La9.7a9#DaYblaYblbla9a9ajaf#Laf#L#Lafajaf#Lafafaf#Laf#L#La2#L#L#L#L#L.7.7a9a9a9a9a9.na9a9.na9a9a9a9a9a9.na9a9.n#D#D#D#D#D#MblawawbnaC.F.t.Fb#.Vb#.Vbnaw#xaYaYaYaY.NaY#D#Da9#pa9a9#p.n#pa9.nbla9#pa9#pa9#pa9#p#p#pa9.na9afafafafafafafafafa9a9afa9af#pafafafafa9#p#Dblblaw#xbn#Ubn#x#IbnaCb#aCbnawaY#D.na9", +"#pa9#pa9a9#Dbla9a9a9af#D#Da9#D#D#xbn#xbnaYaYblaYaYaYaYaYaYaYaYaYbnaYaYaYaYaYaYaY.R.R.RbnaYaYaYaY#D.7#Da9#La2#Lafajafafa9a9a9a9#Dafafafaf#La2#L#La2a2#ga2a2#gaaa2asaaa2a2a2a2a2a2a2#L#L#La9a9.7a9#D.saY#D.n#pafaf#Lafaj#L#Laf#L#Laf#L#L#L#L#Lafaja2a2a2a2#L.E#L#La9a9a9.7a9a9a9a9a9.7a9.na9a9a9a9.E#L.7.7#D#s#D#s#Fblbl#M#xbnbg.t.F.t.V.V.VaCa0aY#DaYaYaYaY.Nblbl.na9#p.na9a9#pa9#p#pa9#pa9#pa9#pa9#p#D#pa9#p#pa9afafafaf#Lafafa9af#pa9#pa9afa9afafaf#pa9a9#D#DaYbnbn#xbn#Ua0bna0bg.Va0aYblbl#pa9" +}; diff --git a/plugins/styles/metal/metal.cpp b/plugins/styles/metal/metal.cpp new file mode 100644 index 0000000..84de265 --- /dev/null +++ b/plugins/styles/metal/metal.cpp @@ -0,0 +1,523 @@ +/**************************************************************************** +** $Id: metal.cpp,v 1.1.1.8 2006/05/07 17:31:30 chehrlic Exp $ +** +** Copyright (C) 1992-2005 Trolltech AS. All rights reserved. +** +** This file is part of an example program for Qt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "metal.h" + +#ifndef QT_NO_STYLE_WINDOWS + +#include +#include +#include +#include // for now +#include // for now +#include // for now +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +///////////////////////////////////////////////////////// +//#include "stonedark.xpm" +#include "stone1.xpm" +#include "marble.xpm" +/////////////////////////////////////////////////////// + + + +MetalStyle::MetalStyle() : QWindowsStyle() { } + +/*! + Reimplementation from QStyle + */ +void MetalStyle::polish( QApplication *app) +{ + oldPalette = app->palette(); + + // we simply create a nice QColorGroup with a couple of fancy + // pixmaps here and apply to it all widgets + + QFont f("times", app->font().pointSize() ); + f.setBold( TRUE ); + f.setItalic( TRUE ); + app->setFont( f, TRUE, "QMenuBar"); + app->setFont( f, TRUE, "QPopupMenu"); + + + + // QPixmap button( stonedark_xpm ); + + QColor gold("#B9B9A5A54040"); //same as topgrad below + QPixmap button( 1, 1 ); button.fill( gold ); + + QPixmap background(marble_xpm); + QPixmap dark( 1, 1 ); dark.fill( red.dark() ); + QPixmap mid( stone1_xpm ); + QPixmap light( stone1_xpm );//1, 1 ); light.fill( green ); + + QPalette op = app->palette(); + + QColor backCol( 227,227,227 ); + + // QPalette op(white); + QColorGroup active (op.active().foreground(), + QBrush(op.active().button(),button), + QBrush(op.active().light(), light), + QBrush(op.active().dark(), dark), + QBrush(op.active().mid(), mid), + op.active().text(), + Qt::white, + op.active().base(),// QColor(236,182,120), + QBrush(backCol, background) + ); + active.setColor( QColorGroup::ButtonText, Qt::white ); + active.setColor( QColorGroup::Shadow, Qt::black ); + QColorGroup disabled (op.disabled().foreground(), + QBrush(op.disabled().button(),button), + QBrush(op.disabled().light(), light), + op.disabled().dark(), + QBrush(op.disabled().mid(), mid), + op.disabled().text(), + Qt::white, + op.disabled().base(),// QColor(236,182,120), + QBrush(backCol, background) + ); + + QPalette newPalette( active, disabled, active ); + app->setPalette( newPalette, TRUE ); +} + +/*! + Reimplementation from QStyle + */ +void MetalStyle::unPolish( QApplication *app) +{ + app->setPalette(oldPalette, TRUE); + app->setFont( app->font(), TRUE ); +} + +/*! + Reimplementation from QStyle + */ +void MetalStyle::polish( QWidget* w) +{ + + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + + if (w->inherits("QPushButton")){ + w->setBackgroundMode( QWidget::NoBackground ); + return; + } + + if ( !w->isTopLevel() ) { + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( QWidget::WindowOrigin ); + } +} + +void MetalStyle::unPolish( QWidget* w) +{ + + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + + if (w->inherits("QPushButton")){ + w->setBackgroundMode( QWidget::PaletteButton ); + return; + } + if ( !w->isTopLevel() ) { + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( QWidget::WidgetOrigin ); + } + +} + +void MetalStyle::drawPrimitive( PrimitiveElement pe, + QPainter *p, + const QRect &r, + const QColorGroup &cg, + SFlags flags, const QStyleOption& opt ) const +{ + switch( pe ) { + case PE_HeaderSection: + if ( flags & Style_Sunken ) + flags ^= Style_Sunken | Style_Raised; + // fall through + case PE_ButtonBevel: + case PE_ButtonCommand: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + (flags & (Style_Sunken|Style_On|Style_Down)), + TRUE, !(flags & Style_Raised) ); + break; + case PE_PanelMenuBar: + drawMetalFrame( p, r.x(), r.y(), r.width(), r.height() ); + break; + case PE_ScrollBarAddLine: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + flags & Style_Down, !( flags & Style_Horizontal ) ); + drawPrimitive( (flags & Style_Horizontal) ? PE_ArrowRight :PE_ArrowDown, + p, r, cg, flags, opt ); + break; + case PE_ScrollBarSubLine: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + flags & Style_Down, !( flags & Style_Horizontal ) ); + drawPrimitive( (flags & Style_Horizontal) ? PE_ArrowLeft : PE_ArrowUp, + p, r, cg, flags, opt ); + break; + + + case PE_ScrollBarSlider: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), FALSE, + flags & Style_Horizontal ); + break; + default: + QWindowsStyle::drawPrimitive( pe, p, r, cg, flags, opt ); + break; + } +} + +void MetalStyle::drawControl( ControlElement element, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags how, + const QStyleOption& opt ) const +{ + switch( element ) { + case CE_PushButton: + { + const QPushButton *btn; + btn = (const QPushButton*)widget; + int x1, y1, x2, y2; + + r.coords( &x1, &y1, &x2, &y2 ); + + p->setPen( cg.foreground() ); + p->setBrush( QBrush(cg.button(), NoBrush) ); + + + QBrush fill; + if ( btn->isDown() ) + fill = cg.brush( QColorGroup::Mid ); + else if ( btn->isOn() ) + fill = QBrush( cg.mid(), Dense4Pattern ); + else + fill = cg.brush( QColorGroup::Button ); + + if ( btn->isDefault() ) { + QPointArray a; + a.setPoints( 9, + x1, y1, x2, y1, x2, y2, x1, y2, x1, y1+1, + x2-1, y1+1, x2-1, y2-1, x1+1, y2-1, x1+1, y1+1 ); + p->setPen( Qt::black ); + p->drawPolyline( a ); + x1 += 2; + y1 += 2; + x2 -= 2; + y2 -= 2; + } + SFlags flags = Style_Default; + if ( btn->isOn() ) + flags |= Style_On; + if ( btn->isDown() ) + flags |= Style_Down; + if ( !btn->isFlat() && !btn->isDown() ) + flags |= Style_Raised; + drawPrimitive( PE_ButtonCommand, p, + QRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1), + cg, flags, opt ); + + if ( btn->isMenuButton() ) { + flags = Style_Default; + if ( btn->isEnabled() ) + flags |= Style_Enabled; + + int dx = ( y1 - y2 - 4 ) / 3; + drawPrimitive( PE_ArrowDown, p, + QRect(x2 - dx, dx, y1, y2 - y1), + cg, flags, opt ); + } + if ( p->brush().style() != NoBrush ) + p->setBrush( NoBrush ); + break; + } + case CE_PushButtonLabel: + { + const QPushButton *btn; + btn = (const QPushButton*)widget; + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + + int x1, y1, x2, y2; + r.coords( &x1, &y1, &x2, &y2 ); + int dx = 0; + int dy = 0; + if ( btn->isMenuButton() ) + dx = ( y2 - y1 ) / 3; + if ( btn->isOn() || btn->isDown() ) { + dx--; + dy--; + } + if ( dx || dy ) + p->translate( dx, dy ); + x += 2; + y += 2; + w -= 4; + h -= 4; + drawItem( p, QRect( x, y, w, h ), + AlignCenter|ShowPrefix, + cg, btn->isEnabled(), + btn->pixmap(), btn->text(), -1, + (btn->isDown() || btn->isOn())? &cg.brightText() : &cg.buttonText() ); + if ( dx || dy ) + p->translate( -dx, -dy ); + break; + } + default: + QWindowsStyle::drawControl( element, p, widget, r, cg, how, opt ); + break; + } +} +void MetalStyle::drawComplexControl( ComplexControl cc, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags how, + SCFlags sub, + SCFlags subActive, + const QStyleOption& opt ) const +{ + switch ( cc ) { + case CC_Slider: + { + const QSlider *slider = ( const QSlider* ) widget; + QRect handle = querySubControlMetrics( CC_Slider, widget, + SC_SliderHandle, opt); + if ( sub & SC_SliderGroove ) + QWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how, + SC_SliderGroove, subActive, opt ); + if ( (sub & SC_SliderHandle) && handle.isValid() ) + drawMetalButton( p, handle.x(), handle.y(), handle.width(), + handle.height(), FALSE, + slider->orientation() == QSlider::Horizontal); + break; + } + case CC_ComboBox: + { + // not exactly correct... + const QComboBox *cmb = ( const QComboBox* ) widget; + + qDrawWinPanel( p, r.x(), r.y(), r.width(), r.height(), cg, TRUE, + cmb->isEnabled() ? &cg.brush( QColorGroup::Base ) : + &cg.brush( QColorGroup::Background ) ); + drawMetalButton( p, r.x() + r.width() - 2 - 16, r.y() + 2, 16, r.height() - 4, + how & Style_Sunken, TRUE ); + drawPrimitive( PE_ArrowDown, p, + QRect( r.x() + r.width() - 2 - 16 + 2, + r.y() + 2 + 2, 16 - 4, r.height() - 4 -4 ), + cg, + cmb->isEnabled() ? Style_Enabled : Style_Default, + opt ); + break; + } + default: + QWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how, sub, subActive, + opt ); + break; + } +} + + +/*! + Draw a metallic button, sunken if \a sunken is TRUE, horizontal if + /a horz is TRUE. +*/ + +void MetalStyle::drawMetalButton( QPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat ) const +{ + + drawMetalFrame( p, x, y, w, h ); + drawMetalGradient( p, x, y, w, h, sunken, horz, flat ); +} + + + + +void MetalStyle::drawMetalFrame( QPainter *p, int x, int y, int w, int h ) const +{ + QColor top1("#878769691515"); + QColor top2("#C6C6B4B44949"); + + QColor bot2("#70705B5B1414"); + QColor bot1("#56564A4A0E0E"); //first from the bottom + + + int x2 = x + w - 1; + int y2 = y + h - 1; + + //frame: + + p->setPen( top1 ); + p->drawLine( x, y2, x, y ); + p->drawLine( x, y, x2-1, y ); + p->setPen( top2 ); + p->drawLine( x+1, y2 -1, x+1, y+1 ); + p->drawLine( x+1, y+1 , x2-2, y+1 ); + + p->setPen( bot1 ); + p->drawLine( x+1, y2, x2, y2 ); + p->drawLine( x2, y2, x2, y ); + p->setPen( bot2 ); + p->drawLine( x+1, y2-1, x2-1, y2-1 ); + p->drawLine( x2-1, y2-1, x2-1, y+1 ); + + +} + + +void MetalStyle::drawMetalGradient( QPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat ) const + +{ + QColor highlight("#E8E8DDDD6565"); + QColor subh1("#CECEBDBD5151"); + QColor subh2("#BFBFACAC4545"); + + QColor topgrad("#B9B9A5A54040"); + QColor botgrad("#89896C6C1A1A"); + + + + if ( flat && !sunken ) { + p->fillRect( x + 2, y + 2, w - 4,h -4, topgrad ); + } else { + // highlight: + int i = 0; + int x1 = x + 2; + int y1 = y + 2; + int x2 = x + w - 1; + int y2 = y + h - 1; + if ( horz ) + x2 = x2 - 2; + else + y2 = y2 - 2; + +#define DRAWLINE if (horz) \ + p->drawLine( x1, y1+i, x2, y1+i ); \ + else \ + p->drawLine( x1+i, y1, x1+i, y2 ); \ + i++; + + if ( !sunken ) { + p->setPen( highlight ); + DRAWLINE; + DRAWLINE; + p->setPen( subh1 ); + DRAWLINE; + p->setPen( subh2 ); + DRAWLINE; + } + // gradient: + int ng = (horz ? h : w) - 8; // how many lines for the gradient? + + int h1, h2, s1, s2, v1, v2; + if ( !sunken ) { + topgrad.hsv( &h1, &s1, &v1 ); + botgrad.hsv( &h2, &s2, &v2 ); + } else { + botgrad.hsv( &h1, &s1, &v1 ); + topgrad.hsv( &h2, &s2, &v2 ); + } + + if ( ng > 1 ) { + for ( int j =0; j < ng; j++ ) { + p->setPen( QColor( h1 + ((h2-h1)*j)/(ng-1), + s1 + ((s2-s1)*j)/(ng-1), + v1 + ((v2-v1)*j)/(ng-1), QColor::Hsv ) ); + DRAWLINE; + } + } else if ( ng == 1 ) { + p->setPen( QColor((h1+h2)/2, (s1+s2)/2, (v1+v2)/2, QColor::Hsv) ); + DRAWLINE; + } + if ( sunken ) { + p->setPen( subh2 ); + DRAWLINE; + + p->setPen( subh1 ); + DRAWLINE; + + p->setPen( highlight ); + DRAWLINE; + DRAWLINE; + } + } +} + + + +int MetalStyle::pixelMetric( PixelMetric metric, const QWidget *w ) const +{ + switch ( metric ) { + case PM_MenuBarFrameWidth: + return 2; + default: + return QWindowsStyle::pixelMetric( metric, w ); + } +} + +// ************************** +// --- Plugin - interface --- +// ************************** + +class MetalStylePlugin : public QStylePlugin +{ +public: + MetalStylePlugin(); + + QStringList keys() const; + QStyle *create( const QString& ); +}; + +MetalStylePlugin::MetalStylePlugin() +: QStylePlugin() +{ +} + +QStringList MetalStylePlugin::keys() const +{ + QStringList list; + list << "Metal"; + return list; +} + +QStyle* MetalStylePlugin::create( const QString& s ) +{ + if ( s.lower() == "metal" ) + return new MetalStyle(); + + return 0; +} + +Q_EXPORT_PLUGIN( MetalStylePlugin ) + +#endif diff --git a/plugins/styles/metal/metal.h b/plugins/styles/metal/metal.h new file mode 100644 index 0000000..ae11a61 --- /dev/null +++ b/plugins/styles/metal/metal.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** $Id: metal.h,v 1.1.1.9 2006/05/07 17:31:30 chehrlic Exp $ +** +** Definition of the Metal Style for the themes example +** +** Created : 979899 +** +** Copyright (C) 1997 by Trolltech AS. All rights reserved. +** +** This file is part of an example program for Qt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef METAL_H +#define METAL_H + + +#include + +#ifndef QT_NO_STYLE_WINDOWS + +#include + + +class MetalStyle : public QWindowsStyle +{ +public: + MetalStyle(); + void polish( QApplication*); + void unPolish( QApplication*); + void polish( QWidget* ); + void unPolish( QWidget* ); + + void drawPrimitive( PrimitiveElement pe, + QPainter *p, + const QRect &r, + const QColorGroup &cg, + SFlags flags = Style_Default, + const QStyleOption& = QStyleOption::Default) const; + + void drawControl( ControlElement element, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags how = Style_Default, + const QStyleOption& = QStyleOption::Default ) const; + + void drawComplexControl( ComplexControl cc, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags how = Style_Default, + SCFlags sub = SC_All, + SCFlags subActive = SC_None, + const QStyleOption& = QStyleOption::Default ) const; + int pixelMetric( PixelMetric, const QWidget * ) const; + + +private: + void drawMetalFrame( QPainter *p, int x, int y, int w, int h ) const; + void drawMetalGradient( QPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat=FALSE ) const; + void drawMetalButton( QPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat=FALSE ) const; + QPalette oldPalette; +}; + +#endif + +#endif diff --git a/plugins/styles/metal/metal.rc b/plugins/styles/metal/metal.rc new file mode 100644 index 0000000..20ead13 --- /dev/null +++ b/plugins/styles/metal/metal.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,0,0,0 + PRODUCTVERSION 0,0,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "metal\0" + VALUE "FileVersion", "0, 9, 5, 0\0" + VALUE "InternalName", "metal\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "metal.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 5, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/styles/metal/metal.vcproj b/plugins/styles/metal/metal.vcproj new file mode 100644 index 0000000..aa76570 --- /dev/null +++ b/plugins/styles/metal/metal.vcproj @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/styles/metal/metal.xpm b/plugins/styles/metal/metal.xpm new file mode 100644 index 0000000..0d72650 --- /dev/null +++ b/plugins/styles/metal/metal.xpm @@ -0,0 +1,130 @@ +/* XPM */ +static const char *metal_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 154 77 46 1", +/* colors */ +". c #040204", +"# c #4c4e4c", +"a c #6c767c", +"b c #5c6264", +"c c #848a8c", +"d c #545a5c", +"e c #7c8284", +"f c #646e74", +"g c #3c3e3c", +"h c #444644", +"i c #8c9294", +"j c #4c565c", +"k c #7c7e84", +"l c #646a6c", +"m c #747e84", +"n c #4c525c", +"o c #74767c", +"p c #64666c", +"q c #8c8e94", +"r c #5c5e64", +"s c #84868c", +"t c #6c6e74", +"u c #444244", +"v c #4c4a4c", +"w c #4c5254", +"x c #5c666c", +"y c #848e94", +"z c #545e64", +"A c #7c868c", +"B c #3c4244", +"C c #444a4c", +"D c #8c969c", +"E c #747a7c", +"F c #6c7274", +"G c #4c4e54", +"H c #5c626c", +"I c #848a94", +"J c #545a64", +"K c #7c828c", +"L c #3c3e44", +"M c #44464c", +"N c #8c929c", +"O c #54565c", +"P c #646a74", +"Q c #747a84", +"R c #6c727c", +/* pixels */ +"DNDDDDDDDDDDNDNDNDNNiNNiNiNyiyiyqyyyyIyIcIcIcAsAsAAKAKeKememkmmmQEQEEaoaoaaFRFFFftftlfPllllpxpxpxHbbbrbrzrzrJddddOdOOjOjOnwwwwwGwGG#GCGC#CCCCCCCMCMMMhMBhB", +"DDDNDNDNDNDNDDNDiDNDNDiyNNiNNyNyiyqyqyIyIIcIcIAcAsAseAKeKekemkmkEmEQEEoaoaoRFRFFtFtftltlPllplpxpbpbHbbrbrrzrdrdJdddOOOOjOwOwOGwwwGwGGGCGCG#CvCCMCMCCMMMMMM", +"NNDNDNDNDNDNDiDNDNiNiNNDNNyNyqNqyqyqycyIcIcIAIAsAsAKAKKeKkKmkmkEmQQoQoEaoFoaFRtRFftftfPlPpllpxpbpbHbbbbrzrrdrdrdddOddOOwOOwOwwwwGwGwCGwCGGCvCCvCCChCMCBhMB", +"DDiDNDNDNDiDNNNiNNDiNyNiyNiyNyyNyyyIqIIcIcIAIcAsAAseKeKemKmkmkQmEEQEoaEaoaFRoFFtttftltlPlPppxppxbpbHbrrrrzrzrdddJdOdjOOOjwOwwOGwGwGGw#CGGCvCvCCCMMCMhCMCBM", +"iNNNiNiNiNNiDNDNNiNyNiNiNyNyiyqyqIqyIIyIcIcIcAsAsKAKAKeKeekmkmEkQQEEQaooaRoFFtRFFftltflPllllppxpHbpbHbbzrrdrdrOrOddOOjOwOOGOwGwwGwGwCGGCGCCGCCMvCCMCMMhMMB", +"NiNNNNNNNNiNiNiNiNNNiyNyiqyNyqyyyyIyIcIcIAcAsAsAAAseKeKmkmkmkQmEEQEoaEaoRoFRRFtfttftlPtllppxpxpbpbbrbrrbrzrdddddOdOOdOOwOwwOGOGwGGGGwCGGCGCCvCvCMMCMhMBChM", +"iNNiiNiiNiNNiNiNyiyNyNyNyyqyqyyqIqycIcIcIsIsAsAAseKeKeeeKmkmmkQQQoEQooaoFaFRFFRFtftPtlllPplpxpbpbbHbbbrrzrrdrdrdddOdwOOjOwOwwwwGwGwCGGGCGCGCGCCCMCMCMCMMMB", +"NyNiNiNiNiNiyNiyNNyiNyqyNyyqyyqIIIIIcIcAIAcAsAsKAKKeKkmkmkmkQEQEEQaoaoaaoFRFFtftftflPlPllpxppxpbbpbbrbrzrrdrdOJOdOOOOOwOwOwwOGwGwGGw#CGCGCvCCCvMCMMMhMhBMh", +"yNiyNyNyiyNyiNyNiyqyyiyqyqyyyIIIycIcIAsIcAsAsAKAeKeKeeKmkmkmEmQEQoEEaoRoRFRFRtFttltftlPlplppxpbpbHrbbrrrrdrddrOrdOdOdwOwOwOGwGwwGGwCGwCGCGCCvMCCMCMCCBMMMB", +"qyNyiqyNyNyNyyqyyNyqyyqyyyqIIyIycIcIcIAcAsAAAKsKKeKemkmkmkmQkEEQEoaoaoaFFRFFtRftftlPllllpxpxpbbHpbbrrrzrzrdJrOdOOdOjOOOwOwwwOGGwGG#GGCGCGCvCCvCMCCMhMCMBMh", +"NyqyqyNyqyqyqyNyqyqyqyyIqIIyIcIcIIcIAsIAsAsAsAeAKeKkKkKmkmEQEQEQaoEaoaRFoRFRfttftPflPlPplpxppHpbbrHbbzrrzrdrdddddOOdwOwOwwOwGwGwGwCwCGGCGCCGCCCCMMCMMMMhMB", +"yqyqyyqyqyqyqyqyyqyyIyqIyIyIcIIcIsAIcAsAAsAKKKKeeKmemmmkmQkQEQEoEaoaoFoFRFFtFtftftltlllpplpxbpbHbbbrrrzrdrdddJdOdOOOOjOwOwwwwwGwGGGGGCGCGCvCCGMMCMMhMBCBMB", +"yyyyyqyyqyyqyyyqyyyIyIyIIcIcIIcIAIcAsAsAsKAeAKeKekKmkkmQkmQEQEoQaooaoaFRFRtFttftPlPllPplpxpxpbpbbHrbzrrrrdrdrOddOdjOwOwOwwOGOGwGw#GGCGCGCCGCCMCCMChCMMMhMB", +"IqyqyyqyyyqyyqIIIIqIIIIcIIcIccIscAsAsAAAKAsKeeKekmekmmkmEEEQEEoaoaoaRFoFFFtftftltlPlPplpxpxpbbbHbrbrrzrdzddddddOOOOOOwOwO#wGGwGGGCw#GCGCvCCvMCMCMMMMBCBMBM", +"IyIIIIIIIIIIIIyIyIIIyIcIccIcIcAIAsAsAAsKsKKeKeKmeKmkmkEmQQQEQaoEaoaRoFRFRtRFtftfltlPlplxpppbbpHbbbrbrrzrdrdrJOdOdOdwOwOwwwOwwGwwGwCGCGCGCCGCCCvMCMCMMhMhMB", +"IIIyIyIyIyIyIyIcIcIccIcIcAIAcAsAsAsAsKKAeKeKekKkkmkmkmQkEEEQoEoaoaoFRFRtFftftftlPlllplppxxpbpbbbrHrzrzrdrddOddOOOjOOwOwOwwGwGwG#GGGCwCGCvCCMvMCMMMhMBMBMBh", +"cIcIcIcIcIcIcIcIcIcIcIcIAscsAIAsAAsAKAKeKeKkeKmemkmkQmQEQEQoEoaoaoFRRFFRtFttltPltPpPlppxppbpbHbHrbrrrrdrdrOrdOddOdwOjOwOGOwwGwGGwCGGvGCGCCvCCCMCMCMhCMMhMB", +"IcIcIcIcIcIcIcIcIcIAIAcAIAAsAsAsAsKAKseKeKeKmkkmkmmQmkEQEEoaEaoaaRaoFFtFftftfPtllllppxppxbpbbbbbrrzrzrdrdddOdOdOOOOwOwwO#wGwGwG#CwCGCCvCvCCCMCMCMMMBMBhBMh", +"IAccIcIcIcIcIccIAIAscsAsAIsAsAsAAKAeKeKeKemkemkmmkQkEQEEQoQoaoaoFoFFFRtRttftltllPlPllppxppbHbpHrbbrrrdrddrddOdOOOjOOwwOwwwwGwGGwGGGCGCGCCCvCvMCMhCMMhMMMBB", +"csAIAsAsAsAAsAsAcsAIAAsAsAAAAAKKsKKKeKeKkeKmkmkmkQmEQEQoEaoaoaoRRFRFRtfFftftPlPlPlppxpxpbbHprrbrrzrzrdrdrOOddOOjOwOwOwO#OGwGwG#CwCGGCGCGCGMCMCMMMMBCBMBMhB", +"IAsAIAIsIAsIAIAIAsAsAsAsAsAsKsAKeAeeKeKemkmkmkmkQmEQEQEaQoEaoaFoRFRtFFtttftlfltPplplppxpHpbbbbrbbrzrrdrdOdddOdOOOOwOwOwwGwGwGGwGGGCGCvCvCCMCCMCMCMhMMhMBMB", +"sAsAsAsAsAsAsAsAsAsAsAAAKAKKKeKeKeKeekmKkmkmkmQmEQEQEEoEaoaoaoRFaFFRttftftltlPlpllpxpxpbxbpbHrbrrrrdzdrdrOdOdOjOjOwOwwwOGwwGGGCwGCGCGCCCGMCCMCMMhMBMBMBhBu", +"sAAsAsAAAsAAsAAsAAAAAsKsKKsAeKKeKeeKkKmkmkmkmmQEkEQEoQaooaoaRFoRFRFFfFtftftlPlPlplpxpbpbpbbrbrbrzrzrdrdOddOdOOOOOOwOwOwwwwGwGwGGGCGGCGCGCCMvCMMCMMCMMBMuMB", +"AAsAAAAsAAAsAAsKAsKKAKKKeKeKeKeKekkmmemkmmkQmkEQEQEEoEoaoaoRoFRFFttRtftfftlPtllpPpxpxpbbHbHbbrrzrzrdrddrOddOOjOwOwOwO#wGOGGGw#CGCGCCvCvMCvCMMMCMhBMhhMBMBu", +"KKAKKsAKKsAKAKKAKKKKKeAeKeKkKeeekKmKmkmkmkmQEEQEQEoQaoaoaoFaFRFFRFFtfttltlllllplpxpppbpbpbbrbrbrrrdrdrdddOdOdOOOwOwOwGOwGGwGwCwGGCGGCGCCMCMCCMMMMCBMBMBMBB", +"eAeKKeKKKKKKeKAeKAeeKeKeKeeKkmkmKmkmkmkmQmEQQEQEooQaooaoaRoFRFRFttfttfftlPPlpPppxppxbxbHbrbbrzrzrdrddddOddOOjOwOwOwwwOGwGwGGGGGC#CGCCCvCGMCMMCMhMMMhBMhBuB", +"eKeKeKKeKeeKeKeKeeeKeKeKeKmemkKkmkmkmkQQkEkEEQoEQEaEaoaFoaRFRFFRftFftftPltlPlllxppxpbpbpbHbrbrrzrzdrdrdJOdOdOOOOwOwOwwwwGwG#wCGGCGCvCGCCMCMCMhMMCBMBMBMBMB", +"KeKeKeeKeKeKeKeKeKeKekkkmekmKmmkmmkQQmEQEQEQEEoQaooaoaoRFFFRFFtFtftftlllPllpppppxpxbpbbrbrbrrzrrdrdddOddOdOjOwOwOwO#wGwGwGGGCwGCGCGCvCCvCMCCMCMhBCMhBMBuBu", +"kkKeeKeKeeKeKkKkkkkkKmKmkkmkmkkmmkEmmEkQEQEQoQaoaoaoaaFoFRRFFRtFfttltPtfllPllxlpxpbpbpbHbrbrzrrdrdrdrddOdOOOOdwOwOwwGOwwGw#wGGCGCGCGCCCMCMCMMMMMMhMBMMBMBB", +"KmekmekekKmememKmKmemkmkmmkmmmmkQQmkEEQEQoEoaEoEaoaaoFRRFFFRttfttfftllllPlppppxpxpbbHbbrbrrrrzrzdrOddOddOOjOwOwOwwOwwGGGGGCGCGG#CGCCvCvCMCMMChMBMBMMBhBuBu", +"ekmKkmkmkmkkkmkkmkmkmkmkmkmkmkQQEQEEQEQoEEaQoaoaoaoFRFoRFRFtFtFftPtfPltPplplxppxpbbpbHbHrbzrzrrdrdddJddOOdOOOjOwOw#OwwGwwGwGwCGCGCCGCCMCvMCMMMhCMMBMBuBMBB", +"kmkmkmkmkmkmkmkmkmkmkmmkmQmQQEEmkEQEQEEoQooaooaaRoFRoFFFFttFftftftlltllplPpppxpxpbpbbrbrbrrrzrdrddrOdOOOdjOwOwOwwOGGwGwG#GCGCG#CvCvCMGMCMCMMCMBMBMhBMBMBuB", +"mkmmmkmmkmmkmmkmmkmmmkQmQkQEkQEQEEQoEooEaEaoaoaoFaRFFRtRtRtfttftPltPllPllplxpxpbpHbbHbrbrrzrdrddrddOdddOOOOOwOwOwwwwwGwGGGGGGGCGCCGCCMCMCMChMhCMMBMMBuBuBB", +"QQQkQmkmmkmmkQQmkQQkEQEQEQEQEEQEoQoEoaQaoaoaaaoFRoFRFFFtFfttfftlftllPplppxpxpxpbbbprbrbrrrzrzdrdddddOOOjOjwOwOwwOGwOGwG#GCwC#CGCGCCvCCCMCMMMMBMBhMBhBMBMBu", +"EkmEkQQkQQkQQEkQEEQEmQkEQEQEEQoEQoEaQaoaoaoaoRFRRFFFRtRftFftftltllPllPlxppxpbpbbpbbHrbrbzrrdrrddrOdOdOdOOOOwOwOwwwGGGGwGwGGGCGCvCCvCCMvCMMCMhMMMMBuMBuBuBB", +"QEQEQEQEQEQEmQEQmEQEQEEQEEQEoEaQaoaooaoaoRRFFoFRFFRFtFtFftftlPflPlplppppxpxpbxpbbbrbbrrrrzrzdrddOdJOdOOjOwOwOwwOGwwGwG#CGCGCGCGCGCCMvCMMMCMhBCBhBMBMBMBBuB", +"EQEQEQEQEQEQEEQEEEQEEQEEQEoQaQooEaoaoaoaFoaoRFRFFRtFftftftftltltlPlPplxppxpbpbbHbHbrbzrzrdrdrddOrdOdOjOdwOwOwwOwGwGwGGwGwC#GCGCvCMGCCMCCMMMMMMMBMMBMBuBuBB", +"QEEQEEQEEQEEQEQEQEEQooaooaoaooaoaoaaaoRFoFFFRFFFttFttftftPtlPllplpplpxppxpbHbpbbrbrbrrrzrzdrddrOdOdOOOOwOOwOwO#wO#wGGwCGGGCGCGCCvCMCMCMMMChBChMMBhBMBBuBBB", +"EaoEoEoQoEoQoEoEoooEaEoQaoEoaoaoaoaoRFoRFRRRFtRtRttfttftltPltlPlPllpxppxpxbpbbbHbrbrrrzrrdrOrdOdOdOdOjOOwOjwOwwGGwGwGGG#GCGCGCCGCCvCMCMChMMMMBhBMBMBuuBBuL", +"oQaoaoEaEoaEoaoaoaQaoaoaoaaoaaoRRoFFRFRFRFFFFtFtfFftftftlPlPlPlpppplpxxpbpbbHbrbrbrrzrzrdrddddddOdOOOOwOwOwwwwOGwGwG#CwCGGCGCvCCCGMCMCMMMMBCMMBMhBuBBBuBBB", +"oaoaQoaooaEaoQaooaoaoaoaoaoaoaFoaRFoaRFRFFRttRfttftftltfPltlllplllxpxpxpxbHbpHbrbrbrzrrdzddrdOdOdOOjOjOwOwO#OwGwGwGGGwGGGCGCGCCvCMCMCMMChMMMhBMMBMBuMBuBuL", +"oaoaoaoaaoaoaoaoaoaoaoaaoRFRFoFRFFRFFFFFttFtFttftftfltlllllpPplppxppxpbbpbbbrbrbrrzrrzdrdrddOddOOOOOOOwOwwOwGwwGwGGwCGCGCGCGCvCCCCMvMMCMMBCBMMBhBuBBBuBBBB", +"FoaoaaaoaoaoaaoaaoRoaRoFFoRoRFRFRFFRtRttFRtfftftftltflPltlPlplppxppbpbbpbbHbbrbrzrrzrdrdrddddOdOdjdwOwOwOw#OwwGwGwG#GGwCGCGCvCCMvCCMCMMhMMhMhBMBMBMBMBBuBL", +"aRaFaoRoRRoRoFaFoFaFRoFRaFFFRFFRFFFFtFtftfttftfftlPlPtlPpplplpxpxpxpbpbbbprbrbrrrzrzdrdddOrOOdOOOOOjOwOwwOwGwwGwG#GCwCG#CGCCCGCGMMCMMMCMBCBMBMuBMBuBuBuLBB", +"RFoFoRFFoRFRFRoFRRFRFFFRFFRFFRFFRttRttFfttfftfltPltPllpllplpxppxpbpHbHbHbrbrbrbzrrdrdrdOrdOdOdOdOOwOwOwOwwwwwGwGGwGGGGCGCvCvCCCMCMCMCMMhMMMhMMBMBuBBuBLBBL", +"RFRFFFRRFFaFRFFRFRoFRFRFRFFRFtFtFttftfttfftftltllPllPlPplppppxpxpbxpbpbbHrbrrzrrzrzdrddrOOdOdOOjOjOOwwOwwOGwGwGG#CwCGCGCGCGCCvMCCMCMMMBCBMBuBMBuBMBMLBuBLB", +"RFtRFRFFFRFFFRFRFFtFRFtFtttttRttfFftftftftltlPlPllPllpplxlxpxpbpbpbbbrHrbrbzbrzrdrdrdddOddOdOdOOwOOwOwwOwGwGwGwGwGGGC#GCGCCvCCCvMCMChCMMMMBMBMBMBuBBuBLuBL", +"tFRFtFRFFFFRFFFtRFtFtFtRtFtfFftfttftftfltlflPtllPllplplppxpxpxpbHbprbbbrbrrrrzrrzdrddrOddOdOOjOOOwwOwOw#wwO#GGG#GCGCGCGCCvCCCvMCMCMMMMBhBMMhBMBuBBuBBBBBLB", +"fFtFtFtttttttttFtFtRfttftfFtfttftftftltfPltlllPlllpPpxpxppxpbpbbpHbbbHrbrbzrzrdrdrdrOdddOdOOOOjOwOwOwwGOwGGwGwGwCGGGGCGCvCCvCMCMCMMMMhMMhMBMBuBuBMBBuLuLBL", +"ttfttttRtRtFtfRftftftfttftftftftfltlPllltlPlPlllpPppppxpxpxpbHpbbbrHrrbrrrrzrzrdrdOdddOdOOdjOjOOwOwwOwwGwGwGG#GCwGC#CGCvCCGMCMCMMMChBCBMBMuBMBMBBuBLBBBLBL", +"tfttfftfftffttftttftftftftftftPltflPltPPlPlplpplpplxpxppxpbbpbbHbHbbrbrrrzrzrdrdddrdOddOdOOOwOOwOwwOw#OwwGwGGGGwCGCGCvCCGCMCCCMCCMMMMMCBhMBMBuBuBBuBuLuLBL", +"ftffttftftftftftfftftftfftlltlftlltlPlllplpPplppxpxpxpxbpbbpbbbrbrrbrrzrzrzdrddrddOddOdOOjOOOwwOwOwwwGGGwGG#GCwGGCGCGCGCCCvCMMCMMMhBCuMMBMBMBMBBMBBBBBLBLL", +"ltftffftftftfftfPtltltltlltPlPlllPlPlllPplplppxpxppxpbpHbpHbbHbHrbbrbrrzrrdrdrdddOddOdOdOOjOwOOwwwOGOwwwGwGwGwCGCGCGCvCCvCMCMCMMMMCMMBMBMBMBuBuBuBLuBLBLBg", +"PlPtltlltltltlltlflPlPlPlPllPtlPlplplpplpppxpxppxpxpbxpbbbbbprbrbrrrzrzrzdrdrOdrOdOdOOOjOjOOwOwOwwwwGwGwG#GCG#GCGCGCCCvCMCCMCMMCMhBMMhBMhBMBMBBuBLuBLBuLLL", +"ltllPltlPlPlPltPltltlfPlltlPlplplPlpPpPpplxpppxpxpbbpbbrpbHbrbrbrrrrzrrdrdrddddOddOdOdOdwOOwOwwwwOGwwGwGGwGwCGC#GCvCvCCGCMvCMCMhMMCBMBMMBMBuBBuBBBBLBLBLBg", +"lPlPllPlPlPllPlllPllPtllPplllPplpplpppxpxppxxpxpbpbpbbpbrbrrbrrrrzrzrzrdrddrOdrOOdOOOjOOOwwOwOwOw#wO#wGG#GCwGCGCCGCCGCCMCMCMMMMMhBMMhBMBhBuBuBBBMLuBLBLLLL", +"lllllPlPllPlPllPplpllppllplplplplpplxpxppxxppbpbpbHrbHbrbHbbrbzrzrrzrdrddrdddOdOdOOdOOjOwOOwOww#OwwGGGGwGGwCGGCGGCCvCCCMvCMCMCMMMMhMBMMBuBMBuBuBLBBLuLBLBg", +"lpPlPllllPlllPplPlpPpllpPplpppxpxpxppxpxpxpbxbbbbbpbbbbHrrrrrrrzrzrdrddrOdOdddOdOOdjOjOOwOwwwOwwGGGwGw#GCG#GCGCGCGCCCvCCMMCMMMhBCBMBMBhBMBBuBBBuLBLBLBLgLL", +"PplppppppppppplplplplppppppxlxpppxpxxpxpbpbpbpbpHbrHrbrrbrbzrzrrzrdrdrdOrdOrOOdOdjOOOwOwOwwOww#OwwGwGGGGwCGCGCGCCCCGCCMCMCMMCMMMMCBhMBMBuBuBBMBLBuBLBLLBLg", +"pppplplplplplppppppxpxlxxpxppxpxxpbppbbpbbbbbbHbrbbbrHrbrzrrzrzrdrdddddddOdOOdOOOOjOwOwOwOwwO#wGGwG#G#CGGGCGCGCvCvCMCMCMCMMMhMBChBMMBMBuBuBuBLBuBLLBLLgLLg", +"pxxpxpxpxpxpxpxpxpxpppxppxpxpxpxpbpbbpbbHbpHrprbbHrrbrrzrrrzrzrdrdrdrdrdddOdOOdjOOwOOwOwwwOwwGwwGwGwGGwCGC#GCvCCvCCvCMvCMMCMMMhMBMMBMBMBMBBBBuLBLBLBLBLBLg", +"xppxpxpxpxpxpxpxpxpxxpxpxpxpbpbpbHbHpbHprbbrbrbrrbrbrrrrzrzrdrddrdOddOOdOOdOdOOOjOOwwOwOwwGwGwGwGG#GCwGGCGCCGCGCCCvMCMCMMMMhBCBMhBhBMBuBBuBMLBBuLBuLLgLgLL", +"xpxpxpxpxpxpxpxpxpxpbpbpbbpbbbbbpbpbbbbbbbHbHrbbrrrrzrzrrdrdrddrddrdOdddOdOOjOjOOwOwOwOw#OwGOwGwGwGGG#GCGCGGCvCCGMCCMCMCMCMMMMMMBMBMBuBuBMBBLuBLBLLgBLBgLg", +"bpbpbpbpbpbpbpbpbpbpbxpbHpbHpHprbbbHbrHrbrrrbrrrbzrzrrzrzrddrdrOddOddOOdOOOOOjOwOwOwwO#wOGGwGGGG#GCwCGCGCGCCCCvCMCCMCMMMMhBCBhBMhBMBuBBuBBuLBBLBLBLBLgLLgL", +"pbbbbpbbpbbpbbpbHbbbpbbpbbbbbbbbbHbbHbrbrbbrrrbzrrzrrzrdrddrddddddddOdOOdOOjOwOOwOwwOwwwGwwwGwGwGG#GGCGC#CGCGCCvCMvCMCMCMMMhMMMBMBuBMBMBuBLBuLLuBLLLBLgLLg", +"bbpbbbbpbbpbbpbbpbpbbHbbHbprbrHrHbrrrbrbrrrbzrzrrzrzdrdddrddrOddOdOOdOOdjOjOOOwwOwOwwwOGwGGw#GG#CwCGCGGCGCvCCvCCCMCMMMMMhBCBMBMhBMBMBuBBBBuBBLBLLLBgLgLLgL", +"bHbbpbHbbHbbHrbHbbrbHbrbrbrbHbbrbrbbrrrrbrrzrzrrzrdrdrdrdOrOddOdJOdOOOjOOOOOwwOwOwwwOwGwGwwGGwGGGGC#GCGCvCCvCCMCMCMCMChMMMMMBhMBMBuBuBBMLuLBLuBLBgLLgLLgLg", +"bbrHrbrHrbrHbbHrbHbbrbHbrHrbrrbrrrrrbrzrzzrrzrddrdrdrdddrdddddOdOOOdOOOjOwOwOOwwwOww#wwGwGGG#GCwCGGCGCvCCGCCCGMCvMMMMMMBCBMhMBMBMBMBBuBLBBuLBLLLLLBgLLgLgL", +"rbrbrbrbrbrbrrbrbrrHrbrrbrbrbrrbrbrrrzrzrrzdrdrrddrddOrdddOdOOdOOdOOOjOOwOwOwwwOw#OGwwGwGwGwCGwCGGCGCGCCvCCvCMCMMMCMCMhMMCBMBMBMBuBBuBuBuLBBLBBgBLgLLgLgLg", +"rbrbrbrbrbrbrbrbrbrrrrrbrrrzrrzrzrzzrrzrzrrdrdddrdddrdOdOddOddOOdOjOjOOwOwOwOwOwwwGwGwGGG#GGGGCG#CGCGCGCCCvMCMCMCMMMMBCBMBMhBMBuBMBuBBBBBBLBLBLLLgLgLLgLgL", +"zrrrrrrrrrrrrrrrrrrbrbrrrzrrzrzrrzrrzdrdrddrddrddOrddOddOdOdOOOOOOOwOOwOwOwwww#OwGOGwGwGwGG#GCGGCGCGCvCCvCCCMCMCMMCMhMMMMhMBMBMBuBBuBLuLuBLuBLBLBLgLLgLgLg", +"rrzrzrzrzrzrzrzrzrzrzzrzrrzrrrzrdrdrdrdrdrdddrddddOdOdOdOdOOOOOjOjOOwwOwOwwOwO#GwGGwGGG#G#CwCw#CGCvCCCvCCMCMCMCMMMMBCBMBhBMBhBuBBuBBBuBBLLBLLLgLgLLgLgLgLg", +"rzrrzrrzrrzrrzrrzrrzrrzrzzrzdrdrdrddrdrddddrdddOrddOdOdOOOdOOjOOwOjwOwOwwOwOwGwwGwwGGwGwCGwCGGCGCGCCvCCvCCMCMCMMChMhMMhMBMBMBMBMBuLMBBLBLuLBLBLBLLgLLgLgLg", +"zrzrzrzrzrzrzrzrzrzrzrdrdrdrdzrddrdrddddrOddOJddOOOdOOOOdOOjOOjOjwOOwOwwww#GwwwGwG#Gw#GGGCGGCGCvCCvCCCCMCvMCMMMMMBCBMBMBMuBuBuBBuBBBuLBLBLBLLgLgLgLgLgLgLg", +"rdrdrdrdrdrdrdrdrdrdddrdrdrdrddrJdddOrJOddddddOOdOdOdOdOjOjOOwOwOwOwwwwOwOwGOGwGwGwGGGCGCGGCGCGCCvCvCGCCMMCMCMCMMMMMhMhMBMBMBMBuBBuBLBLuLBLBLBLLLgLLgLgLgg", +"drddrddrddrddrddrdrdrddrdddddrOddrdddOddrOOOdOddOOOOOOjOOjOwOjOwOwwwOwww#Gww#GGGGG#GCwGGCGCGCGCvCGCCCMCMCCMMMMMhBCBMBMBuBMBuBBuBBuBLuBLBLLLgLgLgLLggLgLgLg", +"ddrddrdddrddrddrdddddrddOrdrddddOdOJdddOOOdOdOOOdjOOjOOOwOOwOwOwwwwO#OwGOwGwGwGwGwCGGCGCGC#CvCGCCCMvCCMvMMCMCMCBMhMhMBMBMBMBuBBuBLBBBLBLBLBLBLgLgLgLgLgLgg" +}; diff --git a/plugins/styles/metal/stone1.xpm b/plugins/styles/metal/stone1.xpm new file mode 100644 index 0000000..34cd562 --- /dev/null +++ b/plugins/styles/metal/stone1.xpm @@ -0,0 +1,353 @@ +/* XPM */ +static const char *stone1_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 250 2", +/* colors */ +".. c #343e34", +".# c #94a28c", +".a c #64726c", +".b c #c4d2c4", +".c c #7c8a7c", +".d c #acbaac", +".e c #4c5a4c", +".f c #dceadc", +".g c #949284", +".h c #7c7a6c", +".i c #acaaa4", +".j c #c4c2b4", +".k c #64625c", +".l c #dcdad4", +".m c #8c967c", +".n c #a4ae9c", +".o c #6c7e74", +".p c #f4f2ec", +".q c #444e3c", +".r c #bcc6b4", +".s c #8c8a7c", +".t c #5c6654", +".u c #ccdecc", +".v c #7c826c", +".w c #a4a294", +".x c #949a8c", +".y c #bcbaac", +".z c #747264", +".A c #5c5a4c", +".B c #c4cabc", +".C c #d4d2c4", +".D c #ecf2e4", +".E c #acb2a4", +".F c #646a5c", +".G c #8c867c", +".H c #54524c", +".I c #9c9a8c", +".J c #849284", +".K c #7c827c", +".L c #44463c", +".M c #9caa9c", +".N c #b4c2b4", +".O c #dce2d4", +".P c #cccabc", +".Q c #b4b2a4", +".R c #94a29c", +".S c #848a7c", +".T c #f4faec", +".U c #6c6a5c", +".V c #6c7a6c", +".W c #acbab4", +".X c #546254", +".Y c #4c564c", +".Z c #a4aa9c", +".0 c #747a6c", +".1 c #ccdacc", +".2 c #545a4c", +".3 c #74867c", +".4 c #4c4e44", +".5 c #bcc2b4", +".6 c #5c6254", +".7 c #d4dacc", +".8 c #fcfaf4", +".9 c #3c463c", +"#. c #6c7264", +"## c #e4eadc", +"#a c #949294", +"#b c #847e74", +"#c c #8c968c", +"#d c #a4b6ac", +"#e c #747e6c", +"#f c #949a9c", +"#g c #9c9a9c", +"#h c #84827c", +"#i c #e4e2d4", +"#j c #848a8c", +"#k c #9ca294", +"#l c #ccd2c4", +"#m c #7c7e7c", +"#n c #c4c6c4", +"#o c #a4aeac", +"#p c #bcc6c4", +"#q c #8c8e8c", +"#r c #d4decc", +"#s c #848274", +"#t c #a4a6a4", +"#u c #bcbebc", +"#v c #747674", +"#w c #c4cecc", +"#x c #d4d6d4", +"#y c #acb6b4", +"#z c #646a6c", +"#A c #cccecc", +"#B c #b4b6b4", +"#C c #545e5c", +"#D c #6c7674", +"#E c #747e7c", +"#F c #3c3e34", +"#G c #b4baa4", +"#H c #949684", +"#I c #7c7e6c", +"#J c #acaeac", +"#K c #c4c6b4", +"#L c #646664", +"#M c #dcdedc", +"#N c #8c8e7c", +"#O c #a4a694", +"#P c #949e8c", +"#Q c #bcbeac", +"#R c #747664", +"#S c #5c5e5c", +"#T c #c4cebc", +"#U c #d4d6c4", +"#V c #acb6a4", +"#W c #545654", +"#X c #9c9e8c", +"#Y c #eceedc", +"#Z c #4c4a44", +"#0 c #dce6d4", +"#1 c #cccebc", +"#2 c #b4b6a4", +"#3 c #9ca29c", +"#4 c #848e7c", +"#5 c #8c928c", +"#6 c #b4bab4", +"#7 c #7c8e8c", +"#8 c #44524c", +"#9 c #6c6e6c", +"a. c #e4eeec", +"a# c #d4e2dc", +"aa c #a4aaac", +"ab c #747a7c", +"ac c #5c6264", +"ad c #94a694", +"ae c #acae9c", +"af c #646654", +"ag c #dcdecc", +"ah c #a4b2a4", +"ai c #bccabc", +"aj c #5c6a5c", +"ak c #7c8674", +"al c #5c5e54", +"am c #ecf6ec", +"an c #646e64", +"ao c #545644", +"ap c #7c867c", +"aq c #444a40", +"ar c #f4fef4", +"as c #6c6e64", +"at c #545e54", +"au c #4c5249", +"av c #fcfef7", +"aw c #6c766c", +"ax c #e4eee4", +"ay c #8c9a8e", +"az c #748274", +"aA c #84867d", +"aB c #e4e6dc", +"aC c #ccd6cb", +"aD c #d4e2d4", +"aE c #3c4238", +"aF c #b4beac", +"aG c #9ca69c", +"aH c #b4beb4", +"aI c #f4f6ec", +"aJ c #3c4a3c", +"aK c #949694", +"aL c #949e9c", +"aM c #9c9e9c", +"aN c #848e8c", +"aO c #9ca694", +"aP c #a4b2ac", +"aQ c #bccac4", +"aR c #5c6a64", +"aS c #848674", +"aT c #646e6c", +"aU c #74827c", +"aV c #94a294", +"aW c #7c8a84", +"aX c #dceae4", +"aY c #94928c", +"aZ c #7c7a74", +"a0 c #c4c2bc", +"a1 c #8c9684", +"a2 c #a4aea4", +"a3 c #444e44", +"a4 c #bcc6bc", +"a5 c #8c8a84", +"a6 c #5c665c", +"a7 c #7c8274", +"a8 c #a4a29c", +"a9 c #949a94", +"b. c #bcbab4", +"b# c #74726c", +"ba c #5c5a54", +"bb c #c4cac4", +"bc c #d4d2cc", +"bd c #ecf2ec", +"be c #acb2ac", +"bf c #646a64", +"bg c #8c8684", +"bh c #9c9a94", +"bi c #84928c", +"bj c #eceae4", +"bk c #b4c2bc", +"bl c #dce2dc", +"bm c #cccac4", +"bn c #b4b2ac", +"bo c #848a84", +"bp c #f4faf4", +"bq c #8c9284", +"br c #6c6a64", +"bs c #6c7a74", +"bt c #a4aaa4", +"bu c #747a74", +"bv c #ccdad4", +"bw c #545a54", +"bx c #4c4e4c", +"by c #bcc2bc", +"bz c #5c625c", +"bA c #d4dad4", +"bB c #6c726c", +"bC c #e4eae4", +"bD c #8c9694", +"bE c #747e74", +"bF c #ccd2cc", +"bG c #d4ded4", +"bH c #b4baac", +"bI c #94968c", +"bJ c #7c7e74", +"bK c #c4c6bc", +"bL c #8c8e84", +"bM c #a4a69c", +"bN c #949e94", +"bO c #bcbeb4", +"bP c #74766c", +"bQ c #c4cec4", +"bR c #d4d6cc", +"bS c #acb6ac", +"bT c #9c9e94", +"bU c #eceee4", +"bV c #dce6dc", +"bW c #cccec4", +"bX c #b4b6ac", +"bY c #848e84", +"bZ c #8c9294", +"b0 c #acaea4", +"b1 c #64665c", +"b2 c #dcded4", +"b3 c #54564c", +/* pixels */ +".x.0.OaHbI.2azbK.rbJaF.Zbq.EbqbT#..x#6at.S.KaGbOaz#5albJb1b0bAayaw#..S##.xb0an#IbI#NalaFbH.5a6bN#kbSbobT.5bObu.Z#k.5.ZaYbL.ga9aZ#e.EaDbqap#..Z.S.SbP.ZbMaF.BbI#lbT#3ap.xbYbO.SbL.ZbEbXb0awbL#PbI", +"#k#c#..San#c.5bqa7bqb0bR.SbW#P.KbLawbqbLbCbHbT.5bY.c.ibObMa0aD.5.xbHa9.6bHa1bT.raAbIb0an#3#5bt#caAbXbWbYbtbSbM.SaCbq.t.xa5.SbLaAbLapbP#cbo.SaCbt#kbPaybIaOaGbMaOaG#c#k#S.Z#5#3blbIaO#k.Z.xbHbLaH", +"#3bOaHa1.xb0bH.YasbN#c#kbq#cbM#kbYbMboatbNbTbG.K.B#6.Eb0#t#kbz.cbPbqaw#1bt.EaHa9bTaA.KbCbu#pbobkbo.EapbSbJ.YaGbba7bLbSbMbHaZbIbIaCaH.0bH.D.N#.bSaCbM.ta7#3aB.E.EbJbNbOa7aGb0bY.0#lbT.5bt.0bEbq.S", +"bM#VbJbnbObIb0bMbQbOaqapbM.ZbobL.xbfbT.EbJ#caAbHa4#5bTb2bt#lbqa9#k#caBbtbt.SbJa2bmaY#JbyaMbybz#f#5.5awbOb0.Z.KbXbY.xb2a9bLaSbH.Uapa9bY#c#E#5.N#tbHbtbTbebEbKbebQbP#cb0bFbE.SbJaw.Ba9aG.xbM.Z.EbM", +".l.xbR#P#sbI.0.ZbnbVbNaA.Z#3.0a6bEbJbG#k#6bIbqbebK.EaGbMap.Ka7bIaAbF.ZbqaH.O#3#.boaMbhbf#3aaab#o#kbt.S.5bYbubRau.MaMaAbMbMbM#s.x#5bX#6aEbSbAbEa9.0bHaGbq.B#ca7bI#cbY.0bXa9bMbb#3#4#3bqbSbq#kan#4", +"aY.F#ibha7aA.iasbbbo#3bebybL#ybLbN.xbu#la6bSaBbNbrbl.xbV.W#lalbIa.bI#taHb..KbN.ibPb0.Kbb#va9a9aL.K.ZaCbObea7bo.F#v#5aGbMbL#1.E#I#6bu#3.K#5bP#3aG#Sbta9#JbObBa2bobIbW.Z#6#ka9.Z#5bqbHbO.7#lbK.EbR", +"bUbJ.ia4.wbHbh.Zba.O#3ap#3a4#nbUaA#kbYbI#c.7b0.5a8a9bS.NbQ.BbFaA.Zbtbtbt#6bIbFbtaAaAbXbHbLbNbpap.SbebI#5awbq.xan#cbo.KbobHbT#R#Ha9#E#5.Kbe#catbfbIbSbubIbeaKbtaKbY#casaG#kbH.ZbybTaO#cbJ.O.ZbIaG", +"b2.PbIaAaAb1.sbX#Ebfb1#t#qaAbAaH.Ebua4#6#kasboapb2.x.xaGbEbe.5br#9bubX#6bEaKbo#qag.ZbTa7bPbH.5#5#k#5aGb0a7btbY.K#LbL#5bM#X#2#N.ya2bu#C#y#3bo#jbB#B#qbb#c#9al.K#5bTbNb0#cas#3bN.x.ZbEbXaHbN.0.Z.0", +"bq#6bS.na9#ca4bq.Zbtbu.Ea9a7#LblbXapbebqbo#6bYbPa4bXbYbT#IaAaZbqay.B.ba4bNboa2#5.x.EbYbo.F#5#DaAap#5bI#ka4bX.EbRat#kasbJas.O.Zbq.7a1aO.nas.S#2#e.2.ZbHbX.S#5#L.SaVbY#caV.MbSbG.dbObqbIbMa3bb#c#L", +"#kaG.San.6#l.EbAa2b0#k.Za4.Oa2#3.FbMbb.ObJaH#kbRbGa1.nbn.5bn#sbM#N.Y.EbSbEawbebqaC.BbIbJbq#6.K#J#cbT.B#3.0beb0bQaAb0bLbqbIb.b#bO.baya7.E#P#kbP.z#e.x.db0btbE#6bBbTbT#caHbTa2aGbY#3bAbBbSbTb3.EbK", +"bwbYbMbEbo.Eap.x#5bHbebo.LbLawbE.x.ZbqbYbMa2.x#5.ZbJbXa7.ZauasbPai#kbE.BbYb2bzaHbP.Z#.a4a2bJ#5#6a9bQ#k#3bLbqanbM.xa8.0a0aObM#PbR#Xa7bq#O.gbRbRbK.xaAbUapbJ.KbNb.awa6b0a7bYbN.SbY.ZapaObubYbY.0a9", +".1bqbA#PaHawaCbVb2bNbWaCbG.EbYbXaGbKbSaw.E#W.Sap.IaGaIalbJb.#Hb1bH.Z#3bqbH#6#Sbl#k.xb1btbN#JawaKbI#kbKbQ.Sboasa4#6#IaCbMbXbJaAbIbT#sbLbrbL#ibW.zbI#5bHbObu.SbSbLaG#5bEa2bt.x#3bX.wbEbjbo.7b0apbW", +".ZaDaGbNbTbQ.6.Z#3a2#3#5aA#lbMbFb0blaAbq#5apbqbXbI.5bO.5bIb2.E.Z.Zbq.Sa9.KaCaGbT#cbRaHbI.xb0bua4#5.B#5aGbLapbMbo.g.Ea0#QbF#N#5.Sbr.wb..z#hbLbTbObB.BaGaHbXbEbTa9bH.ZbLbPa7bX#c#.bSbt.E.BbNbKbNbO", +".5bGbKbYbNa2.da6bJbq#6.Za2bNboa4#c#lbEbbbNbXbu#3bTa0asb2.E.YbTb0.E.s.SbK.B#maAbbbI.0.x#3bNbI#B#ha7bGbFbTbq#3.S.ZbebT.SbWbqaB.gb0bObmbtbIbLbT#3b0byaw#tbJbQbO.x.Sbo#Lb3bNbmbobKbOawbRa2bJb0.YaAa2", +"btaGbEa7#cb1byaGbobqbL.Bbe.7bIbqaBbWbq#5bq#3#cbX.ybHbnbqbIbq#ca7a7bTbJbPbmaKbIaMa1a7bJ.6.xa9atboa9.5bWax#6bW.NbXbUbTa5bT.Kbq#3as.waYa7aMb0bH.Ea6bNa5aG#5aCbTak.EbTaA#5bHbL.xbobhbS#5bHbea4bIap#6", +"bN.5a2bX.xbQaH.B.Z#3.dbU#kbNbMbFa4btbWbM.E.S.x#6asbL.ZbLb1.Z.0akb..0aZb0bTbP.ia9aAbHaGbH#L#cbeaAbPa2#lbQbLbHbw#3bHbq.5.SbM.SbMbIbB#qa5.xbbbi.M#c#tbebob.bYbJbTbA.wbo.wa5aAa8#t.h#3#ibS.ObIan#3.0", +"bHb#bM.Zbq.sb2b0.a.SbbazaRbNbN.nay#3aG.J#ybSbNbNbWaB.YbL#6anbYbE.Z.xaO#cbea9a9be.mbH.nbq.EbBbebB.O#.#6.x#6bI.Kb2bybAbqaAbP.5boat#k#c.ca#.ZbQap.MbTa2be.Za7bQaw#Oan#ObP#5bY#5#5bJbu#6bBan.E.xbI#3", +"bWbX.Z#5bKaua5a7bTbNbY.B.5bRbVbt.6.xaHapbO.bbqbz.x#5bNbJ.Z#3bHa9#2.EbebN#k.Z#5#q.Z.ZafbV.ZbMbNbqbXbSbI#5b0aG#5bDb0bKaHa4aAbu.0bIa2.xaG.E.BbAbNbHa9.SbYbI#6.ZbIbQ#2#cbIbQ.0.KbO#6#c#PaHbM.EbfbHbo", +"bKbIbI.i.0bL.7.waG.Tap.Sa4.0buai.KbS.Oaw.Sap.6aGbO#c.Sa2bJa7bebH.x.0.BbI#c#Bbu#cbR.YbRa7a7bM.xbI.x#Tb0bVa9bI#cb1bq#c#hap#c.x#3#kbI.KbT#mbqbO#6bPbYbYa9bNatbWawala2bq.xaAbTbobtbf#hbO#5bo#3bIa6aw", +".Eb#.E#2b0bTbMbe.S#3bP#6bOaHbSbSbMbYbP.xawasblbQa2by.TbJasaHbe.KbT.KasbqbtaAbH#3bIbobybGbWaC.E#G#..EbqbqaA#6a9bYaM.6#caB.Ea9bKay.ibL#5.Pbta8b0bMbFa7bqbIbea2bJ.E.KbqbS#6bJbYa9.O.raubA.xbY#kaAb2", +"bJbO#lbXbM#laYbT.Zbl.F#5bBbX.xb0bHbebI#3bNbtbTa7.5bO#3bo#cbObNb2#6bOb1a0aYaAbWb2#6bC#9asbH.0bHaC#T#kaHbXbqaA#5#h#3bYb1apaAawbTbS.k.ibha9aYbMb#bMblbeb..nbtasbKbEbzblaA.ZbQbJbYbTa4bTa2b1.EaGbIbF", +"bT.xbKbHbWbq.B#ka7aubqb1anbUbL#JbT.5bM#6.xaAbIbubL#ca7.SbUapbM.5bu.ka9aAbMbJaYbT#SbPbBbfa9#ca9bH.S#cbXby#waA#taHala2.5bKbSa9.EbMa9.SbhbLbM#6b3bTala7ana2bLbqbTbe#3aAbQ.6a9bN#Qbtbqa2.xb1a4bzbqa6", +".x#lb0b..Ebhbqb1a8btbmbbbhbJa2#5b0bebTa5b0bJbBbIbNa9#5a9.x#3.SbXaZa5.HbX#B#UbLb1a2bYbYbMa9bobtbF.0bJ.SapaAaGbG#gaGbSbJana9b1bY#3.E.x.Z#cbqbQ#cbqby#cbMbIa6bLawbEbH.KbtbLbeaOa7bqbealbube.5bK#.bo", +"bK.BbLbX.ZbXbL#3bKbhbu.ya5.ibPbTbLbh#5.Qby.k.i.k#5.Bb0.BbPaHa4a9a0a8#qbL.Qbnbq.ga7#laAa9bT#B#v#jbK#k#ka4#kaKbTaHbL.Ebl.5bN.6a4bIaza2apbt.cbY#cbb.ZbI#cbfapbSbIan.iaMa9bN#l.i.5#4bI#c.na9bIa9bHbe", +"btapapaW#kawbe.0#8aVaW#5a4a9.i.IbNa2a7bw.OasaGbh.F.naG#l#5bBa9#qbBbFbO#5bMbOaAbB#k#X#kb0#kb0aZ#kbS.e.S.0ahaObSaybHa7#k#kaA#U.nbH.0.Z.0bHb0#P#k.S.BbHbebMbI.x.Zbt.J.7.Z#k.S#T#k.E#4aObN.daF.e#4#P", +"#kbQa7btaGa9azbY.WaGaGa4a9.Ob0b0a4bJaHbFaza5aAas#VbL#kbe.0bMbWbwb0bL.xa8bIb1bJbJ.O.F.I#ka2#ibHbBbIaFaC.SaHbY#l.0.0asbPaAa1.KapbPbMbS.0bSbq#l.xbqbTbY#kaH.0a9bt.K#O.Y#P.Ja7bSbQbEahbq.E.Zat.BaVbH", +"btaGaH.7aCbHbNbS.WbsapbSbLa5bO#6.b#k#lbo#5.gaGbcbTax.5be#k#xa6#n#3bIboasbFbebJbO.jbRbLaKaMbo#m.ia6.xa4#PaHbOaFbqa7bBaO.xasb0.E.Z.Eas.x#lbqbzbKbV#c.Z#xb0bY.SaH.EaC#m#.axb0bNbMapbL.4#.by.CbTas#l", +"aF.SaHbJbNbMbC.Zapa2bGbQ#6.KbC.IbG#cbq.K.5#m##b1awbX#k.5aGa9bT#5.xbm.Sa0.FbhbH#qau#6#JaA#B#hbc#5.B#k#4bO#.aGbSbIbeaDbM#k#5apbLbu.E#3bXbtbX.nbob0bKbT#Va2#6bJbIaG.KbDbEab#5bEbS#tb0a0as#lbMa5aA#B", +"bHbOakbE.E#..Ba7aLaT#c#3btaG#NbY.dbfbN.ZaIbKbPa8aC#NbNbSbXaGaAbebObR#5.xbBaZbJa7.k#9aZ#Lbu#vbeaZbKbHby.xbHbO#.#PbTatasbyaB.VbS.x#cbt.FaGbXbLbN.Zbi#cbT.Ea6bYaG#kbObY#ubEbobuapaGa5b2aZbPaZbLau.G", +"btaSaB.D#lbT#ObP#ta6#3#3bBbHbe#k#5.5.ZbFbEby#hbqbq#.bu#lbKby#5#BbEbXaYb.bL.9bXbX.i#BbB#Ab0bLbJ#lbM#k.F.5bJbTb0a7#9btbe#5bt#JbebMaMbqaMa2bzbobt#3bTa4bMbo.0bXbIat#J#3bYa2bJ#6bo#6.K#5#mbtbBbKboaA", +"b1#l.j#Q.D#H.B.xaHbyanbYar.1.xaya2a6bY.x.ZasbIaA.Ba4.5asbE#B#5bL.KbLasaCb#bKbXa2#qaAalbua5.S.5.Ebt.zbXbMbTb1.xbzbIaCaAbyatal#5bt#ca8au#6bebRa9#6as#cbN#cbWa9a7#kaH#Va6.E.E#c.xam#lbBaw#5.5bBbEbA", +"#U.4.0.Q.ZbMbObX.KaKawaKbP#5.bbq.M.Ta2bWawa8aAbI#kbRaGa4bJbubPa9#3bIbPb0bTblbWbn#3bLbt.w#V#U.Z.z.I.ZbRbKb1bLbXbWbBbebLbtbfaK#c#uaA#6#6#S#vbSaMbe.EbHbI.0bo.xa9.Zb1#k#V.xbNa1a1.ZaU#q.dbNaL#6aRbN", +"ah#4bS.Va7#e.Maibqan#kbXaw.BbLbYa2aha9bIaAbGahawaAbB.ibXbT#c.xbbbJapalbe.xbO.#asawbJ.QaObXakaZa9bXb0aAbA.0br#5.sbNaha9#cbVaCbYaVbDaw#c.ZbeaBaebMbKbP.qbMaAbYa1b0bEbSbE.Ba7.i.Q.BbObNboa7bM.Sa7bW", +"aOaw.xambN.M#2bGbJ.0.Z.xbT.E.ZbHapa2bt#k#3bIaibQbTaAbRbT#k#BbMbMbybybNbe.S.O#..Zb2.2.5b0#H#kbKbt#5bu.ZbM.k.K.xbe.xapbea7aG.0aG.5a4bEal#6awbT#Ob0akbT#c#.bH.SbLbIaUa2.xalbH.0.S#sbebf#J.ObNbJbN.O", +".7#l#4.SakasanaObMaGbqbN.0b1bQ#..daGbIbJbTbTa6aCbObIbH#S.Za5aY.xa5#jbobo.K#5bFbLbtb##U#Rbq.hblba.0bna0#5.QbO.EbM#haA#.bLbMbKa5aAbCbBbfbTbqas#3bWa7bNas.Za7.EbYa1bMaVbt.EbYa7#O.BaKbXbuaHbqasbH.E", +".S#6.Z#kapbT#4bIanbHbRb2.S#cbO.xaybb.BbX#t.Z.V.abJbTaA#5.i.F.KbKbFbFaa#3bf#vbobbbnapbM.S#2#lbKbra9bXbI.0bebMb0#h#6bXaAbM#3bnbPbubobH#.bzapbLbNbIaHbP#ca2bI#5a4bLbK#k#k.Z.B#3bPa7bYbbbobJaG.Ea9ak", +"bLbq#kbJ.S.x#c.E#PbW.Z#l.6a6.nasbQ#4btap.0bBbS#cb0bTbBbLaIa9bL#5#q#taAaaaK#nbtbt#n.ZbH#Rb1bqbUbJbKbz.K.ZbobLbtaZb.aZ.kbM#vbIbM.ibTbFan.KbRbEaA#5bqa9bebI#cbLa2bu.x.xbFbPbIan#HbeaA.KbT#m#kbo.Zbq", +"aIbMb1bHbP.pbLbP.xaGbJapbSbX#.#caCaUbTbTbAbX#c.JbXalbXbb#ia7bJala4aM.Ka2#LaC.Kbwb2bBbO.BbL#U.0#mbXbJaAb.bIaG.PawbMb0bMbn.0aKbHbXa4ae.iap#lbIbo#kbBb0bo#cbPaGaAbua7bI.ZbE.E.xaybbbBboatby.2.Sbq#V", +"bLbTbMa9bP.S.xbRbLbYbPakaAa7bM.E.N##.K.Fa8.SbtbNaG#kbPbrbTbIb1bK#Ra7a7#3bbbxbu#qaA.x.5.0.x#XaK#3.xbX.Ka7bLbIbyaAbq#cbq.Y#3aObb.S#k.sa7a9bPbt.aa2bTaAaGb#btbubt.KagaSbL.SbLawa9aVbI.KbtbM#3#cbJbX", +"bc.FbT.g.haqbMbPbP#ebIbN.6a7#kaAaV.cbtb0b2apaObEa5aAb2.KbIbubl.K.B.Z.7bM#5.0.KbE#vbHbXaf#ObY.IbobhbNbm.ibTbhbT#u.SaWaVbHaG#c.ZaU.A#YbIbYbfbSbGbibo#3aMa9#mbP.K.Kb0.Q.S.xa2.ZbNaCbb#6bo.5bTa7bq.B", +"aw.S#4.cawaS#P#.bqa2bX#.#c#caPa2bHbQ.FbY.d.3aw.o.J.5.5btaGa8auaY#GaebXbWasaK#v#a.H#ObPbJ#3aAaU#cbL.KbIbK#5.xb0bI.a#4.ZbbbL.SbI#..I.SbT.E#k#1bL.6bTaNbo#5#3.YalbLanbqbSbTa7bPaxbubfa7bz.0.Yaw.5a4", +".Ea1.6#2bSbqazbX#kal#c.xawaGbSaUa1.5.5a2.WaCaybYbEaVaH.SaAbq.kbaak#k.0bX.xaY#v#5as#sbB.S#ca9#ca9bK.I.Kb0b0bI#kbKaO#VbHaw#3.Sa7aebX#I.xao.wbq.5bM#5.Zbua5bEbe#vaGbybB.S.Ka2#cbz.SbYb0bBbB.Z#5bo#k", +"bNaG.6apbY#k.r.7aSawawbXaC#caCaP.xbYak.VbNbb.WaWaxbM#c#lbNbXaAbIae#O#.bq#tbO#9aKbRbT.S.ZbNbyaHbNb0bPaAbBbJ#LbebMa1bq#kaKa9bL.x#NaH#Q.x.Z.S#Hbq#Xbyb0#5bMbFbBb1beaAbL.xbtbP.KagbJbqbtbL.xbubTbqbM", +"awbIaCaC.x.0a2aG#k.O#kbq.xbGbS#6.SbHbMbSaCahaGbB.Saz.ZbLanbPbTaY#l#.bTaAbqbeaA#La7aGbFaBawb1boap#Jasa9bWbWbIbObX.NaGbSbP#5.ZbrbMaAbL#kbIbM#hbKbX#caA#3bebuaAbebfbq#6bNa7#5a7bEbobubEbTbE#4#3aGbL", +"###caG.SbEboaGbMbMbY#Vbea4bvahaW#PaC.Zbq.0#6bz#6.J#Waz#J#lbPbLbt.0b0.xaKbO#mbLa5bwb0#kaH.Sa2bWaAbIbJatb0#6.iap.xa1bY#5awa0a9bnaebaa7aY.EbXb0#l#ka8#Ca9bobTaKbYaK#rasbIbLbN.SasaG.4a2.SbobXbK.Ybq", +"an.5bua4by#5.O#c.haCbJanbY#caJbfbHasbNbY.2aq#JaAa7aGa2bybOaAapaYb2#9bLbPbWbXb2.SaHaHanby#3.hbTaObX#3bL.SbT.x.ibTa2bN#5bBaGbobJbqbt#lb#.EbJ.5a9bL#3beaKbOa9bu.E#vbK.MbtbqbN#5bM#3#k.KbtbMbI#c#cbo", +"bobfbLbYaAayaA.M.Eal.nbybLbubE#caia1.7btbBaM.L#BbSaC.5#kaCb0bOaYbMbAb1btbPbL#nbLaU#u.SbebNb..5#sbMbub0a9a8b3bTbI#V#3bubF#q#vbn.2.KbMbo.kbObLbJbJboboaC.KbY#man#mbqbBbLapbMbbaGbS.5aHa7a7bYbebLaG", +"bT#Eam#p#5aAaL#3bOanbqbVbEajaHapaO.SaH.SbObhbM.H.a.SalaGbTbYbh#6bJbM.p.2a9aA.0aoboay#9.E.x.E.g.2a8.5bn.sboaA.Z#6axbF#Ea5ab.4btbJb#bbbPbzbNaAbxbM#5#5.K.iaqbB.K.Fa9anbTbH#k.EbP.SbIbeb0bYbu.x#3bq", +"#PbN#Ta9aVaWbtaG#VbP.ZbhbXbM#h.G#d...ubYbq.7#k.0bNbwadbSbea6aV.5.X.1bE.J.ZaAbS#5.5.Z#T##bY.E.F#l.EbH#c.Ebu.ZaH.CbTbMbXbT#n.5bMbM.JbEbG.5bBbSah.KasbqbtaYala5bJbJ#cbo#3bNbubnaC.gan.cby.Obu.waAa0", +"#4aGbN.E.BataG#ubY.x.EbLbM.2.iaKa9ap#EaGbAas.S#..BbYbNbN#c.Ea2#3#c.JbN.5apa2bRb0.FbNaA.6bWbQ#.bPa9by.Sb2a2bTbE#6bTbIbq#5aA#5bua0beapbEaGbq#capa7aAbMa0bIbt.KaAb0ay#3.Ka2.BbI.sbqbSay.x.Z.xbo#SbI", +"ak.EbSaVbRbSbbbbapbi.KapbF#5bCbtbBbbbOaAbIbI.EbXbI.0.Ba2bqaG.5.dbSbNaCap#mapbubLaM#kapbFbhapbuapaCbJbobSbqbo#FbHbub#asbJbhbJbh.B.FbHbq.0a2aw.BbtaAbubXbI#kbXbPbAaPasbo#5aC.5a7.hbt#kaH#5#c.IbL#5", +"aB.0bMa4#6bP.KbtbDaW#5.W#yaw#qbybLbI#vbXbT#hbLb0ay#5#3#kbA#cbBa9blaGaMbo#Ebh#W#maG#q#Lb2bobe#vbz#AbNaB#5bo#5aw#v.0b0.KbK.EaAbJb1#3bKa9.KbObJ#c.xaAbLbobLbMbubIaYbDbSa6aAbI.Eb0.5bt.xbubH#ca7bbbL", +"aq.nbX.SaH#3bLa9#B#BbiaTap#wbi#Cbh#kbh#5a5#6bm.ibJbqbMbpbM.0bMbb#p#jbu#m#J#9#9aMblbu#6a9#5bfbIb0a9bfbUbIbyb0bobWb0bt.i.SbX#m.Bbbbq#c.KbNbza4b1bKbWbSbLbObobLbeb0arbbbu#k#6bLbMal.EbMbE.Bala9#k#c", +"#kasbMbybXaZ#v#qbn#3boaAbWaXbK.R#I#hbJ.5bU#ha2a2aAbTbEbO#5aAbM.0b0bb#m#6#tbTbhbnbzbobT#9bobeaAbb#ubIbe#p#q.Kbbbua9bPbI.KaY#kbh#6.8a7a7a5bXbBbJbI#kbu#la8.OaYasbMbN#3bL#5.D.i.S#Hbf#h.EbubNa9.Bbe", +"#QbLbIbPas#5a9bP#Lbra7bBbtbI#c.x.Z.EbKbJaha4.RaNbTbLaZ.ZbMbtbFbJbtaAakbO#q.ibWas#3#I#3bY#2bJaGbHaLbeaAbebybt#9bT#kbPbMbPbtbebH.EbX#nbIbObqb1b0#vbRaZbt.BaYaw.5aA.R#3#8#k#cbHbXbMbhbcb1b0bTawaV.0", +"bTbTa7bmbRbhbma9.g#b.y.waG.UanaCbKaH.Ea4bN.Jaya4aYbKbubTbL#hbr.Z.SbYaY.ObL#sbPaYbq.5ak.E.7a4aebY.kaLaMaM#mbS#qbtbra9bTbobLbhbX#haZbP#hbXa8#h.xb##.aAbPbPbXaYbJ#v.Bawbe.x.KaA#k.QbTbTbXapbE.xaCbQ", +".K.K.E.x.xbY.Ka9.bawaDbq.v.ZaO#da1a2.ca2.aa2aGawbMbTbObTb0bB.zbe#T.V.xb0#ca9a8#Ja4.S#5bH.Oa9.B.SbtbTbL.ZbH#lbBb0aG.ZaAbI.ZbubLb0#k#K.n.bbNazaq#q.SbE#iap#Db1#l.5#3.KbMbAaAbE#BaAaKapaAa5b1bTbua8", +"bwanbObI#r.7bu#ybSaG.5.Q#G#.bVaw#cbLa4.BbObQbqbGbMbLbtb1.KbPbMa9#..MbqbobRbMaBa8a9.5b1awbTbSbybKaAbX.S#3bXbP#NbM#qasa5bMaAbIaAbL.S.x#4.M.SbYa5bLbqbSa9#zaAboan#.bLbwbubebX#qbS#5.x.i.KbI#m.2asaA", +"#6be#3a1.E##bmbMbBbYbP#UbRbRa7#6bObWbXbI.E#qbJbTb0byaqbJbMbXbWbt#X.NbH.ZbNaAbu.i#cbKbKbfa2bBbXbN.ZbTbRbT#sb0#5bJ.Z#.bPbXaMb1#6.E.IbR.naObN#kbTb.bI.EbobMaAbAbHaAaGbJaA#c#qbCbo#5bLbMbL#cbObXbObX", +".KbJ.7#XbSbWbtaG.Sa0#sbTa8a7a8bTbIaKbLbIbJbhbR#3aAbLbMb0bMaAbIaA.7bMbN.ZbS#BbX.Kap#AaibW#kbNbTbIb0bXa7#k#3.IbH.iasboaYa2asbqa5bIbLa7bMaW#ratasa0a1bq#c#va9#3.xak#5#nbe#3#5bebXbIbMbtbJaY#kbXbTbo", +"bFbz.7bT.5#kbybo#hbWbobtb3#na5.7#J.IaYboaYb2bPbOasaCbe.Kb0bPbeaBbWaObMaHbJ#EbY#mbqa2#kaAa2#5aO#c.5b#ag.5b0bObK#2aZbL.EbT#5bLaYbJ.K#vbNaG#k#3bubIbT.F#Lbea9#A.ZbKbQ#3b1bL#3#6bObtaAbOanaBbJaAbTbb", +".Kbna2bq.Z.0#m#vaZbTbo#L#BbubPaAbr#cb1##bM#tbH#vbMbT.Za8beb0#.aA#ka9bPbObL#kbB#5bSb0aGbIbqbT#Ja7b#bIbObnbP.Bb1bEbLbobza0bLbobI.Ka5b0byapapbQ.Ea8bHbLa2bobS#3aG.xb0bfbE#3bub0bz#c#6bIbhbI#6bLbebM", +".KaKbYae.S.B#5bIbqbtbu#y#E#cbSbJ.F#3#ca2awbIa4aHbIa9bIbTbWaA#hbq.h.7bHby.fbt#6bYbqapa9bMbBbYbNb1#k.F#k.0bI.0bh.ZbIbh.Eb0bt.Bbha7#maK#Sbi.V#k.KbX.E#kb0a8bua5.5.0aI#AaKbuaK#5aHb0#hbtbRaGbLbKbLbA", +"b0be#P##.EbBaAapbPa7bNbv#7.a.0bObsaFapaGbGbSa2.6aAbTbMbObJ#5bI#5bIb0bWbtbIa7aWbVbtbM.xa9.ZbTbqap.x.s#3.g#3bL#NbK#3##a9aY.xbh.0#5#Jbh#EbebM#cbT.6bqa4b1aLbNa9bM#VaM#6apaA.xa9aM#5bJbM.BaZbXa9bubX", +"bybIbSaGb0.caMbYbJ.r.5#k#P#XbL#.as#XbJbK.2btaGbD.Z.PaYbH#h.B#cbb#KbebqbbbNbiay.Ya7.Z#UaObH.6#2.7bJbH.0#3asbKaA#5#2bOaSbLbPb0.S.g.d.KbGbEbNb0bXbn#X.B#H.0#2.Z.n.SbYbHbMbE.KbTa2.Za9#caKbo.KbtbMbo", +".5aAbWbS.Ebo.Z.K.BbJbEbX.5aH.5bqaA.EasaHbobeaGaC#s#XbIbLbIap#3.O#3.xbIbtaCa2aLbs.SbObIbU.s.xaAbPbIb0bLaAb1bb#6#mbM.0bt#UbN.g.ZbLbu#VaH#ka0bo.5aK.ZbP.KbJbWa8bJ.Ia7aK.SbEb#a4bLat#nbobebLbNaAbTaM", +"bbapb1a9bobP.xa4aGbqbq.Ba9bOaHbqbT.jbXbI#cbMbiaGbWbI#XapaSbObIbEbqbua2bo#5bV#6aybW#XaF#IbL.Oaea7#O.0#kaBbM#qaA#maA.gbbbTbJ.EbBbJ.dbMaGaAbNbTb0b#b0.hbH.BbRbIbEbWaAawa7beaFaAbMbebtbWbL#t#L#5#3#c", +".5a4.E#kbd#lbXbOa7#cbo.xbHbO.E#3#ka6bobLaGbKbq#3ae#.#Nb0a8a7aH#6#tbzbI#6#cbCapbobMbMbF#k.Bbr#.b#.Zb0#6bOasbMbybMb.a9.i.SbqbLbcbTbNa4#6a7#cbTbJbIbbbT.KbObKbF.g.K.0#3bS.4aG#3bY.xbubTaGapbYbMaAbL", +".5aA.K.K.ZbGbBbVbobHbybz#kbB#c.SbNbebHbea7a4bTbMbTbM.IbT#.aGbJbSbF.E#EbJbebtaYbu#s.SbWb3bybI.5bIbH.gb#bLaAaY#qbIb2bMbY.iaAbXbLbf#eawbOapb3bLbBbT#ha9bIbh.0b0bLbPbY#5bX.BboalbI.Kby#A.KaAbe.K#5aH", +"#kbtaGbqbebX.7bO#c#JaGbPbo#3b0bu#haHbebWbXbBbqbW.Pa7bJbO.EbubKapaM#3bXaYaAbRaZbPbBbP.Qa9.gbI#3bI.xbTbI#cbmbebobJaMbM#3bKbP.Y#ua8#cbG.K#kbebqbnbLas.KbXaAbP#3a9bMasap.5#6#l.x.6awbzbubtbfbbbeaAaK", +".B#5.5bebYbta7#3#6bXaG#x.KbY#qbNboa4.Ma9bNaA.gas#..l.QbMb0#c#5b0#5#j#3bIby.kbWaYbMbBbCbr#3bKb0aAbL#ObLbP#3bhbT#nbLbobPbybeaA#Z.K.MbH.ZaC#6bTbtasaZ.Kbt#5bobLaYbebWaCbya7bNbuby.7bob.bebtbL#nbYaA", +"#t.5bTbMbHapbMa7bea9bobo#maAa9.KaHbl#AbQ.4.5bq#saS#2.Fakbh.x.BbDbo#5a9bMa0b..g.I#qb0a8bJ.Zbrbt#3#HbXbN.ibTbobP#u.i#g#3.iaAaK#6bnaP.xaGbtbM.EaYbLbIaM#ma8bIabaAaKbt#ka9bIbebFbHbqbmanbT#3#5#5#5bl", +".nbH#c.n#lbq#kaHbX.SbTapa7bEbBb2#ca2.J.6a9.ib#bT#cbe#t#3bI#DaAbX#6alaAa9bB.E#mbH.ib0asbebbbKas#3.0.KbPa7#l#cbo.Z#5a2#5aAa9bybTa9#Q.x#N.x.ZbJ#kbqbL.BaebWa7.O.UaSbN#qby.Zbo.0.SbNbqay.E.N.Ea9.MbE", +"a7bYb2.EbYbP.xb0.SbobVb0.KbNb0.Eaya1aGaA.ZbqbtbJbzaAbeaAa4.K#BbTaqbBbIb0bRaYbIbobJ.KbubPbLaAbo.sa9#c#k.KbubIaqb1axaw.0be#.#3#kaGbTbLbIbqbP.jbM.B.S#R.xaO.i#2.x.ZbYbIbua9.BbI#lbKapbfbubMa4a2at.Z", +"bLbH.E.K.Zb0.xaxbYbMbq#6#lbO#3aAapb0bEbEbn#.bOb.#Lbbb1bt.Kbe#.aGbMbLbTa9#.bObJbIbB.z#5bLbobI#ibb.SbebXa9#kaGbz#c.ZbTbN#kbO.Sa7bQ.PbPbobLbI.F#5bXaA#NbMbT#Ia7.IbIboa9btbObNbP#V.ra7bNbNaObw.fbOap", +"apbyaw.5bL.SbEbK.x.E#5.Z#cbA#caGan.Ba4.Faqb.bbaYawaA#5bSbLaMa9#5b#bMbBaAbTa9b0bqbo.Eas#hbWbXbL#3a7bR.FaHbt.6.SbIbqbtbtbJbqbobebEasbybXbfbX#3bJ.F.h#lbI.BaA.sbQbMbP.E.ZbNbIa9bB#k#3asaHawbqbX.K#.", +"aAbSasaGa4bIbS#6bobla7#5bLbS.xbA.x.Nbo#kbEbTbqaMbtbtbt#qawbLaAbt.KbLa8bTb#bIbh.BbXbca9#kbIbNbX.8bF.VbJapbLa9bybNbJ.0.Y#k#6.xbu##bO.xbK.SbIa8#k#tbWaAbIbIbH#lb1.0bt#6b0a2.EbAaCbIbS.EbL.0boaHbRbN", +"bT#6btbt#L.Kbh.KbI.FbobIbJbqaAboaw.BbNbIaHbXb#.U#3bwbT#6a9.Ka9aG.Ha9#kbJbebLaAbU.KbMa9aAbMa9bJbL#3aGb0a9bubL#rbtbNbobO.EboaG.K#6bTaMbOaMbtaYbtaMa7bJaAb0bOaK.Fbo.0bYbqaqaAbt#5aZ#kbebObobX.gbuas", +"#qbSbPbKbubAanboapb0.Eby.5bYb0bYa4#cbRbPa6bObL#qa4a9aA#3#6bubu#5.ga2b1b0bJapbL#3.saA#lb0bTbtbHbIbQ.Da9.7.x.7apbJa2bPaHbLbY#k#6bMbEa8bB.ibJbIbOa9.ibMbqbnbe.Ba5bJbT.0.Z.S#5.B#t#c#q.xaAbta5.SbMaA", +"aHbxa2be#6bBby#t#k.xbua4a4bPa9aHap.0#cbAbWbIa2.l#JbKa9bo#AbTb0bzbeaAaAa0btbI.lbLbybXbAbTa5bLaZbubJbubLbya2anbJbT.2a9a2bXa4bTaHbHbubnaA#Lby#3a5bobubB#q#5#hb0btb0a7bM.xbA.xa9bYaKbKa8asbrbOaY#vbT", +".5a9apbX#cbH.SbybYbM#5bYbKapbIbX.M.Vazay.ObAbI.SbFbPbf.Ca4b0bobLbP.xapbN.7.KbwaAbqbL#ka2.SbLapa2buaGbPa9b0au#c#6.Maw.Va9aAbPbtbL.N#c.cbF.E#6aGalbPbM.YbNbW#cbLaGbHaC#4bLbX#cbIbHaF.Zak#l.B#k#Pa7", +"a9.xaw#kbN#cbo.6bMawbIbMboaFbuap.MaH#ka2.Kaw#3bL.hbPapa8#5bTbLb#bq.Z#kbJa9#JaubebY#6btbP#3bT#c.Ia9bOa9byaAbu#5bea9.0a4aAapbqbOa5bYaQa7.R.0.EbIbIbfahbO.S#3bqbTbo.7.xbf#3.xa9#ebeb1bMa7bo#.#Ha9.E", +".K.nbNa2bA.Z.6bYbY#kbK.M.xaBas#3.Zad#5#.a2#k.EbNaAasbMbTbXbP#3b0bqbNaA.xapbJaHaKbTbfawaHbb.Ea2bK#3bebtbeaKapby#5anap#kbYbT#tbqbT.S.x#5#haC#qaYbJana7#3bY#3#3bHbJbI#6bSaA.FbQbOaw.0bG#kbLb0bQ.rbM", +"bQa4bHbqaCbbajbQapbMby.KbtaG.SbyaGapan#ka9bX.K#6bMbK#cbRbI.7#hbP#4bLaObSasbebB#xaw.E.SbP#lbobQanaKbtbWbtb0bL#Mb0bLa7apa8bObTbHaMbPbT#6a0.zbIaAbh#lbbbLbSbq#5bWaCbo#6bqbybebPbubFbq#kbPbYaCbJbta2", +"awbLa4.S.Map#lblbUaw.xaAbNbr.ZbPaAbIbtaGapbQbRb1awaYbM#vbfbJbtbXaS.xbTbebMbYbfbI.5bSaA#c#6bHb0#cbbbOaLaAbubN#5bo#5bWalbIaAbybJbTa0bobIbTa5bMaMbPbTbSbPb0#5bN.EbybI#c#v#6aA#5btbI#3#cbI.S#6bu.ZbT", +"aGbqboaGbJ.5.K.SbE#c.5bobO.S#5.bb0bh.hb.asbMaG.7bLbzaZ#3#kasbPbI#ka2.ZaH.Ya5awbtbQ.KbMbubY.5bybPasbe#vbQbFbb#JbubXbn.ib0bLa0bTa9bObJ.gbebMbSbJbNaGbqa7bo.xaGbIaHbB#mbobwbe#3.KbBa9#5by.KbEbTbTap", +".xbyawbqa2bzbHbNa9bL.E#3bNaG#3aAa9a8aZbLbKb0anbYaY.SbLbOaAbL#5b0.E#kaGbIbOblbB#vbX.7#5.ZbuaGbMawbBbya9b0#3bfb0#5a5.G#5.ibMbeaAbMa7#xbf.Z.ZbEaC#c.EbTbSbMaG.0bfapbIapbRbtbl#m#3bOa9b#a9bL#mbB#c#n", +"bz.xaGaia6#kay.ZbIapbP.xbYbP#kby#bavbh.Ka9a7be.xbS.i.EbtbJa5.xaA.E#5#kbTat#5boa9bNat.EbTaEbXaGbWa9.KbebE.KbT#5#3bg.k#h.sbnaA.5a9bTbB#Pbo.Ma2adaVb0#cbuap#ka8a4bT#faAabaM#qbobeaA#5bo#v.K#6bE#tas", +".5#4bfb.be#t#k#c.F.0.0bYbO#P#c.FaFakapbYbWbNaM.K.MaGbBbqaH.SbmaZ#d.BaiaGaGaHaCby#P.B#e#PbR.x.xasb0.IbWbTbIbo.ZbMbYa7bIbN#k.E.x.I.6bLbMbYb0bX.M#6#lbJ.Z#NbT.t.s.xa4#3a6bR.S.Ka2bo.WbY.J#cbua7bX#3", +"aG.EbfbebEbE.n.Eb0aw.FbEasbMa1bL#k.naAaGbMaw#.bA#caCbYaAbzaAbMav#T#k#V#lazbT.RbObq.0.7bLaFbIbQa7#kaK.EaKbXbMb0b.aHa9bSbe#kbP.Eae#kbobo.YbuaAa6bT.IbM#..EbIbMbBbTbIbqbL#c#6bMa9bq#fbSa9aH.K#3#can", +"bX#caKas#6#ta7bIa7bBbLbPbYbo#5a2bK#4.JbI.MbBbobbaybqbY.xbJbMa9bI.xaGaqawaHbTbQ#cbW#c.5bfbxbobt#SbtbIbRbJaYasbXbtazbXbobMbPbJbTa8#ca7.ZbN#kaH#3an.B.4aZ.ZbhbK#Q.x.xbt.EbP.EbYbLbt.R#caUb0aGbqbyag", +".5aObobnapa8#c#Pbb#t#3aK#tbo#JbB.JbLbEbQ#kbuaH.Jb0bX.6#5.xa4#5#kbTbNaCbMawbK.KbLbybPbu#6bbbZ#vac.Zbn#kbTbebLbfbIaybobfbo#DbM#nasaHbX#5bMbSaAbMbM.E#5bJbM#3a7a9.ibybSbNaM.xaw#3bHaW#6aLbea9b.#B#.", +"bIbKbeaG#vbe#c.x#3blan#t#k#xbubobRaVa9bNbMa2.EbEbObtbB.0ap#5.0.xawaAbMbHa9bS.S.K.KaKbwbt#q#ubZ#jbLbTbObTbNaYbebTbYbSbY#6aAbt#m#qbqbo#c.S#5bo.O.KbtbTa8.6.Eb.aAbL.5bTa7bHbe.x.ZbtbtbPbYb0be#.bnbH", +"aC#.a9bFbobtbPbLbLbobe#3bbbbbt#qbban.EawbE#.bqbEbHbfb0#5bI.x#c#cbLbXbybtbm.SbI.ybN.Kbe.K#qbD#q#za8.5bfbBbJ.BbTbLaVbMbV#3a6brbT#u.ZbA#kbF#.bMbEbW#B#.bB#naA.K#3bT#cbLapboa2#5#.bobu.KbubyaAbhbIb0", +"#Oa2bX.KbeaA.5a1b0.xaAaAa1#kb1.6a9aA#DbH.ZaVbKbqaA.SbJaA.XbS.S.b#gaA#t.EbL.xbMbWbea2bRbtbubWaM#5.ZaZbP.EbMbJ#mbJ.V#GbHaH#3bc.KaYbL#ca9.0#5a2bqbfbMaZbtaZaAbM#tasbeaCb0bTa4.x.K.E#vbE#LbraKbKbIaA", +".xakaKbybW#6bM#l#ka7#k.nbM.0bH#Pa2#3by#..K#kak#0bnbMaA.5.K.BbNa6aK.ka9bLbc.wbL.7.xaAbqbAbo#JawaB.KbLbq#BbebMbMbL.##Va7#2.S.B.0bIbEb2.7#6.Z.KbJbq#m#5a8bWby#ua8#6#3#lawbTbea7bL#3#3#J#5#.#3.ib#bM" +}; diff --git a/plugins/styles/metal/stonebright.xpm b/plugins/styles/metal/stonebright.xpm new file mode 100644 index 0000000..a538a94 --- /dev/null +++ b/plugins/styles/metal/stonebright.xpm @@ -0,0 +1,353 @@ +/* XPM */ +static const char *stonebright_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 250 2", +/* colors */ +".. c #7b927b", +".# c #daefcf", +".a c #b5cec3", +".b c #ebfceb", +".c c #cce2cb", +".d c #e5f8e5", +".e c #99b499", +".f c #effeef", +".g c #e8e4cf", +".h c #d7d3bb", +".i c #f3f0e7", +".j c #faf7e6", +".k c #bfbbb0", +".l c #fdfbf4", +".m c #dae9c1", +".n c #e6f4db", +".o c #bbd9c7", +".p c #fffdf7", +".q c #91a680", +".r c #effbe4", +".s c #e3e0c9", +".t c #b0c2a0", +".u c #eafeea", +".v c #d3ddb8", +".w c #f0ecd8", +".x c #e3ecd7", +".y c #f8f5e3", +".z c #d0ccb3", +".A c #b6b297", +".B c #f4fbea", +".C c #fdfaea", +".D c #f9fff0", +".E c #eef6e3", +".F c #bbc6ab", +".G c #e3d9c9", +".H c #ada99d", +".I c #ede9d5", +".J c #d1e7d1", +".K c #d3ddd3", +".L c #989c86", +".M c #dff3df", +".N c #e8fae7", +".O c #f7feee", +".P c #fcf9e9", +".Q c #f6f3e0", +".R c #daefe6", +".S c #d9e2cb", +".T c #f9fff1", +".U c #c8c4ab", +".V c #bdd6bd", +".W c #e5f8f0", +".X c #a2bda2", +".Y c #9baf9b", +".Z c #ebf3df", +".0 c #ccd6bd", +".1 c #edfded", +".2 c #a9b499", +".3 c #c1dfce", +".4 c #a2a690", +".5 c #f3fae7", +".6 c #b2bda2", +".7 c #f6fded", +".8 c #fffdf7", +".9 c #869c86", +"#. c #c4ceb5", +"## c #f8feef", +"#a c #e8e5e8", +"#b c #ded3c3", +"#c c #d9e9d9", +"#d c #dff7e9", +"#e c #c8d9bb", +"#f c #e1eaed", +"#g c #edeaed", +"#h c #dedbd0", +"#i c #fefcec", +"#j c #d7e0e3", +"#k c #e6efda", +"#l c #f5fceb", +"#m c #d5d9d5", +"#n c #f9fbf9", +"#o c #e6f4f1", +"#p c #effbf9", +"#q c #e2e5e2", +"#r c #f3feea", +"#s c #dedac3", +"#t c #eef1ee", +"#u c #f6f9f6", +"#v c #ced2ce", +"#w c #f0fcfa", +"#x c #fbfdfb", +"#y c #e9f7f4", +"#z c #b9c4c8", +"#A c #fafcfa", +"#B c #f4f7f4", +"#C c #a4b8b4", +"#D c #c0d2ce", +"#E c #c7d9d5", +"#F c #8d927b", +"#G c #f0f8db", +"#H c #e6e9cd", +"#I c #d6d9bb", +"#J c #f1f4f1", +"#K c #f9fbe4", +"#L c #bec2be", +"#M c #fcfefc", +"#N c #e2e5c8", +"#O c #eff1d7", +"#P c #dfeed3", +"#Q c #f7f9e1", +"#R c #cfd2b2", +"#S c #b4b8b4", +"#T c #f0fce6", +"#U c #fbfde8", +"#V c #eaf7df", +"#W c #abafab", +"#X c #eceed3", +"#Y c #fdffec", +"#Z c #a39f92", +"#0 c #f3feea", +"#1 c #fafce6", +"#2 c #f5f7df", +"#3 c #e6efe6", +"#4 c #d5e5c8", +"#5 c #dee7de", +"#6 c #f0f8f0", +"#7 c #c8e5e2", +"#8 c #8daa9d", +"#9 c #c6cac6", +"a. c #f4fffd", +"a# c #eefef7", +"aa c #e7f0f3", +"ab c #c9d4d7", +"ac c #b0bcbf", +"ad c #d8f1d7", +"ae c #f2f4db", +"af c #bfc2a0", +"ag c #fcfeea", +"ah c #e3f6e3", +"ai c #eafbea", +"aj c #abc6ab", +"ak c #cfdfc1", +"al c #b4b8a4", +"am c #f5fff5", +"an c #b8cab8", +"ao c #abaf8a", +"ap c #cfdfcf", +"aq c #94a18b", +"ar c #f5fff5", +"as c #c6cab8", +"at c #a4b8a4", +"au c #9daa97", +"av c #fdfff8", +"aw c #c0d2c0", +"ax c #f4fff4", +"ay c #d7ecd9", +"az c #c6ddc6", +"aA c #dcdfd0", +"aB c #fcfef3", +"aC c #f1fdf0", +"aD c #eefeee", +"aE c #899780", +"aF c #ecf9e1", +"aG c #e2f1e2", +"aH c #ecf9ec", +"aI c #fdfff5", +"aJ c #83a182", +"aK c #e6e9e6", +"aL c #dfeeeb", +"aM c #ebeeeb", +"aN c #d5e5e2", +"aO c #e3f1d7", +"aP c #e3f6ed", +"aQ c #eafbf4", +"aR c #abc6bb", +"aS c #dcdfc1", +"aT c #b8cac6", +"aU c #c6ddd3", +"aV c #dbefda", +"aW c #cbe2d8", +"aX c #effef7", +"aY c #e8e5dc", +"aZ c #d7d3c9", +"a0 c #faf7f0", +"a1 c #dae9cd", +"a2 c #e6f4e6", +"a3 c #91a690", +"a4 c #effbef", +"a5 c #e3dfd7", +"a6 c #b0c2b0", +"a7 c #d3ddc6", +"a8 c #f0ede4", +"a9 c #e3ece3", +"b. c #f8f5ee", +"b# c #d0ccc2", +"ba c #b6b2a6", +"bb c #f4fbf4", +"bc c #fdfaf4", +"bd c #f9fff9", +"be c #eef6ee", +"bf c #bbc6bb", +"bg c #e3d9d7", +"bh c #edeae1", +"bi c #d1e7dd", +"bj c #fffdf6", +"bk c #e7faf2", +"bl c #f7fef7", +"bm c #fcf9f2", +"bn c #f6f3ec", +"bo c #d8e2d8", +"bp c #f9fff9", +"bq c #dee7d1", +"br c #c8c4b9", +"bs c #bdd6cb", +"bt c #eaf3ea", +"bu c #cbd6cb", +"bv c #edfdf6", +"bw c #a9b4a8", +"bx c #a2a6a2", +"by c #f2faf2", +"bz c #b2bdb2", +"bA c #f6fdf6", +"bB c #c3cec3", +"bC c #f8fef8", +"bD c #d9e9e6", +"bE c #c9d9c7", +"bF c #f5fcf5", +"bG c #f3fef3", +"bH c #f1f8e5", +"bI c #e6e9d9", +"bJ c #d6d9c7", +"bK c #f9fbef", +"bL c #e2e5d5", +"bM c #eef1e2", +"bN c #dfeedf", +"bO c #f6f9ec", +"bP c #cfd2c0", +"bQ c #f0fcf0", +"bR c #fbfdf1", +"bS c #e9f7e9", +"bT c #ebeedf", +"bU c #fdfff4", +"bV c #f3fef3", +"bW c #fafcf0", +"bX c #f4f7e9", +"bY c #d5e5d5", +"bZ c #dce5e8", +"b0 c #f1f4e6", +"b1 c #bec2b0", +"b2 c #fcfef3", +"b3 c #abaf9b", +/* pixels */ +".x.0.OaHbI.2azbK.rbJaF.Zbq.EbqbT#..x#6at.S.KaGbOaz#5albJb1b0bAayaw#..S##.xb0an#IbI#NalaFbH.5a6bN#kbSbobT.5bObu.Z#k.5.ZaYbL.ga9aZ#e.EaDbqap#..Z.S.SbP.ZbMaF.BbI#lbT#3ap.xbYbO.SbL.ZbEbXb0awbL#PbI", +"#k#c#..San#c.5bqa7bqb0bR.SbW#P.KbLawbqbLbCbHbT.5bY.c.ibObMa0aD.5.xbHa9.6bHa1bT.raAbIb0an#3#5bt#caAbXbWbYbtbSbM.SaCbq.t.xa5.SbLaAbLapbP#cbo.SaCbt#kbPaybIaOaGbMaOaG#c#k#S.Z#5#3blbIaO#k.Z.xbHbLaH", +"#3bOaHa1.xb0bH.YasbN#c#kbq#cbM#kbYbMboatbNbTbG.K.B#6.Eb0#t#kbz.cbPbqaw#1bt.EaHa9bTaA.KbCbu#pbobkbo.EapbSbJ.YaGbba7bLbSbMbHaZbIbIaCaH.0bH.D.N#.bSaCbM.ta7#3aB.E.EbJbNbOa7aGb0bY.0#lbT.5bt.0bEbq.S", +"bM#VbJbnbObIb0bMbQbOaqapbM.ZbobL.xbfbT.EbJ#caAbHa4#5bTb2bt#lbqa9#k#caBbtbt.SbJa2bmaY#JbyaMbybz#f#5.5awbOb0.Z.KbXbY.xb2a9bLaSbH.Uapa9bY#c#E#5.N#tbHbtbTbebEbKbebQbP#cb0bFbE.SbJaw.Ba9aG.xbM.Z.EbM", +".l.xbR#P#sbI.0.ZbnbVbNaA.Z#3.0a6bEbJbG#k#6bIbqbebK.EaGbMap.Ka7bIaAbF.ZbqaH.O#3#.boaMbhbf#3aaab#o#kbt.S.5bYbubRau.MaMaAbMbMbM#s.x#5bX#6aEbSbAbEa9.0bHaGbq.B#ca7bI#cbY.0bXa9bMbb#3#4#3bqbSbq#kan#4", +"aY.F#ibha7aA.iasbbbo#3bebybL#ybLbN.xbu#la6bSaBbNbrbl.xbV.W#lalbIa.bI#taHb..KbN.ibPb0.Kbb#va9a9aL.K.ZaCbObea7bo.F#v#5aGbMbL#1.E#I#6bu#3.K#5bP#3aG#Sbta9#JbObBa2bobIbW.Z#6#ka9.Z#5bqbHbO.7#lbK.EbR", +"bUbJ.ia4.wbHbh.Zba.O#3ap#3a4#nbUaA#kbYbI#c.7b0.5a8a9bS.NbQ.BbFaA.Zbtbtbt#6bIbFbtaAaAbXbHbLbNbpap.SbebI#5awbq.xan#cbo.KbobHbT#R#Ha9#E#5.Kbe#catbfbIbSbubIbeaKbtaKbY#casaG#kbH.ZbybTaO#cbJ.O.ZbIaG", +"b2.PbIaAaAb1.sbX#Ebfb1#t#qaAbAaH.Ebua4#6#kasboapb2.x.xaGbEbe.5br#9bubX#6bEaKbo#qag.ZbTa7bPbH.5#5#k#5aGb0a7btbY.K#LbL#5bM#X#2#N.ya2bu#C#y#3bo#jbB#B#qbb#c#9al.K#5bTbNb0#cas#3bN.x.ZbEbXaHbN.0.Z.0", +"bq#6bS.na9#ca4bq.Zbtbu.Ea9a7#LblbXapbebqbo#6bYbPa4bXbYbT#IaAaZbqay.B.ba4bNboa2#5.x.EbYbo.F#5#DaAap#5bI#ka4bX.EbRat#kasbJas.O.Zbq.7a1aO.nas.S#2#e.2.ZbHbX.S#5#L.SaVbY#caV.MbSbG.dbObqbIbMa3bb#c#L", +"#kaG.San.6#l.EbAa2b0#k.Za4.Oa2#3.FbMbb.ObJaH#kbRbGa1.nbn.5bn#sbM#N.Y.EbSbEawbebqaC.BbIbJbq#6.K#J#cbT.B#3.0beb0bQaAb0bLbqbIb.b#bO.baya7.E#P#kbP.z#e.x.db0btbE#6bBbTbT#caHbTa2aGbY#3bAbBbSbTb3.EbK", +"bwbYbMbEbo.Eap.x#5bHbebo.LbLawbE.x.ZbqbYbMa2.x#5.ZbJbXa7.ZauasbPai#kbE.BbYb2bzaHbP.Z#.a4a2bJ#5#6a9bQ#k#3bLbqanbM.xa8.0a0aObM#PbR#Xa7bq#O.gbRbRbK.xaAbUapbJ.KbNb.awa6b0a7bYbN.SbY.ZapaObubYbY.0a9", +".1bqbA#PaHawaCbVb2bNbWaCbG.EbYbXaGbKbSaw.E#W.Sap.IaGaIalbJb.#Hb1bH.Z#3bqbH#6#Sbl#k.xb1btbN#JawaKbI#kbKbQ.Sboasa4#6#IaCbMbXbJaAbIbT#sbLbrbL#ibW.zbI#5bHbObu.SbSbLaG#5bEa2bt.x#3bX.wbEbjbo.7b0apbW", +".ZaDaGbNbTbQ.6.Z#3a2#3#5aA#lbMbFb0blaAbq#5apbqbXbI.5bO.5bIb2.E.Z.Zbq.Sa9.KaCaGbT#cbRaHbI.xb0bua4#5.B#5aGbLapbMbo.g.Ea0#QbF#N#5.Sbr.wb..z#hbLbTbObB.BaGaHbXbEbTa9bH.ZbLbPa7bX#c#.bSbt.E.BbNbKbNbO", +".5bGbKbYbNa2.da6bJbq#6.Za2bNboa4#c#lbEbbbNbXbu#3bTa0asb2.E.YbTb0.E.s.SbK.B#maAbbbI.0.x#3bNbI#B#ha7bGbFbTbq#3.S.ZbebT.SbWbqaB.gb0bObmbtbIbLbT#3b0byaw#tbJbQbO.x.Sbo#Lb3bNbmbobKbOawbRa2bJb0.YaAa2", +"btaGbEa7#cb1byaGbobqbL.Bbe.7bIbqaBbWbq#5bq#3#cbX.ybHbnbqbIbq#ca7a7bTbJbPbmaKbIaMa1a7bJ.6.xa9atboa9.5bWax#6bW.NbXbUbTa5bT.Kbq#3as.waYa7aMb0bH.Ea6bNa5aG#5aCbTak.EbTaA#5bHbL.xbobhbS#5bHbea4bIap#6", +"bN.5a2bX.xbQaH.B.Z#3.dbU#kbNbMbFa4btbWbM.E.S.x#6asbL.ZbLb1.Z.0akb..0aZb0bTbP.ia9aAbHaGbH#L#cbeaAbPa2#lbQbLbHbw#3bHbq.5.SbM.SbMbIbB#qa5.xbbbi.M#c#tbebob.bYbJbTbA.wbo.wa5aAa8#t.h#3#ibS.ObIan#3.0", +"bHb#bM.Zbq.sb2b0.a.SbbazaRbNbN.nay#3aG.J#ybSbNbNbWaB.YbL#6anbYbE.Z.xaO#cbea9a9be.mbH.nbq.EbBbebB.O#.#6.x#6bI.Kb2bybAbqaAbP.5boat#k#c.ca#.ZbQap.MbTa2be.Za7bQaw#Oan#ObP#5bY#5#5bJbu#6bBan.E.xbI#3", +"bWbX.Z#5bKaua5a7bTbNbY.B.5bRbVbt.6.xaHapbO.bbqbz.x#5bNbJ.Z#3bHa9#2.EbebN#k.Z#5#q.Z.ZafbV.ZbMbNbqbXbSbI#5b0aG#5bDb0bKaHa4aAbu.0bIa2.xaG.E.BbAbNbHa9.SbYbI#6.ZbIbQ#2#cbIbQ.0.KbO#6#c#PaHbM.EbfbHbo", +"bKbIbI.i.0bL.7.waG.Tap.Sa4.0buai.KbS.Oaw.Sap.6aGbO#c.Sa2bJa7bebH.x.0.BbI#c#Bbu#cbR.YbRa7a7bM.xbI.x#Tb0bVa9bI#cb1bq#c#hap#c.x#3#kbI.KbT#mbqbO#6bPbYbYa9bNatbWawala2bq.xaAbTbobtbf#hbO#5bo#3bIa6aw", +".Eb#.E#2b0bTbMbe.S#3bP#6bOaHbSbSbMbYbP.xawasblbQa2by.TbJasaHbe.KbT.KasbqbtaAbH#3bIbobybGbWaC.E#G#..EbqbqaA#6a9bYaM.6#caB.Ea9bKay.ibL#5.Pbta8b0bMbFa7bqbIbea2bJ.E.KbqbS#6bJbYa9.O.raubA.xbY#kaAb2", +"bJbO#lbXbM#laYbT.Zbl.F#5bBbX.xb0bHbebI#3bNbtbTa7.5bO#3bo#cbObNb2#6bOb1a0aYaAbWb2#6bC#9asbH.0bHaC#T#kaHbXbqaA#5#h#3bYb1apaAawbTbS.k.ibha9aYbMb#bMblbeb..nbtasbKbEbzblaA.ZbQbJbYbTa4bTa2b1.EaGbIbF", +"bT.xbKbHbWbq.B#ka7aubqb1anbUbL#JbT.5bM#6.xaAbIbubL#ca7.SbUapbM.5bu.ka9aAbMbJaYbT#SbPbBbfa9#ca9bH.S#cbXby#waA#taHala2.5bKbSa9.EbMa9.SbhbLbM#6b3bTala7ana2bLbqbTbe#3aAbQ.6a9bN#Qbtbqa2.xb1a4bzbqa6", +".x#lb0b..Ebhbqb1a8btbmbbbhbJa2#5b0bebTa5b0bJbBbIbNa9#5a9.x#3.SbXaZa5.HbX#B#UbLb1a2bYbYbMa9bobtbF.0bJ.SapaAaGbG#gaGbSbJana9b1bY#3.E.x.Z#cbqbQ#cbqby#cbMbIa6bLawbEbH.KbtbLbeaOa7bqbealbube.5bK#.bo", +"bK.BbLbX.ZbXbL#3bKbhbu.ya5.ibPbTbLbh#5.Qby.k.i.k#5.Bb0.BbPaHa4a9a0a8#qbL.Qbnbq.ga7#laAa9bT#B#v#jbK#k#ka4#kaKbTaHbL.Ebl.5bN.6a4bIaza2apbt.cbY#cbb.ZbI#cbfapbSbIan.iaMa9bN#l.i.5#4bI#c.na9bIa9bHbe", +"btapapaW#kawbe.0#8aVaW#5a4a9.i.IbNa2a7bw.OasaGbh.F.naG#l#5bBa9#qbBbFbO#5bMbOaAbB#k#X#kb0#kb0aZ#kbS.e.S.0ahaObSaybHa7#k#kaA#U.nbH.0.Z.0bHb0#P#k.S.BbHbebMbI.x.Zbt.J.7.Z#k.S#T#k.E#4aObN.daF.e#4#P", +"#kbQa7btaGa9azbY.WaGaGa4a9.Ob0b0a4bJaHbFaza5aAas#VbL#kbe.0bMbWbwb0bL.xa8bIb1bJbJ.O.F.I#ka2#ibHbBbIaFaC.SaHbY#l.0.0asbPaAa1.KapbPbMbS.0bSbq#l.xbqbTbY#kaH.0a9bt.K#O.Y#P.Ja7bSbQbEahbq.E.Zat.BaVbH", +"btaGaH.7aCbHbNbS.WbsapbSbLa5bO#6.b#k#lbo#5.gaGbcbTax.5be#k#xa6#n#3bIboasbFbebJbO.jbRbLaKaMbo#m.ia6.xa4#PaHbOaFbqa7bBaO.xasb0.E.Z.Eas.x#lbqbzbKbV#c.Z#xb0bY.SaH.EaC#m#.axb0bNbMapbL.4#.by.CbTas#l", +"aF.SaHbJbNbMbC.Zapa2bGbQ#6.KbC.IbG#cbq.K.5#m##b1awbX#k.5aGa9bT#5.xbm.Sa0.FbhbH#qau#6#JaA#B#hbc#5.B#k#4bO#.aGbSbIbeaDbM#k#5apbLbu.E#3bXbtbX.nbob0bKbT#Va2#6bJbIaG.KbDbEab#5bEbS#tb0a0as#lbMa5aA#B", +"bHbOakbE.E#..Ba7aLaT#c#3btaG#NbY.dbfbN.ZaIbKbPa8aC#NbNbSbXaGaAbebObR#5.xbBaZbJa7.k#9aZ#Lbu#vbeaZbKbHby.xbHbO#.#PbTatasbyaB.VbS.x#cbt.FaGbXbLbN.Zbi#cbT.Ea6bYaG#kbObY#ubEbobuapaGa5b2aZbPaZbLau.G", +"btaSaB.D#lbT#ObP#ta6#3#3bBbHbe#k#5.5.ZbFbEby#hbqbq#.bu#lbKby#5#BbEbXaYb.bL.9bXbX.i#BbB#Ab0bLbJ#lbM#k.F.5bJbTb0a7#9btbe#5bt#JbebMaMbqaMa2bzbobt#3bTa4bMbo.0bXbIat#J#3bYa2bJ#6bo#6.K#5#mbtbBbKboaA", +"b1#l.j#Q.D#H.B.xaHbyanbYar.1.xaya2a6bY.x.ZasbIaA.Ba4.5asbE#B#5bL.KbLasaCb#bKbXa2#qaAalbua5.S.5.Ebt.zbXbMbTb1.xbzbIaCaAbyatal#5bt#ca8au#6bebRa9#6as#cbN#cbWa9a7#kaH#Va6.E.E#c.xam#lbBaw#5.5bBbEbA", +"#U.4.0.Q.ZbMbObX.KaKawaKbP#5.bbq.M.Ta2bWawa8aAbI#kbRaGa4bJbubPa9#3bIbPb0bTblbWbn#3bLbt.w#V#U.Z.z.I.ZbRbKb1bLbXbWbBbebLbtbfaK#c#uaA#6#6#S#vbSaMbe.EbHbI.0bo.xa9.Zb1#k#V.xbNa1a1.ZaU#q.dbNaL#6aRbN", +"ah#4bS.Va7#e.Maibqan#kbXaw.BbLbYa2aha9bIaAbGahawaAbB.ibXbT#c.xbbbJapalbe.xbO.#asawbJ.QaObXakaZa9bXb0aAbA.0br#5.sbNaha9#cbVaCbYaVbDaw#c.ZbeaBaebMbKbP.qbMaAbYa1b0bEbSbE.Ba7.i.Q.BbObNboa7bM.Sa7bW", +"aOaw.xambN.M#2bGbJ.0.Z.xbT.E.ZbHapa2bt#k#3bIaibQbTaAbRbT#k#BbMbMbybybNbe.S.O#..Zb2.2.5b0#H#kbKbt#5bu.ZbM.k.K.xbe.xapbea7aG.0aG.5a4bEal#6awbT#Ob0akbT#c#.bH.SbLbIaUa2.xalbH.0.S#sbebf#J.ObNbJbN.O", +".7#l#4.SakasanaObMaGbqbN.0b1bQ#..daGbIbJbTbTa6aCbObIbH#S.Za5aY.xa5#jbobo.K#5bFbLbtb##U#Rbq.hblba.0bna0#5.QbO.EbM#haA#.bLbMbKa5aAbCbBbfbTbqas#3bWa7bNas.Za7.EbYa1bMaVbt.EbYa7#O.BaKbXbuaHbqasbH.E", +".S#6.Z#kapbT#4bIanbHbRb2.S#cbO.xaybb.BbX#t.Z.V.abJbTaA#5.i.F.KbKbFbFaa#3bf#vbobbbnapbM.S#2#lbKbra9bXbI.0bebMb0#h#6bXaAbM#3bnbPbubobH#.bzapbLbNbIaHbP#ca2bI#5a4bLbK#k#k.Z.B#3bPa7bYbbbobJaG.Ea9ak", +"bLbq#kbJ.S.x#c.E#PbW.Z#l.6a6.nasbQ#4btap.0bBbS#cb0bTbBbLaIa9bL#5#q#taAaaaK#nbtbt#n.ZbH#Rb1bqbUbJbKbz.K.ZbobLbtaZb.aZ.kbM#vbIbM.ibTbFan.KbRbEaA#5bqa9bebI#cbLa2bu.x.xbFbPbIan#HbeaA.KbT#m#kbo.Zbq", +"aIbMb1bHbP.pbLbP.xaGbJapbSbX#.#caCaUbTbTbAbX#c.JbXalbXbb#ia7bJala4aM.Ka2#LaC.Kbwb2bBbO.BbL#U.0#mbXbJaAb.bIaG.PawbMb0bMbn.0aKbHbXa4ae.iap#lbIbo#kbBb0bo#cbPaGaAbua7bI.ZbE.E.xaybbbBboatby.2.Sbq#V", +"bLbTbMa9bP.S.xbRbLbYbPakaAa7bM.E.N##.K.Fa8.SbtbNaG#kbPbrbTbIb1bK#Ra7a7#3bbbxbu#qaA.x.5.0.x#XaK#3.xbX.Ka7bLbIbyaAbq#cbq.Y#3aObb.S#k.sa7a9bPbt.aa2bTaAaGb#btbubt.KagaSbL.SbLawa9aVbI.KbtbM#3#cbJbX", +"bc.FbT.g.haqbMbPbP#ebIbN.6a7#kaAaV.cbtb0b2apaObEa5aAb2.KbIbubl.K.B.Z.7bM#5.0.KbE#vbHbXaf#ObY.IbobhbNbm.ibTbhbT#u.SaWaVbHaG#c.ZaU.A#YbIbYbfbSbGbibo#3aMa9#mbP.K.Kb0.Q.S.xa2.ZbNaCbb#6bo.5bTa7bq.B", +"aw.S#4.cawaS#P#.bqa2bX#.#c#caPa2bHbQ.FbY.d.3aw.o.J.5.5btaGa8auaY#GaebXbWasaK#v#a.H#ObPbJ#3aAaU#cbL.KbIbK#5.xb0bI.a#4.ZbbbL.SbI#..I.SbT.E#k#1bL.6bTaNbo#5#3.YalbLanbqbSbTa7bPaxbubfa7bz.0.Yaw.5a4", +".Ea1.6#2bSbqazbX#kal#c.xawaGbSaUa1.5.5a2.WaCaybYbEaVaH.SaAbq.kbaak#k.0bX.xaY#v#5as#sbB.S#ca9#ca9bK.I.Kb0b0bI#kbKaO#VbHaw#3.Sa7aebX#I.xao.wbq.5bM#5.Zbua5bEbe#vaGbybB.S.Ka2#cbz.SbYb0bBbB.Z#5bo#k", +"bNaG.6apbY#k.r.7aSawawbXaC#caCaP.xbYak.VbNbb.WaWaxbM#c#lbNbXaAbIae#O#.bq#tbO#9aKbRbT.S.ZbNbyaHbNb0bPaAbBbJ#LbebMa1bq#kaKa9bL.x#NaH#Q.x.Z.S#Hbq#Xbyb0#5bMbFbBb1beaAbL.xbtbP.KagbJbqbtbL.xbubTbqbM", +"awbIaCaC.x.0a2aG#k.O#kbq.xbGbS#6.SbHbMbSaCahaGbB.Saz.ZbLanbPbTaY#l#.bTaAbqbeaA#La7aGbFaBawb1boap#Jasa9bWbWbIbObX.NaGbSbP#5.ZbrbMaAbL#kbIbM#hbKbX#caA#3bebuaAbebfbq#6bNa7#5a7bEbobubEbTbE#4#3aGbL", +"###caG.SbEboaGbMbMbY#Vbea4bvahaW#PaC.Zbq.0#6bz#6.J#Waz#J#lbPbLbt.0b0.xaKbO#mbLa5bwb0#kaH.Sa2bWaAbIbJatb0#6.iap.xa1bY#5awa0a9bnaebaa7aY.EbXb0#l#ka8#Ca9bobTaKbYaK#rasbIbLbN.SasaG.4a2.SbobXbK.Ybq", +"an.5bua4by#5.O#c.haCbJanbY#caJbfbHasbNbY.2aq#JaAa7aGa2bybOaAapaYb2#9bLbPbWbXb2.SaHaHanby#3.hbTaObX#3bL.SbT.x.ibTa2bN#5bBaGbobJbqbt#lb#.EbJ.5a9bL#3beaKbOa9bu.E#vbK.MbtbqbN#5bM#3#k.KbtbMbI#c#cbo", +"bobfbLbYaAayaA.M.Eal.nbybLbubE#caia1.7btbBaM.L#BbSaC.5#kaCb0bOaYbMbAb1btbPbL#nbLaU#u.SbebNb..5#sbMbub0a9a8b3bTbI#V#3bubF#q#vbn.2.KbMbo.kbObLbJbJboboaC.KbY#man#mbqbBbLapbMbbaGbS.5aHa7a7bYbebLaG", +"bT#Eam#p#5aAaL#3bOanbqbVbEajaHapaO.SaH.SbObhbM.H.a.SalaGbTbYbh#6bJbM.p.2a9aA.0aoboay#9.E.x.E.g.2a8.5bn.sboaA.Z#6axbF#Ea5ab.4btbJb#bbbPbzbNaAbxbM#5#5.K.iaqbB.K.Fa9anbTbH#k.EbP.SbIbeb0bYbu.x#3bq", +"#PbN#Ta9aVaWbtaG#VbP.ZbhbXbM#h.G#d...ubYbq.7#k.0bNbwadbSbea6aV.5.X.1bE.J.ZaAbS#5.5.Z#T##bY.E.F#l.EbH#c.Ebu.ZaH.CbTbMbXbT#n.5bMbM.JbEbG.5bBbSah.KasbqbtaYala5bJbJ#cbo#3bNbubnaC.gan.cby.Obu.waAa0", +"#4aGbN.E.BataG#ubY.x.EbLbM.2.iaKa9ap#EaGbAas.S#..BbYbNbN#c.Ea2#3#c.JbN.5apa2bRb0.FbNaA.6bWbQ#.bPa9by.Sb2a2bTbE#6bTbIbq#5aA#5bua0beapbEaGbq#capa7aAbMa0bIbt.KaAb0ay#3.Ka2.BbI.sbqbSay.x.Z.xbo#SbI", +"ak.EbSaVbRbSbbbbapbi.KapbF#5bCbtbBbbbOaAbIbI.EbXbI.0.Ba2bqaG.5.dbSbNaCap#mapbubLaM#kapbFbhapbuapaCbJbobSbqbo#FbHbub#asbJbhbJbh.B.FbHbq.0a2aw.BbtaAbubXbI#kbXbPbAaPasbo#5aC.5a7.hbt#kaH#5#c.IbL#5", +"aB.0bMa4#6bP.KbtbDaW#5.W#yaw#qbybLbI#vbXbT#hbLb0ay#5#3#kbA#cbBa9blaGaMbo#Ebh#W#maG#q#Lb2bobe#vbz#AbNaB#5bo#5aw#v.0b0.KbK.EaAbJb1#3bKa9.KbObJ#c.xaAbLbobLbMbubIaYbDbSa6aAbI.Eb0.5bt.xbubH#ca7bbbL", +"aq.nbX.SaH#3bLa9#B#BbiaTap#wbi#Cbh#kbh#5a5#6bm.ibJbqbMbpbM.0bMbb#p#jbu#m#J#9#9aMblbu#6a9#5bfbIb0a9bfbUbIbyb0bobWb0bt.i.SbX#m.Bbbbq#c.KbNbza4b1bKbWbSbLbObobLbeb0arbbbu#k#6bLbMal.EbMbE.Bala9#k#c", +"#kasbMbybXaZ#v#qbn#3boaAbWaXbK.R#I#hbJ.5bU#ha2a2aAbTbEbO#5aAbM.0b0bb#m#6#tbTbhbnbzbobT#9bobeaAbb#ubIbe#p#q.Kbbbua9bPbI.KaY#kbh#6.8a7a7a5bXbBbJbI#kbu#la8.OaYasbMbN#3bL#5.D.i.S#Hbf#h.EbubNa9.Bbe", +"#QbLbIbPas#5a9bP#Lbra7bBbtbI#c.x.Z.EbKbJaha4.RaNbTbLaZ.ZbMbtbFbJbtaAakbO#q.ibWas#3#I#3bY#2bJaGbHaLbeaAbebybt#9bT#kbPbMbPbtbebH.EbX#nbIbObqb1b0#vbRaZbt.BaYaw.5aA.R#3#8#k#cbHbXbMbhbcb1b0bTawaV.0", +"bTbTa7bmbRbhbma9.g#b.y.waG.UanaCbKaH.Ea4bN.Jaya4aYbKbubTbL#hbr.Z.SbYaY.ObL#sbPaYbq.5ak.E.7a4aebY.kaLaMaM#mbS#qbtbra9bTbobLbhbX#haZbP#hbXa8#h.xb##.aAbPbPbXaYbJ#v.Bawbe.x.KaA#k.QbTbTbXapbE.xaCbQ", +".K.K.E.x.xbY.Ka9.bawaDbq.v.ZaO#da1a2.ca2.aa2aGawbMbTbObTb0bB.zbe#T.V.xb0#ca9a8#Ja4.S#5bH.Oa9.B.SbtbTbL.ZbH#lbBb0aG.ZaAbI.ZbubLb0#k#K.n.bbNazaq#q.SbE#iap#Db1#l.5#3.KbMbAaAbE#BaAaKapaAa5b1bTbua8", +"bwanbObI#r.7bu#ybSaG.5.Q#G#.bVaw#cbLa4.BbObQbqbGbMbLbtb1.KbPbMa9#..MbqbobRbMaBa8a9.5b1awbTbSbybKaAbX.S#3bXbP#NbM#qasa5bMaAbIaAbL.S.x#4.M.SbYa5bLbqbSa9#zaAboan#.bLbwbubebX#qbS#5.x.i.KbI#m.2asaA", +"#6be#3a1.E##bmbMbBbYbP#UbRbRa7#6bObWbXbI.E#qbJbTb0byaqbJbMbXbWbt#X.NbH.ZbNaAbu.i#cbKbKbfa2bBbXbN.ZbTbRbT#sb0#5bJ.Z#.bPbXaMb1#6.E.IbR.naObN#kbTb.bI.EbobMaAbAbHaAaGbJaA#c#qbCbo#5bLbMbL#cbObXbObX", +".KbJ.7#XbSbWbtaG.Sa0#sbTa8a7a8bTbIaKbLbIbJbhbR#3aAbLbMb0bMaAbIaA.7bMbN.ZbS#BbX.Kap#AaibW#kbNbTbIb0bXa7#k#3.IbH.iasboaYa2asbqa5bIbLa7bMaW#ratasa0a1bq#c#va9#3.xak#5#nbe#3#5bebXbIbMbtbJaY#kbXbTbo", +"bFbz.7bT.5#kbybo#hbWbobtb3#na5.7#J.IaYboaYb2bPbOasaCbe.Kb0bPbeaBbWaObMaHbJ#EbY#mbqa2#kaAa2#5aO#c.5b#ag.5b0bObK#2aZbL.EbT#5bLaYbJ.K#vbNaG#k#3bubIbT.F#Lbea9#A.ZbKbQ#3b1bL#3#6bObtaAbOanaBbJaAbTbb", +".Kbna2bq.Z.0#m#vaZbTbo#L#BbubPaAbr#cb1##bM#tbH#vbMbT.Za8beb0#.aA#ka9bPbObL#kbB#5bSb0aGbIbqbT#Ja7b#bIbObnbP.Bb1bEbLbobza0bLbobI.Ka5b0byapapbQ.Ea8bHbLa2bobS#3aG.xb0bfbE#3bub0bz#c#6bIbhbI#6bLbebM", +".KaKbYae.S.B#5bIbqbtbu#y#E#cbSbJ.F#3#ca2awbIa4aHbIa9bIbTbWaA#hbq.h.7bHby.fbt#6bYbqapa9bMbBbYbNb1#k.F#k.0bI.0bh.ZbIbh.Eb0bt.Bbha7#maK#Sbi.V#k.KbX.E#kb0a8bua5.5.0aI#AaKbuaK#5aHb0#hbtbRaGbLbKbLbA", +"b0be#P##.EbBaAapbPa7bNbv#7.a.0bObsaFapaGbGbSa2.6aAbTbMbObJ#5bI#5bIb0bWbtbIa7aWbVbtbM.xa9.ZbTbqap.x.s#3.g#3bL#NbK#3##a9aY.xbh.0#5#Jbh#EbebM#cbT.6bqa4b1aLbNa9bM#VaM#6apaA.xa9aM#5bJbM.BaZbXa9bubX", +"bybIbSaGb0.caMbYbJ.r.5#k#P#XbL#.as#XbJbK.2btaGbD.Z.PaYbH#h.B#cbb#KbebqbbbNbiay.Ya7.Z#UaObH.6#2.7bJbH.0#3asbKaA#5#2bOaSbLbPb0.S.g.d.KbGbEbNb0bXbn#X.B#H.0#2.Z.n.SbYbHbMbE.KbTa2.Za9#caKbo.KbtbMbo", +".5aAbWbS.Ebo.Z.K.BbJbEbX.5aH.5bqaA.EasaHbobeaGaC#s#XbIbLbIap#3.O#3.xbIbtaCa2aLbs.SbObIbU.s.xaAbPbIb0bLaAb1bb#6#mbM.0bt#UbN.g.ZbLbu#VaH#ka0bo.5aK.ZbP.KbJbWa8bJ.Ia7aK.SbEb#a4bLat#nbobebLbNaAbTaM", +"bbapb1a9bobP.xa4aGbqbq.Ba9bOaHbqbT.jbXbI#cbMbiaGbWbI#XapaSbObIbEbqbua2bo#5bV#6aybW#XaF#IbL.Oaea7#O.0#kaBbM#qaA#maA.gbbbTbJ.EbBbJ.dbMaGaAbNbTb0b#b0.hbH.BbRbIbEbWaAawa7beaFaAbMbebtbWbL#t#L#5#3#c", +".5a4.E#kbd#lbXbOa7#cbo.xbHbO.E#3#ka6bobLaGbKbq#3ae#.#Nb0a8a7aH#6#tbzbI#6#cbCapbobMbMbF#k.Bbr#.b#.Zb0#6bOasbMbybMb.a9.i.SbqbLbcbTbNa4#6a7#cbTbJbIbbbT.KbObKbF.g.K.0#3bS.4aG#3bY.xbubTaGapbYbMaAbL", +".5aA.K.K.ZbGbBbVbobHbybz#kbB#c.SbNbebHbea7a4bTbMbTbM.IbT#.aGbJbSbF.E#EbJbebtaYbu#s.SbWb3bybI.5bIbH.gb#bLaAaY#qbIb2bMbY.iaAbXbLbf#eawbOapb3bLbBbT#ha9bIbh.0b0bLbPbY#5bX.BboalbI.Kby#A.KaAbe.K#5aH", +"#kbtaGbqbebX.7bO#c#JaGbPbo#3b0bu#haHbebWbXbBbqbW.Pa7bJbO.EbubKapaM#3bXaYaAbRaZbPbBbP.Qa9.gbI#3bI.xbTbI#cbmbebobJaMbM#3bKbP.Y#ua8#cbG.K#kbebqbnbLas.KbXaAbP#3a9bMasap.5#6#l.x.6awbzbubtbfbbbeaAaK", +".B#5.5bebYbta7#3#6bXaG#x.KbY#qbNboa4.Ma9bNaA.gas#..l.QbMb0#c#5b0#5#j#3bIby.kbWaYbMbBbCbr#3bKb0aAbL#ObLbP#3bhbT#nbLbobPbybeaA#Z.K.MbH.ZaC#6bTbtasaZ.Kbt#5bobLaYbebWaCbya7bNbuby.7bob.bebtbL#nbYaA", +"#t.5bTbMbHapbMa7bea9bobo#maAa9.KaHbl#AbQ.4.5bq#saS#2.Fakbh.x.BbDbo#5a9bMa0b..g.I#qb0a8bJ.Zbrbt#3#HbXbN.ibTbobP#u.i#g#3.iaAaK#6bnaP.xaGbtbM.EaYbLbIaM#ma8bIabaAaKbt#ka9bIbebFbHbqbmanbT#3#5#5#5bl", +".nbH#c.n#lbq#kaHbX.SbTapa7bEbBb2#ca2.J.6a9.ib#bT#cbe#t#3bI#DaAbX#6alaAa9bB.E#mbH.ib0asbebbbKas#3.0.KbPa7#l#cbo.Z#5a2#5aAa9bybTa9#Q.x#N.x.ZbJ#kbqbL.BaebWa7.O.UaSbN#qby.Zbo.0.SbNbqay.E.N.Ea9.MbE", +"a7bYb2.EbYbP.xb0.SbobVb0.KbNb0.Eaya1aGaA.ZbqbtbJbzaAbeaAa4.K#BbTaqbBbIb0bRaYbIbobJ.KbubPbLaAbo.sa9#c#k.KbubIaqb1axaw.0be#.#3#kaGbTbLbIbqbP.jbM.B.S#R.xaO.i#2.x.ZbYbIbua9.BbI#lbKapbfbubMa4a2at.Z", +"bLbH.E.K.Zb0.xaxbYbMbq#6#lbO#3aAapb0bEbEbn#.bOb.#Lbbb1bt.Kbe#.aGbMbLbTa9#.bObJbIbB.z#5bLbobI#ibb.SbebXa9#kaGbz#c.ZbTbN#kbO.Sa7bQ.PbPbobLbI.F#5bXaA#NbMbT#Ia7.IbIboa9btbObNbP#V.ra7bNbNaObw.fbOap", +"apbyaw.5bL.SbEbK.x.E#5.Z#cbA#caGan.Ba4.Faqb.bbaYawaA#5bSbLaMa9#5b#bMbBaAbTa9b0bqbo.Eas#hbWbXbL#3a7bR.FaHbt.6.SbIbqbtbtbJbqbobebEasbybXbfbX#3bJ.F.h#lbI.BaA.sbQbMbP.E.ZbNbIa9bB#k#3asaHawbqbX.K#.", +"aAbSasaGa4bIbS#6bobla7#5bLbS.xbA.x.Nbo#kbEbTbqaMbtbtbt#qawbLaAbt.KbLa8bTb#bIbh.BbXbca9#kbIbNbX.8bF.VbJapbLa9bybNbJ.0.Y#k#6.xbu##bO.xbK.SbIa8#k#tbWaAbIbIbH#lb1.0bt#6b0a2.EbAaCbIbS.EbL.0boaHbRbN", +"bT#6btbt#L.Kbh.KbI.FbobIbJbqaAboaw.BbNbIaHbXb#.U#3bwbT#6a9.Ka9aG.Ha9#kbJbebLaAbU.KbMa9aAbMa9bJbL#3aGb0a9bubL#rbtbNbobO.EboaG.K#6bTaMbOaMbtaYbtaMa7bJaAb0bOaK.Fbo.0bYbqaqaAbt#5aZ#kbebObobX.gbuas", +"#qbSbPbKbubAanboapb0.Eby.5bYb0bYa4#cbRbPa6bObL#qa4a9aA#3#6bubu#5.ga2b1b0bJapbL#3.saA#lb0bTbtbHbIbQ.Da9.7.x.7apbJa2bPaHbLbY#k#6bMbEa8bB.ibJbIbOa9.ibMbqbnbe.Ba5bJbT.0.Z.S#5.B#t#c#q.xaAbta5.SbMaA", +"aHbxa2be#6bBby#t#k.xbua4a4bPa9aHap.0#cbAbWbIa2.l#JbKa9bo#AbTb0bzbeaAaAa0btbI.lbLbybXbAbTa5bLaZbubJbubLbya2anbJbT.2a9a2bXa4bTaHbHbubnaA#Lby#3a5bobubB#q#5#hb0btb0a7bM.xbA.xa9bYaKbKa8asbrbOaY#vbT", +".5a9apbX#cbH.SbybYbM#5bYbKapbIbX.M.Vazay.ObAbI.SbFbPbf.Ca4b0bobLbP.xapbN.7.KbwaAbqbL#ka2.SbLapa2buaGbPa9b0au#c#6.Maw.Va9aAbPbtbL.N#c.cbF.E#6aGalbPbM.YbNbW#cbLaGbHaC#4bLbX#cbIbHaF.Zak#l.B#k#Pa7", +"a9.xaw#kbN#cbo.6bMawbIbMboaFbuap.MaH#ka2.Kaw#3bL.hbPapa8#5bTbLb#bq.Z#kbJa9#JaubebY#6btbP#3bT#c.Ia9bOa9byaAbu#5bea9.0a4aAapbqbOa5bYaQa7.R.0.EbIbIbfahbO.S#3bqbTbo.7.xbf#3.xa9#ebeb1bMa7bo#.#Ha9.E", +".K.nbNa2bA.Z.6bYbY#kbK.M.xaBas#3.Zad#5#.a2#k.EbNaAasbMbTbXbP#3b0bqbNaA.xapbJaHaKbTbfawaHbb.Ea2bK#3bebtbeaKapby#5anap#kbYbT#tbqbT.S.x#5#haC#qaYbJana7#3bY#3#3bHbJbI#6bSaA.FbQbOaw.0bG#kbLb0bQ.rbM", +"bQa4bHbqaCbbajbQapbMby.KbtaG.SbyaGapan#ka9bX.K#6bMbK#cbRbI.7#hbP#4bLaObSasbebB#xaw.E.SbP#lbobQanaKbtbWbtb0bL#Mb0bLa7apa8bObTbHaMbPbT#6a0.zbIaAbh#lbbbLbSbq#5bWaCbo#6bqbybebPbubFbq#kbPbYaCbJbta2", +"awbLa4.S.Map#lblbUaw.xaAbNbr.ZbPaAbIbtaGapbQbRb1awaYbM#vbfbJbtbXaS.xbTbebMbYbfbI.5bSaA#c#6bHb0#cbbbOaLaAbubN#5bo#5bWalbIaAbybJbTa0bobIbTa5bMaMbPbTbSbPb0#5bN.EbybI#c#v#6aA#5btbI#3#cbI.S#6bu.ZbT", +"aGbqboaGbJ.5.K.SbE#c.5bobO.S#5.bb0bh.hb.asbMaG.7bLbzaZ#3#kasbPbI#ka2.ZaH.Ya5awbtbQ.KbMbubY.5bybPasbe#vbQbFbb#JbubXbn.ib0bLa0bTa9bObJ.gbebMbSbJbNaGbqa7bo.xaGbIaHbB#mbobwbe#3.KbBa9#5by.KbEbTbTap", +".xbyawbqa2bzbHbNa9bL.E#3bNaG#3aAa9a8aZbLbKb0anbYaY.SbLbOaAbL#5b0.E#kaGbIbOblbB#vbX.7#5.ZbuaGbMawbBbya9b0#3bfb0#5a5.G#5.ibMbeaAbMa7#xbf.Z.ZbEaC#c.EbTbSbMaG.0bfapbIapbRbtbl#m#3bOa9b#a9bL#mbB#c#n", +"bz.xaGaia6#kay.ZbIapbP.xbYbP#kby#bavbh.Ka9a7be.xbS.i.EbtbJa5.xaA.E#5#kbTat#5boa9bNat.EbTaEbXaGbWa9.KbebE.KbT#5#3bg.k#h.sbnaA.5a9bTbB#Pbo.Ma2adaVb0#cbuap#ka8a4bT#faAabaM#qbobeaA#5bo#v.K#6bE#tas", +".5#4bfb.be#t#k#c.F.0.0bYbO#P#c.FaFakapbYbWbNaM.K.MaGbBbqaH.SbmaZ#d.BaiaGaGaHaCby#P.B#e#PbR.x.xasb0.IbWbTbIbo.ZbMbYa7bIbN#k.E.x.I.6bLbMbYb0bX.M#6#lbJ.Z#NbT.t.s.xa4#3a6bR.S.Ka2bo.WbY.J#cbua7bX#3", +"aG.EbfbebEbE.n.Eb0aw.FbEasbMa1bL#k.naAaGbMaw#.bA#caCbYaAbzaAbMav#T#k#V#lazbT.RbObq.0.7bLaFbIbQa7#kaK.EaKbXbMb0b.aHa9bSbe#kbP.Eae#kbobo.YbuaAa6bT.IbM#..EbIbMbBbTbIbqbL#c#6bMa9bq#fbSa9aH.K#3#can", +"bX#caKas#6#ta7bIa7bBbLbPbYbo#5a2bK#4.JbI.MbBbobbaybqbY.xbJbMa9bI.xaGaqawaHbTbQ#cbW#c.5bfbxbobt#SbtbIbRbJaYasbXbtazbXbobMbPbJbTa8#ca7.ZbN#kaH#3an.B.4aZ.ZbhbK#Q.x.xbt.EbP.EbYbLbt.R#caUb0aGbqbyag", +".5aObobnapa8#c#Pbb#t#3aK#tbo#JbB.JbLbEbQ#kbuaH.Jb0bX.6#5.xa4#5#kbTbNaCbMawbK.KbLbybPbu#6bbbZ#vac.Zbn#kbTbebLbfbIaybobfbo#DbM#nasaHbX#5bMbSaAbMbM.E#5bJbM#3a7a9.ibybSbNaM.xaw#3bHaW#6aLbea9b.#B#.", +"bIbKbeaG#vbe#c.x#3blan#t#k#xbubobRaVa9bNbMa2.EbEbObtbB.0ap#5.0.xawaAbMbHa9bS.S.K.KaKbwbt#q#ubZ#jbLbTbObTbNaYbebTbYbSbY#6aAbt#m#qbqbo#c.S#5bo.O.KbtbTa8.6.Eb.aAbL.5bTa7bHbe.x.ZbtbtbPbYb0be#.bnbH", +"aC#.a9bFbobtbPbLbLbobe#3bbbbbt#qbban.EawbE#.bqbEbHbfb0#5bI.x#c#cbLbXbybtbm.SbI.ybN.Kbe.K#qbD#q#za8.5bfbBbJ.BbTbLaVbMbV#3a6brbT#u.ZbA#kbF#.bMbEbW#B#.bB#naA.K#3bT#cbLapboa2#5#.bobu.KbubyaAbhbIb0", +"#Oa2bX.KbeaA.5a1b0.xaAaAa1#kb1.6a9aA#DbH.ZaVbKbqaA.SbJaA.XbS.S.b#gaA#t.EbL.xbMbWbea2bRbtbubWaM#5.ZaZbP.EbMbJ#mbJ.V#GbHaH#3bc.KaYbL#ca9.0#5a2bqbfbMaZbtaZaAbM#tasbeaCb0bTa4.x.K.E#vbE#LbraKbKbIaA", +".xakaKbybW#6bM#l#ka7#k.nbM.0bH#Pa2#3by#..K#kak#0bnbMaA.5.K.BbNa6aK.ka9bLbc.wbL.7.xaAbqbAbo#JawaB.KbLbq#BbebMbMbL.##Va7#2.S.B.0bIbEb2.7#6.Z.KbJbq#m#5a8bWby#ua8#6#3#lawbTbea7bL#3#3#J#5#.#3.ib#bM" +}; diff --git a/plugins/styles/metal/stonedark.xpm b/plugins/styles/metal/stonedark.xpm new file mode 100644 index 0000000..bae15c2 --- /dev/null +++ b/plugins/styles/metal/stonedark.xpm @@ -0,0 +1,353 @@ +/* XPM */ +static const char *stonedark_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 250 2", +/* colors */ +".. c #020202", +".# c #4e554a", +".a c #1f2321", +".b c #838c83", +".c c #343a34", +".d c #697169", +".e c #0e100e", +".f c #9ca59c", +".g c #45443d", +".h c #2b2a25", +".i c #61605d", +".j c #7c7b72", +".k c #171615", +".l c #969490", +".m c #43473b", +".n c #5e6359", +".o c #272e2b", +".p c #afada9", +".q c #090909", +".r c #797f73", +".s c #3c3b35", +".t c #171915", +".u c #8c988c", +".v c #2f322a", +".w c #57564e", +".x c #484b44", +".y c #737269", +".z c #24231f", +".A c #11110e", +".B c #80847b", +".C c #8e8c83", +".D c #a9ada3", +".E c #656860", +".F c #1a1c19", +".G c #3c3935", +".H c #0c0c0c", +".I c #4e4d46", +".J c #3d433d", +".K c #30322f", +".L c #060606", +".M c #565e56", +".N c #717a71", +".O c #989c93", +".P c #86847c", +".Q c #6a6961", +".R c #4e5551", +".S c #383a34", +".T c #b0b4aa", +".U c #1e1d1a", +".V c #252a25", +".W c #69716d", +".X c #121512", +".Y c #0c0e0c", +".Z c #5b5e56", +".0 c #282a25", +".1 c #8b948b", +".2 c #0f100e", +".3 c #2e3632", +".4 c #090909", +".5 c #767a71", +".6 c #131512", +".7 c #90948b", +".8 c #b6b4b0", +".9 c #060606", +"#. c #21231f", +"## c #a1a59c", +"#a c #454445", +"#b c #33302d", +"#c c #434743", +"#d c #626d67", +"#e c #2b2e27", +"#f c #4a4d4e", +"#g c #4e4d4e", +"#h c #333230", +"#i c #9e9c93", +"#j c #393b3c", +"#k c #52554e", +"#l c #888c83", +"#m c #2d2e2d", +"#n c #7e7f7e", +"#o c #5e6362", +"#p c #797f7e", +"#q c #3d3e3d", +"#r c #92988c", +"#s c #33322d", +"#t c #595a59", +"#u c #757675", +"#v c #252625", +"#w c #828887", +"#x c #8f908f", +"#y c #676d6c", +"#z c #1c1d1e", +"#A c #878887", +"#B c #6c6d6c", +"#C c #111312", +"#D c #232625", +"#E c #2b2e2d", +"#F c #020202", +"#G c #6e7163", +"#H c #46473e", +"#I c #2d2e27", +"#J c #626362", +"#K c #7e7f73", +"#L c #181918", +"#M c #979897", +"#N c #3d3e36", +"#O c #595a50", +"#P c #4b5047", +"#Q c #75766b", +"#R c #252620", +"#S c #131313", +"#T c #82887c", +"#U c #8f9084", +"#V c #676d62", +"#W c #0e0e0e", +"#X c #4f5047", +"#Y c #a8a99c", +"#Z c #080808", +"#0 c #9aa094", +"#1 c #87887c", +"#2 c #6c6d62", +"#3 c #525551", +"#4 c #3a3e36", +"#5 c #404340", +"#6 c #6d716d", +"#7 c #363e3d", +"#8 c #0b0b0b", +"#9 c #1e1f1e", +"a. c #a1a9a7", +"a# c #939c98", +"aa c #5d6061", +"ab c #292a2b", +"ac c #151617", +"ad c #505a50", +"ae c #626359", +"af c #181915", +"ag c #97988c", +"ah c #606860", +"ai c #7b847b", +"aj c #191c19", +"ak c #32362e", +"al c #131311", +"am c #aab1a9", +"an c #1d1f1d", +"ao c #0e0e0b", +"ap c #323632", +"aq c #070707", +"ar c #b1b8b0", +"as c #1e1f1d", +"at c #111311", +"au c #0b0b0b", +"av c #b6b8b3", +"aw c #232623", +"ax c #a2a9a1", +"ay c #444b45", +"az c #2d322d", +"aA c #353633", +"aB c #9fa099", +"aC c #8a9089", +"aD c #939c93", +"aE c #040404", +"aF c #70766b", +"aG c #555a55", +"aH c #707670", +"aI c #afb1a9", +"aJ c #070707", +"aK c #464746", +"aL c #4b504f", +"aM c #4f504f", +"aN c #3a3e3d", +"aO c #555a50", +"aP c #606864", +"aQ c #7b8480", +"aR c #191c1a", +"aS c #35362e", +"aT c #1d1f1e", +"aU c #2d322f", +"aV c #4e554e", +"aW c #343a37", +"aX c #9ca5a0", +"aY c #454442", +"aZ c #2b2a29", +"a0 c #7c7b77", +"a1 c #43473e", +"a2 c #5e635e", +"a3 c #090909", +"a4 c #797f79", +"a5 c #3c3b39", +"a6 c #171917", +"a7 c #2f322d", +"a8 c #575653", +"a9 c #484b48", +"b. c #73726e", +"b# c #242322", +"ba c #11110f", +"bb c #808480", +"bc c #8e8c88", +"bd c #a8ada8", +"be c #646864", +"bf c #1a1c1a", +"bg c #3c3939", +"bh c #4e4d4a", +"bi c #3d4340", +"bj c #a7a5a1", +"bk c #717a76", +"bl c #989c98", +"bm c #868480", +"bn c #6a6966", +"bo c #373a37", +"bp c #afb4af", +"bq c #40433d", +"br c #1e1d1c", +"bs c #252a28", +"bt c #5a5e5a", +"bu c #282a28", +"bv c #8b9490", +"bw c #0f100f", +"bx c #090909", +"by c #767a76", +"bz c #131513", +"bA c #909490", +"bB c #212321", +"bC c #a1a5a1", +"bD c #434746", +"bE c #2b2e2b", +"bF c #888c88", +"bG c #919891", +"bH c #6d7169", +"bI c #464743", +"bJ c #2d2e2b", +"bK c #7e7f79", +"bL c #3d3e3a", +"bM c #595a55", +"bN c #4b504b", +"bO c #757670", +"bP c #252623", +"bQ c #828882", +"bR c #8f9089", +"bS c #676d67", +"bT c #4f504b", +"bU c #a7a9a1", +"bV c #99a099", +"bW c #878882", +"bX c #6c6d67", +"bY c #3a3e3a", +"bZ c #424445", +"b0 c #62635e", +"b1 c #181917", +"b2 c #979891", +"b3 c #0e0e0c", +/* pixels */ +".x.0.OaHbI.2azbK.rbJaF.Zbq.EbqbT#..x#6at.S.KaGbOaz#5albJb1b0bAayaw#..S##.xb0an#IbI#NalaFbH.5a6bN#kbSbobT.5bObu.Z#k.5.ZaYbL.ga9aZ#e.EaDbqap#..Z.S.SbP.ZbMaF.BbI#lbT#3ap.xbYbO.SbL.ZbEbXb0awbL#PbI", +"#k#c#..San#c.5bqa7bqb0bR.SbW#P.KbLawbqbLbCbHbT.5bY.c.ibObMa0aD.5.xbHa9.6bHa1bT.raAbIb0an#3#5bt#caAbXbWbYbtbSbM.SaCbq.t.xa5.SbLaAbLapbP#cbo.SaCbt#kbPaybIaOaGbMaOaG#c#k#S.Z#5#3blbIaO#k.Z.xbHbLaH", +"#3bOaHa1.xb0bH.YasbN#c#kbq#cbM#kbYbMboatbNbTbG.K.B#6.Eb0#t#kbz.cbPbqaw#1bt.EaHa9bTaA.KbCbu#pbobkbo.EapbSbJ.YaGbba7bLbSbMbHaZbIbIaCaH.0bH.D.N#.bSaCbM.ta7#3aB.E.EbJbNbOa7aGb0bY.0#lbT.5bt.0bEbq.S", +"bM#VbJbnbObIb0bMbQbOaqapbM.ZbobL.xbfbT.EbJ#caAbHa4#5bTb2bt#lbqa9#k#caBbtbt.SbJa2bmaY#JbyaMbybz#f#5.5awbOb0.Z.KbXbY.xb2a9bLaSbH.Uapa9bY#c#E#5.N#tbHbtbTbebEbKbebQbP#cb0bFbE.SbJaw.Ba9aG.xbM.Z.EbM", +".l.xbR#P#sbI.0.ZbnbVbNaA.Z#3.0a6bEbJbG#k#6bIbqbebK.EaGbMap.Ka7bIaAbF.ZbqaH.O#3#.boaMbhbf#3aaab#o#kbt.S.5bYbubRau.MaMaAbMbMbM#s.x#5bX#6aEbSbAbEa9.0bHaGbq.B#ca7bI#cbY.0bXa9bMbb#3#4#3bqbSbq#kan#4", +"aY.F#ibha7aA.iasbbbo#3bebybL#ybLbN.xbu#la6bSaBbNbrbl.xbV.W#lalbIa.bI#taHb..KbN.ibPb0.Kbb#va9a9aL.K.ZaCbObea7bo.F#v#5aGbMbL#1.E#I#6bu#3.K#5bP#3aG#Sbta9#JbObBa2bobIbW.Z#6#ka9.Z#5bqbHbO.7#lbK.EbR", +"bUbJ.ia4.wbHbh.Zba.O#3ap#3a4#nbUaA#kbYbI#c.7b0.5a8a9bS.NbQ.BbFaA.Zbtbtbt#6bIbFbtaAaAbXbHbLbNbpap.SbebI#5awbq.xan#cbo.KbobHbT#R#Ha9#E#5.Kbe#catbfbIbSbubIbeaKbtaKbY#casaG#kbH.ZbybTaO#cbJ.O.ZbIaG", +"b2.PbIaAaAb1.sbX#Ebfb1#t#qaAbAaH.Ebua4#6#kasboapb2.x.xaGbEbe.5br#9bubX#6bEaKbo#qag.ZbTa7bPbH.5#5#k#5aGb0a7btbY.K#LbL#5bM#X#2#N.ya2bu#C#y#3bo#jbB#B#qbb#c#9al.K#5bTbNb0#cas#3bN.x.ZbEbXaHbN.0.Z.0", +"bq#6bS.na9#ca4bq.Zbtbu.Ea9a7#LblbXapbebqbo#6bYbPa4bXbYbT#IaAaZbqay.B.ba4bNboa2#5.x.EbYbo.F#5#DaAap#5bI#ka4bX.EbRat#kasbJas.O.Zbq.7a1aO.nas.S#2#e.2.ZbHbX.S#5#L.SaVbY#caV.MbSbG.dbObqbIbMa3bb#c#L", +"#kaG.San.6#l.EbAa2b0#k.Za4.Oa2#3.FbMbb.ObJaH#kbRbGa1.nbn.5bn#sbM#N.Y.EbSbEawbebqaC.BbIbJbq#6.K#J#cbT.B#3.0beb0bQaAb0bLbqbIb.b#bO.baya7.E#P#kbP.z#e.x.db0btbE#6bBbTbT#caHbTa2aGbY#3bAbBbSbTb3.EbK", +"bwbYbMbEbo.Eap.x#5bHbebo.LbLawbE.x.ZbqbYbMa2.x#5.ZbJbXa7.ZauasbPai#kbE.BbYb2bzaHbP.Z#.a4a2bJ#5#6a9bQ#k#3bLbqanbM.xa8.0a0aObM#PbR#Xa7bq#O.gbRbRbK.xaAbUapbJ.KbNb.awa6b0a7bYbN.SbY.ZapaObubYbY.0a9", +".1bqbA#PaHawaCbVb2bNbWaCbG.EbYbXaGbKbSaw.E#W.Sap.IaGaIalbJb.#Hb1bH.Z#3bqbH#6#Sbl#k.xb1btbN#JawaKbI#kbKbQ.Sboasa4#6#IaCbMbXbJaAbIbT#sbLbrbL#ibW.zbI#5bHbObu.SbSbLaG#5bEa2bt.x#3bX.wbEbjbo.7b0apbW", +".ZaDaGbNbTbQ.6.Z#3a2#3#5aA#lbMbFb0blaAbq#5apbqbXbI.5bO.5bIb2.E.Z.Zbq.Sa9.KaCaGbT#cbRaHbI.xb0bua4#5.B#5aGbLapbMbo.g.Ea0#QbF#N#5.Sbr.wb..z#hbLbTbObB.BaGaHbXbEbTa9bH.ZbLbPa7bX#c#.bSbt.E.BbNbKbNbO", +".5bGbKbYbNa2.da6bJbq#6.Za2bNboa4#c#lbEbbbNbXbu#3bTa0asb2.E.YbTb0.E.s.SbK.B#maAbbbI.0.x#3bNbI#B#ha7bGbFbTbq#3.S.ZbebT.SbWbqaB.gb0bObmbtbIbLbT#3b0byaw#tbJbQbO.x.Sbo#Lb3bNbmbobKbOawbRa2bJb0.YaAa2", +"btaGbEa7#cb1byaGbobqbL.Bbe.7bIbqaBbWbq#5bq#3#cbX.ybHbnbqbIbq#ca7a7bTbJbPbmaKbIaMa1a7bJ.6.xa9atboa9.5bWax#6bW.NbXbUbTa5bT.Kbq#3as.waYa7aMb0bH.Ea6bNa5aG#5aCbTak.EbTaA#5bHbL.xbobhbS#5bHbea4bIap#6", +"bN.5a2bX.xbQaH.B.Z#3.dbU#kbNbMbFa4btbWbM.E.S.x#6asbL.ZbLb1.Z.0akb..0aZb0bTbP.ia9aAbHaGbH#L#cbeaAbPa2#lbQbLbHbw#3bHbq.5.SbM.SbMbIbB#qa5.xbbbi.M#c#tbebob.bYbJbTbA.wbo.wa5aAa8#t.h#3#ibS.ObIan#3.0", +"bHb#bM.Zbq.sb2b0.a.SbbazaRbNbN.nay#3aG.J#ybSbNbNbWaB.YbL#6anbYbE.Z.xaO#cbea9a9be.mbH.nbq.EbBbebB.O#.#6.x#6bI.Kb2bybAbqaAbP.5boat#k#c.ca#.ZbQap.MbTa2be.Za7bQaw#Oan#ObP#5bY#5#5bJbu#6bBan.E.xbI#3", +"bWbX.Z#5bKaua5a7bTbNbY.B.5bRbVbt.6.xaHapbO.bbqbz.x#5bNbJ.Z#3bHa9#2.EbebN#k.Z#5#q.Z.ZafbV.ZbMbNbqbXbSbI#5b0aG#5bDb0bKaHa4aAbu.0bIa2.xaG.E.BbAbNbHa9.SbYbI#6.ZbIbQ#2#cbIbQ.0.KbO#6#c#PaHbM.EbfbHbo", +"bKbIbI.i.0bL.7.waG.Tap.Sa4.0buai.KbS.Oaw.Sap.6aGbO#c.Sa2bJa7bebH.x.0.BbI#c#Bbu#cbR.YbRa7a7bM.xbI.x#Tb0bVa9bI#cb1bq#c#hap#c.x#3#kbI.KbT#mbqbO#6bPbYbYa9bNatbWawala2bq.xaAbTbobtbf#hbO#5bo#3bIa6aw", +".Eb#.E#2b0bTbMbe.S#3bP#6bOaHbSbSbMbYbP.xawasblbQa2by.TbJasaHbe.KbT.KasbqbtaAbH#3bIbobybGbWaC.E#G#..EbqbqaA#6a9bYaM.6#caB.Ea9bKay.ibL#5.Pbta8b0bMbFa7bqbIbea2bJ.E.KbqbS#6bJbYa9.O.raubA.xbY#kaAb2", +"bJbO#lbXbM#laYbT.Zbl.F#5bBbX.xb0bHbebI#3bNbtbTa7.5bO#3bo#cbObNb2#6bOb1a0aYaAbWb2#6bC#9asbH.0bHaC#T#kaHbXbqaA#5#h#3bYb1apaAawbTbS.k.ibha9aYbMb#bMblbeb..nbtasbKbEbzblaA.ZbQbJbYbTa4bTa2b1.EaGbIbF", +"bT.xbKbHbWbq.B#ka7aubqb1anbUbL#JbT.5bM#6.xaAbIbubL#ca7.SbUapbM.5bu.ka9aAbMbJaYbT#SbPbBbfa9#ca9bH.S#cbXby#waA#taHala2.5bKbSa9.EbMa9.SbhbLbM#6b3bTala7ana2bLbqbTbe#3aAbQ.6a9bN#Qbtbqa2.xb1a4bzbqa6", +".x#lb0b..Ebhbqb1a8btbmbbbhbJa2#5b0bebTa5b0bJbBbIbNa9#5a9.x#3.SbXaZa5.HbX#B#UbLb1a2bYbYbMa9bobtbF.0bJ.SapaAaGbG#gaGbSbJana9b1bY#3.E.x.Z#cbqbQ#cbqby#cbMbIa6bLawbEbH.KbtbLbeaOa7bqbealbube.5bK#.bo", +"bK.BbLbX.ZbXbL#3bKbhbu.ya5.ibPbTbLbh#5.Qby.k.i.k#5.Bb0.BbPaHa4a9a0a8#qbL.Qbnbq.ga7#laAa9bT#B#v#jbK#k#ka4#kaKbTaHbL.Ebl.5bN.6a4bIaza2apbt.cbY#cbb.ZbI#cbfapbSbIan.iaMa9bN#l.i.5#4bI#c.na9bIa9bHbe", +"btapapaW#kawbe.0#8aVaW#5a4a9.i.IbNa2a7bw.OasaGbh.F.naG#l#5bBa9#qbBbFbO#5bMbOaAbB#k#X#kb0#kb0aZ#kbS.e.S.0ahaObSaybHa7#k#kaA#U.nbH.0.Z.0bHb0#P#k.S.BbHbebMbI.x.Zbt.J.7.Z#k.S#T#k.E#4aObN.daF.e#4#P", +"#kbQa7btaGa9azbY.WaGaGa4a9.Ob0b0a4bJaHbFaza5aAas#VbL#kbe.0bMbWbwb0bL.xa8bIb1bJbJ.O.F.I#ka2#ibHbBbIaFaC.SaHbY#l.0.0asbPaAa1.KapbPbMbS.0bSbq#l.xbqbTbY#kaH.0a9bt.K#O.Y#P.Ja7bSbQbEahbq.E.Zat.BaVbH", +"btaGaH.7aCbHbNbS.WbsapbSbLa5bO#6.b#k#lbo#5.gaGbcbTax.5be#k#xa6#n#3bIboasbFbebJbO.jbRbLaKaMbo#m.ia6.xa4#PaHbOaFbqa7bBaO.xasb0.E.Z.Eas.x#lbqbzbKbV#c.Z#xb0bY.SaH.EaC#m#.axb0bNbMapbL.4#.by.CbTas#l", +"aF.SaHbJbNbMbC.Zapa2bGbQ#6.KbC.IbG#cbq.K.5#m##b1awbX#k.5aGa9bT#5.xbm.Sa0.FbhbH#qau#6#JaA#B#hbc#5.B#k#4bO#.aGbSbIbeaDbM#k#5apbLbu.E#3bXbtbX.nbob0bKbT#Va2#6bJbIaG.KbDbEab#5bEbS#tb0a0as#lbMa5aA#B", +"bHbOakbE.E#..Ba7aLaT#c#3btaG#NbY.dbfbN.ZaIbKbPa8aC#NbNbSbXaGaAbebObR#5.xbBaZbJa7.k#9aZ#Lbu#vbeaZbKbHby.xbHbO#.#PbTatasbyaB.VbS.x#cbt.FaGbXbLbN.Zbi#cbT.Ea6bYaG#kbObY#ubEbobuapaGa5b2aZbPaZbLau.G", +"btaSaB.D#lbT#ObP#ta6#3#3bBbHbe#k#5.5.ZbFbEby#hbqbq#.bu#lbKby#5#BbEbXaYb.bL.9bXbX.i#BbB#Ab0bLbJ#lbM#k.F.5bJbTb0a7#9btbe#5bt#JbebMaMbqaMa2bzbobt#3bTa4bMbo.0bXbIat#J#3bYa2bJ#6bo#6.K#5#mbtbBbKboaA", +"b1#l.j#Q.D#H.B.xaHbyanbYar.1.xaya2a6bY.x.ZasbIaA.Ba4.5asbE#B#5bL.KbLasaCb#bKbXa2#qaAalbua5.S.5.Ebt.zbXbMbTb1.xbzbIaCaAbyatal#5bt#ca8au#6bebRa9#6as#cbN#cbWa9a7#kaH#Va6.E.E#c.xam#lbBaw#5.5bBbEbA", +"#U.4.0.Q.ZbMbObX.KaKawaKbP#5.bbq.M.Ta2bWawa8aAbI#kbRaGa4bJbubPa9#3bIbPb0bTblbWbn#3bLbt.w#V#U.Z.z.I.ZbRbKb1bLbXbWbBbebLbtbfaK#c#uaA#6#6#S#vbSaMbe.EbHbI.0bo.xa9.Zb1#k#V.xbNa1a1.ZaU#q.dbNaL#6aRbN", +"ah#4bS.Va7#e.Maibqan#kbXaw.BbLbYa2aha9bIaAbGahawaAbB.ibXbT#c.xbbbJapalbe.xbO.#asawbJ.QaObXakaZa9bXb0aAbA.0br#5.sbNaha9#cbVaCbYaVbDaw#c.ZbeaBaebMbKbP.qbMaAbYa1b0bEbSbE.Ba7.i.Q.BbObNboa7bM.Sa7bW", +"aOaw.xambN.M#2bGbJ.0.Z.xbT.E.ZbHapa2bt#k#3bIaibQbTaAbRbT#k#BbMbMbybybNbe.S.O#..Zb2.2.5b0#H#kbKbt#5bu.ZbM.k.K.xbe.xapbea7aG.0aG.5a4bEal#6awbT#Ob0akbT#c#.bH.SbLbIaUa2.xalbH.0.S#sbebf#J.ObNbJbN.O", +".7#l#4.SakasanaObMaGbqbN.0b1bQ#..daGbIbJbTbTa6aCbObIbH#S.Za5aY.xa5#jbobo.K#5bFbLbtb##U#Rbq.hblba.0bna0#5.QbO.EbM#haA#.bLbMbKa5aAbCbBbfbTbqas#3bWa7bNas.Za7.EbYa1bMaVbt.EbYa7#O.BaKbXbuaHbqasbH.E", +".S#6.Z#kapbT#4bIanbHbRb2.S#cbO.xaybb.BbX#t.Z.V.abJbTaA#5.i.F.KbKbFbFaa#3bf#vbobbbnapbM.S#2#lbKbra9bXbI.0bebMb0#h#6bXaAbM#3bnbPbubobH#.bzapbLbNbIaHbP#ca2bI#5a4bLbK#k#k.Z.B#3bPa7bYbbbobJaG.Ea9ak", +"bLbq#kbJ.S.x#c.E#PbW.Z#l.6a6.nasbQ#4btap.0bBbS#cb0bTbBbLaIa9bL#5#q#taAaaaK#nbtbt#n.ZbH#Rb1bqbUbJbKbz.K.ZbobLbtaZb.aZ.kbM#vbIbM.ibTbFan.KbRbEaA#5bqa9bebI#cbLa2bu.x.xbFbPbIan#HbeaA.KbT#m#kbo.Zbq", +"aIbMb1bHbP.pbLbP.xaGbJapbSbX#.#caCaUbTbTbAbX#c.JbXalbXbb#ia7bJala4aM.Ka2#LaC.Kbwb2bBbO.BbL#U.0#mbXbJaAb.bIaG.PawbMb0bMbn.0aKbHbXa4ae.iap#lbIbo#kbBb0bo#cbPaGaAbua7bI.ZbE.E.xaybbbBboatby.2.Sbq#V", +"bLbTbMa9bP.S.xbRbLbYbPakaAa7bM.E.N##.K.Fa8.SbtbNaG#kbPbrbTbIb1bK#Ra7a7#3bbbxbu#qaA.x.5.0.x#XaK#3.xbX.Ka7bLbIbyaAbq#cbq.Y#3aObb.S#k.sa7a9bPbt.aa2bTaAaGb#btbubt.KagaSbL.SbLawa9aVbI.KbtbM#3#cbJbX", +"bc.FbT.g.haqbMbPbP#ebIbN.6a7#kaAaV.cbtb0b2apaObEa5aAb2.KbIbubl.K.B.Z.7bM#5.0.KbE#vbHbXaf#ObY.IbobhbNbm.ibTbhbT#u.SaWaVbHaG#c.ZaU.A#YbIbYbfbSbGbibo#3aMa9#mbP.K.Kb0.Q.S.xa2.ZbNaCbb#6bo.5bTa7bq.B", +"aw.S#4.cawaS#P#.bqa2bX#.#c#caPa2bHbQ.FbY.d.3aw.o.J.5.5btaGa8auaY#GaebXbWasaK#v#a.H#ObPbJ#3aAaU#cbL.KbIbK#5.xb0bI.a#4.ZbbbL.SbI#..I.SbT.E#k#1bL.6bTaNbo#5#3.YalbLanbqbSbTa7bPaxbubfa7bz.0.Yaw.5a4", +".Ea1.6#2bSbqazbX#kal#c.xawaGbSaUa1.5.5a2.WaCaybYbEaVaH.SaAbq.kbaak#k.0bX.xaY#v#5as#sbB.S#ca9#ca9bK.I.Kb0b0bI#kbKaO#VbHaw#3.Sa7aebX#I.xao.wbq.5bM#5.Zbua5bEbe#vaGbybB.S.Ka2#cbz.SbYb0bBbB.Z#5bo#k", +"bNaG.6apbY#k.r.7aSawawbXaC#caCaP.xbYak.VbNbb.WaWaxbM#c#lbNbXaAbIae#O#.bq#tbO#9aKbRbT.S.ZbNbyaHbNb0bPaAbBbJ#LbebMa1bq#kaKa9bL.x#NaH#Q.x.Z.S#Hbq#Xbyb0#5bMbFbBb1beaAbL.xbtbP.KagbJbqbtbL.xbubTbqbM", +"awbIaCaC.x.0a2aG#k.O#kbq.xbGbS#6.SbHbMbSaCahaGbB.Saz.ZbLanbPbTaY#l#.bTaAbqbeaA#La7aGbFaBawb1boap#Jasa9bWbWbIbObX.NaGbSbP#5.ZbrbMaAbL#kbIbM#hbKbX#caA#3bebuaAbebfbq#6bNa7#5a7bEbobubEbTbE#4#3aGbL", +"###caG.SbEboaGbMbMbY#Vbea4bvahaW#PaC.Zbq.0#6bz#6.J#Waz#J#lbPbLbt.0b0.xaKbO#mbLa5bwb0#kaH.Sa2bWaAbIbJatb0#6.iap.xa1bY#5awa0a9bnaebaa7aY.EbXb0#l#ka8#Ca9bobTaKbYaK#rasbIbLbN.SasaG.4a2.SbobXbK.Ybq", +"an.5bua4by#5.O#c.haCbJanbY#caJbfbHasbNbY.2aq#JaAa7aGa2bybOaAapaYb2#9bLbPbWbXb2.SaHaHanby#3.hbTaObX#3bL.SbT.x.ibTa2bN#5bBaGbobJbqbt#lb#.EbJ.5a9bL#3beaKbOa9bu.E#vbK.MbtbqbN#5bM#3#k.KbtbMbI#c#cbo", +"bobfbLbYaAayaA.M.Eal.nbybLbubE#caia1.7btbBaM.L#BbSaC.5#kaCb0bOaYbMbAb1btbPbL#nbLaU#u.SbebNb..5#sbMbub0a9a8b3bTbI#V#3bubF#q#vbn.2.KbMbo.kbObLbJbJboboaC.KbY#man#mbqbBbLapbMbbaGbS.5aHa7a7bYbebLaG", +"bT#Eam#p#5aAaL#3bOanbqbVbEajaHapaO.SaH.SbObhbM.H.a.SalaGbTbYbh#6bJbM.p.2a9aA.0aoboay#9.E.x.E.g.2a8.5bn.sboaA.Z#6axbF#Ea5ab.4btbJb#bbbPbzbNaAbxbM#5#5.K.iaqbB.K.Fa9anbTbH#k.EbP.SbIbeb0bYbu.x#3bq", +"#PbN#Ta9aVaWbtaG#VbP.ZbhbXbM#h.G#d...ubYbq.7#k.0bNbwadbSbea6aV.5.X.1bE.J.ZaAbS#5.5.Z#T##bY.E.F#l.EbH#c.Ebu.ZaH.CbTbMbXbT#n.5bMbM.JbEbG.5bBbSah.KasbqbtaYala5bJbJ#cbo#3bNbubnaC.gan.cby.Obu.waAa0", +"#4aGbN.E.BataG#ubY.x.EbLbM.2.iaKa9ap#EaGbAas.S#..BbYbNbN#c.Ea2#3#c.JbN.5apa2bRb0.FbNaA.6bWbQ#.bPa9by.Sb2a2bTbE#6bTbIbq#5aA#5bua0beapbEaGbq#capa7aAbMa0bIbt.KaAb0ay#3.Ka2.BbI.sbqbSay.x.Z.xbo#SbI", +"ak.EbSaVbRbSbbbbapbi.KapbF#5bCbtbBbbbOaAbIbI.EbXbI.0.Ba2bqaG.5.dbSbNaCap#mapbubLaM#kapbFbhapbuapaCbJbobSbqbo#FbHbub#asbJbhbJbh.B.FbHbq.0a2aw.BbtaAbubXbI#kbXbPbAaPasbo#5aC.5a7.hbt#kaH#5#c.IbL#5", +"aB.0bMa4#6bP.KbtbDaW#5.W#yaw#qbybLbI#vbXbT#hbLb0ay#5#3#kbA#cbBa9blaGaMbo#Ebh#W#maG#q#Lb2bobe#vbz#AbNaB#5bo#5aw#v.0b0.KbK.EaAbJb1#3bKa9.KbObJ#c.xaAbLbobLbMbubIaYbDbSa6aAbI.Eb0.5bt.xbubH#ca7bbbL", +"aq.nbX.SaH#3bLa9#B#BbiaTap#wbi#Cbh#kbh#5a5#6bm.ibJbqbMbpbM.0bMbb#p#jbu#m#J#9#9aMblbu#6a9#5bfbIb0a9bfbUbIbyb0bobWb0bt.i.SbX#m.Bbbbq#c.KbNbza4b1bKbWbSbLbObobLbeb0arbbbu#k#6bLbMal.EbMbE.Bala9#k#c", +"#kasbMbybXaZ#v#qbn#3boaAbWaXbK.R#I#hbJ.5bU#ha2a2aAbTbEbO#5aAbM.0b0bb#m#6#tbTbhbnbzbobT#9bobeaAbb#ubIbe#p#q.Kbbbua9bPbI.KaY#kbh#6.8a7a7a5bXbBbJbI#kbu#la8.OaYasbMbN#3bL#5.D.i.S#Hbf#h.EbubNa9.Bbe", +"#QbLbIbPas#5a9bP#Lbra7bBbtbI#c.x.Z.EbKbJaha4.RaNbTbLaZ.ZbMbtbFbJbtaAakbO#q.ibWas#3#I#3bY#2bJaGbHaLbeaAbebybt#9bT#kbPbMbPbtbebH.EbX#nbIbObqb1b0#vbRaZbt.BaYaw.5aA.R#3#8#k#cbHbXbMbhbcb1b0bTawaV.0", +"bTbTa7bmbRbhbma9.g#b.y.waG.UanaCbKaH.Ea4bN.Jaya4aYbKbubTbL#hbr.Z.SbYaY.ObL#sbPaYbq.5ak.E.7a4aebY.kaLaMaM#mbS#qbtbra9bTbobLbhbX#haZbP#hbXa8#h.xb##.aAbPbPbXaYbJ#v.Bawbe.x.KaA#k.QbTbTbXapbE.xaCbQ", +".K.K.E.x.xbY.Ka9.bawaDbq.v.ZaO#da1a2.ca2.aa2aGawbMbTbObTb0bB.zbe#T.V.xb0#ca9a8#Ja4.S#5bH.Oa9.B.SbtbTbL.ZbH#lbBb0aG.ZaAbI.ZbubLb0#k#K.n.bbNazaq#q.SbE#iap#Db1#l.5#3.KbMbAaAbE#BaAaKapaAa5b1bTbua8", +"bwanbObI#r.7bu#ybSaG.5.Q#G#.bVaw#cbLa4.BbObQbqbGbMbLbtb1.KbPbMa9#..MbqbobRbMaBa8a9.5b1awbTbSbybKaAbX.S#3bXbP#NbM#qasa5bMaAbIaAbL.S.x#4.M.SbYa5bLbqbSa9#zaAboan#.bLbwbubebX#qbS#5.x.i.KbI#m.2asaA", +"#6be#3a1.E##bmbMbBbYbP#UbRbRa7#6bObWbXbI.E#qbJbTb0byaqbJbMbXbWbt#X.NbH.ZbNaAbu.i#cbKbKbfa2bBbXbN.ZbTbRbT#sb0#5bJ.Z#.bPbXaMb1#6.E.IbR.naObN#kbTb.bI.EbobMaAbAbHaAaGbJaA#c#qbCbo#5bLbMbL#cbObXbObX", +".KbJ.7#XbSbWbtaG.Sa0#sbTa8a7a8bTbIaKbLbIbJbhbR#3aAbLbMb0bMaAbIaA.7bMbN.ZbS#BbX.Kap#AaibW#kbNbTbIb0bXa7#k#3.IbH.iasboaYa2asbqa5bIbLa7bMaW#ratasa0a1bq#c#va9#3.xak#5#nbe#3#5bebXbIbMbtbJaY#kbXbTbo", +"bFbz.7bT.5#kbybo#hbWbobtb3#na5.7#J.IaYboaYb2bPbOasaCbe.Kb0bPbeaBbWaObMaHbJ#EbY#mbqa2#kaAa2#5aO#c.5b#ag.5b0bObK#2aZbL.EbT#5bLaYbJ.K#vbNaG#k#3bubIbT.F#Lbea9#A.ZbKbQ#3b1bL#3#6bObtaAbOanaBbJaAbTbb", +".Kbna2bq.Z.0#m#vaZbTbo#L#BbubPaAbr#cb1##bM#tbH#vbMbT.Za8beb0#.aA#ka9bPbObL#kbB#5bSb0aGbIbqbT#Ja7b#bIbObnbP.Bb1bEbLbobza0bLbobI.Ka5b0byapapbQ.Ea8bHbLa2bobS#3aG.xb0bfbE#3bub0bz#c#6bIbhbI#6bLbebM", +".KaKbYae.S.B#5bIbqbtbu#y#E#cbSbJ.F#3#ca2awbIa4aHbIa9bIbTbWaA#hbq.h.7bHby.fbt#6bYbqapa9bMbBbYbNb1#k.F#k.0bI.0bh.ZbIbh.Eb0bt.Bbha7#maK#Sbi.V#k.KbX.E#kb0a8bua5.5.0aI#AaKbuaK#5aHb0#hbtbRaGbLbKbLbA", +"b0be#P##.EbBaAapbPa7bNbv#7.a.0bObsaFapaGbGbSa2.6aAbTbMbObJ#5bI#5bIb0bWbtbIa7aWbVbtbM.xa9.ZbTbqap.x.s#3.g#3bL#NbK#3##a9aY.xbh.0#5#Jbh#EbebM#cbT.6bqa4b1aLbNa9bM#VaM#6apaA.xa9aM#5bJbM.BaZbXa9bubX", +"bybIbSaGb0.caMbYbJ.r.5#k#P#XbL#.as#XbJbK.2btaGbD.Z.PaYbH#h.B#cbb#KbebqbbbNbiay.Ya7.Z#UaObH.6#2.7bJbH.0#3asbKaA#5#2bOaSbLbPb0.S.g.d.KbGbEbNb0bXbn#X.B#H.0#2.Z.n.SbYbHbMbE.KbTa2.Za9#caKbo.KbtbMbo", +".5aAbWbS.Ebo.Z.K.BbJbEbX.5aH.5bqaA.EasaHbobeaGaC#s#XbIbLbIap#3.O#3.xbIbtaCa2aLbs.SbObIbU.s.xaAbPbIb0bLaAb1bb#6#mbM.0bt#UbN.g.ZbLbu#VaH#ka0bo.5aK.ZbP.KbJbWa8bJ.Ia7aK.SbEb#a4bLat#nbobebLbNaAbTaM", +"bbapb1a9bobP.xa4aGbqbq.Ba9bOaHbqbT.jbXbI#cbMbiaGbWbI#XapaSbObIbEbqbua2bo#5bV#6aybW#XaF#IbL.Oaea7#O.0#kaBbM#qaA#maA.gbbbTbJ.EbBbJ.dbMaGaAbNbTb0b#b0.hbH.BbRbIbEbWaAawa7beaFaAbMbebtbWbL#t#L#5#3#c", +".5a4.E#kbd#lbXbOa7#cbo.xbHbO.E#3#ka6bobLaGbKbq#3ae#.#Nb0a8a7aH#6#tbzbI#6#cbCapbobMbMbF#k.Bbr#.b#.Zb0#6bOasbMbybMb.a9.i.SbqbLbcbTbNa4#6a7#cbTbJbIbbbT.KbObKbF.g.K.0#3bS.4aG#3bY.xbubTaGapbYbMaAbL", +".5aA.K.K.ZbGbBbVbobHbybz#kbB#c.SbNbebHbea7a4bTbMbTbM.IbT#.aGbJbSbF.E#EbJbebtaYbu#s.SbWb3bybI.5bIbH.gb#bLaAaY#qbIb2bMbY.iaAbXbLbf#eawbOapb3bLbBbT#ha9bIbh.0b0bLbPbY#5bX.BboalbI.Kby#A.KaAbe.K#5aH", +"#kbtaGbqbebX.7bO#c#JaGbPbo#3b0bu#haHbebWbXbBbqbW.Pa7bJbO.EbubKapaM#3bXaYaAbRaZbPbBbP.Qa9.gbI#3bI.xbTbI#cbmbebobJaMbM#3bKbP.Y#ua8#cbG.K#kbebqbnbLas.KbXaAbP#3a9bMasap.5#6#l.x.6awbzbubtbfbbbeaAaK", +".B#5.5bebYbta7#3#6bXaG#x.KbY#qbNboa4.Ma9bNaA.gas#..l.QbMb0#c#5b0#5#j#3bIby.kbWaYbMbBbCbr#3bKb0aAbL#ObLbP#3bhbT#nbLbobPbybeaA#Z.K.MbH.ZaC#6bTbtasaZ.Kbt#5bobLaYbebWaCbya7bNbuby.7bob.bebtbL#nbYaA", +"#t.5bTbMbHapbMa7bea9bobo#maAa9.KaHbl#AbQ.4.5bq#saS#2.Fakbh.x.BbDbo#5a9bMa0b..g.I#qb0a8bJ.Zbrbt#3#HbXbN.ibTbobP#u.i#g#3.iaAaK#6bnaP.xaGbtbM.EaYbLbIaM#ma8bIabaAaKbt#ka9bIbebFbHbqbmanbT#3#5#5#5bl", +".nbH#c.n#lbq#kaHbX.SbTapa7bEbBb2#ca2.J.6a9.ib#bT#cbe#t#3bI#DaAbX#6alaAa9bB.E#mbH.ib0asbebbbKas#3.0.KbPa7#l#cbo.Z#5a2#5aAa9bybTa9#Q.x#N.x.ZbJ#kbqbL.BaebWa7.O.UaSbN#qby.Zbo.0.SbNbqay.E.N.Ea9.MbE", +"a7bYb2.EbYbP.xb0.SbobVb0.KbNb0.Eaya1aGaA.ZbqbtbJbzaAbeaAa4.K#BbTaqbBbIb0bRaYbIbobJ.KbubPbLaAbo.sa9#c#k.KbubIaqb1axaw.0be#.#3#kaGbTbLbIbqbP.jbM.B.S#R.xaO.i#2.x.ZbYbIbua9.BbI#lbKapbfbubMa4a2at.Z", +"bLbH.E.K.Zb0.xaxbYbMbq#6#lbO#3aAapb0bEbEbn#.bOb.#Lbbb1bt.Kbe#.aGbMbLbTa9#.bObJbIbB.z#5bLbobI#ibb.SbebXa9#kaGbz#c.ZbTbN#kbO.Sa7bQ.PbPbobLbI.F#5bXaA#NbMbT#Ia7.IbIboa9btbObNbP#V.ra7bNbNaObw.fbOap", +"apbyaw.5bL.SbEbK.x.E#5.Z#cbA#caGan.Ba4.Faqb.bbaYawaA#5bSbLaMa9#5b#bMbBaAbTa9b0bqbo.Eas#hbWbXbL#3a7bR.FaHbt.6.SbIbqbtbtbJbqbobebEasbybXbfbX#3bJ.F.h#lbI.BaA.sbQbMbP.E.ZbNbIa9bB#k#3asaHawbqbX.K#.", +"aAbSasaGa4bIbS#6bobla7#5bLbS.xbA.x.Nbo#kbEbTbqaMbtbtbt#qawbLaAbt.KbLa8bTb#bIbh.BbXbca9#kbIbNbX.8bF.VbJapbLa9bybNbJ.0.Y#k#6.xbu##bO.xbK.SbIa8#k#tbWaAbIbIbH#lb1.0bt#6b0a2.EbAaCbIbS.EbL.0boaHbRbN", +"bT#6btbt#L.Kbh.KbI.FbobIbJbqaAboaw.BbNbIaHbXb#.U#3bwbT#6a9.Ka9aG.Ha9#kbJbebLaAbU.KbMa9aAbMa9bJbL#3aGb0a9bubL#rbtbNbobO.EboaG.K#6bTaMbOaMbtaYbtaMa7bJaAb0bOaK.Fbo.0bYbqaqaAbt#5aZ#kbebObobX.gbuas", +"#qbSbPbKbubAanboapb0.Eby.5bYb0bYa4#cbRbPa6bObL#qa4a9aA#3#6bubu#5.ga2b1b0bJapbL#3.saA#lb0bTbtbHbIbQ.Da9.7.x.7apbJa2bPaHbLbY#k#6bMbEa8bB.ibJbIbOa9.ibMbqbnbe.Ba5bJbT.0.Z.S#5.B#t#c#q.xaAbta5.SbMaA", +"aHbxa2be#6bBby#t#k.xbua4a4bPa9aHap.0#cbAbWbIa2.l#JbKa9bo#AbTb0bzbeaAaAa0btbI.lbLbybXbAbTa5bLaZbubJbubLbya2anbJbT.2a9a2bXa4bTaHbHbubnaA#Lby#3a5bobubB#q#5#hb0btb0a7bM.xbA.xa9bYaKbKa8asbrbOaY#vbT", +".5a9apbX#cbH.SbybYbM#5bYbKapbIbX.M.Vazay.ObAbI.SbFbPbf.Ca4b0bobLbP.xapbN.7.KbwaAbqbL#ka2.SbLapa2buaGbPa9b0au#c#6.Maw.Va9aAbPbtbL.N#c.cbF.E#6aGalbPbM.YbNbW#cbLaGbHaC#4bLbX#cbIbHaF.Zak#l.B#k#Pa7", +"a9.xaw#kbN#cbo.6bMawbIbMboaFbuap.MaH#ka2.Kaw#3bL.hbPapa8#5bTbLb#bq.Z#kbJa9#JaubebY#6btbP#3bT#c.Ia9bOa9byaAbu#5bea9.0a4aAapbqbOa5bYaQa7.R.0.EbIbIbfahbO.S#3bqbTbo.7.xbf#3.xa9#ebeb1bMa7bo#.#Ha9.E", +".K.nbNa2bA.Z.6bYbY#kbK.M.xaBas#3.Zad#5#.a2#k.EbNaAasbMbTbXbP#3b0bqbNaA.xapbJaHaKbTbfawaHbb.Ea2bK#3bebtbeaKapby#5anap#kbYbT#tbqbT.S.x#5#haC#qaYbJana7#3bY#3#3bHbJbI#6bSaA.FbQbOaw.0bG#kbLb0bQ.rbM", +"bQa4bHbqaCbbajbQapbMby.KbtaG.SbyaGapan#ka9bX.K#6bMbK#cbRbI.7#hbP#4bLaObSasbebB#xaw.E.SbP#lbobQanaKbtbWbtb0bL#Mb0bLa7apa8bObTbHaMbPbT#6a0.zbIaAbh#lbbbLbSbq#5bWaCbo#6bqbybebPbubFbq#kbPbYaCbJbta2", +"awbLa4.S.Map#lblbUaw.xaAbNbr.ZbPaAbIbtaGapbQbRb1awaYbM#vbfbJbtbXaS.xbTbebMbYbfbI.5bSaA#c#6bHb0#cbbbOaLaAbubN#5bo#5bWalbIaAbybJbTa0bobIbTa5bMaMbPbTbSbPb0#5bN.EbybI#c#v#6aA#5btbI#3#cbI.S#6bu.ZbT", +"aGbqboaGbJ.5.K.SbE#c.5bobO.S#5.bb0bh.hb.asbMaG.7bLbzaZ#3#kasbPbI#ka2.ZaH.Ya5awbtbQ.KbMbubY.5bybPasbe#vbQbFbb#JbubXbn.ib0bLa0bTa9bObJ.gbebMbSbJbNaGbqa7bo.xaGbIaHbB#mbobwbe#3.KbBa9#5by.KbEbTbTap", +".xbyawbqa2bzbHbNa9bL.E#3bNaG#3aAa9a8aZbLbKb0anbYaY.SbLbOaAbL#5b0.E#kaGbIbOblbB#vbX.7#5.ZbuaGbMawbBbya9b0#3bfb0#5a5.G#5.ibMbeaAbMa7#xbf.Z.ZbEaC#c.EbTbSbMaG.0bfapbIapbRbtbl#m#3bOa9b#a9bL#mbB#c#n", +"bz.xaGaia6#kay.ZbIapbP.xbYbP#kby#bavbh.Ka9a7be.xbS.i.EbtbJa5.xaA.E#5#kbTat#5boa9bNat.EbTaEbXaGbWa9.KbebE.KbT#5#3bg.k#h.sbnaA.5a9bTbB#Pbo.Ma2adaVb0#cbuap#ka8a4bT#faAabaM#qbobeaA#5bo#v.K#6bE#tas", +".5#4bfb.be#t#k#c.F.0.0bYbO#P#c.FaFakapbYbWbNaM.K.MaGbBbqaH.SbmaZ#d.BaiaGaGaHaCby#P.B#e#PbR.x.xasb0.IbWbTbIbo.ZbMbYa7bIbN#k.E.x.I.6bLbMbYb0bX.M#6#lbJ.Z#NbT.t.s.xa4#3a6bR.S.Ka2bo.WbY.J#cbua7bX#3", +"aG.EbfbebEbE.n.Eb0aw.FbEasbMa1bL#k.naAaGbMaw#.bA#caCbYaAbzaAbMav#T#k#V#lazbT.RbObq.0.7bLaFbIbQa7#kaK.EaKbXbMb0b.aHa9bSbe#kbP.Eae#kbobo.YbuaAa6bT.IbM#..EbIbMbBbTbIbqbL#c#6bMa9bq#fbSa9aH.K#3#can", +"bX#caKas#6#ta7bIa7bBbLbPbYbo#5a2bK#4.JbI.MbBbobbaybqbY.xbJbMa9bI.xaGaqawaHbTbQ#cbW#c.5bfbxbobt#SbtbIbRbJaYasbXbtazbXbobMbPbJbTa8#ca7.ZbN#kaH#3an.B.4aZ.ZbhbK#Q.x.xbt.EbP.EbYbLbt.R#caUb0aGbqbyag", +".5aObobnapa8#c#Pbb#t#3aK#tbo#JbB.JbLbEbQ#kbuaH.Jb0bX.6#5.xa4#5#kbTbNaCbMawbK.KbLbybPbu#6bbbZ#vac.Zbn#kbTbebLbfbIaybobfbo#DbM#nasaHbX#5bMbSaAbMbM.E#5bJbM#3a7a9.ibybSbNaM.xaw#3bHaW#6aLbea9b.#B#.", +"bIbKbeaG#vbe#c.x#3blan#t#k#xbubobRaVa9bNbMa2.EbEbObtbB.0ap#5.0.xawaAbMbHa9bS.S.K.KaKbwbt#q#ubZ#jbLbTbObTbNaYbebTbYbSbY#6aAbt#m#qbqbo#c.S#5bo.O.KbtbTa8.6.Eb.aAbL.5bTa7bHbe.x.ZbtbtbPbYb0be#.bnbH", +"aC#.a9bFbobtbPbLbLbobe#3bbbbbt#qbban.EawbE#.bqbEbHbfb0#5bI.x#c#cbLbXbybtbm.SbI.ybN.Kbe.K#qbD#q#za8.5bfbBbJ.BbTbLaVbMbV#3a6brbT#u.ZbA#kbF#.bMbEbW#B#.bB#naA.K#3bT#cbLapboa2#5#.bobu.KbubyaAbhbIb0", +"#Oa2bX.KbeaA.5a1b0.xaAaAa1#kb1.6a9aA#DbH.ZaVbKbqaA.SbJaA.XbS.S.b#gaA#t.EbL.xbMbWbea2bRbtbubWaM#5.ZaZbP.EbMbJ#mbJ.V#GbHaH#3bc.KaYbL#ca9.0#5a2bqbfbMaZbtaZaAbM#tasbeaCb0bTa4.x.K.E#vbE#LbraKbKbIaA", +".xakaKbybW#6bM#l#ka7#k.nbM.0bH#Pa2#3by#..K#kak#0bnbMaA.5.K.BbNa6aK.ka9bLbc.wbL.7.xaAbqbAbo#JawaB.KbLbq#BbebMbMbL.##Va7#2.S.B.0bIbEb2.7#6.Z.KbJbq#m#5a8bWby#ua8#6#3#lawbTbea7bL#3#3#J#5#.#3.ib#bM" +}; diff --git a/plugins/styles/styles.cpp b/plugins/styles/styles.cpp new file mode 100644 index 0000000..6e75fcd --- /dev/null +++ b/plugins/styles/styles.cpp @@ -0,0 +1,164 @@ +/*************************************************************************** + styles.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include + +#include "simgui/fontedit.h" + +#include "misc.h" + +#include "profile.h" +#include "profilemanager.h" + +#include "styles.h" +#include "stylescfg.h" + +using namespace SIM; + +Plugin *createStylesPlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new StylesPlugin(base, config); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Styles"), + I18N_NOOP("Plugin provides styles"), + VERSION, + createStylesPlugin, + PLUGIN_NOLOAD_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +StylesPlugin::StylesPlugin(unsigned base, Buffer *config) + : QObject(), Plugin(base) + , m_saveBaseFont(NULL) + , m_saveMenuFont(NULL) +{ + m_propertyHub = SIM::PropertyHub::create("styles"); + m_savePalette = new QPalette(QApplication::palette()); +} + +StylesPlugin::~StylesPlugin() +{ + delete m_saveBaseFont; + delete m_saveMenuFont; + delete m_savePalette; +} + +QByteArray StylesPlugin::getConfig() +{ + return QByteArray();//Fixme +} + +QWidget *StylesPlugin::createConfigWindow(QWidget *parent) +{ + return new StylesConfig(parent, this); +} + +void StylesPlugin::setFonts() +{ + if (value("SystemFonts").toBool()){ + if (m_saveBaseFont) + QApplication::setFont(*m_saveBaseFont); + if (m_saveMenuFont) + QApplication::setFont(*m_saveMenuFont, "QMenu"); + }else{ + setupDefaultFonts(); + QApplication::setFont(FontEdit::str2font(value("BaseFont").toString(), *m_saveBaseFont)); + QApplication::setFont(FontEdit::str2font(value("MenuFont").toString(), *m_saveMenuFont), "QMenu"); + } +} + +void StylesPlugin::setupDefaultFonts() +{ + if (m_saveBaseFont == NULL) + m_saveBaseFont = new QFont(QApplication::font()); + if (m_saveMenuFont == NULL){ + QMenu menu; + m_saveMenuFont = new QFont(QApplication::font(&menu)); + } +} + +void StylesPlugin::setColors() +{ + if (value("SystemColors").toBool()){ + QApplication::setPalette(*m_savePalette); + }else{ + QApplication::setPalette(QPalette(QColor(value("BtnColor").toUInt()), QColor(value("BgColor").toUInt()))); + } +} + +void StylesPlugin::setStyles() +{ + QString sStyle = value("Style").toString(); + QStyle *style = QStyleFactory::create(sStyle); + if (style){ + QApplication::setStyle(style); + if (!value("SystemColors").toBool()) + setColors(); + }else{ + setValue("Style", QString()); + } +} + +bool StylesPlugin::processEvent(SIM::Event *e) +{ + if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("style"); + if(!hub.isNull()) + setPropertyHub(hub); + setFonts(); + if (value("SystemColors").toBool()){ + setValue("BtnColor", m_savePalette->color(QPalette::Active, QPalette::Button).rgb()); + setValue("BgColor", m_savePalette->color(QPalette::Active, QPalette::Background).rgb()); + } + setColors(); + setStyles(); + } + return false; +} + +void StylesPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr StylesPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant StylesPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void StylesPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/styles/styles.h b/plugins/styles/styles.h new file mode 100644 index 0000000..bf79f36 --- /dev/null +++ b/plugins/styles/styles.h @@ -0,0 +1,58 @@ +/*************************************************************************** + styles.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _STYLES_H +#define _STYLES_H + +#include "cfg.h" +#include "plugins.h" +#include "propertyhub.h" +#include "event.h" + +class QFont; +class QStyle; +class QPalette; + +class StylesPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ +public: + StylesPlugin(unsigned, Buffer*); + ~StylesPlugin(); + virtual QByteArray getConfig(); + QWidget *createConfigWindow(QWidget *parent); + void setFonts(); + void setupDefaultFonts(); + void setColors(); + void setStyles(); + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +protected: + virtual bool processEvent(SIM::Event *e); + + QFont *m_saveBaseFont; + QFont *m_saveMenuFont; + QPalette *m_savePalette; + QStyle *m_saveStyle; + friend class FontConfig; +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/styles/styles.rc b/plugins/styles/styles.rc new file mode 100644 index 0000000..e06247b --- /dev/null +++ b/plugins/styles/styles.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,0,0,0 + PRODUCTVERSION 0,0,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Styles plugin\0" + VALUE "FileVersion", "0, 9, 5, 0\0" + VALUE "InternalName", "styles\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "styles.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 5, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/styles/styles.vcproj b/plugins/styles/styles.vcproj new file mode 100644 index 0000000..c1c4551 --- /dev/null +++ b/plugins/styles/styles.vcproj @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/styles/stylescfg.cpp b/plugins/styles/stylescfg.cpp new file mode 100644 index 0000000..ab79fd4 --- /dev/null +++ b/plugins/styles/stylescfg.cpp @@ -0,0 +1,64 @@ +/*************************************************************************** + stylescfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include + +#include "fontconfig.h" +#include "misc.h" + +#include "stylescfg.h" +#include "styles.h" + +StylesConfig::StylesConfig(QWidget *parent, StylesPlugin *plugin) + : QWidget(parent) + , m_plugin(plugin) +{ + setupUi(this); + for (QObject *p = parent; p != NULL; p = p->parent()){ + QTabWidget *tab = qobject_cast(p); + if (!tab) + continue; + font_cfg = new FontConfig(tab, m_plugin); + tab->addTab(font_cfg, i18n("Fonts and colors")); + break; + } + lstStyle->addItems(QStyleFactory::keys()); + if (!m_plugin->value("Style").toString().isEmpty()){ + QList items; + items = lstStyle->findItems(m_plugin->value("Style").toString(), Qt::MatchExactly); + if (items.count()) + lstStyle->setCurrentItem(items[0]); + } +} + +StylesConfig::~StylesConfig() +{ +} + +void StylesConfig::apply() +{ + font_cfg->apply(); + QListWidgetItem *item = lstStyle->currentItem(); + if (item) { + m_plugin->setValue("Style", item->text()); + m_plugin->setStyles(); + } +} + diff --git a/plugins/styles/stylescfg.h b/plugins/styles/stylescfg.h new file mode 100644 index 0000000..55b2b56 --- /dev/null +++ b/plugins/styles/stylescfg.h @@ -0,0 +1,41 @@ +/*************************************************************************** + stylescfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _STYLESCFG_H +#define _STYLESCFG_H + +#include "ui_stylescfgbase.h" + +class StylesPlugin; + +class FontConfig; + +class StylesConfig : public QWidget, public Ui::StylesConfigBase +{ + Q_OBJECT +public: + StylesConfig(QWidget *parent, StylesPlugin*); + ~StylesConfig(); +public slots: + void apply(); +protected: + FontConfig *font_cfg; + StylesPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/styles/stylescfgbase.ui b/plugins/styles/stylescfgbase.ui new file mode 100644 index 0000000..6927606 --- /dev/null +++ b/plugins/styles/stylescfgbase.ui @@ -0,0 +1,34 @@ + + + StylesConfigBase + + + + 0 + 0 + 366 + 245 + + + + Form1 + + + + 6 + + + 11 + + + + + true + + + + + + + + diff --git a/plugins/styles/wood/CMakeLists.txt b/plugins/styles/wood/CMakeLists.txt new file mode 100644 index 0000000..7526375 --- /dev/null +++ b/plugins/styles/wood/CMakeLists.txt @@ -0,0 +1,31 @@ +################ +# wood library # +################ +PROJECT(wood) + +SET(wood_LIB_SRCS + wood.cpp +) + +SET(wood_LIB_HDRS + wood.h +) + +# moc, if needed +KDE3_AUTOMOC(${wood_LIB_SRCS}) + +ADD_LIBRARY(wood SHARED ${wood_LIB_SRCS} ${wood_LIB_HDRS}) + +# some needed include dirs +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + +TARGET_LINK_LIBRARIES(wood simlib) + +SET_TARGET_PROPERTIES(wood PROPERTIES PREFIX "") + +# install target +INSTALL(TARGETS wood LIBRARY DESTINATION ${SIM_PLUGIN_DIR}/styles RUNTIME DESTINATION ${SIM_PLUGIN_DIR}/styles) + +IF(WIN32) + SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/plugins/styles) +ENDIF(WIN32) diff --git a/plugins/styles/wood/wood.cpp b/plugins/styles/wood/wood.cpp new file mode 100644 index 0000000..a685766 --- /dev/null +++ b/plugins/styles/wood/wood.cpp @@ -0,0 +1,1452 @@ +/**************************************************************************** +** $Id: wood.cpp,v 1.1.1.7 2006/05/07 17:31:30 chehrlic Exp $ +** +** Copyright (C) 1992-2005 Trolltech AS. All rights reserved. +** +** This file is part of an example program for Qt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "wood.h" + +#ifndef QT_NO_STYLE_WINDOWS + +#include +#include +#include +#include // for now +#include // for now +#include // for now +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* XPM */ +static const char *polish_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 254 2", +/* colors */ +".. c #9c4a34", +".# c #a4825c", +".a c #bc5e2c", +".b c #d48432", +".c c #dc9f51", +".d c #bc6e1c", +".e c #d4855d", +".f c #94664c", +".g c #bc714e", +".h c #8c6664", +".i c #d4923c", +".j c #bc8444", +".k c #d49360", +".l c #d4794e", +".m c #ecaf68", +".n c #bc8365", +".o c #d47439", +".p c #a46954", +".q c #dc9f70", +".r c #e48544", +".s c #bc7b51", +".t c #a47761", +".u c #bc7b42", +".v c #a4523c", +".w c #e4945e", +".x c #9c784c", +".y c #d4844a", +".z c #eca053", +".A c #bc614c", +".B c #e4855c", +".C c #bc8350", +".D c #c48e68", +".E c #b16634", +".F c #e49339", +".G c #bc703a", +".H c #bc7c67", +".I c #a45f34", +".J c #cc714d", +".K c #d48c5f", +".L c #a47057", +".M c #cc703a", +".N c #dca674", +".O c #b47859", +".P c #bc6729", +".Q c #d49475", +".R c #d48b4a", +".S c #cc8351", +".T c #cc8466", +".U c #ac6841", +".V c #e4a651", +".W c #e49576", +".X c #d47d31", +".Y c #ac6e4b", +".Z c #c07650", +".0 c #e48c43", +".1 c #e49452", +".2 c #9c745f", +".3 c #e47e54", +".4 c #cc7c4f", +".5 c #cc7c32", +".6 c #b46133", +".7 c #d49a68", +".8 c #d67e4f", +".9 c #bc7643", +"#. c #b47056", +"## c #d48b3a", +"#a c #dc9f5e", +"#b c #e49a60", +"#c c #cc6a31", +"#d c #8c6244", +"#e c #dc9a41", +"#f c #eca753", +"#g c #bc8a58", +"#h c #d48c76", +"#i c #bc693f", +"#j c #bc715d", +"#k c #9c6857", +"#l c #f4b171", +"#m c #bc8a6a", +"#n c #eca16d", +"#o c #a87e58", +"#p c #a4613f", +"#q c #a48569", +"#r c #d4846d", +"#s c #dc935f", +"#t c #c47c50", +"#u c #dc8449", +"#v c #bc6950", +"#w c #cc9678", +"#x c #c4703a", +"#y c #cc7b67", +"#z c #dc8c5e", +"#A c #ac7067", +"#B c #eca86e", +"#C c #b4786d", +"#D c #dc8c4a", +"#E c #b46842", +"#F c #d47c41", +"#G c #e48d51", +"#H c #e59a52", +"#I c #9c6e3f", +"#J c #d49351", +"#K c #cc843b", +"#L c #ecb678", +"#M c #9c5a38", +"#N c #d4795c", +"#O c #c47b39", +"#P c #ec9560", +"#Q c #ac764c", +"#R c #c48351", +"#S c #c48e74", +"#T c #cc7650", +"#U c #cc8a84", +"#V c #bc6a5c", +"#W c #e4af74", +"#X c #b46855", +"#Y c #e4a06e", +"#Z c #ac775b", +"#0 c #e48d5d", +"#1 c #c47d65", +"#2 c #cc763f", +"#3 c #b47e5d", +"#4 c #cc8a55", +"#5 c #cc8a67", +"#6 c #bf622f", +"#7 c #dc853b", +"#8 c #e49f4a", +"#9 c #9c505c", +"a. c #8c5644", +"a# c #cc7329", +"aa c #a45a51", +"ab c #b48264", +"ac c #9c7a7c", +"ad c #9c5f4f", +"ae c #b4844c", +"af c #a46749", +"ag c #dca664", +"ah c #b46e1c", +"ai c #c4762c", +"aj c #a45a3c", +"ak c #dc9a74", +"al c #ac7e46", +"am c #ac6a6c", +"an c #eca862", +"ao c #e49a41", +"ap c #e49a78", +"aq c #bc7660", +"ar c #d57e5e", +"as c #9c6e5c", +"at c #ab7e65", +"au c #cc8a44", +"av c #9c6240", +"aw c #bc6244", +"ax c #bc5d3f", +"ay c #e48550", +"az c #eca060", +"aA c #cc7160", +"aB c #cc7c42", +"aC c #b46241", +"aD c #b4726c", +"aE c #eca67f", +"aF c #9c6a3c", +"aG c #94685a", +"aH c #c48240", +"aI c #c48465", +"aJ c #dc7640", +"aK c #cc8f54", +"aL c #e4a76f", +"aM c #c4692e", +"aN c #dc9474", +"aO c #ac6050", +"aP c #b47048", +"aQ c #94614b", +"aR c #ac836c", +"aS c #a47048", +"aT c #b4764a", +"aU c #ec8e5c", +"aV c #dc9a53", +"aW c #cc765e", +"aX c #b48a64", +"aY c #dc9a63", +"aZ c #c47640", +"a0 c #ec9a60", +"a1 c #c48a54", +"a2 c #c48a67", +"a3 c #ac5a3c", +"a4 c #ac8458", +"a5 c #dc855d", +"a6 c #c4714d", +"a7 c #dc9243", +"a8 c #dc794e", +"a9 c #ac6955", +"b. c #cc8f67", +"b# c #ac6032", +"ba c #ac7056", +"bb c #dc7a34", +"bc c #ec9553", +"bd c #dc8d3b", +"be c #e4a060", +"bf c #f4a654", +"bg c #c46842", +"bh c #c46f62", +"bi c #ac613d", +"bj c #dc866c", +"bk c #c4694e", +"bl c #dc7d42", +"bm c #ec8d4f", +"bn c #dc9351", +"bo c #cc9177", +"bp c #c4695f", +"bq c #ecb075", +"br c #e4a75f", +"bs c #d4843c", +"bt c #bc722c", +"bu c #d4936c", +"bv c #d47644", +"bw c #bc7d5c", +"bx c #ac563c", +"by c #e4956c", +"bz c #a47a4c", +"bA c #d48454", +"bB c #bc825c", +"bC c #e49544", +"bD c #bc7044", +"bE c #bc7e74", +"bF c #d48d6c", +"bG c #cc7144", +"bH c #b47864", +"bI c #bc6a34", +"bJ c #d49684", +"bK c #d48b54", +"bL c #cc845c", +"bM c #cc8474", +"bN c #ac684c", +"bO c #cc7d5c", +"bP c #eca27c", +"bQ c #dc946c", +"bR c #c47c5c", +"bS c #dc8554", +"bT c #c47244", +"bU c #dc8c6c", +"bV c #dc8c54", +"bW c #b4684c", +"bX c #cc8344", +"bY c #c47b44", +"bZ c #c4825c", +"b0 c #e4a17c", +"b1 c #ac7a64", +"b2 c #e48c6c", +"b3 c #c47a74", +"b4 c #e49f54", +"b5 c #9c674c", +"b6 c #946764", +"b7 c #c48674", +/* pixels */ +"#u#G#G#P#G#G#G.1#G#G.1.1.1.w#G.r#D.1.1.1#D#DbVbV.K.K.K.KbO.Z.Z#TaP.GaT.Z.O.O.O.H.9aP.ZaPaPaPbZbo.i.k#J.k#JbKbnbn#b#sbVbV#G#G.r.ray.r.0#G.0#G.1bc.r.0.0bc.0.0.0.r.1.1.1.1#G#D.0#D.0.0.0bcbcbc.1.0", +"#aagaLbrag#a#a#a#DbVbn#G#0.1#0#Da5#za5.4.J.Jbk#vbt.G#x.9bY.4#tbYbw.saPaP.Ub#af.Y.s.s.Z.saP#E.gbw.U.U.UaObWbWbWaPb#b#.E#t.K.K#z#s#s#sbQ#s#sbn#s#sbn#s.w#s.w#s#sbn.ybV#s#sbV#s#sbQ#aak.7.k.7.k.k.k", +"#..g#.#.#j#.#XbW#Z#o.O.O#3.n.n.Halalalala4aXaXa4#t.u.9#R#5bu.k#5bob7aIaI.nbwbw#m#5aIa2#5#5aIb7#5.DbBbB#3bwbw.C.O#oabab.naI.C#t#R.9#tbY#tbY.ZbY.s#t#t#t#R.sbY.s#tbD.Z.Z#t.9.Z#t.4bBbw.s.saT.9aTaT", +".ybS.ybSbVbVbVbVbl#u#u#ubSaybSay#s#za5#z#z#z.KbA.Qb.aIbZbZbB.g.U.gaP#.aP#.aPaP.O.9aP.g.s.O.ZaP.Z#CaD#Aamamamam#X#3#Z.OaPaPaPaP.saZbY#t#t#tbY#tbY#t#tbLbZ.SbR#t#tbZbRbZbRbR.sbRbR.4aBaB.4bY.4.4.4", +"bKbV#zbKbA.ybK#zbV#z#0bS#0#0#0aya5bA.4.4.4#T#xbgbwaq.O.g.O#j#.aPaCaC#v.g.gaPaP.Z#R#R#t#t#t.Z.s.Z#O#O.5aH#KbY.S#4bD.G#xaZaZ#2.SbVbV#s.wbV#zbSbAa5.e.KbQbQbU#s#z.K#5.K#5.T#4#5.Kb..4bZbL.T.ebL.K.K", +"#A#A#C#C#AaD#CbEatataRb1b1abb1.t#I.f#IaSbz.x.#.##v.g.g#1bR.T#5#hbObO.T.K.K#5.KbubL.4.4#t.4.Z#tbL.e#r.K.K.e.e.T#r.K#z.K#z#sbVbS#zbV#u#ubVbl#F.8.l#2.4.8bAbA.l.4bva6.g#x.g#x#i#i#i.L.Lba#Z#Z#Z#Zba", +"aPaT.u.u.s.C.C.C.SbA.S.4.SbA.8.8#r#rbF#h.TbO.T#h.KbF.e.e.S.S.S.S#u.y.8bA.e.4bA.e.K#zbQ#s.K.KbUbQ.y.R.y.yaB#O#xbT#t.4bLbLbL.4bL.S.4.S.4#T.Za6.Z.JbD.g.Z.g.Z.g.Z.ZaP.g#iaP#i#E#EaC.Obababa.ObH#Z.O", +"#zbSbA.e#za5.e.8bV.KbV.ybAbK#zbK.8.ybV#z.y#F.y#sbKbA.Rbn#sbn#b#b#Y.w#sbV.y.4.lbA.y.y.ybA#T.MbG.4bObO.4.SbLbOaq#..O.Yaf#p#p.I.U.UaT.Z.O.Oaq.O.H.Hb1b1#Z#Z.L#Zat#3bw.s.HbBb7aIaIaIbA.l.4aBbAbA.e.e", +"#DbVbn.w#s.w#sbVbAbSbSbV#D#GbS#0.1#H#H#H#b.1bn.1#4.S#t#t.S.TbL.S.K.K.K.S.SbK.e.S#t.4#t#tbDaPb#b#.U#E.9.S.ebVbS#G.K.K#r.l#y#T.Z.Z#2aB.S.ybS#u.8#F#Kau.y.S.y.y.R.y#z#z#sbn.1bna7bd#F#DbVbVbV#s.w#s", +".1#s.1#s.1bVbS.y.K#z#sbVbVbA.8#FbA.8ar.8.e#r.e#NbKbA.S.S.S.SbLbLaBaBaB#2aB.SbKbAbVbVbV#s.w#YbebQ.KbA.e.KbV.ybl.ybsbsbs#D#u#D#u.R.y#D#DbVbV#s#0.wbebe#b#bbQ.wbn#GbV#G#D#G#D#GbV#D.ybV#sbV#s#s.w#s", +".wbn.w.w#bbQbVbV.4.4.ybKbnbV#z#z#G#D#D#D#u#D.y.R#2aB#2.M#x.M#2#2#z#s.w#sbV#s.w#s.1.w.w#b.w.1#G#G#s#zbVbVbVbSbVbVbd#ubd.r#D#D#D#D.1bC.1.1.1.1#D.1bV#G#0#0#G.w.1a0bC#G.0aybS.Ba5a5bVbVbV.w#z.w#sbV", +"#ubVbVbVbV#GbV#D#s#sbn#b.w.w.1bVb2b2a5#z#z.K#zbA.w#s.w#sbV#s#z#s.w#b.w.w#GbV.w.w.X#Da0a0#G.1bcaz#G#GbS#GbV#ubV#0#z#0#0a5#0#0b2#0.0.r.0.0#u#u#F.o.M.M.M#F#ubV#G.1#b#P.w.w.w#0aya5.y#u.y.ybVbnbVbV", +".wbV#GbV#G#s#G#0.1#G.1.1.1#G#G.0#0#0.w.wby.wbQbn.w.w#G.w.wa0#b#P#u#G#G#0#G#G#G.w#baz#Yaz.1.0#D.0#G#G#G#GbVbl.8blbva8.8.B#z.Ba5#0ay#G#G#z#G#z#z#z#zbU#z#z#zbQbybQ#zbK#z#s#sbn.R.y#2#2aB.8bVbV#0bV", +".w.w.w#z.w.w.w.w#GbV.r.0.0#G#G#Gbda7a7#H#8#8#8#H#u#u#F#u#D#GbV#u#G#G.w.1.w#G.wa0bV#D#DbV.w#baz.w#G#G#G#G#0.BbSa5#u#u#D.1.1bn.0#7#z#0bSbSbSa5#z#z#r.e.e.4.4#2#2bT.4.4.4.S.R.Rbn.i#s.K#zbV#s#0bV.w", +"#u.8#u#u#ubV#GbVby.wbQ.w#b.wbVbl#T#T.l.ear.Ba5.8.w#G#G#G.w.1.1.1.1#G#G.w.1#G#G.w#P.w#G.1.w#P.w#0#D#DbV.w.w#0#0#0.w#b#baVaVbn.1#G.y.y#F#F#2.obv#Fay#z#GbVbV#z.e.e#z#z#zbV#s#s#s#sbQbQ#sbQ.wbV#G#0", +"#0#0#0#G#0#u#ublbDbT.4#4#zbQ.e.e#s#s#s#z.w#0#0aU#DbSbVbV#D#D#D#G.w#G#G.w#P.w.w.w#Gbmbmbmay#u#G.waz#b.w.w#Ga5bl#uaraW#i#i#ia6.4.ebVbnbQ#b.w.w#GbV#u.r.r#G#G#G#0a5.1.wbV#zbSar.J.JbT#x#2.y#F.8#u#G", +"#5.TbL#tbD#i.g.Z.SbA#zbAbKbSbSbA#u#D#G#u#u#u#DbV#GbVay#G#0#G#G.r#D#Gbn.w#b#b#HaY.1bVbV.y#u.y#F#Fbv.o.M#2#2#2aBbG.9#OaB.y#D.1.1.1.w#s.1.w#G#G#G.rbdbda7bdbnbn#sbQ.nbw.s.Z.4.8.8.8.obl#u#zbV#z.K.K", +"#i#x.Z#tbL.K.kbQbAbVbK#u.ybSbV#z#G.w.w#G#D#G#0#G.1#G#D.1.1.1.1.1bVbV#z.yaBaM.M.5.y.y.y#ubV.w#P.w.w.w#b.1.1.w.wby#b.w#b.w#b.w.1.1#u#u#ubVbAbK#z.S.T.TbO.Z#vbga3axbD#xaZ.8bAbAbAbA.e#4bA#ta6.P.6.6", +".S.4bL.e.e.e.ebA.8bSbSbSbVay#0#G.1.1a0.1#ba0#H#bbc#Hbc#Ha0bc.1.0#z.8#T.J.l.ebVbV#G#G#G.w.w.w.w#P.w#b#n#b.1.1.w#n.1.1.1#G#G#D#ublbl#2.4.4.g.Z#ZbN#9#9aa#X.g.ZbOar.Mbvbla5#z#zbA.laPbNbi.U.U#..Zbw", +"bL.e.e.e#zbSbSbl#u#DbS#G#G#0#G#G.1.1.1.1bc#Ha0.1#G.1.1a0#b.1#u#F.e.4#T.8by#b#na0a0#b.w.w.w.w#P#0bVbV.1.1#G#G#u#G.1#G#G#ubS.8.l#T.Z.g#ibW.UbNa9#p.UaP.9.S.ybVbV#Dayay#z#z.e.4bT#i.pad#pbN#.bRaI.T", +".4.e.KbS.8blblbSbSbS#GbV#G#0#G#G#G.0.1.1bcaz#H.1#G.1.w#P.w.w#z.8bK.KbQbQbV#u#D.1#0#G#G#G#G#G.1#P.1.1beazbe.1#G#u#zbK.K.4bO.Z#j#v#A#ka9.YbW.ZbL.4.R.R.ibn#D#u#F#FbS.S.4aqaPbNbi.I#.bWaP.gbObL.8bL", +".K.K#z.e#F.lbv#F#z#GbS#u#u#G.w#G#u#G#G#G.1a0bc.1#P#P#P.w#GbVarar.R#J#HaY.1.1.1#H#H#b.1.1bc.1#P.1.w#b#bazbe.w#zbA#t#t.Z.Z.Z.g#.#.b1ba#..Z.Z.lbS#u.y#u#ubSbS#N.laA#j.ga9#kad#ka9#..g.g#tbO.e.e.ebA", +".l.l.8.y.8bAbAa5bSbS#ubSbS#0.w#G#G#G#G#G.1bc.1bCbm.1.1.0#Dblbv#T#D.R.ybVbe#nazanananbeaz#b#bbc#H.wa0.1#sbV.S.S#t#t.s.Z.sbwaIaIaI#t#t.4bA.lbl#ubl.3a5a5.e.4bh#V#XbN#k#kaG#k.L.OaIbL.e.K.ebA.y.4.8", +"bSbAbAa5.ebA.8.4.8.ybS#z#G.w#0bSay#0bm#G#G.0.1.0bc#H.zbf.zbe.1#z.KbVbSbA.y#D#D.1bebebe#HbeazazazazazbebV.S.4#1bMbZbR.Z.Z.Z#t#tbYbl.o#ubS#Gay#0#uarbl.laB#t.uaT.Oad#kaGb6#ka9.g.Z#t#t.4.4#t.4bK.K", +"aBbs.y.ybA.l.lar.4aBaB.8.y#F#u.wbn#D#D#G.0.0a7.FbdbCbc.1.1.0.1bc.F#8#H.1.ybG.4.ebn#s#s#baY#saYaV#b.w#s#J.SaZbD.sbR#t.S#z#ubs#F.R#D#D.0#G#G#G#G.0#D.R.yaBbDbDaP.g#Zb1.L.fb6.h.hac.I.YaT.u#t.Z.Z#2", +"b3bR#1.4.4.4bX.R.K.KbV.ybl#F#F#F#za5a5.B#z#0#sby.1#G.1.1.1bm#G.1a0a0#H#H#b#b#s.ya#.X.y.ybVbn.w#bbebeaY#sbAbRbZa2au.S.R#s#z.y.e#zbs#ubn.1.1.1#G#D.0#D#D.RbA.4bO.4aPbD#Eb#af.I#Maf.2.x.L.L#Z.O.n#S", +"aObi#Xbw.s.sbY.SbXbK#z#z.w.w.wa0#z#za5bS.l.l.8bVbSbVbS#G#G#G.w#Pbe.w#b#bazbrb4#Hbebebe.1#u#F.5.X#F.y#s#Y.NaN.Q.Q.T.Tbu.w#sbn.1be#sbVbV.y.y.ybn#b#G#G#G#G#0bn#zbSbn#bbn#D.R.RaBbX#3.O.Yaf.I.Ibi#E", +"aVbX.G.6a3aCb3#U.y#z#s#0#z.w.w#s#H#H.1.1.0#G#Hb4bVbV#u#u#u#D.0#D.1.1.1#D#7#D#Hb4bCbc.1.w#b#b#n#nbe.1#u.yaBbX.S.kb4.cb4aYbA#T.4#r.4.K.K#s#s#s#D.y#GaybV.w.w.w.w.w#G.w.w.w#b.1bn.1#P.w.w#0#0aybS#G", +"bnaVaYbeaNarbp.A.P#2#F.y#u#s.w#sb4b4.1.1.1.1#H#H#nbeaz#b#HbnbCa7.zbe.z.1#D#D.w#Baz.z#H.w#P.w.w.wbebeanbrbebn.RbX.4bQb0aL#BaYa7.bbA.4#xaMaZ.ybK.kbA.4.4#F.8.ybA.ybv#u#ubS#sbV#D#zbl.ray#G#G#P.w#P", +".w#0bSbVbV#D#D.1aY#b.w#zbS#FaBaB#x.M.l.8a5byap#bbn.1bebebebebeaza7.0bd#u#ubSbS.BbC#D.0#D#G.w.w.1anazb4bebebebr#B.V.c#D#Oai.S#s.WaE#Y#Y#YaY.kaB#x#4.S.S.4aBbX.y.y.y.K#z.KbV#z.ybV.ybKbKbK.K.K#z.k", +".8.8#u#G.w#HaV.1#s.w#s#0#zbV.wbQ#na0by#0a5bSbvbg.M#F.y#ubSbA#z.k.w.w.w.wa0a0.w.w#H.w#HbV#D#u#G.1.1.1#b.w.1.1#D#DbVakaLaLaLbq#B.VaB.XaB.ybKbQaLaL.q.qaY#a#b.w#b#b#b#b.wbn#s#D.y#D#s#s#s#JbKau.SbA", +"b4#Hbe#baY#s.K.S.y#F.ybSbS.R#zbe#H#H.1#Gbc#b#bbn.w#bbybQ.4#xbga6#T.l#za5bV#G#Gbc.w#b#b.wbV#D.1beby.wbVbV#z#s.w#Y#bbeaY#J#s#Ybe.1#B#B#Bbr#s.RbA.KbKbnaV.w#b.w#Ha0b4anbe#Hbe.1.1#bbC#8bc#Ha0a0#Pbc", +"b4#8#8#H#HbCbC.1b4#b.w.1#P#G#G.0akbVbXaB#2#2.4bAbA.KbAbV#s#b#YaY.1bV.8aZ.GbYaB.S.RaV#abebn.1#8az#b.w.w#b#ba0by.w.1#Hazbebe.1#s#b#ebnbnbnaVaVaYbnbnb4bebe#abe#abebnbnbnbn.ibnbnbn##a7#8#8#ea7beaL", +"#Y.w.w#s.w#0#z#0#D#DbVbVbVbV#bana7#D.1.1#b.1#D#D#u#u#Fa#.o.y#D#D.r.r.w#b#Y#b#b.w.gbkbg#Tar#za5a5####.5.b.Ra7.1bn#HaV#H#Hbn#D#D.ybQbQ#z.K.e.K.e.ea7bnaVa7bnaY#aaL.m#Wbrbr#Ybr#W.m#L#L#L.mbeb4.w#b", +"#sbK.ybS#z#zbSbS.k.k.K.S.SbAbKbn.w.1#D#GbV#GbV.w#G#G#G#u#u#ubl#7.r#G#G#0#zayay.0#Y.wa5bS#zbS.8.M.4.Z#xbka6#TbObO#D.Rbn#s#bbebebebV.R.R.y.R#D#DbVbebe#BbqaLbebn.Rbnbnbebr#BbrbeaV#Da7bran.mbr.1#D", +"anazbean#Banbe#H.y#O#x#x.ybKbK.R.Jbvar.ebja5#N#TbvbS#z#0#0.1#0bV#G#u#u.o#Fbb#7bm#F#7#u#D#Dbn#bbe#s#s#sbn.w#zbVbVbkbpbpbpbhbhbhbhaAaAaWaW#N#r#rbFbs.ybKbn#b#YaLbq#Bbrbebebebr#BbqbeaLbe#Y#B#B#B#B", +"a7#DbCb4azananan#BaL#b#Yby#b#G#ub0aN.e#x#i#xaWbObAa5.e.8.4#2.4.4.w.wbQ#zbSbSbVbV.w#z#zbS.JbGbG.l#D#GbV.1.w.1#G#G#H#8#8#8aoa7#8#8#D#Dbn.1bnbC.1bC#b.w#D#D.y.5bs.y##a7#Hbranbe.1.i#sbn#D.Rbsbs#ubs", +"#b#0.y.8#2#2#2#2#F#u#G.w#0#G#Pazb4b4beb4bnbn##.5#xaB.4.4.4.e#z.K.e.SbA.8bA.ebK.K#zbV.y#ubVbVbVbVar.8ara8ara8a5ar.RbV#zbVbA.y#D#sbSa5a5bV#zbSbVbS#G#DbV#b#b.1bn#bananbeb4b4anananbean#B#B#Bazbebe", +"#0a5bSbV.w#Y#BaE.1#0.wbSay#uay#Gbd.FbCbC#H.zanaz#b#b#b.w#zbA#2#c.P#6#6.M#2.e.K.k#KaB.Xbsbn.1.1#7#Hbna7#D#D#D#D.0#0#zbVbV#u#F#FblbdbCbC.1bC#G.1.1bV#u#D#G#Hbean.manbeanan#B.manan.mbebe.1bV.1.1.1", +".zbCa7#Hazanb4#8#Y.w.y.8#z.w#G#D#G#0#P#0#0#0#uaJ#D#u#ubl#D#0.wb2.w.1#0#0.w#z.4.G#vbhbRbO#rar#N.l#4bL.S.4.4.4.4bLay#D#uay.1#Ha0.w.1.w.1.w#G#s#0.w#G.1.1an#Bazb4b4anazb4b4.zananan#f#f#8#b#H.w.1#b", +"b4#Hbd#Ha7#H.1.0a7#H#b.wbV#s.w#0#D#D#D#D#G#u#u#G#G#G#GbV#u.8.y#ubs#7#G.1.1bn#D.y#xbXbAbAbYbt.Z#RbXbK#s.k.R.S.RbAbl#F.o.o#Fbv.yblbV#u#7#G.1.z.z.z.w.1#G#u#D.0#G#nb4#H.1.1#b.zb4.z#H.1.1.1#Hbe.m#B", +"#Y.w#D.1ay.w.w#Ga7#H#H.w#G#G#G#G#D.wbV#G.1.w#G.1#D#D#ubSbA#u.KbV#s#G#u#u#ubVbn#s.zb4b4#sbO.g#V#X.MaB.yaBaB#2aZ#2.y.y.R.KbQ.KbQbu#zbAbK#s#bbe#Ybea0be#bbn.w#D.y#G.1bC.1.1a0#b.z.z.zbc#H.zbCao#HbC", +".wbS#0.wa0a0#na0azaz#b#H.1#G.0.0.w#P.w#G#0#G#uay#D#DbAbK#z.KbSbK.l.4bv.8#F.l.e.S#ubAbA.RbK.K.K#s.4bAa5#z#z#z#z#z#w#m#3ba.p.p.L.L.ZaZbD#t#R.SaKaKakap#Y#bak#s#zakbn#D#u#D.y#7bs#7#F#F#u#0#0#0by.w", +"bna7anbran#8az#8.1#ba0#bbcbeaza0a0.w#G#G.1bm#G#0.1#z#GbV#z#0#s#G.e#z#z#za5.8bGbgaAbv#T.l#F#Da7a7bQbybQ#z.e#z.ebAblblay.0ay.raJ.obR.s#tbR#t.s.s#tbDaZa6bT.Z.gbT.SbA.S.S.KbQ.q.q#YbqaLbeaV#D#u#D#u", +"auauaL#W#Wbr#L#Wbe#nbe.w.w.w.1a7.1#H.1.0#u#7#7.r.0#ubl#uay#Gay#u#z#za5#u#ubS#za5#D#u#u.8.8.8.8#r.4bYaZ.G.GaZaZaZ#t.SbLbFb.#5bO.Z#t.Z.Z#t.Z#iaC.E.Z#1.g.ga6#ibWbR.C.s#..OaPbNbi.Ua9ajaO#X#v#y#r#h", +"bL#1b.aI.g.I.UaP.GaZ#t.4.SbK#sbQbe#Bbe#b.1#D#D.w#G#DbSbl.8bl#u#F.8aB#F#F#F#ubV.w.ybSbS#u.8.8a5#z.k.K.KbK.KbQaYakbu.K.S.4.4.4.S.e.4.8.4.ebF.Kb.#h.gbR#taq.ZbW#E.gaP.YbNba#.babaaP#3.u.s#R#R.S.KbK", +"a6a6.Z.ebO.T.QaNa2a2aIaT.Ub#.6.EbIaZaZ.4.S.SbA.kakbQ.k.KbF.ebA.y.e.ebSbS#u.8#FbG#r#r#r.e#F.ybsbdbV#zbV.yaBaB#2#2#MavaS#Z.O.O.OaPa6#i#i.ZbRaI.H.n.ZaIaI.T#5aIbRb.b.bLaIbRbR.gbWaP.g#v.g.Z#x.gbT#i", +"#H.1#DaY.ybV.SaB.Y.O.O#.#X.ObBaIbR.T#1#t#1.Z.g.ZaP.U.U#EbW.g.g.g#T#T.4.l.l.8bS.e#F.8#F.l.8arararblbSa5#0bS.BbS#ubV#u#ubl#ublblbl#5bZ.gaP#.babN.pb##E#E#E.Z.g.gaIaB#2.ZbL.T.e.e.K#z.kby#b#b#Y#Baz", +"brbrb4#Hb4.1#D.0.R.y.y#F.yaBbvaB.Z.g.g.g#jaOaxbxaFaS.Y.O.s.s#ta2#Fbla5bSay#ua8bl.y.y.RbK#J.KbKbK.S#F.y.8.8bA#F.l.y.y.8.8.4.4.4.4aPbtaPaP#E.YaPbNaP.Z.sbwbw.C.CbZbB.C.Z#..O.H.OaP#RbX.SbK#JbnaV#a", +"aZ#taZ.Z.4bLbO.ebLbR.S.TbL.T#4buaK.S#R#R#4.Sbw#t#3aT.Z.ZbD#i.E#i#Z#ZafafbN#Z.na2.3ay.B.Bay.B.8a8bn.y.4.4.4.8.8bAbl.y.ybKbS.e.e.8#F.K#s#s.k.KbLbObL#t.Z.9.G.GbI.E.G.9aP.g.ZbZbZ#tbJaI#.#EbW#E.g.Z", +"aKaKaH.u.C.C.sbw.O.O.O.O.Y.Uba.O.uaPbtaT.u.s.s#Rb.#4#5bLbL#T.Z.4.4#t.4.4#t.4.y.ebKbAbV.KbAbAbA.K.KbVbAa5#z#z#z.y#z#zbS.8aB#2.M#2.o#F#ubl#F#u#G.wbQbKbKbnbQ#YaL#Y#saY.KbAbYaBaBbY#.bibiaPaI.Tb7bR", +"#h#5#1#X#jaOaaaa#M#paf.Ybaba.n#S.H#.#.aDaqaqaq.HaPbW#x.Z.4.Z.4bR#RbLb.b..k#4#R.4#RaH.u.u.u.ja1aK#F.S.4.K#zbQ#zbVbSbSbS.ybS#DbVbVayayayblbbbl#u#G#D#u#u#D.1.1#b#H#H#b#b#GbV#s#b.1#L#WaL#WbqaLbK#K", +".zanbeb4be#aaY#aak.k#4bL#t.G.G#i#1#j#j.gaq#j#.bW.ZaT#tbRbObRbLb.#u.r.r.r.r.rbmbm#za5bv.la5a5a5a5.K.4#xbg#xbg.MaM#2.8bV#s.w#sbV#ubS#z.1#z#G#G.1#G.1.1.1.1.1.1bc.1.1.1.1#G.wazaz#Bb4#8bC#Hbebe#H#b", +"#D#G#G#u#0#zbSbSbVbVbAbAbV#z#z#s#JbK.R#s#saYaVaYb.#4.SbL.4.Z#t#t.L.LaS.Lba.O.n#mbQ#z.K#zbQ#0.e#2bQ.K.K.K#z#s#z#D.y#F#F#F#F#F.oaB.8.y.8.y#ubV#0#D#u.r#G.0#G#G#Gbc.1#G#G#G#G#Hbc.1#naz#b.w.1#0#0#P", +".z.zbcbCbcbC.0.0be#b#ba0#H.1.1.w#Dbdbdbn#H#8.z.z#BaL#b.w#sbV#z#s.K.K.K#z.K.K#z.K#R.C.j#RauaubYbt.6#6a6bL#zak#bak#D#D#D.y#u#u#0#0.w#sbV#u#F#Fbl#u.w#0#G#G.1#G.1#G.r#GbV#GbV.1bc#H.w.w.wa0#0bS#G#0", +".w.w.1#G.1#P#G#P.w.1#H.1.1#D#D.1by#0#0#G#P.w.w#b#Hbc#Gay#G.r.1.wbv#F.l#F.laJbvblbA.8.l.8a5#z#zbS.K#4bO.4#TaBaB#Fb4#baz#b#P#zbl.o#F#D#0#G#G#GaU#0.B#u#u#u#G#G#0.1.w.w.w.w#0#G.1.1b4anbraz#8.1#8az", +"b4.1bnbC.1b4.zaz#f#fbr#fb4#8.Van#f#8#8ananbe#G#u.1#G#DbC.1.1.w.1.w.1#G#G#GbS#ubSaiaB.SbXaB#2.4bKbvar.ebF.T#1#j.gah#O##bnbn#D#baY.1#D#DbS#u#D#7#7.o#u#0.wbya0a0#0.wbn#0bSbAbS#z#0#8#8an.z.1bd.1a0", +"#b.1.1bn.1bebran#W.man.manbran.m.m#Bbebe.1#D#D#bbCbCbC#GbC#G.1#G#u.8#ubSbVbS#z#z.w#s#D#ubV.1.w.w#Da7bd#Dbs.5.5#O.Q.Q.K#N.Jbgawax#O.y#z#s#z#z#b#B.zazaz.1#GbC.0bd#7#D#ubSbV#G.wbebr.Vbe#8#D#7#7#G", +"#b#b#b#b.w#b#bbeb4#H.cbebe#bbnbK.e#z#z#sbVbs#D#G#z#z#za5a5#za5a5#sbn#z#z#z.y.8bAbl#F.o.o#u#G#G.r.1bnbn#D#DbV#z.w#T#x.MbGbla5a5.eaB.S.SbT.6.a#2bK.1bn.1bn.1bean#lazazbe.1.R#F.5a#.S.e.ebUbU.W.Wap", +".ybAbAbKbK#DbV.waV#HbebebeaYbnbn#z#FaB#F.y#D#Dbnbe#H.1bn.1#Dbnbn#8#eao#e#8#8#8#8#0#0#0.w#G#G.ray#2.J#2#2.la5#z.w#b.1#u#Gbnbn#D#DbAbA.4.4.8bA#z#z.e.8#T.J#x.l.K#z#D#0.w.w#b.qbraLanbr.Vbr#8bd.b.b", +"#B#B#Bazbrbebebe#8brbrbrbe.zbrbr.mbrb4#H#b#sbVbV#NaW#T#T.J.JbkbkaAbp#Vbpbhbpbpbp.e#zbQ.w.w#s.1.w#H#b.1#G#D#7#7#FbS.8.l.l.8a5#sbybV#G#0.w#0#z#Fa#.4#NbOar#r#r#z#za8.ybS.8.4aB.SbK.cb4anan.mbeanan", +"brbrbebrazbr#f.Vbr#f.manb4bebean.V.V.m.maL.1bA.y.Rbnbnbnbnbn#Hb4#Y.w#saYbQbnbK.RbT.GaM#2.4bVbVbK.8#F#u#z.wbybyby#G#G#zbV#u#F#F.obb#uay#0#0.w.w.w#b#b#sbn#D.X.5.b#z#0#za5bAbA.K#s#TaAbObO#T#T#raN", +"bnbnbnbeanbq#l#Lan.maLbrbebebrbeaVb4b4aVbnbn.wbe#T.4.ybAbK.KbQbQ#D.R#D.1.1#H.1#H#Y#s#zbVbV#z#u.ya5a5ar.l#T.J#vawa7#Hb4be#b.1.0.0#G#ublbv#c#c#2#u#Dbd#D.1.w#Hbean#b.w.wbVbSbVbVbVbVbV#D.1bV.1#ban", +"#Bbebe#abebeaVbnbn#sbn#D#s#a#b.w.q#b.q#Y#Ybe#HbnaY#baY#baVbnaVaV#bbn.w#bbebeaV#H#D.1bebe.w#G.wa0.z.z#HaV#HaYbnaV.ebLa6a6a6bOa5b2.w#b.w#zbU#s#s#zbA.lbv#T#T.l.y#0#8.1#D.1.wazaza0.w#P.wbebe#H#baz", +"az.1bcbc.1.1bCa0#H#8b4b4#H#Hbebr#b#bbn.ybXbK#s.c.ia7bebe#zbV.8a5bnaY.caLaLbe#H#H.kbKbKbK#s#b#b#H#bbV#DbV.wbe.w.1bCbCbn#D#2bg#i#i.J.lbA#s#b#bbQbQ#JbVbVbS#G#u.R.R.SaB#2#2aB#Fbd#H.z.1.wa0#b#Ybe#Y", +"au.S.S#J.k.R.kaY#DbVbV#sbn#s#s#b#Y#Y#Y#Yak.q#Y.N#Y#Y#a.R.y.y.ybV#ebrbq#WaL#B#bbV.i.RbVbn.1#bb4b4#s#D.y#ubV.1#b#H.1.1#bbe#Y#b#s#z#z#z#D#7bs#u.y.lai.5#F#u#0.wbebe.qakbQbQ#baY#b#b.1.1.0#G#D#ubb#F", +".k#s.k.k.K.KbK.KbA.KbK.K#z#s#z.K.5aBbX.4bY#RaHbY.Z.4.e#s#sbnb4#H.q#Y#sai.dbs#8anbeanan#Ybe#H#H#8#b#H.wbV#G#G.0.1.wbV#u#F#7#D.1b4#bbebebeazb4.1bVbebe.w#z#u#FaBai.4#2.4.ebQbQ.w#Y.w#G#GbVay#u#z.w", +"bm#G#Gaybl#ublblbAbA.8bSbAa5bS#F#D.1#zbnbVbK.K.K.K.e.4aB.y#Dbnbea7#8brbq#Y.K.ebU#Hbe#Yanazbeazanazaz#n#n.w.1.1.1.w.w.1#Pa0#b.1.0bV#G.1.1az#b.w#s#sbVbV#ubVbV.1#s#z.yaB#2bG.M#xbgbG.8#z#Yb0#b#s#z", +"bS#GaybS#G.w#b#b#zbV#0bV.w.w#G#G#G#G.1#G#zbV#D#u.y#D#z#s#s.K.8aiar.4.4bV#sbn.cbr#s#u#2.M#x.y#D#b.1#b#b#b#na0a0a0a0.1.0.X#7#u.1a0#z#D#u#F#u#ubVbV#n#n#b#Pby#b#Y#n#bbn#D#DbV.KbV#z.K#1#i.6.6bDbL.Q", +"#Ebi#p.U.Y#Z#C#3bAbAbKbV#s#G#s#0#D#G.w.w#0bc#Gay.1#D#7#F.ya5#s.WaV.cbebn#sbQ#h.T.K.kbQb0aE#YbV.X.y.y.y.ybV.w#b.1#8.1azazaza0a0.wa0.w#0#GbV#z#z#0#F#F#F#F#F#u#ubVbe#b.1aY.wbV.ybAbRbR.Zaq.Z#E.U.U", +".n#Z.p.Las.faQ.fafaf.U.UaPbD.Z#t.4bK#za5#z#G#G#G#G#G.w#G#GbV#u.ybUbQ#z#zbV#JbKbYb.#R.Z#tbA.wbe#n.R#D.y.y.8#Dbn#D#Y.w.wbn.w.waza0.1.1#H#b#P.w#GbV.w#0bV#u#u#u#u#ubv.o#F.y#DbK#z.K#z#4.4.S.TbL#t#t", +"bLaZbD#R#taP.U#Z.hb6as.L#k.pba#ZbD.s.ZbTbG.8bS#Gay.B#G#0#G#D.0#D#s.y.ybVbV.4.ZbL.s.s#R#4#s.w#H.1aY.qbebQ#s#s#sbnar.l.l#u.1#HbC.FbC.1bC.1.1.1.1.1aybVbV.w#s.w#s#0by#za5#u.y.4.l#r.y.8#F.8.K.e.4#T", +"#4#4.S.4#taZ#T#2aZaTbNaQ#daQ.fasaS#QaT.s.4.8ararbl#ubVbV#ubl#F.XbT.G#t.S#tbkbT.T.uaH#OaB#D.1.zaz.z#f.z.zb4.za0.z#Jbn#JbK.ybAbK#s#z#baz.z.z.zaobc.0.1#G.0#G#u#G#G#ubS#0bVa5bS#uaBaB.y.y#u#F#FbA.K", +"#zbK.e.S.8.S.S.T.O#Z.LaQaQaQb5af#..Z#t.4#F.yblblbl#ubVbVbK.S#t.saI#tbwbZaI#t#t.S.n#1.TbF#zbQby.wbebranbraz#b.1.wan#nbe.w#z.y#FaB.8.ybn#Haobcbcbc.1.1.1.1#G#G#G#0#G#0#GbV#ubVbVbV.8bAblbAbSbS.K.K", +"#F.l.8.4bLbRbRbR#Z.L#kafafbN#..Zbg.Jbv.8#u#D.0#7#ubS.y#t.s.Obaas#3baaP.Z.sbD.Z.Z.y#JaY#a#Ybe#b.wb4#b#bbebebebe#bbm.0#u#G.w.w#0bVbGbAbVbV.1.1.w#P.1#Ha0bc.1#Day#D#0.1bS#u#ubV#zbVar.8.l.8a5a5.e#N", +"#T.4.4bObw#.bNad#k.pba#.bR.4bAa5ara5#zbVbV#u.y.4.K#t.gbi#pb5.p#k.ZaP.Z#t.S.y#Dbna7bCb4.zazb4ao.1#b.1.1bVaybV#G.wa0.w#G#z#0#z.K.y.8bV.w.1.1.1bc.1bcbc#Ha0.1.0#G#G#G#G#G#G#GbVbV#ubla8a8blbSa5.8.4", +".e.T#1bw#..paQa.#E#v.Z.8.ebSbSay#FblbA.y.S.T.TaIaDbN#paj.U#v.g#ta6#TbAbSbS#G.1bc#GaU#P.w#0#GbSbS#G#Gay.r#D#G.w#P#D.y.8.4.4.e.e.e#u.1#P.1bc.1.1.1.0#Ha0#Hbc.1.1.way#0.w#0bV#GbV.ybl#F#u#zbVbKbA.y", +".g#.bW.UaOa9#..O.4.8bAbSbS#u.lbv.K.K.S#x#Eb#.v...Yba#..Z#T.4#Fbvbl#ubS#G.0#GbCbc#Pbc#P#P#G.w.w#P#Gbc.w.w.w.w#P.wb0.qbQ.K#r.S.S.S#G.1b4#P#H.1bc.1.1bca0.1#P.w.w.w#G#z#GbVbVbSbSbS#DbV#s.K#4.S.4.4", +"#EaC#i.gbT.4.4bAbAbAbSbAbA.4.ZaPa3.6#6#E#x.4bLbL.4bAbKbAbSbS#ubS#0#P#P.w.w.1.w.1#H.1a7bCbn#H#H#Hbybyby#z#z.8.4.4aM#xaZ#2.8.y#GbV#Gbc.w.1#G.w.1.wbcbC#G#G.1#G#GaybSbSbS.8bla5bA.8#z#z.KbZbRaT.ZaP", +".4#r.K#z#z#G#ubb.8.y.y.y#R.O#Z.tbMbM#5.ebA.R#D#Day.rayaybV#G.wby.1#G.w#G.w.wbV#u.TbObO.Z.Za6bD#ia6bTbDbD#iaP.s#t.K#s.wbya0#P.1bm#G#0#0.BbSayb2#0.1#G#u#GbVay.8.8blbSa5bSa5#za5bAar.Z.gbaa9baba.O", +"b2bS.8#N#T.Ja6bk.M.M.lbS#z#G#z.w#ubV#GbV.1#G#D.ra7bnaV#H#Hbnbn#D.l.4#2.E.6.6bT.T.X.X#u#D.1.1b4be.1#G#G#G.0#Gbcbc.1.1.w.1.w.1#D#G#D.0.0#D#GbVaybS#G.1.1#Dbn#DbnbV.SbA.KbVbK.4aZbD#F#ubVbSaybV.wbn", +"#D.0#Dbn.1#sbQ#s#za5#z.w#zbS.y#ubV.kbVbVbVbVbVbnaW.l.l.4#Narar.8bCbn#HaVbnaVbebea0.w.w.1.1a7#u#7.1#s#H.1.w#Ha0#b#G.w.w.w.1.w#G#G.0#G.1#0.w#0#0.wbS.ebS.e.l.4.JbG.y#u#D.w.w.w#sbQbV#s#0ay#ubV#D#D", +".0bn#Gbn#D.R.R.RbV#G#z#0bV#u#u.y.SaBbYaB#t.4bA.ea5#zb2bSbSbVbV.w.0.0a7#Hb4#Hbn#7a5#z#z.w.wa0a0#bbeaz#b#b#bbn#D.y.1#G#G#G#G#u#G#u.1.1#b.1aybl#Fa8bG#T.8.eby.Wb0bP#G#Gbm#Gbm#G#G#G#sbn.w#z#G#G#zbn", +"#z.w.w#zar.4#T.Jbv#F.ybSbV#ubSbVaY#s#s.Ka5.K#z.Kbl#u#D#G#D.rbd.ra5#0bS.BbVa5#ua8.ybla8#u#0#G#G#G.0#D#G.wbe#B#Ybe#P.w.w.w.1#0#G#G#G.1#P.w.w#0#0.w#baY#s.wbn.0#D#7ay.rbm.r#G#G#G#GbV#0#z#0#G#z.1.w", +".8ara5.Ka5.ear.e.w.w.wa0#bby.w#b#0#0bV#u#F#FbGbv.8.8ay#z#0#0#0#0#z#0a5aya5ayb2#0bV#GbV#D#u#u#D#Ga0a0bc.1bc#G#D#u#Day#D#GbV#G.w#s.w.w.w.w.w#z.w.waBbs.y#D#DbC.1bCbV#G#0.1#0#G#0#zbKbSbSbS#u#ubVbV", +"#Hb4bebeazbeaz#Y#ubV#u#z#u.y.8#F.w.w.w.w#0.w#0#z#G#ubl#F#u#u#u#Fbd#u#D.0#7#7#7#D#u#D#GbV#G.w#bbebc.1#G#G.1.w#P.w#b.wby#s.w.w#s.w#z#z.KbA.4#F#T#2ar.e.ebA.ebAbAbSbQ.w#s.w#z#zbK.4.y.8bSbS#0bSbVbn", +"bn.1a7bnbn#D###u.1#0bn.w#G#z#D#0#0bV.w.w.w#bbe#bb4b4#HbCa7#Dbd.ybs.R#D#u#u#F#7bs#u#u#u.ybA.S.4bLap#b.WbQ#z#s#z#z.8.4.8#2#2bG.MbT.4.SbA.S.4.S.K.Kararar.ea5.ebS.e.8.8.ybS#z#z#s.KbAbla5#0#0.w#s.w", +"#s#z#s#z#z#z#za5#D#D#GbV.wbV#z#0.Ka5bKbAau.R.S.R.lbAa5.e#r#NaAaAa6.ZaW#N#N.e.e.e.BbSa5.earbOa6#Ebi#EbDbDa6#t.4.4.ebA.SbA.e.K.K#zbL.T.KbL#t#TbL.Kbn.1.1.1.w#Hbeb4bV#z#z#G.w#z#z.K#za5#zby#0bVbV#z", +"#u#D#DbV#u#ua8#ubXau.y.y.ybs#DbsbK.SbL#RaIaI.C#3bw#t#R#R.S.S.S.y#t.gaPaP.gaT.Z.ObabaaP.Z.Z.Z.4.l#F#2#2#O.S.ebA.8.S#2aB.y#zbKbS.y#u#D.1.w.1bnbVbn#zbK.y.SbK#4.S#tbSbV#u.8.8#u.8#ubV.y.y.y#ubA#ubV", +".##q#qat.tas.2.2#A#A#AbH.H#C.H#CaMbI#x.GaZ.9bD.G.9bD.GbT#2#2aBaBbK.ybAbKbK.S.S.S#t.Z.Z.4bAbK#zbV#sbV.K.K.K#s.KbV.K.y.SbA.KbK.y.S.4.ybAbK.K.K.K.K.K.K.e.K#4.K#4bLa2#5.D#5a2aIaIa2aIbBbZbwbw.s.OaP", +"ba.O.Obaba#.#.#..A.A#v.Abkbkbk.A.y.8.SbA.e.S.S.4.K.e.e.e.e#z#z#0bS#ubV#zbV.y.ybS#4.SbY.S.y.yaBaB.4#t#t#t#t.S.S.S.e.4.4.S.K.KbL.S#hbF.TbR.gaPbWaP#Z#ZbaaS.p#kb5b5bNa9#..O.O.Oaq.ObaaP.O.O#Zba.Y.Y", +"#D#u#u#uaybSbS#u#s#s#z.w#s#s.1bnbQbQbQbQbQ.Q.K.T#t.4.Z#2#T.4.4.4bAbA.SbA.S.S.K.KbQ.K.K.K#5bLbL.SbO#R.T#5b.#5.K.kb.#5bLbZbZbR.Z.gaP#.aPbNbNbN.O.Hbwbwbwbw#3.O.O.O#2.4.8.8.8.8.ybAbA.e#z#s#z#s#z#s", +"#5.TbLbL.TbLbLbL#m#gae.CaX.Caeae.Z.4#tbLbLbZbR#tbObR#tbR.4.4.4#t.saP.U#E.YaP.U#..UbWbibWbNbNa9#..gbW.Z.sbwaP.G.9aP#E.U#E#EaPaP.U.Y#3bBaIbw.Cb.#w.ybSa5bVbSbV#z.w#z#z#z.K.K.e.ea5bAa5.ea5.ea5a5.e", +".U.Y.YaTaT.Z.O.gbRbRbwbw#tbB.s.ZbTbT.Z#t.4.4.4a6#t.Z#t#t#t#ta6bDaIbZbB.n#m.n#3#3#X#.aq.HbH#..H#m.TbRaIa2.DaI.T#4bwbRbwbwbZb.bob.#4b.buaK#R.s.9#t#3.O.O.Obw.sbw.sbwbwbwbw#tbwbRbB.Z.gaP.gaP.gaP.g", +"aB#FbSbVbV#D#ubVaya8bl.8aybS#u#u#zbVbV#zbV#zbK#u#u#u.y.8.ybA.ybA.4bY.4.4#t#tbDaZ#tbR.4#t.4#t#tbL.K#tbwaI#5aIbLbFaIaIbwbD.U#E.Ubi#EbDbD.ZbT#xbT#xabaRaR#oabat.O#Z.s#t.SbLaI#4aKb.b.b..Kbu.7.Qbub.", +".w#b#b#Y.w#0.1#G#z#G#z#G#b#b#b#s.1#G#G#G.1bc#G#G#G#Day#G#G#G#G#G.w#G#GbV.1#z.w#b.kbnbKbn#s#DbVbV.K#t#iaP.ZbW.g.Z.s.s.gaPaP.Zbw.Za6.Z.Z.8#r#z#ra5#D.r.r.r#Gbcbmbm#G.1.w.wbc.w#G#G#G#G#G#Ga0#P.1.r" +}; + + + +/* XPM */ +static const char *button_xpm[] = { +/* width height num_colors chars_per_pixel */ +" 96 96 254 2", +/* colors */ +".. c #9c3218", +".# c #a4733e", +".a c #bc450a", +".b c #d4700c", +".c c #dc8c29", +".d c #bc5e00", +".e c #d46b37", +".f c #945431", +".g c #bc5a2c", +".h c #8c4e4b", +".i c #d47e16", +".j c #bc7422", +".k c #d47d3a", +".l c #d45e28", +".m c #ec9b3e", +".n c #bc6b43", +".o c #d45a13", +".p c #a45236", +".q c #dc8848", +".r c #e46b1b", +".s c #bc652f", +".t c #a46243", +".u c #bc6920", +".v c #a4391e", +".w c #e47b35", +".x c #9c6b30", +".y c #d46d24", +".z c #ec8a29", +".A c #bc452a", +".B c #e46833", +".C c #bc702e", +".D c #c47845", +".E c #b15314", +".F c #e47e10", +".G c #bc5a18", +".H c #bc6145", +".I c #a44d16", +".J c #cc5728", +".K c #d47439", +".L c #a45b39", +".M c #cc5815", +".N c #dc8f4c", +".O c #b46239", +".P c #bc5307", +".Q c #d4794f", +".R c #d47624", +".S c #cc6c2c", +".T c #cc6941", +".U c #ac5222", +".V c #e49328", +".W c #e4754d", +".X c #d4650b", +".Y c #ac592c", +".Z c #c05e2d", +".0 c #e4751a", +".1 c #e47d29", +".2 c #9c6143", +".3 c #e45f2b", +".4 c #cc632a", +".5 c #cc660d", +".6 c #b44b13", +".7 c #d48442", +".8 c #d66228", +".9 c #bc6221", +"#. c #b45736", +"## c #d47714", +"#a c #dc8936", +"#b c #e48237", +"#c c #cc530c", +"#d c #8c522b", +"#e c #dc8819", +"#f c #ec9129", +"#g c #bc7936", +"#h c #d46f50", +"#i c #bc521d", +"#j c #bc553b", +"#k c #9c523b", +"#l c #f49a45", +"#m c #bc7548", +"#n c #ec8643", +"#o c #a86d3a", +"#p c #a44d21", +"#q c #a4754b", +"#r c #d46547", +"#s c #dc7937", +"#t c #c4642d", +"#u c #dc6c21", +"#v c #bc4d2e", +"#w c #cc7e53", +"#x c #c45917", +"#y c #cc5c42", +"#z c #dc7036", +"#A c #ac5448", +"#B c #ec8f44", +"#C c #b45c4d", +"#D c #dc7622", +"#E c #b45222", +"#F c #d4651b", +"#G c #e47328", +"#H c #e58429", +"#I c #9c5f23", +"#J c #d47f2b", +"#K c #cc7116", +"#L c #eca24e", +"#M c #9c471c", +"#N c #d45b36", +"#O c #c46716", +"#P c #ec7836", +"#Q c #ac642d", +"#R c #c46f2e", +"#S c #c47551", +"#T c #cc5b2b", +"#U c #cc685f", +"#V c #bc4b3a", +"#W c #e49a4b", +"#X c #b44c35", +"#Y c #e48745", +"#Z c #ac613c", +"#0 c #e47234", +"#1 c #c46242", +"#2 c #cc5e1a", +"#3 c #b4683d", +"#4 c #cc7430", +"#5 c #cc7042", +"#6 c #bf4b0d", +"#7 c #dc6e13", +"#8 c #e48c21", +"#9 c #9c3445", +"a. c #8c432b", +"a# c #cc5e04", +"aa c #a43f33", +"ab c #b46d44", +"ac c #9c5e62", +"ad c #9c4833", +"ae c #b4742c", +"af c #a4522b", +"ag c #dc943c", +"ah c #b46000", +"ai c #c46309", +"aj c #a4441e", +"ak c #dc7f4c", +"al c #ac6e27", +"am c #ac4b4e", +"an c #ec9238", +"ao c #e48518", +"ap c #e47c4f", +"aq c #bc5c3e", +"ar c #d56238", +"as c #9c5840", +"at c #ab6946", +"au c #cc761f", +"av c #9c5024", +"aw c #bc4922", +"ax c #bc421d", +"ay c #e46927", +"az c #ec8836", +"aA c #cc513b", +"aB c #cc661d", +"aC c #b44a21", +"aD c #b4544c", +"aE c #ec8a55", +"aF c #9c5a20", +"aG c #94533f", +"aH c #c4701d", +"aI c #c46b42", +"aJ c #dc5a18", +"aK c #cc7b2f", +"aL c #e49046", +"aM c #c4520b", +"aN c #dc774c", +"aO c #ac4631", +"aP c #b45b28", +"aQ c #944e30", +"aR c #ac6e4d", +"aS c #a45f2a", +"aT c #b4612a", +"aU c #ec7032", +"aV c #dc872b", +"aW c #cc5939", +"aX c #b47844", +"aY c #dc843b", +"aZ c #c4601d", +"a0 c #ec7f36", +"a1 c #c47531", +"a2 c #c47344", +"a3 c #ac431d", +"a4 c #ac7439", +"a5 c #dc6735", +"a6 c #c4582a", +"a7 c #dc7c1b", +"a8 c #dc5d26", +"a9 c #ac5036", +"b. c #cc7742", +"b# c #ac4b13", +"ba c #ac5a37", +"bb c #dc5f0c", +"bc c #ec7a29", +"bd c #dc7813", +"be c #e48b37", +"bf c #f48e28", +"bg c #c44e1f", +"bh c #c44e3f", +"bi c #ac4b1e", +"bj c #dc6544", +"bk c #c44c2b", +"bl c #dc611a", +"bm c #ec7125", +"bn c #dc7d29", +"bo c #cc7752", +"bp c #c4473c", +"bq c #ec994b", +"br c #e49336", +"bs c #d46f16", +"bt c #bc600a", +"bu c #d47a46", +"bv c #d45b1e", +"bw c #bc653a", +"bx c #ac3c1d", +"by c #e47943", +"bz c #a46b2e", +"bA c #d46b2e", +"bB c #bc6c3a", +"bC c #e47f1b", +"bD c #bc5b22", +"bE c #bc6052", +"bF c #d47346", +"bG c #cc561f", +"bH c #b46044", +"bI c #bc5312", +"bJ c #d4775e", +"bK c #d4732e", +"bL c #cc6b37", +"bM c #cc644f", +"bN c #ac512d", +"bO c #cc6137", +"bP c #ec8552", +"bQ c #dc7944", +"bR c #c46339", +"bS c #dc6a2c", +"bT c #c45a21", +"bU c #dc6f44", +"bV c #dc732c", +"bW c #b4502c", +"bX c #cc6d1f", +"bY c #c46521", +"bZ c #c46939", +"b0 c #e48653", +"b1 c #ac6445", +"b2 c #e46e43", +"b3 c #c45851", +"b4 c #e48b2b", +"b5 c #9c5430", +"b6 c #944d49", +"b7 c #c46a51", +/* pixels */ +".waB.U#5#Dba.##u#sbn#H.8#z.0#Db2.4#E.g.e#T#F#z#4bL.n#EbSbm.kauaz#Bbnbr#B.y#b#bb4.w.z#D.z#haKaZbr#Ha6bLaubn.w#Yb4.z#0#ba7an#s#Yb4b4.8.wbnaVaOb3aBbS.l.K.4bL.S#i#5#0#u.w.w#u.w.1#D#zaP#AbK.y#.#a#u", +"#b#F.Y.T#u.O#q#D#z.1b4ar.wbn.0bS#raC#..T.4.lbK#4aZ#Zbi#G#G#s.S.1bebnbr#BbA#b.1.1.w.z#Gan#5aK#tbr.1a6#1aua7bS.w#HbCa5#0#DazbK.w#8#H.8#0aVbXbibRbsbA.l.K.e.e.4#x.T#0.8.wbVbVbn#sbVbSaT#AbVbS.gag#G", +"#bbS.YbL#u.O#q#D#sa7bea5.w#G#D.8.K#ibW#1.4.8.e.SbD.p#pay#G.k.Sbcbebnbe#BbA#b.1bn.1bc#Gbe#1aHaZb4#D.Zb.aLan#0#Dbda7bS.ybCbe.y.w#8be#ubSaY.G#X#1.ybA.8#z.K.ebL.ZbL#0#u.w#GbV.w.1bnbA.u#C#z.y#.aL#G", +"#YbVaTbL#ubaatbV#zbnbe.K#zbnbn#N#z.g.UbwbO.4.S.4#R.L.UbSay.k#Jbc#abebrazbK#bbnbC#GbC#ub4#X.u.Z#HaY.eaI#Wbr.w.1#H#HbV.8b4anbS#s#H#b#GbVbe.6bw.4.ya5.y.ebS.e.e#t#t#G#u#zbVbV.w#s.w.e.u#CbKbS#.br#P", +".wbVaT.Tayba.t#u#zbnaza5ar#D.1#T#zbTaO#.bwbL.8#t#tas.Y#Gbl.K.k.1beanazbrbK.w.1.1.1bc#0be#j.C.4b4.ybO.g#Wana0aya7az.w#2az#B#z.w#HaY.wbVaNa3.s.4bA.e.8#F.8#z.ebLbD#0#u.w#GbV#b.1#s#z.s#AbAbV#jag#G", +"#0#D.ZbLbS#.as#u#z#Dbe.e.4.R#s.J#G.4a9.p#.bR.SaZaP.f#Z.w#u.K.R.1bebqbrbe#D#bbeb4#PbC#z#aaO.CbL.1bV.T.Ibr#8a0.w#Han#Y#2anan#z#0bC#s#H#DaraC.s.4.lbAbA.lblbS.e.K#i#ubV.w#s#GbQbV.wa5.CaD.ybV#.#a#G", +".1#u.ObLbS#..2a8#z##azar#T.RbQa6#u.4#.aQbNbR.S#T.UaQ#C#bblbK.kbCaV#l#fbebV#bbr.z#G.0bSaYaa.sbO#D.S.Q.U#Laz#n.w.1b4#B#2anbebS#zbC.KaV#Dbpb3bYbX.l.8bAbvblbS.e.k.g#u#G.w#GbVbVbS#s.e.C#CbKbV#X#a#G", +"#GbV.gbL#u#..2#ua5#u#Y.e.J.R#sbkbbbA.Oa.adbR.T#2#Z.f#3#bbl.KaYa0bn#L.Vbe.wbeanaz#P.0bS#aaabw.e.0aBaNaP#W#8a0#G.0#8aE#2an#HbS#0.1.S.1.1.A#U.S.Rar.4a5#FbSblbAbQ.ZblbV.w#0#DbV.ybV.8.CbE#zbVbW#a.1", +"#zaybR#m#s.A#AbX#D.1#u.wbvbV#z.M.8bA.4#E#k#Z.OaZ.hafbA#zbAbA#D#Hbnanbr#8aVb4#W#f.wbebVak#M.ObL.R.Ya2.Gbe.1aza7a7#Y.1#F#B.y.k#Db4.y#saY.P.ybX.K.4.8bS#zbS#u.8bA.SbDby#G.1#s.4.KbAbV.SatbVbl#Z#D#G", +"#Ga8bR#g#s.A#Aau#D#0bV.w#F#Ga5.M.ybA.8#v.p.L#ZaTb6afbAbVbA.KbV#8#s.m#fbr#H#H.m#f.1#bbV.k#p.ObR.y.Oa2aZ#n#baz#H#H.w#0#uaL#O.k#D#b#F.w#b#2#zbK.KaB.ybS#GbS#DbSbVbAbT.wbV#G#s.4#zbS.KbAat#z#u#obV#G", +"#zblbwae#z#v#A.y#Gbn#u.w.y#z#z.l.ybSbA.Zba#k.LbNas.UbK#0.8bKbVb4bnaL.mbrbe.canbr#H#bbA#4af.O.S.y.OaI#tbea0#b#H#b.y.w#G#b#x.KbV.w.y#s.w#F#s#zbVaBbS#ubS#GbSbSbK#z.4bQ.r.1bn.y#sbSbV.SaR#0#u.Obn.1", +"#G.8bw.C.w.AbH.ybV.w#za0bS#0.wbS.ybAbS.8#.afaQaQ.L.UbVbVbS.K#sb4#Dbranbrbebe.m#f.1a0bAbL.Y.O.T#F#.aT.4.w#b#H.w.w.8bS.w#Y#x.SbV.1bS#0#z.y#0#z.y.8#zbS#ubV#GbS#ubA#4.w.0.1#bbKbVbV.y.4b1bS#u.O#G.1", +"#bay#taX#sbk.H.y.w#G#u#bbVbV#z#z#RbAbS.ebRafaQ#d#kaP#s.wbA#zbn#H#sbeb4bebebeanb4.1#HbV#tba.YbL.y#X.U.S.wbc.1#GbV#zay#0by.y.SbV#PbS#zbS#u#z.wbl.y#GbS#u#G#GbV.ybK#z#b.0.1.wbnbV#DbA.Sb1#0bS#3#0.1", +"#bbSbB.C#sbk#CbsbV#z.yby#u#ubS#G.O.4#ubS.4bNaQaQ.pbD#G.wa5#s#s#H#abebe.zaY#bbr#8#D.1#z.Gba.U.TaB.Ob#bK.wbe#G#G#s.w#u#G#bbKbAbV#G.RbV#F#s.w.w#F#F.w#0#G#0#0aybSbSbQ.w#G#G.wbVbA#GbKbAab#0ay.n.1.w", +"#b#u.sae.1bk.H#D#z#D.8.wbS#u.y#z#Z.Z.lbSbA#.b5.fba.Z#s#GbS#z#sbe#bbrbebrbnbnan.V#D.1#z.G.nba#4bvbB.6#s.1az.0#G.w#Gay#P#GbKbK#b#G#z.waB.w.w.w#F#u#0.w.w#G#G#0bVbS.ebV#G#G.1#z.8bS#z.8b1#0bS.n#0#G", +"#s#u.Zaebn.A#Cbs#0#0#F#bbV.y#u.w.taPbvaya5.Zafas#Z#t#0#G#F.K#bbr.wbeanbrbnbK.man.1.w#s#i#S.ObuaBaI.EbQa7a0.0#G#0#D#Gaz#u.Rbnan.0bebQaB#s#sa0#F.wbS#G#G#G#G#G#zbA.ebl#G.0bV#z#F#0bK.8.tayay.H#D.r", +".1#zbT.ZbQ.yaMbK.K#0.w#0aY.SbV#ubMa3.K#Farbg#.aSbD.4#D#G#D.5#Y#b.qaV.V.m#z.e.m#fby#D#J#1.H.uaK.ZbRbIbe.1a0.w#D#D#Gbdb4b0.J.wa7ak#H#n#xb4#H#z#zbnay#G#u#G.1.1#G#u#s#Tbd#0b2#GbA.1.8#r#Ia5#sala5#D", +"#GbVbT.4bQ.8bI.Sa5bV.w#0#saB.kbVbM.6.Kbla5.J.Z#Q.sbK#G#G.1aB#Y#b#bb4.Vbr#F#z#B#8#0bdbK#j#.aP.S.g.TaZ#B#H.w#P.w#D#0.Fb4aNbv.1#DbV#Ha0.Mb4#H#za5#D#0#G#G.0.1.1.w#D#s#Ta7#0b2#D.8#H.y#r.fbA#zal#z.1", +"#GbV.Z#tbQ.S#xbLbK.w.wbV#sbYbV#G#5#6.SbA#zbv#taT.Z#z.w.1#zbX#Ybn.qb4.mb4aB#zbe#8#0bd.R#j#.bt#R.g#1aZbe.1#G.wbV#D#PbCbe.ear#D.1bX.1by.l.1.1a5a5#Dbm#G#G.1.1a0.w#G#s.la7.wa5#Dar#HbVbF#I.4a5ala5.1", +"#G#z#tbLbQbA.G#RbA.w.w#u.KaBbVbV.e#E#x.ybV.8.4.sbTa5.w#Gbn.4#Y.y#YaV.m#H#F#sbean#Gbn#s.gaDaT#R.g#t.4#b.0#G#G#G#D#0bCb4#x.e#G.1aB#G#0.8.1.1bS.B#G#G#G#G.1.1.1#G#u#z.e#H.w#z#D.8#H#z#haS.4#zal.4.1", +".1bV.4bLbQ.eaZaIau.w#0#Fa5#tbV.1bA#x#E.SbV#u#F.4bG#z#0#zbVbYakbX#YbnaL#b.ybV.1an#P#H#saqaq.u#4#j#1.S.1#u.1#0.1#G#0#Hbn#ibjbV#b#2bca5a5.1.0.l#z.0#G.1.1bcbc#b#D#u.war#8by#z#u.e#b.y.Tbz.4#za4.J#D", +"bc#z.4bZ.Q.S.9aI.R#b.w#F.K.4bV#G.R.4b#.T#u#D.y.8.8#GbcbVbK#R.qbKbebn.1#s#Dbs#Dbe.w#8aY#jaq.s.SaO.Z.S#D#7bm#G.w#u#0.zbn#xa5#G.1#2#bbSby.1#G.l#0.0.0bca0az#Ha0#G#u#0.B#8.w.K#D#r.1#FbO.x#T#zaX.J#D", +"#GbK.4bR.K.SbD.C.Sbe#0bG#zbAbV#D#DbL.v.T.y.0blarbS#G#G#D.KaH#Y#s#H.wbAbV#D#D#D#G.w.zaV#.aq.sbwax.gbA#D#7#G#u#G#u#uan##aW#NbV#D.4#bbvap#H#H.8#sa7.1.1bc#Ha0#H#0#D#0a5#8bQ#z.y.ebn.y.T.##x.KaXbkbV", +"#G#ua6#t.T.4.G#3.R#b#zbv.K.ebn.r#DbL..aI.4#7blar#G#Gay#u.KbY.N.cbnbe.ybVbn#G#b#u#b.zaYbW.H#R#tbx.Z.k.w.r#0ay.1#GaJaz.5bO#T.w#DbAbnbg#b#Hb4bVby.F.0bC.1.1.1#b#GbVaU.8#HbnbA.R#N.1#s#h.#bgbAa4#vbV", +"#G#u#tbO#t.K.9bw.lb4#G.8bla5aWa7ay.4.YaD.K#ublblay#G.1.y.K.Z#Y.iaY#T.R#Nbe#zbC.1#H#Bb..ZaPb.#3aFaPak#G.0.1#D#D#G#D#b#xbAbv#G#ubA.w.Mbn#nbVbS.1bdbcbm#P#G#Gbc.1#G#D.w#u.w.w#2bK#4bK.K#vbw.Q#tbt.K", +"#D#u.ZbR.4.ebD#tbAb4#u.8#u#z.lbn.rbAbabN#tbS#u#u.B#G#D#D.e.4#Ya7#b.4bnaW#H#zbC#GbcaL#4aTbW#4aTaS.UbQ#D#u#z#D#D#G#u#baBa5bS#G#u.K#b#F.1bebVbV#GbC#H.1#P.1.1#H#GbVbS#G#u.w#saBbA.SbAbF.gaqb..u.G.K", +"ay.y#t#t.Z.e.G#Ra5#Hblay#Db2.laVaybK#.#p.g.ybVbV#G.w#7#z.4.e#abeaY.ybn#T.1#zbC#D#G#b.S#t#x#5.Z.Y.U.kbSbl#GbA#u#G#u#b.4.e#z#G#FbAby.ybeaz#ubS.1bc.z.1#P.w.1bc#DaybV#G#F#G.w#2.S#t.R.e.g.OaI.9#x.K", +"#G.8#tbR#2.ebT#R.ebC#F#z#GbS.4#HaybA.Zajbi#tbVbV#0#G#F#saB#s.Rbe#bbAbn#Tbna5#GbCay.wbLbR.ZbL.Z.O#E.Kbl#ubVbKbSbVbl.w.4.8#0#ua#bVbQ#ube#b#u#G.1.1bf.0.w#Pa0#H.1#GbV#G#u.w#s.M.S#tbn.e#1.gbZ#R.9.K", +"#G.y#t.4#T.e#2.S#ra7#u#0#DbS#N#HbVbS#T.U#p.sbK#u#G#G.y#s.y#s.y#zaVbKbn.J.1a5bC.1#G#s.4bO.4bLbD.sbWbF.8ay#z#zbA#u#D#z.4.4#0#u.o#s.4bSbe#H#u#G.1.1.z#D#G.w#ba0.1#0#D.w#D.wbV#x.S.S#s.SbR.ObZ#5bYbO", +"#GbA#t.4.4#z#2.S#N#D#u#0.rbVarbn#GbS.4#vb5.O.Sbl#DbVa5.K#Dbn.ybVbn.Kbn.J#D#z#G.1.rbV.ZbR.Z#T#i.s.g.ebl#G#0.K#u.8#0bA.e#2.1#u.y#b#xbAbebn#D#Gbm.0beblbV.w.1bc.1#G#D.1#Ga0#s.M.S.Tbn.S.T#jbBbu.4.Z", +"#G.ya6.4.4#zaB.SaAbd#u#0bdbVarbn.w#u#F.g.pba#t#F.0#u#s.8bnb4.y.8aVbQ#Hbkbna5.1.w.1#z#tbL.4.Z.E#t.gbA#uay#sbS.K.y.w#2#z.4#0bl#D#Ybg#zbebC.0.w#G.1.1bvar#z#u.1.1#G#D.1bV#b#z#2bLbL#b.S#5#..g.k#t.Z", +"#GbAbD#t.4#0aB.yaA.y#F#0.r.w.8#DbybSbv#t#kas.s.X#D.y.Waibe#HbVa5aVbQb4bkbna5#G.1.w#s#tb.bR.4#ia2.g.y#F#u#GbKbV#ub2#c.K.4bV#7#DaYa6.kaza7#D#P.1bc#z#Tar.8#F.0.1.r#G.1#u#P#s#2bL.S#b.S#haP.U#5bY#T", +".w.4aI.sbAbSbK#ta6bsbd#za5.0bC.l.1#0bla6.Z#3aIbT#sbUaVara7.q#ebn#b#D#YaA#8#s#u.wbv.K.L#u#R.4#Z#F#T.e.8#z.e.l#sbs.w.P.e.w#G.r.r.1#T.wa7.z.1bea0.F.K#D.RbK.e#zbV#D.w.1#G#u.w#zaB.K#Y#ubOaC.gbobwaP", +"#GbYbZaPbA#u.y.g.Z.R#u#0#0.0bn.4#G#P#u#TaPba#t.G.ybQ.c.4#8#YbraYbn.R.wbp#ebn.8.1#F.K.L.rbL#t#Zbl#T.eaB#z#z.4#G#7.1#6.S.w#u#G.rbV.l.w.0be.1.wa0#8bV.R#J.K.4.8bV#G#G#G#G#G#b#saB.K.w.ybOaCaPb7.s.G", +"#G.4bB.U.SbVbAaPaW#D#Da5bSa7#H#2.w#PbSbA.ZaPbw#t.y#zbe.4br#sbq.c.w#D#s#Vao#z#u#G.l.KaS.rb..4afa5.4bS#Fa5#zbv#u#G#0#6bAbQ#u#G.w.8#z.wbd.z.1#b#H#HbS.y#HbQ#T#T#zbn#G#G.w#G.w.waB.K#s.8.T#v#.aIaPaT", +"bV.4.n#EbA#zbKaP#N#u.0ay.B#HaV.E#G.w#GbS#t.ZbZ.SbV#zbnbVbqai#WaL#b.1aYbp#e#zbS#G#F#z.L.rb..4afbS.lbS#F#u#z.8#u.1#0.M.8#z.o#0#baZa5.w#u.1#D#b#H.1bAbVaYbQ.8.J.y.w.w.w.1#0.w#s#2.SbVbA.K.gaPaIaP.Z", +".1#t#m.Y.SbVbK.g#N#u#7a5bVb4bn.6.w.w.0bS.S.saI#tbVbV#s#s#Y.daLaLbe.1bQbh#8#zbV#G.l.Kba.r.k#tbNay.l#u#F#ua5#F#u.1.w#2bAbS#F#z#Y.GbVa0#u#D#7az#b.y.ybe.1bVby.laB#b#P.1.w#G#GbVaB.S.y.e.K.g#..n.U.O", +"#z#t.naP.S.y.SaT.e#F#7aya5#HaV.6.w.1#G#G.ybD#tbk.4#JbQbn.Kbs#Bbebe#Hbnbp#8.ybSbSaJ.K.O.r#4.4#Z#u.8.8#ubS.8.lbVbn#z.e.ebSbbay#bbY#Ga0bS#D#Dbr#bbG#D#n.1#u#b.eaM#b.w#G#G#GbV#s.SbK.4.4#5aPaPbwb#.O", +".wbD#3.U.K.y.S.Z.e#7#7b2#ubnbebTbV.wbC.1#D.Z#tbT.ZbK#h.c.e#8#b#HaV.1bKbp#8.8#z#ubv#z.nbm#R.y.na8bS#FbV#zbG.ebn#D.4.KbKbV#7ay#baB#G.wbS.w#Hb4#s.4#Daz.1#D#nbV.M#H.w#G.w#G.w.wbK.e.lbA.KaPaPbwaf.O", +"#baZ#3#..KbS.S.O.ebs#D#0a8#7be.T#u.1bcbcbn.Z.S.TbLbY.TbrbUanbV#H#H#H.Rbp#8bA#zbSbl.K#mbm.4.ea2bl.ebG.wa5bg.S#s.y.G.k.KbVbm.0.w.Sbc.w.B#Bb4#H.y.e.1an#H.1a0bV.5aY.w.wa0.w.w#sbA.SbA.ebu.Z.O#m.Y.H", +".k#t#X.UbQ#4#tba.B#u#ubV.ya5a0.X.T#H#P#Ga7.y.n.u.sb..K#s#Hbe.i.k#D#YbT.e#0bl.waibA#RbQ#z#RbK.3.y#F#r.y#DaA#u.z#x#v#K#z.w#F#Y.g.R.w#HbCazbCbea#bnbean#H#0a0#G.y.1#G#PbV#b.X.1bV#t.y.KbL#R.9#5.s.9", +"bnbR#.bW.K.S.ZbabS#u#D#Gbl#z.w.XbO.1bcaUbC#J#1aH.s#R.k#ubean.RbK.1#s.G#z#0#F#saB.8.C#za5aHbAay.y.8#rbS#ubvbAb4bXbhaBbV#z#7.wbkaV#b.w#D.zbcbe.X#sbean#b#G#b#G.ybVbm.w#Daz#D.wbV.4.y#z.4#RaPaI.saP", +"bK.4aqbi.KbY.ZaPa5#u#GbVa8#z.w#ubOa7#P#Pb4aY.T#O#R.ZbQ#2#YanbVbKbe#zaMbQ#0.o#D.S.l.j.Kbv.ubV.B.R#F#rbS#u#TbAb4bAbR.X.y#z#ua5bg#a#b#H.0#H.1be.y#sbebe.1#G.w#G.ybVbm#G#D#Ya0.wbV#t.ybQ.4#t.ga2.Z.Z", +"bn#t.HbW.K.S.4.Z.e.ybV#D#u.w.1#D.ZbC#P.w.z#abFaB#4#tb0.Man#YbnbKbebV#2.w.w.o#ubX.8#R#z.l.u.K.BbK.l.e#u.8.l.R#sbAbObs#ubS#DbS#Tbe.wbV#D.w.w.1.y#b#Haz.1#G.w.w#u.ybm.1bVaza0#b#s#tbA#s#t#t.s#5.saP", +"#s.4bHbN#5.ybA.ZarbA#G#u#0.w.1.1.Zbn#G#0az#Y#z#D#sbAaE#xazbe.1#s.wbV.4.w#G#ubVaBa5aubQa5.ubAay#J.8#F.8.8#FbKbObY#rbnbV.J#D#zarbnbV#D#G#P#b#ubVaYbe#bbc#G.w.wbV#uay.w.w.1#G.w.wbD#T.K.4#t.O#5aPaP", +"#D#t#.bNbL.ybK.ZbO.S.w#u#Ga0a7.1a6#H.w#Gb4bebQ.1.w.w#Y.ybe#H#b#b#G#zbV#s#G#G.1#2#zau#0a5.jbA.B.Kar.y.8.8#D.K.gbtar.1bVbGbnbS#z.1#D#u.w.w#b#Fbn#saz#b.1#G.w.w.w.y#u#P#b.0.1.1#YaP.M.K.Z.Z.ZaI#EaP", +"bV#t.Ha9bLaB#z.4a6.4#b#D#Ga0#ub4bD#H.wbSao#bby.z#HbebV#Daz#Hb4#b.w#ubV.1.r#G.w.4#zbY.ea5a1bA.8bKarbsa5.8a7.K#V.Z#N.1bVbG#b.8a5#8.1#G.w.w#n.5.waYazbc#P.1#P.w#P#F#G.waz#Dbc#Gbeb#bGbU#t.saPb7.gbZ", +"bVbL#m#..SaBbV.l#EbLbe#G#G#b#7be#i#H#PbS.1.w.waz.1#n.X#ban#8b4#Ha0.ybK.way.r.wbKbSbt#2a5aK.Ka8bKarbd#z#ra7#s#X#R.l#7bV.lbe.Ma5azbe.1.1.w#n.X#baVaz#H.1#P#0#P.w#F.w#0.w.0az#GbQb#.4bQbL.Z.Z#5bwbo", +".K.K.T.gbO.4#s#Fbiapbca0.0be.1.1a6by#G#G#bb4be.zaY.R.y.1az#b#s#b.za5.8#H#2.1#Dbv.K.6bQ.K#F.Kbn.SblbV.k.4bQ.4.MbX#4#Har#D#s.4###bby.1anbebe#Fbe#baz.w.w.1bV.w.wbvaz#D#G#G#G#s.K.UbO.y.e#O#C.D.U.i", +"#t#tbRbW#R#tbV#2#E#b.1a0#Daz#s#GbTbybc#G.1#bbr#f.q#D.y#baz#H#DbV.za5#F#b.Jbna7ar#4#6.K.4.SbV.y#FbS#z.KbYbybAaBbKbLbn.8#G#s.Z##.w.w.1azbe.1.ybe.waza0#b.1bV#b.w.o#b#D#G#G#G#zbA#EbO.R#r#OaDbB.U.k", +"#ibwaI.Z.T#t.K#2bD.W#Gbc#G#b#H#GbDby.way.1#ban.zbe.y.y#b#n.w.y#D#Har#u.1#2bnbd.ebOa6.K#x.4bA.4.ya5bV.KaZbQa5.y#s.Sa7arbV#s#x.5.wbV#bb4an#u#saY#sbe.1#bbe.1#n#b.M.wbV#G#GbSbV.e.9.4.y.K.5#AbB.U#J", +"aPaIa2.s#5#t.K#ObDbQ#G.1.w#b.1#GbD#z.w.rbVbebr.zbQ.y.y#b#nbV#ubVaV.l#z#G#2#D#DbF.4bL.Kbg.Ka5.4.8#0.ybK.G#z#zaB.k.4#Da8.1bnbk.b#bbV.wbebr.y#Y#s#JbV#sazaz.1#b.1#2.w.w#G#G#GbV.K.S.S.y.KaHam#3aO.k", +".Z#5.Dbwb.#t.K.Sa6#z.1bcbe#b.w.0#i#z.w#Daybeazb4#s.8bV#n.w#GbV.w#H#T.w#D.l#Dbs.T#T#z#z#x#z#z.4.8bSaB.K.G.e#zaB.R.4#Dar.w.wa6.R#b#z.1bebeaB.NbA.S.SbVbebe#G.1.1#2#G.w#0bVbVbVbV.ebLaB.e#KambwbW#J", +"bWaIaIaP#5.S#s.e#t#s.w#G#Bbn#H#GaP.8.w#GbVbe#b.z#s#D.wa0.1#G.1beaY.Jby#7a5bV.5#1aBak#sbgbQ#z.8bA.BaBbQaZ#z#z#2.S.4#Da8.1#z#Ta7a0#s.1bebnbXaNbRaZ.4.S.w.1#G.1.w#2a5#0.Bbl#ubS.ybVbO#O.ebYambwbWbK", +".gbL.T.G.K.S.KbA.4#z#P#D#Y#Da0bc.s.4#P.w#Gbe.1a0#sbn#ba0.1.0#b.wbn#vby#7#z#z.5#jaB#b#z.M#z#z.8#FbS#2aYaZ.e#zaZ.R.4#Da5#GbVbO.1by.w#Dbr.R.S.QbZbD#1.S#z#G#u.w.waBbl#0bS.8bVbVblbSaq#x.T.Sam.CbWbn", +".ZbF#4.9.k.SbV.8.4#z.w#ube.y#bbc#t.4.w#P.w#b.w.zbn#D.1a0.1.1#H.1aVawby#F.w.w#O.g#Fak#DaMbV.ybA.l#u#2akaZbA#z#2bAbL.0ar#GbVbObn.w#Y#D#BbX.k.Qa2.sbM#tbA#u#G#nbybG#u#0a5bl#0bV.y#G#.bT#r#4#X.OaPbn", +".saIbwaPb..e.K.S.e.8#b#D#P.1#G.1.KaMb0#Da0bman#Jar#Y#8a0.w.w.1bC.ea7#GbS#b#T.Qahb4#D.y#2bS#zbl.ybV#Mbu#tbl#w.yblay#0.R#Hbk#D#H.1#bbV.V.4b4.TaubRbZ#t#t#z.1.1#b.9ar.w#ubv#zbdbs.K.O#t.KbD#3#ob##b", +".saIbR#E#5.4.y#2bA.4.way.w#G.w.1#s#x.q.y.w.0#nbn.l.w.1.1.wbV.1bCbL#H#G.8.1#x.Q#O#b#D#F.8bS#z.y.y#uav.K.Sbl#m.y#F#D#zbV#8bp.RaV#Hbeak.cbQ.c.T.S#tbR.s#tbK#G.1.w#OaW#b#ua8#0#ubs.K.Y.4#z.G#Zabb##s", +".gbwbw.UbL.4.SaB.S.8by#D.w#G.w.w.waZbQ.8#G#ube#J.l.waz.0.1#u#bbna6b4#z.l#u.M.K##az#D#FbVbSbS.y.8#uaS.SbLay#3.R.o#ubV#z#8bpbn#HazaYaL#Db0b4bu.R.S.Z.Z.Z.K#G.1#baB#i#b#D.8#0bdbs#rafbL.K#x.Oab.EbV", +"aPbDbw#EbZ.SbA.ybA#2#s#G.w#G.w.1by#2.K.4#z#G.wbK#ubnaz.X#P#Fbe#Da6bebV.l#GbG#Nbn#b.y#F#s.y.8bK.8bl#Z.4bF.0ba.K.oaybVbV#8bp#s#Hbe#JaL#OaLaY.w#s#z.Z.s.Z.4#u#G.w.y#iaV.1.Ba5.r#D.l#pbL#zaZaP.n#tbV", +"aP.UbZ#EbZ.K.K#z.e#2.wbV.1#G.1.wa0.8#r.4#0.w#z.y.1.waz#7a0#7#Y#2a6#b#u.8bnbl.Jbn#P#u#F.wbSaBbS.4#u.O.4b.ay.pbQ#F.1#ubAaobh#bbnbe#saLai#BbA#s#z#u.Zbw.ZbObS#G#b#D#iaV.1#z#0#D#u#y#pbL#saZaPaI.K#G", +".Z#Eb.aPbR.KbKbK.KbG.w#G#0#u.w.1#P.y.S.e#z.w.ybA#H.wa0#u#b#D#bbgbO.1#Fa5bna5bg#D#z#u#F#s#D#2.e.4bl.O.4#5.r.p.Kbv#H#F.ya7bhbe#D.1#Ybq.SaY#Tbn.ybs#taI.g.Z.8#D.w.1a6bnbn.B#0#D#D#T.I.4bV#2aP.C.K#G", +"bw.UboaP.ZbL.ybS.K.M#s.w#G#G#G#D.1#G.S.e.K#0#FbKbCaza0.1.1.1#s#ia5.0#F#s#Da5aw#bbl#0.obVbV.M.e.4bl.O.SbOaJ.LbQ.ya0#F#D#8bhbe#D#sbe#B#sa7.4.1.e#F#taI#.#j.l#u.1.1.4.1.0a5b2#D#u.Z.UbLbS.SaP#t#z.r", +".Zbib..U.g.S.S.y#zbT.w#s#G#u#G#GbmbV.S.e.ybVaB#s.Fa0.wa0.0b4#z#ib2.0.oby#D.eaxaY.o#0aB#ubV#2.8.4blaP.e.Z.o.Lbubl.wbl#s#8bhbe.y#b.1.V.W.b#rbe#z.RbYaI#.#v#Tbl.1.1.e#G#7#0#0#D.R.Z.U.S#zbV.s#R#s.r", +"a6#E#4.YaP#h.4#ubL.4#z.w#G.1.0#D#G#G#G#u.8bG.8#zbC.1a0#zbV#b#z.J.w#GbbbVbAaB#O.1#F.w.8bSay.o#FaP#5a6.4#tbR.Z#zbV.1bdbS#DaAbVbQ#e#BaBaEbA.4#sbs#Dbl#tb1#A.Zbl#u.wbV.y#zay.0.1.y#2aT.4bVbVaZ.9#say", +".ZbDb.#3#.bF.y#D.T.S#z.w.1.1#G.0#0bc.1.1bVbA.y#b.1.1.w#D#Gbe#z.l#b#u#u#GbA.S.y#D#D#s.y#zay#F.KbtbZ#i.8.Z.saZbA#u.wbCa5#DaA.RbQbn#B.X#Y.4.KbV#u#D.o#tba#k.g#2#u#sbn.y#0#G.rbC#DaB.Z.S#u#sbY#t#s.r", +".ZbDbubBaP.TbA.1.KbA.K.w#P#b.1.0#0.wb4#P.wbVbnazbC#H#0#u.1be#DbA.wblay#0.4.S#z#D#0bV.8.1ay#u#saP.g#i.4.Z#tbDbK#7.1bCa5bnaW.R#zbn#BaB#Y#x.KbVbn.0#u.4#.a9#i.4#u.1bQ#FbS#G.0.1#D.S.O.4#u.w#tbYbQ.0", +".8.ZaKaIbNbRbK.wbL.SbA.w.w.1#0#D.B.1#P.1.1bV#H.z.1#b#G#F.1be#7#s#zbv#0.w.4bT#sbS#G#u.y#zblbl#saPaP.Z.e#tbR#t#s#G.w.1bV.1aW.y.Kbnbr.y#YaM#s.y.1#GbSbA.Z.YbW.4bV.w#b#FbS#z.0.1bV.y.O#TbVbV#t#t#s#G", +"#rbT#RbwbN.g.K.1#t.4.4.w.way.w#GbS#G#Hbc.1.1ao.z.1#PbV#uazazbs#bbU#c#0#0.8.6#z#u#G#F#u#Gbb#F.k#E#.bRbF.Z#t#R#b.1#GbC#zbn#N.R.eaV#sbKaYaZ#s.y.1#G#G.l.ZbW.U.gbA#G.w#2bS#G#u.1bVbSaq.Zbl#z#tbY#s.0", +"#z#x.s.CbNaP.Kbn#T.S#F#z#0bl#0bVay.w.1.1.1.1bc.z.1.w#z#u#bb4#u#b#s#c.w#zbA.a#z#D#G#FbV#Gbl#u.K.YbaaI.K#i.s.Sbe.z#s#GbSbC#r#D.KaV.RbQ.k.y#s.y.1#Gaybl.l.ZbN.ZbK#G.w.oa5#z#u.1#s#u.Oa6#FbSbY.Zbn#G", +"#rbT.9b..ObW.KbVbL.K#T.w#0#F#0ayb2.1bc.1bc.wbcao.1#G#zbV.w.1.ybQ#s#2.w#F#z#2#b#7aUbl#0.1#u#GbLaPbN.Hb.aC.saK#Y.z#0.1bV.1#r#D.eaYbAaLaBbK#Dbn#G#G#0#ubSbLa9#Z#z#G#Gbv#z#z#F#D#0.8.H.Z.8bA#tbY#s.1", +"a5#x#t#w.HaP.Kbn.K.K#2.w.wa8.wbS#0.w.1.1.1#Pbcbc.1bV#0bV#sbV.lbQ#z#u.wa##zbK#B#7#0#u#D#G#G.wbObN.p.n#h.E#taKbe.z.w.1bSbCbFbV.ebn.KaL#x.k.y#b#D.0#ubl#u.4#pbN.S.rbV#F#z#z.o.1.w#F.H.J.la5bY.s#sbc", +"#Dab#3.ybw#Z.K#zbnararaB#bbGbS#G.1bc.1.0bc.1.1.0ay.w#F#n#sbeai#JbA#D#b.4.e.1.z.o.B.w#u.1#DbQbLaPb#.Z.g.ZbDaka0.w#GbV#G#bbsbea7bnbK.q#4bA#G#G.0#Dar.3.y.R.U#9.Tbd#uay#r#z.MbVbe#Kb1bD#2.e#t#tbn.r", +".raR.ObSbw#Z.KbK.1ar.ebsaY#T.e.1#GbCbc#Hbc#H.1.1bV#0#F#nbVbe.5bV.lbd#b#N.8bnaz#u#u#0.r.1#ubK#t.Z#EaIbR#1aZapbe.1.1#u#D.w.ybebnb4bn.q.S.4ay#G#D.Rbla5#u.RaP#9.Tbd.r#z.ebU.M#Gbeaub1.g.4.K#t#t#s.0", +".raR.Oa5bwba.e.y.1ar.e.y#s.8bS.1#u#Ga0a0#Ha0.1#GbVbV#F#bbV.w#FbVbv#D#sbO#T.1az#0#u#G#G.1#ubK.Z.s#EaI#t.ga6#Y#b#G.1#DbV#DbK#BaVbeaVaY.S.4bV#G#D.y.la5#u.i.9aabOa7.r#G.e#z.M#0#b.y#Z.Z.8bQbL#t.w.0", +".r#o.ObVbwaS.K.S.1.ebA#D.w.e.e#D#G#G.1#Ha0bc.1.0.w#u#F#P#u#z#ubS#T.1bnar.Jbn.1.w#u#G.0.1#Dbn.9bw#E.Taq.gbT#bbn#uan#G#b#Dbnbqa7be.w#a.4#F.w#G.RaBaB.ebSbn.S#X.Zbd#GbV.4#z#F#0#b.S#Z.gbAbQbZ#R#sbc", +"#GabbwbS#3.p#4bK.wa5.e#Dbnby.lbnbV.1#Pbc.1.1#G#G#s#u#FbybV#u#0#G#T.w#D#r#x.1#Gby#G.1#G.1.1bQ.Gbw.Z#5.Za6.Zak.w#D#B#H#b.y#baLbn#a#b#baB.8.w#0bAbD#t.4bS#D.y.g#vbn#GbV.4#z#u#GbQ.y.L.ZbAbU.S.s.w.0", +"bcat.sbV.O#k.K#4#H.ebAbC.0.W.4#Day#G.w.1.0#D#G#u.w#u#u#bbV#F.w#u.l#H.X#r.lbebCa0#G#G#G.1.1#Y.G.C.gaIbW#i.g#s#D.0azbe.1.5#YbeaYbe.w.wbX.y.wbn.4bD.ubh#N#ubV.Zbgbn#G#z#2bQbV.w.w.y#Z.g.l#sbRbY#s.0", +"bm.Obw#z.Ob5#4.SbebSbA.1#Db0.Jbn.8#G.w.1#Gay#G#G#s#u#u#Y.1aBbe.R.ybe.5#z.Kan.0a0#0.1#Gbc#baLbI.C.gbR#EbWbT#z.y#Gb4anbnbsaLbn#a#a#H#b.ybA.w#zbOaPaT#V.l#FbVbOa3#s#0.e#2by#G.1bn.Rat.Z.4#z#t.s#s.0", +"bm#Z.s.w.Ob5bL#tb4.ebSbC#7bPbGbV.8ay.w.w#G#D#0#G#0#ubV#n#saibe.R#0an.b#z#z#lbd#0.1#Gbc.1#H#Y.EbZaIb..gbR.Sak#G#nb4.m#b.ybq.RaLbea0#b.y.y.wbS.4.g.O#XaA#F#DaraxbQa5.ebTbQ.1a0#G.y#3.Zbv.K#t#tbn.r", +"#G.sbw#z#2bNa2bSbV.8bQbVay#G.y.SblbS#Gay#G#0#G#ubybvbe#b#z.4.q.S#8#b#za8#Daz#7.w.w.r.1.1#H#s.GbBaBb.aP.CbAbn.1b4ananan###Bbn.mbnb4#b.ybv#GbnaP#ZadbN#jbSay.MbD.n.1#z.4#z#bbCbV#zbwaPa6#5bZbD.y.1", +".1#tbw#z.4a9#5bV#z.8.w#G.r#G#ubAbSbS#z#0#G.1#0bS#z.o#bbn.y#2akaB.1.w#0.y#0az#Dbn.w#G#G.1#baY.9.C#2bL.Y.s.S#DbC#Hazbeana7brbn#Wbnan#b.K#u.w#bbDb1#k#k.g.Saybv#xbw.w#z.4bK#P#G#G#z.s.g.g.KbR.ZbV.1", +".w.Sbw#z.8#..D#u#z.y#s#0bmbm#D.Ka5bS#G.w#GbS#G#0a5#F.1#DaB.4bQ#2#D.w#zbS.wbe#u#0.wbV#G.1#b.KaP.Z.ZaIbN#..S#u.1.1b4anbe#Hbebebrbnbe.w#z#u.wbn#E.LaG#ka9.4#zblaZ.sbV#z.4#z.w.0#D#s.H#i#x#5bZ.Z#s.1", +".wbLbw.K.8.O#5.8#GbS.w.1.r#G.wbVbS.8bV#0#G#ubVbV#u.yaY#D#2.ebQ#2.1bVa5.8.w.1bSbS.w#G#G#G#GbA.g#.bLbRba.O.K#D.1.1b4anb4brbebrbrbn#Hbn.KbS.w#Db#.fb6aG#kaq#za5.8.Z#zbV.S#s.way#GbnbBaP.g.TbR#t#s.1", +"bcaI#t.K.8.Oa2.8.w#z#z#0#Gbm.wbKa5blbVbV#G#u#ua5.y#D.wbVbGbQ#baB.wbSbA.4#b.RbVbA#0bV#G.wbVbY.Z.O.TbR#.aPbQ.ya0#b.z#Bb4anbe#B#Y.ibe#sbV#s#b.Rafb6#k#kadaP.e#zbA.4bS#s.R#s.wbS#D.1b7#i#x#4bR.9bV#G", +".w#4bw.e.8.OaI#u#z#z#z#G#G#G.w.4#za5bS#GbVbVbVbS.4bKbV.K.MbQaY#FazbVbAaB.q#F#GbS#G.1#Haz#saBbZ.H.e.gbabN.q#7#b.zan.manbebrbrbrbn.1#D#zbV.1.R.I.ha9.L#kbN.4#zbA.8ar#s.Rbn#0.B#GbnaI#E#i#5.s.Z#s#D", +"#GaKbR.e.yaqaI.8#z#sbK#0#G#G#saZa5bAbSbVbV#zbV#u.l#z.ybV#x.w#bbdazbV.K.Sbr.5.w#z.1bcbcaz#baBbZ.O.ebWbabi.qbs.zb4ananan.1#Bbe#Wbn.1.y.y#DbnaB#M.h.g.Oa9bibTbAbA.8.J#sbn.Raya5bVa7aI#E#i.KbR#t#s.0", +"#Gb.bBa5bA.Oa2#u.K.K.4#z#G#GbQbDbA.8bS.y#ubVbVaB#r.KbA#zbg#Y#b#Ha0bV#sbKaLa#be#0.1#H.1#B.1bY#taP.KaPaP.U#Y#7.z.zananan.ibqaV.mbn#b#DbV#z.1bXafac.ZaI#..I#i.lbA.8.J#s.i.ya5a5#DbdaIaC#ib.bR.4bQ#D", +"#Gb..ZbAbAbaaIbV#zbA.ybKbV#sbV#Far#z#Dblblar.8aB.y#zbR.KbG.w.1.z.wbV#T.can.Sbr#8b4.w#nb4#L#.bJ#R#z.g#3a9bq#F.z#H#f.mbe#sbe#D#L##bC#s.ybl#P#3.2.I#tbL.g#..paP.e.obTbQ#s#2.ybV.y#FbA.O.L.4.4bB#a.0", +"#Gb..ga5.eaPbB.ya5bl.8bS#0bn#s#u.Z#zbV#Fa8.8bA.y.8#4bR#1.8#G.1.1#PbVaAb4br.e.V#8an.waz#8#WbiaIbX.k#v.uajaL#Fbc.1#fbeanbnaLa7#La7#8#sbK.r.w.O.x.Y#t.e.gbWadbN#4bl#xbQ.K#2#ubVbV#D.lba.LbZaBbwak.0", +"#G.KaP.e#z.ObZ.y#za5bSbS#z.w#0bV.g.K#s#ua8.lbl.y#F.4.Z#i#z#G.0.w.w#DbOan.V.ebeanbr.w#bbCaLbi#..Sby.g.saObe#u#H.1#8be#B#Dbebr#L#8bc#sbKay.w.Y.LaT.4.K#taP#pbibA#u#2#s#zaB.ybV#sbV.4bababLaB.s.7.0", +"#Gbu.ga5#s.Obw.yby#0bSbS#0#zaybSbabZ.K#zbl.8bA#u.8.Saq.6#YbV#Ga0be.1bOanbrbU#8.zaza0.w#H#WaP#EbK#b.Z#R#XaV#0.z.1#b.1#B.R#Yan.m#8#H#JbK#G#0af.L.u.4.ebO.gbN.U#t#z.ybQbV.8.y.wbVbVaBba#Z.T.4.s.kbc", +"a0.7aP.e#z#Zbw#u#0#0#0#u#G#G#uaya9bR#4bVbSa5bS#F.K.T.Z.6b0ay#D#bbebV#T.m#8bU#D.1#8#0.1bebqaIbW#J#b#x#R#v#D#0bC#H#HbV#Bbs#B.mbe#ea0bK.K#G#0.I#Z#t#tbA.ebO#..Ua6bV#F.w#sbVbV#z#sbVbA.O#Z.ebYaT.7bc", +"#P.Q.ga5#sba.sbAbV.wbS#u#z#GbVbVbaaT.SbKa5a5bS#F.ebL#EbD#b#u#u#Y#H.1#Tbebd.W#7bd.1bS#0beaL.T#Ebn#Y.g.S#y#u#0aobe.w.1azbs#Bbrb4a7a0au.K#Pay.I.O.Z.4.y.ebLbR#..P#z.8bV#0bVbn.w#s#sbAbH#ZbL.4.9.kbc", +".1buaPa5#z.Y.O#ubV#sbVbV.1#z#D.wba.Z.4bA.8.e.KbA.4#t.UbL#s#zbbbe#b#b#ran.b.W#7.1#8#G#0#HbKb7.gaV#BbT.K#r#Dby#H.m.1.1be#u#B.1.wbe#P.S#z.wbSbi.n.ZbK.4.e.8aI.Z.6.K#u#GbV#0bV#s.w.w.e#Z#Z.K.4aT.k.1", +".rb..g.e#s.YaPbV#z.wbnbV.wbn#Dbn.OaP.4.y.4#N.K.K#T#t.U.Q#z.w#F#YazanaNan.bap#Ga0az#0#P#b#KbR.Z#aaz#ibK#h#u.wbC#B#b.1bebs#B#D#baLbcbA.k#P#G#E#S#2.K.8bAbL.Tbw.6.K#G#0.wbVbVbV#s#s.e.Oba.K.4aT.k.0" +}; + +static void drawroundrect( QPainter *p, QCOORD x, QCOORD y, + QCOORD w, QCOORD h, QCOORD d ); + +static inline int buttonthickness( int d ); + +static QRegion roundRectRegion( const QRect& g, int r ); + +static void get_combo_parameters( const QRect &r, + int &ew, int &awh, int &ax, + int &ay, int &sh, int &dh, + int &sy ); + +static int get_combo_extra_width( int h, int *return_awh = 0 ); + +enum { PointUp, PointDown, PointLeft, PointRight }; + + +NorwegianWoodStyle::NorwegianWoodStyle() : QWindowsStyle() +{ +} + +/*! + Reimplementation from QStyle + */ +void NorwegianWoodStyle::polish( QApplication *app) +{ + + oldPalette = app->palette(); + + // we simply create a nice QColorGroup with a couple of fancy wood + // pixmaps here and apply to it all widgets + + QImage img(button_xpm); + QImage orig = img; + orig.detach(); + QPixmap button; + button.convertFromImage(img); + + + int i; + for (i=0; iconvertFromImage(img); + + + img = bgimage; + img.detach(); + for (i=0; iconvertFromImage(img); + + + + QPalette op(QColor(212,140,95)); + // QPalette op(white); + QColorGroup active (op.active().foreground(), + QBrush(op.active().button(),button), + QBrush(op.active().light(), light), + QBrush(op.active().dark(), dark), + QBrush(op.active().mid(), mid), + op.active().text(), + Qt::white, + QColor(236,182,120), + QBrush(op.active().background(), background) + ); + QColorGroup disabled (op.disabled().foreground(), + QBrush(op.disabled().button(),button), + QBrush(op.disabled().light(), light), + op.disabled().dark(), + QBrush(op.disabled().mid(), mid), + op.disabled().text(), + Qt::white, + QColor(236,182,120), + QBrush(op.disabled().background(), background) + ); + + app->setPalette(QPalette(active, disabled, active), TRUE ); + +} + +void NorwegianWoodStyle::unPolish( QApplication *app) +{ + app->setPalette(oldPalette, TRUE); +} + +/*! + Reimplementation from QStyle + */ +void NorwegianWoodStyle::polish( QWidget* w) +{ + + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + + if ( !w->isTopLevel() ) { + if ( w->inherits("QPushButton") + || w->inherits("QToolButton") + || w->inherits("QComboBox") ) { + w->setAutoMask( TRUE ); + return; + } + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( QWidget::WindowOrigin ); + } +} + +void NorwegianWoodStyle::unPolish( QWidget* w) +{ + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + if ( !w->isTopLevel() ) { + if ( w->inherits("QPushButton") + || w->inherits("QToolButton") + || w->inherits("QComboBox") ) { + w->setAutoMask( FALSE ); + return; + } + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( QWidget::WidgetOrigin ); + } +} + +void NorwegianWoodStyle::drawPrimitive( PrimitiveElement pe, + QPainter *p, + const QRect &r, + const QColorGroup &cg, + SFlags flags, const QStyleOption& opt ) const +{ + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + switch ( pe ) { + case PE_ButtonCommand: + { + int d = QMIN( w, h ) / 2; + int b = buttonthickness( d ); + + QRegion internR = roundRectRegion( QRect(x + b, y + b, + w - 2 * b, + h - 2 * b), d - b ); + QPen oldPen = p->pen(); + + QBrush brush( flags & Style_Sunken ? cg.brush(QColorGroup::Mid) : + cg.brush(QColorGroup::Button) ); + p->setClipRegion( internR ); + p->fillRect( r, brush ); + + int e = QMIN( w, h ) / 2; + QPoint p2( x + w - 1 - e, y + e ); + QPoint p3( x + e, y + h - 1 - e ); + + QPointArray a; + a.setPoints( 5, x,y, x+w-1, y, p2.x(), p2.y(), p3.x(), p3.y(), + x, y + h - 1 ); + p->setClipRegion( QRegion(a) - internR ); + + p->fillRect( r, (flags & Style_Sunken ? QBrush( cg.dark(), *sunkenDark) + : cg.brush(QColorGroup::Light)) ); + + // A little inversion is needed the buttons + // ( but not flat) + if ( flags & Style_Raised || flags & Style_Sunken ) { + a.setPoint( 0, x + w - 1, y + w - 1 ); + p->setClipRegion( QRegion( a ) - internR ); + + p->fillRect( r, (flags & Style_Sunken ? QBrush( cg.light(), *sunkenLight) : cg.brush( QColorGroup::Dark ) ) ); + } + p->setClipRegion( internR ); + p->setClipping( FALSE ); + p->setPen( cg.foreground() ); + drawroundrect( p, x, y, w, h, d ); + p->setPen( oldPen ); + break; + } + case PE_ScrollBarAddLine: + if ( flags & Style_Horizontal ) + drawSemicircleButton( p, r, PointRight, flags & Style_Down, cg ); + else + drawSemicircleButton( p, r, PointDown, flags & Style_Down, cg ); + break; + case PE_ScrollBarSubLine: + if ( flags & Style_Horizontal ) + drawSemicircleButton( p, r, PointLeft, flags & Style_Down, cg ); + else + drawSemicircleButton( p, r, PointUp, flags & Style_Down, cg ); + break; + default: + QWindowsStyle::drawPrimitive( pe, p, r, cg, flags, opt ); + break; + } +} + +void NorwegianWoodStyle::drawControl( ControlElement element, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags how, const QStyleOption& opt ) const +{ + switch( element ) { + case CE_PushButton: + { + const QPushButton *btn; + btn = ( const QPushButton * )widget; + QColorGroup myCg( cg ); + SFlags flags = Style_Default; + if ( btn->isOn() ) + flags |= Style_On; + if ( btn->isDown() ) + flags |= Style_Down; + if ( btn->isOn() || btn->isDown() ) + flags |= Style_Sunken; + if ( btn->isDefault() ) + flags |= Style_Default; + if ( ! btn->isFlat() && !(flags & Style_Down) ) + flags |= Style_Raised; + + int x1, y1, x2, y2; + r.coords( &x1, &y1, &x2, &y2 ); + + p->setPen( cg.foreground() ); + p->setBrush( QBrush( cg.button(), NoBrush ) ); + + QBrush fill; + if ( btn->isDown() ) + fill = cg.brush( QColorGroup::Mid ); + else if ( btn->isOn() ) + fill = QBrush( cg.mid(), Dense4Pattern ); + else + fill = cg.brush( QColorGroup::Button ); + myCg.setBrush( QColorGroup::Mid, fill ); + + if ( btn->isDefault() ) { + x1 += 2; + y1 += 2; + x2 -= 2; + y2 -= 2; + } + + drawPrimitive( PE_ButtonCommand, p, + QRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1), + myCg, flags, opt ); + + if ( btn->isDefault() ) { + QPen pen( Qt::black, 4 ); + pen.setCapStyle( Qt::RoundCap ); + pen.setJoinStyle( Qt::RoundJoin ); + p->setPen( pen ); + drawroundrect( p, x1 - 1, y1 - 1, x2 - x1 + 3, y2 - y1 + 3, 8 ); + } + + if ( btn->isMenuButton() ) { + int dx = ( y1 - y2 - 4 ) / 3; + + // reset the flags + flags = Style_Default; + if ( btn->isEnabled() ) + flags |= Style_Enabled; + drawPrimitive( PE_ArrowDown, p, + QRect( x2 - dx, dx, y1, y2 - y1), + myCg, flags, opt ); + } + + if ( p->brush().style() != NoBrush ) + p->setBrush( NoBrush ); + break; + } + case CE_PushButtonLabel: + { + const QPushButton *btn; + btn = (const QPushButton*)widget; + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + + int x1, y1, x2, y2; + r.coords( &x1, &y1, &x2, &y2 ); + int dx = 0; + int dy = 0; + if ( btn->isMenuButton() ) + dx = ( y2 - y1 ) / 3; + if ( dx || dy ) + p->translate( dx, dy ); + + x += 2; + y += 2; + w -= 4; + h -= 4; + drawItem( p, QRect( x, y, w, h ), + AlignCenter | ShowPrefix, + cg, btn->isEnabled(), + btn->pixmap(), btn->text(), -1, + (btn->isDown() || btn->isOn()) ? &cg.brightText() + : &cg.buttonText() ); + if ( dx || dy ) + p->translate( -dx, -dy ); + break; + } + default: + QWindowsStyle::drawControl( element, p, widget, r, cg, how, opt ); + break; + } +} + +void NorwegianWoodStyle::drawControlMask( ControlElement element, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QStyleOption& opt ) const +{ + switch( element ) { + case CE_PushButton: + { + int d = QMIN( r.width(), r.height() ) / 2; + p->setPen( color1 ); + p->setBrush( color1 ); + drawroundrect( p, r.x(), r.y(), r.width(), r.height(), d ); + break; + } + default: + QWindowsStyle::drawControlMask( element, p, widget, r, opt ); + break; + } +} + +void NorwegianWoodStyle::drawComplexControl( ComplexControl cc, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags how, + SCFlags sub, + SCFlags subActive, + const QStyleOption& opt ) const +{ + switch( cc ) { + case CC_ComboBox: + { + const QComboBox *cmb; + cmb = (const QComboBox*)widget; + + int awh, ax, ay, sh, sy, dh, ew; + get_combo_parameters( subRect(SR_PushButtonContents, widget), + ew, awh, ax, ay, sh, dh, sy ); + drawPrimitive( PE_ButtonCommand, p, r, cg, Style_Raised, opt ); + QStyle *mstyle = QStyleFactory::create( "Motif" ); + if ( mstyle ) + mstyle->drawPrimitive( PE_ArrowDown, p, + QRect(ax, ay, awh, awh), cg, how, opt ); + else + drawPrimitive( PE_ArrowDown, p, + QRect(ax, ay, awh, awh), cg, how, opt ); + + QPen oldPen = p->pen(); + p->setPen( cg.light() ); + p->drawLine( ax, sy, ax + awh - 1, sy ); + p->drawLine( ax, sy, ax, sy + sh - 1 ); + p->setPen( cg.dark() ); + p->drawLine( ax + 1, sy + sh - 1, ax + awh - 1, sy + sh - 1 ); + p->drawLine( ax + awh - 1, sy + 1, ax + awh - 1, sy + sh - 1 ); + p->setPen( oldPen ); + + if ( cmb->editable() ) { + QRect r( querySubControlMetrics(CC_ComboBox, widget, + SC_ComboBoxEditField, opt) ); + qDrawShadePanel( p, r, cg, TRUE, 1, + &cg.brush(QColorGroup::Button) ); + } + + break; + } + default: + QWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how, + sub, subActive, opt ); + break; + } +} + +void NorwegianWoodStyle::drawComplexControlMask( ComplexControl control, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QStyleOption& opt ) const +{ + switch ( control ) { + case CC_ComboBox: + { + int d = QMIN( r.width(), r.height() ) / 2; + p->setPen( color1 ); + p->setBrush( color1 ); + drawroundrect( p, r.x(), r.y(), r.width(), r.height(), d ); + break; + } + default: + QWindowsStyle::drawComplexControlMask( control, p, widget, r, opt ); + break; + } +} + +QRect NorwegianWoodStyle::querySubControlMetrics( ComplexControl control, + const QWidget *widget, + SubControl sc, + const QStyleOption& opt ) const +{ + QRect rect; + switch ( control ) { + case CC_ComboBox: + { + switch( sc ) { + case SC_ComboBoxEditField: + { + rect = subRect( SR_PushButtonContents, widget ); + int ew = get_combo_extra_width( rect.height(), 0 ); + rect.setRect( rect.x() + 1, rect.y() + 1, + rect.width() - 2 - ew, rect.height() - 2 ); + break; + } + default: + rect = QWindowsStyle::querySubControlMetrics( control, widget, + sc, opt ); + break; + } + break; + } + case CC_ScrollBar: + { + const QScrollBar* sb; + sb = (const QScrollBar*)widget; + bool horz = sb->orientation() == QScrollBar::Horizontal; + int b = 2; + int w = horz ? sb->height() : sb->width(); + + switch ( sc ) { + case SC_ScrollBarAddLine: + rect.setRect( b, b, w - 2 * b, w - 2 * b ); + if ( horz ) + rect.moveBy( sb->width() - w, 0 ); + else + rect.moveBy( 0, sb->height() - w ); + break; + case SC_ScrollBarSubLine: + rect.setRect( b, b, w - 2 * b, w - 2 * b ); + break; + default: + rect = QWindowsStyle::querySubControlMetrics( control, widget, + sc, opt ); + break; + } + break; + } + default: + rect = QWindowsStyle::querySubControlMetrics( control, widget, + sc, opt ); + break; + } + return rect; +} + +QRect NorwegianWoodStyle::subRect( SubRect sr, const QWidget * widget ) const +{ + QRect r; + switch ( sr ) { + case SR_PushButtonContents: + { + const QPushButton *btn; + btn = (const QPushButton*)widget; + r = btn->rect(); + int d = QMIN( r.width(), r.height() ) / 2; + int b = buttonthickness( d ); + + d -= b; + b++; + + if ( r.width() < r.height() ) + r.setRect( r.x() + b, r.y() + d, + r.width() - 2 * b, r.height() - 2 * d ); + else + r.setRect( r.x() + d, r.y() + b, + r.width() - 2 * d, r.height() - 2 * b ); + break; + } + case SR_ComboBoxFocusRect: + { + r = subRect( SR_PushButtonContents, widget ); + int ew = get_combo_extra_width( r.height() ); + r.setRect( r.x() + 1, r.y() + 1, r.width() - 2 - ew, + r.height() - 2 ); + break; + } + default: + r = QWindowsStyle::subRect( sr, widget ); + break; + } + return r; +} + +static void drawroundrect( QPainter *p, QCOORD x, QCOORD y, + QCOORD w, QCOORD h, QCOORD d ) +{ + int rx = (200*d)/w; + int ry = (200*d)/h; + p->drawRoundRect( x, y, w, h, rx, ry ); +} + +static QRegion roundRectRegion( const QRect& g, int r ) +{ + QPointArray a; + a.setPoints( 8, g.x()+r, g.y(), g.right()-r, g.y(), + g.right(), g.y()+r, g.right(), g.bottom()-r, + g.right()-r, g.bottom(), g.x()+r, g.bottom(), + g.x(), g.bottom()-r, g.x(), g.y()+r ); + QRegion reg( a ); + int d = r*2-1; + reg += QRegion( g.x(),g.y(),r*2,r*2, QRegion::Ellipse ); + reg += QRegion( g.right()-d,g.y(),r*2,r*2, QRegion::Ellipse ); + reg += QRegion( g.x(),g.bottom()-d,r*2,r*2, QRegion::Ellipse ); + reg += QRegion( g.right()-d,g.bottom()-d,r*2,r*2, QRegion::Ellipse ); + return reg; +} + + + + +static int get_combo_extra_width( int h, int *return_awh ) +{ + int awh; + if ( h < 8 ) { + awh = 6; + } else if ( h < 14 ) { + awh = h - 2; + } else { + awh = h/2; + } + if ( return_awh ) + *return_awh = awh; + return awh*3/2; +} + + +static void get_combo_parameters( const QRect &r, + int &ew, int &awh, int &ax, + int &ay, int &sh, int &dh, + int &sy ) +{ + ew = get_combo_extra_width( r.height(), &awh ); + + sh = (awh+3)/4; + if ( sh < 3 ) + sh = 3; + dh = sh/2 + 1; + + ay = r.y() + (r.height()-awh-sh-dh)/2; + if ( ay < 0 ) { + //panic mode + ay = 0; + sy = r.height(); + } else { + sy = ay+awh+dh; + } + ax = r.x() + r.width() - ew +(ew-awh)/2; +} + +static inline int buttonthickness( int d ) +{ return d > 20 ? 5 : ( d < 10 ? 2: 3 ); } + +void NorwegianWoodStyle::drawSemicircleButton( QPainter *p, const QRect &r, + int dir, bool sunken, + const QColorGroup &g ) const +{ + int b = pixelMetric( PM_ScrollBarExtent ) > 20 ? 3 : 2; + + QRegion extrn( r.x(), r.y(), r.width(), r.height(), QRegion::Ellipse ); + QRegion intern( r.x()+b, r.y()+b, r.width()-2*b, r.height()-2*b, QRegion::Ellipse ); + int w2 = r.width()/2; + int h2 = r.height()/2; + + int bug = 1; //off-by-one somewhere!!!??? + + switch( dir ) { + case PointRight: + extrn += QRegion( r.x(), r.y(), w2, r.height() ); + intern += QRegion( r.x()+b,r.y()+b, w2-2*b, r.height()-2*b ); + break; + case PointLeft: + extrn += QRegion( r.x()+w2, r.y(), w2, r.height() ); + intern += QRegion( r.x()+w2+b,r.y()+b, w2-2*b, r.height()-2*b ); + break; + case PointUp: + extrn += QRegion( r.x(), r.y()+h2, r.width(), h2 ); + intern += QRegion( r.x()+b,r.y()+h2+b, r.width()-2*b-bug, h2-2*b-bug ); + break; + case PointDown: + extrn += QRegion( r.x(), r.y(), r.width(), h2 ); + intern += QRegion( r.x()+b,r.y()+b, r.width()-2*b-bug, h2-2*b-bug ); + break; + } + + extrn = extrn - intern; + QPointArray a; + a.setPoints( 3, r.x(), r.y(), r.x(), r.bottom(), r.right(), r.top() ); + + QRegion oldClip = p->clipRegion(); + bool bReallyClip = p->hasClipping(); // clip only if we really want. + p->setClipRegion( intern ); + p->fillRect( r, g.brush( QColorGroup::Button ) ); + + p->setClipRegion( QRegion(a)&extrn ); + p->fillRect( r, sunken ? g.dark() : g.light() ); + + a.setPoints( 3, r.right(), r.bottom(), r.x(), r.bottom(), + r.right(), r.top() ); + p->setClipRegion( QRegion(a) & extrn ); + p->fillRect( r, sunken ? g.light() : g.dark() ); + + p->setClipRegion( oldClip ); + p->setClipping( bReallyClip ); +} + +// ************************** +// --- Plugin - interface --- +// ************************** + +class WoodStylePlugin : public QStylePlugin +{ +public: + WoodStylePlugin(); + + QStringList keys() const; + QStyle *create( const QString& ); +}; + +WoodStylePlugin::WoodStylePlugin() +: QStylePlugin() +{ +} + +QStringList WoodStylePlugin::keys() const +{ + QStringList list; + list << "Wood"; + return list; +} + +QStyle* WoodStylePlugin::create( const QString& s ) +{ + if ( s.lower() == "wood" ) + return new NorwegianWoodStyle(); + + return 0; +} + +Q_EXPORT_PLUGIN( WoodStylePlugin ) + +#endif diff --git a/plugins/styles/wood/wood.h b/plugins/styles/wood/wood.h new file mode 100644 index 0000000..1e428ac --- /dev/null +++ b/plugins/styles/wood/wood.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** $Id: wood.h,v 1.1.1.8 2006/05/07 17:31:30 chehrlic Exp $ +** +** Definition of something or other +** +** Created : 979899 +** +** Copyright (C) 1997 by Trolltech AS. All rights reserved. +** +** This file is part of an example program for Qt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#ifndef WOOD_H +#define WOOD_H + + +#include + +#ifndef QT_NO_STYLE_WINDOWS + +#include + + +class NorwegianWoodStyle : public QWindowsStyle +{ +public: + NorwegianWoodStyle(); + void polish( QApplication*); + void polish( QWidget* ); + void unPolish( QWidget* ); + void unPolish( QApplication*); + + void drawPrimitive( PrimitiveElement pe, + QPainter *p, + const QRect &r, + const QColorGroup &cg, + SFlags flags = Style_Default, + const QStyleOption& = QStyleOption::Default ) const; + + void drawControl( ControlElement element, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags how = Style_Default, + const QStyleOption& = QStyleOption::Default ) const; + + void drawControlMask( ControlElement element, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QStyleOption& = QStyleOption::Default ) const; + + void drawComplexControl( ComplexControl cc, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags how = Style_Default, + SCFlags sub = SC_All, + SCFlags subActive = SC_None, + const QStyleOption& = QStyleOption::Default ) const; + + void drawComplexControlMask( ComplexControl control, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QStyleOption& = QStyleOption::Default ) const; + + QRect querySubControlMetrics( ComplexControl control, + const QWidget *widget, + SubControl sc, + const QStyleOption& = QStyleOption::Default ) const; + + QRect subRect( SubRect r, const QWidget *widget ) const; + + +private: + void drawSemicircleButton(QPainter *p, const QRect &r, int dir, + bool sunken, const QColorGroup &g ) const; + QPalette oldPalette; + QPixmap *sunkenDark; + QPixmap *sunkenLight; + +}; + +#endif + +#endif diff --git a/plugins/styles/wood/wood.rc b/plugins/styles/wood/wood.rc new file mode 100644 index 0000000..55c3468 --- /dev/null +++ b/plugins/styles/wood/wood.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,0,0,0 + PRODUCTVERSION 0,0,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "wood\0" + VALUE "FileVersion", "0, 9, 5, 0\0" + VALUE "InternalName", "wood\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "wood.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 5, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/styles/wood/wood.vcproj b/plugins/styles/wood/wood.vcproj new file mode 100644 index 0000000..2ebbb6d --- /dev/null +++ b/plugins/styles/wood/wood.vcproj @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/transparent/CMakeLists.txt b/plugins/transparent/CMakeLists.txt new file mode 100644 index 0000000..2a4bbe8 --- /dev/null +++ b/plugins/transparent/CMakeLists.txt @@ -0,0 +1,27 @@ +####################### +# transparent library # +####################### +IF(BUILD_DROPPED) +SET(transparent_SRCS + transparent.cpp + transparentcfg.cpp +) + +SET(transparent_HDRS + transparent.h + transparentcfg.h +) + +SET(transparent_UICS + transparentcfgbase.ui +) + +SET(transparent_LIBS + floaty +) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(transparent) +ENDIF(BUILD_DROPPED) diff --git a/plugins/transparent/configure.in.in b/plugins/transparent/configure.in.in new file mode 100644 index 0000000..2c51f7a --- /dev/null +++ b/plugins/transparent/configure.in.in @@ -0,0 +1,10 @@ +compile_plugin="no" +if test "$use_kde" = "yes"; then + compile_plugin="yes" + TRANSPARENT_OBJ=transtop.lo + AC_SUBST([TRANSPARENT_OBJ]) +fi +if test "$kde_use_qt_win" = "yes"; then + compile_plugin="yes" +fi +AM_CONDITIONAL(ENABLE_TRANSPARENT, test "x$compile_plugin" = "xyes") diff --git a/plugins/transparent/transparent.cpp b/plugins/transparent/transparent.cpp new file mode 100644 index 0000000..5853316 --- /dev/null +++ b/plugins/transparent/transparent.cpp @@ -0,0 +1,278 @@ +/*************************************************************************** + transparent.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include + +#include "log.h" +#include "misc.h" +#include "core.h" + +#include "transparent.h" +#include "mainwin.h" +#include "transparentcfg.h" +#include "../floaty/floatywnd.h" //Handle Floatings +#include "profile.h" +#include "profilemanager.h" + + +#define SHOW_TIMEOUT 300 +#define HIDE_TIMEOUT 1000 + +using namespace SIM; + +Plugin *createTransparentPlugin(unsigned base, bool, Buffer *config) +{ + return new TransparentPlugin(base, config); +} + +static PluginInfo info = + { + I18N_NOOP("Transparent"), +#ifdef WIN32 + I18N_NOOP("Plugin provides windows transparency\n" + "This plugin works only on Windows 2000 or Windows XP") +#else + I18N_NOOP("Plugin provides windows transparency") +#endif + , + VERSION, + createTransparentPlugin, +#ifdef WIN32 + PLUGIN_DEFAULT +#else + PLUGIN_NOLOAD_DEFAULT +#endif + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +TransparentPlugin::TransparentPlugin(unsigned base, Buffer *config) + : QObject(), Plugin(base) + , timer (NULL) //Fixme? look below + , m_bHaveMouse (false) + , m_bActive (false) +{ + m_propertyHub = SIM::PropertyHub::create("transparent"); + if (value("Transparency").toUInt() >100) + setValue("Transparency", 100); + + QTimer *timer = new QTimer(this); //Fixme? look above + connect(timer, SIGNAL(timeout()), this, SLOT(tickMouse())); + timer->start(1000); + setState(); +} + +TransparentPlugin::~TransparentPlugin() +{ + delete timer; + + // reset opacity for all toplevel widgets + QWidgetList list = QApplication::topLevelWidgets(); + foreach(QWidget *w,list) + { + w->setWindowOpacity(1.0); + } +} + +QByteArray TransparentPlugin::getConfig() +{ + return QByteArray(); +} + +QWidget *TransparentPlugin::getMainWindow() +{ + CorePlugin *core = GET_CorePlugin(); + return core->getMainWindow(); +} + +QWidget *TransparentPlugin::createConfigWindow(QWidget *parent) +{ + return new TransparentCfg(parent, this); +} + +void TransparentPlugin::tickMouse() +{ + QPoint p = QCursor::pos(); + bool bMouse = false; + QWidget *main = getMainWindow(); + if (main && main->isVisible()){ + if (main->frameGeometry().contains(p)) + bMouse = true; + } + + //Handle Floatings// + QWidgetList list = QApplication::topLevelWidgets(); + foreach (QWidget *w,list) { + if (bMouse) + break; + if (FloatyWnd *flt = dynamic_cast(w)) + bMouse = flt->frameGeometry().contains(p); + } + //Handle Floatings// + + if (bMouse != m_bHaveMouse){ + m_bHaveMouse = bMouse; + setState(); + } +} + +bool TransparentPlugin::eventFilter(QObject *o, QEvent *e) +{ + if (value("IfInactive").toBool()){ + switch (e->type()){ + case QEvent::WindowActivate: + m_bActive = true; + setState(); + break; + case QEvent::WindowDeactivate: + m_bActive = false; + setState(); + break; + case QEvent::Show:{ + QWidget *main = getMainWindow(); + if (main){ + setState(); + } + break; + } + default: + break; + } + } + return QObject::eventFilter(o, e); +} + +void TransparentPlugin::setState() +{ + QWidget *main = getMainWindow(); + QWidgetList list = QApplication::topLevelWidgets(); + + if (main == NULL) + return; + if (timer == NULL) { + timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(tick())); + main->installEventFilter(this); + main->setMouseTracking(true); + m_bActive = main->isActiveWindow(); + m_bState = !m_bActive; + } + bool bNewState = m_bActive || m_bHaveMouse; + if (bNewState == m_bState){ + qreal transparency = (100 - value("Transparency").toUInt()) / 100.; + if(value("IfMainWindow").toBool()) + main->setWindowOpacity(transparency); + else + main->setWindowOpacity(1.0); + + QWidgetList list = QApplication::topLevelWidgets(); + foreach (QWidget *w,list) { + if (FloatyWnd *refwnd = dynamic_cast(w)){ + refwnd->installEventFilter(this); + if (value("IfFloatings").toBool()) + refwnd->setWindowOpacity(transparency); + else + refwnd->setWindowOpacity(1.0); + } + } + return; + } + m_bState = bNewState; + startTime = QTime::currentTime(); + timer->start(10); +} + +void TransparentPlugin::tick() +{ + QWidget *main = getMainWindow(); + if (main == NULL){ + timer->stop(); + return; + } + qreal timeout = m_bActive ? SHOW_TIMEOUT : HIDE_TIMEOUT; + qreal difftime = startTime.msecsTo( QTime::currentTime() ); + if (difftime >= timeout){ + difftime = timeout; + timer->stop(); + } + if (m_bState) + difftime = timeout - difftime; + + qreal transparency = (100 - value("Transparency").toUInt()) / 100.; + qreal diff_to_opaque = 1. - transparency; + transparency = transparency + diff_to_opaque * (1 - difftime / timeout); + + //log(L_DEBUG, "transparency: %f, diff_to_opaque %f, time %d, timeout %d", + // transparency, diff_to_opaque, time, timeout); + if (value("IfMainWindow").toBool()) + main->setWindowOpacity(transparency); + else + main->setWindowOpacity(1.0); + + //Handle Floatings + QWidgetList list = QApplication::topLevelWidgets(); + foreach (QWidget *w,list) { + if (FloatyWnd *refwnd = qobject_cast(w)){ + refwnd->installEventFilter(this); + if (value("IfFloatings").toBool()) + refwnd->setWindowOpacity(transparency); + else + refwnd->setWindowOpacity(1.0); + } + } + //Handle Floatings// +} + +bool TransparentPlugin::processEvent(Event *e) +{ + if (e->type() == eEventInit) { + setState(); + } + else if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("trnsparent"); + if(!hub.isNull()) + setPropertyHub(hub); + } + return false; +} + + +void TransparentPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr TransparentPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant TransparentPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void TransparentPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/transparent/transparent.h b/plugins/transparent/transparent.h new file mode 100644 index 0000000..8e7aa95 --- /dev/null +++ b/plugins/transparent/transparent.h @@ -0,0 +1,63 @@ +/*************************************************************************** + transparent.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _TRANSPARENT_H +#define _TRANSPARENT_H + +#include +#include + +#include "cfg.h" +#include "event.h" +#include "plugins.h" +#include "propertyhub.h" + +class QWidget; +class QTimer; + +class TransparentPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + TransparentPlugin(unsigned, Buffer*); + virtual ~TransparentPlugin(); + void setState(); + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +public Q_SLOTS: + void tick(); + void tickMouse(); +protected: + virtual QByteArray getConfig(); + virtual QWidget *createConfigWindow(QWidget *parent); + virtual bool eventFilter(QObject*, QEvent*); + QWidget *getMainWindow(); + bool m_bState; + virtual bool processEvent(SIM::Event *e); + + QTime startTime; + QTimer *timer; + bool m_bHaveMouse; + bool m_bActive; +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/transparent/transparent.rc b/plugins/transparent/transparent.rc new file mode 100644 index 0000000..9eabb74 --- /dev/null +++ b/plugins/transparent/transparent.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Transparent plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "transparent\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "transparent.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/transparent/transparent.vcproj b/plugins/transparent/transparent.vcproj new file mode 100644 index 0000000..d2ca40b --- /dev/null +++ b/plugins/transparent/transparent.vcproj @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/transparent/transparentcfg.cpp b/plugins/transparent/transparentcfg.cpp new file mode 100644 index 0000000..e7f57df --- /dev/null +++ b/plugins/transparent/transparentcfg.cpp @@ -0,0 +1,44 @@ +/*************************************************************************** + transparentcfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "transparentcfg.h" +#include "transparent.h" + +#include +#include + +TransparentCfg::TransparentCfg(QWidget *parent, TransparentPlugin *plugin) + : QWidget(parent) + , m_plugin(plugin) +{ + setupUi(this); + sldTransparency->setValue(m_plugin->value("Transparency").toUInt()); + chkInactive->setChecked(m_plugin->value("IfInactive").toBool()); + chkMainWindow->setChecked(m_plugin->value("IfMainWindow").toBool()); + chkFloatings->setChecked (m_plugin->value("IfFloatings").toBool()); +} + +void TransparentCfg::apply() +{ + m_plugin->setValue("Transparency", sldTransparency->value()); + m_plugin->setValue("IfInactive", chkInactive->isChecked()); + m_plugin->setValue("IfMainWindow", chkMainWindow->isChecked()); + m_plugin->setValue("IfFloatings", chkFloatings->isChecked()); + m_plugin->setState(); +} + + diff --git a/plugins/transparent/transparentcfg.h b/plugins/transparent/transparentcfg.h new file mode 100644 index 0000000..c769b75 --- /dev/null +++ b/plugins/transparent/transparentcfg.h @@ -0,0 +1,37 @@ +/*************************************************************************** + transparentcfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _TRANSPARENTCFG_H +#define _TRANSPARENTCFG_H + +#include "ui_transparentcfgbase.h" + +class TransparentPlugin; + +class TransparentCfg : public QWidget, public Ui::TransparentCfgBase +{ + Q_OBJECT +public: + TransparentCfg(QWidget *parent, TransparentPlugin *plugin); +public slots: + void apply(); +protected: + TransparentPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/transparent/transparentcfgbase.ui b/plugins/transparent/transparentcfgbase.ui new file mode 100644 index 0000000..3272dbf --- /dev/null +++ b/plugins/transparent/transparentcfgbase.ui @@ -0,0 +1,114 @@ + + + TransparentCfgBase + + + + 0 + 0 + 530 + 391 + + + + Form1 + + + + + + + 0 + 0 + + + + Transparency of main window: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + + + opaque + + + + + + + 100 + + + 5 + + + 20 + + + Qt::Horizontal + + + 0 + + + + + + + transparent + + + + + + + + + Transparent only if inactive + + + + + + + Mainwindow + + + + + + + Floaties + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + diff --git a/plugins/transparent/transtop.cpp b/plugins/transparent/transtop.cpp new file mode 100644 index 0000000..182ce1d --- /dev/null +++ b/plugins/transparent/transtop.cpp @@ -0,0 +1,64 @@ +/*************************************************************************** + transtop.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "transtop.h" + +#include +#include +#include + +#include "event.h" + +TransparentTop::TransparentTop(QWidget *parent, unsigned transparent) + : QObject(parent) +{ + m_transparent = transparent * 0.01; + rootpixmap = new KRootPixmap(parent); + rootpixmap->setCustomPainting(true); + connect(rootpixmap, SIGNAL(backgroundUpdated(const QPixmap&)), this, SLOT(backgroundUpdated(const QPixmap&))); + transparentChanged(); +} + +TransparentTop::~TransparentTop() +{} + +void TransparentTop::transparentChanged() +{ + rootpixmap->start(); +} + +void TransparentTop::setTransparent(unsigned transparent) +{ + m_transparent = transparent * 0.01; + transparentChanged(); +} + +QPixmap TransparentTop::background(const QColor &c) +{ + if (bg.isNull()) + return QPixmap(); + KPixmap pix = KPixmap(bg); + return KPixmapEffect::fade(pix, m_transparent, c); +} + +void TransparentTop::backgroundUpdated( const QPixmap &pm ) +{ + bg = pm; + SIM::EventRepaintView e; + e.process(); +} + diff --git a/plugins/transparent/transtop.h b/plugins/transparent/transtop.h new file mode 100644 index 0000000..dc0331c --- /dev/null +++ b/plugins/transparent/transtop.h @@ -0,0 +1,48 @@ +/*************************************************************************** + transtop.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _TRANSTOP_H +#define _TRANSTOP_H + + +#include +#include + +class KRootPixmap; + +class TransparentTop : public QObject +{ + Q_OBJECT +public: + TransparentTop(QWidget *parent, unsigned transparent); + ~TransparentTop(); + static void setTransparent(QWidget*, bool isTransparent, unsigned long transparency); + static bool bCanTransparent; + static TransparentTop *getTransparent(QWidget*); + QPixmap background(const QColor &c); + KRootPixmap *rootpixmap; + void setTransparent(unsigned transparent); + void transparentChanged(); +protected slots: + void backgroundUpdated( const QPixmap &pm ); +protected: + QPixmap bg; + double m_transparent; +}; + +#endif + diff --git a/plugins/update/CMakeLists.txt b/plugins/update/CMakeLists.txt new file mode 100644 index 0000000..51921e1 --- /dev/null +++ b/plugins/update/CMakeLists.txt @@ -0,0 +1,18 @@ +################## +# update library # +################## +IF(BUILD_DROPPED) +IF(FALSE) + +SET(update_SRCS + update.cpp +) + +SET(update_HDRS + update.h +) + +SIM_ADD_PLUGIN(update) + +ENDIF(FALSE) +ENDIF(BUILD_DROPPED) diff --git a/plugins/update/update.cpp b/plugins/update/update.cpp new file mode 100644 index 0000000..2826c88 --- /dev/null +++ b/plugins/update/update.cpp @@ -0,0 +1,466 @@ +/*************************************************************************** + update.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "update.h" +#include "socket/socketfactory.h" +#include "core.h" + +#include "simgui/ballonmsg.h" +#include "aboutdata.h" +#include "log.h" +#include "mainwin.h" + +#include +#include +#ifdef WIN32 +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace SIM; + + + +QWidget *UpdatePlugin::getMainWindow() //obsolete +{ + CorePlugin *core = GET_CorePlugin(); + return core->getMainWindow(); +} + + +Plugin *createUpdatePlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new UpdatePlugin(base, config); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Update"), + I18N_NOOP("Plugin provides notifications about update SIM software"), + VERSION, + createUpdatePlugin, + PLUGIN_NOLOAD_DEFAULT + }; + +static QWidget *pMain = NULL; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +static DataDef updateData[] = + { + { "Time", DATA_ULONG, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +UpdatePlugin::UpdatePlugin(unsigned base, Buffer *config) + : Plugin(base) +{ + load_data(updateData, &data, config); + CmdGo = registerType(); + this->timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(timeout())); + this->show=false; + this->upToDate=false; + this->ignore=false; + this->isInstalling=false; + this->CHECK_INTERVAL = 60; //seconds for the first time wait + setTime(time(NULL)); //this was missing ;) + this->msgret=-1; + this->bupdateMsgMissing=true; + this->timer->start(15000); + +} + +UpdatePlugin::~UpdatePlugin() +{ + free_data(updateData, &data); +} + +QByteArray UpdatePlugin::getConfig() +{ + return save_data(updateData, &data); +} + +void UpdatePlugin::timeout() +{ + testForUpdate(); +} + +void UpdatePlugin::testForUpdate(){ + if (ignore) return; + if (!getSocketFactory()->isActive() || !isDone()) + return; + if (((unsigned)time(NULL)) >= getTime() + CHECK_INTERVAL){ + versionurl=QString(""); + this->CHECK_INTERVAL=60*60*12; //checking every half day for an update, after first time + //url = "http://sim-im.org/index.php?v=" + VERSION; +#ifdef WIN32 + versionurl = "http://www.sim-icq.de/update.php?"; + versionurl += "os=1"; +#else +#ifdef QT_MACOSX_VERSION + versionurl += "&os=2"; + location="??"; +#endif +#endif +#ifdef CVS_BUILD + //url += "&svn="; + QString date(__DATE__); + versionurl += date; + versionurl.replace(' ',"%20"); + #ifdef WIN32 + location="http://www.sim-icq.de"; + #endif +#else + versionurl += "&release"; +#endif + /*versionurl += "&l="; + QString s = i18n("Message", "%n messages", 1); + s = s.remove("1 "); + for (int i = 0; i < (int)(s.length()); i++){ + unsigned short c = s[i].unicode(); + if ((c == ' ') || (c == '%') || (c == '=') || (c == '&')){ + char b[5]; + sprintf(b, "%02X", c); + versionurl += b; + }else if (c > 0x77){ + char b[10]; + sprintf(b, "#%04X", c); + versionurl += b; + }else{ + versionurl += (char)c; + } + }*/ + QUrl um( "http://www.sim-icq.de/updatemsg.php" ); + httpmsg = new QHttp(this); + connect(httpmsg, SIGNAL(requestFinished(int, bool)),this, SLOT(UpdateMsgDownloadFinished(int, bool))); + QBuffer *buffer_um = new QBuffer(&bytes_um); + buffer_um->open(QIODevice::ReadWrite); + httpmsg->setHost(um.host()); + Request_um=httpmsg->get(um.path(),buffer_um); + } +} + +void UpdatePlugin::UpdateMsgDownloadFinished(int requestId, bool error){ + if (error || msgret==QMessageBox::Yes + || msgret==QMessageBox::No + || msgret==QMessageBox::Ok + || upToDate) return; //Don't show the dialog more than once SIM starts. + if (Request_um==requestId) { + QString updateMsg(bytes_um); + this->m_updateMsg=updateMsg; + this->bupdateMsgMissing=false; + disconnect(httpmsg, SIGNAL(requestFinished(int, bool)),this, SLOT(UpdateMsgDownloadFinished(int, bool))); + QUrl u=QUrl(versionurl); + http = new QHttp(this); + connect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(Finished(int, bool))); + QBuffer *buffer = new QBuffer(&bytes); + buffer->open(QIODevice::ReadWrite); + http->setHost(u.host()); + Request=http->get(u.path(),buffer); + } +} + +void UpdatePlugin::Finished(int requestId, bool error){ + if (error || msgret==QMessageBox::Yes + || msgret==QMessageBox::No + || msgret==QMessageBox::Ok + || upToDate + || bupdateMsgMissing) return; //Don't show the dialog more than once SIM starts. + + + if (Request==requestId) { + QString remoteVersion(bytes); + QDate date=QDate::fromString(remoteVersion,Qt::LocalDate); + QString currentVersion = SIM::getAboutData()->version(); + QString majorVersion = currentVersion.section(' ',0,2,QString::SectionDefault); + if (!isUpdateNeeded(currentVersion, remoteVersion)) + { //If no Update is needed don't go further. + if(remoteVersion.right(4).compare("HTML")==0) + { + upToDate=false; + return; + } + upToDate=true; + log(L_DEBUG, "Update::You have the latest online Version."); + return; + } + + if (!show) { + show=!show; + disconnect(timer, SIGNAL(timeout()), this, SLOT(timeout())); + msgret = QMessageBox::question( 0, i18n("Sim-IM Update"), + i18n("A new update ist available.\n\nYou have Version %1:\n%2\n\n").arg(majorVersion).arg(dlocal.toString()) + + i18n("New Version is:\n%1\n\n").arg(dremote.toString()) + + i18n("Changes are:\n%1\n\n").arg(this->m_updateMsg) + +#ifdef WIN32 + i18n("I can now DOWNLOAD the Update\navailable at: %1\nIN BACKROUND and install the update\nfor Sim-IM, automatically after finishing.\n\nWould like you to ALLOW to carry out THE UPDATE?").arg(location), + QMessageBox::Yes,QMessageBox::No); + + address=QString("http://www.sim-icq.de/setup.exe"); + + if (msgret == QMessageBox::Yes) + download_and_install(); + else { + msgret = QMessageBox::question( 0, i18n("Sim-IM Update Remember?"), + i18n("Should I remember you to update in some minutes again?"), + QMessageBox::Yes,QMessageBox::No); + + if (msgret == QMessageBox::No) + this->timer->stop(); + else { + connect(timer, SIGNAL(timeout()), this, SLOT(timeout())); + disconnect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(fileRequestFinished(int, bool))); + connect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(Finished(int, bool))); + show=!show; + msgret=0; + setTime(time(NULL)); + this->CHECK_INTERVAL=60*20; + } + return; + } +#else + i18n("Please go to %1\nand download the new version from:\n\n%2").arg(location).arg(datestr), + QMessageBox::Ok); + address=QString::null; +#endif + } + } +} + +bool UpdatePlugin::isUpdateNeeded(QString& local, QString& remote){ + + /* + The remote-String in win32 is generated in following format: + echo %SIMVERSION% %SIMTAG% %SVNTAG% %DATE% %TIME% >update.php + */ + //Cut the Time away + remote = remote.trimmed(); + remote = remote.left(remote.length()-11); + remote = remote.trimmed(); + + remote = remote.replace(" "," "); //No double whitespaces, because scanning is wrong then + local = local.replace(" "," "); + + local = local.section (' ',2,5,QString::SectionDefault); + remote = remote.section(' ',4,4,QString::SectionDefault); + + QString month("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"); + QStringList ml = month.split(',', QString::SkipEmptyParts); + int i=0; + for ( QStringList::Iterator it = ml.begin() ; it != ml.end(); ++it, ++i ) + { + QString search(*it); + if (search.compare(local.section(' ',0,0, QString::SectionDefault))==0) + break; + } + + this->dlocal = QDate(local.right(4).toInt(), i+1 , local.section(' ',1,1, QString::SectionDefault).toInt()); + this->dremote = QDate(remote.right(4).toInt(), remote.mid(3,2).toInt(), remote.left(2).toInt()); + + if (dremote.isNull()) + { + QMessageBox::critical( 0, i18n("Update Plugin: Error fetching the date of the current Update Setup."), + i18n("Please contact and notify me via noragen@gmx.net about this issue. \n//\\//oRaGen.")); + log(L_DEBUG, "Update::Error in parsing Version-String. Perhaps you forgot to set SVNTAG and SIMTAG - Environment-Vars"); + } + + //local=dlocal->toString(); + //remote=dremote->toString(); + if (dlocal.daysTo(dremote)>0) + { + log(L_DEBUG, "Update::There is a new Version on www.sim-icq.de"); + return true; + } + else + { + log(L_DEBUG, "Update::Your SIM-Version is up to date."); + return false; + } +} + +void UpdatePlugin::download_and_install(){ + disconnect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(Finished(int, bool))); + connect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(fileRequestFinished(int, bool))); + ignore=true; + downloadFile(); +} + +void UpdatePlugin::installFile(){ +#ifdef WIN32 + if (isInstalling) return; + + qint64 pid; + if ( !QProcess::startDetached("setup.exe", QStringList(), ".", &pid) ) { + QMessageBox::critical( 0, i18n("Error launching the Update-Setup"), + i18n("Make sure the Sim-IM Dirctory\n") + + i18n("is writable and you have rights to install.\n")); + ignore=false; + disconnect(http, SIGNAL(requestFinished(int, bool)),this, SLOT(fileRequestFinished(int, bool))); + return; + } + + //Shutdown SIM here, because we are now ready to install: + isInstalling=true; + QCloseEvent *e = new QCloseEvent(); + //pMain=getMainWindow(); //obsolete + + pMain=GET_CorePlugin()->getMainWindow(); + + (static_cast(pMain))->closeEvent(e); + +#endif +} + +void UpdatePlugin::downloadFile() + { + QUrl url(address); + QFileInfo fileInfo(url.path()); + QString fileName = fileInfo.fileName(); + + if (QFile::exists(fileName)){ + QFile::remove(fileName); + download_and_install(); + return; + } + + file = new QFile(fileName); + if (!file->open(QIODevice::WriteOnly)) { + QMessageBox::critical( 0, i18n("HTTP"), + i18n("Unable to save the file %1: %2.") + .arg(fileName).arg(file->errorString())); + delete file; + file = 0; + return; + } + httpRequestAborted = false; + Request = http->get(url.path(), file); + } + +void UpdatePlugin::fileRequestFinished(int requestId, bool error) + { + if (httpRequestAborted) { + if (file) { + file->close(); + file->remove(); + delete file; + file = 0; + } + + //progressDialog->hide(); + return; + } + + if (requestId != Request) + return; + + //progressDialog->hide(); + file->close(); + + if (error) { + file->remove(); + download_and_install(); + return; + } + installFile(); + //downloadButton->setEnabled(true); + } + + + +#if 0 +I18N_NOOP("Show details") +I18N_NOOP("Remind later") +#endif + +bool UpdatePlugin::done(unsigned, Buffer&, const QString &headers) +{ + QString h = getHeader("Location", headers); + if (!h.isEmpty()){ + Command cmd; + cmd->id = CmdStatusBar; + EventCommandWidget eWidget(cmd); + eWidget.process(); + QWidget *statusWidget = eWidget.widget(); + if (statusWidget == NULL) + return false; + m_url = h; + EventNotification::ClientNotificationData d; + d.client = NULL; + d.text = I18N_NOOP("New version SIM is released"); + d.code = 0; + d.args = QString::null; + d.flags = EventNotification::ClientNotificationData::E_INFO; + d.options = "Show details\x00Remind later\x00\x00"; + d.id = CmdGo; + EventShowNotification e(d); + e.process(); + } + setTime(time(NULL)); + EventSaveState e; + e.process(); + return false; +} + +bool UpdatePlugin::processEvent(Event *e) +{ + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->id == CmdGo){ + EventGoURL(m_url).process(); + setTime(time(NULL)); + m_url = QString::null; + EventSaveState().process(); + return true; + } + } + return false; +} + +QString UpdatePlugin::getHeader(const QString &name, const QString &headers) +{ + int idx = headers.indexOf(name + ':'); + if(idx != -1) { + int end = headers.indexOf('\n', idx); + QString res; + if(end == -1) + res = headers.mid(idx); + else + res = headers.mid(idx, end - idx + 1); + return res.trimmed(); + } + return QString::null; +} +/* +#ifndef NO_MOC_INCLUDES +#include "update.moc" +#endif +*/ \ No newline at end of file diff --git a/plugins/update/update.h b/plugins/update/update.h new file mode 100644 index 0000000..6d7145c --- /dev/null +++ b/plugins/update/update.h @@ -0,0 +1,92 @@ +/*************************************************************************** + update.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _UPDATE_H +#define _UPDATE_H + + + +#include "cfg.h" +#include "event.h" +#include "fetch.h" +#include "plugins.h" +#include "mainwin.h" + +#include +#include +#include +#include +#include + +struct UpdateData +{ + SIM::Data Time; +}; + +class UpdatePlugin : public QObject, public SIM::Plugin, public FetchClient, public SIM::EventReceiver +{ + Q_OBJECT +public: + UpdatePlugin(unsigned, Buffer*); + virtual ~UpdatePlugin(); + void testForUpdate(); +protected slots: + void timeout(); + void Finished(int requestId, bool error); + void UpdateMsgDownloadFinished(int requestId, bool error); + void fileRequestFinished(int requestId, bool error); +protected: + unsigned CmdGo; + bool done(unsigned code, Buffer &data, const QString &headers); + virtual QByteArray getConfig(); + virtual bool processEvent(SIM::Event *e); + QString getHeader(const QString &name, const QString &headers); + bool isUpdateNeeded(QString&, QString&); + QWidget* getMainWindow(); + void download_and_install(); + void downloadFile(); + void installFile(); + QString versionurl; + QString m_url; + QString location; + QString address; + QString m_updateMsg; + PROP_ULONG(Time); + UpdateData data; + QByteArray bytes; + QByteArray bytes_um; + QHttp *http; + QHttp *httpmsg; + QFile *file; + bool httpRequestAborted; + int Request; + int Request_um; + QBuffer *buffer; + int msgret; + bool show; + bool bupdateMsgMissing; + bool upToDate; + bool ignore; + bool isInstalling; + QDate dlocal; + QDate dremote; + QTimer *timer; + unsigned CHECK_INTERVAL; +}; + +#endif + diff --git a/plugins/update/update.rc b/plugins/update/update.rc new file mode 100644 index 0000000..12d13b4 --- /dev/null +++ b/plugins/update/update.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Update check plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "update\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "update.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/update/update.vcproj b/plugins/update/update.vcproj new file mode 100644 index 0000000..2e0c494 --- /dev/null +++ b/plugins/update/update.vcproj @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/weather/CMakeLists.txt b/plugins/weather/CMakeLists.txt new file mode 100644 index 0000000..ca3c3e9 --- /dev/null +++ b/plugins/weather/CMakeLists.txt @@ -0,0 +1,28 @@ +################### +# weather library # +################### +IF(BUILD_DROPPED) +SET(weather_SRCS + weather.cpp + weathercfg.cpp + wifacecfg.cpp +) + +SET(weather_HDRS + weather.h + weathercfg.h + wifacecfg.h +) + +SET(weather_UICS + weathercfgbase.ui + wifacecfgbase.ui +) + +ADD_JISP_ARCHIVE(jisp weather.jisp weather_SRCS) + +REMOVE_DEFINITIONS(-DQT3_SUPPORT) +REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) +REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) +SIM_ADD_PLUGIN(weather) +ENDIF(BUILD_DROPPED) diff --git a/plugins/weather/jisp/0.png b/plugins/weather/jisp/0.png new file mode 100644 index 0000000000000000000000000000000000000000..b85eeb4e391e4f8efd98c2e0cebc95b5170af2f0 GIT binary patch literal 17002 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%0Ac#gmeSX3V1A~(#yVR$I+gHkj zZ5luHeZKx)qxVd_n%iI<3ErURh+xvYy3sock?_`CeYdRDjhR$JF7_7FML!Jd`IuZ7 zDJI2uGI4lltiJ+y?%lPw?5K9&ekjJ~5bi-~3Y5?@LRWJzG*EpZu$D8WTIVOaXs& zAnEyIy@?N$8|Hs?Y%eAV!Wu9OM^;3oWf-n)Irj^^cy6RWt$@8EPoC(Ug2agwpqC5y zc{nuy8sI-npvs$6vDLCjxnc&FE_Ju&k8jD6TMi8{5@+?}UDQk+=iN9Rm{WkAJnTD$ zK3Q!U{`6ome$V_0FnlMphlWz8dNS(UrdRYYTsVFCW_f&TEeyP~z|NPt9dq4P@^XX#YHwf`fc$ywx_(d_N~X^M zE?H42>uxmbqzX?gPrRH)XKRcrsUh3ktb#H=VM9>;A$a=4dR?#W9M0?jh_wPi{XI`n zK07wK<@Zwg>;~Z^upJ-l+nW3JmhL=Mt{bu>iM1n#Pmg}?bKm-vZ#{hU_Ks%U0)Vlc zPbJMLyd49E!iLqdVo*iX{w>WF8wTM&I$-ubupQ zG8ey5=B1;iX{GmW&5u>vjxDg^S<|x0L=fVz>TX4EZ%;_#mlclD{Xlfw8t0FX*$fU8 zy!Y+5y*x(m8GrTW7!KhIfoNWzQ-`p1I{9T@qP`dh0t3b< z5rTo@`Mbw*X<6j1kYqMN{Ic>*%iAMD(M-I$W^Qs zRclT8@OK{{2Uvm3!I|+0FQsDQfrpPQuFJA`Vx%vL-K_qT)2q3BAsO%?yPio#q9}$y z9Y4BU)1S3Mk`aO5R<(`@N!A<9WX=H0SZq;okDhnQ(c_EQcKk=*D3kr4?6_c?tjER( zM>oOaBVafzD)>FQ*yKjtT-!62EdYIree=1sr~Duo23uSL0EWcJf=&#*o44oQ1XS$F z*_DQ0D>ohR>|1y49*ww`69tQ<7{Y6c7%PtrsBd`W>CTt2(H<~C3A}vG(b_S$voX$E zd9H!Qubi%T12r{lWliA*pxbz;o0v}_P^4n&W$ zZz6gp@NMn*hmN7RC({)U-j}By$A^ud&Uk4*i0zU&Ma}
    TeIW_Tny>$j$A!C7vB>sJ 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%0Ac#gmeSX3V1A~(#yVR$I+gHkj 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/11.png b/plugins/weather/jisp/11.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc25cfb88e07f79bc3471dca2f098382b264881 GIT binary patch literal 17965 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/12.png b/plugins/weather/jisp/12.png new file mode 100644 index 0000000000000000000000000000000000000000..af608d0ce547863836f244da6513761db793c79e GIT binary patch literal 17567 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

    7`o2<%i!WxCLH4K(2t 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 z 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/16.png b/plugins/weather/jisp/16.png new file mode 100644 index 0000000000000000000000000000000000000000..861c888c59950c7f7d2ab29e68be04b97dedfc53 GIT binary patch literal 17004 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 P00000NkvXXu0mjfU&D5q literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/17.png b/plugins/weather/jisp/17.png new file mode 100644 index 0000000000000000000000000000000000000000..9f56e8f7dc267d9068654c67bf506b3b2bed5cc7 GIT binary patch literal 16983 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 P00000NkvXXu0mjf51My_ literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/32.png b/plugins/weather/jisp/32.png new file mode 100644 index 0000000000000000000000000000000000000000..64a746120d117f4592a0cf95b8be7af83227315f GIT binary patch literal 9904 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 i!T|T~_x$(&1sDLdLIxzD0XkFw0000 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/33.png b/plugins/weather/jisp/33.png new file mode 100644 index 0000000000000000000000000000000000000000..1917aa75ca36cc10e55202a1a797b12a0aa688cb GIT binary patch literal 8353 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 SwlPxx0000_~glt$pcT;aoj<8-Yy9IR*vWT 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%0Ac#gmeSX3V1A~(#yVR$I+gHkj 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 ADF6Tf literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/37.png b/plugins/weather/jisp/37.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b8bf8236c5a93fcf184c83ac4812ef06b19d67 GIT binary patch literal 19002 zcmV({K+?a7P)p^5zGu&T_B=es*aL&J zpUr!=0S6oyGA0Ow1ZpMJO08~n&V6&J98W%HzqNMNZMAI42onaEzN5Ogx=z(O|6coF z|G)M+=hEN$t=}T=d*A!Wi#`^freyp&M!u8B!ef-M0DkaE|2d$r!E*$^hy7>1UHMqb zH_ent7&0P=5up+zt_N=r`x}+uEixe!ue|zL)WN1Dh?CSxJ zgN^tAyifXI1Lz#=5Z=Q<7y1M6&p;Oxg$VF0iXn-7MocLrK@bq97ZC=BNo5kay^J4; z+a*cdB#PpeFpO+U>HiW%;Q~DWI|O|L;O`{5IoKG{E^f3B_zOT6Ale6!J^-CXbP(yZ zAMG41c%P!fuK>R05mCbE4vF1lBnn74cF*RB%4ydPemn@gH$;(?Wbiq@=XJs;n25#A zU)5Bl_3sb#tHFOcz%M)wz&d@viAS#h&wob1eW4Hj70?0LZ~!<0&-xKg7{s@zkWez= z8QyBi@XUy)ImD~@Y~nxfWmNsOFo^b2K`6vxssZ5BUdJbmMk~*VKO_jEAxq-lLiBr# zu|yDrG1yLNnsW4qaRx{)4eCDw{_5Z7AMFE9oWV0jIgfM%UFbjaXs3PfLlM9i2Gqg^ zkuLN%h;o9UvpA1#D*7yTLzbBPuVb0mc0XVT1c7b_Hqx!GOF|Vs7RIaHwqdhKp^!6r zUH|QbblzeZy5qXO-|bo*)6|!AUHu|_{{0b)n!XnZQN*g6rndigkAw8DNAo`i9_WPG zq#xln?SqbBJ3=3L1e-r&lmpN{hVEdCge!c`X@$`N=x_|83NI%C@PJ6^$d|XgkudF5 zFd?==#G0<_lE4p%3twwnK8d0Ts9z$Zqr*g&CDOATQmb~Q8nt4Itm1ppVMs=S>vzKY zeohdCn&+|AZnyQ(p`qMYDHVQ*L4N`8K_6%ix_uSs0623IbfFJE(u)V58*FSMk96P< z09@=#7>srv>F_&IAlOZq2`K#bL%KeQ;I)WYzI2}RP0Q59~o(1qc zLIqoFe(cFm`<-j8p0L@r5NO;2P?MAxx=Iv9;(+&h4sjfxXqrZnDU+zGMA|J2wk8aU z0pCJN%X5ikTg0;5gsv%X>U4T6olg8daQ%fJzDU0UJSq;04mQ{$l87WiC>fM=Yat8* zMml_s3!r*(pTjxW@S2a$5PBhOk<qa(^iunCH{FnxW(ja797z>&BuJ3kN=G*Nw z>9jrIa7Nf>_(4dzy$(>01wRM;XHYpH`yCQ9 z%p4VhH-pq%$mP=?pg)}S!U5md1epCI%wLRV1XLxO%7|6-2Y@SmkbQ~sIe!iyiX*)r z&HTH>!3TR+fo{Tw1GR)H0Ne)PX((;e>P>pR<5)zJMTqVMM6=3w^!*4x?oSj2qH z2KsT}P*jpkrbwsTC9QUckE@UtxX#0SFVwBqS~@VQcv24Evv##O+x0qAV-dmMhs z!24k%T|Oe>Y=RQ1>AK=Z5ugnKdtN_*LhwSQ3j}zXh_Lw(!QF0$w3>BNt*yi0#Ci0a zhKWuK22BF4S4gYV0{(Zv0!S2S>6%8p{o#1hIPJUPQ;;9-lO!S0?YjFq?cQV}VV;a9 zj7NU3pd+nt-Hj^6>4Pso%BSGR!!CeeX(X}~cwHxA2y!p%kjMrQeFR+Zdv-ENk{t9{ zpGNrWNHO++X7Jx3%2@_DBugkHRtD37hE`PN}ZkATp+cUl|DKG-maU949Ay+Q4 zEc0>GG#PkZA}&x+1V&1h1d_>Qi43!#R;vS__h7(0i1c})!}#f{M%Ky|8XooDI6gl4 zT1dpTbjFxZ#FOHQ6KB%LjvbdKCnpZwc+0O~1MDx8jz$qYn0BM(3F z4YCBFr_*V&ys`}M^T`s-1d#sn%*>{t)s>Z@XO@nVrR60uH-8zoTo?xW4F~r9da;;2 z^SuULe8nqXL2!E^tyotlPgE`d6mYsL=he*ld%7&Ro#g5V0)u2hkiG0Igp| zEs4Qq4qj6R?*q_Tsn6@EY;eRSw7HVtU+x;={EkVt-D#6*Wfhc8hnuQayG7E;B)Rq0+etoOAd3t0q*7TY z7cZSB>yXAsYIl%?g>NrB44xoqa3VQTjGH`000%H6Q_SII(Kh_nB%nprNjqOEe=372T?5!Dq$Ouo`;;8^~Cb+Im=I1W}&)4|RAy@;a3rQCwWCCVD zu`o&+jVd{M^che(UEq2JG=c{7Bob=IfwFAv@Zo3fNGA24e8n9%|JnBs^o1wTQC?NR za)swNN9;>N*g_{Fk=FtEfQv%_DKsG3P>1J%mth9b)*#Ab1DeqWgRlX9G>}F(001~k z60F}+3P20pL6Ys^Y>4#zSx0@p|iT$-;b<56I|fiImsZIgK1T^eAwCmDHOJuxgMS;4o!L0(uI0!cM2skT=BC zxpSB9o}Hck#PG;a?fX;Oy;7QW``{C|Z|?~QTp55a_Kgrkd_WpNuE@s-I)E9W9faR$ z6~OZbbh4pZVmx7jDgkiebA+H@VC103VDJDg3ePmfjD2}e-k0!LPV?w+#t(9dm6f*S zdUKpQP=!RmM7pW~Zv!|Gp~&x|B=RxFpOGfa*d)nji=&id*S@n9e-)ip@2 zOFRdFa)DVR!l_7H+vAu=Kv}A4%9>_u1DU!9UVQNT5b4oIJ$yhdSh(VK6`&Q=;r_t< zY=F=D@*xVUKnW1VtOy(MJ433;!M{}i0Pza&l%|LvYkZ?Hm(gBQ7yv?XAA^IAiC8Q} zmiFVNX0H_MT9FKVN^wGXAPw8V$02|n2kmX>8W&Wk*&QwiT>uUR)`pxEf#ZFGS|10< zwtD0e@OBe)eW6eS3eo^@AJYMRhQRlyz;3?ZkA(n|Z3=Y%#Q3IC7--jhpFsBqH0t*2 z;bfzp;%=Co4d9W(l|drx@6SlBuRvJ#`6LB(dVQ51)F#k;P75g zE|~;r9QAq!R7<72!a>Ix8kio4eiL}Q0BYCIRpY5oHkB zfF_lJ3y_3iGEH=%Fo zdGSga(26$L^sBZFO%CAG2%@{x}wh62vh0xA-uq^Mt?9xNB39K;O=c4}gR zQ%DRZ91p6 z)iMzXgT;r9XR@*6GpG>C16tW|n0>1+DhY_}IBX(-9l{0zI3p4f#0@O~!bRHO^{Rsa zU=&p#tyaH8D=QQvAId-mpjxD|UMI(%dyb%}ltJ{UGDNeIBo*7?+S-9nglPgo3U#^9 zwYo3>8L8#U177O`-lrFIr^BTJxp?scIeX?bPsBQC{#>pIvr7dkGPsh7#o{EJ%aPUf zRoZU1bIYr>cP7*6Q>LkX>AQ<`a#foIkN9v9<>4U8an*;vUwFRm%T11Sg<7ZxfNQuJ zumPU~fl5iBl_A(`1fslfwe`L7jGibK1C0y}*6X3+QDACQ*es$#D)7KXN{|Y4NCUF0 za1bJpimNLg7^J=eLBLV&;R96*8+<-e3ma@WAc5!beKBknx-Ce)G7NN&S0izd$>4qE z@){W)9tC-t zt^hrF4Hq6Z)*Y@yxi|oyT{T5yNRp^hjQ$3|izXz_B7lw2ogNr3_WZ`4|CxdTmBbXB zxJN4W3fIuZVj8A>G|?}2hTbM_3WL2`5fbe#TZ^<{|OWGc%ew%w{j z!W1~@Aw+iwd>=DZk_PEWA^IcVCWYcKuSnwlsOy(k7D)rXy8~)RgPf1$?m?W8JQGSEt>TGTHR!R8<}k-*9_TE(s^#s zK~vApZY2ir?$qQaNO%e)!Vv&G2H=RqvK*d3(cDbWY~%YJIr1#m`B{i)Ec2c?{tN)9 zaCL;TRFOph(BcaoV`Gy%;bJ0PoWH~e8IvrF7%wHq6G`~)I1dOFyq>0+;@VneQ@vgX z&rk+QTT892t-WRIwwY%|QMmYRKxbEP^r}thqjM!3H^`q10GIk369*1c;*CPsG(>S( zPlI`kl+}9ym0a1P7yeF3m!#wCcQf-p8wN+9A z9#16G#Dn~R+TL|Nz953{$8}dxsDOk_a!;@@e-ZZgx%3p^4cS~?0Tm^|tPDj_ed$Pl z-%sC!pwNE-NI#P409<<2qJ(f&GJQUQU=fRhz5zZ&Jnt)VUWCV^tH0+;q(_iIqX=Xl zS@jY*=4i=HImr--~OolT*`R zpr+th;=CM;C5Ka|Pw`p~zCWMKG-tQWd=1Rg+{-QP(yKNA4zd#P1Z-H8GEi6#)-$nM zh(9O$3lF&5hU=TGzc4{JOcLyii8BiS8OSe8pbXw>dwH_3#7L#;al;!+6kyx}h{`TR zRLJWknQWd%^ZNQKD4Kp5*U%0A8Fk=atjS<9MErf!*N_Jw`~biSK56T<3hxMToE~X4 z8azkDA!2RN{auJ)hRGHN9|vS+dNY`%J4mfs=7Wsyn*^}8Z{JN4Kr!o}Y*5u$0K70L zC!40)z3#yN50-`tfAyWz(*>f%0W<~XDCjfRi-SA|U_k~(xGLo0iamfHC1C^LBX})J zaDB&r4&c4~-}L@#gY{=-zXXp1;512AYvbhEqYbjKSS21LygYzgf{)8)6*3NhUAlCJ zR4Nso&~RlRlWL>cMYwIRZN-;mgSBz9uHiMieK1hURV@`V?_*}TsEp17 zHWqpCIVun#>z5VW=Yfv~z(e$Py)ER((JDE5>>{s)t7?qPH*6NdN2jAf#D*}%+c5PB z$pN6K%dswwkzFpk#DRaq!$((&#Jg#78UUCCZXV|pRI9DSzjZOmL1bFM;}+*>#0Ja4 zC?7Z6Dql5%*lWX}o;!CEBQSo$@u^GazPgcc8&30c>)~_1U_RpV0vey|2hTQWe~N`j=@$#wGj`VvIc2-&r3FG$BE2NhL=vAzt6 zEWwWq>mn!{L)N$cp6he^nHU@8`{SA@mIg2yaV^ybHNtoqAmBwWI?x0-GqAXZ;NuJm zAc-QENL4KqC9&sl4!0#?R_xPHHJS9cc6s6!ol>{xH^b06JFG7YexdhLHZ0Lj6w!qV; z1>!BxKDWOxS-ZXpCm4a-GswvB7}>sU4@6%80JS;bn6xnJ3Wa{7=-D&J!BKj=v}*(4 zc)~t{i1r`L@c=%`NguSl)#>sTBt@3_7~=}jM&ic#h-L|WD>q7LqCj-v`y)^zNLPA1 z20R_-u;B7wy-|kQ*5EP~XAPPtALtN^ZUVrAgATtJJkR-+R5~$JDvf-4dS>!bU02-~ z0iBBx#?SU%zYC75CrJvb5cwAarULiCS`C?8-Ih zt#58Lv^V&HG+C~!>&<3U#0W~Ivk-+deA-)fhhgLdxY{LvW;RtKQpz1BuD)kYP#5;0 z{tBP8jkv<=L4RitbpXxgpw59QDHMiy^$_{;;-!n^(&bBJdTJ9S!3JNTz#0p$ z0AdSu81N#N3-T=m`g(k93>TDvcjrh8as$diG)n=W4Fk}l=W`v-5P^F?#`8(P*ul6` z!ZI?ZAH$4sd5Lv;NJoG%m)?b^NVo8LygaKp(siSaf% z7b`^6&i&#wi|g{QE-zPa=yuoRaKJ*d)#9t|*jEw+jIYY0TjP8L2ZJ(7)iikS@smYB zEIUJ-)LkTDZYMIWk!E)bnP2Dv{dY;VvJUFy8U8*@84^}{AZja>HQ@FpXyrw&Oe*D7 zKFzVN&LC~{qul3Fmrm!%*pA&~cz75zd4{xczqJ)UNSFX!;Bpt=50rxR6mhDf+@WG5 zBf$Ms!+459EzhqY1Aw#H9ABT6Wew!#G^nX_oYv5e;H<#DdHgq2H%L7|eaeYrN8X)I z$E2z0$$x;4sl7Pp6R&1u?u)cvE|(Z??$9soSXlJld-m+*>zmEG*6Flh+RI=@M!=${ zdAl-pRv{&@fbpcpQ}4iZ;7N61ilSM;{Or0(QW0~YC`LHI^Yil%iEVCh5f}tq)l^_O zA6~D)3HSKPVrkdKPF$->1{HD0*8%W$$P?gjX`G}X!p0$a;)$ao!6ex2_V_}!=k^B& zrC`4{zR`q0`?N4{q+szY`6lYR4mgWnD>XXG&or8iYkO8t!_FsM zlbjr%Ajw2xP=pd;YBHFDEl>(;T*4LeMLsY%KzQH?5GE!Kq?^K<^+T>8@Z@pv7!^PS z3Iihh=LFn&T<-$03HfSO2wbi)-UbfYOap3?9LP)d>5y$-p2 z`8;s>GB5q|OJ)MT;xmZwzOqHIdA%K(MG$z+1Q#@L)?jd8gm084urz?a023{?Thl?E zJ_Y(cm(2peD&K!;d6BQvZl2i&(lW*6Z#)shrd9okClBpDcI?>C+ zIIl?KU~%fB{aFwN{8~$Xj=6jW%-5#AtpSR|=pIIXkmY{A49uuhDh>?L=CvP~DM^@7 z!=s}kI)MJdNOy;B$u*mupKGl*|BqU=y$dB6(g6aCk%ASrg@sGpsGyZb`D9@aA#Z<> z`Sk&KGB^kg(6kus5*S--Wlkgw-Xo3)2ooGu^twIdY)C?I1o=#gm*eq!92=t4mw1H2 zX_0sgBRb7NM*TcDcb+Fbo>Nql(~Rr8{be{xdGsTI$gdukcTwL6ZLEoENb764NDWf-t@mfp|2E78lL+7++z|2X+6GA4F zZT!SNZ(V!=z2HH(j`ymSrSgBebm_uGyoH6ka3gbb7pV7nkI)M$YX!rx}017=7!%0eb%` zJrRyw=jX?l^Z-!G|0BEr);H+=g>LLg#)4=(5$9D)oRQ6D3)o*A5K>B%lp4u3X_*{X%ScO`zxlv7-vOY1@CxY7W;Y36bZs&b_w)HIAHg7i2!WAnmb+YUW0A;**9hmW z5T?D#o9wZuge`1c;9n5x+~HyQ6!kjVdw$gfUj%^J5$jV9r!GP`O*O&5;MH$vZg9GC zdFMyOj2ryB5J)eGIQ?W&I+*|kg;hRL>KCdo05E6ZMPC>YLqj>BE;we?<^#2XjO_Cz zzksh6;ou@IA@T@JUq;ftDGK}b7-x{wHAUnD(rR@$Pa~~jG~<9^5O8zGXHUPcW}{#& z47v~ko`9)#@xu96f9M0h`?+6#@2{QZpu<$o+qUPzj!zecax;{M!$2uU5>5s$o)T!p zm%>nXA+SAu&_16D)oO*S51h&*>X%XRikU{U-H#Z&*a{>V+VTjVHPz?MoL$=CnZFJE zz7ElXlzMc%Lm|uLPm!Plr;fn_=S6BKI`Wl{6K2UAQYyHxnuu&oA0l{e$O_G2` z6v`7ecid6G0EZ?EX*U+f+8>QW!p833KIrLm@`9$h9|Wx$FBY>&f9vK0@TETw|8yga zuv9HKL5i*N6?Xhq5#%3od$WaVrpGA-jSS;XZ%~M&eP-m&5l#*%1XYiOy#`#J^w+eJ zHn8N{PlQ6BGe&-@j7!JT1q2KP>>{O5mMxcG-}8F>n()+Zr~ z_aSGkfEKOQ%RIrM3&<92jl^P@}Go29&sp*SD ziTD?R_F8zH0J03TSZTK!6sQbAFK4saW5uE3GcS7i3jofK;8#DheBqDZGW6W~uc;`nz`TIIrtUq{sq0ab}Kgof)NpA5uJ5*gt$( z*OC76Z3&~@wazQD^exElW2$E4RKqhR7(z2<2=E%!WT^?VEp)lO6Qr^6QP~ffGReeEyYTu5{1E_x&r%vlXM&_$me3~dW=>;88xDyJtwfag+_}Bm9BY{#~_K@ z^G~YAh#{(DBSEC(EY~%_3JIPU@g5W^jFD1F1aKKRzcxt3GC1YFYQdRH1({#MjzBjX zb?%9)h6@!3(U9PtP7) z(T#gxc0D?tDz#6q^pu$~$^HE2zY2p)=+3Q^k;ExUeeo*eM&ak`d!zj6BW>%KUy=H2 z(8OP8`ib$tn0?(_?;4Lo1eI)A-IL9vj*X;aUy%gQW_~Rzi+&=W8lLn5A-A?VrFMGV zmJNy9iOkzdxg6x8Zo%&MK*|eYEUq_G>E5Hw9!U~cYPnXoZh%&5mQVB9OJxz|CJOeT@%jqPW%ad(8c918ZevYKFx}Qqr z>Qh^`KWyu!C3Na!B9r|HXfY+BncRg{B9j(V3j4MT(=T-+nm>K0i5FdUzxAm@Z!~nZ zbM0;Wey5j;-&S+Gzu>mr_qvuPrA)t|ORkm66(<@UXVG=qbCgz>nV{IqE&V-FU|mpz z_2c6sLt|1YVZw|MqOiAiX|dwSYEJHSdsR~v8n&-VR-lw%qKK+2pY|i6N2x4pa5^oU zXjCRWO^q$da%St+SsiOzC_#s3TV zXnrUbKO0cVOK6leDvabJ4fr$&zpGo1-1p%R-}>4&-|ioI;$$oEB55`39gqn93UD-} z@+cEBOZFl$qH-qT**0zUnq|*7+qIrL3bPc{eDs*(S!Y*P&!32Cp)@o!IoY<`y?`Y) z$yBa_3~TB}QC+KAa>p0%g6IPGr8%}M)garCDq2Ew-7sY^Y1w!6)YuG=2S^~-jd=Hf zW!q85@&tGf=w(Q-@H(0`S&x$#fQF_l2WBmqP61EXL1G$Qo5P0?8GcqZldriNhDx?= z-%d`RTVR{E?xtYjT}-H3XD6l8mn!Gexzf?kfBDIHDqZz%yDOG;1HY6tjQ2o3YpDY3 zZW>a<2OqyE`jN-p`L^5HcLe(Xd(SxANT!c}>Qlxox9_>Lm`|;D+Lp8GIcX-cWKN2G zl8V}7Bm~JI3Tt4fa&4QnJC@H}pRQY8%&T_jZJ^~{MHA))L2ff9L{y2#6+NTOpRY#% zX5@H5%`nqm*OTIwAC$lY#dDd&$ta{9H`JX>x|m#Tx%r66zyNYNrmK_b6y8)PgeVjM zVCpkT@5Ym96J(s^yOw|rLrjj5k-SRkwJPWJ?OUfAy4rZE;LWW^g09kN+gQR^wHQrh zi{{v9(Jd9zA-G&I*#X%NR@;!(Q_~}<85O3^dc(c<{)bK$OA{rzRqyJn?fPp&7Ih|5 z=|i}{6f4HPdfQ^)?={DkhUdK4beS zqw`(Y?HWchTWfaxR?k_nJ)_li#iHZ8+aP6qi%N18bd7@r+VSzN`?@{5YXw?X7u2%r zhg~>v`ENe?^e#zNZr;6fJd7EMR;}&<=ckgYZfcEHKO+#SOqmoygi72UwnH{NB+{6s z(B)SAB36IQR4N-qRz{CGwg|e_G<8W-Qo_X4mfn`>5xQLNEM2M{P4AsdblZ(~ckABG z=a<)evvp72KW3yK9vvOpF<0&#Z7}jWlZjt%RC|S2>>G<;T4~*P;`D+h>FNZ~Q5%9x zuzh!TLRCK?QrZj^*_y~0{@GJ=V!7HOzx>m8e%n^*fAzjfBc;sdT@%JzPanVV_Mdpy zYYu^Bnb}(!KI2m1b%G>r)+EKsrZalm3Y?}Db`Cy1uYdk4C$DdIqno3U`H-BB164Fa zB3ni*B`4#lku!7kE>3Zvfhs`d+;{Ne^rkISSu-9>O$--S9hWXRp4{8Asj#`+3Zx*y zyr3z3hl~JBH+u#yA5!p1UNT8#p+FiPSVLj+A)Rl`?ls{f5j;w-ETd`Q;)a>Tz z`G9JN|L(Jo+oMyX7uKttTBGGGR2%mCdOg@7DB@x&sTVNU99^pA!J!6XAS`SeP7EUk z=jI#7PoH19W_EV8)^7Dg_`>Nh3jK*x`pXd&J9<`jSQN11XP2p>NWsg#DB%6?fBy?! zEI^c(XMTpBy|D6;pZtZt{Iz4J=YRPP@4jO*$i=y&VcY>U@LI6y$GmoLeSD(0ZLMxu z}SDXc~`^mVWq%M~mNr6gb!bC?``FzP zf(T4XOg$pRB{+A1&98QBSyC=#lj@$|{qwI^w(pvBV89pv7a59dx4QlqWKn&5JYjAh zOJ|nr?)|psyeXw>4>#M^mLI)&TXC`6eejF-J~8&=Z@gtan@Rd7pSz@F#*(v!EdPb6 ziZ#f+){L15PM(;jw(GNB_^DUCtXnI-WTY1^{0+P3)%xi>Zr%PfKljeN=0VYJ-90?) zn7aO!@j|MUi<=iA8F`Ku1@)HO`OKG|eAE7$cCO2y=fFF-K#M1dq;vu%1~JoAGpX3M zCoZfXRTPa{PP8V;n)Srtg&Yi{hjsfgfNCWiE!1!QJfUj5o_nIYE;y4idpHde|? zg=`#hZ{QTN39umK73s9@jppNNaNg#Tg&LRdnjoJnW%MnG!P)u7lb+{i_s!DaA1~*&ZBm8$`IsWRW10McsbXTLn2=8d zuJiEL$^5oP+v$GvZ|=L{nj5yeAXC$VC`3)=KE7dj##Vkhz`*dIZH{S%lxn=O#T zM7$K&#HRCWmvv%y`jD z7}|QSkkvybWcKYEQnrt!oL0|2RqeK4V@mQ<%~o&pmDi5v+CA?qOxdns>K7h6bncb! z{hy!Kx9pz;LKDB7HuP0dV%GLz&Rk`CVu}@$$%$I6 z`)BhDwS{)iwf^aAPmgTbJ(JZ8bvX3>tUzcCw&x;2Y=#l_U^YZ!#l$<#&R4%AOR@=$ zwXC7t6J+7|$+_(D6N~#pA{|X&d4PFc8 zPFmBmljD-ofNZf|_ZoH>)mch~ zppB+!XhN^&1g)NX{{C;B2}VoBuQ{#&l%&X8H^pyw@JOSKclZ;5GSDt6qL@gG*OuvR)?QE*D8a`Sl_-We&gj;>lsLlvMy;`eAk=# z*gt&ZXeyOpmP^JbMiO60#gt_ToYhZ#?xELTJT<@G?l|VHdqzefCpD`b#|k3BF6Pti zpZ?j`|HJg&ks+9Fj}~Hy1yPpl;~72puh{l9duI;hI zC+62-TGka+7EN6l{p4pK8Gp?iZpN%V;krS`>)EL&W&R_uK~tbK5F|>sZ_54V;(GgI zz_&S(MJt*lTB;((-5#=W+)#_nL#apk<>;!UD7HeKYiNxc)lqccGi;0*i z(q4}d%OMUf+#|PJept1^4}q_Aw{9{w!M@_kn%&(wn~LEg|GA~M^}4%nX#deizjC(Q zwa@<88*Y5`!hH7*Ns_9`l=?`*kl+5_|Kw};xsLam8PAm8ERB_n-!>nnwx5c0l^0#oXc zWrV@1NOb%D>23ed#~zTjZJik2G*;L;RmvOrWK5-D)XW!hCn(-*lCto+ZKW|#Vukw- zT{@&|isc5Znn;);Bs$h{d;=2TW40P6I@+7J2p}Ok@_3f5YQNK`+hTDe%?=!V>vNZh`X@BEAV^|Bli8Qnh;l>^0S7 zy15uv5CWqJH}6Zn`MLAGCjz|DXe2K4#W4YLiOd9KGt_gaRC;!xG~Dp)nG0SI%k{I< zYT|}%+O{+E&Sl#sjXSPQ+^|^ok6TvQwCwO=qZ6IzS&;+BE7sfIu9&GkI+WIizV^sT zmK!V5C=8uet?i5!6a6cTsRW-JU6fU@f3n0@TJ=$|{Hqhm)EO-y+iUB(*R57a!*&Nf z1K%Ui@vGMaPga=Fg^g{rp@FCfhjQ`FU{0F4sear2&4IPi%klg-1y`tA9(GdCy(Fi_<_;2oL#{AZCNzt{6G$hSuLf? zLh8ZiT0Mb@i%~$a?;SLR2uV;X6tW7IwQ<>w-!;SaNw?v3L7zp1D6~~D(LCDNalko=+9(?vU6UE{|H*ojLL^uQklDl@> zNTJ^GTpId^El8wP)#4xoylStzEvagsHASJPIHq69Nzqbe71F!Fe*W#ZvVRNc|00nN zZ+RtOCUZ$77n#z%a@SD6eRi@GYxTT#rQGc7zkX-+k%y1|+AqHMuYZAp6T0P=y?;w2 z)xnE=;-;=bQ2(Eg9b0)D7!T>=e}Dgv?btnSce>UT7^fvL9JlF;`DNdiTq>ygt8dEP z4U};TJdLS`@)=y?6+|kl3KJ8uvZ+|;FY(1qAR|c%dd!#8x~^FOxT@3k;<|5ltf=uL zH)VFL*243)9XJ%^V#q|iV_N73fwWTfu7O>ix%bPD-tx9L9ng<0x1$KjC!lL^jMF1S zDY{&gWl%s(8*Bn-D<-O(o&abIwSYI@wR^xwY+Gg1K@&1 zL#h%X0@ZS5B*DtFozumgwU$?{_xuKAW?^!Pt(?wO04c`m0Fpj=LW9LDahcQz%#)ssazwlV&xDZLJ z5*0k46IIuUmQ>{8*s!W$l-o8VF%u?qDEct|8q5^7UJuK;l#n`jxO<9H#h#sz_Z)o2 zdMFAaj{)FOD7wIFU|ymG%!m>TyU*^~HF;+wsfT4n+!T|QC&MT*kuu{6^WmjR_YsfK z$(W(%6-lm^yUnSjrhP?{1WQ&^ZlfcHU$}3TIyl9?i^q%73&=zv!(s^r$m_Xm(u_*!)G{QV{PcKMZ#(2~LXqt&WfGe~@^oF_tJIqv{qH~g z^&4Q&{mZ%=9DVBJWPB1^OC<6=1AS=AoxD>X6icM=7Kr}C19HA*+i;;=w_4>!4~)1F z392eMR(A>{-Lhzyf}*LqAjrY1uAcx3A=+?Y3KY9Tt~` z&A$v9?oXW_+&AAIs>_Wrj(eVR6J#eQM{0h&kScxTUX?hm)2L}#~!~pJUKI-Pnb#X z_=z*D)m9haz)?2@aksk40B4Pw09rRCPi#Ef1mZxJzuHAF2X2-MfN=FqvyYCd^ z=~zcKlmbjw8ZZ{@7|(q0=~GL;1k?5nlQW}pfggZEAlAxib3LGnDhkGtFfafVP1v<1 zKH~+Xxlr|isg=v1TDIh}{O{|KiMo~ zszH#BDG|6{aegIQ;n%kl$-+i7Dm%Mf*WV)xwDHU{M@DYHamx%4=h;+D4@;S3HJ#8i zR?iv^1m$-@X|YUP>%smH)*IcY?*H;rKe}Vr=F@N<(aNF{oc+g#*xo(YQ#T07cl)>k zdSS~QyjP5p!QBA*w?yInV*9s`#>*|cQmuEIpeZ8LR0Z3yi>bJ3X)$e5R)n-J%bm$m z0{EAX{Nk_w?e+WiZ@mVX;v&Vu>WE{KG*A*+Nv*S6*-a{1*=P{z`x} zLYUO05^G}HPp8WW$j9X;F0{XSu@T%)Bcdh~f{JB;j>W2wWQFUt$veJz*sh796u$Zf zefPn`{+FUKvf&&Ma9h&6DMe$qG+SXLg7l211vQZHdL z*^IH*fKlC|NYbf%KJoO-MDEAHkO`$s{5oBwNlhV%zxew{q+CApU&Fw&Isxrmu6VW2 zf9|2_{Agj?FpSH%*4k?KtW7$Pakp^y67Vo%Dz4^Xxc^~0d3P)luog}e*O4yu$WZA)c5sSik2^?%3 zm@JbJhBS?kauvK$Na{E4RChgb%5TcDvbtqL79T$rd@1ya6$G>k?$u8uf;|%jeUImc z?)Y%>K3x~AYp$7n=>BgWxjvJiQ^1y)uOB=qvC!}A+r9If3YA?=*8+&TsMG7-zJ1%o zvZ<+%=B2RLvHd5HULZpwBj2-o?Fv^%I(DOObfh8}4y4nRt|?%8{q>%2E2<_WbY0TK zXn1@$pWQZ=j%AbDIdGVBcU(VO`lG+R|7)*#)&BZeDJzT*<%E$!Rx0JQzC>tRHxkP% zN>l(%h;t$Vz|+Ssc`Y%LE2%h@$FtHc%GDTbUE9%Rlyp1Mdk5C@~l)Dyi%vfAQJt?!0YJZ~J7)-#If9 zObzG6C$t}cjzjrs5mae*YNdI05&kJ^NDnQn8OFQ#>w581$1vg7=2cjF!cOSM^azPA83>H|^iDqG2IN68$F*pHJ26op0i$ zGVlJ0+t~LU^p&&UWTnk_Ub$)zFWWAS#05BjsMGGclBNq%!Vuk+WkU+xc^XFLdefx` zpDr(LnaP@t7o3cl+RcS@?3^qJ1z8}YRHsEjB&BDMobPVk{+4s5E*aAkN?|-F-aR+Z z!fVG&HEz%?g#yiwj#5%CGjj5Rz0e7iuloV91tW^P0A{TwB#T3o=%zRU;EsLe!SyH8 znW!{60SyZB^_*h|53a5zvjRprB+$?T%Ws{&U_X3eej&Q)hT+FT#{WE+DpE*KBy3lj zcJi)khi_ePy1x{HgQfzgdPSEVj|LN962|hX8o0u6B0)yxF0IIlEdEdF%AfN1e%#8N z4q_aPXxz|*LM$#W)?1zhx+%s~iS}&KcEK8YwE3mSF031dKw?H(+%X!@-~0615!ds( zhDPt!1Yrz!{^q%P^Vn`hk?F(%SLUk(*ni!<#lyH6A0vwrTNzpidq?w@_d8+@Rg<3c&A? zE9%S_1R zOoFO;HBrg%+)~s0%oiX1nfJW&N8ES*)UE9M2Kwr`2YJc7Fmne*UdHf1&o5{i4P#(& zx)n+Cowh3It|Txpsvvshf=Xy-+e*1n76f&@XGtwpiCk5V!VuJKqhoJAa9#0RfvgKb zAj<;C6Hrl|cF)!iY)g-H?BFlJtU5B2A~ymn9WY;_-R^@AAN}jk?V9{}%n<2^{_IQd zfBI|h``aJb-^3_iILHp{{smfIs|0p8WLlvlrX)@1dbLPlk}aS`@DX!e=qf$~)xc5$ zCHMTq&p!QUAN%NkeDu(%cR>U?wVw3AO*h|tZ1)x|Ig${6ZQE8lQeJ13a*O@da+N;a zXoM1xLzBV))@n}Bw*2ie!&t=|Rs^2lu9w-R7bc3n-|oe9%g(0KU;opOef767@Gi}*e~f&e9xqu$fb$5~s&(K9{2N2qO6=~}{l;fC+5K7=hQYB$49yX7l7SRogjNgA|wHxY?Mh>|)bhnG^3W$U6MhY)gNxMjLMGFcimhvLc~ z6^mp?qeaeHA^XtL)55W{7fBm{pt6Rg_7MC>*8x*1Br_8WKEpr#Ah`VYt%5+4DM3}0 zFnsFqLqo5UbPmtA8X3)S@$N1*HkexN@SayH9{n^M+WI3zPs9b^^{LHZ z5=+eQ;GZPZW29%~~#3-^Wt!Sk(!_%jVvaFz9)F#w?reJG4g`QIwI-j zW~T~eg_1}FPmDJO|GTdrf8dVW$G)_@PO7d;-FCZ{N+fcZZC4Cs&?=%Nw((AYra_}d zqcb6CnrsSgx#j3~pqeCrkh$lUJo!OC{?!_#nE<*)f6f}AXLmgj?<4B_RL#jmObN{K z!|2Qde?BOUy>H`If~1)1nHe*-OE<_$NTWZPuhHj@oFr?P7l|{uqmngbUk9dLQ)QzY z22GC$_SDqo-Iqj#GCg#<=_JIt$(U^#kU~Pwvc)xBWzs}}4Uv#er4wZ6;U_L+j-O+1 zjbwTW?;hg$Fi=6@dG2uQ;yL2whL}G&!?10J>1=IS(xqWZB-V7+=$^Ax*g+zK<-eS6 z@gFSc@eJOU&x(XbIgAr0tOFCKlp&T>vgG_%Km1}-l8u*$SjYtvshB+C`{c}8i$43U z!*prALcBdUbkc%sZB|5988y9jn>gN)ZeB7qyn;M*J<5V6IC@)`WK)q$kWju9 z2<7?3$^tmlUrZ&5vAW(Nzx{{z{@$*A?>RLn`h{N5lvE{GMwj9ANVIg3lCf=sy=K;t zA3q!IA5OCNFtR+~)IY!Vnd$oWVA z$4heH9S4GBAsZW(A{ql~`C@B{t^wfI?(HCn)yj5FrL({+OFL&rtUv$bKVV+|=J@8V zduo0dib@zbj?@UehRxLEkb;*R1E+Nbi8aP%w*Se`|H?;7+h<3%KJf6FPwd_QUp{_S z83P8)Rt#;lH@M+4+o($)U94{^rsF#^F&(lhTl?lIF$}a6sjoFiyJL|59glw%^z-+9 zkZrr}zlNt5K5~^g`0`7>|8=($5SGz)ndx_lGWmw>lLsy>61?@lKe@TK+X6BtQLSp2jkKKDcHOHu3Npw@4x*&RC+|% zyZ`ksxI1bTxiCHn_o~~{^1Gz%%eo1N#CMDpOg*KE&w)$6{Op1S%B+9;Zll9~_&~?U z>8F4HWgl70Bxsqi{q0#$k@ugwNal{6CC+<(I?yVv^r{gfwgtlN-qDm=-nbwxNfa&UYNycd5EQPQyL#5y}c?r$f_YhLy59Q4D-V?GN>vy><7-iHY*u=n%G z8_m48XDH$~M1eksYV@kIvUm22zjNgSRBZQY0j+)MzHd9b@D`|BCJ1pC`Wrs}`QNep z(EXfdDlfKwipw+n-~0YugU%mIC*S}7>+ciDZVou;>ukLMq%NQ-{m1v=#K07)0}QAZ l=&)2xEEuT)4gvrH1^_PYo_;OX$SnW>002ovPDHLkV1j~R-%|hp literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/38.png b/plugins/weather/jisp/38.png new file mode 100644 index 0000000000000000000000000000000000000000..5f46c6c5d69003ace5d5573be9535aa1ef7beb94 GIT binary patch literal 19003 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 m7U-~4O)MCx0S*EH0R{lDZ=u2+f-)Zf0000 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/39.png b/plugins/weather/jisp/39.png new file mode 100644 index 0000000000000000000000000000000000000000..514c2ccd94083ed2971d6b0ac6431f29d102121b GIT binary patch literal 18550 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 B>pu9?y=E?cdBSIPqI! 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/41.png b/plugins/weather/jisp/41.png new file mode 100644 index 0000000000000000000000000000000000000000..5022861f3909c869c7dc2a79353be9b8900dc665 GIT binary patch literal 14617 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 P00000NkvXXu0mjfIs@#T literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/42.png b/plugins/weather/jisp/42.png new file mode 100644 index 0000000000000000000000000000000000000000..23b45c13b5105881dc9cfd0397b22eb6fb3947c1 GIT binary patch literal 16731 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/45.png b/plugins/weather/jisp/45.png new file mode 100644 index 0000000000000000000000000000000000000000..4292c5d60118451c6522e78ce3480a29a0a25e7b GIT binary patch literal 15926 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 ikDuqj|LFQtfB^t^!oiOse5F|c0000q4a zA_x%_P!6Lwnw+O|tnNzhoLkjHGZq+o*?qhFw&$y_Q+3s?6aMp`bI+}zssEe@eTvt{ zDZVpK@mquXANHXC9|-%s&S|`l*Z(W@_i=1|W~|qY^`1V3#p6Ri#q<9-;dB4NmR%G$ zZmhL2CBiQireO&gH_dvcPa*jK_QI$C11-Dw%vr+bt=Cf(V3Y`2EqSd?`Aq+xV)^t3 zwEt9r7X`~%!WQxMf&~j~vu4fm+H5vyaB#5j)KgF8d_EstU0u!j{eD`KByD11B6slM z!L+KX3jC(HsU^ZU{<~X0{dep`zsGZ_6$_TIB^3B+r=3>u%rnoN?eTb;3x$FNoBY+U ze)ZtSjT_2VtXNsE>pCh&1HmVrefGH>*Ijq*8}WEN2cH#S%a<=~-dx-A(`h?z{91zX*^)3Fe2s@9yfI#>OBmInsQvGgn4~n5B6OI zUW(1!6yb^`uwk>FQP2+9oR+{nUU=Mh-+gCXb@kO(X}Ymc*9;e!F_p>66iu^KK3|}c zi3FvnD#dX;1;VBPVkoe5s*sm?*r|Nlw3c8f6q@++pC3xWZ$<0;r2^qgjG)voIBQ>i zN&ug#m{KNHswA#tdoQJZAe3>cg_jPVE4fgPVHh5SRQeeYpNR_=EOg0vS-S4p>*jCR zu<^pNvGHjjSeAxED@uWqWf=r6Qw0#R212G8hAI^DR5Ti+1VN-!O{Ku%DW_9qQ>k=a zI-PBRgHpuU@^Zt*vdb)8z_*wTc7%{U|V_sku?fgT%t&umEF}0H?W3 zCc~pp5iatD0u_tK37ojyP72r}2%I89PbO3Fxk8ix)=Ysl!!gbG{y>1T+ig^BZH)r- za=5&_Lda$_F1R!aG{YrRX$?Fi(bwO%$DUNo#*G^r`}_M-s1)nEi4g5}yYG=lAOBcWV?+5bfBB2e z4?g(dTX0QsGMP-52wo|9t-lM6eP0ZPDZy@j)mdjX|Kulk+z5g^o#WXMK!VMHy)x+( zmC59Ya8QtFnX;U-ESLeyMd7Jb0pP?ALPp#k9}82GO{Cl|ClMxEcp{MkK`X=)z^bTZ z3XhwmSg?4v+eHC)r$kW%*x`wn@P{SEGX*u*x2aFW5-XNeBgmU zc7lL%H{JBvC7-?dvzG+|feH}1lFjCZZoTzuzxu;{_r3^ug7Bjs{b=2#mtJ~WB9VxF z{No@0oyH1jx_^5e6>^5cKk}DU=}c6#Ryq zFJI6=co{04N`g>zvc(fgiU$jS@`kAn3BW)lUW((qZ;v`OdzmP3S%kb_DpFAKss zd7?~UH*gy8B-j^(NrVr-kzxNZ=)4Dx6|W3cmM>bga6SYR9vl+(*Of#vGw|K-{_Fid zpI7?McfNfkDA83}QK5mQ?|JRD*A8yjuwg-UO>OhUL^KeM#YLMW&^EhGS5;lEDD#b7 ze)$#OeCC;_-&(nHMfHgjT_Zz7Lt#tc`S*Yu21kmd}A(` z7lG)3&{$%TJTDM|pa2NJhAVYC?I0WzIx?9&2qp&t$x`8PlnO^;RL){2l@(=Rog(>M zwt^`tQsB+wA@-xt890vsN&;7>YHKPfkH<}kaL#BfL5+-zl4F&X1*ky4PYn$XQWX^y zR7=Y=%I)zGXtGHXup{%l1w|)ugXLh{qNv#=mf?9!6L;%MAs@+H=;ouXK0OjQJTirO}AT3u~@ zHCXHPcswN{&LU3Y;0SCK6u1zDT(}Jch?b}u8VQW({xVoU;5-G)gPH*0g4Ix|bejBb zWNaKD$40PT13{pG@#N$gDI;nhj)B5(IvnJ4WH#w^hA4eJ9HWLuMlc)$#3ZTdGdjpt zUQtdwEe|lKq*NFFuJQx*A5#vGF zgF#W4#VHVz>Kp1?fGD)Y+WdJ$v>Zw5T&{S-UZ%o}^7F>X99%(nRXg zOD=0%w{F9gAf#Df5grsa!Q5nqip7(leVGJC#8wm@a%>qsLsv)Z%>Zm9Am*Ueps-Q^ zH5quFLns1ep|A*b1SOEqP>Hai#UsR^RpN&4aeq`a9(Qznf*Khe1E@+6MFatImM>pQ zm6ZqKax_q)Lg*$!6yydlt^zqOS~Lf2ND@Jr98HcLPr`UIIijR!JOvPyCD)LH_qiNU z+gy$aMF0%|I#Nmjybvrulf`4Iz;5k65PZdfgNM3CMuuY+LKHcEX~nb%+mk|{n#Qw! ze?YwXb6;5wIK7tTm=2aGD)q|<2w z_C+J5@$+ybLKH=_tPbz948x|unpIGw0C?{L7Ggt)LQCbqnvv5NM}@yfn1QbeorGf( zsF^c+It7qT)zwx*Y~f8fK&Y}PD0(5r5*if%mx>$DG32ljh$jh%F$i73pr5=)CMAgi zIj0D*N&;_0dj<3+sQ^c{2zl2*PoKMSEC|tp#hTfM*A| zJ-{npDHoJRxHt#E39UlrqZA5}Xe>I+u}nc$l)&YeUR>MMSkLwM59-fvdN~VNJO;>d zBrj*XA&6yRkbHT0WsBDzTnfsqfH=W9?GCht3|RFr!!j|uB$j1mxef%*38)Y_z&UGH zQuF7{0^xf}07hnm8phXX=?d`@g(wLFeSQ)SDe^foE%Z_WgzNYFh(TbiK#xWP3I>A^ z7kpsd3OOGt2NSz2c&rYd=y2F5J3yZuj0~7i?!G@h@X*swKC$_WU;M&)j%B53EiKIq z%R50X3GlS7U%T}yKYID4mwJlUKb11FQ<5W0@kO{G3AbYE56ZB)-JZbOb2qGyC(wrd`uDRtLb3gd^!gorimW``cf={Oab-hl@A| z$JJ-dS~$D4wPP`OkPGynfUx=wckbUeJk&E03|3au*0-)V41ER&*U{Ke%U*uzML;Rt zgsvjY0R&pfR)O$*6m%8@nMOzh$ivT2@WtujLjHx(@1?WY{ru<$PdZP-u$}=p@!!sX^B`MrMfd!x6ci=nU{?_Lnd-UNQ z7JTbd1F1fR*^VR=4#+tQaB>xu z2ntXOEWjEFMY3^l4i1R{!dMLA4N_#VdWg+J^P+_dPk-sf7xn?QRo-pl_*6xp(mIS} z6}KF7=gw=s_Sz3Goj-s63~;G7NtDXrBm%Mklfjrll3+7fBVHI_wkC;U3LtR!#g|@s z>$cl&d#<;)ceEtoFs7V)vVa9bk*>J%s@3Z^erP3Fuor~p27x%h3z!t-5Lw{wa^7S` z9HF)x5g1ZG76Pf)>jojQB&hfH_EDpwEiVy;nE7Sx*?>pTDSz@Pr{d*A)`Q7n7l@@Hz82Gb2@@(5gg~$p zCx^n2n7n!2b=UnKQvJ~>6svgdVo{Cc5Abk+%lbgI-uCwC9gU66Gg@2Qrl&JG7g#xq z0>@GVT005>ak{;=h3c5zZWh#3(+eOIrFQS$Lv?ref>6E0^2f#|2vag4MJF&~x7i7m z#NZta1}LA;1J^)Ur{xI(Tr)%XJh@)*0?ew5-&Fv!s;#X`KuoyrqaXS3S0*OLW%jR> z3G^wMRk0GszyZapuey2(@YXiqvjI36iznq^K;}h3N}n}p7bZh!aVU7SCJ2z|_DCh{ zRaI3%kK3Jl_St8T;_>0Ql7@h3o*Ob4TJZb*c1X5}7r=KaKvEWjmZ_*H%lG#5oWyFQ zAlh6YPyvD*vv9#&7T}C(tgoXQ8yl&n<|bmX5L;jjEE!Lzs)CvZpVt6(x3*5BYOAY> zL5x8jVU{=CBu|ha$->V`9f`nKp0FdJjifArSv49PX6p!F_#QtuV@tuzpn>gyA;b^t z-}@5K%M|-Q3uDIAq8JQ8Ce;>s#Mi4cTQN8jWhO$!DHQ1aS)jSS~wx>q_W5m3n=n$WCE7^=o91P!vIs@(JcO;kV+;K2M-<` z3I@w7TiaS{fR0Xl?sK2J`@shv+&X*q?3M=}c;JRWAlL*6jXF9u+I#cOpM7Mi7i_#>IbbXcR1<<4BvK$0FTg@wZIx9c;y?*BIWtR`h?!8Kp$rTRQTN<^A9eWX zaf0_GxG)HrW}vm(P3zZ5P5{OQ8EXmxFXBANgFq(+X!ItR%T0JbC?EqKwdwcw{Oaa6 z-+X=WZxwnG*Nf9~c1sEL_1Ay$x=-D3)8~_rZ33+W40I7}FEWB+^gs(J@@m!!U<5;P z#;8zuJGh`Xz=dKl4Fe&t7ac4pyl3~W1MThYbyd~Xjj%rt^wI!p$^+z#^!N2er%#{W z#xR@{XP}U&OiaXxyH^36kcub>3+qVujOWEM7SD%6K|#Lp`c~?WpZ^;%62x@Gb`(55 zqrfpJqxGXjqvfO0aIBD65?Df|I-L#!jIjW48Held^Ljlywr|_=>pOpb`yuY{th@ik zci`F>8Huan#hI?CfzZuN5eHQiHd@J~&`}W}AQX(QnZXMcMG*n0C&nir(eaWop^)&v$k|c2Sl5=XJd zk3nfQ9hv&V1%e@lngsk*f|fCT5fdGi`iTXyb( z+)u2zU`QHzZi2qT%;QBSA>y_i@NL6;ju+YBTVRW0Ej41;Jy?VF~OQAUqd!{&{PSfZwk? z_Sln=L!F)dXt8Kp;18-~lUTnmAle-EAb3pxELsG1gGQG+dGh%FW5+sQlykY`6BA=2 z@px>knC}z~^l!2B(hdNG6#l{sFI;fbXK&tEUtd2j9FEn-Nii%>xGGXd6jIKjQAnY% zreU*-U`Mi|HNZE zcWylbzXRbJ1q|w03nj6TD$ZE3e}lk_ zK~w^*dv3h(#~A6i-Ok80EY@PCs1f2Bs^C!vovRuG@=a5ATdG0dVLaTD^@wNVwfk@ zOtTC?Hf$gxg*sE%#bnAXEz<;gAQ-a1;cY;R_05|%A4aN*77OE%fp^Q0l_ql8OgNQF z4EOi-bd5tm2e`{x!YxecP}56GyYB~5*wX%%mX?;LyY9N{Gl8<;>{K%2NToA0mVM3X zG}fX@W?)PLT|?obl^Zy#L;|BmQu8EmS`-j*cTKm-xy911POP{%$x(zC0!Q#Z0l&rH z;ba9W69tJLg1G^B9Z7U1#=~R`glQC1@|t*8v3!iU4@xCPEr1$Kq>4(lGBa=pTCA(9 z51n()n#R>@)- zn6;6jg`1FNT0X)US|_n|QtVQw7~nQ0Wzk3!1Rt3!Zke20pQNfNWSpG9*9d#~og28j z-C?6dj-8AlhLy8pS-YjRby-Vm+gvc9+^SV)M=!hl^8JrJ`siydlT4uW{hm;%9iHzp2T z2MV(o#IWzBK(oOY?d5ii6n(V9GOiTUkv+MGpYTW8i!eXra2Hp|Kh+ZD`*7g`M}@bI%)=z}b?Pj=z|o=HA81xhXAl zVzILL^wUobTz&O5akt0Mj*mx(r4_4mnl)Qfu|G3h{&p9A| zl+-bbNfSl7xXhqc%m@V@c(|S_;rIoD*#(b>azS!~6B7tGknItx$BZ)tgaYS6aefpP zhZc$Fz;l^dCQTGsJddg=BnFUaImzq-AiHbnlZ9}{_|fr_v&k|ITsFUPo>h&KJ?Io+rgq3938JDtBe=8UnZ(AvW3t6^4H!O^1CrjuGXC_iC#0A1!H1nd+;zwQgyWOGN=+xnFlVRU z-Ur{K0pR#?viRJ!=PX&je*L1SpMHAhl>SL(>JlGziop4j+6upZ!^Y)b`N}Of2!c4> z;c(W6Ba!UL@KF5!eB+xRg}~{ks3@bnUJr3?!iTMrCStZ?wO8<@uf%Mpm@FFE*6pK`7ET-X@LS`6dvW`@gr*0{OK&K$OfX|DMKmOQWI2S#A`t%C$A|{ne z6{f5pdB>zhX$4VeY-(!#)vxaQr`o#O#gHh7h<%w%Is-zLL!rt*2HYAg2d%KLcaZd= zAZ^1;5+`x=hA9f-+w+#h!Zl*a#fl_aBpw4{#p8Ap z+DVe2T%J%=6ZdHnD@Yxilod1r2Y9Unzpdh%xzVI0gBMIjMB)Tv(p;CvX?m0;bkidl za=s#6eY-$LlVcU33(lS1vwP28U~iG8rY51MyL->4K6U*)U>He@x06mV_Ec;I1nl_H zkACvWl`GF&1GLOuEPJ|~PQmGP+DV#DQf;%p1!qc7NSbPPXpvSr*q^l~46xQhTiv>b zc{SvC#Ckc-Vm5CFC>&0)jlxWvG=lGBf><{xCI(S+GNC{yW~ zX!9WEtP5HJUIg|g_Vo>rNMEd-FjiqoQOy(|_cQdjYv&d-v^ua%7e(ABT~(konl$k6 z@0cVmTCGm#rFncps717ps6Ou#~+Y3Y&;%9g{E24b|xe+y2-_9 z)@%}%FG;10)tipR_xkE<%GHNT2+gX5eoXJFlV z8#*>^dSP!ek;s%%MjWyViBH>|zxc&ht3p-t0XkUKqFqFotl0vM*(Rph3D7pq4XPxF zne_`@(PJpY#aY!e$dL zSW-?fm8w|Oj-H$lH(1k(i!p>_(UVLMFoUDzb(W_fRFcIB@Rx#w3kzqcJOU?Vvc>eE z6lqtdN#I9C;crPFrkT5F!27#)?R@KnZQHi)=m5)fL0!j#Vl;gzfCwb?H%lsK$6vARh&?mtczU+q#hlGi zttBzVCJ-|Sa+BQCuo5iXN3(ib%t|9WIps!E?`(7+r2~>IDdclA83HKat@=A_3aZ$! zWcE1bNgk2K*BDQbT`6W26us5qa*%dGEN`IFiX0wij%;=t9yjvhi!VI>-GBX;Ut2tV zvag6E7{hVQEw|osaUc*_26*K%dpLBG>?l^f1d|c83=>jNkj5nAc*pFu$+gJ92&Mv^ zBsC0#6yt5BWV2~v<)j^hv^-de2bqKb>%-ti`rS=vqDYa-WaG$02>ZF1w3*(EKbFqy=whXFZ#S^t)&hD#ffs}*snzERjB~z2vMCd3* zV>@R8yzuCoZ@jU+gs&G1UnDs)aPe$wOWVA`p%EKeFTw`$U&ZQjVk}%Xr`${&wb^h{ z7DonBWEeODWEQkcTqM2TR(APz@+pjf+t=_5pxa2#9u-ou_Z(`gEMJ5#lA=@{@_??Yjz7Q-|r1f z&U%^UYb60vE{LK)YUuFD#bdFaC!Topp*P=r?T964WvbArIdkUt07?oYBjaOm;Ra}r z%jR+!%V`iC?$x+d2$$6;B43`EaWvz0q84JwXOOd%~vS#%qnx0rB z05}ekwKDA6-cfs@Uw-+eo<)n6K54f(dvkIw5KqLVuCA^`e_!wT@W{{*JdfFI zcE_@1r!Q*nn6X5X937x}A5uA_PsM;`W_3K_(1^8UH3c#P%c6^rP!u>_5-^LNKtrSH5}TqM8;w*4B5{N zu)1ZD9AO*AWHMyd_{nlg3(m|5Z*$3x`CiA+#bKnV3YBFbv}J~d#}n`#;6l`a@#zdN zf@O0FIBHKeo$k^c_7yLZ2}nKI}qz{EOS$(+h&oFe4uPSKSc9~;LGTNbPj*qbVF zqRkDEmjMgT<7x?9RRXVZT?;NyqB#=yFu?$5B7H{K*aM!!iIWy;S~fk|ojtq}S`t)e7 z3*v}k(1xOcmCG8aS2Z$dOT68ib=K8f32veKT<#~t_L)>()#b6V(Oe=P)lRYWMLop= zVv0LOo3vV@t+2KfyvgW1@$bj!fF&?I*?OUIPuIrvh+?~H=AN{<5=DHtjqKsPdw2=&83Hf5Enk0>mk zm^;7vrS|rEVLWwke`T$hg5S^_L*)j8T zV_uL>qzzrmPZ6x~UN?&1PO($zO5&;Q(<%=+vdirQERUr?7>A|0rWHbUZKTT1?LNAD z_hC@4y}P$ND=So)i*qT7=)`s-pFf zLJ71@f(tOfq7@K~EZIagl~e4h0X{$*afAzi7^3Xgcf*B*K7G;arul4ir`O|=4b3RzJhpSN!>H0J{0RbQx}az|ugj6c_HPK-hNh|S>uwv| zDQ@XRzsG87y{x>-a5%7Kj$>M9&i9{l@x^D?Rs`MA?i0~nav^5}Gml3j`O4-w^XIje zwGgS-$)#uGl5T?*=gbG1h6A-hQRgJ4Fh zszXtSFCY$$$+LAWen`m2ckmqVpjob*5*!<8UC9Gm*$)~51J(-wBS}pwBt%J~y}^pI zl&se}B{ouDTb?`7(>Ee3$`}XC10r<-AS@|s?kfyKljpRD#+(j&)!t*n`vu9N`}`g? z9FDoO3OlQ&+MjW->X6gv&FY*{5i<&l+^n#*((Bp*aYT`IBe&+f>U2kFP?;IWK=dy}kRu!sT z`i(DtqJm-hinZrobUYf*zch1tOH()+jfSI%M0HJ_gW{zlf=x@?{bfy*BXpTZpvQwA zVY{Bs9Xf5{49}s_+)`Ff#yza^6fMz1z%FQ=bFNfbhr|@(kI{_wIK>Dy8rQ}H27{IB zEz_E+HO{#pI}|zDJ}nrx35*^~%liSRvD}7)Je5=JO<9#~@w@fcS{uu1N5YBRL^L_- z^7yg0DVs{GEf=mk&A`Rc!=ur-&2G=c7-dx zV_*H!XMW)Gy6rc9>7RD>_4PP#BI3x={ki@7_QdDTnKM()rCavw?R)~)8TouZDw9)E zp{nY{(xr>en?1c*q-jHf#0>V6GXnVUc;9HPTM~BpIrnjf_45LlYBbNUV00tzwmCOZ zv^%96jLg!Sf-@Cvr^7vMT65Lm-Y^^V+D98}%F6e3p6E^|(~vAEwoE#y$#RBc>}{t* zCXjAxE|Z;hY4(o&UH7JP1hd+xc)H{N)? z`O{y%!zWfOytSikO^Pb@$Ev_;K>g(-*E?zHs_E9;c**f^N07 zp|Wn_>}l&q(ppn0uVu?@^k#swoX_V?GorIqqxm+c#J>qjJMQ)c6<(0kv9MfYx4Yz4 zuyRmVRVtg0wbchDuv*8--hlzFAT!BCjGfumaQW4jZ2Y=f$j_Jf!bE#xaMsA!MCxc) zUzd`X9ocjWV}mZ|3!QgA@bWgh%YLWVWlJRuZAng3gH=xVeImz=Lk_J3Z4Na6(H(ig znTr~!)vM0W+6F_#Z$?)*81wx7R|g_(KG>aofP0?Qp086hT#rpwUA5X_LsSA zhnz0AE=e{jt8(Wd+Lig8k2*a8MU?FMll_TBLlgPgUa!wtUsK)=NCE89m}ssEv~+>M zheyWZz?vM9iP4I6=dNCS;e{8399)Wb+0xETA`;rOXOA&9GFT;NlYAl;F{05JR}=D% zx3*RP#O1OLK!g+{`Rp>0VUJWeoSVo54WuBI6`}^=nyM^wQ!}QOQ~z-5SIAV~`@XXg z&fa|g``@E}{_~$vt5>ffnI3XoY`K7_eDThG-L;zNJXz+EoNJeN%nk;9mrbOSTu@@S zrN)N#LQt)#udQlLBof^7n_j7DY^V*kwY8Bz912x3*=&}+^UgaHzq|JjTl)q^-)L-V zbOWOssi>%A>S{w5^E@knOGmJW4VZw-&<$}YmMbJ;@w+9X(2ENN@+#Gk%xRwpxTV+q z9{at5&CcxG-!nfCjE-mN=&Ge{qTA(Iu>0`9iKa?dWx3bZyy?}qo*x(-;1cmjO@Gfx zX~*`h!ps>nLa)B|hMr9f+iEH+n9tmJLm-=s*B?4^;timhiA8f-FFAW@>sRfP&^$Dj zdc}~K=CNGzf*P0m9)OnDRbWCsudUD+@VtYS1OfpHq7}7u>$dlY={AR(`p`vJQJNu9 zeS_m>Vac4qpE!DA_!CF_5}&^8!sW*6Z|t8}8T2rF2F8wc_V&NFrnypO0)euC-?unC zF}85+npGYCfZx^%@KpNPv114IUa8 z?Js}8A31ykCsB;uyZ0zvC%Z?p=_Ia<=4;Bm%Wab2t_Uzocs?wQ=QGP$njWflxt=em zS{^K3qhlU@K%q!K&7>efk^x`K`wOIt&iOK_gM9jH_ggndFiQ9$O^r>&doMU|S$WTi z{)rPj?>_VB#VG}65Et5&rPn$NaW9iZ*wn!vQ-G2M+@>yq{#dmac zu!j#HrY^heG77$5dhFOS4iX{Ed#J^8JFY!2ke_?3FA`tSR#^bDjY}4tkQwvO?HM>? zs7mCFxuK6K@WtR*_~#6*FD&zjhQ}e+0tJ~dI53($|D2_Tcrt4wB%{gckft5)?|!qk z%oz%J9qoU9>fn7&JGboPAGx+65)M-rY*^Q{aN$Dkp@$wK6~l`!xrBnT85dr9<(8WI zY1^x78yH-jw|(!?`|Wny1$`r_XERFPo@A7cGRgK-x!X~&OYH14&F@WT1tS4@yODld zka!b^C2Oyt0zdf{6$y{LH@tl7Uw=r=pW9Bgw^qScO?9-@lx)@1l7%faByxuicMbj- zWc<*<{*lp$A_vc%1$hI*;7apWK@_J=OoaU>PoCsnf8)*czP zSjVhbv4WE%k%>eiRBd$?mB=de_9NqZG#q~5Vlw&cZW~AMb0J-5&Dc?Dt!T23}b) zul~vyWNvTlKD_qf`|;U$Klf{hu4_g zBtV;Bl|;>$H=jzWGS%JL`R+nrfAL2q+Z4<)XUWErY7}F)ixIcmK7=<$8`0&)=E{I~ zaYL0YmoKoAB+P_gx4{MCI?lYy=}4EAm)Xuf`)mg`lghHJKl0d<_W|uxj~?&p2?om{ zr=Ui69h->u3?;&%62EIA9O-Xst~nnv)|tsfDnGa0S)YtWqR(vF^7!rp#}35v?Ae99 ztQ^?0{kuoH26kn$895P8`UZxgi>fMI70VV(E8lZ$bO%`Q*rMrGm%hIH=mWq2*@~dQ zY4a;#}j38-fYip-`UQfj(7j2viS#rdn*e-}?D#uH* zH|TT5IeLwg=k`tu_}&NwU9%u|*eKpOK?_u`!~?uc**Hd{Aa9|r053Y)d5AiC_{gc@ z#n9jTwo@3~4BBAG-7gGH%IT^xx2A#_9*cE596~e83oemnyx3q<77XO&EVjldY%-Z7 z6-GtXcO2|IcGp-qEqZ)GdDs3Eg^Jo{uPjvD#!>PfIg{wEsw!VLe^&DqV-r!xGG!r^ zl#>-f@41yhcjfLQ1D%4$RxQVepOh10ip}W_@;sjhLwIRg{p^;Nr?p>$EfF3Y9V~CF zSeH!a!lRMY-ZGzO*0Ik0+Xwr5ax-Sk*pSNPSb#Wce0+@D$f2R3p1SkSUnC(Hv8_7m zEaw|rceZx*ho1*HE4VpEF0gdFW*AJRD85)wl!0SIkw3ZEGH;omI$9>^lbvgS`6!TX zf=_?)M(VMLANjlPD$N*XvkHT&*z$tmURYD@YAW~J_8cBKm@a5^i`#{cGS2b56S9sJ z&#`$JWETX_ii(Qz8J$Ot|G^ii%uH)-Vi&O0ZXe0Z6v$@-RUy9a?Kb=cC`QC(B>Zm-v-sf7Seui+4@ z0*+Z8x6{96N9RuyiS*z|d@Ot7#EIzHt5)9doo{_(`Ae_7qFr(2)#KNH{G;W~&C`q@ z{rIP`AN}NxE$tm0=|`S;)|V^Lo9r&H4mOqtD#auzeLANzZ+b-mVs2matQGURCkDB` z6US+a`75`_!~$q6K9jQ9T~scc`Wu99RbdS4?uJgMBsSK2tL8OU&5$@wo!(N_xc5-c z$pe|pPiw2oKfy9=xg@bUmSJ*kk7ocf!}fu}k-h!HvCVDMXWLzFPh503_42yrmf@JT zNLS*AG&yw=GRa_TbIlpySVGHYGFm)5Za`pm;cQWLZ7p^78H-(u7cHbRv5^hSmMy9O z*)M+c2VhCF_Z~R%5WrFrgszQ@#}B)lc8%i&^?3ip%aHuY0Cf?Y&6WpajbZoM{{08~ zCML#mcieG@{e~NE5TzEv!psBLb_A*K|6mJs@9+PaI&|o@cM6@R>35U4*{NdAbQw*J z!Lsslca_^FR^?=+&nEK0j>gLI2RH5O9!(nimrk!_;qzQL5+9){y&_au7W(}kpZK!B ztU58RrJYS@WO>e_IUStjS`o>F-RV^Hg=ly@Gkbc|#>#Sk^YQKhF#4$4({qx(;DQS( z5OZ-pcIC>I)EB<+#ePHALswsQRas+0!)KN(SuA|@*01NLHB>L&dEoe)ukASe^Ur_$ zf;*4)j69b}=Y~a|aRN4Hy>6G%Pw*@S4G!AVrL

    Kz*&Ne>MLu=y`rqu_-#gMbn%OpI-U3zaaPdEMHT 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/7.png b/plugins/weather/jisp/7.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0ba5e7af6ab6fe12646d8460e083e876653e44 GIT binary patch literal 18509 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 M07*qoM6N<$f_@cOQUCw| literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/8.png b/plugins/weather/jisp/8.png new file mode 100644 index 0000000000000000000000000000000000000000..b11cfa91bde0d619dfb322d8711c04995ff90edf GIT binary patch literal 17786 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 RQ)vJI002ovPDHLkV1joSux0=N literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/9.png b/plugins/weather/jisp/9.png new file mode 100644 index 0000000000000000000000000000000000000000..6798ea2df8802c1eabf81e77d32afd708fbc9780 GIT binary patch literal 16762 zcmV(>K-j;DP)xxAt61J=`-)m>+km8|D4~wZ!(M%1Qm66=ffp4^KScnf9HJ9_nhCkceu}g z{`2Jj^4F2Z|90Xc{uu|yP5afC7rs`l}Zf4n{xi)r}z*S_|(iA*Nrz4M*# z)S8={MNQLON~!bcqmO2`Y}t~9eJt4QU~{H`Kb3m8|7qZhe}EOgQDCfEcNJ_IHWfCF z=lSr~ty@2pg{Qoi5&%J?8<&I#*+!1~^9dNX6wCHeeZ*Su6yYF5R4oBWC2wbNi z2paV$qUCZNpLbm+RVf>sAc}-~o&(^IQo=oa`Q;z~#Xa}jJp|_{!&V7^x2I6hRPeni z3Wx^xM1P+IeFHtty7t7+Iu(FE831k)Mfi^A zi3k8&woCH495E^t|6)AHVB$EAN{W(k9QX0<+qd0+{`v3O?l?|y3h>qp;7_L>@&^CT z^hJ;0$*()^PXWFFu00drGXXit%~L?tf=!1lgjS6}!xo1v`PF~_YTMtw|8F;nqO@KR zq?R1$-9((LD+_>qu{lT0*1#oT(;9@XP`3Qp+rtBlNwzldg zp13Zi$a3_;_r33(uIsI_Z9@aP2I_E0xneNGaRGG4u?eLdu>tU0E=xS199|HaAlJIs5E09|@?(n8N$s2R`tD z$Vn%iRD-|UuwldQnY90rK%YH(wg}@*05xWU{kdteV-ozg3OqMu#-;~D2KMpCAK!4{ zg%>Yfv~c0va9Cdr!LXO(d3|_zh|i=aNJC?Trz)yBo*w7Gl2I0lrfCTf90j~jR3zDK zp5zM!qNyr@a{%x>1HW80NU2ovEgX0rCj+PjHj6}KQ2;$eT3eb)BpMztDrPa08E*!L zl2lodE0qcd=d8eW4!*MWm7jg(D_?mDCZZGsUE_)?u4ve>VdFWeRH`!?jqtf#Zp$~n z`OTZJyY9NNDsb0cdu?R-^5uzj>((8dG64*S&6}TF-Q3c0E}`!3TW`Jfzn^~k>HM8{ z-f09AM`sG)Zx;NS_^nDEAe*(={r5d^cEvO=fSd0IWr2LnRVrlwtPJ$vkw{oWs%Ai; zg`%Y*c((0;6&nm-S(eD?$T)GSN8+&<358TRgonu}fQ1`y4DKT{>M0hB!~^OH!Q@1u z5fY0=8T~{eVK#v{KAa$soort?)`Me5;3i%Kx;pUlpWnXa*4u9FKmGJG^siid?T72@ z>()T*<{j6~_4g0n{;t0{_p1jE>^DJ8&0e!+&4r4hq((^3twD#?6JrH z!|>41s$?>yVbH4p9f$%)BuR!@QCR>)i(VhrD6$3 z4d2poV`FWfz)J(MM4Z&s)h?#4Q;Yimxp{COnbEP#FSl*mde^DzPre)`c0nu>k>FZ` zLqkJ9j7Fnf;Hk$>eVQuYYj!kIw)L{tVDX3xc8nsG@{mh(u9j01Ja5#4Y$R6bb`%Xw0%v zg_O%CF~Ax#6BA?vtUO;RGRp^7C#htd6o3hG`2xGR30@+J60>9rcpd@8O;r>E0hu(^ z*OI#W8b(j(K?4JW1XWNfm4HcXVP5BYHtFo>B=JNHQ(qd1M2Kr!T)A8UrR2di95zfz zR$N8mJYAPz7%~rD07fLRfa7^Cb>RG9;T(^#2V#t2SnOCmq>*q)%$7=(#{pm4vh0z~ zo1Xo~#TQ-NH&e1UL&cOHDI=YX+N~|EA;4e>T%?8pOArX~r&1Zzg-L7x905?3z~b4@ zCYubjShQ*bf@5|fM<%j4k_CBK0nkUs)8x>g!X^rC{CCAN^#d+~VM8FLp%Bnej!mvC zi|m~JgTsu1@Vrr=tHp~Ku*pQL#Fzm4az>>D3dtj7!y%sQ5FTj{JxAmONtOjvPt=2b zf!Y9Q&M+?TlSLX;fY2ipANG&qZ3R-(e*MZw3?6?AW zOc5rYFv=k0!VBL+mM&Qc_ku(ASWw0d$7-4mDOLQKAp#xBB1bd@h6v{`6b*; zeN2ca0Jteh29E^ZV4Z($Vu;?TNz6i*>5O|Zfx!NF^5Y-Ac+*WcS=GsyDUgb*S07W?*4{Hq5X4%LWHA_o4)l=%-mL{C5{f6{ zvIfb|cxK`#I7=1Q^5dRBMm+?txy3OGkC+)8JqVp6!5 z{h}y*|H2D4{A%aUoi13qcchZ6Fs(|cPD}q;IpESuKf16`GS4`0@Q`MquM)av<V={@y8v%7G!7CvTcy?ZfWnn{Rf_f=ySyt|M1%>F2^lev@F%u(R(7eaVJ_g zNVNR;*yy&MufDh!c5xRjTD=4&@w8|pTnjWN|IIt!!FP3ckW@TIkOz?Nkctp+JRXxS z1UV1E8Uro@58erMgTHqsV+S%D00Ie^!l)AgM~gIW#s~Zy zy#psA9t-0nP*B4~{24q}f%qV#(>Y`V55_;1NW^Yfv|#SPRW<&R79WHoEIw4r0r)+r zD>c;E)Yc?PN_hG5qZ==}XyekkbLPyC$K!QCJrMwaGYyMrcn!D_l!#d<6!zbD-+e#c zw{PG0Bab{X_|#KRVcnbyhogFJU1I_U&cVRl(UF0IVN`HZ_(hAB$9m_?TM1m=0Cd&0 z;rw?W6_3ZXWIV!Sl2t60*Z`{16cIq6(ZhUg?^8kn_RE7zMHMx5$f&qbm7(0lScA+B zV1Xw!F`0^=X~6GcP%tjosRh@u%?dkbI2;0H6Jpkb6b8|kP2e~P2E2z@Eb7%H;}2%D z*^iud+9^!waBmhyIl=7Y6T@jf0 z2u!ewz~f*sY4TW^fiNWn$qx&N2tHag{)~Ze3_t?q5 zp@Q&x+9K$*HOr~1H|{lG`qKRM>rZ`8TWiZ2;O0(nZv_D6*sQaR)bxRe@6igG9Q11g zG6>-~=;_9zj+)ol)YP>7!3Q54p0Zd`E#FT49yg<}uWxkkp54#w-o5j;s-nJDD3$Y| zt3zPn8pu+yRQ4^9$*M=@WlX z8w59{!p2Q6`gC`7tC+*UjcEh~1cHnliRC7i;-i(rRm0$-SPI~Mxf0Y_C|Yq!)wH9} zJMX*;?z!ilYaV;-F=N^_S@{{P*)uRp34;BWEnBd*J_-XJ?durP(OAvdp-^NA z1jX3w-fkt4j0+fG@p_PHl4vBx0xU{h1uQ-uk3yDPN1B@&fRai~H4P1ol5N{|kaQ*k zQZdTZ8M8#rA2#y<7!yt!N@V=9SUEb+zDEnk!W~XJdN&#wDlha{n27p$^LpFfXt|Ca z;b%Uub~Yi|Z00~dmwyFU*}z3tf*#jVO`uDnl0XTDu8V0ue(wh_Utf#7FAw2V2`&;@ zfA!}+_wel5v!B28(o5HYg_a+9;DHyezWQn`PSGt}Uc9hWDrPor+<5<piBFp`$__CxDOOg2F951Fdz54G|1FpP#=|$9$E``TFPc8 z?wsA*`%S#>UAuODB$-OR3usI=4P$8k{{25a@x&7z`pHjzvi!8uPP-O%Y4i(dWikrM z8CqXQM=MEyg--@e&rk5GRD>3dapAX*KgEFewZ89gtR#(rj3sNK;24{o1Gzkx%`(r> zKyJ#Ah)LktxF2#pTnmeG2Txgl;%ApHU2w}=1$}z?cXFWvz;8V7{P+GQm(ADJf!u0s zsb>W#9N^US-VHL*D$NMIA2ZR~&^4!(Dl>Ev6&orTZl9Qogi|k>5=M?0uW3txCdkryw9<*G`Zp1|49xW zJjBK@nJL4;;630a3Y#RX`Pg8^)d@oyOD0py&@`a1WGdl;xTwH{k3tOF(b>^**KI%j z(GUIl(Bh;GXhw!1i_g@pi$+3 zcY^_Nd6<|XxZDWDffqYETVJ4_J^t9k_rEmvs5y@K7Oi~xnjy3FE3dq=_UyCIJ$Gzu zBH7f^$Zp&Wq$2VkD~!R+d#>acvtW=_7f0N&6l@vxWJc)gYLB@$=Lg+jwaIsB@MeNl zK-^cB(P|}jJ%{><4{|SlAyuF@$Ni9I{M9NSY~)|uPuF~Dh_X@wdSKUw|K`n`LofZ{ z`|SrGczELR$DiD9c(fnPAx}732AL_;)YR&cNHhh&Hv{0&y1H6k*Az3CEAAf~AGcsUNk8}i>t?8`KUVk>-vZ#%ffpcn#V^17^7m?5=#+fExU^U@6f`d^_0hk4_q*S7 zXSq}?TZ{t<&`6Eg-7_n^blK5SFrsj&Tu6?Nj;PzVzWBmRFFrdotwrQ@3moDf%I7!T z^!?5=&N$-(;9jQ!Z??gJ6ufa(O9y~uM+__;G%RReF_;8F#8oDVNl2s}Ow+5}%G`Ep z@CvM)Q3#ff!8)A7LZo*iR;!~SX*0jE+iKXKp#ShWrMzy27@3rfPvIdfnbA)Ll}||oR9(l ziq>DPPNKF)tH<&%CLDfg)|;%0h@v-{%435PC}4Jc8Ils*H<5@k3-wr8*PEo2bb5k} zj*PKj$AY091oI$(`~1z5YJ?X3Mkj_%HLwO6UD0)Y$(d)KdCl(KyB`6=7)z(q1K;}A zx1PKG_S=h7)=Z}YK2!7SB z8R&V?ut*nGK1B(MU{?!LsAX}&{AD}8vWN7*k_`CSWUDt;0E+Ma=uK$pk+9B^9X$8M zM4pU{rpYiQIsN_pY&j6UhZVwXzu@Jv$@YBJ5ol=C)~GgAToV9Ksa7ue!{Cc>Oamlx zOF#xLjYeau)*Q2T(Z-DzD8S!+wKX*&+_MK--J43AXv~N`9o33e-G=P9&phOOz$YjCF(=geUNwvh%cJK2eY^%vE|vm@AlTxnQUheAI01NWGzNpMJ{_*Z;r`&M zGHkV=qH3`YfDz&J)6e)NfNoAHVQ@16FTP1isU}0>b=Q3@_n!Bhw--W;I0mkaDZc~B z5L%-b)Ev-Vkv7;0Kdu%9(oggRU%%t;z#FPT3ticxes(AT|H`WDw^;xM*}*z$HK1ax z(J#eH?0UEy2r`WooBS?;;PXJkvudM?D_lGqKF>Lmj_kL72$K_lttGgoi(|qG!)y9+ z%0FkdVv2@>GP6{wuwy|pMc_Vba7AqjZdI_o>D^$$o8jm=rZrX z3LjDg24VCJq$bQxk;^??pPdpH%HVMbcr|ADYouf{09Tuva0bvp{CvPKHM0%}(XSCz z^*t~8YrcNgSz+g?f*lmFn8*3vC$Y*Y?N@#VKwB^{5nT{(XdKe!9In_0Eg4k{s}_scN<^@TjjQ!+ z**r*g#HrkA`zb#zi?J36>Qe#62;2|bD+FAaO1z##wp5VCGP_htX5&dS6!5c7}R$4)mLx0?Y7%)no^;4 zXXu4|ou&Uyx9t>x$pioxbj(Wp}CZDHGB8&{`ChwaOss`Df45oC|lS?OGo#{ z4gfO%0dEuoqCYT+t-!D#31E1E4up+5?ISEY&YP z@P6k3<_D~kOqg8R!m1z|2vQQ#RF$F_jlglfR~`0Tzj()2vt6rHD!&Mn_^c>OGFBgU z@7j6uh7ITMpQ_)5BT2)@pLlW|(8=E?60ugl7m&#;teYpRv&8yfAn@R-3bsfvX~uZZ zovbFJ6-a?~Ro#8+zvu}_C4O52nbgR{FZTw;F+T>_LHh+}o+d6hS3$P@N*{h+RVQvh zA-GkS;t(t^SWsqO!?PY&)?J1Y5<$g#!FW++WiMy}L2t$h#>5M+iL~Z>EM?d8y$S1L zLJP>rWiZ~^949nMib`JG^1|kkk>SZCY9`S68*lth)5g% zIG85JtZ#UDge`fo6yEVGg;t=8tEqgod$+n(6O?L!3xlH-Xmy_!{1vB3ny~%mq)A|d zHVP+L;rEx+4EDJf1Uo#21-{^CJcbQ$(mGk1UtL1e7KQsx9(&vg#&O3Vci^6T?#6cR*EJh4;8(9+ zEgrM>xXU2nSq|z!@~y{Z3l3F2%mCn^T!KWX;wLtO&&!VMUzi3wYBQJiYa2`jxQF?b zWrnujn1o>AU^WElQbx59bPi?EtqE(?|DEc zu5bB#&{*VJF4m5j#p48FUXe(~SqwsrpH63(I;s}bOqMNsOv~#)MHo}?Tv*3JG4O+g2KSlH6s`YfCv^E*2IqaVFY`sigJ`@2LU{%+H>qnL_UBXyPh(an%jGMNl1 z>aM|V;gFpFhD)MN4z+oh`t1VMQn==3npS0@swg$2KW z29PdzK?ttvF?y^1o`K5%=h^WHNOes3b9IrWN+qV{moV@=7&mYk4xfu+eV54F%#uC! zGqxBa=&W{+Sv1yH3F( zo11gF39eExgRIS)lv{ZK8dGMp06zf=$Zv``;)0eqv|`DUh%t@N@emiN0W&>xSxl^O zJ&~OTt$K=5@PnW@Ihobk3-&E?4i{Ln$M*4yV&36IYO3-GIJ+8DeT8MSu@4;A9)#`q%a3^ayXhK;HTuhB7jRnX@ET%B9kan>IcDuUGxkl><`| znw;jVKliy6x*j?Y4s6TkOFUYHFWFcZEP;T^ECi{*PgvYwV23l^$!Z{4Y#{w$rip+F z2082n)x`w-46RV6@??K{Rbfz2Gmr>WI|o4`;an*H3m3WBVN3FUBIS98e&WvS37}uZ&o0IJRN~$Qajf(yO@umLDL=vP{kF zFBS?9ef_$B8=ls^>vQ^*S6<00ih4qNB3lO+mvLs%l5M6K>_BrLyUrvC@H1KqCM~k(G7n&NZW>g=**Un^ z^`>FWnAFXI`f!3L^#sX}Lo}F>s%FP~b_2sAT#Yp@&rR;fu^N)Y_6Y;n*sIPa z5{3%dv<3TAfCVf?QCye+aA0E`lE6owdw%n6lW zvYN}~nJ5RBEW$09vl$6HY?EN+A#50BmT3igJ5Uv@GnO7MzhW+mK?l91>h3;oyNA2J zL}`-0t5#kvxy0ZN#+QEb zd&eEWC?0VUWBaykmDOvGeITF9=RpHELZntEvRMmc*ui44FgP?ge9*E@V|MTCAe zAPBCu46_YpUPQViJwj9~l`T z_uqe?2`RrfUB~zK&e6^}=e$$mvG^64@$sH?I;|i;I%_B9Sg#Ar9g|-{Kl-GyK|old zQmx6*YDt0*9t`k-V-gj$a!_8au3eI#b)&j7?kfa}flUO09C#SRH0UhA&%9tkgz0$K z&jnD&gC)DLmjlU>-PX}+4h;^CR}8C&jY^5yhMu;jnxVnL;k~M^?^0B4w`p1X@)fh+ z@!XP;OPBlm_FGRp_8T*u9`j~+Z_V!jK3y`>%Rlk4>a&zF~1pxTEt z#hkOcXn|^k2e)Q*aGy`u!p5XGOlcSrd}ZRB5zihH_A5@<)8bDGKG}yg9Dp5p+VyyW z%F&qZ7D~T@d#tp#H4C$PyGgd}+^ z>k#BndDRjK4_HCnL-8Xmc zoTRF1amVx2*17Xe>mSQ_owohx*w|>UR4L~LPA~;o=cyF#;Pv=Mp*-@R$*3ASaIpU! zX1TaRk_5$ZX~5OIACNtVRUst_8++8rswE55u3wwS&ppQnk!Nj@Uf>WkSnYAy!(VvQ z*tb}&V20}8{Nc(=PHk&%3da*yTSF61CX;dZ!t>UjIy9EuIauO%Tb`&mR9vxoad&3h zYlmKr)i#!0P%g5>(?o5`lLQ{CERG_}c702S#nUI8DHLRTTh0Q zKE856(+j$$#4?ViO&oenv@N3!fQ*8BM?B9Fk@N9|3}A~UY!yjWIav$EB;sW`P5^Gj zsK?=hsA1b;jr_pB0yQkd2C687_h1lUArdDNGHV_@FkI*#0*`Qa!~Xl_mX{{;t}2iL66kQ)jMwqACK3#9BJh!ikV}O*RMP&2FHbzn zQ!fWrZ-rzz5417@LA+dB-=HJELn2pRzHDLpxJOS=D)#NF?QYgjaZ6>()dd7S;Q*Dnk{}q0BAK;X z*s5<#xNr3_b@2^4cIgb3PG`?u%%WdgXD=6xC#fEaxGPpJiVx&V^L4`AByb`~e8XsL z=^&CC0lpAD&VSwbRqyS5ofMmdUI4vN z$hu7}odW1w3Q?XmcC|0xwqtMKlKRHo>CudlNYy)VgMfs{mrAz6iQ);m#D8g4XT!;T zLlavmCnjoQ@^cEOSg91}Hq_Th6{Fv2Xp}5H91gjjU;s0Dc3t~ff+!c7C2upQ)Oo=F zLdoV*kU*>s$>g%AmZ*4w3Oiav5s3#BMd#1%>;h@0?;kDaS1#>3_CPk*0qO1c;*qFn zIhJH|?#C34|4)T_Wj(68v)bz~aXq?gyhJ8=Nmld4%DGE=8+r<5`&!54O;9P0s>l?) z&y_^M6(kRzF18^IInhS_4|?~@TWTQv?k$h=Qy&n>=O@U#*=_1@v9wg<#rwmW=JcDc z6^SLOAgNrrSP^YeUI<}u@RGBaT0jr2_dUIPGbA~7LrO1?kLTT{#yZ}#dDu-cbv*{& z%X_9p9U2P997#Vx6}+3GTG-_LMH+r+r1CeQVrWZ^{v^Z{NIYHax%R>#)fG8jZfUMt z&_7n%64n(OiD+l-*?n-RB^-M~b!}&ab5?S|_BBNQktn&|(nZ}-SrXU7{_o`>*pH2k z*Y&g{R^V879?af_i&>WKc#t7OXjMS=fN=}NrZCMATHL$8^>yzL0iFK?TBTXx4*wsG zCP+tj)3QCI6NP0>EqlPK4OLd%a3qGsA||6DEUtrSe@ksyaTU=5dlHTQ2#4B8xYK!(jv1 z*OMjL32C~cD5|?)Zu?wFm||l&dtlkz=2b<@YRwkS`y-NU$g<)UJok$tFWjTMd@d3V z+r8~|7lL*_v~#eGZ}8zq#xmRM0(^65 zw0J63JbGG^-&ggB_r32wc-l{IdwfkS7IE+q^ZHcui@LS@=*UZ+r<~;#Me@!mV|Y6D5&X_6-*PlTwgRkWs)r zct|f0q#XzaHY9ou&r|omzk9>m5Bf}fja}XK9WV6_yK_@Dd$ReGCB^j`J`!$l4U>nI zTQpsIHgLj2b2@834E(=y%g!MQWLO`B0#}knSCnMFWV*Jl>yE021QQ4sScGPIVG%H2 ztTiIuiEY&ExqOd`CDZ+U4IsK18zH5cm<0RgM%ZBPdd7@7IKE? z`iAnuE~L|dG)%VQft9&DwQ)VhhVPxQmvsNAR|LM9weiZ%k{J3SHE;;Dj|bvi2^l5F}z@H>65m z1joG6rmRT{Y=AosyrZRmto$jQVtkK-AOf|>5+t*bZnHF6a0H%r@A~=I{-~Fyy(vq_ zsw(SV;aI0K`~H~a-5swEjM1KWaz~+JxO{{j3(@^3FigX9EUx6xV<7N7e%!Lo{|CIe z^PVSn@nKClgn5quqtXNxzfiV z$o{ImAu;^mBU>(6v2xz{L^>Y!f@Z8i)L z9Bb7a$DV(ec*P@s<9Z8g;`;Spx$cg2AAJ9rnd6turcT8an;MckS{q`QI3C?I zkgkk&G)6wRZ!Eh_;*`6AhiTq2WXp3t7!u`A;uAJuU9yu=^)nUI{d~a!)k{6Wv8|J4 zx25KfP8e5!4tGEgy0XYK)dCr^3;N#%S>=G4yGmW0zU`nBzhi-5rpO0?uU|Vax_xl8 z)Dn*FF0(ponH5Beu=Of-PzIn~t z3wmSkI?i7ZW*g_XVGt6Is`FnyFubE9m8v8Xu{n*Yh*qCepUGxRzcoQ+!Hv&}Xu{)~ zDt)6=u|5P=6>dm|(j^7D5d8DdE7)u@K^ltK*7rhk!2NfSo}kJ2aL*2Ch3WudCrX40;#7cl~ym_tvcw z7J6`ARaeDNj^wQWCwR6C-+%bOpV|5C=1B4obwNAk(sR%(Th+*~G{}bPYhwa zn4gEW%3?0307suBhT`X4vkdCcOK^SU~^nzP``jwov+P5E|U_i|5M*h86>3!r8^v0O3V zt*i34L91g0n4)?_2?(A?!OB+v5(ZGkGe`F(*BQ1mHk!A7B@>_o;yG!v@@0wVuMZQk zB*>CIwl4T=T@P{@dGQb+2*23j2!L z8aQ@wn;yLp;sQ=Mdct-6ze^Y5taLHARyAm(#9oRFgw$@IMXD!>aD2?d&)(gS0N^Z$^+dvL( z>ugC~1`6;S&+Z)Hn^Msd2rw7lowenqJt}1U8|NUc8E3FuxCDa#-3d|4iCV~6+}qFw-mzobq0%t+tn>|xHlMbt=a^gWeCEmbZ9HZ4 z*d?>La3D0Gn->N5g5B}_W@6Q8z05(^(b@q5SpBx@6zT<*#OzWdnYnrp*ff|UP8$g|4r z_2Da?+durB=2-16^n`+AfgM`9*%jwJ|OP9{M*P%QJ71M#_%z>oYleOAE`McPU2>Q@#kKilLIM44jrSCdz zNjP6JGILw%=tL$5NvA_YkqFqI%iFd|3#Od_zTI`|F|*eK)%@h=4{x*Ulc7QdvQAkN z$UlGar>8GmKBpu}k_w-5VEh#5Wwas)GN_VhdsN(sc!OVa9+>b*x^Oy7-h-`8H3gst z50V@g-|UCoC=E4{Fno5*_WtsXElEiMU{8B)|L8BHvTESO?92?G40iHhhaMdTdUKjm z8hgR#^ZShhnECb%jYUsg*|`$<{eCT^{ou0C{Lud5b-(z+x#ylRA;O4d9wa#qjD)>P zHvcCF{fO$NY4%Be77C6vx2J)ZWl?+V**)pz`jmiayc|`D2wA0-EAp(L%cIeRF6@9o zUOzTbxr`?Qg*4sDjTgNK9)2O!J-dCul0`ik8)yaBFLU`aBt-6b+9oMk;P*6!1#DR1 zY(PAn$>FQ0dfOXoK5Y>NDIDdaTXezDZO%TrEwK^i{ML~PD|ga@`1|@Yg&R^@d_NDj zfq&nj;@F?ARrT{R^U*@O+u0O9E?aWG&f|1~nP(>QvwB+QoHLrWPJ7?RllGSl>x1l} zFka$#YP*swIhJdC;e_t}@)y_s`7E8iDvWjFaHO}hUL4PsvrY9i!o)=0DVx-@r4$Fj zkvDCFrYl5+eMdfW-r71i^x*gJemPwii&o4E^@hiD+^&5??>_5{Rim8^DWRvWo^-d? zyS4F%Mm(A}UB0$6ChZ2SC?u&oW}y9}6Ij!JvAexKPyK!h$KtG*<$86xCd-;4{L_ws z@>jquOrU`^4{YndHLmCtR4gxz4K=}CZ=DlO9g-Evjl`o^Fl*ejx3brUU_6%2ibv0B z04d4sdU0=dC+~_tBZ7x-Ep;(H6+{~%J35oXRVlXQVmKqmJRY$(SM!g+t1RiWU3oz{PxHUChm-v)-+@Kf37XWpf&q9Mw50 z`jrH*Tk7oF+h14TTE9c!_)>dZFl`{yio*$pX^VzsF9BVDg9`x_C&S@P4aCm^V4jKj zU8ycG=g0cStn{i`;hvFv`TnpR9l-ZqfSG!EvvNX8)&Ci^Ka~{CYfCAKfsA#p?TK*L zwl_FD)^y%+N1vN5*`LG?8|(ta7iGF&<+v)Y@RnjUjU!q*K2YU% z4f5p0?fo9|``Bp7bqtGYsX7j{EU>3bvt<`gQatB`IqWH@AO8Ba{!~2V;-9vVMIQTJ zPCRDS{Cq=FBapZXu*KRM^xgyehZe3rb6u`ED)(a%)d78iPkI~}81BMkXxY4uVW1kA zRM1F{vmCyg58AyF*2E3_MvbdslFX#vV%QdPR~gH)j>mG{+XC8ipiQ1sp{> zIAIpH57-6tThlOUPjkFk68Pknonu>x1p@$9p&}@IeD#=%xpKvG4Tauw$G^XAf6U~F zphFHu@K1t(G^X*o5LcVfNp3vjQbi*qk>IFPBBoh}4AhZ&no@k3;T7)4PZ5!MQEEmM&UP5-u{vy7s8%?nzHX>$J$D zn7fNSgiP3ZG!N>Y;)5=pcc_0LddiBn%E=yk{6>oqd_)PG!Yw#9sS0oF zUyl*rNHVfV4#DDEQgLp)Sn|rYMO40qC*?Bl7)8q49Gbbi;q(Pj;K0!BPxbGNM#H=f zv*jrQ#RsNxxzfJ=fzhj@$9E-&|F<*9m%n~{|El%Jey1)ZQYfIrbozlw%{3@K+F(C_|gP%3wao-OX@pP=!PG@CKDr}+#v}qVr zg+#|E@(U$Vco4H(e0(SwQRdV}BiU3;zE9%GW^75{F<=Zp+T!$OtgW@`f>?m; zTBUVIh2QqSktDp)Uok0X4v?eft>$dYqJ4d1R7kY)Nj1ii!Z>jZ+e@1^39B+an038D zy9~xH5)mKiG;J@H2(zcrX7x5YPd>9_%Tt?Q^B#V3`|~^ZjsELDeD;IeAlWffA;EP` z$kBO88cS!C@l0<1!nxf~QX$M566;g4q{{s6V##_L!ksddbN7vxq&#?)TQoh08KNTz zo{g={O_5q6qMY#{JaQ^1U6C^(e>Fg53e<5A9qLP*y0YWAR}L0`VVBE}joOhHfz~D9 z&Mm0=?T8X{J zN8}V*8XcuOx7c*Jn(gUe(dOfVUKx8!eC0>~ps`<#iWu060&1 zjT{;n?t%1tvl>bf!;z^E*_~+k(AsA?zsKW z_E*4uFX+Gi#kXnGtdlq~+0F^F&Xse+v`{E`vVsY-&V}^^5sD!yVx3*3bkp;9v70YV zSi}Gi0eWSP^zphnu8i+57i=&4%q?tT7hjfR2{B0eE8rY9 zQH+Q%*;2vqY|~XN4rl@2C-3mo5xBg|URmXq2v+-T@DGW@Vz^99PsO-|1u~?T&`~S8 z#$VW1&YCulFZ8Bh|D;4zy7S(D{j>kcwKug!I=K5`sz)Q7?K-4H%N~(Dnze0`59wf} zA!381mp}|``ppfK19I&#>hS7Zb`FPc&v&hH&n@M> z(cQnHO4}MP5)}!J654m~x9E|y{+MSGCnRto&8B-F`sVAZbqKI1xL&DZHgvYsZzW<3 zLa*gTBcDB@^}%ycRj(PM$zMx5aBSZamt=2g@_~YY|Yqm1mfyZVz?$~ehmaT z=gJ`XU){PH>n=r35Zp388KQ`&CkeGdDwa#+uNL%3vH`3MMEiJ_jPCdi12`7xCZkXP zgpR+#al?BaVf%(xY$OLC`p)l6%xjO`NR7I+5XtCxO?#Us6Pv@8V5|{lArG*Xkf2JE zU{m-72vkAUD7cJ=>y;G+z6JHRIfrztQ*+uMdrj){Oc@Vdy31I3q)jV zC`Dq?5UJo>q0?i35zyZhy}a_!cWG{%r+c>la?(;qxBui#yJqp(TaUP}WjTqkDh=?S z4lw`>)O0)`E?NfVBMX|~i6RBN$5)*I?ve{a#Iemh2|1uoi~_OJ1H>4$@C7U+XFy;# z{MSq=5ahQ!@eo#~9j^@WB@f(RR7u520Uc^2b0|+nM^b;imX2SCp1bZ(&VTv%Dg>o6 zXZC8_ATsC>fedFk>K-^ilg%++iNvtq(*|vAbCh>A{DT@EPfA`4WVl5J!K(B9HZh`2 zWZo>DSUJo)@p1OU3yh1`tfw@G9w87}DiZqLbI;Pa$a%#wk>X3*cJFC>7h5D|$3 zscAg`5-&JpzvGfbU6ODDXH%0s@Zv#o#Mbc?ohJ=4#Df-{I6DOr0$xvb>Ld^G-E(ZB zs~}%tU)SKsqLu4ms$611u0$Fk04os;!X%STLmD8FWSve1M*d3a-)*mdpJ_G%On9) z0j&Ome|^ryJQJlT!6hhERU{8HkcDHEoP~dKmQ*SZSQ^mMa0}V8t>LemUfu?3!3noo zwK&OCC`raua&SwYn4vK;f7Mw8UsQpQhvEZWGDjJ02<#bunG6Dc#~lm79C&#kRYw}z z!Vt9`QdIoLV%d+Q?9DY0bx9}&pG$BKfg}BW{p9#wjvRNY|Kj8?eBu8Vz0hcO6OBmg zi3)%W9s)r72|51cBxz_=AiIPNNb;>#l_s0bfWHapuOnm;k2Q=XB$NhqRB%bCMId3A z4BLN02(bWpObD=x9IZd1;S<+j?BlzM9S2sM*Zvn9_+Jck1RVce-OaIwY>gHGY+;0G z(Y5&aDEs5E!5`_Ge6c+78HB7A{Wv+VnUIcJg6S#Y2y`ocjL-7y#z9ikU?2I7 + + + SIM weather icons + 0.9.6 + SIM weather icons. + Vladimir Shutoff + 2004-06-11 + http://sim-im.org/ + + + 0.png + + + 1.png + + + 2.png + + + 3.png + + + 4.png + + + 5.png + + + 6.png + + + 7.png + + + 8.png + + + 9.png + + + 10.png + + + 11.png + + + 12.png + + + 13.png + + + 14.png + + + 15.png + + + 16.png + + + 17.png + + + 18.png + + + 19.png + + + 20.png + + + 21.png + + + 22.png + + + 23.png + + + 24.png + + + 25.png + + + 26.png + + + 27.png + + + 28.png + + + 29.png + + + 30.png + + + 31.png + + + 32.png + + + 33.png + + + 34.png + + + 35.png + + + 36.png + + + 37.png + + + 38.png + + + 39.png + + + 40.png + + + 41.png + + + 42.png + + + 43.png + + + 44.png + + + 45.png + + + 46.png + + + 47.png + + + na.png + + + m0.png + + + m1.png + + + m2.png + + + m3.png + + + m4.png + + + m5.png + + + m6.png + + + m7.png + + + m8.png + + + m9.png + + + m10.png + + + m11.png + + + m12.png + + + m13.png + + + m14.png + + + m15.png + + + m16.png + + + m17.png + + + m18.png + + + m19.png + + + m20.png + + + m21.png + + + m22.png + + + m23.png + + + m24.png + + + m25.png + + + m26.png + + + m27.png + + + m28.png + + + m29.png + + diff --git a/plugins/weather/jisp/license b/plugins/weather/jisp/license new file mode 100644 index 0000000..72c3cae --- /dev/null +++ b/plugins/weather/jisp/license @@ -0,0 +1 @@ +Unknown-proprietary diff --git a/plugins/weather/jisp/m0.png b/plugins/weather/jisp/m0.png new file mode 100644 index 0000000000000000000000000000000000000000..73418ee2aafa3d3d3104780b566e73af38b4f2ea GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkn3?%<=>s$e(m;-!5T!HlRD%)E?iqF%TBb3JqJA zQO=)7Oc-QpKeqtS;+FE@vJCZWwrGDceQbfjQOM}8;0v~2#lw)pAw%C6Y>GF8E4>~l z?YNRselR^=H`wPgoipx;ejTXy#>LMCb@@2>1AY?ir8uy=;qj0`kB^VVh6NRxVs_xX zHF<~ruu5%-C{x)l4fFTScwA@XF2>xc%UI@)q)v&zbXO5k&~SgLegGkO6lU8g2i*Vw N002ovPDHLkV1nNxpo0Ja literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m10.png b/plugins/weather/jisp/m10.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f17786f13dce7e5c88c7c187800e44a2e916a3 GIT binary patch literal 912 zcmV;B18@9^P)>kb)?q zM3gcnI4NlD-EawQqkAMkpej9!Dw+?uLZ6^L-=*4`-OYxgwP{Z+h@SAUCh8CGE~|n% zj6zY`m@=VFkoZi(z(1x{`feC6)qN);ib@<=R3g~cnuO<`$a_0qL5s`6XtY(@3=>#C zMQUwAgB9MBS4C}0x3_}$u+}G&8DA%AxsYjxkyovP54)OF&4)bulOlv+itn{ycysyYm6LQgS4M)bI)?#2C30fUWG z564|1G9=$Jrx`&41^SL@)H2V`IRFiLe|!F>+U-7{ mxBI8aAMWRm#K*|L7ry}bzDDYen(c%D0000it&a{33bm$%%*n5=pnbfxm*3pL!M&u^(z>Xlhxh+4X#fBM`bk7VRCt{2 zmfeoyC=i9)2HZu8p^SqK7(4I(n0s*MVlPP2BhB3|iWMo!mpXOohkSkgfByd2w%hY; z+mDgkeVUebraQQwAye=xXW8Kkx^PA1jCS^yjpik1t0bkxv0Hp?^kg- zHE}}YK?moxJUUKnli%ST(#MZ_MwMD97|0ANsiMg*1WLP3*pByBfT@-ZS*LQn(E zHq-j(xpxa5O{3gws^a7?DkThus&mbB^ek^}#ApY}@NeB=yN^D}2v1t%gSs7yS;zFi z1@u`;I)c(HJG(Y2==0F&JtVaZn$Zu?1!3)h2~6mB10#AqJU8p0$K;10#+Z0qRkb8o zPS`M(hyLiozab)*2uPzHQ0OY8oW<}O-JjemRLcZ$&_>u6dn&6!WlwvKFPB)$3PglH zSb!Cz_2s8JdFW@Z81*q{a(H;0a^LvTy9I# zwe2$EmU<=bcUn_`GRD?xR%08H{=_`Z`1JtB2Q%eS$METX`ubgCUy8;{ ynqEQ(@FO(jn)j6!Vl9l+ScI_$(KR*6n|H68H zt-m22k9A##VO<~J+kuYYox8r5+pm*`!(kNr`LEs@B^0JF3TNP}RdIA|aF%B2a6G+g?#$ z%)aL=_i7JWNi0neg_2&y>K>5FJ(Vnp+oK(`)eT8C(so;Kp~p6tDs%qy%<>YBdFH_= zc&R6UD-eNTLRP0|Qcy5bq!?4EstTH5#tn1^$`U>Rt7M>4=`r#E`=}hZp*{ntQy);% z-;JQMEJA_eqjlG;o`Ww<7~BlP9fgW+lN~Qkbf|^}HXDuV%-SF|1c8BCmr@%3>I$trQdK!C{2U`m zrFlAbg(y0}bd>B4!gfX9p%=KdTIDcD%Xg(M*S*{6HWGu+CTCG`iM)r1Igy}E2O&E& z-9c_lJY++n_g<#idxS~|D!b-Zrt!vdXU7zjsb-hC>NKBJO1;i`&uG7^<>&~H9h9+E z8~mGeoPo{Ba7zkZk4|FOj(uX*aS{qHOpukL2NktAwAoMSaM#|0KHOzB`hns8IO6Kk zG@;)mjJW!6>SNyf$kWUiJ|)e0%?hog3?_`yH|ly%IMx**6);hUfDMHR9WqkJ8+Cmi zZ?5OjZS!cOAoGzduOP7Dxx1e%&$Uw^Jmf_UlWnxR`&nyYcNv{o4Vz;TNKYyzP8xRR z97HYt<&4FF0pH`vU?%kXz--l;_OB=GnHKZdPAIAgeQ26KT{wG@(C=8zv2o(M8BC@= zC=A8-%rAvgN*r5HYic}t_x_~$_&hs%y~fd6Y(~$V`_q~B3)|f9)sb(U)i~R6uy5xY nzJ0u(PZ5uE{mp~Ke{cN*-ZW0<(jWEg00000NkvXXu0mjfXA;uC literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m13.png b/plugins/weather/jisp/m13.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4d21f48eaac14cb632bbe3928775643c2940de GIT binary patch literal 965 zcmV;$13LVPP)n)j6!Vl9l+ScI_$(KR*6n|H68H zt-m22k9A##VO<~J+kuYYox8r5+pm*`!(kNr`LEs@B^0JF3TNP}RdIA|aF%B2a6G+g?#$ z%)aL=_i7JWNi0neg_2&y>K>5FJ(Vnp+oK(`)eT8C(so;Kp~p6tDs%qy%<>YBdFH_= zc&R6UD-eNTLRP0|Qcy5bq!?4EstTH5#tn1^$`U>Rt7M>4=`r#E`=}hZp*{ntQy);% z-;JQMEJA_eqjlG;o`Ww<7~BlP9fgW+lN~Qkbf|^}HXDuV%-SF|1c8BCmr@%3>I$trQdK!C{2U`m zrFlAbg(y0}bd>B4!gfX9p%=KdTIDcD%Xg(M*S*{6HWGu+CTCG`iM)r1Igy}E2O&E& z-9c_lJY++n_g<#idxS~|D!b-Zrt!vdXU7zjsb-hC>NKBJO1;i`&uG7^<>&~H9h9+E z8~mGeoPo{Ba7zkZk4|FOj(uX*aS{qHOpukL2NktAwAoMSaM#|0KHOzB`hns8IO6Kk zG@;)mjJW!6>SNyf$kWUiJ|)e0%?hog3?_`yH|ly%IMx**6);hUfDMHR9WqkJ8+Cmi zZ?5OjZS!cOAoGzduOP7Dxx1e%&$Uw^Jmf_UlWnxR`&nyYcNv{o4Vz;TNKYyzP8xRR z97HYt<&4FF0pH`vU?%kXz--l;_OB=GnHKZdPAIAgeQ26KT{wG@(C=8zv2o(M8BC@= zC=A8-%rAvgN*r5HYic}t_x_~$_&hs%y~fd6Y(~$V`_q~B3)|f9)sb(U)i~R6uy5xY nzJ0u(PZ5uE{mp~Ke{cN*-ZW0<(jWEg00000NkvXXu0mjfXA;uC literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m14.png b/plugins/weather/jisp/m14.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5efd2e2ef614f85eaa704173096b7d00796b65 GIT binary patch literal 993 zcmV<710MW|P)LL3R|oBztFA0#h@3Op zIY&7k-%`+VUjYEz&wCn#?FMU8VZ4Psq37$Huf)H*Awb==cbsTk>X!(>a=d%qAsqsJv);QLp>|ECPOg-i|%sT>W=$l$?8pq`1 zVVS^k+3na~b=j&xfRJb+G~SUE?@yz0))r_IOV$+F?|w+l)=#qK_p#QJNJO z4k0Jc*XEQMQ-L?6k2XOgU7(pFa@$7{=ndM23}j5|14l`}v;IfvS*#XIm<;l6A+? z_^6=IuZI^!dF}*@en2%a#xGd2gnriu;>p>KYk;8;REN1LLI}lnURHxCVI(GuvEq7k zW50~ytQ{yIg$=+)SDePyB&L&kHd^8;!bx!e0d3@T?Mm`!NIjXUo1e{yINXE~41@rG zh=9<9$#R}@g1KkYhz*K)4vG<`iYM#gk)b_&H!b4|N+_m8@afzigl)33;i%a?*vv|CHL1M<_ghKmql;q26u zxW0LQeW#t&01R?}*Mdv;jjI|MZuaF|xZvNr-apPi1^8Fc_ru%7|GEAEr4>xslo^Kj P00000NkvXXu0mjf&v)vT literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m15.png b/plugins/weather/jisp/m15.png new file mode 100644 index 0000000000000000000000000000000000000000..4018803caec802fa4204ffb049b0843b28a3007d GIT binary patch literal 1022 zcmVN zJ2x~Us-1a~gIo>{3*_U*xvr1T$g94zm9e6K-`&92)3=}djd=h717Ar*K~#90<(6%a zqdE+QO9=^1C{Ae7=Jo&o%{`$rS9j>Nv%6n65<)^e_}D&iINknYo&KHm$2s3_mwCSK zYo0H^#euj^)AqThE4UvSAe$Rxrg2Q{!vO9F>~;Y%6np<~wR3RW^&NG)06Dk&y$T_e zQlbJ=IUv|e>NZcCY;SJiziS!l9LvVhpQ>6>cYuA6)yJ(XH1`keCWIYC|`_Nd`E z2@MU(_AtHF*+&Aj=Cmli2#(=dAOfAmC{z_6g&xT^F&ZgNQfjdj&+aMIWg3J=-nDlJ zlqTH^!o|m=!ElaYJA}H;sGL|-uiIV+(G+gY5-p2ebfQ?0)d9M?5eeC`0TQjD#Z^_* z&8E>NO-xbxVfv~M>hPAfS~b9y4Ue|>DfLCmNQt~(570b$KsN0*P$bu^M#HL8V@kLQ zJd{?aSyyjcW~d|ThQP%}9+Cn?cL8~-!g#sJ-k+8X!oWqD6LX5b9H8rl z!itu3_Z{jiS8hlRNE?ZniBtCS3BqG*ADznHOGyeYFu5uO;-qxqW6c3&1NjI9dA%pB zYFcHirT{4r?)8o3-#3KJ{FP)ntw_)kb5V4V7dF2xWX> zII^nliGwBPDdfxs=4`s%A%@MmhP6|Lt%g6aI}Uww{N{pmi(^@FGO~;*!8R6u* zQ$1dQjgqL@lxQ(I7qy(-Q=mPRgRantfIG%ecaG;OMynTyd!9!7+;gjQK?3PXNfU`9 zSy7YK9KM}uw#<#%!|26ZaXO%XcP9?{k>0P^Hk8k|xoc&?Z%gg`xtFbK0 zWs7Bb8o6BV_wyF_`{g-oxqz4leIlaM+x!eB$UI~}ZP7-0o$p^!!VD*ezZ=9@>$sNT z{8$XktW^Wk1u&*fO@+slFsXr=i~?i~zLTL>P!E|CR9Z7lWGYeb)vVXsgS?PWl59i^ z;H2JzQPdS(-wq8f_p{y#08CgaDXhUJ_G>sYxLnSI6K4`g%Y|DZAFK_2T;C52Lg-|= zsjXFECez7}rf03QU&Y{VM(4q(wZdH8vQng^Ae?paif;2>R&aNk(9TwsFhHF+b)875 z-ovoxZ@JGMPww405p%9hXpLn_k>TUy`^b?;G;jt0Tm za}3Nmdo-p4%%6ET;NGn7p4Xi+YVvfF60DhcfidlQS<(;=roy@r$u zY-JrmY3hMp8{hY4PyCgDrY6Qbz!%c7I7_g`WcJ-{{!)@OAZUjn#+W%2)hhbn4$hMl zJti?^wV;66do;RrQvGW8PcHn;+HTYaS#sVqq*-u24wo~eX7L3uM*NBr<|*;VlHFyt zy*Jx=j#>~TrE?)JC?_57z0Kedam(ld5ix&MWo`PS1@=kJkg;-{vU6URroz2(Ki=gZ z+g!wAE`_}_IPDZ}kM{p}>MWQp8FPdP;nDX0g%V6-ypxXe7gyR(Ot>v@S3h@EFB|rG myFdF@@Z&Y&58fmG)%XTCk4kq*K}Ev=0000cA%5f(}iUx-L~9#bv1(_2>9*o$7kDq&ip%P z+qN6dPeKB4zpU$ex!k|aZMVz1EQ5Y$|2eGp?@-(AzAi&5Gme=E*zF}IGQ+!_=W2{; zQ>W`|3e2Ka1=FY2CUD)m7nCrmR&k~PiI!D)xICkTd521^rXDgxeV_J^LUPP!ctD-?sf84cWMyk1}o0wpsdM%WGdddJbs=UgwVU`rq$Z& zaZ8=bWO~#(Wh8i3(O}fxV6GiiDN+&$M;#&c*q;cY2U=}P7@+c7Z6{JYVt))>mX0s? zK20KKZJkYP2v3#0OMoZt@cBvgW?`#v4`7)JAz4Su)6e?;mc1LE-0@98x zN<%@alfOQUPn5>JccpN<2c*d~&XH$J%;==YkdK6bjo3rmCAPIVbl%)J#ZxFn6y8mjCtho>Xw(x*Ct#f zI~`$C_UHE&D7N%+oK;r!H;}i#+wO0F{EztmZ|l|h1?CV(Jbd;Ju>b%707*qoM6N<$ Ef*Z!LHvj+t literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m18.png b/plugins/weather/jisp/m18.png new file mode 100644 index 0000000000000000000000000000000000000000..eb64caf8c4749b07aea2b8ba1d802cfa0ce6ab5d GIT binary patch literal 779 zcmV+m1N8ifP)s4_+MMS zAI9S`O?T9E90PJc-+G04$%)$T?!d%^X2kOiTDz%E*R@fuD?)rl_{pzNZVm8mR>+f;D z#SMW_XUY02`P&eJIVK?>V6V4jinm11u@Zz%f{Ru~6a6g-PP8^+!z3Ui3~#L>wk~DJ zz$Zr%f2X?8ELJdPGuXC&5iZLJIxhhYalWodqDfh2(HhT}(ImkghHZsG30onj%ngwt zJAfY3%>$y)gp_!#Q56wVZhSPefG`Z4R?#OS>!@@vIb$XU@gWC76P&j?HkhUgkN2Pmq{+Q&$(Wt-CH5Gsifm+1D$YM*5#74>rr>4e6) zsg?6u16DCargR*ohY`P&Y)cT5UMB=a=TuaKiAChD=Tx=dB{w38RNJJ<(7cqG)k2kj;V0c=+3jRojX5y%&m(-#d+j8#qd=9~mg z3v&@@r(#Oa-5a1A#M3NB{4i&qIv+gCyN1GI#3ZrqM{f;ai%YiTV2)fGKNQ-+BH40r zZ`_0%7PTLa&>v#AWvlb?>;30;KYqD?Vfc=i-uR68=Ki^_w_k1KJ@KS2t5yI2002ov JPDHLkV1f^pYV803 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m19.png b/plugins/weather/jisp/m19.png new file mode 100644 index 0000000000000000000000000000000000000000..eb64caf8c4749b07aea2b8ba1d802cfa0ce6ab5d GIT binary patch literal 779 zcmV+m1N8ifP)s4_+MMS zAI9S`O?T9E90PJc-+G04$%)$T?!d%^X2kOiTDz%E*R@fuD?)rl_{pzNZVm8mR>+f;D z#SMW_XUY02`P&eJIVK?>V6V4jinm11u@Zz%f{Ru~6a6g-PP8^+!z3Ui3~#L>wk~DJ zz$Zr%f2X?8ELJdPGuXC&5iZLJIxhhYalWodqDfh2(HhT}(ImkghHZsG30onj%ngwt zJAfY3%>$y)gp_!#Q56wVZhSPefG`Z4R?#OS>!@@vIb$XU@gWC76P&j?HkhUgkN2Pmq{+Q&$(Wt-CH5Gsifm+1D$YM*5#74>rr>4e6) zsg?6u16DCargR*ohY`P&Y)cT5UMB=a=TuaKiAChD=Tx=dB{w38RNJJ<(7cqG)k2kj;V0c=+3jRojX5y%&m(-#d+j8#qd=9~mg z3v&@@r(#Oa-5a1A#M3NB{4i&qIv+gCyN1GI#3ZrqM{f;ai%YiTV2)fGKNQ-+BH40r zZ`_0%7PTLa&>v#AWvlb?>;30;KYqD?Vfc=i-uR68=Ki^_w_k1KJ@KS2t5yI2002ov JPDHLkV1f^pYV803 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m2.png b/plugins/weather/jisp/m2.png new file mode 100644 index 0000000000000000000000000000000000000000..54c76e4cac0cd08ab072aea47279f7c7e997363b GIT binary patch literal 456 zcmV;(0XP1MP)zq<%_AH-&*~85k0AYe=J@ildr!R#i%nhh7j53uk3mo0o&PwxUHr zD<~!$dU&BbPSF#iObm5dSO7KU@nZ+l`JE@9%}L(PVN0F6g0E!?7MH$ zf_SJD@oQVXHV~C5yr*V}pg?KWuPHbLQe^gN{YR_IH_3pu+kNo$0_(dxu5Ubt`+yJC zUNS21P_eBV6e8PJHwY<#JStD14elg^+IrjwxqYw^{F-KTPQ>FhpWuz4^5nt0SA1Au z^LUg-u)21>!PQc{Yq|)nzOq>QS_i06Sz#wCPTqQ*Kyfalq*2DiLt7|oGVu}*ET4oi yRss~zR`SyXFmolT8B6yk-qC-=gP}i`@2wByzZzZ7gW1CX0000Q& literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m20.png b/plugins/weather/jisp/m20.png new file mode 100644 index 0000000000000000000000000000000000000000..c770fadb2a7a719974117fcd1956d8ff3a423e51 GIT binary patch literal 775 zcmV+i1Ni)jP)V{kn#nxNJLmHGMik>RyXqz%#do${y8W%oOh*8~ zDl5WvyL2ElHy8*ULa@c`7M?v*5IXb1WyW)4QG_VZjwuLn_K;`}FDNEhmO?e5Dzx*v z%#s}q^5gf>HnlEOfuT~2sba?Dol7a&rqCS{yE7&Y%RK3*3lpM3f0tUvdE4P3;hRb> z1u4rDz~=ZJmSFzQ>qKZr$|a++}65cs%4hk3rOqABo=DzY9wY)HjSiY^* z^at##dVzma>+5u%=j)p%^$Wv20`V{kn#nxNJLmHGMik>RyXqz%#do${y8W%oOh*8~ zDl5WvyL2ElHy8*ULa@c`7M?v*5IXb1WyW)4QG_VZjwuLn_K;`}FDNEhmO?e5Dzx*v z%#s}q^5gf>HnlEOfuT~2sba?Dol7a&rqCS{yE7&Y%RK3*3lpM3f0tUvdE4P3;hRb> z1u4rDz~=ZJmSFzQ>qKZr$|a++}65cs%4hk3rOqABo=DzY9wY)HjSiY^* z^at##dVzma>+5u%=j)p%^$Wv20`qGs?rK+19$XridgW7n+G?Il77s}u#tjZyRDDW%dEV!mD}09-Q2<0)VI{rxv!#xk*G260005~Nkl-%tWp``E=`;l20`)|OVfiwT8w!&0II7rTNVcJxU7!I8 z9s|+lt@jKFXS5r=(!(G{tz21~=d^SvDM)=#A0EL+49u%GlgS-IR*=)^6sICZILEYIiv%Jr`?>-ov(S#@lS$5PDCQD;6zHxvs3D zRqgcPM9LXXNAIH($vMXu!n%nfK254vCxl2sw1==t#VX(wdPt+30FyZ@ z3{oTV0ssW*ag^TFI3`s~LNJVYZ~uf_MpYznR@j>w;eo?oxQn;T-xTsnHfPR`_=Orp zQrX&zWyFh`-Lc`fp}Eqs|Ri54T7$H)`{qk=3k79-vd9@Lp! zz(DB9EXgmU5>P3HXyBFvCW9ep74z6xkUzEngs5XoAN;hZRyxqb@OyFXM;#AZ z_C&HaB!}k|mSdiuHWBG;rAcIX3YO!3v?~g#^*kZQbbJ{#tUHn5DN)j6WI*sP$I{F| z)Eb@6a(uW-iq$mgC&C3DbZjOP)uEM0k`1XuyGg5X2wl)j)jgjw62HNoJY!q*qZhI)VPoDzsxYr8SW z|8gihTdM=mq_|TV(=zG4Wi%k36R%lrb<%T&7+2~=K}=`yeCMv3Yd=|F0T6GPUsT_O z9h(!^zfZAUfm6&*eTiM$eH-sUuY1IC+`316a(8bme?C3{_th>rS^JJ~00000NkvXX Hu0mjfiMAT! literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m24.png b/plugins/weather/jisp/m24.png new file mode 100644 index 0000000000000000000000000000000000000000..308942d30f2af24845ae254b4a04f9407fb4b959 GIT binary patch literal 540 zcmV+%0^|LOP)vzXD#te>5SaG{TD0004ZNkly!M4I63`DgBr9dr<Q2e|9|;{x_^mV+21phAtYSZf6nEn4?lx-T@;>$0U;5j z_mTsxDtH3`DUg|ULBvh-c9jdAk*N$>->oN`Ta`3p-uL`Wio;C%zUy`+7lhu-(3$v1 zWOGY+>tv2lNFyRz3wlLZP|+{w?j%EK&>5M019EhWFFFgY_Z|aPNTs2B!x${X9h?XW zAvSt;i*!BhoW;%1v-4BG)~NH56xCfXY0nXhIygB*ED7TihbKcJof&UQWbyQjtBte3 z9CCbcpjKmyS#y+Bn(92qv)f|?VQZV~7Fm#YZJujA1wC@?2-sS!E#{5f5txJ-Tb){r zjRC3Twr#R@Jm?LJ?+GSkth4lo+x@u?SyvdtwGT?vL5MyndsBcd#oA&5S*p)HumH}2 zq;Hu%VT*%e9mC(NEO5m+=eblDyV5t!dp`kU1sGYpHz6)h;28YuTw_w;EcdUr`{k>D e#E1L2U)vuK040VGkEkO60000y%a(&63_wwe4XBi$wTe9c|1T%#oLQ6Emi;}sd7K2X{^Nvl#<2iSE8zLi;L@4yb_vjvLNswSc9m3nWo6{%`q;-o(4IZPUMVm3cFBGoPR z`yLCqwK8J%FzoyEG@;o|tUesXERUqy8ST1hpLlYshkl9_2-*XQnF2)>pPOV1sfM29 z)Q6D~*_Y8Pej~?DhdK=T%}PnbLMbhez(|R@q#||6Frg)@ zm|4Xm=yfg&6Vfo8ITxOu26L7?S{~$V$pmr6l_moFa*l@6C#pm`%6J@{F{(+~*K4$? zeW%=h!)PqFFTBeS>}YKlSV?Jzhp|jQ3WbIiKPyz-d!0c9#x}Y)Y-bS@r|Q=(Cn`CX zV5R7uf#gwipO6F{&#+!XOyHXD;IATK5G0ejuDfI0_8YtZ5$(T-Kkm!EXhQq|%`PHw T_8{+H00000NkvXXu0mjfOpx>w literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m26.png b/plugins/weather/jisp/m26.png new file mode 100644 index 0000000000000000000000000000000000000000..24eb23b116e19532854805c9fcedea0b5d6f05db GIT binary patch literal 487 zcmVX9qX=6ftcTbj+e$C3PNklE8po~2`En{9!2L=VPtdv?+I1LO4cy&2GdX41|GAVjw>aB%81-f%kvQ;%KE_nck}U{%OX8!3c|#_-B<;;YumB6PCym zS=&w(>s3_B6Elr6*2mBVW}3YvQX%hp^6iKy6ti@4qSB0r;)8aFjMR=Wvzv#E7GM&E zeVNAz(MdLHGxQz82&=L=UvFOkrkZ=6^9VImh4gYBUy!*f0(cpI~U-V94w37f?1^ zkDV=_le>B_J-!$VIO9BfyV<~b<)+*Q-i-TIF=IgeDed|W^v6=}t+3GfHImOjpj0&| zcT}nx)O+?I#qYlk$j10kIY*eH*mVk}coPOiXd3sL_7=5h$$L-DtNkOEZ2d?8pNJpu dE)4qH^$iNR9j+u6G4lWb002ovPDHLkV1mAs*{lEn literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m27.png b/plugins/weather/jisp/m27.png new file mode 100644 index 0000000000000000000000000000000000000000..79c2de5884f4447baa40121077b0c2142157a28b GIT binary patch literal 441 zcmV;q0Y?6bP)rRacfFwV?~pX zco-KEAs-b|O*1ShA3QoShJ$Dx92gJ~4+aJVKs_jderK^R-e>>-0UAj}K~#90<(AuW z!ypVqK~ZEg1Y?Jb6GZ?2H;bLl^fjBePW66frCo6`4Jq^AN`DFf8mE-FAq;0CN(>o*iG(n!SwfeL$e2bw*gZjvQn!9j2x2t%vIS5lN!b=`9>cM$*9xR_HW#+b z&XA5_@werPH8+ITuN^#@TK!{8gh4FZv|te#cON|@0SJc2kiNFDmWs;cT4~Du};jo4qM6SVZG?yLp;=V9GzXLF) jtjH(g7c?J0f4aT_0mT^T|1D5c00000NkvXXu0mjfuEwZ} literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m28.png b/plugins/weather/jisp/m28.png new file mode 100644 index 0000000000000000000000000000000000000000..79c2de5884f4447baa40121077b0c2142157a28b GIT binary patch literal 441 zcmV;q0Y?6bP)rRacfFwV?~pX zco-KEAs-b|O*1ShA3QoShJ$Dx92gJ~4+aJVKs_jderK^R-e>>-0UAj}K~#90<(AuW z!ypVqK~ZEg1Y?Jb6GZ?2H;bLl^fjBePW66frCo6`4Jq^AN`DFf8mE-FAq;0CN(>o*iG(n!SwfeL$e2bw*gZjvQn!9j2x2t%vIS5lN!b=`9>cM$*9xR_HW#+b z&XA5_@werPH8+ITuN^#@TK!{8gh4FZv|te#cON|@0SJc2kiNFDmWs;cT4~Du};jo4qM6SVZG?yLp;=V9GzXLF) jtjH(g7c?J0f4aT_0mT^T|1D5c00000NkvXXu0mjfuEwZ} literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m29.png b/plugins/weather/jisp/m29.png new file mode 100644 index 0000000000000000000000000000000000000000..73418ee2aafa3d3d3104780b566e73af38b4f2ea GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^CLqkn3?%<=>s$e(m;-!5T!HlRD%)E?iqF%l_K$FXgDD7V;Nm7DlZvN_j^>Bg2JZtZ@o&oS- zBv@;M^vu;mQi&L&v%%}?W{>tte9|%$D|K}QxLFWW?#ICeUoDZFF?IFX6zl8b##Gs< z&kIV4z00{{3b0<=?UN`iCDeP^Jl?fkrt5GLaDEQrlh^AWFoCM2O!vqFtD)v?l~M<` z@@`Kw9(*dq_SeAM91+qd#YA)*puRHoWCo)kNVO>~#$bn1+f6s-1e?CyxjUdv4Dt0Q z6tZpZ34}OEnS+EHF})BL3GeQcrvtnvah;S1N(4Jj40XtCa9~?HIY;1;c3RgfV(P@5 z*VQ;+wS33@JV#{py_@fo`xKFFH1i6(avCskJnNJOSR9QJV`SM!^JVIvL+Q357Kbp} zTUUxxp<3I+Oi=Dcs(pK&*~@^v?%yX@ga3$s&CnmqFRmYll+4JlnU#P_Ml!;_p{Apb;Niu|#HS-67>$Ks*w(&eUO};`guJ(z)6cd!HYX1b z3RO@%Z)irYsFI+ahmVVSqM2~3p?tZri+Oft#=)h|%dpDEti!>o?nWQe0004GNklo=r|5%&sL)ADx~&kE&!;BV38KtkEJYST=!XPRnaYvN0DRC0QptBXW znSdboCT14v6asa^eT9ILus&(u_j=L&K7Gc#LUh^0-gP&wE%!Yasw;mN%I9Szak_we zuqo2Ix=amFQs{mlu(h`B%*P7MxU+3CC2Bw+qX>A;UsH>-uzPO*$&$Z3UvBkfm4ehI~0005qNklor{>D3wh2L=;zk+rX zV>CO1a%M^8DsD*8EONDF`=)8a%cZ!B#SW7jPK>Q?Gg9iP(}+A-Tj5Nyy11y43wWfl-cQ+fA*6G@#%>WGPkiear@S}sFCZkZ52u_X%2x~K}a=Rb4ik_mMsH~o+??ml`ezGU(8^w_knz~cPZ>o z0_kR}51xF*pq<_XMfH(w)`x0saTM3ntK1%`Q0AszCtPy+4^Em@?fG19e%$`Z^ zq^rF9CA3>M5oXXp>)M6zZtGwK&=Q^U9xT_?yC-wk*Chta$>4M#43a$c#YgB{&l5vh zmRys|SyTu3T_PcdoYrNXx;uhFxQ$F!%JMW=Pt6JU9{1rr09Y$H;fCctG)8*2FTPSD zb8nhB>z0EqX86-)_1Jo8m&Et!;Cawm^Zk4esEA?6Y>A1j-)iyoT=p0{AxA!c{v&>I c+5f@!1Jb@MWks&cN&o-=07*qoM6N<$f`RKeq5uE@ literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m6.png b/plugins/weather/jisp/m6.png new file mode 100644 index 0000000000000000000000000000000000000000..ca652a9972140989202b76c7d40c8f841d880f2d GIT binary patch literal 642 zcmV-|0)737P);UsH>-uzPO*$&$Z3UvBkfm4ehI~0005qNklor{>D3wh2L=;zk+rX zV>CO1a%M^8DsD*8EONDF`=)8a%cZ!B#SW7jPK>Q?Gg9iP(}+A-Tj5Nyy11y43wWfl-cQ+fA*6G@#%>WGPkiear@S}sFCZkZ52u_X%2x~K}a=Rb4ik_mMsH~o+??ml`ezGU(8^w_knz~cPZ>o z0_kR}51xF*pq<_XMfH(w)`x0saTM3ntK1%`Q0AszCtPy+4^Em@?fG19e%$`Z^ zq^rF9CA3>M5oXXp>)M6zZtGwK&=Q^U9xT_?yC-wk*Chta$>4M#43a$c#YgB{&l5vh zmRys|SyTu3T_PcdoYrNXx;uhFxQ$F!%JMW=Pt6JU9{1rr09Y$H;fCctG)8*2FTPSD zb8nhB>z0EqX86-)_1Jo8m&Et!;Cawm^Zk4esEA?6Y>A1j-)iyoT=p0{AxA!c{v&>I c+5f@!1Jb@MWks&cN&o-=07*qoM6N<$f`RKeq5uE@ literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m7.png b/plugins/weather/jisp/m7.png new file mode 100644 index 0000000000000000000000000000000000000000..d03cdfee9035a39fd10abe5135c0223b4baa13f5 GIT binary patch literal 687 zcmV;g0#N;lP)CLNmt0s<*9=(aWzYCmPMjte2I7-P*sbr;ci4LK_+p#lNChQZ{^Z zQx6UcHZminmvNSfY~|y}*VMYgx}3_xq`R_>wWo!zqk+uEsm;o<<+6~q0006CNklA#^A5M6LF&Wx19iyc1O-N3AtJra_>_vWEArlVOMQ`dAD!lt8-a zl=fd4ZTVu=d|x1X8a*8`9z6qNyQ9E+2$Fj~qjl)3v6iH|CIWg_&P17d-A^;E0;o}i zbdEYTW*beot#28Wrq*3^u9D+cjZyPG6f7zOhIFp`8dJP&3Ylze?stOe_Pkeboz#;$3#_<#xI=JHfRaiF?S}KV`H@FV?BAI$ zC`Be+z+8|P%pRb46o;|%SI~Gb9w2pE^1gOB1MbKrNc@zvzocdWkitiib5r;FFqT~Q zF#Ik^^k)G?+!CHXA`X-6H8NambKb+etfcRrzO=@}+< literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m8.png b/plugins/weather/jisp/m8.png new file mode 100644 index 0000000000000000000000000000000000000000..cab09345a5414a9d58daac69ee5f8b70d8873452 GIT binary patch literal 765 zcmVlkIu-f-P*sNn}x-{qtwu~IyNS%q=vk;m(k0u%*LuFBpHx{U$38i%fqBnO*Uy_ zL=FxLoQrAW;l-wxa@p0p!@8Wiv5&Q;g~h|F(#^8Y%COYZy45yv3IG5CTS-JgRCt`_ zmeG==APhxEn@QOa0ToF=;Qv2!gR@opruIJWruwl@-Q*@Aetq4<_9yQC`p?E+6u)hA zkB_)*o|bi4mgxg*o7ZnYE!ZP!o2>p}_SP^yqvqus ziAe2=TBABXp|*KQ298olm4e<>{eY6}j`G&3`BF?lM9Ax{85nHPW`c7&S!+Vz$ z6%Ry)it*{~uBBw|iV$>~XUeM~z!=?d1&I$f83Giu4H_dT;NhI)cLgm&QpT|u@Ol|< zN~y}n5U+~rP()((XwIKBw~8f~t&;Qxn>=Bb1iJ@-z&N`14P*m1Wx7-|o*4kDcGpVN zYNJ=gDeIj&Q>j#b-#|lPQW&C3JF!b##Qx((X$hcq6K!x=bl4On6LpL?&^IX`tQD#3 z91EhT!gy`O@(rBBN#*Rg6xsWFz;&M{8%K^ou#j7dK>Mx^IIbsRT0_oKQV0=>W??#{ zhvjnimO;u9B#Q}vsz*7lceg{u|>U v!Oh*|wD;)O{n^3&(VBXE`W^9~eXjii<2^n-W1;C000000NkvXXu0mjfo)B;W literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/m9.png b/plugins/weather/jisp/m9.png new file mode 100644 index 0000000000000000000000000000000000000000..3a91c60feb89276eb49474d28d845e980d3a2a71 GIT binary patch literal 803 zcmV+;1Kj+HP)Tyj?~b#qm*yp-N8jcF3H2D+19(Oq=+UY8Jvn`zq+E>)3?>qy0D;qZDmGTQ#my= zC69w%4-N~Il7F|Ykmcma%*n5)n|H*#p0%chy|$Ly*}u}wu{2HHjQ{`wfk{L`RCt`_ zmdl#kAPj}aTr7Mc*d}p=0KNZXRwT3Nro_`_%Ob1%-;s`P{`%^^`|q#+*MIl@Me_G~ zK8|Caf5P35ac^%tu4DHx7DNhh*!J-vc0Y#I*{3|O;?|_^V);mk4T_&W6zhRCvOw!cEs1XR zpprsm0?9~(IUAFO(hR5C#ttNgE2lx* zYCYv}qV^0_`cmRUVdty0w*6acmQsNVVe4e|g6y+auf=rnPksna6NXNF0!@>c2GAhM z4Kx!&NXtI|85)PUl&UjTF`$)63S7Y~rjykD*y0kwWRhzlz>7? zWF517fq6M&!fde`3APL!lEaqPHB9Uvw@P4fpAgoIiZsRD7RdMx6GggA3VLPAjW)B_jV zYo%VRmNqI?Q4>KESH+}G5D;+VM0OI}ah!F?2HU%D4^{TVxb!cFZ={uWSK66pe%_f` z>F(XT{6EF9myg@q+eJ7W7JJd*+{?%DcpM=F9UUG2S;w9t;C8!NU0vOaihmB^cDqGS zPmdk$k&zM6*4Bo@;b3%h)PDcwn{Nt5QN-BT*gr~5T?+d9`-LP)BoYbf#rKwFarf?B z-hTUS;c~gqb)DwsW?EWW$Y!&QkB1Pcob#9}dqhlgwQ4h#$khr_|_>}-wRx(KYT zt#RwtEnF^_?ZJ^FM?`05CykAb%+1a5?AbGPT?fGD^Rc?RieVV&y3X?QGTq(XNYel8 zXqqOz{PIiE>Ga=6AeYNY4u?Y&i$yHU5~HJ|l*?r#NusH#iMhEsHa9of+1VkJ$xtj7 z2?PQtih|4KBA?F_i9|3>laY}Tv9PefUjqR6{eG!fEQ$jM4vkRGRI63IUN0Vx2am^t!{OlGy?f+xx!p99&*#x~9n&+Ukt0Wl$K!N%b}}_JMJAIW8jaG|*N5Bf2EgI?BZEQ+DwPT?EiGg+8Is8) z<#HLX*UPuxe#`08r+M(;L7nkBfT5uw;c~f zWo5-CuQ>&SgM;++^zi7>BUV;cn3$Nr>-91_JIhyJeTAYZD2l?TpMFXwKc-Yz5A(cw;`RAWAH8oWiff|6BnHeb>jWRMa!s_ZO z#bS|;jt;*5`fDyoGI0K4Jz`Fw=KVS0LcXlQ5vAQ%jC>Cz>f&OgdVmSxt~ z)&S`0>f-k8+W@@#?z`N)c@tTd@p`>D91h0D#uy$R#^rL=M__bxRQUaVA;N^stUl#lP5{1)5Kyi8{qrzzvsR8-m~xDdFLI5hK87&oJ0tLEX$~> zimIwCEiLiz;X@Qf5td~MzuzxLM@NM-o6RygIf-eSxLhs*fdEZSO&Es3*49={rC+&n zg=^QY+0S2m@dclJ@(BR9Zr!4{x0h#!$jAsDj|YH_jSZHUm+9^8 z<(qH5LDzN0#>OyBlVC8&&6_uQ|NZx=R;xUC@PL+<7T$Q{4aUdEX=rG`^@AqR_78fsG+9=MQ&W?aPN!>9@XBepva*7zs!UBy zA%tLHV1PoQz}ngxKA#Vd$Ac`(0PO7SP%4!$O_TQab{q}|xm=Fk-d^VC=LrUbuQF3# zgaBTzR}=~be){PrhKGk492`UlK`xgg9*^U8yV+gKgb=8zN?ThS9*>7Yp}@g|2QdtT zr%#^}3_CW`0&FIZF*hT+1c44pU-pR#0db(!r?HwuGi}}OoaFcWrH2n6*3c#r34*~O!^6X9nnrVTGnQqszP?T<6hhN9!r?Ic_U+@* zqem~Rl}?>HWp7e{nSxizp+kpgY;5G`pMSQ&EXxwPTn@kAZ+E!EhYyQfE@w~5U3qyO z|JMMiRH{xvsZ;{6Cnmt$+}xiUdX? +#include + +using namespace SIM; + +const unsigned CHECK1_INTERVAL = 30 * 60; +const unsigned CHECK2_INTERVAL = 120 * 60; + +Plugin *createWeatherPlugin(unsigned base, bool bInit, Buffer *config) +{ + return new WeatherPlugin(base, bInit, config); +} + +static PluginInfo info = + { + I18N_NOOP("Weather"), + I18N_NOOP("Plugin provides show weather"), + VERSION, + createWeatherPlugin, + PLUGIN_NOLOAD_DEFAULT + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +WeatherPlugin::WeatherPlugin(unsigned base, bool bInit, Buffer *config) + : Plugin (base) + , m_bar ( NULL) +{ + m_propertyHub = SIM::PropertyHub::create("weather"); + BarWeather = registerType(); + CmdWeather = registerType(); + EventWeather = (SIM::SIMEvent)registerType(); + m_icons = getIcons()->addIconSet("icons/weather.jisp", true); + EventToolbar(BarWeather, EventToolbar::eAdd).process(); + + Command cmd; + cmd->id = CmdWeather; + cmd->text = I18N_NOOP("Not connected"); + cmd->icon = "weather"; + cmd->bar_id = BarWeather; + cmd->bar_grp = 0x1000; + cmd->flags = BTN_PICT | BTN_DIV; + EventCommandCreate(cmd).process(); + +} + +WeatherPlugin::~WeatherPlugin() +{ + delete m_bar; + EventCommandRemove(CmdWeather).process(); + EventToolbar(BarWeather, EventToolbar::eRemove).process(); + getIcons()->removeIconSet(m_icons); +} + +QByteArray WeatherPlugin::getConfig() +{ + return QByteArray(); +} + +void WeatherPlugin::timeout() +{ + if (!getSocketFactory()->isActive() || !isDone() || value("ID").toString().isEmpty()) + return; + QDateTime now = QDateTime::currentDateTime(); + if ( now < QDateTime::fromTime_t(value("Time").toUInt()).addSecs(CHECK1_INTERVAL) ) + return; + m_bForecast = false; + if ( now >= QDateTime::fromTime_t(value("ForecastTime").toUInt()).addSecs(CHECK2_INTERVAL) ) + m_bForecast = true; + QString url = "http://xoap.weather.com/weather/local/"; + url += value("ID").toString(); + url += "?cc=*&link=xoap&prod=xoap&par=1004517364&key=a29796f587f206b2&unit="; + url += value("Units").toBool() ? "s" : "m"; + if (m_bForecast && value("Forecast").toUInt()){ + url += "&dayf="; + url += QString::number(value("Forecast").toUInt()); + } + fetch(url); +} + +bool WeatherPlugin::processEvent(Event *e) +{ + if (e->type() == eEventLanguageChanged) + updateButton(); + if (e->type() == eEventInit) + showBar(); + if (e->type() == eEventCommandExec) + { + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if ((cmd->id == CmdWeather) && !value("ID").toString().isEmpty()){ + QString url = "http://www.weather.com/outlook/travel/local/"; + url += value("ID").toString(); + EventGoURL(url).process(); + return true; + } + } + if(e->type() == eEventPluginLoadConfig) + { + PropertyHubPtr hub = ProfileManager::instance()->getPropertyHub("weather"); + if(!hub.isNull()) + setPropertyHub(hub); + showBar(); + if (m_bar) + { + m_bar->setIconSize( QSize( 30, 30 ) ); + m_bar->show(); + } + } + return false; +} + +bool WeatherPlugin::done(unsigned code, Buffer &data, const QString&) +{ + if (code != 200) + return false; + QDomDocument document; + QString errorMsg; + int errorLine; + int errorColumn; + if (!document.setContent(data,false,&errorMsg,&errorLine,&errorColumn)){ + log(L_WARN, "Weather XML parse error '" + errorMsg + "' at line: " + QString::number(errorLine) + ", column:" + QString::number(errorColumn) + ")"); + return false; + } + if( !parse( document ) ) { + return false; + } + unsigned int now = QDateTime::currentDateTime().toTime_t(); + setValue("Time", now); + if (m_bForecast) + setValue("ForecastTime", now); + updateButton(); + Event eUpdate(EventWeather); + eUpdate.process(); + return false; +} + +void WeatherPlugin::barDestroyed() +{ + m_bar = NULL; +} + +void WeatherPlugin::hideBar() +{ + if (m_bar){ + delete m_bar; + m_bar = NULL; + } +} + +bool WeatherPlugin::parseTime(const QString &str, int &h, int &m) +{ + QString s = str; + h = getToken(s, ':').toLong(); + m = getToken(s, ' ').toLong(); + if ((getToken(s, ' ') == "PM") && (h < 12)) + h += 12; + if (h == 24) + h = 0; + return true; +} + +bool WeatherPlugin::parseDateTime(const QString &str, QDateTime &dt) +{ + int h, m, D, M, Y; + QString daytime; + + QString s = str; + /* MM/DD/YY/ hh:mm */ + M = getToken(s, '/').toLong(); + D = getToken(s, '/').toLong(); + Y = getToken(s, ' ').toLong(); + h = getToken(s, ':').toLong(); + m = getToken(s, ' ').toLong(); + + if (getToken(s, ' ') == "PM" && (h < 12)) + h += 12; + /* 12:20 PM is 00:20 and 12:30 AM is 12:20 + but what date is 12:20 pm 4/7/04? */ + if (h == 24) + h = 0; + if (Y < 70) + Y += 2000; + dt.setDate(QDate(Y,M,D)); + dt.setTime(QTime(h,m,0,0)); + return true; +} + +bool WeatherPlugin::isDay() +{ + int raise_h = 0, raise_m = 0; + int set_h = 0, set_m = 0; + if (!parseTime(value("Sun_raise").toString(), raise_h, raise_m) || !parseTime(value("Sun_set").toString(), set_h, set_m)) + return false; + QDateTime now = QDateTime::currentDateTime().toLocalTime(); + if ((now.time().hour() > raise_h) && (now.time().hour() < set_h)) + return true; + if ((now.time().hour() == raise_h) && (now.time().minute() >= raise_m)) + return true; + if ((now.time().hour() == set_h) && (now.time().minute() <= set_m)) + return true; + return false; +} + +void WeatherPlugin::showBar() +{ + if (m_bar || value("ID").toString().isEmpty()) + return; + + CorePlugin *core = GET_CorePlugin(); + MainWindow *main= core->getMainWindow(); + if (main == NULL) + return; + + EventToolbar e(BarWeather, main); + e.process(); + m_bar = e.toolBar(); + m_bar->setObjectName("WeatherToolbar"); + main->addToolBar(Qt::BottomToolBarArea, m_bar); + connect(m_bar, SIGNAL(destroyed()), this, SLOT(barDestroyed())); + QTimer *timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(timeout())); + QTimer::singleShot(0, this, SLOT(timeout())); + timer->start( min( CHECK1_INTERVAL, CHECK2_INTERVAL ) * 1000 ); + updateButton(); +} + +void WeatherPlugin::updateButton() +{ + if ((value("Time").toUInt() == 0) || (m_bar == NULL)) + return; + Command cmd; + cmd->id = CmdWeather; + cmd->text = I18N_NOOP("Not connected"); + cmd->icon = "weather" + QString::number(value("Icon").toUInt()); + cmd->bar_id = BarWeather; + cmd->bar_grp = 0x1000; + cmd->flags = BTN_PICT | BTN_DIV; + EventCommandChange(cmd).process(); + + QString text = unquoteText(getButtonText()); + QString tip = "

    %l

    \n"; + QString ftip = getForecastText(); + text = replace(text); + tip = replace(tip); + if (value("Forecast").toUInt()) + tip = tip + ""; + tip += "
    " + getTipText() + "

    " + i18n("weather","Forecast") + ":

    "; + unsigned n = (value("Forecast").toUInt() + 1) / 2; + if (n < 3) + n = value("Forecast").toUInt(); + for (unsigned int iDay = 1; iDay <= value("Forecast").toUInt(); iDay++){ + tip += forecastReplace(ftip,iDay); + if (--n == 0){ + tip += ""; + n = (value("Forecast").toUInt() + 1) / 2; + } + } + if (value("Forecast").toUInt()) + tip += "

    \n"; + tip += "

    "+i18n("weather", "Weather data provided by weather.com®") + "

    "; + Command cmdw; + cmdw->id = CmdWeather; + cmdw->param = m_bar; + EventCommandWidget eWidget(cmdw); + eWidget.process(); + CToolButton *btn = qobject_cast(eWidget.widget()); + if (btn == NULL) + return; + btn->setText(text); + btn->repaint(); + btn->setToolTip(tip); +} + +#if 0 +i18n("Monday") +i18n("Tuesday") +i18n("Wednesday") +i18n("Thursday") +i18n("Friday") +i18n("Saturday") +i18n("Sunday") + +i18n("weather", "Squalls") +i18n("weather", "Overcast") +i18n("weather", "Fog") +i18n("weather", "Foggy") +i18n("weather", "Mist") +i18n("weather", "Haze") +i18n("weather", "Storm") +i18n("weather", "T-Storm") +i18n("weather", "T-Storms") +i18n("weather", "Scattered T-Storms") +i18n("weather", "Thunder") +i18n("weather", "Light Rain with Thunder") +i18n("weather", "Thunder in the Vicinity") +i18n("weather", "Rain") +i18n("weather", "Light Rain") +i18n("weather", "Heavy Rain") +i18n("weather", "Freezing Rain") +i18n("weather", "Rain to Snow") +i18n("weather", "Snow") +i18n("weather", "Light Snow") +i18n("weather", "Few Snow") +i18n("weather", "Scattered Snow") +i18n("weather", "Ice Crystals") +i18n("weather", "Sleet") +i18n("weather", "Clear") +i18n("weather", "Clearing") +i18n("weather", "Showers") +i18n("weather", "Showers in the Vicinity") +i18n("weather", "Mostly Clear") +i18n("weather", "Sunny") +i18n("weather", "Fair") +i18n("weather", "Cloudy") +i18n("weather", "Clouds") +i18n("weather", "Mostly Cloudy") +i18n("weather", "Partly Cloudy") +i18n("weather", "Wind") +i18n("weather", "Windy") +i18n("weather", "Drizzle") +i18n("weather", "Heavy Drizzle") +i18n("weather", "Freezing Drizzle") +i18n("weather", "Freezing Rain") +i18n("weather", "Light Drizzle") +i18n("weather", "Drifting Snow") +i18n("weather", "Snow Grains") +i18n("weather", "Light Snow Grains") +i18n("weather", "Scattered") +i18n("weather", "Smoke") +i18n("weather", "steady") +i18n("weather", "rising") +i18n("weather", "falling") +i18n("weather", "Unlimited") + +i18n("weather", "N") +i18n("weather", "NNW") +i18n("weather", "NW") +i18n("weather", "WNW") +i18n("weather", "W") +i18n("weather", "WSW") +i18n("weather", "SW") +i18n("weather", "SSW") +i18n("weather", "S") +i18n("weather", "SSE") +i18n("weather", "SE") +i18n("weather", "ESE") +i18n("weather", "E") +i18n("weather", "ENE") +i18n("weather", "NE") +i18n("weather", "NNE") +i18n("weather", "VAR") +i18n("weather", "CALM") + +i18n("weather", "km") +i18n("weather", "mi") +i18n("weather", "km/h") +i18n("weather", "mph") +i18n("weather", "mmHg"); +i18n("weather", "inHg"); + +i18n("weather", "Low") +i18n("weather", "Moderate") +i18n("weather", "High") + +i18n("moonphase", "New") +i18n("moonphase", "Waxing Crescent") +i18n("moonphase", "First Quarter") +i18n("moonphase", "Waxing Gibbous") +i18n("moonphase", "Full") +i18n("moonphase", "Waning Gibbous") +i18n("moonphase", "Last Quarter") +i18n("moonphase", "Waning Crescent") +#endif + +static QString i18n_conditions(const QString &str) +{ + if (str.isEmpty()) + return QString(); + int n = str.indexOf(" / "); + if (n >= 0) + return i18n_conditions(str.left(n)) + " / " + i18n_conditions(str.mid(n + 3)); + n = str.indexOf(" and "); + if (n >= 0) + return i18n_conditions(str.left(n)) + " " + i18n("and") + " " + i18n_conditions(str.mid(n + 5)); + n = str.indexOf(" Early"); + if (n >= 0) + return i18n_conditions(str.left(n)) + " " + i18n("weather", "Early"); + n = str.indexOf(" Late"); + if (n >= 0) + return i18n_conditions(str.left(n)) + " " + i18n("weather", "Late"); + QString s = str; + s = s.remove(" Showers"); + s = s.remove(" Shower"); + return i18n("weather", s); +} + +QString WeatherPlugin::replace(const QString &text) +{ + QString res = text; + QString sun_set, sun_raise, updated; + QTime tmp_time; + QDateTime dt; + int h,m; + + parseTime(value("Sun_set").toString(),h,m); + tmp_time.setHMS(h,m,0,0); + sun_set = tmp_time.toString(Qt::LocalDate); + sun_set = sun_set.left(sun_set.length() - 3); + + parseTime(value("Sun_raise").toString(),h,m); + tmp_time.setHMS(h,m,0,0); + sun_raise = tmp_time.toString(Qt::LocalDate); + sun_raise = sun_raise.left(sun_raise.length() - 3); + + parseDateTime(value("Updated").toString(),dt); + updated = dt.toString(Qt::LocalDate); + updated = updated.left(updated.length() - 3); + /* double Expressions *before* single or better RegExp ! */ + res = res.replace(QRegExp("\\%mp"), i18n("moonphase", value("MoonPhase").toString())); + res = res.replace(QRegExp("\\%mi"), QString::number(value("MoonIcon").toInt())); + res = res.replace(QRegExp("\\%pp"), QString::number(value("Precipitation").toInt())); + res = res.replace(QRegExp("\\%ut"), i18n("weather", value("UV_Description").toString())); + res = res.replace(QRegExp("\\%ui"), QString::number(value("UV_Intensity").toUInt())); + res = res.replace(QRegExp("\\%t"), QString::number((int)value("Temperature").toInt()) + QChar((unsigned short)176) + value("UT").toString()); + res = res.replace(QRegExp("\\%f"), QString::number((int)value("FeelsLike").toInt()) + QChar((unsigned short)176) + value("UT").toString()); + res = res.replace(QRegExp("\\%d"), QString::number((int)value("DewPoint").toInt()) + QChar((unsigned short)176) + value("UT").toString()); + res = res.replace(QRegExp("\\%h"), QString::number(value("Humidity").toInt()) + "%"); + res = res.replace(QRegExp("\\%w"), QString::number(value("Wind_speed").toInt()) + " " + i18n("weather",value("US").toString())); + res = res.replace(QRegExp("\\%x"), QString::number(value("Wind_speed").toInt() * 10 / 36) + " " + i18n("m/s")); + res = res.replace(QRegExp("\\%g"), value("WindGust").toInt() ? QString("(") + i18n("gust") + QString(" ") + QString::number(value("WindGust").toUInt()) + i18n("weather",value("US").toString()) + QString(")") : QString("")); + res = res.replace(QRegExp("\\%y"), value("WindGust").toInt() ? QString("(") + i18n("gust") + QString(" ") + QString::number(value("WindGust").toInt() * 10 / 36) + QString(" ") + i18n("m/s") + QString(")") : QString("")); + res = res.replace(QRegExp("\\%p"), QString::number(value("Pressure").toInt()) + " " + i18n("weather", value("UP").toString())); + res = res.replace(QRegExp("\\%a"), QString::number(value("Pressure").toInt() * 75 / 100)); // deprecated! + res = res.replace(QRegExp("\\%q"), i18n("weather", value("PressureD").toString())); + res = res.replace(QRegExp("\\%l"), value("Location").toString()); + res = res.replace(QRegExp("\\%b"), i18n("weather", value("Wind").toString())); + res = res.replace(QRegExp("\\%u"), updated); + res = res.replace(QRegExp("\\%r"), sun_raise); + res = res.replace(QRegExp("\\%s"), sun_set); + res = res.replace(QRegExp("\\%c"), i18n_conditions(value("Conditions").toString())); + res = res.replace(QRegExp("\\%v"), i18n("weather", value("Visibility").toString()) + (value("Visibility").toUInt() ? ' ' + i18n("weather",value("UD").toString()) : QString())); + res = res.replace(QRegExp("\\%i"), QString::number(value("Icon").toUInt())); + res = res.replace(QRegExp("\\%o"), value("Obst").toString()); + return res; +} + +QString WeatherPlugin::forecastReplace(const QString &text, int iDay) +{ + QString sDay = QString::number(iDay); + if (value("Day").toMap().value(sDay).toString().isEmpty()) + return QString(); + QString res = text; + QString temp; + int minT = value("MinT").toMap().value(sDay).toInt(); + int maxT = value("MaxT").toMap().value(sDay).toInt(); + temp += QString::number(minT); + temp += QChar((unsigned short)176); + temp += value("UT").toString(); + if ((value("MaxT").toMap().value(sDay).toString() != QLatin1String("N/A")) && (maxT != -255)) { + temp += '/'; + temp += QString::number(maxT); + temp += QChar((unsigned short)176); + temp += value("UT").toString(); + } + QString dd = value("Day").toMap().value(sDay).toString(); + QString mon = getToken(dd, ' '); + QString day = dd; + day += ". "; + day += i18n(mon); + res = res.replace(QRegExp("\\%n"), value("DayIcon").toMap().value(sDay).toString()); + res = res.replace(QRegExp("\\%t"), temp); + res = res.replace(QRegExp("\\%c"), i18n_conditions(value("DayConditions").toMap().value(sDay).toString())); + res = res.replace(QRegExp("\\%w"), i18n(value("WDay").toMap().value(sDay).toString())); + res = res.replace(QRegExp("\\%d"), day); + return res; +} + +QString WeatherPlugin::getButtonText() +{ + QString str = value("Text").toString(); + if (str.isEmpty()) + str = i18n("%t | %c"); + return str; +} + +#define WIATHER_ICON_SIZE (93) + +QString WeatherPlugin::getTipText() +{ + QString str = value("Tip").toString(); + if (str.isEmpty()) + str = + "

    "+i18n("weather","Current Weather")+":

    \n" + "


    %c
    \n"+ + i18n("weather","Temperature")+": %t ("+i18n("weather","feels like")+": %f)
    \n"+ + i18n("weather","Humidity")+": %h
    \n"+ + i18n("weather","Chance of Precipitation")+": %pp%
    \n"+ + i18n("weather","Pressure")+": %p (%q)
    \n"+ + i18n("weather","Wind")+": %b %w %g
    \n"+ + i18n("weather","Visibility")+": %v
    \n"+ + i18n("weather","Dew Point")+": %d
    \n"+ + i18n("weather","Sunrise")+": %r
    \n"+ + i18n("weather","Sunset")+": %s
    \n"+ + i18n("weather","UV-Intensity is %ut with value %ui (of 11)")+"
    \n" + ""+i18n("weather","Moonphase")+": %mp
    \n" + "
    \n" + "
    \n"+ + i18n("weather","Updated")+": %u
    \n"; + return str; +} + +QString WeatherPlugin::getForecastText() +{ + QString str = value("ForecastTip").toString(); + if (str.isEmpty()) + str = i18n("

    %d %w


    \n" + "
    %c
    \n" + "Temperature: %t
    \n"); + + return str; +} + +QWidget *WeatherPlugin::createConfigWindow(QWidget *parent) +{ + return new WeatherCfg(parent, this); +} + +QString WeatherPlugin::GetSubElementText( + QDomElement element, + QString sSubElement, + QString sDefault /*= QString()*/ +) { + QString sResult = sDefault; + + do { + if( element.isNull() ) + break; + + QDomNodeList list = element.elementsByTagName(sSubElement); + if( list.count() <= 0 ) + break; + + //QDomNode::NodeType t = list.item(0).nodeType(); //unused + QDomElement subElement = list.item(0).toElement(); + sResult = subElement.firstChild().toCharacterData().data(); + } while( false ); + + return sResult; +} + +bool WeatherPlugin::parse(QDomDocument document) +{ + QDomElement weatherElement = document.documentElement(); + +// Parsing head element + QDomElement headElement = weatherElement.elementsByTagName("head").item(0).toElement(); + setValue("UT", GetSubElementText( headElement, "ut", "### Failed ###" ) ); + QString sUp = GetSubElementText( headElement, "up", "### Failed ###" ); + if( sUp == "in" ) { + setValue("UP", "inHg"); + } + else { + setValue("UP", sUp); + } + setValue("US", GetSubElementText( headElement, "us", "### Failed ###" ) ); + setValue("UD", GetSubElementText( headElement, "ud", "### Failed ###" ) ); + +// Parsing loc element + QDomElement locElement = weatherElement.elementsByTagName("loc").item(0).toElement(); + setValue("Location", GetSubElementText( locElement, "dnam", "### Failed ###" ) ); + setValue("Sun_raise", GetSubElementText( locElement, "sunr", "### Failed ###" ) ); + setValue("Sun_set", GetSubElementText( locElement, "suns", "### Failed ###" ) ); + +// Parsing cc element + QDomElement ccElement = weatherElement.elementsByTagName("cc").item(0).toElement(); + setValue("Obst", GetSubElementText( ccElement, "obst", "### Failed ###" ) ); + setValue("Updated", GetSubElementText( ccElement, "lsup", "### Failed ###" ) ); + setValue("Temperature", (int)GetSubElementText( ccElement, "tmp", "-10000" ).toLong() ); + setValue("FeelsLike", (int)GetSubElementText( ccElement, "flik", "-10000" ).toLong() ); + setValue("Visibility", GetSubElementText( ccElement, "vis", "### Failed ###" ) ); + setValue("DewPoint", (int)GetSubElementText( ccElement, "dewp", "-10000" ).toLong() ); + setValue("Humidity", (int)GetSubElementText( ccElement, "hmid", "-10000" ).toLong() ); + setValue("Conditions", GetSubElementText( ccElement, "t", "### Failed ###" ) ); + setValue("Icon", (unsigned int)GetSubElementText( ccElement, "icon", "0" ).toLong() ); + // Parsing cc/moon element + { + QDomElement subElement = ccElement.elementsByTagName("moon").item(0).toElement(); + setValue("MoonPhase", GetSubElementText( subElement, "t", "### Failed ###" ) ); + setValue("MoonIcon", (int)GetSubElementText( subElement, "icon", "0" ).toLong() ); + } + // Parsing cc/bar element + { + QDomElement subElement = ccElement.elementsByTagName("bar").item(0).toElement(); + float v = GetSubElementText( subElement, "r", "-10000" ).toFloat(); + if ( QString(value("UP").toString()) == "mb" ){ + v=v * 75 / 100; + setValue("Pressure", v); + setValue("UP", "mmHg"); + } else{ + setValue("Pressure", v); + } + setValue("PressureD", GetSubElementText( subElement, "d", "### Failed ###" ) ); + } + // Parsing cc/wind element + { + QDomElement subElement = ccElement.elementsByTagName("wind").item(0).toElement(); + setValue("Wind", GetSubElementText( subElement, "t", "### Failed ###" ) ); + setValue("WindGust", (int)GetSubElementText( subElement, "gust", "-10000" ).toLong() ); + setValue("Wind_speed", (int)GetSubElementText( subElement, "s", "-10000" ).toLong() ); + // wind/d dropped for now ! + } + // Parsing cc/uv element + { + QDomElement subElement = ccElement.elementsByTagName("uv").item(0).toElement(); + setValue("UV_Description", GetSubElementText( subElement, "t", "### Failed ###" ) ); + setValue("UV_Intensity", (int)GetSubElementText( subElement, "i", "-10000" ).toLong() ); + } + +// Parsing dayf element + QDomElement dayfElement = weatherElement.elementsByTagName("dayf").item(0).toElement(); + QDomNodeList list = dayfElement.elementsByTagName("day"); + for( int iDay = 0 ; iDay < list.count() ; iDay++ ) { + QDomElement dayElement = list.item(iDay).toElement(); +// dayElement.attribute("d").toLong(); + QVariantMap day = value("Day").toMap(); + day.insert(QString::number(iDay), dayElement.attribute("dt")); + setValue("Day", day); + + QVariantMap wday = value("WDay").toMap(); + wday.insert(QString::number(iDay), dayElement.attribute("t")); + setValue("WDay", wday); + + QVariantMap mint = value("MinT").toMap(); + mint.insert(QString::number(iDay), GetSubElementText(dayElement, "low", "### Failed ###")); + setValue("MinT", mint); + + QVariantMap maxt = value("MaxT").toMap(); + maxt.insert(QString::number(iDay), GetSubElementText(dayElement, "hi", "### Failed ###")); + setValue("MaxT", maxt); + + QDomNodeList listParts = dayElement.elementsByTagName("part"); + for( int iPart = 0 ; iPart < listParts.count() ; iPart++ ) { + QDomElement partElement = listParts.item(iPart).toElement(); + if( partElement.attribute("p") == "d" ) { + QVariantMap dayc = value("DayConditions").toMap(); + dayc.insert(QString::number(iDay), GetSubElementText( partElement, "t", "### Failed ###" )); + setValue("DayConditions", dayc); + + QVariantMap dayi = value("DayIcon").toMap(); + dayi.insert(QString::number(iDay), GetSubElementText(partElement, "icon", "na")); + setValue("DayIcon", dayi); + } + } + } + + return true; +} + +void WeatherPlugin::setPropertyHub(SIM::PropertyHubPtr hub) +{ + m_propertyHub = hub; +} + +SIM::PropertyHubPtr WeatherPlugin::propertyHub() +{ + return m_propertyHub; +} + +QVariant WeatherPlugin::value(const QString& key) +{ + return m_propertyHub->value(key); +} + +void WeatherPlugin::setValue(const QString& key, const QVariant& v) +{ + m_propertyHub->setValue(key, v); +} diff --git a/plugins/weather/weather.h b/plugins/weather/weather.h new file mode 100644 index 0000000..869fff6 --- /dev/null +++ b/plugins/weather/weather.h @@ -0,0 +1,83 @@ +/*************************************************************************** + weather.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _WEATHER_H +#define _WEATHER_H + +#include "propertyhub.h" +#include "plugins.h" +#include "fetch.h" +#include "event.h" + +class QToolBar; +class QDomDocument; +class QDomElement; + +namespace SIM +{ +class IconSet; +} + +class WeatherPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver, public FetchClient +{ + Q_OBJECT +public: + WeatherPlugin(unsigned, bool, Buffer*); + virtual ~WeatherPlugin(); + QString getButtonText(); + QString getTipText(); + QString getForecastText(); + void updateButton(); + void showBar(); + void hideBar(); + SIM::SIMEvent EventWeather; + QToolBar *m_bar; + + void setPropertyHub(SIM::PropertyHubPtr hub); + SIM::PropertyHubPtr propertyHub(); + QVariant value(const QString& key); + void setValue(const QString& key, const QVariant& v); +protected slots: + void timeout(); + void barDestroyed(); +protected: + QString replace(const QString&); + QString forecastReplace(const QString&, int iDay); + unsigned long BarWeather; + unsigned long CmdWeather; + char m_bForecast; + virtual QByteArray getConfig(); + bool isDay(); + bool parseTime(const QString &str, int &h, int &m); + bool parseDateTime(const QString &str, QDateTime &dt); + virtual QWidget *createConfigWindow(QWidget *parent); + virtual bool done(unsigned code, Buffer &data, const QString &headers); + virtual bool processEvent(SIM::Event *e); + SIM::IconSet *m_icons; + + bool parse(QDomDocument document); + QString GetSubElementText( + QDomElement element, + QString sSubElement, + QString sDefault = QString() + ); +private: + SIM::PropertyHubPtr m_propertyHub; +}; + +#endif + diff --git a/plugins/weather/weather.rc b/plugins/weather/weather.rc new file mode 100644 index 0000000..3142c0a --- /dev/null +++ b/plugins/weather/weather.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Weather plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "weather\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "weather.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/weather/weather.vcproj b/plugins/weather/weather.vcproj new file mode 100644 index 0000000..43af3dd --- /dev/null +++ b/plugins/weather/weather.vcproj @@ -0,0 +1,848 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/weather/weathercfg.cpp b/plugins/weather/weathercfg.cpp new file mode 100644 index 0000000..fb2b397 --- /dev/null +++ b/plugins/weather/weathercfg.cpp @@ -0,0 +1,158 @@ +/*************************************************************************** + weathercfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "weathercfg.h" + +#include "wifacecfg.h" +#include "weather.h" + +#include "log.h" +#include "misc.h" + +#include "simgui/ballonmsg.h" + +#include +#include +#include + +using namespace SIM; + +WeatherCfg::WeatherCfg(QWidget *parent, WeatherPlugin *plugin) + : QWidget(parent), m_iface(0) +{ + setupUi(this); + m_plugin = plugin; + lblLnk->setUrl("http://www.weather.com/?prod=xoap&par=1004517364"); + lblLnk->setText(QString("Weather data provided by weather.com") + QChar((unsigned short)174)); + connect(btnSearch, SIGNAL(clicked()), this, SLOT(search())); + connect(cmbLocation->lineEdit(), SIGNAL(textChanged(const QString&)), this, SLOT(textChanged(const QString&))); + connect(cmbLocation, SIGNAL(activated(int)), this, SLOT(activated(int))); + textChanged(QString()); + fill(); + for (QObject *p = parent; p != NULL; p = p->parent()){ + QTabWidget *tab = qobject_cast(p); + if(!tab) + continue; + m_iface = new WIfaceCfg(tab, plugin); + tab->addTab(m_iface, i18n("Interface")); + tab->adjustSize(); + break; + } +} + +WeatherCfg::~WeatherCfg() +{ +// do not delete - it gets deleted when QTabWidget (=parent) goes away +// delete m_iface; +} + +void WeatherCfg::textChanged(const QString &text) +{ + btnSearch->setEnabled(!text.isEmpty() && isDone()); +} + +void WeatherCfg::search() +{ + if (!isDone()){ + stop(); + btnSearch->setText(i18n("&Search")); + textChanged(cmbLocation->lineEdit()->text()); + return; + } + if (cmbLocation->lineEdit()->text().isEmpty()) + return; + btnSearch->setText(i18n("&Cancel")); + QString url = "http://xoap.weather.com/search/search?where="; + url += toTranslit(cmbLocation->lineEdit()->text()); + fetch(url); +} + +bool WeatherCfg::done(unsigned, Buffer &data, const QString&) +{ + m_ids.clear(); + m_names.clear(); + QDomDocument doc; + if( !doc.setContent(data) ) { + log(L_WARN, "XML parse error"); + } + QDomElement el = doc.firstChildElement( "search" ); + if( !el.isNull() ) { + el = el.firstChildElement( "loc" ); + while( !el.isNull() ) { + QString sId = el.attribute( "id" ); + QString sLocation = el.text(); + m_ids.append(sId); + m_names.append(sLocation); + el = el.nextSiblingElement( "loc" ); + } + } + btnSearch->setText(i18n("&Search")); + QString oldText = cmbLocation->lineEdit()->text(); + cmbLocation->clear(); + if (m_ids.empty()){ + cmbLocation->lineEdit()->setText(oldText); + BalloonMsg::message(i18n("Location %1 not found") .arg(oldText), btnSearch, false); + }else{ + cmbLocation->addItems(m_names); + cmbLocation->setCurrentIndex(0); + activated(0); + } + textChanged(cmbLocation->lineEdit()->text()); + return false; +} + +bool WeatherCfg::processEvent(Event *e) +{ + if (e->type() == m_plugin->EventWeather) + fill(); + return false; +} + +void WeatherCfg::fill() +{ + edtID->setText(m_plugin->value("ID").toString()); + cmbUnits->setCurrentIndex(m_plugin->value("Units").toBool() ? 1 : 0); + cmbLocation->lineEdit()->setText(m_plugin->value("Location").toString()); + edtDays->setValue(m_plugin->value("Forecast").toUInt()); +} + +void WeatherCfg::activated(int n) +{ + if (n >= m_ids.size()) + return; + edtID->setText(m_ids[n]); +} + +void WeatherCfg::apply() +{ + m_plugin->setValue("Units", cmbUnits->currentIndex() != 0); + m_plugin->setValue("Forecast", (unsigned int)edtDays->text().toULong()); + m_plugin->setValue("ID", edtID->text()); + m_plugin->setValue("Location", cmbLocation->lineEdit()->text()); + m_iface->apply(); + if (!m_plugin->value("ID").toString().isEmpty()){ + m_plugin->showBar(); + m_plugin->updateButton(); + if (m_plugin->m_bar) + m_plugin->m_bar->show(); + m_plugin->setValue("Time", 0); + m_plugin->setValue("ForecastTime", 0); + QTimer::singleShot(0, m_plugin, SLOT(timeout())); + }else{ + m_plugin->hideBar(); + } +} diff --git a/plugins/weather/weathercfg.h b/plugins/weather/weathercfg.h new file mode 100644 index 0000000..a7310c2 --- /dev/null +++ b/plugins/weather/weathercfg.h @@ -0,0 +1,51 @@ +/*************************************************************************** + weathercfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _WEATHERCFG_H +#define _WEATHERCFG_H + +#include "event.h" +#include "fetch.h" + +#include "ui_weathercfgbase.h" + +class WeatherPlugin; +class WIfaceCfg; + +class WeatherCfg : public QWidget, public Ui::WeatherCfgBase, public SIM::EventReceiver, public FetchClient +{ + Q_OBJECT +public: + WeatherCfg(QWidget *parent, WeatherPlugin*); + ~WeatherCfg(); +public slots: + void apply(); + void search(); + void activated(int index); + void textChanged(const QString&); +protected: + bool done(unsigned code, Buffer &data, const QString &headers); + virtual bool processEvent(SIM::Event *e); + void fill(); + WeatherPlugin *m_plugin; + WIfaceCfg *m_iface; + QStringList m_ids; + QStringList m_names; +}; + +#endif + diff --git a/plugins/weather/weathercfgbase.ui b/plugins/weather/weathercfgbase.ui new file mode 100644 index 0000000..6203efc --- /dev/null +++ b/plugins/weather/weathercfgbase.ui @@ -0,0 +1,215 @@ + + WeatherCfgBase + + + + 0 + 0 + 337 + 196 + + + + Form1 + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + Location ID: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 1 + 0 + 0 + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + 0 + + + 6 + + + + + + 7 + 0 + 0 + 0 + + + + true + + + + + + + &Search + + + + + + + + + You can enter ID as part URL for your location on weather.com + + + false + + + + + + + + + + 0 + + + 6 + + + + + + Metric + + + + + Standart + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + 10 + + + + + + + Forecast days: + + + false + + + + + + + Units: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + LinkLabel + QWidget +
    simgui/linklabel.h
    +
    +
    + + +
    diff --git a/plugins/weather/wifacecfg.cpp b/plugins/weather/wifacecfg.cpp new file mode 100644 index 0000000..5d1123a --- /dev/null +++ b/plugins/weather/wifacecfg.cpp @@ -0,0 +1,129 @@ +/*************************************************************************** + wifacecfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "wifacecfg.h" + +#include "weather.h" + +#include "misc.h" +#include "unquot.h" +#include "simgui/ballonmsg.h" + +using namespace SIM; + +static const char *helpList[] = + { + "%t", + I18N_NOOP("Temperature"), + "%f", + I18N_NOOP("Feels like"), + "%h", + I18N_NOOP("Humidity"), + "%b", + I18N_NOOP("Wind direction"), + "%w", + I18N_NOOP("Wind speed"), + "%g", + I18N_NOOP("Wind gust"), + "%x", + I18N_NOOP("Wind speed (m/s)"), + "%y", + I18N_NOOP("Wind gust (m/s)"), + "%p", + I18N_NOOP("Pressure"), + "%q", + I18N_NOOP("Pressure state"), + "%v", + I18N_NOOP("Visibility"), + "%d", + I18N_NOOP("Dew Point"), + "%l", + I18N_NOOP("Location"), + "%u", + I18N_NOOP("Updated"), + "%r", + I18N_NOOP("Sunraise"), + "%s", + I18N_NOOP("Sunset"), + "%c", + I18N_NOOP("Conditions"), + "%o", + I18N_NOOP("Obst"), + NULL + }; + +static const char *helpForecastList[] = + { + "%t", + I18N_NOOP("Temperature"), + "%n", + I18N_NOOP("Number"), + "%w", + I18N_NOOP("Day of week"), + "%d", + I18N_NOOP("Date"), + "%c", + I18N_NOOP("Conditions"), + NULL + }; + +WIfaceCfg::WIfaceCfg(QWidget *parent, WeatherPlugin *plugin) + : QWidget(parent) +{ + setupUi(this); + m_plugin = plugin; + setButtonsPict(this); + edtText->setText(unquoteText(m_plugin->getButtonText())); + edtTip->setPlainText(m_plugin->getTipText()); + edtForecastTip->setPlainText(m_plugin->getForecastText()); + edtText->setHelpList(helpList); + edtTip->setHelpList(helpList); + edtForecastTip->setHelpList(helpForecastList); + connect(btnHelp, SIGNAL(clicked()), this, SLOT(help())); +} + +WIfaceCfg::~WIfaceCfg() +{ +} + +void WIfaceCfg::apply() +{ + if (edtText->text() != unquoteText(m_plugin->getButtonText())){ + m_plugin->setValue("Text", edtText->text()); + } + if (edtTip->toPlainText() != m_plugin->getTipText()){ + m_plugin->setValue("Tip", edtTip->toPlainText()); + } + if (edtForecastTip->toPlainText() != m_plugin->getForecastText()){ + m_plugin->setValue("ForecastTip", edtForecastTip->toPlainText()); + } +} + +void WIfaceCfg::help() +{ + QString str = i18n("In text you can use:"); + str += "\n\n"; + for (const char **p = helpList; *p;){ + str += *(p++); + str += " - "; + str += unquoteText(i18n(*(p++))); + str += "\n"; + } + BalloonMsg::message(str, btnHelp, false, 400); +} + + diff --git a/plugins/weather/wifacecfg.h b/plugins/weather/wifacecfg.h new file mode 100644 index 0000000..ee9bcd2 --- /dev/null +++ b/plugins/weather/wifacecfg.h @@ -0,0 +1,39 @@ +/*************************************************************************** + wifacecfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _WIFACECFG_H +#define _WIFACECFG_H + +#include "ui_wifacecfgbase.h" + +class WeatherPlugin; + +class WIfaceCfg : public QWidget, public Ui::WIfaceCfgBase +{ + Q_OBJECT +public: + WIfaceCfg(QWidget *parent, WeatherPlugin*); + virtual ~WIfaceCfg(); +public slots: + void apply(); + void help(); +protected: + WeatherPlugin *m_plugin; +}; + +#endif + diff --git a/plugins/weather/wifacecfgbase.ui b/plugins/weather/wifacecfgbase.ui new file mode 100644 index 0000000..5338adc --- /dev/null +++ b/plugins/weather/wifacecfgbase.ui @@ -0,0 +1,106 @@ + + + WIfaceCfgBase + + + + 0 + 0 + 371 + 236 + + + + Form1 + + + + 11 + + + + + + + Button text: + + + false + + + + + + + + + + + + Button tip: + + + false + + + + + + + + + + Forecast tip: + + + false + + + + + + + + + + + + &Help + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + LineEdit + QWidget +
    simgui/editfile.h
    +
    + + MultiLineEdit + QWidget +
    simgui/editfile.h
    +
    +
    + + +
    diff --git a/plugins/windock/CMakeLists.txt b/plugins/windock/CMakeLists.txt new file mode 100644 index 0000000..0266402 --- /dev/null +++ b/plugins/windock/CMakeLists.txt @@ -0,0 +1,24 @@ +IF(BUILD_DROPPED) +IF(WIN32) + ################### + # windock library # + ################### + SET(windock_SRCS + windock.cpp + ) + + SET(windock_HDRS + windock.h + ) + + # some needed include dirs + INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/plugins/ontop) + + REMOVE_DEFINITIONS(-DQT3_SUPPORT) + REMOVE_DEFINITIONS(-DQT_3SUPPORT_LIB) + REMOVE_DEFINITIONS(-DQT3_SUPPORT_WARNINGS) + SIM_ADD_PLUGIN(windock) +ELSE(WIN32) + MESSAGE(STATUS "Windock plugin can only be used on windows") +ENDIF(WIN32) +ENDIF(BUILD_DROPPED) diff --git a/plugins/windock/configure.in.in b/plugins/windock/configure.in.in new file mode 100644 index 0000000..3038590 --- /dev/null +++ b/plugins/windock/configure.in.in @@ -0,0 +1 @@ +AM_CONDITIONAL(ENABLE_WINDOCK, test "$kde_use_qt_win" = "yes") diff --git a/plugins/windock/windock.cpp b/plugins/windock/windock.cpp new file mode 100644 index 0000000..79729ae --- /dev/null +++ b/plugins/windock/windock.cpp @@ -0,0 +1,535 @@ +/*************************************************************************** + windock.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include + +#include +#include +#include +#include + +#include "misc.h" + +#include "windock.h" +#include "ontop.h" +#include "core.h" +#include "core_consts.h" +#include "mainwin.h" + +using namespace std; +using namespace SIM; + +const unsigned short ABE_FLOAT = USHRT_MAX; + +static WinDockPlugin *dock = NULL; + +Plugin *createWinDockPlugin(unsigned base, bool, Buffer *config) +{ + Plugin *plugin = new WinDockPlugin(base, config); + return plugin; +} + +static PluginInfo info = + { + I18N_NOOP("Dock"), + I18N_NOOP("Plugin provides dock main window to left or right side of screen"), + VERSION, + createWinDockPlugin, + 0 + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +static QWidget *pMain = NULL; +static UINT WM_APPBAR = 0; +static WNDPROC oldProc = NULL; +static bool bOldVisible = true; +static bool bAutoHideVisible = true; +static bool bFullScreen = false; +static bool bMoving = false; +static bool bSizing = false; + +UINT appBarMessage(DWORD dwMessage, UINT uEdge=ABE_FLOAT, LPARAM lParam=0, QRect *rc=NULL) +{ + APPBARDATA abd; + abd.cbSize = sizeof(abd); + abd.hWnd = pMain->winId(); + abd.uCallbackMessage = WM_APPBAR; + abd.uEdge = uEdge; + if (rc) + { + abd.rc.left = rc->left(); + abd.rc.top = rc->top(); + abd.rc.right = rc->right(); + abd.rc.bottom = rc->bottom(); + } + else + { + abd.rc.left = 0; + abd.rc.top = 0; + abd.rc.right = 0; + abd.rc.bottom = 0; + } + abd.lParam = lParam; + UINT uRetVal = SHAppBarMessage(dwMessage, &abd); + + if (rc != NULL) + rc->setCoords(abd.rc.left, abd.rc.top, abd.rc.right, abd.rc.bottom); + return uRetVal; +} + +static unsigned short getEdge(RECT *rcWnd = NULL) +{ + RECT rc; + if (!rcWnd) + { + GetWindowRect(pMain->winId(), &rc); + rcWnd = &rc; + } + if (rcWnd->left <= 0) + return ABE_LEFT; + if (rcWnd->right >= GetSystemMetrics(SM_CXSCREEN)) + return ABE_RIGHT; + return ABE_FLOAT; +} + +static void getBarRect(UINT state, QRect &rc, RECT *rcWnd = NULL) +{ + RECT rcWork; + SystemParametersInfoA(SPI_GETWORKAREA, 0, &rcWork, 0); + rc.setCoords(0, rcWork.top, GetSystemMetrics(SM_CXSCREEN), rcWork.bottom); + appBarMessage(ABM_QUERYPOS, state, FALSE, &rc); + int w; + if (rcWnd) + w = rcWnd->right - rcWnd->left; + else + { + GetWindowRect(pMain->winId(), &rcWork); +#ifdef WIN32 + w = rcWork.right - rcWork.left-1; +#else + w = rcWork.right - rcWork.left; +#endif + } + switch (state) + { + case ABE_LEFT: + rc.setRight(rc.left() + w); + break; + case ABE_RIGHT: + rc.setLeft(rc.right() - w); + break; + } +} + +const int SLIDE_INTERVAL = 800; + +void slideWindow (const QRect &rcEnd, bool bAnimate) +{ + BOOL fFullDragOn; + + // Only slide the window if the user has FullDrag turned on + SystemParametersInfoA(SPI_GETDRAGFULLWINDOWS, 0, &fFullDragOn, 0); + + // Get the current window position + RECT rcWnd; + GetWindowRect(pMain->winId(), &rcWnd); + QRect rcStart; + rcStart.setCoords(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom); + + if (bAnimate && fFullDragOn && (rcStart != rcEnd)) + { + static_cast(pMain)->m_bNoResize = true; + // Get our starting and ending time. + DWORD dwTimeStart = GetTickCount(); + DWORD dwTimeEnd = dwTimeStart + SLIDE_INTERVAL; + DWORD dwTime; + + while ((dwTime = ::GetTickCount()) < dwTimeEnd) + { + int delta = (int)(dwTime - dwTimeStart); + QRect rc = rcStart; + rc.setLeft(rcStart.left() + + (rcEnd.left() - rcEnd.left()) * delta / SLIDE_INTERVAL); + rc.setTop(rcStart.top() + + (rcEnd.top() - rcEnd.top()) * delta / SLIDE_INTERVAL); + rc.setWidth(rcStart.width() + + (rcEnd.width() - rcEnd.width()) * delta / SLIDE_INTERVAL); + rc.setHeight(rcStart.height() + + (rcEnd.height() - rcEnd.height()) * delta / SLIDE_INTERVAL); + SetWindowPos(pMain->winId(), NULL, + rc.left(), rc.top(), rc.width(), rc.height(), + SWP_NOZORDER | SWP_NOACTIVATE | SWP_DRAWFRAME); + UpdateWindow(pMain->winId()); + } + static_cast(pMain)->m_bNoResize = false; + } + EventInTaskManager((dock->getState() == ABE_FLOAT)).process(); + SetWindowPos(pMain->winId(), NULL, + rcEnd.left(), rcEnd.top(), rcEnd.width(), rcEnd.height(), + SWP_NOZORDER | SWP_NOACTIVATE | SWP_DRAWFRAME); + UpdateWindow(pMain->winId()); +} + +void setBarState(bool bAnimate = false) +{ + if ((dock->getState() == ABE_FLOAT) || !pMain->isVisible()) + { + appBarMessage(ABM_SETPOS, ABE_FLOAT, FALSE); + } + else + { + if (dock->getAutoHide() && !appBarMessage(ABM_SETAUTOHIDEBAR, dock->getState(), TRUE, NULL)) + { + dock->setAutoHide(false); + QMessageBox::warning(NULL, i18n("Error"), + i18n("There is already an auto hidden window on this edge.\nOnly one auto hidden window is allowed on each edge."), + QMessageBox::Ok, 0); + } + QRect rc; + getBarRect(dock->getState(), rc); + if (dock->getAutoHide()) + { + QRect rcAutoHide = rc; + int w = 4 * GetSystemMetrics(SM_CXBORDER); + if (dock->getState() == ABE_LEFT) + rcAutoHide.setRight(rcAutoHide.left() + w); + else + rcAutoHide.setLeft(rcAutoHide.right() - w); + + appBarMessage(ABM_SETPOS, dock->getState(), FALSE, &rcAutoHide); + if (!bAutoHideVisible) + { + if (bOldVisible) + dock->setWidth(rc.width() - GetSystemMetrics(SM_CXBORDER) * 2); + MINMAXINFO mmInfo; + rc = rcAutoHide; + SendMessageA(pMain->winId(), WM_GETMINMAXINFO, 0, (LPARAM)&mmInfo); + if (dock->getState() == ABE_LEFT) + rc.setLeft(rc.right() - mmInfo.ptMinTrackSize.x); + else + rc.setRight(rc.left() + mmInfo.ptMinTrackSize.x); + + } + else if (dock->getState() == ABE_LEFT) + rc.setRight(rc.left() + dock->getWidth()); + else + rc.setLeft(rc.right() - dock->getWidth()); + bOldVisible = bAutoHideVisible; + } + else + appBarMessage(ABM_SETPOS, dock->getState(), FALSE, &rc); + slideWindow(rc, bAnimate); + } + if (pMain->isVisible()) + { + EventOnTop(bFullScreen).process(); + if (!bFullScreen && (qApp->activeWindow() == pMain)) + appBarMessage(ABM_ACTIVATE); + } +} + +LRESULT CALLBACK dockWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + LRESULT res; + if (msg == WM_APPBAR) + { + switch (wParam) + { + case ABN_FULLSCREENAPP: + if ((lParam != 0) == bFullScreen) + break; + bFullScreen = (lParam != 0); + setBarState(); + break; + case ABN_POSCHANGED: + if (dock->getState() != ABE_FLOAT) + setBarState(); + break; + } + } + if(!oldProc) + return DefWindowProc(hWnd, msg, wParam, lParam); + unsigned type; + RECT *prc; + RECT rcWnd; + QRect rc; + unsigned oldState; + switch (msg) + { + case WM_DESTROY: + res = oldProc(hWnd, msg, wParam, lParam); + appBarMessage(ABM_REMOVE); + WNDPROC p; + p = (WNDPROC)SetWindowLongW(hWnd, GWL_WNDPROC, (LONG)oldProc); + if (p == 0) + p = (WNDPROC)SetWindowLongA(hWnd, GWL_WNDPROC, (LONG)oldProc); + oldProc = NULL; + return res; + case WM_SHOWWINDOW: + res = oldProc(hWnd, msg, wParam, lParam); + if (dock->getState() != ABE_FLOAT) + QTimer::singleShot(0, dock, SLOT(slotSetState())); + return res; + case WM_ACTIVATE: + if (dock->getState() != ABE_FLOAT) + { + if ((wParam == WA_INACTIVE) && dock->getAutoHide() && bAutoHideVisible) + { + bAutoHideVisible = false; + setBarState(); + dock->enableAutoHide(false); + } + appBarMessage(ABM_ACTIVATE); + } + break; + case WM_NCMOUSEMOVE: + if ((dock->getState() != ABE_FLOAT) && dock->getAutoHide() && !bAutoHideVisible) + { + bAutoHideVisible = true; + setBarState(true); + dock->enableAutoHide(true); + } + break; + case WM_ENTERSIZEMOVE: + bMoving = true; + bSizing = true; + if (dock->getState() == ABE_FLOAT) + { + bSizing = false; + GetWindowRect(hWnd, &rcWnd); + dock->setHeight(rcWnd.bottom - rcWnd.top); + } + return DefWindowProc(hWnd, msg, wParam, lParam); + case WM_EXITSIZEMOVE: + bMoving = false; + oldState = dock->getState(); + dock->setState(getEdge()); + GetWindowRect(hWnd, &rcWnd); + if ((dock->getState() == ABE_FLOAT) && (oldState != ABE_FLOAT)) + { + rcWnd.bottom = rcWnd.top + dock->getHeight(); + SetWindowPos(pMain->winId(), NULL, + rcWnd.left, rcWnd.top, rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top, + SWP_NOZORDER | SWP_NOACTIVATE | SWP_DRAWFRAME); + } + dock->setWidth(rcWnd.right - rcWnd.left); + setBarState(true); + return DefWindowProc(hWnd, msg, wParam, lParam); + case WM_MOVING: + case WM_SIZING: + if (!bMoving) break; + prc = (RECT*)lParam; + type = getEdge(prc); + if (type == ABE_FLOAT) + { + if (bSizing) + { + prc->bottom = prc->top + dock->getHeight(); + bSizing = false; + } + } + else + { + getBarRect(type, rc, prc); + prc->left = rc.left(); + prc->top = rc.top(); + prc->right = rc.right(); + prc->bottom = rc.bottom(); + bSizing = true; + } + return 1; + case WM_WINDOWPOSCHANGED: + res = oldProc(hWnd, msg, wParam, lParam); + if (dock->getState() != ABE_FLOAT) + appBarMessage(ABM_WINDOWPOSCHANGED); + return res; + } + return oldProc(hWnd, msg, wParam, lParam); +} + +static DataDef winDockData[] = + { + { "AutoHide", DATA_BOOL, 1, 0 }, + { "State", DATA_ULONG, 1, DATA(-1) }, + { "Height", DATA_ULONG, 1, 0 }, + { "Width", DATA_ULONG, 1, 0 }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +WinDockPlugin::WinDockPlugin(unsigned base, Buffer *config) + : Plugin(base), EventReceiver(DefaultPriority - 1) +{ + dock = this; + + load_data(winDockData, &data, config); + + CmdAutoHide = registerType(); + + Command cmd; + cmd->id = CmdAutoHide; + cmd->text = I18N_NOOP("AutoHide"); + cmd->menu_id = MenuMain; + cmd->menu_grp = 0x7001; + cmd->flags = COMMAND_CHECK_STATE; + + m_bInit = false; + + m_autoHide = new QTimer(this); + connect(m_autoHide, SIGNAL(timeout()), this, SLOT(slotAutoHide())); + + EventCommandCreate(cmd).process(); + + WM_APPBAR = RegisterWindowMessageA("AppBarNotify"); + init(); +} + +WinDockPlugin::~WinDockPlugin() +{ + uninit(); + EventCommandRemove(CmdAutoHide).process(); + free_data(winDockData, &data); +} + +void WinDockPlugin::uninit() +{ + QWidget *main = getMainWindow(); + if (main && oldProc) + { + appBarMessage(ABM_REMOVE); + if (IsWindowUnicode(pMain->winId())) + SetWindowLongW(main->winId(), GWL_WNDPROC, (LONG)oldProc); + else + SetWindowLongA(main->winId(), GWL_WNDPROC, (LONG)oldProc); + oldProc = NULL; + } +} + + +bool WinDockPlugin::processEvent(Event *e) +{ + if (e->type() == eEventCommandExec){ + EventCommandExec *ece = static_cast(e); + CommandDef *cmd = ece->cmd(); + if (cmd->id == CmdAutoHide) + { + dock->setAutoHide((cmd->flags & COMMAND_CHECKED) != 0); + bAutoHideVisible = true; + setBarState(); + enableAutoHide(getAutoHide()); + return true; + } + } + else if (e->type() == eEventCheckCommandState) + { + EventCheckCommandState *ecs = static_cast(e); + CommandDef *cmd = ecs->cmd(); + if ((cmd->id == CmdAutoHide) && (dock->getState() != ABE_FLOAT)) + { + cmd->flags &= ~COMMAND_CHECKED; //Strokes the bit + if (dock->getAutoHide()) + cmd->flags |= COMMAND_CHECKED; //Sets the bit + return true; + } + } + else if ((e->type() == eEventInit) && !m_bInit) + init(); + if (e->type() == eEventInTaskManager){ + EventInTaskManager *eitm = static_cast(e); + if ((dock->getState() != ABE_FLOAT) && eitm->showInTaskmanager()) + { + EventInTaskManager(false).process(); + return true; + } + } + return false; +} + +void WinDockPlugin::init() +{ + if (m_bInit) + return; + pMain = getMainWindow(); + if (pMain) + { + if (IsWindowUnicode(pMain->winId())) + oldProc = (WNDPROC)SetWindowLongW(pMain->winId(), GWL_WNDPROC, (LONG)dockWndProc); + else + oldProc = (WNDPROC)SetWindowLongA(pMain->winId(), GWL_WNDPROC, (LONG)dockWndProc); + appBarMessage(ABM_NEW); + m_bInit = true; + setBarState(); + pMain->installEventFilter(this); + } +} + +void WinDockPlugin::slotSetState() +{ + setBarState(); +} + +void WinDockPlugin::slotAutoHide() +{ + if (pMain->isActiveWindow()) + return; + DWORD pos = GetMessagePos(); + int x = GET_X_LPARAM(pos); + int y = GET_Y_LPARAM(pos); + RECT rc; + GetWindowRect(pMain->winId(), &rc); + rc.left -= GetSystemMetrics(SM_CXDOUBLECLK) * 2; + rc.right += GetSystemMetrics(SM_CXDOUBLECLK) * 2; + if (x >= rc.left && x <= rc.right && y >= rc.top && y <= rc.bottom) + return; + if (getState() != ABE_FLOAT && getAutoHide() && bAutoHideVisible) + { + bAutoHideVisible = false; + setBarState(true); + enableAutoHide(false); + } +} + +void WinDockPlugin::enableAutoHide(bool bState) +{ + if (bState) + m_autoHide->start(1000); + else + m_autoHide->stop(); +} + +bool WinDockPlugin::eventFilter(QObject *o, QEvent *e) +{ + if ((e->type() == QEvent::Hide) && getAutoHide()) + return true; + return QObject::eventFilter(o, e); +} + +QByteArray WinDockPlugin::getConfig() +{ + return save_data(winDockData, &data); +} + +QWidget *WinDockPlugin::getMainWindow() +{ + CorePlugin *core = GET_CorePlugin(); + return core->getMainWindow(); +} + diff --git a/plugins/windock/windock.h b/plugins/windock/windock.h new file mode 100644 index 0000000..43762bc --- /dev/null +++ b/plugins/windock/windock.h @@ -0,0 +1,68 @@ +/*************************************************************************** + windock.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _WINDOCK_H +#define _WINDOCK_H + +#include + +#include "cfg.h" +#include "event.h" +#include "plugins.h" + +class QWidget; +class QTimer; + +struct WinDockData +{ + SIM::Data AutoHide; + SIM::Data State; + SIM::Data Height; + SIM::Data Width; +}; + +class QTimer; + +class WinDockPlugin : public QObject, public SIM::Plugin, public SIM::EventReceiver +{ + Q_OBJECT +public: + WinDockPlugin(unsigned, Buffer*); + virtual ~WinDockPlugin(); + PROP_BOOL(AutoHide); + PROP_USHORT(State); + PROP_ULONG(Height); + PROP_ULONG(Width); + void enableAutoHide(bool); +protected slots: + void slotSetState(); + void slotAutoHide(); +protected: + virtual bool processEvent(SIM::Event *e); + virtual bool eventFilter(QObject*, QEvent*); + virtual QByteArray getConfig(); + QWidget *getMainWindow(); + unsigned CmdAutoHide; + bool m_bInit; + void init(); + void uninit(); + QTimer *m_autoHide; + WinDockData data; +}; + +#endif + diff --git a/plugins/windock/windock.rc b/plugins/windock/windock.rc new file mode 100644 index 0000000..af5c9e9 --- /dev/null +++ b/plugins/windock/windock.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Windocl plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "windock\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "windock.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/windock/windock.vcproj b/plugins/windock/windock.vcproj new file mode 100644 index 0000000..474cdf7 --- /dev/null +++ b/plugins/windock/windock.vcproj @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/yahoo/CMakeLists.txt b/plugins/yahoo/CMakeLists.txt new file mode 100644 index 0000000..9cefad1 --- /dev/null +++ b/plugins/yahoo/CMakeLists.txt @@ -0,0 +1,40 @@ +################# +# yahoo library # +################# +IF(BUILD_DROPPED) +if(OPENSSL_FOUND) + SET(yahoo_SRCS + crypt.cpp + yahoo.cpp + yahooauth.cpp + yahoocfg.cpp + yahooclient.cpp + yahoofiletransfer.cpp + yahoohttp.cpp + yahooinfo.cpp + yahoosearch.cpp + yahootransformtables.c + ) + + SET(yahoo_HDRS + yahoo.h + yahoocfg.h + yahooclient.h + yahooinfo.h + yahoosearch.h + ) + + SET(yahoo_UICS + yahoocfgbase.ui + yahooinfobase.ui + yahoosearchbase.ui + ) + + INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR}) + LINK_DIRECTORIES(${OPENSSL_LIBRARY_DIR}) + SIM_ADD_PLUGIN(yahoo) + TARGET_LINK_LIBRARIES(yahoo ${OPENSSL_LIBRARIES} ${OPENSSL_EAY_LIBRARIES}) +else(OPENSSL_FOUND) + MESSAGE(STATUS "OpenSSL library not found, yahoo plugin disabled") +endif(OPENSSL_FOUND) +ENDIF(BUILD_DROPPED) diff --git a/plugins/yahoo/configure.in.in b/plugins/yahoo/configure.in.in new file mode 100644 index 0000000..29a98d5 --- /dev/null +++ b/plugins/yahoo/configure.in.in @@ -0,0 +1,4 @@ +if test "$have_ssl" != yes; then + AC_MSG_WARN([OpenSSL library disabled. Yahoo! plugin is disabled]) +fi +AM_CONDITIONAL(ENABLE_YAHOO, test "$have_ssl" = "yes") diff --git a/plugins/yahoo/crypt.cpp b/plugins/yahoo/crypt.cpp new file mode 100644 index 0000000..ea9b5c3 --- /dev/null +++ b/plugins/yahoo/crypt.cpp @@ -0,0 +1,165 @@ +/* One way encryption based on MD5 sum. + Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + + The GNU C 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. + + The GNU C 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* warmenhoven took this file and made it work with the md5.[ch] we + * already had. isn't that lovely. people should just use linux or + * freebsd, crypt works properly on those systems. i hate solaris */ + +#include + +#include "socket/socket.h" + +/* Define our magic string to mark salt for MD5 "encryption" + replacement. This is meant to be the same as for other MD5 based + encryption implementations. */ +const char md5_salt_prefix[] = "$1$"; + +/* Table with characters for base64 transformation. */ +const char b64t[] = + "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +#define MIN(A, B) ((A < B) ? A : B) +#define MAX(A, B) ((A > B) ? A : B) + +char *yahoo_crypt(const char *key, const char *salt) +{ + static char *buffer = NULL; + static int buflen = 0; + int needed = 3 + strlen (salt) + 1 + 26 + 1; + + size_t salt_len; + size_t key_len; + size_t cnt; + char *cp; + + if (buflen < needed) { + buflen = needed; + if ((buffer = (char*)realloc(buffer, buflen)) == NULL) //warning C6308: 'realloc' might return null pointer: assigning null pointer to 'char * `char * __cdecl yahoo_crypt(char const *,char const *)'::`2'::buffer', which is passed as an argument to 'realloc', will cause the original memory block to be leaked + return NULL; + } + + /* Find beginning of salt string. The prefix should normally always + be present. Just in case it is not. */ + if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0) + /* Skip salt prefix. */ + salt += sizeof (md5_salt_prefix) - 1; + + salt_len = MIN (strcspn (salt, "$"), 8); + key_len = strlen (key); + + std::string ct = key; + ct += md5_salt_prefix; + ct += salt; + + std::string ct_alt = key; + ct_alt += salt; + ct_alt += key; + ct_alt = (QCryptographicHash::hash(QByteArray(ct_alt.c_str(), ct_alt.length()), QCryptographicHash::Md5)).data(); + + /* Add for any character in the key one byte of the alternate sum. */ + for (cnt = key_len; cnt > 16; cnt -= 16) + ct.append(ct_alt.c_str(), 16); + ct.append(ct_alt.c_str(), cnt); + + char nil[] = ""; + + /* The original implementation now does something weird: for every 1 + bit in the key the first 0 is added to the buffer, for every 0 + bit the first character of the key. This does not seem to be + what was intended but we have to follow this to be compatible. */ + for (cnt = key_len; cnt > 0; cnt >>= 1) + ct.append((cnt & 1) != 0 ? nil : key, 1); + + /* Create intermediate result. */ + ct_alt = (QCryptographicHash::hash(QByteArray(ct.c_str(), ct.length()), QCryptographicHash::Md5)).data(); + + /* Now comes another weirdness. In fear of password crackers here + comes a quite long loop which just processes the output of the + previous round again. We cannot ignore this here. */ + for (cnt = 0; cnt < 1000; ++cnt) { + /* New context. */ + ct = ""; + + /* Add key or last result. */ + if ((cnt & 1) != 0) + ct += key; + else + ct.append(ct_alt.c_str(), 16); + + /* Add salt for numbers not divisible by 3. */ + if (cnt % 3 != 0) + ct += salt; + + /* Add key for numbers not divisible by 7. */ + if (cnt % 7 != 0) + ct += key; + + /* Add key or last result. */ + if ((cnt & 1) != 0) + ct.append(ct_alt.c_str(), 16); + else + ct += key; + + /* Create intermediate result. */ + ct_alt = (QCryptographicHash::hash(QByteArray(ct.c_str(), ct.length()), QCryptographicHash::Md5)).data(); + } + + /* Now we can construct the result string. It consists of three + parts. */ + + strncpy(buffer, md5_salt_prefix, MAX (0, buflen)); //warning C6387: 'argument 1' might be '0': this does not adhere to the specification for the function 'strncpy': Line: 43 + cp = buffer + strlen(buffer); //warning C6387: 'argument 1' might be '0': this does not adhere to the specification for the function 'strlen': Line: 43 + //warning C6053: Call to 'strncpy' might not zero-terminate string 'buffer': Line: 43 + buflen -= sizeof (md5_salt_prefix); + + strncpy(cp, salt, MIN ((size_t) buflen, salt_len)); + cp = cp + strlen(cp); //warning C6053: Call to 'strncpy' might not zero-terminate string 'cp': Line: 43 + buflen -= MIN ((size_t) buflen, salt_len); + + if (buflen > 0) { + *cp++ = '$'; + --buflen; + } + +#define b64_from_24bit(B2, B1, B0, N) \ + { \ + unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \ + int n = (N); \ + while (n-- > 0 && buflen > 0) { \ + *cp++ = b64t[w & 0x3f]; \ + --buflen; \ + w >>= 6; \ + }\ + } + + b64_from_24bit (ct_alt[0], ct_alt[6], ct_alt[12], 4); + b64_from_24bit (ct_alt[1], ct_alt[7], ct_alt[13], 4); + b64_from_24bit (ct_alt[2], ct_alt[8], ct_alt[14], 4); + b64_from_24bit (ct_alt[3], ct_alt[9], ct_alt[15], 4); + b64_from_24bit (ct_alt[4], ct_alt[10], ct_alt[5], 4); + b64_from_24bit (0, 0, ct_alt[11], 2); + if (buflen <= 0) { + free(buffer); + buffer = NULL; + } else + *cp = '\0'; /* Terminate the string. */ + + return buffer; +} diff --git a/plugins/yahoo/yahoo.cpp b/plugins/yahoo/yahoo.cpp new file mode 100644 index 0000000..f7531c1 --- /dev/null +++ b/plugins/yahoo/yahoo.cpp @@ -0,0 +1,184 @@ +/*************************************************************************** + yahoo.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "clientmanager.h" +#include "yahoo.h" +#include "yahooclient.h" +#include "core.h" + +using namespace SIM; + +Plugin *createYahooPlugin(unsigned base, bool, Buffer*) +{ + Plugin *plugin = new YahooPlugin(base); + return plugin; +} + +static PluginInfo info = + { + NULL, + NULL, + VERSION, + createYahooPlugin, + PLUGIN_PROTOCOL + }; + +EXPORT_PROC PluginInfo* GetPluginInfo() +{ + return &info; +} + +unsigned YahooPlugin::YahooPacket = 0; + +YahooPlugin::YahooPlugin(unsigned base) + : Plugin(base) +{ + YahooPacket = registerType(); + getContacts()->addPacketType(YahooPacket, "Yahoo!"); + registerMessages(); + m_protocol = new YahooProtocol(this); +} + +YahooPlugin::~YahooPlugin() +{ + delete m_protocol; + unregisterMessages(); + getContacts()->removePacketType(YahooPacket); +} + +YahooProtocol::YahooProtocol(Plugin *plugin) + : Protocol(plugin) +{ +} + +YahooProtocol::~YahooProtocol() +{ +} + +ClientPtr YahooProtocol::createClient(Buffer *cfg) +{ + ClientPtr yahoo = ClientPtr(new YahooClient(this, cfg)); + getClientManager()->addClient(yahoo); + return yahoo; +} + +static CommandDef yahoo_descr = + CommandDef ( + 0, + I18N_NOOP("Yahoo!"), + "Yahoo!_online", + "Yahoo!_invisible", + "http://edit.yahoo.com/config/eval_forgot_pw?.src=pg&.done=http://messenger.yahoo.com/&.redir_from=MESSENGER", + 0, + 0, + 0, + 0, + 0, + PROTOCOL_INVISIBLE, + NULL, + QString::null + ); + +const CommandDef *YahooProtocol::description() +{ + return &yahoo_descr; +} + +static CommandDef yahoo_status_list[] = + { + CommandDef ( + STATUS_ONLINE, + I18N_NOOP("Online"), + "Yahoo!_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_AWAY, + I18N_NOOP("Away"), + "Yahoo!_away", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_NA, + I18N_NOOP("N/A"), + "Yahoo!_na", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_DND, + I18N_NOOP("Busy"), + "Yahoo!_dnd", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + STATUS_OFFLINE, + I18N_NOOP("Offline"), + "Yahoo!_offline", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef () + }; + +const CommandDef *YahooProtocol::statusList() +{ + return yahoo_status_list; +} diff --git a/plugins/yahoo/yahoo.h b/plugins/yahoo/yahoo.h new file mode 100644 index 0000000..7a5b8b9 --- /dev/null +++ b/plugins/yahoo/yahoo.h @@ -0,0 +1,48 @@ +/*************************************************************************** + yahoo.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _YAHOO_H +#define _YAHOO_H + +#include "contacts.h" +#include "contacts/client.h" + +class YahooProtocol : public SIM::Protocol +{ +public: + YahooProtocol(SIM::Plugin *plugin); + ~YahooProtocol(); + SIM::ClientPtr createClient(Buffer *cfg); + const SIM::CommandDef *description(); + const SIM::CommandDef *statusList(); + virtual const SIM::DataDef *userDataDef(); +}; + +class YahooPlugin : public SIM::Plugin +{ +public: + YahooPlugin(unsigned); + virtual ~YahooPlugin(); + static unsigned YahooPacket; +protected: + void registerMessages(); + void unregisterMessages(); + SIM::Protocol *m_protocol; +}; + +#endif + diff --git a/plugins/yahoo/yahoo.rc b/plugins/yahoo/yahoo.rc new file mode 100644 index 0000000..8a43084 --- /dev/null +++ b/plugins/yahoo/yahoo.rc @@ -0,0 +1,97 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1251) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 0,9,6,0 + PRODUCTVERSION 0,9,6,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Vladimir Shutoff\0" + VALUE "FileDescription", "Yahoo plugin\0" + VALUE "FileVersion", "0, 9, 6, 0\0" + VALUE "InternalName", "yahoo\0" + VALUE "LegalCopyright", "Copyright © 2002-2003\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "yahoo.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "SIM\0" + VALUE "ProductVersion", "0, 9, 6, 0\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/yahoo/yahoo.vcproj b/plugins/yahoo/yahoo.vcproj new file mode 100644 index 0000000..dc6674e --- /dev/null +++ b/plugins/yahoo/yahoo.vcproj @@ -0,0 +1,742 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/yahoo/yahoo_pch.h b/plugins/yahoo/yahoo_pch.h new file mode 100644 index 0000000..c8f6bc0 --- /dev/null +++ b/plugins/yahoo/yahoo_pch.h @@ -0,0 +1,43 @@ +#pragma once + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef NO_QT_MOC_HEADER +#include +//#include +//#include +#endif + +#include "yahoo.h" +#include "yahoocfg.h" +#include "ui_yahoocfgbase.h" +#include "yahooclient.h" +#include "yahooinfo.h" +#include "ui_yahooinfobase.h" +#include "yahoosearch.h" +#include "ui_yahoosearchbase.h" diff --git a/plugins/yahoo/yahooauth.cpp b/plugins/yahoo/yahooauth.cpp new file mode 100644 index 0000000..065264f --- /dev/null +++ b/plugins/yahoo/yahooauth.cpp @@ -0,0 +1,1379 @@ +/*************************************************************************** + yahooauth.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * Based on libyahoo2 + * + * Some code copyright (C) 2002-2004, Philip S Tellis + * + * Yahoo Search copyright (C) 2003, Konstantin Klyagin + * + * Much of this code was taken and adapted from the yahoo module for + * gaim released under the GNU GPL. This code is also released under the + * GNU GPL. + * + * This code is derivitive of Gaim + * copyright (C) 1998-1999, Mark Spencer + * 1998-1999, Adam Fritzler + * 1998-2002, Rob Flynn + * 2000-2002, Eric Warmenhoven + * 2001-2002, Brian Macke + * 2001, Anand Biligiri S + * 2001, Valdis Kletnieks + * 2002, Sean Egan + * 2002, Toby Gray + * + * This library also uses code from other libraries, namely: + * Portions from libfaim copyright 1998, 1999 Adam Fritzler + * + * Portions of Sylpheed copyright 2000-2002 Hiroyuki Yamamoto + * + * + * 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. * + * * + ***************************************************************************/ + +#include "yahooclient.h" +#include "socket/socket.h" +#include "socket/clientsocket.h" + +#define OPENSSL_NO_SHA0 // we need the new one! +#include +#include + +//#include +//#include + +#include + +extern "C" +{ + int yahoo_Dispatch(int Salt, int Parameter); +} + +char *yahoo_crypt(const char *key, const char *salt); + +/* This is the y64 alphabet... it's like base64, but has a . and a _ */ +char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._"; + +/* This is taken from Sylpheed by Hiroyuki Yamamoto. We have our own tobase64 function + * in util.c, but it has a bug I don't feel like finding right now ;) */ +void to_y64(unsigned char *out, const unsigned char *in, int inlen) +/* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */ +{ + for (; inlen >= 3; inlen -= 3) + { + *out++ = base64digits[in[0] >> 2]; + *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)]; + *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; + *out++ = base64digits[in[2] & 0x3f]; + in += 3; + } + if (inlen > 0) + { + unsigned char fragment; + + *out++ = base64digits[in[0] >> 2]; + fragment = (in[0] << 4) & 0x30; + if (inlen > 1) + fragment |= in[1] >> 4; + *out++ = base64digits[fragment]; + *out++ = (inlen < 2) ? '-' : base64digits[(in[1] << 2) & 0x3c]; + *out++ = '-'; + } + *out = '\0'; +} + +typedef struct _auth { + int type; + int var1; + int var2; +} auth_function_t; + +struct buffer_t { + unsigned int buffer_start; + unsigned char buffer[257]; +}; + +#define NUM_TYPE_THREES 105 +#define NUM_TYPE_FOURS 56 +#define NUM_TYPE_FIVES 37 + +auth_function_t main_function_list[5][96] = { + { + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 }, + { 0, 0x0, 0x0 } + }, + { + { 2, 0x36056cd7, 0x4387 }, + { 3, 0x538920, 0x0 }, + { 3, 0x538a20, 0x0 }, + { 4, 0x55f320, 0x0 }, + { 3, 0x539320, 0x0 }, + { 4, 0x55f340, 0x0 }, + { 2, 0x4abb534d, 0x3769 }, + { 1, 0x1d242da5, 0x0 }, + { 2, 0x3c23132d, 0x339b }, + { 1, 0x191265c, 0x0 }, + { 1, 0x3db979db, 0x0 }, + { 3, 0x539868, 0x0 }, + { 1, 0x1a550e1e, 0x0 }, + { 1, 0x2f140a2d, 0x0 }, + { 2, 0x7c466a4b, 0x29bf }, + { 1, 0x2d3f30d3, 0x0 }, + { 2, 0x7e823b21, 0x6bb3 }, + { 4, 0x55f360, 0x0 }, + { 3, 0x5395a8, 0x0 }, + { 4, 0x55f604, 0x0 }, + { 3, 0x539ba8, 0x0 }, + { 4, 0x5628c4, 0x0 }, + { 3, 0x547818, 0x0 }, + { 4, 0x5628e4, 0x0 }, + { 3, 0x547978, 0x0 }, + { 4, 0x5628a4, 0x0 }, + { 2, 0x5b756ab9, 0x7e9b }, + { 3, 0x539d48, 0x0 }, + { 1, 0x1d1c4911, 0x0 }, + { 3, 0x539f60, 0x0 }, + { 3, 0x53a060, 0x0 }, + { 1, 0x46bd7771, 0x0 }, + { 1, 0x51ae2b42, 0x0 }, + { 2, 0x2417591b, 0x177b }, + { 2, 0x57f27c5f, 0x2433 }, + { 3, 0x53a588, 0x0 }, + { 3, 0x53a688, 0x0 }, + { 1, 0x71422261, 0x0 }, + { 4, 0x55f6a4, 0x0 }, + { 2, 0x58e937f9, 0x1075 }, + { 3, 0x53a7c8, 0x0 }, + { 4, 0x55f6c4, 0x0 }, + { 3, 0x53a8c8, 0x0 }, + { 3, 0x53aa20, 0x0 }, + { 2, 0xb4c3d13, 0x1597 }, + { 4, 0x55f6e4, 0x0 }, + { 1, 0xfe07d38, 0x0 }, + { 2, 0x689b4017, 0x3cfb }, + { 4, 0x562928, 0x0 }, + { 3, 0x547b00, 0x0 }, + { 1, 0x35413df3, 0x0 }, + { 2, 0x5b611ab, 0x570b }, + { 2, 0xda5334f, 0x3ac7 }, + { 1, 0x47706008, 0x0 }, + { 4, 0x55f744, 0x0 }, + { 3, 0x547548, 0x0 }, + { 4, 0x562884, 0x0 }, + { 1, 0x57611b36, 0x0 }, + { 2, 0x314c2cd1, 0x2b5b }, + { 1, 0x1ef33946, 0x0 }, + { 2, 0x28ea041f, 0x638f }, + { 3, 0x53b1d0, 0x0 }, + { 3, 0x53b2d0, 0x0 }, + { 3, 0x53b418, 0x0 }, + { 2, 0x511537cb, 0x7135 }, + { 2, 0x1cf71007, 0x5e17 }, + { 1, 0x583d4bcf, 0x0 }, + { 3, 0x53b550, 0x0 }, + { 1, 0x373e6856, 0x0 }, + { 2, 0x4d595519, 0x1a7d }, + { 3, 0x53b718, 0x0 }, + { 3, 0x53b838, 0x0 }, + { 1, 0xe2a36a7, 0x0 }, + { 3, 0x53bc10, 0x0 }, + { 3, 0x53bd10, 0x0 }, + { 4, 0x55f784, 0x0 }, + { 4, 0x55f7a4, 0x0 }, + { 1, 0x53f3604f, 0x0 }, + { 4, 0x55f7c4, 0x0 }, + { 4, 0x55f7e4, 0x0 }, + { 2, 0x1edc0ba3, 0x7531 }, + { 3, 0x53be50, 0x0 }, + { 1, 0x10df1038, 0x0 }, + { 4, 0x55f804, 0x0 }, + { 3, 0x53bf68, 0x0 }, + { 1, 0x4ede0cac, 0x0 }, + { 2, 0x2f076eeb, 0x5bcf }, + { 1, 0x6d86030f, 0x0 }, + { 1, 0x3f331713, 0x0 }, + { 3, 0x53c0e8, 0x0 }, + { 2, 0x41cd726f, 0x3f79 }, + { 4, 0x55f824, 0x0 }, + { 1, 0xece0054, 0x0 }, + { 2, 0x19b32b03, 0x4ad1 }, + { 4, 0x55f844, 0x0 }, + { 4, 0x55f864, 0x0 } + }, + { + { 2, 0x39731111, 0x419b }, + { 1, 0x54f7757a, 0x0 }, + { 4, 0x55f884, 0x0 }, + { 4, 0x55f8a4, 0x0 }, + { 3, 0x53c240, 0x0 }, + { 3, 0x53c368, 0x0 }, + { 2, 0x3cc0256b, 0x7ce7 }, + { 1, 0x79991847, 0x0 }, + { 2, 0x228f7fb5, 0x472d }, + { 2, 0x32da290b, 0x7745 }, + { 1, 0x7a28180d, 0x0 }, + { 4, 0x55f91c, 0x0 }, + { 4, 0x55f93c, 0x0 }, + { 2, 0x5c814f8b, 0x227f }, + { 3, 0x53c7b0, 0x0 }, + { 2, 0xb496f6d, 0x412d }, + { 1, 0x6f4b62da, 0x0 }, + { 3, 0x53c8b8, 0x0 }, + { 1, 0x64973977, 0x0 }, + { 3, 0x53c9e8, 0x0 }, + { 3, 0x53cae8, 0x0 }, + { 4, 0x55f9d0, 0x0 }, + { 3, 0x53cd28, 0x0 }, + { 3, 0x547230, 0x0 }, + { 1, 0x6dd14c92, 0x0 }, + { 3, 0x53ceb0, 0x0 }, + { 4, 0x560280, 0x0 }, + { 4, 0x56034c, 0x0 }, + { 4, 0x56036c, 0x0 }, + { 3, 0x53d168, 0x0 }, + { 1, 0x5e6324d8, 0x0 }, + { 3, 0x53d2d0, 0x0 }, + { 3, 0x53d3d0, 0x0 }, + { 3, 0x53d798, 0x0 }, + { 4, 0x5605b0, 0x0 }, + { 1, 0x62745ed0, 0x0 }, + { 2, 0x102c215b, 0x581 }, + { 3, 0x53d970, 0x0 }, + { 3, 0x53da70, 0x0 }, + { 3, 0x53dbd0, 0x0 }, + { 2, 0x19511111, 0x12c1 }, + { 3, 0x53dd70, 0x0 }, + { 2, 0x2a6e2953, 0x6977 }, + { 3, 0x53e0d0, 0x0 }, + { 1, 0x55cd5445, 0x0 }, + { 4, 0x560bcc, 0x0 }, + { 4, 0x560bec, 0x0 }, + { 2, 0x646c21eb, 0x43e5 }, + { 1, 0x71dc4898, 0x0 }, + { 1, 0x167519cb, 0x0 }, + { 1, 0x6d3158f8, 0x0 }, + { 1, 0x7ea95bea, 0x0 }, + { 4, 0x560c10, 0x0 }, + { 1, 0x47377587, 0x0 }, + { 1, 0x2d8b6e8f, 0x0 }, + { 2, 0x5e6105db, 0x1605 }, + { 1, 0x65b543c8, 0x0 }, + { 3, 0x540278, 0x0 }, + { 4, 0x560d34, 0x0 }, + { 2, 0x48af73cb, 0xa67 }, + { 1, 0x4fb96154, 0x0 }, + { 3, 0x5406e8, 0x0 }, + { 4, 0x560e38, 0x0 }, + { 1, 0x622c4954, 0x0 }, + { 4, 0x561014, 0x0 }, + { 1, 0x20d220f3, 0x0 }, + { 1, 0x361d4f0d, 0x0 }, + { 1, 0x2b2000d1, 0x0 }, + { 1, 0x6fb8593e, 0x0 }, + { 3, 0x5409e8, 0x0 }, + { 4, 0x561074, 0x0 }, + { 1, 0x2b7f7dfc, 0x0 }, + { 2, 0x5fc41a57, 0x693 }, + { 2, 0x17154387, 0x2489 }, + { 4, 0x561094, 0x0 }, + { 4, 0x5610b4, 0x0 }, + { 4, 0x5610d4, 0x0 }, + { 3, 0x540d18, 0x0 }, + { 1, 0x7e221470, 0x0 }, + { 1, 0x7a600061, 0x0 }, + { 4, 0x561190, 0x0 }, + { 4, 0x5611b0, 0x0 }, + { 3, 0x541218, 0x0 }, + { 4, 0x5611d0, 0x0 }, + { 2, 0xe813a5, 0x2ce5 }, + { 2, 0x3d707e25, 0x3827 }, + { 2, 0x77a53e07, 0x6a5f }, + { 4, 0x562968, 0x0 }, + { 3, 0x547d98, 0x0 }, + { 3, 0x547f10, 0x0 }, + { 1, 0x43a73788, 0x0 }, + { 3, 0x5387b0, 0x0 }, + { 4, 0x55f214, 0x0 }, + { 3, 0x539420, 0x0 }, + { 1, 0x55f4606b, 0x0 }, + { 4, 0x55f380, 0x0 } + }, + { + { 5, 0x55f3f8, 0x0 }, + { 2, 0x32ca58e3, 0x4f9 }, + { 1, 0x11756b30, 0x0 }, + { 2, 0x218b2569, 0x5db1 }, + { 1, 0x77d64b90, 0x0 }, + { 5, 0x562948, 0x0 }, + { 3, 0x547c10, 0x0 }, + { 2, 0x7d1428cb, 0x3d }, + { 1, 0x6f872c49, 0x0 }, + { 1, 0x2e484655, 0x0 }, + { 2, 0x1e3349f7, 0x41f5 }, + { 3, 0x541400, 0x0 }, + { 5, 0x561258, 0x0 }, + { 1, 0x61640311, 0x0 }, + { 5, 0x561278, 0x0 }, + { 3, 0x541588, 0x0 }, + { 3, 0x541688, 0x0 }, + { 3, 0x541988, 0x0 }, + { 1, 0x7044d3, 0x0 }, + { 5, 0x561298, 0x0 }, + { 2, 0x5c221625, 0x576f }, + { 3, 0x541b30, 0x0 }, + { 3, 0x541c30, 0x0 }, + { 1, 0x2d406bb1, 0x0 }, + { 2, 0x680b1f17, 0x12cd }, + { 5, 0x5613a0, 0x0 }, + { 2, 0x12564d55, 0x32b9 }, + { 2, 0x21a67897, 0x6bab }, + { 3, 0x541db8, 0x0 }, + { 2, 0x6405119, 0x7143 }, + { 1, 0x351d01ed, 0x0 }, + { 2, 0x46356f6b, 0xa49 }, + { 2, 0x32c77969, 0x72f3 }, + { 5, 0x5613c0, 0x0 }, + { 3, 0x541fe0, 0x0 }, + { 3, 0x5420e0, 0x0 }, + { 5, 0x5613e4, 0x0 }, + { 3, 0x542220, 0x0 }, + { 5, 0x561404, 0x0 }, + { 2, 0x74d52c55, 0x5f43 }, + { 1, 0x26201ca8, 0x0 }, + { 1, 0x7aeb3255, 0x0 }, + { 3, 0x53ab20, 0x0 }, + { 2, 0x578f1047, 0x640b }, + { 3, 0x542738, 0x0 }, + { 3, 0x542df8, 0x0 }, + { 5, 0x5615a0, 0x0 }, + { 5, 0x561628, 0x0 }, + { 1, 0x4a1352cf, 0x0 }, + { 2, 0x4bfb6ef3, 0x704f }, + { 2, 0x1b4c7fe7, 0x5637 }, + { 2, 0x4091a3b, 0x4917 }, + { 1, 0x270c2f52, 0x0 }, + { 3, 0x5430b8, 0x0 }, + { 5, 0x561748, 0x0 }, + { 3, 0x543220, 0x0 }, + { 5, 0x561768, 0x0 }, + { 2, 0x127549d5, 0x579b }, + { 2, 0xab54121, 0x7a47 }, + { 5, 0x5617f0, 0x0 }, + { 1, 0x751e6e49, 0x0 }, + { 3, 0x543580, 0x0 }, + { 3, 0x543680, 0x0 }, + { 1, 0x670c3f74, 0x0 }, + { 2, 0x6b080851, 0x7e8b }, + { 1, 0x71cd789e, 0x0 }, + { 1, 0x3eb20b7b, 0x0 }, + { 5, 0x561ea0, 0x0 }, + { 3, 0x543848, 0x0 }, + { 2, 0x58a67753, 0x272b }, + { 2, 0x1ab54ad7, 0x4d33 }, + { 2, 0x7d30a45, 0x569 }, + { 2, 0x737616bf, 0x70c7 }, + { 3, 0x543990, 0x0 }, + { 2, 0x45c4485d, 0x2063 }, + { 5, 0x561f38, 0x0 }, + { 1, 0x2598043d, 0x0 }, + { 2, 0x223a4fe3, 0x49a7 }, + { 1, 0x1eed619f, 0x0 }, + { 5, 0x561f58, 0x0 }, + { 1, 0x6f477561, 0x0 }, + { 5, 0x561f7c, 0x0 }, + { 5, 0x561f9c, 0x0 }, + { 3, 0x543bf8, 0x0 }, + { 2, 0x4bc13c4f, 0x45c1 }, + { 1, 0x3b547bfb, 0x0 }, + { 3, 0x543d08, 0x0 }, + { 2, 0x71406ab3, 0x7a5f }, + { 1, 0x2f1467e9, 0x0 }, + { 2, 0x9366d1, 0x22d1 }, + { 2, 0x587d1b75, 0x2ca5 }, + { 2, 0x213a4be7, 0x4499 }, + { 2, 0x62653e89, 0x2d5d }, + { 5, 0x562198, 0x0 }, + { 2, 0x4f5f3257, 0x444f }, + { 2, 0x4c0e2b2b, 0x19d3 } + }, + { + { 2, 0x3f867b35, 0x7b3b }, + { 2, 0x32d25cb1, 0x3d6d }, + { 5, 0x5622f0, 0x0 }, + { 2, 0x50fa1c51, 0x5f4f }, + { 3, 0x544130, 0x0 }, + { 1, 0x5fe7af1, 0x0 }, + { 2, 0x14067c29, 0x10c5 }, + { 3, 0x544298, 0x0 }, + { 2, 0x4a5558c5, 0x271f }, + { 1, 0x3c0861b1, 0x0 }, + { 5, 0x562864, 0x0 }, + { 3, 0x546d50, 0x0 }, + { 2, 0x18837c9d, 0x6335 }, + { 5, 0x56238c, 0x0 }, + { 1, 0x7dab5033, 0x0 }, + { 3, 0x544548, 0x0 }, + { 2, 0x3b87321, 0x7225 }, + { 1, 0x7f906745, 0x0 }, + { 3, 0x544700, 0x0 }, + { 5, 0x5623ac, 0x0 }, + { 1, 0x21c46c2c, 0x0 }, + { 2, 0x2b36757d, 0x28d }, + { 5, 0x5623cc, 0x0 }, + { 3, 0x5448a8, 0x0 }, + { 1, 0x106b4a85, 0x0 }, + { 1, 0x17640f11, 0x0 }, + { 3, 0x544a28, 0x0 }, + { 1, 0x69e60486, 0x0 }, + { 3, 0x547670, 0x0 }, + { 2, 0x3782017d, 0x5bf }, + { 5, 0x5623ec, 0x0 }, + { 3, 0x5480c8, 0x0 }, + { 1, 0x6bca53b0, 0x0 }, + { 3, 0x546af0, 0x0 }, + { 3, 0x546bf0, 0x0 }, + { 3, 0x544d20, 0x0 }, + { 3, 0x544e20, 0x0 }, + { 1, 0xb8236e3, 0x0 }, + { 5, 0x562908, 0x0 }, + { 2, 0x5ee51c43, 0x4553 }, + { 5, 0x56249c, 0x0 }, + { 3, 0x546fd8, 0x0 }, + { 3, 0x5470d8, 0x0 }, + { 3, 0x546970, 0x0 }, + { 2, 0x42b14c6f, 0x5531 }, + { 1, 0x4a2548e8, 0x0 }, + { 2, 0x5c071d85, 0x2437 }, + { 3, 0x5467d8, 0x0 }, + { 2, 0x29195861, 0x108b }, + { 1, 0x24012258, 0x0 }, + { 3, 0x546690, 0x0 }, + { 1, 0x63cc2377, 0x0 }, + { 1, 0x8d04b59, 0x0 }, + { 2, 0x3fd30cf5, 0x7027 }, + { 1, 0x7c3e0478, 0x0 }, + { 2, 0x457776b7, 0x24b3 }, + { 1, 0x86652bc, 0x0 }, + { 2, 0x302f5b13, 0x371d }, + { 3, 0x546548, 0x0 }, + { 2, 0x58692d47, 0x671 }, + { 1, 0x6601178e, 0x0 }, + { 2, 0xf195b9b, 0x1369 }, + { 1, 0x7ba21d8, 0x0 }, + { 5, 0x562544, 0x0 }, + { 5, 0x562564, 0x0 }, + { 1, 0x13ac3d21, 0x0 }, + { 2, 0x5bcf3275, 0x6e1b }, + { 2, 0x62725c5b, 0x16b9 }, + { 2, 0x5b950fdf, 0x2d35 }, + { 5, 0x5625a0, 0x0 }, + { 5, 0x5625c0, 0x0 }, + { 2, 0x73ba5335, 0x1c13 }, + { 5, 0x5625e0, 0x0 }, + { 5, 0x562600, 0x0 }, + { 1, 0x3e144154, 0x0 }, + { 2, 0x4eed7b27, 0x38ab }, + { 3, 0x545c58, 0x0 }, + { 2, 0x627c7e0f, 0x7f01 }, + { 2, 0x5d7e1f73, 0x2c0f }, + { 3, 0x545aa0, 0x0 }, + { 2, 0x55c9525f, 0x4659 }, + { 1, 0x3765334c, 0x0 }, + { 2, 0x5df66ddf, 0x7c25 }, + { 3, 0x545d78, 0x0 }, + { 3, 0x545e78, 0x0 }, + { 1, 0x16ae5776, 0x0 }, + { 3, 0x545ff8, 0x0 }, + { 3, 0x546190, 0x0 }, + { 5, 0x562620, 0x0 }, + { 5, 0x562640, 0x0 }, + { 3, 0x546290, 0x0 }, + { 2, 0x4392327b, 0x7e0d }, + { 3, 0x546398, 0x0 }, + { 2, 0x3d8b0cb5, 0x640d }, + { 2, 0x32865601, 0x4d43 }, + { 5, 0x562660, 0x0 } + } + }; + +struct buffer_t type_three_list[NUM_TYPE_THREES]={ + { 0x538920, "\x7a\x61\x31\x57\x9\xbc\x11\x8d\x6a\x12\x3a\x4d\x76\xbf\x19\x86\x2c\xc8\x69\x60\x84\x1\xc9\x21\xb1\xa6\xf\x99\xcd\xa0\x71\x8b\x5f\xb2\xd2\x53\xed\xf9\x55\xa\x50\x14\x15\xad\x88\x52\x5d\xbb\xe\xe5\xd\x56\x3e\x9b\xc7\x17\x9a\x97\x92\x23\x0\x37\xaa\x27\xf6\xb6\x33\xb5\xc5\xd1\x38\x1b\x85\x42\x13\xe1\x64\x1d\x4c\x87\x9f\x3c\x40\xdf\x7b\xd5\xae\xc6\x7c\xec\xd7\x49\x35\x2f\x2b\x9d\x32\xbd\x93\x45\x73\x91\x34\xd4\x39\x1e\x96\x65\xeb\x82\x5a\xf3\xd8\xf1\x41\xce\x9c\xe6\x90\x7d\x6b\x29\x6\xc1\x3d\x4e\xe3\xdb\x48\x6c\x62\x72\x7f\xfe\xdd\xcf\xa1\x24\x4f\xc0\xd0\x3f\x2d\x5c\x78\x6f\x3b\x10\xef\xba\xb\x25\xd6\x1f\x58\x8c\xf8\xcc\xc2\x5\xb3\xfa\xa4\xac\x6e\xf5\x18\x2a\x26\x5e\xf4\x79\xb8\xc3\x16\xe2\xf2\x83\x30\x59\xda\xe9\x36\x7\x46\xa9\xde\x77\xd3\xa3\x98\x8\x1c\xe7\xee\x51\xe8\xfb\x2\xc4\xfd\xff\x22\xaf\x7e\xcb\x68\xc\x28\xe4\x63\xca\x70\x75\xb0\x74\xa7\xea\x20\x4\x4b\xa5\xb7\xf7\xfc\x4a\x47\xf0\xa8\x81\xbe\xe0\x66\x8e\x44\x54\x6d\x80\xb9\x95\x2e\xab\x8a\x1a\x94\xdc\x89\xb4\x5b\x9e\xd9\x8f\xa2\x43\x67\x3" }, + { 0x538a20, "\x28\xeb\x74\xef\xb7\x73\x79\xd1\x46\xcc\xfb\x3b\x91\xc2\x16\xcb\x93\xaf\x51\x88\xb0\x5d\xfa\xfc\xc\xf\xc8\x4a\x53\x17\x8e\xec\x81\x36\xc6\xdc\xbc\x89\xa\x1f\x78\xdd\x76\x6c\x85\xd2\x13\xb9\x3a\x97\xde\x86\x3e\x12\xbe\x68\x23\x6a\x58\xce\xea\xe3\xa8\x5a\x8c\x3\x8a\x9d\xfe\xf3\x47\x63\xdf\x44\xaa\xd9\x24\xf0\x5b\xe2\x9c\xd3\xa9\x2e\xfd\x8b\xbd\xa4\x7a\x42\x5f\x4d\xa2\x48\x83\xcd\xe\x27\x61\xcf\xd\x50\x6f\x49\xae\xc7\x2f\x31\x39\x8f\x11\xdb\xad\x6b\x7f\xb6\x55\x62\x4c\x66\xc4\x75\xf6\x1b\xc1\xf1\x90\x95\x65\x9\xe0\xb4\xbf\xf4\x35\x37\x1c\x67\xe8\xf9\xe6\x56\x99\x22\xc0\xe9\x92\x21\xe1\x7d\x6e\x34\xd4\x8d\x96\x20\x52\xd0\x69\x2d\xf8\x7e\x4f\xb\xac\x71\xa3\xe5\x2a\xa5\xc5\x18\x5e\x6\xca\x2\x4b\x26\xf5\xab\x9f\xe7\x15\x3d\xd6\x4\x8\xee\xbb\x57\x0\x40\xd5\xa7\x1d\x45\xa6\x2c\xff\x9a\x32\x84\x1a\x14\xf7\x80\xd8\x43\x72\x7\x98\x38\x87\x33\xb1\x29\xb3\x7c\x30\xba\x94\xc9\x64\xe4\x1\x77\x3c\x2b\x82\x54\x6d\x9e\xf2\x3f\xed\xc3\x4e\x5c\x60\x70\x19\xa0\xb8\xda\x5\xb2\x10\x7b\x25\xb5\x9b\x59\x41\x1e\xa1\xd7" }, + { 0x539320, "\x9c\x3b\xec\x3e\x7b\x79\x6f\x88\x42\xe6\xe1\x9b\xa3\xd\x83\x86\x7a\xfc\xc5\xb3\xdb\x7c\xf6\xa\xb7\xe7\x3c\x53\x28\x65\xf2\xa9\x6a\xf4\xef\x2c\x3d\xf8\xed\x6\xaf\x31\x75\xab\xf3\x73\xee\x20\x95\x1b\xe\x19\xa8\x5b\xa5\x66\x74\x85\x11\x60\x1e\x2a\x6c\x48\x50\x2f\x9a\x2e\x55\xaa\xcb\x64\x40\x4c\x25\xe9\xd0\xfd\x2d\x46\x8b\x81\x8d\xd2\x32\x4a\xc6\x7\xd6\xbf\xfb\x98\xd4\x76\x7e\xc\xfa\xde\x14\xa6\xd5\xe2\x90\xd1\xeb\xd3\x58\xbb\x5f\x94\xf7\x78\x54\x27\x52\xb6\x22\xea\x8c\xc8\x7d\x87\x12\x9d\xa1\x63\x38\xd8\x35\x2b\xc9\x56\x10\x9f\x1a\x2\xbe\xf1\x59\x17\x9e\xac\x5a\xb8\x1\xb5\x30\xad\xff\xe0\x49\xe8\x23\x4e\x6b\x16\xdc\x4f\x89\x68\x43\xc1\x99\x4\xa7\x33\x92\x84\xa4\x26\x34\x41\x1d\xb2\x91\x61\xc2\x51\x8f\x36\xfe\x5\xa2\xf9\xb\x13\x71\x82\x6e\x5d\xb4\xdf\xdd\x7f\xa0\xcd\x44\xc7\x70\x4d\xf0\x1c\x4b\x45\x57\x37\x3a\xcc\xf5\x8a\xd9\xe4\xbc\x15\xc3\x62\xc4\x39\x72\x47\x97\xbd\x8\xe5\x67\x18\xb1\x77\x8e\x1f\x9\xba\xf\xd7\xb0\x24\xce\xda\x0\x96\xca\x69\x3\x6d\x93\xae\xe3\x3f\x5c\xcf\xc0\xb9\x29\x80\x21\x5e" }, + { 0x539868, "\xf2\xc3\x9\x40\x62\x4b\x94\xd2\xf8\x4a\xdf\xa\xb1\x61\xf9\x9c\x13\x35\x3\xe8\xc4\xf6\x49\x1a\xc\x45\x97\xe\x83\x33\x6d\xa0\x73\xb9\x3d\x9d\xff\x60\xc6\xaf\x68\xb6\x89\x10\xb0\xde\x98\x7f\x8c\x5a\xa5\x1e\x6f\x7c\x17\x12\xd7\xdc\x75\xfc\x20\x1d\x92\xcf\xf1\x16\xd\x50\x41\x39\xab\xeb\x14\x65\xc8\xa4\x99\xb5\x8a\x21\x90\xba\x4d\x3c\xf3\x66\xd1\x96\xf\xac\xa6\x7b\xbc\x8f\xd0\x29\x1f\xb3\xce\xd8\x79\x2\x36\x0\xe5\x91\x5e\xbb\xaa\x52\xc2\x31\x6b\x88\x8b\x9b\x2a\x44\x6c\x2f\x8e\xfb\xa3\x6\x48\xa2\x69\xc9\x28\x43\x47\x37\xef\xb8\x84\xe0\x4f\x30\xae\x56\xb7\x4e\x34\x81\x77\x67\xfd\x74\x93\xcd\x7a\x51\x76\x54\x5b\x2b\x3e\x80\xea\x9f\x15\xe1\x9a\xbf\x38\xfa\x8\x24\x42\xee\x7e\x4\x5f\xa8\xc5\xdb\x4c\x2d\xd9\xca\x19\xcc\xcb\x85\xa1\x32\x25\xec\x64\x57\xad\xf5\xb\x71\x11\x3f\xfe\x58\x1c\xd3\xb2\x72\xf7\x2c\xa9\xf0\x8d\xe9\xbe\x70\xe7\x95\xe6\x6e\x7\x9e\x46\x53\xdd\xed\xe2\xf4\x3b\x22\xc1\x3a\x55\x26\xd6\xc7\xd4\xc0\x27\x5\x7d\x5d\xe4\xd5\x5c\xe3\xb4\x63\xa7\x59\x82\xda\x18\x23\x2e\x1b\x1\xbd\x78\x86\x6a\x87" }, + { 0x5395a8, "\xfa\xb9\xda\x78\xde\x7f\x6\xab\xd7\xb1\x5c\x10\x1b\xf5\x62\x85\xf4\x98\xfb\xb2\xff\x5e\x5\x2b\x81\xd1\x7d\x58\xa7\x6b\x23\x7b\x26\x9f\xa9\xe\x59\xb8\xac\xd9\x64\x6e\x4f\x6a\x2d\x3c\x15\xc7\x63\x42\x54\x9\x90\xf6\xa0\x86\x9d\xea\xcf\x7c\xfe\xc5\xd4\x4d\xa6\xd5\xba\xcd\x5d\x9b\x2a\x6c\xb5\x7a\xbe\xf0\x44\x65\x0\x17\x3\xaf\xed\xfd\x1f\xc2\xd8\x5a\x16\xad\xc3\x35\x43\xbb\xa5\x37\x40\xf\x60\x99\x94\x1e\x89\x68\x88\xc8\xc4\x4a\x66\x24\x55\x3d\x4b\xe2\x1d\x1a\xe8\x19\x5b\xbf\x51\x8c\xae\x8a\x87\x8d\x3b\x22\x82\xd6\x80\x95\xef\x50\x21\xd\xd3\x33\x6d\x2c\xf1\xee\x38\xdc\xc1\x6f\x2\x46\xc6\x7e\x18\xb0\xce\x8\xd2\xb6\x53\x73\xe6\xf9\x3a\x4c\x48\x96\x1c\x70\x8b\x93\x69\xf7\x56\x30\x31\xdb\xa1\x1\xb\x77\xbc\xf2\x8e\x27\xa3\x7\xe4\x3f\xfc\x49\xcb\xe0\x45\x12\x67\x13\xb7\x74\xc\x52\xcc\xdd\x76\x29\x32\x57\xe1\xe9\x8f\xca\xaa\xbd\x71\x2e\x4\x97\xa4\xc9\x79\xdf\x83\xb3\x3e\x72\xc0\xb4\xec\x9a\x14\xa\x2f\x5f\x39\x25\x28\x75\xa2\xf8\x9c\xe3\xa8\x11\x9e\x4e\xd0\xe7\x61\x41\x84\xeb\x20\x36\x34\xf3\xe5\x92\x91\x47" }, + { 0x539ba8, "\x88\x82\x72\x56\xde\xa5\x45\x91\xf9\xe4\xee\x32\x59\x18\xb8\x6f\x79\xc7\xb0\x8c\x11\xd2\xe7\xef\x48\xe6\x20\xa1\x22\x12\xc8\x15\x6a\x8f\x3b\xd5\x3c\xe8\x63\x28\x10\xe9\x2c\xf5\x69\xa7\xf6\xd0\x83\xe0\x80\x81\x46\x29\x38\x2e\xf8\x34\x5b\x1a\x9d\xfa\xa4\x35\x54\xc1\x7e\xe\xae\x7f\x6e\x57\xb4\xbc\xff\x9b\x4a\xb7\x2b\x0\x5f\x31\x6d\x74\xd8\x36\x5c\xc3\xa2\xdf\x3d\xe2\x86\xfb\x5a\xca\x30\x50\x3e\x73\x4e\x9a\x94\xf0\x7d\xc5\x4f\xe3\x66\x39\xeb\x70\x52\x4b\xe5\x71\xc0\x76\x44\xa9\xa0\x7b\x27\xb1\x6c\xf\xc6\x96\xcb\xba\xda\xea\x37\x1c\xac\xb3\xd6\xb9\xbf\xdb\x1d\x8a\xfe\x9\x21\x75\x5d\x97\xe1\x8e\x25\xbd\x2d\xdd\xf7\xcd\x2a\x1e\x5e\x7a\xc\xfd\x9f\x60\x8\x64\xce\xf4\x61\x8d\x9e\xcf\xd4\x49\xb\x67\x1\xf1\x87\x53\x13\xaf\x2f\xa\xec\x3a\xbb\xa8\xbe\xc9\x90\x43\x6\x7c\xb6\xcc\xc2\x4c\x62\xb5\xc4\x77\x3\xf3\xab\xd3\x33\x24\xf2\x55\x6b\x1b\xa3\x2\x4\x23\x16\x14\x95\x3f\x65\xad\x89\x26\x5\x42\xfc\x98\x7\xaa\x19\x9c\xa6\xd\x93\xed\xb2\x8b\x40\xd7\x47\x1f\x99\x78\x17\x92\xd1\x4d\x51\x58\x84\xdc\x41\xd9\x68\x85" }, + { 0x547818, "\x73\x5\xde\x12\xaf\xb4\xaa\x9\x31\xcb\xba\x55\xd3\x1b\xf7\xbe\xd9\x45\x6d\x50\x2d\x74\xfa\x9c\xb3\xb2\xc0\x34\x16\x8d\x3d\x3f\x65\x13\xc8\xe3\xc\xfd\xea\x56\x67\x32\x7b\x24\xd1\xee\xc4\x1f\x3e\x4d\xd7\x33\xd5\xbf\xf\xca\x82\x63\x8b\x60\x86\xfe\x37\x51\x6\xe5\xe8\xe6\x64\x2b\x8a\xbb\xd0\xb8\xb1\xdc\xb9\x8c\x75\x5c\x14\x88\x22\x94\x96\x9d\xb7\x58\x2e\xbc\xc9\xa1\x1\x77\xec\xa2\x2\x6b\xc1\xad\xac\x62\xe1\x9b\x40\xb5\xd6\x78\x80\xc3\x4\x3\x4a\xa0\xeb\x8e\xf5\xc6\xab\xf6\x57\xa5\x8\xcc\x5b\xf2\xff\x2f\xa\x25\xb0\x3a\x7d\xf4\x43\x10\x85\x15\x44\xae\x92\x61\x27\x1c\xce\x19\xf9\xa6\xc5\x48\xe2\x59\xb\x89\xef\xc2\x0\xa8\x5d\x99\x54\xed\x2a\x3b\x4e\x42\xf3\x8f\x2c\x18\x6f\x69\x53\x68\xcd\x29\x6a\x1d\xc7\xf0\xd\x23\x4c\xe\x91\xfc\xe9\xcf\x98\x9a\x52\xfb\x21\x1e\x5f\x30\xda\x9e\x9f\xa9\x7a\x6c\x4b\x39\x7f\x20\x5a\xd2\x83\xdb\x49\x81\x93\x7\x3c\x95\xe0\x70\x26\x41\xa3\x79\x47\xa4\x11\x76\x97\x17\x35\xd8\xf8\x5e\x7e\x71\xbd\xf1\x28\x84\x46\xb6\xa7\xdf\x38\x66\x72\xdd\x90\xe4\x7c\x6e\xe7\x87\x36\x1a\xd4\x4f" }, + { 0x547978, "\x4f\xf2\x63\xe9\xdd\x53\x55\xf0\xf6\x86\x76\xab\x8b\x91\x5\xa9\x5c\x92\xc9\xf3\x24\xdc\x3c\x6\xf4\x54\xb\xad\x28\x46\xaf\x60\xc1\xae\xc2\xec\x74\x84\xb3\xcc\x75\x1b\x34\xa6\xf\x6e\x85\xf9\x44\x69\x3d\x4e\x8e\x1f\xed\x15\x12\x62\xdb\xbd\xea\x68\x50\xfc\x30\xde\x5b\x9b\x33\x99\x8d\x61\x98\x56\x78\x19\xc\xb4\x8f\xc8\x10\xb0\x38\x17\x21\x2a\x5e\xe1\xb1\x81\xbc\x2b\xe3\x94\x7b\x6f\x9a\x7e\x48\x3\xc6\xb5\x65\x43\xaa\x23\x1d\x59\x31\xcf\x1\xb7\xfa\xfe\xbf\x1a\x96\xf5\x87\xac\xbb\xfd\xdf\x82\xd1\x13\x8a\x11\xe4\x40\x0\xc5\x7\xa5\xb6\xd9\x4b\xba\x3b\x93\xa0\x9e\x52\x9c\xe\x14\xd2\x3e\x7d\x9f\xd8\x72\x9\xe0\x39\x27\x77\x97\x29\xd5\x88\x95\xee\x22\x3a\x47\xc7\x16\xc4\x25\xb9\x6d\x8\x2c\x35\x6c\xcd\xb2\x5f\xf8\xff\x41\x18\x3f\xe5\x57\x2e\x67\xc3\x49\x89\x90\xcb\xe6\x26\x4\xa8\xbe\xca\x2f\xfb\xd4\x71\xf7\xda\xe8\x6b\x5d\x79\x70\x1c\xce\x7a\xa3\x2d\x4a\xd7\xe2\xb8\x64\x6a\x51\x73\xa\x37\xa2\xd3\x4d\x80\x5a\xa1\x36\x45\x66\xa4\x20\x58\x4c\xd6\x1e\xd\xeb\xe7\x42\x7f\x9d\xf1\xa7\xef\x32\xc0\x2\x8c\x83\x7c\xd0" }, + { 0x539d48, "\x29\x0\x10\x9\x37\xc0\xb\xa\x91\xc8\xc9\xb6\x8e\x1\x9f\x64\xae\x13\xa6\xb7\x62\x27\xf7\xd0\x9e\x68\xf1\xf9\x15\xdd\x3a\x56\xca\xde\x96\x89\x8\x90\x38\xeb\x99\x57\xb8\xd7\x65\x94\x77\xb1\x16\x45\x5d\x67\x2f\x79\xd5\xcc\xdf\x44\xbe\x31\x8a\xef\x88\x7a\xfb\xa3\xa5\x39\x78\x84\x3\xe8\xbd\x8c\x85\x6f\xb2\x59\x6d\x93\x7\xaa\x36\xee\xe7\x7c\x21\x2b\xc7\x40\x54\xcd\xb9\x1f\x30\x80\xea\xcb\xfd\x20\xbf\x2c\xd\x6e\x73\x4b\xe5\x74\x18\x9d\x3f\xb4\xb3\x50\x81\x9a\xd4\xf3\xf2\x3e\x6b\x1d\x9b\x12\x49\xa1\xcf\x4f\x51\x41\x71\xc2\xd9\xdb\x5a\x97\x6a\xe0\x87\x6\x5\x2d\xf8\x47\x5b\x1b\x69\xc4\xad\xff\x43\x46\x24\xc\x82\x33\x8d\x26\x86\xab\x5c\x61\xe4\x66\xaf\x11\xa0\x42\xa2\x2e\x34\xdc\x25\x4d\xd6\xd2\x63\x70\x22\x83\x19\xa7\x4e\x92\xb5\xf\xda\x55\xed\x7f\x7b\xa4\xfc\x1a\x1e\x8b\xbc\xb0\xc3\x98\xec\x17\x60\xc1\x3d\x8f\x4c\x48\xac\xce\x7e\x72\xd1\x5e\x35\xa8\x32\x4\x1c\xe\x3b\xfa\xbb\xa9\x2a\xf6\xd8\x2\x6c\x23\x76\xe2\x53\xba\x28\x9c\xe1\xd3\x52\xf0\xe9\x7d\xe6\xfe\x58\x14\x5f\xf4\xe3\xc5\x4a\x3c\xf5\x75\xc6\x95" }, + { 0x539f60, "\x5f\xfc\x77\xa1\x39\xa6\x43\xf3\x2b\xbf\xab\x35\x4b\xbe\xad\xcd\xd3\x87\x22\x4f\x62\x3a\x1b\x3c\xef\xb1\x71\xae\x8c\x96\xc4\x86\x38\xf8\xa\xf9\x9b\xfb\x33\x41\xea\x69\x4e\x5c\x42\x58\xcc\x67\xf1\x26\xc9\xf5\xa3\x74\xe4\xbb\x56\x8\x7d\xbd\x99\x72\x80\x5d\xed\x2d\x65\xe6\x9\xa0\xb3\xb5\xc5\xa9\x85\x7\xd\x82\x1f\x9e\xd2\x6f\x2\xaf\x57\x55\x93\x48\x76\xc6\x30\x16\xe0\x60\x51\xf7\x59\x1c\x45\x6c\x4\x92\x32\x7a\xf2\x2f\x4a\x36\x63\x2c\xdd\x70\xd7\x4c\xec\xce\x13\xd9\x89\x97\xc7\x81\x15\xdc\xa5\x7c\x5a\x3\x1a\x2a\x49\xb2\x11\x88\x68\xc1\xb4\x9d\x73\x9a\xc0\x47\x21\x12\xe2\x78\x31\x0\x3e\x6\x6d\xca\xb8\x7f\xcf\x25\xb0\x91\xff\xb\x84\x24\xe9\x8e\xa4\x6b\xc\xac\xe3\x17\xc2\xe7\x6a\xc8\x8d\xf0\x14\xe\x95\xcb\xc3\xd6\x3f\x6e\x64\xfa\xd4\xee\x90\x9f\xe8\xd5\x98\xdf\xeb\xf\x2e\x19\x20\xaa\x44\x46\xbc\x53\x8b\x4d\x3b\x7b\xfd\xa7\x29\x28\x34\xe5\x8f\xb7\xa2\xd8\xa8\x3d\xb9\x5b\x75\xdb\x5\x83\xb6\x50\x5e\x7e\x52\xfe\x37\xe1\x54\x66\x9c\xda\x1d\x40\x10\xba\x1e\x27\xf4\x1\xd0\x18\x94\xde\x8a\x79\x23\x61\xd1\xf6" }, + { 0x53a060, "\x1e\x91\xb3\x15\xe7\xc6\x8d\xfe\xc9\xb5\xa6\xdf\x86\xa\x8e\x2b\x54\xbf\x2c\x1d\xbd\x9e\x5f\xcf\x6\x4d\x14\xf\x9c\x2f\x3f\xe8\x49\x1b\xa7\x4a\x10\x88\x7d\xbe\xb0\x35\x11\xe1\xa4\x6d\x30\x2e\x38\x60\xf6\xf7\xdb\xb7\x33\x75\xc\x20\x77\xa9\x9f\xef\xf4\x9b\x79\xfa\x5e\xd5\x3a\x3e\xe6\x44\xd8\x17\xda\xe5\x31\x78\xde\x39\x19\x93\xb4\xa3\xcb\x48\x9d\x45\x21\xf1\x67\xed\xce\x29\x95\xe0\x55\xc1\xfc\x5c\x82\x5\xd3\x80\x76\xab\x72\xb\x97\xd1\xf3\xea\xae\x34\x2d\x98\x73\xc2\xf5\x26\x8a\x1\x37\xfd\x47\xeb\x5d\x0\x56\x8\x66\x36\xd6\x7b\xb2\xe9\x70\xc7\xa5\x7a\x6b\x4c\xdd\x74\x6a\xbc\x43\xc8\x81\x64\x62\xa0\xd2\xfb\x83\x4e\x53\x1c\x52\xcc\x1a\x59\xd0\x99\xf8\x3b\x5a\x28\x41\xf0\xd9\x40\x90\xc0\x69\x7f\x4f\x8f\x8b\x42\x18\xe2\x57\xb6\xb1\xe4\x16\x61\xbb\x23\xa2\xd7\x1f\xc4\x85\xa1\x7c\x9\x65\x8c\xb8\x58\x7\x22\x12\xdc\x13\xcd\xc3\x89\x2a\xee\x27\x7e\xa8\xe\xba\x3d\x4b\x96\x50\x3\xac\x94\xad\xec\x6f\x5b\x87\xb9\xaf\xd4\x63\xf2\x6e\x51\x84\x68\x92\x25\xaa\xe3\x46\x3c\xc5\x24\x4\xd\xff\xf9\x2\xca\x9a\x71\x6c\x32" }, + { 0x53a588, "\x87\xca\xb5\xe\xb6\xee\x76\xd4\xda\x6a\x2b\x3b\x46\x9e\x44\x1d\x38\x3\xa\xb3\x1b\xf5\xea\x80\x94\xe6\x33\x43\x95\x0\xe1\x5c\x41\xc8\x97\x36\xaf\x34\x53\xb0\x6d\x29\xf9\x32\x2\xd6\x75\xbe\x7\xae\xe3\x6c\xa8\xe5\x4d\x56\x68\xb\xf4\x5d\x51\xc5\x54\x6b\x85\xba\x65\x86\xa7\xa9\x2f\xf1\x28\x5b\x4\x9c\xe7\x3f\x70\xd\xd5\xbf\xac\x5e\xad\x5a\x6\x2d\x30\x45\xd2\x17\x8d\x25\xed\x16\xc7\xd3\xde\x78\x22\x4a\xa0\x20\xe2\x89\x11\xa6\x2e\xff\xfc\xec\xfe\x9d\x18\xfd\x27\x60\xb1\xc0\x81\x99\x69\xa5\x64\x3d\xf2\x39\x1c\x9b\xc9\xc4\x8a\x21\x1f\x57\x4b\x5\x62\xb2\x14\x59\x2a\x12\x5f\xd1\x50\x90\x52\xcf\x1\x9\x4f\x7d\x74\x10\x42\x19\x8e\xe0\x40\x8f\xc2\xc\x82\x6f\xbb\xa4\x63\x55\xd7\x24\xab\x92\xbd\xf8\xcb\x8\xe9\x26\x49\x58\xf3\x1a\xc1\xd9\xdb\x4c\xbc\xb8\x84\xc3\x88\x8c\x98\x77\xeb\xcc\x3c\x83\xdf\xfa\x79\x15\x91\x7e\x3a\xf\x93\x66\xce\xa2\x7b\x37\x9a\x1e\xd0\xa3\x71\x3e\x47\xaa\xb4\x23\x96\xe4\xb9\x4e\x7f\xf0\xcd\x9f\x61\xf6\xfb\x7a\xdd\x73\xb7\x13\x7c\x35\x2c\xa1\xe8\x8b\x31\xd8\x72\xc6\x67\xdc\x6e\xf7\x48\xef" }, + { 0x53a688, "\x62\x6f\x9b\x9c\x31\x48\x4c\xca\xc1\xe6\xa2\x2e\xed\xb4\xe2\xc8\x8f\x45\xc7\x76\x7a\xa5\x40\xb8\x15\x36\x93\x13\xc2\xf6\x17\x2f\xf0\x23\xc5\x95\x79\x1e\xba\xc\x73\x8\x0\x60\xc9\x1f\x54\x58\xc6\xbb\x2c\xb3\x68\x55\xbe\x41\xfa\xc0\x2\xa7\xbd\x78\x57\xa9\x69\x6d\xe4\x12\xe8\x7\x3f\xac\x6c\x16\x4\x87\xb5\xa0\x33\x5e\xe1\x28\xee\x4f\x6b\x50\x99\xaf\x51\xbf\x7c\x7d\x6\x5c\xfe\x6a\x53\x9d\x2a\xd4\x14\x66\xcc\x65\xa3\x3b\xfd\xfc\xf9\x3\xb2\x19\x8e\x91\x49\xdf\x1\x44\xa\x98\x9f\x3a\x80\xf8\xb1\x42\x32\x3d\x22\x37\x8a\x35\xae\xd0\x8c\xdc\xab\xc3\x18\xd9\xe5\x10\x5d\x38\x27\xaa\x52\x3c\xf\x74\xf5\x90\xe7\xec\xd1\x81\x84\x2d\xd5\x8b\x82\x5b\x46\x11\x5\x4a\x4b\xea\x5a\xb\x92\x24\xf4\x1b\x5f\x21\x9e\x7f\xff\x6e\xb6\x8d\xfb\xdd\xcb\x1d\xf2\xe3\xb0\xef\xb7\x4e\x25\x86\xa1\xce\xcd\x72\x34\x64\xd3\xf7\x83\x94\x89\x9a\xd\xd8\x71\x67\xad\xbc\xf1\xa6\x63\x88\xd7\xe\x70\xc4\x20\xde\x3e\xd2\x7b\xb9\x1c\x1a\x39\x30\xda\x59\x47\x43\x29\x9\xe0\xcf\x77\x4d\x75\x97\x56\xdb\x2b\xa4\xa8\x7e\x96\x85\x26\xf3\xd6\xe9\x61\xeb" }, + { 0x53a7c8, "\x84\x5c\x65\xae\x56\xa1\xcc\x60\xa9\x28\x29\xf5\x35\x54\x33\xd1\xd6\x48\x44\x68\x34\xef\xee\xf3\x80\xa5\xcf\x2c\x22\xdf\xac\x53\x18\x2a\x19\xdb\xf1\x3d\xbb\x1b\xc4\xf2\xa6\xbf\x32\x2b\xe7\x8c\xb6\xba\xf8\x8b\x1c\xb7\xfe\x11\x75\xf6\xf7\x59\x76\x9c\xb1\x6e\xb4\xc6\xd\xb2\xb8\xc\x1f\x6\x12\x62\xa0\x47\x74\x5e\xd3\xde\x6a\xe\xaf\xc1\x8d\x57\x7\x89\x0\xa8\xbc\x51\x95\x4d\x97\x98\xfb\x9a\xea\x61\x7d\xe5\x50\x4f\xdd\x52\x64\xe4\x16\x8\x70\xff\x40\xd7\x9\x87\xad\xc7\xf4\x4c\x83\xd2\x63\x6c\xeb\x3\x79\xf\x13\x27\x88\xc5\x8e\x20\x3c\xb9\xf0\xc9\x94\xc3\x96\x1\x67\xb\x3e\x7e\xd8\xd5\x2d\x42\x58\x6f\x6b\xcd\x86\xdc\xab\xed\xfc\x24\xa3\x5d\xe9\x9d\x3a\x38\x8f\x55\x30\x46\xca\xc2\x25\x5f\x66\xc8\xe2\x23\x7a\x6d\xfa\xce\xe6\x36\x45\xb3\xb5\xfd\x92\x1a\x39\x21\x31\xaa\x7f\x71\x9b\xbd\x93\x43\x4\xa4\xd0\x81\x41\xf9\x78\x5a\xa7\x17\xcb\x9f\x3b\x90\x2\xe3\x5b\x69\x1e\xec\xe1\x5\x91\xd4\x4b\x7b\x8a\x77\x4a\x7c\xd9\x82\xc0\x26\xbe\x85\xda\x14\x2e\xa\x9e\x72\x4e\xe0\xa2\xe8\x99\x3f\x37\x10\x2f\x15\x73\xb0\x1d\x49" }, + { 0x53a8c8, "\xfe\x9b\xe5\x18\xb2\x38\x1d\xd4\x98\xa9\x52\x58\xc3\xe1\xe8\xbf\x39\x4a\x36\x9\x6f\x7e\xb0\x4f\xca\xcd\x3\xe0\x66\x1e\xdf\xd2\x59\x95\x71\x2a\x16\xa2\x86\xcf\x64\xf0\xdb\xf3\x8e\x35\x7f\x19\xb1\x33\x90\xbe\xc0\x8f\x5d\x6e\x51\x56\xda\xaf\xa\x25\x54\xd3\x41\xb9\x7d\x82\x62\x97\xfc\x4d\x88\xe3\x57\xff\xb4\xc7\x1c\xbd\x80\xef\xe6\x1\x23\xce\x17\x44\xdc\x67\x26\x6a\xbc\x8d\x45\xb8\xa3\x1f\x9e\x7\x74\xb3\xc9\x0\x9c\x78\xf4\xf1\x32\x49\x14\x73\xc5\x7a\x65\x5b\xf\x42\xbb\xa4\xb\xcc\xe7\x27\x9a\xfb\x55\xd6\xd\xad\xeb\x10\x79\x1a\x2d\xed\xe4\x2e\x5a\x7c\x3f\x3c\x47\xa6\x20\x92\x46\xb5\x84\x7b\x37\x89\xee\x2b\xf8\xa1\x30\x48\x9f\x87\x68\xb7\xae\xa0\x29\xb6\xc6\xf9\x2f\x22\xf6\x43\x83\x5c\x21\x5\xd1\xfd\x6b\x50\x11\x93\x8c\xe2\x28\xa5\x3b\x2c\xba\xd0\xcb\x91\x4c\xc1\x69\x53\x75\x12\x85\xab\x4\xf2\xd8\x34\xf7\xc2\x40\xec\x3d\xe9\xc\xa7\xd7\x8a\xaa\xac\x99\x15\x2\x31\xea\x6\x60\x4e\x72\x70\x94\x63\xfa\xc8\xc4\x3a\x4b\x13\x3e\xa8\xf5\xde\x24\xd9\x6c\x76\x5e\x96\x5f\x1b\x6d\x9d\xd5\xdd\xe\x77\x61\x8b\x8\x81" }, + { 0x53aa20, "\xfc\x7a\xc6\x79\x44\xfa\x78\x60\xb5\xd8\xa\xc0\x19\x5e\x12\xa9\x29\xb3\xcd\x75\xe3\x7b\x3a\xf1\x85\xab\x2f\x33\xe9\xc1\x14\xf0\x96\x82\xf9\x72\x77\xa3\xdd\xc9\x8c\x53\x4e\x1\xd1\x2e\x5\xec\x16\xdb\xd7\xb2\x35\x10\x74\xb1\xf6\xbe\x8a\x15\x50\x92\xe0\x7\xde\x24\x9c\xe7\x22\xda\x5d\xc3\x9e\x42\x59\xb\x11\x4a\xaf\x5f\x76\xd0\x94\x2c\x3f\x48\x97\x99\x2b\x34\x1e\x89\x6b\x23\x30\xce\xc\x8b\xaa\x57\x91\xc7\xea\xf4\xb8\x21\x8d\x3e\x70\x6\xa2\x64\xd3\x9f\xf3\x4b\x13\x2a\x1c\x7d\xee\xa1\xe5\x58\xbf\x98\x3\xfb\x6e\x81\x61\x56\x8e\x71\xa6\x26\x5a\x46\x80\x7e\x9\x37\xa4\x6a\x90\x1b\x1d\x51\x27\x5b\x2d\xba\x4f\xbb\x7c\xa8\x93\xf7\x4\xf5\x68\xd5\xc8\xc4\xef\x36\x84\xe8\xcf\x62\x2\xcc\x67\x49\xb0\x43\xc2\x3b\xa7\xa5\x1f\xfe\xac\x40\xb9\xc5\xae\x6f\xd4\x9a\x95\xbc\x17\x47\x9d\x86\xb7\xfd\xeb\x63\x65\x39\x69\x3c\x55\xe1\x9b\xd2\x66\xdc\x73\xbd\xf8\x83\xff\xf\xcb\x52\xb4\x88\x4d\xe6\x8\x6c\x20\x18\xe2\x45\x25\xe\xf2\x32\xdf\x38\x41\x4c\x5c\x31\x8f\xb6\xed\x0\x54\x28\x3d\xe4\xd9\x6d\xca\xad\xd\x7f\xd6\x87\xa0\x1a" }, + { 0x547b00, "\x72\xf0\x14\xcb\x61\xa5\xb2\x2\x75\x22\xc3\x9d\x5a\x63\xfa\x5f\xd9\x55\x58\x43\x24\x7d\x77\x93\xba\x50\x1d\xf7\x49\x18\xb0\x42\xbb\xec\x52\x38\xdc\xc8\x16\x54\x17\x19\x89\x67\x33\x3c\xa\xad\xc9\xde\x81\xed\xbd\xe\xb\x6d\x46\x30\x35\x2b\x8c\xa0\x1c\xd\xfd\xa1\x70\xc6\xd8\x41\xb3\xc0\x44\xeb\x92\xbe\x6b\x98\x1a\x76\x71\xc5\x51\x56\x80\xfc\x1\x53\x4b\xd0\x8b\xd2\x7b\xe7\x15\x5d\xe5\xa6\x8a\xd3\x9b\xf4\x69\x23\xe8\xb6\xc7\xe2\x73\x9f\x88\xdf\xb4\x28\xee\xc2\x94\xb8\xf9\x7f\x4a\x57\x6\xf6\xbf\xc1\xab\xfb\xa4\x8e\xd1\xd7\xf5\x7c\xa3\x1e\x3b\x32\x3\xaa\x90\x5c\x48\xe0\xe3\xcf\xd4\xef\x59\xd5\x1b\x34\x1f\x95\xce\x7a\x20\x26\x87\xb7\x78\x9c\x4f\xa2\x12\x97\x27\x3f\xff\x7\x84\x96\x4\xaf\xa8\xea\x2c\x6c\xae\x37\x91\xa9\x10\xdb\xcd\xda\x8\x99\xf1\x4d\xcc\x68\x79\x2e\xb1\x39\x9e\xe9\x2f\x6a\x3d\xf\x85\x8d\xca\x29\x86\xd6\xdd\x5\x25\x3a\x40\x21\x45\xac\x11\xf3\xa7\x9\x2a\x31\xe4\xc\xf8\x6e\x3e\xb5\x82\xfe\x74\x13\x65\xe1\x2d\x8f\xe6\xc4\x0\x5b\x4e\xb9\x66\xf2\x62\x36\x4c\x83\x5e\x6f\x47\x64\xbc\x9a\x60\x7e" }, + { 0x547548, "\x7c\x11\x4d\x5b\x41\x55\x97\x3f\x59\xed\xda\x6f\x85\x33\x16\xc8\xb1\x18\x50\x6c\x9c\x38\x2\x71\x2e\xec\x93\xa1\xa5\x0\x91\xaf\x7a\x92\x1b\xc7\x3a\xa9\xbe\xb6\x9b\xe5\xee\x57\xf1\x99\x47\x4\x6b\xd8\x20\xf4\x3\xd3\x75\xe3\xb8\xdc\x7\x54\x4f\x2d\x37\x49\x14\x9f\x69\xc4\xf7\xc6\xf0\xce\x24\x7b\x7e\x89\x4e\x3c\x7f\xcc\x9\xe6\x2f\x61\xfc\xcd\x86\x62\x83\x56\x29\xd6\x32\xc\x76\xc1\x5c\x68\x51\xf3\xa8\xe2\x87\xcb\xe0\xdb\xb\xba\xe4\x46\x9a\x84\x95\xf\x10\x81\x82\x53\x1c\x26\xc2\x31\xb0\x8c\xb3\x9d\xd9\x96\x5a\x79\xd1\xb2\x25\x80\x1f\xa4\xff\x60\x44\x1a\xb9\x45\xf9\xd2\x6e\xd0\x5e\x35\x98\x66\xc3\x90\xae\xa0\x78\xb5\x34\x2c\x12\xf5\xcf\xaa\xe9\x77\x8b\x70\xde\xeb\x65\xbb\x72\xa6\x88\x58\xa2\x27\xc5\x4b\xbc\x19\xdf\x36\x1e\xa\x74\x15\x17\xbd\x22\xe7\xac\xf6\xf2\x30\xe8\x13\x1\xef\x8f\xd4\x2b\x23\x48\x5f\x21\x3d\x73\x8\xa7\xd\xfd\x63\x67\x4a\x8e\x6a\xd7\xb4\x3b\x40\xc9\xfa\x64\x39\x7d\xea\xab\xfb\xd5\x8d\x42\x8a\x6d\xca\x94\xc0\xe1\xad\xbf\xa3\x9e\x28\x3e\x1d\x43\x6\xb7\x52\xe\x2a\xfe\xf8\x5d\x4c\xdd\x5" }, + { 0x53b1d0, "\xf\x8\xef\x6c\x8f\x19\x5e\x9c\xdb\xec\x35\x6f\xe9\x5\xe0\xd\xf3\x17\xa2\xb3\xcf\x28\x46\xe1\xa0\x6\x4e\x38\x4d\x25\x3f\xb5\x12\x80\xb2\xa7\x3\xbc\xca\x41\x6b\x2f\x1d\x4b\x66\x6a\x68\xaa\xc4\x77\xa4\x59\x4\xbe\xc9\xb9\x7b\xd1\xc5\xde\x57\x85\xa9\xcc\xc8\x6e\x78\xb\x82\x2\x5f\xae\x51\x7f\x2d\x8c\xee\xcb\x69\x62\x67\x81\x87\x5c\x1f\x8b\x74\xa5\xe\xf2\x5b\xc0\xc2\x18\xe5\xfd\x95\x65\x20\x97\x58\xc6\x3b\xb7\x9\xdc\x21\x11\xe4\xe3\x16\xa8\x63\xf6\x33\x6d\x8d\x9e\xb6\x34\x7\x14\x36\x71\x60\x45\xfb\x4a\x9a\xea\x1b\x90\x31\xb0\x99\x1c\xd3\x7c\x24\x47\xe2\xdf\xe8\xc7\x29\x30\x1\x2b\xd4\x8e\xb8\xd6\x7e\x2a\x7a\x3d\xf4\xdd\xd0\xb1\xf0\x73\xab\xbb\xa6\xf7\x3a\x1e\xba\x52\x4f\xbd\x4c\xb4\x72\xc1\xe7\xfa\x1a\x54\xf5\xac\xff\x5d\x40\x37\xd9\x43\x23\x93\xa1\x3c\x79\xad\x44\x76\xed\xaf\x84\x94\x49\x50\x91\x10\x70\x5a\xce\xc\xd8\x0\xfe\x92\xd5\x55\x56\x2e\xeb\x89\x13\x88\xc3\x64\xe6\x75\xa3\xf8\xf9\xa\x9f\xcd\x61\x83\x96\xfc\x22\x9d\x7d\x2c\x53\xd2\xbf\xd7\x39\x3e\xf1\x48\x8a\x15\x42\x98\x27\xda\x26\x32\x9b\x86" }, + { 0x53b2d0, "\xab\xdf\x86\xff\xce\xfa\xaa\x1\xd2\x41\x9e\xe7\xbc\xc0\x77\x22\xe8\x7c\x4e\xfb\x8e\xf3\x33\xc9\x4b\x26\x60\x89\xc4\x69\x79\x96\x54\xcd\x10\x48\x23\x31\x38\x44\x82\xe5\x6a\x8\xd7\x3f\xe1\x28\xd3\xa6\x4c\x7\x34\x5b\x7f\xb0\xd\x81\xd0\xf\xc1\xaf\xcc\x3d\x99\x19\x24\x57\xb4\x2c\x8d\x7d\x58\x55\x27\x8a\x42\xb\xa2\xca\x53\xc5\xe0\xf4\x4f\x2f\x8b\x21\x2\x2d\x12\x65\xf5\xf2\xc8\xed\x1d\x47\x5c\x1c\xa8\x40\x7a\x8f\xda\x87\xd5\xb1\x4\x70\xea\xe\xeb\x29\xb5\xb8\x9f\xf8\x2a\x3b\xb3\xfd\x5d\x0\x71\x2e\xc2\x46\xec\x92\xf9\x6\x74\xe4\x6d\xa0\x59\x6e\x25\xa9\x7b\x5f\xe2\x64\x3e\x37\xfc\xd4\x9b\x5\x61\x84\x20\xa\xc6\xa7\x76\x83\x62\x32\xa3\x6f\xc7\x78\xa5\xf6\x30\x6c\xdc\xa1\x2b\xbd\xae\x15\x3a\xf1\x4d\x45\x5e\x75\x98\x68\xad\x1b\xd1\x49\x35\x6b\x52\x14\x1a\x11\x88\xbe\x8c\xac\xc\xe3\x66\x13\xd9\x17\xcf\xdd\x93\xbf\x39\x56\xf7\x18\x94\x63\x3\x1f\xd8\xb6\xcb\xf0\x9d\x9\x16\xe6\x90\xa4\xb2\xba\x85\x3c\xd6\xfe\x36\x50\xc3\x43\x80\x1e\xb9\xee\xb7\x9a\x51\x9c\xdb\xef\x67\xde\xe9\x7e\x97\xbb\x5a\x72\x4a\x73\x95\x91" }, + { 0x53b418, "\xc6\xcb\x61\x7f\xb\x44\x1c\xea\xc1\x87\x7d\x4e\xd4\x23\xbc\x82\x10\xa7\x3e\xaa\xbf\x46\xb2\xd2\xa3\x33\x20\x27\xc0\x9f\xe2\x45\x6b\x96\x6\x8b\x1d\xb7\x26\x56\x88\xc3\x13\x2b\x15\x37\x9e\x57\xe5\xc8\x21\xa9\x92\x2\x38\xfe\xd7\xba\x9a\xc7\x5a\x84\x28\x58\xfb\xa8\x90\x42\xf4\x3d\xfa\xdc\xa\x4c\x48\x8f\x8e\x39\x3b\x63\x5\x79\x4a\x2c\x65\x71\xe\xdb\x29\xe0\x50\x1\x8d\x19\x31\x94\xd\xb4\x9c\x6c\xb3\x68\xc2\x2e\xce\x97\xe6\x2d\xcf\x36\x91\x1f\x7a\xf\xc4\x8a\x5d\x9b\xad\xfd\x93\xd8\x3f\x9d\x64\x85\x4d\x99\x69\xd5\xd1\x18\x1a\xd9\x12\x2f\xf5\xf2\xda\x80\x51\x1e\x4\x60\x7c\xd6\x86\x54\x62\xac\x5b\x17\xf8\x66\xa4\x43\x49\xff\x0\xe1\x9\xb9\xed\xdf\xd3\x55\x72\x16\x4f\xe9\xe3\xab\x81\xe8\x2a\xcd\xb1\x53\x77\x75\xb0\xdd\xc5\x67\xf3\xa6\xe4\x34\x3a\x40\x1b\x83\x6f\xef\xa5\xa2\xca\x73\xb5\x47\x8\x76\x11\xc9\x3\x3c\xf7\x6a\x25\x41\x30\xf9\xaf\x5c\x95\xa0\xb6\x35\x78\xbe\xd0\x14\xec\x59\xbb\x70\x5e\x74\x6e\xb8\xae\x7e\xfc\x7\x6d\x52\xe7\x32\x8c\xcc\xeb\xf1\x89\x7b\xbd\xa1\xf0\xc\x98\x24\xf6\x5f\xde\x22\x4b\xee" }, + { 0x53b550, "\xa0\xb9\x6e\x86\xd9\x98\x97\x73\x25\x76\xf\xcc\x7\xe8\x7a\x79\xb5\xe5\x38\xf4\xc2\x16\x10\x2f\xa2\xec\x3a\xb0\xdf\x5f\xb4\x6a\xb1\x60\xd4\x3e\xd2\xde\x6\x95\x62\xd5\xab\x9\x13\x11\x92\xa6\x37\xa\x2c\x64\xf1\x80\x1b\xfc\x31\x22\x3b\xff\x94\x70\xca\x84\x24\xdd\xd7\xd3\xb2\x32\x3d\xb6\xb7\xa9\x26\x9b\x48\xc0\x1f\xaf\x83\x6c\x58\x29\xc3\x7d\xc5\xf3\x8d\xb\x8a\x2a\x69\x1d\x91\x7e\x9c\x3\xb8\xf2\x9f\x45\x28\x4c\xbb\xcb\x2b\xfd\x61\x7f\xb3\x99\x6b\xbc\x7c\x19\x52\x2\x78\xea\x5c\x49\x74\xa7\xc7\x59\xf6\xf0\x8f\x81\x82\x8c\x1\xf5\xc4\xad\x21\xa5\x0\x5a\x39\x75\xd8\xc\xc1\x85\x17\x5b\x77\x43\xc6\x89\xa1\xf9\x20\x93\xee\x12\x1e\x1a\xe1\x57\xf7\x4\xae\x18\xcf\x33\x47\xfe\xe9\x8\x71\x65\xbd\xd\xcd\x6d\xe4\xac\xba\xdc\xd0\xf8\x4e\xe0\x8e\x5d\x41\x3f\x54\x42\xa4\x40\x34\x5e\x87\x7b\xe3\xdb\xe7\x51\xd6\x9a\xaa\xce\xbe\x36\x67\x35\xd1\x68\x4f\xfa\x23\xfb\xed\x8b\x44\x9d\x50\xeb\xc8\x14\x15\xe6\xc9\xe\x88\x4d\x66\xa8\x5\x3c\x46\x2e\x27\x6f\x72\xbf\xa3\x2d\x96\x9e\xda\xe2\x63\x1c\x53\x55\xef\x56\x4b\x90\x4a\x30" }, + { 0x53b718, "\xd4\x58\xf7\x7\xc3\xfd\x69\x49\x23\x17\x65\x84\x9b\xf\x77\x97\xb\xc4\x67\xb1\xbd\xba\x85\xc7\xff\x8f\x32\x28\xea\x6b\xd7\x9f\x31\xab\x9e\x5b\x11\xa8\x36\x8\x96\xa4\x4f\xa2\x70\xed\xd3\x91\x2a\xd9\x73\x6\xb4\xaa\x35\x72\x48\xf3\x0\x1e\xc0\xdf\x2e\x29\xdd\xb7\xa\xd\xaf\x2f\x56\x19\xc\x39\x5c\x46\xec\xac\xfc\x7d\xe6\x92\xf2\x15\xa3\x5d\x93\x3d\x98\x2d\x79\xb0\x52\x5f\xb3\x89\x3\x4\x1d\x55\x42\xcc\xe9\x83\x16\x80\xd2\x8e\x5a\x66\x1b\x47\xfa\x88\xa7\x9a\xd1\x25\xf8\x44\xe2\x26\x59\x9\x61\x40\x3c\x34\xd8\x30\x45\xbb\xc6\x7f\xe7\xbc\x7b\xa9\x3a\x1c\xe5\x68\x21\x5e\xb2\x12\x2c\x74\xcf\x8a\xb9\x24\x1\xcd\xe4\xb5\x9d\x1f\x18\x3b\xe0\x71\x4e\x4b\x4d\x62\xa0\xd0\xc2\xd6\xeb\x43\x51\xf9\xa6\xf4\x2\x90\x1a\xa5\xef\x5\x7c\xb8\x57\xc1\xfb\x8d\xde\x50\x33\xf5\x82\x86\x3e\x76\xc9\x8c\xa1\x8b\xc5\xee\xbe\xe3\xda\xae\x14\xf1\x6f\xe1\xd5\x10\xf6\x27\xfe\x6d\xce\x9c\x6e\x94\xe8\xb6\xca\x60\x37\x53\xe\x54\x3f\x99\x75\x81\x20\xcb\x4c\x7a\x6c\x38\x78\xdb\x64\x95\x6a\x13\x4a\xf0\xbf\x22\x41\xdc\x87\xc8\x7e\x63\x2b\xad" }, + { 0x53b838, "\xe3\x57\xc6\x8b\x64\x27\x80\x87\x9b\x49\x29\x6e\xa8\xda\x5b\x20\xbb\x69\x19\xd3\x5e\x30\x9e\x9d\x24\xcd\x2c\x1c\x79\xb\x9f\x8d\xff\x41\x6f\x68\xbd\xd9\x55\xcf\x36\xe6\x5f\x93\x99\x33\xe1\x72\xf2\xe\xd2\xe2\x2e\xd7\xa7\x32\x31\xa2\x25\xfd\xef\x67\x21\xe4\x2d\x3e\xd0\xac\x34\x35\xf1\x44\xee\x5a\x83\x71\xc1\x59\x3f\xa3\x10\xfb\xa6\xcc\x0\x40\x18\x3b\x9a\x47\xfa\xa5\x66\x5d\x6a\x2f\x16\x23\x88\x7a\x84\xc5\xc9\xea\xce\x58\xeb\x11\xaf\x5\x37\x89\x17\x1a\xe5\xb8\xa\xc0\x95\x48\x81\xb7\xf\xf6\x7e\x60\x8f\x8\xd5\x42\xd1\xf8\x45\x2b\x5c\x1b\x76\xf0\xc8\xf4\x3\x7d\x50\xb5\x86\xb3\xe0\x7b\x3a\x1f\xdc\x92\x28\xca\x61\x4a\x78\x1e\x51\xdd\x3d\xbc\x77\xd8\x53\xf9\x94\x74\xc3\x9\x4f\xb6\xec\x2a\x91\x8c\xd4\x38\x4e\x26\x1d\x96\xdf\x4\xd\xab\xa4\xfc\xc4\x15\xa9\x3c\x97\x6b\x7\xde\x9c\xe8\x22\xe7\x2\x6d\xa1\x39\xf3\x54\xba\x6\x65\x90\xb0\x6c\x63\xad\xf5\xb4\xb9\xc\xe9\x1\xc7\xd6\xc2\xb2\x56\xbe\xaa\xb1\xcb\x52\x82\x14\xed\x7c\xfe\xae\x85\x8a\x13\xbf\x4c\x98\x4b\x62\x12\xa0\x4d\x7f\x73\x8e\x43\x75\xf7\x46\x70\xdb" }, + { 0x53bc10, "\xf\xc6\xa1\xa3\x50\xbd\xce\xa7\x9\xa4\xf7\x1b\x8c\x3d\xf0\xe5\xdf\x3c\x20\x75\x3f\xdd\x12\x81\xde\x3b\xaf\x68\xf6\xea\x41\x58\xeb\x5d\xae\x61\xa\x46\xed\x91\x23\x65\x99\x86\x27\x92\x8e\x83\x51\x8\x4b\x3e\x32\x1f\xbf\x5b\xa9\xc5\xfe\x7c\xf4\x15\xdc\x89\xf5\x2b\x72\xad\x6b\xba\x5a\xf2\x24\x53\xe7\x29\xee\x4\xd\xf3\xe0\xb7\x67\xcf\xb0\xc3\xbc\xc9\xfa\x66\xcd\xb4\xd5\xd9\x71\xe3\xb8\xa0\x25\xf8\x78\xc4\x5\xe9\x87\xfd\x35\x1a\x98\x9f\x16\xb3\x6\x26\x22\xb2\xd6\x74\xc7\x84\xc2\x7d\x64\xec\x54\x37\x4c\xef\x70\xe\x48\x9b\x4e\xd7\x80\x7\x73\xbe\xd3\x2\x3\x94\xfc\x59\xb5\x8b\x21\x9d\xf1\x69\xe1\x10\x38\x2d\xd2\x45\x30\x42\x85\x6e\x52\xc\x76\x82\x6d\xa6\xd4\xe4\x90\xa2\x62\x7e\x1\xe6\x1d\x4a\xff\x8d\x79\x8a\x55\x77\x2f\xca\x9e\x47\x19\x6c\x28\xb6\x93\x97\x6a\x18\x5c\x4f\x95\x6f\xc0\x14\x40\xdb\xa8\x17\x34\x36\x39\x56\x11\x13\xd1\xc8\xcc\x1e\x2c\x5f\x43\x5e\xa5\xe8\xd0\x9a\xe2\xab\xf9\x4d\x3a\xaa\x1c\xb\x2a\xb9\x31\x7a\x60\xac\xfb\xb1\x44\x0\x88\x8f\x33\xc1\x7b\x49\x2e\xda\x63\xd8\x96\x57\xcb\xbb\x7f\x9c" }, + { 0x53bd10, "\xba\x9d\x27\x84\x89\xcd\x60\x67\x68\xd9\x1f\xea\xf2\x15\xd2\x6\x12\x5d\x54\x75\xbc\xa0\x29\xe8\x16\x70\xc8\xf1\x9\xa4\x26\x30\x49\xd\xbd\xf4\xf8\xef\x8d\x1d\x41\x38\xf7\x9c\x1e\x87\xf3\xbe\x7a\x37\x88\xcb\x36\xe6\xfc\xd6\xd0\xad\x78\x71\x93\x96\xf0\x3c\xfe\x57\xe9\x4f\x7d\xaa\xf9\x62\x9a\xab\x18\x39\xbf\xc\xc3\x4d\xe7\x97\x7f\x8a\x3f\x1\xc9\x80\x76\x9e\xfb\xa1\x3e\xfa\xb3\x45\x3b\xdc\x5c\x5b\x58\x61\x2b\xec\xb4\x55\x1a\x9f\x6a\x3\x11\x32\xd1\xe1\xb2\xa8\x6c\xe4\xa3\xa7\x4b\xf5\x17\x40\x6e\x8\xff\x81\x4c\x5\x79\xae\x1c\x83\x46\x25\x6b\xdf\x24\x64\x2e\x4e\x21\x31\x2\x73\x6f\x3a\x8b\xc4\x7b\xac\x23\x72\x20\x65\x7\x33\xa2\xe0\x47\x77\x85\x2d\xdd\x0\xf6\xd8\x9b\xb9\x63\xd4\x53\xaf\xb7\xda\xa5\xc5\xc6\x2f\xa\x6d\x92\xb8\x50\x74\xbb\x14\xd3\xf\xb0\x4a\x95\xe3\xce\xee\xca\xe\x91\x82\x8c\x3d\x8f\x22\xa9\xb1\x86\xc0\x5f\x28\x90\xdb\x7c\x4\x94\xb\xc7\xd5\xfd\xc2\x2a\x1b\x98\xed\xcc\x59\x8e\xe5\xe2\x42\xb6\x34\xd7\xa6\x13\x2c\xc1\x44\x51\xcf\x99\x48\x69\xeb\x7e\xb5\x52\x35\x19\x66\x10\x56\x5e\x43\xde\x5a" }, + { 0x53be50, "\x64\xe7\x66\xd5\xf\xc3\xc8\x20\x4e\x9\xd3\x30\x3f\xef\xa9\x80\xe3\x72\x42\x68\xa5\x51\x99\xb\xbf\x4d\xd1\x34\xaa\xdf\x2f\xec\x55\x58\xb0\xdb\xb8\xd6\xc5\x9b\x9a\xa\xbb\x40\xc2\xb2\x2e\x78\x89\x97\x5d\x74\xf7\x52\x5b\xa1\x2b\x83\xae\x7b\xd9\x5e\xfe\xfd\x98\xd2\x29\x13\xc6\x8e\x5c\xca\x7\xd4\xe4\x49\xa8\xa0\xff\xee\xc9\xcf\x16\xb4\x61\x8f\x60\x1\x84\xb5\xac\x62\x54\x6\x2d\x63\xa7\x48\x73\x1e\x92\x2c\x3c\x82\xe1\xcb\x10\xf2\xd8\x50\xf1\xfb\x96\xc\xd7\x6b\x87\x77\x7e\x15\x8a\xde\x31\xe\xab\x59\xd\x3b\xf3\x79\x1f\xfc\x81\x27\x1a\xf9\x94\x2a\x45\x88\xfa\x47\xe9\x7d\xb7\xed\x7c\x32\x7f\xe2\xbd\x6f\x18\x76\x4b\x65\x70\x22\x1d\xaf\xeb\x28\x4f\x9c\xbc\xf8\xcd\xc0\x1b\x43\xb1\xea\xa3\x6c\x12\x35\x44\x8d\x25\xb3\x1c\x24\xc4\x9d\xa2\x36\x56\xb9\x19\xe8\x21\x11\xf0\x75\x5\x17\xc7\xce\x41\x4\x4a\xe0\x6e\x67\x69\x4c\xdd\x53\x3e\xa6\xd0\x3d\xdc\xcc\xe6\x9f\x93\xc1\x33\x90\x57\x37\xb6\xa4\x9e\x6d\x8b\x46\xad\xba\x86\x38\x85\xf6\x5f\x8\x14\x2\xe5\x8c\x5a\x39\x95\xf5\x91\xda\x7a\xbe\x23\x26\x6a\x71\x3\xf4\x0\x3a" }, + { 0x53bf68, "\x36\xbe\x8a\x3c\x5d\xaa\xc4\xf5\xfa\xc\x3f\xd\xa0\xc6\x49\xc1\xe1\x20\x7a\x31\x84\x87\xf7\x9f\x71\x6b\xeb\xa8\x11\x35\x22\x78\xe4\x83\x97\xdd\x53\x39\x45\xb9\x3\xad\x4c\x34\x8e\x79\xfc\x57\xb8\x47\x66\xfd\x54\x96\x33\x48\x4b\x88\xf9\x7\xa2\x3e\x64\x1b\xb2\xf\x5f\xcb\xcd\x18\xfb\x74\x70\xb1\x2a\x37\x2c\x98\x9a\x7c\x30\xe2\x75\x28\x26\x63\x1c\xec\x3a\xa3\x8\x85\xc5\xe\x2b\x4\xe9\xc9\x4f\xd1\xd2\x25\x9d\x6c\xd0\xfe\xce\xca\x15\xbc\x82\x2d\x27\x3d\xbb\x56\xe6\x24\xd7\xe3\xf2\x6e\x12\x9c\x6a\xe0\xe8\x4a\x9b\xd5\x10\x86\xc7\x90\x7d\x61\x67\xd8\xb5\xf1\x1a\x8f\xf8\x89\x4d\xa\xe5\xf4\x7b\x60\xa1\x40\x42\x2f\x1\xb6\x1f\xef\xd3\x81\xc2\x5b\x6d\x41\x5c\xff\x95\xc8\x76\x94\xd6\xd9\x19\xf3\x38\xb4\xdf\x59\xb\x52\xb7\xab\x73\x14\x62\xbf\x9e\xb3\x21\x3b\x17\xba\x58\xcc\xdb\x6\xda\x5\xa5\x16\x4e\x80\x1e\xa7\x8d\xa6\x7e\x99\xae\x0\x5e\x2e\x77\x50\x65\x29\x7f\xd4\xee\xf6\x2\x13\xdc\x69\xa4\x44\x8b\x32\xde\x92\x68\x1d\x51\xcf\xa9\xbd\xf0\xc3\x72\xed\xb0\x8c\xac\xc0\x23\x9\x46\x55\x91\x43\x5a\xe7\x93\xaf\x6f\xea" }, + { 0x53c0e8, "\x6d\x90\x16\x84\x89\x48\x99\x24\xad\xbc\x92\xe\x6a\xf5\x4e\xea\xaf\x38\xcb\xbd\x8a\x12\x9e\xd6\xb\x8e\x9c\xf8\xb5\xa1\x81\xe3\x9d\xfa\x65\x77\x6\x7b\xb8\x98\xda\x54\xf6\x3b\x7\x93\x5c\x7a\x15\xfe\x2a\x30\x36\x80\x39\x8c\x2b\x4b\x5b\x21\xe0\x13\x6c\x29\xc0\xbb\x27\x3a\xdd\x3f\xa2\xe9\xac\x4c\xef\x44\x70\x19\x5a\x72\x7c\xc5\x3c\xdc\xcf\x88\xf2\x51\x47\x61\x3\x67\x82\xfb\xed\x18\x9f\xb7\xa7\xb0\xc4\xf\x26\x5\x28\xe5\xd2\x4f\xa\xd0\xb3\x1\xd5\x1a\x37\x6e\x8\x9a\x1f\x60\x45\x5f\xf9\x33\x9b\x6f\x2d\xca\x9\xb4\x3e\xbf\x96\x95\x4a\x11\x1d\x74\xcd\x87\xce\xb9\x20\x68\xc3\x40\xf1\x31\x8d\x25\x7f\x2\x17\xb6\xcc\xd3\xa5\x59\xf4\x91\xd1\x83\x4d\xc2\xe1\x22\xec\x4\x52\xf0\xd9\xae\xc8\x56\xf7\xd4\x85\x42\x1e\x35\x1c\x7e\xeb\xe2\x76\x6b\x49\x75\x3d\x58\xff\x57\xbe\x43\x46\xf3\xba\x2e\x69\xa3\x34\x78\xb2\x73\x5e\xe7\x1b\x8f\xd8\x8b\x94\xa8\xe6\x97\x7d\xde\x2c\xa6\xab\x23\xfd\x50\xe8\x79\x62\xa4\x66\xfc\xee\x86\x41\xc6\xd7\xa0\xc7\xe4\x5d\xc9\x53\x32\x63\xaa\xc1\x64\xdb\xb1\x0\x10\x2f\xc\xdf\xd\x14\x55\x71\xa9" }, + { 0x53c240, "\x74\x4b\x7\xe3\x16\x70\x33\x94\xb\xb6\xe6\xc0\x62\xd5\xe5\xfb\xbe\x8d\x67\xc8\xc7\x58\xc6\x2e\xf9\x47\x77\x12\x4a\x68\x6c\x84\x35\xe1\x69\x14\xc4\x48\x32\x11\x9d\xb1\xe\x5a\xd0\x17\x60\xed\x28\x21\xef\x10\x2b\x5b\x31\xab\x23\x89\xf0\x18\x66\x0\x87\x99\x30\xe2\xda\x49\x7f\xd2\x4d\xcc\x81\xd6\xdf\x37\xd\x1a\xaa\x51\x97\xb3\x73\xd3\x50\xb2\xdd\xc3\xbf\x3e\x92\x1\x64\xf4\xcd\x1c\x8f\xaf\xa9\x24\x36\x91\x9e\xa4\xd1\x75\xc9\x59\x42\x4e\xb4\x6a\x4f\xa1\xe8\x6d\x61\x63\xea\x3c\x38\x5\xe9\x9c\x46\xb9\x9f\xb7\x43\xeb\xf5\x5c\x76\x3b\xd7\xba\xa5\x7b\x6f\x5f\xde\xad\xe7\x15\x2\x2f\x5e\xf7\xa6\xbb\x52\x95\xd9\x86\x26\xa\xa8\x8\x20\xf1\x45\x13\xca\xf6\x65\xcf\xe4\x98\xdc\x80\x19\x7a\xfd\x9b\x4\x1e\xa3\x9a\x5d\x72\xb5\xfa\x3\x53\xc2\xc\xa7\x57\x55\x7e\x29\x6e\x83\xb0\x1f\xbd\x8e\x93\x8a\x79\x96\x39\x7d\x88\x27\xcb\x71\xf\xf3\xfc\x25\x40\x3a\xd8\x85\x2c\x6b\xd4\x2d\x34\x54\xec\x8c\xe0\x1b\xb8\x8b\x3f\xf2\xac\xff\x7c\xa0\xee\xbc\x22\x44\xce\xc5\x9\xdb\x82\x78\x90\xae\xc1\x6\xa2\x41\x4c\x1d\x3d\xf8\xfe\x2a\x56" }, + { 0x53c368, "\x8b\x9c\xe5\x1a\x2d\x5a\xf5\xa6\x77\x3\xd4\xb4\x99\x84\x32\x53\xcd\xca\x43\xb5\xe2\xcb\x1e\x8c\xc7\x81\x89\x49\xb3\xf7\x71\xbb\x4e\xe8\x7d\xaa\x2e\xd0\x7f\x3e\xf1\xe9\x60\xbf\x87\xe6\x6c\x6d\xff\x47\x10\xc5\xc9\x3a\x5e\x30\x3b\x0\x4a\x18\x63\x11\x8e\x92\xab\xf9\x8a\x9f\x9e\x1d\x45\x62\xf8\x83\xce\x5d\xcf\x78\xdd\x93\x8f\xc2\x76\x2b\xd3\x54\xd\x4d\x44\x31\xa\x42\x91\x23\xfd\x36\x48\x79\x2a\x4f\x2c\x80\x7c\x7\xb9\xb0\x68\x52\x33\x70\xe1\x6a\x9\xbe\xad\xf0\xb8\x37\x5c\x41\x95\x59\x72\xa5\x67\xf6\xa2\x13\x82\xfb\x19\x34\x66\x3f\x5b\xac\x5f\x9d\xeb\xd8\xb7\x21\x1c\x3c\x75\x4c\xd1\x7e\x74\x40\xb6\x22\x98\x69\xee\xea\xa4\x7a\xe4\x6e\x58\xc0\x12\x1b\xe\x14\xae\xde\x9a\x7b\xd7\x28\xed\x1f\x61\x55\xf\xb\x57\x17\x9b\xef\xe7\x97\xfa\xaf\x24\x4b\xd2\xa3\xd9\x85\x64\x8\x2f\x96\x50\x35\xa7\xe3\x25\xc1\x46\x8d\xcc\x73\xe0\x56\x15\x90\xa8\xbd\x5\x4\x20\xc4\xf3\x39\x16\x6\x38\x65\xf2\xdb\x86\x6f\x27\x1\xf4\x6b\xb1\xbc\xdc\xba\xc6\x26\x3d\xdf\xa1\x29\x51\x2\xa0\xc8\xda\xa9\xec\x94\xc3\xc\x88\xd6\xb2\xd5\xfe\xfc" }, + { 0x53c7b0, "\x5f\xb6\xef\xa1\xfb\xd0\xa3\xb\xc9\x67\x54\xdd\x92\x4\xa5\xe0\x99\xa7\x62\x53\x87\x3c\xf6\xcc\x12\x45\xd5\xa6\x7b\xb4\x8e\x6f\x3e\x6e\xe3\x41\x44\x61\x8b\x5e\x2a\xb9\x2b\xdc\x46\x7c\x4b\xf0\x50\x4d\x9b\xad\xc3\xa8\x7d\x81\x8f\x2e\x1d\x79\xf3\xfe\x29\x8a\x3f\x22\x35\x4c\xa2\xf1\x90\x58\x9a\x70\xac\x88\xc4\xbb\x43\xb5\xbd\xaf\x24\x2c\x1c\xb0\xe9\xbc\x3\x3d\x18\xc5\x7\xd8\x9f\x97\xdf\xd9\xc6\x68\x5c\x15\x2\xda\xa9\xc2\xaa\x6\x55\xc7\x76\xf4\x2d\x7a\x32\x85\x86\xee\x19\x95\x4a\xec\x94\x80\x89\xbe\x9c\xcd\x56\x38\x10\xd3\x8\xdb\xb1\x6d\x6a\x2f\xf5\x33\x52\xcf\xab\xe6\x1f\xa4\x73\xf9\xf\xc8\xc0\xe8\x93\x13\xd\x84\xf7\x9d\xba\x64\x83\xb3\xae\x71\x37\x1e\x8c\x25\x0\xf2\x21\x9\xea\xd1\x1a\x7f\x42\xe1\x16\x48\x6c\xc1\x1b\xf8\xd6\x20\x27\x74\xb8\x49\x60\xcb\x6b\xa\x3b\x72\x75\x9e\x47\xeb\x4f\x91\x31\xe4\x63\xd2\xe7\xfc\xde\xb2\x28\x4e\xce\x57\xc\xb7\x98\xed\x36\x7e\x5a\x34\x40\x51\x23\x30\x59\x77\xfa\x5d\x1\x96\x39\x8d\xff\x17\x11\x66\x5\xfd\xd7\x14\xe5\xa0\xbf\x69\xe2\x82\x26\x65\x5b\xd4\x3a\x78\xca\xe" }, + { 0x53c8b8, "\x69\x23\xad\xbe\xc\x4e\x2f\x48\x7e\xe3\x30\xaa\x9d\x42\xc3\xc1\x6e\x13\x64\xff\x3d\xd9\xdf\xb3\x4b\x98\xfc\xeb\x92\x83\x95\x50\xaf\xc9\x7b\xf\xc7\x8d\x53\xa8\xbb\xb5\xd8\x2e\x9f\x3\x81\xe8\x2d\xed\x74\x6c\x97\xe9\xb\xbd\x1d\x15\x4\xa0\x5a\x16\xbf\x3f\x7c\x35\x6\xcf\x7a\xae\x44\x8b\xf4\xf7\x5e\x1e\xef\x27\x8f\x29\x55\xf2\x4f\xd\xea\xc4\x5\x88\x18\x94\x34\x8\xb4\x62\xd7\x26\x56\xfb\xf8\x37\x33\xce\x1c\xd0\x47\xd5\xe0\x71\x41\xd6\x87\xee\x72\xf1\x70\xe5\x75\x7f\x21\x54\xca\x80\xb2\x11\x7d\xbc\xdc\x7\xe\x91\x38\x96\xa1\xb6\x3a\xfd\x2\x6f\xa6\x3e\x10\x60\x9c\x63\x77\x59\xec\xa\x86\xf5\x28\xfa\xe7\xe1\xb7\x76\x36\x1a\x1f\xa5\x9a\x45\x39\xdb\x5d\xd2\x5f\x2b\xf9\xfe\xde\x31\xab\x52\xd1\xa4\x3b\x4a\xb0\x0\xb9\x9b\x9e\x43\xc0\x12\x89\xa9\xa3\x20\x65\x14\x1\x46\x2c\xcc\x17\x8a\x68\xe2\x19\x4c\xd3\x32\x5b\xdd\x66\x73\xcb\x85\x1b\xc6\x67\x6a\xd4\xc2\x8e\x61\xda\xf3\x57\x79\xa7\xb8\x8c\x9\x40\x5c\x6d\xb1\xa2\x22\xc8\xf0\x25\x49\x58\x24\x6b\xe4\xcd\xba\x93\x2a\x99\xc5\x4d\xe6\xf6\x84\x3c\xac\x90\x82\x51\x78" }, + { 0x53c9e8, "\x1\x69\x88\x4f\xf0\x48\xe7\xbd\xc3\xba\x8\x63\x75\x6d\x3a\x4b\xd7\x86\x59\x47\xb\xde\xa\xf1\xbe\x58\xe1\x5d\x91\xab\x9\xee\xad\x5e\x28\xca\x6\xa9\x4\xe9\x8e\xc5\x6f\xd0\xfe\xdf\x12\xc1\x7e\x4c\x2b\xcb\xb1\x96\x7a\x90\xf8\xc2\xa4\xe6\x73\xa2\xdd\x1c\xaa\xe4\x30\x3f\xcc\xc4\x35\x66\xb3\x1d\xdb\xa0\x7\x36\xa3\x54\xb9\x43\x94\xc\x8b\x98\x72\x44\xbc\xf5\xcd\x2d\x2\x5b\xed\x1f\x29\xf7\x0\x7f\x53\xda\x85\x2f\xc0\x89\x33\xa5\x9f\x9a\x8d\x64\x68\xd2\x9e\xaf\x40\xeb\xec\xfa\x26\x41\x9d\xd4\xa1\x10\x8c\x37\xbf\x4a\x81\xac\x45\xd6\xa7\xe3\x9c\x8f\x21\xf2\xff\x42\xea\x87\x32\x1a\x2e\xcf\xbb\x3e\x15\x22\x65\x7b\x61\x3d\x83\xa6\x78\x6a\xd8\xf\x2c\x31\x62\x97\x5c\x14\x27\x49\x46\xf4\xd1\xf3\x93\xb6\x60\x95\x3b\x99\xc6\x70\xfb\x67\x24\x6c\x9b\x25\xc9\xe5\xb4\x4d\xd5\x76\x71\x2a\x1b\xdc\xfc\x8a\xae\xe2\xef\xe0\x17\x13\x5f\x57\xb5\x79\x50\x6b\x56\x7c\x52\x11\x3\xd\x23\x7d\xa8\xd9\xe\x6e\x3c\x16\x38\x92\xce\x51\x34\xc7\x55\x18\xb7\xe8\x74\x82\xb2\xd3\x19\x20\x77\x5\xb8\xc8\xfd\xf9\x80\xf6\x1e\x4e\x84\x5a\x39\xb0" }, + { 0x53cae8, "\xa4\x6d\xc3\xfc\x24\xa5\xb7\x3f\x26\xc0\x2d\xe3\x49\x71\xe0\x36\xaa\x39\x6a\xb4\x21\x67\x9a\xfa\x23\xe5\xec\x12\x25\xd\x72\x87\x27\x7a\x5d\x60\x6f\x57\x78\x94\x44\x56\xde\xc9\x95\x97\x2f\x77\x9d\x53\x89\xfe\xff\x8b\x46\x2c\xcb\x61\x8\xdf\x79\xb6\x20\xc\x15\x3d\x4a\x2e\xb2\x7\x73\x3e\xcf\x6\x88\xf4\x37\x32\x19\x3a\xf6\xe9\x75\xac\xeb\x30\xf9\xbb\xa7\x84\x63\x5f\xa8\x1a\x91\xc8\x9c\x7f\xd6\xd5\xed\x3c\x98\xd8\xbc\xb1\xf\xfd\x9\x3\x99\x6b\x16\x8e\x59\x4e\x1f\x66\x82\x2\x8d\x96\x4b\x22\xc5\xa3\x50\x74\xdd\x2b\x5e\xa1\xda\xcd\x5b\x58\x9e\x28\x1d\xe8\x62\x47\xf1\x33\x35\xaf\x34\xef\x5a\xa2\xbd\xe\x81\x4\x5\xee\x7c\x51\x4f\xbe\xc4\x42\xb\xca\xd3\x70\x9f\xba\xd4\x8c\x10\xfb\x90\x14\x13\x1b\x3b\x11\xc1\xad\xb9\x64\x48\xd0\x31\x4d\x8a\xd2\x86\x38\x0\x92\xdb\xf5\x5c\x9b\xea\x17\xf8\x68\x83\x18\x4c\x52\x1e\x2a\xe6\xa\x69\xab\x6c\x6e\xf7\xd9\xc7\x41\xf3\xc2\xa6\x1c\x7d\xb3\xd7\xdc\xd1\x93\xe2\xce\x85\xbf\xb8\xe1\x76\x40\x54\xcc\x7b\x8f\xa9\x7e\xe4\xae\x55\x1\x80\xf0\x43\xc6\xb5\xf2\x65\x29\xb0\xa0\x45\xe7" }, + { 0x53cd28, "\xed\x8e\xda\x43\x63\x70\xc8\x69\xee\x7\x3b\xd6\xe9\x1c\x17\xc\x38\x97\xa3\xe1\xe\x6\x40\x96\x0\x7c\xbb\x39\x9\x2b\xd7\x78\x19\x59\x4\x44\xb9\xa7\x13\x68\x16\xcd\x8d\xa8\xc2\x54\xb5\x30\xac\x72\x5b\x12\x1b\x6b\x89\x6f\x99\xc6\xd3\x51\x76\x87\x91\x60\x27\xa0\x4d\x4f\x47\xf3\xd\xcc\x98\xaf\xf8\x6e\x9d\x9f\x7b\xfc\x36\x5e\x9c\xb8\xf5\x8b\xdf\x7f\xfa\xe4\x75\xcb\x9b\xf0\x77\x3\x41\x62\xb3\x11\x32\xa5\x2d\xa2\x6c\x3d\x86\xdb\x80\xba\x2a\x83\x90\xf2\x22\x24\xc5\xff\x5f\xb0\x15\x31\xbd\x1e\xcf\x57\x4e\xc7\xae\xf4\xe3\xb4\x4b\xce\x35\x3c\xb2\xa\x95\xfe\xa1\x5\xf9\xd1\x8a\xf6\xdd\x74\xa6\x2\x1\xe2\x52\xa4\x10\xb7\x93\xf7\xc4\x18\x28\xd4\x84\xa9\x9a\xc0\xe8\x8f\x53\x2f\x7a\x5c\x58\x26\x79\x42\x4a\x25\xad\x33\x67\xbe\x7d\x34\x1a\x46\x29\xde\x20\xd5\x3f\x1d\xd8\x3e\xe0\xb\xc1\x71\x14\x1f\x73\x6a\xfb\x61\x55\xab\x50\x85\xbc\xb6\x7e\x9e\xd9\xeb\x5d\xd0\xd2\x21\x64\xf1\xbf\xdc\x56\x45\x94\x65\x4c\xe5\x3a\xb1\x6d\xe6\x49\x8\x23\x88\xaa\xfd\xc9\x5a\x81\x37\x2e\xf\xef\x2c\xca\x92\xe7\x48\x82\x8c\xc3\xec\x66\xea" }, + { 0x547230, "\x31\x69\xdc\xcc\x61\xe2\xd4\xad\x9a\x51\xe5\xfa\x53\x6d\xfe\x6\x89\x79\x46\x99\x24\x7c\xa0\x18\x56\x27\x7f\x2e\x2a\x77\x0\xd8\xcd\xb6\x1e\x4b\x4e\xfc\x4\x23\xa4\x75\x8\x44\x19\x80\x7\xf3\x16\x5c\x9\x93\xb9\xdb\x92\x10\x30\xd0\x43\xd7\x85\xfb\xdd\xe\x49\x39\xca\x2\x64\x8a\x35\xa6\xee\x13\xe0\x91\x9b\xce\xc2\x12\x82\xab\x4d\x74\x22\xd\x70\xb2\x90\x98\x3\xec\xc7\xcb\x9c\x71\xba\xac\x50\x21\xf8\xc0\xda\x67\xa\x72\xfd\x2d\xc\xf6\xa7\x52\x65\xaf\xc3\xa3\xa1\xea\x5a\xd5\x17\xbe\x7e\xcf\x94\xb0\x34\xd1\x1b\x6e\xf0\x54\xf2\xe8\x76\xbc\xe4\x3f\xf4\x73\xe9\xae\x7b\x6c\x3a\xbb\x8f\xe7\x4a\xb1\xb\x7a\x68\x86\x11\x2f\xf1\x8d\x81\x47\x42\x2c\x7d\x8c\x95\x55\xf7\xc5\x84\x1d\x59\x41\xd6\xbf\x8b\x33\x9f\xe6\x38\x45\x87\x1\xc4\x1a\x78\x40\x3c\xbd\xe1\xb7\x1f\x26\x6a\x6b\xa8\x96\xf5\xa9\x60\x37\xed\xa2\x15\x58\x3d\x8e\x48\x3b\x9d\xb4\x5b\x29\x62\x4c\xc6\x83\x66\xb3\xb8\xde\x1c\x2b\x5e\x63\x57\xd2\x5f\x25\x36\x20\x28\xb5\xc1\x5d\xc9\xf9\x9e\xf\x88\xa5\x5\xef\xdf\x97\x4f\x14\xc8\xd3\xff\xd9\xeb\xe3\x32\xaa\x3e\x6f" }, + { 0x53ceb0, "\xbc\xb2\x5e\x24\x9d\xc6\x26\xc5\x91\x6c\x87\xb3\x70\x47\x6f\x5f\x1\xad\x7f\xa5\xea\x4\x7c\x31\x39\xdb\x15\x9e\xdd\x64\xb8\xf4\x9a\xd0\xe0\xf\xf0\xcd\xef\xd4\x23\xc0\x14\xcf\x79\x5b\xba\x48\x2f\x18\xc\x95\x55\x43\xab\x67\x99\xa3\xbd\xd9\x90\xec\xbf\x21\xff\xd2\xb6\x96\xf1\x5d\x6a\xe3\xd5\x4f\x7d\x8f\x46\xb1\x7e\x12\xb4\x6e\x97\x37\xa\x36\x94\xc8\x1f\x51\x8d\x60\x78\xaf\xfa\x9c\x2a\x40\x7b\x1d\xbb\xe9\x75\xe8\x5a\x3a\x11\xf5\x7\xed\x5\xc7\x9b\xf7\xb5\xb0\x1c\xd1\x4a\x83\xc4\x81\x7a\x92\xf2\x3b\x4e\xb9\x2\xde\xaa\xe\x1a\xcb\x5c\x44\xe1\xd6\x98\xa2\x4c\xee\xd7\x45\x9\x32\x20\x3e\x3d\xa7\x57\x58\x0\x73\xa6\x10\xfb\x6\x4b\xce\x74\x35\xfc\xae\x77\x89\xfe\x19\x53\xfd\x82\xc2\x85\x30\x50\x84\x8\xc3\x28\xf9\x22\x80\x65\x62\x13\xe4\xca\x34\x3f\xdc\x4d\xf3\x8a\x86\x8b\x69\xf8\xda\xa4\xc9\x61\xe7\x38\x6b\x54\x2b\x49\x29\xa0\xc1\x71\xd8\x2e\xa1\x1b\xd\xcc\x8e\x8c\xa8\x2d\x27\x42\x56\x16\x41\xf6\x72\xa9\xb\xe2\x68\x25\x63\x93\x1e\xb7\x9f\x59\xd3\xac\xe5\xdf\x2c\xe6\x88\x76\xeb\x3c\x52\x33\x17\x66\xbe\x3\x6d" }, + { 0x53d168, "\x3\x21\xa0\xee\x97\xa8\x35\x87\x9f\x6e\x88\xf0\xc1\x1a\x19\xbd\xd2\x17\x78\xb9\xd6\x29\xf4\x28\x40\xe6\x8d\x1c\x2f\xf6\x56\x14\xdd\xa5\x57\x48\x9a\xce\xb4\xff\x5a\x5\x3a\x9d\x7e\x6d\x96\x6c\x55\x3b\x38\x4b\x51\x1f\x60\x8\x1d\x70\x22\xae\xd3\x8f\x99\xc3\x83\xe0\xde\xea\x6\xf9\x9b\x5c\x52\x2a\x72\xb7\xc9\xdb\xfa\xd7\xdf\x68\xbc\xb6\x59\x98\x74\xb2\x27\x9\xf\x44\x6f\x91\x7d\xcc\x12\x4e\x2d\x42\x7a\xf7\x9c\x7c\xe4\xf8\x94\xad\x23\xef\x8a\xaf\xb8\xe2\x80\xb5\x86\x54\x47\x4a\x2\x3c\x5f\xf3\xec\x4d\xe7\x8b\xbf\xb0\x26\xc5\x67\x24\x3e\xca\xbb\xd8\x1b\x63\xc6\x82\x75\x69\x5e\xdc\x45\xac\x71\x30\x76\xa\x81\xda\x33\x32\xd5\xbe\xd\xfc\xf2\x3d\xa4\xf1\x73\xed\x43\xd4\xe5\x2e\xe9\xd0\xcb\x41\x37\x5d\x34\xd9\x77\x7b\x7f\xa3\x39\x6a\x61\x16\xcf\x1\x7\xfd\x58\x13\xa2\x20\xc7\xc2\x66\x2c\x50\xd1\x65\x79\xc8\xb1\x64\xb3\x90\x0\x5b\x11\x31\xe\x25\x6b\x89\xe1\x8c\x53\x10\xaa\xc\x4\x4f\xa1\xa7\xc4\x85\x92\x36\x46\x1e\x3f\xfb\x84\xe8\xc0\x8e\xa6\xa9\xcd\xf5\xba\xab\x62\x15\x18\x9e\xb\x4c\x2b\x49\xeb\x93\x95\xe3\xfe" }, + { 0x53d2d0, "\x43\x2f\x53\xa0\xc2\xfd\xcc\x6\x29\x3e\x1f\x44\xab\x65\x74\x54\x49\x27\xb7\xe2\x2c\x5a\x33\x34\x1e\x16\xa7\xae\xa\x92\x55\x20\xad\x98\xf8\xa9\xe\x8b\x32\xdf\xa5\x15\xfc\x9f\x23\x3c\xc4\xc0\x4c\xbe\x89\x9a\xf0\xe4\x73\x59\x30\x9e\x82\x58\x51\x8f\xbf\xa1\xc7\xeb\xf1\x64\x1b\x4b\xc8\xc3\x38\x31\xd2\xfe\x3d\xd0\x77\xcb\xd6\x24\xf7\xc\xe5\xff\xd8\x4d\xac\x10\xe6\x76\xbb\xf\x9c\x6c\x2e\xb\x75\x78\x5d\xa3\xaf\x17\x5e\xb0\xe1\xb1\x9b\xf9\x7\x39\x6d\x7b\x1c\x2a\x9\x3f\x12\x4\xc9\xc1\xc5\x19\x61\x5\xb4\x47\x37\x5f\xd5\x94\x28\x21\x88\x97\xfa\xd3\xcf\x7f\xdd\xd4\xf3\x68\xf4\x81\x62\x84\x91\x83\x8c\x7e\x67\x63\x66\xed\xe7\xe9\x85\x6f\xdb\xaa\x87\xec\xde\x90\xba\x25\xa2\xd\x6b\x5b\x7a\x96\x70\xe0\x86\xa8\xe8\x6a\x4e\x42\x57\x2b\xb6\x40\xce\x69\x46\xb5\x72\x80\xcd\x13\xf6\xf2\x0\xda\x93\x22\x60\x3b\x7c\xb2\x48\xef\x3\xb9\x71\x4f\xc6\x45\x36\x26\xfb\xf5\xca\x2\x6e\xd9\x8d\x95\x14\x2d\x8a\xd7\xdc\x52\xee\x99\xa4\xbc\xb8\x8e\x1a\x3a\x1d\x4a\x7d\x1\xe3\x56\xa6\x50\x35\x18\x8\x79\x5c\xbd\x41\xb3\xea\x9d\x11\xd1" }, + { 0x53d3d0, "\xf1\xbb\x4b\x7e\xc1\x8a\x41\x12\x97\x5e\x57\x56\x9f\x2c\x5f\xb6\x47\xff\xb1\x4c\x8b\x9c\x63\xc4\xa7\x98\xb2\x31\x84\xb4\xd\x1d\xe0\x67\xfd\x2\x13\x10\xdb\x8\x83\x48\xc6\x86\xaa\xe5\x80\x9\x38\xfc\xe2\x85\xc7\x8d\xa9\x3b\x18\xa5\xb7\x32\x9b\x6a\x2e\x87\xc0\x24\xa0\xfa\x6b\x76\xa2\xe6\x7f\x5d\x7b\x40\x33\xfb\x62\xf6\x43\xd1\x6d\xa1\x29\xd5\x17\x50\xf9\x1c\xeb\xf2\x22\xc2\x51\xe4\x26\xca\x5b\xf\xf8\x96\x4e\xba\xf3\x55\xa4\x37\x36\x82\x70\x99\x20\xc9\xf5\x7c\xa8\x92\x6\x72\xe7\xb5\x9d\x44\xd2\xbf\x64\x16\x49\x3\x4a\xe3\x68\xd0\x1a\x34\x95\x7d\xcb\xbc\xd3\x78\xd7\x5a\xb0\xb9\x2f\x27\x77\xf7\x45\x25\x52\x1b\x3c\x3d\x9e\x2b\x74\x89\xa\x1f\xfe\xf0\x2a\xe1\x1\x3a\x9a\x39\x8e\x79\x71\xd8\xcc\x46\xe8\x69\x3e\xaf\x7a\x21\xad\xea\x75\x93\x15\x30\xf4\xe9\xdd\xe\x60\x28\x6e\x88\xae\x81\x4\x59\xc5\x90\xee\x61\xcf\x8f\xb8\xb3\x54\xed\x58\x6c\x91\x3f\x65\x6f\xd6\xbe\x4d\xef\xde\xa6\x8c\xc\xc3\x23\x35\x5c\xac\xd4\xda\x5\xc8\x14\x94\xd9\x19\xcd\x4f\x2d\x0\xdf\xbd\x7\x42\xab\xdc\x73\xa3\xb\x66\x53\x1e\xce\x11\xec" }, + { 0x53d798, "\xcc\xbb\x69\x91\x5\x73\xbe\x41\xf4\x59\x24\xa5\xf6\x28\xc7\x7a\xc1\xd5\xd\x62\x40\xb1\x32\x16\x6d\x77\xdb\xee\x65\x95\xd7\x35\x2f\x64\x30\x7\xfa\x5a\xe3\x88\x93\x6a\xeb\x31\xde\xd4\xcb\x4f\x92\xc8\x11\xfb\xd0\x4e\x3a\xdc\x7e\x15\xf1\xb4\x61\x58\xad\x9e\xfe\xb9\x6\x4a\x0\x6f\x3\x7f\x8a\x20\x3d\x22\x78\xe1\xe9\xe6\x14\xbc\x75\xe4\xf8\x19\x5b\xc4\xb3\x7d\x76\x2d\x3c\x9d\x9b\xac\x8e\xb2\x3b\xb5\xa7\x47\x9f\xc3\x36\xdf\xf9\x90\x80\x43\xf5\xa4\xe\x4d\x33\xe0\xc\xdd\xb8\x2\x7c\x8b\xf0\x45\x46\xa9\x8c\xcf\x9a\xca\xce\x84\x83\x71\x48\x39\xba\xfc\x2a\xe2\x57\xc5\x98\x97\x60\xc6\xae\xc0\xd8\x37\x81\xaa\xb6\x2b\xea\x26\x21\x4b\x55\xe5\xd2\x85\xab\xb7\x34\xbf\xd9\x70\xcd\x53\x96\xc2\xef\x63\x13\x1e\xed\x12\xc9\x74\x42\x5e\x3e\x54\x9\xd3\x89\x6e\x72\x49\x2e\xd6\x1a\x9c\xa\xa8\x6c\xbd\x10\x86\x4\x38\x50\xf2\xb\x1f\x87\x2c\x29\x17\xfd\x52\x66\x67\xf\x8d\x1\xb0\x18\xda\xe8\x1d\x94\xa3\x25\x79\x3f\x8f\x51\xa2\x23\xf3\xaf\x68\x5d\xa1\xf7\x99\x1b\xff\xec\x56\x44\x8\xa6\x6b\xe7\x5c\xd1\x1c\xa0\x5f\x7b\x4c\x82\x27" }, + { 0x53d970, "\xb9\xd7\x6b\x9c\x5b\xfb\xc0\x9b\xf\x49\x55\xa9\x6d\xa5\x17\xd0\xc3\xdc\x4b\xb8\xf2\xb0\x93\xee\x3c\xeb\xdf\x8d\xe1\xf6\x2f\xe2\xc4\x32\x4c\x35\x62\xb4\x92\x91\x1c\x6f\xb6\x30\xe3\x5a\xb2\x2\x5e\x64\x21\xd5\x0\xcd\xd2\xb7\xd\x81\xef\x14\xb1\x87\xf0\x8f\x20\x39\xfc\x16\x63\x38\x1a\x7a\x56\xe4\xf3\x6e\xf4\xcb\x27\x57\x34\x2b\x12\x86\x79\x3f\x7\x6\x5d\xe\xbd\x7b\x54\x8e\xf1\xc8\x51\xf5\xbf\xd8\x5\x26\x47\x67\xda\x53\x95\x98\xea\xed\x5f\x74\x41\x3a\xc\x8c\xa6\x94\x59\xb3\x8b\x46\x6c\x7c\xbe\x9e\x7d\x83\x36\x88\x31\x7e\x18\xdb\x5c\x19\xe6\xe0\x58\x9d\x72\x13\x77\xdd\xc2\xac\x75\x96\x8\x73\xd4\xa\x2c\x22\xe5\x2d\xf8\x71\xaf\x45\x2e\xc6\x76\x3d\x65\xf9\x29\x4f\x80\xd1\xd3\xe9\x69\x9a\xab\x90\x1b\x1\x1e\xc7\x15\x24\xec\xcc\xe8\xad\x3b\x10\x4d\xcf\x85\xa1\xa7\x89\x25\x11\xd9\xc1\x1d\xae\x9\xde\x6a\x44\x4a\x3e\xbb\x48\xca\xe7\x70\x4\x9f\xa8\x68\x43\xb\x8a\x52\x42\x50\xba\xfa\xce\xd6\x33\x61\x60\xa0\xa3\xf7\x3\x1f\x84\xfd\xbc\x40\x7f\x66\xaa\xc5\xb5\xa4\x37\xfe\x97\x28\xff\x78\x23\x82\xc9\x2a\x4e\x99\xa2" }, + { 0x53da70, "\x46\x47\x9d\xa8\xcf\xa7\x62\xc7\x30\x42\x69\x3a\x34\x5a\xbe\xd5\x59\x63\x33\x21\x2c\xa0\x6\x1e\x31\xa6\x92\x3f\xc8\x57\x5e\xbf\xa9\x90\x19\xb0\x29\x7\x12\x1f\x23\x97\xe3\xa4\xdd\xb8\x3c\xb2\x5c\xce\xda\xd0\x52\x8\x64\xc3\xc0\x9a\xca\xea\x43\x6b\x41\x1c\x8c\x7a\x7b\xd1\x94\x5\xc\x93\x15\x51\xd9\xd4\x3e\x4c\x2f\x49\x4\xd2\xee\x73\x0\xa2\x8d\x6d\x55\x2\x3\xfe\xb\xc2\x1a\xe2\xf1\x83\x80\x36\x78\xf5\x96\x40\x75\xe\x9c\x7d\xad\x32\x5f\x2b\xc9\xbb\xf4\x7c\x66\xb7\x54\x8a\x89\xff\x50\xdc\x60\x25\xb3\x6a\xfb\xe4\x4d\xab\xb9\x74\xc5\xbc\xb6\xe8\xc6\xfd\x7f\x4a\x76\x3b\x9f\x45\x18\x4f\x9e\x95\x13\xb5\x10\xf8\x22\x5d\x1d\xdb\xbd\xb4\x6f\x84\xba\x17\xd\x6c\xaa\x44\xae\xf6\xde\x81\x11\x79\x85\x86\x39\x99\x82\x38\x6e\xa3\x26\x68\xeb\xc1\x27\xed\xcb\x2e\xdf\xf7\xef\xfa\xb1\x9\xd7\xd8\x8b\xac\x37\x4e\xe7\xf0\xe1\xd6\xa\xd3\xec\x61\x72\x5b\x28\xa1\x87\x70\xf3\x71\x98\x8e\x20\x53\x16\x3d\xa5\xf2\xf9\x4b\x9b\x91\x88\x2a\x65\xf\xfc\x67\xe6\x58\x2d\x14\x56\x48\x1\x7e\x35\xaf\xc4\xe9\x8f\xe0\x1b\xcc\x24\xe5\xcd\x77" }, + { 0x53dbd0, "\x77\x1f\x49\xca\xc3\x17\x39\x14\x66\xde\xc5\xd9\x2f\xf\x6e\xd3\x7d\x21\x60\xec\x9a\x4b\x25\xc2\x71\xfc\xb\x81\x8e\xbf\x36\x99\xf7\x6b\x7e\x86\x10\xdc\xa7\xb0\x8b\xb9\x72\x20\xf4\x5e\x31\x74\x6c\x4f\x80\x4\xb1\xc9\xb7\xd0\xab\x7b\xd\xf6\x1d\xbc\x38\x78\xaa\x43\x3f\xf0\x82\xcf\xcb\x96\xf5\xeb\xce\xb5\x12\x29\xc0\x62\x63\x9\xf1\x2\xc1\x44\x32\x2c\xe8\x4e\xe6\x57\x7a\x83\x95\xb8\xfb\x37\xd7\x2a\x3\x5d\xef\xc7\x11\xd6\xa2\xb2\x5c\x85\xa3\x5a\x19\xfe\x8a\xad\xd2\xbd\x28\x9b\x34\x6f\x3c\x67\xe1\xc\x24\x68\x97\xb4\xda\xe3\x98\x7c\x2b\xd5\xee\xe4\xcc\x47\xcd\xb3\xe7\xfd\x61\x42\x3d\x4d\x9c\x5\x9e\x4a\xdd\xa9\xdf\x6d\x45\x6a\xd8\xfa\x16\xae\x58\x1b\x76\xf9\xa0\xe5\xb6\x1a\x59\xa5\xba\x9f\x65\xbb\xa4\xe\xd1\xd4\x51\x41\x40\xc8\xe2\xdb\xaf\x94\x64\x7f\x22\x3b\xf2\x2d\xc4\x70\x2e\x5b\x69\xc6\x56\x33\x7\xa\x15\xea\x91\x53\x1\xf8\x84\xe0\x30\x90\x75\x87\x5f\x54\x6\x46\xe9\x35\x92\x50\x79\x88\x1e\x8d\x3e\x8f\x73\x0\x18\x89\x93\x9d\x8c\x27\x1c\xa6\xbe\x23\xf3\xed\x55\x52\xa8\x26\xff\x8\x13\xac\x4c\x48\x3a\xa1" }, + { 0x53dd70, "\x97\xd5\x40\x91\xed\xf1\xce\xf3\xc2\x6e\x94\x19\x5f\x5b\x7d\x9b\xc\x29\x5d\xda\x71\x7c\xab\x9d\xb4\x9e\x2d\x48\x2\xa8\x0\xbe\x7b\x86\xf\x38\x56\xee\xd3\x34\xa6\xbf\x7f\x1b\x8d\x53\xe8\xdb\x61\xa4\xe2\xe1\x2e\x78\x3d\xb6\x80\xd8\xe\xfa\x6d\xd1\xe7\x6\x4e\x14\x77\x54\xae\x5\xd4\xbc\x6a\x74\x3b\x1c\x8a\xc0\xb7\x45\x92\x26\x11\xd0\x99\x57\xaf\xb3\x95\x84\xfd\xc4\xa3\x22\xa7\x39\xbd\x41\x1e\x4f\x3e\x1a\x2b\x15\xba\x64\x1\x23\xa9\x37\x58\xd\x67\x76\x2c\x8e\xca\xc8\xdc\x65\x98\x90\xea\xad\x6f\xcc\xe5\x32\xbb\x28\x70\xf5\xa5\x12\xb9\xc6\x75\xf0\x3c\x4c\x6c\x85\x73\x88\xe6\x7\x72\x69\x82\x8b\x2f\xb2\xde\x10\x6b\xdd\xff\xb1\x43\xd6\x50\xcf\xd7\xb8\x4\x68\xe0\x93\x18\x79\xa\x9\xc5\xaa\x83\x7e\x16\xf4\xc3\xcb\x96\x87\xc7\xb\x49\x3a\x62\x3f\xb5\x31\x24\xa0\x8f\xf7\x13\x30\xe9\x51\x59\xa2\x4d\x47\x4a\xe3\x8c\x55\x81\xa1\x5c\x1d\xfc\x2a\xfe\xeb\xcd\xdf\x60\x25\x89\xef\x33\x7a\x20\x66\x27\xc1\xb0\x3\xf2\x9f\xf8\x1f\x9a\x5a\x9c\x5e\xf6\x35\x21\x52\xd9\x44\xe4\x4b\xc9\xec\xd2\x63\xf9\x36\x8\xac\x42\xfb\x17\x46" }, + { 0x53e0d0, "\xed\xb6\x90\x15\xcd\x25\x37\x67\xfc\xf3\xd9\x12\xb8\x36\x3\x5d\xe5\x44\x43\x20\x93\x47\xfb\x9b\xca\x3b\xd0\x9c\xbf\x34\x42\x3a\x68\x73\x76\x3c\xc1\x8e\xb1\x51\x31\x98\x19\x1b\xb\xfe\xeb\x3d\xe6\x82\xea\x2\x9f\x9e\xf2\x46\x87\xfd\xb2\x83\x1f\x9\x8b\x4f\x5e\xa8\x16\xd7\xad\x71\xd2\x64\x24\x66\xe4\x48\xa\x79\x4\x84\x49\x52\xda\x8\x58\x8d\xec\x0\x7b\xe1\x2b\xd3\xc7\x96\x38\x32\x74\x2f\x60\x7a\x7d\xac\x85\x99\xa5\xbb\xc0\xf4\x10\xd4\x61\x6f\xba\x26\xc5\x3f\x8c\xb0\xf7\xee\xe8\xb3\x11\xa6\x2d\x54\x30\x1d\x2e\xe0\x1e\x6b\xc\xce\xcb\x6c\x65\x39\x4e\x5f\xdd\xef\x41\xc9\xf8\xe7\xf6\x92\xd8\x4a\xdc\x53\x40\xbd\xa4\xb5\x22\x9a\xe\x5b\xb7\xde\x5c\x8f\x29\xaf\x8a\x56\xb9\x95\x94\x5\x27\x35\x5a\x78\x18\xae\xd5\xb4\x3e\xa9\x6e\xaa\xc4\x6\x80\xc8\xf5\x6d\x55\x33\x72\xa0\x1c\x89\xa1\xa7\x2a\x97\x4b\xcf\x4d\x6a\xf9\x9d\x28\xf\x14\xa2\xff\x7e\xd6\x81\x91\x7f\x23\xd\x57\x62\x4c\x17\xc2\xc6\xf0\x77\xf1\xa3\x21\x88\x7\xab\x69\x63\xe2\xd1\x50\xcc\xe9\xdb\xc3\x86\xbc\x59\xe3\xbe\xfa\x75\x1\x45\x13\x70\xdf\x1a\x7c\x2c" }, + { 0x540278, "\x6c\x9f\x49\x77\xa9\x27\x95\x66\xde\xf\x58\x2f\x4c\x1c\x4b\x73\x22\xcc\xfb\x1a\x85\xf6\x9c\x8b\xc5\xdd\xb0\x15\x46\x37\x79\x2\xab\x3d\x44\x8a\x10\x87\x9e\xfc\xba\xb9\x2b\xa\xf4\xd9\xbf\x78\xf1\xef\x11\xdc\x80\xd2\xd5\xf7\x5c\xbe\xe2\xd4\x9d\xd3\x13\x1\xe1\x18\x50\x53\x43\xd7\x64\xf8\xdb\xf2\x62\xcd\x99\xe7\xa2\x0\xaf\xbc\xff\x25\x91\x5f\x83\x60\xec\x42\xb6\x47\x8e\x6a\xd\x4f\x16\xe6\x51\x14\x8f\x5\xea\x70\x3a\xca\xc7\x74\xce\x5d\x98\x31\x3b\xe9\xe0\xc3\xa4\x1b\x92\xd0\xc\x40\x4d\xb5\x7f\x8\xf9\x39\xb1\x29\xc4\xd1\x21\xac\xc0\x54\x4\x55\xcb\x17\x69\xfe\xe5\x3e\x88\x1d\xe\x7c\x76\xb2\xc6\x24\x81\x9\xe4\x59\x34\x7a\x86\xf5\xad\x5e\x38\xbb\x4a\xe3\xc8\x26\x30\xbd\xfd\x33\x72\xb4\x20\x2a\x19\x6b\x97\x32\x96\x7b\xa1\xa6\xdf\x61\x71\x7\x23\xee\xc2\x75\xb7\xaa\x7e\x67\xa0\xa3\x94\xd8\xa5\x1e\x68\xda\xa7\x48\x8c\xf0\xb3\x4e\xfa\x9b\xb\x6f\x2d\x6d\x8d\xcf\x5b\xc9\xae\x9a\x3f\x6\x1f\x90\x65\x6e\xf3\x93\xa8\x45\x12\x2c\x52\x36\xeb\x82\x3c\x7d\x57\x28\x56\xed\xd6\x63\x2e\x3\x41\xc1\xb8\x5a\x89\x35\xe8\x84" }, + { 0x5406e8, "\xbb\x3b\x8c\x61\x95\x4d\x8e\x4c\xe1\xae\xff\xc4\x47\x64\xc9\xb7\xd3\xca\xb\xed\xef\xc0\xc7\x43\x1c\x66\xb9\xd9\xea\x2f\xa0\xfb\xcc\xfa\x50\xd\x55\x46\x96\x24\x21\x70\xe0\x6\x33\xf3\x0\xd5\x67\x1a\x13\xde\xa5\x7c\x74\xfe\x1f\xaa\x73\xc3\x15\x93\x9f\xd7\x2b\x14\xcb\x7b\xb8\xe4\x91\xf0\xaf\x9\x23\x4f\x5e\x6d\xe\x89\xc5\x30\x77\x68\x1\xfc\xe3\xf4\xa8\x9e\xc2\xcd\xe6\x71\x44\x2c\x3\xc1\xa9\x62\x9b\xee\xbf\x2e\x65\x12\xb2\x25\x8f\x5a\x31\xe2\xf6\x7\xd6\x48\xad\xeb\xcf\x19\xd0\xbc\x29\x92\x16\xba\x9d\x3c\x9c\x94\x3a\x80\x2\xa4\x7f\x11\x1d\x63\xe7\x6c\x40\x86\x76\xf9\x83\x54\xa3\x84\x72\x18\x4b\xf7\x7a\xf1\x4a\xd2\xfd\xec\x2d\x8a\x3d\x7e\x78\xda\x42\x3e\x27\xdd\x5c\x69\xc6\xe9\xf8\xa1\x98\x36\x35\x60\x51\x85\x88\x53\xac\x10\xd4\x4\xdc\x6a\x7d\x9a\xb0\xa6\xc\xe5\x56\x32\x6b\xa2\xe8\x57\x38\x20\xce\x5b\x8d\xf2\x81\x22\x1b\x3f\x87\xbd\xa\x17\xb5\x34\xc8\x1e\x8b\x5\x8\xb1\x75\x59\xf5\x45\x79\x49\x5f\x41\x37\x28\xd1\x39\xab\x26\xa7\xb4\xf\xdf\xb6\xdb\xb3\x4e\x2a\x58\x52\xd8\x82\x90\x5d\x99\xbe\x6f\x97\x6e" }, + { 0x5409e8, "\x2e\x94\x26\x55\x6c\xd6\xe3\x30\x16\x24\xae\xb8\x39\x13\x48\x85\x2\xa\xa8\xb9\xfb\x58\x3e\x59\x40\x37\x89\x4c\x68\xc9\x5b\xdb\xee\x83\xb\x64\x49\xf0\x52\xeb\x3f\x65\xbc\xfa\xa4\x6\x76\x27\xec\xc2\xe0\x53\x2a\x3c\x2b\xa2\x3d\x12\xde\xc7\xfc\xd7\x5\xed\xff\xc0\x9d\x14\x4a\xf7\xa3\x87\x79\x96\xa6\x7e\xd3\x1b\xf5\x90\x3\x80\x19\x4f\x77\x2f\xb1\x84\x7a\xe\x8e\xef\x62\xcd\xce\x9a\xd8\xb2\x69\xc4\xb0\xda\x23\x8\x11\xa0\x6b\x73\x4d\x9\x4e\x8c\x17\x21\x67\xbb\xd5\xcc\x20\x36\xea\x95\xe1\x5c\xe2\x7d\xe7\xc\x33\x5f\x99\xa5\xf4\x44\xdd\x25\xc1\x35\x29\x1a\x1c\x28\xb4\x9c\x34\x6f\x15\xa7\xf9\xe6\xb5\xd4\xe9\x9b\x1\x31\xf8\x72\xb3\x2d\x70\xdc\xfd\x46\x1f\x42\x8f\xcb\x54\x63\x93\x8d\x41\x5e\x9f\xe8\xf1\xe4\xb6\x71\x18\xbd\x6e\x7f\x81\x32\xd0\x74\xfe\x0\xcf\x47\xc6\xaf\x82\x38\x91\xac\xad\xc3\xb7\x6d\x1d\x8a\x98\xca\x97\x1e\x60\x7b\x88\xaa\xd2\xd1\xa1\x86\x61\xba\xc8\x10\x22\x3a\x9e\x51\x43\x92\x75\x3b\x56\xf2\x45\xa9\xbe\xd9\x78\x5d\x5a\x4\x4b\xd\x66\xf3\x7\x57\x7c\x2c\xe5\x50\xc5\xbf\xf\x6a\xf6\xdf\x8b\xab" }, + { 0x540d18, "\x7a\x2e\x7c\x16\x54\x74\xa6\xd7\x3d\x42\x25\xa\x4c\x87\xff\xbd\xc6\xcf\xaa\x78\x0\x95\x91\x68\x50\x7e\x4\xbe\xf\x83\xc7\x82\x9a\xa1\x36\xe2\x9b\x43\x62\x79\xe4\x73\x93\x56\x17\xb5\x60\xf9\xf0\xd\x2\xef\xbb\x22\x1c\xfb\x28\x94\x1e\xdc\x1d\x2a\x7\x72\xa0\x2f\x40\xed\x6c\x7b\xcc\xb4\xbc\xeb\xf4\xa3\x96\x7d\xb8\xf6\x75\x9\xc5\xf2\x70\x33\xc2\x13\xf7\xdb\x97\x1b\x6f\x3\xe3\x6\x44\xc1\xd3\x2b\x4d\xe9\xb9\xe1\x64\x20\x8d\x18\x76\x9d\xda\x67\xa7\x9c\x32\xb\x6a\x99\xf1\x41\x59\x71\x23\x14\x88\xac\x49\x37\xba\xe6\xe0\x51\x4f\xfd\x8e\xe7\xd5\xcd\xd6\xb2\x58\xa8\x55\xa2\xc3\xdf\x5e\x9e\xc9\xd2\xd8\x7f\x84\x39\xb6\xab\x63\x9f\xfa\x69\xfe\x21\xb0\x3a\x1f\x34\x5c\x4a\xbf\xe8\x52\x8a\x4e\x30\x5b\x92\x46\x4b\x8b\x5f\x8f\x90\x6e\x61\x89\x3e\xd9\x27\xaf\xee\x26\x98\xb1\xde\x19\xca\xf3\x86\x53\xa4\xd0\xad\x1a\x47\x80\x85\x45\x2d\xc8\xe\xa9\x3b\x65\xb7\x8\x24\xb3\xc\x11\x35\x15\xdd\x5\xce\x5a\xea\x2c\x6b\xec\xe5\xf8\x3c\x77\xcb\x6d\xc0\xd4\xae\x81\x57\x31\x12\x10\xfc\x3f\x1\x29\xd1\x38\x8c\x5d\xf5\xc4\xa5\x66\x48" }, + { 0x541218, "\x6e\x60\xba\x8c\x16\x67\xc7\xd9\xa1\xf9\x25\x41\x77\x6\x4b\x81\x98\xfb\x39\xe0\x7d\xa0\x10\xa4\x31\xf\xe5\x2b\x2d\xea\x68\xdf\x3d\xc8\xd5\x62\xaf\x83\xbd\xdb\x18\x88\xc4\xa9\x14\x38\x7f\x95\x5b\x51\xeb\x8e\xc\x2\xd0\x1\x6a\xcf\x92\x20\x7e\xc2\xc5\x36\xa6\xcd\x89\x64\x22\x8a\x96\xff\x49\xad\xb0\xc1\x13\x32\xa2\x99\x59\x17\xa5\x56\x29\x3b\x84\x93\x33\x5\x1c\x26\x94\xe8\x5d\xb8\x4\x5c\x4d\x46\xe9\x80\x4c\x45\x85\x9c\xb6\x11\xb1\xdd\x9b\x78\x9e\x8d\xac\xe2\x73\xbf\x82\xd2\x97\x57\x12\x63\xa8\x1a\xf2\xbc\x0\xc3\xcb\x7c\xf3\xe4\xdc\xd1\xed\xce\xd4\x6d\x15\x44\x8b\x52\x75\xd8\x7\x48\xfe\xe\xf6\x1f\xe3\x6c\x4e\x40\x4a\x91\x61\x70\xae\xe6\x19\xcc\x66\x1e\xa7\xd3\x43\xda\xde\x2a\xb4\x3e\x3a\xca\x9a\x5e\x71\xd\x34\xef\xb5\xb\x55\xbb\xee\x35\x50\x69\x4f\x9\x7b\x1d\x47\x86\x53\xb3\xbe\x79\xa3\xb9\x24\x8f\xe1\x1b\x58\xa\xd7\x2f\xfc\x8\x72\xf5\xe7\x7a\x5a\x54\xb7\x87\xfd\xf0\xc0\xc9\x30\x27\x3\xf1\xd6\x74\x3f\x90\xf7\x37\xf8\x28\x9f\x42\x6b\xab\x76\x23\x65\x6f\x2e\xb2\x21\xc6\x3c\x2c\xfa\xf4\x9d\x5f\xec\xaa" }, + { 0x547d98, "\x84\xf6\x55\x2c\x2b\xb\x30\xb6\xd7\x91\x7b\xea\xfc\x8b\xb9\x6d\x11\x2a\x4a\xba\xc5\xfb\x8\x5c\xda\x3\x9f\x52\x8e\x81\xc4\xb3\xa5\x38\xf1\xc7\xca\xd9\xfe\x58\xcd\x42\x1a\xd8\xbd\x9a\xa4\x45\x36\x4f\x4e\x43\x9c\xe0\x9d\xd2\xd4\x19\x98\x26\xdd\x5d\xa8\x28\xfd\xc2\x31\xa0\xed\xbe\x1d\xd6\x68\x3a\x9\x12\xcc\x48\xa6\x95\x66\x6a\x92\xbb\xbc\xaf\xaa\x93\x53\x2d\xb0\xf2\xd\xd1\xcb\x2\x76\xb4\x5\x4c\x85\xde\x51\xe1\x54\x47\x8f\x70\xf5\xb1\x96\x18\x78\xfa\x39\x62\x88\x6e\x9b\x59\x8d\x8c\x87\x1\xf\x4d\x6\xa7\xe3\xb7\x77\xb2\xf0\x1b\x7a\x83\x50\x1f\x8a\xe8\x5f\xae\x4b\xeb\x13\xe5\xdf\x7\x41\x63\xf4\xc3\x64\x32\x21\x29\x94\xa9\x16\x6b\xa\x3b\xd3\x69\x5a\xa2\xff\x72\xef\x89\x2e\x7c\x82\xab\x49\x22\x61\x34\xdb\x7d\x5b\x5e\x65\x6c\xdc\xf7\x2f\x10\x3f\x60\xac\xc\xf3\xbf\x46\x86\x44\x99\xf9\xc8\x35\xec\xd5\x1e\x6f\x15\x4\x97\xc6\x25\x90\x1c\x80\x75\x3d\xa1\x33\x0\xd0\x7e\xb5\xe\x57\xe7\x67\x23\x17\x74\x27\x7f\xce\x3c\xad\xee\x3e\x37\x24\xe9\x71\x20\xe6\xe4\x9e\xa3\x73\xf8\xe2\x14\xc1\x56\x79\xcf\xb8\xc0\xc9\x40" }, + { 0x547f10, "\x5\x3d\xbf\x26\xdf\xc3\xc0\xfd\xa2\xb\xee\x82\xad\xbd\x48\x1f\x66\x2c\x57\x13\x3e\x5c\x50\xe7\x29\xb7\x62\x32\x85\xe3\x9c\xf0\x69\xa6\x65\x92\x84\x9f\x54\xec\xa0\x15\xf9\x0\x78\xf7\xe1\xb5\xb8\xf2\x7f\xae\xf5\x44\xb2\xd6\xcb\xc\x8e\x7d\x4\xb1\x36\x24\xe\xa\x16\x43\xfe\x77\xb9\x63\xc5\x49\x3f\x71\xf6\x64\xc6\x87\xd0\x1c\xa1\x7e\x7c\x23\xd8\x67\x9b\x59\x53\xf3\xa5\xce\x7a\xb0\x68\x3a\xd9\xe9\x8a\xcc\x80\x45\xe4\x6\x4e\x2f\xd5\x6c\xea\x19\x9e\x97\xe2\x8d\x60\x37\x8b\xd4\xdd\x81\x5b\xa4\x8\xf1\x2d\x4d\x6a\xfa\xe0\x75\xa9\xe6\xd3\x76\x31\x86\xc1\xa8\x46\x72\x58\x38\x2a\x96\x73\xc4\xc7\x51\x9d\x30\xd2\x88\x27\xc8\x95\x52\x1d\x21\x94\x5e\x1\x56\x3b\x9\xdc\xa7\x79\x3\x7b\x39\x28\x6e\x1e\xc2\x2b\x70\x99\x6f\xff\x17\x18\xda\xaf\x2e\xb3\xba\x42\x5a\x55\x10\xd7\xe8\x47\xfb\x83\x8c\x5d\x6b\x3c\xab\xeb\xef\x25\x5f\x22\xb6\x33\x9a\xcd\x2\xb4\x91\x7\xd\xf\xdb\x1a\x61\x12\xbc\xcf\x34\xbb\x6d\x20\x4c\x11\x4a\xaa\xfc\x41\xe5\x1b\x74\xde\xbe\x4b\x40\x90\x98\xf8\x4f\x14\xca\xf4\xac\x93\x35\x8f\xc9\x89\xd1\xed\xa3" }, + { 0x5387b0, "\x78\x56\x88\x23\x55\xb3\xa8\xaf\x59\xea\x6\x1f\x73\x25\xb0\xe1\x70\x4d\x82\x58\x26\xe7\x40\x1a\x6c\xc1\x48\xb1\xf0\xba\xff\x0\xab\x2d\xa6\x22\x43\xee\x19\x8c\xe\xda\x17\x53\x85\xbd\x1d\x6b\xf8\x50\xce\x76\x4\xdd\xa7\xf1\x8e\x52\x37\xa2\x51\xe3\x69\x3a\x1c\x16\x68\x4a\x86\xbb\xb6\x6f\xdc\xfe\x14\xc\x79\x5e\xf4\x96\x42\x54\x2e\x84\x5f\xb5\xbf\xcf\x61\x7d\xd7\x98\x71\x3e\xcd\x20\x3f\xd0\xae\xa9\xd\xc7\x8\x65\x8d\x3c\x81\x29\xb8\x6d\xb4\x80\xd1\x4b\x5b\x28\xa5\x4c\xa0\x6e\x90\xa\x11\x3\x64\x21\xdf\x2f\x24\xeb\xf2\x7b\xc5\xac\xb\xec\xed\x66\xd6\xe0\x9\x41\x32\xcb\x83\x93\xfa\x15\xe5\x27\x5a\x87\x44\xd4\xde\xf\x3b\x1\xb7\x2a\xf3\xa1\xd5\x72\xb2\x6a\x2b\x95\x7a\x8b\xca\x7e\x18\x7f\x47\xe6\xdb\x49\xf7\x9a\x9e\xad\x9d\x57\xf6\x60\xd2\xfc\x30\xfb\x9b\x45\xd9\x2c\xf5\x5d\x33\x1b\xc4\x89\x13\x35\x67\xef\x2\x36\x92\x99\x39\xf9\xaa\x74\xe2\x5c\x3d\xc3\x63\xcc\xc9\x62\xa4\xfd\x34\x12\xbe\xc0\xc8\xc2\x7\x10\x75\x31\xe8\xbc\xd8\x97\x4f\x46\x1e\x7c\x38\x4e\x94\x9f\xc6\x8f\xe9\x91\xe4\x8a\xa3\xb9\x9c\x5\x77\xd3" }, + { 0x539420, "\xbb\x1a\x8e\x40\x7\x47\x3e\x6e\xb1\xfa\xa5\x63\x7c\xec\xa9\x75\x55\x76\xd2\xa6\xcb\xe4\x2d\xc6\x43\xa8\x18\x79\x48\xf0\x38\xd0\x9a\x8\xd5\xa0\x22\x7b\xc1\x84\x5a\x6b\xae\xd7\xbe\xb9\x50\xcf\x46\x70\x91\xed\xba\x8f\x7f\x1\xc5\x7d\x34\xf4\x14\x2\xe3\x2f\x64\x96\xb2\xee\x94\x4e\x90\x20\xd9\x95\x30\xca\x65\xf\xb\xd4\xd6\xde\xeb\x2a\x62\xd8\xc7\xdd\xe8\xe2\x4c\xbc\x77\x81\x66\x24\xc9\xb7\x60\x12\x39\xda\x71\xf1\x4d\x6c\xa\xf9\xb5\x6\x52\x3b\xa3\xb3\x7a\x35\x13\xe5\x57\x33\xc0\x16\x17\xfb\x87\xe7\xa1\x42\xe1\x67\x44\x54\x3d\xa4\x9\x19\x61\x15\x29\xb0\x0\xbf\xac\x5d\x1e\x27\x99\x56\x26\x83\x11\x5f\x69\x4f\x1d\xf5\x5\x8c\xff\x2b\x1c\x59\x21\xaf\xa2\xe\xdc\xb8\x85\x78\x80\x6a\x5c\x4\xfd\x25\x6d\x32\x9c\x8a\xc2\x8b\xf3\x9f\xb4\xd\x74\x9b\x8d\x97\x4a\xc3\x9d\x7e\xad\x28\x1b\x98\x53\xaa\x36\xf2\x49\xc8\xce\x73\xf8\xfc\x68\xef\xe6\x89\x3a\xea\x37\x31\xcd\xe0\x86\x3f\xb6\xab\xdf\x58\x23\x41\x3c\x88\x1f\xbd\x2e\xe9\xc4\x82\x72\xcc\x6f\xf6\xd3\x4b\xa7\x93\x5e\xfe\xf7\x51\x45\xd1\x10\x2c\x92\x5b\x9e\xdb\x3\xc" }, + { 0x547c10, "\xb4\x8f\x68\x29\x2d\x91\x41\x34\x56\x3a\x46\xf8\xcf\x63\xb8\xb2\x1d\xcc\xb5\x5f\xe0\x83\xd0\x66\x28\x60\xa0\x20\x88\x3\x9b\x4\x36\x55\x1f\x6d\x24\x62\x7b\x99\x53\xf2\x86\x4b\xff\x3b\xe9\xce\x92\xa5\x71\x5a\x7\xd2\x4a\xdb\xa2\x9d\xf4\xfc\xc9\x90\xac\x72\x77\x1\xb9\x2a\xf1\xd4\xfa\xc2\x61\xc0\xcb\xf5\x6b\x18\x67\xc6\x0\x9\x58\xfb\xba\x3c\x1c\x49\xae\xe6\x38\x40\x80\x97\xdd\x14\xf\x69\x89\x4c\x59\x16\x9a\x2e\x4f\x4e\x5\x33\x3d\xa6\xb6\x6a\x13\x30\xca\xeb\x25\x65\xd7\x57\xa9\x6c\xb1\xde\xd5\xcd\xed\x7c\x15\xbc\x19\xa4\x85\xc1\xa1\x73\xef\xbe\xc5\x35\xe\x7e\x47\x8\x64\xf6\x3f\x8a\xf7\x52\x75\xe5\x48\x37\x23\x8c\xdf\xa7\xd3\xe1\x2\xd\xa8\xe4\x74\x5d\xc4\xad\xf3\xbb\x54\x70\xbf\xdc\x1a\xec\xc3\x31\x1b\xa\x7d\x93\xb7\x9e\x2c\xd1\xfd\xe3\x3e\x96\xd9\x51\x12\xe7\xd8\x50\xb\xe8\xe2\x17\x4d\x5e\xd6\x39\xc7\x5b\x6e\x21\x84\x22\x11\x82\xf9\x26\x1e\x6f\x95\x6\xea\x10\x98\x2f\x78\x5c\x32\x45\xaf\x8d\xf0\x7a\xbd\xaa\x81\xda\xb3\xc\xfe\xc8\x2b\x76\x79\x8b\x94\xb0\xa3\x7f\xee\x42\x87\xab\x27\x9c\x44\x43\x8e\x9f" }, + { 0x541400, "\x7b\x35\x11\x79\x7\x2f\xf6\x82\x8e\xb4\x6e\xd2\x6d\xc5\x8c\x1c\xe0\xd6\x34\xf0\x4f\x25\x59\xe8\xdf\x1d\xeb\x32\x86\x51\xa4\xf2\x5c\xd1\xc8\x41\xec\x9d\x62\xac\xdd\x3e\xb8\x65\x75\x89\x12\x6c\x40\x4e\xc7\x27\xe1\x37\xcf\x9\x16\x78\xaa\x58\xd\xe6\x54\xfe\x8f\xfd\xf9\x61\x26\x3f\x2e\xcd\x2c\x4\xb2\x80\xf\x14\x6f\xc6\xab\xfb\x13\xdb\x9a\x21\xb3\xc0\xa9\x19\x70\xf3\x2b\xae\x9b\x49\xb7\xa8\x24\x1b\x48\xea\xed\xd9\x47\x9e\x9c\x69\x3c\x66\xbb\x6\x46\x38\x17\xb5\xcb\x5\x4a\x5e\x15\x20\xb9\xb6\x33\x4c\x7d\xa3\xd7\xb1\x23\x72\xc3\x4b\x63\xbe\xf7\x5b\x74\x64\x77\xcc\xd3\x85\xde\x1a\x31\x97\xa2\x8b\xfc\x10\x5f\xdc\xd5\xb0\xbd\x55\xc1\xe7\xc\x50\x43\x39\x71\x52\xe5\xaf\x8a\x60\x92\x2d\xd8\x3\xf5\x28\xca\xef\xd0\xc2\x53\x91\xa6\x73\x56\xa5\xf1\x57\x42\xf4\xd4\x36\x8d\xbc\xe9\x7e\x2\x76\x18\xb\x84\x5a\xe2\xbf\x68\x95\x29\x98\xad\x88\x1f\x81\x67\xa1\x3a\xa7\x22\xf8\x1\xa0\xce\x7a\xda\x30\xc4\xe4\xee\x7c\x3b\x4d\x3d\xe3\xfa\x6a\x7f\x99\x0\x93\xe\xff\x90\xa\x2a\x5d\x96\x8\x6b\x83\xba\x1e\x44\x87\x45\x9f\xc9\x94" }, + { 0x541588, "\x11\x2b\xc0\x60\xd2\xf5\x1f\x42\xf7\x8e\x13\x8c\x68\x7b\x90\x26\xd1\x28\xa3\x9d\xd\xb6\x9a\x1b\xb5\xa0\xba\x7d\xa8\xd5\xe\x88\x93\xa6\xbe\x98\xd6\xe4\x50\xa1\x3e\xb7\x8d\x94\x46\x4a\xbc\xd7\xd4\xf1\x59\x97\x2a\x66\x2\xe1\x3d\xf\x1e\xe5\xc5\x49\xe9\xa4\x99\x6f\x6\x37\x96\xdb\x58\xd0\xfe\x2c\xe8\x21\x38\x71\x62\xb4\xda\x12\xac\x79\x17\x5b\xc8\x82\xeb\xf0\xe2\x3\x80\xaa\x9e\xb\xe3\x5a\xc1\x91\x35\x75\xea\xfa\x20\xdd\x23\x84\x31\x9b\x5d\x78\x7a\xc\x27\xa7\xf3\xa2\xa9\x87\x52\xb8\xf9\x5e\x9\x6e\x64\xc9\x18\xd8\xee\x86\x2f\x30\x7f\xb2\x3a\x47\xb3\x74\xde\xe7\x4b\x2e\x41\x29\x5\x33\x15\xfd\x7e\x22\xf6\x70\xbb\x67\x34\xf4\xab\x92\x1a\xe6\xa5\x7\x65\x3f\x39\x95\xef\xb1\x24\x85\xfc\x53\xf2\x1c\x8f\x81\x48\x5f\x25\x76\xdc\x19\x56\xcd\x2d\xff\x43\xbf\x4e\xb0\x1\x0\x9f\x51\xc7\x57\xad\x73\x72\xc4\x8\xbd\xa\x7c\x1d\x40\x77\x61\xb9\x89\x9c\x3b\x8a\x16\xc6\xcb\xce\x4f\x63\xd9\x6d\xcf\x3c\x6b\x54\xdf\x4c\x10\x8b\x69\x32\xe0\x45\xaf\x4d\x83\x5c\xec\xc3\x14\xf8\xed\xc2\x6c\xca\x55\x44\x6a\xcc\xfb\x36\xae\x4\xd3" }, + { 0x541688, "\x6b\x1d\x53\x81\xa\x82\x7\x16\x41\x54\xa0\xbd\x87\x3\x20\x2d\xf7\xb5\x4\x59\x1b\xdf\x8c\x22\xe2\x10\x9\x55\x9e\xef\xa6\x57\x65\x7f\x3a\x35\x9c\x3e\xfe\x40\xfd\x17\xc0\x26\x33\x38\x7b\x6a\x5c\xd1\x50\x14\xec\x49\xfb\xa9\xe5\x1e\xf3\xea\xde\xdd\x44\x75\x46\xc9\x2b\xcb\xbb\x27\xab\x15\xe7\xed\x91\xda\x25\x4e\x5b\xb7\xee\x77\x58\xb8\xe4\x48\x63\x47\xd9\x0\xb0\xfa\xe1\xff\xb3\x72\x32\x3f\x29\x19\x68\x1\x23\xcc\x93\x8d\xd3\x31\xf9\xcf\xf6\x73\x8a\x4f\x11\xe6\xca\xa8\x18\x97\xc2\xd\x92\x62\x84\x85\x3b\x52\x6f\x9b\x6e\x5f\xe3\x9a\xce\xdb\x3d\x70\x95\xb\xdc\xc1\x2\xae\xc5\x56\x7e\x8b\x2a\xf5\x86\x28\xe0\xf1\x42\x83\xd5\xc8\xc7\x8\x4a\x5e\xf\xf8\x78\x5a\x1a\x66\x36\xfc\xd7\x34\x2c\xc3\x76\xbf\xe8\x21\x8e\x2f\x69\x7d\xa3\x98\x67\xa4\x8f\xe\xf2\xaf\x61\x4d\x24\xba\xaa\x7a\x6d\x5\xb9\x89\xbc\x2e\x30\x4b\xb4\x6c\x80\x1c\x9d\xc6\x3c\xb1\xd0\x88\xb6\xa1\xcd\xb2\xc\xbe\x79\xa2\xd8\x99\x4c\xd2\x74\x37\x51\x71\x9f\x13\x6\x90\xeb\xc4\xa7\xf0\xa5\xd6\x12\x45\xac\x64\xf4\x1f\xe9\x43\x96\x7c\x5d\x39\xd4\xad\x60\x94" }, + { 0x541988, "\x4b\x8e\xb4\x43\x5a\xcc\x15\xc0\xa0\x22\x21\x58\xec\xad\xde\x42\x4a\x70\xd4\x26\xc6\xeb\x3a\x61\xbd\x99\x20\x92\xfe\x9d\x68\xae\x1f\x11\x5c\xcb\x8\x66\x49\xe1\x2e\x96\xf2\xca\xdd\xb0\x37\xfd\x86\xa1\x7d\x7b\xbe\xf5\xd9\x60\x6d\x63\xe0\xe8\x84\xf8\x75\x44\x6b\xab\x81\xe5\xa5\xe4\xd6\x3e\x10\x3\x97\xd8\xbc\x5\x98\x1a\xa\xd\x5d\xf1\x8a\x2c\x82\x34\xc8\x4e\x2b\xfa\x7\x4c\x2d\x6c\xc1\x5e\x46\x29\x9a\xc7\xb8\xb9\x56\xa2\x7f\x1d\x3d\x1e\x9c\x80\x6e\xb5\xe\x7a\xcf\xfc\x30\xd5\x95\xa3\xb2\x1b\xf4\xe2\x89\x28\x12\xc5\x3f\xf9\x2f\xc9\x4d\xed\x40\x1\x59\xb6\x85\x50\x77\xe7\xf7\x2a\x76\x51\x78\xc2\x8f\x94\x87\xe6\x8b\x9\x93\x8d\x57\xda\x79\x2\x71\x55\x19\xb3\x5f\x69\xdc\x25\x18\xd2\xf3\x4f\xba\xea\x9e\xaf\x31\xee\xa9\x0\x35\x90\xff\x6\x1c\x4\x13\xce\x14\x39\x5b\xdb\x38\x36\x24\x27\xfb\xac\x52\xd0\x6a\x74\xf0\x62\x45\x72\xbf\x65\x9b\x91\x48\xd1\xb\x32\xb7\xdf\x88\xf6\x41\xa6\x9f\xd3\xc\x7e\x6f\xaa\x73\xd7\xc4\xa4\xe9\x17\xcd\xb1\x3b\x64\x8c\xf\xef\x54\x83\x7c\xa8\x23\xe3\x16\xc3\x47\x3c\xa7\x33\x67\x53\xbb" }, + { 0x541b30, "\xc9\x4d\x8e\xe5\xaf\x88\xa5\x73\xeb\x9e\x4e\xdc\x6b\x68\x28\x79\x7b\xad\x2c\xe\x51\xe1\xc6\x1f\x71\xb2\x61\x7\x42\x49\x35\x1a\xf2\x80\xd2\xd7\x82\xc3\x2b\xa2\xb6\x8b\xec\xa0\x2a\x29\xe7\x8a\x1c\x4b\xdf\xf7\xba\xb1\xdb\xee\x43\x7e\x87\xa7\xfa\x19\xb5\xf1\x95\x4f\xce\x66\xd9\xae\x11\x46\xa\xb8\x40\xf6\xe3\xbc\x77\xf8\xb3\x78\xf3\x5a\xac\xb0\x63\x8d\xcd\x64\x39\xa1\xa4\x9a\x4a\x69\x41\xed\x98\x37\xfb\x3f\xd0\xaa\x6\x7c\x7d\x3d\x94\xa6\x5f\x24\x12\x8\x9d\x32\xc4\x3b\xda\xa3\x10\x34\x8c\xd8\x5c\xcb\x20\x5b\x70\x86\x14\x27\x36\x1\xe9\x3\xc5\xa9\x67\xfd\x9b\x57\x6c\x0\x2e\x4\x84\xf\x26\x72\x92\x58\x17\x83\x2d\xdd\x6f\x62\xc7\xc\x55\x6d\xd5\x13\x3c\x5d\xb4\x5e\xea\x47\xc8\x25\xca\x59\xe0\x97\x21\x9c\x96\x93\x2f\x1e\x8f\x7a\xbf\xcc\xde\xf9\x16\x22\xf0\x81\x75\x3e\xd\x4c\xfe\x23\xbe\xa8\x76\x1b\xf5\x56\x18\x2\xe2\x33\xd3\xf4\xab\xb9\x6e\xc0\xff\xb\x1d\x60\x85\x30\x3a\xe6\x65\xd1\x52\x53\x54\xb7\x9f\x48\x89\xc2\x15\x74\xcf\x9\xc1\x38\x7f\x44\x99\xbb\x45\x31\x90\xd4\x5\xbd\x91\xfc\xef\x50\xe8\x6a\xd6\xe4" }, + { 0x541c30, "\x76\xad\x9\x82\xbd\xb\x69\x6a\xe0\xac\xd4\x34\x31\xd2\x83\xe2\xe7\x28\x70\xe8\xc1\xdf\xa\x2d\xbe\xd5\xe9\xe3\xfb\x79\x7c\xff\xf0\xe6\x85\x43\x47\xb2\x64\x92\x81\x80\xb4\x6d\xf7\xee\x1\x1f\x60\x48\x8e\xa4\x54\x74\x50\x4a\x2a\x5e\x39\x5f\x8f\x46\xb1\x8\x12\xf3\xde\xbf\xcb\x2\xdd\xa2\x9e\xd6\x6f\x9a\x9c\x3d\x93\x77\x2f\x21\xf1\x19\x9f\xcd\x2c\xeb\x30\x13\x89\x88\xa1\x71\x17\x7\x73\x32\x16\xc6\x4d\x3a\xb5\xa3\xa7\x1e\x10\x65\x23\x7b\x5c\xd7\xcc\x15\xca\xae\x6b\x91\xef\x1c\xe\x8c\xda\x72\x4c\x6\x0\xdb\x8d\xbb\xb7\x26\xd\x6c\x37\x8a\x84\x2b\xf2\xd3\x41\xaa\x6e\x7d\xc2\xfc\x3e\xd1\x4\x45\x68\xb9\x27\xe4\x58\xb0\x1b\x44\x40\xba\x53\xd8\x66\x14\xe1\x67\x5\x5d\xc\x96\xf8\x4e\x98\x7e\xf4\x3\x99\x52\x51\x4f\x11\xa8\x1a\x9d\x86\x97\xc5\xf\x25\x75\xc8\x94\xa5\xb8\xec\xa6\xa0\x38\xab\xc9\x36\x24\x35\xc0\xc7\x90\xd0\x55\xfa\x95\xaf\x49\xfd\x7f\x42\x87\x7a\x3f\x56\xf5\x3c\x62\xc3\x59\xb3\x33\xa9\x2e\x1d\xea\xbc\x63\x18\xed\xd9\x3b\xf9\xc4\x78\x22\x5a\x29\xfe\x9b\x61\xe5\x5b\x8b\xce\x4b\x57\xcf\x20\xdc\xf6\xb6" }, + { 0x541db8, "\xf\x3\xdb\xb5\x48\x8b\xe2\xbd\x4a\xc7\xdc\x63\xe9\x71\x94\x3d\xf7\xf9\x1c\xfa\x77\x1e\xea\x97\x9e\x57\x43\x91\xf8\xae\x4f\x55\x9b\xd1\x32\x67\xcf\x90\x2b\xac\x3a\xb4\x6\x85\x98\xc\xc1\x2c\xec\x40\xbf\x9\x59\xde\xcb\x6b\xa1\xad\x47\xbb\xd2\x22\x64\xa4\xb\xe5\xce\xd0\xff\xd4\x41\x45\x51\x65\xb9\xdd\x5\x38\xb6\xc2\x35\x21\xab\xc4\x1d\x1f\xa2\x74\x0\x5e\x93\xa\xe\x68\xda\x95\xf5\x6a\x1\xbc\xfe\x16\x12\xfc\x62\x2a\xf3\xf6\x7c\x5a\x46\x1a\xcd\xc3\x7b\x42\x27\x8f\x25\xa6\xca\x6c\xa7\xf2\x23\x5d\xd5\x54\xe4\xc5\x20\x50\x56\x3e\x69\x70\x52\xed\x7\x17\x66\x8a\xb1\x82\x37\xef\x3b\xfb\xd9\x7e\x36\x2e\x9a\x1b\x2f\x29\xe7\xa9\x83\xe3\xa3\x8c\xf1\x2d\x49\xd7\x31\x10\x78\x8e\xb2\x87\xd8\xe8\x5f\xb0\x76\x9d\x79\xc9\x4e\xe1\xe0\xee\xf4\x13\x9f\x14\xbe\x73\xb8\x88\x3c\x86\x7a\xa5\xba\x58\x7d\x6e\xa0\xc8\x11\x30\x61\x81\x33\xd6\x4c\x9c\x18\xf0\xfd\x99\x3f\xc0\x80\x28\x5b\x72\x4d\x6f\x92\xeb\x24\x75\x89\x8d\x15\xcc\x60\xaa\x4\x26\xd3\xdf\x8\x2\x5c\xa8\xe6\x44\x7f\xb7\x96\x39\xc6\x19\x34\xaf\xd\x53\x6d\x4b\xb3\x84" }, + { 0x541fe0, "\x30\x7a\x4b\x48\x47\x3f\xc8\x2e\xde\xb1\x5f\x96\xe3\x40\xb3\xdf\x70\x73\x67\x87\x78\xdd\xa\x6b\xb5\x2f\xf0\x13\xc5\x1c\x7f\xa1\x8b\xb4\x8e\xeb\x63\xd5\x89\x9d\x0\x68\xab\x9\xfe\x76\x71\xb7\x5d\x92\xc1\xdc\x46\x79\x8c\x16\xf3\x1a\xc9\xd\x3b\xf6\xad\xe7\xa5\x45\x3\xee\xd1\x5c\xb6\xbc\x52\xc3\x3a\x94\x1f\xe2\x6f\x14\xca\x29\x69\x4a\xe5\x51\x31\xff\xaf\x50\x9a\xcc\xf4\x39\x7\x86\x82\xfa\xac\x20\x26\x83\x9f\x54\x11\xa3\x1e\x81\x43\x2c\x8\x8d\x5a\x85\xa2\xcb\x2a\x35\xb2\xda\x2d\xfd\xc4\x37\xa7\x3e\x7e\x75\x65\xa8\x66\x1\x25\x32\xd4\x4f\xa0\x1b\x6\xae\x28\x15\x9b\xba\x2b\x34\x77\x8f\xec\x99\x7c\xc0\xb9\xf9\x88\xce\xe9\x84\x93\xb0\x22\xcf\xed\xf\x7d\x74\xe0\x61\x2\xa6\xbf\x58\xea\xf2\x95\xfc\x6c\x56\x91\x4c\xe4\x80\x49\xbb\x18\xd0\xa9\xa4\xaa\x5e\x8a\xb\x33\x38\xd6\x53\xdb\xf7\x60\x44\xc\xc6\x62\x55\xd7\xbd\xfb\xcd\x5\x42\xef\x57\x24\x12\x90\xd9\x19\x27\x5b\x6a\xd2\x98\x23\xbe\x36\x4\xc2\x7b\xf8\x6e\xe\xc7\x6d\xd3\xf1\x97\xe1\xe6\xd8\x10\x9e\xe8\xf5\x59\x9c\x4d\x64\x3d\x21\x1d\x72\x41\x17\x4e\x3c\xb8" }, + { 0x5420e0, "\xd8\x40\x46\x1c\x9c\xba\x77\xfd\x1d\xe0\xc0\x42\x92\xf0\xff\xa8\x78\x9e\x3f\xcd\x60\xea\xc7\x3c\x2f\x5f\x72\x74\xb3\x2c\xee\x94\x47\x80\xe8\xf5\x67\x8f\x53\x43\xd\xb9\xe9\xaf\x7e\x7a\xe\x63\xb6\xd2\xd4\x27\xc4\x7\x76\xad\x4e\x3\x5d\x2\xd6\xaa\x56\x6b\x12\x21\x37\xa0\xd1\xab\x3a\x11\x51\x90\x48\x23\x26\x6a\x6\x97\xc1\x9d\x35\xec\xa3\x24\x10\xfb\xf8\x41\x65\x1\x1f\x6d\x5\x8e\x7b\xb1\xfc\x44\xbc\x6e\x89\xa9\xc3\x2d\xb2\x18\xde\x71\xbe\xfe\xc5\x54\x73\x2b\x0\xa7\x5c\xae\xd3\x57\x95\xfa\xf1\x7c\xdf\xc\x31\xa6\x3d\x4a\x58\x79\x66\x87\xb8\x19\xf6\xf7\x8d\xbf\xcb\x45\x33\x6f\xb5\x91\x32\x5a\xbb\xdc\x62\x55\xa1\x4\x70\xa5\x8c\x16\x3e\x49\x64\x82\xf9\xdb\x59\x28\xcc\x50\x96\xb7\x38\xc6\x7d\x69\x29\xb4\x1b\xe7\x2e\xc2\xbd\x84\x85\x4d\xe1\x3b\xf4\xac\xd7\xe3\x8b\x4f\x30\x9f\x7f\x5b\xb\x20\xb0\x86\x88\xeb\xa2\xca\x34\x15\x81\x83\x13\xd9\x5e\x25\xf\xc8\xda\x4b\x99\xe5\x9\xf2\x93\xdd\x52\x6c\x2a\xc9\xef\x14\x9b\xf3\x68\xa4\x22\xce\x1a\x1e\xe4\xd5\x8\xe6\x9a\x98\xed\x61\x17\xa\x39\xcf\xe2\x4c\xd0\x8a\x36\x75" }, + { 0x542220, "\xee\xa9\x92\x52\x24\x57\x44\x8e\xa0\xb9\x95\x20\x5b\x70\xbd\xc3\xa7\x17\x4d\x1d\x12\x9a\x0\xd0\xfc\x9d\x41\x6\xf4\x86\x50\x74\xe1\x5d\xa2\xdf\xa1\xa3\xf\xd5\x1b\x62\x28\x7c\x10\x79\x9b\xe2\x13\x7d\xce\x97\xd7\xb\x56\xf0\x63\x3c\x68\xdc\x21\xed\x7\x3d\x7a\xb6\xb5\x23\xe6\x3f\x29\xeb\xd6\x67\x89\xb3\x87\xf2\xfb\x71\x90\x5a\xc6\x42\x2f\x32\x77\xd4\x15\xde\x84\xff\x7b\xd3\x47\xa5\xb8\xc4\x8b\x55\x6c\xc2\x5\x54\x1a\x65\xfe\xcf\x6a\xb7\xa6\x4\xc9\xaf\xf8\xf7\x40\x8d\x16\xae\x3e\x99\x6f\x4b\xac\x26\x3\xb4\x2e\xf3\x69\x34\xb0\x8f\x45\xcc\xd9\x2d\xcd\x4c\x9e\x5f\x85\xe5\xca\x58\xe\x9c\xf5\xfa\x38\xc1\x30\xd\x94\x36\x6b\xc8\xe4\xad\x39\x3b\x22\x46\x96\xc7\xbc\x5c\xe9\x80\xa\x73\x33\xfd\xd8\x88\x2a\x4e\xef\x4f\x5e\xc0\x1e\xc5\x27\xec\x18\xf1\xd2\xc\xba\x8c\xa8\x59\x98\xe8\x9f\x43\x51\x49\x72\x19\xbf\x2\x1f\xbe\x64\xda\x53\x4a\xab\x82\xf6\x3a\xbb\x91\xaa\x6d\x78\x81\x66\x7f\x75\x76\x1\x25\x35\xb2\x8a\xcb\x11\x48\xdb\x61\xe3\x6e\x93\x60\x14\x37\xf9\x9\x1c\x2c\xd1\x2b\x8\xa4\x7e\xea\xdd\x31\x83\xe7\xe0\xb1" }, + { 0x53ab20, "\xa5\xff\x5f\x5c\x76\xd0\x2c\x5d\x56\x88\x78\x11\x5\xaa\x2d\x3\x25\x2f\x32\x44\xae\x7d\xd4\xc\x38\xda\x6b\xde\xb1\x9f\xb5\x2b\xd1\xa8\x30\xf8\x1e\x73\xb6\x95\x55\x4\xaf\xf6\x48\x7c\xb3\x3f\x4b\xe2\x8b\xcd\x3e\xe0\x9c\x67\xc9\xf1\xfe\xea\xd6\x42\x63\xcb\x82\x94\x28\xc6\x54\x2e\x81\x52\x46\x41\x1\xe\x12\x43\x9\xf7\x3c\x2\x8c\xc7\x74\xd3\x45\x37\xbf\x58\x59\x6c\xfd\x7\xb0\x16\x39\x64\x23\xf9\x6a\x7a\x14\xd9\xb7\x86\x50\x19\x8\x57\x4e\x97\xac\x22\x7e\xbb\xad\x79\x4f\x85\x27\xc2\x61\x71\xe9\x1c\xc8\xc1\x93\x36\x70\x24\xc3\x3d\x1b\xf2\x6d\x15\x51\xfa\xbe\x87\xc4\xc0\x96\xb\xca\xa4\x75\xd8\x77\x1d\x53\x62\xe6\x2a\xb2\x4a\x8e\xd5\xdc\xf5\x35\x72\x5e\x34\xa1\x33\xc5\x69\x18\xa\xb4\x7b\x83\x31\xab\xa0\x9b\x21\xbc\x84\xfb\xd7\x89\x0\xd2\x3a\xfc\x13\x1a\xcf\xf3\xdd\x10\x90\x3b\xe4\x26\xf4\x4d\xa7\xf\x40\x7f\xe5\x29\x17\x8f\x20\xeb\xbd\x80\x99\x65\xa6\x6f\x4c\x47\xdb\x60\x1f\xec\x98\xe8\xa2\xb8\xb9\x5b\x91\xed\xf0\x9d\x68\x8d\x6\x5a\xba\x66\xdf\xa9\xe7\xe1\xef\x9e\x8a\xcc\x9a\xee\xd\x6e\xa3\xe3\x49\xce\x92" }, + { 0x542738, "\xa5\xc3\x4\xb9\x92\x3d\x8a\x86\xe9\x67\x74\xd8\x9b\xcc\xe6\xd\xc6\x23\xf\xa1\xac\x42\x28\x93\xf8\x9c\x8d\xc7\xb7\x3\x8c\x69\x3c\xd1\x81\xf9\xa0\xfd\xba\x0\x75\x49\xc4\xb\xfc\x68\x65\xb0\x80\x64\xa\xda\x83\xf5\x58\x14\xec\x46\x1f\x61\x13\x27\x6b\xce\x1d\xbe\x96\x19\xc2\x9\xef\x37\x2f\xe2\x47\xf1\x7e\x21\x30\x90\xf7\x2b\xf4\x3b\x7\x1a\x56\xd3\x72\x5b\x4b\x85\xe\xd5\x8\x6f\x5d\xc0\x79\x59\x26\x98\xfe\x7d\x6\x4d\x10\xbf\xf3\xee\x2e\xe0\xe7\xd7\xd2\x9f\x60\x88\x25\xde\x7f\x4e\xe1\xae\xdf\xe4\x38\xb8\xe5\x8f\xa2\xd9\xcd\xa4\x73\xdb\x84\xb5\xca\x17\xa7\x54\xab\x97\x91\xfa\x66\x1c\x2d\xea\x31\x35\xe3\x77\xa9\x36\x5c\xc\x76\x95\x5a\x7c\x1b\xbd\x8e\x94\xff\xf2\xbc\xc1\xb4\x87\x2c\x44\xb6\xaa\xc8\x33\xf6\xa8\x45\x48\xa6\x6c\x1\x63\x55\x6a\xd6\x9a\x57\x40\x15\xad\xb3\x3a\x5\x43\x51\xfb\x71\x9d\x22\x1e\xed\x53\xd0\xc5\x8b\xeb\x18\x6d\x20\x3e\xcb\x89\x34\xf0\x3f\x2a\xcf\x39\x16\x4a\xaf\x9e\x29\xb1\x6e\x62\x11\x82\x5f\x7a\xbb\x52\x12\xc9\x99\xa3\xdd\xdc\x4c\x5e\x24\x50\xd4\x78\x70\x4f\xe8\x32\xb2\x2\x7b\x41" }, + { 0x542df8, "\x94\x3b\xd0\xd7\xba\xb3\x84\xc4\x36\xdc\x30\xa9\xdd\xc7\xb1\x75\xe6\xa4\x71\xc2\x60\xbf\xf3\xea\x51\x49\x2f\x4e\xa5\x1\xa2\x44\x2\xfe\x85\xf0\x4\xcf\xac\xb7\x2c\x35\x5f\xa6\x18\x6a\x7a\xae\x9\xd3\x3c\x1a\xd1\x12\xcd\xaf\xcb\xb6\xe2\xef\x73\x7d\x47\x2d\xe0\x4b\xf5\x89\xbd\x79\x4c\xdf\x29\x19\x7\xbc\x66\x5c\xed\x62\x68\x3f\x81\x1b\xb4\x11\xc5\x93\xd\xc\x16\x52\x23\xff\xf1\x37\x83\x6d\x58\xab\x77\x59\x65\x46\x97\x56\x6e\xbe\xa1\xf9\x7c\x34\xc3\x76\xf\xb5\x96\x24\x10\xce\x82\x1d\x45\x1f\x67\xd4\xaa\x53\xad\xeb\xe5\x3\xa0\x64\x27\x38\xc8\x8b\x9f\xc1\x8c\x2b\xe9\x2a\xf6\xd8\x4f\xfa\x41\xe4\x7e\x8e\xe8\x90\x63\x9b\xb0\x72\x4a\x40\x57\xde\x61\xfc\x48\x1c\x17\x13\x14\x95\x99\x39\x28\xc0\x31\xe1\x98\x50\x5e\x0\x78\x3d\xfb\xf7\xda\xd5\x70\xca\x8f\x88\x6\xf4\xc9\xb8\xa7\x15\x5d\x6b\xbb\x8\x74\x1e\xcc\xd9\x21\x3a\x20\x3e\x92\x2e\x33\x54\x8d\x4d\x80\xf2\x5b\x91\xee\x42\xa8\xd2\xb9\x7b\xe\x9c\xf8\x9d\x86\x25\xa3\x22\xec\x5\xc6\x87\x32\x9e\xb2\xe7\x5a\x55\xa\xdb\x43\x8a\xb\x6c\x9a\xe3\x26\x69\x7f\x6f\xfd\xd6" }, + { 0x5430b8, "\x18\xde\x60\xb0\x52\x81\xc0\x13\xd9\xf6\x7f\x69\x1b\xa4\x27\x73\xa1\xe9\xad\x2a\x9b\x45\xc5\xa5\x2d\x16\xb6\x33\x5e\xc7\x3e\xd5\xbe\x5\x98\xa7\x82\x5c\xec\x29\xd1\x6b\x5b\x85\xf5\x89\xf1\x1c\xf9\x4b\x58\xa9\xac\x23\x2e\xe2\x7c\x36\x8c\x63\x2\x3b\x61\x39\x17\xe0\x32\xc1\xab\x4\x3d\x8f\x26\xd4\xef\xc9\x35\x2f\xe7\xd7\xa6\xcc\x9f\x44\xe4\xc2\xdc\x3f\x4d\x7e\x4a\xf7\x66\x38\x12\x3c\x96\x64\x5f\xf8\xcd\x7d\xb\x70\x76\x99\xba\xdf\xf\xa8\xff\xd2\x56\xeb\x94\xae\xbd\x78\xdb\xf4\xb5\x3\x7b\x80\xfe\xd0\xc6\x41\x0\xc\x86\x8e\x6d\x54\xb3\x4e\x8b\xb2\xb7\xe3\x43\xfd\x53\x11\xd6\xd3\x77\xed\x21\x14\x9a\x6\x9\x1a\x87\x9d\xcf\x37\xc4\x49\x6c\xe1\x10\x5d\x6f\x72\x19\x2b\x51\x15\x4f\x2c\x57\x55\x84\x92\x30\xd\x8d\x25\x24\x8a\xe6\xe\xf0\x22\xc3\x9e\xe8\x28\xbc\x1f\x65\xb1\x1\x20\xa\x46\x67\xfc\x31\x91\xe5\x5a\xca\x71\x90\xbb\xfb\x34\xea\xa0\x79\xee\xa3\xa2\xb9\xdd\x62\x7\xbf\x47\xce\x50\x88\x1d\xf2\x1e\xaa\xda\x9c\xd8\xf3\xcb\xb4\x48\x42\xfa\x4c\xb8\x6a\x68\x6e\x83\x7a\x97\x59\x93\xc8\x40\xaf\x75\x8\x74\x3a\x95" }, + { 0x543220, "\xbd\x7f\xc8\xb9\x77\x27\x36\x86\xbf\x96\xfe\xcd\xd\x93\xe0\xae\xec\x69\xee\x90\x3b\x91\x5a\xc0\xcb\x8\xfb\x5d\xa8\xe8\x26\x4c\x22\xf0\xa5\x5e\xff\xd5\x58\xc5\x89\x51\xf9\xfd\xfc\xce\xac\x74\x80\xa6\xde\x2e\x75\xd7\x61\x67\x3d\x35\xf6\x84\xdf\x3f\x5\xd8\x32\xc9\x54\x5b\x24\xc6\x6c\x11\x82\x9e\x2c\x99\x37\x9d\x1d\xd0\xbe\x6d\x6e\x92\xc7\x60\xe9\xaa\x47\x7e\x39\x2f\x97\x2\xad\x9a\xdc\xb3\x34\xca\xdd\x2d\xf5\x18\x81\xa4\x3c\x15\x40\x17\x63\xbc\xef\xcf\x1a\x52\xd2\x41\x55\x4a\x62\x8c\xf3\x68\x57\xe5\x9\xd6\x78\x59\xda\x7d\xe7\x50\x73\xba\x4f\xe1\x2a\xb0\xaf\x1e\x1b\xab\xcc\x9c\x0\x7\xe3\x46\x1f\x13\x85\x64\xe\x12\x45\x38\xdb\x79\x72\x70\xc2\x43\xb\xed\x44\xeb\xf2\x48\x30\x87\x8e\x31\x88\xb6\x49\x8f\xe2\x14\x7c\x76\xc3\xd9\xfa\x71\xa1\x6a\x25\x20\x98\x5c\x10\xf\x66\x94\xe6\xa7\x6b\xb4\xa0\xd4\x5f\x1c\x6\xd1\x7b\x8b\xb1\x4e\x28\x56\xb8\xf1\xc1\x16\x1\xea\xf8\x4\xbb\x19\x9b\x8d\x33\x42\xb7\x3a\x4d\xc\x7a\xe4\xf4\x83\x23\x9f\x3e\xc4\xd3\xb5\x3\x53\xb2\x95\x21\xa3\xa2\x8a\x29\x65\x4b\xf7\x2b\xa9\x6f\xa" }, + { 0x543580, "\xb3\xd\xc5\xef\x7f\x75\x36\xd3\xbb\x73\x87\x24\x17\x6b\xeb\x25\x53\x5c\xfb\xf9\x13\x67\x77\xe7\x1c\xcf\x8\x79\xba\xab\xa7\xc8\xc7\x98\x74\x2d\x34\xf\xaa\xf6\x97\x69\x9f\xc0\x8c\xd9\x51\xcc\xa0\xb1\xf3\xd4\x4d\xe8\x88\xd2\x90\xe2\xbd\x52\xf7\x72\x57\xb0\x4a\x96\x81\xd0\x1f\xbf\xf5\x6d\x10\xea\xb4\x4e\x85\xf8\xde\x56\x5\x4c\xa9\x38\x41\x8d\x4b\x0\xae\x84\x80\xc4\xb2\x15\x3f\x7e\xee\xfc\x7d\x27\xbc\xdc\x70\x6c\x2c\x78\x39\x40\x9b\xbe\x68\xe6\xdd\x5e\xc9\xf1\x2a\x2f\xa1\xe4\xa8\xa\xce\x18\xd8\x22\xa3\x4f\x1e\xe3\xe1\x11\x92\x46\xc\x99\x28\x54\x47\x5d\x7c\x3d\xb8\x5f\x6a\xad\xfe\xfd\x63\x60\x43\x59\xb\x91\x71\xcd\x48\x35\xd5\x2e\x61\x9\x65\x33\x3c\xe9\x1d\x26\x89\x1a\xf4\xb5\x9a\x7b\xa4\x37\x93\x94\x14\x8a\x6\x8f\xe0\xd1\x30\x4\xa2\xdb\x7\xc3\xd7\x8b\xaf\xdf\x82\x50\x3b\x23\x49\xfa\x3e\x42\xa6\xc6\x5b\x9e\x9d\x12\x62\x32\xb7\xed\x55\xca\x8e\xcb\xe\x45\xc2\x19\x6e\x64\x31\x86\x2b\xda\xd6\xc1\xe5\x3a\x7a\x3\x95\x5a\xf2\x21\x1\x9c\x29\xb6\xa5\x16\xec\xb9\x2\x66\xac\x1b\x44\xff\x20\x58\x6f\x83\xf0\x76" }, + { 0x543680, "\x82\x70\x6d\x44\x64\xe7\xe0\xb\x73\xf7\x12\x60\x5\x13\x9e\xe\x1a\xb8\xe1\xa0\x37\xe8\x61\xde\x55\xe3\x29\x25\x3e\xb6\x92\xcd\x6\x96\x56\x31\xa3\xe4\xcf\xe2\x7c\x23\x53\x84\xfd\xc\x62\x7f\xdd\xb0\x75\x15\x9b\xdf\xf3\x2a\x68\x87\x7\x5c\xd4\xfc\x6e\x80\x38\x5e\xd5\x3a\x50\xd0\x3b\x9\x9c\x4c\x8e\x40\xc2\x91\x58\x22\xae\xb3\x7e\xa6\x54\x90\x5a\x45\x7b\x2f\x18\xf8\x35\x3d\x48\xd\xc6\x20\x51\xfb\x3c\xf5\x2b\xa5\x32\xc3\xd7\x36\x6c\x74\xe6\x85\x1c\x88\xd3\x0\x6a\xa1\xac\xec\x97\xf1\x52\xf0\xf6\x1e\xeb\xfa\xd8\x27\x3f\xa9\x83\x9f\x86\x41\x5d\xaf\xdc\x8b\x8d\xa\x8a\x4b\x4a\xef\x99\xea\x7a\x77\x28\x21\x6b\x8\xc4\x2c\x81\xce\xd9\x14\xf2\xab\x69\x8f\xa2\x1b\xa7\xb7\xc1\x79\x72\x63\x6f\x33\x59\xaa\xb1\x42\x8c\x95\x10\x94\x76\x3\x7d\x16\x1d\xff\x24\xb9\x67\xbf\x66\x47\x4d\x9a\x4f\xc8\xbc\xd1\xed\xdb\xf4\x43\x49\x89\xbd\x1f\x5b\xb2\xc0\x98\x57\x4e\xe9\xc9\xba\x71\x39\xd6\x11\x19\x4\xa4\xfe\xb4\xcb\x26\xc7\x34\xee\x5f\xe5\xbb\x2d\xc5\x93\x46\x1\x78\xca\xad\xf\xcc\x17\xa8\xbe\x65\xda\xb5\x30\x2e\x2\xf9\x9d\xd2" }, + { 0x543848, "\x5c\x7c\xa2\x4a\x63\x12\x58\x19\xbb\xc7\x60\xfa\x18\xc3\x49\x84\xc8\x5d\x61\xa\xbc\x55\xb3\xf3\x57\xb\xc4\x5f\x56\xc9\x4c\xd0\xe\x90\x9d\x2d\x4\x54\x93\x8\x17\x52\x79\x3c\xb9\x2c\x51\x4d\xb4\xb8\x3b\xfe\x6b\x3f\xd4\x86\x38\xa7\x92\xa8\xea\x30\xcc\xa3\xd6\x8d\xdd\xeb\xbe\x82\xe5\x1a\x98\x77\x1c\xef\x7b\xe1\x41\x22\xc1\x36\x3d\xe0\x9e\x31\xd7\xe3\xc6\x59\x46\x73\xe2\xae\xcd\x1b\x42\x11\xa4\xdc\x9f\x9\xce\x35\x67\x8f\x96\x4e\x83\x5b\xf2\x10\x80\x81\x4f\x2f\x37\xed\xfc\x64\x0\x24\xf0\x99\x78\x9b\x7d\x7\xc0\x6e\xdb\x7a\x39\x76\x75\xbf\x25\x4b\xa5\xc2\x7e\x1d\xd3\x2e\xc5\x6f\x34\xb1\xee\x8b\x68\x21\x2\xab\xd1\x14\xf4\xd\x5e\x23\xf1\x1\xca\xb7\xf5\x95\xa1\x44\x9c\xc\xb5\x6a\xad\xe4\x29\x8c\xd8\xf\x7f\x3a\xec\x32\x6c\x5\x13\x5a\x70\xda\xcf\x53\xa9\xe8\xd9\x74\xa6\x27\x89\x47\x1e\x8a\xd2\xb0\x50\xa0\x9a\x94\x3\x87\x71\xbd\xb6\x62\x65\xd5\xe9\xb2\xaf\xf7\x26\xac\x66\xfb\x85\xaa\xe7\x33\x88\x20\xdf\xfd\x15\xff\x69\x1f\xcb\x3e\xf9\xe6\x16\x45\xde\x6\x40\x8e\x43\x97\x72\xf8\x48\x2b\x91\xf6\xba\x28\x6d\x2a" }, + { 0x543990, "\x43\x8a\x90\x7d\xc9\xb4\x33\x62\x2a\xc8\xdc\xcc\xe5\xd8\x8\x20\x5f\x53\x67\x18\xe0\x23\xad\xae\x93\x69\x59\x6d\x10\xd4\xef\xab\x5\xcf\xa1\xd7\x85\x97\x28\x98\x5e\x4a\xe1\xf\x13\x21\xc5\x86\x76\x22\x57\x2e\xc4\x77\xbe\x1d\x82\xb1\xd1\xf9\x6e\xb8\x81\xc6\xca\x4d\x26\x17\xe8\x12\xdd\xeb\xc0\xa\xe\xf2\x68\x9a\xf4\x61\xde\xa3\x3d\x2b\xe9\xe6\x48\x5d\x16\xa4\xb9\x45\xed\xe2\x55\x51\x4f\x99\xda\x24\x42\xea\x60\x5c\x9f\x37\x46\xbb\xb0\xb6\x7f\x3b\xe4\x8e\x73\xe7\x5b\xec\xe3\xce\xfb\x9d\xf5\x36\xa0\x6b\x40\x27\x3a\x4\xd\x15\x83\x88\x38\x63\x70\x2c\xd5\x5a\x58\x4c\x72\xac\xb3\x75\x29\x0\xd9\x35\x74\xa6\x6c\xc3\x66\x78\x56\xbc\x92\xb5\x50\x1f\xf1\x34\xa9\x1c\xcd\x3e\xb2\x8c\xbf\x44\xfc\x41\xc1\x7a\xdf\xee\x30\x65\xfa\xa2\x32\x91\x25\x80\xba\x3c\x39\x96\x54\x1\xf8\x71\x2d\x84\xa8\x6a\xfe\xaf\xa7\xf6\x4b\xc7\xd3\x8b\xf7\x3f\x8f\x9b\xfd\xbd\x19\x94\xdb\xc2\x52\x2f\x31\x2\x9\xff\xf3\x11\xb7\x95\x6\xaa\x7c\x9e\x7\x49\x4e\xd6\xa5\x1b\x1e\x1a\x64\x6f\xf0\x47\x79\x87\x7b\xc\x14\x9c\x3\x8d\xb\xcb\xd0\x7e\xd2\x89" }, + { 0x543bf8, "\x19\xf2\xd0\x35\x72\xe6\xde\xe8\x38\x97\xfe\xd4\x0\xa9\x94\x77\x50\x74\xb9\xc\x15\xce\x54\x71\x45\x65\xba\xa8\x6d\xff\xd2\x63\x86\x5b\x93\xc8\x8a\xb6\x46\x20\x73\xa3\xe2\xae\xfd\x17\x16\x9c\x7\x5\x6b\x4d\x2e\xfc\xaf\x56\xb5\x95\xd7\x42\xb8\x18\x23\xa\x34\xf0\xcd\xfa\x3c\x9d\x9e\x8e\x59\x6f\x67\x92\x68\x5f\xcc\xe3\xe0\x41\x5a\x26\xdb\xe7\x33\x1e\x53\x37\x55\xb2\xf\xdc\x28\x10\x75\xb1\x12\xf7\x6c\xda\x2b\x8c\x89\xf5\xd9\xec\xc1\xb3\xee\xdd\xa2\x4f\xef\x9f\xa1\xbf\xdf\xb7\xca\xc3\x9b\xf4\x8\xb\x83\x3f\x32\xc2\x62\x1a\x2d\x2\x69\x4\x7e\x79\x61\x4c\x44\x84\x3d\x47\x39\xd\x8f\x5c\x81\xe9\x76\x8d\xad\xc5\x80\xd8\xcf\xc6\x7d\x1c\xd6\x7a\x51\x82\xc9\x31\x4b\x6\xb4\x85\x3b\x58\xf6\x6e\xa4\x3e\xe4\xa7\x2f\x25\x7b\x30\x66\x14\xc7\x57\xc0\x64\x21\x4e\x22\x2c\x99\xbc\xbb\x52\x49\x36\x1f\x7c\xf8\xf3\x3\x90\x3a\xc4\xa0\x4a\x91\x87\xcb\xd3\x78\xfb\x11\x70\xd1\xea\xf9\x96\x9a\x9\x5e\x1\xa5\x2a\x1b\xab\xf1\xd5\x43\xed\x13\xeb\x5d\xe\x8b\xe1\x98\x48\x29\xb0\x6a\xe5\xaa\xa6\xbd\x88\x60\xac\x40\x24\xbe\x27\x7f\x1d" }, + { 0x543d08, "\x98\x9c\xb6\x1c\x91\xe3\x4d\x7\x3c\x42\xeb\x71\xda\x6c\x45\x61\x99\xd6\xb1\x14\x51\x28\x64\x3\x1e\xcf\x15\x10\xa\x75\x1b\xba\x73\x89\xc7\x69\xab\x3b\x8\x7b\x52\x82\xa9\xa0\x39\xa4\xf8\x6f\xa6\xad\x22\x9e\x50\xfc\xbf\x6\xe9\x5c\x2f\x8b\x1\x8d\xf0\x8c\xe2\xa5\xe\xe5\x4b\xf7\xaa\x66\x60\x4e\x7c\x4f\x34\xa2\xb4\x5d\xaf\xcb\x8a\xd4\xb7\x30\x88\x1d\xfe\xbb\x9a\x74\x9b\x37\xe1\x44\x3d\x38\x3a\xfb\x80\xc8\x41\x65\xc6\x4a\xd7\xf5\x70\x62\x2c\xc2\xb0\xf4\xae\x57\x21\xf6\x4\x54\x5\x2b\x83\x95\xdc\xb\x24\x94\x7f\xd0\x31\x84\x5f\xdd\xe8\x87\xce\xb8\xc5\x40\xc1\xa8\xd2\xc0\xd9\x53\xa3\x3f\x55\x6b\xa7\xf1\x1f\x13\xed\xf9\x3e\xc9\xc\x2e\x67\x96\xd1\x27\x77\xbd\x32\xde\xee\x48\xf\xc3\x76\x36\xcd\x2a\xe4\xea\xdb\x46\x6d\x25\x78\xef\x18\x11\xd8\xe7\xb5\xca\x4c\xbc\xff\xac\x5b\x97\x8e\xf2\xe0\x43\x20\x35\x93\x5e\x81\x63\x2d\x79\x68\x19\x92\x56\x12\x5a\x0\x47\xb9\xd5\xb3\x90\xf3\x1a\x33\x2\x26\xd3\x6a\x85\xcc\x7d\xa1\x23\xec\x9f\x7a\xfd\xe6\xfa\xbe\x29\xb2\x72\x7e\x49\x58\x6e\xd\x86\xc4\x16\x8f\xdf\x9\x17\x59\x9d" }, + { 0x544130, "\xc9\x1c\x8\x44\xea\x55\xb5\x3e\x8a\x54\xeb\xd3\x86\xbb\x3b\x6e\x31\x3f\x22\xbc\xe4\xfc\x81\x4b\xd7\x8c\x1e\xb7\xb4\xb\xc8\x7c\xbe\x69\x1d\x9a\xfe\x18\x2b\xde\x4f\x6c\xcb\x52\x35\xe9\xed\xad\x79\x56\xb2\x41\xe2\xf7\xdb\xff\x6b\x71\x15\xf8\x5c\xcf\x48\xa7\x3c\x92\x60\x4a\x9f\x1f\x80\x4e\x8b\x43\x90\xab\x39\xee\x5\xd9\x6a\x40\x66\xf5\xb1\x29\x65\x9b\xf1\x84\x1a\x0\x64\x5f\xe\x76\x6d\x7\xc5\x67\x5b\x4c\x73\xd1\x7a\xf\x82\x7b\x47\x85\x74\xe6\xa1\x21\x42\xd8\x8e\x95\x98\xe3\xaa\x27\xb6\xb8\x26\xc\x6\xe8\x5e\x37\xbd\x6f\xca\xc1\x14\x4d\x10\x50\x3d\xb9\xf9\x19\x97\x1b\x7e\x20\xaf\xd5\x51\x2\xa\x8f\xa3\xd6\xc3\x62\xb0\xf4\x32\x12\x94\x8d\xc0\x78\x61\xc2\xe7\x3\x30\x63\xa8\xdc\x77\x9\x89\xa0\x46\x7f\x58\xd\xac\xa2\xe5\x88\x9e\xe0\xc4\x57\x68\xf0\x36\x38\x24\x1\xec\x91\x25\xef\xfa\xd2\x13\xce\xd4\xbf\x3a\xcc\xba\x93\xf6\xfd\x5a\x45\xcd\x72\x87\x49\xa6\x2d\x53\x28\x99\x2c\xb3\x5d\xd0\x4\x34\x96\x23\x9c\xe1\xc7\x16\xf3\x2f\x17\x75\xa5\xfb\x11\xdd\x2a\xae\xa9\xda\x70\xa4\x7d\x59\xc6\xdf\xf2\x9d\x33\x83\x2e" }, + { 0x544298, "\x84\x6d\x8e\x4a\x54\x44\x86\xb1\x7b\x8f\xa3\xfe\xf2\x6f\x9b\x2a\xa\xdd\xd5\x4e\x94\xc6\x7e\x99\x46\x56\x1b\x62\xad\x9a\x1d\x5c\xb6\x11\x15\x7f\xa8\xb\x45\xe8\x18\x41\xf5\x19\x9f\x16\x31\x3e\xc7\x51\x6b\x5\xfd\x70\x10\x93\xd1\x32\x2f\xf4\x89\x64\xf7\x3b\x60\xca\x96\x4c\x90\xbd\xbf\xab\xb7\x68\xb3\xdf\x42\xd4\xa1\xcc\x21\x59\x72\xe4\xdc\x73\x9e\x79\x14\x3\xec\xda\xd7\x92\xf1\xb2\xb5\x39\x81\x4d\x5b\x1f\xf0\x67\x74\x7c\x1e\x57\x6e\xe1\xac\x30\xea\x6c\x13\x37\x3d\x98\x22\xc4\xbb\x20\x50\xc1\x27\xf6\x53\xb8\x87\xcb\xf\xd3\x48\xcd\xc3\x47\x12\x75\x2\xfa\x5d\x4f\x80\x1a\x5f\x8a\x8d\x83\x58\xa0\x52\xbe\x43\x36\x61\x8\x82\x6a\xce\xaa\xb9\xa4\xdb\x76\x3c\x8b\xc\x3a\xde\xef\x24\x2e\x4\x95\x55\xaf\xfb\xf8\xf3\xa2\xa6\x3f\x40\x66\x63\x77\xff\x65\x35\x69\x91\x85\x71\xc9\x2c\xd\xed\x97\x2b\x4b\x33\xba\x23\xf9\xe7\xc2\xc0\xe3\xeb\x5a\x9d\x78\x8c\x7a\x34\x9\x26\xd6\x5e\xe2\x1c\xc8\xb0\xa7\x28\x9c\xe6\x49\xd8\x25\x7d\xe9\x29\xe0\xd9\x6\xcf\xfc\x17\xbc\xd2\x7\xa5\xa9\xae\xc5\x38\xb4\xe5\xe\xee\x1\x2d\xd0\x0\x88" }, + { 0x546d50, "\xab\x73\xec\xa\xdc\x52\x12\x6b\xc5\x5c\x71\x5e\x44\x8f\x41\x90\x8b\xe\x83\xba\x9e\xe4\x62\x42\x20\x38\xf3\x75\xb\x1b\x17\xf5\xd4\xcb\xaa\x81\xb1\x6c\x70\xc3\x11\x76\xd1\x69\x47\xf4\x9f\xe9\x95\xf\x4c\xe3\xd8\x92\xc2\x60\x5a\xe8\xf0\xb2\x0\x7b\x18\x4e\x85\x43\x97\x16\xce\x7a\xa7\x2e\xb8\xd2\x30\x2a\x66\xc7\x5f\xdf\xdb\xd0\xb0\xbb\xe1\x96\x3e\xfe\xc0\x26\xf7\x61\xee\xcc\x48\x3d\xfb\x3c\x2b\xae\x32\x55\xb9\x36\x7e\x68\xe5\xe2\xad\xac\x2f\xb3\xf1\xa1\xc9\x1d\x29\x72\x82\x67\x79\x51\x4\x50\xed\x1\x4b\x57\x5b\x1a\xbe\x7\x8a\x4a\x56\x9a\x9b\xca\x99\x2d\xb4\x8c\xb5\xdd\x25\x1f\xa6\xf2\x35\x2c\x89\xcd\x53\x77\x7d\x1c\x19\x84\xd\x6e\xea\x4d\x88\xc1\x24\x40\xa8\x8e\xbf\xa0\x3a\x54\x22\x58\x28\x6a\x3\x94\x64\xa2\x34\xff\xd6\x93\xa3\x23\x37\x9c\x8\xa4\xc6\xfc\x6d\xb7\x45\xde\x49\x31\xa9\xe6\x9d\xd7\xfa\xe0\x4f\x3f\xfd\x78\x98\x39\x6\x91\x21\xbd\xb6\xc8\x3b\x9\xe7\xa5\x7c\xbc\xf8\xc4\xd9\xeb\xf9\x87\x7f\xda\x1e\x86\x63\x46\x5d\xd3\xc\x2\xd5\xf6\x10\x15\xcf\x14\x33\x65\x27\xaf\x59\x13\xef\x80\x5\x8d\x6f\x74" }, + { 0x544548, "\x1f\xf4\xd5\xe\x5c\x98\xdc\xdd\x53\x5a\xf0\x9c\x1b\x3b\xcb\xae\x3d\xa9\x99\x45\x97\x6b\x5b\x8\xb9\x44\xe8\x89\x6a\x92\xa0\xb3\xad\x8c\x5e\xd4\x77\x8b\x30\x72\x4e\x8f\xe0\x31\xec\xfb\x1d\xc0\xe1\xca\xab\x20\xb4\x73\x6e\xc9\xfc\x42\x35\xde\x93\x64\xaa\x85\xda\x14\xa5\x46\xa\xd0\xf6\xff\x2b\x6d\x33\x91\xa7\x59\xf1\xeb\xb2\x48\x62\xd9\x39\xf7\xfa\x75\x68\x4\xf8\xc4\x74\x6f\xe7\x41\x58\x15\x63\x55\xf5\x3\x1c\x9b\xe3\x52\xaf\xb0\x1e\x2d\xed\xe5\xa4\x5f\xd\x60\x82\xa2\x49\xbd\x7c\xcc\xb\xc3\x4b\x4a\xd8\x23\x28\x86\x51\xce\x7\x40\x7d\xd2\xe6\x4f\xa8\xfe\x9e\x65\x9a\xc1\x17\xee\x3a\x4d\x7e\xfd\x88\x12\x5\x9f\x78\x7f\xcf\x18\xea\x0\x61\xe4\x96\xdb\x6c\x26\x56\xbf\x1a\x16\x9\x80\xa3\x79\x36\xa1\x2f\x32\xf\xcd\xc5\x3c\xd6\x2c\x70\xd3\xf2\x84\xd7\xc6\xa6\x47\xf9\x34\x22\xf3\x66\x10\x38\x37\x6\x2\x54\x13\xb8\xe9\x29\xbe\x5d\x7b\xac\xb1\x67\x2a\x57\x3e\x7a\x83\x1\xb6\xc7\x9d\x94\x2e\x43\x76\x8d\x69\x8e\x24\x50\x8a\x25\xb7\x19\xd1\x87\xb5\x11\xef\xe2\xc2\xba\x21\x71\x27\x3f\x95\xdf\x81\xbb\x4c\x90\xbc\xc8\xc" }, + { 0x544700, "\x78\x6c\xc5\xc\x2d\xa7\x97\x9c\x22\x76\x3e\x81\x51\x47\x59\x71\xb1\xa2\x4a\x3c\xb5\x16\x6\x95\xb9\x1\xe6\x91\x96\x1c\x1b\xad\x61\x64\xb2\xe7\x29\x19\x52\x3b\xfa\xaf\x30\xdb\xd4\xb\xfe\x75\x1f\xbe\xcb\xf6\xea\x31\xf8\xd8\xa3\x82\x73\x1d\x99\xf0\xcc\xb6\x46\x26\xaa\x8c\x87\x90\x24\x8f\x7a\x13\xee\xd1\xa9\x5\xb3\xf7\x2\x7c\x4c\x1e\xff\xe5\x77\xab\xd6\x98\x20\x4d\xc4\x23\xf4\xa4\x85\x9a\x8e\x1a\xe\xf5\x15\x60\x38\x72\xe9\xf1\xc3\x68\xf2\x93\xd3\x2a\x48\x74\xc2\x57\xa1\x7d\x94\x37\x92\x5c\xe1\x41\x83\xd5\x65\x14\xa6\xdc\x44\x27\xef\xd7\x25\x10\x2c\x7f\x40\xa5\x55\xbd\x2b\xd\xd0\xfc\xdf\xa0\x4\x0\x62\xb4\x5a\xeb\x6b\x84\x7e\x6a\xde\xed\x66\x3\xfb\x2e\x4f\x4e\xbb\x36\x5b\x18\xe3\x69\x3f\xec\xe4\xd2\xa\x34\x63\xcf\xa8\xf9\x9b\x7b\x6f\xe8\x49\xc1\x9\x54\xf3\x50\x67\x79\xc0\x9f\x8d\x5f\x17\x70\x11\xc8\xbc\xc6\xe0\x35\x39\xc7\x6e\x21\xbf\xda\x6d\x28\xf\xdd\x33\xac\x8a\x12\xc9\xcd\xb8\x45\xae\x32\xce\xe2\x56\xfd\x42\x89\x86\xca\x4b\x3d\x5e\xba\x8b\x5d\xb0\xb7\xd9\x58\x2f\x8\x43\x3a\x53\x9e\x80\x88\x7\x9d" }, + { 0x5448a8, "\x8f\xf2\xa0\xf3\x5c\x91\xbb\xc7\xcf\x42\x8a\x62\xf4\x67\xb0\xd4\xad\x2f\xc8\x64\xe8\x6e\x40\xc5\x5d\x82\x85\xa\x24\x2a\x41\x74\x7e\xcd\xdc\x26\xea\xe7\x96\xfd\x57\x6f\x35\xa7\x29\x4a\xe4\x4e\x43\xe5\xd8\x79\xe1\xeb\x95\xc1\xa4\xed\x80\xa8\x31\x6\x44\x10\x6b\xbf\x3b\x25\x9e\x94\xee\x83\x81\x6d\x1c\x19\x78\xa5\x5\x56\x4d\x0\x93\xb2\x84\x77\xaf\x2e\x18\x7b\xd2\xf1\xd1\x23\x69\x32\x98\x73\x8c\x5b\x70\xac\x8d\x6a\xb\x30\x3e\xd3\xd9\xe6\xf6\xf0\xd\xf9\x20\x72\x50\x68\xd5\x5e\x99\xf7\xa1\xbe\x89\xca\xa9\xcc\x33\x92\x87\xc9\xb1\x9\x1f\x48\x11\xba\x8\x12\xc6\x22\x53\x71\x90\xb3\x7d\x1b\xb8\x45\x4c\xc2\x9a\x15\xdd\x7c\xb4\x55\xdb\xdf\xfc\x60\x3f\xef\x9d\x3c\x4b\x65\xc3\x13\x51\x4\xb9\xbc\x7\xd0\x97\x66\x8e\xec\x46\x54\xbd\xce\xe3\xe\x88\x8b\x16\x2c\xb5\xd6\xa3\xfe\x3a\xa2\x52\x5f\xe0\x9b\x36\x27\x3\xf5\xe9\xf8\xc\xd7\x28\xe2\xc0\xae\x86\xc4\x6c\xaa\xa6\xcb\x58\x61\x39\x1a\x7a\xab\x9f\x47\x34\x38\x2b\xde\xb6\x1\x2d\x1e\xff\x7f\x5a\x59\x4f\x76\x63\x2\x17\x21\xb7\xf\x14\x37\xfb\x49\x75\xda\x3d\xfa\x9c\x1d" }, + { 0x544a28, "\x5d\x70\xed\x8d\xab\x3e\xdb\x57\xbc\xf6\x88\xde\xd5\xa1\x80\x2e\xb0\x29\xf1\x41\x9f\x27\xc2\x5b\x1a\xd8\x61\x97\x2a\xcf\xa\x17\xf3\x18\x77\x8\x42\xbb\x2f\x94\x21\x25\x1f\xc\xb8\x3d\xa8\x87\xa7\x71\x0\xd7\x45\x36\x7a\x4a\xca\xf5\xad\x60\x9d\x83\x40\x84\x56\xe\x4\xd1\x2\x96\x73\xe6\xaf\x35\xbe\x95\xc7\x1\x81\xeb\xb5\x7f\x51\x43\x52\xaa\x50\x22\xb9\xda\x54\xea\xd\xa0\xcb\x6f\x4c\x6e\xa5\x31\xdc\xce\xd9\x7b\xb4\x7c\xb\x85\x8b\xae\x12\x2c\x4f\x34\xdd\x6b\x2d\x6a\xfe\x63\xd3\xfc\x3\x20\x6d\xf0\xe5\xc3\x19\x62\x72\x1c\xb3\xc4\x65\x9c\xee\xd6\xfd\x76\xe9\x11\xa9\xe7\x2b\x46\xbd\x78\x89\x13\x9b\xcd\x15\x99\x9a\x69\x3f\x7\x6\xcc\x37\xf4\x98\x9e\x30\x47\x6c\x3a\x23\xe4\x66\xe8\x79\x3c\x5e\x14\x91\xb7\x8c\xfb\x8f\xc0\x3b\x7d\xe0\xa4\xfa\xc6\x4d\x90\x82\x44\x5\x67\x7e\xd2\x49\x64\xc8\x74\x8e\x32\xf9\x10\xff\x5a\x48\x5c\xc9\x92\xac\x16\x68\xd0\xef\x1e\xf\x24\x58\xbf\xb2\x55\x1d\x59\xe2\x33\xb1\xa6\x86\x4e\x4b\xc1\xe1\x39\xa2\x9\xba\x75\x5f\x38\xf8\xec\xdf\x53\xb6\xe3\xc5\x26\xa3\x1b\xd4\x93\x28\x8a\xf7\xf2" }, + { 0x547670, "\x41\x55\xc1\xa3\xdf\xde\xf4\x5c\x1\x2e\xa8\xf0\x1f\x4e\x38\xf6\x9d\x24\x1a\xb3\xcc\xcf\x7e\x9a\x60\xd2\xed\xe1\x42\x92\xe\x6b\x39\x57\x8f\xad\xfa\x5f\xfd\x48\x8a\x4c\x73\x64\x7f\xf9\xbc\x77\x6a\xd0\xe7\x47\xd6\xa6\x13\xf7\xd1\xb2\x3b\x49\xbb\xbf\x19\x3e\xb9\x58\x6c\xcb\x32\x5b\xd9\x8\x2b\x86\x90\xa0\x2f\x36\xe8\xbe\x6f\xa\x44\xfb\x8d\xeb\x9f\x4\x75\x82\x72\xb6\xaf\x3\x2c\xfe\xae\xf8\x27\x4b\xf5\xcd\xb0\x4a\x35\x3d\x5d\x2\x7c\x10\xba\x2d\x76\x74\x4d\x21\x65\xdd\x98\x17\xca\x33\xd\x88\xc2\x96\xdb\x84\x53\x1e\x80\x1b\x7b\x5e\xb8\xb4\x3f\xd8\x1d\x56\x99\xec\x52\xc7\x70\xc3\x7a\xc\x34\x25\x5\xa5\xda\x16\x26\x54\xf3\xe0\xd4\x85\xbd\x9c\x68\xac\x8e\xe6\xd3\x87\xa2\x8b\xa1\x15\xb5\x78\xb\x0\x66\xea\x50\x79\x59\xaa\x22\x2a\x29\xc4\x7\x12\xee\x69\xf\xf2\x3c\xc6\x7d\x28\x9e\x6d\xc9\xe3\x20\xa9\x40\x94\x63\x71\x46\xff\x23\x4f\x14\xd5\xc5\xa7\xf1\x31\x67\x95\xe4\x93\x89\x11\x6\x91\xef\x8c\x6e\x62\xab\x51\x9\x5a\xdc\x83\x1c\xb1\xe5\xe2\x9b\xd7\x61\xb7\xc8\x3a\x43\xc0\xe9\x97\x81\x18\xce\x45\x30\xfc\xa4\x37" }, + { 0x5480c8, "\xa0\xee\x48\xc3\x70\x1d\x44\x7f\xad\x27\x74\x5c\xe0\x71\x7a\x1a\x5a\x6c\x9d\xef\x28\x88\xa4\x89\xed\x75\x67\x22\x79\xd1\x6d\x1\xc6\x25\x7c\x31\x43\xa2\x66\x10\xac\x4b\x9\x1b\xcc\x3c\x32\xb\x8e\xe4\x60\x73\xf2\x8f\xfb\x47\x9a\x4e\xc0\x55\xd5\x91\x46\x59\xfa\x7\xa3\xbd\x78\xb7\xf\xec\xcd\xa7\xc8\xd4\xe5\x64\x12\x8d\xbb\x7b\xf6\x1e\x9c\xa9\xcb\xbf\x30\x11\x2a\x83\x37\x3a\xc4\x87\x5b\xb9\x6f\xf5\xae\x40\x50\x39\x7e\xb2\xe3\x5\x8c\xf4\xff\x92\x5e\xeb\x57\x77\xb5\x96\xe2\xfd\xba\xb1\x29\x6b\x4c\x51\xf0\x81\x0\x13\xf8\x14\x65\xf7\x3e\xc1\xa1\x5d\x2d\xaf\x69\x35\x3f\xd3\x24\xdf\x1c\x23\xe1\xfe\xf3\xdd\x16\xe6\xd\xb8\xa5\x9b\x9e\x63\x8\x8b\xa\x2f\xf9\x2e\x6e\xb0\x94\xb4\x80\xd8\x4f\x4\x56\xb6\x97\x21\xcf\x93\x3d\x26\x7d\x2\xaa\xd0\x76\xe8\xde\x17\xdb\x86\xb3\xca\xd9\x84\x99\x4d\xc5\xea\x3b\xdc\xab\xbe\x18\xc7\x2c\x3\x6\x68\x4a\x2b\xc9\x62\x95\x82\x85\x33\xf1\x42\xe7\x15\x20\xce\xd2\x58\x49\x98\x45\x41\x5f\xd6\x34\xa8\xda\x8a\x54\x38\xfc\x1f\x19\xd7\xc2\xe9\x61\xa6\xc\x72\x52\x9f\x6a\xbc\xe\x36\x53\x90" }, + { 0x546af0, "\x15\x4f\x74\xa6\x26\xb3\xce\x55\x94\x77\xb4\x93\xba\xbc\x7d\xd4\xec\x2a\x79\xa2\x70\xbf\x14\x4c\x35\x4\xd7\x85\x6c\x0\x11\xf6\x69\xb8\x2\xa7\xc4\x6a\x58\x92\x39\x25\xe6\x9d\xa5\xa\xc7\xaa\xda\x36\xb5\x2d\xeb\x86\xa0\x12\x99\xb1\x9c\x34\xcc\xb7\x59\x62\xf0\xcd\x9f\x17\x8a\xca\xc3\xa3\x7\xf3\x57\x41\xe5\x88\xfb\x97\xde\xd1\x1\x24\x43\x68\x90\xa8\x4b\x72\xee\x80\xfa\x52\xf2\xe7\xf\x6f\x22\x5f\x37\x2c\x98\x73\xb2\x3a\xf8\xc9\xd0\x1c\x87\x66\xab\x5d\xf9\x9b\xb0\x32\x61\xa1\xe0\x29\x9\x31\x45\x2f\x2b\x30\x8d\x5b\x5e\xa4\xc5\x3\x51\x16\x1a\xe4\x4a\xc\x18\x1b\x6\x4d\x7c\x82\xef\x19\xb\x8c\x3f\xb9\x13\x53\xd2\x6d\xb6\x81\x64\xc1\xdd\x95\xdb\xc2\xe8\x46\x60\x8\xe1\xaf\x50\x1f\x1d\xea\xd5\xdc\xcb\xd\xdf\x83\x49\x8e\x2e\x44\x67\xff\x8f\x76\x63\xf7\xe9\x3e\x10\x47\x1e\xd6\x21\xf1\xa9\xac\x33\x89\x7b\x23\xbb\xf4\x20\xd9\xfd\xcf\x42\xc0\x3c\xc6\xe\x40\x5\x7e\x56\x7a\x38\x28\xf5\x48\xe2\x4e\x71\xbd\xc8\x5c\xed\x6e\x96\xae\x8b\x9e\xfc\x3d\x9a\x78\x5a\xfe\x91\xad\x65\xbe\x27\x84\x3b\x6b\xe3\x7f\x54\xd8\xd3\x75" }, + { 0x546bf0, "\xc5\xb4\xfe\x62\x85\x73\x6d\xa3\x55\x60\x8\x7\xa4\x84\x2f\xcd\xaa\x5a\x36\xd6\x8a\xc\x89\x9c\xa6\x43\xc2\x13\xec\x9\x2c\x16\x52\x63\x81\xf\xed\x1b\x42\xf4\x66\xb6\xfc\xdb\xe7\x1e\xd8\xd5\x29\x5e\xe1\x57\xb0\xb5\xb\x70\xe8\x1\x3b\xde\xd4\x3\x1c\xbf\x5b\x27\x24\x34\xd\xbb\x5d\x39\xbc\xf8\x5c\x4\x3d\x47\x2\xe5\xf2\xdf\xe6\xc4\x95\x7a\x77\x3c\xa0\xff\x6b\x32\x38\x8b\x1a\x7e\x14\x26\x67\xc0\x58\x50\x64\x35\x18\xe2\xd7\x3e\x74\x2d\x41\xb7\x8e\x17\x11\xca\xc7\xd1\xdd\xcb\xd0\x90\xee\xeb\x72\x4e\x53\x80\x68\x4f\x56\xbd\x86\x76\xb2\x6f\x3f\x10\xe4\xba\xfb\x44\xc6\x5\x75\x48\x30\x9a\x19\x8d\x4d\xbe\x7f\xa1\xfd\xab\x9b\xa8\xaf\xf3\x9f\x4c\xad\xef\x8f\x2b\xf0\x31\xe3\x0\x21\xa\x2a\xf5\xc9\x23\xc8\x22\x79\x12\x78\xae\xac\x9d\x3a\x40\xf1\x93\x7b\xa9\x54\x20\x88\xe9\x45\x92\xea\x99\x7d\x6c\xd2\xcf\x6e\xc3\x82\xda\xb1\xd9\xe\x6\x94\x8c\x96\x46\x5f\xd3\x7c\x98\x9e\xb9\xf7\x69\x87\xce\x6a\x83\x28\xa5\xfa\xcc\x4a\x59\xa2\x1d\x61\xf9\x65\x37\xb3\x25\xa7\x91\x71\x1f\xf6\x2e\xb8\xc1\x4b\xdc\x15\x33\x97\x51\xe0\x49" }, + { 0x544d20, "\xaf\x3a\xa1\x82\xc\x76\x4d\xed\x6a\x13\x70\xc9\xc0\x32\x7a\x63\xd\x6f\xca\xb5\xdd\x69\x8b\x83\x59\x62\x2b\x98\xa9\x60\x51\x34\xa0\x75\x8f\xef\x1e\x44\xab\x54\x9f\xbc\x4\xb7\xf1\x9a\x68\xf2\x28\x3f\xfd\x87\xfc\xb2\x10\x55\x11\x17\x47\x26\x48\x52\x4f\x25\xaa\x5c\x6c\x1c\x39\x8\xa6\x1d\xb3\xfa\xd4\xe7\x37\xa5\x8c\x22\x58\x24\x8d\x23\xad\x31\xe5\xbd\x1a\x53\xa2\x79\x71\xbf\x7\x67\xc7\xcd\x3e\xdf\x14\x21\x7b\x6b\xea\x4c\x49\x9b\x1b\xe4\x7f\xff\x29\x4b\x5d\xe9\xa8\x65\x77\xf3\xa\x6e\xd1\xe2\x89\x96\x38\xf4\x80\x3c\x6d\x2e\xc5\xc1\xf7\x92\x2c\x1f\x20\x41\x36\x2d\x12\x42\x78\x43\xce\xcf\xf\x7d\x90\x0\x5a\x30\xc6\x81\xd9\xf8\x4e\xeb\xd0\xbb\xa4\xae\xd2\xde\xe8\x5f\x9d\xd8\x27\xe6\x19\x9c\xec\x2\x74\x35\xba\x84\xe1\xb\x3b\x5\xfe\x4a\xfb\xb0\xcb\x97\xf0\x64\x86\x99\x91\x3\xbe\x45\xa3\xda\xb6\x95\x2f\xd6\xf6\xc8\x73\x33\x56\xf5\x15\xa7\xc3\x18\xd5\x8e\x93\xee\xc2\x50\xf9\x46\x7c\x6\xe3\xdc\xd7\xb4\xd3\xcc\xdb\xb9\xb1\x57\x94\x66\x85\xb8\x5b\x3d\x72\xe\x88\x40\x7e\x9\x1\x5e\x9e\x2a\x16\x61\xe0\xac\xc4\x8a" }, + { 0x544e20, "\xd7\x3b\xe0\x11\x7a\x3\xca\xc9\xdb\x34\x4a\xc8\x24\x45\x7b\xc\x61\xf9\xcb\xc4\xad\x3d\xea\xaf\x7e\x63\x8f\x66\x2a\x21\x2c\x94\xb5\x72\xb2\xc0\x30\x77\x2f\x51\x91\x6\xf8\x25\x49\x1c\x74\xff\xdf\xbd\x71\x80\x81\x2b\xe1\x0\x4d\xda\x67\x35\x29\xf3\xc1\x89\x46\x32\x7c\x69\x3e\x1b\xf0\xab\x42\x9d\x26\xc5\x20\xb8\x6e\x12\x90\xd\xa\x5f\x23\xf5\xb9\x5e\x8b\x2\xe6\xe3\xf\x6c\x13\x65\xc3\x1f\xd9\x92\xde\x16\xc7\xd8\x75\x2d\x76\x3f\x6b\xc6\x70\xa1\xee\xa0\xed\x47\x4b\xef\xe\xbb\x9c\x9e\x31\x55\x6d\x8c\x79\x60\xa5\x2e\xe9\x37\x83\x40\xcd\x36\x84\xfd\xce\xb6\x57\xa3\x14\xf2\xeb\xdc\x4c\x28\xcc\x15\xd2\x4f\x1a\x5b\x1\x6a\x50\xcf\x8d\xfe\xb0\xbe\x5d\x44\xb\x59\xd5\xd3\x33\x3c\x5a\x27\x6f\x58\xa9\x96\xb7\xd1\xf7\x5c\x68\x8e\x19\x88\x86\xa6\x1e\x7\xa7\x53\xa2\x4\x10\x54\x7f\xf1\xbf\xbc\x3a\xac\x62\x4e\x8\x99\xd0\xe4\x48\x5\xe5\xfc\x98\x9\xf6\xa4\x1d\x9b\xa8\x56\xdd\x41\xb4\xb1\xfa\x97\x52\x9a\xe2\xfb\x95\x85\xc2\x38\xd6\x8a\xaa\x39\x43\xba\x87\xe8\xf4\x22\xae\x17\xd4\x93\x82\x73\x18\xec\x78\x64\x9f\xb3\x7d\xe7" }, + { 0x546fd8, "\x40\x2d\xc5\x23\xcb\xf8\x99\x7b\x3b\xae\x91\xa6\xb8\x0\xb0\xe8\x50\x9d\xd\xaf\xd8\x1b\xd1\xe9\x9c\xc0\xc\xcc\x10\xc3\x53\xe0\xd0\x8a\x9\x2b\xb1\x47\x2\xb9\xce\xc4\x3c\xa5\x36\x1\x86\x94\x7f\x72\x7e\x2e\x17\x78\x62\xc8\x3a\x6\xd7\x32\x64\xea\xbb\x18\x8c\x1d\x66\xa9\x58\x8e\x84\x7c\x75\xcd\x45\xc9\x9b\xbf\x4d\x76\x1e\x1c\x49\x44\x3d\xef\x39\xa2\x3\x37\xdb\xbd\x5e\xbe\xf2\x6d\x67\x6c\xd5\x6b\xf\xf5\xd9\x33\x54\x2a\x82\xf6\xbc\xfd\xda\x13\x92\x68\x16\xed\x70\x9f\x5d\xeb\xec\xfc\xfb\xa3\x6e\x90\x5b\x98\x5f\x8f\xe4\xe\x15\xf4\xb5\x3f\x63\x35\x59\x85\x8d\x9e\x5\xb\xa8\x65\x60\xad\x8b\xb6\x8\x41\x12\x80\x1f\x93\xe5\x7d\x88\xa4\x4b\x89\x6f\x25\xdd\xe2\x30\x57\xf0\xac\xe1\x28\xa7\x97\xde\xee\x6a\xc1\xf7\xc7\x55\xd4\x61\x24\x51\xf9\xca\x2f\xe7\x4c\xb7\x4\xe6\x96\xe3\x11\xdf\x43\xcf\x42\xab\xb2\x83\x79\xc6\x52\xdc\xaa\xb4\x7a\x34\x4e\x26\x20\x5c\x19\xa1\xd6\xba\x48\x56\x2c\x9a\xf1\x4a\x46\x74\x5a\x95\x77\xf3\xb3\x71\x27\xd2\x73\xfa\x87\x7\xa\xd3\xa0\x29\x3e\x81\xff\x1a\x38\xc2\xfe\x14\x69\x21\x22\x4f\x31" }, + { 0x5470d8, "\x13\x32\xf2\xee\xb5\x4b\x96\xd\x64\xb2\xc\xb0\x2f\xc0\x73\x53\xbe\x4d\x4c\xbc\x6f\xd8\x95\x4f\xe0\x6b\x24\x39\x63\xbb\x2b\xc7\xb3\xf4\xf7\x86\x7c\xa6\x23\x2c\x70\x52\xbd\x8b\x48\x80\x98\xb8\xf0\x56\xed\x91\x35\x65\xc3\xd3\x62\x60\xb9\x88\x31\xe1\x37\x1b\xac\x6e\x9e\x55\x1\xea\x4a\x42\xe8\xd9\x2a\x99\x61\x3f\xe2\x68\x58\xcd\x6\xa5\xa7\xd1\x1a\xae\x20\xca\x81\x5\xc5\x3e\xad\x66\x7b\xdc\x12\xa0\xa3\x74\x0\xa8\xb\x19\xfd\xb7\xdb\xb4\xcc\x9d\x3d\xf3\x5f\x5b\x72\xaf\x87\x92\x44\xff\xd4\xc8\x76\x8e\x5d\xd5\x3b\x22\xa9\x36\x47\xf9\x18\x15\x25\x4\x83\xc9\xda\xd7\x4e\xe5\xe4\xfe\x33\xd0\xa2\x5a\x7f\xc1\xf\x1d\x2e\x8a\x8f\x50\x27\x9f\x57\x1e\xeb\x6d\xf6\x54\x59\x49\x9c\x7e\xcf\x28\x93\x45\xec\xab\xaa\xbf\xa\xd6\x78\x41\x7d\x77\x26\x46\xb6\x2\xe3\x3a\xfb\xe\x8\xcb\x51\x82\x9a\x40\x84\x9\x5e\xfc\x7\xef\x21\x14\x2d\x71\xf5\x67\x85\x29\xb1\x30\x7a\xde\x90\x1f\x3\xf1\x3c\x75\xe6\x79\x11\x94\xc2\x16\xba\x97\xa4\x10\xdd\x1c\x69\xc6\xa1\x8d\x5c\x6a\xf8\xe9\x43\x34\x6c\x17\x8c\xfa\xc4\x38\x89\xce\x9b\xdf\xd2\xe7" }, + { 0x546970, "\xe1\x9a\x3f\x1a\x1e\x5d\x57\x52\x34\xd5\x1d\x93\x35\x76\x92\xf7\xea\xb9\x5c\x3a\xe3\x1f\x70\x9b\xc\xf\xd2\x8e\x30\x4c\x4f\xb0\xb7\x8b\xfb\xaf\xd3\x58\x8\x38\x36\xa5\x0\x2c\x45\x3e\xa7\x4a\x32\x37\x2b\x56\xfe\x90\x51\xc1\x7\x6e\x23\x3b\xbc\x95\x15\x86\x16\x5a\xd0\x2e\x4e\xdd\xd8\xe5\x6b\x7d\xfa\x75\x18\x29\x7c\x48\x68\xb3\xf1\xd4\x8d\x63\x20\xba\x98\xad\xa9\x6\xfc\xb5\x84\x67\xc4\x4d\x9c\x7b\x17\xb6\xfd\x91\xcb\xe\xbb\x60\xe9\x99\x49\x83\x5\x8a\xdc\x66\x24\x21\xcc\x54\x28\x78\xd7\x7f\x2d\xcf\xca\x97\xed\x5b\xc5\x59\x94\xbd\x47\x40\x25\xde\x6d\x3d\xe4\x44\xe2\x6c\x1b\xce\x22\xb\x43\xc0\x7a\x2a\x73\x53\x31\x39\x11\x14\x3\xe7\xb2\xef\x2f\x77\x74\x88\xb1\x8c\x4\x72\x7e\x10\xee\xa4\xf5\xf8\xb4\x85\xe0\x41\x87\x9e\xeb\xc9\x50\x96\xd6\x13\x9\x26\x12\x80\x5f\xa8\x3c\xf3\x89\x46\x4b\xf4\xae\x27\xc8\xc7\x61\x82\xb8\xa3\xa1\xe6\x69\x5e\x2\xec\xab\xc3\xd1\xda\xbe\x79\xe8\x9d\xd9\xaa\xdf\xf6\xa0\x62\x8f\xac\x6f\xa6\x71\x81\xa2\xf0\x33\xa\x1\xf2\xc6\xdb\xf9\xcd\xff\x9f\xd\xc2\x64\x65\x55\x42\x1c\x19\x6a\xbf" }, + { 0x5467d8, "\xf0\x36\x69\x25\x6b\x37\xee\x56\x5d\x85\xc4\x8b\xc6\x2\x62\xe4\x70\x48\x41\x91\x9d\x38\xff\x55\xfa\x3c\x89\xe6\x73\x30\xa8\x2d\x59\x3e\xec\xf1\x2b\xc9\x9e\x87\x84\x78\x9\x3b\xcd\xb0\xe2\xd9\x31\xf\xfc\x82\xc0\xce\x50\xe3\xbc\x79\x3\x67\x72\x9b\x32\xc1\x7a\xd\xa3\x65\xf2\xd6\x97\x6d\x93\x6f\x83\xab\x11\x74\xc3\xbf\x1f\x6c\xb1\xd8\x64\xb5\x19\xdc\x2c\xac\xe\x8\xb8\x76\xcf\x26\xbb\x6e\x51\x99\xa4\x9c\x53\x4\x88\x3d\xa1\xaf\x9f\x47\x7e\xe5\xd1\x52\xf7\x18\xd7\x15\xf3\x95\xd5\x1a\x86\x68\x8f\xba\x77\xc2\xf9\x5a\x90\x46\xe0\x61\x60\x2a\xef\xdf\x12\x1d\x5c\x7\x21\x34\x9a\xb3\x57\xb4\xe7\x1c\x4c\x35\xa2\xf5\x7b\x5b\x1\x8d\xda\x42\x71\xad\xc8\xf4\x13\x4d\x63\xb6\xfb\xbd\xed\x4f\x8e\x75\x16\x20\x28\xd4\x3a\x8a\xdd\x49\x14\x10\xa0\xde\x4e\x96\xdb\xb\x40\x7f\xcb\x80\x4b\xc\x5\x1e\x24\xfd\x44\x5e\xc7\x17\xae\x7c\xb2\x22\xd3\x92\x8c\x98\x81\x0\xb9\x27\xa7\x58\xb7\xa5\x29\x54\x4a\x6\x45\x1b\x6a\x3f\x23\xf8\xe9\xaa\xca\x66\xc5\x2e\x43\xcc\xfe\xd2\x33\x2f\xa9\xe1\xe8\x7d\x5f\xa\xbe\xf6\xd0\xea\x94\xeb\xa6\x39" }, + { 0x546690, "\x34\xa1\x39\xaf\x83\xdd\x8b\xb9\xe3\xd3\x61\x77\xc\x52\x66\x5d\x31\x4\x9d\xb7\x6e\xeb\xb\x9b\x19\x2a\xb3\x7c\xe6\x53\xfc\x48\x1d\x68\x69\xed\xf8\xcb\xf1\x17\xb8\x84\xc5\x9c\x6c\x49\x97\x78\xa6\x18\xf7\xdc\x7a\x2d\x65\xd\x26\x56\xb4\xa2\x3\x93\xe9\x1c\x82\x14\x6f\xee\xd2\x74\xac\x62\xc0\x7b\x8f\xd7\x20\x35\x21\xe1\xa0\xcf\xcc\xc3\x67\x80\x55\xfe\x70\x4e\x58\xc8\x27\x0\x36\x5\xe0\x1f\x6d\x51\xd8\x25\x89\x2\x2c\x85\xde\x76\x81\x4d\x11\x9e\x2b\xe5\xcd\xda\x3b\xbd\x92\xc4\xdb\xf6\x46\xbb\xba\x75\xb6\x71\x7e\x79\x1b\xfa\xea\x64\xc1\xa9\x8c\x59\x5f\xe7\x90\x63\xb5\x5c\x98\x6b\x9f\xae\x5e\x7d\xad\xc6\x7f\x8d\x15\x6\xc2\x38\x43\x5b\x73\xa3\x96\xec\x3e\xe2\x99\x94\x1\x54\xca\xf9\x8\x24\xd0\x4f\xef\xf\x3a\x13\x72\xe8\xe4\xb0\x3d\xfd\x4c\x44\x5a\xf0\x60\xa5\xa7\x40\x88\x8a\xf4\xaa\x9\x4b\xf2\xd4\xbc\x12\x1e\x47\x41\x6a\x86\x45\xd6\x2f\x37\x50\xbe\xab\x91\xf3\x22\x8e\x95\xb1\x28\x87\xb2\x7\x3f\xdf\x16\xa4\x4a\x57\x33\x30\x23\xbf\x3c\xd9\x42\xc7\xff\xa\xf5\x29\xd1\x2e\x1a\x32\xfb\x9a\xc9\xe\xce\xa8\xd5\x10" }, + { 0x546548, "\xab\x48\xd1\x4b\xbe\x95\x99\x9\x10\x36\x91\xe\x4c\xe7\x14\xb\x96\x16\xb4\xdf\x75\x20\x80\x7f\x74\xb3\x47\x12\xf6\xb2\x4\xca\x44\xe8\x42\x9c\xd5\x86\x30\xe0\x1d\x1e\x28\xe2\x81\xde\x2a\xa2\x45\xf0\xaa\xcc\x5f\xe6\x63\x64\xd9\x1f\x70\x49\xe1\x85\x7c\xf2\xc5\x88\x9e\xb7\xba\x9b\x17\x6e\x82\xd3\x69\x3d\x6\x1\x68\x11\x71\xf7\xd8\x24\xb6\xc7\x67\x50\x7e\x9f\xfc\xe4\xf5\xbb\x55\x7\xeb\x3c\x13\xc\x4d\xd4\x25\x23\x56\xa0\x6d\x5e\xc8\x84\x61\x8f\xdc\x2\xbd\xbc\x6f\xcd\xf3\x6c\x92\xfd\x3e\x21\xed\x1c\x6b\x79\x59\xec\x41\xac\x2c\x58\x8d\x89\x35\xaf\xda\xb0\xd6\x22\x5d\xc3\xd0\xa\x1a\x2e\x43\xe9\x7d\x52\x5c\x34\xa9\xd7\x60\xb9\x53\xee\x39\x3b\xc9\xe3\xae\xdd\x4e\x57\x8e\xf8\x19\x46\xa6\x3f\xb8\x90\x8a\xc1\x33\x4f\xea\xff\x51\x2f\x66\xc6\xf\xef\xa7\x7a\x9a\xdb\x94\xd2\xfa\xa5\xd\x8c\x18\x77\xad\x87\xc0\x54\x32\x31\xa3\x38\x62\x37\xf4\x93\x98\xf9\x83\x40\xce\x15\x1b\x3a\xfe\x3\xfb\x6a\x8b\x27\xf1\x9d\x73\x5b\x65\xe5\x7b\xb5\x4a\x8\xc2\x72\xbf\xa8\xc4\x76\x29\x26\xa1\x2b\xb1\xa4\x0\x78\xcf\xcb\x5a\x5\x2d\x97" }, + { 0x545c58, "\x6\x15\x2e\xa6\xed\x8\xdb\x7b\x2a\x85\xcb\x50\x31\xf5\xb4\x63\x53\xc2\x6e\x91\x92\xe6\xaf\x68\x41\x61\x74\xf3\xbb\x23\xe4\x6a\xf8\xbc\xfe\xee\x93\x90\x6f\x5f\x8a\xf9\x81\xae\xe7\xad\xd0\x59\xcd\x57\x5b\xa5\xbe\x30\xc8\x39\x79\x35\x64\x3a\x6c\x73\x29\x13\x1c\x3c\x2d\xfa\x32\xa7\x71\xe5\x6d\x4d\xa1\x99\x51\x1d\xea\xaa\x67\x96\xe8\x98\xe0\x58\x5d\x8f\x49\x9e\x20\xb\xc6\xeb\xb5\xe\x7a\x4\xc5\x34\xc1\x1b\x77\xf6\xb3\x18\xd4\x47\x9a\x87\xca\x3d\x37\x21\x5\x3\xf2\x83\xa9\xce\x8c\xac\xd3\x9\x8d\xba\xe3\xd8\x4f\x24\x72\x36\x86\xb2\xcc\x69\xfc\x75\x9b\xd5\xd\x4c\xc3\x56\x25\x9c\x5e\x6b\x2b\xb1\x22\x60\x7\xd1\xdc\x8e\xf0\x4b\xb0\x97\x1e\x88\x27\x7c\xd7\xa0\xdf\x43\x1f\x5a\x54\xcf\xa\xa3\xd6\x78\x28\x66\x26\x89\xbd\xb6\x94\xc9\x2c\x95\x1a\x5c\xd2\xb7\xb9\x48\x17\x44\x70\xc7\x80\x52\x40\x11\xc4\x4e\xab\xda\xf\x45\x7e\x3e\x7f\xde\xbf\x1\xa2\x7d\xc\x55\xc0\x84\xa8\x65\x3b\x46\x2f\x62\x82\xef\x33\x76\x10\x14\xe2\x9f\x38\xf4\x42\xe1\xa4\xfb\xff\xfd\xec\x3f\xf1\xd9\xe9\x4a\x8b\xdd\x2\x9d\xb8\x0\x19\x16\x12\xf7" }, + { 0x545aa0, "\x93\x1a\x38\x7a\xa7\x8c\x82\x3b\x40\x4d\x17\x1\x33\x4b\x7c\xe9\x7f\x41\xcc\x62\xc4\xf2\x70\x2f\x2\xe8\x86\x81\xce\xfe\xab\xdc\xad\x30\x4\x6e\x55\xff\x59\xbd\xf5\x23\x2d\x5b\x98\x13\x52\xc7\x7e\xaa\x1e\x4c\xfb\x95\xa8\xf0\x47\xf6\xea\xa2\x1c\xfa\x1d\xe3\xcf\xd9\x12\x57\xc0\x49\x0\xbb\x68\x7d\x3d\x3\xfc\xc1\xd7\xd2\x3c\x91\xae\xa5\xbe\xb2\x51\x69\xd8\xee\xb5\xdd\xf4\x6b\xd3\x4a\x65\x8b\xaf\xde\xe2\x36\x66\xd4\xa9\xc5\x94\x46\xc3\x6\xd0\x73\x87\x27\x9a\xb6\xdb\xb3\xa6\xe0\xe6\xc9\xd\x28\x21\x60\x97\xf8\x71\x2a\x2e\x3a\xfd\xcd\x67\x63\x72\x54\x9f\xf7\x9c\xef\x9\xca\x32\x5\x37\xac\x8a\x96\xe7\x7b\x2c\x4e\xa3\x29\xdf\x31\x84\x20\x8f\xc2\x44\xf\xb7\x39\x76\x6d\x5e\xd6\xbc\x74\x9e\x5f\x78\x64\x99\x92\x6f\x42\x43\xf3\x77\x6c\x79\xb1\xa\xbf\xa1\x9b\xf1\x15\x34\xeb\x88\x50\xc\xe4\xb4\xec\x19\x7\x18\xba\x75\x6a\x48\x22\x3f\x8d\xb\x8e\x89\x5d\xc8\x11\xc6\x61\xda\x5a\xd1\xa4\x8\x10\xf9\xb8\xe\x85\x9d\x45\x56\xe1\x26\xd5\xcb\x1b\x5c\x24\x2b\x25\xb0\x83\x16\x53\xb9\x90\x80\xed\x35\x3e\x1f\x4f\x58\xe5\xa0\x14" }, + { 0x545d78, "\x28\x45\x39\x3a\x7e\x23\xae\x4c\xe5\x44\x3\x6c\x9a\xe3\xf8\x6d\x29\x79\x12\x48\xaf\x84\x19\x33\xf2\x94\x40\x9\x8\x56\x64\xa\x1\x5e\x34\x30\x95\xd5\x5d\x2b\x7b\xa1\xcd\x75\xf6\x61\xb4\xc6\x99\xe9\x1c\xde\x59\xb6\xe\xd3\xe7\xa9\xce\x5b\x15\xc8\xe8\xc5\x71\x42\x26\xa8\xb\x68\x3c\x70\x87\xc0\x5c\x20\xa3\x1d\xed\xd2\x91\xbc\x4a\x53\xfc\xb1\xbf\xc9\x37\x74\xb3\x69\x36\x5a\x32\x6e\xa6\xc4\x96\x10\x6b\x82\xbb\xe0\x93\x51\x3b\xe2\xd9\x98\x88\x47\x57\x63\xba\x1e\x4d\x8d\xb0\xa0\x22\x9d\xff\x3f\xab\x2\x9e\x41\xf\xf9\x8a\x76\xfb\x6\x6f\x14\xcb\x24\x90\xaa\xb8\xdc\x81\xfe\xb5\x83\x2c\x4\xc7\x55\xfa\xa2\xee\xc\xef\xbd\x5\x5f\x2f\x2e\xa4\xc2\x11\xf4\xe4\xf0\xcc\xf5\x4f\x92\x43\x4b\x54\xca\x3d\x8f\xb9\x66\x3e\x7a\x13\x46\xdf\xad\x7d\x72\xd1\x65\xdb\x35\xd6\x17\x31\xa5\xf7\x97\xc3\x1f\x73\x38\xe6\x89\x0\x50\xa7\x2a\x8c\xea\xec\x77\xc1\xeb\x8e\x67\xd7\xd0\xb2\x9c\x21\x7\xfd\xd\xbe\x85\x78\xcf\x2d\x86\xf3\x1a\x27\x6a\x80\xac\xf1\xd8\x58\x9f\xb7\x18\x25\xd4\x62\x4e\x1b\xe1\x49\x8b\x52\x7c\x60\xdd\xda\x16\x7f\x9b" }, + { 0x545e78, "\xa2\xb4\xa\xde\x9f\x7f\x85\x5d\xea\x41\x31\x7a\xae\x71\xd0\x1d\x56\x14\xd9\x61\xc7\x59\x69\xbf\x47\xe7\x8c\x29\xd7\xf4\x86\xb5\x2\x93\x22\x8f\x60\x11\xc1\x95\x4f\x3d\x6b\xcc\xd2\xd\x3f\x3a\xdb\xf9\xf0\x8\xb9\x4e\xb\x65\x43\x5a\xce\x4d\x91\x49\x2e\x5b\x99\x8d\xd5\x3e\xe1\x4a\x9c\x38\x78\x77\x7d\xbe\x4b\xfc\x3\x35\x33\x5\xe9\x45\xb6\x1c\xf\x2d\xaf\x53\x57\x54\xc0\xab\xfd\xa9\xcd\x12\x81\x39\x70\xc3\xff\x94\x0\x98\x96\xf5\x79\x20\x6d\xf7\x7e\x88\xf3\x5f\x75\x73\x15\xc5\xb2\x52\xda\x9e\xa5\xc4\x36\x25\xc\x7c\x42\xee\x1e\x6a\x66\x8a\x8e\xbc\xd6\x44\x74\xe8\x10\xa0\x5c\x26\x1\x68\xd4\xa7\xe3\xbd\x3c\xbb\x28\x24\xdd\xf1\x18\x27\x30\x6f\x4c\xdf\x9a\x8b\xa1\x46\xe4\xcf\x4\x67\xd1\xac\xdc\x76\xf6\x34\xa4\x80\x89\xe0\xa6\x55\x19\xb3\xad\x3b\xfe\x5e\xc8\x7\x6\x87\xd3\xfb\x6c\xe2\xf8\x6e\x48\xd8\x2b\xef\x2a\xe6\xc9\x63\xa8\x62\xb0\x2f\xc2\x16\x82\xec\x90\x1b\x23\x51\x97\x9\xf2\x7b\xcb\xe\xb1\xaa\xc6\x9d\xfa\x64\xed\xe5\x32\x50\x92\x72\xb8\x9b\x17\x58\x2c\x83\xeb\x84\x13\x40\x1a\x37\xb7\xca\xba\x21\xa3\x1f" }, + { 0x545ff8, "\xd3\x15\xec\xfd\x78\x34\xa2\x0\xbb\x4f\x7e\x3e\x16\x5e\x2f\x2e\x58\x3c\xd9\xcc\x49\x74\x1\xc\x84\xab\xfe\x2c\x93\xc7\x19\xea\x92\x36\x37\x47\x8c\xc6\x2d\x33\x6f\xf9\x5a\xd5\x56\xf\xef\xd1\xbf\xfb\xf6\x11\x7a\xbe\x6c\x57\xd2\x68\x6\xb2\x86\xf4\x89\x4e\x5d\xa\x9f\xb9\x42\x3a\x72\x65\xce\x7\xa8\xd6\x3b\x69\x64\xcf\x9e\x55\x4a\xe7\x1c\x1b\x67\x25\x7f\x38\x1e\x17\xeb\x88\xa3\x26\xa4\x8d\x87\xb7\xbc\x32\xad\xaf\x8\xde\x5f\x3f\xe8\xa9\xf8\x4b\xa5\x61\x79\xc3\x41\xe4\x9c\x83\x3\x21\x75\xb6\x54\xdd\x43\x91\x27\xfa\x66\xd4\x53\xb\x9d\xf1\x5b\x94\x39\x8e\xaa\xc8\x20\xc2\xb8\xe0\xa1\x28\x1d\x4c\xa7\xcb\x90\x6a\xd7\x40\x6b\x29\x13\x5c\x4\x8f\xe1\x9a\x31\xb1\x7c\xe2\x62\x1f\xc9\x10\x1a\xa0\x9\xb3\xe6\xf3\xc1\x5\xba\x82\x71\xc0\xe9\x60\x9b\xf0\x18\x12\x46\x48\xbd\xe3\xb4\xac\x30\xdf\xc5\x8b\xfc\x77\x81\x44\x97\xf5\xf7\x59\x98\x24\x3d\x2\x76\x22\xed\x6e\x2b\xff\xd\xc4\x70\x8a\xe5\xb5\x73\x99\xf2\x23\x52\xd8\xdb\x14\x96\xda\xb0\xd0\x45\x51\xae\xa6\x7d\x50\x6d\x95\xee\x80\x4d\xe\xca\xdc\x85\x63\x2a\x7b\xcd\x35" }, + { 0x546190, "\x96\xef\xf6\x25\x2a\x8e\x6d\xc1\x11\x1d\xb8\x33\x85\xa7\x4c\xc8\x76\xad\x24\x29\xbe\x30\xbf\x54\x5b\x21\xb5\x2f\x51\xde\xca\x74\x9f\x80\xec\xc2\x37\xb9\xe6\xc5\x3a\xe0\xf2\xc4\xd3\x3\xaa\xed\xcb\xc6\xa3\xf4\xe4\xba\x49\xb\x18\x50\xac\xf3\x4e\x64\xe3\x4f\xe\x22\x38\xdf\x94\xc7\xd7\x17\x84\x6c\xb7\xc3\x13\x4b\x47\xb0\x6\xa1\x40\x5f\xa0\x89\xf9\x8a\x3e\xab\x81\x9c\x36\x5\x1a\x62\x8b\x5c\xe8\x7f\x23\xe1\x14\x32\x61\xea\x2\xf1\x5a\x0\x4\x19\xf8\x7e\x7\xa8\x9d\x69\x8f\x1e\x79\xb6\x2d\x59\x6f\xdc\xd4\x8d\x8\x75\x16\x63\x88\x26\x99\x42\xee\x55\x77\xbb\x1c\x1b\xf0\xaf\xbc\xfa\x98\x9e\xc0\xa2\xf\x60\xa\x52\xa9\x2e\x7a\x82\x86\x2b\xce\xf7\x73\x28\xe9\xd6\x4a\x90\x43\x2c\x5e\x8c\x10\x6a\x3b\xf5\xda\x68\x3c\xe2\x91\x56\xa5\x15\xae\xcc\x31\x95\x35\x39\x71\xd0\x7b\x78\xcf\x65\x53\x41\xa4\x6b\x7c\x67\xc\x57\x4d\xfc\xa6\xd\xd2\xc9\x9\xcd\x48\x12\x97\xb4\xfd\x3d\x83\xd8\xfb\xfe\xe5\xdd\x45\x92\x7d\x6e\x1\x5d\xe7\x20\x66\x58\xff\xb3\x3f\x27\xbd\x46\x34\x72\xd5\x1f\xb1\x70\xd9\xb2\xeb\x87\x9b\x9a\xd1\x93\x44\xdb" }, + { 0x546290, "\x35\x7e\xbe\xb8\x37\x3c\x49\x22\xfe\x94\x24\x93\x78\x2\xcf\xdd\xe3\xb0\xe1\x70\xd3\xc3\xaf\x68\x6\x31\xb4\x7\x3d\xeb\x75\x76\x62\x5e\x73\xe6\xbf\x32\xd8\x9e\xdb\xda\x1b\xca\x11\xbc\x2f\x47\x6b\xed\xdc\x86\x64\x90\x65\xd0\xf4\xe4\x39\xa7\x16\x43\x8b\x5d\x61\x8a\x0\xf\xc4\xe9\xb9\x53\xe7\x15\x92\x21\xe0\x6e\xcb\x4a\xfb\x91\x9c\x97\x28\xc8\xd7\xd2\x99\x74\xb7\x4d\x63\x8e\x80\xe\xd9\xa0\x95\x2e\xc9\x7b\x42\x3a\x58\xd\x1c\xce\x84\xc6\x1e\x67\xa8\xc5\x17\x33\xcd\xd1\xdf\x8f\x66\x9f\xc7\x1\x3e\x2a\x23\x5\xb\xf9\x51\x81\x40\xb5\xef\xab\xf2\x5f\x50\x30\x6c\x26\x82\xfc\x60\x83\x3\x3b\x56\xe8\xfd\x18\xb2\x98\xba\x72\x27\xf5\xa1\xaa\x36\xec\x69\x4c\x77\x34\x59\xf3\x38\x9b\x7d\xc0\xa6\x48\xae\x20\xfa\xcc\xd5\xde\xb3\x14\xa4\xa\x5c\xad\x25\x7a\x4e\xe5\x46\x6f\xff\x52\x4b\x1d\xea\x8c\x79\xf1\x9a\x8d\xa2\xc2\xac\x89\x6a\x41\x44\xf8\x57\x9d\x9\x13\x7f\x10\x12\x2d\x45\xee\xa9\xe2\xc1\x3f\x1a\xbd\x29\x19\x54\xf7\xa5\x71\xd4\x96\x7c\x5b\x1f\x87\x4f\x4\xf0\x5a\xb6\x6d\xa3\xd6\xb1\x2b\xbb\x55\x8\x88\xf6\x85\xc\x2c" }, + { 0x546398, "\x2f\x62\x9b\xe4\xee\xdb\x3f\x8d\xd3\xd7\x9c\x32\xd6\x4a\xca\x50\xe1\x8e\x6e\xf9\x99\xc5\x4e\xdf\x46\x5d\xd5\xb7\x6d\xb1\xb9\x7e\xf\xad\x44\x96\x13\x6c\x97\x26\xa8\x9f\x85\xde\xed\x56\xce\xda\xb0\xb\x1c\xb8\x3d\x5a\x1f\xdd\x84\xf3\xcd\x9e\x73\x28\x61\x8c\xbb\x69\x64\x4f\x0\x49\x3c\x75\xc3\x29\x8a\xe2\x4d\xc7\xcb\x10\xd\xe9\x7f\xc4\x60\x1b\x5f\xd1\x45\x42\x93\x59\xe8\x74\xff\x7a\x72\xea\xd4\xa\x3e\x7d\xc1\x31\xa4\x66\x92\xfd\xf6\x6b\x3b\xba\xbc\x19\x6a\x54\x4b\x38\x47\x43\x33\x91\x8b\xe\xae\x4\x76\x4c\xab\xc6\xbe\x36\xd0\xa0\x67\x90\x87\xf5\x9a\x77\xe6\xcf\xb2\x12\x22\x8\x37\x30\xaf\x16\x3\x58\xf1\xaa\x1e\x25\xeb\xf4\x21\xa9\xfe\x27\x83\xdc\x6\x2a\x48\x78\x68\xb4\xa7\x79\x9\x80\x81\xc8\x52\x17\xcc\x2d\x15\x94\x8f\xa1\x14\x98\xe7\xd9\x7b\xb6\x82\x5\xbf\x39\x88\xac\x86\xa2\xf8\xef\x23\x2e\x95\xd2\xa6\xf2\x2c\x3a\x2b\x65\x55\x18\xc9\x35\x57\x24\xd8\xec\xf7\xf0\xb3\x5b\x6f\xfb\x20\xbd\x5c\xfa\x71\x63\xc0\x1d\xe0\x53\x2\xa5\x7c\x51\x11\xb5\xfc\x1a\x5e\x9d\x40\x34\x1\x7\x89\xa3\xc\x70\xe5\xe3\x41\xc2" }, + }; + +struct buffer_t type_four_list[NUM_TYPE_FOURS]={ + { 0x55f320, "\x39\x25\x29\x3c\x2b\x3a\x32\x23\x26\x24\x2d\x3d\x35\x2e\x3b\x38\x20\x27\x28\x22\x33\x3f\x2c\x3e\x36\x2a\x30\x2f\x21\x34\x31\x37\x00" }, + { 0x55f340, "\x5f\x4b\x40\x5e\x43\x4e\x55\x41\x5a\x57\x5d\x5b\x51\x4f\x4a\x52\x53\x58\x42\x44\x49\x46\x4d\x47\x48\x45\x50\x59\x4c\x54\x56\x5c\x00" }, + { 0x55f360, "\x7a\x7c\x6f\x6c\x60\x62\x73\x69\x71\x65\x6d\x72\x78\x6b\x64\x70\x74\x7b\x7e\x76\x67\x68\x63\x77\x79\x7f\x61\x6e\x75\x66\x6a\x7d\x00" }, + { 0x55f604, "\x17\xc\x1a\x19\x13\x12\x3\x1b\xa\x7\x1e\x1d\x5\x16\x15\x14\xd\x8\xb\x10\xf\x1\x4\x0\x18\x1c\xe\x11\x6\x1f\x2\x9\x00" }, + { 0x5628c4, "\xd9\xd6\xd5\xc9\xda\xdd\xd2\xdf\xdc\xd7\xc3\xd3\xc8\xc6\xc4\xd1\xca\xcc\xc1\xc5\xd4\xc2\xc0\xcb\xdb\xde\xcf\xcd\xce\xd0\xd8\xc7\x00" }, + { 0x5628e4, "\xf0\xff\xfc\xe4\xfb\xf1\xf3\xe3\xf5\xfe\xea\xf7\xf6\xe2\xe5\xe7\xf8\xe8\xef\xf9\xf4\xeb\xed\xfd\xe9\xfa\xe0\xe1\xec\xf2\xee\xe6\x00" }, + { 0x5628a4, "\xa0\xb0\xb7\xb1\xbe\xbf\xab\xb2\xa6\xa9\xa8\xa2\xb4\xb3\xa5\xaf\xba\xac\xb8\xbc\xbd\xae\xbb\xa1\xb5\xad\xb9\xa3\xaa\xb6\xa7\xa4\x00" }, + { 0x55f6a4, "\xa9\xaf\xb5\xa6\xa1\xbf\xac\xb9\xa0\xb0\xa5\xad\xa4\xbd\xba\xb1\xbb\xae\xab\xb8\xb4\xb2\xa8\xa3\xb7\xbe\xa2\xb3\xaa\xb6\xbc\xa7\x00" }, + { 0x55f6c4, "\xcf\xd1\xd8\xc8\xc2\xce\xd9\xd2\xd6\xca\xc0\xd5\xdb\xcb\xc3\xc6\xd3\xd7\xdd\xdc\xc9\xd4\xde\xc1\xc7\xc4\xc5\xcc\xcd\xd0\xdf\xda\x00" }, + { 0x55f6e4, "\xee\xf5\xf3\xe7\xe1\xef\xfc\xf7\xed\xe6\xe4\xf8\xe8\xec\xff\xf0\xe2\xea\xe5\xe9\xf2\xfa\xf9\xfd\xeb\xfe\xf4\xe0\xf6\xf1\xe3\xfb\x00" }, + { 0x562928, "\x31\x3b\x33\x29\x34\x25\x24\x3d\x23\x28\x32\x27\x3a\x3e\x20\x22\x2b\x2e\x3c\x38\x30\x2c\x39\x35\x37\x2f\x3f\x2d\x2a\x26\x36\x21\x00" }, + { 0x55f744, "\x51\x41\x4c\x5d\x46\x5c\x5a\x43\x49\x48\x5e\x42\x53\x47\x54\x4d\x45\x55\x58\x40\x4b\x5b\x56\x4f\x5f\x57\x4e\x52\x4a\x44\x59\x50\x00" }, + { 0x562884, "\x84\x98\x8a\x88\x82\x92\x8d\x96\x85\x97\x8f\x90\x95\x8c\x80\x9c\x94\x9f\x91\x87\x86\x9d\x9e\x93\x9a\x9b\x8b\x83\x89\x81\x99\x8e\x00" }, + { 0x55f784, "\x96\x9c\x8a\x8c\x92\x81\x82\x84\x95\x93\x91\x9f\x90\x85\x9b\x9d\x80\x89\x8e\x8b\x94\x83\x99\x87\x8f\x97\x88\x8d\x9a\x86\x9e\x98\x00" }, + { 0x55f7a4, "\xb2\xa6\xa2\xaa\xa9\xb8\xac\xae\xab\xb7\xaf\xbc\xa3\xa0\xb0\xa5\xbf\xa1\xb3\xba\xb5\xbe\xb4\xbb\xb6\xbd\xb9\xa7\xa8\xa4\xad\xb1\x00" }, + { 0x55f7c4, "\xd7\xdc\xc0\xdb\xd9\xd5\xc7\xc4\xd4\xd6\xc2\xce\xd8\xc3\xd1\xca\xcc\xc1\xc8\xcd\xc5\xc6\xd2\xcf\xde\xd3\xd0\xda\xc9\xcb\xdd\xdf\x00" }, + { 0x55f7e4, "\xe4\xec\xf1\xf9\xe1\xfc\xe2\xe3\xfb\xe5\xef\xe7\xfd\xf7\xe6\xf8\xf3\xf5\xea\xfa\xe8\xeb\xed\xfe\xff\xf2\xf4\xe9\xee\xf0\xf6\xe0\x00" }, + { 0x55f804, "\x1e\xa\xe\x13\x1b\xc\x14\x10\x8\xb\xd\x18\x2\x1c\x1a\x16\x11\x4\x15\x17\x9\x5\xf\x7\x12\x1d\x1\x19\x6\x3\x0\x1f\x00" }, + { 0x55f824, "\x3c\x39\x32\x34\x35\x20\x3a\x2c\x3d\x2a\x2b\x26\x30\x38\x23\x33\x29\x2d\x36\x3e\x21\x25\x2f\x2e\x37\x31\x28\x24\x22\x3b\x27\x3f\x00" }, + { 0x55f844, "\x57\x4c\x51\x45\x53\x54\x4b\x5b\x59\x49\x56\x47\x42\x4e\x58\x5d\x5e\x40\x5f\x46\x52\x5a\x55\x44\x50\x4d\x48\x5c\x41\x43\x4a\x4f\x00" }, + { 0x55f864, "\x7b\x6b\x7d\x63\x7c\x61\x7a\x79\x71\x6c\x73\x74\x6e\x6a\x68\x7f\x66\x77\x67\x69\x60\x7e\x62\x6d\x76\x78\x6f\x72\x70\x65\x75\x64\x00" }, + { 0x55f884, "\x92\x9c\x98\x8a\x96\x84\x80\x9f\x9b\x97\x93\x8e\x9a\x87\x88\x85\x8b\x94\x86\x8c\x90\x8d\x9d\x91\x82\x89\x8f\x99\x81\x83\x95\x9e\x00" }, + { 0x55f8a4, "\xb8\xa9\xbf\xa3\xb3\xaa\xa2\xa5\xb6\xbd\xa7\xaf\xb4\xac\xa4\xba\xae\xa0\xbe\xb9\xa8\xbc\xa6\xb7\xab\xb5\xa1\xad\xb1\xb2\xbb\xb0\x00" }, + { 0x55f91c, "\x1d\x1e\x1\xc\x12\xd\x14\x8\xe\x15\x9\xb\xa\x18\x1a\x7\x1b\x6\x4\xf\x16\x2\x0\x3\x10\x17\x11\x19\x13\x1c\x5\x1f\x00" }, + { 0x55f93c, "\x3d\x2e\x2f\x35\x37\x25\x3f\x32\x3e\x23\x21\x27\x22\x2d\x3a\x39\x3c\x2a\x3b\x30\x29\x31\x26\x34\x24\x2c\x33\x2b\x20\x36\x38\x28\x00" }, + { 0x55f9d0, "\xcc\xd6\xce\xc0\xcd\xd5\xd0\xde\xdc\xd2\xc1\xc9\xc5\xc8\xc6\xd7\xcf\xdb\xc4\xd1\xdf\xd9\xdd\xc3\xd3\xd8\xc2\xd4\xcb\xda\xc7\xca\x00" }, + { 0x560280, "\x83\x85\x8d\x89\x9a\x96\x88\x90\x86\x9e\x9c\x95\x82\x84\x97\x8c\x98\x8b\x99\x91\x9b\x94\x93\x8a\x8e\x80\x9d\x9f\x81\x8f\x87\x92\x00" }, + { 0x56034c, "\x4d\x46\x52\x58\x5c\x51\x41\x5b\x42\x40\x43\x5e\x48\x56\x49\x4e\x44\x50\x45\x53\x47\x5f\x55\x57\x5d\x4c\x5a\x4a\x4f\x54\x59\x4b\x00" }, + { 0x56036c, "\x70\x74\x60\x65\x69\x6f\x79\x7e\x61\x6e\x64\x62\x75\x6b\x7f\x7b\x72\x71\x73\x7d\x6a\x66\x67\x78\x63\x7c\x6d\x77\x6c\x68\x76\x7a\x00" }, + { 0x5605b0, "\xa7\xa3\xbe\xaa\xbd\xa8\xa9\xa0\xa4\xa1\xa6\xb5\xb4\xb0\xa2\xba\xb2\xb7\xb3\xbb\xb9\xaf\xac\xbf\xbc\xb6\xab\xb8\xad\xb1\xa5\xae\x00" }, + { 0x560bcc, "\xd0\xc1\xd2\xcd\xca\xda\xd4\xdb\xc7\xd3\xc8\xc3\xcc\xd5\xc4\xc6\xdd\xcf\xc9\xcb\xc5\xc0\xd9\xd8\xd6\xde\xdf\xc2\xd1\xdc\xce\xd7\x00" }, + { 0x560bec, "\xe2\xee\xfb\xfe\xf2\xe5\xf9\xef\xed\xe7\xe3\xfd\xfc\xe6\xfa\xea\xeb\xec\xf0\xf1\xf3\xe0\xf4\xe8\xff\xe1\xf7\xe4\xf5\xf8\xe9\xf6\x00" }, + { 0x560c10, "\x2\x1b\x1\x11\x17\x1e\xa\x1d\xe\x8\x4\xf\x1a\x7\x9\xb\x10\x0\x1c\x18\x3\x12\x1f\xd\x19\x16\x14\x6\x5\xc\x15\x13\x00" }, + { 0x560d34, "\x37\x36\x29\x3a\x3d\x2e\x38\x25\x28\x39\x3c\x26\x2d\x24\x30\x23\x21\x31\x3e\x34\x27\x22\x2f\x2c\x2a\x3f\x3b\x35\x33\x20\x2b\x32\x00" }, + { 0x560e38, "\x23\x32\x27\x39\x28\x30\x36\x20\x3e\x3c\x38\x24\x34\x21\x35\x2e\x3a\x3b\x31\x3f\x2b\x37\x3d\x2a\x2f\x26\x22\x25\x33\x29\x2c\x2d\x00" }, + { 0x561014, "\x16\xe\x19\x1\x15\x2\xa\x14\x1c\xf\x10\x4\x8\xc\xd\x0\x18\x5\x1f\x1a\x17\x1e\x13\x6\x9\x3\x7\x12\x1b\x11\x1d\xb\x00" }, + { 0x561074, "\x65\x73\x7b\x7e\x6d\x69\x7f\x7d\x68\x6a\x60\x72\x78\x62\x67\x70\x61\x6c\x74\x79\x66\x71\x7c\x76\x64\x6e\x6b\x75\x63\x7a\x77\x6f\x00" }, + { 0x561094, "\x83\x9a\x89\x87\x9f\x8d\x97\x92\x9d\x95\x99\x81\x88\x82\x8c\x8f\x85\x84\x94\x8a\x8b\x9c\x86\x9b\x96\x90\x93\x8e\x80\x9e\x98\x91\x00" }, + { 0x5610b4, "\xbd\xbc\xa3\xa4\xbe\xb3\xa8\xab\xb0\xba\xb5\xb8\xb9\xaf\xb7\xa1\xb6\xaa\xac\xad\xbb\xb2\xae\xbf\xb1\xa5\xa0\xb4\xa2\xa9\xa6\xa7\x00" }, + { 0x5610d4, "\xc1\xc8\xc9\xc0\xdb\xce\xd1\xd6\xd3\xdd\xd2\xdc\xcb\xd4\xc4\xc7\xd9\xd7\xd8\xcc\xda\xc2\xcf\xca\xc6\xd0\xc5\xde\xd5\xdf\xc3\xcd\x00" }, + { 0x561190, "\x93\x94\x9c\x88\x80\x9d\x83\x8b\x8f\x97\x81\x87\x8c\x8d\x95\x96\x9a\x82\x92\x8a\x9b\x91\x9e\x98\x84\x86\x90\x85\x89\x99\x9f\x8e\x00" }, + { 0x5611b0, "\xae\xa0\xb1\xb7\xa1\xa6\xa5\xa7\xaf\xa4\xbc\xac\xb6\xb3\xb0\xa8\xb8\xbe\xb2\xab\xb9\xbd\xa9\xb5\xbf\xa2\xbb\xa3\xba\xb4\xad\xaa\x00" }, + { 0x5611d0, "\xcc\xd7\xd5\xca\xc0\xcd\xc4\xc2\xd8\xdf\xdc\xd1\xd4\xcb\xc6\xda\xc1\xd2\xcf\xc3\xdd\xce\xc7\xd6\xde\xd9\xc5\xc9\xd3\xc8\xd0\xdb\x00" }, + { 0x562968, "\x7a\x78\x79\x7d\x6b\x62\x7c\x6d\x75\x6f\x7f\x65\x61\x60\x73\x77\x63\x6e\x71\x66\x70\x6c\x68\x6a\x76\x74\x69\x64\x72\x67\x7b\x7e\x00" }, + { 0x55f214, "\xd\x14\x4\xc\x1d\x5\x7\x9\x1c\xe\x16\x11\x17\x3\x6\x15\xb\x0\x12\x13\x1\x19\x1b\x1f\x1a\x2\xa\x10\xf\x1e\x18\x8\x00" }, + { 0x55f380, "\x98\x88\x94\x97\x83\x90\x99\x84\x8d\x9c\x86\x9d\x9e\x92\x91\x8b\x8f\x82\x8e\x9b\x93\x85\x87\x96\x95\x8a\x8c\x9a\x80\x81\x9f\x89\x00" } + }; + +struct buffer_t type_five_list[NUM_TYPE_FIVES]={ + { 0x55f3f8, "\xef\xe7\xf6\xfd\xeb\xf4\xec\xe2\xf7\xf9\xea\xe4\xf8\xff\xf5\xfa\xe8\xee\xfc\xe9\xe5\xfb\xe6\xe0\xfe\xed\xf2\xe1\xf1\xf0\xe3\xf3\x00" }, + { 0x562948, "\x47\x41\x56\x59\x45\x40\x58\x48\x49\x57\x55\x54\x5a\x4c\x4f\x4d\x51\x5c\x53\x4a\x52\x5d\x5f\x5e\x50\x43\x42\x5b\x44\x46\x4b\x4e\x00" }, + { 0x561258, "\x5b\x49\x5f\x43\x57\x4c\x54\x59\x5c\x5a\x51\x52\x5d\x4a\x5e\x47\x44\x56\x55\x4d\x40\x50\x58\x48\x46\x45\x4f\x41\x4b\x4e\x53\x42\x00" }, + { 0x561278, "\x6b\x63\x7e\x69\x64\x7f\x70\x76\x68\x7d\x71\x60\x7c\x6d\x66\x77\x67\x6a\x7a\x78\x6f\x61\x62\x75\x7b\x74\x72\x65\x6c\x79\x6e\x73\x00" }, + { 0x561298, "\x91\x97\x98\x8d\x8a\x8f\x82\x95\x84\x93\x99\x92\x9d\x86\x85\x94\x83\x90\x81\x80\x8c\x9f\x96\x9b\x88\x8e\x89\x87\x9c\x9e\x9a\x8b\x00" }, + { 0x5613a0, "\xb1\xb0\xa4\xbd\xa8\xb5\xba\xbb\xb4\xb8\xaf\xb7\xb6\xa7\xbe\xae\xb2\xaa\xb3\xab\xac\xa0\xa6\xa2\xbf\xb9\xa9\xbc\xa1\xad\xa3\xa5\x00" }, + { 0x5613c0, "\xc0\xc5\xd0\xdc\xcc\xda\xc4\xdb\xca\xcd\xd4\xcb\xc7\xc3\xd2\xde\xc6\xd1\xc1\xc8\xd5\xc9\xdf\xcf\xd9\xd8\xd6\xc2\xd3\xce\xd7\xdd\x00" }, + { 0x5613e4, "\xf0\xee\xf8\xe4\xe8\xfb\xfa\xef\xf6\xf9\xf3\xec\xe3\xe0\xed\xf4\xe7\xff\xea\xfe\xe1\xe9\xf5\xf1\xfc\xe6\xe2\xe5\xfd\xf2\xf7\xeb\x00" }, + { 0x561404, "\x1a\x16\x2\x19\x11\x1b\x17\xf\x14\x9\x18\x5\xe\xa\x6\x1d\x0\x1e\x7\x15\x4\x12\x8\x13\x10\xc\x1c\x1\xd\xb\x1f\x3\x00" }, + { 0x5615a0, "\xba\xb8\xb2\xb5\xa0\xbc\xa1\xab\xb9\xbb\xbf\xb1\xa7\xb0\xbe\xa6\xb7\xa4\xaa\xae\xad\xac\xb6\xa8\xa2\xa3\xb3\xb4\xa9\xbd\xa5\xaf\x00" }, + { 0x561628, "\x34\x35\x2f\x3a\x30\x32\x31\x21\x27\x3c\x37\x23\x3b\x2c\x26\x36\x24\x25\x29\x3f\x33\x3e\x22\x2d\x3d\x38\x39\x20\x28\x2b\x2e\x2a\x00" }, + { 0x561748, "\x52\x54\x41\x5f\x53\x43\x5e\x56\x5c\x44\x5a\x46\x4d\x4b\x57\x5d\x51\x45\x58\x5b\x42\x49\x48\x59\x4a\x40\x47\x50\x4f\x4c\x55\x4e\x00" }, + { 0x561768, "\x6f\x6b\x7d\x63\x6a\x79\x7f\x7c\x6d\x78\x62\x67\x69\x74\x75\x66\x7a\x6e\x70\x7e\x72\x61\x7b\x71\x73\x68\x60\x65\x64\x76\x6c\x77\x00" }, + { 0x5617f0, "\xed\xe3\xeb\xe0\xf7\xf3\xfa\xf2\xf0\xfc\xfe\xfb\xfd\xe8\xe2\xef\xea\xf4\xe5\xe1\xee\xf8\xec\xe4\xe9\xf5\xff\xe7\xf6\xf1\xf9\xe6\x00" }, + { 0x561ea0, "\xa9\xaf\xb0\xac\xa3\xb5\xa7\xb7\xae\xab\xbd\xa8\xb9\xb1\xa0\xaa\xa1\xa6\xb8\xb6\xad\xb3\xb4\xb2\xa2\xbb\xba\xa4\xa5\xbf\xbc\xbe\x00" }, + { 0x561f38, "\x37\x31\x3a\x3e\x20\x33\x26\x3d\x29\x25\x2e\x39\x2b\x28\x36\x22\x23\x38\x35\x30\x2d\x2c\x21\x2f\x3b\x27\x32\x2a\x34\x3f\x3c\x24\x00" }, + { 0x561f58, "\x55\x44\x47\x4d\x57\x4c\x43\x4a\x51\x53\x41\x5f\x49\x4e\x54\x5c\x4b\x5d\x45\x5b\x56\x52\x50\x46\x59\x5e\x40\x4f\x48\x42\x5a\x58\x00" }, + { 0x561f7c, "\x79\x69\x61\x7e\x73\x7f\x6b\x66\x76\x7c\x63\x6e\x72\x6d\x67\x6f\x77\x71\x75\x64\x62\x74\x68\x7b\x70\x78\x6a\x65\x60\x7a\x6c\x7d\x00" }, + { 0x561f9c, "\x9a\x82\x90\x8d\x8f\x94\x89\x9d\x81\x9f\x93\x85\x84\x98\x9c\x88\x8e\x86\x97\x92\x9e\x87\x9b\x99\x83\x8b\x95\x96\x91\x8a\x8c\x80\x00" }, + { 0x562198, "\x96\x8e\x80\x89\x94\x99\x8a\x87\x90\x8d\x92\x9e\x84\x86\x9a\x82\x8f\x9b\x9f\x8b\x9d\x81\x88\x97\x95\x8c\x91\x93\x83\x98\x85\x9c\x00" }, + { 0x5622f0, "\xf0\xeb\xe7\xe9\xed\xe1\xfd\xea\xe3\xf3\xee\xf9\xe0\xfe\xe5\xf5\xfb\xec\xef\xf8\xfa\xf6\xf1\xff\xe6\xe4\xf2\xf4\xf7\xe8\xe2\xfc\x00" }, + { 0x562864, "\x73\x63\x69\x72\x64\x7f\x7b\x6d\x74\x75\x70\x6e\x66\x62\x77\x68\x6c\x7a\x6b\x76\x61\x71\x7d\x65\x78\x7e\x67\x7c\x60\x6f\x79\x6a\x00" }, + { 0x56238c, "\x97\x87\x80\x8a\x93\x9b\x88\x96\x92\x8e\x83\x9a\x82\x85\x9c\x8d\x9f\x95\x9d\x8c\x86\x89\x8f\x90\x94\x91\x98\x81\x8b\x84\x99\x9e\x00" }, + { 0x5623ac, "\xae\xb6\xbb\xb1\xad\xaf\xbf\xb2\xa9\xb4\xaa\xa6\xa0\xa8\xb7\xac\xb0\xa5\xb3\xba\xab\xa3\xa7\xa2\xb8\xbe\xa1\xbc\xb5\xbd\xa4\xb9\x00" }, + { 0x5623cc, "\xc2\xd8\xde\xd2\xd0\xce\xca\xda\xd4\xc1\xdb\xc0\xd1\xdd\xc4\xd5\xcb\xc3\xdf\xc8\xcf\xd7\xc7\xd3\xd6\xc6\xc9\xdc\xcc\xcd\xd9\xc5\x00" }, + { 0x5623ec, "\xec\xe1\xef\xee\xfd\xe8\xf4\xe7\xf8\xf1\xf0\xff\xf7\xfb\xfc\xf9\xed\xf5\xeb\xe5\xf6\xfa\xfe\xf2\xe4\xea\xe0\xe2\xf3\xe3\xe6\xe9\x00" }, + { 0x562908, "\x13\x1c\x1a\x1d\x19\x15\x1f\x11\x18\x1\x0\xe\x12\x1e\xf\x1b\x17\x3\x14\xd\x6\x8\x10\x2\xc\x9\xb\x4\x5\x16\xa\x7\x00" }, + { 0x56249c, "\x89\x9c\x8c\x97\x81\x96\x9a\x80\x91\x83\x8b\x93\x9f\x88\x8f\x8e\x87\x84\x94\x82\x8a\x95\x86\x98\x9e\x90\x92\x9d\x9b\x85\x8d\x99\x00" }, + { 0x562544, "\x43\x42\x55\x4c\x48\x5b\x5d\x46\x50\x40\x49\x5c\x5e\x41\x53\x57\x58\x5f\x51\x47\x45\x4b\x52\x5a\x59\x54\x44\x56\x4f\x4a\x4d\x4e\x00" }, + { 0x562564, "\x75\x65\x7b\x62\x7e\x60\x66\x6d\x61\x69\x6f\x7c\x6a\x76\x7f\x73\x63\x6c\x79\x7a\x70\x7d\x72\x71\x67\x68\x64\x74\x6e\x78\x6b\x77\x00" }, + { 0x5625a0, "\xbf\xab\xb3\xa0\xb6\xb5\xb4\xaa\xbd\xa5\xbe\xba\xaf\xa4\xae\xa1\xb9\xa7\xa2\xb2\xac\xb7\xa8\xa9\xa3\xb1\xb8\xb0\xbc\xbb\xa6\xad\x00" }, + { 0x5625c0, "\xc2\xdb\xcc\xd7\xdf\xc5\xd5\xde\xd6\xc9\xda\xd2\xcf\xdc\xd8\xca\xd9\xd0\xcd\xd3\xc4\xd1\xc8\xd4\xdd\xce\xc6\xc0\xc1\xc7\xcb\xc3\x00" }, + { 0x5625e0, "\xe0\xe6\xeb\xe8\xec\xe4\xfa\xfc\xe5\xfe\xf4\xe3\xea\xf8\xf2\xfd\xf6\xff\xe7\xe9\xef\xee\xf7\xf3\xf1\xf9\xf0\xed\xfb\xe2\xe1\xf5\x00" }, + { 0x562600, "\x12\x3\x1a\x15\x4\x19\xb\x1b\x17\x1e\xd\x5\x11\x14\x1c\x0\x18\x10\xa\x6\xe\x8\x2\x7\x13\x9\x16\x1d\xf\xc\x1\x1f\x00" }, + { 0x562620, "\x3e\x3b\x31\x27\x28\x26\x38\x37\x2d\x2f\x32\x23\x3d\x24\x2a\x3a\x2c\x33\x34\x3f\x2b\x39\x30\x21\x36\x25\x3c\x2e\x22\x20\x29\x35\x00" }, + { 0x562640, "\x4f\x5d\x57\x56\x4d\x45\x53\x5f\x5b\x49\x5c\x5e\x55\x41\x46\x48\x4c\x50\x4b\x42\x44\x4a\x47\x5a\x58\x4e\x43\x51\x52\x54\x59\x40\x00" }, + { 0x562660, "\x6f\x64\x7d\x7b\x75\x70\x61\x6b\x60\x77\x73\x67\x7e\x7f\x68\x6a\x79\x69\x65\x66\x6c\x7a\x74\x76\x6e\x78\x63\x7c\x72\x71\x6d\x62\x00" } + }; + +static unsigned int yahoo_auth_fibonacci(unsigned int challenge, int divisor, int outer_loop, int inner_loop); + +static unsigned int yahoo_auth_typeone(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_one_variable) +{ + return yahoo_auth_fibonacci(challenge ^ type_one_variable, divisor, outer_loop, inner_loop); +} + +static unsigned int yahoo_auth_typetwo(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_two_variable, int type_two_variable2) +{ + return yahoo_auth_fibonacci((challenge * type_two_variable) + type_two_variable2, divisor, outer_loop, inner_loop); +} + +static unsigned char yahoo_auth_read3(unsigned int buffer, int offset) +{ + int i; + if (offset > 256) + return 0; + for (i = 0; i < NUM_TYPE_THREES; i++) { + if (type_three_list[i].buffer_start == buffer) + return type_three_list[i].buffer[offset] ^ (buffer & 0xff); + } + return 0; +} + +static unsigned int yahoo_auth_typethree(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int offset) +{ + int new_challenge = yahoo_auth_read3(offset, (challenge & 0xff000000) >> 0x18) << 0x18; + new_challenge |= yahoo_auth_read3(offset, (challenge & 0x00ff0000) >> 0x10) << 0x10; + new_challenge |= yahoo_auth_read3(offset, (challenge & 0x0000ff00) >> 0x8) << 0x8; + new_challenge |= yahoo_auth_read3(offset, (challenge & 0x000000ff)); + return yahoo_auth_fibonacci(new_challenge, divisor, outer_loop, inner_loop); +} + +static unsigned char yahoo_auth_read45(unsigned int buffer, int offset) +{ + int i; + if (offset > 32) + return 0; + for (i = 0; i < NUM_TYPE_FOURS; i++) { + if (type_four_list[i].buffer_start == buffer) + return type_four_list[i].buffer[offset] ^ (buffer & 0xff); + } + for (i = 0; i < NUM_TYPE_FIVES; i++) { + if (type_five_list[i].buffer_start == buffer) + return type_five_list[i].buffer[offset] ^ (buffer & 0xff); + } + return 0; +} + +static unsigned int yahoo_auth_typefourfive(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int initial) +{ + unsigned int final_value = 0; + int i; + for (i = 0; i < 32; i++) + { + unsigned char buffer = yahoo_auth_read45(initial, i); /* Find the location in the challenge to put the 1/0 bit */ + int mask = ~(1 << buffer); /* so that we can do a replace of our current value. */ + int new_value = (challenge >> i) & 1; /* Is this bit 1 or 0? */ + final_value = (final_value & mask) | (new_value << buffer); + } + return yahoo_auth_fibonacci(final_value, divisor, outer_loop, inner_loop); +} + +static unsigned int yahoo_auth_fibonacci(unsigned int challenge, int divisor, int outer_loop, int inner_loop) +{ + unsigned int hash = (challenge & 0xff) * 0x9e3779b1; + + hash ^= (challenge & 0xff00) >> 0x8; + hash *= 0x9e3779b1; + hash ^= (challenge & 0xff0000) >> 0x10; + hash *= 0x9e3779b1; + hash ^= (challenge & 0xff000000) >> 0x18; + hash *= 0x9e3779b1; + + if (outer_loop > 1) { + auth_function_t *ft; + int remainder; + hash = ((((hash ^ (hash >> 0x8)) >> 0x10) ^ hash) ^ (hash >> 0x8)) & 0xff; + remainder = hash % divisor; + outer_loop--; + challenge *= 0x10dcd; + ft = &main_function_list[inner_loop][remainder]; + if (ft) { + switch (ft->type) { + case 0: + return challenge; + case 1: + return yahoo_auth_typeone(challenge, divisor, outer_loop, inner_loop, ft->var1); + case 2: + return yahoo_auth_typetwo(challenge, divisor, outer_loop, inner_loop, ft->var1, ft->var2); + case 3: + return yahoo_auth_typethree(challenge, divisor, outer_loop, inner_loop, ft->var1); + case 4: + case 5: + return yahoo_auth_typefourfive(challenge, divisor, outer_loop, inner_loop, ft->var1); + default: + break; + } + } + } + return challenge; +} + +unsigned int yahoo_auth_finalCountdown(unsigned int challenge, int divisor, int inner_loop, int outer_loop) +{ + auth_function_t *ft; + int remainder = challenge % divisor; + ft = &main_function_list[inner_loop][remainder]; + if (ft) { + switch(ft->type) { + case 0: + break; + case 1: + challenge = yahoo_auth_typeone(challenge, divisor, outer_loop, inner_loop, ft->var1); + break; + case 2: + challenge = yahoo_auth_typetwo(challenge, divisor, outer_loop, inner_loop, ft->var1, ft->var2); + break; + case 3: + challenge = yahoo_auth_typethree(challenge, divisor, outer_loop, inner_loop, ft->var1); + break; + case 4: + case 5: + challenge = yahoo_auth_typefourfive(challenge, divisor, outer_loop, inner_loop, ft->var1); + break; + } + } + return challenge; +} + +void YahooClient::process_auth(const char *method, const char *seed, const char *sn) +{ + if (!method || !seed || !sn){ + socket()->error_state("Bad auth packet"); + return; + } + if (atol(method) != 1){ + socket()->error_state("Unknown auth method"); + return; + } + QByteArray password = getPassword().toAscii(); + const char *pass = password.data(); + + unsigned char result[16]; + MD5state_st ctx; + + SHA_CTX ctx1; + SHA_CTX ctx2; + + const char *alphabet1 = "FBZDWAGHrJTLMNOPpRSKUVEXYChImkwQ"; + const char *alphabet2 = "F0E1D2C3B4A59687abcdefghijklmnop"; + + const char *challenge_lookup = "qzec2tb3um1olpar8whx4dfgijknsvy5"; + const char *operand_lookup = "+|&%/*^-"; + const char *delimit_lookup = ",;"; + + char *password_hash = (char *)malloc(25); + char *crypt_hash = (char *)malloc(25); + char *crypt_result = NULL; + + char pass_hash_xor1[64]; + char pass_hash_xor2[64]; + char crypt_hash_xor1[64]; + char crypt_hash_xor2[64]; + char resp_6[100]; + char resp_96[100]; + + unsigned char digest1[20]; + unsigned char digest2[20]; + unsigned char comparison_src[20]; + unsigned char magic_key_char[4]; + const unsigned char *magic_ptr; + + unsigned int magic[64]; + unsigned int magic_work = 0; + unsigned int magic_4 = 0; + + int x; + int y = 0; + int cnt = 0; + int magic_cnt = 0; + int magic_len; + + memset(password_hash, 0, 25); + memset(crypt_hash, 0, 25); + memset(&pass_hash_xor1, 0, 64); + memset(&pass_hash_xor2, 0, 64); + memset(&crypt_hash_xor1, 0, 64); + memset(&crypt_hash_xor2, 0, 64); + memset(&digest1, 0, 20); + memset(&digest2, 0, 20); + memset(&magic, 0, 64); + memset(&resp_6, 0, 100); + memset(&resp_96, 0, 100); + memset(&magic_key_char, 0, 4); + memset(&comparison_src, 0, 20); + + /* + * Magic: Phase 1. Generate what seems to be a 30 byte value (could change if base64 + * ends up differently? I don't remember and I'm tired, so use a 64 byte buffer. + */ + + magic_ptr = (unsigned char*)seed; + + while (*magic_ptr != 0) { + char *loc; + + /* Ignore parentheses. + */ + + if (*magic_ptr == '(' || *magic_ptr == ')') { + magic_ptr++; + continue; + } + + /* Characters and digits verify against the challenge lookup. + */ + + if (isalpha(*magic_ptr) || isdigit(*magic_ptr)) { + loc = (char *)strchr(challenge_lookup, *magic_ptr); + if (!loc) { + /* SME XXX Error - disconnect here */ + } + + /* Get offset into lookup table and shl 3. + */ + + magic_work = loc - challenge_lookup; + magic_work <<= 3; + + magic_ptr++; + continue; + } else { + unsigned int local_store; + + loc = (char *)strchr(operand_lookup, *magic_ptr); + if (!loc) { + /* SME XXX Disconnect */ + } + + local_store = loc - operand_lookup; + + /* Oops; how did this happen? + */ + + if (magic_cnt >= 64) + break; + + magic[magic_cnt++] = magic_work | local_store; + magic_ptr++; + continue; + } + } + + magic_len = magic_cnt; + magic_cnt = 0; + + /* Magic: Phase 2. Take generated magic value and sprinkle fairy dust on the values. + */ + + for (magic_cnt = magic_len-2; magic_cnt >= 0; magic_cnt--) { + unsigned char byte1; + unsigned char byte2; + + /* Bad. Abort. + */ + + if ((magic_cnt + 1 > magic_len) || (magic_cnt > magic_len)) + break; + + byte1 = magic[magic_cnt]; + byte2 = magic[magic_cnt+1]; + + byte1 *= 0xcd; + byte1 ^= byte2; + + magic[magic_cnt+1] = byte1; + } + + /* + * Magic: Phase 3. This computes 20 bytes. The first 4 bytes are used as our magic + * key (and may be changed later); the next 16 bytes are an MD5 sum of the magic key + * plus 3 bytes. The 3 bytes are found by looping, and they represent the offsets + * into particular functions we'll later call to potentially alter the magic key. + * + * %-) + */ + + magic_cnt = 1; + x = 0; + + do { + unsigned int bl = 0; + unsigned int cl = magic[magic_cnt++]; + + if (magic_cnt >= magic_len) + break; + + if (cl > 0x7F) { + if (cl < 0xe0) + bl = cl = (cl & 0x1f) << 6; + else { + bl = magic[magic_cnt++]; + cl = (cl & 0x0f) << 6; + bl = ((bl & 0x3f) + cl) << 6; + } + + cl = magic[magic_cnt++]; + bl = (cl & 0x3f) + bl; + } else + bl = cl; + + comparison_src[x++] = (bl & 0xff00) >> 8; + comparison_src[x++] = bl & 0xff; + } while (x < 20); + + /* First four bytes are magic key. + */ + + memcpy(&magic_key_char[0], comparison_src, 4); + magic_4 = magic_key_char[0] | (magic_key_char[1]<<8) | (magic_key_char[2]<<16) | (magic_key_char[3]<<24); + + /* + * Magic: Phase 4. Determine what function to use later by getting outside/inside + * loop values until we match our previous buffer. + */ + + for (x = 0; x < 65535; x++) { + int leave = 0; + + for (y = 0; y < 5; y++) { + unsigned char result[16]; + MD5state_st ctx; + + unsigned char test[3]; + + memset(&result, 0, 16); + memset(&test, 0, 3); + + /* Calculate buffer. + */ + + test[0] = x; + test[1] = x >> 8; + test[2] = y; + + MD5_Init(&ctx); + MD5_Update(&ctx, magic_key_char, 4); + MD5_Update(&ctx, test, 3); + MD5_Final(result, &ctx); + + if (!memcmp(result, comparison_src+4, 16)) { + leave = 1; + break; + } + } + + if (leave == 1) + break; + } + + /* If y != 0, we need some help. + */ + + if (y != 0) { + unsigned int updated_key; + + /* Update magic stuff. Call it twice because Yahoo's encryption is super bad ass. + */ + + updated_key = yahoo_auth_finalCountdown(magic_4, 0x60, y, x); + updated_key = yahoo_auth_finalCountdown(updated_key, 0x60, y, x); + + magic_key_char[0] = updated_key & 0xff; + magic_key_char[1] = (updated_key >> 8) & 0xff; + magic_key_char[2] = (updated_key >> 16) & 0xff; + magic_key_char[3] = (updated_key >> 24) & 0xff; + } + + /* Get password and crypt hashes as per usual. + */ + + MD5_Init(&ctx); + MD5_Update(&ctx, (unsigned char*)pass, strlen(pass)); + MD5_Final(result, &ctx); + to_y64((unsigned char*)password_hash, result, 16); + + MD5_Init(&ctx); + crypt_result = yahoo_crypt(pass, "$1$_2S43d5f$"); + MD5_Update(&ctx, (unsigned char*)crypt_result, strlen(crypt_result)); + MD5_Final(result, &ctx); + to_y64((unsigned char*)crypt_hash, result, 16); + + /* Our first authentication response is based off of the password hash. + */ + + for (x = 0; x < (int)strlen(password_hash); x++) + pass_hash_xor1[cnt++] = password_hash[x] ^ 0x36; + + if (cnt < 64) + memset(&(pass_hash_xor1[cnt]), 0x36, 64-cnt); + + cnt = 0; + + for (x = 0; x < (int)strlen(password_hash); x++) + pass_hash_xor2[cnt++] = password_hash[x] ^ 0x5c; + + if (cnt < 64) + memset(&(pass_hash_xor2[cnt]), 0x5c, 64-cnt); + + SHA1_Init(&ctx1); + SHA1_Init(&ctx2); + + /* + * The first context gets the password hash XORed with 0x36 plus a magic value + * which we previously extrapolated from our challenge. + */ + + SHA1_Update(&ctx1, (unsigned char*)pass_hash_xor1, 64); + if (y >= 3) + ctx1.Nl = 0x1ff; + SHA1_Update(&ctx1, magic_key_char, 4); + SHA1_Final(digest1, &ctx1); + + /* + * The second context gets the password hash XORed with 0x5c plus the SHA-1 digest + * of the first context. + */ + + SHA1_Update(&ctx2, (unsigned char*)pass_hash_xor2, 64); + SHA1_Update(&ctx2, digest1, 20); + SHA1_Final(digest2, &ctx2); + + /* + * Now that we have digest2, use it to fetch characters from an alphabet to construct + * our first authentication response. + */ + + for (x = 0; x < 20; x += 2) { + unsigned int val = 0; + unsigned int lookup = 0; + + char byte[6]; + + memset(&byte, 0, 6); + + /* First two bytes of digest stuffed together. + */ + + val = digest2[x]; + val <<= 8; + val += digest2[x+1]; + + lookup = (val >> 0x0b); + lookup &= 0x1f; + if (lookup >= strlen(alphabet1)) + break; + sprintf(byte, "%c", alphabet1[lookup]); + strcat(resp_6, byte); + strcat(resp_6, "="); + + lookup = (val >> 0x06); + lookup &= 0x1f; + if (lookup >= strlen(alphabet2)) + break; + sprintf(byte, "%c", alphabet2[lookup]); + strcat(resp_6, byte); + + lookup = (val >> 0x01); + lookup &= 0x1f; + if (lookup >= strlen(alphabet2)) + break; + sprintf(byte, "%c", alphabet2[lookup]); + strcat(resp_6, byte); + + lookup = (val & 0x01); + if (lookup >= strlen(delimit_lookup)) + break; + sprintf(byte, "%c", delimit_lookup[lookup]); + strcat(resp_6, byte); + } + + /* Our second authentication response is based off of the crypto hash. + */ + + cnt = 0; + memset(&digest1, 0, 20); + memset(&digest2, 0, 20); + + for (x = 0; x < (int)strlen(crypt_hash); x++) + crypt_hash_xor1[cnt++] = crypt_hash[x] ^ 0x36; + + if (cnt < 64) + memset(&(crypt_hash_xor1[cnt]), 0x36, 64-cnt); + + cnt = 0; + + for (x = 0; x < (int)strlen(crypt_hash); x++) + crypt_hash_xor2[cnt++] = crypt_hash[x] ^ 0x5c; + + if (cnt < 64) + memset(&(crypt_hash_xor2[cnt]), 0x5c, 64-cnt); + + SHA1_Init(&ctx1); + SHA1_Init(&ctx2); + + /* + * The first context gets the password hash XORed with 0x36 plus a magic value + * which we previously extrapolated from our challenge. + */ + + SHA1_Update(&ctx1, (unsigned char*)crypt_hash_xor1, 64); + if (y >= 3) + ctx1.Nl = 0x1ff; + SHA1_Update(&ctx1, magic_key_char, 4); + SHA1_Final(digest1, &ctx1); + + /* + * The second context gets the password hash XORed with 0x5c plus the SHA-1 digest + * of the first context. + */ + + SHA1_Update(&ctx2, (unsigned char*)crypt_hash_xor2, 64); + SHA1_Update(&ctx2, digest1, 20); + SHA1_Final(digest2, &ctx2); + + /* + * Now that we have digest2, use it to fetch characters from an alphabet to construct + * our first authentication response. + */ + + for (x = 0; x < 20; x += 2) { + unsigned int val = 0; + unsigned int lookup = 0; + + char byte[6]; + + memset(&byte, 0, 6); + + /* First two bytes of digest stuffed together. + */ + + val = digest2[x]; + val <<= 8; + val += digest2[x+1]; + + lookup = (val >> 0x0b); + lookup &= 0x1f; + if (lookup >= strlen(alphabet1)) + break; + sprintf(byte, "%c", alphabet1[lookup]); + strcat(resp_96, byte); + strcat(resp_96, "="); + + lookup = (val >> 0x06); + lookup &= 0x1f; + if (lookup >= strlen(alphabet2)) + break; + sprintf(byte, "%c", alphabet2[lookup]); + strcat(resp_96, byte); + + lookup = (val >> 0x01); + lookup &= 0x1f; + if (lookup >= strlen(alphabet2)) + break; + sprintf(byte, "%c", alphabet2[lookup]); + strcat(resp_96, byte); + + lookup = (val & 0x01); + if (lookup >= strlen(delimit_lookup)) + break; + sprintf(byte, "%c", delimit_lookup[lookup]); + strcat(resp_96, byte); + } + addParam(0, sn); + addParam(6, resp_6); + addParam(96, resp_96); + addParam(1, sn); + sendPacket(YAHOO_SERVICE_AUTHRESP); +} diff --git a/plugins/yahoo/yahoocfg.cpp b/plugins/yahoo/yahoocfg.cpp new file mode 100644 index 0000000..71c3314 --- /dev/null +++ b/plugins/yahoo/yahoocfg.cpp @@ -0,0 +1,91 @@ +/*************************************************************************** + yahoocfg.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include + +#include "simgui/linklabel.h" +#include "misc.h" + +#include "yahoocfg.h" +#include "yahooclient.h" + +YahooConfig::YahooConfig(QWidget *parent, YahooClient *client, bool bConfig) : QWidget(parent) +{ + setupUi(this); + m_client = client; + m_bConfig = bConfig; + if (m_bConfig) + tabCfg->removeTab(tabCfg->indexOf(tabYahoo)); + QTimer::singleShot(0, this, SLOT(changed())); + edtLogin->setText(m_client->getLogin()); + edtPassword->setText(m_client->getPassword()); + edtServer->setText(m_client->getServer()); + edtPort->setValue(m_client->getPort()); + edtMinPort->setValue(m_client->getMinPort()); + edtMaxPort->setValue(m_client->getMaxPort()); + connect(edtLogin, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPassword, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtServer, SIGNAL(textChanged(const QString&)), this, SLOT(changed(const QString&))); + connect(edtPort, SIGNAL(valueChanged(const QString&)), this, SLOT(changed(const QString&))); + lnkReg->setText(i18n("Get a Yahoo! ID")); + lnkReg->setUrl("http://edit.yahoo.com/config/eval_register"); + chkHTTP->setChecked(m_client->getUseHTTP()); + chkAuto->setChecked(m_client->getAutoHTTP()); + connect(chkAuto, SIGNAL(toggled(bool)), this, SLOT(autoToggled(bool))); + autoToggled(m_client->getAutoHTTP()); +} + +void YahooConfig::apply(SIM::Client*, void*) +{ +} + +void YahooConfig::apply() +{ + if (!m_bConfig){ + m_client->setLogin(edtLogin->text()); + m_client->setPassword(edtPassword->text()); + } + m_client->setServer(edtServer->text()); + m_client->setPort(edtPort->text().toUShort()); + m_client->setMinPort(edtMinPort->text().toUShort()); + m_client->setMaxPort(edtMaxPort->text().toUShort()); + m_client->setUseHTTP(chkHTTP->isChecked()); + m_client->setAutoHTTP(chkAuto->isChecked()); +} + +void YahooConfig::autoToggled(bool bState) +{ + chkHTTP->setEnabled(!bState); +} + +void YahooConfig::changed(const QString&) +{ + changed(); +} + +void YahooConfig::changed() +{ + emit okEnabled(!edtLogin->text().isEmpty() && + !edtPassword->text().isEmpty() && + !edtServer->text().isEmpty() && + edtPort->text().toUShort()); +} + diff --git a/plugins/yahoo/yahoocfg.h b/plugins/yahoo/yahoocfg.h new file mode 100644 index 0000000..7075958 --- /dev/null +++ b/plugins/yahoo/yahoocfg.h @@ -0,0 +1,47 @@ +/*************************************************************************** + yahoocfg.h - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef _YAHOOCFG_H +#define _YAHOOCFG_H + +#include "contacts.h" + +#include "ui_yahoocfgbase.h" + +class YahooClient; + +class YahooConfig : public QWidget, public Ui::YahooConfigBase +{ + Q_OBJECT +public: + YahooConfig(QWidget *parent, YahooClient *client, bool bConfig); +signals: + void okEnabled(bool); +public slots: + void apply(); + void apply(SIM::Client*, void*); +protected slots: + void changed(); + void changed(const QString&); + void autoToggled(bool); +protected: + bool m_bConfig; + YahooClient *m_client; +}; + +#endif + diff --git a/plugins/yahoo/yahoocfgbase.ui b/plugins/yahoo/yahoocfgbase.ui new file mode 100644 index 0000000..a559033 --- /dev/null +++ b/plugins/yahoo/yahoocfgbase.ui @@ -0,0 +1,362 @@ + + + + + YahooConfigBase + + + + 0 + 0 + 390 + 291 + + + + Form2 + + + + 11 + + + 6 + + + + + + &Yahoo! + + + + 11 + + + 6 + + + + + Login: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + Password: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + QLineEdit::Password + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + + + + &Network + + + + 11 + + + 6 + + + + + Server: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + + + 0 + + + 6 + + + + + 65535 + + + 1 + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + Port: + + + Qt::AlignVCenter|Qt::AlignRight + + + false + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Vertical + + + + + + + + 5 + 1 + + + + Note: For HTTP-polling using proxy settings for HTTP + + + Qt::AlignVCenter|Qt::AlignLeft + + + false + + + + + + + &Automatically use HTTP polling if proxy required + + + + + + + Use &HTTP polling + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + QFrame::HLine + + + + + + + 0 + + + 6 + + + + + 65534 + + + 1024 + + + + + + + - + + + false + + + + + + + 65534 + + + 1024 + + + + + + + + 20 + 20 + + + + QSizePolicy::Expanding + + + Qt::Horizontal + + + + + + + + + Port range for direct connections: + + + false + + + + + + + + + + + + QWidget + QWidget +
    QWidget
    + + -1 + -1 + + 0 + + 5 + 5 + + image0 + + text + +
    + + LinkLabel + QWidget +
    simgui/linklabel.h
    + + -1 + -1 + + 0 + + 1 + 1 + + image1 + + text + +
    +
    + + tabCfg + edtLogin + edtPassword + edtServer + edtPort + edtMinPort + edtMaxPort + chkHTTP + chkAuto + + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758 + + + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + +
    diff --git a/plugins/yahoo/yahooclient.cpp b/plugins/yahoo/yahooclient.cpp new file mode 100644 index 0000000..906454d --- /dev/null +++ b/plugins/yahoo/yahooclient.cpp @@ -0,0 +1,2155 @@ +/*************************************************************************** + yahooclient.cpp - description + ------------------- + begin : Sun Mar 17 2002 + copyright : (C) 2002 by Vladimir Shutoff + email : vovan@shutoff.ru + ***************************************************************************/ + +/*************************************************************************** + * Based on libyahoo2 + * + * Some code copyright (C) 2002-2004, Philip S Tellis + * + * Yahoo Search copyright (C) 2003, Konstantin Klyagin + * + * Much of this code was taken and adapted from the yahoo module for + * gaim released under the GNU GPL. This code is also released under the + * GNU GPL. + * + * This code is derivitive of Gaim + * copyright (C) 1998-1999, Mark Spencer + * 1998-1999, Adam Fritzler + * 1998-2002, Rob Flynn + * 2000-2002, Eric Warmenhoven + * 2001-2002, Brian Macke + * 2001, Anand Biligiri S + * 2001, Valdis Kletnieks + * 2002, Sean Egan + * 2002, Toby Gray + * + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "html.h" +#include "icons.h" +#include "log.h" +#include "unquot.h" +#include "core.h" +#include "socket/clientsocket.h" +#include "contacts/clientdataiterator.h" +#include "contacts/contact.h" +#include "contacts/group.h" + +#include "yahoo.h" +#include "yahooclient.h" +#include "yahoocfg.h" +#include "yahooinfo.h" +#include "yahoosearch.h" + +using namespace std; +using namespace SIM; + +const unsigned long MessageYahooFile = 0x700; + +static char YAHOO_PACKET_SIGN[] = "YMSG"; + +const unsigned PING_TIMEOUT = 60; + +const unsigned YAHOO_LOGIN_OK = 0; +const unsigned YAHOO_LOGIN_PASSWD = 13; +const unsigned YAHOO_LOGIN_LOCK = 14; +const unsigned YAHOO_LOGIN_DUPL = 99; + +static DataDef yahooUserData[] = + { + { "", DATA_ULONG, 1, DATA(9) }, // Sign + { "LastSend", DATA_ULONG, 1, 0 }, + { "Login", DATA_UTF, 1, 0 }, + { "Nick", DATA_UTF, 1, 0 }, + { "First", DATA_UTF, 1, 0 }, + { "Last", DATA_UTF, 1, 0 }, + { "EMail", DATA_UTF, 1, 0 }, + { "", DATA_ULONG, 1, DATA(-1) }, // Status + { "", DATA_BOOL, 1, 0 }, // bAway + { "", DATA_UTF, 1, 0 }, // AwayMessage + { "StatusTime", DATA_ULONG, 1, 0 }, + { "OnlineTime", DATA_ULONG, 1, 0 }, + { "Group", DATA_STRING, 1, 0 }, + { "", DATA_BOOL, 1, 0 }, // bChecked + { "", DATA_BOOL, 1, 0 }, // bTyping + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +static DataDef yahooClientData[] = + { + { "Server", DATA_STRING, 1, "scs.msg.yahoo.com" }, + { "Port", DATA_ULONG, 1, DATA(5050) }, + { "MinPort", DATA_ULONG, 1, DATA(1024) }, + { "MaxPort", DATA_ULONG, 1, DATA(0xFFFE) }, + { "UseHTTP", DATA_BOOL, 1, 0 }, + { "AutoHTTP", DATA_BOOL, 1, DATA(1) }, + { "ListRequests", DATA_STRING, 1, 0 }, + { "", DATA_STRUCT, sizeof(YahooUserData) / sizeof(Data), DATA(yahooUserData) }, + { NULL, DATA_UNKNOWN, 0, 0 } + }; + +const DataDef *YahooProtocol::userDataDef() +{ + return yahooUserData; +} + +YahooClient::YahooClient(Protocol *protocol, Buffer *cfg) + : TCPClient(protocol, cfg) +{ + load_data(yahooClientData, &data, cfg); + m_status = STATUS_OFFLINE; + m_bFirstTry = false; + m_ft_id = 0; + QString requests = getListRequests(); + while (!requests.isEmpty()){ + QString request = getToken(requests, ';'); + ListRequest lr; + lr.type = getToken(request, ',').toUInt(); + lr.name = request; + m_requests.push_back(lr); + } + setListRequests(QString::null); +} + +YahooClient::~YahooClient() +{ + TCPClient::setStatus(STATUS_OFFLINE, false); + free_data(yahooClientData, &data); +} + +QByteArray YahooClient::getConfig() +{ + QByteArray res = TCPClient::getConfig(); + if (res.length()) + res += "\n"; + QString requests; + for (list::iterator it = m_requests.begin(); it != m_requests.end(); ++it){ + if (!requests.isEmpty()) + requests += ";"; + requests += QString::number(it->type); + requests += it->name; + } + setListRequests(requests); + res += save_data(yahooClientData, &data); + return res; +} + +bool YahooClient::send(Message *msg, void *_data) +{ + if ((getState() != Connected) || (_data == NULL)) + return false; + YahooUserData *data = toYahooUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + Message_ID msg_id; + switch (msg->type()){ + case MessageTypingStart: + sendTyping(data, true); + return true; + case MessageTypingStop: + sendTyping(data, false); + return true; + case MessageGeneric: + sendMessage(msg->getRichText(), msg, data); + return true; + case MessageUrl:{ + QString msgText = static_cast(msg)->getUrl(); + if (!msg->getPlainText().isEmpty()){ + msgText += "
    "; + msgText += msg->getRichText(); + } + sendMessage(msgText, msg, data); + return true; + } + case MessageFile:{ + msg_id.id = 0; + msg_id.msg = msg; + m_waitMsg.push_back(msg_id); + YahooFileTransfer *ft = static_cast(static_cast(msg)->m_transfer); + if (ft == NULL) + ft = new YahooFileTransfer(static_cast(msg), data, this); + ft->listen(); + return true; + } + } + return false; +} + +bool YahooClient::canSend(unsigned type, void *_data) +{ + if ((_data == NULL) || (((clientData*)_data)->Sign.toULong() != YAHOO_SIGN)) + return false; + if (getState() != Connected) + return false; + switch (type){ + case MessageGeneric: + case MessageUrl: + case MessageFile: + return true; + } + return false; +} + +void YahooClient::packet_ready() +{ + if (m_bHeader){ + char header[4]; + socket()->readBuffer().unpack(header, 4); + if (memcmp(header, YAHOO_PACKET_SIGN, 4)){ + socket()->error_state("Bad packet sign"); + return; + } + socket()->readBuffer().incReadPos(4); + socket()->readBuffer() >> m_data_size >> m_service; + unsigned long session_id; + socket()->readBuffer() >> m_pkt_status >> session_id; + if (m_data_size){ + socket()->readBuffer().add(m_data_size); + m_bHeader = false; + return; + } + } + EventLog::log_packet(socket()->readBuffer(), false, YahooPlugin::YahooPacket); + scan_packet(); + socket()->readBuffer().init(20); + socket()->readBuffer().packetStart(); + m_bHeader = true; +} + +void YahooClient::sendPacket(unsigned short service, unsigned long status) +{ + if (m_bHTTP && !m_session_id.isEmpty()){ + addParam(0, getLogin()); + addParam(24, m_session_id); + } + unsigned short size = 0; + if (!m_values.empty()){ + for (list::iterator it = m_values.begin(); it != m_values.end(); ++it){ + size += 4; + size += it->second.length(); + size += QByteArray::number(it->first).length(); + } + } + socket()->writeBuffer().packetStart(); + socket()->writeBuffer().pack(YAHOO_PACKET_SIGN, 4); + socket()->writeBuffer() << 0x000C0000L << size << service << status << m_session; + if (size){ + for (list::iterator it = m_values.begin(); it != m_values.end(); ++it){ + socket()->writeBuffer() + << QByteArray::number(it->first).constData() + << (unsigned short)0xC080 + << it->second.constData() + << (unsigned short)0xC080; + } + } + m_values.clear(); + EventLog::log_packet(socket()->writeBuffer(), true, YahooPlugin::YahooPacket); + socket()->write(); +} + +void YahooClient::addParam(unsigned key, const char *value) +{ + m_values.push_back(PARAM(key, QByteArray(value))); +} + +void YahooClient::addParam(unsigned key, const QByteArray &value) +{ + m_values.push_back(PARAM(key, value)); +} + +void YahooClient::addParam(unsigned key, const QString &value) +{ + m_values.push_back(PARAM(key, value.toUtf8())); +} + +void YahooClient::connect_ready() +{ + m_bFirstTry = false; + socket()->readBuffer().init(20); + socket()->readBuffer().packetStart(); + m_session = rand(); + m_bHeader = true; + log(L_DEBUG, "Connect ready"); + TCPClient::connect_ready(); + if (m_bHTTP){ + addParam(1, getLogin()); + sendPacket(YAHOO_SERVICE_AUTH); + }else{ + sendPacket(YAHOO_SERVICE_VERIFY); + } +} + +const char *Params::operator [](unsigned id) +{ + for (iterator it = begin(); it != end(); ++it){ + if (it->first == id) + return it->second.data(); + } + return ""; +} + +void YahooClient::scan_packet() +{ + Params params; + int param7_cnt = 0; + + for (;;){ + QByteArray key; + QByteArray value; + if (!(socket()->readBuffer().scan("\xC0\x80", key) && + socket()->readBuffer().scan("\xC0\x80", value))) + break; + unsigned key_id = key.toUInt(); + log(L_DEBUG, "Param: %u %s", key_id, value.data()); + /* There can be multiple buddies in an YAHOO_SERVICE_IDDEACT and + YAHOO_SERVICE_LOGON paket ... */ + if ((key_id == 7) && ((m_service == YAHOO_SERVICE_IDDEACT) || + (m_service == YAHOO_SERVICE_LOGON))) { + if (param7_cnt) { + /* process the last buddie */ + process_packet(params); + params.clear(); + param7_cnt = 0; + } else { + param7_cnt = 1; + } + } + params.push_back(PARAM(key_id, value)); + } + process_packet(params); +} + +void YahooClient::process_packet(Params ¶ms) +{ + log(L_DEBUG,"Service type: %02X",m_service); + switch (m_service){ + case YAHOO_SERVICE_VERIFY: + if (m_pkt_status != 1){ + m_reconnect = NO_RECONNECT; + socket()->error_state(I18N_NOOP("Yahoo! login lock")); + return; + } + addParam(1, getLogin()); + sendPacket(YAHOO_SERVICE_AUTH); + break; + case YAHOO_SERVICE_AUTH: + process_auth(params[13], params[94], params[1]); + break; + case YAHOO_SERVICE_AUTHRESP: + m_pkt_status = 0; + if (params[66]) + m_pkt_status = atol(params[66]); + switch (m_pkt_status){ + case YAHOO_LOGIN_OK: + authOk(); + return; + case YAHOO_LOGIN_PASSWD: + m_reconnect = NO_RECONNECT; + socket()->error_state(I18N_NOOP("Wrong password"), AuthError); + return; + case YAHOO_LOGIN_LOCK: + m_reconnect = NO_RECONNECT; + socket()->error_state(I18N_NOOP("Your account has been locked"), AuthError); + return; + case YAHOO_LOGIN_DUPL: + m_reconnect = NO_RECONNECT; + socket()->error_state(I18N_NOOP("Your account is being used from another location")); + return; + default: + socket()->error_state(I18N_NOOP("Login failed")); + } + break; + case YAHOO_SERVICE_LIST: + authOk(); + loadList(params[87]); + break; + case YAHOO_SERVICE_LOGOFF: + if (m_pkt_status == (unsigned long)(-1)){ + m_reconnect = NO_RECONNECT; + socket()->error_state(I18N_NOOP("Your account is being used from another location")); + return; + } + case YAHOO_SERVICE_LOGON: + if (params[1]){ + if (params[24]) + m_session_id = QString::fromUtf8(params[24]); + authOk(); + } + case YAHOO_SERVICE_USERSTAT: + case YAHOO_SERVICE_ISAWAY: + case YAHOO_SERVICE_ISBACK: + case YAHOO_SERVICE_GAMELOGON: + case YAHOO_SERVICE_GAMELOGOFF: + case YAHOO_SERVICE_IDACT: + case YAHOO_SERVICE_IDDEACT: + if (params[7] && params[13]) + processStatus(m_service, params[7], params[10], params[19], params[47], params[137]); + break; + case YAHOO_SERVICE_IDLE: + case YAHOO_SERVICE_MAILSTAT: + case YAHOO_SERVICE_CHATINVITE: + case YAHOO_SERVICE_CALENDAR: + case YAHOO_SERVICE_NEWPERSONALMAIL: + case YAHOO_SERVICE_ADDIDENT: + case YAHOO_SERVICE_ADDIGNORE: + case YAHOO_SERVICE_PING: + case YAHOO_SERVICE_GOTGROUPRENAME: + case YAHOO_SERVICE_GROUPRENAME: + case YAHOO_SERVICE_PASSTHROUGH2: + case YAHOO_SERVICE_CHATLOGON: + case YAHOO_SERVICE_CHATLOGOFF: + case YAHOO_SERVICE_CHATMSG: + case YAHOO_SERVICE_REJECTCONTACT: + case YAHOO_SERVICE_PEERTOPEER: + break; + case YAHOO_SERVICE_MESSAGE: + if (params[4] && params[14]) + process_message(params[4], params[14], params[97]); + break; + case YAHOO_SERVICE_NOTIFY: + if (params[4] && params[49]) + notify(params[4], params[49], params[13]); + break; + case YAHOO_SERVICE_NEWCONTACT: + if (params[1]){ + contact_added(params[3], params[14]); + return; + } + if (params[7]){ + processStatus(m_service, params[7], params[10], params[14], params[47], params[137]); + return; + } + if (m_pkt_status == 7) + contact_rejected(params[3], params[14]); + break; + case YAHOO_SERVICE_P2PFILEXFER: + if ((params[49] == NULL) || strcmp(params[49], "FILEXFER")){ + log(L_WARN, "Unhandled p2p type %s", params[49]); + break; + } + if ((params[28] == NULL) && params[11]){ + unsigned id =atol(params[11]); + for (list::iterator it = m_waitMsg.begin(); it != m_waitMsg.end(); ++it){ + if (it->id == id){ + FileMessage *msg = static_cast(it->msg); + m_waitMsg.erase(it); + if (msg->m_transfer){ + static_cast(msg->m_transfer)->error_state(I18N_NOOP("Message declined"), 0); + break; + } + msg->setError(I18N_NOOP("Message declined")); + EventMessageSent(msg).process(); + delete msg; + break; + } + } + break; + } + case YAHOO_SERVICE_FILETRANSFER: + /* + + params[14] - can be empty when no message is send with the file... + params[20] - url - just for filetransfer through website + */ + if (params[4] && params[27] && params[28]) + process_file(params[4], params[27], params[28], params[14], params[20], params[11]); + else + /* file-url-message */ + process_fileurl(params[4],params[14],params[20]); + break; + case YAHOO_SERVICE_ADDBUDDY: + if (params[1] && params[7] && params[65]) + log(L_DEBUG,"%s added %s to group %s",params[1],params[7],params[65]); + else + log(L_DEBUG,"Please send paket to developer!"); + break; + case YAHOO_SERVICE_REMBUDDY: + if (params[1] && params[7] && params[65]) + log(L_DEBUG,"%s removed %s from group %s",params[1],params[7],params[65]); + else + log(L_DEBUG,"Please send paket to developer!"); + break; + case YAHOO_SERVICE_CONFINVITE: + log(L_WARN, "Conferencing currently not implemented!"); + default: + log(L_WARN, "Unknown service %02X", m_service); + } +} + +class TextParser +{ +public: + TextParser(YahooClient *client, Contact *contact); + QString parse(const char *msg); + + class Tag + { + public: + Tag(const QString &str); + bool operator == (const Tag &t) const; + QString open_tag() const; + QString close_tag() const; + protected: + QString m_tag; + }; + +class FaceSizeParser : public HTMLParser + { + public: + FaceSizeParser(const QString&); + QString face; + QString size; + protected: + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &options); + virtual void tag_end(const QString &tag); + }; + +protected: + void addText(const char *str, unsigned size); + unsigned m_state; + Contact *m_contact; + QString color; + QString face; + QString size; + bool m_bChanged; + stack m_tags; + void setState(unsigned code, bool bSet); + void clearState(unsigned code); + void put_color(unsigned color); + void put_style(); + void push_tag(const QString &tag); + void pop_tag(const QString &tag); + YahooClient *m_client; + QString m_text; +}; + +TextParser::FaceSizeParser::FaceSizeParser(const QString &str) +{ + parse(str); +} + +void TextParser::FaceSizeParser::text(const QString&) +{ +} + +void TextParser::FaceSizeParser::tag_start(const QString &tag, const list &options) +{ + if (tag != "font") + return; + for (list::const_iterator it = options.begin(); it != options.end(); ++it){ + QString key = *it; + ++it; + if (key == "face") + face = QString("font-family:") + *it; + if (key == "size") + size = QString("font-size:") + *it + "pt"; + } +} + +void TextParser::FaceSizeParser::tag_end(const QString&) +{ +} + +TextParser::Tag::Tag(const QString &tag) +{ + m_tag = tag; +} + +bool TextParser::Tag::operator == (const Tag &t) const +{ + return close_tag() == t.close_tag(); +} + +QString TextParser::Tag::open_tag() const +{ + QString res; + res += "<"; + res += m_tag; + res += ">"; + return res; +} + +QString TextParser::Tag::close_tag() const +{ + int n = m_tag.indexOf(' '); + QString res; + res += "= 0){ + res += m_tag.left(n); + }else{ + res += m_tag; + } + res += ">"; + return res; +} + +TextParser::TextParser(YahooClient *client, Contact *contact) +{ + m_contact = contact; + m_client = client; + m_bChanged = false; + m_state = 0; +} + +static unsigned esc_colors[] = + { + 0x000000, + 0x0000FF, + 0x008080, + 0x808080, + 0x008000, + 0xFF0080, + 0x800080, + 0xFF8000, + 0xFF0000, + 0x808000 + }; + +QString TextParser::parse(const char *msg) +{ + Buffer b; + b.pack(msg, strlen(msg)); + for (;;){ + QByteArray part; + if (!b.scan("\x1B\x5B", part)) + break; + addText(part, part.length()); + + if (!b.scan("m", part)) + break; + if (part.isEmpty()) + continue; + if (part[0] == 'x'){ + unsigned code = part.mid(1).toUInt(); + switch (code){ + case 1: + case 2: + case 4: + setState(code, false); + break; + } + continue; + } + if (part[0] == '#'){ + put_color(part.mid(1).toUInt()); + continue; + } + unsigned code = part.toUInt(); + switch (code){ + case 1: + case 2: + case 4: + setState(code, true); + break; + default: + if ((code >= 30) && (code < 40)) + put_color(esc_colors[code - 30]); + } + } + addText(b.data(b.readPos()), b.writePos() - b.readPos()); + while (!m_tags.empty()){ + m_text += m_tags.top().close_tag(); + m_tags.pop(); + } + return m_text; +} + +void TextParser::setState(unsigned code, bool bSet) +{ + if (bSet){ + if ((m_state & code) == code) + return; + m_state |= code; + }else{ + if ((m_state & code) == 0) + return; + m_state &= ~code; + } + QString tag; + switch (code){ + case 1: + tag = "b"; + break; + case 2: + tag = "i"; + break; + case 4: + tag = "u"; + break; + default: + return; + } + if (bSet){ + push_tag(tag); + }else{ + pop_tag(tag); + } +} + +void TextParser::put_color(unsigned _color) +{ + color.sprintf("color:#%06X", _color & 0xFFFFFF); + m_bChanged = true; +} + +void TextParser::put_style() +{ + if (!m_bChanged) + return; + m_bChanged = false; + QString style; + if (!color.isEmpty()) + style = color; + if (!face.isEmpty()){ + if (!style.isEmpty()) + style += ";"; + style += face; + } + if (!size.isEmpty()){ + if (!style.isEmpty()) + style += ";"; + style += size; + } + QString tag("span style=\""); + tag += style; + tag += "\""; + pop_tag(tag); + push_tag(tag); +} + +void TextParser::push_tag(const QString &tag) +{ + Tag t(tag); + m_tags.push(t); + m_text += t.open_tag(); +} + +void TextParser::pop_tag(const QString &tag) +{ + Tag t(tag); + stack tags; + bool bFound = false; + QString text; + while (!m_tags.empty()){ + Tag top = m_tags.top(); + m_tags.pop(); + text += top.close_tag(); + if (top == t){ + bFound = true; + break; + } + tags.push(top); + } + if (bFound) + m_text += text; + while (!tags.empty()){ + Tag top = tags.top(); + tags.pop(); + if (bFound) + m_text += top.open_tag(); + m_tags.push(top); + } +} + +void TextParser::addText(const char *str, unsigned s) +{ + if (s == 0) + return; + QString text; + if (m_contact){ + text = getContacts()->toUnicode(m_contact, QByteArray::fromRawData(str, s)); + }else{ + text = QString::fromUtf8(str, s); + } + while (!text.isEmpty()){ + bool bFace = false; + int n1 = text.indexOf("= 0) + n = n1; + if ((n2 >= 0) && ((n == -1) || (n2 < n1))){ + n = n2; + bFace = true; + } + if (n < 0){ + if (!text.isEmpty()) + put_style(); + m_text += quoteString(text); + break; + } + if (n) + put_style(); + m_text += quoteString(text.left(n)); + text = text.mid(n); + n = text.indexOf('>'); + if (n < 0) + break; + FaceSizeParser p(text.left(n + 1)); + text = text.mid(n + 1); + if (!p.face.isEmpty()){ + face = p.face; + m_bChanged = true; + } + if (!p.size.isEmpty()){ + size = p.size; + m_bChanged = true; + } + } +} + +void YahooClient::process_message(const char *id, const char *msg, const char *utf) +{ + bool bUtf = false; + if (utf && atol(utf)) + bUtf = true; + Contact *contact = NULL; + if (utf == NULL){ + if (findContact(id, NULL, contact) == NULL) + contact = getContacts()->owner(); + } + Message *m = new Message(MessageGeneric); + m->setFlags(MESSAGE_RICHTEXT); + TextParser parser(this, contact); + m->setText(parser.parse(msg)); + messageReceived(m, id); +} + +void YahooClient::notify(const char *id, const char *msg, const char *state) +{ + Contact *contact; + YahooUserData *data = findContact(id, NULL, contact); + if (data == NULL) + return; + bool bState = false; + if (state && atol(state)) + bState = true; + if (!qstricmp(msg, "TYPING")){ + if (data->bTyping.toBool() != bState){ + data->bTyping.asBool() = bState; + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + } +} + +void YahooClient::contact_added(const char *id, const char *message) +{ + Message *msg = new AuthMessage(MessageAdded); + if (message) + msg->setText(QString::fromUtf8(message)); + messageReceived(msg, id); +} + +void YahooClient::contact_rejected(const char *id, const char *message) +{ + Message *msg = new AuthMessage(MessageRemoved); + if (message) + msg->setText(QString::fromUtf8(message)); + messageReceived(msg, id); +} + +void YahooClient::processStatus(unsigned short service, const char *id, + const char *_state, const char *_msg, + const char *_away, const char *_idle) +{ + Contact *contact; + YahooUserData *data = findContact(id, NULL, contact); + if (data == NULL) + return; + unsigned long state = 0; + unsigned away = 0; + int idle = 0; + if (_state) + state = atol(_state); + if (_away) + away = atol(_away); + if (_idle) + idle = atol(_idle); + if (service == YAHOO_SERVICE_LOGOFF) + state = YAHOO_STATUS_OFFLINE; + if ((state != data->Status.toULong()) || + ((state == YAHOO_STATUS_CUSTOM) && + (((away != 0) != data->bAway.toBool()) || QString::fromUtf8(_msg) != data->AwayMessage.str()))){ + + unsigned long old_status = STATUS_UNKNOWN; + unsigned style = 0; + QString statusIcon; + contactInfo(data, old_status, style, statusIcon); + + QDateTime now(QDateTime::currentDateTime()); + now = now.addSecs(-idle); + if (data->Status.toULong() == YAHOO_STATUS_OFFLINE) + data->OnlineTime.asULong() = now.toTime_t(); + data->Status.asULong() = state; + data->bAway.asBool() = (away != 0); + data->StatusTime.asULong() = now.toTime_t(); + + unsigned long new_status = STATUS_UNKNOWN; + contactInfo(data, new_status, style, statusIcon); + + if (old_status != new_status){ + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(dataName(data)); + m->setFlags(MESSAGE_RECEIVED); + m->setStatus(STATUS_OFFLINE); + EventMessageReceived e(m); + if(!e.process()) + delete m; + if ((new_status == STATUS_ONLINE) && !contact->getIgnore() && (getState() == Connected) && + (data->StatusTime.toULong() > this->data.owner.OnlineTime.toULong() + 30)){ + EventContact e(contact, EventContact::eOnline); + e.process(); + } + }else{ + EventContact e(contact, EventContact::eStatus);; + e.process(); + } + } +} + +QString YahooClient::name() +{ + return "Yahoo." + data.owner.Login.str(); +} + +QString YahooClient::dataName(void *_data) +{ + YahooUserData *data = toYahooUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + return name() + "+" + data->Login.str(); +} + +void YahooClient::setStatus(unsigned status) +{ + if (status == m_status) + return; + QDateTime now(QDateTime::currentDateTime()); + if (m_status == STATUS_OFFLINE) + data.owner.OnlineTime.asULong() = now.toTime_t(); + data.owner.StatusTime.asULong() = now.toTime_t(); + m_status = status; + data.owner.Status.asULong() = m_status; + EventClientChanged(this).process(); + if (status == STATUS_OFFLINE){ + if (m_status != STATUS_OFFLINE){ + m_status = status; + data.owner.Status.asULong() = status; + data.owner.StatusTime.asULong() = time(NULL); + } + return; + } + unsigned long yahoo_status = YAHOO_STATUS_OFFLINE; + switch (status){ + case STATUS_ONLINE: + yahoo_status = YAHOO_STATUS_AVAILABLE; + break; + case STATUS_DND: + yahoo_status = YAHOO_STATUS_BUSY; + break; + } + if (yahoo_status != YAHOO_STATUS_OFFLINE){ + m_status = status; + sendStatus(yahoo_status); + return; + } + ARRequest ar; + ar.contact = NULL; + ar.status = status; + ar.receiver = this; + ar.param = (void*)(unsigned long)status; + EventARRequest(&ar).process(); +} + +void YahooClient::process_file(const char *id, const char *fileName, const char *fileSize, const char *msg, const char *url, const char *msgid) +{ + YahooFileMessage *m = new YahooFileMessage; + m->setDescription(getContacts()->toUnicode(NULL, fileName)); + m->setSize(atol(fileSize)); + if (url) + m->setUrl(url); + if (msg) + m->setServerText(msg); + if (msgid) + m->setMsgID(atol(msgid)); + messageReceived(m, id); +} + +void YahooClient::process_fileurl(const char *id, const char *msg, const char *url) +{ + UrlMessage *m = new UrlMessage(MessageUrl); + + if (msg) + m->setServerText(msg); + m->setUrl(url); + messageReceived(m, id); +} + +void YahooClient::disconnected() +{ + m_values.clear(); + m_session_id.clear(); + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + YahooUserData *data; + ClientDataIterator it(contact->clientData, this); + while ((data = toYahooUserData(++it)) != NULL){ + if (data->Status.toULong() != YAHOO_STATUS_OFFLINE){ + data->Status.asULong() = YAHOO_STATUS_OFFLINE; + StatusMessage *m = new StatusMessage(); + m->setContact(contact->id()); + m->setClient(dataName(data)); + m->setStatus(STATUS_OFFLINE); + m->setFlags(MESSAGE_RECEIVED); + EventMessageReceived e(m); + if(!e.process()) + delete m; + } + } + } + list::iterator itm; + for (itm = m_ackMsg.begin(); itm != m_ackMsg.end(); ++itm){ + Message *msg = *itm; + EventMessageDeleted(msg).process(); + delete msg; + } + list::iterator itw; + for (itw = m_waitMsg.begin(); itw != m_waitMsg.end(); itw = m_waitMsg.begin()){ + Message *msg = itw->msg; + msg->setError(I18N_NOOP("Client go offline")); + EventMessageSent(msg).process(); + delete msg; + } +} + +bool YahooClient::isMyData(clientData *&_data, Contact*&contact) +{ + if (_data->Sign.toULong() != YAHOO_SIGN) + return false; + YahooUserData *data = toYahooUserData(_data); + YahooUserData *my_data = findContact(data->Login.str().toUtf8(), NULL, contact); + if (!my_data){ + contact = NULL; + } + return true; +} + +bool YahooClient::createData(clientData *&_data, Contact *contact) +{ + YahooUserData *data = toYahooUserData(_data); + YahooUserData *new_data = toYahooUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + new_data->Nick.str() = data->Nick.str(); + _data = (clientData*)new_data; + return true; +} + +void YahooClient::setupContact(Contact*, void*) +{ +} + +QWidget *YahooClient::setupWnd() +{ + return new YahooConfig(NULL, this, false); +} + +QString YahooClient::getLogin() +{ + return data.owner.Login.str(); +} + +void YahooClient::setLogin(const QString &login) +{ + data.owner.Login.str() = login; +} + +void YahooClient::authOk() +{ + if (getState() == Connected) + return; + if (m_bHTTP && m_session_id.isEmpty()) + return; + setState(Connected); + setPreviousPassword(QString::null); + setStatus(m_logonStatus); + QTimer::singleShot(PING_TIMEOUT * 1000, this, SLOT(ping())); +} + +void YahooClient::loadList(const char *str) +{ + Contact *contact; + ContactList::ContactIterator it; + while ((contact = ++it) != NULL){ + YahooUserData *data; + ClientDataIterator itd(contact->clientData, this); + while ((data = toYahooUserData(++itd)) != NULL){ + data->bChecked.asBool() = (contact->getGroup() == 0); + } + } + if (str){ + QByteArray s = str; + while (!s.isEmpty()){ + QByteArray line = getToken(s, '\n'); + QByteArray grp = getToken(line, ':'); + if (line.isEmpty()){ + line = grp; + grp = ""; + } + while (!line.isEmpty()){ + QByteArray id = getToken(line, ','); + ListRequest *lr = findRequest(QString::fromUtf8(id)); + if (lr) + continue; + Contact *contact; + YahooUserData *data = findContact(id, grp, contact, false); + QString grpName; + if (contact->getGroup()){ + Group *grp = getContacts()->group(contact->getGroup()); + if (grp) + grpName = grp->getName(); + } + if (grpName != getContacts()->toUnicode(NULL, grp)) + moveBuddy(data, getContacts()->toUnicode(NULL, grp)); + data->bChecked.asBool() = true; + } + } + } + it.reset(); + for (list::iterator itl = m_requests.begin(); itl != m_requests.end(); ++itl){ + if ((*itl).type == LR_CHANGE){ + YahooUserData *data = findContact((*itl).name.toUtf8(), NULL, contact, false); + if (data){ + data->bChecked.asBool() = true; + QString grpName; + if (contact->getGroup()){ + Group *grp = getContacts()->group(contact->getGroup()); + if (grp) + grpName = grp->getName(); + } + if (grpName != data->Group.str()) + moveBuddy(data, grpName); + } + } + if ((*itl).type == LR_DELETE){ + YahooUserData data; + load_data(yahooUserData, &data, NULL); + data.Login.str() = (*itl).name; + removeBuddy(&data); + free_data(yahooUserData, &data); + } + } + m_requests.clear(); + list forRemove; + while ((contact = ++it) != NULL){ + YahooUserData *data; + ClientDataIterator itd(contact->clientData, this); + list dataForRemove; + bool bChanged = false; + while ((data = toYahooUserData(++itd)) != NULL){ + if (!data->bChecked.toBool()){ + dataForRemove.push_back(data); + bChanged = true; + } + } + if (!bChanged) + continue; + for (list::iterator it = dataForRemove.begin(); it != dataForRemove.end(); ++it) + contact->clientData.freeData(*it); + if (contact->clientData.size()){ + EventContact e(contact, EventContact::eChanged); + e.process(); + }else{ + forRemove.push_back(contact); + } + } + for (list::iterator itr = forRemove.begin(); itr != forRemove.end(); ++itr) + delete *itr; +} + +YahooUserData *YahooClient::findContact(const char *_id, const char *grpname, Contact *&contact, bool bSend, bool bJoin) +{ + ContactList::ContactIterator it; + QString id = QString::fromUtf8(_id); + while ((contact = ++it) != NULL){ + YahooUserData *data; + ClientDataIterator itd(contact->clientData, this); + while ((data = toYahooUserData(++itd)) != NULL){ + if (id == data->Login.str()) + return data; + } + } + it.reset(); + if (bJoin){ + while ((contact = ++it) != NULL){ + if (contact->getName() == id){ + YahooUserData *data = toYahooUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + data->Login.str() = id; + data->Group.str() = QString::fromUtf8(grpname); + EventContact e(contact, EventContact::eChanged); + e.process(); + return data; + } + } + } + if (grpname == NULL) + return NULL; + Group *grp = NULL; + if (*grpname){ + ContactList::GroupIterator it; + while ((grp = ++it) != NULL) + if (grp->getName() == getContacts()->toUnicode(NULL, grpname)) + break; + if (grp == NULL){ + grp = getContacts()->group(0, true); + grp->setName(getContacts()->toUnicode(NULL, grpname)); + EventGroup e(grp, EventGroup::eChanged); + e.process(); + } + } + if (grp == NULL) + grp = getContacts()->group(0); + contact = getContacts()->contact(0, true); + YahooUserData *data = toYahooUserData((SIM::clientData*)contact->clientData.createData(this)); // FIXME unsafe type conversion + data->Login.str() = id; + contact->setName(id); + contact->setGroup(grp->id()); + EventContact e(contact, EventContact::eChanged); + e.process(); + if (bSend) + addBuddy(data); + return data; +} + +void YahooClient::messageReceived(Message *msg, const char *id) +{ + msg->setFlags(msg->getFlags() | MESSAGE_RECEIVED); + if (msg->contact() == 0){ + Contact *contact; + YahooUserData *data = findContact(id, NULL, contact); + if (data == NULL){ + data = findContact(id, "", contact); + if (data == NULL){ + delete msg; + return; + } + contact->setFlags(CONTACT_TEMP); + EventContact e(contact, EventContact::eChanged); + e.process(); + } + msg->setClient(dataName(data)); + msg->setContact(contact->id()); + } + bool bAck = (msg->type() == MessageYahooFile); + if (bAck){ + msg->setFlags(msg->getFlags() | MESSAGE_TEMP); + m_ackMsg.push_back(msg); + } + EventMessageReceived e(msg); + if (e.process() && bAck){ + for (list::iterator it = m_ackMsg.begin(); it != m_ackMsg.end(); ++it){ + if ((*it) == msg){ + m_ackMsg.erase(it); + break; + } + } + } +} + +static void addIcon(QSet *s, const QString &icon, const QString &statusIcon) +{ + if (!s || statusIcon == icon) + return; + s->insert(icon); +} + +void YahooClient::contactInfo(void *_data, unsigned long &status, unsigned&, QString &statusIcon, QSet *icons) +{ + YahooUserData *data = toYahooUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + unsigned cmp_status = STATUS_OFFLINE; + switch (data->Status.toULong()) + { + case YAHOO_STATUS_AVAILABLE: + cmp_status = STATUS_ONLINE; + break; + case YAHOO_STATUS_BUSY: + cmp_status = STATUS_DND; + break; + case YAHOO_STATUS_NOTATHOME: + case YAHOO_STATUS_NOTATDESK: + case YAHOO_STATUS_NOTINOFFICE: + case YAHOO_STATUS_ONVACATION: + cmp_status = STATUS_NA; + break; + case YAHOO_STATUS_OFFLINE: + break; + case YAHOO_STATUS_CUSTOM: + cmp_status = data->bAway.toBool() ? STATUS_AWAY : STATUS_ONLINE; + break; + default: + cmp_status = STATUS_AWAY; + } + + const CommandDef *def; + for (def = protocol()->statusList(); !def->text.isEmpty(); def++) + { + if (def->id == cmp_status) + break; + } + if (cmp_status > status) + { + status = cmp_status; + if (!statusIcon.isEmpty() && icons){ + icons->insert(statusIcon); + } + statusIcon = def->icon; + } + else + { + if (!statusIcon.isEmpty()) + { + addIcon(icons, def->icon, statusIcon); + } + else + { + statusIcon = def->icon; + } + } + if (icons && data->bTyping.toBool()) + addIcon(icons, "typing", statusIcon); +} + +QString YahooClient::contactTip(void *_data) +{ + YahooUserData *data = toYahooUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + unsigned long status = STATUS_UNKNOWN; + unsigned style = 0; + QString statusIcon; + contactInfo(data, status, style, statusIcon); + QString res; + res += ""; + QString statusText; + for (const CommandDef *cmd = protocol()->statusList(); !cmd->text.isEmpty(); cmd++){ + if (cmd->icon == statusIcon){ + res += " "; + statusText = i18n(cmd->text); + res += statusText; + break; + } + } + res += "
    "; + res += data->Login.str(); + res += "
    "; + if (data->Status.toULong() == YAHOO_STATUS_OFFLINE){ + if (data->StatusTime.toULong()){ + res += "
    "; + res += i18n("Last online"); + res += ": "; + res += formatDateTime(data->StatusTime.toULong()); + } + }else{ + if (data->OnlineTime.toULong()){ + res += "
    "; + res += i18n("Online"); + res += ": "; + res += formatDateTime(data->OnlineTime.toULong()); + } + if (data->Status.toULong() != YAHOO_STATUS_AVAILABLE){ + res += "
    "; + res += statusText; + res += ": "; + res += formatDateTime(data->StatusTime.toULong()); + QString msg; + switch (data->Status.toULong()){ + case YAHOO_STATUS_BRB: + msg = i18n("Be right back"); + break; + case YAHOO_STATUS_NOTATHOME: + msg = i18n("Not at home"); + break; + case YAHOO_STATUS_NOTATDESK: + msg = i18n("Not at my desk"); + break; + case YAHOO_STATUS_NOTINOFFICE: + msg = i18n("Not in the office"); + break; + case YAHOO_STATUS_ONPHONE: + msg = i18n("On the phone"); + break; + case YAHOO_STATUS_ONVACATION: + msg = i18n("On vacation"); + break; + case YAHOO_STATUS_OUTTOLUNCH: + msg = i18n("Out to lunch"); + break; + case YAHOO_STATUS_STEPPEDOUT: + msg = i18n("Stepped out"); + break; + case YAHOO_STATUS_CUSTOM: + msg = data->AwayMessage.str(); + } + if (!msg.isEmpty()){ + res += "
    "; + res += quoteString(msg); + } + } + } + return res; +} + +const unsigned MAIN_INFO = 1; +const unsigned NETWORK = 2; + +static CommandDef yahooWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "Yahoo!_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +static CommandDef cfgYahooWnd[] = + { + CommandDef ( + MAIN_INFO, + " ", + "Yahoo!_online", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef ( + NETWORK, + I18N_NOOP("Network"), + "network", + QString::null, + QString::null, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + QString::null + ), + CommandDef (), + }; + +CommandDef *YahooClient::infoWindows(Contact*, void *_data) +{ + YahooUserData *data = toYahooUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + QString name = i18n(protocol()->description()->text); + name += " "; + name += data->Login.str(); + yahooWnd[0].text_wrk = name; + return yahooWnd; +} + +CommandDef *YahooClient::configWindows() +{ + QString name = i18n(protocol()->description()->text); + name += " "; + name += data.owner.Login.str(); + cfgYahooWnd[0].text_wrk = name; + return cfgYahooWnd; +} + +QWidget *YahooClient::infoWindow(QWidget *parent, Contact*, void *_data, unsigned id) +{ + YahooUserData *data = toYahooUserData((SIM::clientData*)_data); // FIXME unsafe type conversion + switch (id){ + case MAIN_INFO: + return new YahooInfo(parent, data, this); + } + return NULL; +} + +QWidget *YahooClient::configWindow(QWidget *parent, unsigned id) +{ + switch (id){ + case MAIN_INFO: + return new YahooInfo(parent, NULL, this); + case NETWORK: + return new YahooConfig(parent, this, true); + } + return NULL; +} + +void YahooClient::ping() +{ + if (getState() != Connected) + return; + sendPacket(YAHOO_SERVICE_PING); + QTimer::singleShot(PING_TIMEOUT * 1000, this, SLOT(ping())); +} + +class YahooParser : public HTMLParser +{ +public: + YahooParser(const QString&); + QString res; + bool bUtf; +protected: + struct style + { + QString tag; + QString face; + unsigned size; + unsigned color; + unsigned state; + }; + virtual void text(const QString &text); + virtual void tag_start(const QString &tag, const list &options); + virtual void tag_end(const QString &tag); + void set_style(const style &s); + void set_state(unsigned oldState, unsigned newState, unsigned st); + void escape(const QString &str); + bool m_bFirst; + QString esc; + stack

    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%0Ac#gmeSX3V1A~(#yVR$I+gHkj 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 %V%SX$0EafRb4i|Mgu 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/21.png b/plugins/weather/jisp/21.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e6b655ec1c144a8513d9ab84ce1640b4ca5ec1 GIT binary patch literal 11561 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 kWcdGQ%cMnZT{J!C7Y1{0MBL_o&W#< literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/24.png b/plugins/weather/jisp/24.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d4eafd94905b63eeb2c340ef06a61a37268d5c GIT binary patch literal 4173 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 kWcdGQ%cMnZT{J!C7Y1{0MBL_o&W#< literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/25.png b/plugins/weather/jisp/25.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2ad7de7f318a8d9e59e6d1a94047f7abc5f59a GIT binary patch literal 4142 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/26.png b/plugins/weather/jisp/26.png new file mode 100644 index 0000000000000000000000000000000000000000..a3820c224834de5138ae950d9aec056ae6e376b4 GIT binary patch literal 9628 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/27.png b/plugins/weather/jisp/27.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6f0d0c8fcd2e38922532cc79c3d22552e4f919 GIT binary patch literal 7438 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/29.png b/plugins/weather/jisp/29.png new file mode 100644 index 0000000000000000000000000000000000000000..8058cdc9f38d6ed63e7008fa1571c8bac45905dd GIT binary patch literal 9152 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 E19XTSumAu6 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/3.png b/plugins/weather/jisp/3.png new file mode 100644 index 0000000000000000000000000000000000000000..b85eeb4e391e4f8efd98c2e0cebc95b5170af2f0 GIT binary patch literal 17002 zcmV(?K-a&CP)_~glt$pcT;aoj<8-Yy9IR*vWT zeb3k6SDz9D;W)>!KQ5Q@V_|g0^ZXnAAn0*j?+x(xyL~^1*jB(ej;%YcT}q`AzpSeA z>Pr_1KFIuw(SInfX1W%O0-W3nKmKYMgj?a|j4Vr{3=Y*H@Q19+D(c z{}-db)ady9JJ0j(1#jJ&dZ*dVjs%{)=oj@rUrc6aQlL7d?O$LZZ}H+L{J%;()OQ5|76T zzy&-R@NfdZH;AU|L=r{PYBh-rwA&5Bv0T!!2VP@Y zR=K~wbQ%`X{}-cgK7f6U)$7f>fhv+%Od*OA-=u%Y)dTt-U@RmOs-#}85d%CKmID>6@Cbjp*-KY-_Qm2+ z-L^c<++9l|-XSlF4LAG!n(dBOZJJjn4}r z$)wUG7Ei!;u-i7)YM=1)!4<7zo=PMmk1C2R*6W?gwUv$GOg4F?RLVZYa%}ihVRROZ znMg#R@_n_^>F6KPwc4Gg5k>?@6c8?g(5K8r;6=dokiv>2NrdBhNT30{4%iM@?t`&C z-=)W#ot-8ZFP$T?XoSALys}DGSC?+xvSsonRf)d2-Rk_hD9OR}^kwOpV^6ciV$aO0 z@49VzVshl%PYt}Fpn<-ex=j)9>nCSstRy) z1`JuJR8kOQuviWWz`Kz)g190zFmy-jP&iV6;W(~Kbbz70QV+TBzSj^*j*t^4juAs| zlUBP$DzzF>WCcGfPEXJ57X|Sng226hbZp@KPpr|eRpHP(F>!V=n+ZHGFgQ+JOC*xj zhzf=VZwI`G4+NCa*tSkTBLHqk0Lv960t`kc%gb}50$y(b%dt$eTZ{pe<^>r(6SSeCW_I$;6 zfiD)9me*zUUQCW?Adcfm1PmQdq~K>BFxmv1=fQx0^^QeE9z;|s1Kt|}+L)!ZadmYO zXl0uS;MIgBq~2(N$DwW1x$uVgP{j|U+7q;22YMkEEQ1>EKUFm=rdSmu;8->91Fe!U`vt|!2Uk6Wy^Sm5ao6__*Z}8j7}?u zy150e{X<&YIRs21t|*u+dBEHj{OOWtOhQr#c*|4O+5yE{t!@wxj30#dG7e}@k}Q3o3bSRAAJMGf`AZ&I39wryKOr>05Th7I*8fV78@y|s>o#fwrymf zzYjzcV7=*(rNtRaD|tA83CEAc5~NecWqZ+-B$lF7vSkB!k^)Qa2m zIK~lpZeGJ;m4(LgNG6j2d`zlS zVYdtn-pR4u+B(m@^b-AUXA0N~M~a0a86O{|$N0wAzfP02szyM~#>m)~Nq{61Sd7zM zD2Sew<)wtCn{VE~?*_7W->!cHhwJ=U82!au9DhdT8HC|cS(dICy4wSMT;c@=)S?Jc z00Kxe$i{kwT)8p}36CS#^pD3PKo3>2ys`vFMY@M&FNT(IF&V!2d%m|zgoedMLC;^` zSO<Ff^l66 zGi`_vG_>bh@bs`|PM@2&LOmOejDI?|NuM5wDtteBG3Xz7&87kgmj{`V3<(u^I~LFI zyRh;p$ui033-B2fWQ<&`R7b#J&S$de7xVWn4SJHl=qu`u+2Bi-n%v(x)?-Wcw9Q88NBBg$DpJS3$6>tu8N&z|Tx? zZw_!(qt8a8O1(Xk&X9JqMrk3Ibo+aIi4uu|I_(y;&{%a=7)7X}R5KQIg! zz74#Yqk@Wr4E@vfEn>qWZ`-z$B*CZ)3x7v0uU#V9e1j-*1iU_^bQBi|^8~8aj*dCV zyM1|S?RhwVePg{WKKkglt2f-RU%KPYn?4TCWW1t{j-m!AoTVtzmnOH3B~?{;Yb+i; z-`iJu8czN{Rw`v>ZEXqSmLr8+kv1u|3&^P@pp-cXeFZ#~qwP5XScd_NG`4jIt+^aM zdYB3(d>=;7bI(0RkRf5A426;kP=cK&tm#z1(<6{X6_)2>i#6XVeku4_^}mjr?0u^@^7BRMiLv7O>I!VHQe zD2hH z1Iz`IGUfpb;01X&vK0J2A6V1Yt-ERRzH<3Itz-@i41$0ffrXN~B?MYFkVtRu0F55d z6yAXw4}3J6OaCdRsaLGg4bz#pbaC!C&YV7dZ>!VE1H$mgx1zcUYBNa+`8c_B=`8K| zV;uz>6fs~B*x|wQ?&|6)SzcNMQN+=N8G$hG19(utgRxVD9i|{~DD2RL4Uo_V@5it6@DInG04Fw@qvVoR3pHuT~qR4bXyxFpV+};ODkO zVTKMiu|DPJ_!Mc2kcDIFGSp^)=faea; z&JeN-q>j;uLhM8m7R|#_FhByKaDoLc^nQc~gsu6x8Ct(l)fhqMLnXcA&?Fm%KIP`u zbPU20E;_w7rh6P8e#XzV8Z}BA6NxlLQ-`vYXatYBOtk>k?7>$ls5 zKOPzBzw#p+9Zv`@oY8c%51WXwn7RO`=%TmK9TM<6xJoI+Z4wOYViyM}SAfRC3q|ID z-g)f-e;0rv_5wBGdy7TD%waM%x(zO512D5fdU}UwduXK^ znGIO%g7HIOH4ca)JP&LvyFLz>%J5#~_f9Ad1F_z*0m^V;VV>eB zKCwKzvc3*RZ&Rv9g$+E>o~~_CI7#OUqz71yC@JLf%z3g=-k=Q+eELqeHiOiYdVIG4 z*}X>BqeiD4DtH-_E6W75n1-(#dJ7>0n2}3!1K<+*&MRY@FR7JfVJt1G{!Ma6gnR;S7$drBf*g`2=l;Vap7J4Z{OxgGivm zJ}j$%S9W+fX^COjco1?uwi6ss+RV2VRpdJ@ z3xA?FhctDDU5^d?7d#((teeymo7N)WH67;z7%Blh)ZusrmJk>$s&yd=F&`_ENGCCG zT)c4hZHmIT_TRYw6YwqTKd{juN!>O-xALKd`Nf@$MosE;+O*D$yc8>Q$Wc*TV0i0> zMGYeXj-xnnQ6lqVx7Fs+(FO@Hbc<;+TVze7mAW#7J@Rk7a5N@fD5z>Gd{$PLXz>YQ zz_b7wJVWP^4fu zf{b(w#~_N}aV#s)zGRF_ZH97KNm4hiCsLmBJdcr00rkio$bSS*nGz;uvF%wC-VPj3P1fMg5j*)_OF`8Nst z7j2E~4y)4q0taVlU7n%N1Okm39rR3gg5N7 z#uG^pw|e5tsZ+0BSy}0wn4C!M-m~NL|5KxHG8Al$y>p}7yt`5@gTdD+zG5vq5l_%C z#To?~9wjo4Md*lgV4Nz}F8T-Iq+=9zutCAGz@35qp&*ICG0@`>D^ZqXPZK@aFd+0@ zgN8Ok7YD+h?T$&{1>+<$!Vl86T)sd|y-hta1<4hYCbFDbtwPq;m%&Ku^!R8X4E?UB zzhErH>g$3Cz5`(d#TBw6WIi~wL`Oj|XIQ9q&FkYIs6w&%kpg%v6bp2S6@}N_!W_g& z3(hYI2G0NykVxE3koozm;`#Gux12e3`rWfv4qSZWo8NHuB}NY^FSQX??x|JVzod1H zG_nVLB9F$Ja=EfbJ1FS+n91>kyzWpAZ4M(J z3>TJ;*)hUqT^x)^+?VJJq`H_SS%^^T;lO-Q$>PimVt5;13X?6C6TG0CZ}9zD)DGZS z7}=OB(6fgz+Te3I*lHLWc)UuftpvlZz?H@=Bsd|3rA`zGnr_hMFsfdhA>;uL5bMyhJhw>##6-9Vj+1G(9TO6E@K=C$ zW0(Hg?6@SbB$`VjW2TE}n>g6dQaD5YjEk6nuthKPJeyp+c!oj~N^xv%AhU6Fo6fG# z?hYh0>^5N}THq{bKo(RdFL2cOU4{~NB`CrSMiLkhfyTz<9Qd@98+NN_U8rZcYo1B- zSU@>FKn~!%2}Z`8BEstklNi02P-#&PUP}O@foo@W?cO#0KN#J%oS$7@T7T#4>`Wd9 zD$y&^D205EdNO(g9;nf1(h$SFKO7g*G=!y3+!?`x(G3d)1SCa(6HGd-MipMOsOKUZ z(cv`?%b>6*X;miO*+he?KhL)4g&;KGVq;|wBL)*DUVRNj$vjZOcq|T37pLBaQ9{Qs zP{M`36RDH-T6p8)QfX-S0{Gw-SO;;j82H6${Yxq1aN3L zS(|2I3(K9b(h^)WcI(TP3eDn}6w$MAVI+a0@PinLUx17Su|FD((By>6f*0w6aq;3f zmZx1EY($9gcZ3IwBAib#4U;BWd`iHLM@Ppf#v+^{zM{d9DHH(L6^gyy<}?80nF{X2 zXwhiG@n~#PBRn8%V3eR|c6W04w3mwJ!$`)&$zLl0gk3DhKj|VM1i@#MfZ>=VQ83}+ z)xZue7#(LJ%at;{W*;GM^B7#M)>W$1A$UAi=BXn`-u1I@eEkbXuT~o+z_{^5GVbPb z83{Y?K9$xksnm4Z?n0T(0j*QmZcj4>q6XVn_$4mTKctOp7|?D#hISpi5^LTV0a)b6 z2YM$`N!vDQa>L3Xo;XI92`7GS<`8p31fm5if|?EyfENN6ABTk;8tf+p5Kp-1-9aOc z7O*gJqfs1ytqvT^+2rT$X3n8l55`8E#i*hUYrk6prp#s&aW==ZX{0c8a*Ux+ijazt zPS(~o3uN6$=;n-o<`)@%! zd;5!{v6x&0SuEK=wfg$|(O1C$`eq1qYtHDM9nBzmr$vp27ucPwA{3wfK%<2vEM&#w zF<>rH>SZF&()u^{8u5bBuvIM8;t*)Cd6x@#)@x;2Y|52NG=G2pX~tf&FNRS3`*LXr-`0N;uKjQQz#BxWczG5@M-5Kcr3nf#RgrPuk4{5~ zR_`DbC0^QeneIevS8~I}1waewr~^yGuX_0)VJ3&#?HDF#6-9<$*D-EO}lg`2zO6xZX%$Nh{Y=uSt#CGZH;~&9R***^T)`fi%t_| zH>u(=Jvx1cqZSc@QBF4NGnlK84&v_=sY@CVdH{0$R6frQXL3u!`Rtc7xojhqO8YWW zF2aaF99Uh`Jos!ql}=wQ7W3cvzGZ;t=h_$d^eLxw-6+n_U6szBJxl2kv$-_|Pr#+# z;%{y%+2pzrl~S%uCI!h2k|YQp8Al`l*HIkd))c(pD7?=EDUY2`dGKl641{PPP!UvN#yh8H^HZzjRB%KyUno5}u!&<$g zV^yhtpsy59zNasqJkH6gKA01{zxeN8Bd@>r4rb@BNd^~I#8TwEM$p~}d z!nBjh7Nf|WLHKaEy&U_SimEu7TyDM6@fHD>>y5U3ak1skb~HL&2uKyFv-uZ$l%aG${(QMf6H# z!yCfr_)Y)I>&7CDrq-)*+@4Z4`%OiT9>x140K*6skyn$+=oUc1LM|cg>}YzOOKmay zkiDTV8`V9toq^;Fd6e}A279&DR`8{jMl%|ZcpJ60H4hi;fXAjGU|uDQ!m*K_bROuX zd1lr)mQF~!V~Vhc0lxv(Bj0vwFEccdr002lYJ)7VHp#${2vOyLR*Khz-E=*?Tt;WWkrC9t=A^L%Ev4PBlfm4&%yc{8S-#Qt7-_q{icPoyM9d2Obp>^c& z)LQ}9HWJ$pev*~Fx9PT3Uzl@#A6T{sfu@4faQns!V~w`6B#YeI#BhB4#O3m zV*KD381M4vKyfg~vC(u=Nyv)iJaKNyPA3%6FuYbgreK_>+imRtvV>GznVTHV@1I@n zT(WH@Txog9xF$iv+( zM^_;qsKBD|axocV!e?lLWNCEl*s-0C&J`h=y1(bhjr(_F@hybbI^ZW06{jIHMkDLuXPZL2s z?&U)9bE+apY~Uv$mw8cDgec^amK*xJx8~n~&U100l7lz}#3kof8`hP&Q9G4Q$kJN|GA|)xB+eh?`w%%qO#@Gi}Yi3VMHCckQ_4I%6qW z`3<R+jmR~?w3fqmhF~39{c`Fm z$1~$3U|C=+>k|X1LEUtHSYaj+mF_+}Tm5avcJBk*R~U{fgQ&6sxa^6M?1U`x>Ejnx zeN__Kj_x$U$h7wgNp&00J0_Qjuk4%b*;%REa|U=hk=X4#3(L&-JbE}sw;zV&T4Hs5 z!AWPbtR%|3XKReE>)^Z`Wmnj+P^0)vhM)?=cH0OVEh`uvPJ0|3<&&65G^zCW7o5IQ zI#3jeS?`3Q%5s7#$ma)(u`y83k+r(@cZ+M9{mA3b-Sn^D^SUq3Hmmo7F!G1f>F)sk zcT`ojixDCC#<5k=wteRxoM!vJE8-gO`|z*7X>m9k?*&M>;4$tYF66%*i3nr7#O(nC zU?TTLflGS<6Yd?)-;WXU*mH9Y5Jo+4@RPu`+h9z1Pe^u-WZqtHTeFt!Cg!fLa8DgQ zI~tEl0whr1a^2SgmRo@3Tuc?S&z^5wfYSph%M1t%w+wi%DypzKNzjen-rfY!+P2it zVhfRE&qk^+!9S#&?v6YJcv~D=s;bZ4->KiENKr4B} zHV(mQe_Y^%2IlL+K*GB`x4|u~*Ms-}t2@FU+UOs9$3VCVEuk!neZ6t+H^2JzqtOT6 zd20)pwRA&IU)^JvJ9v)ilQ~Ww?@tvp%eBDqoK#GH-ADfP>yMv&{?a>{Al!gFFbi_n zfR%9%Zts}@$e28GdSM3gjo32me)x(6<^$7lMtna=jt%5j4{R$9w{>@It!5iQ?S~nl zGJMD{1fB&Wwm(jvgXdLvx{{jana>6SFIqvs=LukCdq!M z<;5QP%-&Dt@)!oiZ{5&M;9&9(BTC61;&kq32=Z1^%KK!oP z<>vEW{`%9~4<6cHZ8SRkTBm*^dU=05`4C}3JtnJm62N`t>N*<)Veo@YR#15P@P|MA z(pSgcO)-6Cwf6Bh{^Fmxn(h9P&D#4VhCdC0=nWu99ti#LXtmR>=hNyD^5gG4G7Aqa+ zSlcr0NXpVv&8D{XwFf6MjgEccZyq{4cyQmia$wh3=lIj-jD~5vTH?7+1D>zBjBAYL z6VA$fnYp@H3xD<9clkfC(ZBbRzw%c!M1KB0b*i*=@4u_EZn8n#(t*K&g?L1HLrfMD z?T$5-=t-oSZMb~bx4<6n{?sF9&h-oylzO?|0^WNSfE2u(4fahI#{`beK6!HSFQ%s! zw%vcvfi>_NsiKIDdP`><$J^GE%{;PwB)ioQLih5bQDb;+2qJ~!1MaG07@7X8%B!kK zn;{z;xJ5mnMu&tBDv>9l;X9yoUC192IHKs-ep6B;t>J8lkIbn-z zm;-@zD3w(0p;96TbeB9gyV8M(3>8*97f*0M3-9AD%{Ly`bbE4gwAAZst)86+wtUVD zJZ2=F{j47bopfBaGOpxpzS5wNFp48$f}Q_ue?z zQ(LcW+p%lQlwsM2K(JV<6q(8-<>BWpG#?`&%LgppCXj1^BC&wrq;t6_t#NBQ)=h#C zg%Pcg)^uVzfv-m6$aDlqkgQ?a5-8*~f#3vSy4=c=H?UEY_fY>7BRxFN@KOV|Otc;|p-K{>fZ!HXRj7RA4UEYMs9Z zc=4JY3y{Y*o;iN$R||dlm5y#_4Bg}{(_R8B)*uP`eUOX*GHwJ$^A{jMWI>cp{QjRk zoVP>fYo_Cw;JNq7y!_a~o%x-VF`aGAf)q@G-BUuq&jN?$*ucqVQr+HVqhXR2fnA|;_|k!Vs!Vh(EOGcuuQ-)V_e8~n2>3Meu+e)LNvW;^jggzTZS{V_j=)C znM}>pTq!#+&C-2YJPQhx^L=Jbk_AVA*Y3J&-^PFa+!G1Qbk6_Ed+$FFGgAmS%>>&MmAxb8dMy5mz_}-9#Ix zRIS|jl`Ug^S}ql5O4$U8l1>!DWYn&&EG#yOFGL%l z6-+P=kCjZ*3LK6RIzY93_;fy*h@@WsGdEp$^P67va8EXJ;L_EG0t&p6$*9NTs<89q zeCHdk?~SFD=tF_;?u7HrTwJVQv>>;HegJ+ZJG$%0Ac#gmeSX3V1A~(#yVR$I+gHkj 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 literal 0 HcmV?d00001 diff --git a/plugins/weather/jisp/31.png b/plugins/weather/jisp/31.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e919a89ae0728ef13b807ce64af3ac6dde50fd GIT binary patch literal 17576 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 ak72!)8%3eX{E%?A@E700QHxP)pZq_a5zP$% literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/file.ogg b/plugins/sound/sounds/file.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3e10e056d19d49b53c6ccb866e117149d5ea178f GIT binary patch literal 233051 zcmeFYWmH`~_b<9O?pEC0TMEV9-Q6i#++BC^;$DhFkpjit-L+_OiWVzYT=v~O&wK34 z`Hwr!x!-O^_F6N^TyrMBBr`KvYpZNZ5?2`?0uf*hSY4nIS-IhKK3&qBIgv{)l)D0+sv zB2#~gdXzX4kwy&DK#ID&I3k@p2LB$ZMw~pOSaX(Jc|%&7d333JlKeicg`&7DQ&^Hb zVv&ZjxGY!Nf;tnKo4UHK*l(yx@kYu}^x)|Pt(SUsi((Piq5!G@fEATb7zGm={v8J3 z006i=#<(rUI2yhrb2-YTK;zF$WteFS)+?}cC z_v9Rz_x7^fCixgL-3EF0v)rOwt=O%hd|7TdAy!QPQaSy5Vs>ROd4qfpzReSk}N~z4(uZil1lqs5na!lF( zwj2ons6uhoWvRmcbBUx1Co~&oD#;2)VJKIbHJ@r^uwc1%?O;maxpw2RapSSQ7-p)M zX8FIwf13_%2^dQp>EDJF5t@&)@8>0}ivPD}QbHAWtC0@4(8{>djwG?lC37m&2~Nxk zD*csI!&REql+tmRTC0~@N>N&LS6Xt{(rYl%Yjjvza4<=8*tiM!pP~oZKTVVcfZwul zg|bnFvT@tINwlDRs&W7zdKpcOQD1rEwq=uO<7g*{S6x&uZX4W3HR{mG<%|8P?0RW~GNkI3-v+#2U*2%k4BlL)i?gz-(M>T+9PY+@@n_oE@QJPnSJ3 zyL=BDqN&g?+pjvX6 zU@{p0V}xH6S(kyoW&B4dR10MpHDw0#|B;gaJPg$ZRh08T>-v@fW-R;fy6B;bD9h;o zZ|M5}W&HmL{O=I}LoFkK2>qevPbc7kM6&>Jj|(d*0FcVfumXTHt->tSHqLOW!2tkt zg~a~fOZ%@&MWNEbuz)BS*)nfBAr%nC1;AqLg6Qw{fH4?rV$oS32k}f044oa&c@K{P zwT9f*@~jxD*2D4uB?{1;#|Sm>IfzgrqZV3hlffuH%c+8!Z<9eEg(WrhPRYAq{|mjM z2CmYp$O0P_s1-Ffn=)q3 ziOYYCJ*O64#-7hhW@%X&iqfT^8tx0HR@e(?29&exsQ15d&U;Wr6wH8fP3CaV_0hhHx(@-8wEvU1RYDu&S zHSMFd_A7wlqKD;DBh-45@6T?AckM=4X()tT`^HRYL$0H7Kc5&C=SXDICCP-h@g zJ%)WSD@C1YFw0F@z7*FS>Zuf2#IWyYC987`rn^nbLH#VK7g3lJ^Wt)-%m3q4Ko{~C z&jPxdBV|J$V=98OFaW@}ZV*7(EuA=lEFFx3u7?a1!T^M%L$y!<1XXak0olF`G(v z!;-go-I&8ZM46JLAKj5MDJNIaK%pIXQ|v|f z2IVz3#^&-h^MvN79XEvL+IDg9z>Q`n1_3KbwvSM(2sB`;f4 z2pzUBijay@Qq)oCQlO9J7bZc+DYP0$`GuP5%%v$f;z)F%N%HbcshaXHLZMdnzsZBX(+A%YN7<1eoVG&jF>!=MFRU^VQP~2 z5Mkk*nL>UDuHRHk>KxQ9qC^6a-h$u|kWf0YV9d|}Q7r0rlH#U#tZx}Z5F&hlGXR?k z8=$3UoO$ymZww%CcUk<16^s>1iI1o%3WK5C{Oc2s;4cJ*-?*v#(2WSxguw&e03gZ; zj*PUb?A?N)kuVSW+P4iW`BDf}1Dmh_fDEFh&S*i2MvXy>MUTUX$Aor==*z+YoxP#} z49vgo+DjS+=HIPwx6Vr;0K9C4UrISt-~MGJsV*oeD=aT8D$gjVqNSy#qGe)iE6U3( ztfr-$VqjvVud8WlUtsnzIok5B#ef->ZNI;ASZ)$*%hQzmLJOZU+);9V+T1op z35U^Ak}3S_pkJzcZICprWH8RN2#3wltIguq<2j_J-;syLO)mNBjfT3-gT(w^ z!JYHr&E;v4p?I5!qj69mevEI)SDdkmi>ctO=rNn3)}x1ZWXba7--=}B#mNuf>20j!_ZIc z*Fx$#T;b9=CfH6169NUyF)6!}0cTi{@f7>o&o&A+587$@Ztx=vSdy#;er5}z%-j@e zqI8(%ffz*bu_Jb1jynlAlSI(1=#FG*8`W58L#C`E&G*f(Xr4MUujOPWvlR52(wMg~ zeAy3pwnx%5cipP;=%;I{<_cbUZb$*F);k>cgrr_G5;VuaDq=bgSja7t_i!E} z!q-FxSO;-=v;u%+i6x0>*M>hf@H7rVSsg!XebfiAWJh^|?L$ZuiMcs>?DcFn>tB#{6-!nbR#261F(U^T0i$&xnISA7W<~*HF<*M!UJbjWcGk4anpip8Wl>%<(L-mn+`ryaq}pl2O~8T z-Z!-Zp1{|G@z^J7FDk<>p18N|H}Qape;_u`JN#aEx>BoQE6&vSOf$P)Af|M+uP`i z+Vbu&ueOo-V&hjVwcct0(_OcCze5oPH}!QO5Pv}sV4P$I3p6$DRzE=xX_gs;Sp|y=_tqR=#p6aTNPIu7w=k^`C1BFyfQh(fIGH4v1eg)YjBxG zd9NP)^Dy0c+s|?FIp?U&B!%Gkof7MgS?kiUbA(&N-7t!*%lTVKwkwDm=Milj1Qc9q zEn}t+I-Aq9<~+=61wA(%fjeUZKuuRUAW<#nG)@_ld^v31R+yUL<>?bc<^un733N(j z{_CKhP6Cep6Ara04Ru>&rmdHOJXxI+4!@_XTrHfkC_LNY5^EgUbdKJph^xil%&0}d za>;ry6-|4P4<^9}4o_fh5apT~6Z?9Gdhh73$_#4R6H9M4jiYz7g=o0av8AYH#M@p6 zohHKr%(0+n7=uh)(x)O3FQ7Y6!xAJ)@#IeoD5HYc&EY%%u*e)NvScB8p|-b58)Tra zV72=%k_$h~nUfs*yr!Hkm)*VI1D9vayS+u8tE-lyG=rFflo9!*wg9Y!+F;1gBboB9 zlbTG08L{@;!#Z`WC5EIVR~h*A;fDU9X5r*Pw1rT;)$moB3n8Xx(54RXzH9j|`EVbE zO1I~K6>lQV15_{G3fy`~tF|34-b7?$ZT=ZSe+6vLpF(bUK#}A`k9N{bXb8yDm)puL z-riE3^G_dTlr`k#D0^0_aoAWi-r9-TCBABgCe2ukNL`VWC^CSry!6SS_dyQ!SX zjl^LR)#vcHSerdPeEX1ilhQD3abKZa1<`G1QPnc?7{maX@jqP19&skayS-{!NB)?&4>DOV4HP zJj00;i@&d_IE;+%CdLrM2w~-pW0PEuIVNoq5;mv-?%|1$c*AiRnx0SMj&c50ZNwkN zeYQ=&9XB~m)s8YU4 znZOzEb2b+i)9Et^Vl6~$fg78QGOQtn)xKgmK#ufYPM?cxibE$$4Kabp&)D;ZXVsw_ zYw%mcL+2dCX`>?jf+Y0j?}x8P#pGu8mA(~Jk_ha`yVu|t6AmRwyg1g-QCAS@kAl+7 z-+vPuc!`c24lyS;+-8hK$QJ%KfT)sHCN`4*)*ne>nZL)WQcW%@$-50_N3y0m8&4P4 zkFqdVMvtSPR>-tq;8b$4J0wf?PJZ>+s5lRLmgx_6>6omO#95S(1imAmeY9dlWmRfB zXZta7p1u|C;nCs?Ojgy0N{3yL7A+={YM@VfXF@e?wPqe@&L0YGkl+8o1an+<(RMl7 zm?Oq}uc`a8Hv_m+1)q{j){b3swR=L2=-Ae7JMbjuz#rFegyJn_KTKfpFIQK1tb{q$?XTWBGDw3$7nX`iv6 zCW#Ht_$M&^9Tt=oXX>LDdXFF9;#-~LY78LY z9@OiYJ9^xwU^a~j>0gy6h={BrPXX;VfxuipRB(?UQ5SuAe!BBDG$gWAK@DctB$&y&vksC1xiff zxCINcg>F`rXs5d%32p3gHwTx*|xz-`LES-LvO**K~SAnvCI1r@+;N|eB^ z-R~Q_T(pySJ~AM%0>^C)BBYys#@qNR@cnmZ2I8WTO%5Q9gnIF})>zuyr_7t3D3o4S z0ZUmT*zYyxL=n{A;0y$=4v@^WhX(q^)pH`Tk;+_Kx7$;$3hbHSno!DPEU($$NSFHAnaZAJNuXp20X_+EZ%G3( z&Ld!){{S5EV)Yg)_aw^mZ?`_`Cn8IZ1`P?Ojr+zV<%snX^J6u@9}re0z78ELclp4> z)8W~%f0Sy~_G5^LYT)3z;cG5Dsb^KR!gNNfEB^i_9ptDUb$(2OQgV$UyHJ30o=-w# zcBw2iyN!$7|JwSixr~xcfTn}f2EvgY$Kl@2dOy6RM#B}`?7{4}KTU5i9ov0w_ybXz zMsfm=0$T0hwqpQ|M)_jYIJf6BHddkR#3QhO_A|w->z$rrCZepDbBYvu+AP_vJ+sAP03J_E7~-* z(eXTqSUagy^|m#~vDH3D9z{tmhRl;GDIBFe1i3Pt11RB=I3|1zZl~oqSG)=O->ua> zCEyenvwnT!Cs~$;oEJTyl6UhfS;qBQ`h+3IkG8V?iKT;))VilrNv)hY_C7bydWD(R z&e@rV^C0rPPvUT$IbwY9oC#?nxC1HbeS1p2lH{9z2tN%&UfpO2gvc4t@R``$yZE== zO(}z-CJBW6^sgq!$p2B#|Hij;x21plVdencs(qYI z#q-)!=sk|GFa$=jMb}=yp!4|=jr>fa^btY<+z0fxUGo{QQ=ZQf=;EJv{+I?QZQZcm z_cKI=qv>6Cs_DenX;RJLawM?DisK`d^&hLMJKei6`*==oqWfHxzH!;6@qgVS8l-hV zcv|f3&mJVBouk*v6{x*J+fW>~7edxV_4PW*;C1$CodHrshAr83fRHxXOyo(cmp%N9 zQyFo7p8NtaO5lOk9P+P+Nq<76Z?MlYj_)U`?>te!8$saE%Wche^+yOM(4731a(3@% zNmo)h4I2PE>U9k~5@S&a1tC-NKhgo!%-vBxoj;tI$q(Bm~$Y{?~pTCFr3U3q!t{GDePJ^K*uFc6FCGL;dY^8?ER zSBDNNj2yKW?)~b>;MhIAReb04-@+hCx6qWo0k{v)yXAIn?0Vi5?#BN`ct7UG9z-^o z7A1QBi1HqK@Op1sC6I!1(L=7QoCrQcn$nS2}NVzWE4D$(QP zoq5TPXx0LG(sr8dq&r8K3)l4Cu3<*Ve2`9c^&pRDh$Ypq3XoXdx$X+IeG^N<=(a^z zbC1#l`=9seb^n|p{Bwu^J%s>vR>JHV=$M$9>+`b8-&k3f zSDaH){H=wChK7ntP-DJfWX|Z#Bx~2z-O^83k>;#ol_ia~!S73?T0af*CKa+j#jKD)d5;He8pwSFE{o2L3h^| z#wbjL`{9b2+jG*8l0SBwrOC|~&&AJM;a}P*1U1SilbOf79p`xhlDd0#WGf4;O4o$J zzr#~@nYN@5i3S#b-raJ$FPJRrN%a<(jLhiB&m3F%CFr5^Ch17$)kPEC5`aHWi%M-Yb9l9PmXcw6MZ&Q(-Im3&zpUGmGwlrthK~>8WfG7Fqxd31+h|&qnW} zZ4m?7H--_x({6}JyeA;05z5P@ym69s$s6b6A#Y8Qdw>tY2Jr^~uqg!niW>Zlt`QvK z$5lKg$*ii~_WMyR*TY#F3oAav0QfklrkAt+`pMH#Joa~}bu6RVRU}H^FzA_&94H!#$;XX}&M9#7v_9R9Jnu~kz0XnXCMW3oCb9ZKc zdn|&pv$CG=b%)o7Im?xD&86r>hH&Iu?%>4pD{HAohuDo3CeC@Pg$xwu0X)>K|BKBs}4&_jN6n68-Rsj;*ncn+xKR8!YLI*84nTSEfIzp5oS<_$5gOt3*7+Pd# z)SX21C*DgV;@h~;7X-Hs;e5gs_6+%~2pzjYFO@T$@8rvu+3@DbGif&h>69@;j;mh% z1iIZ@aIXzW`xl0tkYV#0jbVTp=9rJ}8Oa|-OHqNe;!!gfWF&N&akKd{n8p+jEky;q zZHu0DDu$9l?x+&|JZ_Tu{2ij5MFe-x?-RR-arYY^I1L6dwk zcXdlmLQBA==SJzSaP9o>_M+H%G!VbSh=U_c9`6&p=qbxH29SVF`_NVSO{%$qE7GWX znTk?^e_eMPHxdx*cIuWcSlb?(e=QBW*oZ;Haw2}qn~?C4#k*I-f~G=w8L247PZ!;h z3b&piS?m6kKOvR!s&M)b?7|)0^xq9u^S>BWau{y(p9`M?D%c6dbSI}~6I;=LjSf^b z0p!jIDe7Ue&$n&mKbE9^+3%ZAt&U;<^-YmgJprJzp3@R>d-)nIEzCOPORP_rh7_oh z?!Yvof&9rUocEojk?&E^9bI<5r(ycs-oX?`+F__#S}u_!U16t7*dWmy7~IV@5b{y= z7wqO!=!mG!IzT>7d1Dz&qcqDPJ6XuS>pEk_+Qq28U~CKf&vZn0o( z$Ws+rcmDn(WWzmPRentdb~R)V0ep6mSgx$Zhm(3D5hve%;K@nc@x0g6L>w!fAyV0@ z^G)ls9Uw5A7ZAQirT9hp`tQ1(m)#dwrKE6HJ}k)$)|-ax%tTi9%*?C453@~uo#MX} z=Jr+&s-)eVt_78U#oIF7_(wg|WVPo8_JE2NZEu5WueGz(&7O{D@h!Fk8klKeVSgZY z{+gJj1B;&;K>A*0?4|NP_MI|7-gk2Y$j0>yd930J zJei5z(=)PZ`%kyu-uHKIB_}G?<|!k;3>TO=SHGlBxjQnC-8yjm*>qTmt+(6Lm_Zjo z9Q0;gEK`}OX!zb~r#h>q`y>yfHKV8EU0h<9u_NuZtuh}so3PS)4&vfZ1%Z7wWIsuC zJsyhyn;v{hqdE;D%fjVcKWmp))=DZJo0TIXj#^JUa(Ef8m0%X5r#9?>ii$R1W_AE1 zo*@sWOtv^ZcK3WD7!p$9;^sYT;CU@osWLNihb>@0Mz*hZKl6_CGxs1f^mL+-i+di1 zkL|A;>rQ!4%m`VNRfYNAKb|M{Y^$Br!5rV5s;bPd|2&z5IN7FBFFAr>N zSPRIg1fFF~by#DNxJ$^So$N_pMUxEi5?~9erEW!k%hGSHh3pVMZtj2DPiDC**JyZ0jvQQXE;>GhrdvwXK}5+ZlGD#VW9joXorI+_dKWK9N=h z*&7jGwXxCJoD?e4V_JndMrFkB+sg+Yh96CpJ}(Ac#$K!igqj=P@`evLY}V1xQHw2jDTF(!@^j}zg*!3g_^RL+pBaU#;m&LHk0^pq0z?D9Qb(3`8j>wmzU^1AUdM-%u;@Njo{ zs7dI_A!C|C-1l_J<4DG|I%B)p9biB|@3^Kji#rn$oVc@aU1`YZ#njIXGH$QL zmI?N3g+sw#-n#m&#u3t48qpffE_syGgV_>12Knjin$BkVQ-n|J`h&rkmmq`XC)a`IzI|{-?o&mCX+Wt9C?7v{l8o z#Nx*1dfSise{)Pyb(VjTUa~l>%`2D|^M-2m7rXS;2g0(uJ?wjGljdqK@HTm}iXmS9 zWTVB5F!vjvSw`y}B@Y1Bzvq-uY^8YlG3oZz`o4Cx(8~EJMpyD0xZ%!=6bxYuTqAJ; zIi0oYKa0fSTbM>su0lEn_l!XD*{5#f1TeR}a`@%|LFWT*-p;fzfE6x1G}p=5L!@dc z083#aFyZuDuy0P>rjaZzcQxO>ZGGa20{vs3oqZ$KypQaC96r;S%zo$fujBf;c+z5ivXq0S2--_BNv>Ki=9}xy#)PcR_bdorpS?@}xgQPlV5HaaMnPO+<=#nA*cO zJ($cXrp}e1uQHvhB6LFVr0uLWW?dJ`U40&&+G+qN0yhwL;>l?yq-Q!e6T6Gwisp$@j7N$XL?%mH18seaZX zwCgT{NPLXzfCuEchZnBZOc1CMIWy5Je71^IOuLBgBdae1QA*)J9?`jE-nr#=RB_qr=(R1rp z-*xgMoE?qac#2m?6zC~36K=%^G^2Kqyat+kI%7Kw{2Na<$1fj`Rorjwn@)IlxZjSC zeghYOrieok8uu&G17iO8P`nTQ?KBwc9+DEG$Y%9Dqh~``fHeBz@$VE1l1^}s9mk~U z-|f0kk6Je^$ujqtABT=^WknXpor^PWF)e$Cf+|$M3&#(ng6+w)xYi7Q$TNjoPY{K< ziHdgsfl=X)Hv*?rc-Qv%6_u&Kx}TNxr4A?Lw!sfTyhqiT7pDH-DTH?3j(nXv$ZgY= zEILB=@{ z)!^`ripgZOA5gngN(B5Ke4RReuKTuKo>rVSaBEoM8#_gECCAoSV7AZ)`^1We5J{hT z8>&jHv|iB=hU=^S{fLy45x!$}UxL56UQvpWZQgs|Y{AlNNr2tjEOvA}WcKlD!0{JG z=STI7s%MeEoJ)ug(-hEenAkd;z`NAAy&;gNQ_!2=@Zeso?s2yk{Iec5A!2JpCs4KL zyE9>{Y<22fh=pa@FJX6pnF#7>(&*niSzOhc-JBDr2|{A`yGDvHXV z;;@Yl(Q!aptgHifY^REbr@wXU1fgLYq6ynt9qu#4r_9hL4dqz!kI+J{c7zhqdsPr_ zx=X*|1+o31D%SQ!srL3k-7$2#f|Pb60eR=|!0QKH!Odw#@PM*8S2$@pon@%o2y(0@ z$zE^tRT8$ctkB@J^YbO-LK4FhBzB~*tDdHxE+G*Q_R#nSG}`Rls(fHM*Pf!Gy$(CamX$Jf~n@lEGGGy z=&;iIUPAw#$BLL_pUZ<p8eXd zs<=waBhIG=5gMIz40<6qe!KeJVZ(49B)f*Cj%zkp`;A{;CmVfSGMh8sPMVqGycWw-#8rLLpZ=T86RG#L+blMAvQ=)y#SP<|Nx$=oFSLo~eo2BUk) z;i|8G(|pP&3UEno=uPmm-bW5(jz$_~>>)GY-{S=^>c5|~zI>wq{i+U_&Ox`Kqhe-m z%gN0vEU2YoVq&cR+DJ!3%go5!SXot+pWnvH!qWP!i4NM-zRt$Wo<@w^$^CV5Fo$K4 z-s)nP)>kcKL{mElKTS=o@OVxYE5+i0``ND@#p%H|Nwup6MJ+wyL|eX)=d`PdOdbyj z6021tLjxVKloo!<;%bl!r{{ajH2SGjifc~UncG9w_Mi0++edaoux#RWY4FQ(^qQ0a ziDNr$eQopFBTU%#nBETRrkg-qONBG^?U#!aDPjgD8$@Noy|3=Fr=(=4?=tpl5NeDH z40z_K<8@!hgFOW-8fJx|&e#Wy6ufua=6bpPLx#(^zc;#gC^m=5Lc1@>{yZcairO+1 zD9Z0IxF1m%gtkp|P8Gs|$N6sZ-lRP5f$MLCoL`F(GKJsi+i_c_82NhV&Ho&7N<^{? zj#fqrt3D|6(xR7pa#%a=Sk%25X5?)Yhi=QInJx4K&ff;Bel3((A)*)WcWn7#Cv_`j zYWoBav;*-X8+e%VIRg6+4{8cAS{5yJBJox;e9*s_y3n{~Roh2SuWrOF0gf{5Yxvt+?R1;K6M5+7)rAEpn+|GUQ>Q zmVfAH4VbVib<|ZWaKEGVKaq4@aY=}o5s#Jb0E~(D>h`|lY(>l>VM&<$CcN0oZZoUN zL<%d|7w#rQckHT~UJpU_;*w|73dLg2A3F~ckODR*124cOk>F!T&kdeXn6pz^K(uKF zK1+2UXm8Pw%Y;LNd?PWOa2M7FGta?l@JBg!6UHG{%9`d4xcjAME49&j~O# z9%AJ6j{tP*dU3Ar(2M%e6>Q(E((uwc0g<<6VgX=Rjk0G>`jWvIN8e{(E2&D2i!C4X zMqM`+RpBx5k+8h=nqY;}#GMD%k;?KpmzsDniM{0lv$BRk1Pf3ga^p#l@-L;J2!dw}BP43%db+USebftLvAY5RY7I zitjBdF7v`1&fD&da$0cWq+K<*Obd4Nn=~jASeaJp5AU^6U_PbK*h1)l1?0V!-BBkx z`iSZ#!blHy#VxJgv6XKVO1CbZ9_f!}MPmaQN4|e=e3WnU%s*;qo{Q5xK-d?Jo|I>2 zuWT3AJQoa&Y&f5D-7fRovkdCldUHEDV5q(qJFctzy04dkb1p9Y2sh0URxFJa?Fh~= z`uJgxo^5K{Iy`KRp}HrE8WKz1W5f!Y_pJ;6MK}v4smy*K?b#zc6rnpdwk$)&6TanH zc4Et0Ra0b^)IUwp7fYb1W;Optk1y6e>Zx%Q@h(e6;cHcmKos*$i#bQ=2H^?xwL(>x zvVjwV#_!BcMvSy%}Q) zUd_u-e;bY#pHd#z&$_OfuCg+cORp3lN`RymKGQ2pJ&VSuhfe^%F5yYh!~X7ShghnT zt;J6a4ut`NpvS2~T1;ZwJy~WxjrvXc^DiPA<1BD~gCzr#(t~}cRUw^=KW?J8tK_z8 z=fxks!1k5W>%D=ndE^Exze?sT*K^4YyC1Th_5bYv+wMQf0*V}Lil;-jUib;CPK0Py zZ)`vF_RB_6&IEQ_rUYBy>DI9B#4n6B(t$xM-fS~Y46o*z{ngKOJO^_Mj8R;H<@yS- z_ap+tIE*YS`a1Jgp+b2t zl7#x@&}BF9h6!T#uK}Uo)A#r0EPbVOnc|R*T6Eyv2_HrW^p!o{0{y$=?iy^KO5iFi zpydi^Yw`nF;#vMmmv{F&`u=MW3BxImDR#yWJf6T8I!ey945RxXsmBoEzpYi3#!H^F z`;NG?cU-PV@JC7{@tq{iH@=^x>ZwHKwxF1ug>+XH!yJwbynAY%l9rz2oFD^(7>iS=B(u{l@`tNOX<*1a>dVHxsA!f zSQwN~D(Mtk+??gH=ki$L2iVw36&oOw4W0{z9v{_z-g|>*p)>PiUJFvW_vrQX>H5JH1YD?|D5^vaXl5YwU)WF0pDJ#J-dXJ1iW#!Gf{vlXixoHOyd7EBlUb&T5a9thoc z=zE-833qUGt!U=~Cm?nEx{PXh?o2Od@;vB2T}C&nFCCbte9Z=kkIBv1c-G)>M`6QF zy`y9Xg{JKjwj!{klFO(+N916amtWc{Pq=YEP{78yCJlIIb;gnTJ$S)t-ki>oWKSL8 zCsuBK6?pv6#RrSED8j61n?V5GC(?rne)20VA9ug`K;0OBdS4z--@Nzfh%kHYw;g}& zwzDy_0Z)5#DMj&d@9MG5;Z>!{&Ct5@5$v(cGCk@qB-R~B%NMF%~vns9F!b!-YKY4!g(KTA-?vv0jLr_LeMs**0CkoxROz=%X zKC{6aY3NWUHiUst+(uzV`8S(K)Y;>Ya-Z<}e=mW6Y#gBC6gZP1+jM*{h*x_ZvaLHs z1|&&HanEfFO0)>@q4WBYX?w(9ElgG%N;_Z_|7a$OO7&l>7n7s-ay;cd=KgL*sYNE@ zhk~G&UQ29w=3d1Qk>v-?+R!w-C7;GJ4+VxfA;-hBIUfkH;h9ZWHmE<7S zx`+@VT;h*Y2;`fr#<%2#eP#FWu3f&`)+D@TgWGa%hdta6%yjm^0Hf}Wo5TR35C%Xy zYGL=|k9Y6i4Xa9!C#)eF2T6v#rR2ZrXjZjkMCYUYYiECN!S8$5dCC99a;4p&so3Ma z)ld_&mtd)Yvi-iamw@B>RgPO+BJrou$8Sb8 z%$;p-{(LpAuZL|b>h6BC{HZFVb;bAe^=1}XoG?g5X#`Oa`MrMtCgVVhI%HO=R*n$( zGb#tZat(~IF?k~v1(#)`QMAFu1h95|(`qcM;K~69)VdBqj zn||JZ`y+MZW=KBZEN4i>#9;en60(=J1+bYgG)eODpCOyWDyRa5B*Geb`KkA2TNs4fJlzTYn zXnx*`bFJ*IkW$vflhOh@4+qYKbYtgD-XD{@53zl6 z>EF6ievcfcisJqa-o9jQ2L^cg`rSDhPcL>GxAs`ZiB<_uhJI;2M-Ej_^5~2R*X7!vpBf81`p24( zOqhg*>k_L5{t;3xu9Sc{PX-N5=!)?#zN4DoLm!D^d?JpBj=~95|E$TT;L36c;J^xQ zy!s)RBJ{|eTCqY*1@DwqFX(mriJ?LiW9ren%jaT>Xa7kf%Q;|Uindfzk1gj({c0iR zFrZ5ivR{-+M|~Cp$F&S!%R*I2f0TwuZ}P!na*@{3jDS_osl#T}m))SvB!>+$gRMsG zZ2XMVA2gkySrd5YAE9g$>Xs{1H`eG2= z+mQvdx1GPs3BU3?yfm18pnLy#u@tm5JtiE)!&kD)c6iU?l3Jwayi_KAe>|S{tH}sI zZ)ZNJ4MtD6?*I7^7j0{iC#TXa1kx{$P3CW z=a#!xVl+!KY}-F;lb$wfQV0tqelji{h<;1aG23Iu;$^Z@(CI26DB~AcO1xM^L1)J` zkOHhTN#h$YpnsOWmGg&gT1;8&;^rwI(|Y%vU=yAW==ALn1GdA4h^+gXQ;NA46WcjKSemOr-xb3H>E;Er_%$XI≫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%0DVv~r`cP-HffI;(T5`!mY3><9lR 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 gpe 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 literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/filedone.ogg b/plugins/sound/sounds/filedone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..71b60d27ac601134ae30567789def3172d7393ee GIT binary patch literal 56595 zcmeFZWmH^E^Dnw*a37rD?j9`YKyY`r;1US#GPrAy1b5c}!5tC;2`&j1T!SQ7@H;%u zd+f{kue;8<-)^s-JuS7XcK^D&y1IJLsM*?T0bt-ip%ne!1mBWNC5RH_^~TM@-uXFnFQFgdUq%%0dVPBrJ5Dt>Tk6;L7P|ki zr&gfm<>uz&7T|sH#0`Y>FENeOOI;#7(B3rcgVF86`3X5a@?z1GBPaVDm_vacj>K^rQ}&6 zQWa53wN$0#`7`DnhK&{+@<9_{zv@mE-IHMtpJbB%44(2YJ@s-=_W?=)+?7zuZX=?t~`HUd2TL5 zyfVnJ{$Jw1O^3Gx29ZMjw;`n@mS1^x3*M?r{kLXP!v*$fkPo}k%em2iNo7}f%cs;N z`fWy3rWydAJ&h*j*kYl?P5D%Mg^Ut~ylsOb8;3Gmzp4uGKP1p6 zlBd9&wZT%h!BVvGqKHnh$l9=|%%P4s`@>;J-G3E1{~6%P05F+C{w0MRKEM^=3D7_2 z!sh}QaKZeX3?KCH5&xeys-43DHJL*CpF02mxakKq+2!2%6wxuHP0}5X$ z_~7c%gcvS6tE{S{jvYaR559WnETmhTXH~(&VaEqdbrm=byaZO&0nfu}v~}RdM!NO0 zHMnXY{qTATFkbMq{_zp6J;{aOrVEKA(=#2SSH)<=luvCy1T^4X#-q$qmi9_nikXHl zRsoeITv<`EGF@9zo}pBe6}7TNTT!+YzTS>fr)g@k5{7FlvX%ls0|E;C^VH99*eT)0 zK(uB&&!?O;O_onN?y8EF1eS11rPL~(XE*1qChwhU zh5X5~fUoALx$xUqO5r3-08r5f0;v0BQ@)|ehN5E`paCUdfQ0<>2RHztY6ScW(|i+f zDEU-WKEQ#7m#Dnm_040BErKKeRPhhSb!_mScmm4GfIwynj-}_Tf3Q91;8xMl)|vA( z8Ts&p|0wV4B|do8`dLL))hHaog?|tQ0c&X302E1}CecNck4XQYF@pfWs1a#O38WNR z!qYTSSxO;z@TF}HZi1LgJ!9sxk^vy_r>CYb4OLZSD15R}{xMYkk1lWjUvWwOFQ^s% zFFeuzop$|y%>^BpOmG1v1Gx(^2}nQS0rK!U5U&x-gIYPPOEdJ&9na9QRw|ljm%cg8 zV&a`UMA4q(V;;|E>azIfHmMFu>;x3Qf4W6mzN7*B9_T$x{kGM^Gr> zwP>YjsXV(+`xJOeQ}~}0b18gAvgC$A;L|r;Q&E8hUW-~7uCB?#67giE!Wk$sl>U=~ zD9V?Xz=!RVAk@;dG);7dH27_WC8_Xn3V#gL!V+yw*2*+IDO85=R7FLWbZx~arf@AA z@}y;PJyJESaRstm)sgAA7JHftC~9!_9{k@6DLFh18UUQ&_8Dw*d~ zNqVZ(XOfax3#Gy^0{@Bj^jWxBM2!lda)S_&QPF!KU<*tD3ZZ>2E%l0!otrrfIm#C} z1#oF_0eVK}X->|9F@V^^bs+>23JIqsLQ#i;u~pmFV+2Llk(u@g(uLt05x5FN0(<}f z$_$H+wy7J~0Mos+3@aYoM38=}1R8)f1OPw-(b8tMqsL*yV z(=#$L(lfEMakSOfw$jpUO=>f=xR+2KjfrG{f?U4V2eSn{zD(x*Y4muU-LZRn+kGq0 zCEx)<{N|C{?QUE$Z}mQf1&NxzVOA8w#Jb0zjGej_M{oNia@<2r{}cCqPrebxhxZpe zL3L=}lpctCgKz8J8_Z{gFQNLY;5Dk2O)*Mnj5ydx)6iDqyO@WRwm~oU%|211UB3%p zd;B3`S8BcTZ7D#X^4N@lOt$mHq8>}Z%V_r_pexrW5h5N;3ITs)0^guJ0;fNtumJg1 zWm-*85wU52VXLQLd|M_qCiJ24H-;pS&zT&SrJA}@ZX5oDu(khNMVBmv?`k%@*S|P^ za%kCxZhWM*G)EVt3*hQJkLUa*-FE`URIHO&{ z3BxYp^O3qEaf=t6df%|EnTrKVT5*R>Ef zdL?T=ndy)Ud(Mn!oz^7mdhS^}N`%uducawWjRLRb@eK$?r_kIOmHho$6hB>mrNFVV z_wQ!Tr@kN`L~lhdHYkArm`ZYT_lo6_i^#-D^YgJ{KDc!}p>pf_bvTlw`dGSuekjtg z6KF)JVJZ2a%%D4-F|7_zdT6w3I*uMHX?yv8_g|9{IQw${euA+HW9SYqfCw=YOkGA8Y?w^=O%`O!)C9pG$O~T z&A!`YIrA-gu=}X6`^9}wBhpPJLxSbA-h>4x70H7Rm%GigO4L+xb%*_3TdcQozHjF{ zRFCI(max4D1B6$61HYmbvyN6j*0=YFKW<0O*ogcL<}xzAcPj6_3ZfL~=ydBWPqMsy zDS6@YhyM=?`-E7O*B&+)E00)av#Y7FOLll&zIiR!A` zXWze%9@C!W1~P&Y=jQPlKh+?WD)x(3$bG^ru=@mMTHhC zV!OMcSnXf&wRv9otA)rT^)Lrv66vipE0v4a3p*L}F`lU))=*>>i);_z#uK=XHFFWm-e> z#T5&=2zjyAd78ez%48DTX9WyGw;r^ zGJ)BVKo)&nx_JE{H__wUA@TFC5b!9lHVQ@`gCT&*f2ZT+f`Pwac_S`1E2xVEtezit z0}EY`kI9rdS>V1s+c~%}J_=7UDm8LHqwxM=&|_JRZe%lZDLEX4rLfDJ1t*CDda9-vYk4Fa;F_aA)HZrF4{ zm0vX(bvT!lYNJ-EVDE5x@k45b%EblY^b&w(cz~!M=aHa~=!E)ALCH%%a)u_bh83Vf zg$KkE<&ZxVwlwHUHNQe@CGYJMFiiQSxp|!Cy;#bLvh3%(X~@&~fi&<>jMb$Zl2tEj z3Ho}MfGxl143bO%sxAu`?Ze_lDv9${NUC;3FEhLt||%+Ka&$#yd+~v9)goRf0DAk$E8wXdzRnuU1iPjqYct#9~zu8iJ63 z@g(51`x$cBl(HcR#)hyqCk)?H7YW|>4kb_8R)We_i-DV7mKo35KNqa_nz%({SV*a5 zVR3KmnmJ?(n3bW?YXUWxrZP8)8sDH&Xk+E4aDxbKb(Dkj$QRj(D^Nbf(4?Wp!l-*1 z)nRr*k~TwBbvMtak`U9Iy>D}YNR;m9uVj=4yA)@T#LPUhQ^Q?Kt*jaSe)W}?CZBwj z#8vngON5txodZj_urj!h7g*E!0Z=<$3jI4D| z%`lt@Rsdr@`is{_ddVmGpI>R{ z{u(WlBI~-gXFt;TEAj9S^FhJM>~#yxYgp?F+!yT9YWZqoH_c{l_9Wr7d3+12t8$k9Im(W2wt1! zQlsRRe0(VC9*ev6PUm`Hzg+G0b$z^C_xISlU(q4Am_uGl3m5oX__zG#@GNJ`Us&$Y z<4lU4HEnwNs0alBS2{{clLyZSn68RHYAS`?38iI0Z@~)GTZhYFAmdm(WiaI%2#^k5 zQqczy_8|dZdxpuA+xAe+;~P(8k#j3b2q|{2nc?QN_B zQv(VPEbA?$KG8ddX`efmh84sTo8dt$kpO%%?!hyDgs3 z+qy`NNzAF!=y!3vA9Ed60eYo_N%1W98$UQVt_-9j&Yx?8k-xAvM6hVxGHY$V%d}AF zumGYea@!ngMDI-nyIIGu{ehzmE1u?)s)TS4Wc#+n_v<{N$sj%zx#3g>o!teot6v)p zh!`lR*`CtGD_-c$*$Ra3)bF@c1xt5HstDH*fpKRdBt$C7xE* z?&a|GKGF3BOKahlZ10=t@BR^QLq*w|#Y7X>%IbjzQ*S0a~0{dCv>A!;6F?`R(# z1((}7K;VpYFHdMt*2!&>)XZ!`>ZFiO}H8dj;HJ7f^l$n2vF7D5rHavz8Q@;eJgnAm67E4-(;fh4j*erk)?@;uacBX>ot!*h(ogbL%(yTHiH1mXO1SW#q zn3R5WJz}>KOCs2MCg`6p!bHA^#zU9Q!^RVczzHXy0u~U0`F)cV)fE66RD-)q>hKhh;{)i>oU%Ukn7qmib z={Hc9BDRkS3mG7DX3I$B%Dd0M@bQohYIuvSNJ|+vX^sh`GLz)t@@a)9=U3A6oqf8R zGHc%g{krZrxnG{6i(n#s#YAcus|e=P!0angs72Ru^5^r#rd*D>y)Vg1A9^sDh}9As zpl3z?*NxEkpVOEpHv-%b0XTM63^TE@GIy8f*R#;mv9b)7SM@P4GBB~Q^%Ryj)6&qf zunyD|m$nq;mGY^i(W<3?hqZh4>Wlv*MzlNanMhy#tkb5Nl`^%hN6%FEv#RzeXq@33 z%x<8j%Ee0e`MuiEk00W4YilCjKZz2T>=X9lRW9#vdm04qf`adY_$?9m4EztWI2Ca{ z8!s!DS|XzQ^Ad0e7D&v}LNBJXS-Ab@lhO-n%#0_3_B_H^lY#mk{n=J=1#s85(RYGG7K%CrANx zm>pIMGrCgnmD-GThr-+EwI^3I&uSMuGP*lQungxH57^*G2G)2G*t0FX-w zsQ;pXDime*HxaPRxXW2gSezeDZU_%hkHCx#@QtJ)d?YY$ezV{*k zS{QwY*#Kg5psvUBa$vF(#J#TD`Z~L3-~m7|f1lRRr~f&Tq<2bEw8$JNV&X?abOEAm znE`qTC8Pm1`~?@WqP(v$DK{+~HKTp|Sz`i-A}tLevudRxV=_K)ueaSQMnCW4%R{c4 z;;EIBrrzFwhb2p1?94DpMXJEW84Whw2-;8!C%GE?wi?|1t0T6@EtOIkH}85AT*2R& zOACt;3dFPkUk?g%jvo>*=1DUw#uv8QLkUy}!u^85SKr6YrH68U+WE-ZDO5iP0^FLo zjEZRynHNq0)csy_z@g`wu>9T5PH_1Aq z*YU9Y`dnn9M_&J3UyrHEYQ7#tGxj!?;@H)v1vU@G+D-CIBU*Y_Qmta1A=w_!z^I5Y zz1;ee7nZuB*#??SU&Q*el^>E`U$$X=zJ!1l{YvSI%+8$6B$cHV>@IjG_N0Q34y;Do zv97O}GIrmdaUJASan28J6Wel`?e_|`IwTC+?)sqL&mfYq$7Xk-)2;95{W^3Tm|oC3 z_wVR=;a6+aox_mX7ku1y8j6!G%ie1itgA!n^B|6pyu_#tMy!w^Br|QpA%~~{D)pl; z@K4&w7!XTT`}z8$J^rM-;*C3sbmpF*hTC=(RPK_DTFD8FLwR!7VMZm2BlZ7m-@2D+5_F87+M!y<|5%CRh5M$1{l{ z3yt)$lJ;Ba;rL4>m9kicJuAXt+tmIo^+;ee+PRj9vG!h_jp3N^?LL-; zju4RUj6x7j;HKTDNgP3M%|l;htjXGmNVznZGL0;LrTE$e2xu|gm7bvf240kPIHV*d zu_d$f^^Ge}HiOL&NiY;QTNp^U#UJenYBhLz`PgK zS0&K*!R;?K<~}3FZ`Q$Q{S?hIq_E%@*~^rXnt zs<(831+j#pS`>RdO0$Ilxu|7Fi~45iYhHvXS6_H_?jhSl1GJgtmF@*tuI!eG zW=smga0U%Y1oc+@^%VJ5E7C|Dvqf^MT~9iVE79q-JS?LswBGp2hjB5vbUCvTj^i7s z8NC`OZTc{Cc73%Hr*%zO1g5vm(oxI!B=5c%*ZIZ|J}t%ScjeNwnA`FDOj2`lNb9Rs zUaRmpDn4g_h2+ksll4;6Md&XD>36-8krUO>ztTzU5i>KJ*CJPUAAd@09zXhJ*ivOV z*0ODMtBabjO4hy@3bmhA*7`ilrm!|_@-ax0W_;-d!`RqD%VB-E2s)*JZ-a}oTPJ$( zrNZM?d$7?b-!X!^!>g@echmN2L9?{k#f5_a8ZFQq-fN;CfTAgt7W7LS32-9odP-<2#*;Ks65pd=r;Yq8g$KKXd0B~@547C0+^w}Lbd_cV7xvRW#sV_ka_n5==yf&gWc~)2563V zMo$&JLd>-V&9EmndR*)~{qE#=ouUriH8Gw{<1{~C=~^W#cJVk*!fDyhwfJFxlfH#@ zRu@;EbztiS9xf$&5b-Hi>wCH!7v`CfZ|hXOzQ6lUu~!V6gWjeD+__sLTs$Q8pNr{r z?lwggcY4*^1QaNR18+bOE(B`e{1;J85CRMZSc`UT2U*cg#@B;_ObB5uV-Akr>rLIH zg(wFR<+r@Gi;t>8&TD9q+h`DN*fOfrBV{V{33b&U@R}+)m1`J2I8Txu7Eyw9W04|0 zd>FW|jztUtH7Pr0`o7E*7Nep-%+S5P8=CF-_@~xWEZ&sLEO>7y%rZnKhQGBk`EzFD zy!v!&(n8jSVE&5*Qwyre_s9I--_lEznVE|O#bM>Vc%&+zeYQ#n4f^{GbtrjxF@bXq zn7o4-0XseO76ctGG4@3KHqoXs<{Sr&Z zJRTC}iunvR5)W17rFlGbQpy}t)H+K@B?H~{c@t%ssRw0OU3J36Bu94LR+^^x(5ngt zd2K%Hw0E1a_T3-uRcw_}xc#p8Pb@A~tHO<6`W$A|QSgBHOf0FZsxvA(+E2E}aI1Yz zJtAa+k9+TcQ6{RaBEJ(nhjvj*MTaR8hq{&1k6ghur(qXcTD)UXS7kpQ?^Yz5JkP8K zS4L(ZTh_ts)*ifH=KAqP8~FbAARdf2sGkT*>x^>P4@h;~uL*W}iMH$}eP4-T0U7!Y zQ{pd4`4R@|jQ;qJjjCDO2AYp}w_49?7t-pPd|KQgY&1dj@F`j^kM8n_a!gS4+3H90 zA@oi>BSdY-DD06W;P2-*^H~YgD8Cc*nXES6ZX2d=&#J!+|pe{KLBnQb& z-)8WS(hiOA5E<-+`*)}eZS}N7pOW~H3FzeSqyrt1j*(0QRNmT@#%N?u#;9~`2?=R9 z&e2)zShQ1RO2NDuDf53n0^;i#ySou9v%1u86245jl!Uw%?sib$?N{WVoaUJCzVEpj z$@Me;DgGRfaoq@dVMqq#5Ph=;fKr^b!8Zs{cUTCt4v$z70lMf71yK7K@+Z&tQGw|B zU0=ur=mM?D*=hNqEE0U6Hziw%Uk65VHjLoUNav5GM#zUY522S>MwFVW^F&4BVfB;6>wROL)!innPxN`nN z?RxM;hJqH`?py7qmSSM9CFlKP5rHhaqodnH>Sh7=k5=S8U3JAxs+rQy& zTL8FOW=Na1aFr_3JC$!1wgkZgVcnet%E*w}eQkW$7ccrvr6Mp|TFmY(y}yOkuT)-4 zWSV2ALh~i4W|3WLQD==ss&?_*FQcY-C0f**wvZRAvFWMiHXq3RUZevtt!V4!#9TlnyIlLd=bpvx5e)15Avc|T|?1Cb<&3|s3Z z`Kwky$G}cLnqNCSTwXee8HQTszN`*eLPsy8UT-C#F13P!^E!sXllZO0QTmXcpG{mJ zNJtkyK%E?}uUu^&X3*>!oiz;4SaV$P@yi~5CQ{wi-&|HbtUi>ObhURlB8Y#KC0$T^ zJoUKVw>4#0Q$RcIMugt8s*{i}=q&@u?Y5g}h}7jtBX+iZhx&a&dQnP$UYg|s7IUn@ z0^wHdxO~Q%^x=9W#VyXSyGlZubzm6jo(SArCYbRdE{^8ZG(g^B1m4Ws;E$9X8N5ZT z2NbuoBDuLetQHr^ceh=mnPzC@J}yjQrSn~w_>xX}$=#s~coNh6N4Y)jw^rjzJImmi z8zx?tkLy7wKEK-|fPf=V-*FW%EnylKx^G{?1JHDvgQ8HSD^uI`0B26%OR@3>m3*Be zX|&qGO4u0T_gWGtekPF(L&?4XnyHi|jE^Fy0H}+UlI-(+g@&hq8yOvn3;gS~fFeA- z3ISIjaIXdYbv*#|VThffi=CNsxW00L9`3AQZOF(gF03x7YG7by{Zd&yNKZ%2#>UiE z>ebHhY*`R*kqcrZI%Kw3nrNyJeU%)R^)tQ!Xy2JtmVgo+!p7>o+=;zZTORy7VaN_OLua4FkkF;m@O& z9(hm`yz^B_CG%u4Nxz|2)foC9&NIkejjQNDiGcV^0gj! zemh;_vo^b;+?d>XqdJ1+x0Ha-&O8jT1<4mC|3MUj7@%PMO`~(<++J?XhR~NT#mfjzU?l?J%1SpQ1t*CxY%-MOK zFBbw=9T9c)kBq7O+aHgeF{XYu1}j91O~73%J5c`14RQ07iT#KQLQ?aWmMkXj_x zokcvb?G;YCR&)r3&3}8ZEH*!CgOnI$`jUimdHH8_Ktqr9Guy-QQ5o{z>Kro~tPb*) zB?T*#KObtpx}b#m<+AUcM_;=HoaFP z=)MW8r5HZ&^ei+jsf-^=-l+_wKSC}uRy}sJ6|%(yEGSN?6#?cY5I58fNy&@?R?wr| z2mM~qaMdb+{B@dzj^D48M*4xPeR8cWnCY{MU|9NNd}Osm>D6b^;+ERtG`{I=21S+~ z_rjXQ>qH`&3q^@&90F(cHpWhoci7bY>Ema=pP6Ee?*%BB|{+Z`~UPw#}^J}Rm)mHuJpcN4+-u`Hsr zPFmlN0&>}P`Nmbf$M-Ndqs8>jrKD{$NChaN`;@@*aw=W0N9nWX=9#$@q%?~nGLifY;V zM^J~uHlOv5-;!hMTiDX^21WP6H0Y5LA=4S%A>sV*m+6s*&G`% z!9ZOe7}oE`0hBO51NMnP=6ZsqB9`yJe(^!82vzVhbz`~)j7RC&-rp|$w5?pS}`Gy`$$z$}-KEBN_pKB|D?_~)fF>JUPt{z$R z=F$38A^r-Rnz6Cr(Q!nygb)6nbXE+#Sk>AQrVdASx@h~Sv)mVWA&W>ZA!U7UAIVgmHmdC45HwKOcX+wFahE18L$%-qRO2u|j^&HpVZ@R1*icp5r%t z6QM@JLcoHUeT1wnIRaSTVJypk^AP|$%vyYC*AyVt4B%lFmFAlpN8TsnbBAWzU_lj@ zDS!*h@N%*~1oeS}xo`Q(=-g{02pFuBf0aO~aUmTA@B@p80c=7L)x$vqa#GC*lm>R& z>yU!aXEbKYG6c>ZT0lBJfFE!?ywO~@Yce~QCT4FDJ;(rGIc-~1A^$8d|P z3)9_xSjPs0Zsh2YYrv2T9n?CUgnq(R0ZUL3XER382|70>1W3Y|G6&@?ZWrvOwWZ)` zxjin`PKM?!ZpM)g=$2r!L4g{MNr%OHeu89pkC1f>%QLps(dPnoiU+j&B zU?3vhMV$!W*YC(W=k(*>mOR?)@g!Ov2-X)szJsc3d!xU;6IK>8F?}3cFAVr`7J$SV z{7C-FKLCN)3wKd_F3qXT)n&1zM4{*7zG#!`wi>1Qqq5T@jjzw{csa7EI1?cB*%Hmv zA9JV%mf`>tTg$7#W(VwX07U9XJ}FY5Kzy8clBs2f2>A7&wy|jFOzi#0r}2IuL0Vlm zjz4Ia0RwNX8i}M|DhVWtNcV{hDIG~#%jc{@5otM(bv5B^Dzs$nqN(Om^(0gJgY(N5 z8QJ#e3>^DldV{phvMQ{S46%m*sC<8k%E?{92}MV+$L1=+g~`wh>mK`&2&+L%W!n<) zREAB9z=|-}u_5K6CIyk-|Y49XJ)6nqCv!jIjwckGEkKnF&IK!D^V)-iV9+`I0ye_ zLLM#@Wpn3pd95}uRIW~QCZ)_Y(tMV{>=}xtF)r5}S2LOOB{>=m@!R2~aKCye>fml; z)Ld8if{sW|9zU8+twva!*Ui?z{zO~qSuArg>j5)hiV-=!X(Qf4XrY11-(|$}oU&1F>DDNVPLY+Q`<0k0{1o-Prs{$`}P2J>pkj=ZA22$%3R{~*uizinuw=9*u z$r_38qRy-8oe5mCRKNA6O;{4Oc`}1vFxqJvzf#uOncT=?@!X+l(|j3%5ri?XfEV_- zS|Qb++{~DD#LMAW_L>e`J~)537x4JRsmx+sGx|s3IJMywp9891ic>L|*PDFII%@g)Btp1)KOXz?$~$6pgnaa&I#!lFqC2F zBlVv^kTy@&uJ4@i+YyE7mU6T z)gC?`Gy_Usk~Hk=svjRurUaPW@#he-0^1YNc^I7YvmmEJtcXJGerPbJdaNVKy-NAx z39zvD;=RBK&@8TJxbhYToo>QG&d;<+Z9$gq35A%u>Cv($kDeu*%x40##YCNf>pQOn z-0uQ^cdnri`^O^5Mch`tuP)M$Q)=+&#=mf^vR=+hu$fSA-Aq)H2O&#qAn|5Y z(OFYUi^FtL7_YzlN-vAF_9K0ZvQ|hLlh*tgr-00^QI%+%S4I16*Z)V5H4aL@=(o%^ zkM_6WlSjjI5K(cZFtDhWhvyi+mgL!TEnXOkXJeD7eq9HDw|4z$+c#$d6?%3Jj|qAm zzhVmN!u}4#xTN6A_VT34+g3wk?ZqX!a?^O@!`ZHxI?ID&fX^{@;{7OZ;||m2h6|c` z0C(G!4&yb77^6z`7%Ftj*UJJWCc%z+F4NmK~!vg<4xkWi7i?3So@M|z~Clmwp zGZAsMoL5KVnQ-dvoP^%M&K8ug_OiK05zX7$X^elWFayZ~!2Vn88b+IaslSu9w78%=Kf8mSjlI9AqLGP#ot3Snw7Q3ZiGhu!rJ&}0QB_a?2c4BQ z55>CyRlm>{=Y<@nm09MBekZv_;gz`tJA~4&tj0EW9C%K=o?6x}BDTqCr|5dRM*$_g^T`og`eJ_D-O(fZ1lr_x<9z_JDzbN3zw?r#Q=AtaK4+u9A zb}@jd(QwLClh-mc9g3lf&AL8^S60TkyT?vN$f9#lKDOHE0uFftS+=5ar0o|&(F-HI zpWRVR8LRxmUEy}HrlN${d=l)S-Mw^J;5i75S(85Yi? zk13Pz0shj(6}Tr03A`D$=iH2|JY0pwl@ZrmVtvse+&u*@Ae#o^b3-o`~R}>mFMuK5Pl202Y5h3DZe@<4K*4 zm=^8zV*@JeEEN+mZn2GEPUFdjW6rm$+9yWfno~_}mrsLT;p!RM;f&qK>MYw)K(X5k z!eeFQL{Grvj5el61Smx!NVV)a@I}x`zjoQASe?(Bsx3vMQ{*AW;$#j~)3u>5>oi2C zqmo5gy-ofS4t2wi6_QcFnbMwN>oGfDO?r4aMlyM_-g_^0_HwQobo^!j0It?yNYFK1 zGsGe?eb~T35<{PjOXnJdA&?dv?JNy+<;qlzf}t2ZeSDjf@SSl4bz=ZaBBI^U88R+E z=cE!ydYNqP8K-&>wLBkD>3jhy#w!pdSwtl6m(DNFb~t`l*W_+Us)zrfeP^1;oL!cDZ=m-{EasQ@Tdog(`qerma;`?bxuBGf z;Jr!!gxZeNM_+))4P;$}dO^_VzIC%Sm>^#w%}0OlWIYx`0i5&HO8(NZLzjABcomAX zlHZVx!B~Vo6w$;ESVX^JbPA2I0bu?BNk-y*(Qcf9g?U(!=Rj~rgsf<0q-e@kpKQC+ z{j;dL)3cLX(F`8@dcU!%xxkyBOA*H$RYEi$%cPm>2Gn-m)-zPZ^p5i+x#nNDBvtJO z&b8VvaH;fz*Dix80oO+)a2DW={Gug*2_WrbU4AHGx_Ae}sXy50f36!48$fP}7Uc90DM!h5f&7Z4B-9~kZXvliCvZ{VsGBpFb zs9yG@%|W~Uw}}(VAYF%+HtrA!{}W$Phdl+lFSa+?X>Q#^ai4?Vv<{Pjq+R2(R19P* zumAk{v%X>wb&5z$-)Zu*)edR*et$B+gmdfoF!|eXKHmijpJNv5SjH+oHe?N^ zreXZ#GH+Iy<0@6>Ho1afpmXryvxFB=RqenOze?_G+S`;CW$r&R;;rSB807g=Osc~@eh-b< zyQ&}rT(3r68+{liB2wW9X@PjocK_7S2CTNH>Vcnzd4m1LV{h--{Yg+rlTtoV_h^jv z-F97L&DI@|>Dzab;{+mr->VC|Fk}GA<^clRCfEF7hQCx_Q96*+37$mYPWH?k5PRp3 zb)$SesS%PFx~A`p2ltB8KW|VAF-ifFsh}(X^knr>Wi?A?8n}3B_Yj{ zf{1{WfOJVC-5mlVB_Lf2DAL^z_c`}-?s+q3USBiU%zWeXJGj!_+9yW6`@)gsCXUCI zgLm{28w9fuy4BKjYHM1`1bg71{tGf_+OHj-C4TAYc;iL5z(9^gbvOV;0`s5fdw2j) zJbJjT{jectY4zbbX@9d=rCD`qW}X+C=ux}OnU5uZfj8&}2h)6?Ijhlh~hQfc0Go zk`_sG1Yy@UPFDq}OAL;9{tR6t@NCPDbY6$=(h(MKQj;q;@a9J;J#vXk*yB@VFdE-3 zZKkqUH#xGKf$jyQnzj1E>Ng3qA%_A0<%7+DNv$~2q^Pts{kK`b6*D3r$BNBndZ)DR zSMB9^2>Pb~Q^6wAH^vW1aKf4eY=^=mikMn8)q8vWgm)%0?mTh| zT^L4Ax4(>3uUb2=&RWat^8M%zGu=357P=7n!;74}GEbxI^?4jzL#I4DSe+U=1=>WK zE>_ZJ?YJ}4xt0B18=?QK+yqfUUTN6d2AE{Xy#%K+V2RL$=COe4oT`72%|Ph6iQ&3k z3nxMRsT~!VR2zWU9J~X4w|ETC(RHd7RWkpfx%mfZjvn4aG{-}!aR|ZluZxi(AjpXn z3-RH#9O;M2IWGMtLNT;OHhy9gbJ>f4U?PlC!J&kJz{(&5pnfV$L050SM)<6_z6)T_?iqnXs}D5^Ei$;|_>FOkK@qk6(pTn$;95*Tr#?%%^zyDfaC%>luW z#&@J3C_s(hQdr{8oYMB%;*r0g*{gEzG2K2kAvc(v^}+FF`y|--MR@Rn-0CgwEB+g6 zt`CCY-J#!oPp??!ardtD4W?8(*%}wQ$z15Y%e92inrX2?@d`fHk69$#vY8#N3pI8B zQ@fv*fPo8R)g?s`3m`{4dz59-TcYOeoQ+Tm&z;h!yj7J@HSLdy(6nCIv;X{9jLP^e zPHyZJ&z=UL?v*{Y*2@917+)WsZP$KiqJPx4 z@wm%nqoSUEP{cw6Q#+jp zYC{gnu6je{*)t*9V~^Q(>j)e+UX@I#Yp(ga<91yfK`z`8|7r*Z|6go`R-4S z5lue?_fxZqxVXITKAF)%{Rf?Qf1N@&bugH-S@lYHfBX47(`O2^6w4Y3xH9AZ5Rmw< zUUs}P^OB1a3r+8tY^!a|^YpWUK#NLPN*d;;k2Jk^`$wZ~KfW59eW0DIQIy!wM&V?CQgjwEbqift6LXM_TTH$6!O>C^l@ONl0 zqK`DnB7c;53gv)hSFA+`a{dfkB9zU<*A#RzjKKd61#(!1sbTA=L>FHM39a&YklX!`$J@i*^ z@i0?WUM@o+p?7+$;7+-ah_8@NVdgDRDpCGyAV;Ke3#n#`{N69Kf8Hd#7-Hx^I3UD^ zWK?>G4##!<$$#@*>$M?AdyOfKyF;8WD(-I6?RdTQyh^fNWcbo2WNHM|p|A*!u5nQq z+H%mz*+fE+1Ft@Tm@;NSLDU&SbIvUGnih&mhn)noyTAqJJFlx8EGa$ZB0~e1Hss0L zlz4Gnz?XJFa1bmj3+~F)=#DUhUzX8^&!e-HTR5clL4{ALM48olkSC4&k;kn@gmUx~=lp=M9B)f33QD{|kx}BA>hcNtP$j{-n)*i=W%N&&PWV z)Tyje!{}(Zzab|LUEN%fxJinWS0N^ZI9JMG)fwv*=-@*5D&pw2`77WZ&d4to!K298 z{xqy!Ss=BV=4g6*>cIyKECR%I`^UI$lnCGa?!(V0272B5hhN^`xhj9}HQ`B{XuG|#3_IU#STD5%LIZ$ima=To= zm>-B~D9}6CX#qnek3&H}Ma%hv zSg5AJM&hD~nu!rooWqILfag4gh&)+DS^n+`b<$0-K*>ru=12YiJVV|8NeK@be&Cw? zIG(kvqMn_dgQL5(yoH&GgPW_nxT=Yfg^``JF(;>$nUR@|gPp6UFth!xw2(B5x^F-c z%366pUA2DWBAOOhOt_s%H8kIB;ID4J-6;C6Dq&9q;xzi6v6m2Q1kNU zoZ|ud#)N7>L;Y2}UKpbS)%u*h>Rc$q5iwIWvNH;N{epcH+av{vvcQgt#0h}N8{>#^ zM9G5Xbmq5)zMrEh(b7j=2bZQM`VC>j*jVRNN~<(B%*a?jnJ*f}Zf!=(IrT=7y;P?B znN;ESl;xO&+x%iF%zeq^MNRgwg=tTGUY_LS^apo&!SO*DiiZmNP6B4E`N)F^!$ZOEoE+;#)Ufu6x z4Tel`Oa%$7PD9*Pa*1L}Dm@`&>Az`PRjj-%XrEI$l5O3R4>Pj{+7Uhy2*KYRlY{^< zujCo?ZjdjaY3os=CTW{~3YEnK>IA!;n~~==cwhgW2#vJ+*O`u2UB-6?`Rt8+e_vSa z<6{`lNB@#&6u+&l7(#!~srVYwa$<@epM#S+y(`WR<{<*Ast6_8fSg&Z#we&Re>Ztbmrb@BJe7qV7?$@9+maL zU5C$!%;pNdlk~OM3iHhZFW{nCW$zAYx^xaAd{HC#IOk(?B>ekHZF)EV&eg%Uj5UYNd`5er^pXxwcDLO4Z3tk(S=s*1Ja;qGp7>mPt?!Iy4~<|>roW~fX&%!Q2Z`tE^xCjM#pMbO^B$X|TeDPPedQ&y$9;53B$4YAm1Ky=b5P|;; z3dFEfeE}(ugf3PyKU^9B^Q%Z+LVZ_^F=^~zrxazWF-BbLw9A&+Pv+?3&|nL$7M4zW zaQ*bL5U+FTr5gn|O;2Q==XU;7BVDl)E=N}3aRZ@i>L_V0m8IVj;D(LASj7#$(MD+! zRCQ#SLa+@Dy;^{)3Fibr-#O6|*sd#hRtNG*QZ8rl)^iee=FaCW{Kg^69FmN<8Bk59 z?pT^3LSP61K8i0sTe5%?D4sYBxMHre2y4j!vU&7Lcl`B+*<8{P4xKBB{DRzXI3W$P z30>Nr7gOikodJR8r>}fp{pXT>%s)Uea4@&P-(be^;C{1Hf7iyO{&~pW8s0FJ+Ik{v z-1?okBkuJBh4OwfY$Zxs@-YkdrP$_sLD%-;;(lm{Ied@B$R+qWBxhOvaQY@o-H`R-X!5vcNq^(wbPB zuYp_QGrvV`LPo)D0gau=y4cLV_i5>lUmiKSRm^|`nOtn?_Qm>mW{1uJ%r2M&>j3-? z8!kVtvzkK?m1My2oGP^f_Z?d9PN;}Tb1Tk`n++ae*ggHl+7?Uemphl+|KfX|BLsXVU0L8QowRqy%C5T@vUxZN-lGs3vL;BNw#$~_UG@0Gvdb`76Lk@@HCN@5 ztYU6YxhoKpX(xLtI;HHoFQy|+F-Oy3}y9ux`D6r}V|^>Hqp3GMtXr@7W8>X$171Vy3dSNNu_fTx~6E*{@;jjO@3a z6Z~0CPw?4zDX6f;QJ^ghlQr;pSM*lBOEvY{?C#}HDc-$kU*4-DhB+?Xt|xZqx~y6d z5;GeeZXG|;d6t0=))lO?)fnFv`D~g0k~1|vEGFJJbfastKEA(SIiweGXVM-`oAkuz zq;HcGB6z01k!r{B#@}II@V_(g_~fBpvJjp84zwI7dDinQl(QxkpjJiSZ$e56;l zUURfw4Rn9VV4{{BH;1>zOE7{9myVWY2x3sEiw{L+dgs$Xg$nB{2)y+{2VAT|y(lad zBTjVCD6V-2FggDY@!hn*R*9ZZ?fz||OrSpW z+TZLd|3PTJFL?nQl=mAf`!8)NQ|(eFiT-A1!UAeT?&1eQc`J)`1+D*8LFugyl0Ikv zoB7Zjyh;c(wB89cF_^pl2M4M#-cyuTYFePJ6N8eH$wvno==$`lqT$3_uW|IKO{i&G zo_tj3_6;Mdpb3HVpp&X=hFz$!Ldz4^T)g=UqD9{3$!+$XJZu#nTy71nEB8X zc95!>PakQ>mv@qH2*}cz;jKqB>7Qk~RE+*e{)TeV>F$=1$Dls+XBYPy4_q3#|F{!f z(U%OyT6Jf6Tm7Smo$`h$c$_IK=0GKC)==3dnUpZ?eW;>CKskaC!l|a(J*`Xp zqwXv&o4y?FQAhJl>80nzIO;ZP9No1YPp9CG_5*eT9aBTYUG=zs;(e;hPM9xUDo2aw ztGXy*j)Kd!us4>9Kvjz?Wa0re!gj#pLlSHkC zO`cv%{vNe}(9QXQY23KjS?}%{gh@+bW!bcNbV@ep>J?N9`|(AFZ=WR`DmEcW?h-d`xv}gf$zO7(c{P=Z zZw_nf2VK^t_OmmW8YcU!bm!~X_!$?9OSZfmD~%^PHMFMo$+K6#-(L+Z@3>}7i^$5T zKjo~?Z)tvfGMkG86&VmWeCdv3WO97(mv-=SHdc+YAloB4T5B_RgmC)(v=t08|nIwqzMj_#z~ zUfyNP9%+)1WBrpZheER-NlOG`vW|1dS)=rMUiVb2`feXIlD28? zpNwAl|M?au$!o$w_KB*Zv-iUDpzp1Zuu_=zX+CXzMdHfBNA76`_+J-=)#()jB+1DS zMKBo~%ZRSY5-$OALIV_ZG^a7OM35L(t?Ws_ExZo=h?oUUGb7!T)d@`K;ZOq?9-gEf`a z`8kDobsQY*wP_^{j87OjxjGB;>z_OXA-Gx!^2BsXyE0hy`gTutf8F}_;2T^0fHt>( zHzkW;^^bM?9_iqr1QF9q=-rCeUcP(nn5`yCGmOS|yf>9n>-w4c_*!aTDexBFF%!JE8j{D3goNLQk&nG@DQ{xKfh=@{Sg;4VM5^m&wrZiXr3Y| zo%Q2M@Ye8kPu@uXbYalmA|{&>Xu@C?Wrsv%o*Q&40ro(v8B5G%sV{@?GnkP?UsTZq0!J^UkDar3)zh_KIJR4AqC z&z9};3ku6M<3E3GhaOq2Ka>@(uS@@Utzu(}{nW?E=v*U+7sibXx+;ka^jr9QVQ*@& zcvESAM5tH=eTqJRF-elMp9O6S7U~S-f zGj8r#i~e8^CRBS!_iHUkzGE&tY25gnVZrk*ZboM}1C*7td|0iCI)9?}pA_`q@#mZ> zMTwYXI?b@{x9o7X3j3umy5-CfVN3$*xt9HdVZ@)--H(3l!^YwE4@A9N$;pDt>yEoK zKT&ZuNqY?1OV{&p2d4qfAnrdXOqE;O?FNw=dntZ|jQk{I9D2|jlxNOXYDwcip7NW< zj$qHWuUa#)40Lf%t;&*P4pmH@pDwzY6TkeYG)3G`pqFsB#*gZspH(A(3+IgF_Tl=jg17 zTzx!1ubZbc`WsmR{7Y8F;>v8E_|;iS`PFP}vKfZ{EC$4WKTEz$2Jv~5+U^w|rXu$A zbA<7dpp_;w{DrdTXVnS54EEOP{1`XsriJcU_%1c71S<^H`v0@x1(pf40*3 zswoR6vE$JG<`qLD|F~RCe$%`oE}}w@Qd4>lkEzmpR|dPk)UFtNl~)3CDC0C2y zEJC#{cC4Bz0Y6d`DI#AJ(XiqS(exZ~PI1^(D!j3`)WwXtLEof1k%iE;V?sMdNEyXz z-)|?qpN8H^zUC;kwyj?vgY5H^&ME}xd-mXR$C)${58JbwEZ9r*E56`5lYAFoIYOK6yn%pau4z3s68NAQmqY)l+Ls z&=ngL!eP}Q0tc@vY8#C>Br}Q25z6D7?*Tgr_5hm9X9L;;Z0y%flu@&9rH)xkS+jPg z2~C>`3O(NnIXXDiMz;TcTj~(DQe-Z>!xJo_PAjB5j=RUMt2rr9U7u`y2ag`=TDzOL zx<{p^-p_5Q?~4C!5-DcV}D&yQPLv8Z2pJCL}=vJwxaiovNNK z{vUP*iY8~pzpI7>R0>}Z{iise4(Unmb-~A!PNsJgmHoTi4swi}4>m_V+0z1r9){Z- zq~|Cl31c+}Nj5_hox0i|`KOFBe<*g8e%BQGx%0t7643CM$u5mZn6F(v^F)7Z6G}XK z7+d7hq%Llv=^qewEk4J(o8A6C?Wh7v%tYhSi;_v|v2T7Xl`d$6Y)vdI{PI)kJIo8y z)U1&hNt-ebUd2yh?=paZgK}+F`RLXU7drR4$|$y<)_i6rXE(p!Hl1Hvf9)I_@E@d0 z-yJYx#PA#bow>}V_p$t(eAL49Q}EOM*=tw& zS(oeB;vk5r3**|jnoh|F+$dHx-9ZkO*txjF^cvM;d?N*Z*ic}{=kHuW$1arjtK#Ba z~0(ou??ntaJR$L-G@n zB@*FaJ$`dM)K@0e=m0lH*5D-YHwP(xRN$sHi7Y1lIW{cg=?(4ZOb%fEb&7Dpgef*n5+Qy^J`xdYNFZ z6u$+*3i~WYWQMjn5>C=Z+gtbm!>9MufavDUT|*E*NOGc=PhjBvpO?{4$_^Z)b~zU6 z0xu^jz?pPog~t6$j7#hgHbVg_%9I%@u@Euw&q#q6lUHT`r2)wjPo}sHAC@O!RrG|% zT1(hS;z}Hx!U1AT{gI*0NSQygX!7#0^;PGes%s_zKO0zz3q8br%%i^|HTd||sieE# z#d57lw-@@!8GxEfqAS{=Age9T7jST~;e{W8`s?_V5u*P)(AB zE)|d4q84IuFm#xj+rCHyE*2AxRR($U%I8gmaUM!}2H-#XEtVSqknRGK zv^lYQ81s50D>-fXhs@J<>tiv=QiOF!)-Dj!)3eTClO8B)kz7(}$B_J3x-u1I7Z`6< zA?czKXIu5H1jec7Kb68&xaD}bURx8#mXsap+yp*yH8cKe{(+-Kso9BbIQIq z0fWiRRs8nz=&!GvMk6t|kK;2#Z3?)!@}6HAFaG?;-^@yM_s>P-u{Yk>AH5#3^m({? zP25$QlPqQ-oT#8lmxDL{*;ktrqfb;>{APw&!G3&uGYX9(Z}weYoF50>-Eic49j>GX z))~_3%Qi%#^h`c}r7BcvUM5lK)L;@nH@QFc7c#yrqGbGWFYJ_bF}o`_j&2mxU2@Ze zUXZg7ha;5iVMM3_CmySwiq#7z9PF-GR=CI-ef&ke;568ir+BCan>Q1__j65@&+p!Y z!wIP@ZWZ{4J+1>)7PJ~}g%)UzcF-RN;uX5XH6tg^O3yTS@-ad5%vVJ)WH zp>8{&e?AXGWihP4H!9%Eqj4>%Z_7AP8;IofP13NG+b8`sM94Mo%E&y8KrH5O1cT=~bHX0-3A??YxlqhS* zj22RVC#P2sP;724;>{l%Y#%=N)}+y*{)*Nedcf+gLDBDQJFV}6!b)^)V{7A>Uh`aY z{Npjw&Da%9nZ^Hgdsq5HWQMgQy=Y~eZqe9^XsO~a=c*xX`{4^##DAO)UT8eR>$2b~tW6+ptcD!ZaLCT4_5M<6 zaWB%AeU+JYEaC3^cbA#-s-5&_1jp12=Y(vYEQQf0bG5Tg@3GOgfB7-9dnZy3*OkfM zn|pbEt^15;QUCe0TH5Om-L+CZ+s{V#`zV!Ujj@V#0T@ig`@BLgwUCYMGt1wc-tok0agLo9yf!V(Y$v80zEp%@&PzzleyO1QKYUc zW@LZh*!dHuQwaFUIf#LU|kYPzW=I<$wj z#d9qGT@@3c(k>kHE`s9Ieqz;mYKo(yTP=mzh+5^+agp^RyFy?6owVtrHKY7B&#>e(0E4zl7k%^IuqarsWH!tf`b|V)DSABj#7ZVc) z3s+}e3ig1S1$lQCM>KEZ1R8RQ%Uhed^Sup*M%s0NyiV#H zxy9bcq1eppmu`r6CsK!4ur4ibS=!y(S5_to=55>l)nXV%Ugpmm4Stu@csyiieEa7Z z?FupUYM7oT0__0l)On44%hDj@dtaE7wWNgg6LI^>x}y7AI~?3vSQc6s$I39gryva3 zIZc{D*F8}?34m#~nO#VyD#;7FMRGIksd(r%viFjU_{~Uuta1`-m0)MBpT_Q=7_$WrhoaC<#`f=KlTW8&7#< z+1%Z{bVf+!H;gz5c&A!Y2|$HK$S!yMxVIsjR)%WBhjdCUi_>4Y@`Ww^_2{~oUwKQsid7gJb z!Opq`L^E*oGBtUl4*RMMRGw7oCcy=xPP*Ly0;RwhzyNaI0ETil6lcRjKFG@E{dGbC z;+vdJ;3t=7yK}YnE<@jX>gqx+Jv!B9_x~*h9YOpDubs-e&OW<^I*>Fba}MPvh1R$@ z@&w+e(3#^0HCWLuS(-JZa@={w<$qsns&(d}6@Rek%kml}796k3AoMbBp-C7vga3p7Sbt9A5sa~+2_ykr7qell5{s^J(x)!$JHoAt~0P>!k7 zo%LDcr!|BAI$QemWaNY|BN?{Jj2VwGK#ipq&C|yo0-^pfPh`v znEm&pzkZhZ=3_LxTm859*Gek;&pyl~$X~IWSPe?9Z{EJs`dd)fDU8nK{4C<_2xVdE zW%)}e&hZ2vAjlL9Vzdx(s)VUlzl(_PE@pDp$b}E}XTSwnzP0_xZT17|ApQ_rR z-x_vH7i=TH^UozMR;nd4#b5eH96VqSB}IW_`%Tyn&pokRi|Oj39wRld=qa45al@T)d7}CUGV+ilmEJW)krRm0Wc|3jt4w{69F0pkVD3M(5=9VqF+XVJXg?Ej7DGx9ic(vda!n|*}`AC{ds|9 zPe9rFHi?uOLvd?8EaX(ddZGN#wpLat68ozPJe=wX9x-nK$CdBblj~J>V_XcchL%I= zVn_*zsQ2HqCl^J;2{ep+=o|D~%p*V(<%IYJ63Hny@Vmyj9)>nVX+9CQf)S~DDvM@% zEI-XZdV_O0neaM!j*PT&A8q-d0Uxy%BgM4(mpB-b5#L>cM+cafvs;Lk`nK?LSCRWR4wHw zjDj)*>83t>EHZb5ek##^`1P|g*3WL#V~5r$OTWWW_W95W227Af1r9kRiE8W@Y`uv_ zD#D)}>@r1S36Zl9l+UZbjmHm2{&zwfLmN=G)@itIm&wHvlnQ&bq@P79B&!M&IKitr zzrzclq+~BXReQabj19MT3!rSY@fskv&KwrFlSSj0-}s4EEr0MwCS-ha`9t^TCJ9b% z!->@o1X7PW{=$g}OXy@+>K3LiSf;CzV<-xpf@$fc*BMGfSBfFL-TN~v7gk@Qcq=IN zr0V1!rf#$ZC^dPY*UC>e*TT-~TiQeyL#KKYAW2#60?48MgF7s6;==)~uVkfw+qY~M zH#j)*tACi!%mLq7St5x-E(T%2k;QM&K9-UI``uW5CC0xCJP9a20Ep%_5$AZHxx;Ma z3<;aC`XG1n5$W1LoPOx3(3}weF}N<2H>Df@PH!B)9bsE-l8uH*y0eFl(kj55qH0uv zJ&lff!sI7&>GDiRC@P_3l$gZ1$t9dy;u!(Te@Tn-R}BzA1#>~vkgtKJ843dZtggUC4onNes_eRD*9X01nyVi*kemO(Y1=yRHH}@qP#m$4OCD=jmCR zp(&wB;GjoyPYqSfPSUP6Cm$PZ?U3`k>wiqJcvPa1F~$N>^hpBFx<&O3q1M`A3X@kX zyWeB*OQjnXUdGawSuI_D)eo>cDTGl@D4i!D-w-;(wjBVf;9)CKfIJ3;Qh&KYKzRAg zI7qTTl>@pgwI34m`~V4yD<-~g<}Uwy z!I9`vpwk;y%GB8{WuJ;zr^@n4Hr2vpI=qJ$~=Ls_B&`>0d2dR~C6%xjVV?xZ^fMk^fsGPBhc= zxnrTES$;obx#%1VftLx0q;IVbzZt3=UP!W1J;@!*uBTWy>~D&?Uda+0_Db003or{b zQs+EuSeZw>`D6+OMP+E&Gbyni1Ap9=q7p8ReP! z26@D$*eVF3t6-s!+{TZ&n0&u8PJD1Nj}w%F14uDLMmSv`yQ|>dT;Dx|5V+g~91_lS z+K5iy_K(A&(I`EDas(DSIw{Q57HyGrc&M*D09<9Yo-*b%)VwTv*PFa!LR~a~a-h$h z3e{5K_|Z%rioJm7jDED>LSpcC!Danq0;X+MA+*JO6@*{PJu!BHp_sB#_4sBAe-q+` z;SN1AKtj%oV89^*0TfeP$c9Ya$r-hLfF^wO6ypB*v41f+VV6CQ1sPaN@BGNOfB$Mn zuw0uUfh#8l2BM8AF{&fADU<&`CooM>FeTJ7MWdr3Pg9q*V|{_UT> z0Kkv;BzWT`IGWcCy z@aX^)!*1)uKAf^1s`}h2cE~)`1Dw3X)L-Td8WSGqT5&eX=bAx>6@JlfjZ+6lrhFMIT}h3 zMF5&{e$W9f`|L1C2RfNKTaGdXtVhI5@x&d9DN@fZ*dFWE=cL$!Ad7EIfId-5N_srY zlbo(|En{OVhE!VC*3|^-7qam{z=E1lz<}q;F)tj4NyyW5Do83Nhwa_a zcMFSft)!Gry!GwcN~R`ApgHZ4TfuKJ_MFWnDrMH(QocE4<P6-dX$~@Odz*(2IjDHNXRy4KYmzQLWm-ATMny$3}Io zc{Klo0s3`kLU>R_hQTOd6rW@1An0N@(~h~~NFFX>g4kvzG85n<4wW&*f_4d{0myoDq z+~3m>u-EzQ_F!g;L-kgTN&`P6o8jQbjSBH$;kQgNo^_5Ni0{b)Pr#A8&P5!44t)ax zWxWN=a`^VOp-33iG8BrckCoyID=UbI;(~<8PZB*>He(enEDf#Dvc&6j`m!loi}`zi zg9#}`hyA~qh_3(BD6k$hiq~z-9IUzdh3O?3Sp|i~)hv&h7?_#4IoX>&7t}E^F>rH~ zmFLznKU6%}o>ZBeOfxbIL6-9J1`Q*od5;n(+S2q7^0=ESe?6lc$RFIzt#=vK9o^Kb zv4EI}d9-VwL}U;irfgZnC0FOymm&KBw@l_ zhHbjpihfb>Zur2y#$b#U14t25%!`jWq6?4k6_9W$e8g|Fldf02tKwS``qkc7_;Wg$C0A}ssE%6q5(}#| zr%-Z5x@ybKX0LsL*2?tOJ%V?C6FE}fSb?vQ`bYHi%ZExjG&?wDFVI`fOjm{M~ zDXcz&R`ze}qm(3AMQCH+MTzj>K3-HT#}0C`$>NLMd)q&NGpFX5ToC$Unr(VOkw~}_ zTu+ge(SOP{Lte?I zgKt>wY1|ed6hg^rbGSB6Q?=P!Qj;&oLkX|9a0ssTF@DJo;Ex%^H2fG@<+TZ(x_Xy+ zY`!7^L1rb8>AttScmytx!-S|}j6KzNp(w4~`v*$w8DIMi8mR8o0iLEl@2LnDdehHsbU%Kv3~4e-Ud!NMu9l(C{Hz;bCaVQfWsI@4y6M$5%&$E!3l zU2YfRhdMiR-xwa5+c~A%nzI{ApPNI433@!b^%G^{Tfcb6ddU6Z+yW+YR}ySL=zkF4 zc0Y5$#L_zPhVSphqZ(I2Jxp!Po1B%Zx8ReRHg9D|Ff03ff&nfJCU!u8tme?-glPvs z!(+~>FcH5|oFoW=pQl#5%G0topYLiGA*q<;shAQA)3uA-OirR)?3qUAoh^m(Q$kmu zsn6h`x$W8U$o?Ugs7wrplnpoDAC0-Mv-24p9l=M`2Xm3P=m(MX=v{dw9s7gdSZE`c z<39RbQZB-oZXt9hday1*G+fB7L`4_58~8+omY9->lFbGL@22S^=vG8hp^Ot3s$m^l+`>G3Cdm~?3$q- z3F!}JeBjt85M^Dxgzr58oHY(Two*@1DHyqZ>;$yW{$Y_Vz)jHKFjK(DGJjq7HdY>u z^3UG4eDU8At`2+U^zP;@v?~JGBJJp#r}7vbHI2+Y@PUlt8+y1`3rB<(ny*&~v<(de ztjRwOIuTT0c=5P*8XYw!t5jWp!LEN68_tE}?DC6<;5i;4X;!IR=5!1Zr?I6)o-)>`c7YBG2{voa$hC$*vPs8r0BEI(+qK z!7&e+M8H*ndf?G~Sl|)i(MzzzfJAow#029wUAWcM^sW6WH;APVXsE{rqwweT1BCt8 zIB1BDJ01XXQvV-OXWK@>ZquK)(1UiE#4m$>0XV%Ia?+D`mWRo8;N zcGrj;TUFiGAUuxjQ66-zbTePHDYf*87H<12InS$YnT`;W2};KR>mVdwYxYQ2wlS~B z_w2K?y~tyJ<#&UkUrm@S*y{uvI2B8KNM_$2w2bVT3@x2^Tp!;DbY1#ief@Za2p$wx zeQVrcPnCl=a8LJSn8*%(1zLImcK?sdrojJ>u*v!v%q>PG5D2sd(7Y~z_4|Mvoj*=< z!|9E}j8VwDmqjdzJX~>#aeeSjXvFQv4pVunZPjed^0L7`wj`f<{9t1A z-3zFv^Iggke(T=cVY9rWrsfE5Fea_4TbYO&Ir{|ygF#@;E@m_8B>mbhNoAq*2O)#y z7M+&1bOUNBgioG3YvqXlJ#pG6kpAj*Vlw0gu%GB5qNW%S5gXAf_ybKaBx6Fzv9^Uo~N37Zs{2_NE{4b*E%?`ROlQ zH79XD_mo5r*B;SM5?T$>7nB#WbU1G`E_&5_(Q@tcYjSJ@jr|~RitugemjBUZj+I2{ z2nx~CCiT?TXkF}F`*#T&T<#mp`#rdK+j|z4T?$r%Er$2nu!${ zAN?u*^nwzx@By8W2+hk?Ryj!dr7(6e$U-Z@X@|P&H&@UgAWC(|y_|F`hc@V)%4jix zIyIEhefA}FBWOPupJ=II_sCxM=lCn%hmGy2=-Yij$yD1Fh8uX7~P-1;93<^9U2IIC*SG`J0#kZ+8eveK zIvMHOe@0&)9Gw&xwj!_05C545?g7RT?AO9jq2rZphX5FIJPbW9I46{#d7lZ8FH4XD zg&;w`%Z<)FJ!tplg<9Y(UfV^I-q~ll_*3<|3s=pCenSKiWPqTsyStU`Fc#g+l3YfJ z&ms*+MT(urWeA;I42|??!+cblNWYxyNNKa-5AMf;bPevJ`7E8kuNEY$SGK`YRz>#^0?@xc1#gHt@g zE022*JvY3wm4ucK!r>PAq6A|W1Dmr19(1&u6VIEU7ABtPT6SNTsCAW0-%B~7vsig;{{t9zQ#1CGd`1$1h zgRAR(zoZEL^-SK;`{yIppq7B3;Wrh10b#^FeGOT|Tpks4 zz4PQmC>yWuV~F$lLYHVJSp*Ojd~{$I2XWKJyOxV^{gea8hMHb)mK3}_NZ0Ak$T`Uj zdPK@H9P{Bb;qG606|5S6baH}8P9RfDY+?WXtD@(3+2L0Ye`1SvKPYFe-qPEFF=omi zn-=KYjHk<%>9|W7sD<(y$mG{~Iy)S1=+bKlAquhUF(JKf0fMEA3F=|H)d%2Q32#dl z7eOrzZb<<5%q$LwS@(yS;VDj5129BHY=8iRg1`%OSJO-Vrq7i}vW16Zaw#o^!0&(R zN_qH0O@nexCvKOuy-#gfU zzT)sp_i1dheJf>@-Qj_oPG9NHY`qBf0)y}_Fsu(3k$ajDlO~QCey|Kl)vcKEpX>u$ zCK{t7wUITvfPdL_5g=(KMe%Y7AdFb;oHwXqyqaQ_!h*IBFln3FQ;_v_I56l5IUDetUOoABKTwq%;B|C)#es0D83g& zrqE0#D@Sl@C8%f=mDsRm6qi@&1&0Nn8fS-b`)Pq2 zI!d=@L^gKa-*8h~$<|XV4iEB*VN84#7c#HtP^TWU+7vHm=#QuPKm4 z_Qm6hMOy@RG-PnO5HlnVcSr_WAz;z6k8aX7;BUTazdZcKP4Oexl=Q#7>{hdiQjB*w zGj#N43fS1(8viDJR5Huz^}gO5DgW(xD*SMFusN7r_cviN`H{TSS)VEa8Mj7q`lB>4 z;q0=mqocKnpXjW2t9b?I*Gb|I10KWfHv7s_a9TZ1dZoNIt?AqGzpK@4pV%oaT`U`u z_G4kIsA%}C_JAk*@9K^k>8VxGSe(+GUYMkpwFayNypM-%n2*)PtFT|=cciV%$9&4z z&wAvMQCU}gPb&0=6joHF+ELWrxSCmc7(72+kiv5DwTkHITH*6Fd&Vd?SNZ3tRxh-~ z{NlHR{~FMq&F5us>N@|-r}-!~)O*5a79***seZ-gQ%w+B;CO}iaBfkX3mqWama7S{i0zN3JUwzA= zBmhys39frCjW!?J4w(Ko{DKCCk`?~Pbb<0+0DE1!PL7=1?CRX2Iu>R&Ru<;RT-;op zMODo#439Z^YH~8apach0sAo-fT6u*;x*VxY0-wzkg`tzBgW3Sg$HMX_ituWgj^%Ru z=As0&YxL!R54mXYoG6iuKz@=H--LRx52L|uV)k0Wm$$n^5I&5kmP^cE>rn@1mTu_qs3 z$W$H&@)%}P89|7S9P0&6q(68X7LJR}gzdi|Cr=7f-0FYbf;lTYlkD%6UiP}^v2yZ% zJeS5~{QI1~IF$|y>2<=zB&_xZSZFe@WX`$opSHuyZ<_3AoQ*Gk6Wm|?XZ+zq>$x4X zIUQ630&!e`A+UWQNEh`0#uasNNbjlxLGl8^i6tFS!i9Utp_>|jdN{h#J<(izZgjvM z6Z09Ka+Q^H&YNC-u^{_!rOlOWB3Xed6YI@5h(sA{nmkDtl~_c}EJZ`Hp}sz^iN^3} z&G%;>2hGBy^0qyfe{gXLE-}d+IKPMv%N7@${P{5Z3A5#^`|a_mg&WH>`4twUVm>9~ z!+SBPxt}zgFczw0aft!y#Q`R?{+E9^0|a5|_X)!sdKZ9$;OBQ93UU7w1lO;QUr+s+ zBB$1}{>z~zGOmj0*jvb#lZ<(2>4){}$eLeV)^g22B7L*OKt4CG>{59?pxBUcS+L68 zU~KF|>EX?*L7HbA$E!($zx8h?QB6tG@PEZ5+ZPsV7nb&&G?o4m_bJCt`J~1dnO%l! z6Q@@E))O&+ay1`?UAJM}Rt1D9#DLSBa=ZMYWs(Z0qYiurv?J~s(c^T{a?y|m{l{g1 z|F(-DTQ#+n#@);LU2d?*`F}%E?o+y5oinlWRCl_){Qcfh{chj*Y83w+JNI<})7H(< z?YZ215@Lo0vXloc9zpMomns{fcOh5TuNVS}i=XJLxj0~*`XD2si!k+*SrXv_ude+# zV=8ec{(P}FdgFf0NQU#~&vzJjk);d1lCMQb?7DyDLJC1J*%fajkPP2Y^Bq*OlmZc2 zLpu}f)FKJ3HeNbcnll9H(*nu@Jgkp zEK6LNWZ)#*=;Y_wXYwHWhzM$P(G?B*sT)oamIF}v#A`)L$qgnGD|gKED_1=U;@PKG z7i3P`nEiY+TLi14gm~Nsq zJ_gwYP&55($9F$z`qC^x;B=dE9EeS;rcxxL=4yBHGDdPmATHR#fmDYy^YCa6+0dj# z^~d6v_CN4k&2`N>LQ3lH^6A|&wc!xtZE_d=U3s@FPihj*7hkh9UDP*o{qcumcn0Qk zxGewW-L2>BU;HOy^^R0LA+2AOE=(;{G_X+v1C3B`rB7(g>5|_}Z}ofV$DEXZlw>5g zknfehs-@OkarAF#`rVZ)f}H_nF=6?gB1mlVNz(MFhA4!f>SueO*zQuCX-n^&M&8~d z(H5=V89eI3+ix3CA)A7KN*TXA|1577OV-En6a3o{e(vh$kzjvWgY}+F>2~pZ`NMLL zlSK$T{i;5f4L3(A^gYc;l)O@@Xs>|v6U;5a8N`R;tJ6c5*e`qwI4L{QFumdI!7!Wojz(Su74gXz!pnh-OQ zq0c?cf4@~#`>^qHVAS|1yOpDssmp$s6Y6UolR~x8%rOPeMx!^}M9Q#d*0bxs6b)r6 z#e$Z)qI-u>FL9BQc^XOi&-GLe{?!QKkDM;Lt}s^4Jyu!oCS-7X5)eM24ZcO-G4>)< zKu>uxVNGWrFN*El`8@#C+|Yq=>ADA4^Ak{?Tc?69gkaD8K!?=qX+lR?Nu7veZ_azjuw9FYTV=&~E-A7n9q%276D0%?M*%`!u9c1WY;6X4Z6t zTu01_oUdhj)rDB1hCX2lNQCA=55m3+9B!yVK0xd$6EO>aP#BY29$T!ZxBJeR+8E@U zmbw$~70)X`s?r_0y~`o_6lJ(9Fhl6nQ_ze7k{`XUMjHn?F3X~#U~q=b2G)#|kcHX3 z(gjmZ69kll`k%PO+Anu)JE3ja2^)oO(z>1Rl?A5CmXB;T?E9NvUF;Y1d3}@;GAP1rp|1{L`p?PYGkj0^bs%|F{rBz?Gz%uz8&_^>uU44Ip;p3c=N7y z!u{ZABZc_07XlBD%jWlgUQFSyO${|0JjD1qj4c)nRv)r|Z2Xcj?fTic^D7nN>Jv)I z8L;*zuoL&%gBU0=pw+Einzxx6088X<+CrPckMp!GjDUjvu$ zs+2J4h^5tu@1r&ZmA7S+RO<4x?EBPy^T;|%*Xxq%(mRj};oPd*cK%c;B|PiKfUBu0 zvjn(5J6eUA8brXcBdF6Koeott09rNNGBvUl?Kf}k4-M1^9@{30o4tN+8D1WxUnZx) zO{zhj>7SO@m--ONcfIjE9Ajrf@6`((x_FxV>aUWPW6x5@sS419G_32!NvXb~N?lg| z8)x%cNpwHInt6)(&fJfcV&s2+{rR>z{^0h$7L8QzKM9t!1t z=k+}M?z_Ni$rFo~FqWZ!MrasY7v9@%`vAw7qf#X-BI|y5c`3arVbL~T_|43N_jQbp z&ip{O)tsFHr{B17p_tf`PERe?uY>($PC~z9u)Ht4D-&iN?2Z>T5KRtBWW6zf5e~9T z7|Kt{i-wfX_Pl_RIOAVhB8D&K&7 ziebF=X_Zs?Zr$m+kCiIo*w5zZ{;& zHmGAj!rwiR3`IP?D9UehQRElR!Q3oWMqXmW0;H0hA;6d^yoOt`2{U{PmQ~7{n?XRB zm(VPj3GVWZl{sv#rd}!``^ehAg>tPAcj2yagK@4eg5QIP(QLJ0H4Y!;qNm!(1K-)P zAb$oh@ZPwuo)mmp730XW!7TOaMbx63;RCuMXqBNH-h$|T!u0(UL1(L!pN2Uav^$*5 zc*!(@pvn~+O+ChfRhK~{v1v)mz-^KqzJpT-pK-RPxvj+H3O8nN!XyrX=$7iJE>vL^ z5-9&F6dW@9OD=wGjOkicz#3@#Ldx-O&*;d}Z~b_z%?VHMK{XR^2KV((1QPINx_20;pub|zRgsBw>p0cXlQ{X(>Rakj>J6`74shU3 zVPN^h9*%ZD>kDl*#l~a@v@gq|?vpBB?-2y| zrAn4b@+r%hMu49GHsh6)pPK3d!|Tx8QJcnpq&`+%yOxQ7^kwl#4C~_{-sec19?PRh z7+a~Qny+XV>*pZCKLTP>;v`*qs86bvsP~%I)?0Qzb-Z2E-agt(;Jr{7=Bp>_m?E-P z@b=C?Aupy~%I!2JLto-@*zycz{KnemD~LuVOqI$eTwE~ikKX=svSnb= z`h(Y%$T7~}b#-_sc=PzU$Cbm%kbuZ;+|J|Ix-`k_4w10~w{BZga6P=K|6J=mJUUL- z(&Il-wrpCvsu`Y~VwtNG+tuU?3bXpJKPB4OFP`uvw+MJuqE){47|i*Q$yFJW#;wF8 z`%$3(@rxtxCu|)>yJLFQUpe~{vLrL7+U0K6u!Gsf``wyy`Hu~dRml5=J4g<*D{5_O z8U_p}7c&47g%uM9HJ8Ndp(-^6euO#Xdw2;8KHCpRuM@uph1}7t9dmZ@HQFst#OYp^ zpjB}ud?J7l-4Dx6k`}4(W@?9edydc0q@!t0#xan$ygLj#KQTDO@Hsl)_)9VbdKzA9 zEr=*lcR8xfTZ&-_9jLGkI_Uzg!d1*uV*?TM<-cGCIb-tt#huYI7MLLe&pdiE&*RRh zK>g&!Cv}j(%&`cOM^}II0f4LwWR^m#KKi7*k-!*=#B~lo|C#kw8kH|>O zNU_=I{Yi1q_?9hbtI2zFYZiD0D^Z7h1p0EZ54(%-p7FwV3WMm8DJ`y}Y9l}(*}rOG@Y+1y84(XLkT^!f|WqXNQzO_@jSp#*O&d5#{>)1k={?At=j&j)<(Xv@Dmj+MAwten~^7QUMa31jIdYhI=R z<|IHCQE}siffB==4MQOajfC|=@^Io8!>?b0t}*#34~%C$n>&4uX2ylznB;Qd&~s6Y z%I2PSayiF@>LoT548yI^>XwT;SJMD}c_)QpK7o=E`oHpo_y5TgI4F5yoYZ2JuB51{ zjgy1DwK%Ulw=g%Wi-&`~p|Yy5s-m>2vK9o*?@UNa~g7mB;$T%wd&REjFdByMI{#BFD zVh&{F4uXCK1ByE!4p_QYBf8+=1)5#v8WP)dA8<79Lc9I*B3ZX#VArvLLQQ{}%E7UY zQ%KjV*7T+Gd!d4m^=p>;)?{x62YL39LSBuJk#RwyEEJt-n;~Wz6>ce?;NFS5x6%KF z7BQo}EQ^^beyiEaYuwbM<%Az+1##9_(kf42A&UOQA1C2q3<`c%Bl}w#K!_BHD6_F@Wiz0=WN--2_3hozLfpjr?2Ac5JEe*CfzS0SG-Gg)?$fx9Ka3FmK5h(*oi%nT+!u|sPJ2= zqgs79r`f?)yK6?P3l7!iP72H#**@5hPN4le?o{`f?|90mlQ`*@nmE-n;Uz_9|A6=( zp^P?N0Nv}18^}rm%1NUxf8JME+P*g-xQcpu1VM;ePOt^gerjWG&5#y^W#6sZ;5^hiY4~##qoXN3NCj=j~3BmZx+)ck^ zTo^jOVn{D7l>b6=!guy^noIA@QjVGGR9#RT(@DUkERwE$oyT+)Ef?0UX%1AI2*Ci`c4RackO>C0Oym0 zx}h(B-Uoy_Z~)EJ&6H@y2Kr0Q#W)bpS-lBz1YYmZJ5#%|o-MHR>4EHGe9?NWP1EaG zAq$cbFBsBPMct0KsL#w}eA?n>(5BC7Y&@j?Xpl2p5%uc~U07q5+w^1a$;A^Pq`z7@#6GD}Fr+l6||?NbbbdjYC(%qoK)j&9a8r$U9C}mV^Vp?A=C9h!Myw{wv_LHj%TuCesO2ZcA*LMW&eG7wnl1PB zrp(`r&vUQ$Q+UgdBB(E!SAz%iB2F zt?vqKu4`#gkvGiDE1K}jB65To4Q9>(Dq{x12*M^-F;ivbL!@Z{>lQ0S zf;@Z$WwBkxy0oM~tTk1O-Q&--^NA18I`)N=mD5BIAJeLJce3emm(Vc3Ck+ zE?VjQ;g?EIltH}*gmP4AP(^i%wL59y7%RCHx)NuZ-1^Fzz-iZyF6p}m3UJeHAKZ$A zEX{n@9C;cGw8(#0nLRfB_J*Zh6(cIT=o>h6KNKh-eD3rfirC^q=VzpvFaO1w>`yF- zm^?F)Dh(ZeqvM?jUAyqhE8^D-kZ7d1Bh{(k?#Nmh8y{?vyKMFu)S{d7BD5H-X8-MV zDUY2sG~gEJV2`bLCZzmeCS)azBZaB=P{c~phi7nst);iZHhT~tXdJ4JQ2sCS#}7AfHKkuc;ueOe}~5Q)Zx-7)`5N*R?v%4-N0caeVqJ zEjl-pkVOdTsZCn-N-vef`{X@ye{$BZ7?aHz3(eCG&v!adI{Zl?CL zU5qXFfb_qj{>vOUWl4RrPx-oA2BR-6*ilvUU$NvJR)WD>A)oBF*jL}OI#KZw*`quj z@u(#i4^zd($eG4R2YaTPmCaq9*O>cwp5z6tLU-Rkn8uejHB=~EMfp=C8!!6c*WBKGPpllVy*k}SJqU6Co!MlQyy6q!DYJ1b04C8@vIDO*K^!*d zm&Atjz4_6B@f`PP9!sM)A7KoTb(w=MPWd#Z#c$4}!qD~!FFrqgZI_ay+c~#95@Q}h z^MJXViSH0vo6}t05$3vlse_zG%9qe7eG|lRN>k;hK!;a+Wo~Tg6d6)BuZIB8I+pI#e80RL&E+o z&je9U2*G9*p?+`cmMQ6$=&N&lo+~<|qA84dHcw0GMC?9Bf?hjZbG0e-q5rb|`L{3E z_wLWfQmWnj{QM`ivC}o`4^Yb@6La8Wko7*A5Cl+Mkd>JuLnuHH4RKkZz01ODHn7%h zQA$5V=WLr$&CANZhA(yhO6T4T7e0KJA6F@?@_4098PbD&^!0@`shkcKeJR?)1yKrd zuHBw3!P)58^w#|2ULG8!oLF&4C2#vn&*K#GZWpkWr}C+M`$414N=op~<0RGeuLSy} zBHr3|SNo_(vF(xf(uoDRmA2t$DPYO7J^ z*ahOC#57#WBcK91MEW>%M48JNEl3Lwemj69_r{!~sbCBZ6&Hzl+9c*W(t_3TU)}h+ zmaoT?cS_k|Y*vk%hX(d(#W4!Cin5M}qt=G&%r?rG*uRK;6 z8UKus_UK%lcD3Pct=+?o8aV~Orj!e&p`qjxe|EA#@Rv~m+AFKebotQL{lxT-K4e4(?{YZ>wBMwh_*ymj zxO#MM%DMmE*^+rnNRT|M1{hn300tpnz;YRVe2&LmFFJOsjt;2fFTx^zow$Y+KlFSw zyM7+?01Hrx2dXBy`O^+Dh2)=1%eifyan4*;Z0mJ;XTHWH@>rE?%|-7L%p9rUANgme z4v|3pMO9AC%l9Seu?~;f+w;zf$c5{6G6&zx=OpNx`@YA}Rl6TY|A=Q7ID+I#e)YW^ zhmCB0U8-ZH9WRC6ZS3AIjTq|{eHo+$6@=-mCh$m0!V~eG063C?+K1;i25WqVkR5z< z?(P2y8L@;vP`Y3tFhKi?0pn4Fu<$$F0>!B=k;*?#-}MJ(uAfyus|%^7&5_#ix)>HT z98aS8Ro4`g9w`Wgcwk7Rp$Sw<(P$|74&>4aHoQt5ZKin_h~SAobhmOkJUlVt-(Ap5 zGdA(}_IX?Cnqryr?Y@EJcy-@IZJEfn<4o;=R>(AI?F19`u=XPPwc zBaI-0WWzMhXWs*yrjlbtd7*JD*>1o*X9$elTk=2TD%^OGe0IETcg?|GLn=Y5AP9)Z zjrgGr(h>fr?6WVLS>p}BT+S0^dAuhpJm$X)-gdXT}|Or;#Yb-jbfm! z9(Ctye+tp9;ile8{7T$g{}#FDZRlIb>6Z7C%(#sTDRu8I>Uz16F_BYgzK0(KWm6hD zl!w44$3N(0VHlQ7lE{EE{U*j_QYoC_9DM6UKak@W1nDhTtxG0aIwg68CF1TvX$IR& zr~TeI^!n_4%JS2{e0>Lj5$!+XXfA>M%EKd2)6#+3%Fi>c-|UF}KKEqtHO$NxrjqNi z9|%!swED;Z(E6Y~zZF98Pdjz4PXcLzop)zB`2t;H6(A!Hm2|!%Pl@Zx4oAvF z!;0M6f7eW4zkSM0lGF!hD7*1$(b27+{`_XCK_{}E$dn8X&9u~}szRl&F`UI4*5uhS zGp)bhC|(v}V9_S2gw2iEHAAjD5KdaM;x$`tKOA4QEWKzvv0g`jLq)wbA8W5_4JOew64-CQLpc|1*L9-Y5QmSiHCgIhhA5 zMP9b$J=+A12L}wI0XLZLa__hhaPM>&XnBf+15cyG#gHuk;|`}3WS1zk#Lj#9UQdeDfwivJ0#yhTgq z+fpI})6!XibDkJE=E*`PFTMXtxzsdgxeeFkaDTYx2gjR%_2E_M=Vgc?SK(#01grTG zDSUE57Zh+o5X1RRKUvH5I|H2BpQ2_K-oZH}2xP$`4r1#ObO_kY8d>6jID`%X__*^A zcvvt>vuY~SEMekTP}bA>xrF5O3vpMJXc=VA7`!VN68FKwk%>q#P*dtzO{!I$RyO|0 z(QZ0htn8yq%FvG^AOgx+?I!hG+(n%??S27Ye7sZfTVAUf+5uR(4?1#*o)PH( z@a&j>hNLTazyRcBS-2AK@vIG(2+MsiLE_aAlj28t=wKTB;`VQ^3UjFzCjnDM+5GqWLnpcRc}U=HC#2WG*;3K^lk%4EtKVn zR9}}WkKNaMSNZYrNw&M!rc5z}(Y0KcK^oZt+F;*+z>+rEjpSKvy;3^M%j}7n$D@h& zSDis~=y93jFfb179C2mR&E8!J;tfwOt-Hkm_~ZazA|UB4K75zNsSHBtQieAOSIXVL z=>IT>^`zT-ob?-7Ckcb<&(V?iK%&^vEBSN}*UI4;(wG?0CQf$hErkUF(ouWl<(kMB zw<{rGzXI}I6$~|eRU+f>x7!Ij&KZ zZ>3}B`Hu|Y$>43(PDW1V&|X^<6LY# zOYJS>^wrA~6lUDK?PezS1c4+l-TS;mb+}vxG8IVbafh@2JzvhY_uq=qB{57JDD3>g zS!zYdAPq5Jh(e)=*6Y!!kua|$qjYSl6Np+za`h7 z`90;3Cp142D>s`}Pgi;yflJYuiuQQGo=E&l4H;gN0rjXH7mu%E1Y5AHGZ|6)lAjc0 zp(GL0|N244LGNvbSd$F0p{Eku5)zrapUZ8~pC905u}MaaN3&wT6HA+-UPG>!0!2O` zgc+A;b0`c_5f;}hF<`MI3IqxFq~)7DYo7>SeRAyaPvBvv=vP^FnzU|%%T9K_MS0An zS&RG}W;SE9V)eV7PYy#Ijuic_R_jGXe?@h45Lo`Hp)-S%&Go&kr&N!ddi!7Y3p_9A zALNe0f$l3KHQwfsPD}@gxhlt4c$JWpi_b&F6IE9VLICmae{hIrv%5W^)#U&p$++ zJIy8geXrMdd%%_c$;$7mFX20%T(G3dRKLvc5Iij-6^wn~99rZ^rKLFQNc^JgWBN#? z`?jEqvUj1gXEZfM5zTW>(kac5;V-V~^!$nHE_WFKe_HizDC@4F@-9dT=$8rNU}w|`0|ve(jM%;7`u}vLz2Le*XPv%Vig$Dut{m5` zC%ZY@XI24eDs{i?_C{&a8Z}rJ3Vak_gqMfKYX~l8cr$tAR2A6sgZrVv)+_@$=E}z( zv|bVwC2$$H_04ck$DOXHJwBAG1oO3@cMZ9vGYo43yq(2(!w=`5@|fHw>xuSIJ}~&& zBD=mw!jBHj&_WQ?as*-kYl|HY$_W71me+$mS``3(4n2>+DXMs)6{rWgfPTeOBs&EX zG4?Lj;lUNx#w+X!PcD?xtG=&Iflg1=!|aL(OCjH!>DAyH*N=CEd<)sbKl(o=W^C3u z;=@*k3JbG>Q$Nb}eyAjFiC!>EGmz7s`Vf97RPM+DC--b&*J~| z_0~n>e=JT*N|ZUZbl5qxR47G7!348_d1nPBSEZtDotDbAqAab7<6TU(t(6dLQmWRI z&J4YyH-y}k6;G8**2_xa0A-b9G6tdw=!B>NjeR)xq4abR^pm7{W-c zkuwG>LpB00@|zRBJ>G`42c`{Is+^4sQ2&Ug^7Yi?t6_Z(#fnE|rzKj-7I*m?l7-)l z{^wi!>&lDA-Qm#PrI2XrteFAgC}|2|Jc!%X*aA=?2`-=+4luiqPXDnfvO$p5IT=r2 zwC}vpC$ZVc(7*0}D8Yj!*33i~RqRuwKIPnJF*N*J{Y6=Qf1#FUGo~kAPcOBhYa83G zC)&kPwe+h}6l;fz4F%RpvrVUQOKO-Y<8}=n$?!mxNoiHC7PZ>Pck5j^zpKPQ5*jIn z{Q6iJ@k&pzaZaQetZn~Mh1r=;f)UR|?#8aOF13NJB+2K`OX%`;C>_zZzzQ6Av!j8@ z*^^jwo-K|8E5Lz+#3dI-8th=qbRaEWV>BmQzEAMzHcu{hG!>2%^kDhQz9+QeBd?Zh z<%(D=;u?_(-;Oz}h-ZN4;H)&eeKpHBHsV7c;7h_3XqoL?dEe6bmSx2f-?e!#5{mH6 zH1|CIjsM&g8Tpp6#WLcK&uLVy+wfEGJ}w1(6vIB70oBaHJSo5oT}0G&&Zh%lUJt=U zJ`T8*LSVCm57vS9qG)U-2#n0SI0mAw`8aCs+N@H6m_S`{Mq;ac@~VUGhRaX+rlD_S z&iZGM@kIWCZQbBc;a_Fy$vWRfLm1`%!_L$OS*c_a4n}xN#b`>E3uyz~Gkbz$jb*Y~ z@kn%vmDRd^LI7H*xDW z31^4l*L+ydgxW!B8{&Hh5Mrg|^l=-+)u8liS$eH;*G#7wI#OVvmvYaH*MW9k!^Z=JW+QC3CUP|iEnlt(QA#$FSBpzvu8;;ePYE$%9Nv2j& z>Ugs}(A9J7qyD~phz4)|Au-0*TJM9v(l!25M2}o5*{9Ls3wWt;r>G;MkU;?WO1yxU z#0-9QZXZ8;ICFnGAwI$|GSCbEjOdhA;O&0Dt|q7OHdl`r*nfh%EDHZZ6qGI{o5JY- zjpJ?7x+?L=5WB1ERL~DD4t>(7o@&FKAatT#KKvf0?AlnLj29*xCczq>U6aSdkx)|% z&1w#a(b%7Adna_W^cByTR@jO;H&%+*AWr~A`3hoR&Ql&ut5XB58vdIJgb6eZZgpP>wt_A zjaV5x`#OIZ!6aN6X8m49jW#&lC~OQ-a6o??)HhQ0^-e+8nDP^HheY}K>k7@nBNHWU zi-nbXGn*w|(4mbI@>qB=s`Y$sVqq;xx0*ia_y7z27%o`$kk*!-a)&6wJg9>vDe)GQ$XBo)T@f~q;l#q+vUF5)p2*AyUE;v!l zph-%gtqkvuUY&){J>P;L49%`Go`d~oLzti+`wJ?8TP^?`1 z_u^X=iIAXWzZ_86Li$6TiUzI!}4(9>)SCFC+xl25RlSSNxxw z`cxm>e<5}cMZTJbfN4lKsE|0&Q>4L~%Z9_d*IJwKKI8VieRh}^`H36?UE1R%gl{J~ zUmm9GCZaCzO?Ek8;~rD!@a>k+k|micX@S)jv3uS2bw?AcGd&Xq=H!e*;)W1@&^hEL zkTn>we6D~oF0jJ>?%R!$oAGWWS?-}^j(x1Sx6VmM$tc1C&uVtUH}oV9 zPY1maWHrxPiSp?;S*p-0ve+bK*o!JiI%ZCVNDQpOVlKGXjy3{Z*ZhI8HPOcht8{!f z^0~AN=Hs5-fm12uYj!_h1}tB(Dh^~lH*`(f7lVo?(g;R*0YX6kklqJEhbXoJ6LKc- z56lFcGgG#B{c@^w__uGWlyA15LL#WMko*OW>XYy&SE1WM+;t`A9;Jp{K+C)L|J6=H zIe7IfmcmUSD?>?@dz$o3I^w{)#2NK`N;t?rFvOCmPe#n#uX>pP|2I1U|8`_K@!!kmQUSpMYS{E*H9-jk zA&$7Q##O8>mV#Y?ZWvGXqX({M>T~<_Z%0=ih(*8uEYWmI_$pd0D%wVMMp@UD-n@<( z=(q5_`Rn=Dex`i0W_$9mEGX)fZoY@x1!mGDF6W~vF6C+-DTCk21w!_6;{gLH`_X;! z(M)j)65mdNHHhm{&1}v$Ah~dvPrmr3<)?A+mjh5`*V%G?Qvb&d9=4u>(UP=j8R=Qh>?$Ww^F=QFV~4c-+@ZBRPvZ4yY=!V#5t4+4!gN| z8<`o|5+0L3X+CrfY{NGBz^~6iblcCadVrSqcHbxfHdM7QhQ8%bhX?sg^r4p0;rXS> z&B)KD05{Xvf}jv$n$vzDYXfOr+;~vmL&*T%*s}QDdLxd2vu%+*0`VOzW0&?-`k!g- zvg!S1-C$C6c=KSa^%D2~I)eH5sj~L$2X7n=T?TnfZPu9jKSZdfepa~OV$h_+E^Vgn zj}&YX?&wfe@u-w1**Q)p!*PbKEue2#^}NWD(+zt5`JTiNb7KsONz(<*IWB}-+Ah8Q zH^8uBTJ0hEFq)vSjWl{Bo(Vyuqe}lW1cH!F!TcNq_8ierOC2^fOK>kui2VNxaTAX0 z7VL400_a-#H7?3xWd=EySo^#BLAPd7D=;1;D6S0$bP>rDZWwE)1*IBbfGFE@J~uipOF zS-3m9+fMdqa){q9!F{bRLL*dN0FYb&fEFZ&CeStj2++R}i3|j)N(O_ix5$=bovvr)gIWr`P8GVrCNkFmbH5~ zpu6XP1fUn$7Jz;udJ0I@yz~VCt^*(dR^2KFNBpSn8UQK<00}ii33cVS03}n1l>TXz z366jyAPK0V*1;HQhehx{@yd+d<_7Tp#D zFx7k=!_2$?{o>Qhe)z?C{~{HXWEHIodja4HK)2WqIzitm7$A~@DnLpg{3;Tn*EIx} z0s#AspCGb|Q`-FlKkK@hEGLwpJTmqAt7g~u)$>)3!B8C#&RY7lFtxr6H$V{9Pl~UR ztd@c{p2(GPd~&g-Y!_NpFNs`V+cmJZY$qvaYQZdV50w+Z`q>8CUE)rd0+r(Gk3XS_ z)9$#}{Bm5U-__QB##-)k0K3&D1KwT40Px5yBf(dI7QDdWp#sD&Uj@X-2t;}k3?NW; z2NGD64p_ue0{YSl0IF5QarBALT)ct0B@+0q-h1%2-sT(DL^`gH+pt*i*}`Gr8f`bI$~BOU06xj} zW%`ks-0DOhl4R^gS{^Nsv%%T%G0DS=r+zbGc4nRPF*Hl7C%)OzW%_lDxb}@yg#@vNZ+EO^i9A`< zAPv)q(;*{{peYod$kk=KGH=*D^)_kS{n6nID8YXZSp7S|9)K2Z ziV(pS`}7xUkM=k`y_haMVK|mSZCo@v5CXpc0KjeyK<*ErHvxci9{{+Dh85t^6j%d* z#QN?JfTj{aJ7@slXrP_-00wFg>#TQE$9_a0`?H{}bts%b+|}~yL|U_&K56W1lQz9j z)2Ta*@JnR4f`pnI1=U_JB9#b!$c?F;qikE&n&eX~AdxHld`~qM(P?sKeuxwz+{2kl z0Qs{!XxX);l3bllf5M^KM7xjw(>}jn7%c2M8UwsXpP+vG#|i-Sr3X+B7)XBrAnz#v zia`aA&1PLnGjtUN0x42Xh>!BN0-f%vW*auhgNC5Wx|C$aQtzH?nL|Nvgb<$wVaA$LUS9A=*WB_M-X1 zxbPeUdy%RjKmB8D*-U*s3c$yWBBUE%#(%{7`)~A_FM)6R*r4Fru=G@4LfHoZ3K+e9 zK3Y-T0Dx@~``Lk=K9!wXS)>5UZ}1IGiE`J0uxV5meeylaNTYv{M=m!B2 z0O{YYU_AqX>j8kiWB_<6fWSuyIv(Imf}WVK1lIeh|3+DtcuX?s2F7$iKqtfYb^YJA zpINd z;w9t4bqfxyRT2E<$BU{Xas07g7&uwnQN-BcgZ^;zZh!2{nEfmeu5JbKb_bt95P&3IO~XXs3uo6BS4@%Ech*i1@i| z<2WAHN-M1Ed!7YHlHtS9Qlcbhg=@$OHgV=gieZEZ-pCz$dNwRNsR(_FA(89T_@L`n zJ(Ie|k;DzadObk6t5F23xw59!|A&XfJgr9P_fG?`G*j2mplugg`0->oowvYd*&EamXjOS*&ao zp|7sXIfk$;eE{?&%un!ZK z+~oU}rE+9#a?x~Q2V4+vt0PX(nxp|&jOc%1Iym1M%iyDu9{|wPEC6iRhJ}?h-tWte zpFYa%<6b}>l0pEWfdLtytU4n<^pk)sU28xKnII{HNDWAz7zD=3C}96>vY8t0)spl5 zi*ZklMK5LQ%kcMs8YgZLiJnqbBR%Rdu7L%k1;cV{iV6VU$StWq!q?lP5xrU!;*lGt z~x=~Bjc0hPNW04{P<|LHHSO^EF6{%-!hAe{560^ohm01CZ8OrL5LLj0$m zW^R6hDX5YGApI5qv;g0MiazzXEhxAE+#3=D?n(daAZ$=>1b)bMb$+atZM7p8 z;To(oa{W4!+P}l}w zaRs-|oew@7e(`5#r!PPV?tpF|0FYLP003Cc;`05F4peZI0H|9xzyZpdGmd>K^xO|H z3=<1udGwt!&bjK&J5CK1I#8Qm)Mz+L7@1}m!L?kfVhMfKV|iX|NkzWjumVVT#0=U1 z{>Y8vbWhQ~IwJ|cr6f`gxpi*mg)K)fG+NlG@c}2$z}@k2BQ#uu;_C9#2aF6}x_$L{ z_US5mLc5J}p8?3XzBd3@zXniRNY{XBfQSAu0K9h>z_`A=4%)cUkU|fD@-9G`u(*X} z;}nj3?rs3;4X>Qospe1ZA72Cg6^bVK&@}h==I^#DpMG8Srv^MxZy1S?#E+YxG;*Xm zFAeDuDGECP{>V+o_~gEh&PYQ2SOu9wZk)#Z#+D04e(d0D$K4onWEB zH$ehWeX#@%C@b7)GVMd7x7`^Am*(Qe|KZrNEI&3-6_lX}U$XAx)p6|WYexxfVK8*= zrIotJdKHaBDsH*W!E30bI#f?*XHx(KK5+y900000r3wH54gdfE2`Cr945g-~qnxFs zotd4QA^ymX$8rtc-a2;@>XU^Sc;wb~dPd4E+D)hzOoxpN?uNSxz{R8#SLOdSo!j@N z)F=;P@M?ErgO}q404Spo#bCUQqrd*a$+xjCj46^b2LRG31Q2LIGQGax6>B+8FqDv{ z4Zx_&?1p1C&tBGgpE6`2^r)|ehAn))f>GCt3&R2c!)(2_k{F~!&v zZNOJ7BGVZdx6f_I+6R8fZLK|nwvl?7q{CalAvd<^$tiE0k!bUSh8rCV)^9dQcjuu5 zhpFW1<)2#FNBn8}26l|L;QWTsB8^L%L|VKjmjSJy&k$5}OUbV+KcU zvLQ$@smt+tRUU0>pnE)1&An0RTS#BCWP?NttYr2{_))VnEG}yK53a{E;w%?YYHxD`!GPzip>9ZP*@rrbIL9l&wrk=t8; zOE2&KQi8Cp8eD;I;Vw}^!LIOG1|Yqbw*{K>&u<|aB-AG#zoCWVkEg?cH`7)zT}4xkF4UVgiw_9D}*sJNuSJ-`qEa0BU;f^=W3i{_V( zjrY5J{c2FN6~c`bSfAfuczgp8!z=#T$5R_VKFbF*-&iDo&Tg~-XfJN4o47RI zh2Qt_`Ws^0k&-?GF}OGbKt~IpyZt+~V1i~gV1xLnA9802ZEmNCz$)-8)@p_3|4gaZ z$GlVhIS|9mY-?FEy3@P3rn=K;mngJZzDHucu2thOzsr9kjEExMK`l!OD=9$)ApxGq zo!a!bB5fI5XabMi)|aoW@i9AcDc5 zsU70W-L%|#@WJ>Br;m-h3O~>RS^P38Y{h4Pjax^e(YsPr<-RVihLRGKawJN221&YY z7dJSF>0~UP$nACfCfT+{D=b0EA-9$3ottv&v_wjf;=(_0H#i}TB2>x#AB1*an=4P} zD~q;A11}eCL;HIc05T0LZX0&v@zJ}ZyCCXJ8yS<&EmjB@z+t@pg|=~Dv@pOI0ItER zX^;#1gK2ItfHH+jFHXIXanpF)W<)1wAt22)0Mbfg2I-!{@dB@mud~i*b1Q+R zGn6Fo84W9LA^;F-j=AGfm8^ns&!Ly zD2S|50iMWRd;3}0PPxD-3y0j6rmu{4s|pUU0$g}ioZNjt*P*RciYfO0Mh32K__dKA z+k*z+>lXlLqBr~1t$5rg*AG7xYe=U6qZ`10#sI)u0VqI>Uj2OD5Csd?XM})Xkg^z{ z2897IWzrG^@c4C@JlGG+WBmnfTEK%q61ebcczNpO1+Z8LP~uAcPsd4Th(;P% ziMV5R-t<8 literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/mailpager.ogg b/plugins/sound/sounds/mailpager.ogg new file mode 100644 index 0000000000000000000000000000000000000000..130e388d75a8c72b2c4ae25ed5cd8cf774064ffb GIT binary patch literal 15276 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 Yi^zKRU$z8r@bA)t`B#Jb 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 literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/msgsent.ogg b/plugins/sound/sounds/msgsent.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e269a0af1fde1c2c26993d22b03ba2645cfaa788 GIT binary patch literal 44235 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 c+i6#gfZcMQY0;Ik2N6)=6*ezlI2lUG(Hvj+t literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/startup.ogg b/plugins/sound/sounds/startup.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e0ea14a1211d370c65891d1d43e54eb137a30c6f GIT binary patch literal 360957 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

    5QpPwzNajnwG?M+MBnA?`KNb&nuJ@r9l7P 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%0A)fpp@Te`1X!%l&D5(TKQrd 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ⅆ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 z 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ΜBlmNCot&{>5LmJfso#*V@)div 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

    |nxLA{Wy0Ue=Luo&RliTF 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 z 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 literal 0 HcmV?d00001 diff --git a/plugins/sound/sounds/startup3.ogg b/plugins/sound/sounds/startup3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b6bb1c440bf3189e3ae1cf6faab7c8d35dbebd3d GIT binary patch literal 486525 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%0DG1MkOY{Iua}Lmy-F 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 z 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

    + +msg:// + +sim:icons/ + + +  + + +  + + + +  + + + +  + + + + +#808080 + + + +:: + + + + + + + +font-weight:600 + + + + + +#800000 + + +#000080 + + + + + + + + + +:: + + + +

    b^;i{|G#Ejd&$Ho0ZzWkZ0! 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%0Am8aHoT@2&Pk5$pU;iok5CFvs7j{6n6 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 Sd~k#yLeLiQ!_WT+Y50FvhUdfp literal 0 HcmV?d00001 diff --git a/plugins/_core/emoticons_prebuilt/icqlite.jisp.license b/plugins/_core/emoticons_prebuilt/icqlite.jisp.license new file mode 100644 index 0000000..72c3cae --- /dev/null +++ b/plugins/_core/emoticons_prebuilt/icqlite.jisp.license @@ -0,0 +1 @@ +Unknown-proprietary diff --git a/plugins/_core/emoticons_prebuilt/lovenmoney.jisp b/plugins/_core/emoticons_prebuilt/lovenmoney.jisp new file mode 100644 index 0000000000000000000000000000000000000000..293631fe7084addee8bda72b1b434f58bb45c532 GIT binary patch literal 8195 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�`aGuty&m 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/emoticons_prebuilt/sim.jisp.license b/plugins/_core/emoticons_prebuilt/sim.jisp.license new file mode 100644 index 0000000..72c3cae --- /dev/null +++ b/plugins/_core/emoticons_prebuilt/sim.jisp.license @@ -0,0 +1 @@ +Unknown-proprietary diff --git a/plugins/_core/emoticons_prebuilt/sim2.jisp b/plugins/_core/emoticons_prebuilt/sim2.jisp new file mode 100644 index 0000000000000000000000000000000000000000..723a10fcd125712e9992a05fdd8f213d2599d737 GIT binary patch literal 56658 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/emoticons_prebuilt/sim2.jisp.license b/plugins/_core/emoticons_prebuilt/sim2.jisp.license new file mode 100644 index 0000000..72c3cae --- /dev/null +++ b/plugins/_core/emoticons_prebuilt/sim2.jisp.license @@ -0,0 +1 @@ +Unknown-proprietary diff --git a/plugins/_core/emoticons_prebuilt/smiles.jisp b/plugins/_core/emoticons_prebuilt/smiles.jisp new file mode 100644 index 0000000000000000000000000000000000000000..575627f50b2934176e85a486a5582e2d255e4325 GIT binary patch literal 19730 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 literal 0 HcmV?d00001 diff --git a/plugins/_core/emoticons_prebuilt/smiles.jisp.license b/plugins/_core/emoticons_prebuilt/smiles.jisp.license new file mode 100644 index 0000000..72c3cae --- /dev/null +++ b/plugins/_core/emoticons_prebuilt/smiles.jisp.license @@ -0,0 +1 @@ +Unknown-proprietary diff --git a/plugins/_core/emoticons_prebuilt/yahoo.jisp b/plugins/_core/emoticons_prebuilt/yahoo.jisp new file mode 100644 index 0000000000000000000000000000000000000000..c3d66239dc659d18ed491616b952656060e37d09 GIT binary patch literal 121850 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

  • 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 literal 0 HcmV?d00001 diff --git a/install_win32/libxml2.dll b/install_win32/libxml2.dll new file mode 100644 index 0000000000000000000000000000000000000000..3505fbcc2f4bc5584789eb099203e926ef86d5ec GIT binary patch literal 946688 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