From 8a6d4b06f2291c363f3dea17837ed20893852453 Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Wed, 9 Sep 2015 19:00:56 +0200 Subject: Cleanup repo with some directories --- CRSM.service | 17 - ClientInfo.hpp | 112 - CmdFunctionRef.hpp | 46 - CrServerManager.conf | 44 - CrServerManager.conf.README | 74 - CrServerManager.pro | 31 - ProcessManager.cpp | 245 --- ProcessManager.hpp | 75 - crsm.cpp | 2184 ------------------ crsm.hpp | 227 -- doc/CrServerManager.conf | 44 + doc/CrServerManager.conf.README | 74 + libcommuni/.gitignore | 70 - libcommuni/.travis.yml | 39 - libcommuni/AUTHORS | 9 - libcommuni/CHANGELOG | 415 ---- libcommuni/Doxyfile | 2321 -------------------- libcommuni/INSTALL | 26 - libcommuni/LICENSE | 26 - libcommuni/README | 3 - libcommuni/configure | 319 --- libcommuni/doc/bot.dox | 99 - libcommuni/doc/bot.png | Bin 13985 -> 0 bytes libcommuni/doc/client.dox | 67 - libcommuni/doc/client.png | Bin 70323 -> 0 bytes libcommuni/doc/communi.png | Bin 4612 -> 0 bytes libcommuni/doc/debugging.dox | 45 - libcommuni/doc/doc.pri | 20 - libcommuni/doc/enums.dox | 1957 ----------------- libcommuni/doc/header.html | 55 - libcommuni/doc/mainpage.dox | 54 - libcommuni/doc/minimal.dox | 46 - libcommuni/doc/modules.dox | 85 - libcommuni/doc/qml.dox | 160 -- libcommuni/doc/qmlbot.dox | 71 - libcommuni/doc/qmlbot.png | Bin 4804 -> 0 bytes libcommuni/doc/quick.dox | 91 - libcommuni/doc/quick.png | Bin 110519 -> 0 bytes libcommuni/doc/usage.dox | 81 - libcommuni/examples/bot/bot.pro | 17 - libcommuni/examples/bot/ircbot.cpp | 84 - libcommuni/examples/bot/ircbot.h | 37 - libcommuni/examples/bot/main.cpp | 59 - libcommuni/examples/client/client.pro | 16 - libcommuni/examples/client/ircclient.cpp | 321 --- libcommuni/examples/client/ircclient.h | 78 - libcommuni/examples/client/ircmessageformatter.cpp | 113 - libcommuni/examples/client/ircmessageformatter.h | 31 - libcommuni/examples/client/main.cpp | 20 - libcommuni/examples/examples.pri | 24 - libcommuni/examples/examples.pro | 13 - libcommuni/examples/minimal/main.cpp | 38 - libcommuni/examples/minimal/minimal.pro | 16 - libcommuni/examples/qmlbot/main.cpp | 22 - libcommuni/examples/qmlbot/qml/main.qml | 84 - libcommuni/examples/qmlbot/qmlbot.pro | 22 - libcommuni/examples/qmlbot/qmlbot.qrc | 5 - libcommuni/examples/quick/main.cpp | 20 - libcommuni/examples/quick/qml/BufferListView.qml | 92 - libcommuni/examples/quick/qml/ChatPage.qml | 111 - libcommuni/examples/quick/qml/ConnectPage.qml | 160 -- libcommuni/examples/quick/qml/MessageFormatter.qml | 215 -- libcommuni/examples/quick/qml/TextBrowser.qml | 47 - libcommuni/examples/quick/qml/TextEntry.qml | 77 - libcommuni/examples/quick/qml/TopicLabel.qml | 48 - libcommuni/examples/quick/qml/UserListView.qml | 71 - libcommuni/examples/quick/qml/main.qml | 80 - libcommuni/examples/quick/quick.pro | 28 - libcommuni/examples/quick/quick.qrc | 13 - libcommuni/features/communi.prf | 41 - libcommuni/include/IrcCore/Irc | 1 - libcommuni/include/IrcCore/IrcCommand | 1 - libcommuni/include/IrcCore/IrcCommandFilter | 1 - libcommuni/include/IrcCore/IrcConnection | 1 - libcommuni/include/IrcCore/IrcCore | 1 - libcommuni/include/IrcCore/IrcFilter | 1 - libcommuni/include/IrcCore/IrcGlobal | 1 - libcommuni/include/IrcCore/IrcMessage | 1 - libcommuni/include/IrcCore/IrcMessageFilter | 1 - libcommuni/include/IrcCore/IrcNetwork | 1 - libcommuni/include/IrcCore/IrcProtocol | 1 - libcommuni/include/IrcCore/irc.h | 557 ----- libcommuni/include/IrcCore/irccommand.h | 158 -- libcommuni/include/IrcCore/irccommandfilter.h | 1 - libcommuni/include/IrcCore/ircconnection.h | 240 -- libcommuni/include/IrcCore/ircconnection_p.h | 105 - libcommuni/include/IrcCore/irccore.h | 49 - libcommuni/include/IrcCore/ircfilter.h | 65 - libcommuni/include/IrcCore/ircglobal.h | 117 - libcommuni/include/IrcCore/ircmessage.h | 519 ----- libcommuni/include/IrcCore/ircmessage_p.h | 124 -- libcommuni/include/IrcCore/ircmessagebuilder_p.h | 63 - libcommuni/include/IrcCore/ircmessagedecoder_p.h | 58 - libcommuni/include/IrcCore/ircmessagefilter.h | 1 - libcommuni/include/IrcCore/ircnetwork.h | 147 -- libcommuni/include/IrcCore/ircnetwork_p.h | 78 - libcommuni/include/IrcCore/ircprotocol.h | 85 - libcommuni/include/IrcModel/IrcBuffer | 1 - libcommuni/include/IrcModel/IrcBufferModel | 1 - libcommuni/include/IrcModel/IrcChannel | 1 - libcommuni/include/IrcModel/IrcModel | 1 - libcommuni/include/IrcModel/IrcUser | 1 - libcommuni/include/IrcModel/IrcUserModel | 1 - libcommuni/include/IrcModel/ircbuffer.h | 126 -- libcommuni/include/IrcModel/ircbuffer_p.h | 90 - libcommuni/include/IrcModel/ircbuffermodel.h | 158 -- libcommuni/include/IrcModel/ircbuffermodel_p.h | 89 - libcommuni/include/IrcModel/ircchannel.h | 81 - libcommuni/include/IrcModel/ircchannel_p.h | 99 - libcommuni/include/IrcModel/ircmodel.h | 46 - libcommuni/include/IrcModel/ircuser.h | 89 - libcommuni/include/IrcModel/ircuser_p.h | 63 - libcommuni/include/IrcModel/ircusermodel.h | 119 - libcommuni/include/IrcModel/ircusermodel_p.h | 69 - libcommuni/include/IrcUtil/IrcCommandParser | 1 - libcommuni/include/IrcUtil/IrcCompleter | 1 - libcommuni/include/IrcUtil/IrcLagTimer | 1 - libcommuni/include/IrcUtil/IrcPalette | 1 - libcommuni/include/IrcUtil/IrcTextFormat | 1 - libcommuni/include/IrcUtil/IrcUtil | 1 - libcommuni/include/IrcUtil/irccommandparser.h | 112 - libcommuni/include/IrcUtil/irccommandparser_p.h | 96 - libcommuni/include/IrcUtil/irccompleter.h | 90 - libcommuni/include/IrcUtil/irclagtimer.h | 78 - libcommuni/include/IrcUtil/irclagtimer_p.h | 68 - libcommuni/include/IrcUtil/ircpalette.h | 133 -- libcommuni/include/IrcUtil/irctextformat.h | 90 - libcommuni/include/IrcUtil/irctoken_p.h | 81 - libcommuni/include/IrcUtil/ircutil.h | 46 - libcommuni/libcommuni.pro | 121 - libcommuni/src/3rdparty/icu/icu.pri | 44 - libcommuni/src/3rdparty/mozilla/mozilla.pri | 5 - libcommuni/src/3rdparty/mozilla/rdf_utils.c | 132 -- libcommuni/src/3rdparty/pkg.pri | 10 - libcommuni/src/3rdparty/qblowfish/LICENSE | 23 - libcommuni/src/3rdparty/qblowfish/README.md | 28 - libcommuni/src/3rdparty/qblowfish/qblowfish.cpp | 277 --- libcommuni/src/3rdparty/qblowfish/qblowfish.h | 46 - libcommuni/src/3rdparty/qblowfish/qblowfish.pri | 11 - libcommuni/src/3rdparty/qblowfish/qblowfish_p.h | 201 -- libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS | 1 - .../src/3rdparty/uchardet-0.0.1/CMakeLists.txt | 78 - libcommuni/src/3rdparty/uchardet-0.0.1/COPYING | 470 ---- libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL | 4 - .../src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt | 6 - .../src/3rdparty/uchardet-0.0.1/doc/uchardet.1 | 18 - .../src/3rdparty/uchardet-0.0.1/script/debug.sh | 9 - .../src/3rdparty/uchardet-0.0.1/script/release.sh | 8 - .../src/3rdparty/uchardet-0.0.1/script/win32.sh | 7 - .../src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab | 943 -------- .../src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt | 106 - .../uchardet-0.0.1/src/CharDistribution.cpp | 109 - .../3rdparty/uchardet-0.0.1/src/CharDistribution.h | 242 -- .../src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab | 614 ------ .../src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab | 447 ---- .../src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab | 491 ----- .../src/3rdparty/uchardet-0.0.1/src/JISFreq.tab | 589 ----- .../src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp | 230 -- .../src/3rdparty/uchardet-0.0.1/src/JpCntx.h | 140 -- .../uchardet-0.0.1/src/LangBulgarianModel.cpp | 245 --- .../uchardet-0.0.1/src/LangCyrillicModel.cpp | 355 --- .../3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp | 244 -- .../uchardet-0.0.1/src/LangHebrewModel.cpp | 219 -- .../uchardet-0.0.1/src/LangHungarianModel.cpp | 242 -- .../3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp | 221 -- .../3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp | 88 - .../src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h | 74 - .../uchardet-0.0.1/src/nsCharSetProber.cpp | 125 -- .../3rdparty/uchardet-0.0.1/src/nsCharSetProber.h | 76 - .../uchardet-0.0.1/src/nsCodingStateMachine.h | 104 - .../3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp | 99 - .../3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h | 78 - .../3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp | 91 - .../3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h | 75 - .../3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp | 91 - .../3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h | 74 - .../uchardet-0.0.1/src/nsEscCharsetProber.cpp | 101 - .../uchardet-0.0.1/src/nsEscCharsetProber.h | 67 - .../src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp | 263 --- .../3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp | 96 - .../3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h | 76 - .../3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp | 194 -- .../3rdparty/uchardet-0.0.1/src/nsHebrewProber.h | 176 -- .../3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp | 182 -- .../3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h | 70 - .../uchardet-0.0.1/src/nsMBCSGroupProber.cpp | 230 -- .../uchardet-0.0.1/src/nsMBCSGroupProber.h | 80 - .../src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp | 513 ----- .../src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h | 89 - .../uchardet-0.0.1/src/nsSBCSGroupProber.cpp | 224 -- .../uchardet-0.0.1/src/nsSBCSGroupProber.h | 70 - .../uchardet-0.0.1/src/nsSBCharSetProber.cpp | 126 -- .../uchardet-0.0.1/src/nsSBCharSetProber.h | 125 -- .../3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp | 98 - .../src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h | 80 - .../3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp | 87 - .../src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h | 64 - .../uchardet-0.0.1/src/nsUniversalDetector.cpp | 280 --- .../uchardet-0.0.1/src/nsUniversalDetector.h | 89 - .../src/3rdparty/uchardet-0.0.1/src/nscore.h | 59 - libcommuni/src/3rdparty/uchardet-0.0.1/src/prmem.h | 49 - .../src/3rdparty/uchardet-0.0.1/src/symbols.cmake | 38 - .../uchardet-0.0.1/src/tools/CMakeLists.txt | 23 - .../3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp | 141 -- .../src/3rdparty/uchardet-0.0.1/src/uchardet.cpp | 105 - .../src/3rdparty/uchardet-0.0.1/src/uchardet.h | 92 - .../src/3rdparty/uchardet-0.0.1/test/big5.txt | 1 - .../src/3rdparty/uchardet-0.0.1/test/gb18030.txt | 1 - .../src/3rdparty/uchardet-0.0.1/test/shift_jis.txt | 1 - .../src/3rdparty/uchardet-0.0.1/test/utf8.txt | 1 - .../src/3rdparty/uchardet-0.0.1/uchardet.pc.in | 11 - .../src/3rdparty/uchardet-0.0.1/uchardet.pri | 62 - libcommuni/src/core/core.pri | 65 - libcommuni/src/core/core.pro | 8 - libcommuni/src/core/irc.cpp | 172 -- libcommuni/src/core/irccommand.cpp | 851 ------- libcommuni/src/core/ircconnection.cpp | 1508 ------------- libcommuni/src/core/irccore.cpp | 90 - libcommuni/src/core/ircfilter.cpp | 248 --- libcommuni/src/core/ircmessage.cpp | 1604 -------------- libcommuni/src/core/ircmessage_p.cpp | 284 --- libcommuni/src/core/ircmessagebuilder.cpp | 121 - libcommuni/src/core/ircmessagedecoder.cpp | 73 - libcommuni/src/core/ircmessagedecoder_icu.cpp | 68 - libcommuni/src/core/ircmessagedecoder_uchardet.cpp | 56 - libcommuni/src/core/ircnetwork.cpp | 687 ------ libcommuni/src/core/ircprotocol.cpp | 480 ---- libcommuni/src/imports/imports.pri | 17 - libcommuni/src/imports/imports.pro | 7 - libcommuni/src/imports/qml1/plugin.cpp | 138 -- libcommuni/src/imports/qml1/plugins.qmltypes | 1929 ---------------- libcommuni/src/imports/qml1/qml1.pro | 30 - libcommuni/src/imports/qml1/qmldir | 1 - libcommuni/src/imports/qml2/plugin.cpp | 139 -- libcommuni/src/imports/qml2/plugins.qmltypes | 1769 --------------- libcommuni/src/imports/qml2/qml2.pro | 30 - libcommuni/src/imports/qml2/qmldir | 2 - libcommuni/src/model/ircbuffer.cpp | 593 ----- libcommuni/src/model/ircbuffermodel.cpp | 1168 ---------- libcommuni/src/model/ircchannel.cpp | 623 ------ libcommuni/src/model/ircmodel.cpp | 61 - libcommuni/src/model/ircuser.cpp | 266 --- libcommuni/src/model/ircusermodel.cpp | 709 ------ libcommuni/src/model/model.pri | 40 - libcommuni/src/model/model.pro | 11 - libcommuni/src/module_build.pri | 57 - libcommuni/src/module_deps.pri | 36 - libcommuni/src/module_install.pri | 38 - libcommuni/src/src.pri | 7 - libcommuni/src/src.pro | 27 - libcommuni/src/util/irccommandparser.cpp | 597 ----- libcommuni/src/util/irccompleter.cpp | 405 ---- libcommuni/src/util/irclagtimer.cpp | 243 -- libcommuni/src/util/ircpalette.cpp | 527 ----- libcommuni/src/util/irctextformat.cpp | 550 ----- libcommuni/src/util/irctoken.cpp | 125 -- libcommuni/src/util/ircutil.cpp | 61 - libcommuni/src/util/util.pri | 39 - libcommuni/src/util/util.pro | 11 - libcommuni/tests/auto/auto.pri | 9 - libcommuni/tests/auto/auto.pro | 26 - libcommuni/tests/auto/irc/irc.pro | 7 - libcommuni/tests/auto/irc/tst_irc.cpp | 157 -- libcommuni/tests/auto/ircbuffer/ircbuffer.pro | 7 - libcommuni/tests/auto/ircbuffer/tst_ircbuffer.cpp | 159 -- .../tests/auto/ircbuffermodel/ircbuffermodel.pro | 11 - .../auto/ircbuffermodel/tst_ircbuffermodel.cpp | 1461 ------------ libcommuni/tests/auto/ircchannel/ircchannel.pro | 7 - .../tests/auto/ircchannel/tst_ircchannel.cpp | 79 - libcommuni/tests/auto/irccommand/irccommand.pro | 7 - .../tests/auto/irccommand/tst_irccommand.cpp | 529 ----- .../auto/irccommandparser/irccommandparser.pro | 7 - .../auto/irccommandparser/tst_irccommandparser.cpp | 442 ---- .../tests/auto/irccompleter/irccompleter.pro | 8 - .../tests/auto/irccompleter/tst_irccompleter.cpp | 237 -- .../tests/auto/ircconnection/ircconnection.pro | 11 - .../tests/auto/ircconnection/tst_ircconnection.cpp | 1721 --------------- libcommuni/tests/auto/irclagtimer/irclagtimer.pro | 8 - .../tests/auto/irclagtimer/tst_irclagtimer.cpp | 109 - libcommuni/tests/auto/ircmessage/ircmessage.pro | 7 - .../tests/auto/ircmessage/tst_ircmessage.cpp | 973 -------- libcommuni/tests/auto/ircnetwork/ircnetwork.pro | 8 - .../tests/auto/ircnetwork/tst_ircnetwork.cpp | 408 ---- libcommuni/tests/auto/ircpalette/ircpalette.pro | 7 - .../tests/auto/ircpalette/tst_ircpalette.cpp | 102 - .../tests/auto/irctextformat/irctextformat.pro | 7 - .../tests/auto/irctextformat/tst_irctextformat.cpp | 192 -- libcommuni/tests/auto/ircuser/ircuser.pro | 7 - libcommuni/tests/auto/ircuser/tst_ircuser.cpp | 86 - .../tests/auto/ircusermodel/ircusermodel.pro | 8 - .../tests/auto/ircusermodel/tst_ircusermodel.cpp | 1688 -------------- libcommuni/tests/auto/shared/shared.pri | 16 - libcommuni/tests/auto/shared/tst_euirc.h | 47 - libcommuni/tests/auto/shared/tst_freenode.h | 94 - .../tests/auto/shared/tst_ircclientserver.cpp | 67 - libcommuni/tests/auto/shared/tst_ircclientserver.h | 50 - libcommuni/tests/auto/shared/tst_ircdata.cpp | 95 - libcommuni/tests/auto/shared/tst_ircdata.h | 32 - libcommuni/tests/auto/shared/tst_ircnet.h | 81 - libcommuni/tests/benchmarks/benchmarks.pri | 9 - libcommuni/tests/benchmarks/benchmarks.pro | 12 - .../tests/benchmarks/ircmessage/ircmessage.pro | 7 - .../tests/benchmarks/ircmessage/tst_ircmessage.cpp | 61 - .../ircmessagedecoder/ircmessagedecoder.pro | 7 - .../ircmessagedecoder/tst_ircmessagedecoder.cpp | 62 - .../benchmarks/irctextformat/irctextformat.pro | 7 - .../benchmarks/irctextformat/tst_irctextformat.cpp | 44 - libcommuni/tests/build/build.pro | 6 - libcommuni/tests/build/embed/embed.pro | 11 - libcommuni/tests/build/embed/main.cpp | 19 - libcommuni/tests/build/install/install.pro | 12 - libcommuni/tests/build/install/main.cpp | 19 - libcommuni/tests/build/namespace/main.cpp | 19 - libcommuni/tests/build/namespace/namespace.pro | 12 - libcommuni/tests/tests.pri | 25 - libcommuni/tests/tests.pro | 18 - libcommuni/version.pri | 5 - main.cpp | 13 - reload-CRSM | 5 - src/ClientInfo.hpp | 112 + src/CmdFunctionRef.hpp | 46 + src/CrServerManager.pro | 31 + src/ProcessManager.cpp | 245 +++ src/ProcessManager.hpp | 75 + src/crsm.cpp | 2184 ++++++++++++++++++ src/crsm.hpp | 227 ++ src/libcommuni/.gitignore | 70 + src/libcommuni/.travis.yml | 39 + src/libcommuni/AUTHORS | 9 + src/libcommuni/CHANGELOG | 415 ++++ src/libcommuni/Doxyfile | 2321 ++++++++++++++++++++ src/libcommuni/INSTALL | 26 + src/libcommuni/LICENSE | 26 + src/libcommuni/README | 3 + src/libcommuni/configure | 319 +++ src/libcommuni/doc/bot.dox | 99 + src/libcommuni/doc/bot.png | Bin 0 -> 13985 bytes src/libcommuni/doc/client.dox | 67 + src/libcommuni/doc/client.png | Bin 0 -> 70323 bytes src/libcommuni/doc/communi.png | Bin 0 -> 4612 bytes src/libcommuni/doc/debugging.dox | 45 + src/libcommuni/doc/doc.pri | 20 + src/libcommuni/doc/enums.dox | 1957 +++++++++++++++++ src/libcommuni/doc/header.html | 55 + src/libcommuni/doc/mainpage.dox | 54 + src/libcommuni/doc/minimal.dox | 46 + src/libcommuni/doc/modules.dox | 85 + src/libcommuni/doc/qml.dox | 160 ++ src/libcommuni/doc/qmlbot.dox | 71 + src/libcommuni/doc/qmlbot.png | Bin 0 -> 4804 bytes src/libcommuni/doc/quick.dox | 91 + src/libcommuni/doc/quick.png | Bin 0 -> 110519 bytes src/libcommuni/doc/usage.dox | 81 + src/libcommuni/examples/bot/bot.pro | 17 + src/libcommuni/examples/bot/ircbot.cpp | 84 + src/libcommuni/examples/bot/ircbot.h | 37 + src/libcommuni/examples/bot/main.cpp | 59 + src/libcommuni/examples/client/client.pro | 16 + src/libcommuni/examples/client/ircclient.cpp | 321 +++ src/libcommuni/examples/client/ircclient.h | 78 + .../examples/client/ircmessageformatter.cpp | 113 + .../examples/client/ircmessageformatter.h | 31 + src/libcommuni/examples/client/main.cpp | 20 + src/libcommuni/examples/examples.pri | 24 + src/libcommuni/examples/examples.pro | 13 + src/libcommuni/examples/minimal/main.cpp | 38 + src/libcommuni/examples/minimal/minimal.pro | 16 + src/libcommuni/examples/qmlbot/main.cpp | 22 + src/libcommuni/examples/qmlbot/qml/main.qml | 84 + src/libcommuni/examples/qmlbot/qmlbot.pro | 22 + src/libcommuni/examples/qmlbot/qmlbot.qrc | 5 + src/libcommuni/examples/quick/main.cpp | 20 + .../examples/quick/qml/BufferListView.qml | 92 + src/libcommuni/examples/quick/qml/ChatPage.qml | 111 + src/libcommuni/examples/quick/qml/ConnectPage.qml | 160 ++ .../examples/quick/qml/MessageFormatter.qml | 215 ++ src/libcommuni/examples/quick/qml/TextBrowser.qml | 47 + src/libcommuni/examples/quick/qml/TextEntry.qml | 77 + src/libcommuni/examples/quick/qml/TopicLabel.qml | 48 + src/libcommuni/examples/quick/qml/UserListView.qml | 71 + src/libcommuni/examples/quick/qml/main.qml | 80 + src/libcommuni/examples/quick/quick.pro | 28 + src/libcommuni/examples/quick/quick.qrc | 13 + src/libcommuni/features/communi.prf | 41 + src/libcommuni/include/IrcCore/Irc | 1 + src/libcommuni/include/IrcCore/IrcCommand | 1 + src/libcommuni/include/IrcCore/IrcCommandFilter | 1 + src/libcommuni/include/IrcCore/IrcConnection | 1 + src/libcommuni/include/IrcCore/IrcCore | 1 + src/libcommuni/include/IrcCore/IrcFilter | 1 + src/libcommuni/include/IrcCore/IrcGlobal | 1 + src/libcommuni/include/IrcCore/IrcMessage | 1 + src/libcommuni/include/IrcCore/IrcMessageFilter | 1 + src/libcommuni/include/IrcCore/IrcNetwork | 1 + src/libcommuni/include/IrcCore/IrcProtocol | 1 + src/libcommuni/include/IrcCore/irc.h | 557 +++++ src/libcommuni/include/IrcCore/irccommand.h | 158 ++ src/libcommuni/include/IrcCore/irccommandfilter.h | 1 + src/libcommuni/include/IrcCore/ircconnection.h | 240 ++ src/libcommuni/include/IrcCore/ircconnection_p.h | 105 + src/libcommuni/include/IrcCore/irccore.h | 49 + src/libcommuni/include/IrcCore/ircfilter.h | 65 + src/libcommuni/include/IrcCore/ircglobal.h | 117 + src/libcommuni/include/IrcCore/ircmessage.h | 519 +++++ src/libcommuni/include/IrcCore/ircmessage_p.h | 124 ++ .../include/IrcCore/ircmessagebuilder_p.h | 63 + .../include/IrcCore/ircmessagedecoder_p.h | 58 + src/libcommuni/include/IrcCore/ircmessagefilter.h | 1 + src/libcommuni/include/IrcCore/ircnetwork.h | 147 ++ src/libcommuni/include/IrcCore/ircnetwork_p.h | 78 + src/libcommuni/include/IrcCore/ircprotocol.h | 85 + src/libcommuni/include/IrcModel/IrcBuffer | 1 + src/libcommuni/include/IrcModel/IrcBufferModel | 1 + src/libcommuni/include/IrcModel/IrcChannel | 1 + src/libcommuni/include/IrcModel/IrcModel | 1 + src/libcommuni/include/IrcModel/IrcUser | 1 + src/libcommuni/include/IrcModel/IrcUserModel | 1 + src/libcommuni/include/IrcModel/ircbuffer.h | 126 ++ src/libcommuni/include/IrcModel/ircbuffer_p.h | 90 + src/libcommuni/include/IrcModel/ircbuffermodel.h | 158 ++ src/libcommuni/include/IrcModel/ircbuffermodel_p.h | 89 + src/libcommuni/include/IrcModel/ircchannel.h | 81 + src/libcommuni/include/IrcModel/ircchannel_p.h | 99 + src/libcommuni/include/IrcModel/ircmodel.h | 46 + src/libcommuni/include/IrcModel/ircuser.h | 89 + src/libcommuni/include/IrcModel/ircuser_p.h | 63 + src/libcommuni/include/IrcModel/ircusermodel.h | 119 + src/libcommuni/include/IrcModel/ircusermodel_p.h | 69 + src/libcommuni/include/IrcUtil/IrcCommandParser | 1 + src/libcommuni/include/IrcUtil/IrcCompleter | 1 + src/libcommuni/include/IrcUtil/IrcLagTimer | 1 + src/libcommuni/include/IrcUtil/IrcPalette | 1 + src/libcommuni/include/IrcUtil/IrcTextFormat | 1 + src/libcommuni/include/IrcUtil/IrcUtil | 1 + src/libcommuni/include/IrcUtil/irccommandparser.h | 112 + .../include/IrcUtil/irccommandparser_p.h | 96 + src/libcommuni/include/IrcUtil/irccompleter.h | 90 + src/libcommuni/include/IrcUtil/irclagtimer.h | 78 + src/libcommuni/include/IrcUtil/irclagtimer_p.h | 68 + src/libcommuni/include/IrcUtil/ircpalette.h | 133 ++ src/libcommuni/include/IrcUtil/irctextformat.h | 90 + src/libcommuni/include/IrcUtil/irctoken_p.h | 81 + src/libcommuni/include/IrcUtil/ircutil.h | 46 + src/libcommuni/libcommuni.pro | 121 + src/libcommuni/src/3rdparty/icu/icu.pri | 44 + src/libcommuni/src/3rdparty/mozilla/mozilla.pri | 5 + src/libcommuni/src/3rdparty/mozilla/rdf_utils.c | 132 ++ src/libcommuni/src/3rdparty/pkg.pri | 10 + src/libcommuni/src/3rdparty/qblowfish/LICENSE | 23 + src/libcommuni/src/3rdparty/qblowfish/README.md | 28 + .../src/3rdparty/qblowfish/qblowfish.cpp | 277 +++ src/libcommuni/src/3rdparty/qblowfish/qblowfish.h | 46 + .../src/3rdparty/qblowfish/qblowfish.pri | 11 + .../src/3rdparty/qblowfish/qblowfish_p.h | 201 ++ src/libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS | 1 + .../src/3rdparty/uchardet-0.0.1/CMakeLists.txt | 78 + src/libcommuni/src/3rdparty/uchardet-0.0.1/COPYING | 470 ++++ src/libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL | 4 + .../src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt | 6 + .../src/3rdparty/uchardet-0.0.1/doc/uchardet.1 | 18 + .../src/3rdparty/uchardet-0.0.1/script/debug.sh | 9 + .../src/3rdparty/uchardet-0.0.1/script/release.sh | 8 + .../src/3rdparty/uchardet-0.0.1/script/win32.sh | 7 + .../src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab | 943 ++++++++ .../src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt | 106 + .../uchardet-0.0.1/src/CharDistribution.cpp | 109 + .../3rdparty/uchardet-0.0.1/src/CharDistribution.h | 242 ++ .../src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab | 614 ++++++ .../src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab | 447 ++++ .../src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab | 491 +++++ .../src/3rdparty/uchardet-0.0.1/src/JISFreq.tab | 589 +++++ .../src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp | 230 ++ .../src/3rdparty/uchardet-0.0.1/src/JpCntx.h | 140 ++ .../uchardet-0.0.1/src/LangBulgarianModel.cpp | 245 +++ .../uchardet-0.0.1/src/LangCyrillicModel.cpp | 355 +++ .../3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp | 244 ++ .../uchardet-0.0.1/src/LangHebrewModel.cpp | 219 ++ .../uchardet-0.0.1/src/LangHungarianModel.cpp | 242 ++ .../3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp | 221 ++ .../3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp | 88 + .../src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h | 74 + .../uchardet-0.0.1/src/nsCharSetProber.cpp | 125 ++ .../3rdparty/uchardet-0.0.1/src/nsCharSetProber.h | 76 + .../uchardet-0.0.1/src/nsCodingStateMachine.h | 104 + .../3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp | 99 + .../3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h | 78 + .../3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp | 91 + .../3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h | 75 + .../3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp | 91 + .../3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h | 74 + .../uchardet-0.0.1/src/nsEscCharsetProber.cpp | 101 + .../uchardet-0.0.1/src/nsEscCharsetProber.h | 67 + .../src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp | 263 +++ .../3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp | 96 + .../3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h | 76 + .../3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp | 194 ++ .../3rdparty/uchardet-0.0.1/src/nsHebrewProber.h | 176 ++ .../3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp | 182 ++ .../3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h | 70 + .../uchardet-0.0.1/src/nsMBCSGroupProber.cpp | 230 ++ .../uchardet-0.0.1/src/nsMBCSGroupProber.h | 80 + .../src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp | 513 +++++ .../src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h | 89 + .../uchardet-0.0.1/src/nsSBCSGroupProber.cpp | 224 ++ .../uchardet-0.0.1/src/nsSBCSGroupProber.h | 70 + .../uchardet-0.0.1/src/nsSBCharSetProber.cpp | 126 ++ .../uchardet-0.0.1/src/nsSBCharSetProber.h | 125 ++ .../3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp | 98 + .../src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h | 80 + .../3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp | 87 + .../src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h | 64 + .../uchardet-0.0.1/src/nsUniversalDetector.cpp | 280 +++ .../uchardet-0.0.1/src/nsUniversalDetector.h | 89 + .../src/3rdparty/uchardet-0.0.1/src/nscore.h | 59 + .../src/3rdparty/uchardet-0.0.1/src/prmem.h | 49 + .../src/3rdparty/uchardet-0.0.1/src/symbols.cmake | 38 + .../uchardet-0.0.1/src/tools/CMakeLists.txt | 23 + .../3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp | 141 ++ .../src/3rdparty/uchardet-0.0.1/src/uchardet.cpp | 105 + .../src/3rdparty/uchardet-0.0.1/src/uchardet.h | 92 + .../src/3rdparty/uchardet-0.0.1/test/big5.txt | 1 + .../src/3rdparty/uchardet-0.0.1/test/gb18030.txt | 1 + .../src/3rdparty/uchardet-0.0.1/test/shift_jis.txt | 1 + .../src/3rdparty/uchardet-0.0.1/test/utf8.txt | 1 + .../src/3rdparty/uchardet-0.0.1/uchardet.pc.in | 11 + .../src/3rdparty/uchardet-0.0.1/uchardet.pri | 62 + src/libcommuni/src/core/core.pri | 65 + src/libcommuni/src/core/core.pro | 8 + src/libcommuni/src/core/irc.cpp | 172 ++ src/libcommuni/src/core/irccommand.cpp | 851 +++++++ src/libcommuni/src/core/ircconnection.cpp | 1508 +++++++++++++ src/libcommuni/src/core/irccore.cpp | 90 + src/libcommuni/src/core/ircfilter.cpp | 248 +++ src/libcommuni/src/core/ircmessage.cpp | 1604 ++++++++++++++ src/libcommuni/src/core/ircmessage_p.cpp | 284 +++ src/libcommuni/src/core/ircmessagebuilder.cpp | 121 + src/libcommuni/src/core/ircmessagedecoder.cpp | 73 + src/libcommuni/src/core/ircmessagedecoder_icu.cpp | 68 + .../src/core/ircmessagedecoder_uchardet.cpp | 56 + src/libcommuni/src/core/ircnetwork.cpp | 687 ++++++ src/libcommuni/src/core/ircprotocol.cpp | 480 ++++ src/libcommuni/src/imports/imports.pri | 17 + src/libcommuni/src/imports/imports.pro | 7 + src/libcommuni/src/imports/qml1/plugin.cpp | 138 ++ src/libcommuni/src/imports/qml1/plugins.qmltypes | 1929 ++++++++++++++++ src/libcommuni/src/imports/qml1/qml1.pro | 30 + src/libcommuni/src/imports/qml1/qmldir | 1 + src/libcommuni/src/imports/qml2/plugin.cpp | 139 ++ src/libcommuni/src/imports/qml2/plugins.qmltypes | 1769 +++++++++++++++ src/libcommuni/src/imports/qml2/qml2.pro | 30 + src/libcommuni/src/imports/qml2/qmldir | 2 + src/libcommuni/src/model/ircbuffer.cpp | 593 +++++ src/libcommuni/src/model/ircbuffermodel.cpp | 1168 ++++++++++ src/libcommuni/src/model/ircchannel.cpp | 623 ++++++ src/libcommuni/src/model/ircmodel.cpp | 61 + src/libcommuni/src/model/ircuser.cpp | 266 +++ src/libcommuni/src/model/ircusermodel.cpp | 709 ++++++ src/libcommuni/src/model/model.pri | 40 + src/libcommuni/src/model/model.pro | 11 + src/libcommuni/src/module_build.pri | 57 + src/libcommuni/src/module_deps.pri | 36 + src/libcommuni/src/module_install.pri | 38 + src/libcommuni/src/src.pri | 7 + src/libcommuni/src/src.pro | 27 + src/libcommuni/src/util/irccommandparser.cpp | 597 +++++ src/libcommuni/src/util/irccompleter.cpp | 405 ++++ src/libcommuni/src/util/irclagtimer.cpp | 243 ++ src/libcommuni/src/util/ircpalette.cpp | 527 +++++ src/libcommuni/src/util/irctextformat.cpp | 550 +++++ src/libcommuni/src/util/irctoken.cpp | 125 ++ src/libcommuni/src/util/ircutil.cpp | 61 + src/libcommuni/src/util/util.pri | 39 + src/libcommuni/src/util/util.pro | 11 + src/libcommuni/tests/auto/auto.pri | 9 + src/libcommuni/tests/auto/auto.pro | 26 + src/libcommuni/tests/auto/irc/irc.pro | 7 + src/libcommuni/tests/auto/irc/tst_irc.cpp | 157 ++ src/libcommuni/tests/auto/ircbuffer/ircbuffer.pro | 7 + .../tests/auto/ircbuffer/tst_ircbuffer.cpp | 159 ++ .../tests/auto/ircbuffermodel/ircbuffermodel.pro | 11 + .../auto/ircbuffermodel/tst_ircbuffermodel.cpp | 1461 ++++++++++++ .../tests/auto/ircchannel/ircchannel.pro | 7 + .../tests/auto/ircchannel/tst_ircchannel.cpp | 79 + .../tests/auto/irccommand/irccommand.pro | 7 + .../tests/auto/irccommand/tst_irccommand.cpp | 529 +++++ .../auto/irccommandparser/irccommandparser.pro | 7 + .../auto/irccommandparser/tst_irccommandparser.cpp | 442 ++++ .../tests/auto/irccompleter/irccompleter.pro | 8 + .../tests/auto/irccompleter/tst_irccompleter.cpp | 237 ++ .../tests/auto/ircconnection/ircconnection.pro | 11 + .../tests/auto/ircconnection/tst_ircconnection.cpp | 1721 +++++++++++++++ .../tests/auto/irclagtimer/irclagtimer.pro | 8 + .../tests/auto/irclagtimer/tst_irclagtimer.cpp | 109 + .../tests/auto/ircmessage/ircmessage.pro | 7 + .../tests/auto/ircmessage/tst_ircmessage.cpp | 973 ++++++++ .../tests/auto/ircnetwork/ircnetwork.pro | 8 + .../tests/auto/ircnetwork/tst_ircnetwork.cpp | 408 ++++ .../tests/auto/ircpalette/ircpalette.pro | 7 + .../tests/auto/ircpalette/tst_ircpalette.cpp | 102 + .../tests/auto/irctextformat/irctextformat.pro | 7 + .../tests/auto/irctextformat/tst_irctextformat.cpp | 192 ++ src/libcommuni/tests/auto/ircuser/ircuser.pro | 7 + src/libcommuni/tests/auto/ircuser/tst_ircuser.cpp | 86 + .../tests/auto/ircusermodel/ircusermodel.pro | 8 + .../tests/auto/ircusermodel/tst_ircusermodel.cpp | 1688 ++++++++++++++ src/libcommuni/tests/auto/shared/shared.pri | 16 + src/libcommuni/tests/auto/shared/tst_euirc.h | 47 + src/libcommuni/tests/auto/shared/tst_freenode.h | 94 + .../tests/auto/shared/tst_ircclientserver.cpp | 67 + .../tests/auto/shared/tst_ircclientserver.h | 50 + src/libcommuni/tests/auto/shared/tst_ircdata.cpp | 95 + src/libcommuni/tests/auto/shared/tst_ircdata.h | 32 + src/libcommuni/tests/auto/shared/tst_ircnet.h | 81 + src/libcommuni/tests/benchmarks/benchmarks.pri | 9 + src/libcommuni/tests/benchmarks/benchmarks.pro | 12 + .../tests/benchmarks/ircmessage/ircmessage.pro | 7 + .../tests/benchmarks/ircmessage/tst_ircmessage.cpp | 61 + .../ircmessagedecoder/ircmessagedecoder.pro | 7 + .../ircmessagedecoder/tst_ircmessagedecoder.cpp | 62 + .../benchmarks/irctextformat/irctextformat.pro | 7 + .../benchmarks/irctextformat/tst_irctextformat.cpp | 44 + src/libcommuni/tests/build/build.pro | 6 + src/libcommuni/tests/build/embed/embed.pro | 11 + src/libcommuni/tests/build/embed/main.cpp | 19 + src/libcommuni/tests/build/install/install.pro | 12 + src/libcommuni/tests/build/install/main.cpp | 19 + src/libcommuni/tests/build/namespace/main.cpp | 19 + src/libcommuni/tests/build/namespace/namespace.pro | 12 + src/libcommuni/tests/tests.pri | 25 + src/libcommuni/tests/tests.pro | 18 + src/libcommuni/version.pri | 5 + src/main.cpp | 13 + stop-CRSM | 5 - systemd-service/CRSM.service | 17 + systemd-service/reload-CRSM | 5 + systemd-service/stop-CRSM | 5 + 636 files changed, 53131 insertions(+), 53131 deletions(-) delete mode 100644 CRSM.service delete mode 100644 ClientInfo.hpp delete mode 100644 CmdFunctionRef.hpp delete mode 100644 CrServerManager.conf delete mode 100644 CrServerManager.conf.README delete mode 100644 CrServerManager.pro delete mode 100644 ProcessManager.cpp delete mode 100644 ProcessManager.hpp delete mode 100644 crsm.cpp delete mode 100644 crsm.hpp create mode 100644 doc/CrServerManager.conf create mode 100644 doc/CrServerManager.conf.README delete mode 100644 libcommuni/.gitignore delete mode 100644 libcommuni/.travis.yml delete mode 100644 libcommuni/AUTHORS delete mode 100644 libcommuni/CHANGELOG delete mode 100644 libcommuni/Doxyfile delete mode 100644 libcommuni/INSTALL delete mode 100644 libcommuni/LICENSE delete mode 100644 libcommuni/README delete mode 100755 libcommuni/configure delete mode 100644 libcommuni/doc/bot.dox delete mode 100644 libcommuni/doc/bot.png delete mode 100644 libcommuni/doc/client.dox delete mode 100644 libcommuni/doc/client.png delete mode 100644 libcommuni/doc/communi.png delete mode 100644 libcommuni/doc/debugging.dox delete mode 100644 libcommuni/doc/doc.pri delete mode 100644 libcommuni/doc/enums.dox delete mode 100644 libcommuni/doc/header.html delete mode 100644 libcommuni/doc/mainpage.dox delete mode 100644 libcommuni/doc/minimal.dox delete mode 100644 libcommuni/doc/modules.dox delete mode 100644 libcommuni/doc/qml.dox delete mode 100644 libcommuni/doc/qmlbot.dox delete mode 100644 libcommuni/doc/qmlbot.png delete mode 100644 libcommuni/doc/quick.dox delete mode 100644 libcommuni/doc/quick.png delete mode 100644 libcommuni/doc/usage.dox delete mode 100644 libcommuni/examples/bot/bot.pro delete mode 100644 libcommuni/examples/bot/ircbot.cpp delete mode 100644 libcommuni/examples/bot/ircbot.h delete mode 100644 libcommuni/examples/bot/main.cpp delete mode 100644 libcommuni/examples/client/client.pro delete mode 100644 libcommuni/examples/client/ircclient.cpp delete mode 100644 libcommuni/examples/client/ircclient.h delete mode 100644 libcommuni/examples/client/ircmessageformatter.cpp delete mode 100644 libcommuni/examples/client/ircmessageformatter.h delete mode 100644 libcommuni/examples/client/main.cpp delete mode 100644 libcommuni/examples/examples.pri delete mode 100644 libcommuni/examples/examples.pro delete mode 100644 libcommuni/examples/minimal/main.cpp delete mode 100644 libcommuni/examples/minimal/minimal.pro delete mode 100644 libcommuni/examples/qmlbot/main.cpp delete mode 100644 libcommuni/examples/qmlbot/qml/main.qml delete mode 100644 libcommuni/examples/qmlbot/qmlbot.pro delete mode 100644 libcommuni/examples/qmlbot/qmlbot.qrc delete mode 100644 libcommuni/examples/quick/main.cpp delete mode 100644 libcommuni/examples/quick/qml/BufferListView.qml delete mode 100644 libcommuni/examples/quick/qml/ChatPage.qml delete mode 100644 libcommuni/examples/quick/qml/ConnectPage.qml delete mode 100644 libcommuni/examples/quick/qml/MessageFormatter.qml delete mode 100644 libcommuni/examples/quick/qml/TextBrowser.qml delete mode 100644 libcommuni/examples/quick/qml/TextEntry.qml delete mode 100644 libcommuni/examples/quick/qml/TopicLabel.qml delete mode 100644 libcommuni/examples/quick/qml/UserListView.qml delete mode 100644 libcommuni/examples/quick/qml/main.qml delete mode 100644 libcommuni/examples/quick/quick.pro delete mode 100644 libcommuni/examples/quick/quick.qrc delete mode 100644 libcommuni/features/communi.prf delete mode 100644 libcommuni/include/IrcCore/Irc delete mode 100644 libcommuni/include/IrcCore/IrcCommand delete mode 100644 libcommuni/include/IrcCore/IrcCommandFilter delete mode 100644 libcommuni/include/IrcCore/IrcConnection delete mode 100644 libcommuni/include/IrcCore/IrcCore delete mode 100644 libcommuni/include/IrcCore/IrcFilter delete mode 100644 libcommuni/include/IrcCore/IrcGlobal delete mode 100644 libcommuni/include/IrcCore/IrcMessage delete mode 100644 libcommuni/include/IrcCore/IrcMessageFilter delete mode 100644 libcommuni/include/IrcCore/IrcNetwork delete mode 100644 libcommuni/include/IrcCore/IrcProtocol delete mode 100644 libcommuni/include/IrcCore/irc.h delete mode 100644 libcommuni/include/IrcCore/irccommand.h delete mode 100644 libcommuni/include/IrcCore/irccommandfilter.h delete mode 100644 libcommuni/include/IrcCore/ircconnection.h delete mode 100644 libcommuni/include/IrcCore/ircconnection_p.h delete mode 100644 libcommuni/include/IrcCore/irccore.h delete mode 100644 libcommuni/include/IrcCore/ircfilter.h delete mode 100644 libcommuni/include/IrcCore/ircglobal.h delete mode 100644 libcommuni/include/IrcCore/ircmessage.h delete mode 100644 libcommuni/include/IrcCore/ircmessage_p.h delete mode 100644 libcommuni/include/IrcCore/ircmessagebuilder_p.h delete mode 100644 libcommuni/include/IrcCore/ircmessagedecoder_p.h delete mode 100644 libcommuni/include/IrcCore/ircmessagefilter.h delete mode 100644 libcommuni/include/IrcCore/ircnetwork.h delete mode 100644 libcommuni/include/IrcCore/ircnetwork_p.h delete mode 100644 libcommuni/include/IrcCore/ircprotocol.h delete mode 100644 libcommuni/include/IrcModel/IrcBuffer delete mode 100644 libcommuni/include/IrcModel/IrcBufferModel delete mode 100644 libcommuni/include/IrcModel/IrcChannel delete mode 100644 libcommuni/include/IrcModel/IrcModel delete mode 100644 libcommuni/include/IrcModel/IrcUser delete mode 100644 libcommuni/include/IrcModel/IrcUserModel delete mode 100644 libcommuni/include/IrcModel/ircbuffer.h delete mode 100644 libcommuni/include/IrcModel/ircbuffer_p.h delete mode 100644 libcommuni/include/IrcModel/ircbuffermodel.h delete mode 100644 libcommuni/include/IrcModel/ircbuffermodel_p.h delete mode 100644 libcommuni/include/IrcModel/ircchannel.h delete mode 100644 libcommuni/include/IrcModel/ircchannel_p.h delete mode 100644 libcommuni/include/IrcModel/ircmodel.h delete mode 100644 libcommuni/include/IrcModel/ircuser.h delete mode 100644 libcommuni/include/IrcModel/ircuser_p.h delete mode 100644 libcommuni/include/IrcModel/ircusermodel.h delete mode 100644 libcommuni/include/IrcModel/ircusermodel_p.h delete mode 100644 libcommuni/include/IrcUtil/IrcCommandParser delete mode 100644 libcommuni/include/IrcUtil/IrcCompleter delete mode 100644 libcommuni/include/IrcUtil/IrcLagTimer delete mode 100644 libcommuni/include/IrcUtil/IrcPalette delete mode 100644 libcommuni/include/IrcUtil/IrcTextFormat delete mode 100644 libcommuni/include/IrcUtil/IrcUtil delete mode 100644 libcommuni/include/IrcUtil/irccommandparser.h delete mode 100644 libcommuni/include/IrcUtil/irccommandparser_p.h delete mode 100644 libcommuni/include/IrcUtil/irccompleter.h delete mode 100644 libcommuni/include/IrcUtil/irclagtimer.h delete mode 100644 libcommuni/include/IrcUtil/irclagtimer_p.h delete mode 100644 libcommuni/include/IrcUtil/ircpalette.h delete mode 100644 libcommuni/include/IrcUtil/irctextformat.h delete mode 100644 libcommuni/include/IrcUtil/irctoken_p.h delete mode 100644 libcommuni/include/IrcUtil/ircutil.h delete mode 100644 libcommuni/libcommuni.pro delete mode 100644 libcommuni/src/3rdparty/icu/icu.pri delete mode 100644 libcommuni/src/3rdparty/mozilla/mozilla.pri delete mode 100644 libcommuni/src/3rdparty/mozilla/rdf_utils.c delete mode 100644 libcommuni/src/3rdparty/pkg.pri delete mode 100644 libcommuni/src/3rdparty/qblowfish/LICENSE delete mode 100644 libcommuni/src/3rdparty/qblowfish/README.md delete mode 100644 libcommuni/src/3rdparty/qblowfish/qblowfish.cpp delete mode 100644 libcommuni/src/3rdparty/qblowfish/qblowfish.h delete mode 100644 libcommuni/src/3rdparty/qblowfish/qblowfish.pri delete mode 100644 libcommuni/src/3rdparty/qblowfish/qblowfish_p.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/CMakeLists.txt delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/COPYING delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/doc/uchardet.1 delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/script/debug.sh delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/script/release.sh delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/script/win32.sh delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/JISFreq.tab delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/LangBulgarianModel.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/LangCyrillicModel.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHebrewModel.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHungarianModel.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCodingStateMachine.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/nscore.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/prmem.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/symbols.cmake delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/CMakeLists.txt delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.cpp delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.h delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/test/big5.txt delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/test/gb18030.txt delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/test/shift_jis.txt delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/test/utf8.txt delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pc.in delete mode 100644 libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pri delete mode 100644 libcommuni/src/core/core.pri delete mode 100644 libcommuni/src/core/core.pro delete mode 100644 libcommuni/src/core/irc.cpp delete mode 100644 libcommuni/src/core/irccommand.cpp delete mode 100644 libcommuni/src/core/ircconnection.cpp delete mode 100644 libcommuni/src/core/irccore.cpp delete mode 100644 libcommuni/src/core/ircfilter.cpp delete mode 100644 libcommuni/src/core/ircmessage.cpp delete mode 100644 libcommuni/src/core/ircmessage_p.cpp delete mode 100644 libcommuni/src/core/ircmessagebuilder.cpp delete mode 100644 libcommuni/src/core/ircmessagedecoder.cpp delete mode 100644 libcommuni/src/core/ircmessagedecoder_icu.cpp delete mode 100644 libcommuni/src/core/ircmessagedecoder_uchardet.cpp delete mode 100644 libcommuni/src/core/ircnetwork.cpp delete mode 100644 libcommuni/src/core/ircprotocol.cpp delete mode 100644 libcommuni/src/imports/imports.pri delete mode 100644 libcommuni/src/imports/imports.pro delete mode 100644 libcommuni/src/imports/qml1/plugin.cpp delete mode 100644 libcommuni/src/imports/qml1/plugins.qmltypes delete mode 100644 libcommuni/src/imports/qml1/qml1.pro delete mode 100644 libcommuni/src/imports/qml1/qmldir delete mode 100644 libcommuni/src/imports/qml2/plugin.cpp delete mode 100644 libcommuni/src/imports/qml2/plugins.qmltypes delete mode 100644 libcommuni/src/imports/qml2/qml2.pro delete mode 100644 libcommuni/src/imports/qml2/qmldir delete mode 100644 libcommuni/src/model/ircbuffer.cpp delete mode 100644 libcommuni/src/model/ircbuffermodel.cpp delete mode 100644 libcommuni/src/model/ircchannel.cpp delete mode 100644 libcommuni/src/model/ircmodel.cpp delete mode 100644 libcommuni/src/model/ircuser.cpp delete mode 100644 libcommuni/src/model/ircusermodel.cpp delete mode 100644 libcommuni/src/model/model.pri delete mode 100644 libcommuni/src/model/model.pro delete mode 100644 libcommuni/src/module_build.pri delete mode 100644 libcommuni/src/module_deps.pri delete mode 100644 libcommuni/src/module_install.pri delete mode 100644 libcommuni/src/src.pri delete mode 100644 libcommuni/src/src.pro delete mode 100644 libcommuni/src/util/irccommandparser.cpp delete mode 100644 libcommuni/src/util/irccompleter.cpp delete mode 100644 libcommuni/src/util/irclagtimer.cpp delete mode 100644 libcommuni/src/util/ircpalette.cpp delete mode 100644 libcommuni/src/util/irctextformat.cpp delete mode 100644 libcommuni/src/util/irctoken.cpp delete mode 100644 libcommuni/src/util/ircutil.cpp delete mode 100644 libcommuni/src/util/util.pri delete mode 100644 libcommuni/src/util/util.pro delete mode 100644 libcommuni/tests/auto/auto.pri delete mode 100644 libcommuni/tests/auto/auto.pro delete mode 100644 libcommuni/tests/auto/irc/irc.pro delete mode 100644 libcommuni/tests/auto/irc/tst_irc.cpp delete mode 100644 libcommuni/tests/auto/ircbuffer/ircbuffer.pro delete mode 100644 libcommuni/tests/auto/ircbuffer/tst_ircbuffer.cpp delete mode 100644 libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro delete mode 100644 libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp delete mode 100644 libcommuni/tests/auto/ircchannel/ircchannel.pro delete mode 100644 libcommuni/tests/auto/ircchannel/tst_ircchannel.cpp delete mode 100644 libcommuni/tests/auto/irccommand/irccommand.pro delete mode 100644 libcommuni/tests/auto/irccommand/tst_irccommand.cpp delete mode 100644 libcommuni/tests/auto/irccommandparser/irccommandparser.pro delete mode 100644 libcommuni/tests/auto/irccommandparser/tst_irccommandparser.cpp delete mode 100644 libcommuni/tests/auto/irccompleter/irccompleter.pro delete mode 100644 libcommuni/tests/auto/irccompleter/tst_irccompleter.cpp delete mode 100644 libcommuni/tests/auto/ircconnection/ircconnection.pro delete mode 100644 libcommuni/tests/auto/ircconnection/tst_ircconnection.cpp delete mode 100644 libcommuni/tests/auto/irclagtimer/irclagtimer.pro delete mode 100644 libcommuni/tests/auto/irclagtimer/tst_irclagtimer.cpp delete mode 100644 libcommuni/tests/auto/ircmessage/ircmessage.pro delete mode 100644 libcommuni/tests/auto/ircmessage/tst_ircmessage.cpp delete mode 100644 libcommuni/tests/auto/ircnetwork/ircnetwork.pro delete mode 100644 libcommuni/tests/auto/ircnetwork/tst_ircnetwork.cpp delete mode 100644 libcommuni/tests/auto/ircpalette/ircpalette.pro delete mode 100644 libcommuni/tests/auto/ircpalette/tst_ircpalette.cpp delete mode 100644 libcommuni/tests/auto/irctextformat/irctextformat.pro delete mode 100644 libcommuni/tests/auto/irctextformat/tst_irctextformat.cpp delete mode 100644 libcommuni/tests/auto/ircuser/ircuser.pro delete mode 100644 libcommuni/tests/auto/ircuser/tst_ircuser.cpp delete mode 100644 libcommuni/tests/auto/ircusermodel/ircusermodel.pro delete mode 100644 libcommuni/tests/auto/ircusermodel/tst_ircusermodel.cpp delete mode 100644 libcommuni/tests/auto/shared/shared.pri delete mode 100644 libcommuni/tests/auto/shared/tst_euirc.h delete mode 100644 libcommuni/tests/auto/shared/tst_freenode.h delete mode 100644 libcommuni/tests/auto/shared/tst_ircclientserver.cpp delete mode 100644 libcommuni/tests/auto/shared/tst_ircclientserver.h delete mode 100644 libcommuni/tests/auto/shared/tst_ircdata.cpp delete mode 100644 libcommuni/tests/auto/shared/tst_ircdata.h delete mode 100644 libcommuni/tests/auto/shared/tst_ircnet.h delete mode 100644 libcommuni/tests/benchmarks/benchmarks.pri delete mode 100644 libcommuni/tests/benchmarks/benchmarks.pro delete mode 100644 libcommuni/tests/benchmarks/ircmessage/ircmessage.pro delete mode 100644 libcommuni/tests/benchmarks/ircmessage/tst_ircmessage.cpp delete mode 100644 libcommuni/tests/benchmarks/ircmessagedecoder/ircmessagedecoder.pro delete mode 100644 libcommuni/tests/benchmarks/ircmessagedecoder/tst_ircmessagedecoder.cpp delete mode 100644 libcommuni/tests/benchmarks/irctextformat/irctextformat.pro delete mode 100644 libcommuni/tests/benchmarks/irctextformat/tst_irctextformat.cpp delete mode 100644 libcommuni/tests/build/build.pro delete mode 100644 libcommuni/tests/build/embed/embed.pro delete mode 100644 libcommuni/tests/build/embed/main.cpp delete mode 100644 libcommuni/tests/build/install/install.pro delete mode 100644 libcommuni/tests/build/install/main.cpp delete mode 100644 libcommuni/tests/build/namespace/main.cpp delete mode 100644 libcommuni/tests/build/namespace/namespace.pro delete mode 100644 libcommuni/tests/tests.pri delete mode 100644 libcommuni/tests/tests.pro delete mode 100644 libcommuni/version.pri delete mode 100644 main.cpp delete mode 100755 reload-CRSM create mode 100644 src/ClientInfo.hpp create mode 100644 src/CmdFunctionRef.hpp create mode 100644 src/CrServerManager.pro create mode 100644 src/ProcessManager.cpp create mode 100644 src/ProcessManager.hpp create mode 100644 src/crsm.cpp create mode 100644 src/crsm.hpp create mode 100644 src/libcommuni/.gitignore create mode 100644 src/libcommuni/.travis.yml create mode 100644 src/libcommuni/AUTHORS create mode 100644 src/libcommuni/CHANGELOG create mode 100644 src/libcommuni/Doxyfile create mode 100644 src/libcommuni/INSTALL create mode 100644 src/libcommuni/LICENSE create mode 100644 src/libcommuni/README create mode 100755 src/libcommuni/configure create mode 100644 src/libcommuni/doc/bot.dox create mode 100644 src/libcommuni/doc/bot.png create mode 100644 src/libcommuni/doc/client.dox create mode 100644 src/libcommuni/doc/client.png create mode 100644 src/libcommuni/doc/communi.png create mode 100644 src/libcommuni/doc/debugging.dox create mode 100644 src/libcommuni/doc/doc.pri create mode 100644 src/libcommuni/doc/enums.dox create mode 100644 src/libcommuni/doc/header.html create mode 100644 src/libcommuni/doc/mainpage.dox create mode 100644 src/libcommuni/doc/minimal.dox create mode 100644 src/libcommuni/doc/modules.dox create mode 100644 src/libcommuni/doc/qml.dox create mode 100644 src/libcommuni/doc/qmlbot.dox create mode 100644 src/libcommuni/doc/qmlbot.png create mode 100644 src/libcommuni/doc/quick.dox create mode 100644 src/libcommuni/doc/quick.png create mode 100644 src/libcommuni/doc/usage.dox create mode 100644 src/libcommuni/examples/bot/bot.pro create mode 100644 src/libcommuni/examples/bot/ircbot.cpp create mode 100644 src/libcommuni/examples/bot/ircbot.h create mode 100644 src/libcommuni/examples/bot/main.cpp create mode 100644 src/libcommuni/examples/client/client.pro create mode 100644 src/libcommuni/examples/client/ircclient.cpp create mode 100644 src/libcommuni/examples/client/ircclient.h create mode 100644 src/libcommuni/examples/client/ircmessageformatter.cpp create mode 100644 src/libcommuni/examples/client/ircmessageformatter.h create mode 100644 src/libcommuni/examples/client/main.cpp create mode 100644 src/libcommuni/examples/examples.pri create mode 100644 src/libcommuni/examples/examples.pro create mode 100644 src/libcommuni/examples/minimal/main.cpp create mode 100644 src/libcommuni/examples/minimal/minimal.pro create mode 100644 src/libcommuni/examples/qmlbot/main.cpp create mode 100644 src/libcommuni/examples/qmlbot/qml/main.qml create mode 100644 src/libcommuni/examples/qmlbot/qmlbot.pro create mode 100644 src/libcommuni/examples/qmlbot/qmlbot.qrc create mode 100644 src/libcommuni/examples/quick/main.cpp create mode 100644 src/libcommuni/examples/quick/qml/BufferListView.qml create mode 100644 src/libcommuni/examples/quick/qml/ChatPage.qml create mode 100644 src/libcommuni/examples/quick/qml/ConnectPage.qml create mode 100644 src/libcommuni/examples/quick/qml/MessageFormatter.qml create mode 100644 src/libcommuni/examples/quick/qml/TextBrowser.qml create mode 100644 src/libcommuni/examples/quick/qml/TextEntry.qml create mode 100644 src/libcommuni/examples/quick/qml/TopicLabel.qml create mode 100644 src/libcommuni/examples/quick/qml/UserListView.qml create mode 100644 src/libcommuni/examples/quick/qml/main.qml create mode 100644 src/libcommuni/examples/quick/quick.pro create mode 100644 src/libcommuni/examples/quick/quick.qrc create mode 100644 src/libcommuni/features/communi.prf create mode 100644 src/libcommuni/include/IrcCore/Irc create mode 100644 src/libcommuni/include/IrcCore/IrcCommand create mode 100644 src/libcommuni/include/IrcCore/IrcCommandFilter create mode 100644 src/libcommuni/include/IrcCore/IrcConnection create mode 100644 src/libcommuni/include/IrcCore/IrcCore create mode 100644 src/libcommuni/include/IrcCore/IrcFilter create mode 100644 src/libcommuni/include/IrcCore/IrcGlobal create mode 100644 src/libcommuni/include/IrcCore/IrcMessage create mode 100644 src/libcommuni/include/IrcCore/IrcMessageFilter create mode 100644 src/libcommuni/include/IrcCore/IrcNetwork create mode 100644 src/libcommuni/include/IrcCore/IrcProtocol create mode 100644 src/libcommuni/include/IrcCore/irc.h create mode 100644 src/libcommuni/include/IrcCore/irccommand.h create mode 100644 src/libcommuni/include/IrcCore/irccommandfilter.h create mode 100644 src/libcommuni/include/IrcCore/ircconnection.h create mode 100644 src/libcommuni/include/IrcCore/ircconnection_p.h create mode 100644 src/libcommuni/include/IrcCore/irccore.h create mode 100644 src/libcommuni/include/IrcCore/ircfilter.h create mode 100644 src/libcommuni/include/IrcCore/ircglobal.h create mode 100644 src/libcommuni/include/IrcCore/ircmessage.h create mode 100644 src/libcommuni/include/IrcCore/ircmessage_p.h create mode 100644 src/libcommuni/include/IrcCore/ircmessagebuilder_p.h create mode 100644 src/libcommuni/include/IrcCore/ircmessagedecoder_p.h create mode 100644 src/libcommuni/include/IrcCore/ircmessagefilter.h create mode 100644 src/libcommuni/include/IrcCore/ircnetwork.h create mode 100644 src/libcommuni/include/IrcCore/ircnetwork_p.h create mode 100644 src/libcommuni/include/IrcCore/ircprotocol.h create mode 100644 src/libcommuni/include/IrcModel/IrcBuffer create mode 100644 src/libcommuni/include/IrcModel/IrcBufferModel create mode 100644 src/libcommuni/include/IrcModel/IrcChannel create mode 100644 src/libcommuni/include/IrcModel/IrcModel create mode 100644 src/libcommuni/include/IrcModel/IrcUser create mode 100644 src/libcommuni/include/IrcModel/IrcUserModel create mode 100644 src/libcommuni/include/IrcModel/ircbuffer.h create mode 100644 src/libcommuni/include/IrcModel/ircbuffer_p.h create mode 100644 src/libcommuni/include/IrcModel/ircbuffermodel.h create mode 100644 src/libcommuni/include/IrcModel/ircbuffermodel_p.h create mode 100644 src/libcommuni/include/IrcModel/ircchannel.h create mode 100644 src/libcommuni/include/IrcModel/ircchannel_p.h create mode 100644 src/libcommuni/include/IrcModel/ircmodel.h create mode 100644 src/libcommuni/include/IrcModel/ircuser.h create mode 100644 src/libcommuni/include/IrcModel/ircuser_p.h create mode 100644 src/libcommuni/include/IrcModel/ircusermodel.h create mode 100644 src/libcommuni/include/IrcModel/ircusermodel_p.h create mode 100644 src/libcommuni/include/IrcUtil/IrcCommandParser create mode 100644 src/libcommuni/include/IrcUtil/IrcCompleter create mode 100644 src/libcommuni/include/IrcUtil/IrcLagTimer create mode 100644 src/libcommuni/include/IrcUtil/IrcPalette create mode 100644 src/libcommuni/include/IrcUtil/IrcTextFormat create mode 100644 src/libcommuni/include/IrcUtil/IrcUtil create mode 100644 src/libcommuni/include/IrcUtil/irccommandparser.h create mode 100644 src/libcommuni/include/IrcUtil/irccommandparser_p.h create mode 100644 src/libcommuni/include/IrcUtil/irccompleter.h create mode 100644 src/libcommuni/include/IrcUtil/irclagtimer.h create mode 100644 src/libcommuni/include/IrcUtil/irclagtimer_p.h create mode 100644 src/libcommuni/include/IrcUtil/ircpalette.h create mode 100644 src/libcommuni/include/IrcUtil/irctextformat.h create mode 100644 src/libcommuni/include/IrcUtil/irctoken_p.h create mode 100644 src/libcommuni/include/IrcUtil/ircutil.h create mode 100644 src/libcommuni/libcommuni.pro create mode 100644 src/libcommuni/src/3rdparty/icu/icu.pri create mode 100644 src/libcommuni/src/3rdparty/mozilla/mozilla.pri create mode 100644 src/libcommuni/src/3rdparty/mozilla/rdf_utils.c create mode 100644 src/libcommuni/src/3rdparty/pkg.pri create mode 100644 src/libcommuni/src/3rdparty/qblowfish/LICENSE create mode 100644 src/libcommuni/src/3rdparty/qblowfish/README.md create mode 100644 src/libcommuni/src/3rdparty/qblowfish/qblowfish.cpp create mode 100644 src/libcommuni/src/3rdparty/qblowfish/qblowfish.h create mode 100644 src/libcommuni/src/3rdparty/qblowfish/qblowfish.pri create mode 100644 src/libcommuni/src/3rdparty/qblowfish/qblowfish_p.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/CMakeLists.txt create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/COPYING create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/doc/uchardet.1 create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/script/debug.sh create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/script/release.sh create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/script/win32.sh create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JISFreq.tab create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangBulgarianModel.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangCyrillicModel.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHebrewModel.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHungarianModel.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCodingStateMachine.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nscore.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/prmem.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/symbols.cmake create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/CMakeLists.txt create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.cpp create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.h create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/test/big5.txt create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/test/gb18030.txt create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/test/shift_jis.txt create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/test/utf8.txt create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pc.in create mode 100644 src/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pri create mode 100644 src/libcommuni/src/core/core.pri create mode 100644 src/libcommuni/src/core/core.pro create mode 100644 src/libcommuni/src/core/irc.cpp create mode 100644 src/libcommuni/src/core/irccommand.cpp create mode 100644 src/libcommuni/src/core/ircconnection.cpp create mode 100644 src/libcommuni/src/core/irccore.cpp create mode 100644 src/libcommuni/src/core/ircfilter.cpp create mode 100644 src/libcommuni/src/core/ircmessage.cpp create mode 100644 src/libcommuni/src/core/ircmessage_p.cpp create mode 100644 src/libcommuni/src/core/ircmessagebuilder.cpp create mode 100644 src/libcommuni/src/core/ircmessagedecoder.cpp create mode 100644 src/libcommuni/src/core/ircmessagedecoder_icu.cpp create mode 100644 src/libcommuni/src/core/ircmessagedecoder_uchardet.cpp create mode 100644 src/libcommuni/src/core/ircnetwork.cpp create mode 100644 src/libcommuni/src/core/ircprotocol.cpp create mode 100644 src/libcommuni/src/imports/imports.pri create mode 100644 src/libcommuni/src/imports/imports.pro create mode 100644 src/libcommuni/src/imports/qml1/plugin.cpp create mode 100644 src/libcommuni/src/imports/qml1/plugins.qmltypes create mode 100644 src/libcommuni/src/imports/qml1/qml1.pro create mode 100644 src/libcommuni/src/imports/qml1/qmldir create mode 100644 src/libcommuni/src/imports/qml2/plugin.cpp create mode 100644 src/libcommuni/src/imports/qml2/plugins.qmltypes create mode 100644 src/libcommuni/src/imports/qml2/qml2.pro create mode 100644 src/libcommuni/src/imports/qml2/qmldir create mode 100644 src/libcommuni/src/model/ircbuffer.cpp create mode 100644 src/libcommuni/src/model/ircbuffermodel.cpp create mode 100644 src/libcommuni/src/model/ircchannel.cpp create mode 100644 src/libcommuni/src/model/ircmodel.cpp create mode 100644 src/libcommuni/src/model/ircuser.cpp create mode 100644 src/libcommuni/src/model/ircusermodel.cpp create mode 100644 src/libcommuni/src/model/model.pri create mode 100644 src/libcommuni/src/model/model.pro create mode 100644 src/libcommuni/src/module_build.pri create mode 100644 src/libcommuni/src/module_deps.pri create mode 100644 src/libcommuni/src/module_install.pri create mode 100644 src/libcommuni/src/src.pri create mode 100644 src/libcommuni/src/src.pro create mode 100644 src/libcommuni/src/util/irccommandparser.cpp create mode 100644 src/libcommuni/src/util/irccompleter.cpp create mode 100644 src/libcommuni/src/util/irclagtimer.cpp create mode 100644 src/libcommuni/src/util/ircpalette.cpp create mode 100644 src/libcommuni/src/util/irctextformat.cpp create mode 100644 src/libcommuni/src/util/irctoken.cpp create mode 100644 src/libcommuni/src/util/ircutil.cpp create mode 100644 src/libcommuni/src/util/util.pri create mode 100644 src/libcommuni/src/util/util.pro create mode 100644 src/libcommuni/tests/auto/auto.pri create mode 100644 src/libcommuni/tests/auto/auto.pro create mode 100644 src/libcommuni/tests/auto/irc/irc.pro create mode 100644 src/libcommuni/tests/auto/irc/tst_irc.cpp create mode 100644 src/libcommuni/tests/auto/ircbuffer/ircbuffer.pro create mode 100644 src/libcommuni/tests/auto/ircbuffer/tst_ircbuffer.cpp create mode 100644 src/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro create mode 100644 src/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp create mode 100644 src/libcommuni/tests/auto/ircchannel/ircchannel.pro create mode 100644 src/libcommuni/tests/auto/ircchannel/tst_ircchannel.cpp create mode 100644 src/libcommuni/tests/auto/irccommand/irccommand.pro create mode 100644 src/libcommuni/tests/auto/irccommand/tst_irccommand.cpp create mode 100644 src/libcommuni/tests/auto/irccommandparser/irccommandparser.pro create mode 100644 src/libcommuni/tests/auto/irccommandparser/tst_irccommandparser.cpp create mode 100644 src/libcommuni/tests/auto/irccompleter/irccompleter.pro create mode 100644 src/libcommuni/tests/auto/irccompleter/tst_irccompleter.cpp create mode 100644 src/libcommuni/tests/auto/ircconnection/ircconnection.pro create mode 100644 src/libcommuni/tests/auto/ircconnection/tst_ircconnection.cpp create mode 100644 src/libcommuni/tests/auto/irclagtimer/irclagtimer.pro create mode 100644 src/libcommuni/tests/auto/irclagtimer/tst_irclagtimer.cpp create mode 100644 src/libcommuni/tests/auto/ircmessage/ircmessage.pro create mode 100644 src/libcommuni/tests/auto/ircmessage/tst_ircmessage.cpp create mode 100644 src/libcommuni/tests/auto/ircnetwork/ircnetwork.pro create mode 100644 src/libcommuni/tests/auto/ircnetwork/tst_ircnetwork.cpp create mode 100644 src/libcommuni/tests/auto/ircpalette/ircpalette.pro create mode 100644 src/libcommuni/tests/auto/ircpalette/tst_ircpalette.cpp create mode 100644 src/libcommuni/tests/auto/irctextformat/irctextformat.pro create mode 100644 src/libcommuni/tests/auto/irctextformat/tst_irctextformat.cpp create mode 100644 src/libcommuni/tests/auto/ircuser/ircuser.pro create mode 100644 src/libcommuni/tests/auto/ircuser/tst_ircuser.cpp create mode 100644 src/libcommuni/tests/auto/ircusermodel/ircusermodel.pro create mode 100644 src/libcommuni/tests/auto/ircusermodel/tst_ircusermodel.cpp create mode 100644 src/libcommuni/tests/auto/shared/shared.pri create mode 100644 src/libcommuni/tests/auto/shared/tst_euirc.h create mode 100644 src/libcommuni/tests/auto/shared/tst_freenode.h create mode 100644 src/libcommuni/tests/auto/shared/tst_ircclientserver.cpp create mode 100644 src/libcommuni/tests/auto/shared/tst_ircclientserver.h create mode 100644 src/libcommuni/tests/auto/shared/tst_ircdata.cpp create mode 100644 src/libcommuni/tests/auto/shared/tst_ircdata.h create mode 100644 src/libcommuni/tests/auto/shared/tst_ircnet.h create mode 100644 src/libcommuni/tests/benchmarks/benchmarks.pri create mode 100644 src/libcommuni/tests/benchmarks/benchmarks.pro create mode 100644 src/libcommuni/tests/benchmarks/ircmessage/ircmessage.pro create mode 100644 src/libcommuni/tests/benchmarks/ircmessage/tst_ircmessage.cpp create mode 100644 src/libcommuni/tests/benchmarks/ircmessagedecoder/ircmessagedecoder.pro create mode 100644 src/libcommuni/tests/benchmarks/ircmessagedecoder/tst_ircmessagedecoder.cpp create mode 100644 src/libcommuni/tests/benchmarks/irctextformat/irctextformat.pro create mode 100644 src/libcommuni/tests/benchmarks/irctextformat/tst_irctextformat.cpp create mode 100644 src/libcommuni/tests/build/build.pro create mode 100644 src/libcommuni/tests/build/embed/embed.pro create mode 100644 src/libcommuni/tests/build/embed/main.cpp create mode 100644 src/libcommuni/tests/build/install/install.pro create mode 100644 src/libcommuni/tests/build/install/main.cpp create mode 100644 src/libcommuni/tests/build/namespace/main.cpp create mode 100644 src/libcommuni/tests/build/namespace/namespace.pro create mode 100644 src/libcommuni/tests/tests.pri create mode 100644 src/libcommuni/tests/tests.pro create mode 100644 src/libcommuni/version.pri create mode 100644 src/main.cpp delete mode 100755 stop-CRSM create mode 100644 systemd-service/CRSM.service create mode 100755 systemd-service/reload-CRSM create mode 100755 systemd-service/stop-CRSM diff --git a/CRSM.service b/CRSM.service deleted file mode 100644 index 882bd3d..0000000 --- a/CRSM.service +++ /dev/null @@ -1,17 +0,0 @@ -[Unit] -Description=A Server Manager for Clonk Rage -After=network.target - -[Service] -User=clonk -Group=clonk -WorkingDirectory=/opt/clonk/ -ExecStart=/opt/clonk/CrServerManager -ExecReload=/opt/clonk/reload-CRSM -ExecStop=/opt/clonk/stop-CRSM -KillMode=process -Restart=on-abort -TimeoutStopSec=10 - -[Install] -WantedBy=multi-user.target diff --git a/ClientInfo.hpp b/ClientInfo.hpp deleted file mode 100644 index 8099b59..0000000 --- a/ClientInfo.hpp +++ /dev/null @@ -1,112 +0,0 @@ -#pragma once - -#include -#include - -enum ClientInterface { - Auto = 0, - Clonk = 1, - IRC = 1 << 1, - Management = 1 << 2 -}; - - -class ManagementConnection { -public: - ManagementConnection() {} - ManagementConnection(QTcpSocket* socket, const QString& name = "") : socket(socket), name(name) {} - - QTcpSocket* socket = 0; - QString name = ""; -}; - -class ClientInfo -{ - -public: - ClientInterface interface = Clonk; - QString nick = ""; - - int CUID = 0; - QString pcName = ""; - bool activated = false; - - QList antiFloodList; - - QString target = ""; - ManagementConnection management; - - - static inline ClientInfo ircClient(QString nick, QString target = "") - { - ClientInfo ret; - ret.interface = IRC; - ret.nick = nick; - if(target.isEmpty()) - { - target = nick; - } - ret.target = target; - return ret; - } - - static inline ClientInfo clonkClient(QString nick, QString pcName, int CUID, bool activated = false) - { - ClientInfo ret; - ret.interface = Clonk; - ret.nick = nick; - ret.pcName = pcName; - ret.CUID = CUID; - ret.activated = activated; - return ret; - } - - static inline ClientInfo managementClient(ManagementConnection conn) - { - ClientInfo ret; - ret.interface = Management; - ret.management = conn; - ret.nick = conn.name; - return ret; - } - - static inline ClientInfo autoClient() - { - ClientInfo ret; - ret.interface = Auto; - return ret; - } - - inline bool operator==(const ClientInfo& other) const - { - return other.interface == interface && other.nick == nick && (interface == Clonk ? other.pcName == pcName && other.CUID == CUID : true); - } - - inline bool operator!=(const ClientInfo& other) const - { - return !operator==(other); - } - - inline bool operator<(const ClientInfo& other) const - { - return toString() < other.toString(); - } - - inline QString toString() const - { - return interface == Auto ? "~auto~" : interface == Management ? management.name + " {CLI}" : (!nick.isEmpty() ? nick + (interface == Clonk ? " (" + pcName + ")" : " [IRC]") : ""); - } - - inline bool floodCheck(int maxCount, int floodTimeSecs, QDateTime newDateTime = QDateTime::currentDateTime()) - { - foreach(const QDateTime& dateTime, antiFloodList) - { - if(dateTime.secsTo(newDateTime) > floodTimeSecs) - { - antiFloodList.removeAll(dateTime); - } - } - antiFloodList.push_back(newDateTime); - return antiFloodList.size() > maxCount; - } -}; diff --git a/CmdFunctionRef.hpp b/CmdFunctionRef.hpp deleted file mode 100644 index f862823..0000000 --- a/CmdFunctionRef.hpp +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include -#include -#include - -class CRSM; - -#define CMD_FUNCTION(name) void name(const QString& cmd, const QString& args, const ClientInfo& client, UserType userType) -#define CMD_FUNCTION_IMPL(name) void CRSM::name(const QString& cmd, const QString& args, const ClientInfo& client, UserType userType) { (void)cmd; (void)args; (void)client; (void)userType; - -enum UserType { - User = 0, - Admin = 1, - Moderator = 2, - Max = Moderator -}; - -typedef void (CRSM::*CmdFunction)(const QString&, const QString&, const ClientInfo&, UserType); - -const QMap userTypeStrings { - {User, "Benutzer"}, - {Admin, "Rundenadmin oder Moderator"}, - {Moderator, "Moderator"} -}; - -struct CmdFunctionRef -{ - CmdFunction func = nullptr; - int interfaces = Clonk | IRC; - UserType userType = User; - QString shortDescription = ""; - QString longDescription = ""; - QString name = ""; - QString argList = ""; - - CmdFunctionRef(QString name, CmdFunction func, int interfaces, UserType userType, const QString& shortDescription = "", QString argList = "", const QString &longDescription = "") : func(func), interfaces(interfaces), userType(userType), shortDescription(shortDescription), longDescription(longDescription), name(name), argList(argList) - { - - } - - CmdFunctionRef() - { - - } -}; diff --git a/CrServerManager.conf b/CrServerManager.conf deleted file mode 100644 index fc41cf7..0000000 --- a/CrServerManager.conf +++ /dev/null @@ -1,44 +0,0 @@ -AntiFloodCount = 5 -AntiFloodTime = 3 -Arguments = /fullscreen /lobby:300 /signup /noruntimejoin /record Objects.c4d -AutoHost = true -ClonkConfig = config -ClonkDirectory = /opt/clonk/ -EmptyTimer = 60 -IrcChannel = #clonk-tod -IrcIngameChannel = #clonk-tod-ingame -IrcNick = TodsServer -IrcPassword = ein_ganz_tolles_passwort -IrcQuitMessage = Heute ist nicht alle Tage. Ich komm wieder, keine Frage... -IrcRealName = Tod's dedizierter Clonk-Server -IrcReconnectDelay = 10 -IrcScenListMessage = Eine Szenarioliste ist unter http://link.zur/onlineliste einsehbar, sowie in der Lobby oder einem laufenden Spiel per !list Befehl. -IrcServer = irc.rbx.fr.euirc.net -IrcUseIngameChat = true -ManagementPort = 9372 -MaxScenWishes = 2 -MaxUserWishes = 2 -RandomizeAutoHosting = true -RegainAdminTime = 120 -ServerExecutable = /opt/clonk/clonk-server -ServerNick = [DER]Server -ServerPCName = [DER]Server -UseIrc = true -UserListLength = 5 - -IgnoreFolders += scenarios -IgnoreFolders += Network -IgnoreFolders += Records.c4f -IgnoreFolders += Savegames.c4f -IrcModerators += DerTod -IrcModerators += EinTollerIrcMod -Moderators += DerTod's CUID -Moderators += eine andere tolle CUID - -Alias[Abwärts] = Other/AbwaertsOlympia.c4s -Alias[Adept] = Other/Z4Adept.c4s -Alias[BT] = ModernCombat.c4f/CMC_BlackThunder.c4s -Alias[Blackfield] = MagicLeagueExtra.c4f/Blackfield_Tournament.c4s -Alias[Blobby] = Other/BlobbyVolley.c4s -Alias[ein anderer toller Alias] = Ein toller Rundenordner.c4f/Ein tolles Szenario für diesen Alias.c4s - diff --git a/CrServerManager.conf.README b/CrServerManager.conf.README deleted file mode 100644 index 34a36be..0000000 --- a/CrServerManager.conf.README +++ /dev/null @@ -1,74 +0,0 @@ -Als Beispiel ist die Konfiguration von "[DER]Server" unter dem Namen "CrServerManager.conf" beigelegt. -Sie kann als Ausgangskonfiguration verwendet werden. -Sie kann aber nicht wie angegeben direkt verwendet werden. -Alternativ kann der ServerManager ohne existierende Config-Datei gestartet werden, damit dieser eine erstellt. - -Die Konfigurationsdatei für den CrServerManager muss "CrServerManager.conf" heißen und sollte wie folgt aufgebaut sein: - -Normale Parameter haben die Form: - Parametername = belibiege Zeichenkette gehend bis zum Ende der Zeile. - -Listen haben die Form: - Listenname += Listeneintrag - -Maps haben die Form: - Mapname[Key] = Value - -Werden die Operatoren für Liste und normalen Parameter vertauscht, werden diese nicht richtig verwendet! - -Damit alles funktioniert müssen gewisse Parameter die entsprechende Form aufweisen (in Klammer angegeben): - o Boolean - Parameter muss entweder true oder false sein! - o Integer - Parameter muss eine ganze Zahl sein! - o String - Beliebige Zeichenkette - -Die Konfigurationsdatei wird vom ServerManager beim Beenden und Speichern der Einstellungen überschrieben. Dabei -werden die Einträge alphabetisch sortiert und Normale Werte, Listen und Maps durch eine Leerzeile getrennt. - -Aktuell vorhandene Konfigurationsmöglichkeiten: - o Arguments (String) - Argumente die an die Clonk-Executable übergeben werden. Am Ende wird das aktuelle Szenario automatisch angehängt. - o ClonkConfig (String) - Konfigurationsdatei für Clonk. Aus dieser Datei wird unter anderem der eigene Chat-Nick ausgelesen. der Parameter /config: wird automatisch zu den Clonk Argumenten hinzugefügt. - o ServerExecutable (String) - Pfad zur Clonk-Executable. Bitte absoluten Pfad angeben! - o UserListLength (Integer) - Maximale Länge der Szenario-Warteschlange - o Moderators (Liste aus Integer im CUID-Format) - Liste aus CUIDs der entsprechenden Moderatoren. Ein Moderator kann alles was ein Rundenadmin kann und hat Kickschutz vor Rundenadmins. - o IgnoreFolders (Liste aus Strings) - Liste aus Ordnern und .lst Dateien die nicht aufgelistet werden sollen. (Ohne .lst-Endung) - o AutoHost (Boolean) - Falls true werden Szenarios aus scenarios.lst automatisch der Reihe nach gehostet, wenn die Wunschliste leer ist. Bei false kann nur über den IRC gehostet werden. - o EmptyTimer (Integer) - Wenn der letzte Client die Lobby verlässt wird ein Countdown mit dieser Zeit gestartet, wenn der aktuelle Countdown nicht bereits darunter liegt. - o ManagementPort (Integer) - Port auf dem das Management-Interface läuft (läuft nur auf localhost). - o MaxScenWishes (Integer) - Gibt an wie oft dasselbe Szenario in der Wunschliste sein darf. - o MaxUserWishes (Integer) - Gibt an wie viele Wünsche vom gleichen Spieler in der Liste sein dürfen. - o RandomizeAutoHosting (Boolean) - Wenn true, werden die Einträge aus scenarios.lst in zufälliger Reihenfolge gehostet. - o RegainAdminTime (Integer) - Zeit die ein geleavter Rundenadmin hat, in der er nach einem Rejoin den Admin zurückerlangen kann obwohl bereits jemand anders Admin wurde. - o Alias (Map aus Strings) - Beinhaltet die Szenario-Aliase in der Form Alias[Aliasname] = Szenariodatei - -IRC-bezogen: - o UseIrc (Boolean) - Bei true wird der IRC Bot aktiviert. Ansonsten nicht. - o IrcServer (String) - Server mit dem sich der IRC Bot verbinden soll. Bitte darauf achten, dass auf dem Server Bots erlaubt sind! - o IrcNick (String) - Nickname für den Server - o IrcPassword (String) - Passwort, falls der Nick registriert ist. - o IrcRealName (String) - Angezeigter Echter Name im IRC. - o IrcChannel (String) - Channel in dem der Bot sich aufhalten soll. - o IrcIngameChannel (String) - Channel in dem die IngameChat-Verbindung stattfindet. - o IrcQuitMessage (String) - QuitMessage die der ServerManager beim ordnungsgemäßen Beenden verwenden soll. - o IrcModerators (Liste aus Strings) - Eine Liste aus IRC-Nicks die Moderatoren sind. Die Moderatorrechte werden nur aktiv wenn der Nick beim NickServ registriert ist und als authentifiziert angegeben ist. - o IrcReconnectDelay (Integer) - Delay zwischen Verbindungsabbruch und Reconnectversuch (wird an communi weitergegeben). - o IrcScenListMessage (String) - Nachricht die beim Eingabe des list-Befehls im IRC ausgegeben wird (zB ein Link zur Online-Liste). - o IrcUseIngameChat (Boolean) - Legt fest ob die IngameChat-Verbindung aktiviert ist. - -Clonkchat-bezogen: - o AntiFloodCount (Integer) - Maximale Anzahl an Nachrichten pro Zeit - o AntiFloodTime (Integer) - Zeit auf die sich die Count-Angabe bezieht. Bei Überschreitung wird der Autor der Nachrichten gekickt. - -Automatisch gesetzte Werte: - o ClonkDirectory (String) - Pfad in dem der Server mit den Spieldaten liegt (wird aus der ServerExecutable ermittelt) - o ServerNick (String) - Clonk-Chatname, der aus der Clonk-config ermittelt wird. - o ServerPCName (String) - Clonk-PC-Name, der aus der Clonk-config ermittelt wird. - o ReattachId (String) - Eine zufällige ID unter dieser der ProcessManager läuft. Sollte der ProcessManager unerwartet beendet werden (durch SIGKILL oder durch einen Systemabsturz) sollten die FIFO-Dateien mit de Namen "CRSM-Clonkserver--(ctrl(in|out)|std(in|out|err))" gelöscht werden. Zusätzlich kann der Config-Eintrag entfernt werden. Ansonsten bleibt der ServerManager beim Verbindungsversuch mit dem nicht mehr existierenden ProcessManager stehen. - -Veraltete Werte: - Readline-bezogen: - o ServerUsesReadline (Boolean) - Auf true setzen, wenn der Clonk-Server readline aktiviert hat. Dabei wird _versucht_, dass die eigenen Eingaben die durch Readline ausgegeben werden zu vermeiden. - o ReadlinePromptEnabled (Boolean) - Auf true setzen, wenn für readline eine Prompt eingestellt ist (das ist normalerweise das "> " in der Eingabezeile des dedizierten Servers) - o ReadlineRereadLimit (Integer) - Limit, wie viele Zeichen der Serverausgabe gebuffert werden und mit der Eingabe verglichen werden. (Höheres Limit -> weniger doppelt ausgegebene Eingaben, dafür schlechtere Performance) - Hintergrund: - Readline formatiert die Eingabe und gibt sie auf stdout wieder aus. Das führt dazu, dass der ServerManager seine eigenen Eingaben (die Befehle die er an Clonk sendet) lesen muss. Das führt zu teils mehrfacher Ausgabe der Befehle auf der Serverkonsole. - Mit den oben angegebenen Optionen wird diese mehrfache Ausgabe vermieden. Bei Verwendung von Sonderzeichen funktioniert das aber nicht zuverlässig. diff --git a/CrServerManager.pro b/CrServerManager.pro deleted file mode 100644 index 5323fea..0000000 --- a/CrServerManager.pro +++ /dev/null @@ -1,31 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2013-07-05T17:31:49 -# -#------------------------------------------------- - -QT += core - -QT -= gui - -TARGET = CrServerManager -CONFIG += console -CONFIG -= app_bundle - -include(libcommuni/src/core/core.pri) - -TEMPLATE = app - - -SOURCES += main.cpp \ - crsm.cpp \ - ProcessManager.cpp - -HEADERS += \ - CmdFunctionRef.hpp \ - ClientInfo.hpp \ - crsm.hpp \ - ProcessManager.hpp - -equals(QT_ARCH, "x86_64"):linux-*: DEFINES += Q_OS_LINUX64 -QMAKE_CXXFLAGS *= -std=c++11 -Wall -Wextra -Werror -Wunused diff --git a/ProcessManager.cpp b/ProcessManager.cpp deleted file mode 100644 index 6d2efe8..0000000 --- a/ProcessManager.cpp +++ /dev/null @@ -1,245 +0,0 @@ -#include "ProcessManager.hpp" - -#include -#include - -ProcessManager::ProcessManager(const QString &newPrefix, const QString &newId, bool useStdErr, QObject *parent) : QObject(parent), prefix(newPrefix), id(newId), useStdErr(useStdErr) -{ - if(id.isEmpty()) - { - id = QString::number(qrand()) + "-"; - } - stdIn.setFileName(prefix + id + "stdin"); - stdOut.setFileName(prefix + id + "stdout"); - stdErr.setFileName(prefix + id + "stderr"); - ctrlIn.setFileName(prefix + id + "ctrlin"); - ctrlOut.setFileName(prefix + id + "ctrlout"); - bool reattaching = false; - if(!ctrlIn.exists()) - { - if(!QProcess::startDetached("ProcessManager", QStringList() << prefix + id)) - { - return; - } - qDebug() << "Started new ProcessManager"; - qDebug() << "Waiting for ctrl-files"; - while(!ctrlIn.exists() || !ctrlOut.exists()); - } - else - { - qDebug() << "Reattaching"; - reattaching = true; - } - if(!ctrlIn.open(QFile::WriteOnly | QFile::Unbuffered)) - { - qDebug() << "ctrlin not open" << ctrlIn.errorString(); - return; - } - qDebug() << "Opened ctrlin"; - ctrlIn.write("HELLO\n"); - if(!ctrlOut.open(QFile::ReadOnly)) - { - qDebug() << "ctrlout not open" << ctrlOut.errorString(); - return; - } - qDebug() << "Opened ctrlout"; - if(ctrlOut.readLine() != "HELLO\n") - { - qDebug() << "not HELLO"; - return; - } - qDebug() << "HELLO"; - ctrlOutNotifier = new QSocketNotifier(ctrlOut.handle(), QSocketNotifier::Read, this); - connect(ctrlOutNotifier, SIGNAL(activated(int)), this, SLOT(ctrlOutReadyRead())); - ok = true; - if(reattaching) - { - ctrlIn.write("STATUS\n"); - QByteArray status = ctrlOut.readLine(); - if(status != "NOTRUNNING\n") - { - QRegExp runningExp("^RUNNING: (\\d+)\n$"); - if(runningExp.exactMatch(QString::fromUtf8(status))) - { - pid = runningExp.cap(1).toInt(); - running = connectToIO(); - } - } - } -} - -ProcessManager::~ProcessManager() -{ - -} - -bool ProcessManager::isOk() -{ - return ok; -} - -bool ProcessManager::isRunning() -{ - return ok && running; -} - -bool ProcessManager::start(const QString &program, QStringList args) -{ - if(!ok || running) - { - return false; - } - for(int i = 0; i < args.length(); ++i) - { - args[i] = args[i].replace('\\', "\\\\").replace(' ', "\\ "); - } - ctrlIn.write("START " + program.toUtf8() + " " + args.join(' ').toUtf8() + "\n"); - QRegExp runningExp("^RUNNING: (\\d+)\n$"); - if(!runningExp.exactMatch(ctrlOut.readLine())) - { - return false; - } - else - { - pid = runningExp.cap(1).toInt(); - return running = connectToIO(); - } -} - -QByteArray ProcessManager::readAll() -{ - return stdOut.readAll(); -} - -QByteArray ProcessManager::readLine() -{ - return stdOut.readLine(); -} - -qint64 ProcessManager::write(const QByteArray &data) -{ - if(stdIn.isWritable()) - { - return stdIn.write(data); - } - else - { - return -1; - } -} - -bool ProcessManager::isWritable() -{ - return ok && running && stdIn.isOpen() && stdIn.isWritable(); -} - -bool ProcessManager::setWorkingDirectory(const QString &path) -{ - if(!ok || !ctrlIn.isWritable() || running) - { - return false; - } - ctrlIn.write("CD " + path.toUtf8() + "\n"); - if(ctrlOut.readLine() != "CHANGED\n") - { - return false; - } - else - { - return true; - } -} - -void ProcessManager::kill() -{ - if(ok && running && ctrlIn.isWritable()) - { - ctrlIn.write("KILL\n"); - } -} - -void ProcessManager::exit() -{ - ctrlIn.write("EXIT\n"); -} - -void ProcessManager::closeProgFifos() -{ - ctrlIn.write("CLOSE\n"); - stdIn.close(); - stdOut.close(); - stdErr.close(); - DELETE_SAVE(stdOutNotifier); - DELETE_SAVE(stdErrNotifier); -} - -QString ProcessManager::ID() -{ - return id; -} - -void ProcessManager::ctrlOutReadyRead() -{ - QString what = QString::fromUtf8(ctrlOut.readLine()); - QRegExp quitExp("^QUIT: (\\d+)\n"); - if(quitExp.exactMatch(what)) - { - exitCode = quitExp.cap(1).toInt(); - running = false; - stdOut.close(); - stdErr.close(); - stdIn.close(); - DELETE_SAVE(stdOutNotifier); - DELETE_SAVE(stdErrNotifier); - emit finished(exitCode); - } -} - -void ProcessManager::_stdOutReadyRead() -{ - if(!stdOut.isOpen()) - { - DELETE_SAVE(stdOutNotifier); - } - emit readyRead(); -} - -void ProcessManager::_stdErrReadyRead() -{ - if(!stdErr.isOpen()) - { - DELETE_SAVE(stdErrNotifier); - } - emit stdErrReadyRead(); -} - -bool ProcessManager::connectToIO() -{ - if(!stdOut.open(QFile::ReadOnly)) - { - qDebug() << "stdout not open" << stdOut.errorString(); - return false; - } - qDebug() << "Opened stdout"; - if(!stdErr.open(QFile::ReadOnly)) - { - qDebug() << "stderr not open" << stdOut.errorString(); - return false; - } - qDebug() << "Opened stderr"; - if(!stdIn.open(QFile::WriteOnly | QFile::Unbuffered)) - { - qDebug() << "stdin not open" << stdOut.errorString(); - return false; - } - qDebug() << "Opened stdin"; - stdOutNotifier = new QSocketNotifier(stdOut.handle(), QSocketNotifier::Read, this); - connect(stdOutNotifier, SIGNAL(activated(int)), this, SLOT(_stdOutReadyRead())); - if(useStdErr) - { - stdErrNotifier = new QSocketNotifier(stdErr.handle(), QSocketNotifier::Read, this); - connect(stdErrNotifier, SIGNAL(activated(int)), this, SLOT(_stdErrReadyRead())); - } - return true; -} - diff --git a/ProcessManager.hpp b/ProcessManager.hpp deleted file mode 100644 index 7782cb3..0000000 --- a/ProcessManager.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef PROCESSMANAGER_HPP -#define PROCESSMANAGER_HPP - -#define DELETE_SAVE(x) if(x != 0) \ -{\ - delete x;\ - x = 0;\ -} - -#include -#include -#include - -class ProcessManager : public QObject -{ - Q_OBJECT -public: - explicit ProcessManager(const QString& prefix, const QString& id = "", bool useStdErr = false, QObject *parent = 0); - ~ProcessManager(); - - bool isOk(); - bool isRunning(); - bool start(const QString& program, QStringList args); - - QByteArray readAll(); - QByteArray readLine(); - qint64 write(const QByteArray& data); - bool isWritable(); - bool setWorkingDirectory(const QString& path); - - void kill(); - void exit(); - - void closeProgFifos(); - - QString ID(); - -signals: - void readyRead(); - void stdErrReadyRead(); - void finished(int); - -public slots: - -private slots: - void ctrlOutReadyRead(); - void _stdOutReadyRead(); - void _stdErrReadyRead(); - -private: - QString prefix; - QString id; - - QFile ctrlIn; - QFile ctrlOut; - QFile stdIn; - QFile stdOut; - QFile stdErr; - - QSocketNotifier* ctrlOutNotifier = 0; - QSocketNotifier* stdOutNotifier = 0; - QSocketNotifier* stdErrNotifier = 0; - - bool useStdErr = false; - - bool ok = false; - bool running = false; - - int pid = 0; - int exitCode = 0; - - bool connectToIO(); -}; - -#endif // PROCESSMANAGER_HPP diff --git a/crsm.cpp b/crsm.cpp deleted file mode 100644 index 9a48058..0000000 --- a/crsm.cpp +++ /dev/null @@ -1,2184 +0,0 @@ -#include "crsm.hpp" -#include -#include -#include -#include -#include -#include -#include -#include - -#define CMD_SIGN "!" - -#define MGMT_BUFFER_FILENAME "CRSM-MGMT-Buffer" - -CRSM::CRSM(QObject *parent) : - QObject(parent) -{ - qsrand(QDateTime::currentMSecsSinceEpoch()); - codec = QTextCodec::codecForName("Windows-1252"); - qout = new QTextStream(stdout, QIODevice::WriteOnly | QIODevice::Unbuffered); - qin = new QTextStream(stdin, QIODevice::ReadOnly); - qout->setCodec(QTextCodec::codecForName("UTF-8")); - - outputBuffer.setFileName(MGMT_BUFFER_FILENAME); - outputBuffer.open(QFile::WriteOnly | QFile::Unbuffered); - - args << "/fullscreen" << "/config:config" << "/lobby:60" << "/nosignup"; - finish = false; - - readConfig(); - - connect(&managementServer, SIGNAL(newConnection()), this, SLOT(newManagementConnection())); - managementServer.listen(QHostAddress::LocalHostIPv6, settings["ManagementPort"].toUInt()); - - listC4Folders(); - readScenarios(); - - if(settings.contains("ReattachId")) - { - processManager = new ProcessManager("CRSM-Clonkserver-", settings["ReattachId"]); - } - else - { - processManager = new ProcessManager("CRSM-Clonkserver-"); - } - - - if(!processManager->isOk()) - { - out("Could not start Process Manager!"); - settings.remove("ReattachId"); - writeConfig(); - return; - } - - settings["ReattachId"] = processManager->ID(); - writeConfig(); - - if(processManager->isRunning()) - { - writeToServer("Server Manager läuft wieder.\nBis zur nächsten Runde könnte unerwartetes Verhalten auftreten.\n"); - } - - setupCmds(); - - connect(&greetMapper, SIGNAL(mapped(QString)), this, SLOT(greet(QString))); - - autoHost = settings["AutoHost"] == "true"; - - connect(processManager, SIGNAL(readyRead()), this, SLOT(readServerOutput())); - //connect(processManager, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError())); - connect(processManager, SIGNAL(finished(int)), this, SLOT(scenarioFinished())); - //QSocketNotifier *inNotifier = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read,this); - //connect(inNotifier, SIGNAL(activated(int)), this, SLOT(readInput())); - - QFile *reallog = new QFile(settings["ClonkDirectory"]+"CRSM.log"); - reallog->open(QIODevice::Append | QIODevice::Text); - logstream.setDevice(reallog); - - if(settings["UseIrc"] == "true") - { - prepareAndConnectIrc(); - } - else - { - settings["IrcUseIngameChat"] = "false"; - } - - ok = true; -} - -CRSM::~CRSM() -{ -} - -void CRSM::start() -{ - if(autoHost && !processManager->isRunning()) - nextScen(); -} - -bool CRSM::isOk() -{ - return ok; -} - -void CRSM::readServerOutput() -{ - static QRegExp timeRemover("^>?\\s*\\[(\\d\\d:\\d\\d:\\d\\d)\\]\\s+(.*)$"); - QString what(processManager->readLine()); - - if(settings["ServerUsesReadline"] == "true") - { - while(writtenToServer.length() > 0 && what.length() > 0 && writtenToServer.at(0) == what.at(0)) - { - writtenToServer.remove(0, 1); - what.remove(0, 1); - } - - if(what.at(0) == '>') - what.remove(0, 1); - } - - if(what.isEmpty()) - return; - - logstream << what.trimmed() << endl; - - if(settings["UseIrc"] == "true") - { - foreach(const QString &mess, what.split("\n", QString::SkipEmptyParts)) - foreach(const QString &mod, ircModIOList) - { - connection->sendCommand(IrcCommand::createNotice(mod, mess)); - } - } - out(what.trimmed() + "\n"); - if(!timeRemover.exactMatch(what)) - return; - what = timeRemover.cap(2).trimmed(); - - static QRegExp userexp("^\\s*(\\*?)\\s*<(.*)\\|(\\d+)\\|([^>]*)>\\s+(.*)$"); - if(userexp.exactMatch(what)) - { - bool isMeMessage = (userexp.cap(1) == "*"); - QString user = userexp.cap(4); - QString pcName = userexp.cap(2); - int cuid = userexp.cap(3).toInt(); - if(pcName != settings["ServerPCName"]) - { - ClientInfo& info = getClientInfo(pcName, cuid, user); - if(info.floodCheck(settings["AntiFloodCount"].toInt(), settings["AntiFloodTime"].toInt(), QDateTime(QDate::currentDate(), QTime::fromString(timeRemover.cap(1), "hh:mm:ss")))) - { - kick(pcName, "Flooding! Maximal " + settings["AntiFloodCount"] + " Nachrichten in " + settings["AntiFloodTime"] + "s"); - } - else if(!isMeMessage) - { - QString msg = userexp.cap(5).trimmed(); - QRegExp commandExp("^\\" CMD_SIGN "([^ ]+)(\\s+(.*)\\s*)?$"); - if(commandExp.exactMatch(msg)) - { - QString command = commandExp.cap(1).trimmed(); - QString commandArgs = commandExp.cap(2).trimmed(); - if(!cmd(command, commandArgs, info)) - { - respond(info, "Unbekannter Befehl: \"" + command + "\"!\n"); - } - - } - else if(session["IrcUseIngameChat"] == "true") - { - connection->sendCommand(IrcCommand::createMessage(settings["IrcIngameChannel"], "[Clonk]<" + user + "> " + msg)); - } - } - } - } - static QRegExp joinExp("^Client (.+) (?:verbunden|connected)\\.\\s*$"); - if(joinExp.exactMatch(what)) - { - static QRegExp infoMatch("^<(.*)\\|(\\d+)\\|(.*)>$"); - if(infoMatch.exactMatch(joinExp.cap(1))) - { - const ClientInfo& info = ClientInfo::clonkClient(infoMatch.cap(3), infoMatch.cap(1), infoMatch.cap(2).toInt()); - clients.insert(info.pcName, info); - QTimer *timer = new QTimer; - connect(timer, SIGNAL(timeout()), &greetMapper, SLOT(map())); - connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater())); - greetMapper.setMapping(timer, info.pcName); - timer->start(1000); - if(session["IrcUseIngameChat"] == "true") - { - connection->sendCommand(IrcCommand::createMessage(settings["IrcIngameChannel"], "[Clonk] " + info.toString() + " verbunden.")); - } - } - } - - static QRegExp activatedExp("^Client (.+) (?:aktiviert|activated)\\.\\s*$"); - if(activatedExp.exactMatch(what)) - { - QRegExp infoMatch("^<(.*)\\|(\\d+)\\|(.*)>$"); - if(infoMatch.exactMatch(joinExp.cap(1))) - { - ClientInfo &info = getClientInfo(infoMatch.cap(1), infoMatch.cap(2).toInt(), infoMatch.cap(3)); - info.activated = true; - } - } - - static QRegExp deactivatedExp("^Client (.+) (?:deaktiviert|deactivated)\\.\\s*$"); - if(deactivatedExp.exactMatch(what)) - { - QRegExp infoMatch("^<(.*)\\|(\\d+)\\|(.*)>$"); - if(infoMatch.exactMatch(joinExp.cap(1))) - { - ClientInfo &info = getClientInfo(infoMatch.cap(1), infoMatch.cap(2).toInt(), infoMatch.cap(3)); - info.activated = false; - } - } - - static QRegExp startExp("^Start!\\s*$"); - if(startExp.exactMatch(what)) - { - if(session["league"] != "true") - { - writeToServer(QString("/set maxplayer 0\n")); - } - session["running"] = "true"; - } - - - static QRegExp leaveExp("^Client (.+) (?:entfernt|removed)(.*)"); - if(leaveExp.exactMatch(what)) - { - QRegExp infoMatch("^<(.*)\\|(\\d+)\\|(.*)>$"); - if(infoMatch.exactMatch(leaveExp.cap(1))) - { - ClientInfo &info = getClientInfo(infoMatch.cap(1), infoMatch.cap(2).toInt(), infoMatch.cap(3)); - writeToServer(QString(info.nick +" ist ein L34V0R!\n")); - - if(session["IrcUseIngameChat"] == "true") - { - connection->sendCommand(IrcCommand::createMessage(settings["IrcIngameChannel"], "[Clonk] " + info.toString() + " entfernt" + leaveExp.cap(2))); - } - - if(info == sessionAdmin) - { - leaveAdmins.insert(info, QDateTime::currentDateTime()); - writeToServer("Rundenadmin wurde freigegeben.\n"); - sessionAdmin = ClientInfo(); - } - - clients.remove(info.pcName); - } - if(clients.size() == 0 && userlist.length() > 0 && session["userwish"] != "true") - { - processManager->closeProgFifos(); - } - else if(clients.size() == 0 && settings["EmptyTimer"] != "-1" && (session["CountDown"] == "false" || session["CountDown"].toInt() > settings["EmptyTimer"].toInt())) - { - writeToServer("/start " + settings["EmptyTimer"] + "\n"); - } - } - - static QRegExp countDownExp("^(?:Das Spiel beginnt in (\\d+) Sekunden\\!|The game will start in (\\d+) seconds\\.)"); - if(countDownExp.exactMatch(what)) - { - session["CountDown"] = countDownExp.cap(1); - } - - static QRegExp countDownStopExp("^(?:Spielstart abgebrochen\\.|Game start aborted\\.)"); - if(countDownStopExp.exactMatch(what)) - { - session["CountDown"] = "false"; - } -} - -/*void CRSM::processError() -{ - *qout << processManager->errorString() << endl; -}*/ - -void CRSM::readInput() -{ - QString what(qin->readLine()); - if(what == "/exitdetach" || what == "/exitupdate") - { - if(what == "/exitupdate") - { - writeToServer("Der Server Manager wird upgedatet. Befehle funktionieren temporär nicht.\n"); - } - settings["ReattachId"] = processManager->ID(); - writeConfig(); - QCoreApplication::quit(); - return; - } - if(what == "/exit") - { - processManager->closeProgFifos(); - settings.remove("ReattachId"); - finish = true; - if(session["hosting"] != "true") - scenarioFinished(); - return; - } - if(what == "/exitafter") - { - finish = true; - out("Will exit after this round."); - return; - } - if(what == "/next") - { - skipCurrent(); - return; - } - if(what == "/skip") - { - QString skipped; - if((skipped = skipScen()) != "") - { - out("Skipped \"" + skipped + "\".\n"); - } - else - out("User list is empty!\n"); - - return; - } - if(what == "/reload") - { - out("Reloading config...\n"); - lists.clear(); - settings.clear(); - ircModChecks.clear(); - ircMods.clear(); - ircModFifosOld.clear(); - ircModIOList.clear(); - ircStatusFifos.clear(); - readConfig(); - return; - } - - if(what == "/help") printAdditionalHelp(); - writeToServer(what+"\n"); -} - -void CRSM::nextScen() -{ - session["hosting"] = "true"; - if(userlist.length()>0) - { - startScen(userlist.at(0), args); - userlist.removeFirst(); - session["userwish"] = "true"; - } - else - { - startScen(nextAutoScens.first(), args); - nextAutoScens.removeFirst(); - updateNextAutoScens(); - } -} - -void CRSM::printAdditionalHelp() -{ - out("/exit stops the actual Clonk Server and exits the Server Manager.\n" - "/exitafter exits the Server Manager after the current round.\n" - "/next stops the actual Clonk Server and starts a new one.\n" - "/reload rereads the config file.\n" - "/skip removes the first scenario in user wish list.\n" - "Clonk commands following...\n"); -} - -void CRSM::readLog() -{ - QString temp(logfile->readLine().trimmed()); - if(temp != "") logstream << temp << endl; -} - -void CRSM::scenarioFinished() -{ - if(finish) - { - writeConfig(); - processManager->exit(); - if(connection != 0) - { - connection->quit(settings["IrcQuitMessage"]); - connect(connection, SIGNAL(disconnected()), QCoreApplication::instance(), SLOT(quit())); - QTimer::singleShot(500, QCoreApplication::instance(), SLOT(quit())); - } - else - QCoreApplication::quit(); - return; - } - session.clear(); - sessionAdmin = ClientInfo(); - ircAdmin = ClientInfo(); - clients.clear(); - leaveAdmins.clear(); - if((autoHost || userlist.length() > 0) && !finish) - nextScen(); - else if(!settings["IrcIngameChannel"].isEmpty()) - { - connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Kein laufendes Spiel.")); - QFile lastScenFile(LAST_SCEN_FILE_NAME); - QFile curScenFile(CUR_SCEN_FILE_NAME); - curScenFile.open(QFile::ReadOnly); - lastScenFile.open(QFile::WriteOnly); - lastScenFile.write(curScenFile.readAll()); - lastScenFile.close(); - curScenFile.close(); - curScenFile.open(QFile::WriteOnly); - curScenFile.close(); - } -} - -void CRSM::ircMessageReceived(IrcMessage *message) -{ - if(message->isOwn()) - return; - if(message->type() == IrcMessage::Notice) - { - if(message->nick() == "NickServ") - { - QStringList split = message->parameters().at(1).split(' ', QString::SkipEmptyParts); - if(((IrcNoticeMessage*)message)->content().contains("nickname is registered")) - { - connection->sendCommand(IrcCommand::createMessage("NickServ", "IDENTIFY " + settings["IrcNick"] + " " + settings["IrcPassword"])); - } - else if(split.first() == "STATUS") - { - QString statusNick = split.at(1); - int status = split.at(2).toInt(); - if(ircStatusFifos.contains(statusNick)) - { - QList> &fifo = ircStatusFifos[statusNick]; - while(fifo.size() > 0) - { - (this->*fifo.first().second)(fifo.first().first, status, ClientInfo::ircClient(statusNick)); - fifo.removeFirst(); - } - } - } - } - } - else if(message->type() == IrcMessage::Private) - { - QString target = message->parameters().at(0); - if(message->parameters().at(0) == connection->nickName()) - target = message->nick(); - QString mess = message->parameters().at(1).trimmed(); - if(target == settings["IrcIngameChannel"]) - { - writeToServer("[IRC]<" + message->nick() + "> " + mess + "\n"); - } - else if(mess.left(QString(CMD_SIGN).length()) == CMD_SIGN && mess.length() > QString(CMD_SIGN).length()) - { - QStringList args = mess.right(mess.length() - QString(CMD_SIGN).length()).split(" ", QString::SkipEmptyParts); - QString command = args.first().trimmed(); - args.removeFirst(); - QString arg = args.join(" ").trimmed(); - const ClientInfo& client = ClientInfo::ircClient(message->nick(), target); - if(!cmd(command, arg, client)) - { - respond(client, "Unbekannter Befehl: \"" + command + "\"!"); - } - } - else if(message->nick() == target && ircMods.contains(target)) - { - if(aliasWishEditor == target) - { - editAliasWishes(mess); - } - else if(ircModIOList.contains(message->nick())) - { - QString writeMessage; - if(mess.at(0) == '\\') - { - mess[0] = '/'; - } - else - { - writeMessage = "[IRC]<" + message->nick() + "> "; - } - writeMessage += mess; - writeToServer(writeMessage + "\n"); - } - } - } - else if(message->type() == IrcMessage::Join) - { - QString joinChannel = message->parameters().at(0); - connection->sendCommand(IrcCommand::createMessage(joinChannel, "Hallo " + message->nick() + "!")); - if(joinChannel == settings["IrcIngameChannel"]) - { - writeToServer("[IRC] " + message->nick() + " hat den Channel betreten." + "\n"); - } - else - ircCheckUserStatus(ClientInfo::ircClient(message->nick()), ClientInfo::ircClient(message->nick()), &CRSM::ircModCmd); - } - else if(message->type() == IrcMessage::Quit) - { - ircMods.removeAll(message->nick()); - ircModChecks.removeAll(message->nick()); - ircModIOList.removeAll(message->nick()); - if(aliasWishEditor == message->nick()) - { - stopAliasWishEditing(); - } - if(ircAdmin == ClientInfo::ircClient(message->nick())) - { - ircAdmin = ClientInfo(); - } - } - else if(message->type() == IrcMessage::Kick) - { - if(message->parameters().at(1) == connection->nickName()) - { - connection->sendCommand(IrcCommand::createJoin(message->parameters().at(0))); - } - } - else if(message->type() == IrcMessage::Part) - { - QString leaveChannel = message->parameters().at(0); - if(leaveChannel == settings["IrcIngameChannel"]) - { - writeToServer("[IRC] " + message->nick() + " hat den Channel verlassen." + "\n"); - } - } - else if(message->type() == IrcMessage::Mode) - { - QRegExp modeExp("^\\+[a-zA-Z]*(a|o)"); - if(message->parameters().size() >= 3 && message->parameters().at(0) == settings["IrcIngameChannel"] && modeExp.exactMatch(message->parameters().at(1)) && message->parameters().at(2) == settings["IrcNick"]) - { - if(settings["IrcUseIngameChat"] == "true" && !settings["IrcIngameChannel"].isEmpty()) - { - if(session["hosting"] != "true") - { - connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Kein laufendes Spiel.")); - } - else - { - connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Aktuelles Szenario: " + session["scenname"] + " | Ingamechat ist " + (session["IrcUseIngameChat"] == "true" ? "" : "de") + "aktviert.")); - } - } - } - } -} - -void CRSM::greet(QString pcName) -{ - if(!clients.contains(pcName)) - return; - const ClientInfo &info = clients.value(pcName); - writeToServer(QString("Hallo " + info.nick + "!\n")); - if(leaveAdmins.contains(info)) - { - int timeGone; - if((timeGone = leaveAdmins.value(info).secsTo(QDateTime::currentDateTime())) < settings["RegainAdminTime"].toInt() && sessionAdmin != ClientInfo()) - { - writeToServer(info.nick + "! Der Rundenadmin wurde freigegeben, weil du das Spiel verlassen hast.\nDu hast noch " + QString::number(settings["RegainAdminTime"].toInt() - timeGone) + "s Zeit um den Rundenadmin zurückzuholen.\n"); - } - else - { - leaveAdmins.remove(info); - } - } -} - -void CRSM::newManagementConnection() -{ - QTcpSocket* sock = managementServer.nextPendingConnection(); - connect(sock, SIGNAL(readyRead()), this, SLOT(newManagementData())); - connect(sock, SIGNAL(disconnected()), this, SLOT(managementConnectionDisconnected())); - sock->write(QString("Willkommen beim CRSM-Management-Interface!\nIhr Name: ").toUtf8()); -} - -void CRSM::newManagementData() -{ - QTcpSocket* sock = (QTcpSocket*)sender(); - QString allData = sock->readAll().trimmed(); - foreach(const QString& data, allData.split('\n')) - { - if(!managementConnections.contains(sock)) - { - if(data.isEmpty()) - { - sock->write("Ihr Name: "); - } - else - { - ManagementConnection conn; - conn.socket = sock; - conn.name = data; - managementConnections.insert(sock, conn); - out(conn.name + " logged in on Management-Interface.\n"); - replayOutputBuffer(sock); - } - } - else - { - if(data.isEmpty()) - { - continue; - } - ManagementConnection& conn = managementConnections[sock]; - if(data.at(0) == '/') - { - QStringList split = data.right(data.length() - 1).split(' '); - QString cmdName = split.first(); - split.removeFirst(); - if(cmd(cmdName, split.join(' '), ClientInfo::managementClient(conn))) - { - continue; - } - else - { - writeToServer(data + "\n"); - } - } - else - { - writeToServer("[CLI]<" + conn.name + "> " + data + "\n"); - } - } - } -} - -void CRSM::managementConnectionDisconnected() -{ - QTcpSocket* sock = (QTcpSocket*)sender(); - out(managementConnections.value(sock).name + "disconnected from Management-Interface."); - if(managementConnections.contains(sock)) - { - managementConnections.remove(sock); - } -} - -void CRSM::updateNextAutoScens() -{ - while(nextAutoScens.length() < settings["UserListLength"].toInt()) - { - ScenarioSettings next(""); - if(settings["RandomizeAutoHosting"] == "true") - { - next = autolist.at(qrand() % autolist.length()); - } - else - { - next = autolist.at(current); - if(++current >= autolist.length()) current = 0; - } - if(next.randomLeague) - { - next.league = qrand() % 2; - } - nextAutoScens.append(next); - } -} - -void CRSM::startScen(const ScenarioSettings &scen, QStringList argList) -{ - QString filename; - QFile lastScenFile(LAST_SCEN_FILE_NAME); - QFile curScenFile(CUR_SCEN_FILE_NAME); - curScenFile.open(QFile::ReadOnly); - lastScenFile.open(QFile::WriteOnly); - lastScenFile.write(curScenFile.readAll()); - lastScenFile.close(); - curScenFile.close(); - curScenFile.open(QFile::WriteOnly); - curScenFile.write(scen.name.toUtf8()); - curScenFile.close(); - QFile scoreboardFile(SCOREBOARD_FILE_NAME); - scoreboardFile.open(QFile::WriteOnly); - scoreboardFile.close(); - - session["scenname"] = scen.name; - session["IrcUseIngameChat"] = settings["IrcUseIngameChat"]; - if(settings["IrcUseIngameChat"] == "true" && !settings["IrcIngameChannel"].isEmpty()) - { - connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Aktuelles Szenario: " + session["scenname"] + " | Ingamechat ist " + (session["IrcUseIngameChat"] == "true" ? "" : "de") + "aktviert.")); - } - filename = scen.name; - while(maps["Alias"].contains(filename)) - filename = maps["Alias"].value(filename); - //processManager->setWorkingDirectory(QDir::currentPath()); - if(scen.league) - { - argList << "/league"; - session["league"] = "true"; - } - else - { - argList << "/noleague"; - } - argList << filename; - processManager->setWorkingDirectory(settings["ClonkDirectory"]); - processManager->start(settings["ServerExecutable"], argList); -} - -void CRSM::readConfig() -{ - lists.clear(); - settings.clear(); - settings["IrcReconnectDelay"] = "10"; - settings["EmptyTimer"] = "60"; - settings["MaxUserWishes"] = "2"; - settings["MaxScenWishes"] = "2"; - settings["AntiFloodCount"] = "5"; - settings["AntiFloodTime"] = "3"; - settings["RegainAdminTime"] = "120"; - settings["ServerExecutable"] = "clonk-server"; - settings["Arguments"] = "/fullscreen /lobby:300 /nosignup Objects.c4d"; - settings["ClonkConfig"] = "config"; - settings["UserListLength"] ="5"; - settings["ManagementPort"] = "9372"; - - QFile config(CONFIG_FILE_NAME); - if(!config.exists()) - { - config.open(QIODevice::WriteOnly | QIODevice::Text); - writeConfig(); - } - else if(config.open(QIODevice::ReadOnly | QIODevice::Text)) - { - QRegExp confExp("^([^=]+)=(.*)$"); - QRegExp confPlusExp("^([^=]+)\\+=(.*)$"); - QRegExp confMapExp("^([^\\[]+)\\[([^\\]]+)\\]\\s*=\\s*(.*)$"); - QString line; - for(;;) - { - line = config.readLine().trimmed(); - if(confPlusExp.exactMatch(line)) - { - lists[confPlusExp.cap(1).trimmed()].push_back(confPlusExp.cap(2).trimmed()); - } - else if(confMapExp.exactMatch(line)) - { - maps[confMapExp.cap(1).trimmed()][confMapExp.cap(2).trimmed()] = confMapExp.cap(3).trimmed(); - } - else if(confExp.exactMatch(line)) - { - settings.insert(confExp.cap(1).trimmed(),confExp.cap(2).trimmed()); - } - if(config.atEnd()) - break; - } - } - - out("config:\n"); - foreach(const QString &key, settings.keys()) - { - out(key + " = " + settings.value(key) + "\n"); - } - out("\n"); - foreach(const QString &key, lists.keys()) - { - out(key + ":\n"); - foreach(const QString &val, lists.value(key)) - { - out("\t" + val + "\n"); - } - } - out("\n"); - foreach(const QString &key, maps.keys()) - { - out(key + ":\n"); - foreach(const QString &mapkey, maps.value(key).keys()) - { - out("\t[" + mapkey + "]" + " = " + maps.value(key).value(mapkey) + "\n"); - } - } - out("\n"); - args = settings["Arguments"].split(" "); - args << "/config:"+settings["ClonkConfig"]; - settings["ClonkDirectory"] = QFileInfo(settings["ServerExecutable"]).absoluteDir().absolutePath()+QDir::separator(); - - QFile clonkconfig(settings["ClonkConfig"]); - if(!clonkconfig.exists()) - out("WARNING: Clonk's config file is not existing!"); - else - { - clonkconfig.open(QFile::ReadOnly); - QRegExp nickExp("^\\s*Nick=\"(.*)\"\\s*$"); - QRegExp pcNameExp("^\\s*LocalName=\"(.*)\"\\s*$"); - foreach(const QString &line, QString(clonkconfig.readAll().trimmed()).split("\n")) - { - if(nickExp.exactMatch(line)) - { - settings["ServerNick"] = nickExp.cap(1); - break; - } - else if(pcNameExp.exactMatch(line)) - { - settings["ServerPCName"] = pcNameExp.cap(1); - break; - } - } - out("\n"); - out("ClonkDirectory = " + settings.value("ClonkDirectory") + "\n"); - out("ServerNick = " + settings.value("ServerNick") + "\n"); - } - out("\n"); - bool ok; - ushort mgmtPort = settings["ManagementPort"].toUShort(&ok); - if(!ok || mgmtPort == 0) - { - settings["ManagementPort"] = "9372"; - } -} - - -void CRSM::readScenarios() -{ - QFile scenfile("scenarios.lst"); - if(!scenfile.exists()) - { - out("No scenarios.lst found!"); - scenfile.open(QFile::WriteOnly); - scenfile.write("Worlds.c4f/Goldmine.c4s"); - scenfile.close(); - } - scenfile.open(QFile::ReadOnly); - QStringList scenlist = QString(scenfile.readAll()).trimmed().split("\n",QString::SkipEmptyParts); - out("Scenarios in list:\n"); - autolist.clear(); - nextAutoScens.clear(); - current = 0; - foreach(const QString &args, scenlist) - { - ScenarioSettings scen(args, ClientInfo::autoClient()); - QStringList argList = args.split(' ', QString::KeepEmptyParts); - if(argList.first().trimmed() == "--league") - { - argList.removeFirst(); - scen.league = true; - scen.name = argList.join(' '); - } - else if(argList.first().trimmed() == "--random-league") - { - argList.removeFirst(); - scen.randomLeague = true; - scen.name = argList.join(' '); - } - QString scenName = scen.name; - if(!(scen.name = scenPath(scen.name)).isEmpty()) - { - out(scen.name + "\n"); - autolist.append(scen); - } - else - { - out("WARNING: Scenario " + scenName + " not found!\n"); - } - } - - out("\n"); - - scenfile.close(); - updateNextAutoScens(); -} - -void CRSM::listC4Folders() -{ - out("Listing Contents of C4Folders..."); - QDirIterator it(settings["ClonkDirectory"], QDirIterator::FollowSymlinks); - for(; it.hasNext(); it.next()) - { - if(it.fileName() == ".." || it.fileName() == ".") - continue; - if((it.fileInfo().suffix() == "c4f" || (it.fileInfo().isDir() && !QDir(it.fileInfo().absoluteFilePath()).entryList(QStringList() << "*.c4f" << "*.c4s").isEmpty())) && it.fileName() != "." && it.fileName() != ".." && !lists["IgnoreFolders"].contains(it.fileInfo().baseName())) - { - const QStringList& list = listC4Folder(it.filePath()); - if(!list.isEmpty()) - { - QFile listFile(it.filePath()+".lst"); - listFile.open(QFile::WriteOnly); - foreach(const QString& scen, list) - { - listFile.write(scen.toUtf8() + "\n"); - } - listFile.close(); - } - } - } - out(QString(3, '\b') + ": Finished\n"); -} - -void CRSM::cleanUp() -{ - out("\nCleaning up Clonk Folder...\n"); - QDirIterator it(settings["ClonkDirectory"]+"Network/", QDirIterator::FollowSymlinks | QDirIterator::Subdirectories); - for(; it.hasNext(); it.next()) - if(it.fileInfo().exists()) QFile(it.fileInfo().absoluteFilePath()).remove(); - out("\n"); -} - -QString CRSM::scenPath(QString scenName) -{ - bool isAlias = false; - QString aliasName; - foreach(const QString& alias, maps["Alias"].keys()) - { - if(alias.compare(scenName, Qt::CaseInsensitive) == 0) - { - aliasName = scenName = alias; - break; - } - } - while(maps["Alias"].contains(scenName)) - { - scenName = maps["Alias"].value(scenName); - isAlias = true; - } - QFileInfo fileInfo(settings["ClonkDirectory"] + scenName); - if(fileInfo.suffix() != "c4s") - { - return QString(); - } - bool exists = fileInfo.exists(); - if(exists && isAlias) - { - return aliasName; - } - if(exists) - { - return scenName; - } - else - { - QStringList split = scenName.split('/'); - QString name = scenName.right(scenName.length() - split.first().length() - 1); - if(split.length() >= 2) - { - if(split.first().right(4) == ".c4f") - { - const QStringList& entryList = QDir(settings["ClonkDirectory"]).entryList(QStringList() << "*.c4f"); - QString folderName = split.first(); - foreach(const QString& entry, entryList) - { - if(entry.compare(folderName, Qt::CaseInsensitive) == 0) - { - folderName = entry; - break; - } - } - QFile lstFile(settings["ClonkDirectory"] + folderName + ".lst"); - if(lstFile.exists()) - { - lstFile.open(QFile::ReadOnly); - while(!lstFile.atEnd()) - { - const QString& line = lstFile.readLine().trimmed(); - if(line.compare(name, Qt::CaseInsensitive) == 0) - { - lstFile.close(); - if(isAlias) - { - return aliasName; - } - else - { - return folderName + '/' + line; - } - } - } - } - lstFile.close(); - } - } - } - return QString(); -} - -QString CRSM::listScenarios(QString commandArgs) -{ - QString ret; - if(commandArgs.isEmpty()) - { - ret += "Folgende Szenarien stehen zur Auswahl:\n"; - QDirIterator it(settings["ClonkDirectory"], QDirIterator::FollowSymlinks); - for(; it.hasNext(); it.next()) - { - if(it.fileInfo().suffix() == "c4s" && !it.fileInfo().absoluteFilePath().contains(settings["ClonkDirectory"]+"Network/")) - ret += QString(" "+it.fileInfo().absoluteFilePath().replace(settings["ClonkDirectory"],"")+"\n"); - } - ret += "-----------------------------------------------------------------\nFolgende Ordner stehen zur Auswahl:\n"; - QDirIterator folderIt(settings["ClonkDirectory"], QDirIterator::FollowSymlinks); - for(; folderIt.hasNext(); folderIt.next()) - { - if(folderIt.fileInfo().suffix() == "lst" && !folderIt.fileInfo().absoluteFilePath().contains(settings["ClonkDirectory"]+"Network/") && !lists["IgnoreFolders"].contains(folderIt.fileInfo().baseName())) - ret += QString(" "+folderIt.fileInfo().absoluteFilePath().left(folderIt.fileInfo().absoluteFilePath().length() - 4).replace(settings["ClonkDirectory"],"")+"\n"); - } - } - else if(commandArgs.toLower() == "aliase") - { - ret += "Vorhandene Aliase:\n"; - foreach(const QString &alias, maps["Alias"].keys()) - { - ret += QString(" " + alias + " = " + maps["Alias"].value(alias) + "\n"); - } - } - else - { - QFile file(settings["ClonkDirectory"] + commandArgs + ".lst"); - if(file.exists()) - { - ret += "Der Ordner \"" + commandArgs + QString("\" enthält folgende Szenarien:\n"); - file.open(QFile::ReadOnly); - while(!file.atEnd()) - ret += " " + QString::fromUtf8(file.readLine()).trimmed() + "\n"; - } - else - ret += "Der Ordner \"" + commandArgs + "\" wurde nicht gefunden!\n"; - } - return ret; -} - -QString CRSM::printQueue() -{ - QString ret; - if(userlist.length() == 0 && !autoHost) - { - return "Die Warteschlange ist leer.\n"; - } - ret = "Folgende Szenarien befinden sich in der Warteschlange:\n"; - for(int i = 0; i < settings["UserListLength"].toInt(); ++i) - { - const ScenarioSettings *scen; - if(i < userlist.length()) - { - scen = &userlist.at(i); - } - else if(!autoHost) - { - break; - } - else - { - scen = &nextAutoScens.at(i - userlist.length()); - } - ret += "\t" + QString::number(i + 1) + ". " + scen->name + (scen->league ? " in der Liga" : "") + " (" + scen->wishClient.toString() + ")\n"; - } - return ret; -} - -void CRSM::ircCheckModCmd(const QString &nick, CmdFunctionRef func, QString arg) -{ - ircModFifos[nick].append(qMakePair(func, arg)); - ircCheckUserStatus(ClientInfo::ircClient(nick), ClientInfo::ircClient(nick), &CRSM::ircModCmd); -} - -QString CRSM::skipScen() -{ - if(userlist.length() > 0) - { - QString skipped = userlist.first().name + " (" + userlist.first().wishClient.toString() + ")"; - userlist.removeFirst(); - return skipped; - } - else - return ""; -} - -bool CRSM::skipCurrent() -{ - if(processManager->isRunning()) - { - processManager->closeProgFifos(); - return true; - } - return false; -} - -void CRSM::writeToServer(const QString &message) -{ - if(!processManager->isWritable()) - return; - int i = 0; - QStringList split = message.split('\n', QString::KeepEmptyParts); - foreach(QString line, split) - { - if(!line.isEmpty()) - { - if(i < split.length() - 1) - line += "\n"; - while(line.length() > 240) - { - QString linePart = line.left(240); - int pos = linePart.lastIndexOf(QRegExp("\\s")); - bool wordSplit = false; - if(pos <= 0) - { - pos = 240; - wordSplit = true; - } - linePart = line.left(pos); - line = line.right(line.length() - pos); - if(wordSplit) - { - linePart += "-"; - } - linePart += "\n"; - processManager->write(codec->fromUnicode(linePart)); - if(settings["ServerUsesReadline"] == "true") - { - if(writtenToServer.length() > settings["ReadlineRereadLimit"].toInt()) - writtenToServer.clear(); - writtenToServer += codec->fromUnicode(linePart); - } - } - processManager->write(codec->fromUnicode(line)); - if(settings["ServerUsesReadline"] == "true") - { - if(writtenToServer.length() > settings["ReadlineRereadLimit"].toInt()) - writtenToServer.clear(); - writtenToServer += codec->fromUnicode(line); - } - } - ++i; - } -} - -void CRSM::writeConfig() -{ - QFile config(CONFIG_FILE_NAME); - config.open(QFile::WriteOnly); - - QTextStream configStream(&config); - - foreach(const QString &key, settings.keys()) - { - configStream << key << " = " << settings.value(key) << endl; - } - configStream << endl; - foreach(const QString &key, lists.keys()) - { - foreach(const QString &val, lists.value(key)) - { - configStream << key << " += " << val << endl; - } - } - configStream << endl; - foreach(const QString &key, maps.keys()) - { - foreach(const QString &mapkey, maps.value(key).keys()) - { - configStream << key << "[" << mapkey << "]" << " = " << maps.value(key).value(mapkey) << endl; - } - } - configStream << endl; - - config.close(); -} - -QString CRSM::addAliasWish(const QString ¶m) -{ - QRegExp aliasExp("^([^=]+)=(.*)$"); - if(aliasExp.exactMatch(param)) - { - const QString &alias = aliasExp.cap(1).trimmed(); - const QString &scen = aliasExp.cap(2).trimmed(); - QString scenP = scen; - if(maps["Alias"].contains(alias)) - { - return "Alias ist bereits vergeben!"; - } - else if(maps["AliasWishes"].contains(alias)) - { - return "Alias ist bereits als Wunsch vergeben!"; - } - else if(!(scenP = scenPath(scen)).isEmpty()) - { - maps["AliasWishes"].insert(alias, scenP); - informModsAboutAliasWish(); - return "Aliaswunsch ist hinterlegt!"; - } - else - { - return "Szenario \"" + scen + "\" wurde nicht gefunden!"; - } - } - else - { - return "Eingabefehler! Siehe !help für mehr Informationen."; - } -} - -void CRSM::informModsAboutAliasWish() -{ - foreach(const QString& mod, ircMods) - { - connection->sendCommand(IrcCommand::createNotice(mod, "Ein neuer Aliaswunsch ist verfügbar. Insgesamt verfügbar: " + QString::number(maps["AliasWishes"].size()))); - } -} - -void CRSM::editAliasWishes() -{ - if(maps["AliasWishes"].isEmpty()) - { - connection->sendCommand(IrcCommand::createMessage(aliasWishEditor, "Keine Aliaswünsche " + (currentAliasWish == "" ? QString("") : QString("mehr ")) + "vorhanden.")); - stopAliasWishEditing(); - } - else - { - currentAliasWish = maps["AliasWishes"].firstKey(); - connection->sendCommand(IrcCommand::createMessage(aliasWishEditor, currentAliasWish + " = " + maps["AliasWishes"][currentAliasWish] + " [Ja|Nein|Stop]")); - } -} - -void CRSM::editAliasWishes(const QString &message) -{ - if(message.toLower() == "j" || message.toLower() == "ja") - { - maps["Alias"][currentAliasWish] = maps["AliasWishes"][currentAliasWish]; - maps["AliasWishes"].remove(currentAliasWish); - } - else if(message.toLower() == "n" || message.toLower() == "nein") - { - maps["AliasWishes"].remove(currentAliasWish); - } - else if(message.toLower() == "s" || message.toLower() == "stop") - { - connection->sendCommand(IrcCommand::createMessage(aliasWishEditor, "Aliaswunsch-Bearbeitung gestoppt.")); - stopAliasWishEditing(); - return; - } - else - { - connection->sendCommand(IrcCommand::createMessage(aliasWishEditor, "\"" + message + "\" ist keine Antwortmöglichkeit. Antwortmöglichkeiten: [Ja|Nein|Stop]")); - } - editAliasWishes(); -} - -void CRSM::stopAliasWishEditing() -{ - aliasWishEditor = ""; - currentAliasWish = ""; -} - -QString CRSM::ircActivateIngameChat(bool activated) -{ - if(settings["IrcUseIngameChat"] == "true" && !settings["IrcIngameChannel"].isEmpty()) - { - session["IrcUseIngameChat"] = activated ? "true" : "false"; - connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Aktuelles Szenario: " + session["scenname"] + " | Ingamechat ist " + (session["IrcUseIngameChat"] == "true" ? "" : "de") + "aktviert.")); - return "Ingamechat wurde " + (session["IrcUseIngameChat"] == "true" ? QString("") : QString("de")) + "aktviert."; - } - else - return "Ingamechat ist administrativ deaktiviert!"; -} - -QStringList CRSM::listC4Folder(const QString &path) -{ - QStringList ret; - QFileInfo fileInfo(path); - if(fileInfo.isDir()) - { - QDir dir(path); - const QStringList folderList = dir.entryList(QStringList() << "*.c4f", QDir::NoFilter, QDir::Name | QDir::IgnoreCase); - ret.append(dir.entryList(QStringList() << "*.c4s", QDir::NoFilter, QDir::Name | QDir::IgnoreCase)); - foreach(const QString &folder, folderList) - { - const QStringList &folderList = listC4Folder(path + '/' + folder); - foreach (const QString &scen, folderList) { - ret.append(folder + '/' + scen); - } - } - } - else - { - QProcess c4group; - c4group.start(settings["ClonkDirectory"]+C4GROUP_EXECUTABLE, QStringList() << path << "-l", QProcess::ReadOnly); - c4group.waitForFinished(); - c4group.readLine(); - QRegExp finishExp("^\\d+ Entries, \\d+ Bytes$"); - QRegExp scenarioExp("^(.*\\.c4s)\\s+\\d+ Bytes\\s.*$"); - QRegExp folderExp("^(.*\\.c4f)\\s+\\d+ Bytes\\s.*$"); - QString line; - while(!c4group.atEnd()) - { - line = codec->toUnicode(c4group.readLine().trimmed()); - if(line.isEmpty()) - continue; - if(finishExp.exactMatch(line)) - break; - if(scenarioExp.exactMatch(line)) - { - ret.append(scenarioExp.cap(1)); - } - else if(folderExp.exactMatch(line)) - { - const QStringList &folderList = listC4Folder(path + '/' + folderExp.cap(1)); - foreach (const QString &scen, folderList) { - ret.append(folderExp.cap(1) + '/' + scen); - } - } - } - } - return ret; -} - -void CRSM::addCommand(const QString &name, CmdFunction func, int interfaces, UserType userType, const QString &shortDescription, const QString &argList, const QString &longDescription) -{ - cmds.insert(name.trimmed(), CmdFunctionRef(name.trimmed(), func, interfaces, userType, shortDescription, argList, longDescription)); -} - -bool CRSM::cmdExists(const QString &name, ClientInterface interface) -{ - return cmds.contains(name) && cmds.value(name).interfaces & interface; -} - -bool CRSM::cmd(const QString &name, const QString &args, const ClientInfo &client) -{ - if(cmdExists(name, client.interface)) - { - const CmdFunctionRef& cmdRef = cmds.value(name); - switch(client.interface) - { - case Clonk: - if(clientUserType(client) >= cmdRef.userType) - { - (this->*cmdRef.func)(name, args, client, clientUserType(client)); - } - else - { - rightsFailMessage(client, cmdRef.userType); - } - break; - case IRC: - if(cmdRef.userType == User || ((cmdRef.userType == Admin && (clientUserType(client) >= Admin)) || (cmdRef.userType == Moderator && clientUserType(client) >= Moderator))) - { - (this->*cmdRef.func)(name, args, client, clientUserType(client)); - } - else if(cmdRef.userType >= Admin) - { - ircCheckModCmd(client.nick, cmdRef, args); - } - break; - case Management: - (this->*cmdRef.func)(name, args, client, UserType::Max); - break; - case Auto: //just to avoid the compiler warning, there can't be a command from this interface - break; - } - - return true; - } - else - { - return false; - } -} - -void CRSM::rightsFailMessage(const ClientInfo &info, UserType minUserType) -{ - respond(info, "Nur ein " + userTypeStrings.value(minUserType) + " kann diesen Befehl verwenden.\n", RespondType::PrivateNotice); -} - -UserType CRSM::clientUserType(const ClientInfo &client) -{ - switch(client.interface) - { - case Clonk: - if(lists["Moderators"].contains(QString::number(client.CUID))) - return Moderator; - if(sessionAdmin == client) - return Admin; - break; - case IRC: - if(ircMods.contains(client.nick)) - return Moderator; - else if(ircAdmin == client) - return Admin; - break; - case Management: - return Max; - case Auto: //just to avoid the compiler warning - break; - } - - return User; -} - -void CRSM::setupCmds() -{ - addCommand("admin", &CRSM::admin, Clonk | IRC, User, "Ohne Name trägt es den Autor der Nachricht als Rundenadmin ein, bzw. mit Name den Spieler mit entsprechendem Namen, insofern nicht bereits ein Rundenadmin feststeht.", "[Chatnick¦PC-Name]"); - addCommand("ingameadmin", &CRSM::ingameadmin, IRC | Management, Admin, "Legt den Ingame-Rundenadmin fest.", ""); - if(settings["UseIrc"] == "true") - { - addCommand("ircadmin", &CRSM::ircadmin, Clonk | Management, Admin, "Legt den IRC-Rundenadmin fest.", "", "Legt den IRC-Rundenadmin fest. Der IRC-Admin kann über den IRC dieselben Aktionen durchführen wie der Ingame-Rundenadmin."); - } - addCommand("noadmin", &CRSM::noadmin, Clonk | IRC | Management, Admin, "Entzieht dem (IRC-)Rundenadmin seine Rechte, damit jemand anders Rundenadmin sein kann."); - addCommand("aliaswish", &CRSM::aliaswish, Clonk | IRC, User, "Deponiert den Wunsch, als Alias für einzutragen. Ein Moderator entscheidet darüber.", " = "); - if(settings["IrcUseIngameChat"] == "true") - { - addCommand("ircchat", &CRSM::ircchat, Clonk | Management, Admin, "Schaltet den Irc-Ingame-Chat ein bzw. aus.", ""); - addCommand("ingamechat", &CRSM::ircchat, IRC | Management, Admin, "Schaltet den Irc-Ingame-Chat ein bzw. aus.", ""); - } - addCommand("queue", &CRSM::queue, Clonk | IRC | Management, User, "Zeigt die nächsten " + settings["UserListLength"] + " Szenarien auf der Warteliste."); - addCommand("host", &CRSM::host, Clonk | IRC | Management, User, "Nimmt das angegebene Szenario in die Warteschlange auf. Optional in der Liga, wenn \"--league\" angegeben wird.", "[--league] "); - addCommand("list", &CRSM::list, Clonk | IRC | Management, User, "Listet alle definierten Aliase oder alle möglichen Szenarien und Ordner auf, bzw. alle Szenarien im Ordner oder Rundenordner.", "[Aliase¦Rundenordner[.c4f]]"); - addCommand("clientlist", &CRSM::clientlist, IRC | Management, User, "Listet alle verbundenen Clients mit PC-Name und Chatnick auf."); - addCommand("help", &CRSM::help, Clonk | IRC | Management, User, "Zeigt die Hilfe an.", "[long¦Befehlsname]", "Listet alle verfügbaren Befehle auf. Mit long werden alle verfügbaren Befehle mit Kurzbeschreibung aufgelistet."); - addCommand("stop", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Stoppt einen laufenden Countdown."); - addCommand("start", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Startet den Countdown.", "[Countdownzeit in s]"); - addCommand("teamdist", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Ändert die Teamverteilung.", ""); - addCommand("plrteam", &CRSM::passToClonk, Clonk | IRC, Admin, "Ändert das Team eines Spielers.", " ", "Verschiebt in das ."); - addCommand("pause", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Pausiert das Spiel."); - addCommand("unpause", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Setzt das pausierte Spiel fort."); - addCommand("observer", &CRSM::pcNamePassToClonk, Clonk | IRC | Management, Admin, "Der angegebene Host muss zuschauen.", ""); - addCommand("deactivate", &CRSM::pcNamePassToClonk, Clonk | IRC | Management, Admin, "Deaktiviert den angegebenen Host.", ""); - addCommand("activate", &CRSM::pcNamePassToClonk, Clonk | IRC | Management, Admin, "Aktiviert den angegebenen Host.", ""); - addCommand("kick", &CRSM::pcNamePassToClonk, Clonk | IRC | Management, Admin, "Kickt den angegebenen Host.", ""); - addCommand("script", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Führt das angegebene Script aus.", " - -$treeview -$search -$mathjax - -$extrastylesheet - - -
- - -
- - - - - - - - - - - - - - - - - - - - - -
-
$projectname -  $projectnumber -
-
$projectbrief
-
-
$projectbrief
-
$searchbox
-
- - diff --git a/libcommuni/doc/mainpage.dox b/libcommuni/doc/mainpage.dox deleted file mode 100644 index 622fb23..0000000 --- a/libcommuni/doc/mainpage.dox +++ /dev/null @@ -1,54 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*! - \mainpage Communi - a cross-platform IRC framework written with %Qt - - \section introduction Introduction - - Communi is a cross-platform IRC - framework written with Qt. Communi provides a set of tools - for enabling IRC connectivity in Qt-based C++ and QML applications. - - IRC (Internet Relay Chat protocol) is a simple text-based communication protocol. IRC was created - back in 1988 and is still popular particularly amongst open source projects. The Communi project's - own IRC channel \c \#communi is located on Freenode. - - \section getting-started Getting started - - Communi is divided in three modules. - The following classes from the \ref core module are the most essential classes to get started. - - \li IrcConnection manages a connection to an IRC server. - \li IrcNetwork provides information about the connected IRC network. - \li IrcMessage represents a message received from the IRC server. - \li IrcCommand represents a command sent to the IRC server. - - Refer to the \ref usage document, and the list of - examples for further details and help. - */ diff --git a/libcommuni/doc/minimal.dox b/libcommuni/doc/minimal.dox deleted file mode 100644 index 810f404..0000000 --- a/libcommuni/doc/minimal.dox +++ /dev/null @@ -1,46 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*! - \page minimal Minimal example - - The example illustrates the minimum amount of code required for: - \li Setting up and opening a connection, - \li joining a channel, - \li sending a channel message, - \li and quiting. - - \snippet minimal/main.cpp minimal - - Files: - \li \ref examples/minimal/main.cpp - - \file examples/minimal/main.cpp - \brief \ref minimal - \include examples/minimal/main.cpp - */ diff --git a/libcommuni/doc/modules.dox b/libcommuni/doc/modules.dox deleted file mode 100644 index ee72180..0000000 --- a/libcommuni/doc/modules.dox +++ /dev/null @@ -1,85 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*! - \file irccore.h - \brief \#include <\ref core "IrcCore"> - */ - -/*! - \file ircmodel.h - \brief \#include <\ref models "IrcModel"> - */ - -/*! - \file ircutil.h - \brief \#include <\ref util "IrcUtil"> - */ - -/*! - \defgroup core IrcCore - \brief Core classes to manage IRC connections, receive messages and send commands. - - In order to enable the module, add the following lines to your qmake project (.pro) file: - \code - CONFIG += communi - COMMUNI += core - \endcode - - This sets up the necessary include paths and linker rules in order to use the module. - */ - -/*! - \defgroup models IrcModel - \brief Model classes to keep track of queries, channels and users. - - In order to enable the module, add the following lines to your qmake project (.pro) file: - \code - CONFIG += communi - COMMUNI += core model - \endcode - - This sets up the necessary include paths and linker rules in order to use the module. - - \note IrcModel depends on \ref core "IrcCore" - */ - -/*! - \defgroup util IrcUtil - \brief Miscellaneous utility classes for common IRC client related needs. - - In order to enable the module, add the following lines to your qmake project (.pro) file: - \code - CONFIG += communi - COMMUNI += core model util - \endcode - - This sets up the necessary include paths and linker rules in order to use the module. - - \note IrcUtil depends on \ref core "IrcCore" and \ref models "IrcModel" - */ diff --git a/libcommuni/doc/qml.dox b/libcommuni/doc/qml.dox deleted file mode 100644 index da46191..0000000 --- a/libcommuni/doc/qml.dox +++ /dev/null @@ -1,160 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*! - \page qml QML compatibility - - Communi strives for full QML support. The property-based APIs have been - designed QML compatibility in mind. Almost all the types can be registered - to QML and used as is. - - A ready-made QML plugin is also provided for convenience. The plugin does - QML type registration and is made available via the following import: - - \code - import Communi 3.0 - \endcode - - \section qml-type-registration Type registration - - The following snippet illustrates how the Communi QML plugin does the type - registration. The same can be done manually in application code to avoid - the need of deploying the Communi QML plugin. - - \snippet src/imports/qml2/plugin.cpp qml-register-types - - \section qml-connecting-to-irc Connecting to IRC - - In order to connect to IRC in QML, declare an IrcConnection instance, - set the desired properties, and call \ref IrcConnection::open() - "connection.open()". - - \code - IrcConnection { - id: freenode - host: "irc.freenode.net" - userName: "communi" - nickName: "Communi" + Math.round(Math.random() * 9999) - realName: "Communi QML example" - } - \endcode - - \section qml-sending-commands Sending commands - - Even though the IrcCommand::createXxx() methods are static, QML does not - provide a way to call them without an IrcCommand instance. Thus, in order - to create and send commands, declare an instance of IrcCommand, call any - createXxx() method to create a command, and finally send it via - IrcCommand::sendCommand(). - - \code - IrcCommand { id: command } - - IrcConnection { - onConnected: { - var cmd = command.createJoin(channel) - sendCommand(cmd) - } - } - \endcode - - \section qml-channels-and-queries Channels and queries - - In order to keep track of channels and queries, declare an instance of - IrcBufferModel. Notice that it can be used directly as a data model for - QML types such as ListView and Repeater. - - \code - IrcBufferModel { - id: bufferModel - connection: freenode - } - \endcode - - IrcBufferModel creates channel and query buffers automatically when - the client joins channels and receives private messages, respectively. - - A typical IRC client has a special server buffer for messages that - are not targeted to any specific channel or query. This can be easily - achieved by declaring an instance of IrcBuffer and forwarding the - messages ignored by IrcBufferModel to it. - - \code - IrcBuffer { - id: serverBuffer - name: freenode.displayName - Component.onCompleted: bufferModel.add(serverBuffer) - } - - IrcBufferModel { - id: bufferModel - connection: freenode - onMessageIgnored: serverBuffer.receiveMessage(message) - } - \endcode - - \section qml-channel-users Channel users - - In order to keep track of channel users, create an instance of IrcUserModel. - It can be also used directly as a data model for QML types such as ListView - and Repeater. - - \code - IrcUserModel { - id: userModel - channel: currentBuffer.toChannel() - } - \endcode - - \section qml-parsing-user-commands Parsing user commands - - IrcCommandParser helps with parsing commands from user input. In order to - take it in use, declare an instance of IrcCommandParser and introduce the - desired commands. - - Notice that commands are often context sensitive. While some command may - accept an optional parameter that is filled up with the current target - (channel/query) name when absent, another command may always inject the - current target name as a certain parameter. Therefore IrcCommandParser - must be kept up-to-date with the current target and the list of channels. - - \code - IrcCommandParser { - id: parser - triggers: ["/"] - target: currentBuffer.title - channels: bufferModel.channels - Component.onCompleted: { - parser.addCommand(IrcCommand.Join, "JOIN <#channel> ()"); - parser.addCommand(IrcCommand.Part, "PART (<#channel>) ()"); - parser.addCommand(IrcCommand.Kick, "KICK (<#channel>) ()"); - parser.addCommand(IrcCommand.CtcpAction, "ME [target] "); - } - } - \endcode - */ diff --git a/libcommuni/doc/qmlbot.dox b/libcommuni/doc/qmlbot.dox deleted file mode 100644 index 13d76ec..0000000 --- a/libcommuni/doc/qmlbot.dox +++ /dev/null @@ -1,71 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*! - \page qmlbot QML bot example - - The QML bot example is a simplified version of the \ref bot "bot example", - written in QML. See the \ref qml article for more QML specific details. - - \image html qmlbot.png "The QML bot example in action" - - The following snippet illustrates how IrcConnection is prepared and opened, - and how a command is queued to automatically join a channel when connected. - - \snippet qmlbot/qml/main.qml connection - - The example utilizes IrcCommandParser for parsing commands from messages - received from other clients. In order to take the parser in use, the supported - commands must be teached, as illustrated below. Some of the commands are context - sensitive, and the parser must be therefore kept aware of the list of channels - the bot is on. This is easily achieved by binding the IrcCommandParser::channels - property to the value of the IrcBufferModel::channels property. Furthermore, like - a typical IRC bot, the commands are triggered using a slightly different syntax in - queries and channels. - - \snippet qmlbot/qml/main.qml parser - - The bot listens to incoming messages via \ref IrcConnection::messageReceived(). - The current target is chosen based on whether the incoming message is a channel - or a private message. Each message content is parsed for commands that were - taught earlier. - - \snippet qmlbot/qml/main.qml receive - - Files: - \li \ref examples/qmlbot/main.cpp - \li \ref examples/qmlbot/qml/main.qml - - \file examples/qmlbot/main.cpp - \brief \ref qmlbot - \include examples/qmlbot/main.cpp - - \file examples/qmlbot/qml/main.qml - \brief \ref qmlbot - \include examples/qmlbot/qml/main.qml - */ diff --git a/libcommuni/doc/qmlbot.png b/libcommuni/doc/qmlbot.png deleted file mode 100644 index 6d6c87f..0000000 Binary files a/libcommuni/doc/qmlbot.png and /dev/null differ diff --git a/libcommuni/doc/quick.dox b/libcommuni/doc/quick.dox deleted file mode 100644 index 347854e..0000000 --- a/libcommuni/doc/quick.dox +++ /dev/null @@ -1,91 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*! - \page quick Qt Quick example - - The example illustrates how to create a simple GUI client using %Qt Quick. - - \image html quick.png "The Qt Quick example in action" - - If you're curious what the example does behind the scenes, try setting an - environment variable \c IRC_DEBUG=1 in order to enable verbose debug output - as explained in \ref debugging. - - Files: - \li \ref examples/quick/main.cpp - \li \ref examples/quick/qml/main.qml - \li \ref examples/quick/qml/BufferListView.qml - \li \ref examples/quick/qml/ChatPage.qml - \li \ref examples/quick/qml/ConnectPage.qml - \li \ref examples/quick/qml/MessageFormatter.qml - \li \ref examples/quick/qml/TextBrowser.qml - \li \ref examples/quick/qml/TextEntry.qml - \li \ref examples/quick/qml/TopicLabel.qml - \li \ref examples/quick/qml/UserListView.qml - - \file examples/quick/main.cpp - \brief \ref quick - \include examples/quick/main.cpp - - \file examples/quick/qml/main.qml - \brief \ref quick - \include examples/quick/qml/main.qml - - \file examples/quick/qml/BufferListView.qml - \brief \ref quick - \include examples/quick/qml/BufferListView.qml - - \file examples/quick/qml/ChatPage.qml - \brief \ref quick - \include examples/quick/qml/ChatPage.qml - - \file examples/quick/qml/ConnectPage.qml - \brief \ref quick - \include examples/quick/qml/ConnectPage.qml - - \file examples/quick/qml/MessageFormatter.qml - \brief \ref quick - \include examples/quick/qml/MessageFormatter.qml - - \file examples/quick/qml/TextBrowser.qml - \brief \ref quick - \include examples/quick/qml/TextBrowser.qml - - \file examples/quick/qml/TextEntry.qml - \brief \ref quick - \include examples/quick/qml/TextEntry.qml - - \file examples/quick/qml/TopicLabel.qml - \brief \ref quick - \include examples/quick/qml/TopicLabel.qml - - \file examples/quick/qml/UserListView.qml - \brief \ref quick - \include examples/quick/qml/UserListView.qml - */ diff --git a/libcommuni/doc/quick.png b/libcommuni/doc/quick.png deleted file mode 100644 index c3d3cc7..0000000 Binary files a/libcommuni/doc/quick.png and /dev/null differ diff --git a/libcommuni/doc/usage.dox b/libcommuni/doc/usage.dox deleted file mode 100644 index 669bf94..0000000 --- a/libcommuni/doc/usage.dox +++ /dev/null @@ -1,81 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*! - \page usage Using Communi - - \section using-as-a-library Using as a library - - In order to use Communi as a library, build and install Communi using the standard mantra: - \code - $ qmake - $ make - $ sudo make install - \endcode - - This integrates Communi with qmake from the corresponding %Qt installation. To take Communi - in use in your application, add the following lines to your qmake project (.pro) file: - \code - CONFIG += communi - COMMUNI += core model util - \endcode - - This sets up the necessary include paths and linker rules in order to use the library. - Notice that the needed Communi modules can be controlled via - the \c COMMUNI qmake variable. The above example enables all available - modules. - - \section buiding-into-application Building into application - - In order to embed the whole Communi to an application, add the following line to your - qmake project (.pro) file: - \code - include(path/to/libcommuni/src/src.pri) - \endcode - - Alternatively, only specific module(s) can be included, for example: - \code - include(path/to/libcommuni/src/core/core.pri) - include(path/to/libcommuni/src/util/util.pri) - \endcode - - This sets up the necessary include paths, and builds Communi sources into the application - for convenient deployment on systems that do not have Communi installed. This option is - also convenient when adding Communi as a Git submodule to your project tree. - - \section namespace-support Namespace support - - The Communi source code can be compiled into a namespace to for example - avoid symbol conflicts. In order to embed a namespaced Communi to an - application, add the following lines to your qmake project (.pro) file: - - \code - DEFINES += IRC_NAMESPACE=Communi - include(path/to/libcommuni/src/src.pri) - \endcode - */ diff --git a/libcommuni/examples/bot/bot.pro b/libcommuni/examples/bot/bot.pro deleted file mode 100644 index 1f4f434..0000000 --- a/libcommuni/examples/bot/bot.pro +++ /dev/null @@ -1,17 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = app -TARGET = bot -DEPENDPATH += . -INCLUDEPATH += . -CONFIG += console -CONFIG -= app_bundle -QT = core network - -# Input -HEADERS += ircbot.h -SOURCES += ircbot.cpp main.cpp - -include(../examples.pri) diff --git a/libcommuni/examples/bot/ircbot.cpp b/libcommuni/examples/bot/ircbot.cpp deleted file mode 100644 index 1891e62..0000000 --- a/libcommuni/examples/bot/ircbot.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircbot.h" -#include -#include -#include -#include - -IrcBot::IrcBot(QObject* parent) : IrcConnection(parent) -{ -//! [messages] - connect(this, SIGNAL(privateMessageReceived(IrcPrivateMessage*)), this, SLOT(processMessage(IrcPrivateMessage*))); -//! [messages] - -//! [commands] - parser.addCommand(IrcCommand::CtcpAction, "ACT [target] "); - parser.addCommand(IrcCommand::Custom, "HELP ()"); - parser.addCommand(IrcCommand::Nick, "NICK "); - parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); - parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); - parser.addCommand(IrcCommand::Quit, "QUIT ()"); - parser.addCommand(IrcCommand::Message, "SAY [target] "); -//! [commands] - - bufferModel.setConnection(this); -//! [channels] - connect(&bufferModel, SIGNAL(channelsChanged(QStringList)), &parser, SLOT(setChannels(QStringList))); -//! [channels] -} - -void IrcBot::join(QString channel) -{ - sendCommand(IrcCommand::createJoin(channel)); -} - -//![receive] -void IrcBot::processMessage(IrcPrivateMessage* message) -{ - if (message->isPrivate()) { - // private message: reply to the message sender - // => triggers: "! " and " " - parser.setTarget(message->nick()); - parser.setTriggers(QStringList() << "!" << ""); - } else { - // channel message: reply to the target channel - // => triggers: "! " and "bot: " - parser.setTarget(message->target()); - parser.setTriggers(QStringList() << "!" << nickName().append(":")); - } - - IrcCommand* cmd = parser.parse(message->content()); - if (cmd) { - if (cmd->type() == IrcCommand::Custom && cmd->parameters().value(0) == "HELP") { - help(cmd->parameters().mid(1)); - } else { - sendCommand(cmd); - - if (cmd->type() == IrcCommand::Quit) { - connect(this, SIGNAL(disconnected()), qApp, SLOT(quit())); - QTimer::singleShot(1000, qApp, SLOT(quit())); - } - } - } -} -//![receive] - -void IrcBot::help(QStringList commands) -{ - if (commands.isEmpty()) - commands = parser.commands(); - - QString target = parser.target(); - foreach (const QString& command, commands) { - QString syntax = parser.syntax(command); - sendCommand(IrcCommand::createMessage(target, syntax)); - } -} diff --git a/libcommuni/examples/bot/ircbot.h b/libcommuni/examples/bot/ircbot.h deleted file mode 100644 index 1a88a01..0000000 --- a/libcommuni/examples/bot/ircbot.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#ifndef IRCBOT_H -#define IRCBOT_H - -#include -#include -#include - -class IrcBot : public IrcConnection -{ - Q_OBJECT - -public: - IrcBot(QObject* parent = 0); - -public slots: - void join(QString channel); - -private slots: - void processMessage(IrcPrivateMessage* message); - -private: - void help(QStringList commands); - - IrcCommandParser parser; - IrcBufferModel bufferModel; -}; - -#endif // IRCBOT_H diff --git a/libcommuni/examples/bot/main.cpp b/libcommuni/examples/bot/main.cpp deleted file mode 100644 index 526f776..0000000 --- a/libcommuni/examples/bot/main.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include -#include "ircbot.h" - -int main(int argc, char* argv[]) -{ - QCoreApplication app(argc, argv); - - // enable debug output - qputenv("IRC_DEBUG", "1"); - qsrand(QTime::currentTime().msec()); - - IrcBot bot; - bot.setHost("irc.freenode.net"); - bot.setUserName("communi"); - bot.setNickName("Bot" + QString::number(qrand() % 9999)); - bot.setRealName("Communi " + Irc::version() + " example bot"); - - bool joined = false; - QStringList args = app.arguments(); - for (int i = 0; i < args.count(); ++i) { - QString arg = args.at(i); - if (arg == "-help") { - qDebug() << "Usage:" << argv[0] << "(-host ) (-port ) (-ssl) (-nick ) (-user ) (-password ) (-channel )"; - return 0; - } else if (arg == "-port") { - bool ok = false; - int port = args.value(++i).toInt(&ok); - if (ok) - bot.setPort(port); - } else if (arg == "-ssl") { - bot.setSecure(true); - } else if (arg == "-host") { - bot.setHost(args.value(++i)); - } else if (arg == "-user") { - bot.setUserName(args.value(++i)); - } else if (arg == "-password") { - bot.setPassword(args.value(++i)); - } else if (arg == "-nick") { - bot.setNickName(args.value(++i)); - } else if (arg == "-channel") { - bot.join(args.value(++i)); - joined = true; - } - } - if (!joined) - bot.join("#communi"); - - bot.open(); - return app.exec(); -} diff --git a/libcommuni/examples/client/client.pro b/libcommuni/examples/client/client.pro deleted file mode 100644 index 5e91b12..0000000 --- a/libcommuni/examples/client/client.pro +++ /dev/null @@ -1,16 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = app -TARGET = client -DEPENDPATH += . -INCLUDEPATH += . -QT = core network gui -greaterThan(QT_MAJOR_VERSION, 4):QT += widgets - -# Input -HEADERS += ircclient.h ircmessageformatter.h -SOURCES += ircclient.cpp ircmessageformatter.cpp main.cpp - -include(../examples.pri) diff --git a/libcommuni/examples/client/ircclient.cpp b/libcommuni/examples/client/ircclient.cpp deleted file mode 100644 index c33043b..0000000 --- a/libcommuni/examples/client/ircclient.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircclient.h" -#include "ircmessageformatter.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static const char* CHANNEL = "#communi"; -static const char* SERVER = "irc.freenode.net"; - -IrcClient::IrcClient(QWidget* parent) : QSplitter(parent) -{ - createParser(); - createConnection(); - createCompleter(); - createUserList(); - createLayout(); - createBufferList(); - - // queue a command to automatically join the channel when connected - connection->sendCommand(IrcCommand::createJoin(CHANNEL)); - connection->open(); - - textEdit->append(IrcMessageFormatter::formatMessage(tr("! Welcome to the Communi %1 example client.").arg(IRC_VERSION_STR))); - textEdit->append(IrcMessageFormatter::formatMessage(tr("! This example connects %1 and joins %2.").arg(SERVER, CHANNEL))); - textEdit->append(IrcMessageFormatter::formatMessage(tr("! PS. Available commands: JOIN, ME, NICK, PART"))); -} - -IrcClient::~IrcClient() -{ - if (connection->isActive()) { - connection->quit(connection->realName()); - connection->close(); - } -} - -void IrcClient::onConnected() -{ - textEdit->append(IrcMessageFormatter::formatMessage("! Connected to %1.").arg(SERVER)); - textEdit->append(IrcMessageFormatter::formatMessage("! Joining %1...").arg(CHANNEL)); -} - -void IrcClient::onConnecting() -{ - textEdit->append(IrcMessageFormatter::formatMessage("! Connecting %1...").arg(SERVER)); -} - -void IrcClient::onDisconnected() -{ - textEdit->append(IrcMessageFormatter::formatMessage("! Disconnected from %1.").arg(SERVER)); -} - -void IrcClient::onTextEdited() -{ - // clear the possible error indication - lineEdit->setStyleSheet(QString()); -} - -void IrcClient::onTextEntered() -{ - QString input = lineEdit->text(); - IrcCommand* command = parser->parse(input); - if (command) { - connection->sendCommand(command); - - // echo own messages (servers do not send our own messages back) - if (command->type() == IrcCommand::Message || command->type() == IrcCommand::CtcpAction) { - IrcMessage* msg = command->toMessage(connection->nickName(), connection); - receiveMessage(msg); - delete msg; - } - - lineEdit->clear(); - } else if (input.length() > 1) { - QString error; - QString command = lineEdit->text().mid(1).split(" ", QString::SkipEmptyParts).value(0).toUpper(); - if (parser->commands().contains(command)) - error = tr("[ERROR] Syntax: %1").arg(parser->syntax(command).replace("<", "<").replace(">", ">")); - else - error = tr("[ERROR] Unknown command: %1").arg(command); - textEdit->append(IrcMessageFormatter::formatMessage(error)); - lineEdit->setStyleSheet("background: salmon"); - } -} - -void IrcClient::onCompletion() -{ - completer->complete(lineEdit->text(), lineEdit->cursorPosition()); -} - -void IrcClient::onCompleted(const QString& text, int cursor) -{ - lineEdit->setText(text); - lineEdit->setCursorPosition(cursor); -} - -void IrcClient::onBufferAdded(IrcBuffer* buffer) -{ - // joined a buffer - start listening to buffer specific messages - connect(buffer, SIGNAL(messageReceived(IrcMessage*)), this, SLOT(receiveMessage(IrcMessage*))); - - // create a document for storing the buffer specific messages - QTextDocument* document = new QTextDocument(buffer); - documents.insert(buffer, document); - - // create a sorted model for buffer users - IrcUserModel* userModel = new IrcUserModel(buffer); - userModel->setSortMethod(Irc::SortByTitle); - userModels.insert(buffer, userModel); - - // activate the new buffer - int idx = bufferModel->buffers().indexOf(buffer); - if (idx != -1) - bufferList->setCurrentIndex(bufferModel->index(idx)); -} - -void IrcClient::onBufferRemoved(IrcBuffer* buffer) -{ - // the buffer specific models and documents are no longer needed - delete userModels.take(buffer); - delete documents.take(buffer); -} - -void IrcClient::onBufferActivated(const QModelIndex& index) -{ - IrcBuffer* buffer = index.data(Irc::BufferRole).value(); - - // document, user list and nick completion for the current buffer - textEdit->setDocument(documents.value(buffer)); - textEdit->verticalScrollBar()->triggerAction(QScrollBar::SliderToMaximum); - userList->setModel(userModels.value(buffer)); - completer->setBuffer(buffer); - - // keep the command parser aware of the context - if (buffer) - parser->setTarget(buffer->title()); -} - -void IrcClient::onUserActivated(const QModelIndex& index) -{ - IrcUser* user = index.data(Irc::UserRole).value(); - - if (user) { - IrcBuffer* buffer = bufferModel->add(user->name()); - - // activate the new query - int idx = bufferModel->buffers().indexOf(buffer); - if (idx != -1) - bufferList->setCurrentIndex(bufferModel->index(idx)); - } -} - -static void appendHtml(QTextDocument* document, const QString& html) -{ - QTextCursor cursor(document); - cursor.beginEditBlock(); - cursor.movePosition(QTextCursor::End); - if (!document->isEmpty()) - cursor.insertBlock(); - cursor.insertHtml(html); - cursor.endEditBlock(); -} - -void IrcClient::receiveMessage(IrcMessage* message) -{ - IrcBuffer* buffer = qobject_cast(sender()); - if (!buffer) - buffer = bufferList->currentIndex().data(Irc::BufferRole).value(); - - QTextDocument* document = documents.value(buffer); - if (document) { - QString html = IrcMessageFormatter::formatMessage(message); - if (!html.isEmpty()) { - if (document == textEdit->document()) - textEdit->append(html); - else - appendHtml(document, html); - } - } -} - -void IrcClient::createLayout() -{ - setWindowTitle(tr("Communi %1 example client").arg(IRC_VERSION_STR)); - - // a read-only text editor for showing the messages - textEdit = new QTextEdit(this); - textEdit->setReadOnly(true); - - // a line editor for entering commands - lineEdit = new QLineEdit(this); - lineEdit->setAttribute(Qt::WA_MacShowFocusRect, false); - textEdit->setFocusProxy(lineEdit); - connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(onTextEntered())); - connect(lineEdit, SIGNAL(textEdited(QString)), this, SLOT(onTextEdited())); - - // the rest is just setting up the UI layout... - QSplitter* splitter = new QSplitter(this); - splitter->setHandleWidth(1); - splitter->addWidget(textEdit); - splitter->addWidget(userList); - splitter->setStretchFactor(0, 5); - splitter->setStretchFactor(1, 1); - - QWidget* container = new QWidget(this); - QVBoxLayout* layout = new QVBoxLayout(container); - layout->setSpacing(0); - layout->setMargin(0); - layout->addWidget(splitter); - layout->addWidget(lineEdit); - - addWidget(container); - - setHandleWidth(1); -} - -void IrcClient::createCompleter() -{ - // nick name completion - completer = new IrcCompleter(this); - completer->setParser(parser); - connect(completer, SIGNAL(completed(QString,int)), this, SLOT(onCompleted(QString,int))); - - QShortcut* shortcut = new QShortcut(Qt::Key_Tab, this); - connect(shortcut, SIGNAL(activated()), this, SLOT(onCompletion())); -} - -void IrcClient::createParser() -{ - // create a command parser and teach it some commands. notice also - // that we must keep the command parser aware of the context in - // createUi() and onBufferActivated() - - parser = new IrcCommandParser(this); - parser->setTolerant(true); - parser->setTriggers(QStringList("/")); - parser->addCommand(IrcCommand::Join, "JOIN <#channel> ()"); - parser->addCommand(IrcCommand::CtcpAction, "ME [target] "); - parser->addCommand(IrcCommand::Mode, "MODE () () ()"); - parser->addCommand(IrcCommand::Nick, "NICK "); - parser->addCommand(IrcCommand::Part, "PART (<#channel>) ()"); -} - -void IrcClient::createUserList() -{ - // a list of channel users - userList = new QListView(this); - userList->setFocusPolicy(Qt::NoFocus); - - // open a private query when double clicking a user - connect(userList, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onUserActivated(QModelIndex))); -} - -void IrcClient::createBufferList() -{ - bufferModel = new IrcBufferModel(connection); - connect(bufferModel, SIGNAL(added(IrcBuffer*)), this, SLOT(onBufferAdded(IrcBuffer*))); - connect(bufferModel, SIGNAL(removed(IrcBuffer*)), this, SLOT(onBufferRemoved(IrcBuffer*))); - - bufferList = new QListView(this); - bufferList->setFocusPolicy(Qt::NoFocus); - bufferList->setModel(bufferModel); - - // keep the command parser aware of the context - connect(bufferModel, SIGNAL(channelsChanged(QStringList)), parser, SLOT(setChannels(QStringList))); - - // keep track of the current buffer, see also onBufferActivated() - connect(bufferList->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(onBufferActivated(QModelIndex))); - - // create a server buffer for non-targeted messages... - IrcBuffer* serverBuffer = bufferModel->add(connection->host()); - - // ...and connect it to IrcBufferModel::messageIgnored() - connect(bufferModel, SIGNAL(messageIgnored(IrcMessage*)), serverBuffer, SLOT(receiveMessage(IrcMessage*))); - - insertWidget(0, bufferList); - - setStretchFactor(0, 1); - setStretchFactor(1, 3); -} - -void IrcClient::createConnection() -{ - connection = new IrcConnection(this); - connect(connection, SIGNAL(connected()), this, SLOT(onConnected())); - connect(connection, SIGNAL(connecting()), this, SLOT(onConnecting())); - connect(connection, SIGNAL(disconnected()), this, SLOT(onDisconnected())); - - qsrand(QTime::currentTime().msec()); - - connection->setHost(SERVER); - connection->setUserName("communi"); - connection->setNickName(tr("Client%1").arg(qrand() % 9999)); - connection->setRealName(tr("Communi %1 example client").arg(IRC_VERSION_STR)); -} diff --git a/libcommuni/examples/client/ircclient.h b/libcommuni/examples/client/ircclient.h deleted file mode 100644 index 9d6ee3c..0000000 --- a/libcommuni/examples/client/ircclient.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#ifndef IRCCLIENT_H -#define IRCCLIENT_H - -#include -#include - -class IrcBuffer; -class IrcMessage; -class IrcUserModel; -class IrcCompleter; -class IrcConnection; -class IrcBufferModel; -class IrcCommandParser; - -QT_FORWARD_DECLARE_CLASS(QLineEdit) -QT_FORWARD_DECLARE_CLASS(QListView) -QT_FORWARD_DECLARE_CLASS(QTextEdit) -QT_FORWARD_DECLARE_CLASS(QModelIndex) -QT_FORWARD_DECLARE_CLASS(QTextDocument) - -class IrcClient : public QSplitter -{ - Q_OBJECT - -public: - IrcClient(QWidget* parent = 0); - ~IrcClient(); - -private slots: - void onConnected(); - void onConnecting(); - void onDisconnected(); - - void onTextEdited(); - void onTextEntered(); - - void onCompletion(); - void onCompleted(const QString& text, int cursor); - - void onBufferAdded(IrcBuffer* buffer); - void onBufferRemoved(IrcBuffer* buffer); - - void onBufferActivated(const QModelIndex& index); - void onUserActivated(const QModelIndex& index); - - void receiveMessage(IrcMessage* message); - -private: - void createLayout(); - void createCompleter(); - void createParser(); - void createUserList(); - void createBufferList(); - void createConnection(); - - QLineEdit* lineEdit; - QTextEdit* textEdit; - QListView* userList; - QListView* bufferList; - - IrcCompleter* completer; - IrcCommandParser* parser; - IrcConnection* connection; - IrcBufferModel* bufferModel; - QHash userModels; - QHash documents; -}; - -#endif // IRCCLIENT_H diff --git a/libcommuni/examples/client/ircmessageformatter.cpp b/libcommuni/examples/client/ircmessageformatter.cpp deleted file mode 100644 index 6537664..0000000 --- a/libcommuni/examples/client/ircmessageformatter.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircmessageformatter.h" - -#include -#include -#include -#include - -QString IrcMessageFormatter::formatMessage(IrcMessage* message) -{ - QString formatted; - switch (message->type()) { - case IrcMessage::Join: - formatted = formatJoinMessage(static_cast(message)); - break; - case IrcMessage::Mode: - formatted = formatModeMessage(static_cast(message)); - break; - case IrcMessage::Names: - formatted = formatNamesMessage(static_cast(message)); - break; - case IrcMessage::Nick: - formatted = formatNickMessage(static_cast(message)); - break; - case IrcMessage::Part: - formatted = formatPartMessage(static_cast(message)); - break; - case IrcMessage::Private: - formatted = formatPrivateMessage(static_cast(message)); - break; - case IrcMessage::Quit: - formatted = formatQuitMessage(static_cast(message)); - break; - default: - break; - } - return formatMessage(formatted); -} - -QString IrcMessageFormatter::formatMessage(const QString& message) -{ - if (!message.isEmpty()) { - QString formatted = QObject::tr("[%1] %2").arg(QTime::currentTime().toString(), message); - if (message.startsWith("!")) - formatted = QObject::tr("%1").arg(formatted); - else if (message.startsWith("*")) - formatted = QObject::tr("%1").arg(formatted); - else if (message.startsWith("[")) - formatted = QObject::tr("%1").arg(formatted); - return formatted; - } - return QString(); -} - -QString IrcMessageFormatter::formatJoinMessage(IrcJoinMessage* message) -{ - if (message->flags() & IrcMessage::Own) - return QObject::tr("! You have joined %1 as %2").arg(message->channel(), message->nick()); - else - return QObject::tr("! %1 has joined %2").arg(message->nick(), message->channel()); -} - -QString IrcMessageFormatter::formatModeMessage(IrcModeMessage* message) -{ - QString args = message->arguments().join(" "); - if (message->isReply()) - return QObject::tr("! %1 mode is %2 %3").arg(message->target(), message->mode(), args); - else - return QObject::tr("! %1 sets mode %2 %3 %4").arg(message->nick(), message->target(), message->mode(), args); -} - -QString IrcMessageFormatter::formatNamesMessage(IrcNamesMessage* message) -{ - return QObject::tr("! %1 has %2 users").arg(message->channel()).arg(message->names().count()); -} - -QString IrcMessageFormatter::formatNickMessage(IrcNickMessage* message) -{ - return QObject::tr("! %1 has changed nick to %2").arg(message->oldNick(), message->newNick()); -} - -QString IrcMessageFormatter::formatPartMessage(IrcPartMessage* message) -{ - if (message->reason().isEmpty()) - return QObject::tr("! %1 has left %2").arg(message->nick(), message->channel()); - else - return QObject::tr("! %1 has left %2 (%3)").arg(message->nick(), message->channel(), message->reason()); -} - -QString IrcMessageFormatter::formatPrivateMessage(IrcPrivateMessage* message) -{ - const QString content = IrcTextFormat().toHtml(message->content()); - if (message->isAction()) - return QObject::tr("* %1 %2").arg(message->nick(), content); - else - return QObject::tr("<%1> %2").arg(message->nick(),content); -} - -QString IrcMessageFormatter::formatQuitMessage(IrcQuitMessage* message) -{ - if (message->reason().isEmpty()) - return QObject::tr("! %1 has quit").arg(message->nick()); - else - return QObject::tr("! %1 has quit (%2)").arg(message->nick(), message->reason()); -} diff --git a/libcommuni/examples/client/ircmessageformatter.h b/libcommuni/examples/client/ircmessageformatter.h deleted file mode 100644 index f91be50..0000000 --- a/libcommuni/examples/client/ircmessageformatter.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#ifndef IRCMESSAGEFORMATTER_H -#define IRCMESSAGEFORMATTER_H - -#include - -class IrcMessageFormatter -{ -public: - static QString formatMessage(IrcMessage* message); - static QString formatMessage(const QString& message); - -private: - static QString formatJoinMessage(IrcJoinMessage* message); - static QString formatModeMessage(IrcModeMessage* message); - static QString formatNamesMessage(IrcNamesMessage* message); - static QString formatNickMessage(IrcNickMessage* message); - static QString formatPartMessage(IrcPartMessage* message); - static QString formatPrivateMessage(IrcPrivateMessage* message); - static QString formatQuitMessage(IrcQuitMessage* message); -}; - -#endif // IRCMESSAGEFORMATTER_H diff --git a/libcommuni/examples/client/main.cpp b/libcommuni/examples/client/main.cpp deleted file mode 100644 index 951ee91..0000000 --- a/libcommuni/examples/client/main.cpp +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include -#include "ircclient.h" - -int main(int argc, char* argv[]) -{ - QApplication app(argc, argv); - IrcClient client; - client.resize(800, 480); - client.show(); - return app.exec(); -} diff --git a/libcommuni/examples/examples.pri b/libcommuni/examples/examples.pri deleted file mode 100644 index bc9b138..0000000 --- a/libcommuni/examples/examples.pri +++ /dev/null @@ -1,24 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -!verbose:CONFIG += silent - -CONFIG(debug, debug|release) { - OBJECTS_DIR = debug - MOC_DIR = debug - RCC_DIR = debug - UI_DIR = debug -} else { - OBJECTS_DIR = release - MOC_DIR = release - RCC_DIR = release - UI_DIR = release -} - -developer { - include(../src/src.pri) -} else { - IRC_MODULES = IrcCore IrcModel IrcUtil - include(../src/module_deps.pri) -} diff --git a/libcommuni/examples/examples.pro b/libcommuni/examples/examples.pro deleted file mode 100644 index 48d9906..0000000 --- a/libcommuni/examples/examples.pro +++ /dev/null @@ -1,13 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = subdirs -SUBDIRS += bot client minimal - -!lessThan(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 1) { - qtHaveModule(qml):SUBDIRS += qmlbot -} -!lessThan(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 2) { - qtHaveModule(quick):SUBDIRS += quick -} diff --git a/libcommuni/examples/minimal/main.cpp b/libcommuni/examples/minimal/main.cpp deleted file mode 100644 index 790280e..0000000 --- a/libcommuni/examples/minimal/main.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include -#include -#include -#include - -#ifndef IRC_DOXYGEN -int main(int argc, char* argv[]) -{ - QCoreApplication app(argc, argv); - - // enable debug output - //qputenv("IRC_DEBUG", "1"); - qsrand(QTime::currentTime().msec()); - -//! [minimal] - IrcConnection connection("irc.rbx.fr.euirc.net"); - connection.setUserName("communi"); - connection.setNickName(QString("Minimal%1").arg(qrand() % 9999)); - connection.setRealName(QString("Communi %1 minimal example").arg(Irc::version())); - connection.sendCommand(IrcCommand::createJoin("#clonk-tod")); - connection.sendCommand(IrcCommand::createMessage("#clonk-tod", "Hi, kthxbye!")); - connection.sendCommand(IrcCommand::createQuit()); - connection.open(); -//! [minimal] - - QObject::connect(&connection, SIGNAL(disconnected()), &app, SLOT(quit())); - return app.exec(); -} -#endif diff --git a/libcommuni/examples/minimal/minimal.pro b/libcommuni/examples/minimal/minimal.pro deleted file mode 100644 index 5dd8584..0000000 --- a/libcommuni/examples/minimal/minimal.pro +++ /dev/null @@ -1,16 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = app -TARGET = minimal -DEPENDPATH += . -INCLUDEPATH += . -CONFIG += console -CONFIG -= app_bundle -QT = core network - -# Input -SOURCES += main.cpp - -include(../examples.pri) diff --git a/libcommuni/examples/qmlbot/main.cpp b/libcommuni/examples/qmlbot/main.cpp deleted file mode 100644 index d74e909..0000000 --- a/libcommuni/examples/qmlbot/main.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include -#include - -int main(int argc, char* argv[]) -{ - QCoreApplication app(argc, argv); - - // enable debug output - qputenv("IRC_DEBUG", "1"); - - QQmlApplicationEngine engine(QUrl("qrc:/main.qml")); - return app.exec(); -} diff --git a/libcommuni/examples/qmlbot/qml/main.qml b/libcommuni/examples/qmlbot/qml/main.qml deleted file mode 100644 index 2dad458..0000000 --- a/libcommuni/examples/qmlbot/qml/main.qml +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQml 2.0 -import Communi 3.0 - -QtObject { - id: bot - - property string channel: "#communi" - - property Irc irc: Irc { id: irc } - property IrcCommand command: IrcCommand { id: command } - - property IrcBufferModel model: IrcBufferModel { - id: model - -//! [connection] - connection: IrcConnection { - id: connection - - host: "irc.freenode.net" - userName: "communi" - nickName: "QmlBot" + Math.round(Math.random() * 9999) - realName: qsTr("Communi %1 QML bot example").arg(irc.version()) - - Component.onCompleted: { - // queue a command to automatically join a channel when connected - sendCommand(command.createJoin(channel)) - open() - } -//! [connection] - -//! [receive] - onMessageReceived: { - if (message.type === IrcMessage.Private) { - // - in private, reply to the message sender - // - on channel, reply to the target channel - parser.target = message.private ? message.nick : message.target - - var command = parser.parse(message.content) - if (command) { - // send the command to the IRC server - sendCommand(command) - if (command.type === IrcCommand.Quit) { - // close the connection & quit the app when a !quit command was received - close() - Qt.quit() - } - } - } - } -//! [receive] - } - } - -//! [parser] - property IrcCommandParser parser: IrcCommandParser { - id: parser - - // keep the parser aware of the context - channels: model.channels - - // - on channel, respond to: "! " and "bot: " - // - in query, respond to: "! " and " " - triggers: connection.network.isChannel(target) ? ["!", connection.nickName + ":"] : ["!", ""] - - Component.onCompleted: { - // teach the bot some commands - parser.addCommand(IrcCommand.Nick, "NICK "); - parser.addCommand(IrcCommand.Join, "JOIN <#channel> ()"); - parser.addCommand(IrcCommand.Part, "PART (<#channel>) ()"); - parser.addCommand(IrcCommand.Quit, "QUIT ()"); - parser.addCommand(IrcCommand.Message, "SAY [target] "); - } - } -//! [parser] -} diff --git a/libcommuni/examples/qmlbot/qmlbot.pro b/libcommuni/examples/qmlbot/qmlbot.pro deleted file mode 100644 index 95c2961..0000000 --- a/libcommuni/examples/qmlbot/qmlbot.pro +++ /dev/null @@ -1,22 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = app -TARGET = qmlbot -DEPENDPATH += . -INCLUDEPATH += . -CONFIG += console -CONFIG -= app_bundle -QT = core network qml - -lessThan(QT_MAJOR_VERSION, 5)|lessThan(QT_MINOR_VERSION, 1) { - error(The QML2 based example requires Qt 5.1 or newer but Qt $$[QT_VERSION] was detected.) -} - -# Input -SOURCES += main.cpp -RESOURCES += qmlbot.qrc -OTHER_FILES += qml/main.qml - -include(../examples.pri) diff --git a/libcommuni/examples/qmlbot/qmlbot.qrc b/libcommuni/examples/qmlbot/qmlbot.qrc deleted file mode 100644 index 5f94096..0000000 --- a/libcommuni/examples/qmlbot/qmlbot.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - qml/main.qml - - diff --git a/libcommuni/examples/quick/main.cpp b/libcommuni/examples/quick/main.cpp deleted file mode 100644 index c503b98..0000000 --- a/libcommuni/examples/quick/main.cpp +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include -#include - -int main(int argc, char* argv[]) -{ - QGuiApplication app(argc, argv); - app.setOrganizationName("Commmuni"); - app.setApplicationName("QtQuick Example"); - QQmlApplicationEngine engine(QUrl("qrc:/main.qml")); - return app.exec(); -} diff --git a/libcommuni/examples/quick/qml/BufferListView.qml b/libcommuni/examples/quick/qml/BufferListView.qml deleted file mode 100644 index 3d277b6..0000000 --- a/libcommuni/examples/quick/qml/BufferListView.qml +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQuick 2.1 -import QtQuick.Controls 1.0 -import Communi 3.0 - -Rectangle { - id: background - - property alias bufferModel: listView.model - property IrcBuffer currentBuffer - - signal closed(IrcBuffer buffer) - - color: "#edf3fe" - - Rectangle { - id: frame - anchors.fill: parent - anchors.topMargin: -1 - color: "transparent" - border.color: "#aaa" - } - - Menu { - id: menu - MenuItem { - text: qsTr("Close") - shortcut: qsTr("Ctrl+W") - enabled: !!currentBuffer - onTriggered: closed(currentBuffer) - } - } - - ScrollView { - id: scrollView - - anchors.fill: parent - anchors.topMargin: -1 - - ListView { - id: listView - - delegate: Rectangle { - property bool first: index === 0 - property bool current: model.buffer === currentBuffer - anchors.left: parent ? parent.left : undefined - anchors.right: parent ? parent.right : undefined - anchors.margins: 1 - height: Math.max(21, label.implicitHeight + 5) - color: first ? "#ddd" : current ? "#b5d5ff" : "transparent" - Rectangle { - visible: first - width: parent.width - height: 1 - anchors.bottom: parent.bottom - anchors.fill: parent - anchors.leftMargin: -1 - anchors.rightMargin: -1 - color: "transparent" - border.color: "#aaa" - } - Label { - id: label - text: model.title - font.bold: first - anchors.margins: 2 - anchors.leftMargin: 6 - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - } - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton - onPressed: { - currentBuffer = model.buffer - if (mouse.button === Qt.RightButton) - menu.popup() - } - } - } - } - } -} diff --git a/libcommuni/examples/quick/qml/ChatPage.qml b/libcommuni/examples/quick/qml/ChatPage.qml deleted file mode 100644 index 474b950..0000000 --- a/libcommuni/examples/quick/qml/ChatPage.qml +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQuick 2.1 -import QtQuick.Layouts 1.0 -import QtQuick.Controls 1.0 -import QtQuick.Controls.Styles 1.0 -import Communi 3.0 - -Item { - id: page - - property IrcBuffer serverBuffer - property alias bufferModel: bufferListView.bufferModel - property alias currentBuffer: bufferListView.currentBuffer - property IrcChannel currentChannel: currentBuffer ? currentBuffer.toChannel() : null - - Connections { - target: bufferModel - onAdded: currentBuffer = buffer - onAboutToBeRemoved: { - var idx = bufferModel.indexOf(buffer) - currentBuffer = bufferModel.get(idx + 1) || bufferModel.get(Math.max(0, idx - 1)) - } - } - - SplitView { - anchors.fill: parent - - handleDelegate: Item { } - - BufferListView { - id: bufferListView - width: page.width / 6 - onClosed: { - if (buffer === serverBuffer) { - bufferModel.quit() - } else { - if (buffer.channel) - buffer.part(qsTr("Communi %1 QtQuick example").arg(irc.version())) - bufferModel.remove(buffer) - } - } - } - - Column { - Layout.fillWidth: true - - TopicLabel { - id: topicLabel - width: parent.width - visible: currentChannel - channel: currentChannel - } - - SplitView { - width: parent.width - height: parent.height - (currentChannel ? topicLabel.height : 0) - textEntry.height - - handleDelegate: Item { } - - Item { - id: stack - - width: 1; height: 1 - Layout.fillWidth: true - Layout.fillHeight: true - - Repeater { - anchors.fill: parent - model: bufferModel - delegate: TextBrowser { - anchors.fill: parent - buffer: model.buffer - visible: buffer == currentBuffer - } - } - } - - UserListView { - width: page.width / 6 - visible: currentChannel - channel: currentChannel - onQueried: currentBuffer = currentBuffer.model.add(user.name) - } - } - - TextEntry { - id: textEntry - width: parent.width - buffer: currentBuffer - enabled: currentBuffer - onMessageSent: currentBuffer.receiveMessage(message) - - Connections { - target: page - onCurrentBufferChanged: { - if (page.visible && currentBuffer) - textEntry.forceActiveFocus() - } - } - } - } - } -} diff --git a/libcommuni/examples/quick/qml/ConnectPage.qml b/libcommuni/examples/quick/qml/ConnectPage.qml deleted file mode 100644 index 8a7c296..0000000 --- a/libcommuni/examples/quick/qml/ConnectPage.qml +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQuick 2.1 -import QtQuick.Layouts 1.0 -import QtQuick.Controls 1.0 -import Qt.labs.settings 1.0 -import Communi 3.0 - -Item { - id: page - - property string host: hostField.text || hostField.placeholderText - property int port: portField.value - property bool secure: secureField.checked - property bool sasl: saslField.checked - property string nickName: nickNameField.text || nickNameField.placeholderText - property string realName: realNameField.text || realNameField.placeholderText - property string userName: userNameField.text || userNameField.placeholderText - property string password: passwordField.text - property string channel: channelField.text || channelField.placeholderText - - Settings { - id: settings - property alias host: hostField.text - property alias port: portField.value - property alias secure: secureField.checked - property alias sasl: saslField.checked - property alias nickName: nickNameField.text - property alias realName: realNameField.text - property alias userName: userNameField.text - property alias password: passwordField.text - property alias channel: channelField.text - } - - signal accepted() - signal rejected() - - implicitWidth: grid.implicitWidth + row.implicitWidth - implicitHeight: grid.implicitHeight + row.implicitHeight + 48 - - GridLayout { - id: grid - - width: page.width * 2 / 3 - anchors.centerIn: parent - anchors.verticalCenterOffset: -row.height + 12 - - columns: 2 - rowSpacing: 12 - columnSpacing: 12 - - Label { text: qsTr("Host:") } - TextField { - id: hostField - focus: true - Layout.fillWidth: true - placeholderText: "irc.freenode.net" - } - - Label { text: qsTr("Port:") } - RowLayout { - SpinBox { - id: portField - value: 6667 - minimumValue: 1024 - maximumValue: 65535 - Layout.fillWidth: true - } - CheckBox { - id: secureField - text: qsTr("SSL") - } - CheckBox { - id: saslField - text: qsTr("SASL") - } - } - - Label { text: qsTr("Nick name:") } - TextField { - id: nickNameField - Layout.fillWidth: true - placeholderText: "Quick" + Math.round(Math.random() * 9999) - } - - Label { text: qsTr("Real name:") } - TextField { - id: realNameField - Layout.fillWidth: true - placeholderText: qsTr("Communi %1 QtQuick example").arg(irc.version()) - } - - Label { text: qsTr("User name:") } - TextField { - id: userNameField - Layout.fillWidth: true - placeholderText: "communi" - } - - Label { text: qsTr("Password:") } - TextField { - id: passwordField - echoMode: TextInput.Password - Layout.fillWidth: true - } - - Label { text: qsTr("Channel:") } - TextField { - id: channelField - Layout.fillWidth: true - placeholderText: "#communi" - } - } - - Keys.onReturnPressed: { - if (okButton.enabled) - page.accepted() - } - - Keys.onEnterPressed: { - if (okButton.enabled) - page.accepted() - } - - Keys.onEscapePressed: { - if (cancelButton.enabled) - page.rejected() - } - - RowLayout { - id: row - - anchors.margins: 12 - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - - Item { Layout.fillWidth: true } - - Button { - id: okButton - text: qsTr("Ok") - enabled: page.visible - onClicked: page.accepted() - } - - Button { - id: cancelButton - text: qsTr("Cancel") - onClicked: page.rejected() - } - } -} diff --git a/libcommuni/examples/quick/qml/MessageFormatter.qml b/libcommuni/examples/quick/qml/MessageFormatter.qml deleted file mode 100644 index 754ca1c..0000000 --- a/libcommuni/examples/quick/qml/MessageFormatter.qml +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQuick 2.1 -import Communi 3.0 - -QtObject { - id: root - - property IrcTextFormat textFormat: IrcTextFormat { - id: textFormat - - palette.gray: "#606060" - palette.lightGray: "#808080" - - // http://ethanschoonover.com/solarized - palette.blue: "#268bd2" - palette.green: "#859900" - palette.red: "#dc322f" - palette.brown: "#cb4b16" - palette.purple: "#6c71c4" - palette.orange: "#cb4b16" - palette.yellow: "#b58900" - palette.lightGreen: "#859900" - palette.cyan: "#2aa198" - palette.lightCyan: "#2aa198" - palette.lightBlue: "#268bd2" - palette.pink: "#6c71c4" - } - - function formatMessage(message) { - var formatted - switch (message.type) { - case IrcMessage.Invite: formatted = formatInviteMessage(message); break - case IrcMessage.Join: formatted = formatJoinMessage(message); break - case IrcMessage.Kick: formatted = formatKickMessage(message); break - case IrcMessage.Mode: formatted = formatModeMessage(message); break - case IrcMessage.Names: formatted = formatNamesMessage(message); break - case IrcMessage.Nick: formatted = formatNickMessage(message); break - case IrcMessage.Notice: formatted = formatNoticeMessage(message); break - case IrcMessage.Numeric: formatted = formatNumericMessage(message); break - case IrcMessage.Part: formatted = formatPartMessage(message); break - case IrcMessage.Private: formatted = formatPrivateMessage(message); break - case IrcMessage.Quit: formatted = formatQuitMessage(message); break - case IrcMessage.Topic: formatted = formatTopicMessage(message); break - } - return formatText(formatted, message.timeStamp) - } - - function formatText(text, timeStamp) { - if (text) { - switch (text[0]) { - case '!': text = qsTr("%1").arg(text); break; - case '[': text = qsTr("%1").arg(text); break; - case '*': text = qsTr("%1").arg(text); break; - case '?': text = qsTr("%1").arg(text); break; - default: break; - } - - return qsTr("[%1] %2").arg(Qt.formatTime(timeStamp, "hh:mm:ss")).arg(text) - } - } - - function formatInviteMessage(message) { - var sender = formatName(message.nick) - return qsTr("! %1 invited to %3").arg(sender).arg(message.channel) - } - - function formatJoinMessage(message) { - var sender = formatName(message.nick) - return qsTr("! %1 joined %2").arg(sender).arg(message.channel) - } - - function formatKickMessage(message) { - var sender = formatName(message.nick) - var user = formatName(message.user) - if (message.reason.length) - return qsTr("! %1 kicked %2 (%3)").arg(sender).arg(user).arg(message.reason) - return qsTr("! %1 kicked %2").arg(sender).arg(user) - } - - function formatModeMessage(message) { - var sender = formatName(message.nick) - if (message.reply) - return qsTr("! %1 mode is %2 %3").arg(message.target).arg(message.mode).arg(message.argument) - return qsTr("! %1 sets mode %2 %3").arg(sender).arg(message.mode).arg(message.argument) - } - - function formatNamesMessage(message) { - return qsTr("! %1 has %2 users").arg(message.channel).arg(message.names.length) - } - - function formatNickMessage(message) { - var sender = formatName(message.nick) - var nick = formatName(message.newNick) - return qsTr("! %1 changed nick to %2").arg(sender).arg(nick) - } - - function formatNoticeMessage(message) { - var sender = formatName(message.nick) - var content = formatHtml(message.content) - return qsTr("[%1] %2").arg(sender).arg(content) - } - - function formatNumericMessage(message) { - switch (message.code) { - case Irc.RPL_TOPIC: - case Irc.RPL_TOPICWHOTIME: - case Irc.RPL_CHANNEL_URL: - case Irc.RPL_NAMREPLY: - case Irc.RPL_ENDOFNAMES: - return // ignore - default: - return qsTr("[%1] %2").arg(message.code).arg(message.parameters.slice(1).join(" ")) - } - } - - function formatPartMessage(message) { - var sender = formatName(message.nick) - if (message.reason.length) - return qsTr("! %1 parted %2 (%3)").arg(sender).arg(message.channel).arg(formatHtml(message.reason)) - return qsTr("! %1 parted %2").arg(sender).arg(message.channel) - } - - function formatPrivateMessage(message) { - var sender = formatName(message.nick) - var content = formatHtml(message.content) - if (message.action) - return qsTr("* %1 %2").arg(sender).arg(content) - if (message.request) - return qsTr("! %1 requested %2").arg(sender).arg(content.split(" ")[0].toLowerCase()) - return qsTr("<%1> %2").arg(sender).arg(content) - } - - function formatQuitMessage(message) { - var sender = formatName(message.nick) - if (message.reason.length) - return qsTr("! %1 has quit (%2)").arg(sender).arg(formatHtml(message.reason)) - return qsTr("! %1 has quit").arg(sender) - } - - function formatTopicMessage(message) { - var sender = formatName(message.nick) - var topic = formatHtml(message.topic) - var channel = message.channel - if (message.reply) - return qsTr("! %1 topic is \"%2\"").arg(channel).arg(topic) - return qsTr("! %1 sets topic \"%2\" on %3").arg(sender).arg(topic).arg(channel) - } - - function formatHtml(message) { - return textFormat.toHtml(message) - } - - function formatName(name) { - var color = hslToRgb((hashCode(name) % 359)/359, 0.5, 0.25) - var r = ("0" + Math.round(Math.abs(color[0])).toString(16)).substr(-2) - var g = ("0" + Math.round(Math.abs(color[1])).toString(16)).substr(-2) - var b = ("0" + Math.round(Math.abs(color[2])).toString(16)).substr(-2) - return qsTr("%2").arg(r+g+b).arg(name); - } - - function hashCode(str) { - var hash = 0; - if (str.length == 0) return hash; - for (var i = 0; i < str.length; i++) { - var chr = str.charCodeAt(i); - hash = ((hash<<5)-hash)+chr; - hash = hash & hash; // Convert to 32bit integer - } - return hash; - } - - /** - * Converts an HSL color value to RGB. Conversion formula - * adapted from http://en.wikipedia.org/wiki/HSL_color_space. - * Assumes h, s, and l are contained in the set [0, 1] and - * returns r, g, and b in the set [0, 255]. - * - * @param Number h The hue - * @param Number s The saturation - * @param Number l The lightness - * @return Array The RGB representation - */ - function hslToRgb(h, s, l){ - var r, g, b; - - function hue2rgb(p, q, t){ - if(t < 0) t += 1; - if(t > 1) t -= 1; - if(t < 1/6) return p + (q - p) * 6 * t; - if(t < 1/2) return q; - if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; - return p; - } - - if(s == 0){ - r = g = b = l; // achromatic - }else{ - var q = l < 0.5 ? l * (1 + s) : l + s - l * s; - var p = 2 * l - q; - r = hue2rgb(p, q, h + 1/3); - g = hue2rgb(p, q, h); - b = hue2rgb(p, q, h - 1/3); - } - - return [r * 255, g * 255, b * 255]; - } -} diff --git a/libcommuni/examples/quick/qml/TextBrowser.qml b/libcommuni/examples/quick/qml/TextBrowser.qml deleted file mode 100644 index fb013bc..0000000 --- a/libcommuni/examples/quick/qml/TextBrowser.qml +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQuick 2.1 -import QtQuick.Controls 1.0 -import Communi 3.0 - -Item { - id: background - - property IrcBuffer buffer - - implicitWidth: textArea.implicitWidth - implicitHeight: textArea.implicitHeight - - MessageFormatter { - id: formatter - } - - Connections { - target: buffer - onMessageReceived: { - var line = formatter.formatMessage(message) - if (line) - textArea.append(line) - } - } - - TextArea { - id: textArea - - anchors.fill: parent - anchors.topMargin: -1 - anchors.leftMargin: -1 - anchors.bottomMargin: -1 - - readOnly: true - textFormat: Qt.RichText - frameVisible: false - } -} diff --git a/libcommuni/examples/quick/qml/TextEntry.qml b/libcommuni/examples/quick/qml/TextEntry.qml deleted file mode 100644 index 4201e86..0000000 --- a/libcommuni/examples/quick/qml/TextEntry.qml +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQuick 2.1 -import QtQuick.Controls 1.0 -import QtQuick.Controls.Styles 1.0 -import Communi 3.1 - -TextField { - id: textField - - property alias buffer: completer.buffer - - signal messageSent(IrcMessage message) - - focus: true - placeholderText: qsTr("...") - - Keys.onTabPressed: completer.complete(text, cursorPosition) - - IrcCompleter { - id: completer - - onCompleted: { - textField.text = text - textField.cursorPosition = cursor - } - - parser: IrcCommandParser { - id: parser - - tolerant: true - triggers: ["/"] - channels: buffer ? buffer.model.channels : [] - target: buffer ? buffer.title : "" - - Component.onCompleted: { - parser.addCommand(IrcCommand.Join, "JOIN <#channel> ()") - parser.addCommand(IrcCommand.CtcpAction, "ME [target] ") - parser.addCommand(IrcCommand.Nick, "NICK ") - parser.addCommand(IrcCommand.Part, "PART (<#channel>) ()") - } - } - } - - style: TextFieldStyle { - background: Rectangle { - color: palette.base - Rectangle { - color: "transparent" - anchors.fill: parent - anchors.leftMargin: -1 - border.color: "#aaa" - } - } - } - - onAccepted: { - var cmd = parser.parse(text) - if (cmd) { - buffer.connection.sendCommand(cmd) - if (cmd.type === IrcCommand.Message - || cmd.type === IrcCommand.CtcpAction - || cmd.type === IrcCommand.Notice) { - var msg = cmd.toMessage(buffer.connection.nickName, buffer.connection) - textField.messageSent(msg) - } - textField.text = "" - } - } -} diff --git a/libcommuni/examples/quick/qml/TopicLabel.qml b/libcommuni/examples/quick/qml/TopicLabel.qml deleted file mode 100644 index 4009304..0000000 --- a/libcommuni/examples/quick/qml/TopicLabel.qml +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQuick 2.1 -import QtQuick.Controls 1.0 -import Communi 3.0 - -Rectangle { - id: background - - property IrcChannel channel - - color: "#ddd" - height: Math.max(20, label.implicitHeight + 4) - - IrcTextFormat { - id: textFormat - } - - Label { - id: label - - anchors.margins: 2 - anchors.leftMargin: 4 - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - - wrapMode: Text.Wrap - text: channel && channel.topic ? textFormat.toHtml(channel.topic) : "-" - } - - Rectangle { - id: frame - - color: "transparent" - anchors.fill: parent - anchors.topMargin: -1 - anchors.leftMargin: -1 - border.color: "#aaa" - } -} diff --git a/libcommuni/examples/quick/qml/UserListView.qml b/libcommuni/examples/quick/qml/UserListView.qml deleted file mode 100644 index 6daf06b..0000000 --- a/libcommuni/examples/quick/qml/UserListView.qml +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQuick 2.1 -import QtQuick.Controls 1.0 -import Communi 3.0 - -Rectangle { - id: background - - property IrcChannel channel - - signal queried(IrcUser user) - - color: "#edf3fe" - - Rectangle { - id: frame - anchors.fill: parent - color: "transparent" - border.color: "#aaa" - anchors.topMargin: -1 - anchors.leftMargin: -1 - anchors.bottomMargin: -1 - } - - ScrollView { - id: scrollView - - anchors.fill: parent - anchors.topMargin: -1 - anchors.bottomMargin: -1 - - ListView { - id: listView - - model: IrcUserModel { - id: userModel - sortMethod: Irc.SortByTitle - channel: background.channel - onChannelChanged: listView.currentIndex = -1 - } - - delegate: Rectangle { - width: parent.width - height: Math.max(20, label.implicitHeight + 4) - color: ListView.isCurrentItem ? "#b5d5ff" : "transparent" - Label { - id: label - text: model.title - anchors.margins: 2 - anchors.leftMargin: 6 - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - } - MouseArea { - anchors.fill: parent - onPressed: listView.currentIndex = index - onDoubleClicked: queried(model.user) - } - } - } - } -} diff --git a/libcommuni/examples/quick/qml/main.qml b/libcommuni/examples/quick/qml/main.qml deleted file mode 100644 index 8c431ad..0000000 --- a/libcommuni/examples/quick/qml/main.qml +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This example is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -import QtQuick 2.1 -import QtQuick.Controls 1.0 -import Communi 3.0 - -ApplicationWindow { - id: window - - visible: true - title: qsTr("Communi %1 QtQuick example").arg(irc.version()) - - width: 800 - height: 480 - - minimumWidth: connectPage.implicitWidth - minimumHeight: connectPage.implicitHeight - - color: Qt.darker(palette.base, 1.06) - - SystemPalette { id: palette } - - Irc { id: irc } - IrcCommand { id: cmd } - - ConnectPage { - id: connectPage - anchors.fill: parent - visible: !connection.active - onAccepted: { - chatPage.currentBuffer = serverBuffer - connection.sendCommand(cmd.createJoin(channel)) - connection.open() - } - onRejected: Qt.quit() - } - - ChatPage { - id: chatPage - anchors.fill: parent - visible: connection.active - bufferModel: IrcBufferModel { - id: bufferModel - sortMethod: Irc.SortByTitle - connection: IrcConnection { - id: connection - host: connectPage.host - port: connectPage.port - secure: connectPage.secure - saslMechanism: connectPage.sasl ? supportedSaslMechanisms[0] : "" - nickName: connectPage.nickName - realName: connectPage.realName - userName: connectPage.userName - password: connectPage.password - } - onMessageIgnored: serverBuffer.receiveMessage(message) - function quit() { - bufferModel.clear() - connection.quit(qsTr("Communi %1 QtQuick example").arg(irc.version())) - connection.close() - } - } - serverBuffer: IrcBuffer { - id: serverBuffer - sticky: true - persistent: true - name: connection.displayName - Component.onCompleted: bufferModel.add(serverBuffer) - } - } - - Component.onDestruction: bufferModel.quit() -} diff --git a/libcommuni/examples/quick/quick.pro b/libcommuni/examples/quick/quick.pro deleted file mode 100644 index 10690af..0000000 --- a/libcommuni/examples/quick/quick.pro +++ /dev/null @@ -1,28 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = app -TARGET = quick -DEPENDPATH += . -INCLUDEPATH += . -QT += network quick - -lessThan(QT_MAJOR_VERSION, 5)|lessThan(QT_MINOR_VERSION, 2) { - error(The Qt Quick 2 based example requires Qt 5.2 or newer but Qt $$[QT_VERSION] was detected.) -} - -# Input -SOURCES += main.cpp -RESOURCES += quick.qrc -OTHER_FILES += qml/main.qml -OTHER_FILES += qml/BufferListView.qml -OTHER_FILES += qml/ChatPage.qml -OTHER_FILES += qml/ConnectPage.qml -OTHER_FILES += qml/MessageFormatter.qml -OTHER_FILES += qml/TextBrowser.qml -OTHER_FILES += qml/TextEntry.qml -OTHER_FILES += qml/TopicLabel.qml -OTHER_FILES += qml/UserListView.qml - -include(../examples.pri) diff --git a/libcommuni/examples/quick/quick.qrc b/libcommuni/examples/quick/quick.qrc deleted file mode 100644 index aba83b9..0000000 --- a/libcommuni/examples/quick/quick.qrc +++ /dev/null @@ -1,13 +0,0 @@ - - - qml/main.qml - qml/BufferListView.qml - qml/ChatPage.qml - qml/ConnectPage.qml - qml/MessageFormatter.qml - qml/TextBrowser.qml - qml/TextEntry.qml - qml/TopicLabel.qml - qml/UserListView.qml - - diff --git a/libcommuni/features/communi.prf b/libcommuni/features/communi.prf deleted file mode 100644 index fe3fb2f..0000000 --- a/libcommuni/features/communi.prf +++ /dev/null @@ -1,41 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -isEmpty(COMMUNI):error(Usage: \"CONFIG += communi\" and \"COMMUNI += \" \(available modules: core model util\)) - -include(communi-config.prf) - -isEmpty(IRC_INSTALL_LIBS):IRC_INSTALL_LIBS = $$[QT_INSTALL_LIBS] -isEmpty(IRC_INSTALL_BINS):IRC_INSTALL_BINS = $$[QT_INSTALL_BINS] -isEmpty(IRC_INSTALL_HEADERS):IRC_INSTALL_HEADERS = $$[QT_INSTALL_HEADERS]/Communi - -macx:!qt_no_framework { - QMAKE_FRAMEWORKPATH += $$IRC_INSTALL_LIBS -} else { - INCLUDEPATH += $$IRC_INSTALL_HEADERS - DEPENDPATH += $$IRC_INSTALL_HEADERS - LIBS += -L$$IRC_INSTALL_LIBS -} - -IRC_MODULES = -for(MODULE, COMMUNI) { - MODULE = $$lower($$MODULE) - isEqual(MODULE, "core"):IRC_MODULES *= IrcCore - else:isEqual(MODULE, "model"):IRC_MODULES *= IrcModel - else:isEqual(MODULE, "util"):IRC_MODULES *= IrcUtil -} - -for(IRC_MODULE, IRC_MODULES) { - macx:!qt_no_framework { - INCLUDEPATH += $$IRC_INSTALL_LIBS/$${IRC_MODULE}.framework/Headers - LIBS += -framework $$IRC_MODULE - } else { - INCLUDEPATH += $$IRC_INSTALL_HEADERS/$$IRC_MODULE - DEPENDPATH += $$IRC_INSTALL_HEADERS/$$IRC_MODULE - REAL_TEMPLATE = $$TEMPLATE - TEMPLATE = fakelib - LIBS += -l$$qtLibraryTarget($$IRC_MODULE) - TEMPLATE = $$REAL_TEMPLATE - } -} diff --git a/libcommuni/include/IrcCore/Irc b/libcommuni/include/IrcCore/Irc deleted file mode 100644 index c7f8af4..0000000 --- a/libcommuni/include/IrcCore/Irc +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcCommand b/libcommuni/include/IrcCore/IrcCommand deleted file mode 100644 index a9b4889..0000000 --- a/libcommuni/include/IrcCore/IrcCommand +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcCommandFilter b/libcommuni/include/IrcCore/IrcCommandFilter deleted file mode 100644 index 1edae38..0000000 --- a/libcommuni/include/IrcCore/IrcCommandFilter +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcConnection b/libcommuni/include/IrcCore/IrcConnection deleted file mode 100644 index 75c878e..0000000 --- a/libcommuni/include/IrcCore/IrcConnection +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcCore b/libcommuni/include/IrcCore/IrcCore deleted file mode 100644 index 918016d..0000000 --- a/libcommuni/include/IrcCore/IrcCore +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcFilter b/libcommuni/include/IrcCore/IrcFilter deleted file mode 100644 index 1edae38..0000000 --- a/libcommuni/include/IrcCore/IrcFilter +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcGlobal b/libcommuni/include/IrcCore/IrcGlobal deleted file mode 100644 index af36086..0000000 --- a/libcommuni/include/IrcCore/IrcGlobal +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcMessage b/libcommuni/include/IrcCore/IrcMessage deleted file mode 100644 index 4c767f6..0000000 --- a/libcommuni/include/IrcCore/IrcMessage +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcMessageFilter b/libcommuni/include/IrcCore/IrcMessageFilter deleted file mode 100644 index 1edae38..0000000 --- a/libcommuni/include/IrcCore/IrcMessageFilter +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcNetwork b/libcommuni/include/IrcCore/IrcNetwork deleted file mode 100644 index c298490..0000000 --- a/libcommuni/include/IrcCore/IrcNetwork +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/IrcProtocol b/libcommuni/include/IrcCore/IrcProtocol deleted file mode 100644 index 5ec3d80..0000000 --- a/libcommuni/include/IrcCore/IrcProtocol +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/irc.h b/libcommuni/include/IrcCore/irc.h deleted file mode 100644 index 911528a..0000000 --- a/libcommuni/include/IrcCore/irc.h +++ /dev/null @@ -1,557 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRC_H -#define IRC_H - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -#ifdef IRC_DOXYGEN -namespace Irc -{ - Q_INVOKABLE QString version(); - Q_INVOKABLE QString codeToString(int code); - Q_INVOKABLE QString nickFromPrefix(const QString& prefix); - Q_INVOKABLE QString identFromPrefix(const QString& prefix); - Q_INVOKABLE QString hostFromPrefix(const QString& prefix); - Q_INVOKABLE void registerMetaTypes(); -#else -class IRC_CORE_EXPORT Irc : public QObject -{ - Q_OBJECT - Q_ENUMS(Color DataRole SortMethod Code) - -public: - Q_INVOKABLE static QString version(); - Q_INVOKABLE static QString codeToString(int code); - Q_INVOKABLE static QString nickFromPrefix(const QString& prefix); - Q_INVOKABLE static QString identFromPrefix(const QString& prefix); - Q_INVOKABLE static QString hostFromPrefix(const QString& prefix); - Q_INVOKABLE static void registerMetaTypes(); -#endif - - enum Color { - White = 0, - Black = 1, - Blue = 2, - Green = 3, - Red = 4, - Brown = 5, - Purple = 6, - Orange = 7, - Yellow = 8, - LightGreen = 9, - Cyan = 10, - LightCyan = 11, - LightBlue = 12, - Pink = 13, - Gray = 14, - LightGray = 15 - }; - - enum DataRole { - UserRole = Qt::UserRole, - BufferRole, - ChannelRole, - NameRole, - PrefixRole, - ModeRole, - TitleRole - }; - - enum SortMethod { - SortByHand, - SortByName, - SortByTitle, - SortByActivity - }; - - enum Code { - RPL_WELCOME = 1, - RPL_YOURHOST = 2, - RPL_CREATED = 3, - RPL_MYINFO = 4, - RPL_ISUPPORT = 5, - RPL_SNOMASK = 8, - RPL_STATMEMTOT = 9, - RPL_BOUNCE = 10, - RPL_STATMEM = 10, - RPL_YOURCOOKIE = 14, - RPL_YOURID = 42, - RPL_SAVENICK = 43, - RPL_ATTEMPTINGJUNC = 50, - RPL_ATTEMPTINGREROUTE = 51, - RPL_TRACELINK = 200, - RPL_TRACECONNECTING = 201, - RPL_TRACEHANDSHAKE = 202, - RPL_TRACEUNKNOWN = 203, - RPL_TRACEOPERATOR = 204, - RPL_TRACEUSER = 205, - RPL_TRACESERVER = 206, - RPL_TRACESERVICE = 207, - RPL_TRACENEWTYPE = 208, - RPL_TRACECLASS = 209, - RPL_TRACERECONNECT = 210, - RPL_STATS = 210, - RPL_STATSLINKINFO = 211, - RPL_STATSCOMMANDS = 212, - RPL_STATSCLINE = 213, - RPL_STATSNLINE = 214, - RPL_STATSILINE = 215, - RPL_STATSKLINE = 216, - RPL_STATSQLINE = 217, - RPL_STATSYLINE = 218, - RPL_ENDOFSTATS = 219, - RPL_UMODEIS = 221, - RPL_MODLIST = 222, - RPL_SQLINE_NICK = 222, - RPL_STATSZLINE = 225, - RPL_STATSCOUNT = 226, - RPL_SERVICEINFO = 231, - RPL_ENDOFSERVICES = 232, - RPL_SERVICE = 233, - RPL_SERVLIST = 234, - RPL_SERVLISTEND = 235, - RPL_STATSVERBOSE = 236, - RPL_STATSENGINE = 237, - RPL_STATSIAUTH = 239, - RPL_STATSVLINE = 240, - RPL_STATSLLINE = 241, - RPL_STATSUPTIME = 242, - RPL_STATSOLINE = 243, - RPL_STATSHLINE = 244, - RPL_STATSSLINE = 245, - RPL_STATSPING = 246, - RPL_STATSBLINE = 247, - RPL_STATSDEFINE = 248, - RPL_STATSDEBUG = 249, - RPL_STATSDLINE = 250, - RPL_STATSCONN = 250, - RPL_LUSERCLIENT = 251, - RPL_LUSEROP = 252, - RPL_LUSERUNKNOWN = 253, - RPL_LUSERCHANNELS = 254, - RPL_LUSERME = 255, - RPL_ADMINME = 256, - RPL_ADMINLOC1 = 257, - RPL_ADMINLOC2 = 258, - RPL_ADMINEMAIL = 259, - RPL_TRACELOG = 261, - RPL_TRACEPING = 262, - RPL_TRACEEND = 262, - RPL_TRYAGAIN = 263, - RPL_LOCALUSERS = 265, - RPL_GLOBALUSERS = 266, - RPL_START_NETSTAT = 267, - RPL_NETSTAT = 268, - RPL_END_NETSTAT = 269, - RPL_PRIVS = 270, - RPL_SILELIST = 271, - RPL_ENDOFSILELIST = 272, - RPL_NOTIFY = 273, - RPL_ENDNOTIFY = 274, - RPL_STATSDELTA = 274, - RPL_VCHANEXIST = 276, - RPL_VCHANLIST = 277, - RPL_VCHANHELP = 278, - RPL_GLIST = 280, - RPL_ENDOFGLIST = 281, - RPL_ACCEPTLIST = 281, - RPL_ENDOFACCEPT = 282, - RPL_JUPELIST = 282, - RPL_ENDOFJUPELIST = 283, - RPL_FEATURE = 284, - RPL_GLIST_HASH = 285, - RPL_CHANINFO_HANDLE = 285, - RPL_NEWHOSTIS = 285, - RPL_CHANINFO_USERS = 286, - RPL_CHKHEAD = 286, - RPL_CHANINFO_CHOPS = 287, - RPL_CHANUSER = 287, - RPL_CHANINFO_VOICES = 288, - RPL_PATCHHEAD = 288, - RPL_CHANINFO_AWAY = 289, - RPL_PATCHCON = 289, - RPL_CHANINFO_OPERS = 290, - RPL_HELPHDR = 290, - RPL_DATASTR = 290, - RPL_CHANINFO_BANNED = 291, - RPL_HELPOP = 291, - RPL_ENDOFCHECK = 291, - RPL_CHANINFO_BANS = 292, - RPL_HELPTLR = 292, - RPL_CHANINFO_INVITE = 293, - RPL_HELPHLP = 293, - RPL_CHANINFO_INVITES = 294, - RPL_HELPFWD = 294, - RPL_CHANINFO_KICK = 295, - RPL_HELPIGN = 295, - RPL_CHANINFO_KICKS = 296, - RPL_END_CHANINFO = 299, - RPL_NONE = 300, - RPL_AWAY = 301, - RPL_USERHOST = 302, - RPL_ISON = 303, - RPL_TEXT = 304, - RPL_UNAWAY = 305, - RPL_NOWAWAY = 306, - RPL_WHOISREGNICK = 307, - RPL_SUSERHOST = 307, - RPL_NOTIFYACTION = 308, - RPL_WHOISADMIN = 308, - RPL_NICKTRACE = 309, - RPL_WHOISSADMIN = 309, - RPL_WHOISHELPER = 309, - RPL_WHOISSVCMSG = 310, - RPL_WHOISHELPOP = 310, - RPL_WHOISSERVICE = 310, - RPL_WHOISUSER = 311, - RPL_WHOISSERVER = 312, - RPL_WHOISOPERATOR = 313, - RPL_WHOWASUSER = 314, - RPL_ENDOFWHO = 315, - RPL_WHOISCHANOP = 316, - RPL_WHOISIDLE = 317, - RPL_ENDOFWHOIS = 318, - RPL_WHOISCHANNELS = 319, - RPL_WHOISVIRT = 320, - RPL_WHOIS_HIDDEN = 320, - RPL_WHOISSPECIAL = 320, - RPL_LISTSTART = 321, - RPL_LIST = 322, - RPL_LISTEND = 323, - RPL_CHANNELMODEIS = 324, - RPL_UNIQOPIS = 325, - RPL_CHANNELPASSIS = 325, - RPL_NOCHANPASS = 326, - RPL_CHPASSUNKNOWN = 327, - RPL_CHANNEL_URL = 328, - RPL_CREATIONTIME = 329, - RPL_WHOWAS_TIME = 330, - RPL_WHOISACCOUNT = 330, - RPL_NOTOPIC = 331, - RPL_TOPIC = 332, - RPL_TOPICWHOTIME = 333, - RPL_LISTUSAGE = 334, - RPL_COMMANDSYNTAX = 334, - RPL_LISTSYNTAX = 334, - RPL_CHANPASSOK = 338, - RPL_WHOISACTUALLY = 338, - RPL_BADCHANPASS = 339, - RPL_INVITING = 341, - RPL_SUMMONING = 342, - RPL_INVITED = 345, - RPL_INVITELIST = 346, - RPL_ENDOFINVITELIST = 347, - RPL_EXCEPTLIST = 348, - RPL_ENDOFEXCEPTLIST = 349, - RPL_VERSION = 351, - RPL_WHOREPLY = 352, - RPL_NAMREPLY = 353, - RPL_WHOSPCRPL = 354, - RPL_NAMREPLY_ = 355, - RPL_KILLDONE = 361, - RPL_CLOSING = 362, - RPL_CLOSEEND = 363, - RPL_LINKS = 364, - RPL_ENDOFLINKS = 365, - RPL_ENDOFNAMES = 366, - RPL_BANLIST = 367, - RPL_ENDOFBANLIST = 368, - RPL_ENDOFWHOWAS = 369, - RPL_INFO = 371, - RPL_MOTD = 372, - RPL_INFOSTART = 373, - RPL_ENDOFINFO = 374, - RPL_MOTDSTART = 375, - RPL_ENDOFMOTD = 376, - RPL_KICKEXPIRED = 377, - RPL_SPAM = 377, - RPL_BANEXPIRED = 378, - RPL_WHOISHOST = 378, - RPL_KICKLINKED = 379, - RPL_WHOISMODES = 379, - RPL_BANLINKED = 380, - RPL_YOURHELPER = 380, - RPL_YOUREOPER = 381, - RPL_REHASHING = 382, - RPL_YOURESERVICE = 383, - RPL_MYPORTIS = 384, - RPL_NOTOPERANYMORE = 385, - RPL_QLIST = 386, - RPL_IRCOPS = 386, - RPL_ENDOFQLIST = 387, - RPL_ENDOFIRCOPS = 387, - RPL_ALIST = 388, - RPL_ENDOFALIST = 389, - RPL_TIME = 391, - RPL_USERSSTART = 392, - RPL_USERS = 393, - RPL_ENDOFUSERS = 394, - RPL_NOUSERS = 395, - RPL_HOSTHIDDEN = 396, - ERR_UNKNOWNERROR = 400, - ERR_NOSUCHNICK = 401, - ERR_NOSUCHSERVER = 402, - ERR_NOSUCHCHANNEL = 403, - ERR_CANNOTSENDTOCHAN = 404, - ERR_TOOMANYCHANNELS = 405, - ERR_WASNOSUCHNICK = 406, - ERR_TOOMANYTARGETS = 407, - ERR_NOSUCHSERVICE = 408, - ERR_NOCOLORSONCHAN = 408, - ERR_NOORIGIN = 409, - ERR_NORECIPIENT = 411, - ERR_NOTEXTTOSEND = 412, - ERR_NOTOPLEVEL = 413, - ERR_WILDTOPLEVEL = 414, - ERR_BADMASK = 415, - ERR_TOOMANYMATCHES = 416, - ERR_QUERYTOOLONG = 416, - ERR_LENGTHTRUNCATED = 419, - ERR_UNKNOWNCOMMAND = 421, - ERR_NOMOTD = 422, - ERR_NOADMININFO = 423, - ERR_FILEERROR = 424, - ERR_NOOPERMOTD = 425, - ERR_TOOMANYAWAY = 429, - ERR_EVENTNICKCHANGE = 430, - ERR_NONICKNAMEGIVEN = 431, - ERR_ERRONEUSNICKNAME = 432, - ERR_NICKNAMEINUSE = 433, - ERR_SERVICENAMEINUSE = 434, - ERR_NORULES = 434, - ERR_SERVICECONFUSED = 435, - ERR_BANONCHAN = 435, - ERR_NICKCOLLISION = 436, - ERR_UNAVAILRESOURCE = 437, - ERR_BANNICKCHANGE = 437, - ERR_NICKTOOFAST = 438, - ERR_DEAD = 438, - ERR_TARGETTOOFAST = 439, - ERR_SERVICESDOWN = 440, - ERR_USERNOTINCHANNEL = 441, - ERR_NOTONCHANNEL = 442, - ERR_USERONCHANNEL = 443, - ERR_NOLOGIN = 444, - ERR_SUMMONDISABLED = 445, - ERR_USERSDISABLED = 446, - ERR_NONICKCHANGE = 447, - ERR_NOTIMPLEMENTED = 449, - ERR_NOTREGISTERED = 451, - ERR_IDCOLLISION = 452, - ERR_NICKLOST = 453, - ERR_HOSTILENAME = 455, - ERR_ACCEPTFULL = 456, - ERR_ACCEPTEXIST = 457, - ERR_ACCEPTNOT = 458, - ERR_NOHIDING = 459, - ERR_NOTFORHALFOPS = 460, - ERR_NEEDMOREPARAMS = 461, - ERR_ALREADYREGISTERED = 462, - ERR_NOPERMFORHOST = 463, - ERR_PASSWDMISMATCH = 464, - ERR_YOUREBANNEDCREEP = 465, - ERR_YOUWILLBEBANNED = 466, - ERR_KEYSET = 467, - ERR_INVALIDUSERNAME = 468, - ERR_ONLYSERVERSCANCHANGE = 468, - ERR_LINKSET = 469, - ERR_LINKCHANNEL = 470, - ERR_KICKEDFROMCHAN = 470, - ERR_CHANNELISFULL = 471, - ERR_UNKNOWNMODE = 472, - ERR_INVITEONLYCHAN = 473, - ERR_BANNEDFROMCHAN = 474, - ERR_BADCHANNELKEY = 475, - ERR_BADCHANMASK = 476, - ERR_NOCHANMODES = 477, - ERR_NEEDREGGEDNICK = 477, - ERR_BANLISTFULL = 478, - ERR_BADCHANNAME = 479, - ERR_LINKFAIL = 479, - ERR_NOULINE = 480, - ERR_CANNOTKNOCK = 480, - ERR_NOPRIVILEGES = 481, - ERR_CHANOPRIVSNEEDED = 482, - ERR_CANTKILLSERVER = 483, - ERR_RESTRICTED = 484, - ERR_ISCHANSERVICE = 484, - ERR_DESYNC = 484, - ERR_ATTACKDENY = 484, - ERR_UNIQOPRIVSNEEDED = 485, - ERR_KILLDENY = 485, - ERR_CANTKICKADMIN = 485, - ERR_ISREALSERVICE = 485, - ERR_NONONREG = 486, - ERR_HTMDISABLED = 486, - ERR_ACCOUNTONLY = 486, - ERR_CHANTOORECENT = 487, - ERR_MSGSERVICES = 487, - ERR_TSLESSCHAN = 488, - ERR_VOICENEEDED = 489, - ERR_SECUREONLYCHAN = 489, - ERR_NOOPERHOST = 491, - ERR_NOSERVICEHOST = 492, - ERR_NOFEATURE = 493, - ERR_BADFEATURE = 494, - ERR_BADLOGTYPE = 495, - ERR_BADLOGSYS = 496, - ERR_BADLOGVALUE = 497, - ERR_ISOPERLCHAN = 498, - ERR_CHANOWNPRIVNEEDED = 499, - ERR_UMODEUNKNOWNFLAG = 501, - ERR_USERSDONTMATCH = 502, - ERR_GHOSTEDCLIENT = 503, - ERR_VWORLDWARN = 503, - ERR_USERNOTONSERV = 504, - ERR_SILELISTFULL = 511, - ERR_TOOMANYWATCH = 512, - ERR_BADPING = 513, - ERR_INVALID_ERROR = 514, - ERR_TOOMANYDCC = 514, - ERR_BADEXPIRE = 515, - ERR_DONTCHEAT = 516, - ERR_DISABLED = 517, - ERR_NOINVITE = 518, - ERR_LONGMASK = 518, - ERR_ADMONLY = 519, - ERR_TOOMANYUSERS = 519, - ERR_OPERONLY = 520, - ERR_MASKTOOWIDE = 520, - ERR_WHOTRUNC = 520, - ERR_LISTSYNTAX = 521, - ERR_WHOSYNTAX = 522, - ERR_WHOLIMEXCEED = 523, - ERR_QUARANTINED = 524, - ERR_OPERSPVERIFY = 524, - ERR_REMOTEPFX = 525, - ERR_PFXUNROUTABLE = 526, - ERR_BADHOSTMASK = 550, - ERR_HOSTUNAVAIL = 551, - ERR_USINGSLINE = 552, - ERR_STATSSLINE = 553, - RPL_LOGON = 600, - RPL_LOGOFF = 601, - RPL_WATCHOFF = 602, - RPL_WATCHSTAT = 603, - RPL_NOWON = 604, - RPL_NOWOFF = 605, - RPL_WATCHLIST = 606, - RPL_ENDOFWATCHLIST = 607, - RPL_WATCHCLEAR = 608, - RPL_ISOPER = 610, - RPL_ISLOCOP = 611, - RPL_ISNOTOPER = 612, - RPL_ENDOFISOPER = 613, - RPL_DCCSTATUS = 617, - RPL_DCCLIST = 618, - RPL_ENDOFDCCLIST = 619, - RPL_WHOWASHOST = 619, - RPL_DCCINFO = 620, - RPL_ENDOFO = 626, - RPL_SETTINGS = 630, - RPL_ENDOFSETTINGS = 631, - RPL_DUMPING = 640, - RPL_DUMPRPL = 641, - RPL_EODUMP = 642, - RPL_TRACEROUTE_HOP = 660, - RPL_TRACEROUTE_START = 661, - RPL_MODECHANGEWARN = 662, - RPL_CHANREDIR = 663, - RPL_SERVMODEIS = 664, - RPL_OTHERUMODEIS = 665, - RPL_ENDOF_GENERIC = 666, - RPL_WHOWASDETAILS = 670, - RPL_WHOISSECURE = 671, - RPL_UNKNOWNMODES = 672, - RPL_CANNOTSETMODES = 673, - RPL_LUSERSTAFF = 678, - RPL_TIMEONSERVERIS = 679, - RPL_NETWORKS = 682, - RPL_YOURLANGUAGEIS = 687, - RPL_LANGUAGE = 688, - RPL_WHOISSTAFF = 689, - RPL_WHOISLANGUAGE = 690, - RPL_HELPSTART = 704, - RPL_HELPTXT = 705, - RPL_ENDOFHELP = 706, - RPL_ETRACEFULL = 708, - RPL_ETRACE = 709, - RPL_KNOCK = 710, - RPL_KNOCKDLVR = 711, - ERR_TOOMANYKNOCK = 712, - ERR_CHANOPEN = 713, - ERR_KNOCKONCHAN = 714, - ERR_KNOCKDISABLED = 715, - RPL_TARGUMODEG = 716, - RPL_TARGNOTIFY = 717, - RPL_UMODEGMSG = 718, - RPL_ENDOFOMOTD = 722, - ERR_NOPRIVS = 723, - RPL_TESTMARK = 724, - RPL_TESTLINE = 725, - RPL_NOTESTLINE = 726, - RPL_XINFO = 771, - RPL_XINFOSTART = 773, - RPL_XINFOEND = 774, - ERR_CANNOTDOCOMMAND = 972, - ERR_CANNOTCHANGEUMODE = 973, - ERR_CANNOTCHANGECHANMODE = 974, - ERR_CANNOTCHANGESERVERMODE = 975, - ERR_CANNOTSENDTONICK = 976, - ERR_UNKNOWNSERVERMODE = 977, - ERR_SERVERMODELOCK = 979, - ERR_BADCHARENCODING = 980, - ERR_TOOMANYLANGUAGES = 981, - ERR_NOLANGUAGE = 982, - ERR_TEXTTOOSHORT = 983, - ERR_NUMERIC_ERR = 999 - }; -}; - -#ifndef QT_NO_DEBUG_STREAM -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, Irc::Code code); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, Irc::DataRole role); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, Irc::Color color); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, Irc::SortMethod method); -#endif // QT_NO_DEBUG_STREAM - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(Irc::Code)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(Irc::DataRole)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(Irc::Color)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(Irc::SortMethod)) - -#endif // IRC_H diff --git a/libcommuni/include/IrcCore/irccommand.h b/libcommuni/include/IrcCore/irccommand.h deleted file mode 100644 index e532755..0000000 --- a/libcommuni/include/IrcCore/irccommand.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCCOMMAND_H -#define IRCCOMMAND_H - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcMessage; -class IrcConnection; -class IrcCommandPrivate; - -class IRC_CORE_EXPORT IrcCommand : public QObject -{ - Q_OBJECT - Q_PROPERTY(QStringList parameters READ parameters WRITE setParameters) - Q_PROPERTY(QByteArray encoding READ encoding WRITE setEncoding) - Q_PROPERTY(Type type READ type WRITE setType) - Q_ENUMS(Type) - -public: - enum Type { - Admin, - Away, - Capability, - CtcpAction, - CtcpReply, - CtcpRequest, - Custom, - Info, - Invite, - Join, - Kick, - Knock, - List, - Message, - Mode, - Motd, - Names, - Nick, - Notice, - Part, - Ping, - Pong, - Quit, - Quote, - Stats, - Time, - Topic, - Trace, - Users, - Version, - Who, - Whois, - Whowas - }; - - explicit IrcCommand(QObject* parent = 0); - virtual ~IrcCommand(); - - Type type() const; - void setType(Type type); - - QStringList parameters() const; - void setParameters(const QStringList& parameters); - - QByteArray encoding() const; - void setEncoding(const QByteArray& encoding); - - virtual QString toString() const; - - Q_INVOKABLE IrcMessage* toMessage(const QString& prefix, IrcConnection* connection) const; - - Q_INVOKABLE static IrcCommand* createAdmin(const QString& server = QString()); - Q_INVOKABLE static IrcCommand* createAway(const QString& reason = QString()); - Q_INVOKABLE static IrcCommand* createCapability(const QString& subCommand, const QString& capability); - Q_INVOKABLE static IrcCommand* createCapability(const QString& subCommand, const QStringList& capabilities = QStringList()); - Q_INVOKABLE static IrcCommand* createCtcpAction(const QString& target, const QString& action); - Q_INVOKABLE static IrcCommand* createCtcpReply(const QString& target, const QString& reply); - Q_INVOKABLE static IrcCommand* createCtcpRequest(const QString& target, const QString& request); - Q_INVOKABLE static IrcCommand* createInfo(const QString& server = QString()); - Q_INVOKABLE static IrcCommand* createInvite(const QString& user, const QString& channel); - Q_INVOKABLE static IrcCommand* createJoin(const QString& channel, const QString& key = QString()); - Q_INVOKABLE static IrcCommand* createJoin(const QStringList& channels, const QStringList& keys = QStringList()); - Q_INVOKABLE static IrcCommand* createKick(const QString& channel, const QString& user, const QString& reason = QString()); - Q_INVOKABLE static IrcCommand* createKnock(const QString& channel, const QString& message = QString()); - Q_INVOKABLE static IrcCommand* createList(const QStringList& channels = QStringList(), const QString& server = QString()); - Q_INVOKABLE static IrcCommand* createMessage(const QString& target, const QString& message); - Q_INVOKABLE static IrcCommand* createMode(const QString& target, const QString& mode = QString(), const QString& arg = QString()); - Q_INVOKABLE static IrcCommand* createMotd(const QString& server = QString()); - Q_INVOKABLE static IrcCommand* createNames(const QString& channel = QString(), const QString& server = QString()); - Q_INVOKABLE static IrcCommand* createNames(const QStringList& channels, const QString& server = QString()); - Q_INVOKABLE static IrcCommand* createNick(const QString& nick); - Q_INVOKABLE static IrcCommand* createNotice(const QString& target, const QString& notice); - Q_INVOKABLE static IrcCommand* createPart(const QString& channel, const QString& reason = QString()); - Q_INVOKABLE static IrcCommand* createPart(const QStringList& channels, const QString& reason = QString()); - Q_INVOKABLE static IrcCommand* createPing(const QString& argument); - Q_INVOKABLE static IrcCommand* createPong(const QString& argument); - Q_INVOKABLE static IrcCommand* createQuit(const QString& reason = QString()); - Q_INVOKABLE static IrcCommand* createQuote(const QString& raw); - Q_INVOKABLE static IrcCommand* createQuote(const QStringList& parameters); - Q_INVOKABLE static IrcCommand* createStats(const QString& query, const QString& server = QString()); - Q_INVOKABLE static IrcCommand* createTime(const QString& server = QString()); - Q_INVOKABLE static IrcCommand* createTopic(const QString& channel, const QString& topic = QString()); - Q_INVOKABLE static IrcCommand* createTrace(const QString& target = QString()); - Q_INVOKABLE static IrcCommand* createUsers(const QString& server = QString()); - Q_INVOKABLE static IrcCommand* createVersion(const QString& user = QString()); - Q_INVOKABLE static IrcCommand* createWho(const QString& mask, bool operators = false); - Q_INVOKABLE static IrcCommand* createWhois(const QString& user); - Q_INVOKABLE static IrcCommand* createWhowas(const QString& user, int count = 1); - -private: - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcCommand) - Q_DISABLE_COPY(IrcCommand) -}; - -#ifndef QT_NO_DEBUG_STREAM -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcCommand::Type type); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, const IrcCommand* command); -#endif // QT_NO_DEBUG_STREAM - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCommand*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCommand::Type)) - -#endif // IRCCOMMAND_H diff --git a/libcommuni/include/IrcCore/irccommandfilter.h b/libcommuni/include/IrcCore/irccommandfilter.h deleted file mode 100644 index 1edae38..0000000 --- a/libcommuni/include/IrcCore/irccommandfilter.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/ircconnection.h b/libcommuni/include/IrcCore/ircconnection.h deleted file mode 100644 index 5ce26a5..0000000 --- a/libcommuni/include/IrcCore/ircconnection.h +++ /dev/null @@ -1,240 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCCONNECTION_H -#define IRCCONNECTION_H - -#include -#include -#include -#include -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcCommand; -class IrcProtocol; -class IrcConnectionPrivate; - -class IRC_CORE_EXPORT IrcConnection : public QObject -{ - Q_OBJECT - - Q_PROPERTY(QString host READ host WRITE setHost NOTIFY hostChanged) - Q_PROPERTY(int port READ port WRITE setPort NOTIFY portChanged) - Q_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged) - Q_PROPERTY(QString nickName READ nickName WRITE setNickName NOTIFY nickNameChanged) - Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged) - Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged) - Q_PROPERTY(QString displayName READ displayName WRITE setDisplayName NOTIFY displayNameChanged) - Q_PROPERTY(QVariantMap userData READ userData WRITE setUserData NOTIFY userDataChanged) - Q_PROPERTY(QByteArray encoding READ encoding WRITE setEncoding) - Q_PROPERTY(Status status READ status NOTIFY statusChanged) - Q_PROPERTY(bool active READ isActive NOTIFY statusChanged) - Q_PROPERTY(bool connected READ isConnected NOTIFY statusChanged) - Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) - Q_PROPERTY(int reconnectDelay READ reconnectDelay WRITE setReconnectDelay NOTIFY reconnectDelayChanged) - Q_PROPERTY(QAbstractSocket* socket READ socket WRITE setSocket) - Q_PROPERTY(bool secure READ isSecure WRITE setSecure NOTIFY secureChanged) - Q_PROPERTY(bool secureSupported READ isSecureSupported) - Q_PROPERTY(QString saslMechanism READ saslMechanism WRITE setSaslMechanism NOTIFY saslMechanismChanged) - Q_PROPERTY(QStringList supportedSaslMechanisms READ supportedSaslMechanisms CONSTANT) - Q_PROPERTY(IrcNetwork* network READ network CONSTANT) - Q_PROPERTY(IrcProtocol* protocol READ protocol WRITE setProtocol) - Q_ENUMS(Status) - -public: - explicit IrcConnection(QObject* parent = 0); - explicit IrcConnection(const QString& host, QObject* parent = 0); - virtual ~IrcConnection(); - - QString host() const; - void setHost(const QString& host); - - int port() const; - void setPort(int port); - - QString userName() const; - void setUserName(const QString& name); - - QString nickName() const; - void setNickName(const QString& name); - - QString realName() const; - void setRealName(const QString& name); - - QString password() const; - void setPassword(const QString& password); - - QString displayName() const; - void setDisplayName(const QString& name); - - QVariantMap userData() const; - void setUserData(const QVariantMap& data); - - QByteArray encoding() const; - void setEncoding(const QByteArray& encoding); - - enum Status { - Inactive, - Waiting, - Connecting, - Connected, - Closing, - Closed, - Error - }; - Status status() const; - bool isActive() const; - bool isConnected() const; - bool isEnabled() const; - - int reconnectDelay() const; - void setReconnectDelay(int seconds); - - QAbstractSocket* socket() const; - void setSocket(QAbstractSocket* socket); - - bool isSecure() const; - void setSecure(bool secure); - static bool isSecureSupported(); - - QString saslMechanism() const; - void setSaslMechanism(const QString& mechanism); - - static QStringList supportedSaslMechanisms(); - - IrcNetwork* network() const; - - IrcProtocol* protocol() const; - void setProtocol(IrcProtocol* protocol); - - void installMessageFilter(QObject* filter); - void removeMessageFilter(QObject* filter); - - void installCommandFilter(QObject* filter); - void removeCommandFilter(QObject* filter); - - Q_INVOKABLE QByteArray saveState(int version = 0) const; - Q_INVOKABLE bool restoreState(const QByteArray& state, int version = 0); - -public Q_SLOTS: - void open(); - void close(); - void quit(const QString& reason = QString()); - void setEnabled(bool enabled = true); - void setDisabled(bool disabled = true); - - bool sendCommand(IrcCommand* command); - bool sendData(const QByteArray& data); - bool sendRaw(const QString& message); - -Q_SIGNALS: - void connecting(); - void connected(); - void disconnected(); - void statusChanged(IrcConnection::Status status); - void socketError(QAbstractSocket::SocketError error); - void socketStateChanged(QAbstractSocket::SocketState state); - void secureError(); - - void nickNameReserved(QString* alternate); // deprecated - void nickNameRequired(const QString& reserved, QString* alternate); - void channelKeyRequired(const QString& channel, QString* key); - - void messageReceived(IrcMessage* message); - - void capabilityMessageReceived(IrcCapabilityMessage* message); - void errorMessageReceived(IrcErrorMessage* message); - void inviteMessageReceived(IrcInviteMessage* message); - void joinMessageReceived(IrcJoinMessage* message); - void kickMessageReceived(IrcKickMessage* message); - void modeMessageReceived(IrcModeMessage* message); - void namesMessageReceived(IrcNamesMessage* message); - void nickMessageReceived(IrcNickMessage* message); - void noticeMessageReceived(IrcNoticeMessage* message); - void numericMessageReceived(IrcNumericMessage* message); - void motdMessageReceived(IrcMotdMessage* message); - void partMessageReceived(IrcPartMessage* message); - void pingMessageReceived(IrcPingMessage* message); - void pongMessageReceived(IrcPongMessage* message); - void privateMessageReceived(IrcPrivateMessage* message); - void quitMessageReceived(IrcQuitMessage* message); - void topicMessageReceived(IrcTopicMessage* message); - void whoReplyMessageReceived(IrcWhoReplyMessage* message); - - void hostChanged(const QString& host); - void portChanged(int port); - void userNameChanged(const QString& name); - void nickNameChanged(const QString& name); - void realNameChanged(const QString& name); - void passwordChanged(const QString& password); - void displayNameChanged(const QString& name); - void userDataChanged(const QVariantMap& data); - - void reconnectDelayChanged(int seconds); - void enabledChanged(bool enabled); - void secureChanged(bool secure); - void saslMechanismChanged(const QString& mechanism); - - void destroyed(IrcConnection* connection); - -protected Q_SLOTS: - virtual IrcCommand* createCtcpReply(IrcPrivateMessage* request) const; - -private: - friend class IrcProtocol; - friend class IrcProtocolPrivate; - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcConnection) - Q_DISABLE_COPY(IrcConnection) - - Q_PRIVATE_SLOT(d_func(), void _irc_connected()) - Q_PRIVATE_SLOT(d_func(), void _irc_disconnected()) - Q_PRIVATE_SLOT(d_func(), void _irc_error(QAbstractSocket::SocketError)) - Q_PRIVATE_SLOT(d_func(), void _irc_state(QAbstractSocket::SocketState)) - Q_PRIVATE_SLOT(d_func(), void _irc_sslErrors()) - Q_PRIVATE_SLOT(d_func(), void _irc_reconnect()) - Q_PRIVATE_SLOT(d_func(), void _irc_readData()) - Q_PRIVATE_SLOT(d_func(), void _irc_filterDestroyed(QObject*)) -}; - -#ifndef QT_NO_DEBUG_STREAM -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcConnection::Status status); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, const IrcConnection* connection); -#endif // QT_NO_DEBUG_STREAM - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcConnection*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcConnection::Status)) - -#endif // IRCCONNECTION_H diff --git a/libcommuni/include/IrcCore/ircconnection_p.h b/libcommuni/include/IrcCore/ircconnection_p.h deleted file mode 100644 index f9e91ab..0000000 --- a/libcommuni/include/IrcCore/ircconnection_p.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCCONNECTION_P_H -#define IRCCONNECTION_P_H - -#include "ircconnection.h" - -#include -#include -#include -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcMessageFilter; -class IrcCommandFilter; - -class IrcConnectionPrivate -{ - Q_DECLARE_PUBLIC(IrcConnection) - -public: - IrcConnectionPrivate(); - - void init(IrcConnection* connection); - - void _irc_connected(); - void _irc_disconnected(); - void _irc_error(QAbstractSocket::SocketError error); - void _irc_state(QAbstractSocket::SocketState state); - void _irc_sslErrors(); - void _irc_reconnect(); - void _irc_readData(); - - void _irc_filterDestroyed(QObject* filter); - - void setNick(const QString& nick); - void setStatus(IrcConnection::Status status); - void setInfo(const QHash& info); - - void receiveMessage(IrcMessage* msg); - IrcCommand* createCtcpReply(IrcPrivateMessage* request); - - static IrcConnectionPrivate* get(const IrcConnection* connection) - { - return connection->d_ptr.data(); - } - - IrcConnection* q_ptr; - QByteArray encoding; - IrcNetwork* network; - IrcProtocol* protocol; - QAbstractSocket* socket; - QString host; - int port; - QString userName; - QString nickName; - QString realName; - QString password; - QString displayName; - QVariantMap userData; - QTimer reconnecter; - QString saslMechanism; - bool enabled; - IrcConnection::Status status; - QList pendingCommands; - QList commandFilters; - QList messageFilters; - QStack activeCommandFilters; - bool sslErrors; - bool closed; -}; - -IRC_END_NAMESPACE - -#endif // IRCCONNECTION_P_H diff --git a/libcommuni/include/IrcCore/irccore.h b/libcommuni/include/IrcCore/irccore.h deleted file mode 100644 index b5ca266..0000000 --- a/libcommuni/include/IrcCore/irccore.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCCORE_H -#define IRCCORE_H - -#include "irc.h" -#include "irccommand.h" -#include "ircconnection.h" -#include "ircglobal.h" -#include "ircmessage.h" -#include "ircfilter.h" -#include "ircnetwork.h" -#include "ircprotocol.h" - -IRC_BEGIN_NAMESPACE - -namespace IrcCore { - void registerMetaTypes(); -} - -IRC_END_NAMESPACE - -#endif // IRCCORE_H diff --git a/libcommuni/include/IrcCore/ircfilter.h b/libcommuni/include/IrcCore/ircfilter.h deleted file mode 100644 index a2536fc..0000000 --- a/libcommuni/include/IrcCore/ircfilter.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCFILTER_H -#define IRCFILTER_H - -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcMessage; -class IrcCommand; - -class IRC_CORE_EXPORT IrcMessageFilter -{ -public: - virtual ~IrcMessageFilter() { } - virtual bool messageFilter(IrcMessage* message) = 0; -}; - -class IRC_CORE_EXPORT IrcCommandFilter -{ -public: - virtual ~IrcCommandFilter() { } - virtual bool commandFilter(IrcCommand* command) = 0; -}; - -IRC_END_NAMESPACE - -// TODO: fixme -#ifdef IRC_NAMESPACE -using IRC_NAMESPACE::IrcMessageFilter; -using IRC_NAMESPACE::IrcCommandFilter; -#endif - -Q_DECLARE_INTERFACE(IrcMessageFilter, "Communi.IrcMessageFilter") -Q_DECLARE_INTERFACE(IrcCommandFilter, "Communi.IrcCommandFilter") - -#endif // IRCFILTER_H diff --git a/libcommuni/include/IrcCore/ircglobal.h b/libcommuni/include/IrcCore/ircglobal.h deleted file mode 100644 index d088dba..0000000 --- a/libcommuni/include/IrcCore/ircglobal.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCGLOBAL_H -#define IRCGLOBAL_H - -#include - -/*! - \file ircglobal.h - \brief \#include <\ref ircglobal.h "IrcGlobal"> - */ - -#if defined(IRC_SHARED) -# -# if defined(BUILD_IRC_CORE) -# define IRC_CORE_EXPORT Q_DECL_EXPORT -# else -# define IRC_CORE_EXPORT Q_DECL_IMPORT -# endif -# -# if defined(BUILD_IRC_MODEL) -# define IRC_MODEL_EXPORT Q_DECL_EXPORT -# else -# define IRC_MODEL_EXPORT Q_DECL_IMPORT -# endif -# -# if defined(BUILD_IRC_UTIL) -# define IRC_UTIL_EXPORT Q_DECL_EXPORT -# else -# define IRC_UTIL_EXPORT Q_DECL_IMPORT -# endif -# -#elif defined(IRC_STATIC) || defined(BUILD_IRC_CORE) || defined(BUILD_IRC_MODEL) || defined(BUILD_IRC_UTIL) -# -# define IRC_CORE_EXPORT -# define IRC_MODEL_EXPORT -# define IRC_UTIL_EXPORT -# -#else -# error Installation problem: either IRC_SHARED or IRC_STATIC must be defined! -#endif - -/*! - \def IRC_VERSION - - This macro expands a numeric value of the form 0xMMNNPP (MM = major, NN = minor, PP = patch) that specifies Communi's version number. - For example, if you compile your application against Communi 1.2.3, the IRC_VERSION macro will expand to 0x010203. - - You can use IRC_VERSION to use the latest Communi features where available. For example: - \code - #if IRC_VERSION >= 0x000300 - // SSL support since version 0.3.0 - connection->setSocket(new QSslSocket(connection)); - #endif - \endcode - - \sa Irc::version() - */ -#define IRC_VERSION 0x030200 - -/*! - \def IRC_VERSION_STR - - This macro expands to a string that specifies Communi's version number (for example, "1.2.3"). - This is the version against which the application is compiled. - - \sa Irc::version() - */ -#define IRC_VERSION_STR "3.2.0" - -#ifdef IRC_NAMESPACE - -# define IRC_PREPEND_NAMESPACE(name) ::IRC_NAMESPACE::name -# define IRC_USE_NAMESPACE using namespace ::IRC_NAMESPACE; -# define IRC_BEGIN_NAMESPACE namespace IRC_NAMESPACE { -# define IRC_END_NAMESPACE } -# define IRC_FORWARD_DECLARE_CLASS(name) \ - IRC_BEGIN_NAMESPACE class name; IRC_END_NAMESPACE \ - using IRC_PREPEND_NAMESPACE(name); - -#else - -# define IRC_PREPEND_NAMESPACE(name) ::name -# define IRC_USE_NAMESPACE -# define IRC_BEGIN_NAMESPACE -# define IRC_END_NAMESPACE -# define IRC_FORWARD_DECLARE_CLASS(name) class name; - -#endif // IRC_NAMESPACE - -#endif // IRCGLOBAL_H diff --git a/libcommuni/include/IrcCore/ircmessage.h b/libcommuni/include/IrcCore/ircmessage.h deleted file mode 100644 index 02b8c86..0000000 --- a/libcommuni/include/IrcCore/ircmessage.h +++ /dev/null @@ -1,519 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCMESSAGE_H -#define IRCMESSAGE_H - -#include -#include -#include -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcCommand; -class IrcNetwork; -class IrcConnection; -class IrcMessagePrivate; - -class IRC_CORE_EXPORT IrcMessage : public QObject -{ - Q_OBJECT - Q_PROPERTY(IrcConnection* connection READ connection) - Q_PROPERTY(IrcNetwork* network READ network) - Q_PROPERTY(Type type READ type) - Q_PROPERTY(bool own READ isOwn) - Q_PROPERTY(Flags flags READ flags) - Q_PROPERTY(bool valid READ isValid) - Q_PROPERTY(QString command READ command) - Q_PROPERTY(QString prefix READ prefix WRITE setPrefix) - Q_PROPERTY(QString nick READ nick) - Q_PROPERTY(QString ident READ ident) - Q_PROPERTY(QString host READ host) - Q_PROPERTY(QStringList parameters READ parameters WRITE setParameters) - Q_PROPERTY(QDateTime timeStamp READ timeStamp WRITE setTimeStamp) - Q_PROPERTY(QVariantMap tags READ tags WRITE setTags) - Q_ENUMS(Type Flag) - Q_FLAGS(Flags) - -public: - enum Type { - Unknown, - Capability, - Error, - Invite, - Join, - Kick, - Mode, - Motd, - Names, - Nick, - Notice, - Numeric, - Part, - Ping, - Pong, - Private, - Quit, - Topic, - WhoReply - }; - - enum Flag { - None = 0x0, - Own = 0x1, - Identified = 0x2, - Unidentified = 0x4, - Playback = 0x8 - }; - Q_DECLARE_FLAGS(Flags, Flag) - - Q_INVOKABLE explicit IrcMessage(IrcConnection* connection); - virtual ~IrcMessage(); - - IrcConnection* connection() const; - IrcNetwork* network() const; - - Type type() const; - bool isOwn() const; - - Flags flags() const; - void setFlags(Flags flags); - - QString command() const; - void setCommand(const QString& command); - - QString prefix() const; - void setPrefix(const QString& prefix); - - QString nick() const; - QString ident() const; - QString host() const; - - QStringList parameters() const; - void setParameters(const QStringList& parameters); - - virtual bool isValid() const; - - QDateTime timeStamp() const; - void setTimeStamp(const QDateTime& timeStamp); - - QByteArray encoding() const; - void setEncoding(const QByteArray& encoding); - - QVariantMap tags() const; - void setTags(const QVariantMap& tags); - - Q_INVOKABLE QByteArray toData() const; - Q_INVOKABLE static IrcMessage* fromData(const QByteArray& data, IrcConnection* connection); - Q_INVOKABLE static IrcMessage* fromParameters(const QString& prefix, const QString& command, const QStringList& parameters, IrcConnection* connection); - -protected: - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcMessage) - Q_DISABLE_COPY(IrcMessage) -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(IrcMessage::Flags) - -class IRC_CORE_EXPORT IrcCapabilityMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString subCommand READ subCommand) - Q_PROPERTY(QStringList capabilities READ capabilities) - -public: - Q_INVOKABLE explicit IrcCapabilityMessage(IrcConnection* connection); - - QString subCommand() const; - QStringList capabilities() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcCapabilityMessage) -}; - -class IRC_CORE_EXPORT IrcErrorMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString error READ error) - -public: - Q_INVOKABLE explicit IrcErrorMessage(IrcConnection* connection); - - QString error() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcErrorMessage) -}; - -class IRC_CORE_EXPORT IrcInviteMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString user READ user) - Q_PROPERTY(QString channel READ channel) - -public: - Q_INVOKABLE explicit IrcInviteMessage(IrcConnection* connection); - - QString user() const; - QString channel() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcInviteMessage) -}; - -class IRC_CORE_EXPORT IrcJoinMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString channel READ channel) - -public: - Q_INVOKABLE explicit IrcJoinMessage(IrcConnection* connection); - - QString channel() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcJoinMessage) -}; - -class IRC_CORE_EXPORT IrcKickMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString channel READ channel) - Q_PROPERTY(QString user READ user) - Q_PROPERTY(QString reason READ reason) - -public: - Q_INVOKABLE explicit IrcKickMessage(IrcConnection* connection); - - QString channel() const; - QString user() const; - QString reason() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcKickMessage) -}; - -class IRC_CORE_EXPORT IrcModeMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString target READ target) - Q_PROPERTY(QString mode READ mode) - Q_PROPERTY(QString argument READ argument) - Q_PROPERTY(QStringList arguments READ arguments) - Q_PROPERTY(bool reply READ isReply) - Q_PROPERTY(Kind kind READ kind) - Q_ENUMS(Kind) - -public: - Q_INVOKABLE explicit IrcModeMessage(IrcConnection* connection); - - QString target() const; - QString mode() const; - QString argument() const; - QStringList arguments() const; - bool isReply() const; - - enum Kind { Channel, User }; - Kind kind() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcModeMessage) -}; - -class IRC_CORE_EXPORT IrcMotdMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QStringList lines READ lines) - -public: - Q_INVOKABLE explicit IrcMotdMessage(IrcConnection* connection); - - QStringList lines() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcMotdMessage) -}; - -class IRC_CORE_EXPORT IrcNamesMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString channel READ channel) - Q_PROPERTY(QStringList names READ names) - -public: - Q_INVOKABLE explicit IrcNamesMessage(IrcConnection* connection); - - QString channel() const; - QStringList names() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcNamesMessage) -}; - -class IRC_CORE_EXPORT IrcNickMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString oldNick READ oldNick) - Q_PROPERTY(QString newNick READ newNick) - -public: - Q_INVOKABLE explicit IrcNickMessage(IrcConnection* connection); - - QString oldNick() const; - QString newNick() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcNickMessage) -}; - -class IRC_CORE_EXPORT IrcNoticeMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString target READ target) - Q_PROPERTY(QString content READ content) - Q_PROPERTY(bool private READ isPrivate) - Q_PROPERTY(bool reply READ isReply) - -public: - Q_INVOKABLE explicit IrcNoticeMessage(IrcConnection* connection); - - QString target() const; - QString content() const; - bool isPrivate() const; - bool isReply() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcNoticeMessage) -}; - -class IRC_CORE_EXPORT IrcNumericMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(int code READ code) - -public: - Q_INVOKABLE explicit IrcNumericMessage(IrcConnection* connection); - - int code() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcNumericMessage) -}; - -class IRC_CORE_EXPORT IrcPartMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString channel READ channel) - Q_PROPERTY(QString reason READ reason) - -public: - Q_INVOKABLE explicit IrcPartMessage(IrcConnection* connection); - - QString channel() const; - QString reason() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcPartMessage) -}; - -class IRC_CORE_EXPORT IrcPingMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString argument READ argument) - -public: - Q_INVOKABLE explicit IrcPingMessage(IrcConnection* connection); - - QString argument() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcPingMessage) -}; - -class IRC_CORE_EXPORT IrcPongMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString argument READ argument) - -public: - Q_INVOKABLE explicit IrcPongMessage(IrcConnection* connection); - - QString argument() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcPongMessage) -}; - -class IRC_CORE_EXPORT IrcPrivateMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString target READ target) - Q_PROPERTY(QString content READ content) - Q_PROPERTY(bool private READ isPrivate) - Q_PROPERTY(bool action READ isAction) - Q_PROPERTY(bool request READ isRequest) - -public: - Q_INVOKABLE explicit IrcPrivateMessage(IrcConnection* connection); - - QString target() const; - QString content() const; - bool isPrivate() const; - bool isAction() const; - bool isRequest() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcPrivateMessage) -}; - -class IRC_CORE_EXPORT IrcQuitMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString reason READ reason) - -public: - Q_INVOKABLE explicit IrcQuitMessage(IrcConnection* connection); - - QString reason() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcQuitMessage) -}; - -class IRC_CORE_EXPORT IrcTopicMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString channel READ channel) - Q_PROPERTY(QString topic READ topic) - Q_PROPERTY(bool reply READ isReply) - -public: - Q_INVOKABLE explicit IrcTopicMessage(IrcConnection* connection); - - QString channel() const; - QString topic() const; - bool isReply() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcTopicMessage) -}; - -class IRC_CORE_EXPORT IrcWhoReplyMessage : public IrcMessage -{ - Q_OBJECT - Q_PROPERTY(QString mask READ mask) - Q_PROPERTY(QString server READ server) - Q_PROPERTY(bool away READ isAway) - Q_PROPERTY(bool servOp READ isServOp) - Q_PROPERTY(QString realName READ realName) - -public: - Q_INVOKABLE explicit IrcWhoReplyMessage(IrcConnection* connection); - - QString mask() const; - QString server() const; - bool isAway() const; - bool isServOp() const; - QString realName() const; - - bool isValid() const; - -private: - Q_DISABLE_COPY(IrcWhoReplyMessage) -}; - -#ifndef QT_NO_DEBUG_STREAM -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcMessage::Type type); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcMessage::Flag flag); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcMessage::Flags flags); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcModeMessage::Kind kind); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, const IrcMessage* message); -#endif // QT_NO_DEBUG_STREAM - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcMessage::Type)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCapabilityMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcErrorMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcInviteMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcJoinMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcKickMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcModeMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcMotdMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNamesMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNickMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNoticeMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNumericMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPartMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPingMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPongMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPrivateMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcQuitMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcTopicMessage*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcWhoReplyMessage*)) - -#endif // IRCMESSAGE_H diff --git a/libcommuni/include/IrcCore/ircmessage_p.h b/libcommuni/include/IrcCore/ircmessage_p.h deleted file mode 100644 index b2b50e1..0000000 --- a/libcommuni/include/IrcCore/ircmessage_p.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCMESSAGE_P_H -#define IRCMESSAGE_P_H - -#include -#include -#include -#include -#include -#include - -#include "ircmessage.h" - -IRC_BEGIN_NAMESPACE - -class IrcConnection; - -template -class IrcExplicitValue -{ -public: - IrcExplicitValue() : exp(false), null(true) { } - IrcExplicitValue(const T& value) : v(value), exp(false), null(false) { } - - bool isNull() const { return null; } - bool isExplicit() const { return exp; } - - const T& value() const { return v; } - void setValue(const T& value) { v = value; exp = true; null = false; } - - void clear() { v = T(); exp = false; null = true; } - -private: - T v; - bool exp; - bool null; -}; - -class IrcMessageData -{ -public: - static IrcMessageData fromData(const QByteArray& data); - - QByteArray content; - QByteArray prefix; - QByteArray command; - QList params; - QMap tags; -}; - -class IrcMessagePrivate -{ -public: - IrcMessagePrivate(); - - QString prefix() const; - void setPrefix(const QString& prefix); - - QString nick() const; - QString ident() const; - QString host() const; - - QString command() const; - void setCommand(const QString& command); - - QStringList params() const; - QString param(int index) const; - void setParams(const QStringList& params); - - QVariantMap tags() const; - void setTags(const QVariantMap& tags); - - QByteArray content() const; - - void invalidate(); - - static QString decode(const QByteArray& data, const QByteArray& encoding); - static bool parsePrefix(const QString& prefix, QString* nick, QString* ident, QString* host); - - IrcConnection* connection; - IrcMessage::Type type; - QDateTime timeStamp; - QByteArray encoding; - mutable int flags; - IrcMessageData data; - -private: - mutable QString m_nick, m_ident, m_host; - mutable IrcExplicitValue m_prefix; - mutable IrcExplicitValue m_command; - mutable IrcExplicitValue m_params; - mutable IrcExplicitValue m_tags; -}; - -IRC_END_NAMESPACE - -#endif // IRCMESSAGE_P_H diff --git a/libcommuni/include/IrcCore/ircmessagebuilder_p.h b/libcommuni/include/IrcCore/ircmessagebuilder_p.h deleted file mode 100644 index 3047eda..0000000 --- a/libcommuni/include/IrcCore/ircmessagebuilder_p.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCMESSAGEBUILDER_P_H -#define IRCMESSAGEBUILDER_P_H - -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcConnection; -class IrcMessage; -class IrcNumericMessage; - -class IrcMessageBuilder : public QObject -{ - Q_OBJECT - -public: - IrcMessageBuilder(IrcConnection* connection); - - void processMessage(IrcNumericMessage* message); - -Q_SIGNALS: - void messageReceived(IrcMessage* message); - -private: - struct Data { - IrcConnection* connection; - IrcMessage* message; - } d; -}; - -IRC_END_NAMESPACE - -#endif // IRCMESSAGEBUILDER_P_H diff --git a/libcommuni/include/IrcCore/ircmessagedecoder_p.h b/libcommuni/include/IrcCore/ircmessagedecoder_p.h deleted file mode 100644 index 005053e..0000000 --- a/libcommuni/include/IrcCore/ircmessagedecoder_p.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCMESSAGEDECODER_P_H -#define IRCMESSAGEDECODER_P_H - -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcMessageDecoder -{ -public: - IrcMessageDecoder(); - ~IrcMessageDecoder(); - - QString decode(const QByteArray& data, const QByteArray& encoding) const; - -private: - void initialize(); - void uninitialize(); - QByteArray codecForData(const QByteArray& data) const; - - struct Data { - void* detector; - } d; -}; - -IRC_END_NAMESPACE - -#endif // IRCMESSAGEDECODER_P_H diff --git a/libcommuni/include/IrcCore/ircmessagefilter.h b/libcommuni/include/IrcCore/ircmessagefilter.h deleted file mode 100644 index 1edae38..0000000 --- a/libcommuni/include/IrcCore/ircmessagefilter.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcCore/ircnetwork.h b/libcommuni/include/IrcCore/ircnetwork.h deleted file mode 100644 index 6b2a5d2..0000000 --- a/libcommuni/include/IrcCore/ircnetwork.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCNETWORK_H -#define IRCNETWORK_H - -#include -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcConnection; -class IrcNetworkPrivate; - -class IRC_CORE_EXPORT IrcNetwork : public QObject -{ - Q_OBJECT - Q_PROPERTY(bool initialized READ isInitialized NOTIFY initialized) - Q_PROPERTY(QString name READ name NOTIFY nameChanged) - Q_PROPERTY(QStringList modes READ modes NOTIFY modesChanged) - Q_PROPERTY(QStringList prefixes READ prefixes NOTIFY prefixesChanged) - Q_PROPERTY(QStringList channelTypes READ channelTypes NOTIFY channelTypesChanged) - Q_PROPERTY(QStringList availableCapabilities READ availableCapabilities NOTIFY availableCapabilitiesChanged) - Q_PROPERTY(QStringList requestedCapabilities READ requestedCapabilities WRITE setRequestedCapabilities NOTIFY requestedCapabilitiesChanged) - Q_PROPERTY(QStringList activeCapabilities READ activeCapabilities NOTIFY activeCapabilitiesChanged) - Q_ENUMS(Limit ModeType) - Q_FLAGS(ModeTypes) - -public: - virtual ~IrcNetwork(); - - bool isInitialized(); - - QString name() const; - - QStringList modes() const; - QStringList prefixes() const; - - Q_INVOKABLE QString modeToPrefix(const QString& mode) const; - Q_INVOKABLE QString prefixToMode(const QString& prefix) const; - - QStringList channelTypes() const; - - Q_INVOKABLE bool isChannel(const QString& name) const; - - enum ModeType { - TypeA = 0x1, - TypeB = 0x2, - TypeC = 0x4, - TypeD = 0x8, - AllTypes = 0xf - }; - Q_DECLARE_FLAGS(ModeTypes, ModeType) - - Q_INVOKABLE QStringList channelModes(IrcNetwork::ModeTypes types) const; - - enum Limit { - NickLength, - ChannelLength, - TopicLength, - MessageLength, - KickReasonLength, - AwayReasonLength, - ModeCount - }; - - Q_INVOKABLE int numericLimit(IrcNetwork::Limit limit) const; - - Q_INVOKABLE int modeLimit(const QString& mode) const; - Q_INVOKABLE int channelLimit(const QString& type) const; - Q_INVOKABLE int targetLimit(const QString& command) const; - - QStringList availableCapabilities() const; - QStringList requestedCapabilities() const; - QStringList activeCapabilities() const; - - Q_INVOKABLE bool hasCapability(const QString& capability) const; - Q_INVOKABLE bool isCapable(const QString& capability) const; - -public Q_SLOTS: - bool requestCapability(const QString& capability); - bool requestCapabilities(const QStringList& capabilities); - void setRequestedCapabilities(const QStringList& capabilities); - -Q_SIGNALS: - void initialized(); - void nameChanged(const QString& name); - void modesChanged(const QStringList& modes); - void prefixesChanged(const QStringList& prefixes); - void channelTypesChanged(const QStringList& types); - void availableCapabilitiesChanged(const QStringList& capabilities); - void requestedCapabilitiesChanged(const QStringList& capabilities); - void activeCapabilitiesChanged(const QStringList& capabilities); - void requestingCapabilities(); - -private: - friend class IrcProtocol; - friend class IrcConnection; - explicit IrcNetwork(IrcConnection* connection); - - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcNetwork) - Q_DISABLE_COPY(IrcNetwork) -}; - -#ifndef QT_NO_DEBUG_STREAM -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcNetwork::Limit limit); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcNetwork::ModeType type); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcNetwork::ModeTypes types); -IRC_CORE_EXPORT QDebug operator<<(QDebug debug, const IrcNetwork* network); -#endif // QT_NO_DEBUG_STREAM - -Q_DECLARE_OPERATORS_FOR_FLAGS(IrcNetwork::ModeTypes) - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNetwork*)) - -#endif // IRCNETWORK_H diff --git a/libcommuni/include/IrcCore/ircnetwork_p.h b/libcommuni/include/IrcCore/ircnetwork_p.h deleted file mode 100644 index 22e6435..0000000 --- a/libcommuni/include/IrcCore/ircnetwork_p.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCNETWORK_P_H -#define IRCNETWORK_P_H - -#include "ircnetwork.h" - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcNetworkPrivate -{ - Q_DECLARE_PUBLIC(IrcNetwork) - -public: - IrcNetworkPrivate(); - - void setInfo(const QHash& info); - void setAvailableCapabilities(const QSet& capabilities); - void setActiveCapabilities(const QSet& capabilities); - - void setName(const QString& name); - void setModes(const QStringList& modes); - void setPrefixes(const QStringList& prefixes); - void setChannelTypes(const QStringList& types); - - static IrcNetwork* create(IrcConnection* connection) - { - return new IrcNetwork(connection); - } - - static IrcNetworkPrivate* get(const IrcNetwork* network) - { - return network->d_ptr.data(); - } - - IrcNetwork* q_ptr; - QPointer connection; - bool initialized; - QString name; - QStringList modes, prefixes, channelTypes, channelModes; - QHash numericLimits, modeLimits, channelLimits, targetLimits; - QSet availableCaps, requestedCaps, activeCaps; -}; - -IRC_END_NAMESPACE - -#endif // IRCNETWORK_P_H diff --git a/libcommuni/include/IrcCore/ircprotocol.h b/libcommuni/include/IrcCore/ircprotocol.h deleted file mode 100644 index ae600c4..0000000 --- a/libcommuni/include/IrcCore/ircprotocol.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCPROTOCOL_H -#define IRCPROTOCOL_H - -#include -#include -#include -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcMessage; -class IrcProtocolPrivate; - -class IRC_CORE_EXPORT IrcProtocol : public QObject -{ - Q_OBJECT - Q_PROPERTY(IrcConnection* connection READ connection) - Q_PROPERTY(QAbstractSocket* socket READ socket) - -public: - explicit IrcProtocol(IrcConnection* connection); - virtual ~IrcProtocol(); - - IrcConnection* connection() const; - QAbstractSocket* socket() const; - - virtual void open(); - virtual void close(); - - virtual void read(); - virtual bool write(const QByteArray& data); - -public Q_SLOTS: - void receiveMessage(IrcMessage* message); - -protected Q_SLOTS: - void setNickName(const QString& name); - void setStatus(IrcConnection::Status status); - void setInfo(const QHash& info); - void setAvailableCapabilities(const QSet& capabilities); - void setActiveCapabilities(const QSet& capabilities); - -private: - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcProtocol) - Q_DISABLE_COPY(IrcProtocol) - - Q_PRIVATE_SLOT(d_func(), void _irc_pauseHandshake()) - Q_PRIVATE_SLOT(d_func(), void _irc_resumeHandshake()) -}; - -IRC_END_NAMESPACE - -#endif // IRCPROTOCOL_H diff --git a/libcommuni/include/IrcModel/IrcBuffer b/libcommuni/include/IrcModel/IrcBuffer deleted file mode 100644 index 4c88f75..0000000 --- a/libcommuni/include/IrcModel/IrcBuffer +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcModel/IrcBufferModel b/libcommuni/include/IrcModel/IrcBufferModel deleted file mode 100644 index 149310e..0000000 --- a/libcommuni/include/IrcModel/IrcBufferModel +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcModel/IrcChannel b/libcommuni/include/IrcModel/IrcChannel deleted file mode 100644 index 9392686..0000000 --- a/libcommuni/include/IrcModel/IrcChannel +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcModel/IrcModel b/libcommuni/include/IrcModel/IrcModel deleted file mode 100644 index 0ca546f..0000000 --- a/libcommuni/include/IrcModel/IrcModel +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcModel/IrcUser b/libcommuni/include/IrcModel/IrcUser deleted file mode 100644 index 7b7b69e..0000000 --- a/libcommuni/include/IrcModel/IrcUser +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcModel/IrcUserModel b/libcommuni/include/IrcModel/IrcUserModel deleted file mode 100644 index 90a67b7..0000000 --- a/libcommuni/include/IrcModel/IrcUserModel +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcModel/ircbuffer.h b/libcommuni/include/IrcModel/ircbuffer.h deleted file mode 100644 index 69cc69f..0000000 --- a/libcommuni/include/IrcModel/ircbuffer.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCBUFFER_H -#define IRCBUFFER_H - -#include -#include -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcChannel; -class IrcCommand; -class IrcMessage; -class IrcNetwork; -class IrcConnection; -class IrcBufferModel; -class IrcBufferPrivate; - -class IRC_MODEL_EXPORT IrcBuffer : public QObject -{ - Q_OBJECT - Q_PROPERTY(QString title READ title NOTIFY titleChanged) - Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) - Q_PROPERTY(QString prefix READ prefix WRITE setPrefix NOTIFY prefixChanged) - Q_PROPERTY(IrcConnection* connection READ connection CONSTANT) - Q_PROPERTY(IrcNetwork* network READ network CONSTANT) - Q_PROPERTY(IrcBufferModel* model READ model CONSTANT) - Q_PROPERTY(bool active READ isActive NOTIFY activeChanged) - Q_PROPERTY(bool channel READ isChannel CONSTANT) - Q_PROPERTY(bool sticky READ isSticky WRITE setSticky NOTIFY stickyChanged) - Q_PROPERTY(bool persistent READ isPersistent WRITE setPersistent NOTIFY persistentChanged) - Q_PROPERTY(QVariantMap userData READ userData WRITE setUserData NOTIFY userDataChanged) - -public: - Q_INVOKABLE explicit IrcBuffer(QObject* parent = 0); - virtual ~IrcBuffer(); - - QString title() const; - QString name() const; - QString prefix() const; - - bool isChannel() const; - Q_INVOKABLE IrcChannel* toChannel(); - - IrcConnection* connection() const; - IrcNetwork* network() const; - IrcBufferModel* model() const; - - virtual bool isActive() const; - - bool isSticky() const; - void setSticky(bool sticky); - - bool isPersistent() const; - void setPersistent(bool persistent); - - QVariantMap userData() const; - void setUserData(const QVariantMap& data); - - Q_INVOKABLE bool sendCommand(IrcCommand* command); - -public Q_SLOTS: - void setName(const QString& name); - void setPrefix(const QString& prefix); - void receiveMessage(IrcMessage* message); - virtual void close(const QString& reason = QString()); - -Q_SIGNALS: - void titleChanged(const QString& title); - void nameChanged(const QString& name); - void prefixChanged(const QString& name); - void messageReceived(IrcMessage* message); - void destroyed(IrcBuffer* buffer); - void activeChanged(bool active); - void stickyChanged(bool sticky); - void persistentChanged(bool persistent); - void userDataChanged(const QVariantMap& data); - -protected: - IrcBuffer(IrcBufferPrivate& dd, QObject* parent); - - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcBuffer) - Q_DISABLE_COPY(IrcBuffer) -}; - -#ifndef QT_NO_DEBUG_STREAM -IRC_MODEL_EXPORT QDebug operator<<(QDebug debug, const IrcBuffer* buffer); -#endif // QT_NO_DEBUG_STREAM - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcBuffer*)) -Q_DECLARE_METATYPE(QList) - -#endif // IRCBUFFER_H diff --git a/libcommuni/include/IrcModel/ircbuffer_p.h b/libcommuni/include/IrcModel/ircbuffer_p.h deleted file mode 100644 index cadc043..0000000 --- a/libcommuni/include/IrcModel/ircbuffer_p.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCBUFFER_P_H -#define IRCBUFFER_P_H - -#include "ircbuffer.h" -#include "ircmessage.h" -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcUser; -class IrcUserModel; - -class IrcBufferPrivate -{ - Q_DECLARE_PUBLIC(IrcBuffer) - -public: - IrcBufferPrivate(); - virtual ~IrcBufferPrivate(); - - virtual void init(const QString& title, IrcBufferModel* model); - virtual void connected(); - virtual void disconnected(); - - void setName(const QString& name); - void setPrefix(const QString& prefix); - void setModel(IrcBufferModel* model); - - bool processMessage(IrcMessage* message); - - virtual bool processJoinMessage(IrcJoinMessage* message); - virtual bool processKickMessage(IrcKickMessage* message); - virtual bool processModeMessage(IrcModeMessage* message); - virtual bool processNamesMessage(IrcNamesMessage* message); - virtual bool processNickMessage(IrcNickMessage* message); - virtual bool processNoticeMessage(IrcNoticeMessage* message); - virtual bool processNumericMessage(IrcNumericMessage* message); - virtual bool processPartMessage(IrcPartMessage* message); - virtual bool processPrivateMessage(IrcPrivateMessage* message); - virtual bool processQuitMessage(IrcQuitMessage* message); - virtual bool processTopicMessage(IrcTopicMessage* message); - virtual bool processWhoReplyMessage(IrcWhoReplyMessage* message); - - static IrcBufferPrivate* get(IrcBuffer* buffer) - { - return buffer->d_func(); - } - - IrcBuffer* q_ptr; - IrcBufferModel* model; - QString name; - QString prefix; - bool persistent; - bool sticky; - QVariantMap userData; -}; - -IRC_END_NAMESPACE - -#endif // IRCBUFFER_P_H diff --git a/libcommuni/include/IrcModel/ircbuffermodel.h b/libcommuni/include/IrcModel/ircbuffermodel.h deleted file mode 100644 index ef23fc4..0000000 --- a/libcommuni/include/IrcModel/ircbuffermodel.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCBUFFERMODEL_H -#define IRCBUFFERMODEL_H - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcBuffer; -class IrcChannel; -class IrcMessage; -class IrcNetwork; -class IrcConnection; -class IrcBufferModelPrivate; - -class IRC_MODEL_EXPORT IrcBufferModel : public QAbstractListModel -{ - Q_OBJECT - Q_PROPERTY(int count READ count NOTIFY countChanged) - Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged) - Q_PROPERTY(Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder) - Q_PROPERTY(Irc::SortMethod sortMethod READ sortMethod WRITE setSortMethod) - Q_PROPERTY(QStringList channels READ channels NOTIFY channelsChanged) - Q_PROPERTY(Irc::DataRole displayRole READ displayRole WRITE setDisplayRole) - Q_PROPERTY(bool persistent READ isPersistent WRITE setPersistent NOTIFY persistentChanged) - Q_PROPERTY(QList buffers READ buffers NOTIFY buffersChanged) - Q_PROPERTY(IrcConnection* connection READ connection WRITE setConnection NOTIFY connectionChanged) - Q_PROPERTY(IrcNetwork* network READ network NOTIFY networkChanged) - Q_PROPERTY(IrcBuffer* bufferPrototype READ bufferPrototype WRITE setBufferPrototype NOTIFY bufferPrototypeChanged) - Q_PROPERTY(IrcChannel* channelPrototype READ channelPrototype WRITE setChannelPrototype NOTIFY channelPrototypeChanged) - -public: - explicit IrcBufferModel(QObject* parent = 0); - virtual ~IrcBufferModel(); - - IrcConnection* connection() const; - void setConnection(IrcConnection* connection); - - IrcNetwork* network() const; - - int count() const; - bool isEmpty() const; - QStringList channels() const; - QList buffers() const; - Q_INVOKABLE IrcBuffer* get(int index) const; - Q_INVOKABLE IrcBuffer* find(const QString& title) const; - Q_INVOKABLE bool contains(const QString& title) const; - Q_INVOKABLE int indexOf(IrcBuffer* buffer) const; - - Q_INVOKABLE IrcBuffer* add(const QString& title); - Q_INVOKABLE void add(IrcBuffer* buffer); - Q_INVOKABLE void remove(const QString& title); - Q_INVOKABLE void remove(IrcBuffer* buffer); - - Qt::SortOrder sortOrder() const; - void setSortOrder(Qt::SortOrder order); - - Irc::SortMethod sortMethod() const; - void setSortMethod(Irc::SortMethod method); - - Irc::DataRole displayRole() const; - void setDisplayRole(Irc::DataRole role); - - bool isPersistent() const; - void setPersistent(bool persistent); - - QModelIndex index(IrcBuffer* buffer) const; - IrcBuffer* buffer(const QModelIndex& index) const; - - QHash roleNames() const; - int rowCount(const QModelIndex& parent = QModelIndex()) const; - QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; - QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const; - - IrcBuffer* bufferPrototype() const; - void setBufferPrototype(IrcBuffer* prototype); - - IrcChannel* channelPrototype() const; - void setChannelPrototype(IrcChannel* prototype); - - Q_INVOKABLE QByteArray saveState(int version = 0) const; - Q_INVOKABLE bool restoreState(const QByteArray& state, int version = 0); - -public Q_SLOTS: - void clear(); - void receiveMessage(IrcMessage* message); - void sort(int column = 0, Qt::SortOrder order = Qt::AscendingOrder); - void sort(Irc::SortMethod method, Qt::SortOrder order = Qt::AscendingOrder); - -Q_SIGNALS: - void countChanged(int count); - void emptyChanged(bool empty); - void added(IrcBuffer* buffer); - void removed(IrcBuffer* buffer); - void aboutToBeAdded(IrcBuffer* buffer); - void aboutToBeRemoved(IrcBuffer* buffer); - void persistentChanged(bool persistent); - void buffersChanged(const QList& buffers); - void channelsChanged(const QStringList& channels); - void connectionChanged(IrcConnection* connection); - void networkChanged(IrcNetwork* network); - void messageIgnored(IrcMessage* message); - void bufferPrototypeChanged(IrcBuffer* prototype); - void channelPrototypeChanged(IrcChannel* prototype); - void destroyed(IrcBufferModel* model); - -protected Q_SLOTS: - virtual IrcBuffer* createBuffer(const QString& title); - virtual IrcChannel* createChannel(const QString& title); - -protected: - virtual bool lessThan(IrcBuffer* one, IrcBuffer* another, Irc::SortMethod method) const; - -private: - friend class IrcBufferLessThan; - friend class IrcBufferGreaterThan; - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcBufferModel) - Q_DISABLE_COPY(IrcBufferModel) - - Q_PRIVATE_SLOT(d_func(), void _irc_connected()) - Q_PRIVATE_SLOT(d_func(), void _irc_disconnected()) - Q_PRIVATE_SLOT(d_func(), void _irc_bufferDestroyed(IrcBuffer*)) -}; - -IRC_END_NAMESPACE - -#endif // IRCBUFFERMODEL_H diff --git a/libcommuni/include/IrcModel/ircbuffermodel_p.h b/libcommuni/include/IrcModel/ircbuffermodel_p.h deleted file mode 100644 index c7446b0..0000000 --- a/libcommuni/include/IrcModel/ircbuffermodel_p.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCBUFFERMODEL_P_H -#define IRCBUFFERMODEL_P_H - -#include "ircbuffer.h" -#include "ircfilter.h" -#include "ircbuffermodel.h" -#include - -IRC_BEGIN_NAMESPACE - -class IrcBufferModelPrivate : public QObject, public IrcMessageFilter, public IrcCommandFilter -{ - Q_OBJECT - Q_DECLARE_PUBLIC(IrcBufferModel) - Q_INTERFACES(IrcMessageFilter IrcCommandFilter) - -public: - IrcBufferModelPrivate(); - - bool messageFilter(IrcMessage* message); - bool commandFilter(IrcCommand* command); - - IrcBuffer* createBufferHelper(const QString& title); - IrcChannel* createChannelHelper(const QString& title); - - IrcBuffer* createBuffer(const QString& title); - void destroyBuffer(const QString& title, bool force = false); - - void addBuffer(IrcBuffer* buffer, bool notify = true); - void insertBuffer(int index, IrcBuffer* buffer, bool notify = true); - void removeBuffer(IrcBuffer* buffer, bool notify = true); - bool renameBuffer(const QString& from, const QString& to); - - bool processMessage(const QString& title, IrcMessage* message, bool create = false); - - void _irc_connected(); - void _irc_disconnected(); - void _irc_bufferDestroyed(IrcBuffer* buffer); - - static IrcBufferModelPrivate* get(IrcBufferModel* model) - { - return model->d_func(); - } - - IrcBufferModel* q_ptr; - Irc::DataRole role; - QPointer connection; - QList bufferList; - QMap bufferMap; - QHash keys; - QStringList channels; - Irc::SortMethod sortMethod; - Qt::SortOrder sortOrder; - IrcBuffer* bufferProto; - IrcChannel* channelProto; - bool persistent; -}; - -IRC_END_NAMESPACE - -#endif // IRCBUFFERMODEL_P_H diff --git a/libcommuni/include/IrcModel/ircchannel.h b/libcommuni/include/IrcModel/ircchannel.h deleted file mode 100644 index e16de90..0000000 --- a/libcommuni/include/IrcModel/ircchannel.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCCHANNEL_H -#define IRCCHANNEL_H - -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcChannelPrivate; - -class IRC_MODEL_EXPORT IrcChannel : public IrcBuffer -{ - Q_OBJECT - Q_PROPERTY(QString key READ key NOTIFY keyChanged) - Q_PROPERTY(QString mode READ mode NOTIFY modeChanged) - Q_PROPERTY(QString topic READ topic NOTIFY topicChanged) - -public: - Q_INVOKABLE explicit IrcChannel(QObject* parent = 0); - virtual ~IrcChannel(); - - QString key() const; - QString mode() const; - QString topic() const; - - virtual bool isActive() const; - -public Q_SLOTS: - void join(const QString& key = QString()); - void part(const QString& reason = QString()); - void close(const QString& reason = QString()); - -Q_SIGNALS: - void keyChanged(const QString& key); - void modeChanged(const QString& mode); - void topicChanged(const QString& topic); - void destroyed(IrcChannel* channel); -private: - Q_DECLARE_PRIVATE(IrcChannel) - Q_DISABLE_COPY(IrcChannel) -}; - -#ifndef QT_NO_DEBUG_STREAM -IRC_MODEL_EXPORT QDebug operator<<(QDebug debug, const IrcChannel* channel); -#endif // QT_NO_DEBUG_STREAM - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcChannel*)) -Q_DECLARE_METATYPE(QList) - -#endif // IRCCHANNEL diff --git a/libcommuni/include/IrcModel/ircchannel_p.h b/libcommuni/include/IrcModel/ircchannel_p.h deleted file mode 100644 index 9da375b..0000000 --- a/libcommuni/include/IrcModel/ircchannel_p.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCCHANNEL_P_H -#define IRCCHANNEL_P_H - -#include "ircchannel.h" -#include "ircnetwork.h" -#include "ircbuffer_p.h" -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcChannelPrivate : public IrcBufferPrivate -{ - Q_DECLARE_PUBLIC(IrcChannel) - -public: - IrcChannelPrivate(); - virtual ~IrcChannelPrivate(); - - virtual void init(const QString& title, IrcBufferModel* model); - virtual void connected(); - virtual void disconnected(); - - void setActive(bool active); - - void changeModes(const QString& value, const QStringList& arguments); - void setModes(const QString& value, const QStringList& arguments); - void setTopic(const QString& value); - void setKey(const QString& value); - - void addUser(const QString& user); - bool removeUser(const QString& user); - void setUsers(const QStringList& users); - bool renameUser(const QString& from, const QString& to); - void setUserMode(const QString& user, const QString& mode); - void promoteUser(const QString& user); - void setUserAway(const QString &name, const bool& away); - void setUserServOp(const QString &name, const bool& servOp); - - virtual bool processJoinMessage(IrcJoinMessage* message); - virtual bool processKickMessage(IrcKickMessage* message); - virtual bool processModeMessage(IrcModeMessage* message); - virtual bool processNamesMessage(IrcNamesMessage* message); - virtual bool processNickMessage(IrcNickMessage* message); - virtual bool processNoticeMessage(IrcNoticeMessage* message); - virtual bool processNumericMessage(IrcNumericMessage* message); - virtual bool processPartMessage(IrcPartMessage* message); - virtual bool processPrivateMessage(IrcPrivateMessage* message); - virtual bool processQuitMessage(IrcQuitMessage* message); - virtual bool processTopicMessage(IrcTopicMessage* message); - virtual bool processWhoReplyMessage(IrcWhoReplyMessage* message); - - static IrcChannelPrivate* get(IrcChannel* channel) - { - return channel->d_func(); - } - - QMap modes; - QString topic; - bool active; - QStringList names; - QList userList; - QList activeUsers; - QMap userMap; - QList userModels; -}; - -IRC_END_NAMESPACE - -#endif // IRCCHANNEL_P_H diff --git a/libcommuni/include/IrcModel/ircmodel.h b/libcommuni/include/IrcModel/ircmodel.h deleted file mode 100644 index 45ac4bd..0000000 --- a/libcommuni/include/IrcModel/ircmodel.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCMODEL_H -#define IRCMODEL_H - -#include "ircbuffer.h" -#include "ircbuffermodel.h" -#include "ircchannel.h" -#include "ircuser.h" -#include "ircusermodel.h" - -IRC_BEGIN_NAMESPACE - -namespace IrcModel { - void registerMetaTypes(); -} - -IRC_END_NAMESPACE - -#endif // IRCMODEL_H diff --git a/libcommuni/include/IrcModel/ircuser.h b/libcommuni/include/IrcModel/ircuser.h deleted file mode 100644 index 9e59a9f..0000000 --- a/libcommuni/include/IrcModel/ircuser.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCUSER_H -#define IRCUSER_H - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcChannel; -class IrcUserPrivate; - -class IRC_MODEL_EXPORT IrcUser : public QObject -{ - Q_OBJECT - Q_PROPERTY(QString title READ title NOTIFY titleChanged) - Q_PROPERTY(QString name READ name NOTIFY nameChanged) - Q_PROPERTY(QString prefix READ prefix NOTIFY prefixChanged) - Q_PROPERTY(QString mode READ mode NOTIFY modeChanged) - Q_PROPERTY(bool servOp READ isServOp NOTIFY servOpChanged) - Q_PROPERTY(bool away READ isAway NOTIFY awayChanged) - Q_PROPERTY(IrcChannel* channel READ channel CONSTANT) - -public: - explicit IrcUser(QObject* parent = 0); - virtual ~IrcUser(); - - QString title() const; - QString name() const; - QString prefix() const; - QString mode() const; - bool isServOp() const; - bool isAway() const; - - IrcChannel* channel() const; - -Q_SIGNALS: - void titleChanged(const QString& title); - void nameChanged(const QString& name); - void prefixChanged(const QString& prefix); - void modeChanged(const QString& mode); - void servOpChanged(bool servOp); - void awayChanged(bool away); - -private: - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcUser) - Q_DISABLE_COPY(IrcUser) -}; - -#ifndef QT_NO_DEBUG_STREAM -IRC_MODEL_EXPORT QDebug operator<<(QDebug debug, const IrcUser* user); -#endif // QT_NO_DEBUG_STREAM - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcUser*)) -Q_DECLARE_METATYPE(QList) - -#endif // IRCUSER_H diff --git a/libcommuni/include/IrcModel/ircuser_p.h b/libcommuni/include/IrcModel/ircuser_p.h deleted file mode 100644 index 0e88e6b..0000000 --- a/libcommuni/include/IrcModel/ircuser_p.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCUSER_P_H -#define IRCUSER_P_H - -#include "ircuser.h" - -IRC_BEGIN_NAMESPACE - -class IrcUserPrivate -{ - Q_DECLARE_PUBLIC(IrcUser) - -public: - void setName(const QString& n); - void setPrefix(const QString& p); - void setMode(const QString& m); - void setServOp(const bool& o); - void setAway(const bool& a); - - static IrcUserPrivate* get(IrcUser* user) - { - return user->d_func(); - } - - IrcUser* q_ptr; - IrcChannel* channel; - QString name; - QString prefix; - QString mode; - bool servOp; - bool away; -}; - -IRC_END_NAMESPACE - -#endif // IRCUSER_P_H diff --git a/libcommuni/include/IrcModel/ircusermodel.h b/libcommuni/include/IrcModel/ircusermodel.h deleted file mode 100644 index 331af37..0000000 --- a/libcommuni/include/IrcModel/ircusermodel.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCUSERMODEL_H -#define IRCUSERMODEL_H - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcUser; -class IrcChannel; -class IrcMessage; -class IrcUserModelPrivate; - -class IRC_MODEL_EXPORT IrcUserModel : public QAbstractListModel -{ - Q_OBJECT - Q_PROPERTY(int count READ count NOTIFY countChanged) - Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged) - Q_PROPERTY(QStringList names READ names NOTIFY namesChanged) - Q_PROPERTY(QList users READ users NOTIFY usersChanged) - Q_PROPERTY(Irc::DataRole displayRole READ displayRole WRITE setDisplayRole) - Q_PROPERTY(IrcChannel* channel READ channel WRITE setChannel NOTIFY channelChanged) - Q_PROPERTY(Irc::SortMethod sortMethod READ sortMethod WRITE setSortMethod) - Q_PROPERTY(Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder) - -public: - explicit IrcUserModel(QObject* parent = 0); - virtual ~IrcUserModel(); - - IrcChannel* channel() const; - void setChannel(IrcChannel* channel); - - int count() const; - bool isEmpty() const; - QStringList names() const; - QList users() const; - Q_INVOKABLE IrcUser* get(int index) const; - Q_INVOKABLE IrcUser* find(const QString& name) const; - Q_INVOKABLE bool contains(const QString& name) const; - Q_INVOKABLE int indexOf(IrcUser* user) const; - - Irc::DataRole displayRole() const; - void setDisplayRole(Irc::DataRole role); - - Irc::SortMethod sortMethod() const; - void setSortMethod(Irc::SortMethod method); - - Qt::SortOrder sortOrder() const; - void setSortOrder(Qt::SortOrder order); - - QModelIndex index(IrcUser* user) const; - IrcUser* user(const QModelIndex& index) const; - - QHash roleNames() const; - int rowCount(const QModelIndex& parent = QModelIndex()) const; - QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; - QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const; - -public Q_SLOTS: - void clear(); - void sort(int column = 0, Qt::SortOrder order = Qt::AscendingOrder); - void sort(Irc::SortMethod method, Qt::SortOrder order = Qt::AscendingOrder); - -Q_SIGNALS: - void added(IrcUser* user); - void removed(IrcUser* user); - void aboutToBeAdded(IrcUser* user); - void aboutToBeRemoved(IrcUser* user); - void countChanged(int count); - void emptyChanged(bool empty); - void namesChanged(const QStringList& names); - void usersChanged(const QList& users); - void channelChanged(IrcChannel* channel); - -protected: - virtual bool lessThan(IrcUser* one, IrcUser* another, Irc::SortMethod method) const; - -private: - friend class IrcUserLessThan; - friend class IrcChannelPrivate; - friend class IrcUserGreaterThan; - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcUserModel) - Q_DISABLE_COPY(IrcUserModel) -}; - -IRC_END_NAMESPACE - -#endif // IRCUSERMODEL_H diff --git a/libcommuni/include/IrcModel/ircusermodel_p.h b/libcommuni/include/IrcModel/ircusermodel_p.h deleted file mode 100644 index 45c00bb..0000000 --- a/libcommuni/include/IrcModel/ircusermodel_p.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCUSERMODEL_P_H -#define IRCUSERMODEL_P_H - -#include "ircuser.h" -#include "ircchannel_p.h" -#include "ircusermodel.h" -#include - -IRC_BEGIN_NAMESPACE - -class IrcUserModelPrivate -{ - Q_DECLARE_PUBLIC(IrcUserModel) - -public: - IrcUserModelPrivate(); - - void addUser(IrcUser* user, bool notify = true); - void insertUser(int index, IrcUser* user, bool notify = true); - void removeUser(IrcUser* user, bool notify = true); - void setUsers(const QList& users, bool reset = true); - void renameUser(IrcUser* user); - void setUserMode(IrcUser* user); - void promoteUser(IrcUser* user); - - static IrcUserModelPrivate* get(IrcUserModel* model) - { - return model->d_func(); - } - - IrcUserModel* q_ptr; - Irc::DataRole role; - QList userList; - QPointer channel; - Irc::SortMethod sortMethod; - Qt::SortOrder sortOrder; -}; - -IRC_END_NAMESPACE - -#endif // IRCUSERMODEL_P_H diff --git a/libcommuni/include/IrcUtil/IrcCommandParser b/libcommuni/include/IrcUtil/IrcCommandParser deleted file mode 100644 index 0cac681..0000000 --- a/libcommuni/include/IrcUtil/IrcCommandParser +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcUtil/IrcCompleter b/libcommuni/include/IrcUtil/IrcCompleter deleted file mode 100644 index 7f561f4..0000000 --- a/libcommuni/include/IrcUtil/IrcCompleter +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcUtil/IrcLagTimer b/libcommuni/include/IrcUtil/IrcLagTimer deleted file mode 100644 index d290939..0000000 --- a/libcommuni/include/IrcUtil/IrcLagTimer +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcUtil/IrcPalette b/libcommuni/include/IrcUtil/IrcPalette deleted file mode 100644 index b82c1c0..0000000 --- a/libcommuni/include/IrcUtil/IrcPalette +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcUtil/IrcTextFormat b/libcommuni/include/IrcUtil/IrcTextFormat deleted file mode 100644 index f78fd81..0000000 --- a/libcommuni/include/IrcUtil/IrcTextFormat +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcUtil/IrcUtil b/libcommuni/include/IrcUtil/IrcUtil deleted file mode 100644 index 64e9f15..0000000 --- a/libcommuni/include/IrcUtil/IrcUtil +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/libcommuni/include/IrcUtil/irccommandparser.h b/libcommuni/include/IrcUtil/irccommandparser.h deleted file mode 100644 index c31a6f2..0000000 --- a/libcommuni/include/IrcUtil/irccommandparser.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCCOMMANDPARSER_H -#define IRCCOMMANDPARSER_H - -#include -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcCommandParserPrivate; - -class IRC_UTIL_EXPORT IrcCommandParser : public QObject -{ - Q_OBJECT - Q_PROPERTY(QStringList commands READ commands NOTIFY commandsChanged) - Q_PROPERTY(QStringList triggers READ triggers WRITE setTriggers NOTIFY triggersChanged) - Q_PROPERTY(QStringList channels READ channels WRITE setChannels NOTIFY channelsChanged) - Q_PROPERTY(QString target READ target WRITE setTarget NOTIFY targetChanged) - Q_PROPERTY(bool tolerant READ isTolerant WRITE setTolerant NOTIFY tolerancyChanged) - Q_FLAGS(Details) - -public: - explicit IrcCommandParser(QObject* parent = 0); - virtual ~IrcCommandParser(); - - QStringList commands() const; - - enum Detail { - Full = 0x0, - NoTarget = 0x1, - NoPrefix = 0x2, - NoEllipsis = 0x4, - NoParentheses = 0x8, - NoBrackets = 0x10, - NoAngles = 0x20, - Visual = NoTarget | NoPrefix | NoEllipsis - }; - Q_DECLARE_FLAGS(Details, Detail) - - Q_INVOKABLE QString syntax(const QString& command, Details details = Visual) const; - - Q_INVOKABLE void addCommand(IrcCommand::Type type, const QString& syntax); - Q_INVOKABLE void removeCommand(IrcCommand::Type type, const QString& syntax = QString()); - - QStringList triggers() const; - - QString target() const; - QStringList channels() const; - - bool isTolerant() const; - void setTolerant(bool tolerant); - - Q_INVOKABLE IrcCommand* parse(const QString& input) const; - -public Q_SLOTS: - void clear(); - void reset(); - - void setTriggers(const QStringList& triggers); - void setChannels(const QStringList& channels); - void setTarget(const QString& target); - -Q_SIGNALS: - void commandsChanged(const QStringList& commands); - void triggersChanged(const QStringList& triggers); - void channelsChanged(const QStringList& channels); - void targetChanged(const QString& target); - void tolerancyChanged(bool tolerant); - -private: - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcCommandParser) - Q_DISABLE_COPY(IrcCommandParser) -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(IrcCommandParser::Details) - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCommandParser*)) - -#endif // IRCCOMMANDPARSER_H diff --git a/libcommuni/include/IrcUtil/irccommandparser_p.h b/libcommuni/include/IrcUtil/irccommandparser_p.h deleted file mode 100644 index d22fd6d..0000000 --- a/libcommuni/include/IrcUtil/irccommandparser_p.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCCOMMANDPARSER_P_H -#define IRCCOMMANDPARSER_P_H - -#include "irccommandparser.h" -#include "irccommand.h" - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -struct IrcParameterInfo -{ - IrcParameterInfo() : optional(false), channel(false), current(false), multi(false) { } - bool optional; - bool channel; - bool current; - bool multi; - QString value; - QString syntax; -}; - -struct IrcCommandInfo -{ - IrcCommandInfo() : type(IrcCommand::Custom), min(0), max(0) { } - - QString fullSyntax() - { - return command + QLatin1Char(' ') + syntax; - } - - IrcCommand::Type type; - QString command; - QString syntax; - int min, max; - QList params; -}; - -class IrcCommandParserPrivate -{ -public: - IrcCommandParserPrivate(); - - QList find(const QString& command) const; - static IrcCommandInfo parseSyntax(IrcCommand::Type type, const QString& syntax); - IrcCommand* parseCommand(const IrcCommandInfo& command, const QString& input) const; - bool processParameters(const IrcCommandInfo& command, const QString& input, QStringList* params) const; - bool processCommand(QString* input, int* removed = 0) const; - bool processMessage(QString* input, int* removed = 0) const; - bool onChannel() const; - - static IrcCommandParserPrivate* get(IrcCommandParser* parser) - { - return parser->d_func(); - } - - bool tolerant; - QString target; - QStringList triggers; - QStringList channels; - QMultiMap commands; -}; - -IRC_END_NAMESPACE - -#endif // IRCCOMMANDPARSER_P_H diff --git a/libcommuni/include/IrcUtil/irccompleter.h b/libcommuni/include/IrcUtil/irccompleter.h deleted file mode 100644 index f4c33ab..0000000 --- a/libcommuni/include/IrcUtil/irccompleter.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCCOMPLETER_H -#define IRCCOMPLETER_H - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcBuffer; -class IrcCommandParser; -class IrcCompleterPrivate; - -class IRC_UTIL_EXPORT IrcCompleter : public QObject -{ - Q_OBJECT - Q_PROPERTY(QString suffix READ suffix WRITE setSuffix NOTIFY suffixChanged) - Q_PROPERTY(IrcBuffer* buffer READ buffer WRITE setBuffer NOTIFY bufferChanged) - Q_PROPERTY(IrcCommandParser* parser READ parser WRITE setParser NOTIFY parserChanged) - Q_ENUMS(Direction) - -public: - explicit IrcCompleter(QObject* parent = 0); - virtual ~IrcCompleter(); - - enum Direction { - Forward, - Backward - }; - - QString suffix() const; - IrcBuffer* buffer() const; - IrcCommandParser* parser() const; - -public Q_SLOTS: - void setSuffix(const QString& suffix); - void setBuffer(IrcBuffer* buffer); - void setParser(IrcCommandParser* parser); - - void complete(const QString& text, int cursor, Direction direction = Forward); - void reset(); - -Q_SIGNALS: - void suffixChanged(const QString& suffix); - void bufferChanged(IrcBuffer* buffer); - void parserChanged(IrcCommandParser* parser); - - void completed(const QString& text, int cursor); - -private: - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcCompleter) - Q_DISABLE_COPY(IrcCompleter) -}; - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCompleter*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCompleter::Direction)) - -#endif // IRCCOMPLETER_H diff --git a/libcommuni/include/IrcUtil/irclagtimer.h b/libcommuni/include/IrcUtil/irclagtimer.h deleted file mode 100644 index 29816d8..0000000 --- a/libcommuni/include/IrcUtil/irclagtimer.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCLAGTIMER_H -#define IRCLAGTIMER_H - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcConnection; -class IrcLagTimerPrivate; - -class IRC_UTIL_EXPORT IrcLagTimer : public QObject -{ - Q_OBJECT - Q_PROPERTY(qint64 lag READ lag NOTIFY lagChanged) - Q_PROPERTY(int interval READ interval WRITE setInterval) - Q_PROPERTY(IrcConnection* connection READ connection WRITE setConnection) - -public: - explicit IrcLagTimer(QObject* parent = 0); - virtual ~IrcLagTimer(); - - IrcConnection* connection() const; - void setConnection(IrcConnection* connection); - - qint64 lag() const; - - int interval() const; - void setInterval(int seconds); - -Q_SIGNALS: - void lagChanged(qint64 lag); - -private: - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcLagTimer) - Q_DISABLE_COPY(IrcLagTimer) - - Q_PRIVATE_SLOT(d_func(), void _irc_connected()) - Q_PRIVATE_SLOT(d_func(), void _irc_pingServer()) - Q_PRIVATE_SLOT(d_func(), void _irc_disconnected()) -}; - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcLagTimer*)) - -#endif // IRCLAGTIMER_H diff --git a/libcommuni/include/IrcUtil/irclagtimer_p.h b/libcommuni/include/IrcUtil/irclagtimer_p.h deleted file mode 100644 index 712f4a9..0000000 --- a/libcommuni/include/IrcUtil/irclagtimer_p.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCLAGTIMER_P_H -#define IRCLAGTIMER_P_H - -#include "irclagtimer.h" -#include "ircfilter.h" -#include - -IRC_BEGIN_NAMESPACE - -class IrcPongMessage; - -class IrcLagTimerPrivate : public QObject, public IrcMessageFilter -{ - Q_OBJECT - Q_INTERFACES(IrcMessageFilter) - Q_DECLARE_PUBLIC(IrcLagTimer) - -public: - IrcLagTimerPrivate(); - - bool messageFilter(IrcMessage* msg); - bool processPongReply(IrcPongMessage* msg); - - void _irc_connected(); - void _irc_pingServer(); - void _irc_disconnected(); - - void updateTimer(); - void updateLag(qint64 value); - - IrcLagTimer* q_ptr; - IrcConnection* connection; - QTimer timer; - int interval; - qint64 lag; -}; - -IRC_END_NAMESPACE - -#endif // IRCLAGTIMER_P_H diff --git a/libcommuni/include/IrcUtil/ircpalette.h b/libcommuni/include/IrcUtil/ircpalette.h deleted file mode 100644 index 735ff17..0000000 --- a/libcommuni/include/IrcUtil/ircpalette.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCPALETTE_H -#define IRCPALETTE_H - -#include -#include -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcPalettePrivate; - -class IRC_UTIL_EXPORT IrcPalette : public QObject -{ - Q_OBJECT - Q_PROPERTY(QString white READ white WRITE setWhite) - Q_PROPERTY(QString black READ black WRITE setBlack) - Q_PROPERTY(QString blue READ blue WRITE setBlue) - Q_PROPERTY(QString green READ green WRITE setGreen) - Q_PROPERTY(QString red READ red WRITE setRed) - Q_PROPERTY(QString brown READ brown WRITE setBrown) - Q_PROPERTY(QString purple READ purple WRITE setPurple) - Q_PROPERTY(QString orange READ orange WRITE setOrange) - Q_PROPERTY(QString yellow READ yellow WRITE setYellow) - Q_PROPERTY(QString lightGreen READ lightGreen WRITE setLightGreen) - Q_PROPERTY(QString cyan READ cyan WRITE setCyan) - Q_PROPERTY(QString lightCyan READ lightCyan WRITE setLightCyan) - Q_PROPERTY(QString lightBlue READ lightBlue WRITE setLightBlue) - Q_PROPERTY(QString pink READ pink WRITE setPink) - Q_PROPERTY(QString gray READ gray WRITE setGray) - Q_PROPERTY(QString lightGray READ lightGray WRITE setLightGray) - -public: - ~IrcPalette(); - - QMap colorNames() const; - void setColorNames(const QMap& names); - - QString colorName(int color, const QString& fallback = QLatin1String("black")) const; - void setColorName(int color, const QString& name); - - QString white() const; - void setWhite(const QString& color); - - QString black() const; - void setBlack(const QString& color); - - QString blue() const; - void setBlue(const QString& color); - - QString green() const; - void setGreen(const QString& color); - - QString red() const; - void setRed(const QString& color); - - QString brown() const; - void setBrown(const QString& color); - - QString purple() const; - void setPurple(const QString& color); - - QString orange() const; - void setOrange(const QString& color); - - QString yellow() const; - void setYellow(const QString& color); - - QString lightGreen() const; - void setLightGreen(const QString& color); - - QString cyan() const; - void setCyan(const QString& color); - - QString lightCyan() const; - void setLightCyan(const QString& color); - - QString lightBlue() const; - void setLightBlue(const QString& color); - - QString pink() const; - void setPink(const QString& color); - - QString gray() const; - void setGray(const QString& color); - - QString lightGray() const; - void setLightGray(const QString& color); - -private: - friend class IrcTextFormat; - explicit IrcPalette(QObject* parent); - - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcPalette) - Q_DISABLE_COPY(IrcPalette) -}; - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPalette*)) - -#endif // IRCPALETTE_H diff --git a/libcommuni/include/IrcUtil/irctextformat.h b/libcommuni/include/IrcUtil/irctextformat.h deleted file mode 100644 index 5056b79..0000000 --- a/libcommuni/include/IrcUtil/irctextformat.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCTEXTFORMAT_H -#define IRCTEXTFORMAT_H - -#include -#include -#include -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcPalette; -class IrcTextFormatPrivate; - -class IRC_UTIL_EXPORT IrcTextFormat : public QObject -{ - Q_OBJECT - Q_PROPERTY(IrcPalette* palette READ palette CONSTANT) - Q_PROPERTY(QString urlPattern READ urlPattern WRITE setUrlPattern) - Q_PROPERTY(QString plainText READ plainText) - Q_PROPERTY(QString html READ html) - Q_PROPERTY(QList urls READ urls) - Q_ENUMS(SpanFormat) - -public: - explicit IrcTextFormat(QObject* parent = 0); - virtual ~IrcTextFormat(); - - IrcPalette* palette() const; - - QString urlPattern() const; - void setUrlPattern(const QString& pattern); - - enum SpanFormat { SpanStyle, SpanClass }; - - SpanFormat spanFormat() const; - void setSpanFormat(SpanFormat format); - - Q_INVOKABLE QString toHtml(const QString& text) const; - Q_INVOKABLE QString toPlainText(const QString& text) const; - - QString plainText() const; - QString html() const; - QList urls() const; - -public Q_SLOTS: - void parse(const QString& text); - -private: - QScopedPointer d_ptr; - Q_DECLARE_PRIVATE(IrcTextFormat) - Q_DISABLE_COPY(IrcTextFormat) -}; - -IRC_END_NAMESPACE - -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcTextFormat*)) -Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcTextFormat::SpanFormat)) - -#endif // IRCTEXTFORMAT_H diff --git a/libcommuni/include/IrcUtil/irctoken_p.h b/libcommuni/include/IrcUtil/irctoken_p.h deleted file mode 100644 index 0e1b707..0000000 --- a/libcommuni/include/IrcUtil/irctoken_p.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCTOKEN_P_H -#define IRCTOKEN_P_H - -#include "ircglobal.h" -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcToken -{ -public: - IrcToken() : idx(-1), pos(-1) { } - IrcToken(int index, int position, const QString& text) - : idx(index), pos(position), str(text) { } - - bool isValid() const { return idx != -1; } - int index() const { return idx; } - int position() const { return pos; } - int length() const { return str.length(); } - QString text() const { return str; } - -private: - int idx; - int pos; - QString str; - friend class IrcTokenizer; -}; - -class IrcTokenizer -{ -public: - IrcTokenizer(const QString& str = QString()); - - int count() const; - bool isEmpty() const; - QList tokens() const; - IrcToken at(int index) const; - IrcTokenizer mid(int index) const; - - void clear(); - void replace(int index, const QString& text); - IrcToken find(int pos) const; - QString toString() const; - -private: - int len; - QList t; -}; - -IRC_END_NAMESPACE - -#endif // IRCTOKEN_P_H diff --git a/libcommuni/include/IrcUtil/ircutil.h b/libcommuni/include/IrcUtil/ircutil.h deleted file mode 100644 index 6e39f18..0000000 --- a/libcommuni/include/IrcUtil/ircutil.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IRCUTIL_H -#define IRCUTIL_H - -#include "irccommandparser.h" -#include "irccompleter.h" -#include "irclagtimer.h" -#include "ircpalette.h" -#include "irctextformat.h" - -IRC_BEGIN_NAMESPACE - -namespace IrcUtil { - void registerMetaTypes(); -} - -IRC_END_NAMESPACE - -#endif // IRCUTIL_H diff --git a/libcommuni/libcommuni.pro b/libcommuni/libcommuni.pro deleted file mode 100644 index 08b39b0..0000000 --- a/libcommuni/libcommuni.pro +++ /dev/null @@ -1,121 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = subdirs -SUBDIRS += src -CONFIG += ordered - -!no_tests { - SUBDIRS += tests -} else { - message(Tests disabled) -} - -!no_examples { - SUBDIRS += examples -} else { - message(Examples disabled) -} - -lessThan(QT_MAJOR_VERSION, 5) { - lessThan(QT_MAJOR_VERSION, 4) | lessThan(QT_MINOR_VERSION, 6) { - error(Communi requires Qt 4.6 or newer but Qt $$[QT_VERSION] was detected.) - } - defineTest(write_file) { - first = true - for(line, $$2) { - !isEmpty(first):system(echo $$line > $$1) - else:system(echo $$line >> $$1) - first = - } - return(true) - } -} - -static:CONFIG_LINES += "DEFINES+=IRC_STATIC" -else:CONFIG_LINES += "DEFINES+=IRC_SHARED" - -include(version.pri) -IRC_VERSION_MAJOR = $$section(IRC_VERSION, ., 0, 0) -IRC_VERSION_MINOR = $$section(IRC_VERSION, ., 1, 1) -IRC_VERSION_PATCH = $$section(IRC_VERSION, ., 2, 2) - -CONFIG_LINES += "IRC_VERSION=$$IRC_VERSION" -CONFIG_LINES += "IRC_VERSION_MAJOR=$$IRC_VERSION_MAJOR" -CONFIG_LINES += "IRC_VERSION_MINOR=$$IRC_VERSION_MINOR" -CONFIG_LINES += "IRC_VERSION_PATCH=$$IRC_VERSION_PATCH" - -isEmpty(IRC_INSTALL_LIBS):IRC_INSTALL_LIBS = $$[QT_INSTALL_LIBS] -isEmpty(IRC_INSTALL_BINS):IRC_INSTALL_BINS = $$[QT_INSTALL_BINS] -isEmpty(IRC_INSTALL_HEADERS):IRC_INSTALL_HEADERS = $$[QT_INSTALL_HEADERS]/Communi -isEmpty(IRC_INSTALL_FEATURES) { - isEqual(QT_MAJOR_VERSION, 5):IRC_INSTALL_FEATURES = $$[QT_HOST_DATA]/mkspecs/features - else:IRC_INSTALL_FEATURES = $$[QMAKE_MKSPECS]/features -} - -# qt4/win: WARNING: Unescaped backslashes are deprecated -!win32|greaterThan(QT_MAJOR_VERSION, 4) { - CONFIG_LINES += "IRC_INSTALL_LIBS=$$IRC_INSTALL_LIBS" - CONFIG_LINES += "IRC_INSTALL_BINS=$$IRC_INSTALL_BINS" - CONFIG_LINES += "IRC_INSTALL_HEADERS=$$IRC_INSTALL_HEADERS" - CONFIG_LINES += "IRC_INSTALL_FEATURES=$$IRC_INSTALL_FEATURES" -} - -IRC_CONFIG = $${OUT_PWD}$${QMAKE_DIR_SEP}communi-config.prf -write_file($$IRC_CONFIG, CONFIG_LINES) - -CONFIG_VARS = $${OUT_PWD}$${QMAKE_DIR_SEP}.config.vars -exists($$CONFIG_VARS) { - CONFIG_LINES += "include\\\($$CONFIG_VARS\\\)" -} -QMAKE_CACHE = $${OUT_PWD}$${QMAKE_DIR_SEP}.qmake.cache -write_file($$QMAKE_CACHE, CONFIG_LINES) - -OTHER_FILES += .gitignore -OTHER_FILES += .travis.yml -OTHER_FILES += AUTHORS -OTHER_FILES += CHANGELOG -OTHER_FILES += configure -OTHER_FILES += Doxyfile -OTHER_FILES += INSTALL -OTHER_FILES += LICENSE -OTHER_FILES += README -OTHER_FILES += features/communi.prf - -include(doc/doc.pri) - -features.files += features/communi.prf -features.files += $$OUT_PWD/communi-config.prf -features.path = $$IRC_INSTALL_FEATURES -INSTALLS += features - -!build_pass { - macx { - !qt_no_framework { - message(Building Communi $$IRC_VERSION (framework)) - } else { - message(Building Communi $$IRC_VERSION (dylib)) - } - } else { - message(Building Communi $$IRC_VERSION) - } -} - -coverage { - cov_zerocounters.CONFIG += recursive - cov_zerocounters.recurse = src - QMAKE_EXTRA_TARGETS += cov_zerocounters - - cov_capture.CONFIG += recursive - cov_capture.recurse = src - QMAKE_EXTRA_TARGETS += cov_capture - - cov_genhtml.CONFIG += recursive - cov_genhtml.recurse = src - QMAKE_EXTRA_TARGETS += cov_genhtml - - coverage.depends += first cov_zerocounters check cov_capture cov_genhtml - QMAKE_EXTRA_TARGETS += coverage - !build_pass:message(Code coverage collection enabled) -} diff --git a/libcommuni/src/3rdparty/icu/icu.pri b/libcommuni/src/3rdparty/icu/icu.pri deleted file mode 100644 index 352c218..0000000 --- a/libcommuni/src/3rdparty/icu/icu.pri +++ /dev/null @@ -1,44 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -include(../pkg.pri) - -pkgExists(icu) { - CONFIG += link_pkgconfig - PKGCONFIG += icu -} else:pkgExists(icu-i18n) { - CONFIG += link_pkgconfig - PKGCONFIG += icu-i18n -} - -isEmpty(PKGCONFIG) { - win32 { - isEmpty(ICU_DIR):ICU_DIR = $$(ICU_DIR) - isEmpty(ICU_DIR):ICU_DIR = C:/ICU - !build_pass { - !exists($$ICU_DIR) { - error("ICU support has been enabled, but the ICU installation \ - has not been found at $${ICU_DIR}. Please download and \ - install ICU from http://icu-project.org and/or specify \ - ICU_DIR to match the installation location.") - } else { - message("Using ICU from $${ICU_DIR}") - } - } - INCLUDEPATH += $$ICU_DIR/include - contains(QMAKE_TARGET.arch, x86_64):LIBS += -L$$ICU_DIR/lib64 - else:LIBS += -L$$ICU_DIR/lib - LIBS += -licuuc - - # icudata vs. icudt - exists($$ICU_DIR/bin/icudata*.dll):LIBS += -licudata - else:LIBS += -licudt - - # icui18n vs. icuin - exists($$ICU_DIR/bin/icui18n*.dll):LIBS += -licui18n - else:LIBS += -licuin - } else { - LIBS += -licui18n -licudata -licuuc - } -} diff --git a/libcommuni/src/3rdparty/mozilla/mozilla.pri b/libcommuni/src/3rdparty/mozilla/mozilla.pri deleted file mode 100644 index 3e279d9..0000000 --- a/libcommuni/src/3rdparty/mozilla/mozilla.pri +++ /dev/null @@ -1,5 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += $$PWD/rdf_utils.c diff --git a/libcommuni/src/3rdparty/mozilla/rdf_utils.c b/libcommuni/src/3rdparty/mozilla/rdf_utils.c deleted file mode 100644 index c1329f7..0000000 --- a/libcommuni/src/3rdparty/mozilla/rdf_utils.c +++ /dev/null @@ -1,132 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/* - This file implements utility routines for the rdf data model. - For more information on this file, contact rjc or guha - For more information on RDF, look at the RDF section of www.mozilla.org -*/ - -#define kLeft1BitMask 0x80 -#define kLeft2BitsMask 0xC0 -#define kLeft3BitsMask 0xE0 -#define kLeft4BitsMask 0xF0 -#define kLeft5BitsMask 0xF8 -#define kLeft6BitsMask 0xFC -#define kLeft7BitsMask 0xFE - -#define k2BytesLeadByte kLeft2BitsMask -#define k3BytesLeadByte kLeft3BitsMask -#define k4BytesLeadByte kLeft4BitsMask -#define k5BytesLeadByte kLeft5BitsMask -#define k6BytesLeadByte kLeft6BitsMask -#define kTrialByte kLeft1BitMask - -#define UTF8_1Byte(c) ( 0 == ((c) & kLeft1BitMask)) -#define UTF8_2Bytes(c) ( k2BytesLeadByte == ((c) & kLeft3BitsMask)) -#define UTF8_3Bytes(c) ( k3BytesLeadByte == ((c) & kLeft4BitsMask)) -#define UTF8_4Bytes(c) ( k4BytesLeadByte == ((c) & kLeft5BitsMask)) -#define UTF8_5Bytes(c) ( k5BytesLeadByte == ((c) & kLeft6BitsMask)) -#define UTF8_6Bytes(c) ( k6BytesLeadByte == ((c) & kLeft7BitsMask)) -#define UTF8_ValidTrialByte(c) ( kTrialByte == ((c) & kLeft2BitsMask)) - -int IsUTF8Text(const unsigned char* utf8, int len) -{ - int i; - int j; - int clen; - for(i =0; i < len; i += clen) - { - if(UTF8_1Byte(utf8[i])) - { - clen = 1; - } else if(UTF8_2Bytes(utf8[i])) { - clen = 2; - /* No enough trail bytes */ - if( (i + clen) > len) - return 0; - /* 0000 0000 - 0000 007F : should encode in less bytes */ - if(0 == (utf8[i] & 0x1E )) - return 0; - } else if(UTF8_3Bytes(utf8[i])) { - clen = 3; - /* No enough trail bytes */ - if( (i + clen) > len) - return 0; - /* a single Surrogate should not show in 3 bytes UTF8, instead, the pair should be intepreted - as one single UCS4 char and encoded UTF8 in 4 bytes */ - if((0xED == utf8[i] ) && (0xA0 == (utf8[i+1] & 0xA0 ) )) - return 0; - /* 0000 0000 - 0000 07FF : should encode in less bytes */ - if((0 == (utf8[i] & 0x0F )) && (0 == (utf8[i+1] & 0x20 ) )) - return 0; - } else if(UTF8_4Bytes(utf8[i])) { - clen = 4; - /* No enough trail bytes */ - if( (i + clen) > len) - return 0; - /* 0000 0000 - 0000 FFFF : should encode in less bytes */ - if((0 == (utf8[i] & 0x07 )) && (0 == (utf8[i+1] & 0x30 )) ) - return 0; - } else if(UTF8_5Bytes(utf8[i])) { - clen = 5; - /* No enough trail bytes */ - if( (i + clen) > len) - return 0; - /* 0000 0000 - 001F FFFF : should encode in less bytes */ - if((0 == (utf8[i] & 0x03 )) && (0 == (utf8[i+1] & 0x38 )) ) - return 0; - } else if(UTF8_6Bytes(utf8[i])) { - clen = 6; - /* No enough trail bytes */ - if( (i + clen) > len) - return 0; - /* 0000 0000 - 03FF FFFF : should encode in less bytes */ - if((0 == (utf8[i] & 0x01 )) && (0 == (utf8[i+1] & 0x3E )) ) - return 0; - } else { - return 0; - } - for(j = 1; j /dev/null):return(true) - return(false) -} diff --git a/libcommuni/src/3rdparty/qblowfish/LICENSE b/libcommuni/src/3rdparty/qblowfish/LICENSE deleted file mode 100644 index db148cb..0000000 --- a/libcommuni/src/3rdparty/qblowfish/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -QBlowfish is licensed under the MIT License - -Copyright © 2012 Roopesh Chander - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject -to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/libcommuni/src/3rdparty/qblowfish/README.md b/libcommuni/src/3rdparty/qblowfish/README.md deleted file mode 100644 index fb961bb..0000000 --- a/libcommuni/src/3rdparty/qblowfish/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# QBlowfish - -QBlowfish is a [Qt](http://qt.nokia.com/) implementation of the [Blowfish](http://www.schneier.com/blowfish.html) encryption algorithm, as described in the original Blowfish [paper](http://www.schneier.com/paper-blowfish-fse.html) by Bruce Schneier. - -The Blowfish algorithm requires the input in 8-byte blocks. To simplify usage, QBlowfish can optionally add [PKCS5 padding](http://tools.ietf.org/html/rfc5652#section-6.3) to the input data. (For example, if the input is only 60 bytes long, 4 bytes will be padded to bring the bytecount to a multiple of 8.) When padding is enabled during decryption, QBlowfish will also remove the padded bytes from the output. - -You only need to add 3 files (src/*) to your project. You can then use the QBlowfish class to encrypt and decrypt stuff. - - QByteArray secretKey("This is a secret") - QString clearText("Stuff to encrypt"); - - QBlowfish bf(secretKey); - bf.setPaddingEnabled(true); - QByteArray encryptedBa = bf.encrypted(clearText.toUtf8()); - -A more detailed example is included in the repo. - -QBlowfish is not optimized for speed. It processes the data in bytes (most other Blowfish implementations seem to work on 4-byte words) and is endianness-agnostic. - -### Tests - -Unit tests are written using QTestLib. Tests include [the official test vectors](http://www.schneier.com/code/vectors.txt). - -QBlowfish has been tested with Qt 4.8 on Windows and Linux. - -### License - -QBlowfish is published under the MIT license. diff --git a/libcommuni/src/3rdparty/qblowfish/qblowfish.cpp b/libcommuni/src/3rdparty/qblowfish/qblowfish.cpp deleted file mode 100644 index 605ff24..0000000 --- a/libcommuni/src/3rdparty/qblowfish/qblowfish.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/* - This file is part of QBlowfish and is licensed under the MIT License - - Copyright (C) 2012 Roopesh Chander - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject - to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -*/ - -#include "qblowfish.h" -#include "qblowfish_p.h" -#include -#include - -QBlowfish::QBlowfish(const QByteArray &key) - : m_key(key) - , m_initialized(false) - , m_paddingEnabled(false) -{ -} - -void QBlowfish::setPaddingEnabled(bool enabled) -{ - m_paddingEnabled = enabled; -} - -bool QBlowfish::isPaddingEnabled() const -{ - return m_paddingEnabled; -} - -QByteArray QBlowfish::encrypted(const QByteArray &_clearText) -{ - QByteArray clearText(_clearText); - if (clearText.isEmpty()) { - return QByteArray(); - } - - if (isPaddingEnabled()) { - // Add padding as per PKCS5 - // Ref: RFC 5652 http://tools.ietf.org/html/rfc5652#section-6.3 - quint8 paddingLength = 8 - (clearText.size() % 8); - QByteArray paddingBa(paddingLength, static_cast(paddingLength)); - clearText.append(paddingBa); - } else { - if (clearText.size() % 8 != 0) { - qWarning("Cannot encrypt. Clear-text length is not a multiple of 8 and padding is not enabled."); - return QByteArray(); - } - } - - Q_ASSERT(clearText.size() % 8 == 0); - if ((clearText.size() % 8 == 0) && init()) { - - QByteArray copyBa(clearText.constData(), clearText.size()); - for (int i = 0; i < clearText.size(); i += 8) { - coreEncrypt(copyBa.data() + i); - } - return copyBa; - - } - return QByteArray(); -} - -QByteArray QBlowfish::decrypted(const QByteArray &cipherText) -{ - if (cipherText.isEmpty()) { - return QByteArray(); - } - - Q_ASSERT(cipherText.size() % 8 == 0); - if ((cipherText.size() % 8 == 0) && init()) { - - QByteArray copyBa(cipherText.constData(), cipherText.size()); - for (int i = 0; i < cipherText.size(); i += 8) { - coreDecrypt(copyBa.data() + i); - } - - if (isPaddingEnabled()) { - // Remove padding as per PKCS5 - quint8 paddingLength = static_cast(copyBa.right(1).at(0)); - QByteArray paddingBa(paddingLength, static_cast(paddingLength)); - if (copyBa.right(paddingLength) == paddingBa) { - return copyBa.left(copyBa.length() - paddingLength); - } - return QByteArray(); - } - return copyBa; - } - return QByteArray(); -} - -/* - Core encryption code follows. This is an implementation of the Blowfish algorithm as described at: - http://www.schneier.com/paper-blowfish-fse.html -*/ - -bool QBlowfish::init() -{ - if (m_initialized) { - return true; - } - - if (m_key.isEmpty()) { - qWarning("Cannot init. Key is empty."); - return false; - } - - m_sbox1 = QByteArray::fromHex(QByteArray::fromRawData(sbox0, SBOX_SIZE_BYTES * 2)); - m_sbox2 = QByteArray::fromHex(QByteArray::fromRawData(sbox1, SBOX_SIZE_BYTES * 2)); - m_sbox3 = QByteArray::fromHex(QByteArray::fromRawData(sbox2, SBOX_SIZE_BYTES * 2)); - m_sbox4 = QByteArray::fromHex(QByteArray::fromRawData(sbox3, SBOX_SIZE_BYTES * 2)); - m_parray = QByteArray::fromHex(QByteArray::fromRawData(parray, PARRAY_SIZE_BYTES * 2)); - - const QByteArray &key = m_key; - int keyLength = key.length(); - for (int i = 0; i < PARRAY_SIZE_BYTES; i++) { - m_parray[i] = static_cast(static_cast(m_parray[i]) ^ static_cast(key[i % keyLength])); - } - - char seed[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - - // Update p-array - for (int i = 0; i < (PARRAY_SIZE_BYTES / 4); i += 2) { - coreEncrypt(seed); - for (int j = 0; j < 8; j++) { - // P1 = xL; P2 = xR - m_parray[i * 4 + j] = seed[j]; - } - } - - // Update s-boxes - for (int sboxIndex = 1; sboxIndex <= 4; sboxIndex++) { - QByteArray *sbox = 0; - switch (sboxIndex) { - case 1: sbox = &m_sbox1; break; - case 2: sbox = &m_sbox2; break; - case 3: sbox = &m_sbox3; break; - case 4: sbox = &m_sbox4; break; - default: Q_ASSERT(false); - } - Q_ASSERT(sbox != 0); - - for (int i = 0; i < (SBOX_SIZE_BYTES / 4); i += 2) { - coreEncrypt(seed); - for (int j = 0; j < 8; j++) { - // S1,1 = xL; S1,2 = xR - sbox->operator[](i * 4 + j) = seed[j]; - } - } - } - - m_initialized = true; - return true; -} - -void QBlowfish::coreEncrypt(char *x) // encrypts 8 bytes pointed to by x, result is written to the same location -{ - // Divide x into two 32-bit halves: xL, xR - char *xL = x; - char *xR = x + 4; - uchar f_xL_bytes[4] = { 0, 0, 0, 0 }; - - for (int i = 0; i < 16; i++) { - - // xL = xL XOR Pi - for (int j = 0; j < 4; j++) { - // quint8 old_xL = xL[j]; - xL[j] = static_cast(static_cast(xL[j]) ^ static_cast(m_parray[i * 4 + j])); - } - - // Divide xL into four eight-bit quarters: a, b, c, and d - quint8 a = static_cast(xL[0]); - quint8 b = static_cast(xL[1]); - quint8 c = static_cast(xL[2]); - quint8 d = static_cast(xL[3]); - - // F(xL) = ((S1,a + S2,b mod 2**32) XOR S3,c) + S4,d mod 2**32 - quint32 s1a = qFromBigEndian(reinterpret_cast(m_sbox1.constData() + a * 4)); - quint32 s2b = qFromBigEndian(reinterpret_cast(m_sbox2.constData() + b * 4)); - quint32 s3c = qFromBigEndian(reinterpret_cast(m_sbox3.constData() + c * 4)); - quint32 s4d = qFromBigEndian(reinterpret_cast(m_sbox4.constData() + d * 4)); - quint32 f_xL = ((((s1a + s2b) & 0xffffffff) ^ s3c) + s4d) & 0xffffffff; - qToBigEndian(f_xL, f_xL_bytes); - - // xR = F(xL) XOR xR - for (int j = 0; j < 4; j++) { - xR[j] = static_cast(static_cast(f_xL_bytes[j]) ^ static_cast(xR[j])); - } - - // Swap xL and xR, but not in the last iteration - if (i != 15) { - for (int j = 0; j < 4; j++) { - char temp = xL[j]; - xL[j] = xR[j]; - xR[j] = temp; - } - } - - } - - // xR = xR XOR P17 - // xL = xL XOR P18 - for (int j = 0; j < 4; j++) { - xR[j] = static_cast(static_cast(xR[j]) ^ static_cast(m_parray[16 * 4 + j])); - xL[j] = static_cast(static_cast(xL[j]) ^ static_cast(m_parray[17 * 4 + j])); - } -} - -void QBlowfish::coreDecrypt(char *x) // decrypts 8 bytes pointed to by x, result is written to the same location -{ - // Divide x into two 32-bit halves: xL, xR - char *xL = x; - char *xR = x + 4; - uchar f_xL_bytes[4] = { 0, 0, 0, 0 }; - - // xL = xL XOR P18 - // xR = xR XOR P17 - for (int j = 0; j < 4; j++) { - xL[j] = static_cast(static_cast(xL[j]) ^ static_cast(m_parray[17 * 4 + j])); - xR[j] = static_cast(static_cast(xR[j]) ^ static_cast(m_parray[16 * 4 + j])); - } - - for (int i = 15; i >= 0; i--) { - - // Swap xL and xR, but not in the first iteration - if (i != 15) { - for (int j = 0; j < 4; j++) { - char temp = xL[j]; - xL[j] = xR[j]; - xR[j] = temp; - } - } - - // Divide xL into four eight-bit quarters: a, b, c, and d - quint8 a = static_cast(xL[0]); - quint8 b = static_cast(xL[1]); - quint8 c = static_cast(xL[2]); - quint8 d = static_cast(xL[3]); - - // F(xL) = ((S1,a + S2,b mod 2**32) XOR S3,c) + S4,d mod 2**32 - quint32 s1a = qFromBigEndian(reinterpret_cast(m_sbox1.constData() + a * 4)); - quint32 s2b = qFromBigEndian(reinterpret_cast(m_sbox2.constData() + b * 4)); - quint32 s3c = qFromBigEndian(reinterpret_cast(m_sbox3.constData() + c * 4)); - quint32 s4d = qFromBigEndian(reinterpret_cast(m_sbox4.constData() + d * 4)); - quint32 f_xL = ((((s1a + s2b) & 0xffffffff) ^ s3c) + s4d) & 0xffffffff; - qToBigEndian(f_xL, f_xL_bytes); - - // xR = F(xL) XOR xR - for (int j = 0; j < 4; j++) { - xR[j] = static_cast(static_cast(f_xL_bytes[j]) ^ static_cast(xR[j])); - } - - // xL = xL XOR Pi - for (int j = 0; j < 4; j++) { - xL[j] = static_cast(static_cast(xL[j]) ^ static_cast(m_parray[i * 4 + j])); - } - - } -} diff --git a/libcommuni/src/3rdparty/qblowfish/qblowfish.h b/libcommuni/src/3rdparty/qblowfish/qblowfish.h deleted file mode 100644 index 100a2e6..0000000 --- a/libcommuni/src/3rdparty/qblowfish/qblowfish.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef QBLOWFISH_H -#define QBLOWFISH_H - -#include - -class QBlowfish -{ -public: - QBlowfish(const QByteArray &key); - bool init(); - - // Padding: - // - // Blowfish works on 8-byte blocks. Padding makes it usable even - // in case where the input size is not in exact 8-byte blocks. - // - // If padding is disabled (the default), encrypted() will work only if the - // input size (in bytes) is a multiple of 8. (If it's not a multiple of 8, - // encrypted() will return a null bytearray.) - // - // If padding is enabled, we increase the input length to a multiple of 8 - // by padding bytes as per PKCS5 - // - // If padding was enabled during encryption, it should be enabled during - // decryption for correct decryption (and vice versa). - - void setPaddingEnabled(bool enabled); - bool isPaddingEnabled() const; - - // Encrypt / decrypt - QByteArray encrypted(const QByteArray &clearText); - QByteArray decrypted(const QByteArray &cipherText); - -private: - // core encrypt/decrypt methods, encrypts/decrypts in-place - void coreEncrypt(char *x); - void coreDecrypt(char *x); - - QByteArray m_key; - bool m_initialized; - bool m_paddingEnabled; - QByteArray m_parray; - QByteArray m_sbox1, m_sbox2, m_sbox3, m_sbox4; -}; - -#endif // QBLOWFISH_H diff --git a/libcommuni/src/3rdparty/qblowfish/qblowfish.pri b/libcommuni/src/3rdparty/qblowfish/qblowfish.pri deleted file mode 100644 index 5d01670..0000000 --- a/libcommuni/src/3rdparty/qblowfish/qblowfish.pri +++ /dev/null @@ -1,11 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -HEADERS += $$PWD/qblowfish.h -HEADERS += $$PWD/qblowfish_p.h - -SOURCES += $$PWD/qblowfish.cpp diff --git a/libcommuni/src/3rdparty/qblowfish/qblowfish_p.h b/libcommuni/src/3rdparty/qblowfish/qblowfish_p.h deleted file mode 100644 index 3e15083..0000000 --- a/libcommuni/src/3rdparty/qblowfish/qblowfish_p.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - Source: http://www.schneier.com/code/constants.txt -*/ - -#ifndef Q_BLOWFISH_P_H -#define Q_BLOWFISH_P_H - -#define SBOX_SIZE_BYTES (256 * 4) -#define PARRAY_SIZE_BYTES (18 * 4) - -char sbox0[] = - "d1310ba698dfb5ac2ffd72dbd01adfb7b8e1afed6a267e96" - "ba7c9045f12c7f9924a19947b3916cf70801f2e2858efc16" - "636920d871574e69a458fea3f4933d7e0d95748f728eb658" - "718bcd5882154aee7b54a41dc25a59b59c30d5392af26013" - "c5d1b023286085f0ca417918b8db38ef8e79dcb0603a180e" - "6c9e0e8bb01e8a3ed71577c1bd314b2778af2fda55605c60" - "e65525f3aa55ab945748986263e8144055ca396a2aab10b6" - "b4cc5c341141e8cea15486af7c72e993b3ee1411636fbc2a" - "2ba9c55d741831f6ce5c3e169b87931eafd6ba336c24cf5c" - "7a325381289586773b8f48986b4bb9afc4bfe81b66282193" - "61d809ccfb21a991487cac605dec8032ef845d5de98575b1" - "dc262302eb651b8823893e81d396acc50f6d6ff383f44239" - "2e0b4482a484200469c8f04a9e1f9b5e21c66842f6e96c9a" - "670c9c61abd388f06a51a0d2d8542f68960fa728ab5133a3" - "6eef0b6c137a3be4ba3bf0507efb2a98a1f1651d39af0176" - "66ca593e82430e888cee8619456f9fb47d84a5c33b8b5ebe" - "e06f75d885c12073401a449f56c16aa64ed3aa62363f7706" - "1bfedf72429b023d37d0d724d00a1248db0fead349f1c09b" - "075372c980991b7b25d479d8f6e8def7e3fe501ab6794c3b" - "976ce0bd04c006bac1a94fb6409f60c45e5c9ec2196a2463" - "68fb6faf3e6c53b51339b2eb3b52ec6f6dfc511f9b30952c" - "cc814544af5ebd09bee3d004de334afd660f2807192e4bb3" - "c0cba85745c8740fd20b5f39b9d3fbdb5579c0bd1a60320a" - "d6a100c6402c7279679f25fefb1fa3cc8ea5e9f8db3222f8" - "3c7516dffd616b152f501ec8ad0552ab323db5fafd238760" - "53317b483e00df829e5c57bbca6f8ca01a87562edf1769db" - "d542a8f6287effc3ac6732c68c4f5573695b27b0bbca58c8" - "e1ffa35db8f011a010fa3d98fd2183b84afcb56c2dd1d35b" - "9a53e479b6f84565d28e49bc4bfb9790e1ddf2daa4cb7e33" - "62fb1341cee4c6e8ef20cada36774c01d07e9efe2bf11fb4" - "95dbda4dae909198eaad8e716b93d5a0d08ed1d0afc725e0" - "8e3c5b2f8e7594b78ff6e2fbf2122b648888b812900df01c" - "4fad5ea0688fc31cd1cff191b3a8c1ad2f2f2218be0e1777" - "ea752dfe8b021fa1e5a0cc0fb56f74e818acf3d6ce89e299" - "b4a84fe0fd13e0b77cc43b81d2ada8d9165fa26680957705" - "93cc7314211a1477e6ad206577b5fa86c75442f5fb9d35cf" - "ebcdaf0c7b3e89a0d6411bd3ae1e7e4900250e2d2071b35e" - "226800bb57b8e0af2464369bf009b91e5563911d59dfa6aa" - "78c14389d95a537f207d5ba202e5b9c5832603766295cfa9" - "11c819684e734a41b3472dca7b14a94a1b5100529a532915" - "d60f573fbc9bc6e42b60a47681e6740008ba6fb5571be91f" - "f296ec6b2a0dd915b6636521e7b9f9b6ff34052ec5855664" - "53b02d5da99f8fa108ba47996e85076a" -; - -char sbox1[] = - "4b7a70e9b5b32944db75092ec4192623ad6ea6b049a7df7d" - "9cee60b88fedb266ecaa8c71699a17ff5664526cc2b19ee1" - "193602a575094c29a0591340e4183a3e3f54989a5b429d65" - "6b8fe4d699f73fd6a1d29c07efe830f54d2d38e6f0255dc1" - "4cdd20868470eb266382e9c6021ecc5e09686b3f3ebaefc9" - "3c9718146b6a70a1687f358452a0e286b79c5305aa500737" - "3e07841c7fdeae5c8e7d44ec5716f2b8b03ada37f0500c0d" - "f01c1f040200b3ffae0cf51a3cb574b225837a58dc0921bd" - "d19113f97ca92ff69432477322f547013ae5e58137c2dadc" - "c8b576349af3dda7a94461460fd0030eecc8c73ea4751e41" - "e238cd993bea0e2f3280bba1183eb3314e548b384f6db908" - "6f420d03f60a04bf2cb8129024977c795679b072bcaf89af" - "de9a771fd9930810b38bae12dccf3f2e5512721f2e6b7124" - "501adde69f84cd877a5847187408da17bc9f9abce94b7d8c" - "ec7aec3adb851dfa63094366c464c3d2ef1c18473215d908" - "dd433b3724c2ba1612a14d432a65c45150940002133ae4dd" - "71dff89e10314e5581ac77d65f11199b043556f1d7a3c76b" - "3c11183b5924a509f28fe6ed97f1fbfa9ebabf2c1e153c6e" - "86e34570eae96fb1860e5e0a5a3e2ab3771fe71c4e3d06fa" - "2965dcb999e71d0f803e89d65266c8252e4cc9789c10b36a" - "c6150eba94e2ea78a5fc3c531e0a2df4f2f74ea7361d2b3d" - "1939260f19c279605223a708f71312b6ebadfe6eeac31f66" - "e3bc4595a67bc883b17f37d1018cff28c332ddefbe6c5aa5" - "6558218568ab9802eecea50fdb2f953b2aef7dad5b6e2f84" - "1521b62829076170ecdd4775619f151013cca830eb61bd96" - "0334fe1eaa0363cfb5735c904c70a239d59e9e0bcbaade14" - "eecc86bc60622ca79cab5cabb2f3846e648b1eaf19bdf0ca" - "a02369b9655abb5040685a323c2ab4b3319ee9d5c021b8f7" - "9b540b19875fa09995f7997e623d7da8f837889a97e32d77" - "11ed935f166812810e358829c7e61fd696dedfa17858ba99" - "57f584a51b2272639b83c3ff1ac24696cdb30aeb532e3054" - "8fd948e46dbc312858ebf2ef34c6ffeafe28ed61ee7c3c73" - "5d4a14d9e864b7e342105d14203e13e045eee2b6a3aaabea" - "db6c4f15facb4fd0c742f442ef6abbb5654f3b1d41cd2105" - "d81e799e86854dc7e44b476a3d816250cf62a1f25b8d2646" - "fc8883a0c1c7b6a37f1524c369cb749247848a0b5692b285" - "095bbf00ad19489d1462b17423820e0058428d2a0c55f5ea" - "1dadf43e233f70613372f0928d937e41d65fecf16c223bdb" - "7cde3759cbee74604085f2a7ce77326ea607808419f8509e" - "e8efd85561d99735a969a7aac50c06c25a04abfc800bcadc" - "9e447a2ec3453484fdd567050e1e9ec9db73dbd3105588cd" - "675fda79e3674340c5c43465713e38d83d28f89ef16dff20" - "153e21e78fb03d4ae6e39f2bdb83adf7" -; - -char sbox2[] = - "e93d5a68948140f7f64c261c94692934411520f77602d4f7" - "bcf46b2ed4a20068d40824713320f46a43b7d4b7500061af" - "1e39f62e9724454614214f74bf8b88404d95fc1d96b591af" - "70f4ddd366a02f45bfbc09ec03bd97857fac6dd031cb8504" - "96eb27b355fd3941da2547e6abca0a9a28507825530429f4" - "0a2c86dae9b66dfb68dc1462d7486900680ec0a427a18dee" - "4f3ffea2e887ad8cb58ce0067af4d6b6aace1e7cd3375fec" - "ce78a399406b2a4220fe9e35d9f385b9ee39d7ab3b124e8b" - "1dc9faf74b6d185626a36631eae397b23a6efa74dd5b4332" - "6841e7f7ca7820fbfb0af54ed8feb397454056acba489527" - "55533a3a20838d87fe6ba9b7d096954b55a867bca1159a58" - "cca9296399e1db33a62a4a563f3125f95ef47e1c9029317c" - "fdf8e80204272f7080bb155c05282ce395c11548e4c66d22" - "48c1133fc70f86dc07f9c9ee41041f0f404779a45d886e17" - "325f51ebd59bc0d1f2bcc18f41113564257b7834602a9c60" - "dff8e8a31f636c1b0e12b4c202e1329eaf664fd1cad18115" - "6b2395e0333e92e13b240b62eebeb92285b2a20ee6ba0d99" - "de720c8c2da2f728d012784595b794fd647d0862e7ccf5f0" - "5449a36f877d48fac39dfd27f33e8d1e0a476341992eff74" - "3a6f6eabf4f8fd37a812dc60a1ebddf8991be14cdb6e6b0d" - "c67b55106d672c372765d43bdcd0e804f1290dc7cc00ffa3" - "b5390f92690fed0b667b9ffbcedb7d9ca091cf0bd9155ea3" - "bb132f88515bad247b9479bf763bd6eb37392eb3cc115979" - "8026e297f42e312d6842ada7c66a2b3b12754ccc782ef11c" - "6a124237b79251e706a1bbe64bfb63501a6b101811caedfa" - "3d25bdd8e2e1c3c9444216590a121386d90cec6ed5abea2a" - "64af674eda86a85fbebfe98864e4c3fe9dbc8057f0f7c086" - "60787bf86003604dd1fd8346f6381fb07745ae04d736fccc" - "83426b33f01eab71b08041873c005e5f77a057bebde8ae24" - "55464299bf582e614e58f48ff2ddfda2f474ef388789bdc2" - "5366f9c3c8b38e74b475f25546fcd9b97aeb26618b1ddf84" - "846a0e79915f95e2466e598e20b457708cd55591c902de4c" - "b90bace1bb8205d011a862487574a99eb77f19b6e0a9dc09" - "662d09a1c4324633e85a1f0209f0be8c4a99a0251d6efe10" - "1ab93d1d0ba5a4dfa186f20f2868f169dcb7da83573906fe" - "a1e2ce9b4fcd7f5250115e01a70683faa002b5c40de6d027" - "9af88c27773f8641c3604c0661a806b5f0177a28c0f586e0" - "006058aa30dc7d6211e69ed72338ea6353c2dd94c2c21634" - "bbcbee5690bcb6deebfc7da1ce591d766f05e4094b7c0188" - "39720a3d7c927c2486e3725f724d9db91ac15bb4d39eb8fc" - "ed54557808fca5b5d83d7cd34dad0fc41e50ef5eb161e6f8" - "a28514d96c51133c6fd5c7e756e14ec4362abfceddc6c837" - "d79a323492638212670efa8e406000e0" -; - -char sbox3[] = - "3a39ce37d3faf5cfabc277375ac52d1b5cb0679e4fa33742" - "d382274099bc9bbed5118e9dbf0f7315d62d1c7ec700c47b" - "b78c1b6b21a19045b26eb1be6a366eb45748ab2fbc946e79" - "c6a376d26549c2c8530ff8ee468dde7dd5730a1d4cd04dc6" - "2939bbdba9ba4650ac9526e8be5ee304a1fad5f06a2d519a" - "63ef8ce29a86ee22c089c2b843242ef6a51e03aa9cf2d0a4" - "83c061ba9be96a4d8fe51550ba645bd62826a2f9a73a3ae1" - "4ba99586ef5562e9c72fefd3f752f7da3f046f6977fa0a59" - "80e4a91587b086019b09e6ad3b3ee593e990fd5a9e34d797" - "2cf0b7d9022b8b5196d5ac3a017da67dd1cf3ed67c7d2d28" - "1f9f25cfadf2b89b5ad6b4725a88f54ce029ac71e019a5e6" - "47b0acfded93fa9be8d3c48d283b57ccf8d5662979132e28" - "785f0191ed756055f7960e44e3d35e8c15056dd488f46dba" - "03a161250564f0bdc3eb9e153c9057a297271aeca93a072a" - "1b3f6d9b1e6321f5f59c66fb26dcf3197533d928b155fdf5" - "035634828aba3cbb28517711c20ad9f8abcc5167ccad925f" - "4de817513830dc8e379d58629320f991ea7a90c2fb3e7bce" - "5121ce64774fbe32a8b6e37ec3293d4648de53696413e680" - "a2ae0810dd6db22469852dfd09072166b39a460a6445c0dd" - "586cdecf1c20c8ae5bbef7dd1b588d40ccd2017f6bb4e3bb" - "dda26a7e3a59ff453e350a44bcb4cdd572eacea8fa6484bb" - "8d6612aebf3c6f47d29be463542f5d9eaec2771bf64e6370" - "740e0d8de75b1357f8721671af537d5d4040cb084eb4e2cc" - "34d2466a0115af84e1b0042895983a1d06b89fb4ce6ea048" - "6f3f3b823520ab82011a1d4b277227f8611560b1e7933fdc" - "bb3a792b344525bda08839e151ce794b2f32c9b7a01fbac9" - "e01cc87ebcc7d1f6cf0111c3a1e8aac71a908749d44fbd9a" - "d0dadecbd50ada380339c32ac69136678df9317ce0b12b4f" - "f79e59b743f5bb3af2d519ff27d9459cbf97222c15e6fc2a" - "0f91fc719b941525fae59361ceb69cebc2a8645912baa8d1" - "b6c1075ee3056a0c10d25065cb03a442e0ec6e0e1698db3b" - "4c98a0be3278e9649f1f9532e0d392dfd3a0342b8971f21e" - "1b0a74414ba3348cc5be7120c37632d8df359f8d9b992f2e" - "e60b6f470fe3f11de54cda541edad891ce6279cfcd3e7e6f" - "1618b166fd2c1d05848fd2c5f6fb2299f523f357a6327623" - "93a8353156cccd02acf081625a75ebb56e16369788d273cc" - "de96629281b949d04c50901b71c65614e6c6c7bd327a140a" - "45e1d006c3f27b9ac9aa53fd62a80f00bb25bfe235bdd2f6" - "71126905b2040222b6cbcf7ccd769c2b53113ec01640e3d3" - "38abbd602547adf0ba38209cf746ce7677afa1c520756060" - "85cbfe4e8ae88dd87aaaf9b04cf9aa7e1948c25c02fb8a8c" - "01c36ae4d6ebe1f990d4f869a65cdea03f09252dc208e69f" - "b74e6132ce77e25b578fdfe33ac372e6" -; - -char parray[] = - "243f6a8885a308d313198a2e03707344a4093822299f31d0" - "082efa98ec4e6c89452821e638d01377be5466cf34e90c6c" - "c0ac29b7c97c50dd3f84d5b5b54709179216d5d98979fb1b" -; - -#endif // Q_BLOWFISH_P_H diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS b/libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS deleted file mode 100644 index 0b87f99..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -BYVoid diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/CMakeLists.txt b/libcommuni/src/3rdparty/uchardet-0.0.1/CMakeLists.txt deleted file mode 100644 index 0dde2cc..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/CMakeLists.txt +++ /dev/null @@ -1,78 +0,0 @@ -######## Project settings -cmake_minimum_required(VERSION 2.8) -set (PACKAGE_NAME opencc) -project (${PACKAGE_NAME} CXX) -enable_testing() - -######## Package information -set (PACKAGE_URL http://code.google.com/p/uchardet/) -set (PACKAGE_BUGREPORT http://code.google.com/p/uchardet/issues/entry) -set (UCHARDET_VERSION_MAJOR 0) -set (UCHARDET_VERSION_MINOR 0) -set (UCHARDET_VERSION_REVISION 1) - -if (CMAKE_BUILD_TYPE MATCHES Debug) - set (version_suffix .Debug) -endif (CMAKE_BUILD_TYPE MATCHES Debug) - -set ( - UCHARDET_VERSION - ${UCHARDET_VERSION_MAJOR}.${UCHARDET_VERSION_MINOR}.${UCHARDET_VERSION_REVISION}${version_suffix} -) - -######## Windows - -if (WIN32) - set(CMAKE_SHARED_LIBRARY_PREFIX ${CMAKE_INSTALL_PREFIX}) - set(CMAKE_STATIC_LIBRARY_PREFIX ${CMAKE_INSTALL_PREFIX}) -endif (WIN32) - -######## Directory - -set (DIR_PREFIX ${CMAKE_INSTALL_PREFIX}) -set (DIR_LIBRARY ${DIR_PREFIX}/${CMAKE_SHARED_LIBRARY_PREFIX}) -set (DIR_LIBRARY_STATIC ${DIR_PREFIX}/${CMAKE_STATIC_LIBRARY_PREFIX}) -set (DIR_INCLUDE ${DIR_PREFIX}/include) -set (DIR_SHARE ${DIR_PREFIX}/share) -set (DIR_BIN ${DIR_PREFIX}/bin) -set (DIR_ETC ${DIR_PREFIX}/etc) - -if (DEFINED CMAKE_INSTALL_LIBDIR) - set (DIR_LIBRARY ${CMAKE_INSTALL_LIBDIR}) - set (DIR_LIBRARY_STATIC ${CMAKE_INSTALL_LIBDIR}) -endif (DEFINED CMAKE_INSTALL_LIBDIR) - -if (DEFINED SHARE_INSTALL_PREFIX) - set (DIR_SHARE ${SHARE_INSTALL_PREFIX}) -endif (DEFINED SHARE_INSTALL_PREFIX) - -if (DEFINED INCLUDE_INSTALL_DIR) - set (DIR_INCLUDE ${INCLUDE_INSTALL_DIR}) -endif (DEFINED INCLUDE_INSTALL_DIR) - -if (DEFINED SYSCONF_INSTALL_DIR) - set (DIR_ETC ${SYSCONF_INSTALL_DIR}) -endif (DEFINED SYSCONF_INSTALL_DIR) - -set (DIR_SHARE_UCHARDET ${DIR_SHARE}/opencc) -set (DIR_SHARE_LOCALE ${DIR_SHARE}/locale) - -######## Configuration - -configure_file( - uchardet.pc.in - uchardet.pc - @ONLY -) - -install( - FILES - ${CMAKE_BINARY_DIR}/uchardet.pc - DESTINATION - ${DIR_LIBRARY}/pkgconfig -) - -######## Subdirectories - -add_subdirectory(src) -add_subdirectory(doc) diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/COPYING b/libcommuni/src/3rdparty/uchardet-0.0.1/COPYING deleted file mode 100644 index 7714141..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/COPYING +++ /dev/null @@ -1,470 +0,0 @@ - MOZILLA PUBLIC LICENSE - Version 1.1 - - --------------- - -1. Definitions. - - 1.0.1. "Commercial Use" means distribution or otherwise making the - Covered Code available to a third party. - - 1.1. "Contributor" means each entity that creates or contributes to - the creation of Modifications. - - 1.2. "Contributor Version" means the combination of the Original - Code, prior Modifications used by a Contributor, and the Modifications - made by that particular Contributor. - - 1.3. "Covered Code" means the Original Code or Modifications or the - combination of the Original Code and Modifications, in each case - including portions thereof. - - 1.4. "Electronic Distribution Mechanism" means a mechanism generally - accepted in the software development community for the electronic - transfer of data. - - 1.5. "Executable" means Covered Code in any form other than Source - Code. - - 1.6. "Initial Developer" means the individual or entity identified - as the Initial Developer in the Source Code notice required by Exhibit - A. - - 1.7. "Larger Work" means a work which combines Covered Code or - portions thereof with code not governed by the terms of this License. - - 1.8. "License" means this document. - - 1.8.1. "Licensable" means having the right to grant, to the maximum - extent possible, whether at the time of the initial grant or - subsequently acquired, any and all of the rights conveyed herein. - - 1.9. "Modifications" means any addition to or deletion from the - substance or structure of either the Original Code or any previous - Modifications. When Covered Code is released as a series of files, a - Modification is: - A. Any addition to or deletion from the contents of a file - containing Original Code or previous Modifications. - - B. Any new file that contains any part of the Original Code or - previous Modifications. - - 1.10. "Original Code" means Source Code of computer software code - which is described in the Source Code notice required by Exhibit A as - Original Code, and which, at the time of its release under this - License is not already Covered Code governed by this License. - - 1.10.1. "Patent Claims" means any patent claim(s), now owned or - hereafter acquired, including without limitation, method, process, - and apparatus claims, in any patent Licensable by grantor. - - 1.11. "Source Code" means the preferred form of the Covered Code for - making modifications to it, including all modules it contains, plus - any associated interface definition files, scripts used to control - compilation and installation of an Executable, or source code - differential comparisons against either the Original Code or another - well known, available Covered Code of the Contributor's choice. The - Source Code can be in a compressed or archival form, provided the - appropriate decompression or de-archiving software is widely available - for no charge. - - 1.12. "You" (or "Your") means an individual or a legal entity - exercising rights under, and complying with all of the terms of, this - License or a future version of this License issued under Section 6.1. - For legal entities, "You" includes any entity which controls, is - controlled by, or is under common control with You. For purposes of - this definition, "control" means (a) the power, direct or indirect, - to cause the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than fifty percent - (50%) of the outstanding shares or beneficial ownership of such - entity. - -2. Source Code License. - - 2.1. The Initial Developer Grant. - The Initial Developer hereby grants You a world-wide, royalty-free, - non-exclusive license, subject to third party intellectual property - claims: - (a) under intellectual property rights (other than patent or - trademark) Licensable by Initial Developer to use, reproduce, - modify, display, perform, sublicense and distribute the Original - Code (or portions thereof) with or without Modifications, and/or - as part of a Larger Work; and - - (b) under Patents Claims infringed by the making, using or - selling of Original Code, to make, have made, use, practice, - sell, and offer for sale, and/or otherwise dispose of the - Original Code (or portions thereof). - - (c) the licenses granted in this Section 2.1(a) and (b) are - effective on the date Initial Developer first distributes - Original Code under the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no patent license is - granted: 1) for code that You delete from the Original Code; 2) - separate from the Original Code; or 3) for infringements caused - by: i) the modification of the Original Code or ii) the - combination of the Original Code with other software or devices. - - 2.2. Contributor Grant. - Subject to third party intellectual property claims, each Contributor - hereby grants You a world-wide, royalty-free, non-exclusive license - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Contributor, to use, reproduce, modify, - display, perform, sublicense and distribute the Modifications - created by such Contributor (or portions thereof) either on an - unmodified basis, with other Modifications, as Covered Code - and/or as part of a Larger Work; and - - (b) under Patent Claims infringed by the making, using, or - selling of Modifications made by that Contributor either alone - and/or in combination with its Contributor Version (or portions - of such combination), to make, use, sell, offer for sale, have - made, and/or otherwise dispose of: 1) Modifications made by that - Contributor (or portions thereof); and 2) the combination of - Modifications made by that Contributor with its Contributor - Version (or portions of such combination). - - (c) the licenses granted in Sections 2.2(a) and 2.2(b) are - effective on the date Contributor first makes Commercial Use of - the Covered Code. - - (d) Notwithstanding Section 2.2(b) above, no patent license is - granted: 1) for any code that Contributor has deleted from the - Contributor Version; 2) separate from the Contributor Version; - 3) for infringements caused by: i) third party modifications of - Contributor Version or ii) the combination of Modifications made - by that Contributor with other software (except as part of the - Contributor Version) or other devices; or 4) under Patent Claims - infringed by Covered Code in the absence of Modifications made by - that Contributor. - -3. Distribution Obligations. - - 3.1. Application of License. - The Modifications which You create or to which You contribute are - governed by the terms of this License, including without limitation - Section 2.2. The Source Code version of Covered Code may be - distributed only under the terms of this License or a future version - of this License released under Section 6.1, and You must include a - copy of this License with every copy of the Source Code You - distribute. You may not offer or impose any terms on any Source Code - version that alters or restricts the applicable version of this - License or the recipients' rights hereunder. However, You may include - an additional document offering the additional rights described in - Section 3.5. - - 3.2. Availability of Source Code. - Any Modification which You create or to which You contribute must be - made available in Source Code form under the terms of this License - either on the same media as an Executable version or via an accepted - Electronic Distribution Mechanism to anyone to whom you made an - Executable version available; and if made available via Electronic - Distribution Mechanism, must remain available for at least twelve (12) - months after the date it initially became available, or at least six - (6) months after a subsequent version of that particular Modification - has been made available to such recipients. You are responsible for - ensuring that the Source Code version remains available even if the - Electronic Distribution Mechanism is maintained by a third party. - - 3.3. Description of Modifications. - You must cause all Covered Code to which You contribute to contain a - file documenting the changes You made to create that Covered Code and - the date of any change. You must include a prominent statement that - the Modification is derived, directly or indirectly, from Original - Code provided by the Initial Developer and including the name of the - Initial Developer in (a) the Source Code, and (b) in any notice in an - Executable version or related documentation in which You describe the - origin or ownership of the Covered Code. - - 3.4. Intellectual Property Matters - (a) Third Party Claims. - If Contributor has knowledge that a license under a third party's - intellectual property rights is required to exercise the rights - granted by such Contributor under Sections 2.1 or 2.2, - Contributor must include a text file with the Source Code - distribution titled "LEGAL" which describes the claim and the - party making the claim in sufficient detail that a recipient will - know whom to contact. If Contributor obtains such knowledge after - the Modification is made available as described in Section 3.2, - Contributor shall promptly modify the LEGAL file in all copies - Contributor makes available thereafter and shall take other steps - (such as notifying appropriate mailing lists or newsgroups) - reasonably calculated to inform those who received the Covered - Code that new knowledge has been obtained. - - (b) Contributor APIs. - If Contributor's Modifications include an application programming - interface and Contributor has knowledge of patent licenses which - are reasonably necessary to implement that API, Contributor must - also include this information in the LEGAL file. - - (c) Representations. - Contributor represents that, except as disclosed pursuant to - Section 3.4(a) above, Contributor believes that Contributor's - Modifications are Contributor's original creation(s) and/or - Contributor has sufficient rights to grant the rights conveyed by - this License. - - 3.5. Required Notices. - You must duplicate the notice in Exhibit A in each file of the Source - Code. If it is not possible to put such notice in a particular Source - Code file due to its structure, then You must include such notice in a - location (such as a relevant directory) where a user would be likely - to look for such a notice. If You created one or more Modification(s) - You may add your name as a Contributor to the notice described in - Exhibit A. You must also duplicate this License in any documentation - for the Source Code where You describe recipients' rights or ownership - rights relating to Covered Code. You may choose to offer, and to - charge a fee for, warranty, support, indemnity or liability - obligations to one or more recipients of Covered Code. However, You - may do so only on Your own behalf, and not on behalf of the Initial - Developer or any Contributor. You must make it absolutely clear than - any such warranty, support, indemnity or liability obligation is - offered by You alone, and You hereby agree to indemnify the Initial - Developer and every Contributor for any liability incurred by the - Initial Developer or such Contributor as a result of warranty, - support, indemnity or liability terms You offer. - - 3.6. Distribution of Executable Versions. - You may distribute Covered Code in Executable form only if the - requirements of Section 3.1-3.5 have been met for that Covered Code, - and if You include a notice stating that the Source Code version of - the Covered Code is available under the terms of this License, - including a description of how and where You have fulfilled the - obligations of Section 3.2. The notice must be conspicuously included - in any notice in an Executable version, related documentation or - collateral in which You describe recipients' rights relating to the - Covered Code. You may distribute the Executable version of Covered - Code or ownership rights under a license of Your choice, which may - contain terms different from this License, provided that You are in - compliance with the terms of this License and that the license for the - Executable version does not attempt to limit or alter the recipient's - rights in the Source Code version from the rights set forth in this - License. If You distribute the Executable version under a different - license You must make it absolutely clear that any terms which differ - from this License are offered by You alone, not by the Initial - Developer or any Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred by - the Initial Developer or such Contributor as a result of any such - terms You offer. - - 3.7. Larger Works. - You may create a Larger Work by combining Covered Code with other code - not governed by the terms of this License and distribute the Larger - Work as a single product. In such a case, You must make sure the - requirements of this License are fulfilled for the Covered Code. - -4. Inability to Comply Due to Statute or Regulation. - - If it is impossible for You to comply with any of the terms of this - License with respect to some or all of the Covered Code due to - statute, judicial order, or regulation then You must: (a) comply with - the terms of this License to the maximum extent possible; and (b) - describe the limitations and the code they affect. Such description - must be included in the LEGAL file described in Section 3.4 and must - be included with all distributions of the Source Code. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Application of this License. - - This License applies to code to which the Initial Developer has - attached the notice in Exhibit A and to related Covered Code. - -6. Versions of the License. - - 6.1. New Versions. - Netscape Communications Corporation ("Netscape") may publish revised - and/or new versions of the License from time to time. Each version - will be given a distinguishing version number. - - 6.2. Effect of New Versions. - Once Covered Code has been published under a particular version of the - License, You may always continue to use it under the terms of that - version. You may also choose to use such Covered Code under the terms - of any subsequent version of the License published by Netscape. No one - other than Netscape has the right to modify the terms applicable to - Covered Code created under this License. - - 6.3. Derivative Works. - If You create or use a modified version of this License (which you may - only do in order to apply it to code which is not already Covered Code - governed by this License), You must (a) rename Your license so that - the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", - "MPL", "NPL" or any confusingly similar phrase do not appear in your - license (except to note that your license differs from this License) - and (b) otherwise make it clear that Your version of the license - contains terms which differ from the Mozilla Public License and - Netscape Public License. (Filling in the name of the Initial - Developer, Original Code or Contributor in the notice described in - Exhibit A shall not of themselves be deemed to be modifications of - this License.) - -7. DISCLAIMER OF WARRANTY. - - COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF - DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. - THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE - IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, - YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE - COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER - OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF - ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -8. TERMINATION. - - 8.1. This License and the rights granted hereunder will terminate - automatically if You fail to comply with terms herein and fail to cure - such breach within 30 days of becoming aware of the breach. All - sublicenses to the Covered Code which are properly granted shall - survive any termination of this License. Provisions which, by their - nature, must remain in effect beyond the termination of this License - shall survive. - - 8.2. If You initiate litigation by asserting a patent infringement - claim (excluding declatory judgment actions) against Initial Developer - or a Contributor (the Initial Developer or Contributor against whom - You file such action is referred to as "Participant") alleging that: - - (a) such Participant's Contributor Version directly or indirectly - infringes any patent, then any and all rights granted by such - Participant to You under Sections 2.1 and/or 2.2 of this License - shall, upon 60 days notice from Participant terminate prospectively, - unless if within 60 days after receipt of notice You either: (i) - agree in writing to pay Participant a mutually agreeable reasonable - royalty for Your past and future use of Modifications made by such - Participant, or (ii) withdraw Your litigation claim with respect to - the Contributor Version against such Participant. If within 60 days - of notice, a reasonable royalty and payment arrangement are not - mutually agreed upon in writing by the parties or the litigation claim - is not withdrawn, the rights granted by Participant to You under - Sections 2.1 and/or 2.2 automatically terminate at the expiration of - the 60 day notice period specified above. - - (b) any software, hardware, or device, other than such Participant's - Contributor Version, directly or indirectly infringes any patent, then - any rights granted to You by such Participant under Sections 2.1(b) - and 2.2(b) are revoked effective as of the date You first made, used, - sold, distributed, or had made, Modifications made by that - Participant. - - 8.3. If You assert a patent infringement claim against Participant - alleging that such Participant's Contributor Version directly or - indirectly infringes any patent where such claim is resolved (such as - by license or settlement) prior to the initiation of patent - infringement litigation, then the reasonable value of the licenses - granted by such Participant under Sections 2.1 or 2.2 shall be taken - into account in determining the amount or value of any payment or - license. - - 8.4. In the event of termination under Sections 8.1 or 8.2 above, - all end user license agreements (excluding distributors and resellers) - which have been validly granted by You or any distributor hereunder - prior to termination shall survive termination. - -9. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT - (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL - DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, - OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR - ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY - CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, - WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER - COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN - INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF - LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY - RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW - PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE - EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO - THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -10. U.S. GOVERNMENT END USERS. - - The Covered Code is a "commercial item," as that term is defined in - 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer - software" and "commercial computer software documentation," as such - terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 - C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), - all U.S. Government End Users acquire Covered Code with only those - rights set forth herein. - -11. MISCELLANEOUS. - - This License represents the complete agreement concerning subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. This License shall be governed by - California law provisions (except to the extent applicable law, if - any, provides otherwise), excluding its conflict-of-law provisions. - With respect to disputes in which at least one party is a citizen of, - or an entity chartered or registered to do business in the United - States of America, any litigation relating to this License shall be - subject to the jurisdiction of the Federal Courts of the Northern - District of California, with venue lying in Santa Clara County, - California, with the losing party responsible for costs, including - without limitation, court costs and reasonable attorneys' fees and - expenses. The application of the United Nations Convention on - Contracts for the International Sale of Goods is expressly excluded. - Any law or regulation which provides that the language of a contract - shall be construed against the drafter shall not apply to this - License. - -12. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, each party is - responsible for claims and damages arising, directly or indirectly, - out of its utilization of rights under this License and You agree to - work with Initial Developer and Contributors to distribute such - responsibility on an equitable basis. Nothing herein is intended or - shall be deemed to constitute any admission of liability. - -13. MULTIPLE-LICENSED CODE. - - Initial Developer may designate portions of the Covered Code as - "Multiple-Licensed". "Multiple-Licensed" means that the Initial - Developer permits you to utilize portions of the Covered Code under - Your choice of the NPL or the alternative licenses, if any, specified - by the Initial Developer in the file described in Exhibit A. - -EXHIBIT A -Mozilla Public License. - - ``The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - - The Original Code is ______________________________________. - - The Initial Developer of the Original Code is ________________________. - Portions created by ______________________ are Copyright (C) ______ - _______________________. All Rights Reserved. - - Contributor(s): ______________________________________. - - Alternatively, the contents of this file may be used under the terms - of the _____ license (the "[___] License"), in which case the - provisions of [______] License are applicable instead of those - above. If you wish to allow use of your version of this file only - under the terms of the [____] License and not to allow others to use - your version of this file under the MPL, indicate your decision by - deleting the provisions above and replace them with the notice and - other provisions required by the [___] License. If you do not delete - the provisions above, a recipient may use your version of this file - under either the MPL or the [___] License." - - [NOTE: The text of this Exhibit A may differ slightly from the text of - the notices in the Source Code files of the Original Code. You should - use the text of this Exhibit A rather than the text found in the - Original Code Source Code for Your Modifications.] - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL b/libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL deleted file mode 100644 index 8d0ab8f..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL +++ /dev/null @@ -1,4 +0,0 @@ -Execute release.sh or manually make a directory and check in, and execute - cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release && make -Then install - sudo make install diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt b/libcommuni/src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt deleted file mode 100644 index f14354e..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -install( - FILES - uchardet.1 - DESTINATION - ${DIR_SHARE}/man/man1 -) diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/doc/uchardet.1 b/libcommuni/src/3rdparty/uchardet-0.0.1/doc/uchardet.1 deleted file mode 100644 index 7d187fe..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/doc/uchardet.1 +++ /dev/null @@ -1,18 +0,0 @@ -.TH UCHARDET "1" "July 2011" "uchardet " "User Commands" -.SH NAME -uchardet \- universalchardet (Universal Charset Detector) -.SH DESCRIPTION -uchardet Command Line Tool -.SS "Usage:" -.HP -uchardet [\fBOptions\fR] [\fBFile\fR] -.HP -\fB\-v\fR -Print version and build information. -.HP -\fB\-h\fR -Print help text. -.HP -.IP -.PP -uchardet Command Line Tool diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/script/debug.sh b/libcommuni/src/3rdparty/uchardet-0.0.1/script/debug.sh deleted file mode 100644 index f85d69b..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/script/debug.sh +++ /dev/null @@ -1,9 +0,0 @@ -mkdir --parents debug \ -&& cd debug - -cmake \ - -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_INSTALL_PREFIX=`pwd`/root \ - .. \ -&& make \ -&& make install diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/script/release.sh b/libcommuni/src/3rdparty/uchardet-0.0.1/script/release.sh deleted file mode 100644 index 21a5f6e..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/script/release.sh +++ /dev/null @@ -1,8 +0,0 @@ -mkdir --parents release \ -&& cd release - -cmake \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/usr \ - .. \ -&& make diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/script/win32.sh b/libcommuni/src/3rdparty/uchardet-0.0.1/script/win32.sh deleted file mode 100644 index b757380..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/script/win32.sh +++ /dev/null @@ -1,7 +0,0 @@ -mkdir --parents win32 \ -&& cd win32 \ -&& cmake .. \ - -G "MSYS Makefiles" \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX="" \ -&& make \ No newline at end of file diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab b/libcommuni/src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab deleted file mode 100644 index fd6b0e0..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab +++ /dev/null @@ -1,943 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// Big5 frequency table -// by Taiwan's Mandarin Promotion Council -// - -/****************************************************************************** - * 128 --> 0.42261 - * 256 --> 0.57851 - * 512 --> 0.74851 - * 1024 --> 0.89384 - * 2048 --> 0.97583 - * - * Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 - * Random Distribution Ration = 512/(5401-512)=0.105 - * - * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - *****************************************************************************/ - -#define BIG5_TYPICAL_DISTRIBUTION_RATIO (float)0.75 - - -//Char to FreqOrder table , -#define BIG5_TABLE_SIZE 5376 - -static const PRInt16 Big5CharToFreqOrder[] = -{ - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, // 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, // 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, // 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, // 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, // 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, // 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, // 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, // 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, // 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, // 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, // 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, // 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, // 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, // 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, // 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, // 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, // 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, // 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, // 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, // 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, // 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, // 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, // 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, // 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, // 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, // 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, // 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, // 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, // 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, // 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, // 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, // 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, // 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, // 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, // 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, // 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, // 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, // 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, // 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, // 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, // 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, // 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, // 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, // 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, // 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, // 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, // 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, // 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, // 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, // 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, // 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, // 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, // 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, // 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, // 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, // 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, // 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, // 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, // 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, // 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, // 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, // 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, // 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, // 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, // 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, // 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, // 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, // 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, // 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, // 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, // 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, // 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, // 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, // 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, // 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, // 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, // 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, // 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, // 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, // 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, // 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, // 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, // 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, // 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, // 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, // 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, // 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, // 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, // 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, // 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, // 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, // 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, // 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, // 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, // 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, // 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, // 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, // 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, // 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, // 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, // 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, // 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, // 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, // 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, // 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, // 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, // 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, // 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, // 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, // 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, // 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, // 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, // 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, // 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, // 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, // 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, // 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, // 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, // 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, // 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, // 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, // 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, // 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, // 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, // 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, // 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, // 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, // 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, // 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, // 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, // 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, // 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, // 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, // 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, // 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, // 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, // 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, // 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, // 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, // 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, // 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, // 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, // 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, // 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, // 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, // 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, // 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, // 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, // 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, // 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, // 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, // 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, // 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, // 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, // 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, // 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, // 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, // 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, // 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, // 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, // 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, // 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, // 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, // 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, // 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, // 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, // 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, // 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, // 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, // 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, // 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, // 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, // 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, // 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, // 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, // 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, // 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, // 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, // 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, // 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, // 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, // 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, // 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, // 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, // 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, // 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, // 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, // 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, // 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, // 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, // 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, // 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, // 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, // 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, // 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, // 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, // 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, // 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, // 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, // 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, // 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, // 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, // 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, // 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, // 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, // 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, // 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, // 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, // 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, // 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, // 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, // 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, // 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, // 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, // 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, // 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, // 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, // 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, // 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, // 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, // 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, // 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, // 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, // 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, // 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, // 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, // 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, // 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, // 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, // 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, // 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, // 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, // 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, // 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, // 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, // 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, // 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, // 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, // 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, // 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, // 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, // 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, // 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, // 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, // 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, // 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, // 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, // 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, // 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, // 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, // 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, // 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, // 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, // 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, // 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, // 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, // 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, // 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, // 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, // 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, // 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, // 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, // 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, // 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, // 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, // 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, // 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, // 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, // 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, // 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, // 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, // 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, // 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, // 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, // 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, // 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, // 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, // 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, // 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, // 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, // 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, // 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, // 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, // 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, // 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, // 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, // 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, // 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, // 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, // 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, // 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, // 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, // 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, // 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, // 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, // 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, // 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, // 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, // 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, // 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, // 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, // 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, // 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, // 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, // 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, // 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, // 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, // 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, // 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, // 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, // 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, // 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, // 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, // 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, // 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, // 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, // 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, // 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, // 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, // 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, // 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, // 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, // 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, // 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, // 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, // 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, // 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, // 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, // 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, // 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, // 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, // 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, // 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, // 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, // 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, // 5376 //last 512 - -/*************************************************************************************** - *Everything below is of no interest for detection purpose * - *************************************************************************************** - -2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, // 5392 -2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, // 5408 -5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, // 5424 -5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, // 5440 -5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, // 5456 -5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, // 5472 -5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, // 5488 -5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, // 5504 -5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, // 5520 -5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, // 5536 -5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, // 5552 -5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, // 5568 -5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, // 5584 -5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, // 5600 -6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, // 5616 -6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, // 5632 -6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, // 5648 -6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, // 5664 -6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, // 5680 -6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, // 5696 -6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, // 5712 -6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, // 5728 -6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, // 5744 -6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, // 5760 -6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, // 5776 -6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, // 5792 -6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, // 5808 -6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, // 5824 -6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, // 5840 -6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, // 5856 -6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, // 5872 -6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, // 5888 -6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, // 5904 -6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, // 5920 -6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, // 5936 -6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, // 5952 -6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, // 5968 -6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, // 5984 -6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, // 6000 -6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, // 6016 -6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, // 6032 -6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, // 6048 -6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, // 6064 -6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, // 6080 -6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, // 6096 -6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, // 6112 -6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, // 6128 -6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, // 6144 -6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, // 6160 -6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, // 6176 -6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, // 6192 -6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, // 6208 -6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, // 6224 -6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, // 6240 -6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, // 6256 -3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, // 6272 -6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, // 6288 -6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, // 6304 -3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, // 6320 -6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, // 6336 -6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, // 6352 -6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, // 6368 -6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, // 6384 -6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, // 6400 -6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, // 6416 -6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, // 6432 -4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, // 6448 -6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, // 6464 -6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, // 6480 -3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, // 6496 -6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, // 6512 -6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, // 6528 -6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, // 6544 -6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, // 6560 -6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, // 6576 -6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, // 6592 -6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, // 6608 -6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, // 6624 -6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, // 6640 -6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, // 6656 -6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, // 6672 -7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, // 6688 -7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, // 6704 -7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, // 6720 -7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, // 6736 -7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, // 6752 -7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, // 6768 -7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, // 6784 -7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, // 6800 -7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, // 6816 -7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, // 6832 -7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, // 6848 -7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, // 6864 -7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, // 6880 -7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, // 6896 -7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, // 6912 -7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, // 6928 -7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, // 6944 -7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, // 6960 -7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, // 6976 -7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, // 6992 -7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, // 7008 -7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, // 7024 -7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, // 7040 -7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, // 7056 -7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, // 7072 -7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, // 7088 -7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, // 7104 -7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, // 7120 -7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, // 7136 -7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, // 7152 -7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, // 7168 -7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, // 7184 -7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, // 7200 -7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, // 7216 -7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, // 7232 -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, // 7248 -7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, // 7264 -7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, // 7280 -7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, // 7296 -7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, // 7312 -7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, // 7328 -7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, // 7344 -7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, // 7360 -7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, // 7376 -7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, // 7392 -7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, // 7408 -7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, // 7424 -7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, // 7440 -3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, // 7456 -7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, // 7472 -7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, // 7488 -7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, // 7504 -7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, // 7520 -4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, // 7536 -7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, // 7552 -7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, // 7568 -7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, // 7584 -7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, // 7600 -7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, // 7616 -7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, // 7632 -7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, // 7648 -7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, // 7664 -7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, // 7680 -7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, // 7696 -7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, // 7712 -8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, // 7728 -8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, // 7744 -8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, // 7760 -8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, // 7776 -8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, // 7792 -8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, // 7808 -8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, // 7824 -8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, // 7840 -8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, // 7856 -8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, // 7872 -8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, // 7888 -8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, // 7904 -8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, // 7920 -8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, // 7936 -8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, // 7952 -8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, // 7968 -8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, // 7984 -8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, // 8000 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, // 8016 -8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, // 8032 -8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, // 8048 -8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, // 8064 -8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, // 8080 -8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, // 8096 -8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, // 8112 -8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, // 8128 -8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, // 8144 -8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, // 8160 -8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, // 8176 -8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, // 8192 -8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, // 8208 -8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, // 8224 -8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, // 8240 -8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, // 8256 -8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, // 8272 -8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, // 8288 -8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, // 8304 -8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, // 8320 -8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, // 8336 -8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, // 8352 -8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, // 8368 -8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, // 8384 -8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, // 8400 -8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, // 8416 -8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, // 8432 -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, // 8448 -8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, // 8464 -8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, // 8480 -8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, // 8496 -8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, // 8512 -8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, // 8528 -8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, // 8544 -8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, // 8560 -8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, // 8576 -8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, // 8592 -8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, // 8608 -8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, // 8624 -8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, // 8640 -8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, // 8656 -8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, // 8672 -8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, // 8688 -4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, // 8704 -8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, // 8720 -8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, // 8736 -8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, // 8752 -8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, // 8768 -9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, // 8784 -9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, // 8800 -9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, // 8816 -9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, // 8832 -9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, // 8848 -9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, // 8864 -9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, // 8880 -9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, // 8896 -9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, // 8912 -9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, // 8928 -9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, // 8944 -9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, // 8960 -9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, // 8976 -9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, // 8992 -9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, // 9008 -9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, // 9024 -9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, // 9040 -9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, // 9056 -9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, // 9072 -9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, // 9088 -9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, // 9104 -9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, // 9120 -9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, // 9136 -9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, // 9152 -9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, // 9168 -9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, // 9184 -9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, // 9200 -9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, // 9216 -9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, // 9232 -9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, // 9248 -9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, // 9264 -9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, // 9280 -9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, // 9296 -9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, // 9312 -9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, // 9328 -9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, // 9344 -9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, // 9360 -9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, // 9376 -3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, // 9392 -9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, // 9408 -9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, // 9424 -9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, // 9440 -4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, // 9456 -9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, // 9472 -9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, // 9488 -9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, // 9504 -9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, // 9520 -9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, // 9536 -9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, // 9552 -9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, // 9568 -9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, // 9584 -9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, // 9600 -9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, // 9616 -9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, // 9632 -9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, // 9648 -9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, // 9664 -9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, // 9680 -9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, // 9696 -9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, // 9712 -9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, // 9728 -9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, // 9744 -9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, // 9760 -9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, // 9776 -9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, // 9792 -9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, // 9808 -9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, // 9824 -10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, // 9840 -10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, // 9856 -10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, // 9872 -10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, // 9888 -10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, // 9904 -10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, // 9920 -10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, // 9936 -10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, // 9952 -10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, // 9968 -4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, // 9984 -10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, //10000 -10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, //10016 -10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, //10032 -10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, //10048 -10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, //10064 -10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, //10080 -10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, //10096 -10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, //10112 -4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, //10128 -10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, //10144 -10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, //10160 -10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, //10176 -10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, //10192 -10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, //10208 -10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, //10224 -10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, //10240 -10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, //10256 -10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, //10272 -10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, //10288 -10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, //10304 -10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, //10320 -10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, //10336 -10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, //10352 -10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, //10368 -10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, //10384 -10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, //10400 -4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, //10416 -10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, //10432 -10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, //10448 -10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, //10464 -10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, //10480 -10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, //10496 -10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, //10512 -10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, //10528 -10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, //10544 -10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, //10560 -10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, //10576 -10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, //10592 -10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, //10608 -10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, //10624 -10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, //10640 -10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, //10656 -10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, //10672 -10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, //10688 -10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, //10704 -10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, //10720 -10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, //10736 -10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, //10752 -10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, //10768 -10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, //10784 -10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, //10800 -10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, //10816 -10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, //10832 -10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, //10848 -10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, //10864 -10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, //10880 -10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, //10896 -11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, //10912 -11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, //10928 -11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, //10944 -4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, //10960 -11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, //10976 -11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, //10992 -11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, //11008 -11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, //11024 -11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, //11040 -11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, //11056 -11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, //11072 -11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, //11088 -11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, //11104 -11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, //11120 -11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, //11136 -11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, //11152 -11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, //11168 -11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, //11184 -11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, //11200 -11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, //11216 -11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, //11232 -11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, //11248 -11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, //11264 -11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, //11280 -11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, //11296 -11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, //11312 -11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, //11328 -11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, //11344 -11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, //11360 -11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, //11376 -11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, //11392 -11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, //11408 -11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, //11424 -11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, //11440 -11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, //11456 -11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, //11472 -4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, //11488 -11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, //11504 -11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, //11520 -11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, //11536 -11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, //11552 -11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, //11568 -11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, //11584 -11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, //11600 -11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, //11616 -11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, //11632 -11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, //11648 -11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, //11664 -11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, //11680 -11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, //11696 -11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, //11712 -11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, //11728 -11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, //11744 -11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, //11760 -11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, //11776 -11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, //11792 -11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, //11808 -11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, //11824 -11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, //11840 -11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, //11856 -11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, //11872 -11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, //11888 -11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, //11904 -11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, //11920 -11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, //11936 -12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, //11952 -12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, //11968 -12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, //11984 -12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, //12000 -12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, //12016 -12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, //12032 -12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, //12048 -12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, //12064 -12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, //12080 -12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, //12096 -12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, //12112 -12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, //12128 -12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, //12144 -12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, //12160 -12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, //12176 -4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, //12192 -4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, //12208 -4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, //12224 -12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, //12240 -12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, //12256 -12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, //12272 -12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, //12288 -12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, //12304 -12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, //12320 -12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, //12336 -12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, //12352 -12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, //12368 -12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, //12384 -12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, //12400 -12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, //12416 -12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, //12432 -12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, //12448 -12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, //12464 -12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, //12480 -12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, //12496 -12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, //12512 -12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, //12528 -12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, //12544 -12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, //12560 -12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, //12576 -12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, //12592 -12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, //12608 -12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, //12624 -12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, //12640 -12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, //12656 -12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, //12672 -12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, //12688 -12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, //12704 -12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, //12720 -12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, //12736 -12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, //12752 -12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, //12768 -12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, //12784 -12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, //12800 -12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, //12816 -12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, //12832 -12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, //12848 -12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, //12864 -12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, //12880 -12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, //12896 -12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, //12912 -12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, //12928 -12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, //12944 -12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, //12960 -12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, //12976 -4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, //12992 -13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, //13008 -13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, //13024 -13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, //13040 -13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, //13056 -13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, //13072 -13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, //13088 -13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, //13104 -4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, //13120 -13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, //13136 -13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, //13152 -13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, //13168 -13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, //13184 -13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, //13200 -13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, //13216 -13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, //13232 -13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, //13248 -13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, //13264 -13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, //13280 -13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, //13296 -13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, //13312 -13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, //13328 -13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, //13344 -13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, //13360 -5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, //13376 -13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, //13392 -13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, //13408 -13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, //13424 -13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, //13440 -13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, //13456 -13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, //13472 -13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, //13488 -13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, //13504 -13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, //13520 -13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, //13536 -13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, //13552 -13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, //13568 -13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, //13584 -13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, //13600 -13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, //13616 -13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, //13632 -13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, //13648 -13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, //13664 -13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, //13680 -13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, //13696 -13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, //13712 -13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, //13728 -13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, //13744 -13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, //13760 -13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, //13776 -13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, //13792 -13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, //13808 -13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, //13824 -13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, //13840 -13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, //13856 -13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, //13872 -13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, //13888 -13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, //13904 -13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, //13920 -13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, //13936 -13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, //13952 -13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, //13968 -13968,13969,13970,13971,13972, //13973 -****************************************************************************************/ -}; diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt b/libcommuni/src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt deleted file mode 100644 index 0b26a3b..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt +++ /dev/null @@ -1,106 +0,0 @@ - -set( - UCHARDET_HEADERS - uchardet.h -) - -set( - UCHARDET_SOURCES - CharDistribution.cpp - JpCntx.cpp - LangBulgarianModel.cpp - LangCyrillicModel.cpp - LangGreekModel.cpp - LangHungarianModel.cpp - LangHebrewModel.cpp - LangThaiModel.cpp - nsHebrewProber.cpp - nsCharSetProber.cpp - nsBig5Prober.cpp - nsEUCJPProber.cpp - nsEUCKRProber.cpp - nsEUCTWProber.cpp - nsEscCharsetProber.cpp - nsEscSM.cpp - nsGB2312Prober.cpp - nsMBCSGroupProber.cpp - nsMBCSSM.cpp - nsSBCSGroupProber.cpp - nsSBCharSetProber.cpp - nsSJISProber.cpp - nsUTF8Prober.cpp - nsLatin1Prober.cpp - nsUniversalDetector.cpp - uchardet.cpp -) - -set (UCHARDET_TARGET libuchardet) -set (UCHARDET_STATIC_TARGET libuchardet_static) - -add_definitions( - -DPKGDATADIR="${DIR_SHARE_OPENCC}" - -DLOCALEDIR="${DIR_SHARE_LOCALE}" - -DVERSION="${UCHARDET_VERSION}" - -DPACKAGE_NAME="${PACKAGE_NAME}" - -Wall -) - -add_library( - ${UCHARDET_TARGET} - SHARED - ${UCHARDET_SOURCES} -) - -add_library( - ${UCHARDET_STATIC_TARGET} - STATIC - ${UCHARDET_SOURCES} -) - -set_target_properties( - ${UCHARDET_TARGET} - ${UCHARDET_STATIC_TARGET} - PROPERTIES - LINKER_LANGUAGE - CXX - OUTPUT_NAME - uchardet - VERSION - 0.0.0 - SOVERSION - 0 -) - -if (CMAKE_BUILD_TYPE MATCHES Debug) - add_definitions( - -O0 - -g3 - ) -endif (CMAKE_BUILD_TYPE MATCHES Debug) - -if (NOT WIN32) -install( - TARGETS - ${UCHARDET_TARGET} - LIBRARY DESTINATION - ${DIR_LIBRARY} -) -endif (NOT WIN32) - -install( - TARGETS - ${UCHARDET_STATIC_TARGET} - ARCHIVE DESTINATION - ${DIR_LIBRARY_STATIC} -) - -install( - FILES - ${UCHARDET_HEADERS} - DESTINATION - ${DIR_INCLUDE}/uchardet -) - -include(symbols.cmake) - -add_subdirectory(tools) diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.cpp deleted file mode 100644 index 488d9bc..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "CharDistribution.h" - -#include "JISFreq.tab" -#include "Big5Freq.tab" -#include "EUCKRFreq.tab" -#include "EUCTWFreq.tab" -#include "GB2312Freq.tab" - -#define SURE_YES 0.99f -#define SURE_NO 0.01f - -//return confidence base on received data -float CharDistributionAnalysis::GetConfidence(void) -{ - //if we didn't receive any character in our consideration range, or the - // number of frequent characters is below the minimum threshold, return - // negative answer - if (mTotalChars <= 0 || mFreqChars <= mDataThreshold) - return SURE_NO; - - if (mTotalChars != mFreqChars) { - float r = mFreqChars / ((mTotalChars - mFreqChars) * mTypicalDistributionRatio); - - if (r < SURE_YES) - return r; - } - //normalize confidence, (we don't want to be 100% sure) - return SURE_YES; -} - -EUCTWDistributionAnalysis::EUCTWDistributionAnalysis() -{ - mCharToFreqOrder = EUCTWCharToFreqOrder; - mTableSize = EUCTW_TABLE_SIZE; - mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO; -} - -EUCKRDistributionAnalysis::EUCKRDistributionAnalysis() -{ - mCharToFreqOrder = EUCKRCharToFreqOrder; - mTableSize = EUCKR_TABLE_SIZE; - mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO; -} - -GB2312DistributionAnalysis::GB2312DistributionAnalysis() -{ - mCharToFreqOrder = GB2312CharToFreqOrder; - mTableSize = GB2312_TABLE_SIZE; - mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO; -} - -Big5DistributionAnalysis::Big5DistributionAnalysis() -{ - mCharToFreqOrder = Big5CharToFreqOrder; - mTableSize = BIG5_TABLE_SIZE; - mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO; -} - -SJISDistributionAnalysis::SJISDistributionAnalysis() -{ - mCharToFreqOrder = JISCharToFreqOrder; - mTableSize = JIS_TABLE_SIZE; - mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO; -} - -EUCJPDistributionAnalysis::EUCJPDistributionAnalysis() -{ - mCharToFreqOrder = JISCharToFreqOrder; - mTableSize = JIS_TABLE_SIZE; - mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO; -} - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.h deleted file mode 100644 index 945b9ac..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.h +++ /dev/null @@ -1,242 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef CharDistribution_h__ -#define CharDistribution_h__ - -#include "nscore.h" - -#define ENOUGH_DATA_THRESHOLD 1024 - -#define MINIMUM_DATA_THRESHOLD 4 - -class CharDistributionAnalysis -{ -public: - CharDistributionAnalysis() {Reset(PR_FALSE);} - - //feed a block of data and do distribution analysis - void HandleData(const char* /*aBuf*/, PRUint32 /*aLen*/) {} - - //Feed a character with known length - void HandleOneChar(const char* aStr, PRUint32 aCharLen) - { - PRInt32 order; - - //we only care about 2-bytes character in our distribution analysis - order = (aCharLen == 2) ? GetOrder(aStr) : -1; - - if (order >= 0) - { - mTotalChars++; - //order is valid - if ((PRUint32)order < mTableSize) - { - if (512 > mCharToFreqOrder[order]) - mFreqChars++; - } - } - } - - //return confidence base on existing data - float GetConfidence(void); - - //Reset analyser, clear any state - void Reset(PRBool aIsPreferredLanguage) - { - mDone = PR_FALSE; - mTotalChars = 0; - mFreqChars = 0; - mDataThreshold = aIsPreferredLanguage ? 0 : MINIMUM_DATA_THRESHOLD; - } - - //This function is for future extension. Caller can use this function to control - //analyser's behavior - void SetOpion(){} - - //It is not necessary to receive all data to draw conclusion. For charset detection, - // certain amount of data is enough - PRBool GotEnoughData() {return mTotalChars > ENOUGH_DATA_THRESHOLD;} - -protected: - //we do not handle character base on its original encoding string, but - //convert this encoding string to a number, here called order. - //This allow multiple encoding of a language to share one frequency table - virtual PRInt32 GetOrder(const char* /*str*/) {return -1;} - - //If this flag is set to PR_TRUE, detection is done and conclusion has been made - PRBool mDone; - - //The number of characters whose frequency order is less than 512 - PRUint32 mFreqChars; - - //Total character encounted. - PRUint32 mTotalChars; - - //Number of hi-byte characters needed to trigger detection - PRUint32 mDataThreshold; - - //Mapping table to get frequency order from char order (get from GetOrder()) - const PRInt16 *mCharToFreqOrder; - - //Size of above table - PRUint32 mTableSize; - - //This is a constant value varies from language to language, it is used in - //calculating confidence. See my paper for further detail. - float mTypicalDistributionRatio; -}; - - -class EUCTWDistributionAnalysis: public CharDistributionAnalysis -{ -public: - EUCTWDistributionAnalysis(); -protected: - - //for euc-TW encoding, we are interested - // first byte range: 0xc4 -- 0xfe - // second byte range: 0xa1 -- 0xfe - //no validation needed here. State machine has done that - PRInt32 GetOrder(const char* str) - { if ((unsigned char)*str >= (unsigned char)0xc4) - return 94*((unsigned char)str[0]-(unsigned char)0xc4) + (unsigned char)str[1] - (unsigned char)0xa1; - else - return -1; - } -}; - - -class EUCKRDistributionAnalysis : public CharDistributionAnalysis -{ -public: - EUCKRDistributionAnalysis(); -protected: - //for euc-KR encoding, we are interested - // first byte range: 0xb0 -- 0xfe - // second byte range: 0xa1 -- 0xfe - //no validation needed here. State machine has done that - PRInt32 GetOrder(const char* str) - { if ((unsigned char)*str >= (unsigned char)0xb0) - return 94*((unsigned char)str[0]-(unsigned char)0xb0) + (unsigned char)str[1] - (unsigned char)0xa1; - else - return -1; - } -}; - -class GB2312DistributionAnalysis : public CharDistributionAnalysis -{ -public: - GB2312DistributionAnalysis(); -protected: - //for GB2312 encoding, we are interested - // first byte range: 0xb0 -- 0xfe - // second byte range: 0xa1 -- 0xfe - //no validation needed here. State machine has done that - PRInt32 GetOrder(const char* str) - { if ((unsigned char)*str >= (unsigned char)0xb0 && (unsigned char)str[1] >= (unsigned char)0xa1) - return 94*((unsigned char)str[0]-(unsigned char)0xb0) + (unsigned char)str[1] - (unsigned char)0xa1; - else - return -1; - } -}; - - -class Big5DistributionAnalysis : public CharDistributionAnalysis -{ -public: - Big5DistributionAnalysis(); -protected: - //for big5 encoding, we are interested - // first byte range: 0xa4 -- 0xfe - // second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - //no validation needed here. State machine has done that - PRInt32 GetOrder(const char* str) - { if ((unsigned char)*str >= (unsigned char)0xa4) - if ((unsigned char)str[1] >= (unsigned char)0xa1) - return 157*((unsigned char)str[0]-(unsigned char)0xa4) + (unsigned char)str[1] - (unsigned char)0xa1 +63; - else - return 157*((unsigned char)str[0]-(unsigned char)0xa4) + (unsigned char)str[1] - (unsigned char)0x40; - else - return -1; - } -}; - -class SJISDistributionAnalysis : public CharDistributionAnalysis -{ -public: - SJISDistributionAnalysis(); -protected: - //for sjis encoding, we are interested - // first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - // second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - //no validation needed here. State machine has done that - PRInt32 GetOrder(const char* str) - { - PRInt32 order; - if ((unsigned char)*str >= (unsigned char)0x81 && (unsigned char)*str <= (unsigned char)0x9f) - order = 188 * ((unsigned char)str[0]-(unsigned char)0x81); - else if ((unsigned char)*str >= (unsigned char)0xe0 && (unsigned char)*str <= (unsigned char)0xef) - order = 188 * ((unsigned char)str[0]-(unsigned char)0xe0 + 31); - else - return -1; - order += (unsigned char)*(str+1) - 0x40; - if ((unsigned char)str[1] > (unsigned char)0x7f) - order--; - return order; - } -}; - -class EUCJPDistributionAnalysis : public CharDistributionAnalysis -{ -public: - EUCJPDistributionAnalysis(); -protected: - //for euc-JP encoding, we are interested - // first byte range: 0xa0 -- 0xfe - // second byte range: 0xa1 -- 0xfe - //no validation needed here. State machine has done that - PRInt32 GetOrder(const char* str) - { if ((unsigned char)*str >= (unsigned char)0xa0) - return 94*((unsigned char)str[0]-(unsigned char)0xa1) + (unsigned char)str[1] - (unsigned char)0xa1; - else - return -1; - } -}; - -#endif //CharDistribution_h__ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab b/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab deleted file mode 100644 index d2c5047..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab +++ /dev/null @@ -1,614 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -//Sampling from about 20M text materials include literature and computer technology - -/****************************************************************************** - * 128 --> 0.79 - * 256 --> 0.92 - * 512 --> 0.986 - * 1024 --> 0.99944 - * 2048 --> 0.99999 - * - * Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 - * Random Distribution Ration = 512 / (2350-512) = 0.279. - * - * Typical Distribution Ratio - *****************************************************************************/ - -#define EUCKR_TYPICAL_DISTRIBUTION_RATIO (float) 6.0 - -#define EUCKR_TABLE_SIZE 2352 - -//Char to FreqOrder table , -static const PRInt16 EUCKRCharToFreqOrder[] = -{ - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, //512, 256 - -/*************************************************************************************** - *Everything below is of no interest for detection purpose * - *************************************************************************************** - -2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, -2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, -2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, -2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, -2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, -2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, -2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, -2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, -2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, -2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, -2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, -2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, -2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, -2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, -1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, -2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, -2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, -2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, -2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, -2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, -2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, -2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, -2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, -2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, -3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, -3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, -3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, -3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, -3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, -3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, -3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, -3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, -3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, -3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, -3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, -3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, -3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, -3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, -3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, -3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, -3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, -3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, -3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, -3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, -3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, -3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, -3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, -3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, -3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, -3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, -3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, -3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, -3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, -3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, -3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, -3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, -1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, -1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, -3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, -3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, -3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, -3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, -3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, -3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, -3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, -3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, -3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, -3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, -3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, -3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, -3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, -1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, -3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, -3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, -3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, -3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, -3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, -3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, -3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, -1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, -3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, -3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, -3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, -3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, -1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, -3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, -3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, -3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, -3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, -3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, -3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, -3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, -4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, -4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, -1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, -4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, -4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, -4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, -4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, -4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, -4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, -4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, -4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, -4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, -4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, -4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, -4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, -4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, -4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, -4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, -4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, -4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, -4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, -4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, -4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, -4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, -4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, -4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, -4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, -4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, -4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, -4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, -4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, -4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, -4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, -4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, -4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, -4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, -4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, -4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, -4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, -4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, -4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, -4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, -4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, -4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, -4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, -1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, -4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, -4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, -4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, -4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, -4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, -4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, -4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, -4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, -4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, -4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, -4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, -4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, -4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, -4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, -4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, -4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, -4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, -4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, -4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, -4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, -5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, -5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, -1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, -5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, -5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, -5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, -5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, -5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, -1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, -5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, -5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, -5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, -5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, -5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, -1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, -5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, -5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, -5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, -5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, -5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, -5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, -5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, -5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, -5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, -5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, -5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, -5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, -5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, -5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, -5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, -5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, -5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, -5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, -5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, -5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, -5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, -5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, -5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, -1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, -5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, -5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, -5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, -5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, -1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, -5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, -5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, -5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, -5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, -5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, -1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, -5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, -1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, -5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, -5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, -5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, -5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, -5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, -5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, -5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, -5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, -5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, -5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, -5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, -5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, -5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, -5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, -6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, -6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, -6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, -6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, -6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, -6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, -6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, -6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, -6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, -6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, -6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, -6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, -6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, -6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, -6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, -6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, -6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, //1024 -6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, -6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, -6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, -6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, -6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, -6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, -6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, -6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, -6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, -6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, -6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, -6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, -6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, -6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, -6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, -6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, -6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, -6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, -1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, -6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, -6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, -6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, -6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, -6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, -1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, -6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, -1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, -6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, -6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, -6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, -1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, -6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, -6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, -6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, -6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, -6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, -6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, -6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, -6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, -6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, -6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, -6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, -6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, -6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, -6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, -6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, -6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, -6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, -7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, -7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, -7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, -7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, -7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, -7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, -7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, -7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, -7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, -7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, -7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, -7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, -7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, -7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, -7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, -7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, -7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, -7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, -7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, -7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, -7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, -7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, -7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, -7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, -7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, -7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, -7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, -7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, -7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, -7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, -7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, -7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, -7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, -7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, -7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, -7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, -7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, -7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, -7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, -7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, -7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, -7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, -7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, -7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, -7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, -7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, -7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, -7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, -7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, -7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, -7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, -7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, -7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, -7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, -7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, -7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, -7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, -8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, -8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, -8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, -8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, -8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, -8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, -8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, -8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, -8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, -8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, -8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, -8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, -8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, -8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, -8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, -8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, -8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, -8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, -8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, -8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, -8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, -8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, -8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, -8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, -8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, -8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, -8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, -8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, -8736,8737,8738,8739,8740,8741 -****************************************************************************************/ -}; - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab b/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab deleted file mode 100644 index 3a189ae..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab +++ /dev/null @@ -1,447 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// EUCTW frequency table -// Converted from big5 work -// by Taiwan's Mandarin Promotion Council -// - - -/****************************************************************************** - * 128 --> 0.42261 - * 256 --> 0.57851 - * 512 --> 0.74851 - * 1024 --> 0.89384 - * 2048 --> 0.97583 - * - * Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 - * Random Distribution Ration = 512/(5401-512)=0.105 - * - * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - *****************************************************************************/ - -#define EUCTW_TYPICAL_DISTRIBUTION_RATIO (float)0.75 - -//Char to FreqOrder table , -#define EUCTW_TABLE_SIZE 8102 - -static const PRInt16 EUCTWCharToFreqOrder[] = -{ - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, // 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, // 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, // 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, // 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, // 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, // 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, // 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, // 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, // 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, // 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, // 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, // 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, // 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, // 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, // 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, // 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, // 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, // 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, // 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, // 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, // 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, // 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, // 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, // 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, // 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, // 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, // 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, // 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, // 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, // 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, // 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, // 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, // 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, // 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, // 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, // 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, // 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, // 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, // 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, // 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, // 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, // 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, // 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, // 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, // 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, // 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, // 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, // 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, // 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, // 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, // 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, // 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, // 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, // 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, // 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, // 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, // 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, // 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, // 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, // 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, // 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, // 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, // 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, // 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, // 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, // 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, // 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, // 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, // 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, // 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, // 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, // 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, // 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, // 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, // 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, // 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, // 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, // 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, // 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, // 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, // 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, // 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, // 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, // 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, // 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, // 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, // 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, // 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, // 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, // 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, // 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, // 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, // 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, // 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, // 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, // 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, // 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, // 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, // 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, // 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, // 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, // 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, // 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, // 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, // 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, // 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, // 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, // 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, // 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, // 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, // 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, // 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, // 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, // 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, // 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, // 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, // 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, // 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, // 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, // 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, // 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, // 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, // 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, // 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, // 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, // 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, // 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, // 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, // 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, // 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, // 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, // 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, // 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, // 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, // 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, // 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, // 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, // 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, // 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, // 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, // 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, // 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, // 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, // 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, // 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, // 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, // 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, // 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, // 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, // 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, // 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, // 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, // 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, // 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, // 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, // 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, // 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, // 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, // 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, // 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, // 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, // 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, // 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, // 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, // 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, // 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, // 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, // 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, // 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, // 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, // 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, // 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, // 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, // 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, // 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, // 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, // 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, // 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, // 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, // 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, // 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, // 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, // 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, // 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, // 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, // 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, // 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, // 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, // 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, // 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, // 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, // 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, // 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, // 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, // 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, // 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, // 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, // 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, // 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, // 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, // 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, // 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, // 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, // 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, // 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, // 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, // 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, // 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, // 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, // 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, // 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, // 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, // 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, // 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, // 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, // 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, // 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, // 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, // 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, // 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, // 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, // 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, // 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, // 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, // 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, // 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, // 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, // 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, // 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, // 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, // 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, // 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, // 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, // 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, // 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, // 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, // 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, // 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, // 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, // 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, // 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, // 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, // 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, // 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, // 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, // 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, // 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, // 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, // 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, // 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, // 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, // 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, // 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, // 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, // 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, // 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, // 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, // 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, // 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, // 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, // 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, // 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, // 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, // 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, // 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, // 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, // 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, // 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, // 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, // 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, // 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, // 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, // 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, // 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, // 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, // 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, // 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, // 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, // 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, // 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, // 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, // 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, // 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, // 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, // 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, // 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, // 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, // 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, // 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, // 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, // 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, // 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, // 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, // 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, // 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, // 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, // 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, // 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, // 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, // 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, // 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, // 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, // 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, // 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, // 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, // 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, // 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, // 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, // 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, // 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, // 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, // 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, // 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, // 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, // 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, // 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, // 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, // 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, // 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, // 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, // 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, // 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, // 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, // 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, // 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, // 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, // 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, // 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, // 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, // 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, // 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, // 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, // 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, // 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, // 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, // 8102 - -/*************************************************************************************** - *Everything below is of no interest for detection purpose * - *************************************************************************************** - -2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, // 8118 -2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, // 8134 -8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, // 8150 -8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, // 8166 -8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, // 8182 -8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, // 8198 -8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, // 8214 -8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, // 8230 -8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, // 8246 -8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, // 8262 -8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, // 8278 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, // 8294 -8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, // 8310 -8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, // 8326 -8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, // 8342 -8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, // 8358 -8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, // 8374 -8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, // 8390 -8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, // 8406 -8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, // 8422 -8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, // 8438 -8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, // 8454 -8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, // 8470 -8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, // 8486 -8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, // 8502 -8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, // 8518 -8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, // 8534 -8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, // 8550 -8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, // 8566 -8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, // 8582 -8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, // 8598 -8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, // 8614 -8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, // 8630 -8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, // 8646 -8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, // 8662 -8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, // 8678 -8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, // 8694 -8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, // 8710 -8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, // 8726 -8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741, // 8742 //13973 -****************************************************************************************/ -}; - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab b/libcommuni/src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab deleted file mode 100644 index aee12ca..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab +++ /dev/null @@ -1,491 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -//GB2312 most frequently used character table - -//Char to FreqOrder table , from hz6763 - -/****************************************************************************** - * 512 --> 0.79 -- 0.79 - * 1024 --> 0.92 -- 0.13 - * 2048 --> 0.98 -- 0.06 - * 6768 --> 1.00 -- 0.02 - * - * Idea Distribution Ratio = 0.79135/(1-0.79135) = 3.79 - * Random Distribution Ration = 512 / (3755 - 512) = 0.157 - * - * Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - *****************************************************************************/ - -#define GB2312_TYPICAL_DISTRIBUTION_RATIO (float)0.9 - -#define GB2312_TABLE_SIZE 3760 - -static const PRInt16 GB2312CharToFreqOrder[] = -{ -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, //last 512 - -/*************************************************************************************** - *Everything below is of no interest for detection purpose * - *************************************************************************************** - -5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, -5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, -5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, -3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, -4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, -5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, -5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, -4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, -4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, -4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, -4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, -3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, -6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, -4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, -6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, -4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, -4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, -4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, -5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, -3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, -4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, -3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, -4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, -4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, -6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, -6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, -5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, -4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, -6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, -4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, -5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, -5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, -5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, -6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, -3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, -6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, -4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, -5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, -6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, -6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, -4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, -5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, -4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, -5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, -5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, -4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, -4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, -5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, -4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, -4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, -5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, -4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, -4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, -4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, -5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, -5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, -4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, -3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, -4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, -6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, -5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, -5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, -4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, -6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, -5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, -6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, -4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, -5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, -5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, -3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, -5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, -6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, -4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, -6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, -4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, -4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, -6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, -3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, -6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, -4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, -3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, -3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, -3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, -4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, -2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, -5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, -4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, -5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, -5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, -5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, -4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, -5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, -4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, -5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, -1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, -3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, -4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, -4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, -6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, -4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, -5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, -3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, -5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, -5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, -5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, -3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, -5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, -5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, -3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, -5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, -5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, -5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, -6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, -4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, -6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, -4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, -3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, -4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, -5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, -5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, -5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, -3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, -3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, -6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, -6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, -5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, -6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, -6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, -6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, -6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, -6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, -5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, -6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, -6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, -3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, -3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, -4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, -4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, -3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, -5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, -5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, -5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, -5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, -5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, -4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, -5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, -6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, -5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, -4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, -4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, -6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, -3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, -4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, -4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, -5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, -6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, -6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, -4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, -6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, -5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, -5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, -5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, -5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, -5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, -4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, -5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, -5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, -5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, -5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, -6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, -4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, -5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, -4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, -4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, -6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, -4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, -6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, -3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, -5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, -6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, -6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, -6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, -5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, -6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, -6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, -3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, -5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, -4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767, -*******************************************************************************/ -}; - - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/JISFreq.tab b/libcommuni/src/3rdparty/uchardet-0.0.1/src/JISFreq.tab deleted file mode 100644 index 715321f..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/JISFreq.tab +++ /dev/null @@ -1,589 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -//Sampling from about 20M text materials include literature and computer technology - -// Japanese frequency table, applied to both S-JIS and EUC-JP -//They are sorted in order. - -/****************************************************************************** - * 128 --> 0.77094 - * 256 --> 0.85710 - * 512 --> 0.92635 - * 1024 --> 0.97130 - * 2048 --> 0.99431 - * - * Idea Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 - * Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 - * - * Typical Distribution Ratio, 25% of IDR - *****************************************************************************/ - -#define JIS_TYPICAL_DISTRIBUTION_RATIO (float) 3.0 - - -//Char to FreqOrder table , -#define JIS_TABLE_SIZE 4368 - -static const PRInt16 JISCharToFreqOrder[] = -{ - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, // 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, // 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, // 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, // 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, // 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, // 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, // 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, // 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, // 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, // 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, // 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, // 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, // 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, // 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, // 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, // 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, // 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, // 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, // 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, // 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, // 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, // 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, // 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, // 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, // 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, // 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, // 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, // 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, // 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, // 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, // 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, // 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, // 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, // 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, // 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, // 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, // 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, // 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, // 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, // 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, // 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, // 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, // 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, // 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, // 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, // 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, // 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, // 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, // 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, // 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, // 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, // 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, // 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, // 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, // 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, // 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, // 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, // 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, // 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, // 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, // 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, // 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, // 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, // 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, // 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, // 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, // 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, // 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, // 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, // 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, // 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, // 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, // 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, // 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, // 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, // 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, // 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, // 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, // 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, // 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, // 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, // 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, // 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, // 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, // 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, // 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, // 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, // 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, // 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, // 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, // 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, // 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, // 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, // 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, // 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, // 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, // 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, // 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, // 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, // 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, // 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, // 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, // 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, // 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, // 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, // 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, // 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, // 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, // 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, // 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, // 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, // 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, // 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, // 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, // 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, // 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, // 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, // 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, // 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, // 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, // 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, // 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, // 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, // 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, // 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, // 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, // 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, // 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, // 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, // 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, // 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, // 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, // 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, // 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, // 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, // 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, // 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, // 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, // 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, // 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, // 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, // 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, // 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, // 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, // 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, // 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, // 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, // 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, // 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, // 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, // 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, // 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, // 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, // 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, // 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, // 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, // 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, // 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, // 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, // 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, // 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, // 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, // 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, // 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, // 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, // 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, // 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, // 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, // 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, // 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, // 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, // 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, // 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, // 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, // 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, // 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, // 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, // 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, // 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, // 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, // 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, // 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, // 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, // 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, // 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, // 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, // 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, // 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, // 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, // 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, // 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, // 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, // 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, // 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, // 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, // 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, // 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, // 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, // 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, // 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, // 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, // 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, // 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, // 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, // 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, // 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, // 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, // 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, // 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, // 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, // 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, // 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, // 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, // 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, // 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, // 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, // 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, // 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, // 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, // 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, // 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, // 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, // 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, // 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, // 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, // 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, // 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, // 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, // 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, // 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, // 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, // 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, // 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, // 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, // 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, // 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, // 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, // 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, // 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, // 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, // 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, // 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, // 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, // 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, // 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, // 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, // 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, // 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, // 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, // 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, // 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, // 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, // 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, // 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, // 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, // 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, // 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, // 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, // 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, // 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, // 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, // 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, // 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, // 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, // 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, // 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, // 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, // 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, // 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, // 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, // 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, // 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, // 4368 //last 512 - -/*************************************************************************************** - *Everything below is of no interest for detection purpose * - *************************************************************************************** - -2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, // 4384 -6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, // 4400 -6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, // 4416 -6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, // 4432 -6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, // 4448 -4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, // 4464 -4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, // 4480 -3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, // 4496 -3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, // 4512 -4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, // 4528 -3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, // 4544 -6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, // 4560 -4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, // 4576 -6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, // 4592 -6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, // 4608 -6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, // 4624 -6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, // 4640 -6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, // 4656 -6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, // 4672 -3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, // 4688 -3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, // 4704 -6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, // 4720 -2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, // 4736 -4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, // 4752 -4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, // 4768 -4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, // 4784 -6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, // 4800 -3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, // 4816 -4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, // 4832 -4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, // 4848 -6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, // 4864 -4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, // 4880 -6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, // 4896 -3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, // 4912 -2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, // 4928 -4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, // 4944 -2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, // 4960 -6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, // 4976 -4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, // 4992 -6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, // 5008 -6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, // 5024 -6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, // 5040 -4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, // 5056 -6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, // 5072 -2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, // 5088 -6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, // 5104 -4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, // 5120 -6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, // 5136 -4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, // 5152 -4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, // 5168 -6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, // 5184 -6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, // 5200 -6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, // 5216 -3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, // 5232 -1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, // 5248 -3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, // 5264 -3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, // 5280 -4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, // 5296 -6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, // 5312 -3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, // 5328 -6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, // 5344 -3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, // 5360 -3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, // 5376 -2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, // 5392 -6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, // 5408 -6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, // 5424 -3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, // 5440 -6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, // 5456 -3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, // 5472 -6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, // 5488 -6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, // 5504 -6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, // 5520 -4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, // 5536 -6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, // 5552 -4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, // 5568 -3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, // 5584 -3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, // 5600 -6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, // 5616 -6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, // 5632 -4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, // 5648 -6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, // 5664 -6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, // 5680 -6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, // 5696 -6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, // 5712 -6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, // 5728 -6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, // 5744 -4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, // 5760 -4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, // 5776 -3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, // 5792 -6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, // 5808 -4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, // 5824 -2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, // 5840 -6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, // 5856 -6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, // 5872 -4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, // 5888 -2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, // 5904 -4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, // 5920 -2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, // 5936 -4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, // 5952 -4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, // 5968 -4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, // 5984 -6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, // 6000 -3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, // 6016 -6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, // 6032 -3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, // 6048 -6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, // 6064 -2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, // 6080 -3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, // 6096 -7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, // 6112 -2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, // 6128 -3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, // 6144 -3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, // 6160 -3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, // 6176 -3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, // 6192 -7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, // 6208 -7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, // 6224 -7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, // 6240 -7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, // 6256 -7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, // 6272 -4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, // 6288 -3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, // 6304 -3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, // 6320 -4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, // 6336 -3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, // 6352 -3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, // 6368 -7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, // 6384 -4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, // 6400 -7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, // 6416 -7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, // 6432 -7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, // 6448 -7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, // 6464 -7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, // 6480 -4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, // 6496 -4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, // 6512 -7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, // 6528 -3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, // 6544 -4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, // 6560 -7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, // 6576 -7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, // 6592 -4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, // 6608 -3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, // 6624 -3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, // 6640 -7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, // 6656 -4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, // 6672 -4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, // 6688 -4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, // 6704 -4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, // 6720 -4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, // 6736 -4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, // 6752 -7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, // 6768 -7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, // 6784 -7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, // 6800 -7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, // 6816 -7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, // 6832 -2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, // 6848 -3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, // 6864 -7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, // 6880 -7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, // 6896 -3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, // 6912 -4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, // 6928 -3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, // 6944 -3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, // 6960 -2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, // 6976 -7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, // 6992 -7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, // 7008 -4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, // 7024 -3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, // 7040 -3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, // 7056 -7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, // 7072 -7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, // 7088 -7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, // 7104 -4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, // 7120 -7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, // 7136 -2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, // 7152 -3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, // 7168 -4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, // 7184 -7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, // 7200 -4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, // 7216 -4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, // 7232 -7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, // 7248 -7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, // 7264 -5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, // 7280 -7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, // 7296 -7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, // 7312 -7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, // 7328 -7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, // 7344 -7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, // 7360 -5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, // 7376 -5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, // 7392 -7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, // 7408 -3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, // 7424 -7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, // 7440 -7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, // 7456 -3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, // 7472 -7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, // 7488 -7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, // 7504 -1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, // 7520 -3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, // 7536 -4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, // 7552 -2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, // 7568 -3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, // 7584 -2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, // 7600 -5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, // 7616 -4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, // 7632 -4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, // 7648 -5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, // 7664 -7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, // 7680 -7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, // 7696 -7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, // 7712 -7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, // 7728 -3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, // 7744 -7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, // 7760 -3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, // 7776 -7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, // 7792 -4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, // 7808 -7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, // 7824 -7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, // 7840 -7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, // 7856 -7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, // 7872 -7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, // 7888 -7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, // 7904 -7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, // 7920 -7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, // 7936 -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, // 7952 -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, // 7968 -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, // 7984 -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, // 8000 -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, // 8016 -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, // 8032 -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, // 8048 -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, // 8064 -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, // 8080 -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, // 8096 -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, // 8112 -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, // 8128 -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, // 8144 -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, // 8160 -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, // 8176 -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, // 8192 -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, // 8208 -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, // 8224 -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, // 8240 -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, // 8256 -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, // 8272 -****************************************************************************************/ - -}; - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp deleted file mode 100644 index 3f74fb4..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nscore.h" -#include "JpCntx.h" - -//This is hiragana 2-char sequence table, the number in each cell represents its frequency category -const PRUint8 jp2CharContext[83][83] = -{ -{ 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,}, -{ 2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4,}, -{ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,}, -{ 0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4,}, -{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, -{ 0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4,}, -{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, -{ 0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3,}, -{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, -{ 0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4,}, -{ 1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4,}, -{ 0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3,}, -{ 0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3,}, -{ 0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3,}, -{ 0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4,}, -{ 0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3,}, -{ 2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4,}, -{ 0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3,}, -{ 0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5,}, -{ 0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3,}, -{ 2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5,}, -{ 0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4,}, -{ 1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4,}, -{ 0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3,}, -{ 0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3,}, -{ 0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3,}, -{ 0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5,}, -{ 0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4,}, -{ 0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5,}, -{ 0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3,}, -{ 0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4,}, -{ 0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4,}, -{ 0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4,}, -{ 0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1,}, -{ 0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,}, -{ 1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3,}, -{ 0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0,}, -{ 0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3,}, -{ 0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3,}, -{ 0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5,}, -{ 0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4,}, -{ 2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5,}, -{ 0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3,}, -{ 0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3,}, -{ 0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3,}, -{ 0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3,}, -{ 0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4,}, -{ 0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4,}, -{ 0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2,}, -{ 0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3,}, -{ 0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3,}, -{ 0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3,}, -{ 0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3,}, -{ 0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4,}, -{ 0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3,}, -{ 0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4,}, -{ 0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3,}, -{ 0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3,}, -{ 0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4,}, -{ 0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4,}, -{ 0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3,}, -{ 2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4,}, -{ 0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4,}, -{ 0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3,}, -{ 0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4,}, -{ 0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4,}, -{ 1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4,}, -{ 0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3,}, -{ 0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,}, -{ 0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2,}, -{ 0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3,}, -{ 0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3,}, -{ 0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5,}, -{ 0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3,}, -{ 0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4,}, -{ 1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4,}, -{ 0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4,}, -{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, -{ 0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3,}, -{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1,}, -{ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2,}, -{ 0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3,}, -{ 0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1,}, -}; - -#define MINIMUM_DATA_THRESHOLD 4 - -void JapaneseContextAnalysis::HandleData(const char* aBuf, PRUint32 aLen) -{ - PRUint32 charLen; - PRInt32 order; - PRUint32 i; - - if (mDone) - return; - - //The buffer we got is byte oriented, and a character may span in more than one - //buffers. In case the last one or two byte in last buffer is not complete, we - //record how many byte needed to complete that character and skip these bytes here. - //We can choose to record those bytes as well and analyse the character once it - //is complete, but since a character will not make much difference, by simply skipping - //this character will simply our logic and improve performance. - for (i = mNeedToSkipCharNum; i < aLen; ) - { - order = GetOrder(aBuf+i, &charLen); - i+= charLen; - if (i > aLen){ - mNeedToSkipCharNum = i - aLen; - mLastCharOrder = -1; - } - else - { - if (order != -1 && mLastCharOrder != -1) - { - mTotalRel ++; - if (mTotalRel > MAX_REL_THRESHOLD) - { - mDone = PR_TRUE; - break; - } - mRelSample[jp2CharContext[mLastCharOrder][order]]++; - } - mLastCharOrder = order; - } - } - - return; -} - -void JapaneseContextAnalysis::Reset(PRBool aIsPreferredLanguage) -{ - mTotalRel = 0; - for (PRUint32 i = 0; i < NUM_OF_CATEGORY; i++) - mRelSample[i] = 0; - mNeedToSkipCharNum = 0; - mLastCharOrder = -1; - mDone = PR_FALSE; - mDataThreshold = aIsPreferredLanguage ? 0 : MINIMUM_DATA_THRESHOLD; -} -#define DONT_KNOW (float)-1 - -float JapaneseContextAnalysis::GetConfidence(void) -{ - //This is just one way to calculate confidence. It works well for me. - if (mTotalRel > mDataThreshold) - return ((float)(mTotalRel - mRelSample[0]))/mTotalRel; - else - return (float)DONT_KNOW; -} - - -PRInt32 SJISContextAnalysis::GetOrder(const char* str, PRUint32 *charLen) -{ - //find out current char's byte length - if (((unsigned char)*str >= (unsigned char)0x81 && (unsigned char)*str <= (unsigned char)0x9f) || - ((unsigned char)*str >= (unsigned char)0xe0 && (unsigned char)*str <= (unsigned char)0xfc)) - *charLen = 2; - else - *charLen = 1; - - //return its order if it is hiragana - if (*str == '\202' && - (unsigned char)*(str+1) >= (unsigned char)0x9f && - (unsigned char)*(str+1) <= (unsigned char)0xf1) - return (unsigned char)*(str+1) - (unsigned char)0x9f; - return -1; -} - -PRInt32 EUCJPContextAnalysis::GetOrder(const char* str, PRUint32 *charLen) -{ - //find out current char's byte length - if ((unsigned char)*str == (unsigned char)0x8e || - ((unsigned char)*str >= (unsigned char)0xa1 && - (unsigned char)*str <= (unsigned char)0xfe)) - *charLen = 2; - else if ((unsigned char)*str == (unsigned char)0x8f) - *charLen = 3; - else - *charLen = 1; - - //return its order if it is hiragana - if ((unsigned char)*str == (unsigned char)0xa4 && - (unsigned char)*(str+1) >= (unsigned char)0xa1 && - (unsigned char)*(str+1) <= (unsigned char)0xf3) - return (unsigned char)*(str+1) - (unsigned char)0xa1; - return -1; -} diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.h deleted file mode 100644 index fe8fcb8..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.h +++ /dev/null @@ -1,140 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef __JPCNTX_H__ -#define __JPCNTX_H__ - -#define NUM_OF_CATEGORY 6 - -#include "nscore.h" - -#define ENOUGH_REL_THRESHOLD 100 -#define MAX_REL_THRESHOLD 1000 - -//hiragana frequency category table -extern const PRUint8 jp2CharContext[83][83]; - -class JapaneseContextAnalysis -{ -public: - JapaneseContextAnalysis() {Reset(PR_FALSE);} - - void HandleData(const char* aBuf, PRUint32 aLen); - - void HandleOneChar(const char* aStr, PRUint32 aCharLen) - { - PRInt32 order; - - //if we received enough data, stop here - if (mTotalRel > MAX_REL_THRESHOLD) mDone = PR_TRUE; - if (mDone) return; - - //Only 2-bytes characters are of our interest - order = (aCharLen == 2) ? GetOrder(aStr) : -1; - if (order != -1 && mLastCharOrder != -1) - { - mTotalRel++; - //count this sequence to its category counter - mRelSample[jp2CharContext[mLastCharOrder][order]]++; - } - mLastCharOrder = order; - } - - float GetConfidence(void); - void Reset(PRBool aIsPreferredLanguage); - void SetOpion(){} - PRBool GotEnoughData() {return mTotalRel > ENOUGH_REL_THRESHOLD;} - -protected: - virtual PRInt32 GetOrder(const char* str, PRUint32 *charLen) = 0; - virtual PRInt32 GetOrder(const char* str) = 0; - - //category counters, each integer counts sequences in its category - PRUint32 mRelSample[NUM_OF_CATEGORY]; - - //total sequence received - PRUint32 mTotalRel; - - //Number of sequences needed to trigger detection - PRUint32 mDataThreshold; - - //The order of previous char - PRInt32 mLastCharOrder; - - //if last byte in current buffer is not the last byte of a character, we - //need to know how many byte to skip in next buffer. - PRUint32 mNeedToSkipCharNum; - - //If this flag is set to PR_TRUE, detection is done and conclusion has been made - PRBool mDone; -}; - - -class SJISContextAnalysis : public JapaneseContextAnalysis -{ - //SJISContextAnalysis(){}; -protected: - PRInt32 GetOrder(const char* str, PRUint32 *charLen); - - PRInt32 GetOrder(const char* str) - { - //We only interested in Hiragana, so first byte is '\202' - if (*str == '\202' && - (unsigned char)*(str+1) >= (unsigned char)0x9f && - (unsigned char)*(str+1) <= (unsigned char)0xf1) - return (unsigned char)*(str+1) - (unsigned char)0x9f; - return -1; - } -}; - -class EUCJPContextAnalysis : public JapaneseContextAnalysis -{ -protected: - PRInt32 GetOrder(const char* str, PRUint32 *charLen); - PRInt32 GetOrder(const char* str) - //We only interested in Hiragana, so first byte is '\244' - { - if (*str == '\244' && - (unsigned char)*(str+1) >= (unsigned char)0xa1 && - (unsigned char)*(str+1) <= (unsigned char)0xf3) - return (unsigned char)*(str+1) - (unsigned char)0xa1; - return -1; - } -}; - -#endif /* __JPCNTX_H__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangBulgarianModel.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangBulgarianModel.cpp deleted file mode 100644 index 0f73282..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangBulgarianModel.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsSBCharSetProber.h" -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//Character Mapping Table: -//this talbe is modified base on win1251BulgarianCharToOrderMap, so -//only number <64 is sure valid - -static const unsigned char Latin5_BulgarianCharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, //80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, //90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, //a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, //c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, //e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, //f0 -}; - -static const unsigned char win1251BulgarianCharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, //80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, //90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, //a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, //b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, //d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, //f0 -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 96.9392% -//first 1024 sequences:3.0618% -//rest sequences: 0.2992% -//negative sequences: 0.0020% -static const PRUint8 BulgarianLangModel[] = -{ -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -}; - -const SequenceModel Latin5BulgarianModel = -{ - Latin5_BulgarianCharToOrderMap, - BulgarianLangModel, - (float)0.969392, - PR_FALSE, - "ISO-8859-5" -}; - -const SequenceModel Win1251BulgarianModel = -{ - win1251BulgarianCharToOrderMap, - BulgarianLangModel, - (float)0.969392, - PR_FALSE, - "windows-1251" -}; diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangCyrillicModel.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangCyrillicModel.cpp deleted file mode 100644 index d8e73e8..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangCyrillicModel.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsSBCharSetProber.h" - - - -//KOI8-R language model -//Character Mapping Table: -static const unsigned char KOI8R_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, //80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, //90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, //a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, //b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, //c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, //d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, //e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, //f0 -}; - -static const unsigned char win1251_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -}; - -static const unsigned char latin5_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -}; - -static const unsigned char macCyrillic_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -}; - -static const unsigned char IBM855_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -}; - -static const unsigned char IBM866_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 97.6601% -//first 1024 sequences: 2.3389% -//rest sequences: 0.1237% -//negative sequences: 0.0009% -static const PRUint8 RussianLangModel[] = -{ -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -}; - - -const SequenceModel Koi8rModel = -{ - KOI8R_CharToOrderMap, - RussianLangModel, - (float)0.976601, - PR_FALSE, - "KOI8-R" -}; - -const SequenceModel Win1251Model = -{ - win1251_CharToOrderMap, - RussianLangModel, - (float)0.976601, - PR_FALSE, - "windows-1251" -}; - -const SequenceModel Latin5Model = -{ - latin5_CharToOrderMap, - RussianLangModel, - (float)0.976601, - PR_FALSE, - "ISO-8859-5" -}; - -const SequenceModel MacCyrillicModel = -{ - macCyrillic_CharToOrderMap, - RussianLangModel, - (float)0.976601, - PR_FALSE, - "x-mac-cyrillic" -}; - -const SequenceModel Ibm866Model = -{ - IBM866_CharToOrderMap, - RussianLangModel, - (float)0.976601, - PR_FALSE, - "IBM866" -}; - -const SequenceModel Ibm855Model = -{ - IBM855_CharToOrderMap, - RussianLangModel, - (float)0.976601, - PR_FALSE, - "IBM855" -}; diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp deleted file mode 100644 index 30c65dc..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsSBCharSetProber.h" -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//Character Mapping Table: -static const unsigned char Latin7_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90 -+253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, //b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, //f0 -}; - - - -static const unsigned char win1253_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90 -+253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, //b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, //f0 -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 98.2851% -//first 1024 sequences:1.7001% -//rest sequences: 0.0359% -//negative sequences: 0.0148% -static const PRUint8 GreekLangModel[] = -{ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}; - -const SequenceModel Latin7Model = -{ - Latin7_CharToOrderMap, - GreekLangModel, - (float)0.982851, - PR_FALSE, - "ISO-8859-7" -}; - -const SequenceModel Win1253Model = -{ - win1253_CharToOrderMap, - GreekLangModel, - (float)0.982851, - PR_FALSE, - "windows-1253" -}; diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHebrewModel.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHebrewModel.cpp deleted file mode 100644 index a4e10ad..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHebrewModel.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Simon Montagu - * Portions created by the Initial Developer are Copyright (C) 2005 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shoshannah Forbes - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsSBCharSetProber.h" - - -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//Windows-1255 language model -//Character Mapping Table: -static const unsigned char win1255_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, //40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, //50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, //60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, //70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 98.4004% -//first 1024 sequences: 1.5981% -//rest sequences: 0.087% -//negative sequences: 0.0015% -static const PRUint8 HebrewLangModel[] = -{ -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -}; - -const SequenceModel Win1255Model = -{ - win1255_CharToOrderMap, - HebrewLangModel, - (float)0.984004, - PR_FALSE, - "windows-1255" -}; - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHungarianModel.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHungarianModel.cpp deleted file mode 100644 index 3af2f58..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHungarianModel.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsSBCharSetProber.h" -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//Character Mapping Table: -static const unsigned char Latin2_HungarianCharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -}; - -static const unsigned char win1250HungarianCharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 94.7368% -//first 1024 sequences:5.2623% -//rest sequences: 0.8894% -//negative sequences: 0.0009% -static const PRUint8 HungarianLangModel[] = -{ -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -}; - -const SequenceModel Latin2HungarianModel = -{ - Latin2_HungarianCharToOrderMap, - HungarianLangModel, - (float)0.947368, - PR_TRUE, - "ISO-8859-2" -}; - -const SequenceModel Win1250HungarianModel = -{ - win1250HungarianCharToOrderMap, - HungarianLangModel, - (float)0.947368, - PR_TRUE, - "windows-1250" -}; diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp deleted file mode 100644 index 8145ffa..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp +++ /dev/null @@ -1,221 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsSBCharSetProber.h" - - -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//The following result for thai was collected from a limited sample (1M). - -//Character Mapping Table: -static const unsigned char TIS620CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, //40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, //50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, //60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, //70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -}; - - - - -//Model Table: -//total sequences: 100% -//first 512 sequences: 92.6386% -//first 1024 sequences:7.3177% -//rest sequences: 1.0230% -//negative sequences: 0.0436% -static const PRUint8 ThaiLangModel[] = -{ -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}; - - -const SequenceModel TIS620ThaiModel = -{ - TIS620CharToOrderMap, - ThaiLangModel, - (float)0.926386, - PR_FALSE, - "TIS-620" -}; diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp deleted file mode 100644 index 7a85abb..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsBig5Prober.h" - -void nsBig5Prober::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mDistributionAnalyser.Reset(mIsPreferredLanguage); -} - -nsProbingState nsBig5Prober::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsSMState codingState; - - for (PRUint32 i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - PRUint32 charLen = mCodingSM->GetCurrentCharLen(); - - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; - - return mState; -} - -float nsBig5Prober::GetConfidence(void) -{ - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (float)distribCf; -} - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h deleted file mode 100644 index 5ae3576..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsBig5Prober_h__ -#define nsBig5Prober_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "CharDistribution.h" - -class nsBig5Prober: public nsCharSetProber { -public: - nsBig5Prober(PRBool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&Big5SMModel); - Reset();} - virtual ~nsBig5Prober(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName() {return "Big5";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -protected: - void GetDistribution(PRUint32 aCharLen, const char* aStr); - - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - //Big5ContextAnalysis mContextAnalyser; - Big5DistributionAnalysis mDistributionAnalyser; - char mLastChar[2]; - PRBool mIsPreferredLanguage; - -}; - - -#endif /* nsBig5Prober_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.cpp deleted file mode 100644 index 0429dd1..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsCharSetProber.h" -#include "prmem.h" - -//This filter applies to all scripts which do not use English characters -PRBool nsCharSetProber::FilterWithoutEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen) -{ - char *newptr; - char *prevPtr, *curPtr; - - PRBool meetMSB = PR_FALSE; - newptr = *newBuf = (char*)PR_Malloc(aLen); - if (!newptr) - return PR_FALSE; - - for (curPtr = prevPtr = (char*)aBuf; curPtr < aBuf+aLen; curPtr++) - { - if (*curPtr & 0x80) - { - meetMSB = PR_TRUE; - } - else if (*curPtr < 'A' || (*curPtr > 'Z' && *curPtr < 'a') || *curPtr > 'z') - { - //current char is a symbol, most likely a punctuation. we treat it as segment delimiter - if (meetMSB && curPtr > prevPtr) - //this segment contains more than single symbol, and it has upper ASCII, we need to keep it - { - while (prevPtr < curPtr) *newptr++ = *prevPtr++; - prevPtr++; - *newptr++ = ' '; - meetMSB = PR_FALSE; - } - else //ignore current segment. (either because it is just a symbol or just an English word) - prevPtr = curPtr+1; - } - } - if (meetMSB && curPtr > prevPtr) - while (prevPtr < curPtr) *newptr++ = *prevPtr++; - - newLen = newptr - *newBuf; - - return PR_TRUE; -} - -//This filter applies to all scripts which contain both English characters and upper ASCII characters. -PRBool nsCharSetProber::FilterWithEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen) -{ - //do filtering to reduce load to probers - char *newptr; - char *prevPtr, *curPtr; - PRBool isInTag = PR_FALSE; - - newptr = *newBuf = (char*)PR_Malloc(aLen); - if (!newptr) - return PR_FALSE; - - for (curPtr = prevPtr = (char*)aBuf; curPtr < aBuf+aLen; curPtr++) - { - if (*curPtr == '>') - isInTag = PR_FALSE; - else if (*curPtr == '<') - isInTag = PR_TRUE; - - if (!(*curPtr & 0x80) && - (*curPtr < 'A' || (*curPtr > 'Z' && *curPtr < 'a') || *curPtr > 'z') ) - { - if (curPtr > prevPtr && !isInTag) // Current segment contains more than just a symbol - // and it is not inside a tag, keep it. - { - while (prevPtr < curPtr) *newptr++ = *prevPtr++; - prevPtr++; - *newptr++ = ' '; - } - else - prevPtr = curPtr+1; - } - } - - // If the current segment contains more than just a symbol - // and it is not inside a tag then keep it. - if (!isInTag) - while (prevPtr < curPtr) - *newptr++ = *prevPtr++; - - newLen = newptr - *newBuf; - - return PR_TRUE; -} diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.h deleted file mode 100644 index c078ccf..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#ifndef nsCharSetProber_h__ -#define nsCharSetProber_h__ - -#include "nscore.h" - -//#define DEBUG_chardet // Uncomment this for debug dump. - -typedef enum { - eDetecting = 0, //We are still detecting, no sure answer yet, but caller can ask for confidence. - eFoundIt = 1, //That's a positive answer - eNotMe = 2 //Negative answer -} nsProbingState; - -#define SHORTCUT_THRESHOLD (float)0.95 - -class nsCharSetProber { -public: - virtual ~nsCharSetProber() {} - virtual const char* GetCharSetName() = 0; - virtual nsProbingState HandleData(const char* aBuf, PRUint32 aLen) = 0; - virtual nsProbingState GetState(void) = 0; - virtual void Reset(void) = 0; - virtual float GetConfidence(void) = 0; - virtual void SetOpion() = 0; - -#ifdef DEBUG_chardet - virtual void DumpStatus() {}; -#endif - - // Helper functions used in the Latin1 and Group probers. - // both functions Allocate a new buffer for newBuf. This buffer should be - // freed by the caller using PR_FREEIF. - // Both functions return PR_FALSE in case of memory allocation failure. - static PRBool FilterWithoutEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen); - static PRBool FilterWithEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen); - -}; - -#endif /* nsCharSetProber_h__ */ diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCodingStateMachine.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCodingStateMachine.h deleted file mode 100644 index 819f9ab..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCodingStateMachine.h +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#ifndef nsCodingStateMachine_h__ -#define nsCodingStateMachine_h__ - -#include "nsPkgInt.h" - -typedef enum { - eStart = 0, - eError = 1, - eItsMe = 2 -} nsSMState; - -#define GETCLASS(c) GETFROMPCK(((unsigned char)(c)), mModel->classTable) - -//state machine model -typedef struct -{ - nsPkgInt classTable; - PRUint32 classFactor; - nsPkgInt stateTable; - const PRUint32* charLenTable; - const char* name; -} SMModel; - -class nsCodingStateMachine { -public: - nsCodingStateMachine(const SMModel* sm) : mModel(sm) { mCurrentState = eStart; } - nsSMState NextState(char c){ - //for each byte we get its class , if it is first byte, we also get byte length - PRUint32 byteCls = GETCLASS(c); - if (mCurrentState == eStart) - { - mCurrentBytePos = 0; - mCurrentCharLen = mModel->charLenTable[byteCls]; - } - //from byte's class and stateTable, we get its next state - mCurrentState=(nsSMState)GETFROMPCK(mCurrentState*(mModel->classFactor)+byteCls, - mModel->stateTable); - mCurrentBytePos++; - return mCurrentState; - } - PRUint32 GetCurrentCharLen(void) {return mCurrentCharLen;} - void Reset(void) {mCurrentState = eStart;} - const char * GetCodingStateMachine() {return mModel->name;} - -protected: - nsSMState mCurrentState; - PRUint32 mCurrentCharLen; - PRUint32 mCurrentBytePos; - - const SMModel *mModel; -}; - -extern const SMModel UTF8SMModel; -extern const SMModel Big5SMModel; -extern const SMModel EUCJPSMModel; -extern const SMModel EUCKRSMModel; -extern const SMModel EUCTWSMModel; -extern const SMModel GB18030SMModel; -extern const SMModel SJISSMModel; - - -extern const SMModel HZSMModel; -extern const SMModel ISO2022CNSMModel; -extern const SMModel ISO2022JPSMModel; -extern const SMModel ISO2022KRSMModel; - -#endif /* nsCodingStateMachine_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp deleted file mode 100644 index 54861b3..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// for japanese encoding, obeserve characteristic: -// 1, kana character (or hankaku?) often have hight frequency of appereance -// 2, kana character often exist in group -// 3, certain combination of kana is never used in japanese language - -#include "nsEUCJPProber.h" - -void nsEUCJPProber::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mContextAnalyser.Reset(mIsPreferredLanguage); - mDistributionAnalyser.Reset(mIsPreferredLanguage); -} - -nsProbingState nsEUCJPProber::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsSMState codingState; - - for (PRUint32 i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - PRUint32 charLen = mCodingSM->GetCurrentCharLen(); - - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mContextAnalyser.HandleOneChar(mLastChar, charLen); - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - { - mContextAnalyser.HandleOneChar(aBuf+i-1, charLen); - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mContextAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; - - return mState; -} - -float nsEUCJPProber::GetConfidence(void) -{ - float contxtCf = mContextAnalyser.GetConfidence(); - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (contxtCf > distribCf ? contxtCf : distribCf); -} - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h deleted file mode 100644 index a7a2f51..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// for S-JIS encoding, obeserve characteristic: -// 1, kana character (or hankaku?) often have hight frequency of appereance -// 2, kana character often exist in group -// 3, certain combination of kana is never used in japanese language - -#ifndef nsEUCJPProber_h__ -#define nsEUCJPProber_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "JpCntx.h" -#include "CharDistribution.h" - -class nsEUCJPProber: public nsCharSetProber { -public: - nsEUCJPProber(PRBool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&EUCJPSMModel); - Reset();} - virtual ~nsEUCJPProber(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName() {return "EUC-JP";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -protected: - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - EUCJPContextAnalysis mContextAnalyser; - EUCJPDistributionAnalysis mDistributionAnalyser; - - char mLastChar[2]; - PRBool mIsPreferredLanguage; -}; - - -#endif /* nsEUCJPProber_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp deleted file mode 100644 index 3632f1f..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsEUCKRProber.h" - -void nsEUCKRProber::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mDistributionAnalyser.Reset(mIsPreferredLanguage); - //mContextAnalyser.Reset(); -} - -nsProbingState nsEUCKRProber::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsSMState codingState; - - for (PRUint32 i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - PRUint32 charLen = mCodingSM->GetCurrentCharLen(); - - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; -// else -// mDistributionAnalyser.HandleData(aBuf, aLen); - - return mState; -} - -float nsEUCKRProber::GetConfidence(void) -{ - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (float)distribCf; -} - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h deleted file mode 100644 index 8e09984..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsEUCKRProber_h__ -#define nsEUCKRProber_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "CharDistribution.h" - -class nsEUCKRProber: public nsCharSetProber { -public: - nsEUCKRProber(PRBool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&EUCKRSMModel); - Reset(); - } - virtual ~nsEUCKRProber(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName() {return "EUC-KR";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -protected: - void GetDistribution(PRUint32 aCharLen, const char* aStr); - - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - //EUCKRContextAnalysis mContextAnalyser; - EUCKRDistributionAnalysis mDistributionAnalyser; - char mLastChar[2]; - PRBool mIsPreferredLanguage; - -}; - - -#endif /* nsEUCKRProber_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp deleted file mode 100644 index a06e074..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsEUCTWProber.h" - -void nsEUCTWProber::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mDistributionAnalyser.Reset(mIsPreferredLanguage); - //mContextAnalyser.Reset(); -} - -nsProbingState nsEUCTWProber::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsSMState codingState; - - for (PRUint32 i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - PRUint32 charLen = mCodingSM->GetCurrentCharLen(); - - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; -// else -// mDistributionAnalyser.HandleData(aBuf, aLen); - - return mState; -} - -float nsEUCTWProber::GetConfidence(void) -{ - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (float)distribCf; -} - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h deleted file mode 100644 index 911d50b..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsEUCTWProber_h__ -#define nsEUCTWProber_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "CharDistribution.h" - -class nsEUCTWProber: public nsCharSetProber { -public: - nsEUCTWProber(PRBool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&EUCTWSMModel); - Reset();} - virtual ~nsEUCTWProber(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName() {return "x-euc-tw";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -protected: - void GetDistribution(PRUint32 aCharLen, const char* aStr); - - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - //EUCTWContextAnalysis mContextAnalyser; - EUCTWDistributionAnalysis mDistributionAnalyser; - char mLastChar[2]; - PRBool mIsPreferredLanguage; - -}; - - -#endif /* nsEUCTWProber_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.cpp deleted file mode 100644 index 464c753..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - - -#include "nsEscCharsetProber.h" -#include "nsUniversalDetector.h" - -nsEscCharSetProber::nsEscCharSetProber(PRUint32 aLanguageFilter) -{ - for (PRUint32 i = 0; i < NUM_OF_ESC_CHARSETS; i++) - mCodingSM[i] = nsnull; - if (aLanguageFilter & NS_FILTER_CHINESE_SIMPLIFIED) - { - mCodingSM[0] = new nsCodingStateMachine(&HZSMModel); - mCodingSM[1] = new nsCodingStateMachine(&ISO2022CNSMModel); - } - if (aLanguageFilter & NS_FILTER_JAPANESE) - mCodingSM[2] = new nsCodingStateMachine(&ISO2022JPSMModel); - if (aLanguageFilter & NS_FILTER_KOREAN) - mCodingSM[3] = new nsCodingStateMachine(&ISO2022KRSMModel); - mActiveSM = NUM_OF_ESC_CHARSETS; - mState = eDetecting; - mDetectedCharset = nsnull; -} - -nsEscCharSetProber::~nsEscCharSetProber(void) -{ - for (PRUint32 i = 0; i < NUM_OF_ESC_CHARSETS; i++) - delete mCodingSM[i]; -} - -void nsEscCharSetProber::Reset(void) -{ - mState = eDetecting; - for (PRUint32 i = 0; i < NUM_OF_ESC_CHARSETS; i++) - if (mCodingSM[i]) - mCodingSM[i]->Reset(); - mActiveSM = NUM_OF_ESC_CHARSETS; - mDetectedCharset = nsnull; -} - -nsProbingState nsEscCharSetProber::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsSMState codingState; - PRInt32 j; - PRUint32 i; - - for ( i = 0; i < aLen && mState == eDetecting; i++) - { - for (j = mActiveSM-1; j>= 0; j--) - { - if (mCodingSM[j]) - { - codingState = mCodingSM[j]->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - mDetectedCharset = mCodingSM[j]->GetCodingStateMachine(); - return mState; - } - } - } - } - - return mState; -} - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.h deleted file mode 100644 index 4b648e0..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsEscCharSetProber_h__ -#define nsEscCharSetProber_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" - -#define NUM_OF_ESC_CHARSETS 4 - -class nsEscCharSetProber: public nsCharSetProber { -public: - nsEscCharSetProber(PRUint32 aLanguageFilter); - virtual ~nsEscCharSetProber(void); - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName() {return mDetectedCharset;} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void){return (float)0.99;} - void SetOpion() {} - -protected: - void GetDistribution(PRUint32 aCharLen, const char* aStr); - - nsCodingStateMachine* mCodingSM[NUM_OF_ESC_CHARSETS] ; - PRUint32 mActiveSM; - nsProbingState mState; - const char * mDetectedCharset; -}; - -#endif /* nsEscCharSetProber_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp deleted file mode 100644 index eed1b7c..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#include "nsCodingStateMachine.h" - -static const PRUint32 HZ_cls[ 256 / 8 ] = { -PCK4BITS(1,0,0,0,0,0,0,0), // 00 - 07 -PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f -PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 -PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f -PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27 -PCK4BITS(0,0,0,0,0,0,0,0), // 28 - 2f -PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 -PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f -PCK4BITS(0,0,0,0,0,0,0,0), // 40 - 47 -PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f -PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 -PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f -PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 -PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f -PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 -PCK4BITS(0,0,0,4,0,5,2,0), // 78 - 7f -PCK4BITS(1,1,1,1,1,1,1,1), // 80 - 87 -PCK4BITS(1,1,1,1,1,1,1,1), // 88 - 8f -PCK4BITS(1,1,1,1,1,1,1,1), // 90 - 97 -PCK4BITS(1,1,1,1,1,1,1,1), // 98 - 9f -PCK4BITS(1,1,1,1,1,1,1,1), // a0 - a7 -PCK4BITS(1,1,1,1,1,1,1,1), // a8 - af -PCK4BITS(1,1,1,1,1,1,1,1), // b0 - b7 -PCK4BITS(1,1,1,1,1,1,1,1), // b8 - bf -PCK4BITS(1,1,1,1,1,1,1,1), // c0 - c7 -PCK4BITS(1,1,1,1,1,1,1,1), // c8 - cf -PCK4BITS(1,1,1,1,1,1,1,1), // d0 - d7 -PCK4BITS(1,1,1,1,1,1,1,1), // d8 - df -PCK4BITS(1,1,1,1,1,1,1,1), // e0 - e7 -PCK4BITS(1,1,1,1,1,1,1,1), // e8 - ef -PCK4BITS(1,1,1,1,1,1,1,1), // f0 - f7 -PCK4BITS(1,1,1,1,1,1,1,1) // f8 - ff -}; - - -static const PRUint32 HZ_st [ 6] = { -PCK4BITS(eStart,eError, 3,eStart,eStart,eStart,eError,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError),//10-17 -PCK4BITS( 5,eError, 6,eError, 5, 5, 4,eError),//18-1f -PCK4BITS( 4,eError, 4, 4, 4,eError, 4,eError),//20-27 -PCK4BITS( 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f -}; - -static const PRUint32 HZCharLenTable[] = {0, 0, 0, 0, 0, 0}; - -const SMModel HZSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, HZ_cls }, - 6, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, HZ_st }, - HZCharLenTable, - "HZ-GB-2312", -}; - - -static const PRUint32 ISO2022CN_cls [ 256 / 8 ] = { -PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07 -PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f -PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 -PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f -PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27 -PCK4BITS(0,3,0,0,0,0,0,0), // 28 - 2f -PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 -PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f -PCK4BITS(0,0,0,4,0,0,0,0), // 40 - 47 -PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f -PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 -PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f -PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 -PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f -PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 -PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f -PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87 -PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f -PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97 -PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f -PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 -PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef -PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 -PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff -}; - - -static const PRUint32 ISO2022CN_st [ 8] = { -PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eStart,eStart),//00-07 -PCK4BITS(eStart,eError,eError,eError,eError,eError,eError,eError),//08-0f -PCK4BITS(eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//10-17 -PCK4BITS(eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError),//18-1f -PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//20-27 -PCK4BITS( 5, 6,eError,eError,eError,eError,eError,eError),//28-2f -PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//30-37 -PCK4BITS(eError,eError,eError,eError,eError,eItsMe,eError,eStart) //38-3f -}; - -static const PRUint32 ISO2022CNCharLenTable[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; - -const SMModel ISO2022CNSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022CN_cls }, - 9, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022CN_st }, - ISO2022CNCharLenTable, - "ISO-2022-CN", -}; - -static const PRUint32 ISO2022JP_cls [ 256 / 8 ] = { -PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07 -PCK4BITS(0,0,0,0,0,0,2,2), // 08 - 0f -PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 -PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f -PCK4BITS(0,0,0,0,7,0,0,0), // 20 - 27 -PCK4BITS(3,0,0,0,0,0,0,0), // 28 - 2f -PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 -PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f -PCK4BITS(6,0,4,0,8,0,0,0), // 40 - 47 -PCK4BITS(0,9,5,0,0,0,0,0), // 48 - 4f -PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 -PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f -PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 -PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f -PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 -PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f -PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87 -PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f -PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97 -PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f -PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 -PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef -PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 -PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff -}; - - -static const PRUint32 ISO2022JP_st [ 9] = { -PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eStart,eStart),//00-07 -PCK4BITS(eStart,eStart,eError,eError,eError,eError,eError,eError),//08-0f -PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//10-17 -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError),//18-1f -PCK4BITS(eError, 5,eError,eError,eError, 4,eError,eError),//20-27 -PCK4BITS(eError,eError,eError, 6,eItsMe,eError,eItsMe,eError),//28-2f -PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//30-37 -PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//38-3f -PCK4BITS(eError,eError,eError,eError,eItsMe,eError,eStart,eStart) //40-47 -}; - -static const PRUint32 ISO2022JPCharLenTable[] = {0, 0, 0, 0, 0, 0, 0, 0}; - -const SMModel ISO2022JPSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022JP_cls }, - 10, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022JP_st }, - ISO2022JPCharLenTable, - "ISO-2022-JP", -}; - -static const PRUint32 ISO2022KR_cls [ 256 / 8 ] = { -PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07 -PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f -PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 -PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f -PCK4BITS(0,0,0,0,3,0,0,0), // 20 - 27 -PCK4BITS(0,4,0,0,0,0,0,0), // 28 - 2f -PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 -PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f -PCK4BITS(0,0,0,5,0,0,0,0), // 40 - 47 -PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f -PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 -PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f -PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 -PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f -PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 -PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f -PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87 -PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f -PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97 -PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f -PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 -PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef -PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 -PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff -}; - - -static const PRUint32 ISO2022KR_st [ 5] = { -PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eError,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eError,eError,eError, 4,eError,eError),//10-17 -PCK4BITS(eError,eError,eError,eError, 5,eError,eError,eError),//18-1f -PCK4BITS(eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart) //20-27 -}; - -static const PRUint32 ISO2022KRCharLenTable[] = {0, 0, 0, 0, 0, 0}; - -const SMModel ISO2022KRSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022KR_cls }, - 6, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022KR_st }, - ISO2022KRCharLenTable, - "ISO-2022-KR", -}; - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp deleted file mode 100644 index b6d469c..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// for S-JIS encoding, obeserve characteristic: -// 1, kana character (or hankaku?) often have hight frequency of appereance -// 2, kana character often exist in group -// 3, certain combination of kana is never used in japanese language - -#include "nsGB2312Prober.h" - -void nsGB18030Prober::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mDistributionAnalyser.Reset(mIsPreferredLanguage); - //mContextAnalyser.Reset(); -} - -nsProbingState nsGB18030Prober::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsSMState codingState; - - for (PRUint32 i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - PRUint32 charLen = mCodingSM->GetCurrentCharLen(); - - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; -// else -// mDistributionAnalyser.HandleData(aBuf, aLen); - - return mState; -} - -float nsGB18030Prober::GetConfidence(void) -{ - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (float)distribCf; -} - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h deleted file mode 100644 index 4bdac3b..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsGB2312Prober_h__ -#define nsGB2312Prober_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "CharDistribution.h" - -// We use gb18030 to replace gb2312, because 18030 is a superset. - -class nsGB18030Prober: public nsCharSetProber { -public: - nsGB18030Prober(PRBool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&GB18030SMModel); - Reset();} - virtual ~nsGB18030Prober(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName() {return "gb18030";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -protected: - void GetDistribution(PRUint32 aCharLen, const char* aStr); - - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - //GB2312ContextAnalysis mContextAnalyser; - GB2312DistributionAnalysis mDistributionAnalyser; - char mLastChar[2]; - PRBool mIsPreferredLanguage; - -}; - - -#endif /* nsGB2312Prober_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp deleted file mode 100644 index b148ce3..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Shy Shalom - * Portions created by the Initial Developer are Copyright (C) 2005 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsHebrewProber.h" -#include - -// windows-1255 / ISO-8859-8 code points of interest -#define FINAL_KAF ('\xea') -#define NORMAL_KAF ('\xeb') -#define FINAL_MEM ('\xed') -#define NORMAL_MEM ('\xee') -#define FINAL_NUN ('\xef') -#define NORMAL_NUN ('\xf0') -#define FINAL_PE ('\xf3') -#define NORMAL_PE ('\xf4') -#define FINAL_TSADI ('\xf5') -#define NORMAL_TSADI ('\xf6') - -// Minimum Visual vs Logical final letter score difference. -// If the difference is below this, don't rely solely on the final letter score distance. -#define MIN_FINAL_CHAR_DISTANCE (5) - -// Minimum Visual vs Logical model score difference. -// If the difference is below this, don't rely at all on the model score distance. -#define MIN_MODEL_DISTANCE (0.01) - -#define VISUAL_HEBREW_NAME ("ISO-8859-8") -#define LOGICAL_HEBREW_NAME ("windows-1255") - -PRBool nsHebrewProber::isFinal(char c) -{ - return ((c == FINAL_KAF) || (c == FINAL_MEM) || (c == FINAL_NUN) || (c == FINAL_PE) || (c == FINAL_TSADI)); -} - -PRBool nsHebrewProber::isNonFinal(char c) -{ - return ((c == NORMAL_KAF) || (c == NORMAL_MEM) || (c == NORMAL_NUN) || (c == NORMAL_PE)); - // The normal Tsadi is not a good Non-Final letter due to words like - // 'lechotet' (to chat) containing an apostrophe after the tsadi. This - // apostrophe is converted to a space in FilterWithoutEnglishLetters causing - // the Non-Final tsadi to appear at an end of a word even though this is not - // the case in the original text. - // The letters Pe and Kaf rarely display a related behavior of not being a - // good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' for - // example legally end with a Non-Final Pe or Kaf. However, the benefit of - // these letters as Non-Final letters outweighs the damage since these words - // are quite rare. -} - -/** HandleData - * Final letter analysis for logical-visual decision. - * Look for evidence that the received buffer is either logical Hebrew or - * visual Hebrew. - * The following cases are checked: - * 1) A word longer than 1 letter, ending with a final letter. This is an - * indication that the text is laid out "naturally" since the final letter - * really appears at the end. +1 for logical score. - * 2) A word longer than 1 letter, ending with a Non-Final letter. In normal - * Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, should not end with - * the Non-Final form of that letter. Exceptions to this rule are mentioned - * above in isNonFinal(). This is an indication that the text is laid out - * backwards. +1 for visual score - * 3) A word longer than 1 letter, starting with a final letter. Final letters - * should not appear at the beginning of a word. This is an indication that - * the text is laid out backwards. +1 for visual score. - * - * The visual score and logical score are accumulated throughout the text and - * are finally checked against each other in GetCharSetName(). - * No checking for final letters in the middle of words is done since that case - * is not an indication for either Logical or Visual text. - * - * The input buffer should not contain any white spaces that are not (' ') - * or any low-ascii punctuation marks. - */ -nsProbingState nsHebrewProber::HandleData(const char* aBuf, PRUint32 aLen) -{ - // Both model probers say it's not them. No reason to continue. - if (GetState() == eNotMe) - return eNotMe; - - const char *curPtr, *endPtr = aBuf+aLen; - char cur; - - for (curPtr = (char*)aBuf; curPtr < endPtr; ++curPtr) - { - cur = *curPtr; - if (cur == ' ') // We stand on a space - a word just ended - { - if (mBeforePrev != ' ') // *(curPtr-2) was not a space so prev is not a 1 letter word - { - if (isFinal(mPrev)) // case (1) [-2:not space][-1:final letter][cur:space] - ++mFinalCharLogicalScore; - else if (isNonFinal(mPrev)) // case (2) [-2:not space][-1:Non-Final letter][cur:space] - ++mFinalCharVisualScore; - } - } - else // Not standing on a space - { - if ((mBeforePrev == ' ') && (isFinal(mPrev)) && (cur != ' ')) // case (3) [-2:space][-1:final letter][cur:not space] - ++mFinalCharVisualScore; - } - mBeforePrev = mPrev; - mPrev = cur; - } - - // Forever detecting, till the end or until both model probers return eNotMe (handled above). - return eDetecting; -} - -// Make the decision: is it Logical or Visual? -const char* nsHebrewProber::GetCharSetName() -{ - // If the final letter score distance is dominant enough, rely on it. - PRInt32 finalsub = mFinalCharLogicalScore - mFinalCharVisualScore; - if (finalsub >= MIN_FINAL_CHAR_DISTANCE) - return LOGICAL_HEBREW_NAME; - if (finalsub <= -(MIN_FINAL_CHAR_DISTANCE)) - return VISUAL_HEBREW_NAME; - - // It's not dominant enough, try to rely on the model scores instead. - float modelsub = mLogicalProb->GetConfidence() - mVisualProb->GetConfidence(); - if (modelsub > MIN_MODEL_DISTANCE) - return LOGICAL_HEBREW_NAME; - if (modelsub < -(MIN_MODEL_DISTANCE)) - return VISUAL_HEBREW_NAME; - - // Still no good, back to final letter distance, maybe it'll save the day. - if (finalsub < 0) - return VISUAL_HEBREW_NAME; - - // (finalsub > 0 - Logical) or (don't know what to do) default to Logical. - return LOGICAL_HEBREW_NAME; -} - - -void nsHebrewProber::Reset(void) -{ - mFinalCharLogicalScore = 0; - mFinalCharVisualScore = 0; - - // mPrev and mBeforePrev are initialized to space in order to simulate a word - // delimiter at the beginning of the data - mPrev = ' '; - mBeforePrev = ' '; -} - -nsProbingState nsHebrewProber::GetState(void) -{ - // Remain active as long as any of the model probers are active. - if ((mLogicalProb->GetState() == eNotMe) && (mVisualProb->GetState() == eNotMe)) - return eNotMe; - return eDetecting; -} - -#ifdef DEBUG_chardet -void nsHebrewProber::DumpStatus() -{ - printf(" HEB: %d - %d [Logical-Visual score]\r\n", mFinalCharLogicalScore, mFinalCharVisualScore); -} -#endif diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.h deleted file mode 100644 index eedfed4..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.h +++ /dev/null @@ -1,176 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Shy Shalom - * Portions created by the Initial Developer are Copyright (C) 2005 - * the Initial Developer: All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsHebrewProber_h__ -#define nsHebrewProber_h__ - -#include "nsSBCharSetProber.h" - -// This prober doesn't actually recognize a language or a charset. -// It is a helper prober for the use of the Hebrew model probers -class nsHebrewProber: public nsCharSetProber -{ -public: - nsHebrewProber(void) :mLogicalProb(0), mVisualProb(0) { Reset(); } - - virtual ~nsHebrewProber(void) {} - virtual nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - virtual const char* GetCharSetName(); - virtual void Reset(void); - - virtual nsProbingState GetState(void); - - virtual float GetConfidence(void) { return (float)0.0; } - virtual void SetOpion() {} - - void SetModelProbers(nsCharSetProber *logicalPrb, nsCharSetProber *visualPrb) - { mLogicalProb = logicalPrb; mVisualProb = visualPrb; } - -#ifdef DEBUG_chardet - virtual void DumpStatus(); -#endif - -protected: - static PRBool isFinal(char c); - static PRBool isNonFinal(char c); - - PRInt32 mFinalCharLogicalScore, mFinalCharVisualScore; - - // The two last characters seen in the previous buffer. - char mPrev, mBeforePrev; - - // These probers are owned by the group prober. - nsCharSetProber *mLogicalProb, *mVisualProb; -}; - -/** - * ** General ideas of the Hebrew charset recognition ** - * - * Four main charsets exist in Hebrew: - * "ISO-8859-8" - Visual Hebrew - * "windows-1255" - Logical Hebrew - * "ISO-8859-8-I" - Logical Hebrew - * "x-mac-hebrew" - ?? Logical Hebrew ?? - * - * Both "ISO" charsets use a completely identical set of code points, whereas - * "windows-1255" and "x-mac-hebrew" are two different proper supersets of - * these code points. windows-1255 defines additional characters in the range - * 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific - * diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. - * x-mac-hebrew defines similar additional code points but with a different - * mapping. - * - * As far as an average Hebrew text with no diacritics is concerned, all four - * charsets are identical with respect to code points. Meaning that for the - * main Hebrew alphabet, all four map the same values to all 27 Hebrew letters - * (including final letters). - * - * The dominant difference between these charsets is their directionality. - * "Visual" directionality means that the text is ordered as if the renderer is - * not aware of a BIDI rendering algorithm. The renderer sees the text and - * draws it from left to right. The text itself when ordered naturally is read - * backwards. A buffer of Visual Hebrew generally looks like so: - * "[last word of first line spelled backwards] [whole line ordered backwards - * and spelled backwards] [first word of first line spelled backwards] - * [end of line] [last word of second line] ... etc' " - * adding punctuation marks, numbers and English text to visual text is - * naturally also "visual" and from left to right. - * - * "Logical" directionality means the text is ordered "naturally" according to - * the order it is read. It is the responsibility of the renderer to display - * the text from right to left. A BIDI algorithm is used to place general - * punctuation marks, numbers and English text in the text. - * - * Texts in x-mac-hebrew are almost impossible to find on the Internet. From - * what little evidence I could find, it seems that its general directionality - * is Logical. - * - * To sum up all of the above, the Hebrew probing mechanism knows about two - * charsets: - * Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are - * backwards while line order is natural. For charset recognition purposes - * the line order is unimportant (In fact, for this implementation, even - * word order is unimportant). - * Logical Hebrew - "windows-1255" - normal, naturally ordered text. - * - * "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be - * specifically identified. - * "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew - * that contain special punctuation marks or diacritics is displayed with - * some unconverted characters showing as question marks. This problem might - * be corrected using another model prober for x-mac-hebrew. Due to the fact - * that x-mac-hebrew texts are so rare, writing another model prober isn't - * worth the effort and performance hit. - * - * *** The Prober *** - * - * The prober is divided between two nsSBCharSetProbers and an nsHebrewProber, - * all of which are managed, created, fed data, inquired and deleted by the - * nsSBCSGroupProber. The two nsSBCharSetProbers identify that the text is in - * fact some kind of Hebrew, Logical or Visual. The final decision about which - * one is it is made by the nsHebrewProber by combining final-letter scores - * with the scores of the two nsSBCharSetProbers to produce a final answer. - * - * The nsSBCSGroupProber is responsible for stripping the original text of HTML - * tags, English characters, numbers, low-ASCII punctuation characters, spaces - * and new lines. It reduces any sequence of such characters to a single space. - * The buffer fed to each prober in the SBCS group prober is pure text in - * high-ASCII. - * The two nsSBCharSetProbers (model probers) share the same language model: - * Win1255Model. - * The first nsSBCharSetProber uses the model normally as any other - * nsSBCharSetProber does, to recognize windows-1255, upon which this model was - * built. The second nsSBCharSetProber is told to make the pair-of-letter - * lookup in the language model backwards. This in practice exactly simulates - * a visual Hebrew model using the windows-1255 logical Hebrew model. - * - * The nsHebrewProber is not using any language model. All it does is look for - * final-letter evidence suggesting the text is either logical Hebrew or visual - * Hebrew. Disjointed from the model probers, the results of the nsHebrewProber - * alone are meaningless. nsHebrewProber always returns 0.00 as confidence - * since it never identifies a charset by itself. Instead, the pointer to the - * nsHebrewProber is passed to the model probers as a helper "Name Prober". - * When the Group prober receives a positive identification from any prober, - * it asks for the name of the charset identified. If the prober queried is a - * Hebrew model prober, the model prober forwards the call to the - * nsHebrewProber to make the final decision. In the nsHebrewProber, the - * decision is made according to the final-letters scores maintained and Both - * model probers scores. The answer is returned in the form of the name of the - * charset identified, either "windows-1255" or "ISO-8859-8". - * - */ -#endif /* nsHebrewProber_h__ */ diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp deleted file mode 100644 index 7694ef7..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsLatin1Prober.h" -#include "prmem.h" -#include - -#define UDF 0 // undefined -#define OTH 1 //other -#define ASC 2 // ascii capital letter -#define ASS 3 // ascii small letter -#define ACV 4 // accent capital vowel -#define ACO 5 // accent capital other -#define ASV 6 // accent small vowel -#define ASO 7 // accent small other -#define CLASS_NUM 8 // total classes - -static const unsigned char Latin1_CharToClass[] = -{ - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, // 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, // 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, // 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, // 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, // 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, // C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, // C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, // D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, // D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, // E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, // E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, // F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, // F8 - FF -}; - - -/* 0 : illegal - 1 : very unlikely - 2 : normal - 3 : very likely -*/ -static const unsigned char Latin1ClassModel[] = -{ -/* UDF OTH ASC ASS ACV ACO ASV ASO */ -/*UDF*/ 0, 0, 0, 0, 0, 0, 0, 0, -/*OTH*/ 0, 3, 3, 3, 3, 3, 3, 3, -/*ASC*/ 0, 3, 3, 3, 3, 3, 3, 3, -/*ASS*/ 0, 3, 3, 3, 1, 1, 3, 3, -/*ACV*/ 0, 3, 3, 3, 1, 2, 1, 2, -/*ACO*/ 0, 3, 3, 3, 3, 3, 3, 3, -/*ASV*/ 0, 3, 1, 3, 1, 1, 1, 3, -/*ASO*/ 0, 3, 1, 3, 1, 1, 3, 3, -}; - -void nsLatin1Prober::Reset(void) -{ - mState = eDetecting; - mLastCharClass = OTH; - for (int i = 0; i < FREQ_CAT_NUM; i++) - mFreqCounter[i] = 0; -} - - -nsProbingState nsLatin1Prober::HandleData(const char* aBuf, PRUint32 aLen) -{ - char *newBuf1 = 0; - PRUint32 newLen1 = 0; - - if (!FilterWithEnglishLetters(aBuf, aLen, &newBuf1, newLen1)) { - newBuf1 = (char*)aBuf; - newLen1 = aLen; - } - - unsigned char charClass; - unsigned char freq; - for (PRUint32 i = 0; i < newLen1; i++) - { - charClass = Latin1_CharToClass[(unsigned char)newBuf1[i]]; - freq = Latin1ClassModel[mLastCharClass*CLASS_NUM + charClass]; - if (freq == 0) { - mState = eNotMe; - break; - } - mFreqCounter[freq]++; - mLastCharClass = charClass; - } - - if (newBuf1 != aBuf) - PR_FREEIF(newBuf1); - - return mState; -} - -float nsLatin1Prober::GetConfidence(void) -{ - if (mState == eNotMe) - return 0.01f; - - float confidence; - PRUint32 total = 0; - for (PRInt32 i = 0; i < FREQ_CAT_NUM; i++) - total += mFreqCounter[i]; - - if(!total) - confidence = 0.0f; - else - { - confidence = mFreqCounter[3]*1.0f / total; - confidence -= mFreqCounter[1]*20.0f/total; - } - - if (confidence < 0.0f) - confidence = 0.0f; - - // lower the confidence of latin1 so that other more accurate detector - // can take priority. - confidence *= 0.50f; - - return confidence; -} - -#ifdef DEBUG_chardet -void nsLatin1Prober::DumpStatus() -{ - printf(" Latin1Prober: %1.3f [%s]\r\n", GetConfidence(), GetCharSetName()); -} -#endif - - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h deleted file mode 100644 index 5145e96..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsLatin1Prober_h__ -#define nsLatin1Prober_h__ - -#include "nsCharSetProber.h" - -#define FREQ_CAT_NUM 4 - -class nsLatin1Prober: public nsCharSetProber { -public: - nsLatin1Prober(void){Reset();} - virtual ~nsLatin1Prober(void){} - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName() {return "windows-1252";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -#ifdef DEBUG_chardet - virtual void DumpStatus(); -#endif - -protected: - - nsProbingState mState; - char mLastCharClass; - PRUint32 mFreqCounter[FREQ_CAT_NUM]; -}; - - -#endif /* nsLatin1Prober_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.cpp deleted file mode 100644 index f161165..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * Proofpoint, Inc. - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#include - -#include "nsMBCSGroupProber.h" -#include "nsUniversalDetector.h" - -#if defined(DEBUG_chardet) || defined(DEBUG_jgmyers) -const char *ProberName[] = -{ - "UTF8", - "SJIS", - "EUCJP", - "GB18030", - "EUCKR", - "Big5", - "EUCTW", -}; - -#endif - -nsMBCSGroupProber::nsMBCSGroupProber(PRUint32 aLanguageFilter) -{ - for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) - mProbers[i] = nsnull; - - mProbers[0] = new nsUTF8Prober(); - if (aLanguageFilter & NS_FILTER_JAPANESE) - { - mProbers[1] = new nsSJISProber(aLanguageFilter == NS_FILTER_JAPANESE); - mProbers[2] = new nsEUCJPProber(aLanguageFilter == NS_FILTER_JAPANESE); - } - if (aLanguageFilter & NS_FILTER_CHINESE_SIMPLIFIED) - mProbers[3] = new nsGB18030Prober(aLanguageFilter == NS_FILTER_CHINESE_SIMPLIFIED); - if (aLanguageFilter & NS_FILTER_KOREAN) - mProbers[4] = new nsEUCKRProber(aLanguageFilter == NS_FILTER_KOREAN); - if (aLanguageFilter & NS_FILTER_CHINESE_TRADITIONAL) - { - mProbers[5] = new nsBig5Prober(aLanguageFilter == NS_FILTER_CHINESE_TRADITIONAL); - mProbers[6] = new nsEUCTWProber(aLanguageFilter == NS_FILTER_CHINESE_TRADITIONAL); - } - Reset(); -} - -nsMBCSGroupProber::~nsMBCSGroupProber() -{ - for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) - { - delete mProbers[i]; - } -} - -const char* nsMBCSGroupProber::GetCharSetName() -{ - if (mBestGuess == -1) - { - GetConfidence(); - if (mBestGuess == -1) - mBestGuess = 0; - } - return mProbers[mBestGuess]->GetCharSetName(); -} - -void nsMBCSGroupProber::Reset(void) -{ - mActiveNum = 0; - for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) - { - if (mProbers[i]) - { - mProbers[i]->Reset(); - mIsActive[i] = PR_TRUE; - ++mActiveNum; - } - else - mIsActive[i] = PR_FALSE; - } - mBestGuess = -1; - mState = eDetecting; - mKeepNext = 0; -} - -nsProbingState nsMBCSGroupProber::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsProbingState st; - PRUint32 start = 0; - PRUint32 keepNext = mKeepNext; - - //do filtering to reduce load to probers - for (PRUint32 pos = 0; pos < aLen; ++pos) - { - if (aBuf[pos] & 0x80) - { - if (!keepNext) - start = pos; - keepNext = 2; - } - else if (keepNext) - { - if (--keepNext == 0) - { - for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) - { - if (!mIsActive[i]) - continue; - st = mProbers[i]->HandleData(aBuf + start, pos + 1 - start); - if (st == eFoundIt) - { - mBestGuess = i; - mState = eFoundIt; - return mState; - } - } - } - } - } - - if (keepNext) { - for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) - { - if (!mIsActive[i]) - continue; - st = mProbers[i]->HandleData(aBuf + start, aLen - start); - if (st == eFoundIt) - { - mBestGuess = i; - mState = eFoundIt; - return mState; - } - } - } - mKeepNext = keepNext; - - return mState; -} - -float nsMBCSGroupProber::GetConfidence(void) -{ - PRUint32 i; - float bestConf = 0.0, cf; - - switch (mState) - { - case eFoundIt: - return (float)0.99; - case eNotMe: - return (float)0.01; - default: - for (i = 0; i < NUM_OF_PROBERS; i++) - { - if (!mIsActive[i]) - continue; - cf = mProbers[i]->GetConfidence(); - if (bestConf < cf) - { - bestConf = cf; - mBestGuess = i; - } - } - } - return bestConf; -} - -#ifdef DEBUG_chardet -void nsMBCSGroupProber::DumpStatus() -{ - PRUint32 i; - float cf; - - GetConfidence(); - for (i = 0; i < NUM_OF_PROBERS; i++) - { - if (!mIsActive[i]) - printf(" MBCS inactive: [%s] (confidence is too low).\r\n", ProberName[i]); - else - { - cf = mProbers[i]->GetConfidence(); - printf(" MBCS %1.3f: [%s]\r\n", cf, ProberName[i]); - } - } -} -#endif - -#ifdef DEBUG_jgmyers -void nsMBCSGroupProber::GetDetectorState(nsUniversalDetector::DetectorState (&states)[nsUniversalDetector::NumDetectors], PRUint32 &offset) -{ - for (PRUint32 i = 0; i < NUM_OF_PROBERS; ++i) { - states[offset].name = ProberName[i]; - states[offset].isActive = mIsActive[i]; - states[offset].confidence = mIsActive[i] ? mProbers[i]->GetConfidence() : 0.0; - ++offset; - } -} -#endif /* DEBUG_jgmyers */ diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.h deleted file mode 100644 index c4e9964..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Proofpoint, Inc. - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsMBCSGroupProber_h__ -#define nsMBCSGroupProber_h__ - -#include "nsSJISProber.h" -#include "nsUTF8Prober.h" -#include "nsEUCJPProber.h" -#include "nsGB2312Prober.h" -#include "nsEUCKRProber.h" -#include "nsBig5Prober.h" -#include "nsEUCTWProber.h" - -#define NUM_OF_PROBERS 7 - -class nsMBCSGroupProber: public nsCharSetProber { -public: - nsMBCSGroupProber(PRUint32 aLanguageFilter); - virtual ~nsMBCSGroupProber(); - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName(); - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -#ifdef DEBUG_chardet - void DumpStatus(); -#endif -#ifdef DEBUG_jgmyers - void GetDetectorState(nsUniversalDetector::DetectorState (&states)[nsUniversalDetector::NumDetectors], PRUint32 &offset); -#endif - -protected: - nsProbingState mState; - nsCharSetProber* mProbers[NUM_OF_PROBERS]; - PRBool mIsActive[NUM_OF_PROBERS]; - PRInt32 mBestGuess; - PRUint32 mActiveNum; - PRUint32 mKeepNext; -}; - -#endif /* nsMBCSGroupProber_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp deleted file mode 100644 index 584e931..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp +++ /dev/null @@ -1,513 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#include "nsCodingStateMachine.h" - -/* -Modification from frank tang's original work: -. 0x00 is allowed as a legal character. Since some web pages contains this char in - text stream. -*/ - -// BIG5 - -static const PRUint32 BIG5_cls [ 256 / 8 ] = { -//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 //allow 0x00 as legal value -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 -PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 -PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f -PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 -PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f -PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 -PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f -PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 -PCK4BITS(2,2,2,2,2,2,2,1), // 78 - 7f -PCK4BITS(4,4,4,4,4,4,4,4), // 80 - 87 -PCK4BITS(4,4,4,4,4,4,4,4), // 88 - 8f -PCK4BITS(4,4,4,4,4,4,4,4), // 90 - 97 -PCK4BITS(4,4,4,4,4,4,4,4), // 98 - 9f -PCK4BITS(4,3,3,3,3,3,3,3), // a0 - a7 -PCK4BITS(3,3,3,3,3,3,3,3), // a8 - af -PCK4BITS(3,3,3,3,3,3,3,3), // b0 - b7 -PCK4BITS(3,3,3,3,3,3,3,3), // b8 - bf -PCK4BITS(3,3,3,3,3,3,3,3), // c0 - c7 -PCK4BITS(3,3,3,3,3,3,3,3), // c8 - cf -PCK4BITS(3,3,3,3,3,3,3,3), // d0 - d7 -PCK4BITS(3,3,3,3,3,3,3,3), // d8 - df -PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7 -PCK4BITS(3,3,3,3,3,3,3,3), // e8 - ef -PCK4BITS(3,3,3,3,3,3,3,3), // f0 - f7 -PCK4BITS(3,3,3,3,3,3,3,0) // f8 - ff -}; - - -static const PRUint32 BIG5_st [ 3] = { -PCK4BITS(eError,eStart,eStart, 3,eError,eError,eError,eError),//00-07 -PCK4BITS(eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError),//08-0f -PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart) //10-17 -}; - -static const PRUint32 Big5CharLenTable[] = {0, 1, 1, 2, 0}; - -SMModel const Big5SMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_cls }, - 5, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_st }, - Big5CharLenTable, - "Big5", -}; - -static const PRUint32 EUCJP_cls [ 256 / 8 ] = { -//PCK4BITS(5,4,4,4,4,4,4,4), // 00 - 07 -PCK4BITS(4,4,4,4,4,4,4,4), // 00 - 07 -PCK4BITS(4,4,4,4,4,4,5,5), // 08 - 0f -PCK4BITS(4,4,4,4,4,4,4,4), // 10 - 17 -PCK4BITS(4,4,4,5,4,4,4,4), // 18 - 1f -PCK4BITS(4,4,4,4,4,4,4,4), // 20 - 27 -PCK4BITS(4,4,4,4,4,4,4,4), // 28 - 2f -PCK4BITS(4,4,4,4,4,4,4,4), // 30 - 37 -PCK4BITS(4,4,4,4,4,4,4,4), // 38 - 3f -PCK4BITS(4,4,4,4,4,4,4,4), // 40 - 47 -PCK4BITS(4,4,4,4,4,4,4,4), // 48 - 4f -PCK4BITS(4,4,4,4,4,4,4,4), // 50 - 57 -PCK4BITS(4,4,4,4,4,4,4,4), // 58 - 5f -PCK4BITS(4,4,4,4,4,4,4,4), // 60 - 67 -PCK4BITS(4,4,4,4,4,4,4,4), // 68 - 6f -PCK4BITS(4,4,4,4,4,4,4,4), // 70 - 77 -PCK4BITS(4,4,4,4,4,4,4,4), // 78 - 7f -PCK4BITS(5,5,5,5,5,5,5,5), // 80 - 87 -PCK4BITS(5,5,5,5,5,5,1,3), // 88 - 8f -PCK4BITS(5,5,5,5,5,5,5,5), // 90 - 97 -PCK4BITS(5,5,5,5,5,5,5,5), // 98 - 9f -PCK4BITS(5,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(0,0,0,0,0,0,0,0), // e0 - e7 -PCK4BITS(0,0,0,0,0,0,0,0), // e8 - ef -PCK4BITS(0,0,0,0,0,0,0,0), // f0 - f7 -PCK4BITS(0,0,0,0,0,0,0,5) // f8 - ff -}; - - -static const PRUint32 EUCJP_st [ 5] = { -PCK4BITS( 3, 4, 3, 5,eStart,eError,eError,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError),//10-17 -PCK4BITS(eError,eError,eStart,eError,eError,eError, 3,eError),//18-1f -PCK4BITS( 3,eError,eError,eError,eStart,eStart,eStart,eStart) //20-27 -}; - -static const PRUint32 EUCJPCharLenTable[] = {2, 2, 2, 3, 1, 0}; - -const SMModel EUCJPSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCJP_cls }, - 6, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCJP_st }, - EUCJPCharLenTable, - "EUC-JP", -}; - -static const PRUint32 EUCKR_cls [ 256 / 8 ] = { -//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 -PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47 -PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f -PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57 -PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f -PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67 -PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f -PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77 -PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f -PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87 -PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f -PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97 -PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f -PCK4BITS(0,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,2,2,2,3,3,3), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,3,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 -PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef -PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 -PCK4BITS(2,2,2,2,2,2,2,0) // f8 - ff -}; - - -static const PRUint32 EUCKR_st [ 2] = { -PCK4BITS(eError,eStart, 3,eError,eError,eError,eError,eError),//00-07 -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f -}; - -static const PRUint32 EUCKRCharLenTable[] = {0, 1, 2, 0}; - -const SMModel EUCKRSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_cls }, - 4, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_st }, - EUCKRCharLenTable, - "EUC-KR", -}; - -static const PRUint32 EUCTW_cls [ 256 / 8 ] = { -//PCK4BITS(0,2,2,2,2,2,2,2), // 00 - 07 -PCK4BITS(2,2,2,2,2,2,2,2), // 00 - 07 -PCK4BITS(2,2,2,2,2,2,0,0), // 08 - 0f -PCK4BITS(2,2,2,2,2,2,2,2), // 10 - 17 -PCK4BITS(2,2,2,0,2,2,2,2), // 18 - 1f -PCK4BITS(2,2,2,2,2,2,2,2), // 20 - 27 -PCK4BITS(2,2,2,2,2,2,2,2), // 28 - 2f -PCK4BITS(2,2,2,2,2,2,2,2), // 30 - 37 -PCK4BITS(2,2,2,2,2,2,2,2), // 38 - 3f -PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 -PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f -PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 -PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f -PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 -PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f -PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 -PCK4BITS(2,2,2,2,2,2,2,2), // 78 - 7f -PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87 -PCK4BITS(0,0,0,0,0,0,6,0), // 88 - 8f -PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97 -PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f -PCK4BITS(0,3,4,4,4,4,4,4), // a0 - a7 -PCK4BITS(5,5,1,1,1,1,1,1), // a8 - af -PCK4BITS(1,1,1,1,1,1,1,1), // b0 - b7 -PCK4BITS(1,1,1,1,1,1,1,1), // b8 - bf -PCK4BITS(1,1,3,1,3,3,3,3), // c0 - c7 -PCK4BITS(3,3,3,3,3,3,3,3), // c8 - cf -PCK4BITS(3,3,3,3,3,3,3,3), // d0 - d7 -PCK4BITS(3,3,3,3,3,3,3,3), // d8 - df -PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7 -PCK4BITS(3,3,3,3,3,3,3,3), // e8 - ef -PCK4BITS(3,3,3,3,3,3,3,3), // f0 - f7 -PCK4BITS(3,3,3,3,3,3,3,0) // f8 - ff -}; - - -static const PRUint32 EUCTW_st [ 6] = { -PCK4BITS(eError,eError,eStart, 3, 3, 3, 4,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError),//10-17 -PCK4BITS(eStart,eStart,eStart,eError,eError,eError,eError,eError),//18-1f -PCK4BITS( 5,eError,eError,eError,eStart,eError,eStart,eStart),//20-27 -PCK4BITS(eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f -}; - -static const PRUint32 EUCTWCharLenTable[] = {0, 0, 1, 2, 2, 2, 3}; - -const SMModel EUCTWSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_cls }, - 7, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_st }, - EUCTWCharLenTable, - "x-euc-tw", -}; - -/* obsolete GB2312 by gb18030 -static PRUint32 GB2312_cls [ 256 / 8 ] = { -//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 -PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47 -PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f -PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57 -PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f -PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67 -PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f -PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77 -PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f -PCK4BITS(1,0,0,0,0,0,0,0), // 80 - 87 -PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f -PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97 -PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f -PCK4BITS(0,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,3,3,3,3,3,3), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 -PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef -PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 -PCK4BITS(2,2,2,2,2,2,2,0) // f8 - ff -}; - - -static PRUint32 GB2312_st [ 2] = { -PCK4BITS(eError,eStart, 3,eError,eError,eError,eError,eError),//00-07 -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f -}; - -static const PRUint32 GB2312CharLenTable[] = {0, 1, 2, 0}; - -SMModel GB2312SMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_cls }, - 4, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_st }, - GB2312CharLenTable, - "GB2312", -}; -*/ - -// the following state machine data was created by perl script in -// intl/chardet/tools. It should be the same as in PSM detector. -static const PRUint32 GB18030_cls [ 256 / 8 ] = { -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(3,3,3,3,3,3,3,3), // 30 - 37 -PCK4BITS(3,3,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 -PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f -PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 -PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f -PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 -PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f -PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 -PCK4BITS(2,2,2,2,2,2,2,4), // 78 - 7f -PCK4BITS(5,6,6,6,6,6,6,6), // 80 - 87 -PCK4BITS(6,6,6,6,6,6,6,6), // 88 - 8f -PCK4BITS(6,6,6,6,6,6,6,6), // 90 - 97 -PCK4BITS(6,6,6,6,6,6,6,6), // 98 - 9f -PCK4BITS(6,6,6,6,6,6,6,6), // a0 - a7 -PCK4BITS(6,6,6,6,6,6,6,6), // a8 - af -PCK4BITS(6,6,6,6,6,6,6,6), // b0 - b7 -PCK4BITS(6,6,6,6,6,6,6,6), // b8 - bf -PCK4BITS(6,6,6,6,6,6,6,6), // c0 - c7 -PCK4BITS(6,6,6,6,6,6,6,6), // c8 - cf -PCK4BITS(6,6,6,6,6,6,6,6), // d0 - d7 -PCK4BITS(6,6,6,6,6,6,6,6), // d8 - df -PCK4BITS(6,6,6,6,6,6,6,6), // e0 - e7 -PCK4BITS(6,6,6,6,6,6,6,6), // e8 - ef -PCK4BITS(6,6,6,6,6,6,6,6), // f0 - f7 -PCK4BITS(6,6,6,6,6,6,6,0) // f8 - ff -}; - - -static const PRUint32 GB18030_st [ 6] = { -PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart, 3,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart),//10-17 -PCK4BITS( 4,eError,eStart,eStart,eError,eError,eError,eError),//18-1f -PCK4BITS(eError,eError, 5,eError,eError,eError,eItsMe,eError),//20-27 -PCK4BITS(eError,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f -}; - -// To be accurate, the length of class 6 can be either 2 or 4. -// But it is not necessary to discriminate between the two since -// it is used for frequency analysis only, and we are validing -// each code range there as well. So it is safe to set it to be -// 2 here. -static const PRUint32 GB18030CharLenTable[] = {0, 1, 1, 1, 1, 1, 2}; - -const SMModel GB18030SMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_cls }, - 7, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_st }, - GB18030CharLenTable, - "GB18030", -}; - -// sjis - -static const PRUint32 SJIS_cls [ 256 / 8 ] = { -//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 -PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 -PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f -PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 -PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f -PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 -PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f -PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 -PCK4BITS(2,2,2,2,2,2,2,1), // 78 - 7f -PCK4BITS(3,3,3,3,3,3,3,3), // 80 - 87 -PCK4BITS(3,3,3,3,3,3,3,3), // 88 - 8f -PCK4BITS(3,3,3,3,3,3,3,3), // 90 - 97 -PCK4BITS(3,3,3,3,3,3,3,3), // 98 - 9f -//0xa0 is illegal in sjis encoding, but some pages does -//contain such byte. We need to be more error forgiven. -PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7 -PCK4BITS(3,3,3,3,3,4,4,4), // e8 - ef -PCK4BITS(4,4,4,4,4,4,4,4), // f0 - f7 -PCK4BITS(4,4,4,4,4,0,0,0) // f8 - ff -}; - - -static const PRUint32 SJIS_st [ 3] = { -PCK4BITS(eError,eStart,eStart, 3,eError,eError,eError,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart) //10-17 -}; - -static const PRUint32 SJISCharLenTable[] = {0, 1, 1, 2, 0, 0}; - -const SMModel SJISSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, SJIS_cls }, - 6, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, SJIS_st }, - SJISCharLenTable, - "Shift_JIS", -}; - - -static const PRUint32 UTF8_cls [ 256 / 8 ] = { -//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 //allow 0x00 as a legal value -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 -PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47 -PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f -PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57 -PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f -PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67 -PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f -PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77 -PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f -PCK4BITS(2,2,2,2,3,3,3,3), // 80 - 87 -PCK4BITS(4,4,4,4,4,4,4,4), // 88 - 8f -PCK4BITS(4,4,4,4,4,4,4,4), // 90 - 97 -PCK4BITS(4,4,4,4,4,4,4,4), // 98 - 9f -PCK4BITS(5,5,5,5,5,5,5,5), // a0 - a7 -PCK4BITS(5,5,5,5,5,5,5,5), // a8 - af -PCK4BITS(5,5,5,5,5,5,5,5), // b0 - b7 -PCK4BITS(5,5,5,5,5,5,5,5), // b8 - bf -PCK4BITS(0,0,6,6,6,6,6,6), // c0 - c7 -PCK4BITS(6,6,6,6,6,6,6,6), // c8 - cf -PCK4BITS(6,6,6,6,6,6,6,6), // d0 - d7 -PCK4BITS(6,6,6,6,6,6,6,6), // d8 - df -PCK4BITS(7,8,8,8,8,8,8,8), // e0 - e7 -PCK4BITS(8,8,8,8,8,9,8,8), // e8 - ef -PCK4BITS(10,11,11,11,11,11,11,11), // f0 - f7 -PCK4BITS(12,13,13,13,14,15,0,0) // f8 - ff -}; - - -static const PRUint32 UTF8_st [ 26] = { -PCK4BITS(eError,eStart,eError,eError,eError,eError, 12, 10),//00-07 -PCK4BITS( 9, 11, 8, 7, 6, 5, 4, 3),//08-0f -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//10-17 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//18-1f -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//20-27 -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//28-2f -PCK4BITS(eError,eError, 5, 5, 5, 5,eError,eError),//30-37 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//38-3f -PCK4BITS(eError,eError,eError, 5, 5, 5,eError,eError),//40-47 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//48-4f -PCK4BITS(eError,eError, 7, 7, 7, 7,eError,eError),//50-57 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//58-5f -PCK4BITS(eError,eError,eError,eError, 7, 7,eError,eError),//60-67 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//68-6f -PCK4BITS(eError,eError, 9, 9, 9, 9,eError,eError),//70-77 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//78-7f -PCK4BITS(eError,eError,eError,eError,eError, 9,eError,eError),//80-87 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//88-8f -PCK4BITS(eError,eError, 12, 12, 12, 12,eError,eError),//90-97 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//98-9f -PCK4BITS(eError,eError,eError,eError,eError, 12,eError,eError),//a0-a7 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//a8-af -PCK4BITS(eError,eError, 12, 12, 12,eError,eError,eError),//b0-b7 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//b8-bf -PCK4BITS(eError,eError,eStart,eStart,eStart,eStart,eError,eError),//c0-c7 -PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError) //c8-cf -}; - -static const PRUint32 UTF8CharLenTable[] = {0, 1, 0, 0, 0, 0, 2, 3, - 3, 3, 4, 4, 5, 5, 6, 6 }; - -const SMModel UTF8SMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UTF8_cls }, - 16, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UTF8_st }, - UTF8CharLenTable, - "UTF-8", -}; - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h deleted file mode 100644 index 3caa912..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsPkgInt_h__ -#define nsPkgInt_h__ -#include "nscore.h" - -typedef enum { - eIdxSft4bits = 3, - eIdxSft8bits = 2, - eIdxSft16bits = 1 -} nsIdxSft; - -typedef enum { - eSftMsk4bits = 7, - eSftMsk8bits = 3, - eSftMsk16bits = 1 -} nsSftMsk; - -typedef enum { - eBitSft4bits = 2, - eBitSft8bits = 3, - eBitSft16bits = 4 -} nsBitSft; - -typedef enum { - eUnitMsk4bits = 0x0000000FL, - eUnitMsk8bits = 0x000000FFL, - eUnitMsk16bits = 0x0000FFFFL -} nsUnitMsk; - -typedef struct nsPkgInt { - nsIdxSft idxsft; - nsSftMsk sftmsk; - nsBitSft bitsft; - nsUnitMsk unitmsk; - const PRUint32* const data; -} nsPkgInt; - - -#define PCK16BITS(a,b) ((PRUint32)(((b) << 16) | (a))) - -#define PCK8BITS(a,b,c,d) PCK16BITS( ((PRUint32)(((b) << 8) | (a))), \ - ((PRUint32)(((d) << 8) | (c)))) - -#define PCK4BITS(a,b,c,d,e,f,g,h) PCK8BITS( ((PRUint32)(((b) << 4) | (a))), \ - ((PRUint32)(((d) << 4) | (c))), \ - ((PRUint32)(((f) << 4) | (e))), \ - ((PRUint32)(((h) << 4) | (g))) ) - -#define GETFROMPCK(i, c) \ - (((((c).data)[(i)>>(c).idxsft])>>(((i)&(c).sftmsk)<<(c).bitsft))&(c).unitmsk) - -#endif /* nsPkgInt_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.cpp deleted file mode 100644 index d8fef87..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include -#include "prmem.h" - -#include "nsSBCharSetProber.h" -#include "nsSBCSGroupProber.h" - -#include "nsHebrewProber.h" - -nsSBCSGroupProber::nsSBCSGroupProber() -{ - mProbers[0] = new nsSingleByteCharSetProber(&Win1251Model); - mProbers[1] = new nsSingleByteCharSetProber(&Koi8rModel); - mProbers[2] = new nsSingleByteCharSetProber(&Latin5Model); - mProbers[3] = new nsSingleByteCharSetProber(&MacCyrillicModel); - mProbers[4] = new nsSingleByteCharSetProber(&Ibm866Model); - mProbers[5] = new nsSingleByteCharSetProber(&Ibm855Model); - mProbers[6] = new nsSingleByteCharSetProber(&Latin7Model); - mProbers[7] = new nsSingleByteCharSetProber(&Win1253Model); - mProbers[8] = new nsSingleByteCharSetProber(&Latin5BulgarianModel); - mProbers[9] = new nsSingleByteCharSetProber(&Win1251BulgarianModel); - mProbers[10] = new nsSingleByteCharSetProber(&TIS620ThaiModel); - - nsHebrewProber *hebprober = new nsHebrewProber(); - // Notice: Any change in these indexes - 10,11,12 must be reflected - // in the code below as well. - mProbers[11] = hebprober; - mProbers[12] = new nsSingleByteCharSetProber(&Win1255Model, PR_FALSE, hebprober); // Logical Hebrew - mProbers[13] = new nsSingleByteCharSetProber(&Win1255Model, PR_TRUE, hebprober); // Visual Hebrew - // Tell the Hebrew prober about the logical and visual probers - if (mProbers[11] && mProbers[12] && mProbers[13]) // all are not null - { - hebprober->SetModelProbers(mProbers[12], mProbers[13]); - } - else // One or more is null. avoid any Hebrew probing, null them all - { - for (PRUint32 i = 11; i <= 13; ++i) - { - delete mProbers[i]; - mProbers[i] = 0; - } - } - - // disable latin2 before latin1 is available, otherwise all latin1 - // will be detected as latin2 because of their similarity. - //mProbers[10] = new nsSingleByteCharSetProber(&Latin2HungarianModel); - //mProbers[11] = new nsSingleByteCharSetProber(&Win1250HungarianModel); - - Reset(); -} - -nsSBCSGroupProber::~nsSBCSGroupProber() -{ - for (PRUint32 i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - delete mProbers[i]; - } -} - - -const char* nsSBCSGroupProber::GetCharSetName() -{ - //if we have no answer yet - if (mBestGuess == -1) - { - GetConfidence(); - //no charset seems positive - if (mBestGuess == -1) - //we will use default. - mBestGuess = 0; - } - return mProbers[mBestGuess]->GetCharSetName(); -} - -void nsSBCSGroupProber::Reset(void) -{ - mActiveNum = 0; - for (PRUint32 i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - if (mProbers[i]) // not null - { - mProbers[i]->Reset(); - mIsActive[i] = PR_TRUE; - ++mActiveNum; - } - else - mIsActive[i] = PR_FALSE; - } - mBestGuess = -1; - mState = eDetecting; -} - - -nsProbingState nsSBCSGroupProber::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsProbingState st; - PRUint32 i; - char *newBuf1 = 0; - PRUint32 newLen1 = 0; - - //apply filter to original buffer, and we got new buffer back - //depend on what script it is, we will feed them the new buffer - //we got after applying proper filter - //this is done without any consideration to KeepEnglishLetters - //of each prober since as of now, there are no probers here which - //recognize languages with English characters. - if (!FilterWithoutEnglishLetters(aBuf, aLen, &newBuf1, newLen1)) - goto done; - - if (newLen1 == 0) - goto done; // Nothing to see here, move on. - - for (i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - if (!mIsActive[i]) - continue; - st = mProbers[i]->HandleData(newBuf1, newLen1); - if (st == eFoundIt) - { - mBestGuess = i; - mState = eFoundIt; - break; - } - else if (st == eNotMe) - { - mIsActive[i] = PR_FALSE; - mActiveNum--; - if (mActiveNum <= 0) - { - mState = eNotMe; - break; - } - } - } - -done: - PR_FREEIF(newBuf1); - - return mState; -} - -float nsSBCSGroupProber::GetConfidence(void) -{ - PRUint32 i; - float bestConf = 0.0, cf; - - switch (mState) - { - case eFoundIt: - return (float)0.99; //sure yes - case eNotMe: - return (float)0.01; //sure no - default: - for (i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - if (!mIsActive[i]) - continue; - cf = mProbers[i]->GetConfidence(); - if (bestConf < cf) - { - bestConf = cf; - mBestGuess = i; - } - } - } - return bestConf; -} - -#ifdef DEBUG_chardet -void nsSBCSGroupProber::DumpStatus() -{ - PRUint32 i; - float cf; - - cf = GetConfidence(); - printf(" SBCS Group Prober --------begin status \r\n"); - for (i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - if (!mIsActive[i]) - printf(" inactive: [%s] (i.e. confidence is too low).\r\n", mProbers[i]->GetCharSetName()); - else - mProbers[i]->DumpStatus(); - } - printf(" SBCS Group found best match [%s] confidence %f.\r\n", - mProbers[mBestGuess]->GetCharSetName(), cf); -} -#endif diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.h deleted file mode 100644 index cfbf7e1..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsSBCSGroupProber_h__ -#define nsSBCSGroupProber_h__ - - -#define NUM_OF_SBCS_PROBERS 14 - -class nsCharSetProber; -class nsSBCSGroupProber: public nsCharSetProber { -public: - nsSBCSGroupProber(); - virtual ~nsSBCSGroupProber(); - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName(); - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -#ifdef DEBUG_chardet - void DumpStatus(); -#endif - -protected: - nsProbingState mState; - nsCharSetProber* mProbers[NUM_OF_SBCS_PROBERS]; - PRBool mIsActive[NUM_OF_SBCS_PROBERS]; - PRInt32 mBestGuess; - PRUint32 mActiveNum; -}; - -#endif /* nsSBCSGroupProber_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.cpp deleted file mode 100644 index 2a59fd7..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#include -#include "nsSBCharSetProber.h" - -nsProbingState nsSingleByteCharSetProber::HandleData(const char* aBuf, PRUint32 aLen) -{ - unsigned char order; - - for (PRUint32 i = 0; i < aLen; i++) - { - order = mModel->charToOrderMap[(unsigned char)aBuf[i]]; - - if (order < SYMBOL_CAT_ORDER) - mTotalChar++; - if (order < SAMPLE_SIZE) - { - mFreqChar++; - - if (mLastOrder < SAMPLE_SIZE) - { - mTotalSeqs++; - if (!mReversed) - ++(mSeqCounters[mModel->precedenceMatrix[mLastOrder*SAMPLE_SIZE+order]]); - else // reverse the order of the letters in the lookup - ++(mSeqCounters[mModel->precedenceMatrix[order*SAMPLE_SIZE+mLastOrder]]); - } - } - mLastOrder = order; - } - - if (mState == eDetecting) - if (mTotalSeqs > SB_ENOUGH_REL_THRESHOLD) - { - float cf = GetConfidence(); - if (cf > POSITIVE_SHORTCUT_THRESHOLD) - mState = eFoundIt; - else if (cf < NEGATIVE_SHORTCUT_THRESHOLD) - mState = eNotMe; - } - - return mState; -} - -void nsSingleByteCharSetProber::Reset(void) -{ - mState = eDetecting; - mLastOrder = 255; - for (PRUint32 i = 0; i < NUMBER_OF_SEQ_CAT; i++) - mSeqCounters[i] = 0; - mTotalSeqs = 0; - mTotalChar = 0; - mFreqChar = 0; -} - -//#define NEGATIVE_APPROACH 1 - -float nsSingleByteCharSetProber::GetConfidence(void) -{ -#ifdef NEGATIVE_APPROACH - if (mTotalSeqs > 0) - if (mTotalSeqs > mSeqCounters[NEGATIVE_CAT]*10 ) - return ((float)(mTotalSeqs - mSeqCounters[NEGATIVE_CAT]*10))/mTotalSeqs * mFreqChar / mTotalChar; - return (float)0.01; -#else //POSITIVE_APPROACH - float r; - - if (mTotalSeqs > 0) { - r = ((float)1.0) * mSeqCounters[POSITIVE_CAT] / mTotalSeqs / mModel->mTypicalPositiveRatio; - r = r*mFreqChar/mTotalChar; - if (r >= (float)1.00) - r = (float)0.99; - return r; - } - return (float)0.01; -#endif -} - -const char* nsSingleByteCharSetProber::GetCharSetName() -{ - if (!mNameProber) - return mModel->charsetName; - return mNameProber->GetCharSetName(); -} - -#ifdef DEBUG_chardet -void nsSingleByteCharSetProber::DumpStatus() -{ - printf(" SBCS: %1.3f [%s]\r\n", GetConfidence(), GetCharSetName()); -} -#endif diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.h deleted file mode 100644 index d7180dc..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#ifndef nsSingleByteCharSetProber_h__ -#define nsSingleByteCharSetProber_h__ - -#include "nsCharSetProber.h" - -#define SAMPLE_SIZE 64 -#define SB_ENOUGH_REL_THRESHOLD 1024 -#define POSITIVE_SHORTCUT_THRESHOLD (float)0.95 -#define NEGATIVE_SHORTCUT_THRESHOLD (float)0.05 -#define SYMBOL_CAT_ORDER 250 -#define NUMBER_OF_SEQ_CAT 4 -#define POSITIVE_CAT (NUMBER_OF_SEQ_CAT-1) -#define NEGATIVE_CAT 0 - -typedef struct -{ - const unsigned char* const charToOrderMap; // [256] table use to find a char's order - const PRUint8* const precedenceMatrix; // [SAMPLE_SIZE][SAMPLE_SIZE]; table to find a 2-char sequence's frequency - float mTypicalPositiveRatio; // = freqSeqs / totalSeqs - PRBool keepEnglishLetter; // says if this script contains English characters (not implemented) - const char* const charsetName; -} SequenceModel; - - -class nsSingleByteCharSetProber : public nsCharSetProber{ -public: - nsSingleByteCharSetProber(const SequenceModel *model) - :mModel(model), mReversed(PR_FALSE), mNameProber(0) { Reset(); } - nsSingleByteCharSetProber(const SequenceModel *model, PRBool reversed, nsCharSetProber* nameProber) - :mModel(model), mReversed(reversed), mNameProber(nameProber) { Reset(); } - - virtual const char* GetCharSetName(); - virtual nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - virtual nsProbingState GetState(void) {return mState;} - virtual void Reset(void); - virtual float GetConfidence(void); - virtual void SetOpion() {} - - // This feature is not implemented yet. any current language model - // contain this parameter as PR_FALSE. No one is looking at this - // parameter or calling this method. - // Moreover, the nsSBCSGroupProber which calls the HandleData of this - // prober has a hard-coded call to FilterWithoutEnglishLetters which gets rid - // of the English letters. - PRBool KeepEnglishLetters() {return mModel->keepEnglishLetter;} // (not implemented) - -#ifdef DEBUG_chardet - virtual void DumpStatus(); -#endif - -protected: - nsProbingState mState; - const SequenceModel* const mModel; - const PRBool mReversed; // PR_TRUE if we need to reverse every pair in the model lookup - - //char order of last character - unsigned char mLastOrder; - - PRUint32 mTotalSeqs; - PRUint32 mSeqCounters[NUMBER_OF_SEQ_CAT]; - - PRUint32 mTotalChar; - //characters that fall in our sampling range - PRUint32 mFreqChar; - - // Optional auxiliary prober for name decision. created and destroyed by the GroupProber - nsCharSetProber* mNameProber; - -}; - - -extern const SequenceModel Koi8rModel; -extern const SequenceModel Win1251Model; -extern const SequenceModel Latin5Model; -extern const SequenceModel MacCyrillicModel; -extern const SequenceModel Ibm866Model; -extern const SequenceModel Ibm855Model; -extern const SequenceModel Latin7Model; -extern const SequenceModel Win1253Model; -extern const SequenceModel Latin5BulgarianModel; -extern const SequenceModel Win1251BulgarianModel; -extern const SequenceModel Latin2HungarianModel; -extern const SequenceModel Win1250HungarianModel; -extern const SequenceModel Win1255Model; -extern const SequenceModel TIS620ThaiModel; - -#endif /* nsSingleByteCharSetProber_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp deleted file mode 100644 index c7842f6..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// for S-JIS encoding, obeserve characteristic: -// 1, kana character (or hankaku?) often have hight frequency of appereance -// 2, kana character often exist in group -// 3, certain combination of kana is never used in japanese language - -#include "nsSJISProber.h" - -void nsSJISProber::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mContextAnalyser.Reset(mIsPreferredLanguage); - mDistributionAnalyser.Reset(mIsPreferredLanguage); -} - -nsProbingState nsSJISProber::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsSMState codingState; - - for (PRUint32 i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - PRUint32 charLen = mCodingSM->GetCurrentCharLen(); - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mContextAnalyser.HandleOneChar(mLastChar+2-charLen, charLen); - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - { - mContextAnalyser.HandleOneChar(aBuf+i+1-charLen, charLen); - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mContextAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; - - return mState; -} - -float nsSJISProber::GetConfidence(void) -{ - float contxtCf = mContextAnalyser.GetConfidence(); - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (contxtCf > distribCf ? contxtCf : distribCf); -} - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h deleted file mode 100644 index 1efb6e3..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// for S-JIS encoding, obeserve characteristic: -// 1, kana character (or hankaku?) often have hight frequency of appereance -// 2, kana character often exist in group -// 3, certain combination of kana is never used in japanese language - -#ifndef nsSJISProber_h__ -#define nsSJISProber_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "JpCntx.h" -#include "CharDistribution.h" - - -class nsSJISProber: public nsCharSetProber { -public: - nsSJISProber(PRBool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&SJISSMModel); - Reset();} - virtual ~nsSJISProber(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName() {return "Shift_JIS";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -protected: - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - SJISContextAnalysis mContextAnalyser; - SJISDistributionAnalysis mDistributionAnalyser; - - char mLastChar[2]; - PRBool mIsPreferredLanguage; - -}; - - -#endif /* nsSJISProber_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp deleted file mode 100644 index ab8d9f7..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsUTF8Prober.h" - -void nsUTF8Prober::Reset(void) -{ - mCodingSM->Reset(); - mNumOfMBChar = 0; - mState = eDetecting; -} - -nsProbingState nsUTF8Prober::HandleData(const char* aBuf, PRUint32 aLen) -{ - nsSMState codingState; - - for (PRUint32 i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - if (mCodingSM->GetCurrentCharLen() >= 2) - mNumOfMBChar++; - } - } - - if (mState == eDetecting) - if (GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; - return mState; -} - -#define ONE_CHAR_PROB (float)0.50 - -float nsUTF8Prober::GetConfidence(void) -{ - float unlike = (float)0.99; - - if (mNumOfMBChar < 6) - { - for (PRUint32 i = 0; i < mNumOfMBChar; i++) - unlike *= ONE_CHAR_PROB; - return (float)1.0 - unlike; - } - else - return (float)0.99; -} - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h deleted file mode 100644 index 21c91c4..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsUTF8Prober_h__ -#define nsUTF8Prober_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" - -class nsUTF8Prober: public nsCharSetProber { -public: - nsUTF8Prober(){mNumOfMBChar = 0; - mCodingSM = new nsCodingStateMachine(&UTF8SMModel); - Reset(); } - virtual ~nsUTF8Prober(){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, PRUint32 aLen); - const char* GetCharSetName() {return "UTF-8";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - void SetOpion() {} - -protected: - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - PRUint32 mNumOfMBChar; -}; - -#endif /* nsUTF8Prober_h__ */ - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.cpp deleted file mode 100644 index 7af8f95..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.cpp +++ /dev/null @@ -1,280 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Shy Shalom - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nscore.h" - -#include "nsUniversalDetector.h" - -#include "nsMBCSGroupProber.h" -#include "nsSBCSGroupProber.h" -#include "nsEscCharsetProber.h" -#include "nsLatin1Prober.h" - -nsUniversalDetector::nsUniversalDetector(PRUint32 aLanguageFilter) -{ - mDone = PR_FALSE; - mBestGuess = -1; //illegal value as signal - mInTag = PR_FALSE; - mEscCharSetProber = nsnull; - - mStart = PR_TRUE; - mDetectedCharset = nsnull; - mGotData = PR_FALSE; - mInputState = ePureAscii; - mLastChar = '\0'; - mLanguageFilter = aLanguageFilter; - - PRUint32 i; - for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++) - mCharSetProbers[i] = nsnull; -} - -nsUniversalDetector::~nsUniversalDetector() -{ - for (PRInt32 i = 0; i < NUM_OF_CHARSET_PROBERS; i++) - delete mCharSetProbers[i]; - - delete mEscCharSetProber; -} - -void -nsUniversalDetector::Reset() -{ - mDone = PR_FALSE; - mBestGuess = -1; //illegal value as signal - mInTag = PR_FALSE; - - mStart = PR_TRUE; - mDetectedCharset = nsnull; - mGotData = PR_FALSE; - mInputState = ePureAscii; - mLastChar = '\0'; - - if (mEscCharSetProber) - mEscCharSetProber->Reset(); - - PRUint32 i; - for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++) - if (mCharSetProbers[i]) - mCharSetProbers[i]->Reset(); -} - -//--------------------------------------------------------------------- -#define SHORTCUT_THRESHOLD (float)0.95 -#define MINIMUM_THRESHOLD (float)0.20 - -nsresult nsUniversalDetector::HandleData(const char* aBuf, PRUint32 aLen) -{ - if(mDone) - return NS_OK; - - if (aLen > 0) - mGotData = PR_TRUE; - - //If the data starts with BOM, we know it is UTF - if (mStart) - { - mStart = PR_FALSE; - if (aLen > 2) - switch (aBuf[0]) - { - case '\xEF': - if (('\xBB' == aBuf[1]) && ('\xBF' == aBuf[2])) - // EF BB BF UTF-8 encoded BOM - mDetectedCharset = "UTF-8"; - break; - case '\xFE': - if ('\xFF' == aBuf[1]) - // FE FF UTF-16, big endian BOM - mDetectedCharset = "UTF-16"; - break; - case '\xFF': - if ('\xFE' == aBuf[1]) - // FF FE UTF-16, little endian BOM - mDetectedCharset = "UTF-16"; - break; - } // switch - - if (mDetectedCharset) - { - mDone = PR_TRUE; - return NS_OK; - } - } - - PRUint32 i; - for (i = 0; i < aLen; i++) - { - //other than 0xa0, if every othe character is ascii, the page is ascii - if (aBuf[i] & '\x80' && aBuf[i] != '\xA0') //Since many Ascii only page contains NBSP - { - //we got a non-ascii byte (high-byte) - if (mInputState != eHighbyte) - { - //adjust state - mInputState = eHighbyte; - - //kill mEscCharSetProber if it is active - if (mEscCharSetProber) { - delete mEscCharSetProber; - mEscCharSetProber = nsnull; - } - - //start multibyte and singlebyte charset prober - if (nsnull == mCharSetProbers[0]) - { - mCharSetProbers[0] = new nsMBCSGroupProber(mLanguageFilter); - if (nsnull == mCharSetProbers[0]) - return NS_ERROR_OUT_OF_MEMORY; - } - if (nsnull == mCharSetProbers[1] && - (mLanguageFilter & NS_FILTER_NON_CJK)) - { - mCharSetProbers[1] = new nsSBCSGroupProber; - if (nsnull == mCharSetProbers[1]) - return NS_ERROR_OUT_OF_MEMORY; - } - if (nsnull == mCharSetProbers[2]) - { - mCharSetProbers[2] = new nsLatin1Prober; - if (nsnull == mCharSetProbers[2]) - return NS_ERROR_OUT_OF_MEMORY; - } - } - } - else - { - //ok, just pure ascii so far - if ( ePureAscii == mInputState && - (aBuf[i] == '\033' || (aBuf[i] == '{' && mLastChar == '~')) ) - { - //found escape character or HZ "~{" - mInputState = eEscAscii; - } - mLastChar = aBuf[i]; - } - } - - nsProbingState st; - switch (mInputState) - { - case eEscAscii: - if (nsnull == mEscCharSetProber) { - mEscCharSetProber = new nsEscCharSetProber(mLanguageFilter); - if (nsnull == mEscCharSetProber) - return NS_ERROR_OUT_OF_MEMORY; - } - st = mEscCharSetProber->HandleData(aBuf, aLen); - if (st == eFoundIt) - { - mDone = PR_TRUE; - mDetectedCharset = mEscCharSetProber->GetCharSetName(); - } - break; - case eHighbyte: - for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++) - { - if (mCharSetProbers[i]) - { - st = mCharSetProbers[i]->HandleData(aBuf, aLen); - if (st == eFoundIt) - { - mDone = PR_TRUE; - mDetectedCharset = mCharSetProbers[i]->GetCharSetName(); - return NS_OK; - } - } - } - break; - - default: //pure ascii - ;//do nothing here - } - return NS_OK; -} - - -//--------------------------------------------------------------------- -void nsUniversalDetector::DataEnd() -{ - if (!mGotData) - { - // we haven't got any data yet, return immediately - // caller program sometimes call DataEnd before anything has been sent to detector - return; - } - - if (mDetectedCharset) - { - mDone = PR_TRUE; - Report(mDetectedCharset); - return; - } - - switch (mInputState) - { - case eHighbyte: - { - float proberConfidence; - float maxProberConfidence = (float)0.0; - PRInt32 maxProber = 0; - - for (PRInt32 i = 0; i < NUM_OF_CHARSET_PROBERS; i++) - { - if (mCharSetProbers[i]) - { - proberConfidence = mCharSetProbers[i]->GetConfidence(); - if (proberConfidence > maxProberConfidence) - { - maxProberConfidence = proberConfidence; - maxProber = i; - } - } - } - //do not report anything because we are not confident of it, that's in fact a negative answer - if (maxProberConfidence > MINIMUM_THRESHOLD) - Report(mCharSetProbers[maxProber]->GetCharSetName()); - } - break; - case eEscAscii: - break; - default: - ; - } - return; -} diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.h deleted file mode 100644 index 525f722..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Communicator client code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef nsUniversalDetector_h__ -#define nsUniversalDetector_h__ - -class nsCharSetProber; - -#define NUM_OF_CHARSET_PROBERS 3 - -typedef enum { - ePureAscii = 0, - eEscAscii = 1, - eHighbyte = 2 -} nsInputState; - -#define NS_FILTER_CHINESE_SIMPLIFIED 0x01 -#define NS_FILTER_CHINESE_TRADITIONAL 0x02 -#define NS_FILTER_JAPANESE 0x04 -#define NS_FILTER_KOREAN 0x08 -#define NS_FILTER_NON_CJK 0x10 -#define NS_FILTER_ALL 0x1F -#define NS_FILTER_CHINESE (NS_FILTER_CHINESE_SIMPLIFIED | \ - NS_FILTER_CHINESE_TRADITIONAL) -#define NS_FILTER_CJK (NS_FILTER_CHINESE_SIMPLIFIED | \ - NS_FILTER_CHINESE_TRADITIONAL | \ - NS_FILTER_JAPANESE | \ - NS_FILTER_KOREAN) - -class nsUniversalDetector { -public: - nsUniversalDetector(PRUint32 aLanguageFilter); - virtual ~nsUniversalDetector(); - virtual nsresult HandleData(const char* aBuf, PRUint32 aLen); - virtual void DataEnd(void); - -protected: - virtual void Report(const char* aCharset) = 0; - virtual void Reset(); - nsInputState mInputState; - PRBool mDone; - PRBool mInTag; - PRBool mStart; - PRBool mGotData; - char mLastChar; - const char * mDetectedCharset; - PRInt32 mBestGuess; - PRUint32 mLanguageFilter; - - nsCharSetProber *mCharSetProbers[NUM_OF_CHARSET_PROBERS]; - nsCharSetProber *mEscCharSetProber; -}; - -#endif - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nscore.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/nscore.h deleted file mode 100644 index e0b5a72..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/nscore.h +++ /dev/null @@ -1,59 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Kohei TAKETA - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#ifndef nsDummyCore_h__ -#define nsDummyCore_h__ - -typedef bool PRBool; -typedef int PRInt32; -typedef unsigned int PRUint32; -typedef short PRInt16; -typedef unsigned short PRUint16; -typedef signed char PRInt8; -typedef unsigned char PRUint8; - -#define PR_FALSE false -#define PR_TRUE true -#define nsnull 0 - - -enum nsresult -{ - NS_OK, - NS_ERROR_OUT_OF_MEMORY -}; - -#endif diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/prmem.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/prmem.h deleted file mode 100644 index 1485397..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/prmem.h +++ /dev/null @@ -1,49 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Kohei TAKETA - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#ifndef nsDummyPrmem_h__ -#define nsDummyPrmem_h__ - -#include - -inline void* PR_Malloc(size_t len) -{ - return malloc(len); -} - -#define PR_FREEIF(p) if (p) free(p) - -#endif diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/symbols.cmake b/libcommuni/src/3rdparty/uchardet-0.0.1/src/symbols.cmake deleted file mode 100644 index 2aa4601..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/symbols.cmake +++ /dev/null @@ -1,38 +0,0 @@ -set( - UCHARDET_SYMBOLS - uchardet_new - uchardet_delete - uchardet_handle_data - uchardet_data_end - uchardet_reset - uchardet_get_charset -) - -set (LINK_FLAGS "") - -if (APPLE) - - # Create a symbols_list file for the darwin linker - string(REPLACE ";" "\n_" _symbols "${UCHARDET_SYMBOLS}") - set(_symbols_list "${CMAKE_CURRENT_BINARY_DIR}/symbols.list") - file(WRITE ${_symbols_list} "_${_symbols}\n") - set(LINK_FLAGS - "${LINK_FLAGS} -Wl,-exported_symbols_list,'${_symbols_list}'") - -elseif (CMAKE_C_COMPILER_ID STREQUAL GNU) - # Create a version script for GNU ld. - set(_symbols "{ global: ${UCHARDET_SYMBOLS}; local: *; };") - set(_version_script "${CMAKE_CURRENT_BINARY_DIR}/version.script") - file(WRITE ${_version_script} "${_symbols}\n") - - set(LINK_FLAGS "${LINK_FLAGS} -Wl,--version-script,'${_version_script}'") - -endif (APPLE) - -set_target_properties( - ${LIBUCHARDET_TARGET} - ${LIBUCHARDET_STATIC_TARGET} - PROPERTIES - LINK_FLAGS - "${LINK_FLAGS}" -) diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/CMakeLists.txt b/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/CMakeLists.txt deleted file mode 100644 index 7ad3ff5..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -set( - UCHARDET_SOURCES - uchardet.cpp -) - -add_executable( - uchardet - ${UCHARDET_SOURCES} -) - -target_link_libraries( - uchardet - ${UCHARDET_TARGET} -) - -install( - TARGETS - uchardet - RUNTIME - DESTINATION - ${DIR_BIN} -) - diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp deleted file mode 100644 index b2b6bea..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * BYVoid - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#include "../uchardet.h" -#include -#include -#include -#include -#include - -#ifndef VERSION -#define VERSION "Unknown" -#endif -#define BUFFER_SIZE 65536 - -char buffer[BUFFER_SIZE]; - -void detect(FILE * fp) -{ - uchardet_t handle = uchardet_new(); - - while (!feof(fp)) - { - size_t len = fread(buffer, 1, BUFFER_SIZE, fp); - int retval = uchardet_handle_data(handle, buffer, len); - if (retval != 0) - { - fprintf(stderr, "Handle data error.\n"); - exit(0); - } - } - uchardet_data_end(handle); - - const char * charset = uchardet_get_charset(handle); - if (*charset) - printf("%s\n", charset); - else - printf("ascii/unknown\n"); - - uchardet_delete(handle); -} - -void show_version() -{ - printf("\n"); - printf("uchardet Command Line Tool\n"); - printf("Version %s\n", VERSION); - printf("\n"); - printf("Author: %s\n", "BYVoid"); - printf("Bug Report: %s\n", "http://code.google.com/p/uchardet/issues/entry"); - printf("\n"); -} - -void show_usage() -{ - show_version(); - printf("Usage:\n"); - printf(" uchardet [Options] [File]\n"); - printf("\n"); - printf("Options:\n"); - printf(" -v, --version Print version and build information.\n"); - printf(" -h, --help Print this help.\n"); - printf("\n"); -} - -int main(int argc, char ** argv) -{ - static struct option longopts[] = - { - { "version", no_argument, NULL, 'v' }, - { "help", no_argument, NULL, 'h' }, - { 0, 0, 0, 0 }, - }; - - static int oc; - while((oc = getopt_long(argc, argv, "vh", longopts, NULL)) != -1) - { - switch (oc) - { - case 'v': - show_version(); - return 0; - case 'h': - show_usage(); - return 0; - case '?': - printf("Please use %s --help.\n", argv[0]); - return 1; - } - } - - FILE * f = stdin; - if (argc == 2) - { - f = fopen(argv[1], "r"); - if (f == NULL) - { - fprintf(stderr, "Cannot open file.\n"); - return 1; - } - } - - detect(f); - - fclose(f); - - return 0; -} diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.cpp b/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.cpp deleted file mode 100644 index 74ab63c..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * BYVoid - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#include "uchardet.h" -#include "nscore.h" -#include "nsUniversalDetector.h" -#include - -using std::string; - -class HandleUniversalDetector : public nsUniversalDetector -{ -protected: - string m_charset; - -public: - HandleUniversalDetector() - : nsUniversalDetector(NS_FILTER_ALL) - { - m_charset = ""; - } - - virtual ~HandleUniversalDetector() - {} - - virtual void Report(const char* charset) - { - m_charset = charset; - } - - virtual void Reset() - { - nsUniversalDetector::Reset(); - m_charset = ""; - } - - const char* GetCharset() const - { - return m_charset.c_str(); - } -}; - -uchardet_t uchardet_new() -{ - return reinterpret_cast (new HandleUniversalDetector()); -} - -void uchardet_delete(uchardet_t ud) -{ - delete reinterpret_cast(ud); -} - -int uchardet_handle_data(uchardet_t ud, const char * data, size_t len) -{ - nsresult ret = reinterpret_cast(ud)->HandleData(data, (PRUint32)len); - return (ret != NS_OK); -} - -void uchardet_data_end(uchardet_t ud) -{ - reinterpret_cast(ud)->DataEnd(); -} - -void uchardet_reset(uchardet_t ud) -{ - reinterpret_cast(ud)->Reset(); -} - -const char* uchardet_get_charset(uchardet_t ud) -{ - return reinterpret_cast(ud)->GetCharset(); -} diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.h b/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.h deleted file mode 100644 index 533666a..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.h +++ /dev/null @@ -1,92 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Mozilla Universal charset detector code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * BYVoid - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ -#ifndef ___UCHARDET_H___ -#define ___UCHARDET_H___ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -typedef void * uchardet_t; - -/** - * Create an encoding detector. - * @return a handle of a instance of uchardet - */ -uchardet_t uchardet_new(); - -/** - * Delete an encoding detector. - * @param ud [in] handle of a instance of uchardet - */ -void uchardet_delete(uchardet_t ud); - -/** - * Feed data to an encoding detector. - * @param ud [in] handle of a instance of uchardet - * @param data [in] data - * @param len [in] number of byte of data - * @return non-zero number on failure. - */ -int uchardet_handle_data(uchardet_t ud, const char * data, size_t len); - -/** - * Notify an end of data to an encoding detctor. - * @param ud [in] handle of a instance of uchardet - */ -void uchardet_data_end(uchardet_t ud); - -/** - * Reset an encoding detector. - * @param ud [in] handle of a instance of uchardet - */ -void uchardet_reset(uchardet_t ud); - -/** - * Get the name of encoding that was detected. - * @param ud [in] handle of a instance of uchardet - * @return name of charset on success and "" on failure or pure ascii. - */ -const char * uchardet_get_charset(uchardet_t ud); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/test/big5.txt b/libcommuni/src/3rdparty/uchardet-0.0.1/test/big5.txt deleted file mode 100644 index 59db954..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/test/big5.txt +++ /dev/null @@ -1 +0,0 @@ -ÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤å \ No newline at end of file diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/test/gb18030.txt b/libcommuni/src/3rdparty/uchardet-0.0.1/test/gb18030.txt deleted file mode 100644 index 962df87..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/test/gb18030.txt +++ /dev/null @@ -1 +0,0 @@ -¼òÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎÄ \ No newline at end of file diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/test/shift_jis.txt b/libcommuni/src/3rdparty/uchardet-0.0.1/test/shift_jis.txt deleted file mode 100644 index a580281..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/test/shift_jis.txt +++ /dev/null @@ -1 +0,0 @@ -“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/test/utf8.txt b/libcommuni/src/3rdparty/uchardet-0.0.1/test/utf8.txt deleted file mode 100644 index cd66b08..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/test/utf8.txt +++ /dev/null @@ -1 +0,0 @@ -汉字漢字統一編碼è¬åœ‹ç¢¼ diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pc.in b/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pc.in deleted file mode 100644 index 7e2e279..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@DIR_PREFIX@ -exec_prefix=${prefix} -libdir=@DIR_LIBRARY@ -includedir=@DIR_INCLUDE@ - -Name: uchardet -Description: universalchardet -Version: @UCHARDET_VERSION@ -Requires: -Libs: -L${libdir} -luchardet -Cflags: -I${includedir}/uchardet diff --git a/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pri b/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pri deleted file mode 100644 index 6fcefa6..0000000 --- a/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pri +++ /dev/null @@ -1,62 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -INCLUDEPATH += $$PWD/src -DEPENDPATH += $$PWD/src - -HEADERS += $$PWD/src/Big5Freq.tab -HEADERS += $$PWD/src/EUCKRFreq.tab -HEADERS += $$PWD/src/EUCTWFreq.tab -HEADERS += $$PWD/src/GB2312Freq.tab -HEADERS += $$PWD/src/JISFreq.tab - -HEADERS += $$PWD/src/CharDistribution.h -HEADERS += $$PWD/src/JpCntx.h -HEADERS += $$PWD/src/nsBig5Prober.h -HEADERS += $$PWD/src/nsCharSetProber.h -HEADERS += $$PWD/src/nsCodingStateMachine.h -HEADERS += $$PWD/src/nscore.h -HEADERS += $$PWD/src/nsEscCharsetProber.h -HEADERS += $$PWD/src/nsEUCJPProber.h -HEADERS += $$PWD/src/nsEUCKRProber.h -HEADERS += $$PWD/src/nsEUCTWProber.h -HEADERS += $$PWD/src/nsGB2312Prober.h -HEADERS += $$PWD/src/nsHebrewProber.h -HEADERS += $$PWD/src/nsLatin1Prober.h -HEADERS += $$PWD/src/nsMBCSGroupProber.h -HEADERS += $$PWD/src/nsPkgInt.h -HEADERS += $$PWD/src/nsSBCharSetProber.h -HEADERS += $$PWD/src/nsSBCSGroupProber.h -HEADERS += $$PWD/src/nsSJISProber.h -HEADERS += $$PWD/src/nsUniversalDetector.h -HEADERS += $$PWD/src/nsUTF8Prober.h -HEADERS += $$PWD/src/prmem.h -HEADERS += $$PWD/src/uchardet.h - -SOURCES += $$PWD/src/CharDistribution.cpp -SOURCES += $$PWD/src/JpCntx.cpp -SOURCES += $$PWD/src/LangBulgarianModel.cpp -SOURCES += $$PWD/src/LangCyrillicModel.cpp -SOURCES += $$PWD/src/LangGreekModel.cpp -SOURCES += $$PWD/src/LangHungarianModel.cpp -SOURCES += $$PWD/src/LangHebrewModel.cpp -SOURCES += $$PWD/src/LangThaiModel.cpp -SOURCES += $$PWD/src/nsHebrewProber.cpp -SOURCES += $$PWD/src/nsCharSetProber.cpp -SOURCES += $$PWD/src/nsBig5Prober.cpp -SOURCES += $$PWD/src/nsEUCJPProber.cpp -SOURCES += $$PWD/src/nsEUCKRProber.cpp -SOURCES += $$PWD/src/nsEUCTWProber.cpp -SOURCES += $$PWD/src/nsEscCharsetProber.cpp -SOURCES += $$PWD/src/nsEscSM.cpp -SOURCES += $$PWD/src/nsGB2312Prober.cpp -SOURCES += $$PWD/src/nsMBCSGroupProber.cpp -SOURCES += $$PWD/src/nsMBCSSM.cpp -SOURCES += $$PWD/src/nsSBCSGroupProber.cpp -SOURCES += $$PWD/src/nsSBCharSetProber.cpp -SOURCES += $$PWD/src/nsSJISProber.cpp -SOURCES += $$PWD/src/nsUTF8Prober.cpp -SOURCES += $$PWD/src/nsLatin1Prober.cpp -SOURCES += $$PWD/src/nsUniversalDetector.cpp -SOURCES += $$PWD/src/uchardet.cpp diff --git a/libcommuni/src/core/core.pri b/libcommuni/src/core/core.pri deleted file mode 100644 index 3d4a0b1..0000000 --- a/libcommuni/src/core/core.pri +++ /dev/null @@ -1,65 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -DEFINES += BUILD_IRC_CORE -QT += network - -INCDIR = $$PWD/../../include/IrcCore - -DEPENDPATH += $$PWD $$INCDIR -INCLUDEPATH += $$PWD $$INCDIR - -CONV_HEADERS = $$INCDIR/Irc -CONV_HEADERS += $$INCDIR/IrcCommand -CONV_HEADERS += $$INCDIR/IrcCommandFilter -CONV_HEADERS += $$INCDIR/IrcConnection -CONV_HEADERS += $$INCDIR/IrcCore -CONV_HEADERS += $$INCDIR/IrcGlobal -CONV_HEADERS += $$INCDIR/IrcMessage -CONV_HEADERS += $$INCDIR/IrcMessageFilter -CONV_HEADERS += $$INCDIR/IrcNetwork -CONV_HEADERS += $$INCDIR/IrcProtocol - -PUB_HEADERS = $$INCDIR/irc.h -PUB_HEADERS += $$INCDIR/irccommand.h -PUB_HEADERS += $$INCDIR/ircconnection.h -PUB_HEADERS += $$INCDIR/irccore.h -PUB_HEADERS += $$INCDIR/ircfilter.h -PUB_HEADERS += $$INCDIR/ircglobal.h -PUB_HEADERS += $$INCDIR/ircmessage.h -PUB_HEADERS += $$INCDIR/ircnetwork.h -PUB_HEADERS += $$INCDIR/ircprotocol.h - -PRIV_HEADERS = $$INCDIR/ircconnection_p.h -PRIV_HEADERS += $$INCDIR/ircmessage_p.h -PRIV_HEADERS += $$INCDIR/ircmessagebuilder_p.h -PRIV_HEADERS += $$INCDIR/ircmessagedecoder_p.h -PRIV_HEADERS += $$INCDIR/ircnetwork_p.h - -HEADERS += $$PUB_HEADERS -HEADERS += $$PRIV_HEADERS - -SOURCES += $$PWD/irc.cpp -SOURCES += $$PWD/irccommand.cpp -SOURCES += $$PWD/ircconnection.cpp -SOURCES += $$PWD/irccore.cpp -SOURCES += $$PWD/ircfilter.cpp -SOURCES += $$PWD/ircmessage.cpp -SOURCES += $$PWD/ircmessage_p.cpp -SOURCES += $$PWD/ircmessagebuilder.cpp -SOURCES += $$PWD/ircmessagedecoder.cpp -SOURCES += $$PWD/ircnetwork.cpp -SOURCES += $$PWD/ircprotocol.cpp - -include(../3rdparty/mozilla/mozilla.pri) - -CONFIG(icu, icu|no_icu) { - DEFINES += HAVE_ICU - SOURCES += $$PWD/ircmessagedecoder_icu.cpp - include(../3rdparty/icu/icu.pri) -} else { - DEFINES += HAVE_UCHARDET - SOURCES += $$PWD/ircmessagedecoder_uchardet.cpp - include(../3rdparty/uchardet-0.0.1/uchardet.pri) -} diff --git a/libcommuni/src/core/core.pro b/libcommuni/src/core/core.pro deleted file mode 100644 index a9a0c5a..0000000 --- a/libcommuni/src/core/core.pro +++ /dev/null @@ -1,8 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -IRC_MODULE = IrcCore -include(core.pri) -include(../module_build.pri) -include(../module_install.pri) diff --git a/libcommuni/src/core/irc.cpp b/libcommuni/src/core/irc.cpp deleted file mode 100644 index 5a51645..0000000 --- a/libcommuni/src/core/irc.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "irc.h" -#include "irccore.h" -#include "irccommand.h" -#include "ircconnection.h" -#include "ircmessage_p.h" -#include -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file irc.h - \brief \#include <Irc> - */ - -/*! - \namespace Irc - \ingroup core - \brief Miscellaneous identifiers used throughout the library. - */ - -/*! - Returns the version number of Communi at run-time as a string (for example, "1.2.3"). - This may be a different version than the version the application was compiled against. - - \sa IRC_VERSION, IRC_VERSION_STR - */ -QString Irc::version() -{ - return QLatin1String(IRC_VERSION_STR); -} - -/*! - Returns the numeric \a code as a string or a null string if the code is unknown. - - \sa Irc::Code, IrcNumericMessage::code() - */ -QString Irc::codeToString(int code) -{ - const int index = Irc::staticMetaObject.indexOfEnumerator("Code"); - QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); - return QLatin1String(enumerator.valueToKey(code)); -} - -/*! - Returns the nick part of the specified \a prefix. - - Nick part of a prefix as specified in RFC 1459: -
-    <nick> [ '!' <ident> ] [ '@' <host> ]
-    
- - \sa IrcMessage::prefix, IrcMessage::nick - */ -QString Irc::nickFromPrefix(const QString& prefix) -{ - QString nick; - IrcMessagePrivate::parsePrefix(prefix, &nick, 0, 0); - return nick; -} - -/*! - Returns the ident part of the specified \a prefix. - - Ident part of a prefix as specified in RFC 1459: -
-    <nick> [ '!' <ident> ] [ '@' <host> ]
-    
- - \sa IrcMessage::prefix, IrcMessage::ident - */ -QString Irc::identFromPrefix(const QString& prefix) -{ - QString ident; - IrcMessagePrivate::parsePrefix(prefix, 0, &ident, 0); - return ident; -} - -/*! - Returns the host part of the specified \a prefix. - - Host part of a prefix as specified in RFC 1459: -
-    <nick> [ '!' <ident> ] [ '@' <host> ]
-    
- - \sa IrcMessage::prefix, IrcMessage::host - */ -QString Irc::hostFromPrefix(const QString& prefix) -{ - QString host; - IrcMessagePrivate::parsePrefix(prefix, 0, 0, &host); - return host; -} - -/*! - \deprecated Use IrcCore::registerMetaTypes() instead. - */ -void Irc::registerMetaTypes() -{ - IrcCore::registerMetaTypes(); -} - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug debug, Irc::Code code) -{ - const int index = Irc::staticMetaObject.indexOfEnumerator("Code"); - QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(code); - debug << (key ? key : "Unknown"); - return debug; -} - -QDebug operator<<(QDebug debug, Irc::DataRole role) -{ - const int index = Irc::staticMetaObject.indexOfEnumerator("DataRole"); - QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(role); - debug << (key ? key : "Unknown"); - return debug; -} - -QDebug operator<<(QDebug debug, Irc::Color color) -{ - const int index = Irc::staticMetaObject.indexOfEnumerator("Color"); - QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(color); - debug << (key ? key : "Unknown"); - return debug; -} - -QDebug operator<<(QDebug debug, Irc::SortMethod method) -{ - const int index = Irc::staticMetaObject.indexOfEnumerator("SortMethod"); - QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(method); - debug << (key ? key : "Unknown"); - return debug; -} -#endif // QT_NO_DEBUG_STREAM - -#include "moc_irc.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/irccommand.cpp b/libcommuni/src/core/irccommand.cpp deleted file mode 100644 index d7e9b30..0000000 --- a/libcommuni/src/core/irccommand.cpp +++ /dev/null @@ -1,851 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "irccommand.h" -#include "ircmessage.h" -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file irccommand.h - \brief \#include <IrcCommand> - */ - -/*! - \class IrcCommand irccommand.h - \ingroup core - \brief Provides the most common commands. - - The IrcCommand class supports the most common IRC commands out of the box, - and can be extended for custom commands as well. See IrcCommand::Type for - the list of built-in command types. IRC commands, as in IrcCommand instances, - are sent to the IRC server via IrcConnection::sendCommand(). - - \section creating-commands Creating commands - - It is recommended to create IrcCommand instances via static - IrcCommand::createXxx() methods. - - \warning IrcCommand instances must be allocated on the heap, since - IrcConnection::sendCommand() takes ownership of the command and deletes - it once it has been sent. - - \section custom-commands Custom commands - - A "custom command" here refers to command types not listed in IrcCommand::Type, - the list of built-in command types. There are two ways to send custom commands: - \li by passing the string representation of a command directly to - IrcConnection::sendRaw() or IrcConnection::sendData(), or - \li by subclassing IrcCommand and reimplementing - IrcCommand::toString(), which eventually creates the string representation - of the command. - - Example implementation of a custom command: - \code - class IrcServerCommand : public IrcCommand - { - Q_OBJECT - public: - explicit IrcServerCommand(QObject* parent = 0) : IrcCommand(parent) - { - } - - // provided for convenience, to ensure correct parameter order - static IrcCommand* create(const QString& serverName, int hopCount, const QString& info) - { - IrcCommand* command = new IrcServerCommand; - command->setParameters(QStringList() << serverName << QString::number(hopCount) << info); - return command; - } - - // reimplemented from IrcCommand::toString() - virtual toString() const - { - // SERVER - return QString("SERVER %1 %2 %3").arg(params.value(0), params.value(1), params.value(2)); - } - }; - \endcode - - \sa IrcConnection::sendCommand(), IrcConnection::sendRaw(), IrcCommand::Type - */ - -/*! - \enum IrcCommand::Type - This enum describes the built-in command types. - */ - -/*! - \var IrcCommand::Admin - \brief An admin command (ADMIN) is used to query server admin info. - */ - -/*! - \var IrcCommand::Away - \brief An away command (AWAY) is used to set the away status. - */ - -/*! - \var IrcCommand::Capability - \brief A capability command (CAP) is used to manage connection capabilities. - */ - -/*! - \var IrcCommand::CtcpAction - \brief A CTCP action command is used to send an action message to channels and users. - */ - -/*! - \var IrcCommand::CtcpReply - \brief A CTCP reply command is used to send a reply to a request. - */ - -/*! - \var IrcCommand::CtcpRequest - \brief A CTCP request command is used to send a request. - */ - -/*! - \var IrcCommand::Custom - \brief A custom command - */ - -/*! - \var IrcCommand::Info - \brief An info command (INFO) is used to query server info. - */ - -/*! - \var IrcCommand::Invite - \brief An invite command (INVITE) is used to invite users to a channel. - */ - -/*! - \var IrcCommand::Join - \brief A join command (JOIN) is used to start listening a specific channel. - */ - -/*! - \var IrcCommand::Kick - \brief A kick command (KICK) is used to forcibly remove a user from a channel. - */ - -/*! - \var IrcCommand::Knock - \brief A knock command (KNOCK) is used to request channel invitation. - */ - -/*! - \var IrcCommand::List - \brief A list command (LIST) is used to list channels and their topics. - */ - -/*! - \var IrcCommand::Message - \brief A message command (PRIVMSG) is used to send private messages to channels and users. - */ - -/*! - \var IrcCommand::Mode - \brief A mode command (MODE) is used to change the mode of users and channels. - */ - -/*! - \var IrcCommand::Motd - \brief A message of the day command (MOTD) is used to query the message of the day. - */ - -/*! - \var IrcCommand::Names - \brief A names command (NAMES) is used to list all nicknames on a channel. - */ - -/*! - \var IrcCommand::Nick - \brief A nick command (NICK) is used to give user a nickname or change the previous one. - */ - -/*! - \var IrcCommand::Notice - \brief A notice command (NOTICE) is used to send notice messages to channels and users. - */ - -/*! - \var IrcCommand::Part - \brief A part command (PART) causes the client to be removed from the channel. - */ - -/*! - \var IrcCommand::Quit - \brief A quit command (QUIT) is used to end a client connection. - */ - -/*! - \var IrcCommand::Quote - \brief A quote command is used to send a raw message to the server. - */ - -/*! - \var IrcCommand::Stats - \brief A stats command (STATS) is used to query server statistics. - */ - -/*! - \var IrcCommand::Time - \brief A time command (TIME) is used to query local server time. - */ - -/*! - \var IrcCommand::Topic - \brief A topic command (TOPIC) is used to change or view the topic of a channel. - */ - -/*! - \var IrcCommand::Trace - \brief A trace command (TRACE) is used to trace the connection path to a target. - */ - -/*! - \var IrcCommand::Users - \brief A users command (USERS) is used to query server users. - */ - -/*! - \var IrcCommand::Version - \brief A version command (VERSION) is used to query user or server version. - */ - -/*! - \var IrcCommand::Who - \brief A who command (WHO) is used to generate a query which returns a list of matching users. - */ - -/*! - \var IrcCommand::Whois - \brief A whois command (WHOIS) is used to query information about a particular user. - */ - -/*! - \var IrcCommand::Whowas - \brief A whowas command (WHOWAS) is used to query information about a user that no longer exists. - */ - -#ifndef IRC_DOXYGEN -class IrcCommandPrivate -{ -public: - IrcCommandPrivate() : encoding("UTF-8") { } - - QString params(int index) const; - - IrcCommand::Type type; - QStringList parameters; - QByteArray encoding; - - static IrcCommand* createCommand(IrcCommand::Type type, const QStringList& parameters); -}; - -QString IrcCommandPrivate::params(int index) const -{ - return QStringList(parameters.mid(index)).join(QLatin1String(" ")); -} - -IrcCommand* IrcCommandPrivate::createCommand(IrcCommand::Type type, const QStringList& parameters) -{ - IrcCommand* command = new IrcCommand; - command->setType(type); - command->setParameters(parameters); - return command; -} -#endif // IRC_DOXYGEN - -/*! - Constructs a new IrcCommand with \a parent. - */ -IrcCommand::IrcCommand(QObject* parent) : QObject(parent), d_ptr(new IrcCommandPrivate) -{ - Q_D(IrcCommand); - d->type = Custom; -} - -/*! - Destructs the IRC command. - */ -IrcCommand::~IrcCommand() -{ -} - -/*! - This property holds the command type. - - \par Access functions: - \li IrcCommand::Type type() const - \li void setType(IrcCommand::Type type) - */ -IrcCommand::Type IrcCommand::type() const -{ - Q_D(const IrcCommand); - return d->type; -} - -void IrcCommand::setType(Type type) -{ - Q_D(IrcCommand); - d->type = type; -} - -/*! - This property holds the command parameters. - - \par Access functions: - \li QStringList parameters() const - \li void setParameters(const QStringList& parameters) - */ -QStringList IrcCommand::parameters() const -{ - Q_D(const IrcCommand); - return d->parameters; -} - -void IrcCommand::setParameters(const QStringList& parameters) -{ - Q_D(IrcCommand); - d->parameters = parameters; -} - -/*! - This property holds the encoding that is used when - sending the command via IrcConnection::sendCommand(). - - See QTextCodec::availableCodes() for the list of - supported encodings. The default value is \c "UTF-8". - - \par Access functions: - \li QByteArray encoding() const - \li void setEncoding(const QByteArray& encoding) - - \sa QTextCodec::availableCodecs() - */ -QByteArray IrcCommand::encoding() const -{ - Q_D(const IrcCommand); - return d->encoding; -} - -void IrcCommand::setEncoding(const QByteArray& encoding) -{ - Q_D(IrcCommand); - extern bool irc_is_supported_encoding(const QByteArray& encoding); // ircmessagedecoder.cpp - if (!irc_is_supported_encoding(encoding)) { - qWarning() << "IrcCommand::setEncoding(): unsupported encoding" << encoding; - return; - } - d->encoding = encoding; -} - -/*! - Returns the command as a string. - - Reimplement for custom commands. - \sa IrcCommand::Custom - */ -QString IrcCommand::toString() const -{ - Q_D(const IrcCommand); - const QString p0 = d->parameters.value(0); - const QString p1 = d->parameters.value(1); - const QString p2 = d->parameters.value(2); - - switch (d->type) { - case Admin: return QString("ADMIN %1").arg(p0); // server - case Away: return QString("AWAY :%1").arg(d->params(0)); // reason - case Capability: return QString("CAP %1 :%2").arg(p0, d->params(1)); // subcmd, caps - case CtcpAction: return QString("PRIVMSG %1 :\1ACTION %2\1").arg(p0, d->params(1)); // target, msg - case CtcpRequest: return QString("PRIVMSG %1 :\1%2\1").arg(p0, d->params(1)); // target, msg - case CtcpReply: return QString("NOTICE %1 :\1%2\1").arg(p0, d->params(1)); // target, msg - case Info: return QString("INFO %1").arg(p0); // server - case Invite: return QString("INVITE %1 %2").arg(p0, p1); // user, chan - case Join: return p1.isNull() ? QString("JOIN %1").arg(p0) : QString("JOIN %1 %2").arg(p0, p1); // chan, key - case Kick: return p2.isNull() ? QString("KICK %1 %2").arg(p0, p1) : QString("KICK %1 %2 :%3").arg(p0, p1, d->params(2)); // chan, user, reason - case Knock: return QString("KNOCK %1 %2").arg(p0, p1); // chan, msg - case List: return p1.isNull() ? QString("LIST %1").arg(p0) : QString("LIST %1 %2").arg(p0, p1); // chan, server - case Message: return QString("PRIVMSG %1 :%2").arg(p0, d->params(1)); // target, msg - case Mode: return QString("MODE ") + d->parameters.join(" "); // target, mode, arg - case Motd: return QString("MOTD %1").arg(p0); // server - case Names: return QString("NAMES %1").arg(p0); // chan - case Nick: return QString("NICK %1").arg(p0); // nick - case Notice: return QString("NOTICE %1 :%2").arg(p0, d->params(1)); // target, msg - case Part: return p1.isNull() ? QString("PART %1").arg(p0) : QString("PART %1 :%2").arg(p0, d->params(1)); // chan, reason - case Ping: return QString("PING %1").arg(p0); // argument - case Pong: return QString("PONG %1").arg(p0); // argument - case Quit: return QString("QUIT :%1").arg(d->params(0)); // reason - case Quote: return d->parameters.join(" "); - case Stats: return QString("STATS %1 %2").arg(p0, p1); // query, server - case Time: return QString("TIME %1").arg(p0); // server - case Topic: return p1.isNull() ? QString("TOPIC %1").arg(p0) : QString("TOPIC %1 :%2").arg(p0, d->params(1)); // chan, topic - case Trace: return QString("TRACE %1").arg(p0); // target - case Users: return QString("USERS %1").arg(p0); // server - case Version: return p0.isNull() ? QString("VERSION") : QString("PRIVMSG %1 :\1VERSION\1").arg(p0); // user - case Who: return QString("WHO %1").arg(p0); // user - case Whois: return QString("WHOIS %1 %1").arg(p0); // user - case Whowas: return QString("WHOWAS %1 %1").arg(p0); // user - - case Custom: qWarning("Reimplement IrcCommand::toString() for IrcCommand::Custom"); - default: return QString(); - } -} - -/*! - Creates a new message from this command for \a prefix and \a connection. - - Notice that IRC servers do not echo sent message commands back to the client. - This function is particularly useful for converting sent message commands as - messages for presentation purposes. - - \code - if (command->type() == IrcCommand::Message) { - IrcMessage* message = command->toMessage(connection->nickName(), connection); - receiveMessage(message); - message->deleteLater(); - } - \endcode - */ -IrcMessage* IrcCommand::toMessage(const QString& prefix, IrcConnection* connection) const -{ - return IrcMessage::fromData(":" + prefix.toUtf8() + " " + toString().toUtf8(), connection); -} - -/*! - Creates a new ADMIN command with type IrcCommand::Admin and optional parameter \a server. - - This command shows admin info for the specified \a server, - or the current server if not specified. - */ -IrcCommand* IrcCommand::createAdmin(const QString& server) -{ - return IrcCommandPrivate::createCommand(Admin, QStringList() << server); -} - -/*! - Creates a new AWAY command with type IrcCommand::Away and optional parameter \a reason. - - Provides the server with \a reason to automatically send in reply to a private - message directed at the user. If \a reason is omitted, the away status is removed. - */ -IrcCommand* IrcCommand::createAway(const QString& reason) -{ - return IrcCommandPrivate::createCommand(Away, QStringList() << reason); -} - -/*! - Creates a new capability command with type IrcCommand::Capability and parameters \a subCommand and a \a capability. - - Available subcommands are: LS, LIST, REQ, ACK, NAK, CLEAR and END. - */ -IrcCommand* IrcCommand::createCapability(const QString& subCommand, const QString& capability) -{ - return createCapability(subCommand, QStringList() << capability); -} - -/*! - Creates a new capability command with type IrcCommand::Capability and parameters \a subCommand and optional \a capabilities. - - Available subcommands are: LS, LIST, REQ, ACK, NAK, CLEAR and END. - */ -IrcCommand* IrcCommand::createCapability(const QString& subCommand, const QStringList& capabilities) -{ - return IrcCommandPrivate::createCommand(Capability, QStringList() << subCommand << capabilities.join(QLatin1String(" "))); -} - -/*! - Creates a new CTCP action command with type IrcCommand::CtcpAction and parameters \a target and \a action. - */ -IrcCommand* IrcCommand::createCtcpAction(const QString& target, const QString& action) -{ - return IrcCommandPrivate::createCommand(CtcpAction, QStringList() << target << action); -} - -/*! - Creates a new CTCP reply command with type IrcCommand::CtcpReply and parameters \a target and \a reply. - */ -IrcCommand* IrcCommand::createCtcpReply(const QString& target, const QString& reply) -{ - return IrcCommandPrivate::createCommand(CtcpReply, QStringList() << target << reply); -} - -/*! - Creates a new CTCP request command with type IrcCommand::CtcpRequest and parameters \a target and \a request. - */ -IrcCommand* IrcCommand::createCtcpRequest(const QString& target, const QString& request) -{ - return IrcCommandPrivate::createCommand(CtcpRequest, QStringList() << target << request); -} - -/*! - Creates a new INFO command with type IrcCommand::Info and optional parameter \a server. - - This command shows info for the specified \a server, - or the current server if not specified. - */ -IrcCommand* IrcCommand::createInfo(const QString& server) -{ - return IrcCommandPrivate::createCommand(Info, QStringList() << server); -} - -/*! - Creates a new INVITE command with type IrcCommand::Invite and parameters \a user and \a channel. - - This command invites \a user to the \a channel. The channel does not have to exist, but - if it does, only members of the channel are allowed to invite other clients. if the - channel mode +i (invite-only) is set, only channel operators may invite other clients. - */ -IrcCommand* IrcCommand::createInvite(const QString& user, const QString& channel) -{ - return IrcCommandPrivate::createCommand(Invite, QStringList() << user << channel); -} - -/*! - Creates a new JOIN command with type IrcCommand::Join and parameters \a channel and optional \a key. - - This command joins the \a channel using \a key if specified. - If the channel does not exist, it will be created. - */ -IrcCommand* IrcCommand::createJoin(const QString& channel, const QString& key) -{ - return IrcCommandPrivate::createCommand(Join, QStringList() << channel << key); -} - -/*! - This overload is provided for convenience. - */ -IrcCommand* IrcCommand::createJoin(const QStringList& channels, const QStringList& keys) -{ - return IrcCommandPrivate::createCommand(Join, QStringList() << channels.join(",") << keys.join(",")); -} - -/*! - Creates a new KICK command with type IrcCommand::Kick and parameters \a channel, \a user and optional \a reason. - - This command forcibly removes \a user from \a channel, - and may only be issued by channel operators. - */ -IrcCommand* IrcCommand::createKick(const QString& channel, const QString& user, const QString& reason) -{ - return IrcCommandPrivate::createCommand(Kick, QStringList() << channel << user << reason); -} - -/*! - Creates a new KNOCK command with type IrcCommand::Knock and parameters \a channel and optional \a message. - - This command sends an invitation request to a \a channel with an optional \a message. - - \note The command is not formally defined by an RFC, but is supported by most major IRC daemons. - Support is indicated in a RPL_ISUPPORT reply (numeric 005) with the KNOCK keyword. - */ -IrcCommand* IrcCommand::createKnock(const QString& channel, const QString& message) -{ - return IrcCommandPrivate::createCommand(Knock, QStringList() << channel << message); -} - -/*! - Creates a new LIST command with type IrcCommand::List and optional parameters \a channels and \a server. - - This command lists all channels on the server. If \a channels are given, it will list the channel topics. - If \a server is given, the command will be forwarded to \a server for evaluation. - */ -IrcCommand* IrcCommand::createList(const QStringList& channels, const QString& server) -{ - return IrcCommandPrivate::createCommand(List, QStringList() << channels.join(",") << server); -} - -/*! - Creates a new PRIVMSG command with type IrcCommand::Message and parameters \a target and \a message. - - This command sends \a message to \a target, which is usually a user or channel. - */ -IrcCommand* IrcCommand::createMessage(const QString& target, const QString& message) -{ - return IrcCommandPrivate::createCommand(Message, QStringList() << target << message); -} - -/*! - Creates a new MODE command with type IrcCommand::Mode and parameters \a target and optional \a mode and \a arg. - - This command is used to set both user and channel modes. - */ -IrcCommand* IrcCommand::createMode(const QString& target, const QString& mode, const QString& arg) -{ - return IrcCommandPrivate::createCommand(Mode, QStringList() << target << mode << arg); -} - -/*! - Creates a new MOTD command with type IrcCommand::Motd and optional parameter \a server. - - This command shows the message of the day on the specified \a server, - or the current server if not specified. - */ -IrcCommand* IrcCommand::createMotd(const QString& server) -{ - return IrcCommandPrivate::createCommand(Motd, QStringList() << server); -} - -/*! - Creates a new NAMES command with type IrcCommand::Names and parameter \a channel. - - This command lists all users on the \a channel, optionally limiting to the given \a server. - - If \a channel is omitted, all users are shown, grouped by channel name with - all users who are not on a channel being shown as part of channel "*". - If \a server is specified, the command is sent to \a server for evaluation. -*/ -IrcCommand* IrcCommand::createNames(const QString& channel, const QString& server) -{ - return IrcCommandPrivate::createCommand(Names, QStringList() << channel << server); -} - -/*! - This overload is provided for convenience. - */ -IrcCommand* IrcCommand::createNames(const QStringList& channels, const QString& server) -{ - return IrcCommandPrivate::createCommand(Names, QStringList() << channels.join(",") << server); -} - -/*! - Creates a new NICK command with type IrcCommand::Nick and parameter \a nick. - - This command allows a client to change their IRC nickname. - */ -IrcCommand* IrcCommand::createNick(const QString& nick) -{ - return IrcCommandPrivate::createCommand(Nick, QStringList() << nick); -} - -/*! - Creates a new NOTICE command with type IrcCommand::Notice and parameters \a target and \a message. - - This command sends \a notice to \a target, which is usually a user or channel. - - \note The command works similarly to PRIVMSG, except automatic replies must never be sent in reply to NOTICE messages. - */ -IrcCommand* IrcCommand::createNotice(const QString& target, const QString& message) -{ - return IrcCommandPrivate::createCommand(Notice, QStringList() << target << message); -} - -/*! - Creates a new PART command with type IrcCommand::Part and parameters \a channel and optional \a reason. - - This command causes the client to leave the specified channel. - */ -IrcCommand* IrcCommand::createPart(const QString& channel, const QString& reason) -{ - return IrcCommandPrivate::createCommand(Part, QStringList() << channel << reason); -} - -/*! - This overload is provided for convenience. - */ -IrcCommand* IrcCommand::createPart(const QStringList& channels, const QString& reason) -{ - return IrcCommandPrivate::createCommand(Part, QStringList() << channels.join(",") << reason); -} - -/*! - Creates a new PING command with type IrcCommand::Ping and \a argument. - */ -IrcCommand* IrcCommand::createPing(const QString& argument) -{ - return IrcCommandPrivate::createCommand(Ping, QStringList() << argument); -} - -/*! - Creates a new PONG command with type IrcCommand::Pong and \a argument. - */ -IrcCommand* IrcCommand::createPong(const QString& argument) -{ - return IrcCommandPrivate::createCommand(Pong, QStringList() << argument); -} - -/*! - Creates a new QUIT command with type IrcCommand::Quit and optional parameter \a reason. - */ -IrcCommand* IrcCommand::createQuit(const QString& reason) -{ - return IrcCommandPrivate::createCommand(Quit, QStringList() << reason); -} - -/*! - Creates a new QUOTE command with type IrcCommand::Quote and \a raw. - */ -IrcCommand* IrcCommand::createQuote(const QString& raw) -{ - return IrcCommandPrivate::createCommand(Quote, QStringList() << raw); -} - -/*! - Creates a new QUOTE command with type IrcCommand::Quote and \a parameters. - */ -IrcCommand* IrcCommand::createQuote(const QStringList& parameters) -{ - return IrcCommandPrivate::createCommand(Quote, parameters); -} - -/*! - Creates a new STATS command with type IrcCommand::Stats and parameters \a query and optional \a server. - - This command queries statistics about the specified \a server, - or the current server if not specified. - */ -IrcCommand* IrcCommand::createStats(const QString& query, const QString& server) -{ - return IrcCommandPrivate::createCommand(Stats, QStringList() << query << server); -} - -/*! - Creates a new TIME command with type IrcCommand::Time and optional parameter \a server. - - This command queries local time of the specified \a server, - or the current server if not specified. - */ -IrcCommand* IrcCommand::createTime(const QString& server) -{ - return IrcCommandPrivate::createCommand(Time, QStringList() << server); -} - -/*! - Creates a new TOPIC command with type IrcCommand::Topic and parameters \a channel and optional \a topic. - - This command allows the client to query or set the channel topic on \a channel. - If \a topic is given, it sets the channel topic to \a topic. - If channel mode +t is set, only a channel operator may set the topic. - */ -IrcCommand* IrcCommand::createTopic(const QString& channel, const QString& topic) -{ - return IrcCommandPrivate::createCommand(Topic, QStringList() << channel << topic); -} - -/*! - Creates a new TRACE command with type IrcCommand::Trace and optional parameter \a target. - - This command traces the connection path across the IRC network - to the current server or to a specific \a target (server or client) - in a similar method to traceroute. - */ -IrcCommand* IrcCommand::createTrace(const QString& target) -{ - return IrcCommandPrivate::createCommand(Trace, QStringList() << target); -} - -/*! - Creates a new USERS command with type IrcCommand::Users and optional parameter \a server. - - This command queries the users of the specified \a server, - or the current server if not specified. - */ -IrcCommand* IrcCommand::createUsers(const QString& server) -{ - return IrcCommandPrivate::createCommand(Users, QStringList() << server); -} - -/*! - Creates a new command with type IrcCommand::Version and optional parameter \a user. - - This command queries the version of the specified \a user's client (CTCP REQUEST VERSION), - or the current server (VERSION) if not specified. - */ -IrcCommand* IrcCommand::createVersion(const QString& user) -{ - return IrcCommandPrivate::createCommand(Version, QStringList() << user); -} - -/*! - Creates a new WHO command with type IrcCommand::Who and parameters \a mask and optional \a operators. - - This command returns a list of users who match \a mask, - optionally matching only IRC \a operators. - */ -IrcCommand* IrcCommand::createWho(const QString& mask, bool operators) -{ - return IrcCommandPrivate::createCommand(Who, QStringList() << mask << (operators ? "o" : "")); -} - -/*! - Creates a new WHOIS command with type IrcCommand::Whois and parameter \a user. - - This command returns information about \a user. - */ -IrcCommand* IrcCommand::createWhois(const QString& user) -{ - return IrcCommandPrivate::createCommand(Whois, QStringList() << user); -} - -/*! - Creates a new WHOWAS command with type IrcCommand::Whowas and parameters \a user and optional \a count. - - This command returns information about a \a user that is no longer online - (due to client disconnection, or nickname changes). If given, the server - will return information from the last \a count times the nickname has been used. - */ -IrcCommand* IrcCommand::createWhowas(const QString& user, int count) -{ - return IrcCommandPrivate::createCommand(Whowas, QStringList() << user << QString::number(count)); -} - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug debug, IrcCommand::Type type) -{ - const int index = IrcCommand::staticMetaObject.indexOfEnumerator("Type"); - QMetaEnum enumerator = IrcCommand::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(type); - debug << (key ? key : "Unknown"); - return debug; -} - -QDebug operator<<(QDebug debug, const IrcCommand* command) -{ - if (!command) - return debug << "IrcCommand(0x0) "; - debug.nospace() << command->metaObject()->className() << '(' << (void*) command; - if (!command->objectName().isEmpty()) - debug.nospace() << ", name=" << qPrintable(command->objectName()); - debug.nospace() << ", type=" << command->type(); - QString str = command->toString(); - if (!str.isEmpty()) - debug.nospace() << ", " << str.left(20); - debug.nospace() << ')'; - return debug.space(); -} -#endif // QT_NO_DEBUG_STREAM - -#include "moc_irccommand.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircconnection.cpp b/libcommuni/src/core/ircconnection.cpp deleted file mode 100644 index 837aa16..0000000 --- a/libcommuni/src/core/ircconnection.cpp +++ /dev/null @@ -1,1508 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircconnection.h" -#include "ircconnection_p.h" -#include "ircnetwork_p.h" -#include "ircprotocol.h" -#include "ircnetwork.h" -#include "irccommand.h" -#include "ircmessage.h" -#include "ircfilter.h" -#include "irc.h" -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef QT_NO_OPENSSL -#include -#include -#endif // QT_NO_OPENSSL -#include -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file ircconnection.h - \brief \#include <IrcConnection> - */ - -/*! - \class IrcConnection ircconnection.h IrcConnection - \ingroup core - \brief Provides means to establish a connection to an IRC server. - - \section connection-management Connection management - - Before \ref open() "opening" a connection, it must be first initialized - with \ref host, \ref userName, \ref nickName and \ref realName. - - The connection status may be queried at any time via status(). Also - \ref active "isActive()" and \ref connected "isConnected()" are provided - for convenience. In addition to the \ref status "statusChanged()" signal, - the most important statuses are informed via the following convenience - signals: - \li connecting() - - The connection is being established. - \li \ref connected "connected()" - - The IRC connection has been established, and the server is ready to receive commands. - \li disconnected() - - The connection has been lost. - - \section receiving-messages Receiving messages - - Whenever a message is received from the server, the messageReceived() - signal is emitted. Also message type specific signals are provided - for convenience. See messageReceived() and IrcMessage and its - subclasses for more details. - - \section sending-commands Sending commands - - Sending commands to a server is most conveniently done by creating - them via the various static \ref IrcCommand "IrcCommand::createXxx()" - methods and passing them to sendCommand(). Also sendData() is provided - for more low-level access. See IrcCommand for more details. - - \section example Example - - \code - IrcConnection* connection = new IrcConnection(this); - connect(connection, SIGNAL(messageReceived(IrcMessage*)), this, SLOT(onMessageReceived(IrcMessage*))); - connection->setHost("irc.server.com"); - connection->setUserName("me"); - connection->setNickName("myself"); - connection->setRealName("And I"); - connection->sendCommand(IrcCommand::createJoin("#mine")); - connection->open(); - \endcode - - \sa IrcNetwork, IrcMessage, IrcCommand - */ - -/*! - \enum IrcConnection::Status - This enum describes the connection status. - */ - -/*! - \var IrcConnection::Inactive - \brief The connection is inactive. - */ - -/*! - \var IrcConnection::Waiting - \brief The connection is waiting for a reconnect. - */ - -/*! - \var IrcConnection::Connecting - \brief The connection is being established. - */ - -/*! - \var IrcConnection::Connected - \brief The connection has been established. - */ - -/*! - \var IrcConnection::Closing - \brief The connection is being closed. - */ - -/*! - \var IrcConnection::Closed - \brief The connection has been closed. - */ - -/*! - \var IrcConnection::Error - \brief The connection has encountered an error. - */ - -/*! - \fn void IrcConnection::connecting() - - This signal is emitted when the connection is being established. - - The underlying \ref socket has connected, but the IRC handshake is - not yet finished and the server is not yet ready to receive commands. - */ - -/*! - \fn void IrcConnection::nickNameRequired(const QString& reserved, QString* alternate) - - This signal is emitted when the requested nick name is \a reserved - and an \a alternate nick name should be provided. - - An alternate nick name may be set via the provided argument, by changing - the \ref nickName property, or by sending a nick command directly. - - \sa IrcCommand::createNick(), Irc::ERR_NICKNAMEINUSE, Irc::ERR_NICKCOLLISION - */ - -/*! - \fn void IrcConnection::channelKeyRequired(const QString& channel, QString* key) - - This signal is emitted when joining a \a channel requires a \a key. - The key may be set via the provided argument, or by sending a new - join command directly. - - \sa IrcCommand::createJoin(), Irc::ERR_BADCHANNELKEY - */ - -/*! - \fn void IrcConnection::disconnected() - - This signal is emitted when the connection has been lost. - */ - -/*! - \fn void IrcConnection::socketError(QAbstractSocket::SocketError error) - - This signal is emitted when a \ref socket \a error occurs. - - \sa QAbstractSocket::error() - */ - -/*! - \fn void IrcConnection::socketStateChanged(QAbstractSocket::SocketState state) - - This signal is emitted when the \a state of the underlying \ref socket changes. - - \sa QAbstractSocket::stateChanged() - */ - -/*! - \since 3.2 - \fn void IrcConnection::secureError() - - This signal is emitted when SSL socket error occurs. - - Either QSslSocket::sslErrors() was emitted, or the remote host closed - the connection without QSslSocket::sslErrors() being emitted meaning - that the server is not SSL-enabled. - */ - -/*! - \fn void IrcConnection::messageReceived(IrcMessage* message) - - This signal is emitted when a \a message is received. - - In addition, message type specific signals are provided for convenience: - \li void capabilityMessageReceived(\ref IrcCapabilityMessage* message) - \li void errorMessageReceived(\ref IrcErrorMessage* message) - \li void inviteMessageReceived(\ref IrcInviteMessage* message) - \li void joinMessageReceived(\ref IrcJoinMessage* message) - \li void kickMessageReceived(\ref IrcKickMessage* message) - \li void modeMessageReceived(\ref IrcModeMessage* message) - \li void namesMessageReceived(\ref IrcNamesMessage* message) - \li void nickMessageReceived(\ref IrcNickMessage* message) - \li void noticeMessageReceived(\ref IrcNoticeMessage* message) - \li void numericMessageReceived(\ref IrcNumericMessage* message) - \li void motdMessageReceived(\ref IrcMotdMessage* message) - \li void partMessageReceived(\ref IrcPartMessage* message) - \li void pingMessageReceived(\ref IrcPingMessage* message) - \li void pongMessageReceived(\ref IrcPongMessage* message) - \li void privateMessageReceived(\ref IrcPrivateMessage* message) - \li void quitMessageReceived(\ref IrcQuitMessage* message) - \li void topicMessageReceived(\ref IrcTopicMessage* message) - */ - -#ifndef IRC_DOXYGEN -template -static void irc_debug(IrcConnection* connection, const char* msg, const T& arg) -{ - static bool dbg = qgetenv("IRC_DEBUG").toInt(); - if (dbg) { - const QString desc = QString::fromLatin1("IrcConnection(%1)").arg(connection->displayName()); - qDebug() << qPrintable(desc) << msg << arg; - } -} - -IrcConnectionPrivate::IrcConnectionPrivate() : - q_ptr(0), - encoding("ISO-8859-15"), - network(0), - protocol(0), - socket(0), - host(), - port(6667), - userName(), - nickName(), - realName(), - enabled(true), - status(IrcConnection::Inactive), - sslErrors(false), - closed(false) -{ -} - -void IrcConnectionPrivate::init(IrcConnection* connection) -{ - q_ptr = connection; - network = IrcNetworkPrivate::create(connection); - connection->setSocket(new QTcpSocket(connection)); - connection->setProtocol(new IrcProtocol(connection)); - QObject::connect(&reconnecter, SIGNAL(timeout()), connection, SLOT(_irc_reconnect())); -} - -void IrcConnectionPrivate::_irc_connected() -{ - Q_Q(IrcConnection); - closed = false; - sslErrors = false; - emit q->connecting(); - if (q->isSecure()) - QMetaObject::invokeMethod(socket, "startClientEncryption"); - protocol->open(); -} - -void IrcConnectionPrivate::_irc_disconnected() -{ - Q_Q(IrcConnection); - protocol->close(); - emit q->disconnected(); - if (enabled && !sslErrors && (status != IrcConnection::Closed || !closed) && !reconnecter.isActive() && reconnecter.interval() > 0) { - reconnecter.start(); - setStatus(IrcConnection::Waiting); - } -} - -void IrcConnectionPrivate::_irc_error(QAbstractSocket::SocketError error) -{ - Q_Q(IrcConnection); - if (!closed && !sslErrors && error == QAbstractSocket::RemoteHostClosedError && q->isSecure()) { - irc_debug(q, "SSL error:", "no SSL available"); - setStatus(IrcConnection::Error); - sslErrors = true; - emit q->secureError(); - } else if (!closed || (error != QAbstractSocket::RemoteHostClosedError && error != QAbstractSocket::UnknownSocketError)) { - irc_debug(q, "socket error:", error); - emit q->socketError(error); - setStatus(IrcConnection::Error); - } -} - -void IrcConnectionPrivate::_irc_sslErrors() -{ - Q_Q(IrcConnection); - QStringList errors; -#ifndef QT_NO_OPENSSL - QSslSocket* ssl = qobject_cast(socket); - if (ssl) { - foreach (const QSslError& error, ssl->sslErrors()) - errors += error.errorString(); - } -#endif - irc_debug(q, "SSL handshake errors:", errors); - sslErrors = true; - emit q->secureError(); -} - -void IrcConnectionPrivate::_irc_state(QAbstractSocket::SocketState state) -{ - Q_Q(IrcConnection); - switch (state) { - case QAbstractSocket::UnconnectedState: - if (closed) - setStatus(IrcConnection::Closed); - break; - case QAbstractSocket::ClosingState: - if (status != IrcConnection::Error) - setStatus(IrcConnection::Closing); - break; - case QAbstractSocket::HostLookupState: - case QAbstractSocket::ConnectingState: - case QAbstractSocket::ConnectedState: - default: - setStatus(IrcConnection::Connecting); - break; - } - emit q->socketStateChanged(state); -} - -void IrcConnectionPrivate::_irc_reconnect() -{ - Q_Q(IrcConnection); - if (!q->isActive()) { - reconnecter.stop(); - q->open(); - } -} - -void IrcConnectionPrivate::_irc_readData() -{ - protocol->read(); -} - -void IrcConnectionPrivate::_irc_filterDestroyed(QObject* filter) -{ - messageFilters.removeAll(filter); - commandFilters.removeAll(filter); -} - -void IrcConnectionPrivate::setNick(const QString& nick) -{ - Q_Q(IrcConnection); - if (nickName != nick) { - nickName = nick; - emit q->nickNameChanged(nick); - } -} - -void IrcConnectionPrivate::setStatus(IrcConnection::Status value) -{ - Q_Q(IrcConnection); - if (status != value) { - const bool wasConnected = q->isConnected(); - status = value; - emit q->statusChanged(value); - - if (!wasConnected && q->isConnected()) { - emit q->connected(); - foreach (IrcCommand* cmd, pendingCommands) - q->sendCommand(cmd); - pendingCommands.clear(); - } - irc_debug(q, "status:", status); - } -} - -void IrcConnectionPrivate::setInfo(const QHash& info) -{ - Q_Q(IrcConnection); - const QString oldName = q->displayName(); - IrcNetworkPrivate* priv = IrcNetworkPrivate::get(network); - priv->setInfo(info); - const QString newName = q->displayName(); - if (oldName != newName) - emit q->displayNameChanged(newName); -} - -void IrcConnectionPrivate::receiveMessage(IrcMessage* msg) -{ - Q_Q(IrcConnection); - bool filtered = false; - for (int i = messageFilters.count() - 1; !filtered && i >= 0; --i) { - IrcMessageFilter* filter = qobject_cast(messageFilters.at(i)); - if (filter) - filtered |= filter->messageFilter(msg); - } - - if (!filtered) { - emit q->messageReceived(msg); - - switch (msg->type()) { - case IrcMessage::Nick: - emit q->nickMessageReceived(static_cast(msg)); - break; - case IrcMessage::Quit: - emit q->quitMessageReceived(static_cast(msg)); - break; - case IrcMessage::Join: - emit q->joinMessageReceived(static_cast(msg)); - break; - case IrcMessage::Part: - emit q->partMessageReceived(static_cast(msg)); - break; - case IrcMessage::Topic: - emit q->topicMessageReceived(static_cast(msg)); - break; - case IrcMessage::WhoReply: - emit q->whoReplyMessageReceived(static_cast(msg)); - break; - case IrcMessage::Invite: - emit q->inviteMessageReceived(static_cast(msg)); - break; - case IrcMessage::Kick: - emit q->kickMessageReceived(static_cast(msg)); - break; - case IrcMessage::Mode: - emit q->modeMessageReceived(static_cast(msg)); - break; - case IrcMessage::Private: - emit q->privateMessageReceived(static_cast(msg)); - break; - case IrcMessage::Notice: - emit q->noticeMessageReceived(static_cast(msg)); - break; - case IrcMessage::Ping: - emit q->pingMessageReceived(static_cast(msg)); - break; - case IrcMessage::Pong: - emit q->pongMessageReceived(static_cast(msg)); - break; - case IrcMessage::Error: - emit q->errorMessageReceived(static_cast(msg)); - break; - case IrcMessage::Numeric: - emit q->numericMessageReceived(static_cast(msg)); - break; - case IrcMessage::Capability: - emit q->capabilityMessageReceived(static_cast(msg)); - break; - case IrcMessage::Motd: - emit q->motdMessageReceived(static_cast(msg)); - break; - case IrcMessage::Names: - emit q->namesMessageReceived(static_cast(msg)); - break; - case IrcMessage::Unknown: - default: - break; - } - } - msg->deleteLater(); -} - -IrcCommand* IrcConnectionPrivate::createCtcpReply(IrcPrivateMessage* request) -{ - Q_Q(IrcConnection); - IrcCommand* reply = 0; - const QMetaObject* metaObject = q->metaObject(); - int idx = metaObject->indexOfMethod("createCtcpReply(QVariant)"); - if (idx != -1) { - // QML: QVariant createCtcpReply(QVariant) - QVariant ret; - QMetaMethod method = metaObject->method(idx); - method.invoke(q, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(request))); - reply = ret.value(); - } else { - // C++: IrcCommand* createCtcpReply(IrcPrivateMessage*) - idx = metaObject->indexOfMethod("createCtcpReply(IrcPrivateMessage*)"); - QMetaMethod method = metaObject->method(idx); - method.invoke(q, Q_RETURN_ARG(IrcCommand*, reply), Q_ARG(IrcPrivateMessage*, request)); - } - return reply; -} -#endif // IRC_DOXYGEN - -/*! - Constructs a new IRC connection with \a parent. - */ -IrcConnection::IrcConnection(QObject* parent) : QObject(parent), d_ptr(new IrcConnectionPrivate) -{ - Q_D(IrcConnection); - d->init(this); -} - -/*! - Constructs a new IRC connection with \a host and \a parent. - */ -IrcConnection::IrcConnection(const QString& host, QObject* parent) : QObject(parent), d_ptr(new IrcConnectionPrivate) -{ - Q_D(IrcConnection); - d->init(this); - setHost(host); -} - -/*! - Destructs the IRC connection. - */ -IrcConnection::~IrcConnection() -{ - close(); - emit destroyed(this); -} - -/*! - This property holds the FALLBACK encoding for received messages. - - The fallback encoding is used when the message is detected not - to be valid \c UTF-8 and the consequent auto-detection of message - encoding fails. See QTextCodec::availableCodecs() for the list of - supported encodings. - - The default value is \c ISO-8859-15. - - \par Access functions: - \li QByteArray encoding() const - \li void setEncoding(const QByteArray& encoding) - - \sa QTextCodec::availableCodecs(), QTextCodec::codecForLocale() - */ -QByteArray IrcConnection::encoding() const -{ - Q_D(const IrcConnection); - return d->encoding; -} - -void IrcConnection::setEncoding(const QByteArray& encoding) -{ - Q_D(IrcConnection); - extern bool irc_is_supported_encoding(const QByteArray& encoding); // ircmessagedecoder.cpp - if (!irc_is_supported_encoding(encoding)) { - qWarning() << "IrcConnection::setEncoding(): unsupported encoding" << encoding; - return; - } - d->encoding = encoding; -} - -/*! - This property holds the server host. - - \par Access functions: - \li QString host() const - \li void setHost(const QString& host) - - \par Notifier signal: - \li void hostChanged(const QString& host) - */ -QString IrcConnection::host() const -{ - Q_D(const IrcConnection); - return d->host; -} - -void IrcConnection::setHost(const QString& host) -{ - Q_D(IrcConnection); - if (d->host != host) { - if (isActive()) - qWarning("IrcConnection::setHost() has no effect until re-connect"); - const QString oldName = displayName(); - d->host = host; - emit hostChanged(host); - const QString newName = displayName(); - if (oldName != newName) - emit displayNameChanged(newName); - } -} - -/*! - This property holds the server port. - - The default value is \c 6667. - - \par Access functions: - \li int port() const - \li void setPort(int port) - - \par Notifier signal: - \li void portChanged(int port) - */ -int IrcConnection::port() const -{ - Q_D(const IrcConnection); - return d->port; -} - -void IrcConnection::setPort(int port) -{ - Q_D(IrcConnection); - if (d->port != port) { - if (isActive()) - qWarning("IrcConnection::setPort() has no effect until re-connect"); - d->port = port; - emit portChanged(port); - } -} - -/*! - This property holds the user name. - - \note Changing the user name has no effect until the connection is re-established. - - \par Access functions: - \li QString userName() const - \li void setUserName(const QString& name) - - \par Notifier signal: - \li void userNameChanged(const QString& name) - */ -QString IrcConnection::userName() const -{ - Q_D(const IrcConnection); - return d->userName; -} - -void IrcConnection::setUserName(const QString& name) -{ - Q_D(IrcConnection); - QString user = name.split(" ", QString::SkipEmptyParts).value(0).trimmed(); - if (d->userName != user) { - if (isActive()) - qWarning("IrcConnection::setUserName() has no effect until re-connect"); - d->userName = user; - emit userNameChanged(user); - } -} - -/*! - This property holds the nick name. - - \par Access functions: - \li QString nickName() const - \li void setNickName(const QString& name) - - \par Notifier signal: - \li void nickNameChanged(const QString& name) - */ -QString IrcConnection::nickName() const -{ - Q_D(const IrcConnection); - return d->nickName; -} - -void IrcConnection::setNickName(const QString& name) -{ - Q_D(IrcConnection); - QString nick = name.split(" ", QString::SkipEmptyParts).value(0).trimmed(); - if (d->nickName != nick) { - if (isActive()) - sendCommand(IrcCommand::createNick(nick)); - else - d->setNick(nick); - } -} - -/*! - This property holds the real name. - - \note Changing the real name has no effect until the connection is re-established. - - \par Access functions: - \li QString realName() const - \li void setRealName(const QString& name) - - \par Notifier signal: - \li void realNameChanged(const QString& name) - */ -QString IrcConnection::realName() const -{ - Q_D(const IrcConnection); - return d->realName; -} - -void IrcConnection::setRealName(const QString& name) -{ - Q_D(IrcConnection); - if (d->realName != name) { - if (isActive()) - qWarning("IrcConnection::setRealName() has no effect until re-connect"); - d->realName = name; - emit realNameChanged(name); - } -} - -/*! - This property holds the password. - - \par Access functions: - \li QString password() const - \li void setPassword(const QString& password) - - \par Notifier signal: - \li void passwordChanged(const QString& password) - */ -QString IrcConnection::password() const -{ - Q_D(const IrcConnection); - return d->password; -} - -void IrcConnection::setPassword(const QString& password) -{ - Q_D(IrcConnection); - if (d->password != password) { - if (isActive()) - qWarning("IrcConnection::setPassword() has no effect until re-connect"); - d->password = password; - emit passwordChanged(password); - } -} - -/*! - This property holds the display name. - - Unless explicitly set, display name resolves to IrcNetwork::name - or IrcConnection::host while the former is not known. - - \par Access functions: - \li QString displayName() const - \li void setDisplayName(const QString& name) - - \par Notifier signal: - \li void displayNameChanged(const QString& name) - */ -QString IrcConnection::displayName() const -{ - Q_D(const IrcConnection); - QString name = d->displayName; - if (name.isEmpty()) - name = d->network->name(); - if (name.isEmpty()) - name = d->host; - return name; -} - -void IrcConnection::setDisplayName(const QString& name) -{ - Q_D(IrcConnection); - if (d->displayName != name) { - d->displayName = name; - emit displayNameChanged(name); - } -} - -/*! - \since 3.1 - - This property holds arbitrary user data. - - \par Access functions: - \li QVariantMap userData() const - \li void setUserData(const QVariantMap& data) - - \par Notifier signal: - \li void userDataChanged(const QVariantMap& data) - */ -QVariantMap IrcConnection::userData() const -{ - Q_D(const IrcConnection); - return d->userData; -} - -void IrcConnection::setUserData(const QVariantMap& data) -{ - Q_D(IrcConnection); - if (d->userData != data) { - d->userData = data; - emit userDataChanged(data); - } -} - -/*! - \property Status IrcConnection::status - This property holds the connection status. - - \par Access function: - \li Status status() const - - \par Notifier signal: - \li void statusChanged(Status status) - */ -IrcConnection::Status IrcConnection::status() const -{ - Q_D(const IrcConnection); - return d->status; -} - -/*! - \property bool IrcConnection::active - This property holds whether the connection is active. - - The connection is considered active when its either connecting, connected or closing. - - \par Access function: - \li bool isActive() const - */ -bool IrcConnection::isActive() const -{ - Q_D(const IrcConnection); - return d->status == Connecting || d->status == Connected || d->status == Closing; -} - -/*! - \property bool IrcConnection::connected - This property holds whether the connection has been established. - - The connection has been established when the welcome message - has been received and the server is ready to receive commands. - - \sa Irc::RPL_WELCOME - - \par Access function: - \li bool isConnected() const - - \par Notifier signal: - \li void connected() - */ -bool IrcConnection::isConnected() const -{ - Q_D(const IrcConnection); - return d->status == Connected; -} - -/*! - \property bool IrcConnection::enabled - This property holds whether the connection is enabled. - - The default value is \c true. - - When set to \c false, a disabled connection does nothing when open() is called. - - \par Access functions: - \li bool isEnabled() const - \li void setEnabled(bool enabled) [slot] - \li void setDisabled(bool disabled) [slot] - - \par Notifier signal: - \li void enabledChanged(bool enabled) - */ -bool IrcConnection::isEnabled() const -{ - Q_D(const IrcConnection); - return d->enabled; -} - -void IrcConnection::setEnabled(bool enabled) -{ - Q_D(IrcConnection); - if (d->enabled != enabled) { - d->enabled = enabled; - emit enabledChanged(enabled); - } -} - -void IrcConnection::setDisabled(bool disabled) -{ - setEnabled(!disabled); -} - -/*! - \property int IrcConnection::reconnectDelay - This property holds the reconnect delay in seconds. - - A positive (greater than zero) value enables automatic reconnect. - When the connection is lost due to a socket error, IrcConnection - will automatically attempt to reconnect after the specified delay. - - The default value is \c 0 (automatic reconnect disabled). - - \par Access functions: - \li int reconnectDelay() const - \li void setReconnectDelay(int seconds) - - \par Notifier signal: - \li void reconnectDelayChanged(int seconds) - */ -int IrcConnection::reconnectDelay() const -{ - Q_D(const IrcConnection); - return d->reconnecter.interval() / 1000; -} - -void IrcConnection::setReconnectDelay(int seconds) -{ - Q_D(IrcConnection); - const int interval = qMax(0, seconds) * 1000; - if (d->reconnecter.interval() != interval) { - d->reconnecter.setInterval(interval); - emit reconnectDelayChanged(interval); - } -} - -/*! - This property holds the socket. The default value is an instance of QTcpSocket. - - The previously set socket is deleted if its parent is \c this. - - \note IrcConnection supports QSslSocket in the way that it automatically - calls QSslSocket::startClientEncryption() while connecting. - - \par Access functions: - \li \ref QAbstractSocket* socket() const - \li void setSocket(\ref QAbstractSocket* socket) - - \sa IrcConnection::secure - */ -QAbstractSocket* IrcConnection::socket() const -{ - Q_D(const IrcConnection); - return d->socket; -} - -void IrcConnection::setSocket(QAbstractSocket* socket) -{ - Q_D(IrcConnection); - if (d->socket != socket) { - if (d->socket) { - d->socket->disconnect(this); - if (d->socket->parent() == this) - d->socket->deleteLater(); - } - - d->socket = socket; - if (socket) { - connect(socket, SIGNAL(connected()), this, SLOT(_irc_connected())); - connect(socket, SIGNAL(disconnected()), this, SLOT(_irc_disconnected())); - connect(socket, SIGNAL(readyRead()), this, SLOT(_irc_readData())); - connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(_irc_error(QAbstractSocket::SocketError))); - connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(_irc_state(QAbstractSocket::SocketState))); - if (isSecure()) - connect(socket, SIGNAL(sslErrors(QList)), this, SLOT(_irc_sslErrors())); - } - } -} - -/*! - \property bool IrcConnection::secure - This property holds whether the socket is an SSL socket. - - This property is provided for convenience. Calling - \code - connection->setSecure(true); - \endcode - - is equivalent to: - - \code - QSslSocket* socket = new QSslSocket(socket); - socket->setPeerVerifyMode(QSslSocket::QueryPeer); - connection->setSocket(socket); - \endcode - - \note IrcConnection does not handle SSL errors, see - QSslSocket::sslErrors() for more details on the subject. - - \par Access functions: - \li bool isSecure() const - \li void setSecure(bool secure) - - \par Notifier signal: - \li void secureChanged(bool secure) - - \sa secureSupported, IrcConnection::socket - */ -bool IrcConnection::isSecure() const -{ -#ifdef QT_NO_OPENSSL - return false; -#else - return qobject_cast(socket()); -#endif // QT_NO_OPENSSL -} - -void IrcConnection::setSecure(bool secure) -{ -#ifdef QT_NO_OPENSSL - if (secure) { - qWarning("IrcConnection::setSecure(): the Qt build does not support SSL"); - return; - } -#else - if (secure && !QSslSocket::supportsSsl()) { - qWarning("IrcConnection::setSecure(): the platform does not support SSL - try installing OpenSSL"); - return; - } - - QSslSocket* sslSocket = qobject_cast(socket()); - if (secure && !sslSocket) { - sslSocket = new QSslSocket(this); - sslSocket->setPeerVerifyMode(QSslSocket::QueryPeer); - setSocket(sslSocket); - emit secureChanged(true); - } else if (!secure && sslSocket) { - setSocket(new QTcpSocket(this)); - emit secureChanged(false); - } -#endif // !QT_NO_OPENSSL -} - -/*! - \since 3.2 - \property bool IrcConnection::secureSupported - This property holds whether SSL is supported. - - The value may be \c false for the following reasons: - \li Qt was built without SSL support (\c QT_NO_SSL is defined), or - \li The platform does not support SSL (QSslSocket::supportsSsl() returns \c false). - - \par Access function: - \li static bool isSecureSupported() - - \sa secure, QSslSocket::supportsSsl() - */ - -bool IrcConnection::isSecureSupported() -{ -#ifdef QT_NO_OPENSSL - return false; -#else - return QSslSocket::supportsSsl(); -#endif -} - -/*! - This property holds the used SASL (Simple Authentication and Security Layer) mechanism. - - \par Access functions: - \li QString saslMechanism() const - \li void setSaslMechanism(const QString& mechanism) - - \par Notifier signal: - \li void saslMechanismChanged(const QString& mechanism) - - \sa supportedSaslMechanisms - */ -QString IrcConnection::saslMechanism() const -{ - Q_D(const IrcConnection); - return d->saslMechanism; -} - -void IrcConnection::setSaslMechanism(const QString& mechanism) -{ - Q_D(IrcConnection); - if (!mechanism.isEmpty() && !supportedSaslMechanisms().contains(mechanism.toUpper())) { - qWarning("IrcConnection::setSaslMechanism(): unsupported mechanism: '%s'", qPrintable(mechanism)); - return; - } - if (d->saslMechanism != mechanism) { - if (isActive()) - qWarning("IrcConnection::setSaslMechanism() has no effect until re-connect"); - d->saslMechanism = mechanism.toUpper(); - emit saslMechanismChanged(mechanism); - } -} - -/*! - This property holds the list of supported SASL (Simple Authentication and Security Layer) mechanisms. - - \par Access function: - \li static QStringList supportedSaslMechanisms() - - \sa saslMechanism - */ -QStringList IrcConnection::supportedSaslMechanisms() -{ - return QStringList() << QLatin1String("PLAIN"); -} - -/*! - This property holds the network information. - - \par Access function: - \li IrcNetwork* network() const - */ -IrcNetwork* IrcConnection::network() const -{ - Q_D(const IrcConnection); - return d->network; -} - -/*! - Opens a connection to the server. - - The function does nothing when the connection is already \ref active - or explicitly \ref enabled "disabled". - - \note The function merely outputs a warnings and returns immediately if - either \ref host, \ref userName, \ref nickName or \ref realName is empty. - */ -void IrcConnection::open() -{ - Q_D(IrcConnection); - if (d->host.isEmpty()) { - qWarning("IrcConnection::open(): host is empty!"); - return; - } - if (d->userName.isEmpty()) { - qWarning("IrcConnection::open(): userName is empty!"); - return; - } - if (d->nickName.isEmpty()) { - qWarning("IrcConnection::open(): nickName is empty!"); - return; - } - if (d->realName.isEmpty()) { - qWarning("IrcConnection::open(): realName is empty!"); - return; - } - if (d->enabled && d->socket && !isActive()) - d->socket->connectToHost(d->host, d->port); -} - -/*! - Immediately closes the connection to the server. - - Calling close() makes the connection close immediately and thus might lead to - "remote host closed the connection". In order to quit gracefully, call quit() - first. This function attempts to flush the underlying socket, but this does - not guarantee that the server ever receives the QUIT command if the connection - is closed immediately after sending the command. In order to ensure a graceful - quit, let the server handle closing the connection. - - C++ example: - \code - connection->quit(reason); - QTimer::singleShot(timeout, connection, SLOT(deleteLater())); - \endcode - - QML example: - \code - connection.quit(reason); - connection.destroy(timeout); - \endcode - - \sa quit() - */ -void IrcConnection::close() -{ - Q_D(IrcConnection); - if (d->socket) { - d->closed = true; - d->socket->flush(); - d->socket->abort(); - d->socket->disconnectFromHost(); - if (d->socket->state() == QAbstractSocket::UnconnectedState) - d->setStatus(Closed); - d->reconnecter.stop(); - } -} - -/*! - Sends a quit command with an optionally specified \a reason. - - This method is provided for convenience. It is equal to: - \code - IrcCommand* command = IrcCommand::createQuit(reason); - connection->sendCommand(command); - \endcode - - \sa IrcCommand::createQuit() - */ -void IrcConnection::quit(const QString& reason) -{ - sendCommand(IrcCommand::createQuit(reason)); -} - -/*! - Sends a \a command to the server. - - If the connection is not active, the \a command is queued and sent - later when the connection has been established. - - \note If the command has a valid parent, it is an indication that - the caller of this method is be responsible for freeing the command. - If the command does not have a valid parent (like the commands - created via various IrcCommand::createXxx() methods) the connection - will take ownership of the command and delete it once it has been - sent. Thus, the command must have been allocated on the heap and - it is not safe to access the command after it has been sent. - - \sa sendData() - */ -bool IrcConnection::sendCommand(IrcCommand* command) -{ - Q_D(IrcConnection); - bool res = false; - if (command) { - bool filtered = false; - for (int i = d->commandFilters.count() - 1; !filtered && i >= 0; --i) { - QObject* filter = d->commandFilters.at(i); - IrcCommandFilter* commandFilter = qobject_cast(filter); - if (commandFilter && !d->activeCommandFilters.contains(filter)) { - d->activeCommandFilters.push(filter); - filtered |= commandFilter->commandFilter(command); - d->activeCommandFilters.pop(); - } - } - if (filtered) - return false; - - if (isActive()) { - QTextCodec* codec = QTextCodec::codecForName(command->encoding()); - Q_ASSERT(codec); - res = sendData(codec->fromUnicode(command->toString())); - if (!command->parent()) - command->deleteLater(); - } else { - Q_D(IrcConnection); - d->pendingCommands += command; - } - } - return res; -} - -/*! - Sends raw \a data to the server. - - \sa sendCommand() - */ -bool IrcConnection::sendData(const QByteArray& data) -{ - Q_D(IrcConnection); - if (d->socket) { - static bool dbg = qgetenv("IRC_DEBUG").toInt(); - if (dbg) qDebug() << "->" << data; - if (!d->closed && data.length() >= 4) { - const QByteArray cmd = data.left(5).toUpper(); - if (cmd.startsWith("QUIT") && (data.length() == 4 || QChar(data.at(4)).isSpace())) - d->closed = true; - } - return d->protocol->write(data); - } - return false; -} - -/*! - Sends raw \a message to the server using UTF-8 encoding. - - \sa sendData(), sendCommand() - */ -bool IrcConnection::sendRaw(const QString& message) -{ - return sendData(message.toUtf8()); -} - -/*! - Installs a message \a filter on the connection. The \a filter must implement the IrcMessageFilter interface. - - A message filter receives all messages that are sent to the connection. The filter - receives messages via the \ref IrcMessageFilter::messageFilter() "messageFilter()" - function. The function must return \c true if the message should be filtered, - (i.e. stopped); otherwise it must return \c false. - - If multiple message filters are installed on the same connection, the filter - that was installed last is activated first. - - \sa removeMessageFilter() - */ -void IrcConnection::installMessageFilter(QObject* filter) -{ - Q_D(IrcConnection); - IrcMessageFilter* msgFilter = qobject_cast(filter); - if (msgFilter) { - d->messageFilters += filter; - connect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(_irc_filterDestroyed(QObject*)), Qt::UniqueConnection); - } -} - -/*! - Removes a message \a filter from the connection. - - The request is ignored if such message filter has not been installed. - All message filters for a connection are automatically removed - when the connection is destroyed. - - \sa installMessageFilter() - */ -void IrcConnection::removeMessageFilter(QObject* filter) -{ - Q_D(IrcConnection); - IrcMessageFilter* msgFilter = qobject_cast(filter); - if (msgFilter) { - d->messageFilters.removeAll(filter); - disconnect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(_irc_filterDestroyed(QObject*))); - } -} - -/*! - Installs a command \a filter on the connection. The \a filter must implement the IrcCommandFilter interface. - - A command filter receives all commands that are sent from the connection. The filter - receives commands via the \ref IrcCommandFilter::commandFilter() "commandFilter()" - function. The function must return \c true if the command should be filtered, - (i.e. stopped); otherwise it must return \c false. - - If multiple command filters are installed on the same connection, the filter - that was installed last is activated first. - - \sa removeCommandFilter() - */ -void IrcConnection::installCommandFilter(QObject* filter) -{ - Q_D(IrcConnection); - IrcCommandFilter* cmdFilter = qobject_cast(filter); - if (cmdFilter) { - d->commandFilters += filter; - connect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(_irc_filterDestroyed(QObject*)), Qt::UniqueConnection); - } -} - -/*! - Removes a command \a filter from the connection. - - The request is ignored if such command filter has not been installed. - All command filters for a connection are automatically removed when - the connection is destroyed. - - \sa installCommandFilter() - */ -void IrcConnection::removeCommandFilter(QObject* filter) -{ - Q_D(IrcConnection); - IrcCommandFilter* cmdFilter = qobject_cast(filter); - if (cmdFilter) { - d->commandFilters.removeAll(filter); - disconnect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(_irc_filterDestroyed(QObject*))); - } -} - -/*! - \since 3.1 - - Saves the state of the connection. The \a version number is stored as part of the state data. - - To restore the saved state, pass the return value and \a version number to restoreState(). - */ -QByteArray IrcConnection::saveState(int version) const -{ - QVariantMap args; - args.insert("version", version); - args.insert("host", host()); - args.insert("port", port()); - args.insert("userName", userName()); - args.insert("nickName", nickName()); - args.insert("realName", realName()); - args.insert("password", password()); - args.insert("displayName", displayName()); - args.insert("userData", userData()); - args.insert("encoding", encoding()); - args.insert("enabled", isEnabled()); - args.insert("reconnectDelay", reconnectDelay()); - args.insert("secure", isSecure()); - args.insert("saslMechanism", saslMechanism()); - - QByteArray state; - QDataStream out(&state, QIODevice::WriteOnly); - out << args; - return state; -} - -/*! - \since 3.1 - - Restores the \a state of the connection. The \a version number is compared with that stored in \a state. - If they do not match, the connection state is left unchanged, and this function returns \c false; otherwise, - the state is restored, and \c true is returned. - - \sa saveState() - */ -bool IrcConnection::restoreState(const QByteArray& state, int version) -{ - if (isActive()) - return false; - - QVariantMap args; - QDataStream in(state); - in >> args; - if (in.status() != QDataStream::Ok || args.value("version", -1).toInt() != version) - return false; - - setHost(args.value("host", host()).toString()); - setPort(args.value("port", port()).toInt()); - setUserName(args.value("userName", userName()).toString()); - setNickName(args.value("nickName", nickName()).toString()); - setRealName(args.value("realName", realName()).toString()); - setPassword(args.value("password", password()).toString()); - setDisplayName(args.value("displayName").toString()); - setUserData(args.value("userData", userData()).toMap()); - setEncoding(args.value("encoding", encoding()).toByteArray()); - setEnabled(args.value("enabled", isEnabled()).toBool()); - setReconnectDelay(args.value("reconnectDelay", reconnectDelay()).toInt()); - setSecure(args.value("secure", isSecure()).toBool()); - setSaslMechanism(args.value("saslMechanism", saslMechanism()).toString()); - return true; -} - -/*! - Creates a reply command for the CTCP \a request. - - The default implementation handles the following CTCP requests: CLIENTINFO, PING, SOURCE, TIME and VERSION. - - Reimplement this function in order to alter or omit the default replies. - */ -IrcCommand* IrcConnection::createCtcpReply(IrcPrivateMessage* request) const -{ - QString reply; - QString type = request->content().split(" ", QString::SkipEmptyParts).value(0).toUpper(); - if (type == "PING") - reply = request->content(); - else if (type == "TIME") - reply = QLatin1String("TIME ") + QLocale().toString(QDateTime::currentDateTime(), QLocale::ShortFormat); - else if (type == "VERSION") - reply = QLatin1String("VERSION Using libcommuni ") + Irc::version() + QLatin1String(" - http://communi.github.com"); - else if (type == "SOURCE") - reply = QLatin1String("SOURCE http://communi.github.com"); - else if (type == "CLIENTINFO") - reply = QLatin1String("CLIENTINFO PING SOURCE TIME VERSION"); - if (!reply.isEmpty()) - return IrcCommand::createCtcpReply(request->nick(), reply); - return 0; -} - -/*! - \since 3.2 - - This property holds the protocol. - - The previously set protocol is deleted if its parent is \c this. - - \par Access functions: - \li \ref IrcProtocol* protocol() const - \li void setProtocol(\ref IrcProtocol* protocol) - */ -IrcProtocol* IrcConnection::protocol() const -{ - Q_D(const IrcConnection); - return d->protocol; -} - -void IrcConnection::setProtocol(IrcProtocol* proto) -{ - Q_D(IrcConnection); - if (d->protocol != proto) { - if (d->protocol && d->protocol->parent() == this) - delete d->protocol; - d->protocol = proto; - } -} - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug debug, IrcConnection::Status status) -{ - const int index = IrcConnection::staticMetaObject.indexOfEnumerator("Status"); - QMetaEnum enumerator = IrcConnection::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(status); - debug << (key ? key : "Unknown"); - return debug; -} - -QDebug operator<<(QDebug debug, const IrcConnection* connection) -{ - if (!connection) - return debug << "IrcConnection(0x0) "; - debug.nospace() << connection->metaObject()->className() << '(' << (void*) connection; - if (!connection->displayName().isEmpty()) - debug.nospace() << ", " << qPrintable(connection->displayName()); - debug.nospace() << ')'; - return debug.space(); -} -#endif // QT_NO_DEBUG_STREAM - -#include "moc_ircconnection.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/irccore.cpp b/libcommuni/src/core/irccore.cpp deleted file mode 100644 index f6453c8..0000000 --- a/libcommuni/src/core/irccore.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "irccore.h" - -IRC_BEGIN_NAMESPACE - -/*! - \file irccore.h - \brief \#include <IrcCore> - */ - -/*! - \namespace IrcCore - \ingroup core - \brief Module meta-type registration. - */ - -namespace IrcCore { - - /*! - Registers IrcCore types to the %Qt meta-system. - - \sa IrcModel::registerMetaTypes(), IrcUtil::registerMetaTypes(), qRegisterMetaType() - */ - void registerMetaTypes() - { - qRegisterMetaType("Irc::Color"); - qRegisterMetaType("Irc::DataRole"); - qRegisterMetaType("Irc::SortMethod"); - qRegisterMetaType("Irc::Code"); - - qRegisterMetaType("IrcConnection*"); - qRegisterMetaType("IrcConnection::Status"); - - qRegisterMetaType("IrcNetwork*"); - - qRegisterMetaType("IrcCommand*"); - qRegisterMetaType("IrcCommand::Type"); - - qRegisterMetaType("IrcMessage*"); - qRegisterMetaType("IrcMessage::Type"); - - qRegisterMetaType("IrcCapabilityMessage*"); - qRegisterMetaType("IrcErrorMessage*"); - qRegisterMetaType("IrcInviteMessage*"); - qRegisterMetaType("IrcJoinMessage*"); - qRegisterMetaType("IrcKickMessage*"); - qRegisterMetaType("IrcModeMessage*"); - qRegisterMetaType("IrcNamesMessage*"); - qRegisterMetaType("IrcNickMessage*"); - qRegisterMetaType("IrcNoticeMessage*"); - qRegisterMetaType("IrcNumericMessage*"); - qRegisterMetaType("IrcMotdMessage*"); - qRegisterMetaType("IrcPartMessage*"); - qRegisterMetaType("IrcPingMessage*"); - qRegisterMetaType("IrcPongMessage*"); - qRegisterMetaType("IrcPrivateMessage*"); - qRegisterMetaType("IrcQuitMessage*"); - qRegisterMetaType("IrcTopicMessage*"); - qRegisterMetaType("IrcWhoReplyMessage*"); - } -} - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircfilter.cpp b/libcommuni/src/core/ircfilter.cpp deleted file mode 100644 index 054badb..0000000 --- a/libcommuni/src/core/ircfilter.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircfilter.h" - -IRC_BEGIN_NAMESPACE - -/*! - \file ircfilter.h - \brief \#include <\ref ircfilter.h "IrcFilter"> - */ - -/*! - \file ircmessagefilter.h - \brief \#include <IrcMessageFilter> - */ - -/*! - \file irccommandfilter.h - \brief \#include <IrcCommandFilter> - */ - -/*! - \class IrcMessageFilter ircfilter.h - \ingroup core - \brief Provides an interface for filtering messages - - IrcMessageFilter may be used to intercept messages before - IrcConnection::messageReceived() is emitted and the messages get delivered - further. In order to use IrcMessageFilter, it must be installed via - IrcConnection::installMessageFilter(). - - Message filtering is mostly useful for handling specific replies before - the rest of the application receives it. This way there is no need to - for example ignore and hide such replies later in the application code. - - The following example sends a PING command after each PRIVMSG command. - A consequent PONG reply from the server verifies that the PRIVMSG has - been also processed. - - \code - class CommandVerifier : public QObject, - public IrcCommandFilter, - public IrcMessageFilter - { - Q_OBJECT - Q_INTERFACES(IrcCommandFilter IrcMessageFilter) - - public: - CommandVerifier(IrcConnection* parent) : - QObject(parent), identifier(0), connection(parent) - { - connection->installMessageFilter(this); - connection->installCommandFilter(this); - } - - virtual bool commandFilter(IrcCommand* cmd) - { - if (cmd->type() == IrcCommand::Message) { - cmd->setParent(this); // take ownership - connection->sendCommand(cmd); - commands.insert(++identifier, cmd); - connection->sendData("PING communi/" + QByteArray::number(identifier)); - return true; - } - return false; - } - - virtual bool messageFilter(IrcMessage* msg) - { - if (msg->type() == IrcMessage::Pong) { - QString arg = static_cast(msg)->argument(); - if (arg.startsWith("communi/")) { - bool ok = false; - quint64 id = arg.mid(8).toULongLong(&ok); - if (ok) { - IrcCommand* command = commands.take(id); - if (command) { - emit verified(command); - command->deleteLater(); - return true; - } - } - } - } - return false; - } - - signals: - void verified(IrcCommand* cmd); - - private: - quint64 identifier; - IrcConnection* connection; - QMap commands; - }; - \endcode - - \sa IrcConnection::installMessageFilter(), IrcCommandFilter - */ - -/*! - \fn IrcMessageFilter::~IrcMessageFilter() - Destructs the message filter. - - The message filter is automatically removed from any connection(s) - it is installed on. - - \sa IrcConnection::removeMessageFilter() - */ - -/*! - \fn virtual bool IrcMessageFilter::messageFilter(IrcMessage* message) = 0 - - Reimplement this function to filter messages from installed connections. - - Return \c true to filter the message out, i.e. stop it being handled further; - otherwise return \c false. - - \sa IrcConnection::installMessageFilter() - */ - -/*! - \class IrcCommandFilter ircfilter.h - \ingroup core - \brief Provides an interface for filtering commands - - IrcCommandFilter may be used to intercept commands before they - get sent further. In order to use IrcCommandFilter, it must be - installed via IrcConnection::installCommandFilter(). - - Command filtering can be useful doing extra tasks for specific - type of commands. The following example sends a PING command - after each PRIVMSG command. A consequent PONG reply from the - server verifies that the PRIVMSG has been also processed. - - \code - class CommandVerifier : public QObject, - public IrcCommandFilter, - public IrcMessageFilter - { - Q_OBJECT - Q_INTERFACES(IrcCommandFilter IrcMessageFilter) - - public: - CommandVerifier(IrcConnection* parent) : - QObject(parent), identifier(0), connection(parent) - { - connection->installMessageFilter(this); - connection->installCommandFilter(this); - } - - virtual bool commandFilter(IrcCommand* cmd) - { - if (cmd->type() == IrcCommand::Message) { - cmd->setParent(this); // take ownership - connection->sendCommand(cmd); - commands.insert(++identifier, cmd); - connection->sendData("PING communi/" + QByteArray::number(identifier)); - return true; - } - return false; - } - - virtual bool messageFilter(IrcMessage* msg) - { - if (msg->type() == IrcMessage::Pong) { - QString arg = static_cast(msg)->argument(); - if (arg.startsWith("communi/")) { - bool ok = false; - quint64 id = arg.mid(8).toULongLong(&ok); - if (ok) { - IrcCommand* command = commands.take(id); - if (command) { - emit verified(command); - command->deleteLater(); - return true; - } - } - } - } - return false; - } - - signals: - void verified(IrcCommand* cmd); - - private: - quint64 identifier; - IrcConnection* connection; - QMap commands; - }; - \endcode - - \note Notice that it is safe to call IrcConnection::sendCommand() - from IrcCommandFilter::commandFilter(). Such commands won't get - delivered back to the \b same filter to avoid recursion. - - \sa IrcConnection::installCommandFilter(), IrcMessageFilter - */ - -/*! - \fn IrcCommandFilter::~IrcCommandFilter() - Destructs the command filter. - - The command filter is automatically removed from any connection(s) - it is installed on. - - \sa IrcConnection::removeCommandFilter() - */ - -/*! - \fn virtual bool IrcCommandFilter::commandFilter(IrcCommand* command) = 0 - - Reimplement this function to filter commands to installed connections. - - Return \c true to filter the command out, i.e. stop it being handled further; - otherwise return \c false. - - \sa IrcConnection::installCommandFilter() - */ - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircmessage.cpp b/libcommuni/src/core/ircmessage.cpp deleted file mode 100644 index eaca6ab..0000000 --- a/libcommuni/src/core/ircmessage.cpp +++ /dev/null @@ -1,1604 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircmessage.h" -#include "ircmessage_p.h" -#include "ircconnection.h" -#include "ircconnection_p.h" -#include "ircnetwork.h" -#include "irccommand.h" -#include "irc.h" -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file ircmessage.h - \brief \#include <IrcMessage> - */ - -/*! - \class IrcMessage ircmessage.h - \ingroup core - \ingroup message - \brief The base class of all messages. - - IRC messages are received from an IRC server. IrcConnection translates received - messages into IrcMessage instances and emits the IrcConnection::messageReceived() - signal upon message received. - - Subclasses of IrcMessage contain specialized accessors for parameters that - are specific to the particular type of message. See IrcMessage::Type for - the list of supported message types. - - \sa IrcConnection::messageReceived(), IrcMessage::Type - */ - -/*! - \enum IrcMessage::Type - This enum describes the supported message types. - */ - -/*! - \var IrcMessage::Unknown - \brief An unknown message (IrcMessage). - */ - -/*! - \var IrcMessage::Capability - \brief A capability message (IrcCapabilityMessage). - */ - -/*! - \var IrcMessage::Error - \brief An error message (IrcErrorMessage). - */ - -/*! - \var IrcMessage::Invite - \brief An invite message (IrcInviteMessage). - */ - -/*! - \var IrcMessage::Join - \brief A join message (IrcJoinMessage). - */ - -/*! - \var IrcMessage::Kick - \brief A kick message (IrcKickMessage). - */ - -/*! - \var IrcMessage::Mode - \brief A mode message (IrcModeMessage). - */ - -/*! - \var IrcMessage::Motd - \brief A message of the day (IrcMotdMessage). - */ - -/*! - \var IrcMessage::Names - \brief A names message (IrcNamesMessage). - */ - -/*! - \var IrcMessage::Nick - \brief A nick message (IrcNickMessage). - */ - -/*! - \var IrcMessage::Notice - \brief A notice message (IrcNoticeMessage). - */ - -/*! - \var IrcMessage::Numeric - \brief A numeric message (IrcNumericMessage). - */ - -/*! - \var IrcMessage::Part - \brief A part message (IrcPartMessage). - */ - -/*! - \var IrcMessage::Ping - \brief A ping message (IrcPingMessage). - */ - -/*! - \var IrcMessage::Pong - \brief A pong message (IrcPongMessage). - */ - -/*! - \var IrcMessage::Private - \brief A private message (IrcPrivateMessage). - */ - -/*! - \var IrcMessage::Quit - \brief A quit message (IrcQuitMessage). - */ - -/*! - \var IrcMessage::Topic - \brief A topic message (IrcTopicMessage). - */ - -/*! - \enum IrcMessage::Flag - This enum describes the supported message flags. - */ - -/*! - \var IrcMessage::None - \brief The message has no flags. - */ - -/*! - \var IrcMessage::Own - \brief The message is user's own message. - */ - -/*! - \var IrcMessage::Identified - \brief The message is identified. - */ - -/*! - \var IrcMessage::Unidentified - \brief The message is unidentified. - */ - -/*! - \since 3.2 - \var IrcMessage::Playback - \brief The message is playback. - */ - -static const QMetaObject* irc_command_meta_object(const QString& command) -{ - static QHash metaObjects; - if (metaObjects.isEmpty()) { - metaObjects.insert("CAP", &IrcCapabilityMessage::staticMetaObject); - metaObjects.insert("ERROR", &IrcErrorMessage::staticMetaObject); - metaObjects.insert("INVITE", &IrcInviteMessage::staticMetaObject); - metaObjects.insert("JOIN", &IrcJoinMessage::staticMetaObject); - metaObjects.insert("KICK", &IrcKickMessage::staticMetaObject); - metaObjects.insert("MODE", &IrcModeMessage::staticMetaObject); - metaObjects.insert("NICK", &IrcNickMessage::staticMetaObject); - metaObjects.insert("NOTICE", &IrcNoticeMessage::staticMetaObject); - metaObjects.insert("PART", &IrcPartMessage::staticMetaObject); - metaObjects.insert("PING", &IrcPingMessage::staticMetaObject); - metaObjects.insert("PONG", &IrcPongMessage::staticMetaObject); - metaObjects.insert("PRIVMSG", &IrcPrivateMessage::staticMetaObject); - metaObjects.insert("QUIT", &IrcQuitMessage::staticMetaObject); - metaObjects.insert("TOPIC", &IrcTopicMessage::staticMetaObject); - } - - const QMetaObject* metaObject = metaObjects.value(command.toUpper()); - if (!metaObject) { - bool ok = false; - command.toInt(&ok); - if (ok) - metaObject = &IrcNumericMessage::staticMetaObject; - } - if (!metaObject) - metaObject = &IrcMessage::staticMetaObject; - return metaObject; -} - -/*! - Constructs a new IrcMessage with \a connection. - */ -IrcMessage::IrcMessage(IrcConnection* connection) : QObject(connection), d_ptr(new IrcMessagePrivate) -{ - Q_D(IrcMessage); - d->connection = connection; -} - -/*! - Destructs the message. - */ -IrcMessage::~IrcMessage() -{ -} - -/*! - This property holds the message connection. - - \par Access function: - \li \ref IrcConnection* connection() const - */ -IrcConnection* IrcMessage::connection() const -{ - Q_D(const IrcMessage); - return d->connection; -} - -/*! - This property holds the message network. - - \par Access function: - \li \ref IrcNetwork* network() const - */ -IrcNetwork* IrcMessage::network() const -{ - Q_D(const IrcMessage); - return d->connection ? d->connection->network() : 0; -} - -/*! - This property holds the message type. - - \par Access function: - \li \ref IrcMessage::Type type() const - */ -IrcMessage::Type IrcMessage::type() const -{ - Q_D(const IrcMessage); - return d->type; -} - -/*! - \since 3.2 - \property bool IrcMessage::own - - This property holds whether the message is user's own. - - This property is provided for convenience. It is equivalent - of testing for the IrcMessage::Own flag. - - \par Access function: - \li bool isOwn() const - */ -bool IrcMessage::isOwn() const -{ - return flags() & Own; -} - -/*! - This property holds the message flags. - - \par Access function: - \li \ref IrcMessage::Flag "IrcMessage::Flags" flags() const - \li void setFlags(\ref IrcMessage::Flag "IrcMessage::Flags" flags) (\b Since 3.2) - */ -IrcMessage::Flags IrcMessage::flags() const -{ - Q_D(const IrcMessage); - if (d->flags == -1) { - d->flags = IrcMessage::None; - if (d->connection) { - if (!d->prefix().isEmpty() && d->nick() == d->connection->nickName()) - d->flags |= IrcMessage::Own; - - if ((d->type == IrcMessage::Private || d->type == IrcMessage::Notice) && - network()->activeCapabilities().contains("identify-msg")) { - QString msg = property("content").toString(); - if (msg.startsWith("+")) - d->flags |= IrcMessage::Identified; - else if (msg.startsWith("-")) - d->flags |= IrcMessage::Unidentified; - } - } - } - return IrcMessage::Flags(d->flags); -} - -void IrcMessage::setFlags(IrcMessage::Flags flags) -{ - Q_D(IrcMessage); - d->flags = flags; -} - -/*! - This property holds the message command. - - \par Access functions: - \li QString command() const - \li void setCommand(const QString& command) - */ -QString IrcMessage::command() const -{ - Q_D(const IrcMessage); - return d->command(); -} - -void IrcMessage::setCommand(const QString& command) -{ - Q_D(IrcMessage); - d->setCommand(command); -} - -/*! - This property holds the message sender prefix. - - The prefix consists of \ref nick, \ref ident and \ref host as specified in RFC 1459: -
-    <prefix> ::= <\ref nick> [ '!' <\ref ident> ] [ '@' <\ref host> ]
-    
- - \par Access functions: - \li QString prefix() const - \li void setPrefix(const QString& prefix) - */ -QString IrcMessage::prefix() const -{ - Q_D(const IrcMessage); - return d->prefix(); -} - -void IrcMessage::setPrefix(const QString& prefix) -{ - Q_D(IrcMessage); - d->setPrefix(prefix); -} - -/*! - This property holds the message sender nick. - - Nick is part of the sender \ref prefix as specified in RFC 1459: -
-    <nick> [ '!' <\ref ident> ] [ '@' <\ref host> ]
-    
- - \par Access function: - \li QString nick() const - */ -QString IrcMessage::nick() const -{ - Q_D(const IrcMessage); - return d->nick(); -} - -/*! - This property holds the message sender ident. - - Ident is part of the sender \ref prefix as specified in RFC 1459: -
-    <\ref nick> [ '!' <ident> ] [ '@' <\ref host> ]
-    
- - \par Access function: - \li QString ident() const - */ -QString IrcMessage::ident() const -{ - Q_D(const IrcMessage); - return d->ident(); -} - -/*! - This property holds the message sender host. - - Host is part of the sender \ref prefix as specified in RFC 1459: -
-    <\ref nick> [ '!' <\ref ident> ] [ '@' <host> ]
-    
- - \par Access function: - \li QString host() const - */ -QString IrcMessage::host() const -{ - Q_D(const IrcMessage); - return d->host(); -} - -/*! - This property holds the message parameters. - - \par Access functions: - \li QStringList parameters() const - \li void setParameters(const QStringList& parameters) - */ -QStringList IrcMessage::parameters() const -{ - Q_D(const IrcMessage); - return d->params(); -} - -void IrcMessage::setParameters(const QStringList& parameters) -{ - Q_D(IrcMessage); - d->setParams(parameters); -} - -/*! - This property holds the message time stamp. - - \par Access functions: - \li QDateTime timeStamp() const - \li void setTimeStamp(const QDateTime& timeStamp) - */ -QDateTime IrcMessage::timeStamp() const -{ - Q_D(const IrcMessage); - return d->timeStamp; -} - -void IrcMessage::setTimeStamp(const QDateTime& timeStamp) -{ - Q_D(IrcMessage); - d->timeStamp = timeStamp; -} - -/*! - This property holds the FALLBACK encoding for the message. - - The fallback encoding is used when the message is detected not - to be valid UTF-8 and the consequent auto-detection of message - encoding fails. See QTextCodec::availableCodes() for the list of - supported encodings. - - The default value is ISO-8859-15. - - \par Access functions: - \li QByteArray encoding() const - \li void setEncoding(const QByteArray& encoding) - - \sa QTextCodec::availableCodecs(), QTextCodec::codecForLocale() - */ -QByteArray IrcMessage::encoding() const -{ - Q_D(const IrcMessage); - return d->encoding; -} - -void IrcMessage::setEncoding(const QByteArray& encoding) -{ - Q_D(IrcMessage); - extern bool irc_is_supported_encoding(const QByteArray& encoding); // ircmessagedecoder.cpp - if (!irc_is_supported_encoding(encoding)) { - qWarning() << "IrcMessage::setEncoding(): unsupported encoding" << encoding; - return; - } - d->encoding = encoding; - d->invalidate(); -} - -/*! - \since 3.1 - - This property holds the message tags. - - \par Access functions: - \li QVariantMap tags() const - \li void setTags(const QVariantMap& tags) - - \sa IRCv3.2 Message Tags - */ -QVariantMap IrcMessage::tags() const -{ - Q_D(const IrcMessage); - return d->tags(); -} - -void IrcMessage::setTags(const QVariantMap& tags) -{ - Q_D(IrcMessage); - d->setTags(tags); -} - -/*! - Creates a new message from \a data and \a connection. - */ -IrcMessage* IrcMessage::fromData(const QByteArray& data, IrcConnection* connection) -{ - IrcMessage* message = 0; - IrcMessageData md = IrcMessageData::fromData(data); - const QMetaObject* metaObject = irc_command_meta_object(md.command); - if (metaObject) { - message = qobject_cast(metaObject->newInstance(Q_ARG(IrcConnection*, connection))); - Q_ASSERT(message); - message->d_ptr->data = md; - } - return message; -} - -/*! - Creates a new message from \a prefix, \a command and \a parameters with \a connection. - */ -IrcMessage* IrcMessage::fromParameters(const QString& prefix, const QString& command, const QStringList& parameters, IrcConnection* connection) -{ - IrcMessage* message = 0; - const QMetaObject* metaObject = irc_command_meta_object(command); - if (metaObject) { - message = qobject_cast(metaObject->newInstance(Q_ARG(IrcConnection*, connection))); - Q_ASSERT(message); - message->setPrefix(prefix); - message->setCommand(command); - message->setParameters(parameters); - } - return message; -} - -/*! - \property bool IrcMessage::valid - This property is \c true if the message is valid; otherwise \c false. - - A message is considered valid if the prefix is not empty - and the parameters match the message. - - \par Access function: - \li bool isValid() const - */ -bool IrcMessage::isValid() const -{ - Q_D(const IrcMessage); - return d->connection && !prefix().isNull(); -} - -/*! - Returns the message as received from an IRC server. - */ -QByteArray IrcMessage::toData() const -{ - Q_D(const IrcMessage); - return d->content(); -} - -/*! - \class IrcCapabilityMessage ircmessage.h - \ingroup message - \brief Represents a capability message. - */ - -/*! - Constructs a new IrcCapabilityMessage with \a connection. - */ -IrcCapabilityMessage::IrcCapabilityMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Capability; -} - -/*! - This property holds the subcommand. - - The following capability subcommands are defined: - LS, LIST, REQ, ACK, NAK, CLEAR, END - - \par Access function: - \li QString subCommand() const - */ -QString IrcCapabilityMessage::subCommand() const -{ - Q_D(const IrcMessage); - return d->param(1); -} - -/*! - This property holds the capabilities. - - A list of capabilities may exist for the following - subcommands: LS, LIST, REQ, ACK and NAK. - - \par Access function: - \li QStringList capabilities() const - */ -QStringList IrcCapabilityMessage::capabilities() const -{ - Q_D(const IrcMessage); - QStringList caps; - QStringList params = d->params(); - if (params.count() > 2) - caps = params.last().split(QLatin1Char(' '), QString::SkipEmptyParts); - return caps; -} - -bool IrcCapabilityMessage::isValid() const -{ - return IrcMessage::isValid(); -} - -/*! - \class IrcErrorMessage ircmessage.h - \ingroup message - \brief Represents an error message. - */ - -/*! - Constructs a new IrcErrorMessage with \a connection. - */ -IrcErrorMessage::IrcErrorMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Error; -} - -/*! - This property holds the error. - - \par Access function: - \li QString error() const - */ -QString IrcErrorMessage::error() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -bool IrcErrorMessage::isValid() const -{ - return IrcMessage::isValid() && !error().isEmpty(); -} - -/*! - \class IrcInviteMessage ircmessage.h - \ingroup message - \brief Represents an invite message. - */ - -/*! - Constructs a new IrcInviteMessage with \a connection. - */ -IrcInviteMessage::IrcInviteMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Invite; -} - -/*! - This property holds the user in question. - - \par Access function: - \li QString user() const - */ -QString IrcInviteMessage::user() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -/*! - This property holds the channel in question. - - \par Access function: - \li QString channel() const - */ -QString IrcInviteMessage::channel() const -{ - Q_D(const IrcMessage); - return d->param(1); -} - -bool IrcInviteMessage::isValid() const -{ - return IrcMessage::isValid() && !user().isEmpty() && !channel().isEmpty(); -} - -/*! - \class IrcJoinMessage ircmessage.h - \ingroup message - \brief Represents a join message. - */ - -/*! - Constructs a new IrcJoinMessage with \a connection. - */ -IrcJoinMessage::IrcJoinMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Join; -} - -/*! - This property holds the channel in question. - - \par Access function: - \li QString channel() const - */ -QString IrcJoinMessage::channel() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -bool IrcJoinMessage::isValid() const -{ - return IrcMessage::isValid() && !channel().isEmpty(); -} - -/*! - \class IrcKickMessage ircmessage.h - \ingroup message - \brief Represents a kick message. - */ - -/*! - Constructs a new IrcKickMessage with \a connection. - */ -IrcKickMessage::IrcKickMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Kick; -} - -/*! - This property holds the channel in question. - - \par Access function: - \li QString channel() const - */ -QString IrcKickMessage::channel() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -/*! - This property holds the user in question. - - \par Access function: - \li QString user() const - */ -QString IrcKickMessage::user() const -{ - Q_D(const IrcMessage); - return d->param(1); -} - -/*! - This property holds the optional kick reason. - - \par Access function: - \li QString reason() const - */ -QString IrcKickMessage::reason() const -{ - Q_D(const IrcMessage); - return d->param(2); -} - -bool IrcKickMessage::isValid() const -{ - return IrcMessage::isValid() && !channel().isEmpty() && !user().isEmpty(); -} - -/*! - \class IrcModeMessage ircmessage.h - \ingroup message - \brief Represents a mode message. - */ - -/*! - \enum IrcModeMessage::Kind - This enum describes the kind of modes. - */ - -/*! - \var IrcModeMessage::Channel - \brief Channel mode - */ - -/*! - \var IrcModeMessage::User - \brief User mode - */ - -/*! - Constructs a new IrcModeMessage with \a connection. - */ -IrcModeMessage::IrcModeMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Mode; -} - -/*! - This property holds the target channel or user in question. - - \par Access function: - \li QString target() const - */ -QString IrcModeMessage::target() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -/*! - This property holds the channel or user mode. - - \par Access function: - \li QString mode() const - */ -QString IrcModeMessage::mode() const -{ - Q_D(const IrcMessage); - return d->param(1); -} - -/*! - This property holds the first mode argument. - - \par Access function: - \li QString argument() const - */ -QString IrcModeMessage::argument() const -{ - Q_D(const IrcMessage); - return d->param(2); -} - -/*! - \since 3.1 - - This property holds the all mode arguments. - - \par Access function: - \li QStringList arguments() const - */ -QStringList IrcModeMessage::arguments() const -{ - Q_D(const IrcMessage); - return d->params().mid(2); -} - -/*! - This property holds whether the message is a reply. - - Mode messages are sent when a mode changes (\c false) - and when joining a channel (\c true). - - \par Access function: - \li bool isReply() const - - \sa Irc::RPL_CHANNELMODEIS - */ -bool IrcModeMessage::isReply() const -{ - Q_D(const IrcMessage); - int rpl = d->command().toInt(); - return rpl == Irc::RPL_CHANNELMODEIS; -} - -/*! - This property holds the kind of the mode. - - \par Access function: - \li Kind kind() const - */ -IrcModeMessage::Kind IrcModeMessage::kind() const -{ - Q_D(const IrcMessage); - const IrcNetwork* network = d->connection->network(); - const QStringList channelModes = network->channelModes(IrcNetwork::AllTypes); - const QString m = mode().remove(QLatin1Char('+')).remove(QLatin1Char('-')); - for (int i = 0; i < m.length(); ++i) { - if (!channelModes.contains(m.at(i))) - return User; - } - return Channel; -} - -bool IrcModeMessage::isValid() const -{ - return IrcMessage::isValid() && !target().isEmpty() && !mode().isEmpty(); -} - -/*! - \class IrcMotdMessage ircmessage.h - \ingroup message - \brief Represents a message of the day. - */ - -/*! - Constructs a new IrcMotdMessage with \a connection. - */ -IrcMotdMessage::IrcMotdMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Motd; - setCommand(QLatin1String("MOTD")); -} - -/*! - This property holds the message of the day lines. - - \par Access function: - \li QStringList lines() const - */ -QStringList IrcMotdMessage::lines() const -{ - Q_D(const IrcMessage); - return d->params().mid(1); -} - -bool IrcMotdMessage::isValid() const -{ - Q_D(const IrcMessage); - return IrcMessage::isValid() && !d->params().isEmpty(); -} - -/*! - \class IrcNamesMessage ircmessage.h - \ingroup message - \brief Represents a names list message. - */ - -/*! - Constructs a new IrcNamesMessage with \a connection. - */ -IrcNamesMessage::IrcNamesMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Names; - setCommand(QLatin1String("NAMES")); -} - -/*! - This property holds the channel. - - \par Access function: - \li QString channel() const - */ -QString IrcNamesMessage::channel() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -/*! - This property holds the list of names. - - \par Access function: - \li QStringList names() const - */ -QStringList IrcNamesMessage::names() const -{ - Q_D(const IrcMessage); - return d->params().mid(1); -} - -bool IrcNamesMessage::isValid() const -{ - Q_D(const IrcMessage); - return IrcMessage::isValid() && !d->params().isEmpty(); -} - -/*! - \class IrcNickMessage ircmessage.h - \ingroup message - \brief Represents a nick message. - */ - -/*! - Constructs a new IrcNickMessage with \a connection. - */ -IrcNickMessage::IrcNickMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Nick; -} - -/*! - This property holds the old nick. - - This property is provided for symmetry with \ref newNick - and is equal to \ref nick. - - \par Access function: - \li QString oldNick() const - */ -QString IrcNickMessage::oldNick() const -{ - Q_D(const IrcMessage); - return d->nick(); -} - -/*! - This property holds the new nick. - - \par Access function: - \li QString newNick() const - */ -QString IrcNickMessage::newNick() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -bool IrcNickMessage::isValid() const -{ - return IrcMessage::isValid() && !newNick().isEmpty(); -} - -/*! - \class IrcNoticeMessage ircmessage.h - \ingroup message - \brief Represents a notice message. - */ - -/*! - Constructs a new IrcNoticeMessage with \a connection. - */ -IrcNoticeMessage::IrcNoticeMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Notice; -} - -/*! - This property holds the target channel or user in question. - - \par Access function: - \li QString target() const - */ -QString IrcNoticeMessage::target() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -/*! - This property holds the message content. - - \par Access function: - \li QString content() const - */ -QString IrcNoticeMessage::content() const -{ - Q_D(const IrcMessage); - QString msg = d->param(1); - if (flags() & (Identified | Unidentified)) - msg.remove(0, 1); - if (isReply()) { - msg.remove(0, 1); - msg.chop(1); - } - return msg; -} - -/*! - \property bool IrcNoticeMessage::private - This property is \c true if the notice is private, - or \c false if it is a channel notice. - - \par Access function: - \li bool isPrivate() const - */ -bool IrcNoticeMessage::isPrivate() const -{ - Q_D(const IrcMessage); - if (d->connection) - return !target().compare(d->connection->nickName(), Qt::CaseInsensitive); - return false; -} - -/*! - \property bool IrcNoticeMessage::reply - This property is \c true if the message is a reply; otherwise \c false. - - \par Access function: - \li bool isReply() const - */ -bool IrcNoticeMessage::isReply() const -{ - Q_D(const IrcMessage); - QString msg = d->param(1); - return msg.startsWith('\1') && msg.endsWith('\1'); -} - -bool IrcNoticeMessage::isValid() const -{ - return IrcMessage::isValid() && !target().isEmpty() && !content().isEmpty(); -} - -/*! - \class IrcNumericMessage ircmessage.h - \ingroup message - \brief Represents a numeric message. - */ - -/*! - Constructs a new IrcNumericMessage with \a connection. - */ -IrcNumericMessage::IrcNumericMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Numeric; -} - -/*! - This property holds the numeric code. - - \par Access function: - \li int code() const - */ -int IrcNumericMessage::code() const -{ - Q_D(const IrcMessage); - bool ok = false; - int number = d->command().toInt(&ok); - return ok ? number : -1; -} - -bool IrcNumericMessage::isValid() const -{ - return IrcMessage::isValid() && code() != -1; -} - -/*! - \class IrcPartMessage ircmessage.h - \ingroup message - \brief Represents a part message. - */ - -/*! - Constructs a new IrcPartMessage with \a connection. - */ -IrcPartMessage::IrcPartMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Part; -} - -/*! - This property holds the channel in question. - - \par Access function: - \li QString channel() const - */ -QString IrcPartMessage::channel() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -/*! - This property holds the optional part reason. - - \par Access function: - \li QString reason() const - */ -QString IrcPartMessage::reason() const -{ - Q_D(const IrcMessage); - return d->param(1); -} - -bool IrcPartMessage::isValid() const -{ - return IrcMessage::isValid() && !channel().isEmpty(); -} - -/*! - \class IrcPingMessage ircmessage.h - \ingroup message - \brief Represents a ping message. - */ - -/*! - Constructs a new IrcPingMessage with \a connection. - */ -IrcPingMessage::IrcPingMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Ping; -} - -/*! - This property holds the optional message argument. - - \par Access function: - \li QString argument() const - */ -QString IrcPingMessage::argument() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -bool IrcPingMessage::isValid() const -{ - return IrcMessage::isValid(); -} - -/*! - \class IrcPongMessage ircmessage.h - \ingroup message - \brief Represents a pong message. - */ - -/*! - Constructs a new IrcPongMessage with \a connection. - */ -IrcPongMessage::IrcPongMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Pong; -} - -/*! - This property holds the optional message argument. - - \par Access function: - \li QString argument() const - */ -QString IrcPongMessage::argument() const -{ - Q_D(const IrcMessage); - return d->param(1); -} - -bool IrcPongMessage::isValid() const -{ - return IrcMessage::isValid(); -} - -/*! - \class IrcPrivateMessage ircmessage.h - \ingroup message - \brief Represents a private message. - */ - -/*! - Constructs a new IrcPrivateMessage with \a connection. - */ -IrcPrivateMessage::IrcPrivateMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Private; -} - -/*! - This property holds the target channel or user in question. - - \par Access function: - \li QString target() const - */ -QString IrcPrivateMessage::target() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -/*! - This property holds the message content. - - \par Access function: - \li QString content() const - */ -QString IrcPrivateMessage::content() const -{ - Q_D(const IrcMessage); - QString msg = d->param(1); - if (flags() & (Identified | Unidentified)) - msg.remove(0, 1); - const bool act = isAction(); - const bool req = isRequest(); - if (act) msg.remove(0, 8); - if (req) msg.remove(0, 1); - if (act || req) msg.chop(1); - return msg; -} - -/*! - \property bool IrcPrivateMessage::private - This property is \c true if the message is private, - or \c false if it is a channel message. - - \par Access function: - \li bool isPrivate() const - */ -bool IrcPrivateMessage::isPrivate() const -{ - Q_D(const IrcMessage); - if (d->connection) - return !target().compare(d->connection->nickName(), Qt::CaseInsensitive); - return false; -} - -/*! - \property bool IrcPrivateMessage::action - This property is \c true if the message is an action; otherwise \c false. - - \par Access function: - \li bool isAction() const - */ -bool IrcPrivateMessage::isAction() const -{ - Q_D(const IrcMessage); - QString msg = d->param(1); - if (flags() & (Identified | Unidentified)) - msg.remove(0, 1); - return msg.startsWith("\1ACTION ") && msg.endsWith('\1'); -} - -/*! - \property bool IrcPrivateMessage::request - This property is \c true if the message is a request; otherwise \c false. - - \par Access function: - \li bool isRequest() const - */ -bool IrcPrivateMessage::isRequest() const -{ - Q_D(const IrcMessage); - QString msg = d->param(1); - if (flags() & (Identified | Unidentified)) - msg.remove(0, 1); - return msg.startsWith('\1') && msg.endsWith('\1') && !isAction(); -} - -bool IrcPrivateMessage::isValid() const -{ - return IrcMessage::isValid() && !target().isEmpty() && !content().isEmpty(); -} - -/*! - \class IrcQuitMessage ircmessage.h - \ingroup message - \brief Represents a quit message. - */ - -/*! - Constructs a new IrcQuitMessage with \a connection. - */ -IrcQuitMessage::IrcQuitMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Quit; -} - -/*! - This property holds the optional quit reason. - - \par Access function: - \li QString reason() const - */ -QString IrcQuitMessage::reason() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -bool IrcQuitMessage::isValid() const -{ - return IrcMessage::isValid(); -} - -/*! - \class IrcTopicMessage ircmessage.h - \ingroup message - \brief Represents a topic message. - */ - -/*! - Constructs a new IrcTopicMessage with \a connection. - */ -IrcTopicMessage::IrcTopicMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = Topic; -} - -/*! - This property holds the channel in question. - - \par Access function: - \li QString channel() const - */ -QString IrcTopicMessage::channel() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -/*! - This property holds the new channel topic. - - \par Access function: - \li QString topic() const - */ -QString IrcTopicMessage::topic() const -{ - Q_D(const IrcMessage); - return d->param(1); -} - -/*! - This property holds whether the message is a reply. - - Topic messages are sent in three situations: - \li as a notification of a topic change (\c false), - \li as a reply when joining a channel (\c true), or - \li as a reply when explicitly querying the channel topic (\c true). - - \par Access function: - \li bool isReply() const - - \sa Irc::RPL_TOPIC, Irc::RPL_NOTOPIC, IrcTopicCommand - */ -bool IrcTopicMessage::isReply() const -{ - Q_D(const IrcMessage); - int rpl = d->command().toInt(); - return rpl == Irc::RPL_TOPIC || rpl == Irc::RPL_NOTOPIC; -} - -bool IrcTopicMessage::isValid() const -{ - return IrcMessage::isValid() && !channel().isEmpty(); -} - -/*! - \since 3.1 - \class IrcWhoReplyMessage ircmessage.h - \ingroup message - \brief Represents a reply message to a WHO command. - */ - -/*! - Constructs a new IrcWhoReplyMessage with \a connection. - */ -IrcWhoReplyMessage::IrcWhoReplyMessage(IrcConnection* connection) : IrcMessage(connection) -{ - Q_D(IrcMessage); - d->type = WhoReply; -} - -/*! - This property holds the mask. - - \par Access function: - \li QString mask() const - */ -QString IrcWhoReplyMessage::mask() const -{ - Q_D(const IrcMessage); - return d->param(0); -} - -/*! - This property holds the server of the user. - - \par Access function: - \li QString server() const - */ -QString IrcWhoReplyMessage::server() const -{ - Q_D(const IrcMessage); - return d->param(1); -} - -/*! - \property bool IrcWhoReplyMessage::away - This property holds whether the user is away. - - \par Access function: - \li QString isAway() const - */ -bool IrcWhoReplyMessage::isAway() const -{ - Q_D(const IrcMessage); - return d->param(2).contains("G"); -} - -/*! - \property bool IrcWhoReplyMessage::servOp - This property holds whether the user is a server operator. - - \par Access function: - \li QString isServOp() const - */ -bool IrcWhoReplyMessage::isServOp() const -{ - Q_D(const IrcMessage); - return d->param(2).contains("*"); -} - -/*! - This property holds the real name of the user. - - \par Access function: - \li QString realName() const - */ -QString IrcWhoReplyMessage::realName() const -{ - Q_D(const IrcMessage); - return d->param(3); -} - -bool IrcWhoReplyMessage::isValid() const -{ - return IrcMessage::isValid() && !mask().isEmpty() && !nick().isEmpty(); -} - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug debug, IrcMessage::Type type) -{ - const int index = IrcMessage::staticMetaObject.indexOfEnumerator("Type"); - QMetaEnum enumerator = IrcMessage::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(type); - debug << (key ? key : "Unknown"); - return debug; -} - -QDebug operator<<(QDebug debug, IrcMessage::Flag flag) -{ - const int index = IrcMessage::staticMetaObject.indexOfEnumerator("Flag"); - QMetaEnum enumerator = IrcMessage::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(flag); - debug << (key ? key : "None"); - return debug; -} - -QDebug operator<<(QDebug debug, IrcMessage::Flags flags) -{ - QStringList lst; - if (flags == IrcMessage::None) - lst << "None"; - if (flags & IrcMessage::Own) - lst << "Own"; - if (flags & IrcMessage::Identified) - lst << "Identified"; - if (flags & IrcMessage::Unidentified) - lst << "Unidentified"; - debug.nospace() << '(' << qPrintable(lst.join("|")) << ')'; - return debug; -} - -QDebug operator<<(QDebug debug, IrcModeMessage::Kind kind) -{ - const int index = IrcModeMessage::staticMetaObject.indexOfEnumerator("Kind"); - QMetaEnum enumerator = IrcModeMessage::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(kind); - debug << (key ? key : "Unknown"); - return debug; -} - -QDebug operator<<(QDebug debug, const IrcMessage* message) -{ - if (!message) - return debug << "IrcMessage(0x0) "; - debug.nospace() << message->metaObject()->className() << '(' << (void*) message; - if (!message->objectName().isEmpty()) - debug.nospace() << ", name=" << qPrintable(message->objectName()); - debug.nospace() << ", flags=" << message->flags(); - if (!message->prefix().isEmpty()) - debug.nospace() << ", prefix=" << qPrintable(message->prefix()); - if (!message->command().isEmpty()) - debug.nospace() << ", command=" << qPrintable(message->command()); - debug.nospace() << ')'; - return debug.space(); -} -#endif // QT_NO_DEBUG_STREAM - -#include "moc_ircmessage.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircmessage_p.cpp b/libcommuni/src/core/ircmessage_p.cpp deleted file mode 100644 index e5fdd24..0000000 --- a/libcommuni/src/core/ircmessage_p.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircmessage_p.h" -#include "ircmessagedecoder_p.h" - -IRC_BEGIN_NAMESPACE - -#ifndef IRC_DOXYGEN -IrcMessagePrivate::IrcMessagePrivate() : - connection(0), type(IrcMessage::Unknown), timeStamp(QDateTime::currentDateTime()), encoding("ISO-8859-15"), flags(-1) -{ -} - -QString IrcMessagePrivate::prefix() const -{ - if (!m_prefix.isExplicit() && m_prefix.isNull() && !data.prefix.isNull()) { - if (data.prefix.startsWith(':')) { - if (data.prefix.length() > 1) - m_prefix = decode(data.prefix.mid(1), encoding); - } else { - // empty (not null) - m_prefix = QString(""); - } - } - return m_prefix.value(); -} - -void IrcMessagePrivate::setPrefix(const QString& prefix) -{ - m_prefix.setValue(prefix); - m_nick.clear(); - m_ident.clear(); - m_host.clear(); -} - -QString IrcMessagePrivate::nick() const -{ - if (m_nick.isNull()) - parsePrefix(prefix(), &m_nick, &m_ident, &m_host); - return m_nick; -} - -QString IrcMessagePrivate::ident() const -{ - if (m_ident.isNull()) - parsePrefix(prefix(), &m_nick, &m_ident, &m_host); - return m_ident; -} - -QString IrcMessagePrivate::host() const -{ - if (m_host.isNull()) - parsePrefix(prefix(), &m_nick, &m_ident, &m_host); - return m_host; -} - -QString IrcMessagePrivate::command() const -{ - if (!m_command.isExplicit() && m_command.isNull() && !data.command.isNull()) - m_command = decode(data.command, encoding); - return m_command.value(); -} - -void IrcMessagePrivate::setCommand(const QString& command) -{ - m_command.setValue(command); -} - -QStringList IrcMessagePrivate::params() const -{ - if (!m_params.isExplicit() && m_params.isNull() && !data.params.isEmpty()) { - QStringList params; - foreach (const QByteArray& param, data.params) - params += decode(param, encoding); - m_params = params; - } - return m_params.value(); -} - -QString IrcMessagePrivate::param(int index) const -{ - return params().value(index); -} - -void IrcMessagePrivate::setParams(const QStringList& params) -{ - m_params.setValue(params); -} - -QVariantMap IrcMessagePrivate::tags() const -{ - if (!m_tags.isExplicit() && m_tags.isNull() && !data.tags.isEmpty()) { - QVariantMap tags; - QMap::const_iterator it; - for (it = data.tags.constBegin(); it != data.tags.constEnd(); ++it) - tags.insert(decode(it.key(), encoding), decode(it.value(), encoding)); - m_tags = tags; - } - return m_tags.value(); -} - -void IrcMessagePrivate::setTags(const QVariantMap& tags) -{ - m_tags.setValue(tags); -} - -QByteArray IrcMessagePrivate::content() const -{ - if (m_prefix.isExplicit() || m_command.isExplicit() || m_params.isExplicit() || m_tags.isExplicit()) { - QByteArray data; - - // format - QStringList tt; - const QVariantMap t = tags(); - for (QVariantMap::const_iterator it = t.begin(); it != t.end(); ++it) - tt += it.key() + QLatin1Char('=') + it.value().toString(); - if (!tt.isEmpty()) - data += '@' + tt.join(QLatin1String(";")).toUtf8() + ' '; - - // format - const QString p = prefix(); - if (!p.isEmpty()) - data += ':' + p.toUtf8() + ' '; - - // format - data += command().toUtf8(); - - // format - foreach (const QString& param, params()) { - data += ' '; - if (param.contains(QLatin1Char(' '))) - data += ':'; - data += param.toUtf8(); - } - return data; - } - - return data.content; -} - -void IrcMessagePrivate::invalidate() -{ - m_nick.clear(); - m_ident.clear(); - m_host.clear(); - - m_prefix.clear(); - m_command.clear(); - m_params.clear(); - m_tags.clear(); -} - -IrcMessageData IrcMessageData::fromData(const QByteArray& data) -{ - IrcMessageData message; - message.content = data; - - // From RFC 1459: - // ::= [':' ] - // ::= | [ '!' ] [ '@' ] - // ::= { } | - // ::= ' ' { ' ' } - // ::= [ ':' | ] - // ::= - // ::= - - // IRCv3.2 Message Tags - // ::= ['@' ] [':' ] - // ::= [';' ]* - // ::= ['=' ] - // ::= [ '/' ] - // ::= - // ::= - - QByteArray process = data; - - // parse - if (process.startsWith('@')) { - process.remove(0, 1); - QByteArray tags = process.left(process.indexOf(' ')); - foreach (const QByteArray& tag, tags.split(';')) { - const int idx = tag.indexOf('='); - if (idx != -1) - message.tags.insert(tag.left(idx), tag.mid(idx + 1)); - else - message.tags.insert(tag, QByteArray()); - } - process.remove(0, tags.length() + 1); - } - - // parse - if (process.startsWith(':')) { - message.prefix = process.left(process.indexOf(' ')); - process.remove(0, message.prefix.length() + 1); - } else { - // empty (not null) - message.prefix = QByteArray(""); - } - - // parse - message.command = process.mid(0, process.indexOf(' ')); - process.remove(0, message.command.length() + 1); - - // parse - while (!process.isEmpty()) { - if (process.startsWith(':')) { - process.remove(0, 1); - message.params += process; - process.clear(); - } else { - QByteArray param = process.mid(0, process.indexOf(' ')); - process.remove(0, param.length() + 1); - message.params += param; - } - } - - return message; -} - -QString IrcMessagePrivate::decode(const QByteArray& data, const QByteArray& encoding) -{ - // TODO: not thread safe - static IrcMessageDecoder decoder; - return decoder.decode(data, encoding); -} - -bool IrcMessagePrivate::parsePrefix(const QString& prefix, QString* nick, QString* ident, QString* host) -{ - const QString trimmed = prefix.trimmed(); - if (trimmed.contains(QLatin1Char(' '))) - return false; - - const int len = trimmed.length(); - const int ex = trimmed.indexOf(QLatin1Char('!')); - const int at = trimmed.indexOf(QLatin1Char('@')); - - if (ex == -1 && at == -1) { - if (nick) *nick = trimmed; - } else if (ex > 0 && at > 0 && ex + 1 < at && at < len - 1) { - if (nick) *nick = trimmed.mid(0, ex); - if (ident) *ident = trimmed.mid(ex + 1, at - ex - 1); - if (host) *host = trimmed.mid(at + 1); - } else if (ex > 0 && ex < len - 1 && at == -1) { - if (nick) *nick = trimmed.mid(0, ex); - if (ident) *ident = trimmed.mid(ex + 1); - } else if (at > 0 && at < len - 1 && ex == -1) { - if (nick) *nick = trimmed.mid(0, at); - if (host) *host = trimmed.mid(at + 1); - } else { - return false; - } - return true; -} -#endif // IRC_DOXYGEN - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircmessagebuilder.cpp b/libcommuni/src/core/ircmessagebuilder.cpp deleted file mode 100644 index 298ac79..0000000 --- a/libcommuni/src/core/ircmessagebuilder.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircmessagebuilder_p.h" -#include "ircmessage.h" -#include "irc.h" - -IRC_BEGIN_NAMESPACE - -#ifndef IRC_DOXYGEN -IrcMessageBuilder::IrcMessageBuilder(IrcConnection* connection) -{ - d.connection = connection; - d.message = 0; -} - -void IrcMessageBuilder::processMessage(IrcNumericMessage* message) -{ - switch (message->code()) { - case Irc::RPL_MOTDSTART: - d.message = new IrcMotdMessage(d.connection); - d.message->setPrefix(message->prefix()); - d.message->setParameters(QStringList(message->parameters().value(0))); - break; - case Irc::RPL_MOTD: - d.message->setParameters(d.message->parameters() << message->parameters().value(1)); - break; - case Irc::RPL_ENDOFMOTD: - d.message->setTimeStamp(message->timeStamp()); - emit messageReceived(d.message); - d.message = 0; - break; - - case Irc::RPL_NAMREPLY: { - if (!d.message) - d.message = new IrcNamesMessage(d.connection); - d.message->setPrefix(message->prefix()); - int count = message->parameters().count(); - QString channel = message->parameters().value(count - 2); - QStringList names = d.message->parameters().mid(1); - names += message->parameters().value(count - 1).split(QLatin1Char(' '), QString::SkipEmptyParts); - d.message->setParameters(QStringList() << channel << names); - break; - } - case Irc::RPL_ENDOFNAMES: - d.message->setTimeStamp(message->timeStamp()); - emit messageReceived(d.message); - d.message = 0; - break; - - case Irc::RPL_TOPIC: - case Irc::RPL_NOTOPIC: - d.message = new IrcTopicMessage(d.connection); - d.message->setPrefix(message->prefix()); - d.message->setTimeStamp(message->timeStamp()); - d.message->setCommand(QString::number(message->code())); - d.message->setParameters(QStringList() << message->parameters().value(1) << message->parameters().value(2)); - emit messageReceived(d.message); - d.message = 0; - break; - - case Irc::RPL_WHOREPLY: { - d.message = new IrcWhoReplyMessage(d.connection); - d.message->setPrefix(message->parameters().value(5) // nick - + QLatin1Char('!') + message->parameters().value(2) // ident - + QLatin1Char('@') + message->parameters().value(3)); // host - d.message->setTimeStamp(message->timeStamp()); - d.message->setCommand(QString::number(message->code())); - d.message->setParameters(QStringList() << message->parameters().value(1) // mask - << message->parameters().value(4) // server - << message->parameters().value(6)); // status - QString last = message->parameters().value(7); - int index = last.indexOf(QLatin1Char(' ')); // ignore hopcount - if (index != -1) - d.message->setParameters(d.message->parameters() << last.mid(index + 1)); // real name - emit messageReceived(d.message); - d.message = 0; - break; - } - - case Irc::RPL_CHANNELMODEIS: - d.message = new IrcModeMessage(d.connection); - d.message->setPrefix(message->prefix()); - d.message->setTimeStamp(message->timeStamp()); - d.message->setCommand(QString::number(message->code())); - d.message->setParameters(message->parameters().mid(1)); - emit messageReceived(d.message); - d.message = 0; - break; - } -} -#endif // IRC_DOXYGEN - -#include "moc_ircmessagebuilder_p.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircmessagedecoder.cpp b/libcommuni/src/core/ircmessagedecoder.cpp deleted file mode 100644 index 1e2eb25..0000000 --- a/libcommuni/src/core/ircmessagedecoder.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircmessagedecoder_p.h" -#include -#include - -#ifndef IRC_DOXYGEN -extern "C" { - int IsUTF8Text(const char* utf8, int len); -} - -IRC_BEGIN_NAMESPACE - -IRC_CORE_EXPORT bool irc_is_supported_encoding(const QByteArray& encoding) -{ - static QSet codecs = QTextCodec::availableCodecs().toSet(); - return codecs.contains(encoding); -} - -IrcMessageDecoder::IrcMessageDecoder() -{ - initialize(); -} - -IrcMessageDecoder::~IrcMessageDecoder() -{ - uninitialize(); -} - -QString IrcMessageDecoder::decode(const QByteArray& data, const QByteArray& encoding) const -{ - QTextCodec* codec = 0; - if (IsUTF8Text(data, data.length())) { - codec = QTextCodec::codecForName("UTF-8"); - } else { - QByteArray name = codecForData(data); - codec = QTextCodec::codecForName(name); - } - - if (!codec) - codec = QTextCodec::codecForName(encoding); - Q_ASSERT(codec); - return codec->toUnicode(data); -} -#endif // IRC_DOXYGEN - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircmessagedecoder_icu.cpp b/libcommuni/src/core/ircmessagedecoder_icu.cpp deleted file mode 100644 index 2c303fc..0000000 --- a/libcommuni/src/core/ircmessagedecoder_icu.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircmessagedecoder_p.h" -#include - -IRC_BEGIN_NAMESPACE - -#ifndef IRC_DOXYGEN -#define UCSD(x) reinterpret_cast(x) - -void IrcMessageDecoder::initialize() -{ - UErrorCode status = U_ZERO_ERROR; - d.detector = ucsdet_open(&status); - if (U_FAILURE(status)) - qWarning("IrcMessageDecoder: ICU initialization failed: %s", u_errorName(status)); -} - -void IrcMessageDecoder::uninitialize() -{ - ucsdet_close(UCSD(d.detector)); -} - -QByteArray IrcMessageDecoder::codecForData(const QByteArray &data) const -{ - QByteArray encoding; - UErrorCode status = U_ZERO_ERROR; - if (d.detector) { - ucsdet_setText(UCSD(d.detector), data.constData(), data.length(), &status); - if (!U_FAILURE(status)) { - const UCharsetMatch* match = ucsdet_detect(UCSD(d.detector), &status); - if (match && !U_FAILURE(status)) - encoding = ucsdet_getName(match, &status); - } - } - if (U_FAILURE(status)) - qWarning("IrcMessageDecoder::codecForData() failed: %s", u_errorName(status)); - return encoding; -} -#endif // IRC_DOXYGEN - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircmessagedecoder_uchardet.cpp b/libcommuni/src/core/ircmessagedecoder_uchardet.cpp deleted file mode 100644 index 8f0be8b..0000000 --- a/libcommuni/src/core/ircmessagedecoder_uchardet.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircmessagedecoder_p.h" -#include "uchardet.h" - -IRC_BEGIN_NAMESPACE - -#ifndef IRC_DOXYGEN -#define UCD(x) reinterpret_cast(x) - -void IrcMessageDecoder::initialize() -{ - d.detector = uchardet_new(); -} - -void IrcMessageDecoder::uninitialize() -{ - uchardet_delete(UCD(d.detector)); -} - -QByteArray IrcMessageDecoder::codecForData(const QByteArray &data) const -{ - uchardet_reset(UCD(d.detector)); - uchardet_handle_data(UCD(d.detector), data.constData(), data.length()); - uchardet_data_end(UCD(d.detector)); - return uchardet_get_charset(UCD(d.detector)); -} -#endif // IRC_DOXYGEN - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircnetwork.cpp b/libcommuni/src/core/ircnetwork.cpp deleted file mode 100644 index d73a9be..0000000 --- a/libcommuni/src/core/ircnetwork.cpp +++ /dev/null @@ -1,687 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircnetwork.h" -#include "ircnetwork_p.h" -#include "ircconnection_p.h" -#include "ircprotocol.h" -#include "ircconnection.h" -#include "irccommand.h" -#include -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file ircnetwork.h - \brief \#include <IrcNetwork> - */ - -/*! - \class IrcNetwork ircnetwork.h IrcNetwork - \ingroup core - \brief Provides network information and capability management. - - \section info Network information - - IrcNetwork provides various information about the IRC network of a - \ref IrcConnection::network "connection". This includes the \ref name - "network name", supported \ref channelTypes "channel types", channel - user \ref modes "mode characters" and \ref prefixes "prefix letters", - and various \ref numericLimit "numeric limitations", such as the maximum - nick, channel, topic and message lengths. - - Furthermore, IrcNetwork provides convenient methods for converting channel user - \ref modeToPrefix() "modes to prefixes" and \ref prefixToMode() "vice versa" and - testing whether a target name \ref isChannel() "is a channel". - - \note Most properties have empty values until the network - information has been \ref initialized. - - \section capabilities Capability management - - IrcNetwork also provides means for capability management. It maintais a - list of \ref availableCapabilities "available" and \ref activeCapabilities - "active" capabilities, automatically \ref requestedCapabilities "requests" - desired capabilities, and provides convenient methods for \ref requestCapability() - "manual capability requests". - - \sa IrcConnection::network - */ - -/*! - \fn void IrcNetwork::requestingCapabilities() - - This signal is emitted when capabilities are being requested. - - Normally it is enough to add the desired capabilities to the - list of \ref requestedCapabilities "requested capabilities". - Connect to this signal in order to implement more advanced - capability handling eg. based on which capabilities are \ref - availableCapabilities "available". - - \sa requestedCapabilities, availableCapabilities - */ - -/*! - \enum IrcNetwork::ModeType - This enum describes the channel mode types. - */ - -/*! - \var IrcNetwork::TypeA - \brief Type A modes - - Modes that add or remove an address to or from a list. - These modes always take a parameter when sent by the server to a - client; when sent by a client, they may be specified without a - parameter, which requests the server to display the current - contents of the corresponding list on the channel to the client. - */ - -/*! - \var IrcNetwork::TypeB - \brief Type B modes - - Modes that change a setting on the channel. These modes - always take a parameter. - */ - -/*! - \var IrcNetwork::TypeC - \brief Type C modes - - Modes that change a setting on the channel. These modes - take a parameter only when set; the parameter is absent when the - mode is removed both in the client's and server's MODE command. - */ - -/*! - \var IrcNetwork::TypeD - \brief Type D modes - - Modes that change a setting on the channel. These modes - never take a parameter. - */ - -/*! - \var IrcNetwork::AllTypes - \brief All type modes - */ - -/*! - \enum IrcNetwork::Limit - This enum describes the numeric limit types. - */ - -/*! - \var IrcNetwork::NickLength - \brief The maximum nick name length - */ - -/*! - \var IrcNetwork::ChannelLength - \brief The maximum channel name length - */ - -/*! - \var IrcNetwork::TopicLength - \brief The maximum channel topic length - */ - -/*! - \var IrcNetwork::MessageLength - \brief The maximum message length - */ - -/*! - \var IrcNetwork::KickReasonLength - \brief The maximum kick reason length - */ - -/*! - \var IrcNetwork::AwayReasonLength - \brief The maximum away reason length - */ - -/*! - \var IrcNetwork::ModeCount - \brief The maximum number of channel modes allowed per mode command - */ - -#ifndef IRC_DOXYGEN -IrcNetworkPrivate::IrcNetworkPrivate() : q_ptr(0), initialized(false) -{ -} - -static QHash numericValues(const QString& parameter) -{ - QHash values; - const QStringList keyValues = parameter.split(",", QString::SkipEmptyParts); - foreach (const QString& keyValue, keyValues) - values.insert(keyValue.section(":", 0, 0), keyValue.section(":", 1, 1).toInt()); - return values; -} - -void IrcNetworkPrivate::setInfo(const QHash& info) -{ - Q_Q(IrcNetwork); - if (info.contains("NETWORK")) - setName(info.value("NETWORK")); - if (info.contains("PREFIX")) { - const QString pfx = info.value("PREFIX"); - setModes(pfx.mid(1, pfx.indexOf(')') - 1).split("", QString::SkipEmptyParts)); - setPrefixes(pfx.mid(pfx.indexOf(')') + 1).split("", QString::SkipEmptyParts)); - } - if (info.contains("CHANTYPES")) - setChannelTypes(info.value("CHANTYPES").split("", QString::SkipEmptyParts)); - - // TODO: - if (info.contains("NICKLEN")) - numericLimits.insert("NICKLEN", info.value("NICKLEN").toInt()); - if (info.contains("CHANNELLEN")) - numericLimits.insert("CHANNELLEN", info.value("CHANNELLEN").toInt()); - if (info.contains("TOPICLEN")) - numericLimits.insert("TOPICLEN", info.value("TOPICLEN").toInt()); - if (info.contains("KICKLEN")) - numericLimits.insert("KICKLEN", info.value("KICKLEN").toInt()); - if (info.contains("AWAYLEN")) - numericLimits.insert("AWAYLEN", info.value("AWAYLEN").toInt()); - if (info.contains("MODES")) - numericLimits.insert("MODES", info.value("MODES").toInt()); - if (info.contains("CHANMODES")) - channelModes = info.value("CHANMODES").split(",", QString::SkipEmptyParts); - if (info.contains("MAXLIST")) - modeLimits = numericValues(info.value("MAXLIST")); - if (info.contains("CHANLIMIT")) - channelLimits = numericValues(info.value("CHANLIMIT")); - if (info.contains("TARGMAX")) - targetLimits = numericValues(info.value("TARGMAX")); - - if (!initialized) { - initialized = true; - emit q->initialized(); - } -} - -void IrcNetworkPrivate::setAvailableCapabilities(const QSet& capabilities) -{ - Q_Q(IrcNetwork); - if (availableCaps != capabilities) { - availableCaps = capabilities; - emit q->availableCapabilitiesChanged(availableCaps.toList()); - } -} - -void IrcNetworkPrivate::setActiveCapabilities(const QSet& capabilities) -{ - Q_Q(IrcNetwork); - if (activeCaps != capabilities) { - activeCaps = capabilities; - emit q->activeCapabilitiesChanged(activeCaps.toList()); - } -} - -void IrcNetworkPrivate::setName(const QString& value) -{ - Q_Q(IrcNetwork); - if (name != value) { - name = value; - emit q->nameChanged(value); - } -} - -void IrcNetworkPrivate::setModes(const QStringList& value) -{ - Q_Q(IrcNetwork); - if (modes != value) { - modes = value; - emit q->modesChanged(value); - } -} - -void IrcNetworkPrivate::setPrefixes(const QStringList& value) -{ - Q_Q(IrcNetwork); - if (prefixes != value) { - prefixes = value; - emit q->prefixesChanged(value); - } -} - -void IrcNetworkPrivate::setChannelTypes(const QStringList& value) -{ - Q_Q(IrcNetwork); - if (channelTypes != value) { - channelTypes = value; - emit q->channelTypesChanged(value); - } -} -#endif // IRC_DOXYGEN - -/*! - \internal - Constructs a new network object for IRC \a connection. - */ -IrcNetwork::IrcNetwork(IrcConnection* connection) : QObject(connection), d_ptr(new IrcNetworkPrivate) -{ - Q_D(IrcNetwork); - d->q_ptr = this; - d->connection = connection; -} - -/*! - \internal - Destructs the IRC network. - */ -IrcNetwork::~IrcNetwork() -{ -} - -/*! - \property bool IrcNetwork::initialized - This property holds whether the network information has been initialized. - - Most properties have empty values until the server provides the - relevant network information during the client-server handshake. - - \par Access function: - \li bool isInitialized() const - - \par Notifier signal: - \li void initialized() - */ -bool IrcNetwork::isInitialized() -{ - Q_D(const IrcNetwork); - return d->initialized; -} - -/*! - This property holds the network name. - - \par Access function: - \li QString name() const - - \par Notifier signal: - \li void nameChanged(const QString& name) - */ -QString IrcNetwork::name() const -{ - Q_D(const IrcNetwork); - return d->name; -} - -/*! - This property holds the supported channel user mode letters. - - Examples of typical channel user modes: - Description | Mode | Prefix - -----------------|------------|------- - Channel operator | \b o | @ - Voiced user | \b v | + - - \par Access function: - \li QStringList modes() const - - \par Notifier signal: - \li void modesChanged(const QStringList& modes) - - \sa prefixes, modeToPrefix() - */ -QStringList IrcNetwork::modes() const -{ - Q_D(const IrcNetwork); - return d->modes; -} - -/*! - This property holds the supported channel user mode prefix characters. - - Examples of typical channel user modes: - Description | Mode | Prefix - -----------------|------------|------- - Channel operator | o | \b @ - Voiced user | v | \b + - - \par Access function: - \li QStringList prefixes() const - - \par Notifier signal: - \li void prefixesChanged(const QStringList& prefixes) - - \sa modes, prefixToMode() - */ -QStringList IrcNetwork::prefixes() const -{ - Q_D(const IrcNetwork); - return d->prefixes; -} - -/*! - Converts a channel user mode letter to a prefix character. - - \sa modes, prefixToMode() - */ -QString IrcNetwork::modeToPrefix(const QString& mode) const -{ - Q_D(const IrcNetwork); - return d->prefixes.value(d->modes.indexOf(mode)); -} - -/*! - Converts a channel mode prefix character to a mode letter. - - \sa prefixes, modeToPrefix() - */ -QString IrcNetwork::prefixToMode(const QString& prefix) const -{ - Q_D(const IrcNetwork); - return d->modes.value(d->prefixes.indexOf(prefix)); -} - -/*! - This property holds the supported channel type prefix characters. - - Examples of typical channel types: - Description | Type | Example - -----------------|------|--------- - Normal channel | \# | \#communi - Local channel | & | &foo - - \par Access function: - \li QStringList channelTypes() const - - \par Notifier signal: - \li void channelTypesChanged(const QStringList& types) - */ -QStringList IrcNetwork::channelTypes() const -{ - Q_D(const IrcNetwork); - return d->channelTypes; -} - -/*! - Returns \c true if the \a name is a channel. - - \code - QString name = ...; - if (connection->network()->isChannel(name)) - doSomeChannelAction(name); - \endcode - - \sa channelTypes - */ -bool IrcNetwork::isChannel(const QString& name) const -{ - Q_D(const IrcNetwork); - return !name.isEmpty() && d->channelTypes.contains(name.at(0)); -} - -/*! - Returns the supported channel modes for specified \a types. - - \sa ModeType - */ -QStringList IrcNetwork::channelModes(IrcNetwork::ModeTypes types) const -{ - Q_D(const IrcNetwork); - QStringList modes; - if (types & TypeA) - modes += d->channelModes.value(0).split("", QString::SkipEmptyParts); - if (types & TypeB) - modes += d->channelModes.value(1).split("", QString::SkipEmptyParts); - if (types & TypeC) - modes += d->channelModes.value(2).split("", QString::SkipEmptyParts); - if (types & TypeD) - modes += d->channelModes.value(3).split("", QString::SkipEmptyParts); - return modes; -} - -/*! - Returns a numeric type of \a limit, or \c -1 if the limitation is not known. - - \sa modeLimit(), channelLimit(), targetLimit() - */ -int IrcNetwork::numericLimit(Limit limit) const -{ - Q_D(const IrcNetwork); - QString key; - switch (limit) { - case NickLength: key = QLatin1String("NICKLEN"); break; - case ChannelLength: key = QLatin1String("CHANNELLEN"); break; - case TopicLength: key = QLatin1String("TOPICLEN"); break; - case MessageLength: return 512; // RFC 1459 - case KickReasonLength: key = QLatin1String("KICKLEN"); break; - case AwayReasonLength: key = QLatin1String("AWAYLEN"); break; - case ModeCount: key = QLatin1String("MODES"); break; - } - return d->numericLimits.value(key, -1); -} - -/*! - Returns the limit of entries in the list per \a mode, or \c -1 if the limitation is not known. - - \sa modes() - */ -int IrcNetwork::modeLimit(const QString& mode) const -{ - Q_D(const IrcNetwork); - return d->modeLimits.value(mode); -} - -/*! - Returns the limit for a \a type of channels, or \c -1 if the limitation is not known. - - \sa channelTypes() - */ -int IrcNetwork::channelLimit(const QString& type) const -{ - Q_D(const IrcNetwork); - return d->channelLimits.value(type); -} - -/*! - Returns the limit of targets for a \a command, or \c -1 if the limitation is not known. - */ -int IrcNetwork::targetLimit(const QString& command) const -{ - Q_D(const IrcNetwork); - return d->targetLimits.value(command); -} - -/*! - This property holds the available capabilities. - - \par Access function: - \li QStringList availableCapabilities() const - - \par Notifier signal: - \li void availableCapabilitiesChanged(const QStringList& capabilities) - - \sa requestedCapabilities, activeCapabilities - */ -QStringList IrcNetwork::availableCapabilities() const -{ - Q_D(const IrcNetwork); - return d->availableCaps.toList(); -} - -/*! - This property holds the active capabilities. - - \par Access function: - \li QStringList activeCapabilities() const - - \par Notifier signal: - \li void activeCapabilitiesChanged(const QStringList& capabilities) - - \sa requestedCapabilities, availableCapabilities - */ -QStringList IrcNetwork::activeCapabilities() const -{ - Q_D(const IrcNetwork); - return d->activeCaps.toList(); -} - -/*! - Returns \c true if the \a capability is \b available. - - \sa availableCapabilities - */ -bool IrcNetwork::hasCapability(const QString& capability) const -{ - Q_D(const IrcNetwork); - return d->availableCaps.contains(capability); -} - -/*! - Returns \c true if the \a capability is \b active. - - \sa activeCapabilities - */ -bool IrcNetwork::isCapable(const QString& capability) const -{ - Q_D(const IrcNetwork); - return d->activeCaps.contains(capability); -} - -/*! - Requests the specified \a capability. - - \note The \a capability is NOT added to the list of \ref requestedCapabilities - "requested capabilities" to avoid them "piling up". - */ -bool IrcNetwork::requestCapability(const QString& capability) -{ - Q_D(IrcNetwork); - if (d->connection) - return d->connection->sendCommand(IrcCommand::createCapability(QLatin1String("REQ"), capability)); - return false; -} - -/*! - Requests the specified \a capabilities. - - \note The \a capabilities are NOT added to the list of \ref requestedCapabilities - "requested capabilities" to avoid them "piling up". - */ -bool IrcNetwork::requestCapabilities(const QStringList& capabilities) -{ - Q_D(IrcNetwork); - if (d->connection && d->connection->isActive()) - return d->connection->sendCommand(IrcCommand::createCapability(QLatin1String("REQ"), capabilities)); - return false; -} - -/*! - This property holds the requested capabilities. - - These capabilities are automatically requested during the handshake, - right after requestingCapabilities() has been emitted. - - \par Access functions: - \li QStringList requestedCapabilities() const - \li void setRequestedCapabilities(const QStringList& capabilities) - - \par Notifier signal: - \li void requestedCapabilitiesChanged(const QStringList& capabilities) - - \sa availableCapabilities, activeCapabilities - */ -QStringList IrcNetwork::requestedCapabilities() const -{ - Q_D(const IrcNetwork); - return d->requestedCaps.toList(); -} - -void IrcNetwork::setRequestedCapabilities(const QStringList& capabilities) -{ - Q_D(IrcNetwork); - const QSet caps = capabilities.toSet(); - if (d->requestedCaps != caps) { - d->requestedCaps = caps; - emit requestedCapabilitiesChanged(caps.toList()); - } -} - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug debug, IrcNetwork::Limit limit) -{ - const int index = IrcNetwork::staticMetaObject.indexOfEnumerator("Limit"); - QMetaEnum enumerator = IrcNetwork::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(limit); - debug << (key ? key : "Unknown"); - return debug; -} - -QDebug operator<<(QDebug debug, IrcNetwork::ModeType type) -{ - const int index = IrcNetwork::staticMetaObject.indexOfEnumerator("ModeType"); - QMetaEnum enumerator = IrcNetwork::staticMetaObject.enumerator(index); - const char* key = enumerator.valueToKey(type); - debug << (key ? key : "Unknown"); - return debug; -} - -QDebug operator<<(QDebug debug, IrcNetwork::ModeTypes types) -{ - QStringList lst; - if (types == IrcNetwork::AllTypes) { - lst << "AllTypes"; - } else { - if (types & IrcNetwork::TypeA) - lst << "TypeA"; - if (types & IrcNetwork::TypeB) - lst << "TypeB"; - if (types & IrcNetwork::TypeC) - lst << "TypeC"; - if (types & IrcNetwork::TypeD) - lst << "TypeD"; - } - debug.nospace() << '(' << qPrintable(lst.join("|")) << ')'; - return debug; -} - -QDebug operator<<(QDebug debug, const IrcNetwork* network) -{ - if (!network) - return debug << "IrcNetwork(0x0) "; - debug.nospace() << network->metaObject()->className() << '(' << (void*) network; - if (!network->objectName().isEmpty()) - debug.nospace() << ", name=" << qPrintable(network->objectName()); - if (!network->name().isEmpty()) - debug.nospace() << ", network=" << qPrintable(network->name()); - debug.nospace() << ')'; - return debug.space(); -} -#endif // QT_NO_DEBUG_STREAM - -#include "moc_ircnetwork.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/core/ircprotocol.cpp b/libcommuni/src/core/ircprotocol.cpp deleted file mode 100644 index 9d42126..0000000 --- a/libcommuni/src/core/ircprotocol.cpp +++ /dev/null @@ -1,480 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircprotocol.h" -#include "ircconnection_p.h" -#include "ircmessagebuilder_p.h" -#include "ircnetwork_p.h" -#include "ircconnection.h" -#include "ircmessage.h" -#include "irccommand.h" -#include "irc.h" -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file ircprotocol.h - \brief \#include <IrcProtocol> - */ - -/*! - \since 3.2 - \class IrcProtocol ircprotocol.h IrcProtocol - \ingroup core - \brief Implements the IRC protocol and provides means for implementing support for custom protocols. - - \sa IrcConnection::protocol - */ - -#ifndef IRC_DOXYGEN -class IrcProtocolPrivate -{ - Q_DECLARE_PUBLIC(IrcProtocol) - -public: - IrcProtocolPrivate(); - - void authenticate(bool secure); - - void readLines(const QByteArray& delimiter); - void processLine(const QByteArray& line); - - void handleNumericMessage(IrcNumericMessage* msg); - void handlePrivateMessage(IrcPrivateMessage* msg); - void handleCapabilityMessage(IrcCapabilityMessage* msg); - - void _irc_pauseHandshake(); - void _irc_resumeHandshake(); - - IrcProtocol* q_ptr; - IrcConnection* connection; - IrcMessageBuilder* builder; - QHash info; - QByteArray buffer; - bool resumed; - bool authed; -}; - -IrcProtocolPrivate::IrcProtocolPrivate() : q_ptr(0), connection(0), builder(0), resumed(false), authed(false) -{ -} - -void IrcProtocolPrivate::authenticate(bool secure) -{ - const QString password = connection->password(); - if (!password.isEmpty()) { - if (secure) { - const QByteArray userName = connection->userName().toUtf8(); - const QByteArray data = userName + '\0' + userName + '\0' + password.toUtf8(); - authed = connection->sendData("AUTHENTICATE " + data.toBase64()); - } else { - authed = connection->sendRaw(QString("PASS %1").arg(password)); - } - } -} - -void IrcProtocolPrivate::readLines(const QByteArray& delimiter) -{ - int i = -1; - while ((i = buffer.indexOf(delimiter)) != -1) { - QByteArray line = buffer.left(i).trimmed(); - buffer = buffer.mid(i + delimiter.length()); - if (!line.isEmpty()) - processLine(line); - } -} - -void IrcProtocolPrivate::processLine(const QByteArray& line) -{ - Q_Q(IrcProtocol); - static bool dbg = qgetenv("IRC_DEBUG").toInt(); - if (dbg) qDebug() << line; - - if (line.startsWith("AUTHENTICATE") && !connection->saslMechanism().isEmpty()) { - const QList args = line.split(' '); - if (args.count() == 2 && args.at(1) == "+") - authenticate(true); - if (!connection->isConnected()) - QMetaObject::invokeMethod(q, "_irc_resumeHandshake", Qt::QueuedConnection); - return; - } - - IrcMessage* msg = IrcMessage::fromData(line, connection); - if (msg) { - msg->setEncoding(connection->encoding()); - - switch (msg->type()) { - case IrcMessage::Capability: - handleCapabilityMessage(static_cast(msg)); - break; - case IrcMessage::Nick: - if (msg->flags() & IrcMessage::Own) - q->setNickName(static_cast(msg)->newNick()); - break; - case IrcMessage::Numeric: - handleNumericMessage(static_cast(msg)); - break; - case IrcMessage::Ping: - connection->sendRaw("PONG " + static_cast(msg)->argument()); - break; - case IrcMessage::Private: - handlePrivateMessage(static_cast(msg)); - break; - default: - break; - } - q->receiveMessage(msg); - } -} - -void IrcProtocolPrivate::handleNumericMessage(IrcNumericMessage* msg) -{ - Q_Q(IrcProtocol); - switch (msg->code()) { - case Irc::RPL_WELCOME: - q->setNickName(msg->parameters().value(0)); - q->setStatus(IrcConnection::Connected); - break; - case Irc::RPL_ISUPPORT: { - foreach (const QString& param, msg->parameters().mid(1)) { - QStringList keyValue = param.split("=", QString::SkipEmptyParts); - info.insert(keyValue.value(0), keyValue.value(1)); - } - break; - } - case Irc::ERR_NOMOTD: - case Irc::RPL_MOTDSTART: - q->setInfo(info); - break; - case Irc::ERR_NICKNAMEINUSE: - case Irc::ERR_NICKCOLLISION: { - QString alternate = connection->nickName(); - emit connection->nickNameReserved(&alternate); - if (!alternate.isEmpty() && alternate != connection->nickName()) { - connection->setNickName(alternate); - } else { - emit connection->nickNameRequired(msg->parameters().value(1), &alternate); - if (!alternate.isEmpty() && alternate != connection->nickName()) - connection->setNickName(alternate); - } - break; - } - case Irc::ERR_BADCHANNELKEY: { - QString key; - QString channel = msg->parameters().value(1); - emit connection->channelKeyRequired(channel, &key); - if (!key.isEmpty()) - connection->sendCommand(IrcCommand::createJoin(channel, key)); - break; - } - default: - break; - } -} - -void IrcProtocolPrivate::handlePrivateMessage(IrcPrivateMessage* msg) -{ - if (msg->isRequest()) { - IrcCommand* reply = IrcConnectionPrivate::get(connection)->createCtcpReply(msg); - if (reply) - connection->sendCommand(reply); - } -} - -static void handleCapability(QSet* caps, const QString& cap) -{ - Q_ASSERT(caps); - // sticky modifier (once the cap is enabled, it cannot be disabled) - QLatin1Char stickyMod('='); - // ack modifier (the cap must be acked by the client to fully enable/disable) - QLatin1Char ackMod('~'); - // disable modifier (the cap should be disabled) - QLatin1Char disMod('-'); - - QString name = cap; - while (name.startsWith(stickyMod) || name.startsWith(ackMod)) - name.remove(0, 1); - - if (name.startsWith(disMod)) - caps->remove(name.mid(1)); - else - caps->insert(name); -} - -void IrcProtocolPrivate::handleCapabilityMessage(IrcCapabilityMessage* msg) -{ - Q_Q(IrcProtocol); - const bool connected = connection->isConnected(); - const QString subCommand = msg->subCommand(); - if (subCommand == "LS") { - QSet availableCaps = connection->network()->availableCapabilities().toSet(); - foreach (const QString& cap, msg->capabilities()) - handleCapability(&availableCaps, cap); - q->setAvailableCapabilities(availableCaps); - - if (!connected) { - QMetaObject::invokeMethod(connection->network(), "requestingCapabilities"); - QStringList requestedCaps = connection->network()->requestedCapabilities(); - const QStringList params = msg->parameters(); - if (params.value(params.count() - 1) != QLatin1String("*")) { - if (!connection->saslMechanism().isEmpty() && availableCaps.contains(QLatin1String("sasl"))) - requestedCaps += QLatin1String("sasl"); - } - if (!requestedCaps.isEmpty()) - connection->sendRaw("CAP REQ :" + requestedCaps.join(" ")); - else - QMetaObject::invokeMethod(q, "_irc_resumeHandshake", Qt::QueuedConnection); - } - } else if (subCommand == "ACK" || subCommand == "NAK") { - bool auth = false; - if (subCommand == "ACK") { - QSet activeCaps = connection->network()->activeCapabilities().toSet(); - foreach (const QString& cap, msg->capabilities()) { - handleCapability(&activeCaps, cap); - if (cap == "sasl" && !connection->saslMechanism().isEmpty() && !connection->password().isEmpty()) - auth = connection->sendRaw("AUTHENTICATE " + connection->saslMechanism()); - } - q->setActiveCapabilities(activeCaps); - } - - if (!connected && !auth) - QMetaObject::invokeMethod(q, "_irc_resumeHandshake", Qt::QueuedConnection); - } -} - -void IrcProtocolPrivate::_irc_pauseHandshake() -{ - // Send CAP LS first; if the server understands it this will - // temporarily pause the handshake until CAP END is sent, so we - // know whether the server supports the CAP extension. - connection->sendData("CAP LS"); - resumed = false; - authed = false; -} - -void IrcProtocolPrivate::_irc_resumeHandshake() -{ - if (!resumed && !connection->isConnected()) { - if (!authed && !connection->saslMechanism().isEmpty() && !connection->password().isEmpty()) - authenticate(false); - connection->sendData("CAP END"); - } - resumed = true; -} -#endif // IRC_DOXYGEN - -/*! - Constructs a new IRC protocol for \a connection. - */ -IrcProtocol::IrcProtocol(IrcConnection* connection) : QObject(connection), d_ptr(new IrcProtocolPrivate) -{ - Q_D(IrcProtocol); - d->q_ptr = this; - d->connection = connection; - d->builder = new IrcMessageBuilder(connection); - connect(d->builder, SIGNAL(messageReceived(IrcMessage*)), this, SLOT(receiveMessage(IrcMessage*))); -} - -/*! - Destructs the IRC protocol. - */ -IrcProtocol::~IrcProtocol() -{ - Q_D(IrcProtocol); - delete d->builder; -} - -/*! - This property holds the connection. - - \par Access function: - \li \ref IrcConnection* connection() const - */ -IrcConnection* IrcProtocol::connection() const -{ - Q_D(const IrcProtocol); - return d->connection; -} - -/*! - This property holds the socket. - - \par Access functions: - \li \ref QAbstractSocket* socket() const - */ -QAbstractSocket* IrcProtocol::socket() const -{ - Q_D(const IrcProtocol); - return d->connection->socket(); -} - -/*! - This method is called when the connection has been established. - - The default implementation sends the \c NICK, \c USER and \c PASSWORD commands as defined in - RFC 1459. - - Furthermore, it sends a CAP LS command as specified in - IRC Client Capabilities Extension. - */ -void IrcProtocol::open() -{ - Q_D(IrcProtocol); - d->_irc_pauseHandshake(); - - if (d->connection->saslMechanism().isEmpty() && !d->connection->password().isEmpty()) - d->authenticate(false); - - d->connection->sendRaw(QString("NICK %1").arg(d->connection->nickName())); - d->connection->sendRaw(QString("USER %1 hostname servername :%2").arg(d->connection->userName(), d->connection->realName())); -} - -/*! - This method is called when the connection has been lost. - */ -void IrcProtocol::close() -{ -} - -/*! - This method is called when the \ref socket has new data available for read. - - The default implementation reads lines as specified in - RFC 1459. - - \sa socket - */ -void IrcProtocol::read() -{ - Q_D(IrcProtocol); - d->buffer += socket()->readAll(); - // try reading RFC compliant message lines first - d->readLines("\r\n"); - // fall back to RFC incompliant lines... - d->readLines("\n"); -} - -/*! - This method is called when raw \a data should be written to the \ref socket. - - The default implementation writes the data and appends \c "\r\n" as specified in - RFC 1459. - - \sa socket - */ -bool IrcProtocol::write(const QByteArray& data) -{ - return socket()->write(data + QByteArray("\r\n")) != -1; -} - -/*! - This method should be called by the protocol implementation - to make the underlying IRC connection receive a \a message. - - \sa IrcConnection::messageReceived() - */ -void IrcProtocol::receiveMessage(IrcMessage* message) -{ - Q_D(IrcProtocol); - IrcConnectionPrivate* priv = IrcConnectionPrivate::get(d->connection); - priv->receiveMessage(message); - if (message->type() == IrcMessage::Numeric) - d->builder->processMessage(static_cast(message)); -} - -/*! - This method should be called by the protocol implementation to - notify the underlying IRC connection about a nick \a name change. - - \sa IrcConnection::nickName - */ -void IrcProtocol::setNickName(const QString& name) -{ - Q_D(IrcProtocol); - IrcConnectionPrivate* priv = IrcConnectionPrivate::get(d->connection); - priv->setNick(name); -} - -/*! - This method should be called by the protocol implementation - to notify the underlying IRC connection about a \a status change. - - \sa IrcConnection::status - */ -void IrcProtocol::setStatus(IrcConnection::Status status) -{ - Q_D(IrcProtocol); - IrcConnectionPrivate* priv = IrcConnectionPrivate::get(d->connection); - priv->setStatus(status); -} - -/*! - This method should be called by the protocol implementation - to initialize the underlying IRC network connection \a info. - - \sa IrcNetwork::initialized - */ -void IrcProtocol::setInfo(const QHash& info) -{ - Q_D(IrcProtocol); - if (!info.isEmpty()) { - IrcConnectionPrivate* priv = IrcConnectionPrivate::get(d->connection); - priv->setInfo(info); - } -} - -/*! - This method should be called by the protocol implementation to notify - the underlying IRC network about a change in available \a capabilities. - - \sa IrcNetwork::availableCapabilities - */ -void IrcProtocol::setAvailableCapabilities(const QSet& capabilities) -{ - Q_D(IrcProtocol); - IrcNetworkPrivate* priv = IrcNetworkPrivate::get(d->connection->network()); - priv->setAvailableCapabilities(capabilities); -} - -/*! - This method should be called by the protocol implementation to notify - the underlying IRC network about a change in active \a capabilities. - - \sa IrcNetwork::activeCapabilities - */ -void IrcProtocol::setActiveCapabilities(const QSet& capabilities) -{ - Q_D(IrcProtocol); - IrcNetworkPrivate* priv = IrcNetworkPrivate::get(d->connection->network()); - priv->setActiveCapabilities(capabilities); -} - -#include "moc_ircprotocol.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/imports/imports.pri b/libcommuni/src/imports/imports.pri deleted file mode 100644 index 1edd926..0000000 --- a/libcommuni/src/imports/imports.pri +++ /dev/null @@ -1,17 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = lib -TARGET = $$qtLibraryTarget($$TARGET) -CONFIG += plugin -!verbose:CONFIG += silent -contains(QT_CONFIG, debug_and_release) { - win32|mac:!wince*:!win32-msvc:!macx-xcode:CONFIG += debug_and_release build_all -} - -IRC_SOURCEDIR = $$PWD/../../ -IRC_BUILDDIR = $$OUT_PWD/../../../ - -IRC_MODULES = IrcCore IrcModel IrcUtil -include(../module_deps.pri) diff --git a/libcommuni/src/imports/imports.pro b/libcommuni/src/imports/imports.pro deleted file mode 100644 index 425909a..0000000 --- a/libcommuni/src/imports/imports.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = subdirs -greaterThan(QT_MAJOR_VERSION, 4):qtHaveModule(qml):SUBDIRS += qml2 -else:!lessThan(QT_MAJOR_VERSION, 4):!lessThan(QT_MINOR_VERSION, 7):SUBDIRS += qml1 diff --git a/libcommuni/src/imports/qml1/plugin.cpp b/libcommuni/src/imports/qml1/plugin.cpp deleted file mode 100644 index bb66c2e..0000000 --- a/libcommuni/src/imports/qml1/plugin.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include - -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcQmlFilter : public QObject, - public IrcCommandFilter, - public IrcMessageFilter -{ - Q_OBJECT - Q_INTERFACES(IrcCommandFilter IrcMessageFilter) - Q_PROPERTY(IrcConnection* connection READ connection WRITE setConnection NOTIFY connectionChanged) - -public: - IrcQmlFilter(QObject* parent = 0) : QObject(parent), conn(0) { } - - IrcConnection* connection() const { return conn; } - void setConnection(IrcConnection* connection) - { - if (conn != connection) { - if (conn) { - conn->removeCommandFilter(this); - conn->removeMessageFilter(this); - } - conn = connection; - if (conn) { - conn->installCommandFilter(this); - conn->installMessageFilter(this); - } - emit connectionChanged(); - } - } - - bool commandFilter(IrcCommand* cmd) - { - // QML: QVariant commandFilter(QVariant) - const QMetaObject* mo = metaObject(); - int idx = mo->indexOfMethod("commandFilter(QVariant)"); - if (idx != -1) { - QVariant ret; - QMetaMethod method = mo->method(idx); - method.invoke(this, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(cmd))); - return ret.toBool(); - } - return false; - } - - bool messageFilter(IrcMessage* msg) - { - // QML: QVariant messageFilter(QVariant) - const QMetaObject* mo = metaObject(); - int idx = mo->indexOfMethod("messageFilter(QVariant)"); - if (idx != -1) { - QVariant ret; - QMetaMethod method = mo->method(idx); - method.invoke(this, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(msg))); - return ret.toBool(); - } - return false; - } - -signals: - void connectionChanged(); - -private: - QPointer conn; -}; - -class CommuniPlugin : public QDeclarativeExtensionPlugin -{ - Q_OBJECT - -public: - void registerTypes(const char* uri) { - // IrcCore - Irc::registerMetaTypes(); - qmlRegisterType(uri, 3, 0, "Irc"); - qmlRegisterType(uri, 3, 2, "Irc"); - qmlRegisterType(uri, 3, 0, "IrcCommand"); - qmlRegisterType(uri, 3, 0, "IrcConnection"); - qmlRegisterUncreatableType(uri, 3, 0, "IrcMessage", "Cannot create an instance of IrcMessage. Use IrcConnection::messageReceived() signal instead."); - qmlRegisterUncreatableType(uri, 3, 0, "IrcNetwork", "Cannot create an instance of IrcNetwork. Use IrcConnection::network property instead."); - qmlRegisterType(uri, 3, 0, "IrcMessageFilter"); - qmlRegisterType(uri, 3, 0, "IrcCommandFilter"); - qmlRegisterType(uri, 3, 0, "IrcFilter"); - - // IrcModel - qmlRegisterType(uri, 3, 0, "IrcBuffer"); - qmlRegisterType(uri, 3, 0, "IrcBufferModel"); - qmlRegisterType(uri, 3, 0, "IrcChannel"); - qmlRegisterType(uri, 3, 0, "IrcUser"); - qmlRegisterType(uri, 3, 0, "IrcUserModel"); - - // IrcUtil - qmlRegisterType(uri, 3, 0, "IrcCommandParser"); - qmlRegisterType(uri, 3, 0, "IrcLagTimer"); - qmlRegisterType(uri, 3, 0, "IrcTextFormat"); - qmlRegisterUncreatableType(uri, 3, 0, "IrcPalette", "Cannot create an instance of IrcPalette. Use IrcTextFormat::palette property instead."); - qmlRegisterType(uri, 3, 1, "IrcCompleter"); - } -}; - -IRC_END_NAMESPACE - -#include "plugin.moc" - -Q_EXPORT_PLUGIN2(communiplugin, CommuniPlugin); diff --git a/libcommuni/src/imports/qml1/plugins.qmltypes b/libcommuni/src/imports/qml1/plugins.qmltypes deleted file mode 100644 index 1be56cc..0000000 --- a/libcommuni/src/imports/qml1/plugins.qmltypes +++ /dev/null @@ -1,1929 +0,0 @@ -import QtQuick.tooling 1.1 - -// This file describes the plugin-supplied types contained in the library. -// It is used for QML tooling purposes only. - -Module { - Component { - name: "Irc" - prototype: "QObject" - exports: [ - "Communi/Irc 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Enum { - name: "Color" - values: { - "White": 0, - "Black": 1, - "Blue": 2, - "Green": 3, - "Red": 4, - "Brown": 5, - "Purple": 6, - "Orange": 7, - "Yellow": 8, - "LightGreen": 9, - "Cyan": 10, - "LightCyan": 11, - "LightBlue": 12, - "Pink": 13, - "Gray": 14, - "LightGray": 15 - } - } - Enum { - name: "DataRole" - values: { - "UserRole": 32, - "BufferRole": 33, - "ChannelRole": 34, - "NameRole": 35, - "PrefixRole": 36, - "ModeRole": 37, - "TitleRole": 38 - } - } - Enum { - name: "SortMethod" - values: { - "SortByHand": 0, - "SortByName": 1, - "SortByTitle": 2, - "SortByActivity": 3 - } - } - Enum { - name: "Code" - values: { - "RPL_WELCOME": 1, - "RPL_YOURHOST": 2, - "RPL_CREATED": 3, - "RPL_MYINFO": 4, - "RPL_ISUPPORT": 5, - "RPL_SNOMASK": 8, - "RPL_STATMEMTOT": 9, - "RPL_BOUNCE": 10, - "RPL_STATMEM": 10, - "RPL_YOURCOOKIE": 14, - "RPL_YOURID": 42, - "RPL_SAVENICK": 43, - "RPL_ATTEMPTINGJUNC": 50, - "RPL_ATTEMPTINGREROUTE": 51, - "RPL_TRACELINK": 200, - "RPL_TRACECONNECTING": 201, - "RPL_TRACEHANDSHAKE": 202, - "RPL_TRACEUNKNOWN": 203, - "RPL_TRACEOPERATOR": 204, - "RPL_TRACEUSER": 205, - "RPL_TRACESERVER": 206, - "RPL_TRACESERVICE": 207, - "RPL_TRACENEWTYPE": 208, - "RPL_TRACECLASS": 209, - "RPL_TRACERECONNECT": 210, - "RPL_STATS": 210, - "RPL_STATSLINKINFO": 211, - "RPL_STATSCOMMANDS": 212, - "RPL_STATSCLINE": 213, - "RPL_STATSNLINE": 214, - "RPL_STATSILINE": 215, - "RPL_STATSKLINE": 216, - "RPL_STATSQLINE": 217, - "RPL_STATSYLINE": 218, - "RPL_ENDOFSTATS": 219, - "RPL_UMODEIS": 221, - "RPL_MODLIST": 222, - "RPL_SQLINE_NICK": 222, - "RPL_STATSZLINE": 225, - "RPL_STATSCOUNT": 226, - "RPL_SERVICEINFO": 231, - "RPL_ENDOFSERVICES": 232, - "RPL_SERVICE": 233, - "RPL_SERVLIST": 234, - "RPL_SERVLISTEND": 235, - "RPL_STATSVERBOSE": 236, - "RPL_STATSENGINE": 237, - "RPL_STATSIAUTH": 239, - "RPL_STATSVLINE": 240, - "RPL_STATSLLINE": 241, - "RPL_STATSUPTIME": 242, - "RPL_STATSOLINE": 243, - "RPL_STATSHLINE": 244, - "RPL_STATSSLINE": 245, - "RPL_STATSPING": 246, - "RPL_STATSBLINE": 247, - "RPL_STATSDEFINE": 248, - "RPL_STATSDEBUG": 249, - "RPL_STATSDLINE": 250, - "RPL_STATSCONN": 250, - "RPL_LUSERCLIENT": 251, - "RPL_LUSEROP": 252, - "RPL_LUSERUNKNOWN": 253, - "RPL_LUSERCHANNELS": 254, - "RPL_LUSERME": 255, - "RPL_ADMINME": 256, - "RPL_ADMINLOC1": 257, - "RPL_ADMINLOC2": 258, - "RPL_ADMINEMAIL": 259, - "RPL_TRACELOG": 261, - "RPL_TRACEPING": 262, - "RPL_TRACEEND": 262, - "RPL_TRYAGAIN": 263, - "RPL_LOCALUSERS": 265, - "RPL_GLOBALUSERS": 266, - "RPL_START_NETSTAT": 267, - "RPL_NETSTAT": 268, - "RPL_END_NETSTAT": 269, - "RPL_PRIVS": 270, - "RPL_SILELIST": 271, - "RPL_ENDOFSILELIST": 272, - "RPL_NOTIFY": 273, - "RPL_ENDNOTIFY": 274, - "RPL_STATSDELTA": 274, - "RPL_VCHANEXIST": 276, - "RPL_VCHANLIST": 277, - "RPL_VCHANHELP": 278, - "RPL_GLIST": 280, - "RPL_ENDOFGLIST": 281, - "RPL_ACCEPTLIST": 281, - "RPL_ENDOFACCEPT": 282, - "RPL_JUPELIST": 282, - "RPL_ENDOFJUPELIST": 283, - "RPL_FEATURE": 284, - "RPL_GLIST_HASH": 285, - "RPL_CHANINFO_HANDLE": 285, - "RPL_NEWHOSTIS": 285, - "RPL_CHANINFO_USERS": 286, - "RPL_CHKHEAD": 286, - "RPL_CHANINFO_CHOPS": 287, - "RPL_CHANUSER": 287, - "RPL_CHANINFO_VOICES": 288, - "RPL_PATCHHEAD": 288, - "RPL_CHANINFO_AWAY": 289, - "RPL_PATCHCON": 289, - "RPL_CHANINFO_OPERS": 290, - "RPL_HELPHDR": 290, - "RPL_DATASTR": 290, - "RPL_CHANINFO_BANNED": 291, - "RPL_HELPOP": 291, - "RPL_ENDOFCHECK": 291, - "RPL_CHANINFO_BANS": 292, - "RPL_HELPTLR": 292, - "RPL_CHANINFO_INVITE": 293, - "RPL_HELPHLP": 293, - "RPL_CHANINFO_INVITES": 294, - "RPL_HELPFWD": 294, - "RPL_CHANINFO_KICK": 295, - "RPL_HELPIGN": 295, - "RPL_CHANINFO_KICKS": 296, - "RPL_END_CHANINFO": 299, - "RPL_NONE": 300, - "RPL_AWAY": 301, - "RPL_USERHOST": 302, - "RPL_ISON": 303, - "RPL_TEXT": 304, - "RPL_UNAWAY": 305, - "RPL_NOWAWAY": 306, - "RPL_WHOISREGNICK": 307, - "RPL_SUSERHOST": 307, - "RPL_NOTIFYACTION": 308, - "RPL_WHOISADMIN": 308, - "RPL_NICKTRACE": 309, - "RPL_WHOISSADMIN": 309, - "RPL_WHOISHELPER": 309, - "RPL_WHOISSVCMSG": 310, - "RPL_WHOISHELPOP": 310, - "RPL_WHOISSERVICE": 310, - "RPL_WHOISUSER": 311, - "RPL_WHOISSERVER": 312, - "RPL_WHOISOPERATOR": 313, - "RPL_WHOWASUSER": 314, - "RPL_ENDOFWHO": 315, - "RPL_WHOISCHANOP": 316, - "RPL_WHOISIDLE": 317, - "RPL_ENDOFWHOIS": 318, - "RPL_WHOISCHANNELS": 319, - "RPL_WHOISVIRT": 320, - "RPL_WHOIS_HIDDEN": 320, - "RPL_WHOISSPECIAL": 320, - "RPL_LISTSTART": 321, - "RPL_LIST": 322, - "RPL_LISTEND": 323, - "RPL_CHANNELMODEIS": 324, - "RPL_UNIQOPIS": 325, - "RPL_CHANNELPASSIS": 325, - "RPL_NOCHANPASS": 326, - "RPL_CHPASSUNKNOWN": 327, - "RPL_CHANNEL_URL": 328, - "RPL_CREATIONTIME": 329, - "RPL_WHOWAS_TIME": 330, - "RPL_WHOISACCOUNT": 330, - "RPL_NOTOPIC": 331, - "RPL_TOPIC": 332, - "RPL_TOPICWHOTIME": 333, - "RPL_LISTUSAGE": 334, - "RPL_COMMANDSYNTAX": 334, - "RPL_LISTSYNTAX": 334, - "RPL_CHANPASSOK": 338, - "RPL_WHOISACTUALLY": 338, - "RPL_BADCHANPASS": 339, - "RPL_INVITING": 341, - "RPL_SUMMONING": 342, - "RPL_INVITED": 345, - "RPL_INVITELIST": 346, - "RPL_ENDOFINVITELIST": 347, - "RPL_EXCEPTLIST": 348, - "RPL_ENDOFEXCEPTLIST": 349, - "RPL_VERSION": 351, - "RPL_WHOREPLY": 352, - "RPL_NAMREPLY": 353, - "RPL_WHOSPCRPL": 354, - "RPL_NAMREPLY_": 355, - "RPL_KILLDONE": 361, - "RPL_CLOSING": 362, - "RPL_CLOSEEND": 363, - "RPL_LINKS": 364, - "RPL_ENDOFLINKS": 365, - "RPL_ENDOFNAMES": 366, - "RPL_BANLIST": 367, - "RPL_ENDOFBANLIST": 368, - "RPL_ENDOFWHOWAS": 369, - "RPL_INFO": 371, - "RPL_MOTD": 372, - "RPL_INFOSTART": 373, - "RPL_ENDOFINFO": 374, - "RPL_MOTDSTART": 375, - "RPL_ENDOFMOTD": 376, - "RPL_KICKEXPIRED": 377, - "RPL_SPAM": 377, - "RPL_BANEXPIRED": 378, - "RPL_WHOISHOST": 378, - "RPL_KICKLINKED": 379, - "RPL_WHOISMODES": 379, - "RPL_BANLINKED": 380, - "RPL_YOURHELPER": 380, - "RPL_YOUREOPER": 381, - "RPL_REHASHING": 382, - "RPL_YOURESERVICE": 383, - "RPL_MYPORTIS": 384, - "RPL_NOTOPERANYMORE": 385, - "RPL_QLIST": 386, - "RPL_IRCOPS": 386, - "RPL_ENDOFQLIST": 387, - "RPL_ENDOFIRCOPS": 387, - "RPL_ALIST": 388, - "RPL_ENDOFALIST": 389, - "RPL_TIME": 391, - "RPL_USERSSTART": 392, - "RPL_USERS": 393, - "RPL_ENDOFUSERS": 394, - "RPL_NOUSERS": 395, - "RPL_HOSTHIDDEN": 396, - "ERR_UNKNOWNERROR": 400, - "ERR_NOSUCHNICK": 401, - "ERR_NOSUCHSERVER": 402, - "ERR_NOSUCHCHANNEL": 403, - "ERR_CANNOTSENDTOCHAN": 404, - "ERR_TOOMANYCHANNELS": 405, - "ERR_WASNOSUCHNICK": 406, - "ERR_TOOMANYTARGETS": 407, - "ERR_NOSUCHSERVICE": 408, - "ERR_NOCOLORSONCHAN": 408, - "ERR_NOORIGIN": 409, - "ERR_NORECIPIENT": 411, - "ERR_NOTEXTTOSEND": 412, - "ERR_NOTOPLEVEL": 413, - "ERR_WILDTOPLEVEL": 414, - "ERR_BADMASK": 415, - "ERR_TOOMANYMATCHES": 416, - "ERR_QUERYTOOLONG": 416, - "ERR_LENGTHTRUNCATED": 419, - "ERR_UNKNOWNCOMMAND": 421, - "ERR_NOMOTD": 422, - "ERR_NOADMININFO": 423, - "ERR_FILEERROR": 424, - "ERR_NOOPERMOTD": 425, - "ERR_TOOMANYAWAY": 429, - "ERR_EVENTNICKCHANGE": 430, - "ERR_NONICKNAMEGIVEN": 431, - "ERR_ERRONEUSNICKNAME": 432, - "ERR_NICKNAMEINUSE": 433, - "ERR_SERVICENAMEINUSE": 434, - "ERR_NORULES": 434, - "ERR_SERVICECONFUSED": 435, - "ERR_BANONCHAN": 435, - "ERR_NICKCOLLISION": 436, - "ERR_UNAVAILRESOURCE": 437, - "ERR_BANNICKCHANGE": 437, - "ERR_NICKTOOFAST": 438, - "ERR_DEAD": 438, - "ERR_TARGETTOOFAST": 439, - "ERR_SERVICESDOWN": 440, - "ERR_USERNOTINCHANNEL": 441, - "ERR_NOTONCHANNEL": 442, - "ERR_USERONCHANNEL": 443, - "ERR_NOLOGIN": 444, - "ERR_SUMMONDISABLED": 445, - "ERR_USERSDISABLED": 446, - "ERR_NONICKCHANGE": 447, - "ERR_NOTIMPLEMENTED": 449, - "ERR_NOTREGISTERED": 451, - "ERR_IDCOLLISION": 452, - "ERR_NICKLOST": 453, - "ERR_HOSTILENAME": 455, - "ERR_ACCEPTFULL": 456, - "ERR_ACCEPTEXIST": 457, - "ERR_ACCEPTNOT": 458, - "ERR_NOHIDING": 459, - "ERR_NOTFORHALFOPS": 460, - "ERR_NEEDMOREPARAMS": 461, - "ERR_ALREADYREGISTERED": 462, - "ERR_NOPERMFORHOST": 463, - "ERR_PASSWDMISMATCH": 464, - "ERR_YOUREBANNEDCREEP": 465, - "ERR_YOUWILLBEBANNED": 466, - "ERR_KEYSET": 467, - "ERR_INVALIDUSERNAME": 468, - "ERR_ONLYSERVERSCANCHANGE": 468, - "ERR_LINKSET": 469, - "ERR_LINKCHANNEL": 470, - "ERR_KICKEDFROMCHAN": 470, - "ERR_CHANNELISFULL": 471, - "ERR_UNKNOWNMODE": 472, - "ERR_INVITEONLYCHAN": 473, - "ERR_BANNEDFROMCHAN": 474, - "ERR_BADCHANNELKEY": 475, - "ERR_BADCHANMASK": 476, - "ERR_NOCHANMODES": 477, - "ERR_NEEDREGGEDNICK": 477, - "ERR_BANLISTFULL": 478, - "ERR_BADCHANNAME": 479, - "ERR_LINKFAIL": 479, - "ERR_NOULINE": 480, - "ERR_CANNOTKNOCK": 480, - "ERR_NOPRIVILEGES": 481, - "ERR_CHANOPRIVSNEEDED": 482, - "ERR_CANTKILLSERVER": 483, - "ERR_RESTRICTED": 484, - "ERR_ISCHANSERVICE": 484, - "ERR_DESYNC": 484, - "ERR_ATTACKDENY": 484, - "ERR_UNIQOPRIVSNEEDED": 485, - "ERR_KILLDENY": 485, - "ERR_CANTKICKADMIN": 485, - "ERR_ISREALSERVICE": 485, - "ERR_NONONREG": 486, - "ERR_HTMDISABLED": 486, - "ERR_ACCOUNTONLY": 486, - "ERR_CHANTOORECENT": 487, - "ERR_MSGSERVICES": 487, - "ERR_TSLESSCHAN": 488, - "ERR_VOICENEEDED": 489, - "ERR_SECUREONLYCHAN": 489, - "ERR_NOOPERHOST": 491, - "ERR_NOSERVICEHOST": 492, - "ERR_NOFEATURE": 493, - "ERR_BADFEATURE": 494, - "ERR_BADLOGTYPE": 495, - "ERR_BADLOGSYS": 496, - "ERR_BADLOGVALUE": 497, - "ERR_ISOPERLCHAN": 498, - "ERR_CHANOWNPRIVNEEDED": 499, - "ERR_UMODEUNKNOWNFLAG": 501, - "ERR_USERSDONTMATCH": 502, - "ERR_GHOSTEDCLIENT": 503, - "ERR_VWORLDWARN": 503, - "ERR_USERNOTONSERV": 504, - "ERR_SILELISTFULL": 511, - "ERR_TOOMANYWATCH": 512, - "ERR_BADPING": 513, - "ERR_INVALID_ERROR": 514, - "ERR_TOOMANYDCC": 514, - "ERR_BADEXPIRE": 515, - "ERR_DONTCHEAT": 516, - "ERR_DISABLED": 517, - "ERR_NOINVITE": 518, - "ERR_LONGMASK": 518, - "ERR_ADMONLY": 519, - "ERR_TOOMANYUSERS": 519, - "ERR_OPERONLY": 520, - "ERR_MASKTOOWIDE": 520, - "ERR_WHOTRUNC": 520, - "ERR_LISTSYNTAX": 521, - "ERR_WHOSYNTAX": 522, - "ERR_WHOLIMEXCEED": 523, - "ERR_QUARANTINED": 524, - "ERR_OPERSPVERIFY": 524, - "ERR_REMOTEPFX": 525, - "ERR_PFXUNROUTABLE": 526, - "ERR_BADHOSTMASK": 550, - "ERR_HOSTUNAVAIL": 551, - "ERR_USINGSLINE": 552, - "ERR_STATSSLINE": 553, - "RPL_LOGON": 600, - "RPL_LOGOFF": 601, - "RPL_WATCHOFF": 602, - "RPL_WATCHSTAT": 603, - "RPL_NOWON": 604, - "RPL_NOWOFF": 605, - "RPL_WATCHLIST": 606, - "RPL_ENDOFWATCHLIST": 607, - "RPL_WATCHCLEAR": 608, - "RPL_ISOPER": 610, - "RPL_ISLOCOP": 611, - "RPL_ISNOTOPER": 612, - "RPL_ENDOFISOPER": 613, - "RPL_DCCSTATUS": 617, - "RPL_DCCLIST": 618, - "RPL_ENDOFDCCLIST": 619, - "RPL_WHOWASHOST": 619, - "RPL_DCCINFO": 620, - "RPL_ENDOFO": 626, - "RPL_SETTINGS": 630, - "RPL_ENDOFSETTINGS": 631, - "RPL_DUMPING": 640, - "RPL_DUMPRPL": 641, - "RPL_EODUMP": 642, - "RPL_TRACEROUTE_HOP": 660, - "RPL_TRACEROUTE_START": 661, - "RPL_MODECHANGEWARN": 662, - "RPL_CHANREDIR": 663, - "RPL_SERVMODEIS": 664, - "RPL_OTHERUMODEIS": 665, - "RPL_ENDOF_GENERIC": 666, - "RPL_WHOWASDETAILS": 670, - "RPL_WHOISSECURE": 671, - "RPL_UNKNOWNMODES": 672, - "RPL_CANNOTSETMODES": 673, - "RPL_LUSERSTAFF": 678, - "RPL_TIMEONSERVERIS": 679, - "RPL_NETWORKS": 682, - "RPL_YOURLANGUAGEIS": 687, - "RPL_LANGUAGE": 688, - "RPL_WHOISSTAFF": 689, - "RPL_WHOISLANGUAGE": 690, - "RPL_HELPSTART": 704, - "RPL_HELPTXT": 705, - "RPL_ENDOFHELP": 706, - "RPL_ETRACEFULL": 708, - "RPL_ETRACE": 709, - "RPL_KNOCK": 710, - "RPL_KNOCKDLVR": 711, - "ERR_TOOMANYKNOCK": 712, - "ERR_CHANOPEN": 713, - "ERR_KNOCKONCHAN": 714, - "ERR_KNOCKDISABLED": 715, - "RPL_TARGUMODEG": 716, - "RPL_TARGNOTIFY": 717, - "RPL_UMODEGMSG": 718, - "RPL_ENDOFOMOTD": 722, - "ERR_NOPRIVS": 723, - "RPL_TESTMARK": 724, - "RPL_TESTLINE": 725, - "RPL_NOTESTLINE": 726, - "RPL_XINFO": 771, - "RPL_XINFOSTART": 773, - "RPL_XINFOEND": 774, - "ERR_CANNOTDOCOMMAND": 972, - "ERR_CANNOTCHANGEUMODE": 973, - "ERR_CANNOTCHANGECHANMODE": 974, - "ERR_CANNOTCHANGESERVERMODE": 975, - "ERR_CANNOTSENDTONICK": 976, - "ERR_UNKNOWNSERVERMODE": 977, - "ERR_SERVERMODELOCK": 979, - "ERR_BADCHARENCODING": 980, - "ERR_TOOMANYLANGUAGES": 981, - "ERR_NOLANGUAGE": 982, - "ERR_TEXTTOOSHORT": 983, - "ERR_NUMERIC_ERR": 999 - } - } - Method { name: "version"; type: "string" } - Method { - name: "codeToString" - type: "string" - Parameter { name: "code"; type: "int" } - } - Method { - name: "nickFromPrefix" - type: "string" - Parameter { name: "prefix"; type: "string" } - } - Method { - name: "identFromPrefix" - type: "string" - Parameter { name: "prefix"; type: "string" } - } - Method { - name: "hostFromPrefix" - type: "string" - Parameter { name: "prefix"; type: "string" } - } - Method { name: "registerMetaTypes" } - } - Component { - name: "IrcBuffer" - prototype: "QObject" - exports: [ - "Communi/IrcBuffer 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Property { name: "title"; type: "string"; isReadonly: true } - Property { name: "name"; type: "string" } - Property { name: "prefix"; type: "string" } - Property { name: "connection"; type: "IrcConnection"; isReadonly: true; isPointer: true } - Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } - Property { name: "model"; type: "IrcBufferModel"; isReadonly: true; isPointer: true } - Property { name: "active"; type: "bool"; isReadonly: true } - Property { name: "channel"; type: "bool"; isReadonly: true } - Property { name: "sticky"; type: "bool" } - Property { name: "persistent"; type: "bool" } - Signal { - name: "titleChanged" - Parameter { name: "title"; type: "string" } - } - Signal { - name: "nameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "prefixChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "messageReceived" - Parameter { name: "message"; type: "IrcMessage"; isPointer: true } - } - Signal { - name: "destroyed" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "activeChanged" - Parameter { name: "active"; type: "bool" } - } - Signal { - name: "stickyChanged" - Parameter { name: "sticky"; type: "bool" } - } - Signal { - name: "persistentChanged" - Parameter { name: "persistent"; type: "bool" } - } - Method { - name: "setName" - Parameter { name: "name"; type: "string" } - } - Method { - name: "setPrefix" - Parameter { name: "prefix"; type: "string" } - } - Method { - name: "receiveMessage" - Parameter { name: "message"; type: "IrcMessage"; isPointer: true } - } - Method { name: "toChannel"; type: "IrcChannel*" } - Method { - name: "sendCommand" - type: "bool" - Parameter { name: "command"; type: "IrcCommand"; isPointer: true } - } - } - Component { - name: "IrcBufferModel" - prototype: "QAbstractListModel" - exports: [ - "Communi/IrcBufferModel 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Property { name: "count"; type: "int"; isReadonly: true } - Property { name: "sortOrder"; type: "Qt::SortOrder" } - Property { name: "sortMethod"; type: "Irc::SortMethod" } - Property { name: "channels"; type: "QStringList"; isReadonly: true } - Property { name: "displayRole"; type: "Irc::DataRole" } - Property { name: "buffers"; type: "QList"; isReadonly: true } - Property { name: "connection"; type: "IrcConnection"; isPointer: true } - Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } - Property { name: "bufferPrototype"; type: "IrcBuffer"; isPointer: true } - Property { name: "channelPrototype"; type: "IrcChannel"; isPointer: true } - Signal { - name: "countChanged" - Parameter { name: "count"; type: "int" } - } - Signal { - name: "added" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "removed" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "aboutToBeAdded" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "aboutToBeRemoved" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "buffersChanged" - Parameter { name: "buffers"; type: "QList" } - } - Signal { - name: "channelsChanged" - Parameter { name: "channels"; type: "QStringList" } - } - Signal { - name: "connectionChanged" - Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } - } - Signal { - name: "networkChanged" - Parameter { name: "network"; type: "IrcNetwork"; isPointer: true } - } - Signal { - name: "messageIgnored" - Parameter { name: "message"; type: "IrcMessage"; isPointer: true } - } - Signal { - name: "bufferPrototypeChanged" - Parameter { name: "prototype"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "channelPrototypeChanged" - Parameter { name: "prototype"; type: "IrcChannel"; isPointer: true } - } - Method { name: "clear" } - Method { - name: "sort" - Parameter { name: "column"; type: "int" } - Parameter { name: "order"; type: "Qt::SortOrder" } - } - Method { - name: "sort" - Parameter { name: "column"; type: "int" } - } - Method { name: "sort" } - Method { - name: "sort" - Parameter { name: "method"; type: "Irc::SortMethod" } - Parameter { name: "order"; type: "Qt::SortOrder" } - } - Method { - name: "sort" - Parameter { name: "method"; type: "Irc::SortMethod" } - } - Method { - name: "get" - type: "IrcBuffer*" - Parameter { name: "index"; type: "int" } - } - Method { - name: "find" - type: "IrcBuffer*" - Parameter { name: "title"; type: "string" } - } - Method { - name: "contains" - type: "bool" - Parameter { name: "title"; type: "string" } - } - Method { - name: "indexOf" - type: "int" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Method { - name: "add" - type: "IrcBuffer*" - Parameter { name: "title"; type: "string" } - } - Method { - name: "add" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Method { - name: "remove" - Parameter { name: "title"; type: "string" } - } - Method { - name: "remove" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - } - Component { - name: "IrcChannel" - prototype: "IrcBuffer" - exports: [ - "Communi/IrcChannel 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Property { name: "mode"; type: "string"; isReadonly: true } - Property { name: "topic"; type: "string"; isReadonly: true } - Signal { - name: "modeChanged" - Parameter { name: "mode"; type: "string" } - } - Signal { - name: "topicChanged" - Parameter { name: "topic"; type: "string" } - } - Method { - name: "part" - Parameter { name: "reason"; type: "string" } - } - Method { name: "part" } - } - Component { - name: "IrcCommand" - prototype: "QObject" - exports: [ - "Communi/IrcCommand 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Enum { - name: "Type" - values: { - "Admin": 0, - "Away": 1, - "Capability": 2, - "CtcpAction": 3, - "CtcpReply": 4, - "CtcpRequest": 5, - "Custom": 6, - "Info": 7, - "Invite": 8, - "Join": 9, - "Kick": 10, - "Knock": 11, - "List": 12, - "Message": 13, - "Mode": 14, - "Motd": 15, - "Names": 16, - "Nick": 17, - "Notice": 18, - "Part": 19, - "Ping": 20, - "Pong": 21, - "Quit": 22, - "Quote": 23, - "Stats": 24, - "Time": 25, - "Topic": 26, - "Trace": 27, - "Users": 28, - "Version": 29, - "Who": 30, - "Whois": 31, - "Whowas": 32 - } - } - Property { name: "parameters"; type: "QStringList" } - Property { name: "encoding"; type: "QByteArray" } - Property { name: "type"; type: "Type" } - Method { - name: "toMessage" - type: "IrcMessage*" - Parameter { name: "prefix"; type: "string" } - Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } - } - Method { - name: "createAdmin" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createAdmin"; type: "IrcCommand*" } - Method { - name: "createAway" - type: "IrcCommand*" - Parameter { name: "reason"; type: "string" } - } - Method { name: "createAway"; type: "IrcCommand*" } - Method { - name: "createCapability" - type: "IrcCommand*" - Parameter { name: "subCommand"; type: "string" } - Parameter { name: "capability"; type: "string" } - } - Method { - name: "createCapability" - type: "IrcCommand*" - Parameter { name: "subCommand"; type: "string" } - Parameter { name: "capabilities"; type: "QStringList" } - } - Method { - name: "createCapability" - type: "IrcCommand*" - Parameter { name: "subCommand"; type: "string" } - } - Method { - name: "createCtcpAction" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "action"; type: "string" } - } - Method { - name: "createCtcpReply" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "reply"; type: "string" } - } - Method { - name: "createCtcpRequest" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "request"; type: "string" } - } - Method { - name: "createInfo" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createInfo"; type: "IrcCommand*" } - Method { - name: "createInvite" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createJoin" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "key"; type: "string" } - } - Method { - name: "createJoin" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createJoin" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - Parameter { name: "keys"; type: "QStringList" } - } - Method { - name: "createJoin" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - } - Method { - name: "createKick" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "user"; type: "string" } - Parameter { name: "reason"; type: "string" } - } - Method { - name: "createKick" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "user"; type: "string" } - } - Method { - name: "createKnock" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "message"; type: "string" } - } - Method { - name: "createKnock" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createList" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - Parameter { name: "server"; type: "string" } - } - Method { - name: "createList" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - } - Method { name: "createList"; type: "IrcCommand*" } - Method { - name: "createMessage" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "message"; type: "string" } - } - Method { - name: "createMode" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "mode"; type: "string" } - Parameter { name: "arg"; type: "string" } - } - Method { - name: "createMode" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "mode"; type: "string" } - } - Method { - name: "createMode" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - } - Method { - name: "createMotd" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createMotd"; type: "IrcCommand*" } - Method { - name: "createNames" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "server"; type: "string" } - } - Method { - name: "createNames" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { name: "createNames"; type: "IrcCommand*" } - Method { - name: "createNames" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - Parameter { name: "server"; type: "string" } - } - Method { - name: "createNames" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - } - Method { - name: "createNick" - type: "IrcCommand*" - Parameter { name: "nick"; type: "string" } - } - Method { - name: "createNotice" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "notice"; type: "string" } - } - Method { - name: "createPart" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "reason"; type: "string" } - } - Method { - name: "createPart" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createPart" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - Parameter { name: "reason"; type: "string" } - } - Method { - name: "createPart" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - } - Method { - name: "createPing" - type: "IrcCommand*" - Parameter { name: "argument"; type: "string" } - } - Method { - name: "createPong" - type: "IrcCommand*" - Parameter { name: "argument"; type: "string" } - } - Method { - name: "createQuit" - type: "IrcCommand*" - Parameter { name: "reason"; type: "string" } - } - Method { name: "createQuit"; type: "IrcCommand*" } - Method { - name: "createQuote" - type: "IrcCommand*" - Parameter { name: "raw"; type: "string" } - } - Method { - name: "createQuote" - type: "IrcCommand*" - Parameter { name: "parameters"; type: "QStringList" } - } - Method { - name: "createStats" - type: "IrcCommand*" - Parameter { name: "query"; type: "string" } - Parameter { name: "server"; type: "string" } - } - Method { - name: "createStats" - type: "IrcCommand*" - Parameter { name: "query"; type: "string" } - } - Method { - name: "createTime" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createTime"; type: "IrcCommand*" } - Method { - name: "createTopic" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "topic"; type: "string" } - } - Method { - name: "createTopic" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createTrace" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - } - Method { name: "createTrace"; type: "IrcCommand*" } - Method { - name: "createUsers" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createUsers"; type: "IrcCommand*" } - Method { - name: "createVersion" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - } - Method { name: "createVersion"; type: "IrcCommand*" } - Method { - name: "createWho" - type: "IrcCommand*" - Parameter { name: "mask"; type: "string" } - Parameter { name: "operators"; type: "bool" } - } - Method { - name: "createWho" - type: "IrcCommand*" - Parameter { name: "mask"; type: "string" } - } - Method { - name: "createWhois" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - } - Method { - name: "createWhowas" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - Parameter { name: "count"; type: "int" } - } - Method { - name: "createWhowas" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - } - } - Component { - name: "IrcCommandParser" - prototype: "QObject" - exports: [ - "Communi/IrcCommandParser 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Enum { - name: "Details" - values: { - "Full": 0, - "NoTarget": 1, - "NoPrefix": 2, - "NoEllipsis": 4, - "NoParentheses": 8, - "NoBrackets": 16, - "NoAngles": 32, - "Visual": 7 - } - } - Property { name: "commands"; type: "QStringList"; isReadonly: true } - Property { name: "triggers"; type: "QStringList" } - Property { name: "channels"; type: "QStringList" } - Property { name: "target"; type: "string" } - Property { name: "tolerant"; type: "bool" } - Signal { - name: "commandsChanged" - Parameter { name: "commands"; type: "QStringList" } - } - Signal { - name: "triggersChanged" - Parameter { name: "triggers"; type: "QStringList" } - } - Signal { - name: "channelsChanged" - Parameter { name: "channels"; type: "QStringList" } - } - Signal { - name: "targetChanged" - Parameter { name: "target"; type: "string" } - } - Signal { - name: "tolerancyChanged" - Parameter { name: "tolerant"; type: "bool" } - } - Method { name: "clear" } - Method { name: "reset" } - Method { - name: "setTriggers" - Parameter { name: "triggers"; type: "QStringList" } - } - Method { - name: "setChannels" - Parameter { name: "channels"; type: "QStringList" } - } - Method { - name: "setTarget" - Parameter { name: "target"; type: "string" } - } - Method { - name: "syntax" - type: "string" - Parameter { name: "command"; type: "string" } - Parameter { name: "details"; type: "Details" } - } - Method { - name: "syntax" - type: "string" - Parameter { name: "command"; type: "string" } - } - Method { - name: "addCommand" - Parameter { name: "type"; type: "IrcCommand::Type" } - Parameter { name: "syntax"; type: "string" } - } - Method { - name: "removeCommand" - Parameter { name: "type"; type: "IrcCommand::Type" } - Parameter { name: "syntax"; type: "string" } - } - Method { - name: "removeCommand" - Parameter { name: "type"; type: "IrcCommand::Type" } - } - Method { - name: "parse" - type: "IrcCommand*" - Parameter { name: "input"; type: "string" } - } - } - Component { - name: "IrcConnection" - prototype: "QObject" - exports: [ - "Communi/IrcConnection 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Enum { - name: "Status" - values: { - "Inactive": 0, - "Waiting": 1, - "Connecting": 2, - "Connected": 3, - "Closing": 4, - "Closed": 5, - "Error": 6 - } - } - Property { name: "host"; type: "string" } - Property { name: "port"; type: "int" } - Property { name: "userName"; type: "string" } - Property { name: "nickName"; type: "string" } - Property { name: "realName"; type: "string" } - Property { name: "password"; type: "string" } - Property { name: "displayName"; type: "string" } - Property { name: "encoding"; type: "QByteArray" } - Property { name: "status"; type: "Status"; isReadonly: true } - Property { name: "active"; type: "bool"; isReadonly: true } - Property { name: "connected"; type: "bool"; isReadonly: true } - Property { name: "enabled"; type: "bool" } - Property { name: "reconnectDelay"; type: "int" } - Property { name: "socket"; type: "QAbstractSocket"; isPointer: true } - Property { name: "secure"; type: "bool" } - Property { name: "saslMechanism"; type: "string" } - Property { name: "supportedSaslMechanisms"; type: "QStringList"; isReadonly: true } - Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } - Signal { name: "connecting" } - Signal { - name: "nickNameReserved" - Parameter { name: "alternate"; type: "string"; isPointer: true } - } - Signal { name: "connected" } - Signal { name: "disconnected" } - Signal { - name: "statusChanged" - Parameter { name: "status"; type: "IrcConnection::Status" } - } - Signal { - name: "socketError" - Parameter { name: "error"; type: "QAbstractSocket::SocketError" } - } - Signal { - name: "socketStateChanged" - Parameter { name: "state"; type: "QAbstractSocket::SocketState" } - } - Signal { - name: "messageReceived" - Parameter { name: "message"; type: "IrcMessage"; isPointer: true } - } - Signal { - name: "capabilityMessageReceived" - Parameter { name: "message"; type: "IrcCapabilityMessage"; isPointer: true } - } - Signal { - name: "errorMessageReceived" - Parameter { name: "message"; type: "IrcErrorMessage"; isPointer: true } - } - Signal { - name: "inviteMessageReceived" - Parameter { name: "message"; type: "IrcInviteMessage"; isPointer: true } - } - Signal { - name: "joinMessageReceived" - Parameter { name: "message"; type: "IrcJoinMessage"; isPointer: true } - } - Signal { - name: "kickMessageReceived" - Parameter { name: "message"; type: "IrcKickMessage"; isPointer: true } - } - Signal { - name: "modeMessageReceived" - Parameter { name: "message"; type: "IrcModeMessage"; isPointer: true } - } - Signal { - name: "namesMessageReceived" - Parameter { name: "message"; type: "IrcNamesMessage"; isPointer: true } - } - Signal { - name: "nickMessageReceived" - Parameter { name: "message"; type: "IrcNickMessage"; isPointer: true } - } - Signal { - name: "noticeMessageReceived" - Parameter { name: "message"; type: "IrcNoticeMessage"; isPointer: true } - } - Signal { - name: "numericMessageReceived" - Parameter { name: "message"; type: "IrcNumericMessage"; isPointer: true } - } - Signal { - name: "motdMessageReceived" - Parameter { name: "message"; type: "IrcMotdMessage"; isPointer: true } - } - Signal { - name: "partMessageReceived" - Parameter { name: "message"; type: "IrcPartMessage"; isPointer: true } - } - Signal { - name: "pingMessageReceived" - Parameter { name: "message"; type: "IrcPingMessage"; isPointer: true } - } - Signal { - name: "pongMessageReceived" - Parameter { name: "message"; type: "IrcPongMessage"; isPointer: true } - } - Signal { - name: "privateMessageReceived" - Parameter { name: "message"; type: "IrcPrivateMessage"; isPointer: true } - } - Signal { - name: "quitMessageReceived" - Parameter { name: "message"; type: "IrcQuitMessage"; isPointer: true } - } - Signal { - name: "topicMessageReceived" - Parameter { name: "message"; type: "IrcTopicMessage"; isPointer: true } - } - Signal { - name: "hostChanged" - Parameter { name: "host"; type: "string" } - } - Signal { - name: "portChanged" - Parameter { name: "port"; type: "int" } - } - Signal { - name: "userNameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "nickNameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "realNameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "passwordChanged" - Parameter { name: "password"; type: "string" } - } - Signal { - name: "displayNameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "reconnectDelayChanged" - Parameter { name: "seconds"; type: "int" } - } - Signal { - name: "enabledChanged" - Parameter { name: "enabled"; type: "bool" } - } - Signal { - name: "secureChanged" - Parameter { name: "secure"; type: "bool" } - } - Signal { - name: "saslMechanismChanged" - Parameter { name: "mechanism"; type: "string" } - } - Method { name: "open" } - Method { name: "close" } - Method { - name: "quit" - Parameter { name: "reason"; type: "string" } - } - Method { name: "quit" } - Method { - name: "setEnabled" - Parameter { name: "enabled"; type: "bool" } - } - Method { name: "setEnabled" } - Method { - name: "setDisabled" - Parameter { name: "disabled"; type: "bool" } - } - Method { name: "setDisabled" } - Method { - name: "sendCommand" - type: "bool" - Parameter { name: "command"; type: "IrcCommand"; isPointer: true } - } - Method { - name: "sendData" - type: "bool" - Parameter { name: "data"; type: "QByteArray" } - } - Method { - name: "sendRaw" - type: "bool" - Parameter { name: "message"; type: "string" } - } - } - Component { - name: "IrcLagTimer" - prototype: "QObject" - exports: [ - "Communi/IrcLagTimer 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Property { name: "lag"; type: "qint64"; isReadonly: true } - Property { name: "interval"; type: "int" } - Property { name: "connection"; type: "IrcConnection"; isPointer: true } - Signal { - name: "lagChanged" - Parameter { name: "lag"; type: "qint64" } - } - } - Component { - name: "IrcMessage" - prototype: "QObject" - exports: [ - "Communi/IrcMessage 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Enum { - name: "Type" - values: { - "Unknown": 0, - "Capability": 1, - "Error": 2, - "Invite": 3, - "Join": 4, - "Kick": 5, - "Mode": 6, - "Motd": 7, - "Names": 8, - "Nick": 9, - "Notice": 10, - "Numeric": 11, - "Part": 12, - "Ping": 13, - "Pong": 14, - "Private": 15, - "Quit": 16, - "Topic": 17 - } - } - Enum { - name: "Flag" - values: { - "None": 0, - "Own": 1, - "Identified": 2, - "Unidentified": 4 - } - } - Enum { - name: "Flags" - values: { - "None": 0, - "Own": 1, - "Identified": 2, - "Unidentified": 4 - } - } - Property { name: "connection"; type: "IrcConnection"; isReadonly: true; isPointer: true } - Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } - Property { name: "type"; type: "Type"; isReadonly: true } - Property { name: "flags"; type: "Flags"; isReadonly: true } - Property { name: "valid"; type: "bool"; isReadonly: true } - Property { name: "command"; type: "string"; isReadonly: true } - Property { name: "prefix"; type: "string" } - Property { name: "nick"; type: "string"; isReadonly: true } - Property { name: "ident"; type: "string"; isReadonly: true } - Property { name: "host"; type: "string"; isReadonly: true } - Property { name: "parameters"; type: "QStringList" } - Property { name: "timeStamp"; type: "QDateTime" } - Method { name: "toData"; type: "QByteArray" } - Method { - name: "fromData" - type: "IrcMessage*" - Parameter { name: "data"; type: "QByteArray" } - Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } - } - Method { - name: "fromParameters" - type: "IrcMessage*" - Parameter { name: "prefix"; type: "string" } - Parameter { name: "command"; type: "string" } - Parameter { name: "parameters"; type: "QStringList" } - Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } - } - } - Component { - name: "IrcNetwork" - prototype: "QObject" - exports: [ - "Communi/IrcNetwork 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Enum { - name: "ModeType" - values: { - "TypeA": 1, - "TypeB": 2, - "TypeC": 4, - "TypeD": 8, - "AllTypes": 15 - } - } - Enum { - name: "ModeTypes" - values: { - "TypeA": 1, - "TypeB": 2, - "TypeC": 4, - "TypeD": 8, - "AllTypes": 15 - } - } - Enum { - name: "Limit" - values: { - "NickLength": 0, - "ChannelLength": 1, - "TopicLength": 2, - "MessageLength": 3, - "KickReasonLength": 4, - "AwayReasonLength": 5, - "ModeCount": 6 - } - } - Property { name: "initialized"; type: "bool"; isReadonly: true } - Property { name: "name"; type: "string"; isReadonly: true } - Property { name: "modes"; type: "QStringList"; isReadonly: true } - Property { name: "prefixes"; type: "QStringList"; isReadonly: true } - Property { name: "channelTypes"; type: "QStringList"; isReadonly: true } - Property { name: "availableCapabilities"; type: "QStringList"; isReadonly: true } - Property { name: "requestedCapabilities"; type: "QStringList" } - Property { name: "activeCapabilities"; type: "QStringList"; isReadonly: true } - Signal { name: "initialized" } - Signal { - name: "nameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "modesChanged" - Parameter { name: "modes"; type: "QStringList" } - } - Signal { - name: "prefixesChanged" - Parameter { name: "prefixes"; type: "QStringList" } - } - Signal { - name: "channelTypesChanged" - Parameter { name: "types"; type: "QStringList" } - } - Signal { - name: "availableCapabilitiesChanged" - Parameter { name: "capabilities"; type: "QStringList" } - } - Signal { - name: "requestedCapabilitiesChanged" - Parameter { name: "capabilities"; type: "QStringList" } - } - Signal { - name: "activeCapabilitiesChanged" - Parameter { name: "capabilities"; type: "QStringList" } - } - Signal { name: "requestingCapabilities" } - Method { - name: "requestCapability" - type: "bool" - Parameter { name: "capability"; type: "string" } - } - Method { - name: "requestCapabilities" - type: "bool" - Parameter { name: "capabilities"; type: "QStringList" } - } - Method { - name: "setRequestedCapabilities" - Parameter { name: "capabilities"; type: "QStringList" } - } - Method { - name: "modeToPrefix" - type: "string" - Parameter { name: "mode"; type: "string" } - } - Method { - name: "prefixToMode" - type: "string" - Parameter { name: "prefix"; type: "string" } - } - Method { - name: "isChannel" - type: "bool" - Parameter { name: "name"; type: "string" } - } - Method { - name: "channelModes" - type: "QStringList" - Parameter { name: "types"; type: "IrcNetwork::ModeTypes" } - } - Method { - name: "numericLimit" - type: "int" - Parameter { name: "limit"; type: "IrcNetwork::Limit" } - } - Method { - name: "modeLimit" - type: "int" - Parameter { name: "mode"; type: "string" } - } - Method { - name: "channelLimit" - type: "int" - Parameter { name: "type"; type: "string" } - } - Method { - name: "targetLimit" - type: "int" - Parameter { name: "command"; type: "string" } - } - Method { - name: "hasCapability" - type: "bool" - Parameter { name: "capability"; type: "string" } - } - Method { - name: "isCapable" - type: "bool" - Parameter { name: "capability"; type: "string" } - } - } - Component { - name: "IrcPalette" - prototype: "QObject" - exports: [ - "Communi/IrcPalette 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Property { name: "white"; type: "string" } - Property { name: "black"; type: "string" } - Property { name: "blue"; type: "string" } - Property { name: "green"; type: "string" } - Property { name: "red"; type: "string" } - Property { name: "brown"; type: "string" } - Property { name: "purple"; type: "string" } - Property { name: "orange"; type: "string" } - Property { name: "yellow"; type: "string" } - Property { name: "lightGreen"; type: "string" } - Property { name: "cyan"; type: "string" } - Property { name: "lightCyan"; type: "string" } - Property { name: "lightBlue"; type: "string" } - Property { name: "pink"; type: "string" } - Property { name: "gray"; type: "string" } - Property { name: "lightGray"; type: "string" } - } - Component { - name: "IrcQmlFilter" - prototype: "QObject" - exports: [ - "Communi/IrcCommandFilter 3.0", - "Communi/IrcFilter 3.0", - "Communi/IrcMessageFilter 3.0" - ] - exportMetaObjectRevisions: [ - 0, - 0, - 0 - ] - Property { name: "connection"; type: "IrcConnection"; isPointer: true } - Signal { name: "connectionChanged" } - } - Component { - name: "IrcTextFormat" - prototype: "QObject" - exports: [ - "Communi/IrcTextFormat 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Property { name: "palette"; type: "IrcPalette"; isReadonly: true; isPointer: true } - Property { name: "urlPattern"; type: "string" } - Method { - name: "toHtml" - type: "string" - Parameter { name: "text"; type: "string" } - } - Method { - name: "toPlainText" - type: "string" - Parameter { name: "text"; type: "string" } - } - } - Component { - name: "IrcUser" - prototype: "QObject" - exports: [ - "Communi/IrcUser 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Property { name: "title"; type: "string"; isReadonly: true } - Property { name: "name"; type: "string"; isReadonly: true } - Property { name: "prefix"; type: "string"; isReadonly: true } - Property { name: "mode"; type: "string"; isReadonly: true } - Property { name: "channel"; type: "IrcChannel"; isReadonly: true; isPointer: true } - Signal { - name: "titleChanged" - Parameter { name: "title"; type: "string" } - } - Signal { - name: "nameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "prefixChanged" - Parameter { name: "prefix"; type: "string" } - } - Signal { - name: "modeChanged" - Parameter { name: "mode"; type: "string" } - } - } - Component { - name: "IrcUserModel" - prototype: "QAbstractListModel" - exports: [ - "Communi/IrcUserModel 3.0" - ] - exportMetaObjectRevisions: [ - 0 - ] - Property { name: "count"; type: "int"; isReadonly: true } - Property { name: "names"; type: "QStringList"; isReadonly: true } - Property { name: "users"; type: "QList"; isReadonly: true } - Property { name: "displayRole"; type: "Irc::DataRole" } - Property { name: "channel"; type: "IrcChannel"; isPointer: true } - Property { name: "sortMethod"; type: "Irc::SortMethod" } - Property { name: "sortOrder"; type: "Qt::SortOrder" } - Signal { - name: "added" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - Signal { - name: "removed" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - Signal { - name: "aboutToBeAdded" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - Signal { - name: "aboutToBeRemoved" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - Signal { - name: "countChanged" - Parameter { name: "count"; type: "int" } - } - Signal { - name: "namesChanged" - Parameter { name: "names"; type: "QStringList" } - } - Signal { - name: "usersChanged" - Parameter { name: "users"; type: "QList" } - } - Signal { - name: "channelChanged" - Parameter { name: "channel"; type: "IrcChannel"; isPointer: true } - } - Method { name: "clear" } - Method { - name: "sort" - Parameter { name: "column"; type: "int" } - Parameter { name: "order"; type: "Qt::SortOrder" } - } - Method { - name: "sort" - Parameter { name: "column"; type: "int" } - } - Method { name: "sort" } - Method { - name: "sort" - Parameter { name: "method"; type: "Irc::SortMethod" } - Parameter { name: "order"; type: "Qt::SortOrder" } - } - Method { - name: "sort" - Parameter { name: "method"; type: "Irc::SortMethod" } - } - Method { - name: "get" - type: "IrcUser*" - Parameter { name: "index"; type: "int" } - } - Method { - name: "find" - type: "IrcUser*" - Parameter { name: "name"; type: "string" } - } - Method { - name: "contains" - type: "bool" - Parameter { name: "name"; type: "string" } - } - Method { - name: "indexOf" - type: "int" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - } - Component { - name: "QAbstractItemModel" - prototype: "QObject" - Signal { - name: "dataChanged" - Parameter { name: "topLeft"; type: "QModelIndex" } - Parameter { name: "bottomRight"; type: "QModelIndex" } - } - Signal { - name: "headerDataChanged" - Parameter { name: "orientation"; type: "Qt::Orientation" } - Parameter { name: "first"; type: "int" } - Parameter { name: "last"; type: "int" } - } - Signal { name: "layoutChanged" } - Signal { name: "layoutAboutToBeChanged" } - Signal { - name: "rowsAboutToBeInserted" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "first"; type: "int" } - Parameter { name: "last"; type: "int" } - } - Signal { - name: "rowsInserted" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "first"; type: "int" } - Parameter { name: "last"; type: "int" } - } - Signal { - name: "rowsAboutToBeRemoved" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "first"; type: "int" } - Parameter { name: "last"; type: "int" } - } - Signal { - name: "rowsRemoved" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "first"; type: "int" } - Parameter { name: "last"; type: "int" } - } - Signal { - name: "columnsAboutToBeInserted" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "first"; type: "int" } - Parameter { name: "last"; type: "int" } - } - Signal { - name: "columnsInserted" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "first"; type: "int" } - Parameter { name: "last"; type: "int" } - } - Signal { - name: "columnsAboutToBeRemoved" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "first"; type: "int" } - Parameter { name: "last"; type: "int" } - } - Signal { - name: "columnsRemoved" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "first"; type: "int" } - Parameter { name: "last"; type: "int" } - } - Signal { name: "modelAboutToBeReset" } - Signal { name: "modelReset" } - Signal { - name: "rowsAboutToBeMoved" - Parameter { name: "sourceParent"; type: "QModelIndex" } - Parameter { name: "sourceStart"; type: "int" } - Parameter { name: "sourceEnd"; type: "int" } - Parameter { name: "destinationParent"; type: "QModelIndex" } - Parameter { name: "destinationRow"; type: "int" } - } - Signal { - name: "rowsMoved" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "start"; type: "int" } - Parameter { name: "end"; type: "int" } - Parameter { name: "destination"; type: "QModelIndex" } - Parameter { name: "row"; type: "int" } - } - Signal { - name: "columnsAboutToBeMoved" - Parameter { name: "sourceParent"; type: "QModelIndex" } - Parameter { name: "sourceStart"; type: "int" } - Parameter { name: "sourceEnd"; type: "int" } - Parameter { name: "destinationParent"; type: "QModelIndex" } - Parameter { name: "destinationColumn"; type: "int" } - } - Signal { - name: "columnsMoved" - Parameter { name: "parent"; type: "QModelIndex" } - Parameter { name: "start"; type: "int" } - Parameter { name: "end"; type: "int" } - Parameter { name: "destination"; type: "QModelIndex" } - Parameter { name: "column"; type: "int" } - } - Method { name: "submit"; type: "bool" } - Method { name: "revert" } - } - Component { name: "QAbstractListModel"; prototype: "QAbstractItemModel" } -} diff --git a/libcommuni/src/imports/qml1/qml1.pro b/libcommuni/src/imports/qml1/qml1.pro deleted file mode 100644 index ddee6a2..0000000 --- a/libcommuni/src/imports/qml1/qml1.pro +++ /dev/null @@ -1,30 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TARGET = communiplugin -QT = core network declarative -TARGETPATH = Communi -DESTDIR = ../../../imports/$$TARGETPATH - -SOURCES += plugin.cpp -OTHER_FILES += qmldir plugins.qmltypes - -isEmpty(IRC_INSTALL_IMPORTS):IRC_INSTALL_IMPORTS = $$[QT_INSTALL_IMPORTS] - -!no_install_imports { - target.path = $$IRC_INSTALL_IMPORTS/$$TARGETPATH - INSTALLS += target - - other_files.files = $$OTHER_FILES - other_files.path = $$IRC_INSTALL_IMPORTS/$$TARGETPATH - INSTALLS += other_files -} - -for(other_file, OTHER_FILES) { - ARGUMENTS = $${PWD}$${QMAKE_DIR_SEP}$$other_file $$DESTDIR - !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK += && - QMAKE_POST_LINK += $$QMAKE_COPY $$replace(ARGUMENTS, /, $$QMAKE_DIR_SEP) -} - -include(../imports.pri) diff --git a/libcommuni/src/imports/qml1/qmldir b/libcommuni/src/imports/qml1/qmldir deleted file mode 100644 index 2de93f6..0000000 --- a/libcommuni/src/imports/qml1/qmldir +++ /dev/null @@ -1 +0,0 @@ -plugin communiplugin diff --git a/libcommuni/src/imports/qml2/plugin.cpp b/libcommuni/src/imports/qml2/plugin.cpp deleted file mode 100644 index 12b8781..0000000 --- a/libcommuni/src/imports/qml2/plugin.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include - -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -class IrcQmlFilter : public QObject, - public IrcCommandFilter, - public IrcMessageFilter -{ - Q_OBJECT - Q_INTERFACES(IrcCommandFilter IrcMessageFilter) - Q_PROPERTY(IrcConnection* connection READ connection WRITE setConnection NOTIFY connectionChanged) - -public: - IrcQmlFilter(QObject* parent = 0) : QObject(parent), conn(0) { } - - IrcConnection* connection() const { return conn; } - void setConnection(IrcConnection* connection) - { - if (conn != connection) { - if (conn) { - conn->removeCommandFilter(this); - conn->removeMessageFilter(this); - } - conn = connection; - if (conn) { - conn->installCommandFilter(this); - conn->installMessageFilter(this); - } - emit connectionChanged(); - } - } - - bool commandFilter(IrcCommand* cmd) - { - // QML: QVariant commandFilter(QVariant) - const QMetaObject* mo = metaObject(); - int idx = mo->indexOfMethod("commandFilter(QVariant)"); - if (idx != -1) { - QVariant ret; - QMetaMethod method = mo->method(idx); - method.invoke(this, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(cmd))); - return ret.toBool(); - } - return false; - } - - bool messageFilter(IrcMessage* msg) - { - // QML: QVariant messageFilter(QVariant) - const QMetaObject* mo = metaObject(); - int idx = mo->indexOfMethod("messageFilter(QVariant)"); - if (idx != -1) { - QVariant ret; - QMetaMethod method = mo->method(idx); - method.invoke(this, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(msg))); - return ret.toBool(); - } - return false; - } - -signals: - void connectionChanged(); - -private: - QPointer conn; -}; - -class CommuniPlugin : public QQmlExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "Communi.QQmlExtensionInterface") - -public: - void registerTypes(const char* uri) { -//! [qml-register-types] - // IrcCore - Irc::registerMetaTypes(); - qmlRegisterType(uri, 3, 0, "Irc"); - qmlRegisterType(uri, 3, 2, "Irc"); - qmlRegisterType(uri, 3, 0, "IrcCommand"); - qmlRegisterType(uri, 3, 0, "IrcConnection"); - qmlRegisterUncreatableType(uri, 3, 0, "IrcMessage", "Cannot create an instance of IrcMessage. Use IrcConnection::messageReceived() signal instead."); - qmlRegisterUncreatableType(uri, 3, 0, "IrcNetwork", "Cannot create an instance of IrcNetwork. Use IrcConnection::network property instead."); - qmlRegisterType(uri, 3, 0, "IrcMessageFilter"); - qmlRegisterType(uri, 3, 0, "IrcCommandFilter"); - qmlRegisterType(uri, 3, 0, "IrcFilter"); - - // IrcModel - qmlRegisterType(uri, 3, 0, "IrcBuffer"); - qmlRegisterType(uri, 3, 0, "IrcBufferModel"); - qmlRegisterType(uri, 3, 0, "IrcChannel"); - qmlRegisterType(uri, 3, 0, "IrcUser"); - qmlRegisterType(uri, 3, 0, "IrcUserModel"); - - // IrcUtil - qmlRegisterType(uri, 3, 0, "IrcCommandParser"); - qmlRegisterType(uri, 3, 0, "IrcLagTimer"); - qmlRegisterType(uri, 3, 0, "IrcTextFormat"); - qmlRegisterUncreatableType(uri, 3, 0, "IrcPalette", "Cannot create an instance of IrcPalette. Use IrcTextFormat::palette property instead."); - qmlRegisterType(uri, 3, 1, "IrcCompleter"); -//! [qml-register-types] - } -}; - -IRC_END_NAMESPACE - -#include "plugin.moc" diff --git a/libcommuni/src/imports/qml2/plugins.qmltypes b/libcommuni/src/imports/qml2/plugins.qmltypes deleted file mode 100644 index b0af7b4..0000000 --- a/libcommuni/src/imports/qml2/plugins.qmltypes +++ /dev/null @@ -1,1769 +0,0 @@ -import QtQuick.tooling 1.1 - -// This file describes the plugin-supplied types contained in the library. -// It is used for QML tooling purposes only. -// -// This file was auto-generated by: -// 'qmlplugindump -nonrelocatable Communi 3.0' - -Module { - Component { - name: "Irc" - prototype: "QObject" - exports: ["Communi/Irc 3.0"] - exportMetaObjectRevisions: [0] - Enum { - name: "Color" - values: { - "White": 0, - "Black": 1, - "Blue": 2, - "Green": 3, - "Red": 4, - "Brown": 5, - "Purple": 6, - "Orange": 7, - "Yellow": 8, - "LightGreen": 9, - "Cyan": 10, - "LightCyan": 11, - "LightBlue": 12, - "Pink": 13, - "Gray": 14, - "LightGray": 15 - } - } - Enum { - name: "DataRole" - values: { - "UserRole": 256, - "BufferRole": 257, - "ChannelRole": 258, - "NameRole": 259, - "PrefixRole": 260, - "ModeRole": 261, - "TitleRole": 262 - } - } - Enum { - name: "SortMethod" - values: { - "SortByHand": 0, - "SortByName": 1, - "SortByTitle": 2, - "SortByActivity": 3 - } - } - Enum { - name: "Code" - values: { - "RPL_WELCOME": 1, - "RPL_YOURHOST": 2, - "RPL_CREATED": 3, - "RPL_MYINFO": 4, - "RPL_ISUPPORT": 5, - "RPL_SNOMASK": 8, - "RPL_STATMEMTOT": 9, - "RPL_BOUNCE": 10, - "RPL_STATMEM": 10, - "RPL_YOURCOOKIE": 14, - "RPL_YOURID": 42, - "RPL_SAVENICK": 43, - "RPL_ATTEMPTINGJUNC": 50, - "RPL_ATTEMPTINGREROUTE": 51, - "RPL_TRACELINK": 200, - "RPL_TRACECONNECTING": 201, - "RPL_TRACEHANDSHAKE": 202, - "RPL_TRACEUNKNOWN": 203, - "RPL_TRACEOPERATOR": 204, - "RPL_TRACEUSER": 205, - "RPL_TRACESERVER": 206, - "RPL_TRACESERVICE": 207, - "RPL_TRACENEWTYPE": 208, - "RPL_TRACECLASS": 209, - "RPL_TRACERECONNECT": 210, - "RPL_STATS": 210, - "RPL_STATSLINKINFO": 211, - "RPL_STATSCOMMANDS": 212, - "RPL_STATSCLINE": 213, - "RPL_STATSNLINE": 214, - "RPL_STATSILINE": 215, - "RPL_STATSKLINE": 216, - "RPL_STATSQLINE": 217, - "RPL_STATSYLINE": 218, - "RPL_ENDOFSTATS": 219, - "RPL_UMODEIS": 221, - "RPL_MODLIST": 222, - "RPL_SQLINE_NICK": 222, - "RPL_STATSZLINE": 225, - "RPL_STATSCOUNT": 226, - "RPL_SERVICEINFO": 231, - "RPL_ENDOFSERVICES": 232, - "RPL_SERVICE": 233, - "RPL_SERVLIST": 234, - "RPL_SERVLISTEND": 235, - "RPL_STATSVERBOSE": 236, - "RPL_STATSENGINE": 237, - "RPL_STATSIAUTH": 239, - "RPL_STATSVLINE": 240, - "RPL_STATSLLINE": 241, - "RPL_STATSUPTIME": 242, - "RPL_STATSOLINE": 243, - "RPL_STATSHLINE": 244, - "RPL_STATSSLINE": 245, - "RPL_STATSPING": 246, - "RPL_STATSBLINE": 247, - "RPL_STATSDEFINE": 248, - "RPL_STATSDEBUG": 249, - "RPL_STATSDLINE": 250, - "RPL_STATSCONN": 250, - "RPL_LUSERCLIENT": 251, - "RPL_LUSEROP": 252, - "RPL_LUSERUNKNOWN": 253, - "RPL_LUSERCHANNELS": 254, - "RPL_LUSERME": 255, - "RPL_ADMINME": 256, - "RPL_ADMINLOC1": 257, - "RPL_ADMINLOC2": 258, - "RPL_ADMINEMAIL": 259, - "RPL_TRACELOG": 261, - "RPL_TRACEPING": 262, - "RPL_TRACEEND": 262, - "RPL_TRYAGAIN": 263, - "RPL_LOCALUSERS": 265, - "RPL_GLOBALUSERS": 266, - "RPL_START_NETSTAT": 267, - "RPL_NETSTAT": 268, - "RPL_END_NETSTAT": 269, - "RPL_PRIVS": 270, - "RPL_SILELIST": 271, - "RPL_ENDOFSILELIST": 272, - "RPL_NOTIFY": 273, - "RPL_ENDNOTIFY": 274, - "RPL_STATSDELTA": 274, - "RPL_VCHANEXIST": 276, - "RPL_VCHANLIST": 277, - "RPL_VCHANHELP": 278, - "RPL_GLIST": 280, - "RPL_ENDOFGLIST": 281, - "RPL_ACCEPTLIST": 281, - "RPL_ENDOFACCEPT": 282, - "RPL_JUPELIST": 282, - "RPL_ENDOFJUPELIST": 283, - "RPL_FEATURE": 284, - "RPL_GLIST_HASH": 285, - "RPL_CHANINFO_HANDLE": 285, - "RPL_NEWHOSTIS": 285, - "RPL_CHANINFO_USERS": 286, - "RPL_CHKHEAD": 286, - "RPL_CHANINFO_CHOPS": 287, - "RPL_CHANUSER": 287, - "RPL_CHANINFO_VOICES": 288, - "RPL_PATCHHEAD": 288, - "RPL_CHANINFO_AWAY": 289, - "RPL_PATCHCON": 289, - "RPL_CHANINFO_OPERS": 290, - "RPL_HELPHDR": 290, - "RPL_DATASTR": 290, - "RPL_CHANINFO_BANNED": 291, - "RPL_HELPOP": 291, - "RPL_ENDOFCHECK": 291, - "RPL_CHANINFO_BANS": 292, - "RPL_HELPTLR": 292, - "RPL_CHANINFO_INVITE": 293, - "RPL_HELPHLP": 293, - "RPL_CHANINFO_INVITES": 294, - "RPL_HELPFWD": 294, - "RPL_CHANINFO_KICK": 295, - "RPL_HELPIGN": 295, - "RPL_CHANINFO_KICKS": 296, - "RPL_END_CHANINFO": 299, - "RPL_NONE": 300, - "RPL_AWAY": 301, - "RPL_USERHOST": 302, - "RPL_ISON": 303, - "RPL_TEXT": 304, - "RPL_UNAWAY": 305, - "RPL_NOWAWAY": 306, - "RPL_WHOISREGNICK": 307, - "RPL_SUSERHOST": 307, - "RPL_NOTIFYACTION": 308, - "RPL_WHOISADMIN": 308, - "RPL_NICKTRACE": 309, - "RPL_WHOISSADMIN": 309, - "RPL_WHOISHELPER": 309, - "RPL_WHOISSVCMSG": 310, - "RPL_WHOISHELPOP": 310, - "RPL_WHOISSERVICE": 310, - "RPL_WHOISUSER": 311, - "RPL_WHOISSERVER": 312, - "RPL_WHOISOPERATOR": 313, - "RPL_WHOWASUSER": 314, - "RPL_ENDOFWHO": 315, - "RPL_WHOISCHANOP": 316, - "RPL_WHOISIDLE": 317, - "RPL_ENDOFWHOIS": 318, - "RPL_WHOISCHANNELS": 319, - "RPL_WHOISVIRT": 320, - "RPL_WHOIS_HIDDEN": 320, - "RPL_WHOISSPECIAL": 320, - "RPL_LISTSTART": 321, - "RPL_LIST": 322, - "RPL_LISTEND": 323, - "RPL_CHANNELMODEIS": 324, - "RPL_UNIQOPIS": 325, - "RPL_CHANNELPASSIS": 325, - "RPL_NOCHANPASS": 326, - "RPL_CHPASSUNKNOWN": 327, - "RPL_CHANNEL_URL": 328, - "RPL_CREATIONTIME": 329, - "RPL_WHOWAS_TIME": 330, - "RPL_WHOISACCOUNT": 330, - "RPL_NOTOPIC": 331, - "RPL_TOPIC": 332, - "RPL_TOPICWHOTIME": 333, - "RPL_LISTUSAGE": 334, - "RPL_COMMANDSYNTAX": 334, - "RPL_LISTSYNTAX": 334, - "RPL_CHANPASSOK": 338, - "RPL_WHOISACTUALLY": 338, - "RPL_BADCHANPASS": 339, - "RPL_INVITING": 341, - "RPL_SUMMONING": 342, - "RPL_INVITED": 345, - "RPL_INVITELIST": 346, - "RPL_ENDOFINVITELIST": 347, - "RPL_EXCEPTLIST": 348, - "RPL_ENDOFEXCEPTLIST": 349, - "RPL_VERSION": 351, - "RPL_WHOREPLY": 352, - "RPL_NAMREPLY": 353, - "RPL_WHOSPCRPL": 354, - "RPL_NAMREPLY_": 355, - "RPL_KILLDONE": 361, - "RPL_CLOSING": 362, - "RPL_CLOSEEND": 363, - "RPL_LINKS": 364, - "RPL_ENDOFLINKS": 365, - "RPL_ENDOFNAMES": 366, - "RPL_BANLIST": 367, - "RPL_ENDOFBANLIST": 368, - "RPL_ENDOFWHOWAS": 369, - "RPL_INFO": 371, - "RPL_MOTD": 372, - "RPL_INFOSTART": 373, - "RPL_ENDOFINFO": 374, - "RPL_MOTDSTART": 375, - "RPL_ENDOFMOTD": 376, - "RPL_KICKEXPIRED": 377, - "RPL_SPAM": 377, - "RPL_BANEXPIRED": 378, - "RPL_WHOISHOST": 378, - "RPL_KICKLINKED": 379, - "RPL_WHOISMODES": 379, - "RPL_BANLINKED": 380, - "RPL_YOURHELPER": 380, - "RPL_YOUREOPER": 381, - "RPL_REHASHING": 382, - "RPL_YOURESERVICE": 383, - "RPL_MYPORTIS": 384, - "RPL_NOTOPERANYMORE": 385, - "RPL_QLIST": 386, - "RPL_IRCOPS": 386, - "RPL_ENDOFQLIST": 387, - "RPL_ENDOFIRCOPS": 387, - "RPL_ALIST": 388, - "RPL_ENDOFALIST": 389, - "RPL_TIME": 391, - "RPL_USERSSTART": 392, - "RPL_USERS": 393, - "RPL_ENDOFUSERS": 394, - "RPL_NOUSERS": 395, - "RPL_HOSTHIDDEN": 396, - "ERR_UNKNOWNERROR": 400, - "ERR_NOSUCHNICK": 401, - "ERR_NOSUCHSERVER": 402, - "ERR_NOSUCHCHANNEL": 403, - "ERR_CANNOTSENDTOCHAN": 404, - "ERR_TOOMANYCHANNELS": 405, - "ERR_WASNOSUCHNICK": 406, - "ERR_TOOMANYTARGETS": 407, - "ERR_NOSUCHSERVICE": 408, - "ERR_NOCOLORSONCHAN": 408, - "ERR_NOORIGIN": 409, - "ERR_NORECIPIENT": 411, - "ERR_NOTEXTTOSEND": 412, - "ERR_NOTOPLEVEL": 413, - "ERR_WILDTOPLEVEL": 414, - "ERR_BADMASK": 415, - "ERR_TOOMANYMATCHES": 416, - "ERR_QUERYTOOLONG": 416, - "ERR_LENGTHTRUNCATED": 419, - "ERR_UNKNOWNCOMMAND": 421, - "ERR_NOMOTD": 422, - "ERR_NOADMININFO": 423, - "ERR_FILEERROR": 424, - "ERR_NOOPERMOTD": 425, - "ERR_TOOMANYAWAY": 429, - "ERR_EVENTNICKCHANGE": 430, - "ERR_NONICKNAMEGIVEN": 431, - "ERR_ERRONEUSNICKNAME": 432, - "ERR_NICKNAMEINUSE": 433, - "ERR_SERVICENAMEINUSE": 434, - "ERR_NORULES": 434, - "ERR_SERVICECONFUSED": 435, - "ERR_BANONCHAN": 435, - "ERR_NICKCOLLISION": 436, - "ERR_UNAVAILRESOURCE": 437, - "ERR_BANNICKCHANGE": 437, - "ERR_NICKTOOFAST": 438, - "ERR_DEAD": 438, - "ERR_TARGETTOOFAST": 439, - "ERR_SERVICESDOWN": 440, - "ERR_USERNOTINCHANNEL": 441, - "ERR_NOTONCHANNEL": 442, - "ERR_USERONCHANNEL": 443, - "ERR_NOLOGIN": 444, - "ERR_SUMMONDISABLED": 445, - "ERR_USERSDISABLED": 446, - "ERR_NONICKCHANGE": 447, - "ERR_NOTIMPLEMENTED": 449, - "ERR_NOTREGISTERED": 451, - "ERR_IDCOLLISION": 452, - "ERR_NICKLOST": 453, - "ERR_HOSTILENAME": 455, - "ERR_ACCEPTFULL": 456, - "ERR_ACCEPTEXIST": 457, - "ERR_ACCEPTNOT": 458, - "ERR_NOHIDING": 459, - "ERR_NOTFORHALFOPS": 460, - "ERR_NEEDMOREPARAMS": 461, - "ERR_ALREADYREGISTERED": 462, - "ERR_NOPERMFORHOST": 463, - "ERR_PASSWDMISMATCH": 464, - "ERR_YOUREBANNEDCREEP": 465, - "ERR_YOUWILLBEBANNED": 466, - "ERR_KEYSET": 467, - "ERR_INVALIDUSERNAME": 468, - "ERR_ONLYSERVERSCANCHANGE": 468, - "ERR_LINKSET": 469, - "ERR_LINKCHANNEL": 470, - "ERR_KICKEDFROMCHAN": 470, - "ERR_CHANNELISFULL": 471, - "ERR_UNKNOWNMODE": 472, - "ERR_INVITEONLYCHAN": 473, - "ERR_BANNEDFROMCHAN": 474, - "ERR_BADCHANNELKEY": 475, - "ERR_BADCHANMASK": 476, - "ERR_NOCHANMODES": 477, - "ERR_NEEDREGGEDNICK": 477, - "ERR_BANLISTFULL": 478, - "ERR_BADCHANNAME": 479, - "ERR_LINKFAIL": 479, - "ERR_NOULINE": 480, - "ERR_CANNOTKNOCK": 480, - "ERR_NOPRIVILEGES": 481, - "ERR_CHANOPRIVSNEEDED": 482, - "ERR_CANTKILLSERVER": 483, - "ERR_RESTRICTED": 484, - "ERR_ISCHANSERVICE": 484, - "ERR_DESYNC": 484, - "ERR_ATTACKDENY": 484, - "ERR_UNIQOPRIVSNEEDED": 485, - "ERR_KILLDENY": 485, - "ERR_CANTKICKADMIN": 485, - "ERR_ISREALSERVICE": 485, - "ERR_NONONREG": 486, - "ERR_HTMDISABLED": 486, - "ERR_ACCOUNTONLY": 486, - "ERR_CHANTOORECENT": 487, - "ERR_MSGSERVICES": 487, - "ERR_TSLESSCHAN": 488, - "ERR_VOICENEEDED": 489, - "ERR_SECUREONLYCHAN": 489, - "ERR_NOOPERHOST": 491, - "ERR_NOSERVICEHOST": 492, - "ERR_NOFEATURE": 493, - "ERR_BADFEATURE": 494, - "ERR_BADLOGTYPE": 495, - "ERR_BADLOGSYS": 496, - "ERR_BADLOGVALUE": 497, - "ERR_ISOPERLCHAN": 498, - "ERR_CHANOWNPRIVNEEDED": 499, - "ERR_UMODEUNKNOWNFLAG": 501, - "ERR_USERSDONTMATCH": 502, - "ERR_GHOSTEDCLIENT": 503, - "ERR_VWORLDWARN": 503, - "ERR_USERNOTONSERV": 504, - "ERR_SILELISTFULL": 511, - "ERR_TOOMANYWATCH": 512, - "ERR_BADPING": 513, - "ERR_INVALID_ERROR": 514, - "ERR_TOOMANYDCC": 514, - "ERR_BADEXPIRE": 515, - "ERR_DONTCHEAT": 516, - "ERR_DISABLED": 517, - "ERR_NOINVITE": 518, - "ERR_LONGMASK": 518, - "ERR_ADMONLY": 519, - "ERR_TOOMANYUSERS": 519, - "ERR_OPERONLY": 520, - "ERR_MASKTOOWIDE": 520, - "ERR_WHOTRUNC": 520, - "ERR_LISTSYNTAX": 521, - "ERR_WHOSYNTAX": 522, - "ERR_WHOLIMEXCEED": 523, - "ERR_QUARANTINED": 524, - "ERR_OPERSPVERIFY": 524, - "ERR_REMOTEPFX": 525, - "ERR_PFXUNROUTABLE": 526, - "ERR_BADHOSTMASK": 550, - "ERR_HOSTUNAVAIL": 551, - "ERR_USINGSLINE": 552, - "ERR_STATSSLINE": 553, - "RPL_LOGON": 600, - "RPL_LOGOFF": 601, - "RPL_WATCHOFF": 602, - "RPL_WATCHSTAT": 603, - "RPL_NOWON": 604, - "RPL_NOWOFF": 605, - "RPL_WATCHLIST": 606, - "RPL_ENDOFWATCHLIST": 607, - "RPL_WATCHCLEAR": 608, - "RPL_ISOPER": 610, - "RPL_ISLOCOP": 611, - "RPL_ISNOTOPER": 612, - "RPL_ENDOFISOPER": 613, - "RPL_DCCSTATUS": 617, - "RPL_DCCLIST": 618, - "RPL_ENDOFDCCLIST": 619, - "RPL_WHOWASHOST": 619, - "RPL_DCCINFO": 620, - "RPL_ENDOFO": 626, - "RPL_SETTINGS": 630, - "RPL_ENDOFSETTINGS": 631, - "RPL_DUMPING": 640, - "RPL_DUMPRPL": 641, - "RPL_EODUMP": 642, - "RPL_TRACEROUTE_HOP": 660, - "RPL_TRACEROUTE_START": 661, - "RPL_MODECHANGEWARN": 662, - "RPL_CHANREDIR": 663, - "RPL_SERVMODEIS": 664, - "RPL_OTHERUMODEIS": 665, - "RPL_ENDOF_GENERIC": 666, - "RPL_WHOWASDETAILS": 670, - "RPL_WHOISSECURE": 671, - "RPL_UNKNOWNMODES": 672, - "RPL_CANNOTSETMODES": 673, - "RPL_LUSERSTAFF": 678, - "RPL_TIMEONSERVERIS": 679, - "RPL_NETWORKS": 682, - "RPL_YOURLANGUAGEIS": 687, - "RPL_LANGUAGE": 688, - "RPL_WHOISSTAFF": 689, - "RPL_WHOISLANGUAGE": 690, - "RPL_HELPSTART": 704, - "RPL_HELPTXT": 705, - "RPL_ENDOFHELP": 706, - "RPL_ETRACEFULL": 708, - "RPL_ETRACE": 709, - "RPL_KNOCK": 710, - "RPL_KNOCKDLVR": 711, - "ERR_TOOMANYKNOCK": 712, - "ERR_CHANOPEN": 713, - "ERR_KNOCKONCHAN": 714, - "ERR_KNOCKDISABLED": 715, - "RPL_TARGUMODEG": 716, - "RPL_TARGNOTIFY": 717, - "RPL_UMODEGMSG": 718, - "RPL_ENDOFOMOTD": 722, - "ERR_NOPRIVS": 723, - "RPL_TESTMARK": 724, - "RPL_TESTLINE": 725, - "RPL_NOTESTLINE": 726, - "RPL_XINFO": 771, - "RPL_XINFOSTART": 773, - "RPL_XINFOEND": 774, - "ERR_CANNOTDOCOMMAND": 972, - "ERR_CANNOTCHANGEUMODE": 973, - "ERR_CANNOTCHANGECHANMODE": 974, - "ERR_CANNOTCHANGESERVERMODE": 975, - "ERR_CANNOTSENDTONICK": 976, - "ERR_UNKNOWNSERVERMODE": 977, - "ERR_SERVERMODELOCK": 979, - "ERR_BADCHARENCODING": 980, - "ERR_TOOMANYLANGUAGES": 981, - "ERR_NOLANGUAGE": 982, - "ERR_TEXTTOOSHORT": 983, - "ERR_NUMERIC_ERR": 999 - } - } - Method { name: "version"; type: "string" } - Method { - name: "codeToString" - type: "string" - Parameter { name: "code"; type: "int" } - } - Method { - name: "nickFromPrefix" - type: "string" - Parameter { name: "prefix"; type: "string" } - } - Method { - name: "identFromPrefix" - type: "string" - Parameter { name: "prefix"; type: "string" } - } - Method { - name: "hostFromPrefix" - type: "string" - Parameter { name: "prefix"; type: "string" } - } - Method { name: "registerMetaTypes" } - } - Component { - name: "IrcBuffer" - prototype: "QObject" - exports: ["Communi/IrcBuffer 3.0"] - exportMetaObjectRevisions: [0] - Property { name: "title"; type: "string"; isReadonly: true } - Property { name: "name"; type: "string" } - Property { name: "prefix"; type: "string" } - Property { name: "connection"; type: "IrcConnection"; isReadonly: true; isPointer: true } - Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } - Property { name: "model"; type: "IrcBufferModel"; isReadonly: true; isPointer: true } - Property { name: "active"; type: "bool"; isReadonly: true } - Property { name: "channel"; type: "bool"; isReadonly: true } - Property { name: "sticky"; type: "bool" } - Property { name: "persistent"; type: "bool" } - Signal { - name: "titleChanged" - Parameter { name: "title"; type: "string" } - } - Signal { - name: "nameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "prefixChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "messageReceived" - Parameter { name: "message"; type: "IrcMessage"; isPointer: true } - } - Signal { - name: "destroyed" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "activeChanged" - Parameter { name: "active"; type: "bool" } - } - Signal { - name: "stickyChanged" - Parameter { name: "sticky"; type: "bool" } - } - Signal { - name: "persistentChanged" - Parameter { name: "persistent"; type: "bool" } - } - Method { - name: "setName" - Parameter { name: "name"; type: "string" } - } - Method { - name: "setPrefix" - Parameter { name: "prefix"; type: "string" } - } - Method { - name: "receiveMessage" - Parameter { name: "message"; type: "IrcMessage"; isPointer: true } - } - Method { name: "toChannel"; type: "IrcChannel*" } - Method { - name: "sendCommand" - type: "bool" - Parameter { name: "command"; type: "IrcCommand"; isPointer: true } - } - } - Component { - name: "IrcBufferModel" - prototype: "QAbstractListModel" - exports: ["Communi/IrcBufferModel 3.0"] - exportMetaObjectRevisions: [0] - Property { name: "count"; type: "int"; isReadonly: true } - Property { name: "sortOrder"; type: "Qt::SortOrder" } - Property { name: "sortMethod"; type: "Irc::SortMethod" } - Property { name: "channels"; type: "QStringList"; isReadonly: true } - Property { name: "displayRole"; type: "Irc::DataRole" } - Property { name: "buffers"; type: "QList"; isReadonly: true } - Property { name: "connection"; type: "IrcConnection"; isPointer: true } - Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } - Property { name: "bufferPrototype"; type: "IrcBuffer"; isPointer: true } - Property { name: "channelPrototype"; type: "IrcChannel"; isPointer: true } - Signal { - name: "countChanged" - Parameter { name: "count"; type: "int" } - } - Signal { - name: "added" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "removed" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "aboutToBeAdded" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "aboutToBeRemoved" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "buffersChanged" - Parameter { name: "buffers"; type: "QList" } - } - Signal { - name: "channelsChanged" - Parameter { name: "channels"; type: "QStringList" } - } - Signal { - name: "connectionChanged" - Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } - } - Signal { - name: "networkChanged" - Parameter { name: "network"; type: "IrcNetwork"; isPointer: true } - } - Signal { - name: "messageIgnored" - Parameter { name: "message"; type: "IrcMessage"; isPointer: true } - } - Signal { - name: "bufferPrototypeChanged" - Parameter { name: "prototype"; type: "IrcBuffer"; isPointer: true } - } - Signal { - name: "channelPrototypeChanged" - Parameter { name: "prototype"; type: "IrcChannel"; isPointer: true } - } - Method { name: "clear" } - Method { - name: "sort" - Parameter { name: "column"; type: "int" } - Parameter { name: "order"; type: "Qt::SortOrder" } - } - Method { - name: "sort" - Parameter { name: "column"; type: "int" } - } - Method { name: "sort" } - Method { - name: "sort" - Parameter { name: "method"; type: "Irc::SortMethod" } - Parameter { name: "order"; type: "Qt::SortOrder" } - } - Method { - name: "sort" - Parameter { name: "method"; type: "Irc::SortMethod" } - } - Method { - name: "get" - type: "IrcBuffer*" - Parameter { name: "index"; type: "int" } - } - Method { - name: "find" - type: "IrcBuffer*" - Parameter { name: "title"; type: "string" } - } - Method { - name: "contains" - type: "bool" - Parameter { name: "title"; type: "string" } - } - Method { - name: "indexOf" - type: "int" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Method { - name: "add" - type: "IrcBuffer*" - Parameter { name: "title"; type: "string" } - } - Method { - name: "add" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - Method { - name: "remove" - Parameter { name: "title"; type: "string" } - } - Method { - name: "remove" - Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } - } - } - Component { - name: "IrcChannel" - prototype: "IrcBuffer" - exports: ["Communi/IrcChannel 3.0"] - exportMetaObjectRevisions: [0] - Property { name: "mode"; type: "string"; isReadonly: true } - Property { name: "topic"; type: "string"; isReadonly: true } - Signal { - name: "modeChanged" - Parameter { name: "mode"; type: "string" } - } - Signal { - name: "topicChanged" - Parameter { name: "topic"; type: "string" } - } - Method { - name: "part" - Parameter { name: "reason"; type: "string" } - } - Method { name: "part" } - } - Component { - name: "IrcCommand" - prototype: "QObject" - exports: ["Communi/IrcCommand 3.0"] - exportMetaObjectRevisions: [0] - Enum { - name: "Type" - values: { - "Admin": 0, - "Away": 1, - "Capability": 2, - "CtcpAction": 3, - "CtcpReply": 4, - "CtcpRequest": 5, - "Custom": 6, - "Info": 7, - "Invite": 8, - "Join": 9, - "Kick": 10, - "Knock": 11, - "List": 12, - "Message": 13, - "Mode": 14, - "Motd": 15, - "Names": 16, - "Nick": 17, - "Notice": 18, - "Part": 19, - "Ping": 20, - "Pong": 21, - "Quit": 22, - "Quote": 23, - "Stats": 24, - "Time": 25, - "Topic": 26, - "Trace": 27, - "Users": 28, - "Version": 29, - "Who": 30, - "Whois": 31, - "Whowas": 32 - } - } - Property { name: "parameters"; type: "QStringList" } - Property { name: "encoding"; type: "QByteArray" } - Property { name: "type"; type: "Type" } - Method { - name: "toMessage" - type: "IrcMessage*" - Parameter { name: "prefix"; type: "string" } - Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } - } - Method { - name: "createAdmin" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createAdmin"; type: "IrcCommand*" } - Method { - name: "createAway" - type: "IrcCommand*" - Parameter { name: "reason"; type: "string" } - } - Method { name: "createAway"; type: "IrcCommand*" } - Method { - name: "createCapability" - type: "IrcCommand*" - Parameter { name: "subCommand"; type: "string" } - Parameter { name: "capability"; type: "string" } - } - Method { - name: "createCapability" - type: "IrcCommand*" - Parameter { name: "subCommand"; type: "string" } - Parameter { name: "capabilities"; type: "QStringList" } - } - Method { - name: "createCapability" - type: "IrcCommand*" - Parameter { name: "subCommand"; type: "string" } - } - Method { - name: "createCtcpAction" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "action"; type: "string" } - } - Method { - name: "createCtcpReply" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "reply"; type: "string" } - } - Method { - name: "createCtcpRequest" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "request"; type: "string" } - } - Method { - name: "createInfo" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createInfo"; type: "IrcCommand*" } - Method { - name: "createInvite" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createJoin" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "key"; type: "string" } - } - Method { - name: "createJoin" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createJoin" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - Parameter { name: "keys"; type: "QStringList" } - } - Method { - name: "createJoin" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - } - Method { - name: "createKick" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "user"; type: "string" } - Parameter { name: "reason"; type: "string" } - } - Method { - name: "createKick" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "user"; type: "string" } - } - Method { - name: "createKnock" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "message"; type: "string" } - } - Method { - name: "createKnock" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createList" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - Parameter { name: "server"; type: "string" } - } - Method { - name: "createList" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - } - Method { name: "createList"; type: "IrcCommand*" } - Method { - name: "createMessage" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "message"; type: "string" } - } - Method { - name: "createMode" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "mode"; type: "string" } - Parameter { name: "arg"; type: "string" } - } - Method { - name: "createMode" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "mode"; type: "string" } - } - Method { - name: "createMode" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - } - Method { - name: "createMotd" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createMotd"; type: "IrcCommand*" } - Method { - name: "createNames" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "server"; type: "string" } - } - Method { - name: "createNames" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { name: "createNames"; type: "IrcCommand*" } - Method { - name: "createNames" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - Parameter { name: "server"; type: "string" } - } - Method { - name: "createNames" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - } - Method { - name: "createNick" - type: "IrcCommand*" - Parameter { name: "nick"; type: "string" } - } - Method { - name: "createNotice" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - Parameter { name: "notice"; type: "string" } - } - Method { - name: "createPart" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "reason"; type: "string" } - } - Method { - name: "createPart" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createPart" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - Parameter { name: "reason"; type: "string" } - } - Method { - name: "createPart" - type: "IrcCommand*" - Parameter { name: "channels"; type: "QStringList" } - } - Method { - name: "createPing" - type: "IrcCommand*" - Parameter { name: "argument"; type: "string" } - } - Method { - name: "createPong" - type: "IrcCommand*" - Parameter { name: "argument"; type: "string" } - } - Method { - name: "createQuit" - type: "IrcCommand*" - Parameter { name: "reason"; type: "string" } - } - Method { name: "createQuit"; type: "IrcCommand*" } - Method { - name: "createQuote" - type: "IrcCommand*" - Parameter { name: "raw"; type: "string" } - } - Method { - name: "createQuote" - type: "IrcCommand*" - Parameter { name: "parameters"; type: "QStringList" } - } - Method { - name: "createStats" - type: "IrcCommand*" - Parameter { name: "query"; type: "string" } - Parameter { name: "server"; type: "string" } - } - Method { - name: "createStats" - type: "IrcCommand*" - Parameter { name: "query"; type: "string" } - } - Method { - name: "createTime" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createTime"; type: "IrcCommand*" } - Method { - name: "createTopic" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - Parameter { name: "topic"; type: "string" } - } - Method { - name: "createTopic" - type: "IrcCommand*" - Parameter { name: "channel"; type: "string" } - } - Method { - name: "createTrace" - type: "IrcCommand*" - Parameter { name: "target"; type: "string" } - } - Method { name: "createTrace"; type: "IrcCommand*" } - Method { - name: "createUsers" - type: "IrcCommand*" - Parameter { name: "server"; type: "string" } - } - Method { name: "createUsers"; type: "IrcCommand*" } - Method { - name: "createVersion" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - } - Method { name: "createVersion"; type: "IrcCommand*" } - Method { - name: "createWho" - type: "IrcCommand*" - Parameter { name: "mask"; type: "string" } - Parameter { name: "operators"; type: "bool" } - } - Method { - name: "createWho" - type: "IrcCommand*" - Parameter { name: "mask"; type: "string" } - } - Method { - name: "createWhois" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - } - Method { - name: "createWhowas" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - Parameter { name: "count"; type: "int" } - } - Method { - name: "createWhowas" - type: "IrcCommand*" - Parameter { name: "user"; type: "string" } - } - } - Component { - name: "IrcCommandParser" - prototype: "QObject" - exports: ["Communi/IrcCommandParser 3.0"] - exportMetaObjectRevisions: [0] - Enum { - name: "Details" - values: { - "Full": 0, - "NoTarget": 1, - "NoPrefix": 2, - "NoEllipsis": 4, - "NoParentheses": 8, - "NoBrackets": 16, - "NoAngles": 32, - "Visual": 7 - } - } - Property { name: "commands"; type: "QStringList"; isReadonly: true } - Property { name: "triggers"; type: "QStringList" } - Property { name: "channels"; type: "QStringList" } - Property { name: "target"; type: "string" } - Property { name: "tolerant"; type: "bool" } - Signal { - name: "commandsChanged" - Parameter { name: "commands"; type: "QStringList" } - } - Signal { - name: "triggersChanged" - Parameter { name: "triggers"; type: "QStringList" } - } - Signal { - name: "channelsChanged" - Parameter { name: "channels"; type: "QStringList" } - } - Signal { - name: "targetChanged" - Parameter { name: "target"; type: "string" } - } - Signal { - name: "tolerancyChanged" - Parameter { name: "tolerant"; type: "bool" } - } - Method { name: "clear" } - Method { name: "reset" } - Method { - name: "setTriggers" - Parameter { name: "triggers"; type: "QStringList" } - } - Method { - name: "setChannels" - Parameter { name: "channels"; type: "QStringList" } - } - Method { - name: "setTarget" - Parameter { name: "target"; type: "string" } - } - Method { - name: "syntax" - type: "string" - Parameter { name: "command"; type: "string" } - Parameter { name: "details"; type: "Details" } - } - Method { - name: "syntax" - type: "string" - Parameter { name: "command"; type: "string" } - } - Method { - name: "addCommand" - Parameter { name: "type"; type: "IrcCommand::Type" } - Parameter { name: "syntax"; type: "string" } - } - Method { - name: "removeCommand" - Parameter { name: "type"; type: "IrcCommand::Type" } - Parameter { name: "syntax"; type: "string" } - } - Method { - name: "removeCommand" - Parameter { name: "type"; type: "IrcCommand::Type" } - } - Method { - name: "parse" - type: "IrcCommand*" - Parameter { name: "input"; type: "string" } - } - } - Component { - name: "IrcConnection" - prototype: "QObject" - exports: ["Communi/IrcConnection 3.0"] - exportMetaObjectRevisions: [0] - Enum { - name: "Status" - values: { - "Inactive": 0, - "Waiting": 1, - "Connecting": 2, - "Connected": 3, - "Closing": 4, - "Closed": 5, - "Error": 6 - } - } - Property { name: "host"; type: "string" } - Property { name: "port"; type: "int" } - Property { name: "userName"; type: "string" } - Property { name: "nickName"; type: "string" } - Property { name: "realName"; type: "string" } - Property { name: "password"; type: "string" } - Property { name: "displayName"; type: "string" } - Property { name: "encoding"; type: "QByteArray" } - Property { name: "status"; type: "Status"; isReadonly: true } - Property { name: "active"; type: "bool"; isReadonly: true } - Property { name: "connected"; type: "bool"; isReadonly: true } - Property { name: "enabled"; type: "bool" } - Property { name: "reconnectDelay"; type: "int" } - Property { name: "socket"; type: "QAbstractSocket"; isPointer: true } - Property { name: "secure"; type: "bool" } - Property { name: "saslMechanism"; type: "string" } - Property { name: "supportedSaslMechanisms"; type: "QStringList"; isReadonly: true } - Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } - Signal { name: "connecting" } - Signal { - name: "nickNameReserved" - Parameter { name: "alternate"; type: "string"; isPointer: true } - } - Signal { name: "connected" } - Signal { name: "disconnected" } - Signal { - name: "statusChanged" - Parameter { name: "status"; type: "IrcConnection::Status" } - } - Signal { - name: "socketError" - Parameter { name: "error"; type: "QAbstractSocket::SocketError" } - } - Signal { - name: "socketStateChanged" - Parameter { name: "state"; type: "QAbstractSocket::SocketState" } - } - Signal { - name: "messageReceived" - Parameter { name: "message"; type: "IrcMessage"; isPointer: true } - } - Signal { - name: "capabilityMessageReceived" - Parameter { name: "message"; type: "IrcCapabilityMessage"; isPointer: true } - } - Signal { - name: "errorMessageReceived" - Parameter { name: "message"; type: "IrcErrorMessage"; isPointer: true } - } - Signal { - name: "inviteMessageReceived" - Parameter { name: "message"; type: "IrcInviteMessage"; isPointer: true } - } - Signal { - name: "joinMessageReceived" - Parameter { name: "message"; type: "IrcJoinMessage"; isPointer: true } - } - Signal { - name: "kickMessageReceived" - Parameter { name: "message"; type: "IrcKickMessage"; isPointer: true } - } - Signal { - name: "modeMessageReceived" - Parameter { name: "message"; type: "IrcModeMessage"; isPointer: true } - } - Signal { - name: "namesMessageReceived" - Parameter { name: "message"; type: "IrcNamesMessage"; isPointer: true } - } - Signal { - name: "nickMessageReceived" - Parameter { name: "message"; type: "IrcNickMessage"; isPointer: true } - } - Signal { - name: "noticeMessageReceived" - Parameter { name: "message"; type: "IrcNoticeMessage"; isPointer: true } - } - Signal { - name: "numericMessageReceived" - Parameter { name: "message"; type: "IrcNumericMessage"; isPointer: true } - } - Signal { - name: "motdMessageReceived" - Parameter { name: "message"; type: "IrcMotdMessage"; isPointer: true } - } - Signal { - name: "partMessageReceived" - Parameter { name: "message"; type: "IrcPartMessage"; isPointer: true } - } - Signal { - name: "pingMessageReceived" - Parameter { name: "message"; type: "IrcPingMessage"; isPointer: true } - } - Signal { - name: "pongMessageReceived" - Parameter { name: "message"; type: "IrcPongMessage"; isPointer: true } - } - Signal { - name: "privateMessageReceived" - Parameter { name: "message"; type: "IrcPrivateMessage"; isPointer: true } - } - Signal { - name: "quitMessageReceived" - Parameter { name: "message"; type: "IrcQuitMessage"; isPointer: true } - } - Signal { - name: "topicMessageReceived" - Parameter { name: "message"; type: "IrcTopicMessage"; isPointer: true } - } - Signal { - name: "hostChanged" - Parameter { name: "host"; type: "string" } - } - Signal { - name: "portChanged" - Parameter { name: "port"; type: "int" } - } - Signal { - name: "userNameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "nickNameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "realNameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "passwordChanged" - Parameter { name: "password"; type: "string" } - } - Signal { - name: "displayNameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "reconnectDelayChanged" - Parameter { name: "seconds"; type: "int" } - } - Signal { - name: "enabledChanged" - Parameter { name: "enabled"; type: "bool" } - } - Signal { - name: "secureChanged" - Parameter { name: "secure"; type: "bool" } - } - Signal { - name: "saslMechanismChanged" - Parameter { name: "mechanism"; type: "string" } - } - Method { name: "open" } - Method { name: "close" } - Method { - name: "quit" - Parameter { name: "reason"; type: "string" } - } - Method { name: "quit" } - Method { - name: "setEnabled" - Parameter { name: "enabled"; type: "bool" } - } - Method { name: "setEnabled" } - Method { - name: "setDisabled" - Parameter { name: "disabled"; type: "bool" } - } - Method { name: "setDisabled" } - Method { - name: "sendCommand" - type: "bool" - Parameter { name: "command"; type: "IrcCommand"; isPointer: true } - } - Method { - name: "sendData" - type: "bool" - Parameter { name: "data"; type: "QByteArray" } - } - Method { - name: "sendRaw" - type: "bool" - Parameter { name: "message"; type: "string" } - } - } - Component { - name: "IrcLagTimer" - prototype: "QObject" - exports: ["Communi/IrcLagTimer 3.0"] - exportMetaObjectRevisions: [0] - Property { name: "lag"; type: "qlonglong"; isReadonly: true } - Property { name: "interval"; type: "int" } - Property { name: "connection"; type: "IrcConnection"; isPointer: true } - Signal { - name: "lagChanged" - Parameter { name: "lag"; type: "qlonglong" } - } - } - Component { - name: "IrcMessage" - prototype: "QObject" - exports: ["Communi/IrcMessage 3.0"] - exportMetaObjectRevisions: [0] - Enum { - name: "Type" - values: { - "Unknown": 0, - "Capability": 1, - "Error": 2, - "Invite": 3, - "Join": 4, - "Kick": 5, - "Mode": 6, - "Motd": 7, - "Names": 8, - "Nick": 9, - "Notice": 10, - "Numeric": 11, - "Part": 12, - "Ping": 13, - "Pong": 14, - "Private": 15, - "Quit": 16, - "Topic": 17 - } - } - Enum { - name: "Flag" - values: { - "None": 0, - "Own": 1, - "Identified": 2, - "Unidentified": 4 - } - } - Enum { - name: "Flags" - values: { - "None": 0, - "Own": 1, - "Identified": 2, - "Unidentified": 4 - } - } - Property { name: "connection"; type: "IrcConnection"; isReadonly: true; isPointer: true } - Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } - Property { name: "type"; type: "Type"; isReadonly: true } - Property { name: "flags"; type: "Flags"; isReadonly: true } - Property { name: "valid"; type: "bool"; isReadonly: true } - Property { name: "command"; type: "string"; isReadonly: true } - Property { name: "prefix"; type: "string" } - Property { name: "nick"; type: "string"; isReadonly: true } - Property { name: "ident"; type: "string"; isReadonly: true } - Property { name: "host"; type: "string"; isReadonly: true } - Property { name: "parameters"; type: "QStringList" } - Property { name: "timeStamp"; type: "QDateTime" } - Method { name: "toData"; type: "QByteArray" } - Method { - name: "fromData" - type: "IrcMessage*" - Parameter { name: "data"; type: "QByteArray" } - Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } - } - Method { - name: "fromParameters" - type: "IrcMessage*" - Parameter { name: "prefix"; type: "string" } - Parameter { name: "command"; type: "string" } - Parameter { name: "parameters"; type: "QStringList" } - Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } - } - } - Component { - name: "IrcNetwork" - prototype: "QObject" - exports: ["Communi/IrcNetwork 3.0"] - exportMetaObjectRevisions: [0] - Enum { - name: "ModeType" - values: { - "TypeA": 1, - "TypeB": 2, - "TypeC": 4, - "TypeD": 8, - "AllTypes": 15 - } - } - Enum { - name: "ModeTypes" - values: { - "TypeA": 1, - "TypeB": 2, - "TypeC": 4, - "TypeD": 8, - "AllTypes": 15 - } - } - Enum { - name: "Limit" - values: { - "NickLength": 0, - "ChannelLength": 1, - "TopicLength": 2, - "MessageLength": 3, - "KickReasonLength": 4, - "AwayReasonLength": 5, - "ModeCount": 6 - } - } - Property { name: "initialized"; type: "bool"; isReadonly: true } - Property { name: "name"; type: "string"; isReadonly: true } - Property { name: "modes"; type: "QStringList"; isReadonly: true } - Property { name: "prefixes"; type: "QStringList"; isReadonly: true } - Property { name: "channelTypes"; type: "QStringList"; isReadonly: true } - Property { name: "availableCapabilities"; type: "QStringList"; isReadonly: true } - Property { name: "requestedCapabilities"; type: "QStringList" } - Property { name: "activeCapabilities"; type: "QStringList"; isReadonly: true } - Signal { name: "initialized" } - Signal { - name: "nameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "modesChanged" - Parameter { name: "modes"; type: "QStringList" } - } - Signal { - name: "prefixesChanged" - Parameter { name: "prefixes"; type: "QStringList" } - } - Signal { - name: "channelTypesChanged" - Parameter { name: "types"; type: "QStringList" } - } - Signal { - name: "availableCapabilitiesChanged" - Parameter { name: "capabilities"; type: "QStringList" } - } - Signal { - name: "requestedCapabilitiesChanged" - Parameter { name: "capabilities"; type: "QStringList" } - } - Signal { - name: "activeCapabilitiesChanged" - Parameter { name: "capabilities"; type: "QStringList" } - } - Signal { name: "requestingCapabilities" } - Method { - name: "requestCapability" - type: "bool" - Parameter { name: "capability"; type: "string" } - } - Method { - name: "requestCapabilities" - type: "bool" - Parameter { name: "capabilities"; type: "QStringList" } - } - Method { - name: "setRequestedCapabilities" - Parameter { name: "capabilities"; type: "QStringList" } - } - Method { - name: "modeToPrefix" - type: "string" - Parameter { name: "mode"; type: "string" } - } - Method { - name: "prefixToMode" - type: "string" - Parameter { name: "prefix"; type: "string" } - } - Method { - name: "isChannel" - type: "bool" - Parameter { name: "name"; type: "string" } - } - Method { - name: "channelModes" - type: "QStringList" - Parameter { name: "types"; type: "IrcNetwork::ModeTypes" } - } - Method { - name: "numericLimit" - type: "int" - Parameter { name: "limit"; type: "IrcNetwork::Limit" } - } - Method { - name: "modeLimit" - type: "int" - Parameter { name: "mode"; type: "string" } - } - Method { - name: "channelLimit" - type: "int" - Parameter { name: "type"; type: "string" } - } - Method { - name: "targetLimit" - type: "int" - Parameter { name: "command"; type: "string" } - } - Method { - name: "hasCapability" - type: "bool" - Parameter { name: "capability"; type: "string" } - } - Method { - name: "isCapable" - type: "bool" - Parameter { name: "capability"; type: "string" } - } - } - Component { - name: "IrcPalette" - prototype: "QObject" - exports: ["Communi/IrcPalette 3.0"] - exportMetaObjectRevisions: [0] - Property { name: "white"; type: "string" } - Property { name: "black"; type: "string" } - Property { name: "blue"; type: "string" } - Property { name: "green"; type: "string" } - Property { name: "red"; type: "string" } - Property { name: "brown"; type: "string" } - Property { name: "purple"; type: "string" } - Property { name: "orange"; type: "string" } - Property { name: "yellow"; type: "string" } - Property { name: "lightGreen"; type: "string" } - Property { name: "cyan"; type: "string" } - Property { name: "lightCyan"; type: "string" } - Property { name: "lightBlue"; type: "string" } - Property { name: "pink"; type: "string" } - Property { name: "gray"; type: "string" } - Property { name: "lightGray"; type: "string" } - } - Component { - name: "IrcQmlFilter" - prototype: "QObject" - exports: [ - "Communi/IrcCommandFilter 3.0", - "Communi/IrcFilter 3.0", - "Communi/IrcMessageFilter 3.0" - ] - exportMetaObjectRevisions: [0, 0, 0] - Property { name: "connection"; type: "IrcConnection"; isPointer: true } - } - Component { - name: "IrcTextFormat" - prototype: "QObject" - exports: ["Communi/IrcTextFormat 3.0"] - exportMetaObjectRevisions: [0] - Property { name: "palette"; type: "IrcPalette"; isReadonly: true; isPointer: true } - Property { name: "urlPattern"; type: "string" } - Method { - name: "toHtml" - type: "string" - Parameter { name: "text"; type: "string" } - } - Method { - name: "toPlainText" - type: "string" - Parameter { name: "text"; type: "string" } - } - } - Component { - name: "IrcUser" - prototype: "QObject" - exports: ["Communi/IrcUser 3.0"] - exportMetaObjectRevisions: [0] - Property { name: "title"; type: "string"; isReadonly: true } - Property { name: "name"; type: "string"; isReadonly: true } - Property { name: "prefix"; type: "string"; isReadonly: true } - Property { name: "mode"; type: "string"; isReadonly: true } - Property { name: "channel"; type: "IrcChannel"; isReadonly: true; isPointer: true } - Signal { - name: "titleChanged" - Parameter { name: "title"; type: "string" } - } - Signal { - name: "nameChanged" - Parameter { name: "name"; type: "string" } - } - Signal { - name: "prefixChanged" - Parameter { name: "prefix"; type: "string" } - } - Signal { - name: "modeChanged" - Parameter { name: "mode"; type: "string" } - } - } - Component { - name: "IrcUserModel" - prototype: "QAbstractListModel" - exports: ["Communi/IrcUserModel 3.0"] - exportMetaObjectRevisions: [0] - Property { name: "count"; type: "int"; isReadonly: true } - Property { name: "names"; type: "QStringList"; isReadonly: true } - Property { name: "users"; type: "QList"; isReadonly: true } - Property { name: "displayRole"; type: "Irc::DataRole" } - Property { name: "channel"; type: "IrcChannel"; isPointer: true } - Property { name: "sortMethod"; type: "Irc::SortMethod" } - Property { name: "sortOrder"; type: "Qt::SortOrder" } - Signal { - name: "added" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - Signal { - name: "removed" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - Signal { - name: "aboutToBeAdded" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - Signal { - name: "aboutToBeRemoved" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - Signal { - name: "countChanged" - Parameter { name: "count"; type: "int" } - } - Signal { - name: "namesChanged" - Parameter { name: "names"; type: "QStringList" } - } - Signal { - name: "usersChanged" - Parameter { name: "users"; type: "QList" } - } - Signal { - name: "channelChanged" - Parameter { name: "channel"; type: "IrcChannel"; isPointer: true } - } - Method { name: "clear" } - Method { - name: "sort" - Parameter { name: "column"; type: "int" } - Parameter { name: "order"; type: "Qt::SortOrder" } - } - Method { - name: "sort" - Parameter { name: "column"; type: "int" } - } - Method { name: "sort" } - Method { - name: "sort" - Parameter { name: "method"; type: "Irc::SortMethod" } - Parameter { name: "order"; type: "Qt::SortOrder" } - } - Method { - name: "sort" - Parameter { name: "method"; type: "Irc::SortMethod" } - } - Method { - name: "get" - type: "IrcUser*" - Parameter { name: "index"; type: "int" } - } - Method { - name: "find" - type: "IrcUser*" - Parameter { name: "name"; type: "string" } - } - Method { - name: "contains" - type: "bool" - Parameter { name: "name"; type: "string" } - } - Method { - name: "indexOf" - type: "int" - Parameter { name: "user"; type: "IrcUser"; isPointer: true } - } - } -} diff --git a/libcommuni/src/imports/qml2/qml2.pro b/libcommuni/src/imports/qml2/qml2.pro deleted file mode 100644 index 7a39b94..0000000 --- a/libcommuni/src/imports/qml2/qml2.pro +++ /dev/null @@ -1,30 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TARGET = communiplugin -QT = core network qml -TARGETPATH = Communi -DESTDIR = ../../../qml/$$TARGETPATH - -SOURCES += plugin.cpp -OTHER_FILES += qmldir plugins.qmltypes - -isEmpty(IRC_INSTALL_QML):IRC_INSTALL_QML = $$[QT_INSTALL_QML] - -!no_install_qml { - target.path = $$IRC_INSTALL_QML/$$TARGETPATH - INSTALLS += target - - other_files.files = $$OTHER_FILES - other_files.path = $$IRC_INSTALL_QML/$$TARGETPATH - INSTALLS += other_files -} - -for(other_file, OTHER_FILES) { - ARGUMENTS = $${PWD}$${QMAKE_DIR_SEP}$$other_file $$DESTDIR - !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK += && - QMAKE_POST_LINK += $$QMAKE_COPY $$replace(ARGUMENTS, /, $$QMAKE_DIR_SEP) -} - -include(../imports.pri) diff --git a/libcommuni/src/imports/qml2/qmldir b/libcommuni/src/imports/qml2/qmldir deleted file mode 100644 index 659cc21..0000000 --- a/libcommuni/src/imports/qml2/qmldir +++ /dev/null @@ -1,2 +0,0 @@ -module Communi -plugin communiplugin diff --git a/libcommuni/src/model/ircbuffer.cpp b/libcommuni/src/model/ircbuffer.cpp deleted file mode 100644 index e7aa6b9..0000000 --- a/libcommuni/src/model/ircbuffer.cpp +++ /dev/null @@ -1,593 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircbuffer.h" -#include "ircbuffer_p.h" -#include "ircbuffermodel.h" -#include "ircbuffermodel_p.h" -#include "ircconnection.h" -#include "ircchannel.h" - -IRC_BEGIN_NAMESPACE - -/*! - \file ircbuffer.h - \brief \#include <IrcBuffer> - */ - -/*! - \class IrcBuffer ircbuffer.h - \ingroup models - \brief Keeps track of buffer status. - - \sa IrcBufferModel -*/ - -/*! - \fn void IrcBuffer::messageReceived(IrcMessage* message) - - This signal is emitted when a buffer specific message is received. - - The message may one of the following types: - - IrcMessage::Join - - IrcMessage::Kick - - IrcMessage::Mode - - IrcMessage::Names - - IrcMessage::Nick - - IrcMessage::Notice - - IrcMessage::Numeric - - IrcMessage::Part - - IrcMessage::Private - - IrcMessage::Quit - - IrcMessage::Topic - - \sa IrcConnection::messageReceived(), IrcBufferModel::messageIgnored() - */ - -#ifndef IRC_DOXYGEN -IrcBufferPrivate::IrcBufferPrivate() - : q_ptr(0), model(0), persistent(false), sticky(false) -{ - qRegisterMetaType(); - qRegisterMetaType >(); -} - -IrcBufferPrivate::~IrcBufferPrivate() -{ -} - -void IrcBufferPrivate::init(const QString& title, IrcBufferModel* m) -{ - name = title; - setModel(m); -} - -void IrcBufferPrivate::connected() -{ - Q_Q(IrcBuffer); - emit q->activeChanged(q->isActive()); -} - -void IrcBufferPrivate::disconnected() -{ - Q_Q(IrcBuffer); - emit q->activeChanged(q->isActive()); -} - -void IrcBufferPrivate::setName(const QString& value) -{ - Q_Q(IrcBuffer); - if (name != value) { - const QString oldTitle = q->title(); - name = value; - emit q->nameChanged(name); - emit q->titleChanged(q->title()); - if (model) - IrcBufferModelPrivate::get(model)->renameBuffer(oldTitle, q->title()); - } -} - -void IrcBufferPrivate::setPrefix(const QString& value) -{ - Q_Q(IrcBuffer); - if (prefix != value) { - const QString oldTitle = q->title(); - prefix = value; - emit q->prefixChanged(prefix); - emit q->titleChanged(q->title()); - if (model) - IrcBufferModelPrivate::get(model)->renameBuffer(oldTitle, q->title()); - } -} - -void IrcBufferPrivate::setModel(IrcBufferModel* value) -{ - model = value; -} - -bool IrcBufferPrivate::processMessage(IrcMessage* message) -{ - Q_Q(IrcBuffer); - bool processed = false; - switch (message->type()) { - case IrcMessage::Join: - processed = processJoinMessage(static_cast(message)); - break; - case IrcMessage::Kick: - processed = processKickMessage(static_cast(message)); - break; - case IrcMessage::Mode: - processed = processModeMessage(static_cast(message)); - break; - case IrcMessage::Names: - processed = processNamesMessage(static_cast(message)); - break; - case IrcMessage::Nick: - processed = processNickMessage(static_cast(message)); - break; - case IrcMessage::Notice: - processed = processNoticeMessage(static_cast(message)); - break; - case IrcMessage::Numeric: - processed = processNumericMessage(static_cast(message)); - break; - case IrcMessage::Part: - processed = processPartMessage(static_cast(message)); - break; - case IrcMessage::Private: - processed = processPrivateMessage(static_cast(message)); - break; - case IrcMessage::Quit: - processed = processQuitMessage(static_cast(message)); - break; - case IrcMessage::Topic: - processed = processTopicMessage(static_cast(message)); - break; - case IrcMessage::WhoReply: - processed = processWhoReplyMessage(static_cast(message)); - break; - default: - break; - } - if (processed) - emit q->messageReceived(message); - return processed; -} - -bool IrcBufferPrivate::processJoinMessage(IrcJoinMessage* message) -{ - Q_UNUSED(message); - return false; -} - -bool IrcBufferPrivate::processKickMessage(IrcKickMessage* message) -{ - Q_UNUSED(message); - return false; -} - -bool IrcBufferPrivate::processModeMessage(IrcModeMessage* message) -{ - Q_UNUSED(message); - return false; -} - -bool IrcBufferPrivate::processNamesMessage(IrcNamesMessage* message) -{ - Q_UNUSED(message); - return false; -} - -bool IrcBufferPrivate::processNickMessage(IrcNickMessage* message) -{ - if (!(message->flags() & IrcMessage::Playback) && !message->nick().compare(name, Qt::CaseInsensitive)) { - setName(message->newNick()); - return true; - } - return !message->newNick().compare(name, Qt::CaseInsensitive); -} - -bool IrcBufferPrivate::processNoticeMessage(IrcNoticeMessage* message) -{ - Q_UNUSED(message); - return true; -} - -bool IrcBufferPrivate::processNumericMessage(IrcNumericMessage* message) -{ - Q_UNUSED(message); - return true; -} - -bool IrcBufferPrivate::processPartMessage(IrcPartMessage* message) -{ - Q_UNUSED(message); - return false; -} - -bool IrcBufferPrivate::processPrivateMessage(IrcPrivateMessage* message) -{ - Q_UNUSED(message); - return true; -} - -bool IrcBufferPrivate::processQuitMessage(IrcQuitMessage* message) -{ - return !message->nick().compare(name, Qt::CaseInsensitive); -} - -bool IrcBufferPrivate::processTopicMessage(IrcTopicMessage* message) -{ - Q_UNUSED(message); - return false; -} - -bool IrcBufferPrivate::processWhoReplyMessage(IrcWhoReplyMessage *message) -{ - Q_UNUSED(message); - return true; -} -#endif // IRC_DOXYGEN - -/*! - Constructs a new buffer object with \a parent. - */ -IrcBuffer::IrcBuffer(QObject* parent) - : QObject(parent), d_ptr(new IrcBufferPrivate) -{ - Q_D(IrcBuffer); - d->q_ptr = this; -} - -/*! - \internal - */ -IrcBuffer::IrcBuffer(IrcBufferPrivate& dd, QObject* parent) - : QObject(parent), d_ptr(&dd) -{ - Q_D(IrcBuffer); - d->q_ptr = this; -} - -/*! - Destructs the buffer object. - */ -IrcBuffer::~IrcBuffer() -{ - emit destroyed(this); -} - -/*! - This property holds the whole buffer title. - - The title consists of \ref prefix and \ref name. - - \par Access function: - \li QString title() const - - \par Notifier signal: - \li void titleChanged(const QString& title) - */ -QString IrcBuffer::title() const -{ - Q_D(const IrcBuffer); - return d->prefix + d->name; -} - -/*! - This property holds the name part of the buffer \ref title. - - \par Access functions: - \li QString name() const - \li void setName(const QString& name) [slot] - - \par Notifier signal: - \li void nameChanged(const QString& name) - */ -QString IrcBuffer::name() const -{ - Q_D(const IrcBuffer); - return d->name; -} - -void IrcBuffer::setName(const QString& name) -{ - Q_D(IrcBuffer); - d->setName(name); -} - -/*! - This property holds the prefix part of the buffer \ref title. - - \par Access functions: - \li QString prefix() const - \li void setPrefix(const QString& prefix) [slot] - - \par Notifier signal: - \li void prefixChanged(const QString& prefix) - */ -QString IrcBuffer::prefix() const -{ - Q_D(const IrcBuffer); - return d->prefix; -} - -void IrcBuffer::setPrefix(const QString& prefix) -{ - Q_D(IrcBuffer); - return d->setPrefix(prefix); -} - -/*! - \property bool IrcBuffer::channel - This property holds whether the buffer is a channel. - - \par Access function: - \li bool isChannel() const - - \sa toChannel() - */ -bool IrcBuffer::isChannel() const -{ - return qobject_cast(this); -} - -/*! - Returns the buffer cast to a IrcChannel, - if the class is actually a channel, \c 0 otherwise. - - \sa \ref channel "isChannel()" -*/ -IrcChannel* IrcBuffer::toChannel() -{ - return qobject_cast(this); -} - -/*! - This property holds the connection of the buffer. - - \par Access function: - \li \ref IrcConnection* connection() const - */ -IrcConnection* IrcBuffer::connection() const -{ - Q_D(const IrcBuffer); - return d->model ? d->model->connection() : 0; -} - -/*! - This property holds the network of the buffer. - - \par Access function: - \li \ref IrcNetwork* network() const - */ -IrcNetwork* IrcBuffer::network() const -{ - Q_D(const IrcBuffer); - return d->model ? d->model->network() : 0; -} - -/*! - This property holds the model of the buffer. - - \par Access function: - \li \ref IrcBufferModel* model() const - */ -IrcBufferModel* IrcBuffer::model() const -{ - Q_D(const IrcBuffer); - return d->model; -} - -/*! - \property bool IrcBuffer::active - This property holds whether the buffer is active. - - A buffer is considered active when a %connection is established. Furthermore, - channel buffers are only considered active when the user is on the channel. - - \par Access function: - \li bool isActive() const - - \par Notifier signal: - \li void activeChanged(bool active) - - \sa IrcConnection::connected - */ -bool IrcBuffer::isActive() const -{ - if (IrcConnection* c = connection()) - return c->isConnected(); - return false; -} - -/*! - \property bool IrcBuffer::sticky - This property holds whether the buffer is sticky. - - A sticky buffer stays in the beginning (Qt::AscendingOrder) or - end (Qt::DescendingOrder) of the list of buffers in IrcBufferModel. - - The default value is \c false. - - \par Access functions: - \li bool isSticky() const - \li void setSticky(bool sticky) - - \par Notifier signal: - \li void stickyChanged(bool sticky) - */ - -bool IrcBuffer::isSticky() const -{ - Q_D(const IrcBuffer); - return d->sticky; -} - -void IrcBuffer::setSticky(bool sticky) -{ - Q_D(IrcBuffer); - if (d->sticky != sticky) { - d->sticky = sticky; - emit stickyChanged(sticky); - } -} - -/*! - \property bool IrcBuffer::persistent - This property holds whether the buffer is persistent. - - The default value is \c false. - - A persistent buffer does not get removed and destructed - when calling IrcBufferModel::clear(), or when when leaving - the corresponding channel. In order to remove a persistent - buffer, either explicitly call IrcBufferModel::remove() or - delete the buffer. - - \par Access functions: - \li bool isPersistent() const - \li void setPersistent(bool persistent) - - \par Notifier signal: - \li void persistentChanged(bool persistent) - */ - -bool IrcBuffer::isPersistent() const -{ - Q_D(const IrcBuffer); - return d->persistent; -} - -void IrcBuffer::setPersistent(bool persistent) -{ - Q_D(IrcBuffer); - if (d->persistent != persistent) { - d->persistent = persistent; - emit persistentChanged(persistent); - } -} - -/*! - \since 3.1 - - This property holds arbitrary user data. - - \par Access functions: - \li QVariantMap userData() const - \li void setUserData(const QVariantMap& data) - - \par Notifier signal: - \li void userDataChanged(const QVariantMap& data) - */ -QVariantMap IrcBuffer::userData() const -{ - Q_D(const IrcBuffer); - return d->userData; -} - -void IrcBuffer::setUserData(const QVariantMap& data) -{ - Q_D(IrcBuffer); - if (d->userData != data) { - d->userData = data; - emit userDataChanged(data); - } -} - -/*! - Sends a \a command to the server. - - This method is provided for convenience. It is equal to: - \code - IrcConnection* connection = buffer->connection(); - connection->sendCommand(command); - \endcode - - \sa IrcConnection::sendCommand() - */ -bool IrcBuffer::sendCommand(IrcCommand* command) -{ - if (IrcConnection* c = connection()) - return c->sendCommand(command); - return false; -} - -/*! - Emits messageReceived() with \a message. - - IrcBufferModel handles only buffer specific messages and delivers them - to the appropriate IrcBuffer instances. When applications decide to handle - IrcBuffer::messageReceived(), IrcBufferModel::messageIgnored() makes it - easy to implement handling for the rest, non-buffer specific messages. - This method can be used to forward such ignored messages to the desired - buffers (for instance the one that is currently active in the GUI). - */ -void IrcBuffer::receiveMessage(IrcMessage* message) -{ - if (message) - emit messageReceived(message); -} - -/*! - \since 3.1 - - Closes the buffer with an optional \a reason. - - The default implementation removes the buffer from its \ref model. - Furthermore, IrcChannel parts the channel with \a reason and custom - IrcBuffer subclasses might do some additional tasks. - - \sa IrcChannel::close() - */ -void IrcBuffer::close(const QString& reason) -{ - Q_UNUSED(reason); - Q_D(const IrcBuffer); - if (d->model) - d->model->remove(this); -} - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug debug, const IrcBuffer* buffer) -{ - if (!buffer) - return debug << "IrcBuffer(0x0) "; - debug.nospace() << buffer->metaObject()->className() << '(' << (void*) buffer; - if (!buffer->objectName().isEmpty()) - debug.nospace() << ", name=" << qPrintable(buffer->objectName()); - if (!buffer->title().isEmpty()) - debug.nospace() << ", title=" << qPrintable(buffer->title()); - debug.nospace() << ')'; - return debug.space(); -} -#endif // QT_NO_DEBUG_STREAM - -#include "moc_ircbuffer.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/model/ircbuffermodel.cpp b/libcommuni/src/model/ircbuffermodel.cpp deleted file mode 100644 index c037a53..0000000 --- a/libcommuni/src/model/ircbuffermodel.cpp +++ /dev/null @@ -1,1168 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircbuffermodel.h" -#include "ircbuffermodel_p.h" -#include "ircchannel_p.h" -#include "ircbuffer_p.h" -#include "ircnetwork.h" -#include "ircchannel.h" -#include "ircmessage.h" -#include "irccommand.h" -#include "ircconnection.h" -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file ircbuffermodel.h - \brief \#include <IrcBufferModel> - */ - -/*! - \class IrcBufferModel ircbuffermodel.h - \ingroup models - \brief Keeps track of buffers. - - IrcBufferModel automatically keeps track of channel and query buffers - and manages IrcBuffer instances for them. It will notify via signals - when channel and query buffers are added and/or removed. IrcBufferModel - can be used directly as a data model for Qt's item views - both in C++ - and QML. - - \code - IrcConnection* connection = new IrcConnection(this); - IrcBufferModel* model = new IrcBufferModel(connection); - connect(model, SIGNAL(added(IrcBuffer*)), this, SLOT(onBufferAdded(IrcBuffer*))); - connect(model, SIGNAL(removed(IrcBuffer*)), this, SLOT(onBufferRemoved(IrcBuffer*))); - listView->setModel(model); - \endcode - */ - -/*! - \fn void IrcBufferModel::added(IrcBuffer* buffer) - - This signal is emitted when a \a buffer is added to the list of buffers. - */ - -/*! - \fn void IrcBufferModel::removed(IrcBuffer* buffer) - - This signal is emitted when a \a buffer is removed from the list of buffers. - */ - -/*! - \fn void IrcBufferModel::aboutToBeAdded(IrcBuffer* buffer) - - This signal is emitted just before a \a buffer is added to the list of buffers. - */ - -/*! - \fn void IrcBufferModel::aboutToBeRemoved(IrcBuffer* buffer) - - This signal is emitted just before a \a buffer is removed from the list of buffers. - */ - -/*! - \fn void IrcBufferModel::messageIgnored(IrcMessage* message) - - This signal is emitted when a message was ignored. - - IrcBufferModel handles only buffer specific messages and delivers - them to the appropriate IrcBuffer instances. When applications decide - to handle IrcBuffer::messageReceived(), this signal makes it easy to - implement handling for the rest, non-buffer specific messages. - - \sa IrcConnection::messageReceived(), IrcBuffer::messageReceived() - */ - -#ifndef IRC_DOXYGEN -class IrcBufferLessThan -{ -public: - IrcBufferLessThan(IrcBufferModel* model, Irc::SortMethod method) : model(model), method(method) { } - bool operator()(IrcBuffer* b1, IrcBuffer* b2) const { return model->lessThan(b1, b2, method); } -private: - IrcBufferModel* model; - Irc::SortMethod method; -}; - -class IrcBufferGreaterThan -{ -public: - IrcBufferGreaterThan(IrcBufferModel* model, Irc::SortMethod method) : model(model), method(method) { } - bool operator()(IrcBuffer* b1, IrcBuffer* b2) const { return model->lessThan(b2, b1, method); } -private: - IrcBufferModel* model; - Irc::SortMethod method; -}; - -IrcBufferModelPrivate::IrcBufferModelPrivate() : q_ptr(0), role(Irc::TitleRole), - sortMethod(Irc::SortByHand), sortOrder(Qt::AscendingOrder), - bufferProto(0), channelProto(0), persistent(false) -{ -} - -bool IrcBufferModelPrivate::messageFilter(IrcMessage* msg) -{ - Q_Q(IrcBufferModel); - if (msg->type() == IrcMessage::Join && msg->flags() & IrcMessage::Own) - createBuffer(static_cast(msg)->channel()); - - bool processed = false; - switch (msg->type()) { - case IrcMessage::Nick: - case IrcMessage::Quit: - foreach (IrcBuffer* buffer, bufferList) { - if (buffer->isActive()) - IrcBufferPrivate::get(buffer)->processMessage(msg); - } - processed = true; - break; - - case IrcMessage::Join: - case IrcMessage::Part: - case IrcMessage::Kick: - case IrcMessage::Names: - case IrcMessage::Topic: - processed = processMessage(msg->property("channel").toString(), msg); - break; - - case IrcMessage::WhoReply: - processed = processMessage(static_cast(msg)->mask(), msg); - break; - - case IrcMessage::Private: - if (IrcPrivateMessage* pm = static_cast(msg)) - processed = !pm->isRequest() && (processMessage(pm->target(), pm, pm->flags() & IrcMessage::Own) || processMessage(pm->nick(), pm, true)); - break; - - case IrcMessage::Notice: - if (IrcNoticeMessage* no = static_cast(msg)) - processed = !no->isReply() && (processMessage(no->target(), no, no->flags() & IrcMessage::Own) || processMessage(no->nick(), no)); - break; - - case IrcMessage::Mode: - processed = processMessage(static_cast(msg)->target(), msg); - break; - - case IrcMessage::Numeric: - // TODO: any other special cases besides RPL_NAMREPLY? - if (static_cast(msg)->code() == Irc::RPL_NAMREPLY) { - const int count = msg->parameters().count(); - const QString channel = msg->parameters().value(count - 2); - processed = processMessage(channel, msg); - } else { - processed = processMessage(msg->parameters().value(1), msg); - } - break; - - default: - break; - } - - if (!processed) - emit q->messageIgnored(msg); - - if (!(msg->flags() & IrcMessage::Playback)) { - if (msg->type() == IrcMessage::Part && msg->flags() & IrcMessage::Own) { - destroyBuffer(static_cast(msg)->channel()); - } else if (msg->type() == IrcMessage::Kick) { - const IrcKickMessage* kickMsg = static_cast(msg); - if (!kickMsg->user().compare(msg->connection()->nickName(), Qt::CaseInsensitive)) - destroyBuffer(kickMsg->channel()); - } - } - return false; -} - -bool IrcBufferModelPrivate::commandFilter(IrcCommand* cmd) -{ - if (cmd->type() == IrcCommand::Join) { - const QString channel = cmd->parameters().value(0).toLower(); - const QString key = cmd->parameters().value(1); - if (!key.isEmpty()) - keys.insert(channel, key); - else - keys.remove(channel); - } - return false; -} - -IrcBuffer* IrcBufferModelPrivate::createBufferHelper(const QString& title) -{ - Q_Q(IrcBufferModel); - IrcBuffer* buffer = 0; - const QMetaObject* metaObject = q->metaObject(); - int idx = metaObject->indexOfMethod("createBuffer(QVariant)"); - if (idx != -1) { - // QML: QVariant createBuffer(QVariant) - QVariant ret; - QMetaMethod method = metaObject->method(idx); - method.invoke(q, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, title)); - buffer = ret.value(); - } else { - // C++: IrcBuffer* createBuffer(QString) - idx = metaObject->indexOfMethod("createBuffer(QString)"); - QMetaMethod method = metaObject->method(idx); - method.invoke(q, Q_RETURN_ARG(IrcBuffer*, buffer), Q_ARG(QString, title)); - } - return buffer; -} - -IrcChannel* IrcBufferModelPrivate::createChannelHelper(const QString& title) -{ - Q_Q(IrcBufferModel); - IrcChannel* channel = 0; - const QMetaObject* metaObject = q->metaObject(); - int idx = metaObject->indexOfMethod("createChannel(QVariant)"); - if (idx != -1) { - // QML: QVariant createChannel(QVariant) - QVariant ret; - QMetaMethod method = metaObject->method(idx); - method.invoke(q, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, title)); - channel = ret.value(); - } else { - // C++: IrcChannel* createChannel(QString) - idx = metaObject->indexOfMethod("createChannel(QString)"); - QMetaMethod method = metaObject->method(idx); - method.invoke(q, Q_RETURN_ARG(IrcChannel*, channel), Q_ARG(QString, title)); - } - return channel; -} - -IrcBuffer* IrcBufferModelPrivate::createBuffer(const QString& title) -{ - Q_Q(IrcBufferModel); - IrcBuffer* buffer = bufferMap.value(title.toLower()); - if (!buffer) { - if (connection && connection->network()->isChannel(title)) - buffer = createChannelHelper(title); - else - buffer = createBufferHelper(title); - if (buffer) { - IrcBufferPrivate::get(buffer)->init(title, q); - addBuffer(buffer); - } - } - return buffer; -} - -void IrcBufferModelPrivate::destroyBuffer(const QString& title, bool force) -{ - IrcBuffer* buffer = bufferMap.value(title.toLower()); - if (buffer && (force || (!persistent && !buffer->isPersistent()))) { - removeBuffer(buffer); - buffer->deleteLater(); - } -} - -void IrcBufferModelPrivate::addBuffer(IrcBuffer* buffer, bool notify) -{ - insertBuffer(-1, buffer, notify); -} - -void IrcBufferModelPrivate::insertBuffer(int index, IrcBuffer* buffer, bool notify) -{ - Q_Q(IrcBufferModel); - if (buffer && !bufferList.contains(buffer)) { - const QString title = buffer->title(); - const QString lower = title.toLower(); - if (bufferMap.contains(lower)) { - qWarning() << "IrcBufferModel: ignored duplicate buffer" << title; - return; - } - IrcBufferPrivate::get(buffer)->setModel(q); - const bool isChannel = buffer->isChannel(); - if (sortMethod != Irc::SortByHand) { - QList::iterator it; - if (sortOrder == Qt::AscendingOrder) - it = qUpperBound(bufferList.begin(), bufferList.end(), buffer, IrcBufferLessThan(q, sortMethod)); - else - it = qUpperBound(bufferList.begin(), bufferList.end(), buffer, IrcBufferGreaterThan(q, sortMethod)); - index = it - bufferList.begin(); - } else if (index == -1) { - index = bufferList.count(); - } - if (notify) - emit q->aboutToBeAdded(buffer); - q->beginInsertRows(QModelIndex(), index, index); - bufferList.insert(index, buffer); - bufferMap.insert(lower, buffer); - if (isChannel) { - channels += title; - if (keys.contains(lower)) - IrcChannelPrivate::get(buffer->toChannel())->setKey(keys.take(lower)); - } - q->connect(buffer, SIGNAL(destroyed(IrcBuffer*)), SLOT(_irc_bufferDestroyed(IrcBuffer*))); - q->endInsertRows(); - if (notify) { - emit q->added(buffer); - if (isChannel) - emit q->channelsChanged(channels); - emit q->buffersChanged(bufferList); - emit q->countChanged(bufferList.count()); - if (bufferList.count() == 1) - emit q->emptyChanged(false); - } - } -} - -void IrcBufferModelPrivate::removeBuffer(IrcBuffer* buffer, bool notify) -{ - Q_Q(IrcBufferModel); - int idx = bufferList.indexOf(buffer); - if (idx != -1) { - const bool isChannel = buffer->isChannel(); - if (notify) - emit q->aboutToBeRemoved(buffer); - q->beginRemoveRows(QModelIndex(), idx, idx); - bufferList.removeAt(idx); - bufferMap.remove(buffer->title().toLower()); - if (isChannel) - channels.removeOne(buffer->title()); - q->endRemoveRows(); - if (notify) { - emit q->removed(buffer); - if (isChannel) - emit q->channelsChanged(channels); - emit q->buffersChanged(bufferList); - emit q->countChanged(bufferList.count()); - if (bufferList.isEmpty()) - emit q->emptyChanged(true); - } - } -} - -bool IrcBufferModelPrivate::renameBuffer(const QString& from, const QString& to) -{ - Q_Q(IrcBufferModel); - const QString fromLower = from.toLower(); - const QString toLower = to.toLower(); - if (bufferMap.contains(toLower)) - destroyBuffer(toLower, true); - if (bufferMap.contains(fromLower)) { - IrcBuffer* buffer = bufferMap.take(fromLower); - bufferMap.insert(toLower, buffer); - - const int idx = bufferList.indexOf(buffer); - QModelIndex index = q->index(idx); - emit q->dataChanged(index, index); - - if (sortMethod != Irc::SortByHand) { - QList buffers = bufferList; - const bool notify = false; - removeBuffer(buffer, notify); - insertBuffer(-1, buffer, notify); - if (buffers != bufferList) - emit q->buffersChanged(bufferList); - } - return true; - } - return false; -} - -bool IrcBufferModelPrivate::processMessage(const QString& title, IrcMessage* message, bool create) -{ - IrcBuffer* buffer = bufferMap.value(title.toLower()); - if (!buffer && create && !title.contains(QLatin1Char('*'))) - buffer = createBuffer(title); - if (buffer) - return IrcBufferPrivate::get(buffer)->processMessage(message); - return false; -} - -void IrcBufferModelPrivate::_irc_connected() -{ - foreach (IrcBuffer* buffer, bufferList) - IrcBufferPrivate::get(buffer)->connected(); -} - -void IrcBufferModelPrivate::_irc_disconnected() -{ - foreach (IrcBuffer* buffer, bufferList) - IrcBufferPrivate::get(buffer)->disconnected(); -} - -void IrcBufferModelPrivate::_irc_bufferDestroyed(IrcBuffer* buffer) -{ - removeBuffer(buffer); -} -#endif // IRC_DOXYGEN - -/*! - Constructs a new model with \a parent. - - \note If \a parent is an instance of IrcConnection, it will be - automatically assigned to \ref IrcBufferModel::connection "connection". - */ -IrcBufferModel::IrcBufferModel(QObject* parent) - : QAbstractListModel(parent), d_ptr(new IrcBufferModelPrivate) -{ - Q_D(IrcBufferModel); - d->q_ptr = this; - setBufferPrototype(new IrcBuffer(this)); - setChannelPrototype(new IrcChannel(this)); - setConnection(qobject_cast(parent)); -} - -/*! - Destructs the model. - */ -IrcBufferModel::~IrcBufferModel() -{ - Q_D(IrcBufferModel); - foreach (IrcBuffer* buffer, d->bufferList) { - buffer->disconnect(this); - delete buffer; - } - d->bufferList.clear(); - d->bufferMap.clear(); - d->channels.clear(); - emit destroyed(this); -} - -/*! - This property holds the connection. - - \par Access functions: - \li \ref IrcConnection* connection() const - \li void setConnection(\ref IrcConnection* connection) - - \warning Changing the connection on the fly is not supported. - */ -IrcConnection* IrcBufferModel::connection() const -{ - Q_D(const IrcBufferModel); - return d->connection; -} - -void IrcBufferModel::setConnection(IrcConnection* connection) -{ - Q_D(IrcBufferModel); - if (d->connection != connection) { - if (d->connection) { - qCritical("IrcBufferModel::setConnection(): changing the connection on the fly is not supported."); - return; - } - d->connection = connection; - d->connection->installMessageFilter(d); - d->connection->installCommandFilter(d); - connect(d->connection, SIGNAL(connected()), this, SLOT(_irc_connected())); - connect(d->connection, SIGNAL(disconnected()), this, SLOT(_irc_disconnected())); - emit connectionChanged(connection); - emit networkChanged(network()); - } -} - -/*! - This property holds the network. - - \par Access functions: - \li \ref IrcNetwork* network() const - */ -IrcNetwork* IrcBufferModel::network() const -{ - Q_D(const IrcBufferModel); - return d->connection ? d->connection->network() : 0; -} - -/*! - This property holds the number of buffers. - - \par Access function: - \li int count() const - - \par Notifier signal: - \li void countChanged(int count) - */ -int IrcBufferModel::count() const -{ - return rowCount(); -} - -/*! - \since 3.1 - \property bool IrcBufferModel::empty - - This property holds the whether the model is empty. - - \par Access function: - \li bool isEmpty() const - - \par Notifier signal: - \li void emptyChanged(bool empty) - */ -bool IrcBufferModel::isEmpty() const -{ - Q_D(const IrcBufferModel); - return d->bufferList.isEmpty(); -} - -/*! - This property holds the list of channel names. - - \par Access function: - \li QStringList channels() const - - \par Notifier signal: - \li void channelsChanged(const QStringList& channels) - */ -QStringList IrcBufferModel::channels() const -{ - Q_D(const IrcBufferModel); - return d->channels; -} - -/*! - This property holds the list of buffers. - - \par Access function: - \li QList<\ref IrcBuffer*> buffers() const - - \par Notifier signal: - \li void buffersChanged(const QList<\ref IrcBuffer*>& buffers) - */ -QList IrcBufferModel::buffers() const -{ - Q_D(const IrcBufferModel); - return d->bufferList; -} - -/*! - Returns the buffer object at \a index. - */ -IrcBuffer* IrcBufferModel::get(int index) const -{ - Q_D(const IrcBufferModel); - return d->bufferList.value(index); -} - -/*! - Returns the buffer object for \a title or \c 0 if not found. - */ -IrcBuffer* IrcBufferModel::find(const QString& title) const -{ - Q_D(const IrcBufferModel); - return d->bufferMap.value(title.toLower()); -} - -/*! - Returns \c true if the model contains \a title. - */ -bool IrcBufferModel::contains(const QString& title) const -{ - Q_D(const IrcBufferModel); - return d->bufferMap.contains(title.toLower()); -} - -/*! - Returns the index of the specified \a buffer, - or \c -1 if the model does not contain the \a buffer. - */ -int IrcBufferModel::indexOf(IrcBuffer* buffer) const -{ - Q_D(const IrcBufferModel); - return d->bufferList.indexOf(buffer); -} - -/*! - Adds a buffer with \a title to the model and returns it. - */ -IrcBuffer* IrcBufferModel::add(const QString& title) -{ - Q_D(IrcBufferModel); - return d->createBuffer(title); -} - -/*! - Adds the \a buffer to the model. - */ -void IrcBufferModel::add(IrcBuffer* buffer) -{ - Q_D(IrcBufferModel); - d->addBuffer(buffer); -} - -/*! - Removes and destroys a buffer with \a title from the model. - */ -void IrcBufferModel::remove(const QString& title) -{ - Q_D(IrcBufferModel); - d->destroyBuffer(title, true); -} - -/*! - Removes and destroys a \a buffer from the model. - */ -void IrcBufferModel::remove(IrcBuffer* buffer) -{ - delete buffer; -} - -/*! - This property holds the display role. - - The specified data role is returned for Qt::DisplayRole. - - The default value is \ref Irc::TitleRole. - - \par Access functions: - \li \ref Irc::DataRole displayRole() const - \li void setDisplayRole(\ref Irc::DataRole role) - */ -Irc::DataRole IrcBufferModel::displayRole() const -{ - Q_D(const IrcBufferModel); - return d->role; -} - -void IrcBufferModel::setDisplayRole(Irc::DataRole role) -{ - Q_D(IrcBufferModel); - d->role = role; -} - -/*! - \since 3.1 - - \property bool IrcBufferModel::persistent - This property holds whether the model is persistent. - - The default value is \c false. - - A persistent model does not remove and destruct channel buffers - automatically when leaving the corresponding channels. In order - to remove buffers from a persistent model, either call - IrcBufferModel::remove() or delete the buffer. - - \par Access functions: - \li bool isPersistent() const - \li void setPersistent(bool persistent) - - \par Notifier signal: - \li void persistentChanged(bool persistent) - */ -bool IrcBufferModel::isPersistent() const -{ - Q_D(const IrcBufferModel); - return d->persistent; -} - -void IrcBufferModel::setPersistent(bool persistent) -{ - Q_D(IrcBufferModel); - if (d->persistent != persistent) { - d->persistent = persistent; - emit persistentChanged(persistent); - } -} - -/*! - Returns the model index for \a buffer. - */ -QModelIndex IrcBufferModel::index(IrcBuffer* buffer) const -{ - Q_D(const IrcBufferModel); - return index(d->bufferList.indexOf(buffer)); -} - -/*! - Returns the buffer for model \a index. - */ -IrcBuffer* IrcBufferModel::buffer(const QModelIndex& index) const -{ - if (!hasIndex(index.row(), index.column())) - return 0; - - return static_cast(index.internalPointer()); -} - -/*! - This property holds the model sort order. - - The default value is \c Qt::AscendingOrder. - - \par Access functions: - \li Qt::SortOrder sortOrder() const - \li void setSortOrder(Qt::SortOrder order) - - \sa sort(), lessThan() - */ -Qt::SortOrder IrcBufferModel::sortOrder() const -{ - Q_D(const IrcBufferModel); - return d->sortOrder; -} - -void IrcBufferModel::setSortOrder(Qt::SortOrder order) -{ - Q_D(IrcBufferModel); - if (d->sortOrder != order) { - d->sortOrder = order; - if (d->sortMethod != Irc::SortByHand && !d->bufferList.isEmpty()) - sort(d->sortMethod, d->sortOrder); - } -} - -/*! - This property holds the model sort method. - - The default value is \c Irc::SortByHand. - - Method | Description | Example - -----------------|-------------------------------------------------------------------|------------------------------------------------- - Irc::SortByHand | Buffers are not sorted automatically, but only by calling sort(). | - - Irc::SortByName | Buffers are sorted alphabetically, ignoring any channel prefix. | "bot", "#communi", "#freenode", "jpnurmi", "#qt" - Irc::SortByTitle | Buffers are sorted alphabetically, and channels before queries. | "#communi", "#freenode", "#qt", "bot", "jpnurmi" - - \par Access functions: - \li Irc::SortMethod sortMethod() const - \li void setSortMethod(Irc::SortMethod method) - - \sa sort(), lessThan() - */ -Irc::SortMethod IrcBufferModel::sortMethod() const -{ - Q_D(const IrcBufferModel); - return d->sortMethod; -} - -void IrcBufferModel::setSortMethod(Irc::SortMethod method) -{ - Q_D(IrcBufferModel); - if (d->sortMethod != method) { - d->sortMethod = method; - if (d->sortMethod != Irc::SortByHand && !d->bufferList.isEmpty()) - sort(d->sortMethod, d->sortOrder); - } -} - -/*! - Clears the model. - - All buffers except \ref IrcBuffer::persistent "persistent" buffers are removed and destroyed. - - In order to remove a persistent buffer, either explicitly call remove() or delete the buffer. - */ -void IrcBufferModel::clear() -{ - Q_D(IrcBufferModel); - if (!d->bufferList.isEmpty()) { - bool bufferRemoved = false; - bool channelRemoved = false; - foreach (IrcBuffer* buffer, d->bufferList) { - if (!buffer->isPersistent()) { - if (!bufferRemoved) { - beginResetModel(); - bufferRemoved = true; - } - channelRemoved |= buffer->isChannel(); - buffer->disconnect(this); - d->bufferList.removeOne(buffer); - d->channels.removeOne(buffer->title()); - d->bufferMap.remove(buffer->title().toLower()); - delete buffer; - } - } - if (bufferRemoved) { - endResetModel(); - if (channelRemoved) - emit channelsChanged(d->channels); - emit buffersChanged(d->bufferList); - emit countChanged(d->bufferList.count()); - if (d->bufferList.isEmpty()) - emit emptyChanged(true); - } - } -} - -/*! - Makes the model receive and handle \a message. - */ -void IrcBufferModel::receiveMessage(IrcMessage* message) -{ - Q_D(IrcBufferModel); - d->messageFilter(message); -} - -/*! - Sorts the model using the given \a order. - */ -void IrcBufferModel::sort(int column, Qt::SortOrder order) -{ - Q_D(IrcBufferModel); - if (column == 0) - sort(d->sortMethod, order); -} - -/*! - Sorts the model using the given \a method and \a order. - - \sa lessThan() - */ -void IrcBufferModel::sort(Irc::SortMethod method, Qt::SortOrder order) -{ - Q_D(IrcBufferModel); - if (method == Irc::SortByHand) - return; - - emit layoutAboutToBeChanged(); - - QList persistentBuffers; - QModelIndexList oldPersistentIndexes = persistentIndexList(); - foreach (const QModelIndex& index, oldPersistentIndexes) - persistentBuffers += static_cast(index.internalPointer()); - - if (order == Qt::AscendingOrder) - qSort(d->bufferList.begin(), d->bufferList.end(), IrcBufferLessThan(this, method)); - else - qSort(d->bufferList.begin(), d->bufferList.end(), IrcBufferGreaterThan(this, method)); - - QModelIndexList newPersistentIndexes; - foreach (IrcBuffer* buffer, persistentBuffers) - newPersistentIndexes += index(d->bufferList.indexOf(buffer)); - changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - - emit layoutChanged(); -} - -/*! - Creates a buffer object with \a title. - - IrcBufferModel will automatically call this factory method when a - need for the buffer object occurs ie. a private message is received. - - The default implementation creates an instance of the buffer prototype. - Reimplement this function in order to alter the default behavior. - - \sa bufferPrototype - */ -IrcBuffer* IrcBufferModel::createBuffer(const QString& title) -{ - Q_D(IrcBufferModel); - Q_UNUSED(title); - QObject* instance = d->bufferProto->metaObject()->newInstance(Q_ARG(QObject*, this)); - return qobject_cast(instance); -} - -/*! - Creates a channel object with \a title. - - IrcBufferModel will automatically call this factory method when a - need for the channel object occurs ie. a channel is being joined. - - The default implementation creates an instance of the channel prototype. - Reimplement this function in order to alter the default behavior. - - \sa channelPrototype - */ -IrcChannel* IrcBufferModel::createChannel(const QString& title) -{ - Q_D(IrcBufferModel); - Q_UNUSED(title); - QObject* instance = d->channelProto->metaObject()->newInstance(Q_ARG(QObject*, this)); - return qobject_cast(instance); -} - -/*! - Returns \c true if \a one buffer is "less than" \a another, - otherwise returns \c false. - - The default implementation sorts according to the specified sort method. - Reimplement this function in order to customize the sort order. - - \sa sort(), sortMethod - */ -bool IrcBufferModel::lessThan(IrcBuffer* one, IrcBuffer* another, Irc::SortMethod method) const -{ - if (one->isSticky() != another->isSticky()) - return one->isSticky(); - - if (method == Irc::SortByTitle) { - const QStringList prefixes = one->network()->channelTypes(); - - const QString p1 = one->prefix(); - const QString p2 = another->prefix(); - - const int i1 = !p1.isEmpty() ? prefixes.indexOf(p1.at(0)) : -1; - const int i2 = !p2.isEmpty() ? prefixes.indexOf(p2.at(0)) : -1; - - if (i1 >= 0 && i2 < 0) - return true; - if (i1 < 0 && i2 >= 0) - return false; - if (i1 >= 0 && i2 >= 0 && i1 != i2) - return i1 < i2; - } - - // Irc::SortByName - const QString n1 = one->name(); - const QString n2 = another->name(); - return n1.compare(n2, Qt::CaseInsensitive) < 0; -} - -/*! - The following role names are provided by default: - - Role | Name | Type | Example - -----------------|------------|-------------|-------- - Qt::DisplayRole | "display" | 1) | - - Irc::BufferRole | "buffer" | IrcBuffer* | <object> - Irc::ChannelRole | "channel" | IrcChannel* | <object> - Irc::NameRole | "name" | QString | "communi" - Irc::PrefixRole | "prefix" | QString | "#" - Irc::TitleRole | "title" | QString | "#communi" - - 1) The type depends on \ref displayRole. - */ -QHash IrcBufferModel::roleNames() const -{ - QHash roles; - roles[Qt::DisplayRole] = "display"; - roles[Irc::BufferRole] = "buffer"; - roles[Irc::ChannelRole] = "channel"; - roles[Irc::NameRole] = "name"; - roles[Irc::PrefixRole] = "prefix"; - roles[Irc::TitleRole] = "title"; - return roles; -} - -/*! - Returns the number of buffers. - */ -int IrcBufferModel::rowCount(const QModelIndex& parent) const -{ - if (parent.isValid()) - return 0; - - Q_D(const IrcBufferModel); - return d->bufferList.count(); -} - -/*! - Returns the data for specified \a role and user referred to by by the \a index. - */ -QVariant IrcBufferModel::data(const QModelIndex& index, int role) const -{ - Q_D(const IrcBufferModel); - if (!hasIndex(index.row(), index.column(), index.parent())) - return QVariant(); - - IrcBuffer* buffer = static_cast(index.internalPointer()); - Q_ASSERT(buffer); - - switch (role) { - case Qt::DisplayRole: - return data(index, d->role); - case Irc::BufferRole: - return QVariant::fromValue(buffer); - case Irc::ChannelRole: - return QVariant::fromValue(buffer->toChannel()); - case Irc::NameRole: - return buffer->name(); - case Irc::PrefixRole: - return buffer->prefix(); - case Irc::TitleRole: - return buffer->title(); - } - - return QVariant(); -} - -/*! - Returns the index of the item in the model specified by the given \a row, \a column and \a parent index. - */ -QModelIndex IrcBufferModel::index(int row, int column, const QModelIndex& parent) const -{ - Q_D(const IrcBufferModel); - if (!hasIndex(row, column, parent)) - return QModelIndex(); - - return createIndex(row, column, d->bufferList.at(row)); -} - -/*! - This property holds the buffer prototype. - - The prototype is used by the default implementation of createBuffer(). - - \note The prototype must have an invokable constructor. - - \par Access functions: - \li \ref IrcBuffer* bufferPrototype() const - \li void setBufferPrototype(\ref IrcBuffer* prototype) - */ -IrcBuffer* IrcBufferModel::bufferPrototype() const -{ - Q_D(const IrcBufferModel); - return d->bufferProto; -} - -void IrcBufferModel::setBufferPrototype(IrcBuffer* prototype) -{ - Q_D(IrcBufferModel); - if (d->bufferProto != prototype) { - if (d->bufferProto && d->bufferProto->parent() == this) - delete d->bufferProto; - d->bufferProto = prototype ? prototype : new IrcBuffer(this); - emit bufferPrototypeChanged(d->bufferProto); - } -} - -/*! - This property holds the channel prototype. - - The prototype is used by the default implementation of createChannel(). - - \note The prototype must have an invokable constructor. - - \par Access functions: - \li \ref IrcChannel* channelPrototype() const - \li void setChannelPrototype(\ref IrcChannel* prototype) - */ -IrcChannel* IrcBufferModel::channelPrototype() const -{ - Q_D(const IrcBufferModel); - return d->channelProto; -} - -void IrcBufferModel::setChannelPrototype(IrcChannel* prototype) -{ - Q_D(IrcBufferModel); - if (d->channelProto != prototype) { - if (d->channelProto && d->channelProto->parent() == this) - delete d->channelProto; - d->channelProto = prototype ? prototype : new IrcChannel(this); - emit channelPrototypeChanged(d->channelProto); - } -} - -/*! - \since 3.1 - - Saves the state of the model. The \a version number is stored as part of the state data. - - To restore the saved state, pass the return value and \a version number to restoreState(). - */ -QByteArray IrcBufferModel::saveState(int version) const -{ - Q_D(const IrcBufferModel); - QVariantMap args; - args.insert("version", version); - args.insert("sortOrder", d->sortOrder); - args.insert("sortMethod", d->sortMethod); - args.insert("displayRole", d->role); - args.insert("persistent", d->persistent); - - QVariantList bufs; - foreach (IrcBuffer* buffer, d->bufferList) { - QVariantMap b; - b.insert("channel", buffer->isChannel()); - b.insert("name", buffer->name()); - b.insert("prefix", buffer->prefix()); - b.insert("title", buffer->title()); - if (IrcChannel* channel = buffer->toChannel()) { - IrcChannelPrivate* p = IrcChannelPrivate::get(channel); - b.insert("modes", QStringList(p->modes.keys())); - b.insert("args", QStringList(p->modes.values())); - b.insert("topic", channel->topic()); - } - b.insert("stick", buffer->isSticky()); - b.insert("persistent", buffer->isPersistent()); - b.insert("userData", buffer->userData()); - bufs += b; - } - args.insert("buffers", bufs); - - QByteArray state; - QDataStream out(&state, QIODevice::WriteOnly); - out << args; - return state; -} - -/*! - \since 3.1 - - Restores the \a state of the model. The \a version number is compared with that stored in \a state. - If they do not match, the model state is left unchanged, and this function returns \c false; otherwise, - the state is restored, and \c true is returned. - - \sa saveState() - */ -bool IrcBufferModel::restoreState(const QByteArray& state, int version) -{ - Q_D(IrcBufferModel); - QVariantMap args; - QDataStream in(state); - in >> args; - if (in.status() != QDataStream::Ok || args.value("version", -1).toInt() != version) - return false; - - setSortOrder(static_cast(args.value("sortOrder", sortOrder()).toInt())); - setSortMethod(static_cast(args.value("sortMethod", sortMethod()).toInt())); - setDisplayRole(static_cast(args.value("displayRole", displayRole()).toInt())); - setPersistent(args.value("persistent", isPersistent()).toBool()); - - QVariantList buffers = args.value("buffers").toList(); - foreach (const QVariant& v, buffers) { - QVariantMap b = v.toMap(); - IrcBuffer* buffer = find(b.value("title").toString()); - if (!buffer) { - if (b.value("channel").toBool()) - buffer = d->createChannelHelper(b.value("title").toString()); - else - buffer = d->createBufferHelper(b.value("title").toString()); - buffer->setName(b.value("name").toString()); - buffer->setPrefix(b.value("prefix").toString()); - buffer->setSticky(b.value("sticky").toBool()); - buffer->setPersistent(b.value("persistent").toBool()); - buffer->setUserData(b.value("userData").toMap()); - add(buffer); - } - IrcChannel* channel = buffer->toChannel(); - if (channel && !channel->isActive()) { - IrcChannelPrivate* p = IrcChannelPrivate::get(channel); - const QStringList modes = b.value("modes").toStringList(); - const QStringList args = b.value("args").toStringList(); - for (int i = 0; i < modes.count(); ++i) - p->modes.insert(modes.at(i), args.value(i)); - channel->join(); - } - } - return true; -} - -#include "moc_ircbuffermodel.cpp" -#include "moc_ircbuffermodel_p.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/model/ircchannel.cpp b/libcommuni/src/model/ircchannel.cpp deleted file mode 100644 index 15b4bc2..0000000 --- a/libcommuni/src/model/ircchannel.cpp +++ /dev/null @@ -1,623 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircchannel.h" -#include "ircchannel_p.h" -#include "ircusermodel.h" -#include "ircusermodel_p.h" -#include "ircbuffermodel.h" -#include "ircbuffermodel_p.h" -#include "ircconnection.h" -#include "ircnetwork.h" -#include "irccommand.h" -#include "ircuser_p.h" -#include "irc.h" - -IRC_BEGIN_NAMESPACE - -/*! - \file ircchannel.h - \brief \#include <IrcChannel> - */ - -/*! - \class IrcChannel ircchannel.h - \ingroup models - \brief Keeps track of channel status. - - \sa IrcBufferModel -*/ - -#ifndef IRC_DOXYGEN -static QString getPrefix(const QString& name, const QStringList& prefixes) -{ - int i = 0; - while (i < name.length() && prefixes.contains(name.at(i))) - ++i; - return name.left(i); -} - -static QString channelName(const QString& title, const QStringList& prefixes) -{ - int i = 0; - while (i < title.length() && prefixes.contains(title.at(i))) - ++i; - return title.mid(i); -} - -static QString userName(const QString& name, const QStringList& prefixes) -{ - QString copy = name; - while (!copy.isEmpty() && prefixes.contains(copy.at(0))) - copy.remove(0, 1); - return Irc::nickFromPrefix(copy); -} - -IrcChannelPrivate::IrcChannelPrivate() : active(false) -{ - qRegisterMetaType(); - qRegisterMetaType >(); -} - -IrcChannelPrivate::~IrcChannelPrivate() -{ -} - -void IrcChannelPrivate::init(const QString& title, IrcBufferModel* m) -{ - IrcBufferPrivate::init(title, m); - - const QStringList chanTypes = m->network()->channelTypes(); - prefix = getPrefix(title, chanTypes); - name = channelName(title, chanTypes); -} - -void IrcChannelPrivate::connected() -{ - // not active until joined - setActive(false); -} - -void IrcChannelPrivate::disconnected() -{ - setActive(false); -} - -void IrcChannelPrivate::setActive(bool value) -{ - Q_Q(IrcChannel); - if (active != value) { - active = value; - emit q->activeChanged(active); - } -} - -void IrcChannelPrivate::changeModes(const QString& value, const QStringList& arguments) -{ - Q_Q(IrcChannel); - const IrcNetwork* network = q->network(); - - QMap ms = modes; - QStringList args = arguments; - - bool add = true; - for (int i = 0; i < value.size(); ++i) { - const QString m = value.at(i); - if (m == QLatin1String("+")) { - add = true; - } else if (m == QLatin1String("-")) { - add = false; - } else { - if (add) { - QString a; - if (!args.isEmpty() && network && network->channelModes(IrcNetwork::TypeB | IrcNetwork::TypeC).contains(m)) - a = args.takeFirst(); - ms.insert(m, a); - } else { - ms.remove(m); - } - } - } - - if (modes != ms) { - setKey(ms.value(QLatin1String("k"))); - modes = ms; - emit q->modeChanged(q->mode()); - } -} - -void IrcChannelPrivate::setModes(const QString& value, const QStringList& arguments) -{ - Q_Q(IrcChannel); - const IrcNetwork* network = q->network(); - - QMap ms; - QStringList args = arguments; - - for (int i = 0; i < value.size(); ++i) { - const QString m = value.at(i); - if (m != QLatin1String("+") && m != QLatin1String("-")) { - QString a; - if (!args.isEmpty() && network && network->channelModes(IrcNetwork::TypeB | IrcNetwork::TypeC).contains(m)) - a = args.takeFirst(); - ms.insert(m, a); - } - } - - if (modes != ms) { - setKey(ms.value(QLatin1String("k"))); - modes = ms; - emit q->modeChanged(q->mode()); - } -} - -void IrcChannelPrivate::setTopic(const QString& value) -{ - Q_Q(IrcChannel); - if (topic != value) { - topic = value; - emit q->topicChanged(topic); - } -} - -void IrcChannelPrivate::setKey(const QString& value) -{ - Q_Q(IrcChannel); - if (modes.value(QLatin1String("k")) != value) { - modes.insert(QLatin1String("k"), value); - emit q->keyChanged(value); - } -} - -void IrcChannelPrivate::addUser(const QString& name) -{ - Q_Q(IrcChannel); - const QStringList prefixes = q->network()->prefixes(); - - IrcUser* user = new IrcUser(q); - IrcUserPrivate* priv = IrcUserPrivate::get(user); - priv->channel = q; - priv->setName(userName(name, prefixes)); - priv->setPrefix(getPrefix(name, prefixes)); - priv->setMode(q->network()->prefixToMode(user->prefix())); - activeUsers.prepend(user); - userList.append(user); - userMap.insert(user->name(), user); - names = userMap.keys(); - - foreach (IrcUserModel* model, userModels) - IrcUserModelPrivate::get(model)->addUser(user); -} - -bool IrcChannelPrivate::removeUser(const QString& name) -{ - if (IrcUser* user = userMap.value(name)) { - userMap.remove(name); - names = userMap.keys(); - userList.removeOne(user); - activeUsers.removeOne(user); - foreach (IrcUserModel* model, userModels) - IrcUserModelPrivate::get(model)->removeUser(user); - user->deleteLater(); - return true; - } - return false; -} - -void IrcChannelPrivate::setUsers(const QStringList& users) -{ - Q_Q(IrcChannel); - const QStringList prefixes = q->network()->prefixes(); - - qDeleteAll(userList); - userMap.clear(); - userList.clear(); - activeUsers.clear(); - - foreach (const QString& name, users) { - IrcUser* user = new IrcUser(q); - IrcUserPrivate* priv = IrcUserPrivate::get(user); - priv->channel = q; - priv->setName(userName(name, prefixes)); - priv->setPrefix(getPrefix(name, prefixes)); - priv->setMode(q->network()->prefixToMode(user->prefix())); - activeUsers.append(user); - userList.append(user); - userMap.insert(user->name(), user); - } - names = userMap.keys(); - - foreach (IrcUserModel* model, userModels) - IrcUserModelPrivate::get(model)->setUsers(userList); -} - -bool IrcChannelPrivate::renameUser(const QString& from, const QString& to) -{ - if (IrcUser* user = userMap.take(from)) { - IrcUserPrivate::get(user)->setName(to); - userMap.insert(to, user); - names = userMap.keys(); - - foreach (IrcUserModel* model, userModels) { - IrcUserModelPrivate::get(model)->renameUser(user); - emit model->namesChanged(names); - } - return true; - } - return false; -} - -void IrcChannelPrivate::setUserMode(const QString& name, const QString& command) -{ - if (IrcUser* user = userMap.value(name)) { - bool add = true; - QString mode = user->mode(); - QString prefix = user->prefix(); - const IrcNetwork* network = model->network(); - for (int i = 0; i < command.size(); ++i) { - QChar c = command.at(i); - if (c == QLatin1Char('+')) { - add = true; - } else if (c == QLatin1Char('-')) { - add = false; - } else { - QString p = network->modeToPrefix(c); - if (add) { - if (!mode.contains(c)) - mode += c; - if (!prefix.contains(p)) - prefix += p; - } else { - mode.remove(c); - prefix.remove(p); - } - } - } - - QString sortedMode; - foreach (const QString& m, network->modes()) - if (mode.contains(m)) - sortedMode += m; - - QString sortedPrefix; - foreach (const QString& p, network->prefixes()) - if (prefix.contains(p)) - sortedPrefix += p; - - IrcUserPrivate* priv = IrcUserPrivate::get(user); - priv->setPrefix(sortedPrefix); - priv->setMode(sortedMode); - - foreach (IrcUserModel* model, userModels) - IrcUserModelPrivate::get(model)->setUserMode(user); - } -} - -void IrcChannelPrivate::promoteUser(const QString& name) -{ - if (IrcUser* user = userMap.value(name)) { - const int idx = activeUsers.indexOf(user); - Q_ASSERT(idx != -1); - activeUsers.move(idx, 0); - foreach (IrcUserModel* model, userModels) - IrcUserModelPrivate::get(model)->promoteUser(user); - } -} - -void IrcChannelPrivate::setUserAway(const QString& name, const bool &away) -{ - if (IrcUser* user = userMap.value(name)) { - IrcUserPrivate* priv = IrcUserPrivate::get(user); - - priv->setAway(away); - } -} - -void IrcChannelPrivate::setUserServOp(const QString& name, const bool &servOp) -{ - if (IrcUser* user = userMap.value(name)) { - IrcUserPrivate* priv = IrcUserPrivate::get(user); - - priv->setServOp(servOp); - } -} - -bool IrcChannelPrivate::processJoinMessage(IrcJoinMessage* message) -{ - if (!(message->flags() & IrcMessage::Playback)) { - if (message->flags() & IrcMessage::Own) - setActive(true); - else - addUser(message->nick()); - } - return true; -} - -bool IrcChannelPrivate::processKickMessage(IrcKickMessage* message) -{ - if (!(message->flags() & IrcMessage::Playback)) { - if (!message->user().compare(message->connection()->nickName(), Qt::CaseInsensitive)) { - setActive(false); - return true; - } - return removeUser(message->user()); - } - return userMap.contains(message->user()); -} - -bool IrcChannelPrivate::processModeMessage(IrcModeMessage* message) -{ - if (!(message->flags() & IrcMessage::Playback)) { - if (message->kind() == IrcModeMessage::Channel) { - if (message->isReply()) - setModes(message->mode(), message->arguments()); - else - changeModes(message->mode(), message->arguments()); - return true; - } else if (!message->argument().isEmpty()) { - setUserMode(message->argument(), message->mode()); - } - } - return true; -} - -bool IrcChannelPrivate::processNamesMessage(IrcNamesMessage* message) -{ - if (!(message->flags() & IrcMessage::Playback)) - setUsers(message->names()); - return true; -} - -bool IrcChannelPrivate::processNickMessage(IrcNickMessage* message) -{ - const bool renamed = renameUser(message->oldNick(), message->newNick()); - if (renamed) - promoteUser(message->newNick()); - return renamed; -} - -bool IrcChannelPrivate::processNoticeMessage(IrcNoticeMessage* message) -{ - promoteUser(message->nick()); - return true; -} - -bool IrcChannelPrivate::processNumericMessage(IrcNumericMessage* message) -{ - promoteUser(message->nick()); - return true; -} - -bool IrcChannelPrivate::processPartMessage(IrcPartMessage* message) -{ - if (!(message->flags() & IrcMessage::Playback)) { - if (message->flags() & IrcMessage::Own) { - setActive(false); - return true; - } - return removeUser(message->nick()); - } - return true; -} - -bool IrcChannelPrivate::processPrivateMessage(IrcPrivateMessage* message) -{ - const QString content = message->content(); - const bool prefixed = !content.isEmpty() && message->network()->prefixes().contains(content.at(0)); - foreach (IrcUser* user, activeUsers) { - const QString str = prefixed ? user->title() : user->name(); - if (content.startsWith(str)) { - promoteUser(user->name()); - break; - } - } - promoteUser(message->nick()); - return true; -} - -bool IrcChannelPrivate::processQuitMessage(IrcQuitMessage* message) -{ - if (!(message->flags() & IrcMessage::Playback)) { - if (message->flags() & IrcMessage::Own) { - setActive(false); - return true; - } - return removeUser(message->nick()) || IrcBufferPrivate::processQuitMessage(message); - } - return userMap.contains(message->nick()) || IrcBufferPrivate::processQuitMessage(message); -} - -bool IrcChannelPrivate::processTopicMessage(IrcTopicMessage* message) -{ - if (!(message->flags() & IrcMessage::Playback)) - setTopic(message->topic()); - return true; -} - -bool IrcChannelPrivate::processWhoReplyMessage(IrcWhoReplyMessage *message) -{ - if(message->isValid()) { - setUserAway(message->nick(), message->isAway()); - setUserServOp(message->nick(), message->isServOp()); - return true; - } - return false; -} -#endif // IRC_DOXYGEN - -/*! - Constructs a new channel object with \a parent. - */ -IrcChannel::IrcChannel(QObject* parent) - : IrcBuffer(*new IrcChannelPrivate, parent) -{ -} - -/*! - Destructs the channel object. - */ -IrcChannel::~IrcChannel() -{ - Q_D(IrcChannel); - qDeleteAll(d->userList); - d->userList.clear(); - d->userMap.clear(); - d->names.clear(); - d->userModels.clear(); - emit destroyed(this); -} - -/*! - \since 3.1 - - This property holds the channel key. - - \par Access function: - \li QString key() const - - \par Notifier signal: - \li void keyChanged(const QString& key) - */ -QString IrcChannel::key() const -{ - Q_D(const IrcChannel); - return d->modes.value(QLatin1String("k")); -} - -/*! - This property holds the complete channel mode including possible arguments. - - \par Access function: - \li QString mode() const - - \par Notifier signal: - \li void modeChanged(const QString& mode) - */ -QString IrcChannel::mode() const -{ - Q_D(const IrcChannel); - QString m = QStringList(d->modes.keys()).join(QString()); - QStringList a = d->modes.values(); - a.removeAll(QString()); - if (!a.isEmpty()) - m += QLatin1String(" ") + a.join(QLatin1String(" ")); - if (!m.isEmpty()) - m.prepend(QLatin1String("+")); - return m; -} - -/*! - This property holds the channel topic. - - \par Access function: - \li QString topic() const - - \par Notifier signal: - \li void topicChanged(const QString& topic) - */ -QString IrcChannel::topic() const -{ - Q_D(const IrcChannel); - return d->topic; -} - -bool IrcChannel::isActive() const -{ - Q_D(const IrcChannel); - return IrcBuffer::isActive() && d->active; -} - -/*! - \since 3.1 - - Joins the channel with an optional \a key. - - This method is provided for convenience. It is equal to: - \code - IrcCommand* command = IrcCommand::createJoin(channel->title(), key); - channel->sendCommand(command); - \endcode - - \sa IrcBuffer::sendCommand(), IrcCommand::createJoin() - */ -void IrcChannel::join(const QString& key) -{ - Q_D(IrcChannel); - if (!key.isEmpty()) - d->setKey(key); - sendCommand(IrcCommand::createJoin(title(), IrcChannel::key())); -} - -/*! - Parts the channel with an optional \a reason. - - This method is provided for convenience. It is equal to: - \code - IrcCommand* command = IrcCommand::createPart(channel->title(), reason); - channel->sendCommand(command); - \endcode - - \sa IrcBuffer::sendCommand(), IrcCommand::createPart() - */ -void IrcChannel::part(const QString& reason) -{ - sendCommand(IrcCommand::createPart(title(), reason)); -} - -/*! - \since 3.1 - - Closes the channel with an optional \a reason. - - \sa IrcBuffer::close(), IrcChannel::part() - */ -void IrcChannel::close(const QString& reason) -{ - if (isActive()) - part(reason); - IrcBuffer::close(reason); -} - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug debug, const IrcChannel* channel) -{ - if (!channel) - return debug << "IrcChannel(0x0) "; - debug.nospace() << channel->metaObject()->className() << '(' << (void*) channel; - if (!channel->objectName().isEmpty()) - debug.nospace() << ", name=" << qPrintable(channel->objectName()); - if (!channel->title().isEmpty()) - debug.nospace() << ", title=" << qPrintable(channel->title()); - debug.nospace() << ')'; - return debug.space(); -} -#endif // QT_NO_DEBUG_STREAM - -#include "moc_ircchannel.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/model/ircmodel.cpp b/libcommuni/src/model/ircmodel.cpp deleted file mode 100644 index 7032db5..0000000 --- a/libcommuni/src/model/ircmodel.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircmodel.h" - -IRC_BEGIN_NAMESPACE - -/*! - \file ircmodel.h - \brief \#include <IrcModel> - */ - -/*! - \namespace IrcModel - \ingroup models - \brief Module meta-type registration. - */ - -namespace IrcModel { - - /*! - Registers IrcModel types to the %Qt meta-system. - - \sa IrcCore::registerMetaTypes(), IrcUtil::registerMetaTypes(), qRegisterMetaType() - */ - void registerMetaTypes() - { - qRegisterMetaType("IrcBuffer*"); - qRegisterMetaType("IrcBufferModel*"); - qRegisterMetaType("IrcChannel*"); - qRegisterMetaType("IrcUser*"); - qRegisterMetaType("IrcUserModel*"); - } -} - -IRC_END_NAMESPACE diff --git a/libcommuni/src/model/ircuser.cpp b/libcommuni/src/model/ircuser.cpp deleted file mode 100644 index d46e7a3..0000000 --- a/libcommuni/src/model/ircuser.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircuser.h" -#include "ircuser_p.h" -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file ircuser.h - \brief \#include <IrcUser> - */ - -/*! - \class IrcUser ircuser.h - \ingroup models - \brief Keeps track of user status on a channel. - - \sa IrcUserModel -*/ - -#ifndef IRC_DOXYGEN -void IrcUserPrivate::setName(const QString& n) -{ - Q_Q(IrcUser); - if (name != n) { - name = n; - emit q->nameChanged(name); - emit q->titleChanged(q->title()); - } -} - -void IrcUserPrivate::setPrefix(const QString& p) -{ - Q_Q(IrcUser); - if (prefix != p) { - prefix = p; - emit q->prefixChanged(prefix); - emit q->titleChanged(q->title()); - } -} - -void IrcUserPrivate::setMode(const QString& m) -{ - Q_Q(IrcUser); - if (mode != m) { - mode = m; - emit q->modeChanged(mode); - } -} - -void IrcUserPrivate::setServOp(const bool& o) -{ - Q_Q(IrcUser); - if (servOp != o) { - servOp = o; - emit q->servOpChanged(servOp); - } -} - -void IrcUserPrivate::setAway(const bool& a) -{ - Q_Q(IrcUser); - if (away != a) { - away = a; - emit q->awayChanged(away); - } -} -#endif // IRC_DOXYGEN - -/*! - Constructs a new user with \a parent. - */ -IrcUser::IrcUser(QObject* parent) - : QObject(parent), d_ptr(new IrcUserPrivate) -{ - Q_D(IrcUser); - d->q_ptr = this; - d->channel = 0; - d->away = false; - d->servOp = false; -} - -/*! - Destructs the user object. - */ -IrcUser::~IrcUser() -{ -} - -/*! - This property holds the title. - - The title consists of \ref prefix and \ref name. - - \par Access function: - \li QString title() const - - \par Notifier signal: - \li void titleChanged(const QString& title) - */ -QString IrcUser::title() const -{ - Q_D(const IrcUser); - return d->prefix.left(1) + d->name; -} - -/*! - This property holds the name. - - \par Access function: - \li QString name() const - - \par Notifier signal: - \li void nameChanged(const QString& name) - */ -QString IrcUser::name() const -{ - Q_D(const IrcUser); - return d->name; -} - -/*! - This property holds the prefix character. - - Typical prefix characters are \c @ (op) and \c + (voice). - - \par Access function: - \li QString prefix() const - - \par Notifier signal: - \li void prefixChanged(const QString& prefix) - */ -QString IrcUser::prefix() const -{ - Q_D(const IrcUser); - return d->prefix; -} - -/*! - This property holds the mode letter. - - Typical mode letters are \c o (op) and \c v (voice). - - \par Access function: - \li QString mode() const - - \par Notifier signal: - \li void modeChanged(const QString& mode) - */ -QString IrcUser::mode() const -{ - Q_D(const IrcUser); - return d->mode; -} - -/*! - \since 3.1 - - \property bool IrcUser::servOp - This property holds whether the user is a server operator. - - \note IRC servers do not send this information by default. - In order to fetch the information for all users on a channel, - issue a WHO command on the channel: - \code - IrcChannel* channel = user->channel(); - IrcCommand* command = IrcCommand::createWho(channel->title()); - channel->sendCommand(command); - \endcode - - \par Access function: - \li bool isServOp() const - - \par Notifier signal: - \li void servOpChanged(bool servOp) - */ -bool IrcUser::isServOp() const -{ - Q_D(const IrcUser); - return d->servOp; -} - -/*! - \since 3.1 - - \property bool IrcUser::away - This property holds whether the user is marked as being away. - - \note IRC servers do not send this information by default. - In order to fetch the information for all users on a channel, - issue a WHO command on the channel: - \code - IrcChannel* channel = user->channel(); - IrcCommand* command = IrcCommand::createWho(channel->title()); - channel->sendCommand(command); - \endcode - - \par Access function: - \li bool isAway() const - - \par Notifier signal: - \li void awayChanged(bool away) - */ -bool IrcUser::isAway() const -{ - Q_D(const IrcUser); - return d->away; -} - -/*! - This property holds the channel of the user. - - \par Access function: - \li \ref IrcChannel* channel() const - */ -IrcChannel* IrcUser::channel() const -{ - Q_D(const IrcUser); - return d->channel; -} - -#ifndef QT_NO_DEBUG_STREAM -QDebug operator<<(QDebug debug, const IrcUser* user) -{ - if (!user) - return debug << "IrcUser(0x0) "; - debug.nospace() << user->metaObject()->className() << '(' << (void*) user; - if (!user->objectName().isEmpty()) - debug.nospace() << ", name=" << qPrintable(user->objectName()); - if (!user->name().isEmpty()) - debug.nospace() << ", user=" << qPrintable(user->name()); - debug.nospace() << ')'; - return debug.space(); -} -#endif // QT_NO_DEBUG_STREAM - -#include "moc_ircuser.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/model/ircusermodel.cpp b/libcommuni/src/model/ircusermodel.cpp deleted file mode 100644 index 23f13fb..0000000 --- a/libcommuni/src/model/ircusermodel.cpp +++ /dev/null @@ -1,709 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircusermodel.h" -#include "ircusermodel_p.h" -#include "ircbuffermodel.h" -#include "ircconnection.h" -#include "ircchannel_p.h" -#include "ircuser.h" -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file ircusermodel.h - \brief \#include <IrcUserModel> - */ - -/*! - \class IrcUserModel ircusermodel.h - \ingroup models - \brief Keeps track of channel users. - - In order to keep track of channel users, create an instance of IrcUserModel. - It will notify via signals when users are added and/or removed. IrcUserModel - can be used directly as a data model for Qt's item views - both in C++ and QML. - - \code - void ChatView::setChannel(IrcChannel* channel) - { - IrcUserModel* model = new IrcUserModel(channel); - connect(model, SIGNAL(added(IrcUser*)), this, SLOT(onUserAdded(IrcUser*))); - connect(model, SIGNAL(removed(IrcUser*)), this, SLOT(onUserRemoved(IrcUser*))); - nickCompleter->setModel(model); - userListView->setModel(model); - } - \endcode -*/ - -/*! - \fn void IrcUserModel::added(IrcUser* user) - - This signal is emitted when a \a user is added to the list of users. - */ - -/*! - \fn void IrcUserModel::removed(IrcUser* user) - - This signal is emitted when a \a user is removed from the list of users. - */ - -/*! - \fn void IrcUserModel::aboutToBeAdded(IrcUser* user) - - This signal is emitted just before a \a user is added to the list of users. - */ - -/*! - \fn void IrcUserModel::aboutToBeRemoved(IrcUser* user) - - This signal is emitted just before a \a user is removed from the list of users. - */ - -#ifndef IRC_DOXYGEN -class IrcUserLessThan -{ -public: - IrcUserLessThan(IrcUserModel* model, Irc::SortMethod method) : model(model), method(method) { } - bool operator()(IrcUser* u1, IrcUser* u2) const { return model->lessThan(u1, u2, method); } -private: - IrcUserModel* model; - Irc::SortMethod method; -}; - -class IrcUserGreaterThan -{ -public: - IrcUserGreaterThan(IrcUserModel* model, Irc::SortMethod method) : model(model), method(method) { } - bool operator()(IrcUser* u1, IrcUser* u2) const { return model->lessThan(u2, u1, method); } -private: - IrcUserModel* model; - Irc::SortMethod method; -}; - -IrcUserModelPrivate::IrcUserModelPrivate() : q_ptr(0), role(Irc::TitleRole), - sortMethod(Irc::SortByHand), sortOrder(Qt::AscendingOrder) -{ -} - -void IrcUserModelPrivate::addUser(IrcUser* user, bool notify) -{ - insertUser(-1, user, notify); -} - -void IrcUserModelPrivate::insertUser(int index, IrcUser* user, bool notify) -{ - Q_Q(IrcUserModel); - if (index == -1) - index = userList.count(); - if (sortMethod != Irc::SortByHand) { - QList::iterator it; - if (sortOrder == Qt::AscendingOrder) - it = qUpperBound(userList.begin(), userList.end(), user, IrcUserLessThan(q, sortMethod)); - else - it = qUpperBound(userList.begin(), userList.end(), user, IrcUserGreaterThan(q, sortMethod)); - index = it - userList.begin(); - } - if (notify) - emit q->aboutToBeAdded(user); - q->beginInsertRows(QModelIndex(), index, index); - userList.insert(index, user); - q->endInsertRows(); - if (notify) { - emit q->added(user); - emit q->namesChanged(IrcChannelPrivate::get(channel)->names); - emit q->usersChanged(userList); - emit q->countChanged(userList.count()); - if (userList.count() == 1) - emit q->emptyChanged(false); - } -} - -void IrcUserModelPrivate::removeUser(IrcUser* user, bool notify) -{ - Q_Q(IrcUserModel); - int idx = userList.indexOf(user); - if (idx != -1) { - if (notify) - emit q->aboutToBeRemoved(user); - q->beginRemoveRows(QModelIndex(), idx, idx); - userList.removeAt(idx); - q->endRemoveRows(); - if (notify) { - emit q->removed(user); - emit q->namesChanged(IrcChannelPrivate::get(channel)->names); - emit q->usersChanged(userList); - emit q->countChanged(userList.count()); - if (userList.isEmpty()) - emit q->emptyChanged(true); - } - } -} - -void IrcUserModelPrivate::setUsers(const QList& users, bool reset) -{ - Q_Q(IrcUserModel); - bool wasEmpty = userList.isEmpty(); - if (reset) - q->beginResetModel(); - userList = users; - if (sortMethod != Irc::SortByHand) { - if (sortOrder == Qt::AscendingOrder) - qSort(userList.begin(), userList.end(), IrcUserLessThan(q, sortMethod)); - else - qSort(userList.begin(), userList.end(), IrcUserGreaterThan(q, sortMethod)); - } - if (reset) - q->endResetModel(); - QStringList names; - if (channel) - names = IrcChannelPrivate::get(channel)->names; - emit q->namesChanged(names); - emit q->usersChanged(userList); - emit q->countChanged(userList.count()); - if (wasEmpty != userList.isEmpty()) - emit q->emptyChanged(userList.isEmpty()); -} - -void IrcUserModelPrivate::renameUser(IrcUser* user) -{ - Q_Q(IrcUserModel); - const int idx = userList.indexOf(user); - if (idx != -1) { - QModelIndex index = q->index(idx, 0); - emit q->dataChanged(index, index); - - if (sortMethod != Irc::SortByHand) { - QList users = userList; - const bool notify = false; - removeUser(user, notify); - insertUser(-1, user, notify); - if (users != userList) - emit q->usersChanged(userList); - } - } -} - -void IrcUserModelPrivate::setUserMode(IrcUser* user) -{ - Q_Q(IrcUserModel); - const int idx = userList.indexOf(user); - if (idx != -1) { - QModelIndex index = q->index(idx, 0); - emit q->dataChanged(index, index); - - if (sortMethod == Irc::SortByTitle) { - const bool notify = false; - removeUser(user, notify); - insertUser(0, user, notify); - emit q->usersChanged(userList); - } - } -} - -void IrcUserModelPrivate::promoteUser(IrcUser* user) -{ - Q_Q(IrcUserModel); - if (sortMethod == Irc::SortByActivity) { - const bool notify = false; - removeUser(user, notify); - insertUser(0, user, notify); - emit q->usersChanged(userList); - } -} -#endif // IRC_DOXYGEN - -/*! - Constructs a new model with \a parent. - - \note If \a parent is an instance of IrcChannel, it will be - automatically assigned to \ref IrcUserModel::channel "channel". - */ -IrcUserModel::IrcUserModel(QObject* parent) : QAbstractListModel(parent), d_ptr(new IrcUserModelPrivate) -{ - Q_D(IrcUserModel); - d->q_ptr = this; - setChannel(qobject_cast(parent)); - - qRegisterMetaType(); - qRegisterMetaType >(); -} - -/*! - Destructs the model. - */ -IrcUserModel::~IrcUserModel() -{ - Q_D(IrcUserModel); - if (d->channel) - IrcChannelPrivate::get(d->channel)->userModels.removeOne(this); -} - -/*! - This property holds the channel. - - \par Access functions: - \li \ref IrcChannel* channel() const - \li void setChannel(\ref IrcChannel* channel) - - \par Notifier signal: - \li void channelChanged(\ref IrcChannel* channel) - */ -IrcChannel* IrcUserModel::channel() const -{ - Q_D(const IrcUserModel); - return d->channel; -} - -void IrcUserModel::setChannel(IrcChannel* channel) -{ - Q_D(IrcUserModel); - if (d->channel != channel) { - beginResetModel(); - if (d->channel) - IrcChannelPrivate::get(d->channel)->userModels.removeOne(this); - - d->channel = channel; - - QList users; - if (d->channel) { - IrcChannelPrivate::get(d->channel)->userModels.append(this); - if (d->sortMethod == Irc::SortByActivity) - users = IrcChannelPrivate::get(d->channel)->activeUsers; - else - users = IrcChannelPrivate::get(d->channel)->userList; - } - const bool reset = false; - d->setUsers(users, reset); - endResetModel(); - - emit channelChanged(channel); - } -} - -/*! - This property holds the number of users on the channel. - - \par Access function: - \li int count() const - - \par Notifier signal: - \li void countChanged(int count) - */ -int IrcUserModel::count() const -{ - return rowCount(); -} - -/*! - \since 3.1 - \property bool IrcUserModel::empty - - This property holds the whether the model is empty. - - \par Access function: - \li bool isEmpty() const - - \par Notifier signal: - \li void emptyChanged(bool empty) - */ -bool IrcUserModel::isEmpty() const -{ - Q_D(const IrcUserModel); - return d->userList.isEmpty(); -} - -/*! - This property holds the list of names in alphabetical order. - - \par Access function: - \li QStringList names() const - - \par Notifier signal: - \li void namesChanged(const QStringList& names) - */ -QStringList IrcUserModel::names() const -{ - Q_D(const IrcUserModel); - if (d->channel && !d->userList.isEmpty()) - return IrcChannelPrivate::get(d->channel)->names; - return QStringList(); -} - -/*! - This property holds the list of users. - - The order of users is kept as sent from the server. - - \par Access function: - \li QList<\ref IrcUser*> users() const - - \par Notifier signal: - \li void usersChanged(const QList<\ref IrcUser*>& users) - */ -QList IrcUserModel::users() const -{ - Q_D(const IrcUserModel); - return d->userList; -} - -/*! - Returns the user object at \a index. - */ -IrcUser* IrcUserModel::get(int index) const -{ - Q_D(const IrcUserModel); - return d->userList.value(index); -} - -/*! - Returns the user object for \a name or \c 0 if not found. - */ -IrcUser* IrcUserModel::find(const QString& name) const -{ - Q_D(const IrcUserModel); - if (d->channel && !d->userList.isEmpty()) - return IrcChannelPrivate::get(d->channel)->userMap.value(name); - return 0; -} - -/*! - Returns \c true if the model contains \a name. - */ -bool IrcUserModel::contains(const QString& name) const -{ - Q_D(const IrcUserModel); - if (d->channel && !d->userList.isEmpty()) - return IrcChannelPrivate::get(d->channel)->userMap.contains(name); - return false; -} - -/*! - Returns the index of the specified \a user, - or \c -1 if the model does not contain the \a user. - */ -int IrcUserModel::indexOf(IrcUser* user) const -{ - Q_D(const IrcUserModel); - return d->userList.indexOf(user); -} - -/*! - This property holds the model sort method. - - The default value is \c Irc::SortByHand. - - Method | Description | Example - --------------------|---------------------------------------------------------------------------------------------------|---------------------------------------------- - Irc::SortByHand | Users are not sorted automatically, but only by calling sort(). | - - Irc::SortByName | Users are sorted alphabetically, ignoring any mode prefix. | "bot", "@ChanServ", "jpnurmi", "+qtassistant" - Irc::SortByTitle | Users are sorted alphabetically, and special users (operators, voiced users) before normal users. | "@ChanServ", "+qtassistant", "bot", "jpnurmi" - Irc::SortByActivity | Users are sorted based on their activity, last active and mentioned (1) users first. | - - - 1) For performance reasons, IrcUserModel does \b not scan the whole channel - messages to find out if a channel user was mentioned. IrcUserModel merely - checks if channel messages \b begin with the name of a user in the model. - - \par Access functions: - \li Irc::SortMethod sortMethod() const - \li void setSortMethod(Irc::SortMethod method) - - \sa sort(), lessThan() - */ -Irc::SortMethod IrcUserModel::sortMethod() const -{ - Q_D(const IrcUserModel); - return d->sortMethod; -} - -void IrcUserModel::setSortMethod(Irc::SortMethod method) -{ - Q_D(IrcUserModel); - if (d->sortMethod != method) { - d->sortMethod = method; - if (method == Irc::SortByActivity && d->channel) - d->userList = IrcChannelPrivate::get(d->channel)->activeUsers; - if (d->sortMethod != Irc::SortByHand && !d->userList.isEmpty()) - sort(d->sortMethod, d->sortOrder); - } -} - -/*! - This property holds the model sort order. - - The default value is \c Qt::AscendingOrder. - - \par Access functions: - \li Qt::SortOrder sortOrder() const - \li void setSortOrder(Qt::SortOrder order) - - \sa sort(), lessThan() - */ -Qt::SortOrder IrcUserModel::sortOrder() const -{ - Q_D(const IrcUserModel); - return d->sortOrder; -} - -void IrcUserModel::setSortOrder(Qt::SortOrder order) -{ - Q_D(IrcUserModel); - if (d->sortOrder != order) { - d->sortOrder = order; - if (d->sortMethod != Irc::SortByHand && !d->userList.isEmpty()) - sort(d->sortMethod, d->sortOrder); - } -} - -/*! - This property holds the display role. - - The specified data role is returned for Qt::DisplayRole. - - The default value is \ref Irc::TitleRole. - - \par Access functions: - \li \ref Irc::DataRole displayRole() const - \li void setDisplayRole(\ref Irc::DataRole role) - */ -Irc::DataRole IrcUserModel::displayRole() const -{ - Q_D(const IrcUserModel); - return d->role; -} - -void IrcUserModel::setDisplayRole(Irc::DataRole role) -{ - Q_D(IrcUserModel); - d->role = role; -} - -/*! - Returns the model index for \a user. - */ -QModelIndex IrcUserModel::index(IrcUser* user) const -{ - Q_D(const IrcUserModel); - return index(d->userList.indexOf(user)); -} - -/*! - Returns the user for model \a index. - */ -IrcUser* IrcUserModel::user(const QModelIndex& index) const -{ - if (!hasIndex(index.row(), index.column())) - return 0; - - return static_cast(index.internalPointer()); -} - -/*! - The following role names are provided by default: - - Role | Name | Type | Example - --------------- | ----------|----------|-------- - Qt::DisplayRole | "display" | 1) | - - Irc::UserRole | "user" | IrcUser* | <object> - Irc::NameRole | "name" | QString | "jpnurmi" - Irc::PrefixRole | "prefix" | QString | "@" - Irc::ModeRole | "mode" | QString | "o" - Irc::TitleRole | "title" | QString | "@jpnurmi" - - 1) The type depends on \ref displayRole. - */ -QHash IrcUserModel::roleNames() const -{ - QHash roles; - roles[Qt::DisplayRole] = "display"; - roles[Irc::UserRole] = "user"; - roles[Irc::NameRole] = "name"; - roles[Irc::PrefixRole] = "prefix"; - roles[Irc::ModeRole] = "mode"; - roles[Irc::TitleRole] = "title"; - return roles; -} - -/*! - Returns the number of users on the channel. - */ -int IrcUserModel::rowCount(const QModelIndex& parent) const -{ - Q_D(const IrcUserModel); - if (parent.isValid() || !d->channel) - return 0; - - return d->userList.count(); -} - -/*! - Returns the data for specified \a role referred to by the \a index. - - \sa Irc::DataRole, roleNames() - */ -QVariant IrcUserModel::data(const QModelIndex& index, int role) const -{ - Q_D(const IrcUserModel); - if (!d->channel || !hasIndex(index.row(), index.column(), index.parent())) - return QVariant(); - - IrcUser* user = static_cast(index.internalPointer()); - Q_ASSERT(user); - - switch (role) { - case Qt::DisplayRole: - return data(index, d->role); - case Irc::UserRole: - return QVariant::fromValue(user); - case Irc::NameRole: - return user->name(); - case Irc::PrefixRole: - return user->prefix().left(1); - case Irc::ModeRole: - return user->mode().left(1); - case Irc::TitleRole: - return user->title(); - } - - return QVariant(); -} - -/*! - Returns the index of the item in the model specified by the given \a row, \a column and \a parent index. - */ -QModelIndex IrcUserModel::index(int row, int column, const QModelIndex& parent) const -{ - Q_D(const IrcUserModel); - if (!d->channel || !hasIndex(row, column, parent)) - return QModelIndex(); - - return createIndex(row, column, d->userList.value(row)); -} - -/*! - Clears the model. - */ -void IrcUserModel::clear() -{ - Q_D(IrcUserModel); - if (!d->userList.isEmpty()) { - beginResetModel(); - d->userList.clear(); - endResetModel(); - emit namesChanged(QStringList()); - emit usersChanged(QList()); - emit countChanged(0); - emit emptyChanged(true); - } -} - -/*! - Sorts the model using the given \a order. - */ -void IrcUserModel::sort(int column, Qt::SortOrder order) -{ - Q_D(IrcUserModel); - if (column == 0) - sort(d->sortMethod, order); -} - -/*! - Sorts the model using the given \a method and \a order. - - \sa lessThan() - */ -void IrcUserModel::sort(Irc::SortMethod method, Qt::SortOrder order) -{ - Q_D(IrcUserModel); - if (method == Irc::SortByHand) - return; - - emit layoutAboutToBeChanged(); - - QList persistentUsers; - QModelIndexList oldPersistentIndexes = persistentIndexList(); - foreach (const QModelIndex& index, oldPersistentIndexes) - persistentUsers += static_cast(index.internalPointer()); - - if (order == Qt::AscendingOrder) - qSort(d->userList.begin(), d->userList.end(), IrcUserLessThan(this, method)); - else - qSort(d->userList.begin(), d->userList.end(), IrcUserGreaterThan(this, method)); - - QModelIndexList newPersistentIndexes; - foreach (IrcUser* user, persistentUsers) - newPersistentIndexes += index(d->userList.indexOf(user)); - changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - - emit layoutChanged(); -} - -/*! - Returns \c true if \a one buffer is "less than" \a another, - otherwise returns \c false. - - The default implementation sorts according to the specified sort method. - Reimplement this function in order to customize the sort order. - - \sa sort(), sortMethod - */ -bool IrcUserModel::lessThan(IrcUser* one, IrcUser* another, Irc::SortMethod method) const -{ - if (method == Irc::SortByActivity) { - QList activeUsers = IrcChannelPrivate::get(one->channel())->activeUsers; - const int i1 = activeUsers.indexOf(one); - const int i2 = activeUsers.indexOf(another); - return i1 < i2; - } else if (method == Irc::SortByTitle) { - const IrcNetwork* network = one->channel()->network(); - const QStringList prefixes = network->prefixes(); - - const QString p1 = one->prefix(); - const QString p2 = another->prefix(); - - const int i1 = !p1.isEmpty() ? prefixes.indexOf(p1.at(0)) : -1; - const int i2 = !p2.isEmpty() ? prefixes.indexOf(p2.at(0)) : -1; - - if (i1 >= 0 && i2 < 0) - return true; - if (i1 < 0 && i2 >= 0) - return false; - if (i1 >= 0 && i2 >= 0 && i1 != i2) - return i1 < i2; - } - - // Irc::SortByName - const QString n1 = one->name(); - const QString n2 = another->name(); - return n1.compare(n2, Qt::CaseInsensitive) < 0; -} - -#include "moc_ircusermodel.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/model/model.pri b/libcommuni/src/model/model.pri deleted file mode 100644 index 38212a0..0000000 --- a/libcommuni/src/model/model.pri +++ /dev/null @@ -1,40 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -DEFINES += BUILD_IRC_MODEL - -INCDIR = $$PWD/../../include/IrcModel - -DEPENDPATH += $$PWD $$INCDIR -INCLUDEPATH += $$PWD $$INCDIR - -CONV_HEADERS = $$INCDIR/IrcBuffer -CONV_HEADERS += $$INCDIR/IrcBufferModel -CONV_HEADERS += $$INCDIR/IrcChannel -CONV_HEADERS += $$INCDIR/IrcModel -CONV_HEADERS += $$INCDIR/IrcUser -CONV_HEADERS += $$INCDIR/IrcUserModel - -PUB_HEADERS = $$INCDIR/ircbuffer.h -PUB_HEADERS += $$INCDIR/ircbuffermodel.h -PUB_HEADERS += $$INCDIR/ircchannel.h -PUB_HEADERS += $$INCDIR/ircmodel.h -PUB_HEADERS += $$INCDIR/ircuser.h -PUB_HEADERS += $$INCDIR/ircusermodel.h - -PRIV_HEADERS = $$INCDIR/ircbuffer_p.h -PRIV_HEADERS += $$INCDIR/ircbuffermodel_p.h -PRIV_HEADERS += $$INCDIR/ircchannel_p.h -PRIV_HEADERS += $$INCDIR/ircuser_p.h -PRIV_HEADERS += $$INCDIR/ircusermodel_p.h - -HEADERS += $$PUB_HEADERS -HEADERS += $$PRIV_HEADERS - -SOURCES += $$PWD/ircbuffer.cpp -SOURCES += $$PWD/ircbuffermodel.cpp -SOURCES += $$PWD/ircchannel.cpp -SOURCES += $$PWD/ircmodel.cpp -SOURCES += $$PWD/ircuser.cpp -SOURCES += $$PWD/ircusermodel.cpp diff --git a/libcommuni/src/model/model.pro b/libcommuni/src/model/model.pro deleted file mode 100644 index 5a35306..0000000 --- a/libcommuni/src/model/model.pro +++ /dev/null @@ -1,11 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -IRC_MODULE = IrcModel -include(model.pri) -include(../module_build.pri) -include(../module_install.pri) - -IRC_MODULES = IrcCore -include(../module_deps.pri) diff --git a/libcommuni/src/module_build.pri b/libcommuni/src/module_build.pri deleted file mode 100644 index 75205a2..0000000 --- a/libcommuni/src/module_build.pri +++ /dev/null @@ -1,57 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -isEmpty(IRC_MODULE):error(IRC_MODULE must be set) - -TEMPLATE = lib -TARGET = $$qtLibraryTarget($$IRC_MODULE) -QT = core network -!verbose:CONFIG += silent -contains(QT_CONFIG, debug_and_release) { - win32|mac:!wince*:!win32-msvc:!macx-xcode:CONFIG += debug_and_release build_all -} - -include(../version.pri) -!win32:VERSION = $$IRC_VERSION - -isEmpty(IRC_BUILDDIR):IRC_BUILDDIR = $$OUT_PWD/../.. - -DESTDIR = $$IRC_BUILDDIR/lib -DLLDESTDIR = $$IRC_BUILDDIR/bin - -!flat { - CONFIG(debug, debug|release) { - OBJECTS_DIR = debug - MOC_DIR = debug - } else { - OBJECTS_DIR = release - MOC_DIR = release - } -} - -DISTFILES += $$CONV_HEADERS - -coverage { - QMAKE_CLEAN += $$OBJECTS_DIR/*.gcda $$OBJECTS_DIR/*.gcno - - LIBS += -lgcov - QMAKE_CXXFLAGS += -g -Wall -fprofile-arcs -ftest-coverage -O0 - QMAKE_LDFLAGS += -g -Wall -fprofile-arcs -ftest-coverage -O0 - - zerocounters.commands = @lcov --directory \$(OBJECTS_DIR) --zerocounters - QMAKE_EXTRA_TARGETS += zerocounters - - capture.file = ../../coverage/$${IRC_MODULE}.cov - capture.commands = @mkdir -p ../../coverage - capture.commands += && lcov --base-directory $$_PRO_FILE_PWD_ --directory \$(OBJECTS_DIR) --capture --output-file $$capture.file - capture.filters = \"/usr/*\" \"moc_*.cpp\" \"*3rdparty/*\" \"*QtCore/*\" \"*QtNetwork/*\" \"*corelib/*\" \"*network/*\" - !isEqual(IRC_MODULE, "IrcCore"):capture.filters += \"*/IrcCore/*\" - !isEqual(IRC_MODULE, "IrcModel"):capture.filters += \"*/IrcModel/*\" - capture.commands += && lcov --remove $$capture.file $$capture.filters --output-file $$capture.file - QMAKE_EXTRA_TARGETS += capture - - genhtml.dir = ../../coverage/$${IRC_MODULE} - genhtml.commands = @genhtml --output-directory $$genhtml.dir $$capture.file - QMAKE_EXTRA_TARGETS += genhtml -} diff --git a/libcommuni/src/module_deps.pri b/libcommuni/src/module_deps.pri deleted file mode 100644 index 055166e..0000000 --- a/libcommuni/src/module_deps.pri +++ /dev/null @@ -1,36 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -isEmpty(IRC_MODULES):error(IRC_MODULES must be set) - -isEmpty(IRC_BUILDDIR):IRC_BUILDDIR = $$OUT_PWD/../.. -IRC_LIBDIR = $$IRC_BUILDDIR/lib - -isEmpty(IRC_SOURCEDIR):IRC_SOURCEDIR = $$PWD/.. -IRC_INCDIR = $$IRC_SOURCEDIR/include - -INCLUDEPATH += $$IRC_INCDIR - -for(IRC_MODULE, IRC_MODULES) { - !contains(DEFINES, IRC_STATIC):macx:!qt_no_framework { - INCLUDEPATH += $$IRC_LIBDIR/$${IRC_MODULE}.framework/Headers - QMAKE_LFLAGS += -F$$IRC_LIBDIR # inject before system frameworks - LIBS += -framework $$IRC_MODULE - install_name { - !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK += && - QMAKE_POST_LINK += install_name_tool -change \ - "$$[QT_INSTALL_LIBS]/$${IRC_MODULE}.framework/Versions/3/$${IRC_MODULE}" \ - "$$IRC_LIBDIR/$${IRC_MODULE}.framework/Versions/3/$${IRC_MODULE}" $$TARGET - } - } else { - INCLUDEPATH += $$IRC_INCDIR/$$IRC_MODULE - DEPENDPATH += $$IRC_INCDIR/$$IRC_MODULE - QMAKE_LIBDIR += $$IRC_LIBDIR # injects before system libdirs - REAL_TEMPLATE = $$TEMPLATE - TEMPLATE = fakelib - LIBS += -l$$qtLibraryTarget($$IRC_MODULE) - TEMPLATE = $$REAL_TEMPLATE - !no_rpath:QMAKE_RPATHDIR += $$IRC_LIBDIR - } -} diff --git a/libcommuni/src/module_install.pri b/libcommuni/src/module_install.pri deleted file mode 100644 index 7685de2..0000000 --- a/libcommuni/src/module_install.pri +++ /dev/null @@ -1,38 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -isEmpty(IRC_MODULE):error(IRC_MODULE must be set) - -isEmpty(IRC_INSTALL_LIBS):IRC_INSTALL_LIBS = $$[QT_INSTALL_LIBS] -isEmpty(IRC_INSTALL_BINS):IRC_INSTALL_BINS = $$[QT_INSTALL_BINS] -isEmpty(IRC_INSTALL_HEADERS):IRC_INSTALL_HEADERS = $$[QT_INSTALL_HEADERS]/Communi - -!no_install_libs { - target.path = $$IRC_INSTALL_LIBS - INSTALLS += target -} - -!no_install_bins { - dlltarget.path = $$IRC_INSTALL_BINS - INSTALLS += dlltarget -} - -macx:CONFIG(qt_framework, qt_framework|qt_no_framework) { - CONFIG += lib_bundle debug_and_release - CONFIG(debug, debug|release) { - !build_pass:CONFIG += build_all - } else { #release - !debug_and_release|build_pass { - FRAMEWORK_HEADERS.version = Versions - FRAMEWORK_HEADERS.files = $$PUB_HEADERS $$CONV_HEADERS - FRAMEWORK_HEADERS.path = Headers - } - QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS - } - QMAKE_LFLAGS_SONAME = -Wl,-install_name,$$IRC_INSTALL_LIBS/ -} else:!no_install_headers { - headers.files = $$PUB_HEADERS $$CONV_HEADERS - headers.path = $$IRC_INSTALL_HEADERS/$$IRC_MODULE - INSTALLS += headers -} diff --git a/libcommuni/src/src.pri b/libcommuni/src/src.pri deleted file mode 100644 index 72dd368..0000000 --- a/libcommuni/src/src.pri +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -include(core/core.pri) -include(model/model.pri) -include(util/util.pri) diff --git a/libcommuni/src/src.pro b/libcommuni/src/src.pro deleted file mode 100644 index 1322cdb..0000000 --- a/libcommuni/src/src.pro +++ /dev/null @@ -1,27 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = subdirs -SUBDIRS += core model util imports - -model.depends = core -util.depends = core model -imports.depends = core model util - -coverage { - cov_zerocounters.CONFIG += recursive - cov_zerocounters.recurse = core model util - cov_zerocounters.recurse_target = zerocounters - QMAKE_EXTRA_TARGETS += cov_zerocounters - - cov_capture.CONFIG += recursive - cov_capture.recurse = core model util - cov_capture.recurse_target = capture - QMAKE_EXTRA_TARGETS += cov_capture - - cov_genhtml.CONFIG += recursive - cov_genhtml.recurse = core model util - cov_genhtml.recurse_target = genhtml - QMAKE_EXTRA_TARGETS += cov_genhtml -} diff --git a/libcommuni/src/util/irccommandparser.cpp b/libcommuni/src/util/irccommandparser.cpp deleted file mode 100644 index e686a37..0000000 --- a/libcommuni/src/util/irccommandparser.cpp +++ /dev/null @@ -1,597 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "irccommandparser.h" -#include "irccommandparser_p.h" -#include "irctoken_p.h" -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file irccommandparser.h - \brief \#include <IrcCommandParser> - */ - -/*! - \class IrcCommandParser irccommandparser.h - \ingroup util - \brief Parses commands from user input. - - \section syntax Syntax - - Since the list of supported commands and the exact syntax for each - command is application specific, IrcCommandParser does not provide - any built-in command syntaxes. It is left up to the applications - to introduce the supported commands and syntaxes. - IrcCommandParser supports the following command syntax markup: - - Syntax | Example | Description - -------------------|----------------------|------------ - <param> | <target> | A required parameter. - (<param>) | (<key>) | An optional parameter. - <param...> | <message...> | A required parameter, multiple words accepted. (1) - (<param...>) | (<message...>) | An optional parameter, multiple words accepted. (1) - (<\#param>) | (<\#channel>) | An optional channel parameter. (2) - [param] | [target] | Inject the current target. - - -# Multi-word parameters are only supported in the last parameter position. - -# An optional channel parameter is filled up with the current channel when absent. - - The following example presents introducing some typical commands. - \code - IrcCommandParser* parser = new IrcCommandParser(this); - parser->addCommand(IrcCommand::Join, "JOIN <#channel> ()"); - parser->addCommand(IrcCommand::Part, "PART (<#channel>) ()"); - parser->addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); - parser->addCommand(IrcCommand::CtcpAction, "ME [target] "); - parser->addCommand(IrcCommand::CtcpAction, "ACTION "); - \endcode - - \note The parameter names are insignificant, but descriptive - parameter names are recommended for the sake of readability. - - \section context Context - - Notice that commands are often context sensitive. While some command - may accept an optional parameter that is filled up with the current - target (channel/query) name when absent, another command may always - inject the current target name as a certain parameter. Therefore - IrcCommandParser must be kept up-to-date with the \ref target - "current target" and the \ref channels "list of channels". - - \code - // currently in a query, and also present on some channels - parser->setTarget("jpnurmi"); - parser->setChannels(QStringList() << "#communi" << "#freenode"); - \endcode - - \section command-triggers Command triggers - - IrcCommandParser serves as a generic parser for typical IRC commands. - It can be utilized for parsing commands from user input in GUI clients, - and from messages from other clients when implementing IRC bots. - - The command parsing behavior is controlled by setting up command - \ref triggers. Whilst a typical GUI client might use \c "/" as a command - trigger, an IRC bot might use \c "!" and the nick name of the bot. The - following snippet illustrates a typical GUI client usage. - - \code - parser->setTarget("#communi"); - parser->setTriggers(QStringList() << "/"); - parser->parse(input); - \endcode - - \p - Input | Result | Description - ------------------|---------------------|------------ - "hello" | IrcCommand::Message | No matching command trigger => a message "hello" to \#communi - "/join #channel" | IrcCommand::Join | Matching command trigger => a command to join "#channel" - - See the \ref bot "bot example" to see how the parser can be effectively utilized for IRC bots. - - \section parse-custom-commands Custom commands - - The parser also supports such custom client specific commands that - are not sent to the server. Since IrcCommand does not know how to - handle custom commands, the parser treats them as a special case - injecting the command as a first parameter. - - \code - IrcParser parser; - parser.addCommand(IrcCommand::Custom, "QUERY "); - IrcCommand* command = parser.parse("/query jpnurmi"); - Q_ASSERT(command->type() == IrcCommand::Custom); - qDebug() << command->parameters(); // ("QUERY", "jpnurmi") - \endcode - */ - -/*! - \enum IrcCommandParser::Detail - This enum describes the available syntax details. - */ - -/*! - \var IrcCommandParser::Full - \brief The syntax in full details - */ - -/*! - \var IrcCommandParser::NoTarget - \brief The syntax has injected [target] removed - */ - -/*! - \var IrcCommandParser::NoPrefix - \brief The syntax has \#channel prefixes removed - */ - -/*! - \var IrcCommandParser::NoEllipsis - \brief The syntax has ellipsis... removed - */ - -/*! - \var IrcCommandParser::NoParentheses - \brief The syntax has parentheses () removed - */ - -/*! - \var IrcCommandParser::NoBrackets - \brief The syntax has brackets [] removed - */ - -/*! - \var IrcCommandParser::NoAngles - \brief The syntax has angle brackets <> removed - */ - -/*! - \var IrcCommandParser::Visual - \brief The syntax suitable for visual representation - */ - -#ifndef IRC_DOXYGEN -IrcCommandParserPrivate::IrcCommandParserPrivate() : tolerant(false) -{ -} - -QList IrcCommandParserPrivate::find(const QString& command) const -{ - QList result; - foreach (const IrcCommandInfo& cmd, commands) { - if (cmd.command == command) - result += cmd; - } - return result; -} - -static inline bool isOptional(const QString& token) -{ - return token.startsWith(QLatin1Char('(')) && token.endsWith(QLatin1Char(')')); -} - -static inline bool isMultiWord(const QString& token) -{ - return token.contains(QLatin1String("...")); -} - -static inline bool isChannel(const QString& token) -{ - return token.contains(QLatin1Char('#')); -} - -static inline bool isCurrent(const QString& token) -{ - return token.startsWith(QLatin1Char('[')) && token.endsWith(QLatin1Char(']')); -} - -IrcCommandInfo IrcCommandParserPrivate::parseSyntax(IrcCommand::Type type, const QString& syntax) -{ - IrcCommandInfo cmd; - QStringList tokens = syntax.split(QLatin1Char(' '), QString::SkipEmptyParts); - if (!tokens.isEmpty()) { - cmd.type = type; - cmd.command = tokens.takeFirst().toUpper(); - cmd.syntax = tokens.join(QLatin1String(" ")); - cmd.max = tokens.count(); - - IrcParameterInfo param; - for (int i = 0; i < tokens.count(); ++i) { - const QString& token = tokens.at(i); - param.optional = isOptional(token); - param.channel = isChannel(token); - param.current = isCurrent(token); - param.multi = isMultiWord(token); - if (!param.optional) - ++cmd.min; - if (param.optional && param.channel) - ++cmd.min; - const bool last = (i == tokens.count() - 1); - if (last && param.multi) - cmd.max = INT_MAX; - cmd.params += param; - } - } - return cmd; -} - -IrcCommand* IrcCommandParserPrivate::parseCommand(const IrcCommandInfo& command, const QString& input) const -{ - IrcCommand* cmd = 0; - QStringList params; - if (processParameters(command, input, ¶ms)) { - const int count = params.count(); - if (count >= command.min && count <= command.max) { - cmd = new IrcCommand; - cmd->setType(command.type); - if (command.type == IrcCommand::Custom) - params.prepend(command.command); - cmd->setParameters(params); - } - } - return cmd; -} - -bool IrcCommandParserPrivate::processParameters(const IrcCommandInfo& command, const QString& input, QStringList* params) const -{ - IrcTokenizer tokenizer(input); - for (int i = 0; i < command.params.count(); ++i) { - const IrcParameterInfo& info = command.params.at(i); - const IrcToken token = tokenizer.at(0); - if (info.optional && info.channel) { - if (onChannel()) { - if (!token.isValid() || !channels.contains(token.text(), Qt::CaseInsensitive)) { - params->append(target); - } else if (token.isValid()) { - tokenizer = tokenizer.mid(1); - params->append(token.text()); - } - } else if (!channels.contains(token.text())) { - return false; - } - } else if (info.current) { - params->append(target); - } else if (info.multi) { - const QString multi = tokenizer.toString(); - if (!multi.isEmpty()) { - params->append(multi); - tokenizer.clear(); - } - } else { - tokenizer = tokenizer.mid(1); - if (token.isValid()) - params->append(token.text()); - } - } - return tokenizer.isEmpty(); -} - -bool IrcCommandParserPrivate::processCommand(QString* input, int* removed) const -{ - foreach (const QString& trigger, triggers) { - if (tolerant && trigger.length() == 1 && (input->startsWith(trigger.repeated(2)) || input->startsWith(trigger + QLatin1Char(' ')))) { - // treat "//cmd" and "/ /cmd" as message (-> "/cmd") - input->remove(0, 1); - if (removed) - *removed = 1; - return false; - } else if (input->startsWith(trigger)) { - input->remove(0, trigger.length()); - if (removed) - *removed = trigger.length(); - return true; - } - } - return false; -} - -bool IrcCommandParserPrivate::processMessage(QString* input, int* removed) const -{ - if (input->isEmpty()) - return false; - if (triggers.isEmpty()) - return tolerant; - if (processCommand(input, removed)) - return false; - return tolerant; -} - -bool IrcCommandParserPrivate::onChannel() const -{ - return channels.contains(target, Qt::CaseInsensitive); -} -#endif // IRC_DOXYGEN - -/*! - Constructs a command parser with \a parent. - */ -IrcCommandParser::IrcCommandParser(QObject* parent) : QObject(parent), d_ptr(new IrcCommandParserPrivate) -{ -} - -/*! - Destructs the command parser. - */ -IrcCommandParser::~IrcCommandParser() -{ -} - -/*! - This property holds the known commands. - - The commands are uppercased and in alphabetical order. - - \par Access function: - \li QStringList commands() const - - \par Notifier signal: - \li void commandsChanged(const QStringList& commands) - - \sa addCommand(), removeCommand() - */ -QStringList IrcCommandParser::commands() const -{ - Q_D(const IrcCommandParser); - return d->commands.uniqueKeys(); -} - -/*! - Returns syntax for the given \a command in given \a details level. - */ -QString IrcCommandParser::syntax(const QString& command, Details details) const -{ - Q_D(const IrcCommandParser); - IrcCommandInfo info = d->find(command.toUpper()).value(0); - if (!info.command.isEmpty()) { - QString str = info.fullSyntax(); - if (details != Full) { - if (details & NoTarget) - str.remove(QRegExp("\\[[^\\]]+\\]")); - if (details & NoPrefix) - str.remove("#"); - if (details & NoEllipsis) - str.remove("..."); - if (details & NoParentheses) - str.remove("(").remove(")"); - if (details & NoBrackets) - str.remove("[").remove("]"); - if (details & NoAngles) - str.remove("<").remove(">"); - } - return str.simplified(); - } - return QString(); -} - -/*! - Adds a command with \a type and \a syntax. - */ -void IrcCommandParser::addCommand(IrcCommand::Type type, const QString& syntax) -{ - Q_D(IrcCommandParser); - IrcCommandInfo cmd = d->parseSyntax(type, syntax); - if (!cmd.command.isEmpty()) { - const bool contains = d->commands.contains(cmd.command); - d->commands.insert(cmd.command, cmd); - if (!contains) - emit commandsChanged(commands()); - } -} - -/*! - Removes the command with \a type and \a syntax. - */ -void IrcCommandParser::removeCommand(IrcCommand::Type type, const QString& syntax) -{ - Q_D(IrcCommandParser); - bool changed = false; - QMutableMapIterator it(d->commands); - while (it.hasNext()) { - IrcCommandInfo cmd = it.next().value(); - if (cmd.type == type && (syntax.isEmpty() || !syntax.compare(cmd.fullSyntax(), Qt::CaseInsensitive))) { - it.remove(); - if (!d->commands.contains(cmd.command)) - changed = true; - } - } - if (changed) - emit commandsChanged(commands()); -} - -/*! - This property holds the available channels. - - \par Access functions: - \li QStringList channels() const - \li void setChannels(const QStringList& channels) [slot] - - \par Notifier signal: - \li void channelsChanged(const QStringList& channels) - - \sa IrcBufferModel::channels() - */ -QStringList IrcCommandParser::channels() const -{ - Q_D(const IrcCommandParser); - return d->channels; -} - -void IrcCommandParser::setChannels(const QStringList& channels) -{ - Q_D(IrcCommandParser); - if (d->channels != channels) { - d->channels = channels; - emit channelsChanged(channels); - } -} - -/*! - This property holds the current target. - - \par Access functions: - \li QString target() const - \li void setTarget(const QString& target) [slot] - - \par Notifier signal: - \li void targetChanged(const QString& target) - */ -QString IrcCommandParser::target() const -{ - Q_D(const IrcCommandParser); - return d->target; -} - -void IrcCommandParser::setTarget(const QString& target) -{ - Q_D(IrcCommandParser); - if (d->target != target) { - d->target = target; - emit targetChanged(target); - } -} - -/*! - This property holds the command triggers. - - \par Access functions: - \li QStringList triggers() const - \li void setTriggers(const QStringList& triggers) [slot] - - \par Notifier signal: - \li void triggersChanged(const QStringList& triggers) - */ -QStringList IrcCommandParser::triggers() const -{ - Q_D(const IrcCommandParser); - return d->triggers; -} - -void IrcCommandParser::setTriggers(const QStringList& triggers) -{ - Q_D(IrcCommandParser); - if (d->triggers != triggers) { - d->triggers = triggers; - emit triggersChanged(triggers); - } -} - -/*! - \property bool IrcCommandParser::tolerant - - This property holds whether the parser is tolerant. - - A tolerant parser creates message commands out of input that does not - start with a command trigger, and raw server commands when the input - starts with a command trigger but the command is unrecognized. Known - commands with invalid arguments are still considered invalid. - - The default value is \c false. - - \par Access functions: - \li bool isTolerant() const - \li void setTolerant(bool tolerant) - - \par Notifier signal: - \li void tolerancyChanged(bool tolerant) - - \sa IrcCommand::Quote - */ -bool IrcCommandParser::isTolerant() const -{ - Q_D(const IrcCommandParser); - return d->tolerant; -} - -void IrcCommandParser::setTolerant(bool tolerant) -{ - Q_D(IrcCommandParser); - if (d->tolerant != tolerant) { - d->tolerant = tolerant; - emit tolerancyChanged(tolerant); - } -} - -/*! - Parses and returns the command for \a input, or \c 0 if the input is not valid. - */ -IrcCommand* IrcCommandParser::parse(const QString& input) const -{ - Q_D(const IrcCommandParser); - QString message = input; - if (d->processMessage(&message)) { - return IrcCommand::createMessage(d->target, message.trimmed()); - } else if (!message.isEmpty()) { - IrcTokenizer tokenizer(message); - const QString command = tokenizer.at(0).text().toUpper(); - QString params = tokenizer.mid(1).toString(); - const QList commands = d->find(command); - if (!commands.isEmpty()) { - foreach (const IrcCommandInfo& c, commands) { - IrcCommand* cmd = d->parseCommand(c, params); - if (cmd) - return cmd; - } - } else if (d->tolerant) { - IrcCommandInfo custom = d->parseSyntax(IrcCommand::Quote, QString(QLatin1String("%1 ()")).arg(command)); - params.prepend(custom.command + QLatin1Char(' ')); - return d->parseCommand(custom, params); - } - } - return 0; -} - -/*! - Clears the list of commands. - - \sa reset() - */ -void IrcCommandParser::clear() -{ - Q_D(IrcCommandParser); - if (!d->commands.isEmpty()) { - d->commands.clear(); - emit commandsChanged(QStringList()); - } -} - -/*! - Resets the channels and the current target. - - \sa clear() - */ -void IrcCommandParser::reset() -{ - setChannels(QStringList()); - setTarget(QString()); -} - -#include "moc_irccommandparser.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/util/irccompleter.cpp b/libcommuni/src/util/irccompleter.cpp deleted file mode 100644 index 430167a..0000000 --- a/libcommuni/src/util/irccompleter.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "irccompleter.h" -#include "irccommandparser.h" -#include "irccommandparser_p.h" -#include "ircbuffermodel.h" -#include "ircusermodel.h" -#include "ircnetwork.h" -#include "ircchannel.h" -#include "irctoken_p.h" -#include "ircuser.h" - -#include -#include -#include -#include - -IRC_BEGIN_NAMESPACE - -/*! - \file irccompleter.h - \brief \#include <IrcCompleter> - */ - -/*! - \since 3.1 - \class IrcCompleter irccompleter.h - \ingroup util - \brief Provides command and name completion. - - IrcCompleter provides command and name completion for a text input field. The completer - is made context aware by assigning a command \ref IrcCompleter::parser "parser" and a - \ref buffer that is currently active in the GUI. The parser is used for completing - commands, and the buffer is used for completing buffer and user names. - - In order to perform a completion, call complete() with the current text input field - content and the cursor position. If a suitable completion is found, the completed() - signal is emitted with a suggestion for a new content and cursor position for the - text input field. - - \code - TextField { - id: textField - - Keys.onTabPressed: completer.complete(text, cursorPosition) - - IrcCompleter { - id: completer - - buffer: ... - parser: ... - - onCompleted: { - textField.text = text - textField.cursorPosition = cursor - } - } - } - \endcode - - \sa IrcCommandParser, IrcBuffer - */ - -/*! - \fn void IrcCompleter::completed(const QString& text, int cursor) - - This signal is emitted when a suitable completion with \a text and \a cursor position is found. - */ - -#ifndef IRC_DOXYGEN - -static bool isPrefixed(const QString& text, int pos, const QStringList& prefixes, int* len) -{ - foreach (const QString& prefix, prefixes) { - const int ll = prefix.length(); - if (text.mid(pos, ll) == prefix) { - if (len) - *len = 0; - return true; - } else if (text.mid(pos - ll, ll) == prefix) { - if (len) - *len = ll; - return true; - } - } - return false; -} - -struct IrcCompletion -{ - IrcCompletion() : text(), cursor(-1) { } - IrcCompletion(const QString& txt, int pos) : text(txt), cursor(pos) { } - bool isValid() const { return !text.isNull() && cursor != -1; } - bool operator ==(const IrcCompletion& other) const { return text == other.text && cursor == other.cursor; } - bool operator !=(const IrcCompletion& other) const { return text != other.text || cursor != other.cursor; } - QString text; - int cursor; -}; - -class IrcCompleterPrivate -{ - Q_DECLARE_PUBLIC(IrcCompleter) - -public: - IrcCompleterPrivate(); - - void completeNext(IrcCompleter::Direction direction); - QList completeCommands(const QString& text, int pos) const; - QList completeWords(const QString& text, int pos) const; - - IrcCompleter* q_ptr; - - int index; - int cursor; - QString text; - QList completions; - - QString suffix; - QPointer buffer; - QPointer parser; -}; - -IrcCompleterPrivate::IrcCompleterPrivate() : q_ptr(0), index(-1), cursor(-1), suffix(":"), buffer(0), parser(0) -{ -} - -void IrcCompleterPrivate::completeNext(IrcCompleter::Direction direction) -{ - Q_Q(IrcCompleter); - Q_ASSERT(!completions.isEmpty()); - if (direction == IrcCompleter::Forward) { - index = (index + 1) % completions.length(); - } else { - if (--index < 0) - index = completions.length() - 1; - } - if (index >= 0 && index < completions.length()) { - const IrcCompletion completion = completions.at(index); - text = completion.text; - cursor = completion.cursor; - emit q->completed(text, cursor); - } -} - -static IrcCompletion completeCommand(const QString& text, const QString& command) -{ - IrcTokenizer tokenizer(text); - tokenizer.replace(0, command); - QString completion = tokenizer.toString(); - int next = command.length(); - if (next >= completion.length() || completion.at(next) != QLatin1Char(' ')) - completion.insert(next, QLatin1Char(' ')); - return IrcCompletion(completion, ++next); -} - -QList IrcCompleterPrivate::completeCommands(const QString& text, int pos) const -{ - if (!parser) - return QList(); - - QList completions; - - int removed = 0; - QString input = text; - IrcCommandParserPrivate* pp = IrcCommandParserPrivate::get(parser); - if (pp->processCommand(&input, &removed)) { - const QString command = input.split(QLatin1Char(' '), QString::SkipEmptyParts).value(0).toUpper(); - if (!command.isEmpty()) { - foreach (const IrcCommandInfo& cmd, pp->commands) { - if (cmd.command == command) - return QList() << completeCommand(text, text.left(removed) + cmd.command); - if (cmd.command.startsWith(command)) - completions += completeCommand(text, text.left(removed) + cmd.command); - } - } - // TODO: context sensitive command parameter completion - Q_UNUSED(pos); - } - return completions; -} - -static IrcCompletion completeWord(const QString& text, int from, int len, const QString& word) -{ - QString completion = QString(text).replace(from, len, word); - int next = from + word.length(); - if (next >= completion.length() || completion.at(next) != QLatin1Char(' ')) - completion.insert(next, QLatin1Char(' ')); - return IrcCompletion(completion, ++next); -} - -QList IrcCompleterPrivate::completeWords(const QString& text, int pos) const -{ - if (!buffer || !buffer->network()) - return QList(); - - QList completions; - - const IrcToken token = IrcTokenizer(text).find(pos); - const QPair bounds = qMakePair(token.position(), token.length()); - if (bounds.first != -1 && bounds.second != -1) { - const QString word = text.mid(bounds.first, bounds.second); - - int pfx = 0; - QString prefix; - bool isChannel = isPrefixed(text, bounds.first, buffer->network()->channelTypes(), &pfx); - if (isChannel && pfx > 0) - prefix = text.mid(bounds.first - pfx, pfx); - - if (!isChannel) { - IrcUserModel userModel; - userModel.setSortMethod(Irc::SortByActivity); - userModel.setChannel(qobject_cast(buffer)); - foreach (IrcUser* user, userModel.users()) { - if (user->name().startsWith(word, Qt::CaseInsensitive)) { - QString name = user->name(); - if (token.index() == 0) - name += suffix; - IrcCompletion completion = completeWord(text, bounds.first, bounds.second, name); - if (completion.isValid() && !completions.contains(completion)) - completions += completion; - } - } - } - - QList buffers = buffer->model()->buffers(); - buffers.move(buffers.indexOf(buffer), 0); // promote the current buffer - foreach (IrcBuffer* buffer, buffers) { - QString title = buffer->title(); - if (!isChannel && token.index() == 0) - title += suffix; - IrcCompletion completion; - if (title.startsWith(word, Qt::CaseInsensitive)) - completion = completeWord(text, bounds.first, bounds.second, title); - else if (isChannel && !prefix.isEmpty() && title.startsWith(prefix + word, Qt::CaseInsensitive)) - completion = completeWord(text, bounds.first - prefix.length(), bounds.second + prefix.length(), title); - if (completion.isValid() && !completions.contains(completion)) - completions += completion; - } - } - return completions; -} -#endif // IRC_DOXYGEN - -/*! - Constructs a completer with \a parent. - */ -IrcCompleter::IrcCompleter(QObject* parent) : QObject(parent), d_ptr(new IrcCompleterPrivate) -{ - Q_D(IrcCompleter); - d->q_ptr = this; -} - -/*! - Destructs the completer. - */ -IrcCompleter::~IrcCompleter() -{ -} - -/*! - This property holds the completion suffix. - - The suffix is appended to the end of a completed nick name, but - only when the nick name is in the beginning of completed text. - - The default value is \c ":". - - \par Access functions: - \li QString suffix() const - \li void setSuffix(const QString& suffix) [slot] - - \par Notifier signal: - \li void suffixChanged(const QString& suffix) - */ -QString IrcCompleter::suffix() const -{ - Q_D(const IrcCompleter); - return d->suffix; -} - -void IrcCompleter::setSuffix(const QString& suffix) -{ - Q_D(IrcCompleter); - if (d->suffix != suffix) { - d->suffix = suffix; - emit suffixChanged(suffix); - } -} - -/*! - This property holds the buffer used for name completion. - - \par Access functions: - \li \ref IrcBuffer* buffer() const - \li void setBuffer(\ref IrcBuffer* buffer) [slot] - - \par Notifier signal: - \li void bufferChanged(\ref IrcBuffer* buffer) - */ -IrcBuffer* IrcCompleter::buffer() const -{ - Q_D(const IrcCompleter); - return d->buffer; -} - -void IrcCompleter::setBuffer(IrcBuffer* buffer) -{ - Q_D(IrcCompleter); - if (d->buffer != buffer) { - d->buffer = buffer; - emit bufferChanged(buffer); - } -} - -/*! - This property holds the parser used for command completion. - - \par Access functions: - \li \ref IrcCommandParser* parser() const - \li void setParser(\ref IrcCommandParser* parser) [slot] - - \par Notifier signal: - \li void parserChanged(\ref IrcCommandParser* parser) - */ -IrcCommandParser* IrcCompleter::parser() const -{ - Q_D(const IrcCompleter); - return d->parser; -} - -void IrcCompleter::setParser(IrcCommandParser* parser) -{ - Q_D(IrcCompleter); - if (d->parser != parser) { - d->parser = parser; - emit parserChanged(parser); - } -} - -/*! - Completes \a text at \a cursor position, iterating multiple - matches to the specified \a direction, and emits completed() - if a suitable completion is found. - */ -void IrcCompleter::complete(const QString& text, int cursor, Direction direction) -{ - Q_D(IrcCompleter); - if (!d->completions.isEmpty() && d->cursor == cursor && d->text == text) { - d->completeNext(direction); - return; - } - - QList completions = d->completeCommands(text, cursor); - if (completions.isEmpty() || IrcTokenizer(text).find(cursor).index() > 0) - completions = d->completeWords(text, cursor); - - if (d->completions != completions) { - d->index = -1; - d->completions = completions; - } - if (!d->completions.isEmpty()) - d->completeNext(direction); -} - -/*! - Resets the completer state. - */ -void IrcCompleter::reset() -{ - Q_D(IrcCompleter); - d->index = -1; - d->cursor = -1; - d->text.clear(); - d->completions.clear(); -} - -#include "moc_irccompleter.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/util/irclagtimer.cpp b/libcommuni/src/util/irclagtimer.cpp deleted file mode 100644 index b1612f7..0000000 --- a/libcommuni/src/util/irclagtimer.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "irclagtimer.h" -#include "irclagtimer_p.h" -#include "ircconnection.h" -#include "ircmessage.h" -#include "irccommand.h" -#include - -IRC_BEGIN_NAMESPACE - -static const int DEFAULT_INTERVAL = 60; - -/*! - \file irclagtimer.h - \brief \#include <IrcLagTimer> - */ - -/*! - \class IrcLagTimer irclagtimer.h - \ingroup util - \brief Provides a timer for measuring lag. - - \note IrcLagTimer relies on functionality introduced in Qt 4.7.0, and is - therefore not functional when built against earlier versions of Qt. - */ - -/*! - \fn void IrcLagTimer::lagChanged(qint64 lag) - - This signal is emitted when the \a lag has changed. - */ - -#ifndef IRC_DOXYGEN -IrcLagTimerPrivate::IrcLagTimerPrivate() : q_ptr(0), connection(0), interval(DEFAULT_INTERVAL), lag(-1) -{ -} - -bool IrcLagTimerPrivate::messageFilter(IrcMessage* msg) -{ - if (msg->type() == IrcMessage::Pong) - return processPongReply(static_cast(msg)); - return false; -} - -bool IrcLagTimerPrivate::processPongReply(IrcPongMessage* msg) -{ -#if QT_VERSION >= 0x040700 - // TODO: configurable format? - if (msg->argument().startsWith("communi/")) { - bool ok = false; - qint64 timestamp = msg->argument().mid(8).toLongLong(&ok); - if (ok) { - updateLag(QDateTime::currentMSecsSinceEpoch() - timestamp); - return true; - } - } -#endif // QT_VERSION - return false; -} - -void IrcLagTimerPrivate::_irc_connected() -{ -#if QT_VERSION >= 0x040700 - if (interval > 0) - timer.start(); -#endif // QT_VERSION -} - -void IrcLagTimerPrivate::_irc_pingServer() -{ -#if QT_VERSION >= 0x040700 - // TODO: configurable format? - QString argument = QString("communi/%1").arg(QDateTime::currentMSecsSinceEpoch()); - IrcCommand* cmd = IrcCommand::createPing(argument); - connection->sendCommand(cmd); -#endif // QT_VERSION -} - -void IrcLagTimerPrivate::_irc_disconnected() -{ -#if QT_VERSION >= 0x040700 - updateLag(-1); - if (timer.isActive()) - timer.stop(); -#endif // QT_VERSION -} - -void IrcLagTimerPrivate::updateTimer() -{ -#if QT_VERSION >= 0x040700 - if (connection && interval > 0) { - timer.setInterval(interval * 1000); - if (!timer.isActive() && connection->isConnected()) - timer.start(); - } else { - if (timer.isActive()) - timer.stop(); - updateLag(-1); - } -#endif // QT_VERSION -} - -void IrcLagTimerPrivate::updateLag(qint64 value) -{ - Q_Q(IrcLagTimer); - if (lag != value) { - lag = qMax(-1ll, value); - emit q->lagChanged(lag); - } -} -#endif // IRC_DOXYGEN - -/*! - Constructs a new lag timer with \a parent. - - \note If \a parent is an instance of IrcConnection, it will be - automatically assigned to \ref IrcLagTimer::connection "connection". - */ -IrcLagTimer::IrcLagTimer(QObject* parent) : QObject(parent), d_ptr(new IrcLagTimerPrivate) -{ - Q_D(IrcLagTimer); - d->q_ptr = this; - connect(&d->timer, SIGNAL(timeout()), this, SLOT(_irc_pingServer())); - setConnection(qobject_cast(parent)); -} - -/*! - Destructs the lag timer. - */ -IrcLagTimer::~IrcLagTimer() -{ -} - -/*! - This property holds the associated connection. - - \par Access functions: - \li IrcConnection* connection() const - \li void setConnection(IrcConnection* connection) - */ -IrcConnection* IrcLagTimer::connection() const -{ - Q_D(const IrcLagTimer); - return d->connection; -} - -void IrcLagTimer::setConnection(IrcConnection* connection) -{ - Q_D(IrcLagTimer); - if (d->connection != connection) { - if (d->connection) { - d->connection->removeMessageFilter(d); - disconnect(d->connection, SIGNAL(connected()), this, SLOT(_irc_connected())); - disconnect(d->connection, SIGNAL(disconnected()), this, SLOT(_irc_disconnected())); - } - d->connection = connection; - if (connection) { - connection->installMessageFilter(d); - connect(connection, SIGNAL(connected()), this, SLOT(_irc_connected())); - connect(connection, SIGNAL(disconnected()), this, SLOT(_irc_disconnected())); - } - d->updateLag(-1); - d->updateTimer(); - } -} - -/*! - This property holds the current lag in milliseconds. - - The value is \c -1 when - \li the connection is not connected, - \li the lag has not yet been measured, - \li the lag timer is disabled (interval <= 0s), or - \li the Qt version is too old (4.7.0 or later is required). - - \par Access function: - \li qint64 lag() const - - \par Notifier signal: - \li void lagChanged(qint64 lag) - */ -qint64 IrcLagTimer::lag() const -{ - Q_D(const IrcLagTimer); - return d->lag; -} - -/*! - This property holds the lag measurement interval in seconds. - - The default value is \c 60 seconds. A value equal to or - less than \c 0 seconds disables the lag measurement. - - \par Access functions: - \li int interval() const - \li void setInterval(int seconds) - */ -int IrcLagTimer::interval() const -{ - Q_D(const IrcLagTimer); - return d->interval; -} - -void IrcLagTimer::setInterval(int seconds) -{ - Q_D(IrcLagTimer); - if (d->interval != seconds) { - d->interval = seconds; - d->updateTimer(); - } -} - -#include "moc_irclagtimer.cpp" -#include "moc_irclagtimer_p.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/util/ircpalette.cpp b/libcommuni/src/util/ircpalette.cpp deleted file mode 100644 index fe31035..0000000 --- a/libcommuni/src/util/ircpalette.cpp +++ /dev/null @@ -1,527 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircpalette.h" -#include "irc.h" - -IRC_BEGIN_NAMESPACE - -/*! - \file ircpalette.h - \brief \#include <IrcPalette> - */ - -/*! - \class IrcPalette ircpalette.h - \ingroup util - \brief Specifies a palette of IRC colors. - - IrcPalette is used to specify the desired IRC color palette when - converting IRC-style formatted messages to HTML using IrcTextFormat. - - \code - IrcTextFormat format; - IrcPalette* palette = format.palette(); - palette->setColorName(Irc::Red, "#ff3333"); - palette->setColorName(Irc::Green, "#33ff33"); - palette->setColorName(Irc::Blue, "#3333ff"); - // ... - - QString html = format.toHtml(message); - \endcode - - \sa Irc::Color, mIRC colors, SVG color keyword names - */ - -class IrcPalettePrivate -{ -public: - QMap colors; -}; - -static QMap& irc_default_colors() -{ - static QMap x; - if (x.isEmpty()) { - x.insert(Irc::White, QLatin1String("white")); - x.insert(Irc::Black, QLatin1String("black")); - x.insert(Irc::Blue, QLatin1String("blue")); - x.insert(Irc::Green, QLatin1String("green")); - x.insert(Irc::Red, QLatin1String("red")); - x.insert(Irc::Brown, QLatin1String("brown")); - x.insert(Irc::Purple, QLatin1String("purple")); - x.insert(Irc::Orange, QLatin1String("orange")); - x.insert(Irc::Yellow, QLatin1String("yellow")); - x.insert(Irc::LightGreen, QLatin1String("lightgreen")); - x.insert(Irc::Cyan, QLatin1String("cyan")); - x.insert(Irc::LightCyan, QLatin1String("lightcyan")); - x.insert(Irc::LightBlue, QLatin1String("lightblue")); - x.insert(Irc::Pink, QLatin1String("pink")); - x.insert(Irc::Gray, QLatin1String("gray")); - x.insert(Irc::LightGray, QLatin1String("lightgray")); - } - return x; -} - -/*! - \internal - Constructs a new palette with \a parent. - */ -IrcPalette::IrcPalette(QObject* parent) : QObject(parent), d_ptr(new IrcPalettePrivate) -{ - Q_D(IrcPalette); - d->colors = irc_default_colors(); -} - -/*! - \internal - Destructs the palette. - */ -IrcPalette::~IrcPalette() -{ -} - -/*! - This property holds the white color name. - - The default value is \c "white". - - \par Access functions: - \li QString white() const - \li void setWhite(const QString& color) - - \sa Irc::White - */ -QString IrcPalette::white() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::White); -} - -void IrcPalette::setWhite(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::White, color); -} - -/*! - This property holds the black color name. - - The default value is \c "black". - - \par Access functions: - \li QString black() const - \li void setBlack(const QString& color) - - \sa Irc::Black - */ -QString IrcPalette::black() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Black); -} - -void IrcPalette::setBlack(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Black, color); -} - -/*! - This property holds the blue color name. - - The default value is \c "blue". - - \par Access functions: - \li QString blue() const - \li void setBlue(const QString& color) - - \sa Irc::Blue - */ -QString IrcPalette::blue() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Blue); -} - -void IrcPalette::setBlue(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Blue, color); -} - -/*! - This property holds the green color name. - - The default value is \c "green". - - \par Access functions: - \li QString green() const - \li void setGreen(const QString& color) - - \sa Irc::Green - */ -QString IrcPalette::green() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Green); -} - -void IrcPalette::setGreen(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Green, color); -} - -/*! - This property holds the red color name. - - The default value is \c "red". - - \par Access functions: - \li QString red() const - \li void setRed(const QString& color) - - \sa Irc::Red - */ -QString IrcPalette::red() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Red); -} - -void IrcPalette::setRed(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Red, color); -} - -/*! - This property holds the brown color name. - - The default value is \c "brown". - - \par Access functions: - \li QString brown() const - \li void setBrown(const QString& color) - - \sa Irc::Brown - */ -QString IrcPalette::brown() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Brown); -} - -void IrcPalette::setBrown(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Brown, color); -} - -/*! - This property holds the purple color name. - - The default value is \c "purple". - - \par Access functions: - \li QString purple() const - \li void setPurple(const QString& color) - - \sa Irc::Purple - */ -QString IrcPalette::purple() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Purple); -} - -void IrcPalette::setPurple(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Purple, color); -} - -/*! - This property holds the orange color name. - - The default value is \c "orange". - - \par Access functions: - \li QString orange() const - \li void setOrange(const QString& color) - - \sa Irc::Orange - */ -QString IrcPalette::orange() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Orange); -} - -void IrcPalette::setOrange(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Orange, color); -} - -/*! - This property holds the yellow color name. - - The default value is \c "yellow". - - \par Access functions: - \li QString yellow() const - \li void setYellow(const QString& color) - - \sa Irc::Yellow - */ -QString IrcPalette::yellow() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Yellow); -} - -void IrcPalette::setYellow(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Yellow, color); -} - -/*! - This property holds the light green color name. - - The default value is \c "lightgreen". - - \par Access functions: - \li QString lightGreen() const - \li void setLightGreen(const QString& color) - - \sa Irc::LightGreen - */ -QString IrcPalette::lightGreen() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::LightGreen); -} - -void IrcPalette::setLightGreen(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::LightGreen, color); -} - -/*! - This property holds the cyan color name. - - The default value is \c "cyan". - - \par Access functions: - \li QString cyan() const - \li void setCyan(const QString& color) - - \sa Irc::Cyan - */ -QString IrcPalette::cyan() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Cyan); -} - -void IrcPalette::setCyan(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Cyan, color); -} - -/*! - This property holds the light cyan color name. - - The default value is \c "lightcyan". - - \par Access functions: - \li QString lightCyan() const - \li void setLightCyan(const QString& color) - - \sa Irc::LightCyan - */ -QString IrcPalette::lightCyan() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::LightCyan); -} - -void IrcPalette::setLightCyan(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::LightCyan, color); -} - -/*! - This property holds the light blue color name. - - The default value is \c "lightblue". - - \par Access functions: - \li QString lightBlue() const - \li void setLightBlue(const QString& color) - - \sa Irc::LightBlue - */ -QString IrcPalette::lightBlue() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::LightBlue); -} - -void IrcPalette::setLightBlue(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::LightBlue, color); -} - -/*! - This property holds the pink color name. - - The default value is \c "pink". - - \par Access functions: - \li QString pink() const - \li void setPink(const QString& color) - - \sa Irc::Pink - */ -QString IrcPalette::pink() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Pink); -} - -void IrcPalette::setPink(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Pink, color); -} - -/*! - This property holds the gray color name. - - The default value is \c "gray". - - \par Access functions: - \li QString gray() const - \li void setGray(const QString& color) - - \sa Irc::Gray - */ -QString IrcPalette::gray() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::Gray); -} - -void IrcPalette::setGray(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::Gray, color); -} - -/*! - This property holds the light gray color name. - - The default value is \c "lightgray". - - \par Access functions: - \li QString lightGray() const - \li void setLightGray(const QString& color) - - \sa Irc::LightGray - */ -QString IrcPalette::lightGray() const -{ - Q_D(const IrcPalette); - return d->colors.value(Irc::LightGray); -} - -void IrcPalette::setLightGray(const QString& color) -{ - Q_D(IrcPalette); - d->colors.insert(Irc::LightGray, color); -} - -/*! - Returns the map of color names. - */ -QMap IrcPalette::colorNames() const -{ - Q_D(const IrcPalette); - return d->colors; -} - -/*! - Sets the map of color \a names. - */ -void IrcPalette::setColorNames(const QMap& names) -{ - Q_D(IrcPalette); - d->colors = names; -} - -/*! - Converts a \a color code to a color name. If the \a color code - is unknown, the function returns the \a fallback color name. -*/ -QString IrcPalette::colorName(int color, const QString& fallback) const -{ - Q_D(const IrcPalette); - return d->colors.value(color, fallback); -} - -/*! - Assigns a \a name for \a color code. - - The color \a name may be in one of these formats: - - \li \#RGB (each of R, G, and B is a single hex digit) - \li \#RRGGBB - \li \#RRRGGGBBB - \li \#RRRRGGGGBBBB - \li A name from the list of colors defined in the list of SVG color keyword names - provided by the World Wide Web Consortium; for example, "steelblue" or "gainsboro". These color names work on all platforms. Note that these - color names are not the same as defined by the Qt::GlobalColor enums, e.g. "green" and Qt::green does not refer to the same color. - \li transparent - representing the absence of a color. -*/ -void IrcPalette::setColorName(int color, const QString& name) -{ - Q_D(IrcPalette); - d->colors.insert(color, name); -} - -#include "moc_ircpalette.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/util/irctextformat.cpp b/libcommuni/src/util/irctextformat.cpp deleted file mode 100644 index 072de47..0000000 --- a/libcommuni/src/util/irctextformat.cpp +++ /dev/null @@ -1,550 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - Parts of this code come from Konversation and are copyrighted to: - Copyright (C) 2002 Dario Abatianni - Copyright (C) 2004 Peter Simonsson - Copyright (C) 2006-2008 Eike Hein - Copyright (C) 2004-2009 Eli Mackenzie -*/ - -#include "irctextformat.h" -#include "ircpalette.h" -#if QT_VERSION >= 0x050000 -#include -#endif -#include -#include -#include -#include "irc.h" - -IRC_BEGIN_NAMESPACE - -/*! - \file irctextformat.h - \brief \#include <IrcTextFormat> - */ - -/*! - \class IrcTextFormat irctextformat.h - \ingroup util - \brief Provides methods for text formatting. - - IrcTextFormat is used to convert IRC-style formatted messages to either - plain text or HTML. When converting to plain text, the IRC-style formatting - (colors, bold, underline etc.) are simply stripped away. When converting - to HTML, the IRC-style formatting is converted to the corresponding HTML - formatting. - - \code - IrcTextFormat format; - QString text = format.toPlainText(message); - - format.palette()->setColorName(Irc::Red, "#ff3333"); - format.palette()->setColorName(Irc::Green, "#33ff33"); - format.palette()->setColorName(Irc::Blue, "#3333ff"); - // ... - QString html = format.toHtml(message); - \endcode - - \sa IrcPalette - */ - -/*! - \enum IrcTextFormat::SpanFormat - This enum describes the supported formats for HTML span-elements. - */ - -/*! - \var IrcTextFormat::SpanStyle - \brief HTML span-elements with style-attributes. - */ - -/*! - \var IrcTextFormat::SpanClass - \brief HTML span-elements with class-attributes. - */ - -class IrcTextFormatPrivate -{ -public: - void parse(const QString& str, QString* text, QString* html, QList* urls) const; - - QString plainText; - QString html; - QList urls; - QString urlPattern; - IrcPalette* palette; - IrcTextFormat::SpanFormat spanFormat; -}; - -static bool parseColors(const QString& message, int pos, int* len, int* fg = 0, int* bg = 0) -{ - // fg(,bg) - *len = 0; - if (fg) - *fg = -1; - if (bg) - *bg = -1; - QRegExp rx(QLatin1String("(\\d{1,2})(?:,(\\d{1,2}))?")); - int idx = rx.indexIn(message, pos); - if (idx == pos) { - *len = rx.matchedLength(); - if (fg) - *fg = rx.cap(1).toInt(); - if (bg) { - bool ok = false; - int tmp = rx.cap(2).toInt(&ok); - if (ok) - *bg = tmp; - } - } - return *len > 0; -} - -static QString generateLink(const QString& protocol, const QString& href) -{ - const char* exclude = ":/?@%#=+&,"; - const QByteArray url = QUrl::toPercentEncoding(href, exclude); - return QString(QLatin1String("%3")).arg(protocol, url, href); -} - -static QString parseLinks(const QString& message, const QString& pattern, QList* urls) -{ - QString processed = message; -#if QT_VERSION >= 0x050000 - int offset = 0; - QRegularExpression rx(pattern); - QRegularExpressionMatchIterator it = rx.globalMatch(message); - while (it.hasNext()) { - QRegularExpressionMatch match = it.next(); - QString protocol; - if (match.capturedRef(2).isEmpty()) { - QStringRef link = match.capturedRef(1); - if (link.startsWith(QStringLiteral("ftp."), Qt::CaseInsensitive)) - protocol = QStringLiteral("ftp://"); - else if (link.contains(QStringLiteral("@"))) - protocol = QStringLiteral("mailto:"); - else - protocol = QStringLiteral("http://"); - } - - const int start = match.capturedStart(); - const int len = match.capturedEnd() - start; - const QString href = match.captured(); - const QString link = generateLink(protocol, href); - processed.replace(start + offset, len, link); - offset += link.length() - len; - if (urls) - urls->append(QUrl(protocol + href)); - } -#else - int pos = 0; - QRegExp rx(pattern); - while ((pos = rx.indexIn(processed, pos)) >= 0) { - int len = rx.matchedLength(); - QString href = processed.mid(pos, len); - - QString protocol; - if (rx.cap(2).isEmpty()) { - if (rx.cap(1).contains(QLatin1Char('@'))) - protocol = QLatin1String("mailto:"); - else if (rx.cap(1).startsWith(QLatin1String("ftp."), Qt::CaseInsensitive)) - protocol = QLatin1String("ftp://"); - else - protocol = QLatin1String("http://"); - } - - QString link = generateLink(protocol, href); - processed.replace(pos, len, link); - pos += link.length(); - if (urls) - urls->append(QUrl(protocol + href)); - } -#endif - return processed; -} - -void IrcTextFormatPrivate::parse(const QString& str, QString* text, QString* html, QList* urls) const -{ - QString processed = str; - - // TODO: - //processed.replace(QLatin1Char('&'), QLatin1String("&")); - processed.replace(QLatin1Char('<'), QLatin1String("<")); - //processed.replace(QLatin1Char('>'), QLatin1String(">")); - //processed.replace(QLatin1Char('"'), QLatin1String(""")); - //processed.replace(QLatin1Char('\''), QLatin1String("'")); - //processed.replace(QLatin1Char('\t'), QLatin1String(" ")); - - enum { - None = 0x0, - Bold = 0x1, - Italic = 0x4, - LineThrough = 0x8, - Underline = 0x10, - Inverse = 0x20 - }; - int state = None; - - int pos = 0; - int len = 0; - int fg = -1; - int bg = -1; - int depth = 0; - bool potentialUrl = false; - while (pos < processed.size()) { - QString replacement; - switch (processed.at(pos).unicode()) { - case '\x02': // bold - if (state & Bold) { - depth--; - replacement = QLatin1String(""); - } else { - depth++; - if (spanFormat == IrcTextFormat::SpanStyle) - replacement = QLatin1String(""); - else - replacement = QLatin1String(""); - } - state ^= Bold; - break; - - case '\x03': // color - if (parseColors(processed, pos + 1, &len, &fg, &bg)) { - depth++; - if (spanFormat == IrcTextFormat::SpanStyle) { - QStringList styles; - styles += QString(QLatin1String("color: %1")).arg(palette->colorName(fg, QLatin1String("black"))); - if (bg != -1) - styles += QString(QLatin1String("background-color: %1")).arg(palette->colorName(bg, QLatin1String("transparent"))); - replacement = QString(QLatin1String("")).arg(styles.join(QLatin1String("; "))); - } else { - QStringList classes; - classes += palette->colorName(fg, QLatin1String("black")); - if (bg != -1) - classes += palette->colorName(bg, QLatin1String("transparent")) + QLatin1String("-background"); - replacement = QString(QLatin1String("")).arg(classes.join(QLatin1String(" "))); - } - // \x03FF(,BB) - processed.replace(pos, len + 1, replacement); - pos += replacement.length(); - continue; - } else { - depth--; - replacement = QLatin1String(""); - } - break; - - //case '\x09': // italic - case '\x1d': // italic - if (state & Italic) { - depth--; - replacement = QLatin1String(""); - } else { - depth++; - if (spanFormat == IrcTextFormat::SpanStyle) - replacement = QLatin1String(""); - else - replacement = QLatin1String(""); - } - state ^= Italic; - break; - - case '\x13': // line-through - if (state & LineThrough) { - depth--; - replacement = QLatin1String(""); - } else { - depth++; - if (spanFormat == IrcTextFormat::SpanStyle) - replacement = QLatin1String(""); - else - replacement = QLatin1String(""); - } - state ^= LineThrough; - break; - - case '\x15': // underline - case '\x1f': // underline - if (state & Underline) { - depth--; - replacement = QLatin1String(""); - } else { - depth++; - if (spanFormat == IrcTextFormat::SpanStyle) - replacement = QLatin1String(""); - else - replacement = QLatin1String(""); - } - state ^= Underline; - break; - - case '\x16': // inverse - if (state & Inverse) { - depth--; - replacement = QLatin1String(""); - } else { - depth++; - if (spanFormat == IrcTextFormat::SpanStyle) - replacement = QLatin1String(""); - else - replacement = QLatin1String(""); - } - state ^= Inverse; - break; - - case '\x0f': // none - if (depth > 0) - replacement = QString(QLatin1String("")).repeated(depth); - else - processed.remove(pos--, 1); // must rewind back for ++pos below... - state = None; - depth = 0; - break; - - case '.': - case '/': - case ':': - // a dot, slash or colon NOT surrounded by a space indicates a potential URL - if (!potentialUrl && pos > 0 && !processed.at(pos - 1).isSpace() - && pos < processed.length() - 1 && !processed.at(pos + 1).isSpace()) - potentialUrl = true; - // flow through - default: - if (text) - *text += processed.at(pos); - break; - } - - if (!replacement.isEmpty()) { - processed.replace(pos, 1, replacement); - pos += replacement.length(); - } else { - ++pos; - } - } - - if ((html || urls) && potentialUrl && !urlPattern.isEmpty()) - processed = parseLinks(processed, urlPattern, urls); - if (html) - *html = processed; -} - -/*! - Constructs a new text format with \a parent. - */ -IrcTextFormat::IrcTextFormat(QObject* parent) : QObject(parent), d_ptr(new IrcTextFormatPrivate) -{ - Q_D(IrcTextFormat); - d->palette = new IrcPalette(this); - d->urlPattern = QString("\\b((?:(?:([a-z][\\w\\.-]+:/{1,3})|www|ftp\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|\\}\\]|[^\\s`!()\\[\\]{};:'\".,<>?%1%2%3%4%5%6])|[a-z0-9.\\-+_]+@[a-z0-9.\\-]+[.][a-z]{1,5}[^\\s/`!()\\[\\]{};:'\".,<>?%1%2%3%4%5%6]))").arg(QChar(0x00AB)).arg(QChar(0x00BB)).arg(QChar(0x201C)).arg(QChar(0x201D)).arg(QChar(0x2018)).arg(QChar(0x2019)); - d->spanFormat = SpanStyle; -} - -/*! - Destructs the text format. - */ -IrcTextFormat::~IrcTextFormat() -{ -} - -/*! - This property holds the palette used for color formatting. - - \par Access function: - \li \ref IrcPalette* palette() const - */ -IrcPalette* IrcTextFormat::palette() const -{ - Q_D(const IrcTextFormat); - return d->palette; -} - -/*! - This property holds the regular expression pattern used for matching URLs. - - \par Access functions: - \li QString urlPattern() const - \li void setUrlPattern(const QString& pattern) - */ -QString IrcTextFormat::urlPattern() const -{ - Q_D(const IrcTextFormat); - return d->urlPattern; -} - -void IrcTextFormat::setUrlPattern(const QString& pattern) -{ - Q_D(IrcTextFormat); - d->urlPattern = pattern; -} - -/*! - \since 3.1 - - This property holds the format used for HTML span-elements. - - IrcTextFormat uses HTML span-elements for converting the IRC-style text - formatting to the corresponding HTML formatting. The \ref SpanStyle format - generates self contained span-elements with style-attributes, resulting to - HTML that is ready to be used with Qt's rich text classes without additional - styling. For more flexible styling, the \ref SpanClass generates span-elements - with class-attributes that can be styled with additional style sheets. - - The default value is \ref SpanStyle. The following table illustrates the - difference between \ref SpanStyle and \ref SpanClass HTML formatting: - - IRC format | SpanStyle | SpanClass - --------------------------------------- | ----------------------------------------------------------------------|---------- - Bold ("\02...\0F") | <span style='font-weight: bold'>...</span> | <span class='bold'>...</span> - Color ("\03fg...\0F") | <span style='color: fg;'>...</span> | <span class='fg'>...</span> - Background ("\03fgbg...\0F") | <span style='color: fg; background-color: bg'>...</span> | <span class='fg bg-background'>...</span> - Italic ("\09...\0F") | <span style='font-style: italic'>...</span> | <span class='italic'>...</span> - Line-through ("\13...\0F") | <span style='text-decoration: line-through'>...</span> | <span class='line-through'>...</span> - Underline ("\15...\0F" or "\1F...\0F") | <span style='text-decoration: underline'>...</span> | <span class='underline'>...</span> - Inverse ("\16...\0F") | <span style='text-decoration: inverse'>...</span> | <span class='inverse'>...</span> - - \par Access functions: - \li \ref SpanFormat spanFormat() const - \li void setSpanFormat(\ref SpanFormat format) - */ -IrcTextFormat::SpanFormat IrcTextFormat::spanFormat() const -{ - Q_D(const IrcTextFormat); - return d->spanFormat; -} - -void IrcTextFormat::setSpanFormat(IrcTextFormat::SpanFormat format) -{ - Q_D(IrcTextFormat); - d->spanFormat = format; -} - - -/*! - Converts \a text to HTML. This function parses the text and replaces - IRC-style formatting (colors, bold, underline etc.) to the corresponding - HTML formatting. Furthermore, this function detects URLs and replaces - them with appropriate HTML hyperlinks. - - \note URL detection can be disabled by setting an empty - regular expression pattern used for matching URLs. - - \sa toPlainText(), parse(), palette, urlPattern, spanFormat -*/ -QString IrcTextFormat::toHtml(const QString& text) const -{ - Q_D(const IrcTextFormat); - QString html; - d->parse(text, 0, &html, 0); - return html; -} - -/*! - Converts \a text to plain text. This function parses the text and - strips away IRC-style formatting (colors, bold, underline etc.) - - \sa toHtml(), parse() -*/ -QString IrcTextFormat::toPlainText(const QString& text) const -{ - Q_D(const IrcTextFormat); - QString plain; - d->parse(text, &plain, 0, 0); - return plain; -} - -/*! - \since 3.2 - - This property holds the current plain text content. - - \par Access function: - \li QString plainText() const - - \sa parse(), html, urls - */ -QString IrcTextFormat::plainText() const -{ - Q_D(const IrcTextFormat); - return d->plainText; -} - -/*! - \since 3.2 - - This property holds the current HTML content. - - \par Access function: - \li QString html() const - - \sa parse(), plainText, urls - */ -QString IrcTextFormat::html() const -{ - Q_D(const IrcTextFormat); - return d->html; -} - -/*! - \since 3.2 - - This property holds the current list of URLs. - - \par Access function: - \li QList urls() const - - \sa parse(), plainText, html - */ -QList IrcTextFormat::urls() const -{ - Q_D(const IrcTextFormat); - return d->urls; -} - -/*! - \since 3.2 - - Parses \a text converting it to plain text and HTML and detects URLs. - - \sa plainText, html, urls - */ -void IrcTextFormat::parse(const QString& text) -{ - Q_D(IrcTextFormat); - d->plainText.clear(); - d->html.clear(); - d->urls.clear(); - d->parse(text, &d->plainText, &d->html, &d->urls); -} - -#include "moc_irctextformat.cpp" - -IRC_END_NAMESPACE diff --git a/libcommuni/src/util/irctoken.cpp b/libcommuni/src/util/irctoken.cpp deleted file mode 100644 index 97f44a4..0000000 --- a/libcommuni/src/util/irctoken.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "irctoken_p.h" -#include - -IRC_BEGIN_NAMESPACE - -#ifndef IRC_DOXYGEN -static QList tokenize(const QString& str) -{ - int idx = -1; - int pos = 0; - QList tokens; - foreach (const QString& txt, str.split(QLatin1String(" "))) { - if (!txt.isEmpty()) - tokens += IrcToken(++idx, pos, txt); - pos += txt.length() + 1; - } - return tokens; -} - -IrcTokenizer::IrcTokenizer(const QString& str) : len(str.length()), t(tokenize(str)) -{ -} - -int IrcTokenizer::count() const -{ - return t.count(); -} - -bool IrcTokenizer::isEmpty() const -{ - return t.isEmpty(); -} - -QList IrcTokenizer::tokens() const -{ - return t; -} - -IrcToken IrcTokenizer::at(int index) const -{ - return t.value(index); -} - -IrcTokenizer IrcTokenizer::mid(int index) const -{ - IrcTokenizer tt; - tt.t = t.mid(index); - if (!tt.isEmpty()) { - int d = tt.t.first().position(); - tt.len = len - d; - for (int i = 0; i < tt.t.length(); ++i) { - tt.t[i].idx = i; - tt.t[i].pos -= d; - } - } - return tt; -} - -void IrcTokenizer::clear() -{ - t.clear(); -} - -void IrcTokenizer::replace(int index, const QString& text) -{ - IrcToken token = t.value(index); - if (token.isValid()) { - int d = text.length() - token.length(); - token = IrcToken(index, token.position(), text); - t.replace(index, token); - len += d; - for (int i = index + 1; i < t.length(); ++i) - t[i].pos += d; - } -} - -IrcToken IrcTokenizer::find(int pos) const -{ - IrcToken token; - foreach (const IrcToken& tk, t) { - if (tk.position() > pos) - break; - token = tk; - } - return token; -} - -QString IrcTokenizer::toString() const -{ - QString str(len, QLatin1Char(' ')); - foreach (const IrcToken& token, t) - str.replace(token.position(), token.length(), token.text()); - return str; -} -#endif // IRC_DOXYGEN - -IRC_END_NAMESPACE diff --git a/libcommuni/src/util/ircutil.cpp b/libcommuni/src/util/ircutil.cpp deleted file mode 100644 index efcb591..0000000 --- a/libcommuni/src/util/ircutil.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - Copyright (C) 2008-2014 The Communi Project - - You may use this file under the terms of BSD license as follows: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ircutil.h" - -IRC_BEGIN_NAMESPACE - -/*! - \file ircutil.h - \brief \#include <IrcUtil> - */ - -/*! - \namespace IrcUtil - \ingroup util - \brief Module meta-type registration. - */ - -namespace IrcUtil { - - /*! - Registers IrcUtil types to the %Qt meta-system. - - \sa IrcCore::registerMetaTypes(), IrcModel::registerMetaTypes(), qRegisterMetaType() - */ - void registerMetaTypes() - { - qRegisterMetaType("IrcCommandParser*"); - qRegisterMetaType("IrcCompleter*"); - qRegisterMetaType("IrcLagTimer*"); - qRegisterMetaType("IrcPalette*"); - qRegisterMetaType("IrcTextFormat*"); - } -} - -IRC_END_NAMESPACE diff --git a/libcommuni/src/util/util.pri b/libcommuni/src/util/util.pri deleted file mode 100644 index ad4b69f..0000000 --- a/libcommuni/src/util/util.pri +++ /dev/null @@ -1,39 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -DEFINES += BUILD_IRC_UTIL - -INCDIR = $$PWD/../../include/IrcUtil - -DEPENDPATH += $$PWD $$INCDIR -INCLUDEPATH += $$PWD $$INCDIR - -CONV_HEADERS += $$INCDIR/IrcCommandParser -CONV_HEADERS += $$INCDIR/IrcCompleter -CONV_HEADERS += $$INCDIR/IrcLagTimer -CONV_HEADERS += $$INCDIR/IrcPalette -CONV_HEADERS += $$INCDIR/IrcTextFormat -CONV_HEADERS += $$INCDIR/IrcUtil - -PUB_HEADERS += $$INCDIR/irccommandparser.h -PUB_HEADERS += $$INCDIR/irccompleter.h -PUB_HEADERS += $$INCDIR/irclagtimer.h -PUB_HEADERS += $$INCDIR/ircpalette.h -PUB_HEADERS += $$INCDIR/irctextformat.h -PUB_HEADERS += $$INCDIR/ircutil.h - -PRIV_HEADERS = $$INCDIR/irccommandparser_p.h -PRIV_HEADERS += $$INCDIR/irclagtimer_p.h -PRIV_HEADERS += $$INCDIR/irctoken_p.h - -HEADERS += $$PUB_HEADERS -HEADERS += $$PRIV_HEADERS - -SOURCES += $$PWD/irccommandparser.cpp -SOURCES += $$PWD/irccompleter.cpp -SOURCES += $$PWD/irclagtimer.cpp -SOURCES += $$PWD/ircpalette.cpp -SOURCES += $$PWD/irctextformat.cpp -SOURCES += $$PWD/irctoken.cpp -SOURCES += $$PWD/ircutil.cpp diff --git a/libcommuni/src/util/util.pro b/libcommuni/src/util/util.pro deleted file mode 100644 index bc55556..0000000 --- a/libcommuni/src/util/util.pro +++ /dev/null @@ -1,11 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -IRC_MODULE = IrcUtil -include(util.pri) -include(../module_build.pri) -include(../module_install.pri) - -IRC_MODULES = IrcCore IrcModel -include(../module_deps.pri) diff --git a/libcommuni/tests/auto/auto.pri b/libcommuni/tests/auto/auto.pri deleted file mode 100644 index 537efa0..0000000 --- a/libcommuni/tests/auto/auto.pri +++ /dev/null @@ -1,9 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -QT = core network testlib -CONFIG += testcase -CONFIG -= app_bundle - -include(../tests.pri) diff --git a/libcommuni/tests/auto/auto.pro b/libcommuni/tests/auto/auto.pro deleted file mode 100644 index e06d77c..0000000 --- a/libcommuni/tests/auto/auto.pro +++ /dev/null @@ -1,26 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = subdirs - -# IrcCore -SUBDIRS += irc -SUBDIRS += ircconnection -SUBDIRS += irccommand -SUBDIRS += ircmessage -SUBDIRS += ircnetwork - -# IrcModel -SUBDIRS += ircbuffer -SUBDIRS += ircbuffermodel -SUBDIRS += ircchannel -SUBDIRS += ircuser -SUBDIRS += ircusermodel - -# IrcUtil -SUBDIRS += irccommandparser -SUBDIRS += irccompleter -SUBDIRS += irclagtimer -SUBDIRS += ircpalette -SUBDIRS += irctextformat diff --git a/libcommuni/tests/auto/irc/irc.pro b/libcommuni/tests/auto/irc/irc.pro deleted file mode 100644 index 8270c47..0000000 --- a/libcommuni/tests/auto/irc/irc.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_irc.cpp - -include(../auto.pri) diff --git a/libcommuni/tests/auto/irc/tst_irc.cpp b/libcommuni/tests/auto/irc/tst_irc.cpp deleted file mode 100644 index 2a39f0b..0000000 --- a/libcommuni/tests/auto/irc/tst_irc.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "irc.h" -#include -#include - -class tst_Irc : public QObject -{ - Q_OBJECT - -private slots: - void testCreation(); - void testVersion(); - - void testCodeToString_data(); - void testCodeToString(); - - void testMetaObject(); - - void testPrefix_data(); - void testPrefix(); - - void testDebug(); -}; - -void tst_Irc::testCreation() -{ - Irc ircStatic; - Q_UNUSED(ircStatic); - - QScopedPointer ircDynamic(new Irc); - Q_UNUSED(ircDynamic); -} - -void tst_Irc::testVersion() -{ - QVERIFY(!Irc::version().isEmpty()); -} - -void tst_Irc::testCodeToString_data() -{ - QTest::addColumn("code"); - QTest::addColumn("str"); - - QTest::newRow("RPL_WELCOME") << 1 << QString("RPL_WELCOME"); - QTest::newRow("RPL_ISUPPORT") << 5 << QString("RPL_ISUPPORT"); - QTest::newRow("RPL_TOPIC") << 332 << QString("RPL_TOPIC"); - QTest::newRow("RPL_NAMREPLY") << 353 << QString("RPL_NAMREPLY"); - QTest::newRow("RPL_ENDOFNAMES") << 366 << QString("RPL_ENDOFNAMES"); - - QTest::newRow("ERR_NOSUCHNICK") << 401 << QString("ERR_NOSUCHNICK"); - QTest::newRow("ERR_NOSUCHCHANNEL") << 403 << QString("ERR_NOSUCHCHANNEL"); - QTest::newRow("ERR_NICKNAMEINUSE") << 433 << QString("ERR_NICKNAMEINUSE"); - QTest::newRow("ERR_OPERONLY") << 520 << QString("ERR_OPERONLY"); -} - -void tst_Irc::testCodeToString() -{ - QFETCH(int, code); - QFETCH(QString, str); - - QCOMPARE(Irc::codeToString(code), str); -} - -void tst_Irc::testMetaObject() -{ - Irc irc; - - QVERIFY(Irc::staticMetaObject.indexOfEnumerator("Code") != -1); - QVERIFY(Irc::staticMetaObject.indexOfEnumerator("Color") != -1); - QVERIFY(Irc::staticMetaObject.indexOfEnumerator("DataRole") != -1); - - QString ver; - QVERIFY(QMetaObject::invokeMethod(&irc, "version", Q_RETURN_ARG(QString, ver))); - QCOMPARE(ver, Irc::version()); - - QString str; - QVERIFY(QMetaObject::invokeMethod(&irc, "codeToString", Q_RETURN_ARG(QString, str), Q_ARG(int, Irc::RPL_ISUPPORT))); - QCOMPARE(str, Irc::codeToString(Irc::RPL_ISUPPORT)); -} - -void tst_Irc::testPrefix_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("prefix"); - QTest::addColumn("expectedNick"); - QTest::addColumn("expectedIdent"); - QTest::addColumn("expectedHost"); - - QTest::newRow("null") << false << QString() << QString() << QString() << QString(); - QTest::newRow("empty") << false << QString("") << QString("") << QString("") << QString(""); - QTest::newRow("trimmed") << true << QString(" n!u@h ") << QString("n") << QString("u") << QString("h"); - QTest::newRow("n!u@h") << true << QString("n!u@h") << QString("n") << QString("u") << QString("h"); - - QTest::newRow("n@h") << true << QString("n@h") << QString("n") << QString() << QString("h"); - QTest::newRow("n!u") << true << QString("n!u") << QString("n") << QString("u") << QString(); - QTest::newRow("!u@h") << false << QString("!u@h") << QString() << QString() << QString(); - QTest::newRow("n!@h") << false << QString("n!@h") << QString() << QString() << QString(); - QTest::newRow("n!u@") << false << QString("n!u@") << QString() << QString() << QString(); - - QTest::newRow("n !u@h") << false << QString("n !u@h") << QString() << QString() << QString(); - QTest::newRow("n! u@h") << false << QString("n! u@h") << QString() << QString() << QString(); - QTest::newRow("n!u @h") << false << QString("n!u @h") << QString() << QString() << QString(); - QTest::newRow("n!u@ h") << false << QString("n!u@ h") << QString() << QString() << QString(); - QTest::newRow("n ! u @ h") << false << QString("n ! u @ h") << QString() << QString() << QString(); -} - -void tst_Irc::testPrefix() -{ - QFETCH(bool, valid); - QFETCH(QString, prefix); - QFETCH(QString, expectedNick); - QFETCH(QString, expectedIdent); - QFETCH(QString, expectedHost); - - QString actualNick = Irc::nickFromPrefix(prefix); - QString actualIdent = Irc::identFromPrefix(prefix); - QString actualHost = Irc::hostFromPrefix(prefix); - - Q_UNUSED(valid); - QCOMPARE(expectedNick, actualNick); - QCOMPARE(expectedIdent, actualIdent); - QCOMPARE(expectedHost, actualHost); -} - -void tst_Irc::testDebug() -{ - QString str; - QDebug dbg(&str); - - dbg << Irc::RPL_AWAY; - QCOMPARE(str.trimmed(), QString::fromLatin1("RPL_AWAY")); - str.clear(); - - dbg << Irc::NameRole; - QCOMPARE(str.trimmed(), QString::fromLatin1("NameRole")); - str.clear(); - - dbg << Irc::Brown; - QCOMPARE(str.trimmed(), QString::fromLatin1("Brown")); - str.clear(); - - dbg << Irc::SortByActivity; - QCOMPARE(str.trimmed(), QString::fromLatin1("SortByActivity")); - str.clear(); -} - -QTEST_MAIN(tst_Irc) - -#include "tst_irc.moc" diff --git a/libcommuni/tests/auto/ircbuffer/ircbuffer.pro b/libcommuni/tests/auto/ircbuffer/ircbuffer.pro deleted file mode 100644 index 1c0080c..0000000 --- a/libcommuni/tests/auto/ircbuffer/ircbuffer.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircbuffer.cpp - -include(../auto.pri) diff --git a/libcommuni/tests/auto/ircbuffer/tst_ircbuffer.cpp b/libcommuni/tests/auto/ircbuffer/tst_ircbuffer.cpp deleted file mode 100644 index 1d124fb..0000000 --- a/libcommuni/tests/auto/ircbuffer/tst_ircbuffer.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircbuffer.h" -#include "ircmessage.h" -#include -#include - -class tst_IrcBuffer : public QObject -{ - Q_OBJECT - -private slots: - void testDefaults(); - void testTitleNamePrefix(); - void testSticky(); - void testPersistent(); - void testReceive(); - void testDebug(); -}; - -void tst_IrcBuffer::testDefaults() -{ - IrcBuffer buffer; - QVERIFY(buffer.title().isEmpty()); - QVERIFY(buffer.name().isEmpty()); - QVERIFY(buffer.prefix().isEmpty()); - QVERIFY(!buffer.isChannel()); - QVERIFY(!buffer.toChannel()); - QVERIFY(!buffer.connection()); - QVERIFY(!buffer.network()); - QVERIFY(!buffer.model()); - QVERIFY(!buffer.isActive()); - QVERIFY(!buffer.isSticky()); - QVERIFY(!buffer.isPersistent()); -} - -void tst_IrcBuffer::testTitleNamePrefix() -{ - IrcBuffer buffer; - - QSignalSpy titleSpy(&buffer, SIGNAL(titleChanged(QString))); - QSignalSpy nameSpy(&buffer, SIGNAL(nameChanged(QString))); - QSignalSpy prefixSpy(&buffer, SIGNAL(prefixChanged(QString))); - QVERIFY(titleSpy.isValid()); - QVERIFY(nameSpy.isValid()); - QVERIFY(prefixSpy.isValid()); - - buffer.setName("name"); - QCOMPARE(buffer.title(), QString("name")); - QCOMPARE(buffer.name(), QString("name")); - QCOMPARE(buffer.prefix(), QString()); - QCOMPARE(titleSpy.count(), 1); - QCOMPARE(titleSpy.last().first().toString(), QString("name")); - QCOMPARE(nameSpy.count(), 1); - QCOMPARE(nameSpy.last().first().toString(), QString("name")); - QCOMPARE(prefixSpy.count(), 0); - - buffer.setPrefix("prefix"); - QCOMPARE(buffer.title(), QString("prefixname")); - QCOMPARE(buffer.name(), QString("name")); - QCOMPARE(buffer.prefix(), QString("prefix")); - QCOMPARE(titleSpy.count(), 2); - QCOMPARE(titleSpy.last().first().toString(), QString("prefixname")); - QCOMPARE(nameSpy.count(), 1); - QCOMPARE(prefixSpy.count(), 1); - QCOMPARE(prefixSpy.last().first().toString(), QString("prefix")); -} - -void tst_IrcBuffer::testSticky() -{ - IrcBuffer buffer; - QVERIFY(!buffer.isSticky()); - - QSignalSpy spy(&buffer, SIGNAL(stickyChanged(bool))); - QVERIFY(spy.isValid()); - - buffer.setSticky(true); - QVERIFY(buffer.isSticky()); - QCOMPARE(spy.count(), 1); - QVERIFY(spy.last().last().toBool()); - - buffer.setSticky(false); - QVERIFY(!buffer.isSticky()); - QCOMPARE(spy.count(), 2); - QVERIFY(!spy.last().last().toBool()); -} - -void tst_IrcBuffer::testPersistent() -{ - IrcBuffer buffer; - QVERIFY(!buffer.isPersistent()); - - QSignalSpy spy(&buffer, SIGNAL(persistentChanged(bool))); - QVERIFY(spy.isValid()); - - buffer.setPersistent(true); - QVERIFY(buffer.isPersistent()); - QCOMPARE(spy.count(), 1); - QVERIFY(spy.last().last().toBool()); - - buffer.setPersistent(false); - QVERIFY(!buffer.isPersistent()); - QCOMPARE(spy.count(), 2); - QVERIFY(!spy.last().last().toBool()); -} - -void tst_IrcBuffer::testReceive() -{ - Irc::registerMetaTypes(); - - IrcBuffer buffer; - - QSignalSpy spy(&buffer, SIGNAL(messageReceived(IrcMessage*))); - QVERIFY(spy.isValid()); - - buffer.receiveMessage(0); - QCOMPARE(spy.count(), 0); - - IrcMessage msg(0); - buffer.receiveMessage(&msg); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.last().at(0).value(), &msg); -} - -void tst_IrcBuffer::testDebug() -{ - QString str; - QDebug dbg(&str); - - dbg << static_cast(0); - QCOMPARE(str.trimmed(), QString::fromLatin1("IrcBuffer(0x0)")); - str.clear(); - - IrcBuffer buffer; - dbg << &buffer; - QVERIFY(QRegExp("IrcBuffer\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); - str.clear(); - - buffer.setObjectName("obj"); - dbg << &buffer; - QVERIFY(QRegExp("IrcBuffer\\(0x[0-9A-Fa-f]+, name=obj\\) ").exactMatch(str)); - str.clear(); - - buffer.setName("buf"); - dbg << &buffer; - QVERIFY(QRegExp("IrcBuffer\\(0x[0-9A-Fa-f]+, name=obj, title=buf\\) ").exactMatch(str)); - str.clear(); -} - -QTEST_MAIN(tst_IrcBuffer) - -#include "tst_ircbuffer.moc" diff --git a/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro b/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro deleted file mode 100644 index 16cf4c9..0000000 --- a/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro +++ /dev/null @@ -1,11 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircbuffermodel.cpp - -# FakeQmlBufferModel::createXxx() -*g++*|*clang*:QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual - -include(../shared/shared.pri) -include(../auto.pri) diff --git a/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp b/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp deleted file mode 100644 index 60ec958..0000000 --- a/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp +++ /dev/null @@ -1,1461 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircbuffermodel.h" -#include "ircconnection.h" -#include "ircchannel.h" -#include "ircbuffer.h" -#include -#include "tst_ircclientserver.h" -#include "tst_ircdata.h" - -class tst_IrcBufferModel : public tst_IrcClientServer -{ - Q_OBJECT - -public: - tst_IrcBufferModel(); - -private slots: - void testDefaults(); - void testBufferInit(); - void testAddRemove(); - void testSorting(); - void testClear(); - void testPersistent(); - void testPrototypes(); - void testChanges(); - void testActive(); - void testRoles(); - void testAIM(); - void testQML(); - void testWarnings(); -}; - -Q_DECLARE_METATYPE(QModelIndex) -tst_IrcBufferModel::tst_IrcBufferModel() -{ - Irc::registerMetaTypes(); - qRegisterMetaType(); - qRegisterMetaType("IrcBuffer*"); - qRegisterMetaType("IrcChannel*"); - qRegisterMetaType("IrcConnection*"); - qRegisterMetaType >("QList"); - qRegisterMetaType >("QList"); -} - -void tst_IrcBufferModel::testDefaults() -{ - IrcBufferModel model; - QCOMPARE(model.count(), 0); - QVERIFY(model.isEmpty()); - QCOMPARE(model.sortOrder(), Qt::AscendingOrder); - QCOMPARE(model.sortMethod(), Irc::SortByHand); - QVERIFY(model.channels().isEmpty()); - QCOMPARE(model.displayRole(), Irc::TitleRole); - QVERIFY(!model.isPersistent()); - QVERIFY(model.buffers().isEmpty()); - QVERIFY(!model.connection()); - QVERIFY(!model.network()); - QVERIFY(model.bufferPrototype()); - QVERIFY(model.channelPrototype()); -} - -void tst_IrcBufferModel::testBufferInit() -{ - IrcBufferModel model(connection); - model.setSortMethod(Irc::SortByTitle); - IrcBuffer* buffer1 = new IrcBuffer(&model); - buffer1->setName("1"); - model.add(buffer1); - IrcBuffer* buffer2 = new IrcBuffer(&model); - buffer2->setName("2"); - model.add(buffer2); -} - -void tst_IrcBufferModel::testAddRemove() -{ - IrcBufferModel model; - - QSignalSpy countSpy(&model, SIGNAL(countChanged(int))); - QSignalSpy emptySpy(&model, SIGNAL(emptyChanged(bool))); - QSignalSpy addedSpy(&model, SIGNAL(added(IrcBuffer*))); - QSignalSpy removedSpy(&model, SIGNAL(removed(IrcBuffer*))); - QSignalSpy aboutToBeAddedSpy(&model, SIGNAL(aboutToBeAdded(IrcBuffer*))); - QSignalSpy aboutToBeRemovedSpy(&model, SIGNAL(aboutToBeRemoved(IrcBuffer*))); - QSignalSpy buffersSpy(&model, SIGNAL(buffersChanged(QList))); - QSignalSpy channelsSpy(&model, SIGNAL(channelsChanged(QStringList))); - QVERIFY(countSpy.isValid()); - QVERIFY(emptySpy.isValid()); - QVERIFY(addedSpy.isValid()); - QVERIFY(removedSpy.isValid()); - QVERIFY(aboutToBeAddedSpy.isValid()); - QVERIFY(aboutToBeRemovedSpy.isValid()); - QVERIFY(buffersSpy.isValid()); - QVERIFY(channelsSpy.isValid()); - - // IrcBuffer* IrcBufferModel::add(const QString& title) - IrcBuffer* first = model.add("first"); - QCOMPARE(model.count(), 1); - QVERIFY(!model.isEmpty()); - QCOMPARE(model.get(0), first); - QCOMPARE(model.find("first"), first); - QCOMPARE(model.buffers(), QList() << first); - QVERIFY(model.contains("first")); - QCOMPARE(model.indexOf(first), 0); - QVERIFY(model.channels().isEmpty()); - - QCOMPARE(countSpy.count(), 1); - QCOMPARE(countSpy.last().last().toInt(), 1); - QCOMPARE(emptySpy.count(), 1); - QCOMPARE(emptySpy.last().last().toBool(), false); - QCOMPARE(aboutToBeAddedSpy.count(), 1); - QCOMPARE(aboutToBeAddedSpy.last().last().value(), first); - QCOMPARE(addedSpy.count(), 1); - QCOMPARE(addedSpy.last().last().value(), first); - QCOMPARE(buffersSpy.count(), 1); - QCOMPARE(buffersSpy.last().last().value >(), QList() << first); - QCOMPARE(channelsSpy.count(), 0); - - QModelIndex firstIdx = model.index(first); - QVERIFY(firstIdx.isValid()); - QCOMPARE(firstIdx.data(Irc::NameRole).toString(), QString("first")); - QCOMPARE(firstIdx.data(Irc::TitleRole).toString(), QString("first")); - QCOMPARE(firstIdx.data(Irc::PrefixRole).toString(), QString()); - QCOMPARE(firstIdx.data(Irc::BufferRole).value(), first); - QVERIFY(!firstIdx.data(Irc::ChannelRole).value()); - - // void IrcBufferModel::add(IrcBuffer* buffer) - IrcBuffer* second = new IrcBuffer(&model); - second->setName("second"); - model.add(second); - QCOMPARE(model.count(), 2); - QVERIFY(!model.isEmpty()); - QCOMPARE(model.get(1), second); - QCOMPARE(model.find("second"), second); - QCOMPARE(model.buffers(), QList() << first << second); - QVERIFY(model.contains("second")); - QCOMPARE(model.indexOf(second), 1); - QVERIFY(model.channels().isEmpty()); - - QCOMPARE(countSpy.count(), 2); - QCOMPARE(countSpy.last().last().toInt(), 2); - QCOMPARE(emptySpy.count(), 1); - QCOMPARE(aboutToBeAddedSpy.count(), 2); - QCOMPARE(aboutToBeAddedSpy.last().last().value(), second); - QCOMPARE(addedSpy.count(), 2); - QCOMPARE(addedSpy.last().last().value(), second); - QCOMPARE(buffersSpy.count(), 2); - QCOMPARE(buffersSpy.last().last().value >(), QList() << first << second); - QCOMPARE(channelsSpy.count(), 0); - - QModelIndex secondIdx = model.index(second); - QVERIFY(secondIdx.isValid()); - QCOMPARE(secondIdx.data(Irc::NameRole).toString(), QString("second")); - QCOMPARE(secondIdx.data(Irc::TitleRole).toString(), QString("second")); - QCOMPARE(secondIdx.data(Irc::PrefixRole).toString(), QString()); - QCOMPARE(secondIdx.data(Irc::BufferRole).value(), second); - QVERIFY(!secondIdx.data(Irc::ChannelRole).value()); - - // void IrcBufferModel::remove(IrcBuffer* buffer) - model.remove(second); - QCOMPARE(model.count(), 1); - QVERIFY(!model.isEmpty()); - QVERIFY(!model.find("second")); - QCOMPARE(model.buffers(), QList() << first); - QVERIFY(!model.contains("second")); - QVERIFY(model.channels().isEmpty()); - - QCOMPARE(countSpy.count(), 3); - QCOMPARE(countSpy.last().last().toInt(), 1); - QCOMPARE(emptySpy.count(), 1); - QCOMPARE(aboutToBeRemovedSpy.count(), 1); - QCOMPARE(removedSpy.count(), 1); - QCOMPARE(buffersSpy.count(), 3); - QCOMPARE(buffersSpy.last().last().value >(), QList() << first); - QCOMPARE(channelsSpy.count(), 0); - - // void IrcBufferModel::remove(const QString& title) - model.remove("first"); - QCOMPARE(model.count(), 0); - QVERIFY(model.isEmpty()); - QVERIFY(!model.find("first")); - QVERIFY(model.buffers().isEmpty()); - QVERIFY(!model.contains("first")); - QVERIFY(model.channels().isEmpty()); - - QCOMPARE(countSpy.count(), 4); - QCOMPARE(countSpy.last().last().toInt(), 0); - QCOMPARE(emptySpy.count(), 2); - QCOMPARE(emptySpy.last().last().toBool(), true); - QCOMPARE(aboutToBeRemovedSpy.count(), 2); - QCOMPARE(removedSpy.count(), 2); - QCOMPARE(buffersSpy.count(), 4); - QCOMPARE(buffersSpy.last().last().value >(), QList()); - QCOMPARE(channelsSpy.count(), 0); -} - -void tst_IrcBufferModel::testSorting() -{ - IrcBufferModel staticModel(connection); - IrcBufferModel dynamicModel(connection); - - connection->open(); - waitForOpened(); - waitForWritten(tst_IrcData::welcome()); - - IrcBuffer* b = staticModel.add("b"); - IrcBuffer* c = staticModel.add("#c"); - IrcBuffer* a = staticModel.add("#a"); - - QList buffers = QList() << b << c << a; - QCOMPARE(staticModel.buffers(), buffers); - - // IGNORE INVALID COLUMNS - staticModel.sort(-1, Qt::AscendingOrder); - QCOMPARE(staticModel.buffers(), buffers); - - staticModel.sort(1, Qt::AscendingOrder); - QCOMPARE(staticModel.buffers(), buffers); - - // STATIC - BY NAME - ASCENDING - buffers = QList() << a << b << c; - staticModel.setSortMethod(Irc::SortByName); - staticModel.sort(0, Qt::AscendingOrder); - QCOMPARE(staticModel.buffers(), buffers); - - // STATIC - BY NAME - DESCENDING - buffers = QList() << c << b << a; - staticModel.setSortMethod(Irc::SortByName); - staticModel.sort(0, Qt::DescendingOrder); - QCOMPARE(staticModel.buffers(), buffers); - - // STATIC - BY TITLE - ASCENDING - buffers = QList() << a << c << b; - staticModel.setSortMethod(Irc::SortByTitle); - staticModel.sort(0, Qt::AscendingOrder); - QCOMPARE(staticModel.buffers(), buffers); - - // STATIC - BY TITLE - DESCENDING - buffers = QList() << b << c << a; - staticModel.setSortMethod(Irc::SortByTitle); - staticModel.sort(0, Qt::DescendingOrder); - QCOMPARE(staticModel.buffers(), buffers); - - // STATIC - BY TITLE - ASCENDING & STICKY - c->setSticky(true); - buffers = QList() << c << a << b; - staticModel.setSortMethod(Irc::SortByTitle); - staticModel.sort(0, Qt::AscendingOrder); - QCOMPARE(staticModel.buffers(), buffers); - - // STATIC - BY TITLE - ASCENDING & 2 STICKIES - b->setSticky(true); - buffers = QList() << c << b << a; - staticModel.setSortMethod(Irc::SortByTitle); - staticModel.sort(0, Qt::AscendingOrder); - QCOMPARE(staticModel.buffers(), buffers); - - b = dynamicModel.add("b"); - c = dynamicModel.add("#c"); - a = dynamicModel.add("#a"); - - // DYNAMIC - BY NAME - ASCENDING - buffers = QList() << a << b << c; - dynamicModel.setSortMethod(Irc::SortByName); - QCOMPARE(dynamicModel.buffers(), buffers); - - // DYNAMIC - BY TITLE - ASCENDING - buffers = QList() << a << c << b; - dynamicModel.setSortMethod(Irc::SortByTitle); - QCOMPARE(dynamicModel.buffers(), buffers); - - dynamicModel.setSortOrder(Qt::DescendingOrder); - - // DYNAMIC - BY NAME - DESCENDING - buffers = QList() << c << b << a; - dynamicModel.setSortMethod(Irc::SortByName); - QCOMPARE(dynamicModel.buffers(), buffers); - - // DYNAMIC - BY TITLE - DESCENDING - buffers = QList() << b << c << a; - dynamicModel.setSortMethod(Irc::SortByTitle); - QCOMPARE(dynamicModel.buffers(), buffers); - - // DO NOTHING - dynamicModel.sort(Irc::SortByHand); - QCOMPARE(dynamicModel.buffers(), buffers); -} - -void tst_IrcBufferModel::testClear() -{ - IrcBufferModel model(connection); - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(waitForWritten(tst_IrcData::welcome())); - - QPointer a = model.add("#a"); - QPointer b = model.add("#b"); - QPointer c = model.add("c"); - QPointer d = model.add("d"); - - QSignalSpy countSpy(&model, SIGNAL(countChanged(int))); - QSignalSpy buffersSpy(&model, SIGNAL(buffersChanged(QList))); - QSignalSpy channelsSpy(&model, SIGNAL(channelsChanged(QStringList))); - QSignalSpy modelAboutToBeResetSpy(&model, SIGNAL(modelAboutToBeReset())); - QSignalSpy modelResetSpy(&model, SIGNAL(modelReset())); - - QVERIFY(countSpy.isValid()); - QVERIFY(buffersSpy.isValid()); - QVERIFY(channelsSpy.isValid()); - QVERIFY(modelAboutToBeResetSpy.isValid()); - QVERIFY(modelResetSpy.isValid()); - - b->setPersistent(true); - d->setPersistent(true); - - // #a, #b*, c, d* - model.clear(); - - QCOMPARE(model.count(), 2); - QCOMPARE(model.buffers(), QList() << b << d); - QCOMPARE(model.channels(), QStringList() << "#b"); - - QCOMPARE(model.get(0), b.data()); - QCOMPARE(model.get(1), d.data()); - QVERIFY(!model.get(2)); - QVERIFY(!model.find("#a")); - QVERIFY(model.find("#b")); - QVERIFY(!model.find("c")); - QVERIFY(model.find("d")); - QVERIFY(!model.contains("#a")); - QVERIFY(model.contains("#b")); - QVERIFY(!model.contains("c")); - QVERIFY(model.contains("d")); - - QVERIFY(!a); - QVERIFY(b); - QVERIFY(!c); - QVERIFY(d); - - QCOMPARE(countSpy.count(), 1); - QCOMPARE(countSpy.last().at(0).toInt(), 2); - - QCOMPARE(buffersSpy.count(), 1); - QCOMPARE(buffersSpy.last().at(0).value >(), QList() << b << d); - - QCOMPARE(channelsSpy.count(), 1); - QCOMPARE(channelsSpy.last().at(0).toStringList(), QStringList() << "#b"); - - QCOMPARE(modelAboutToBeResetSpy.count(), 1); - QCOMPARE(modelResetSpy.count(), 1); - - b->setPersistent(false); - - countSpy.clear(); - buffersSpy.clear(); - channelsSpy.clear(); - modelAboutToBeResetSpy.clear(); - modelResetSpy.clear(); - - // #b, d* - model.clear(); - - QCOMPARE(model.count(), 1); - QCOMPARE(model.buffers(), QList() << d); - QCOMPARE(model.channels(), QStringList()); - - QCOMPARE(model.get(0), d.data()); - QVERIFY(!model.get(1)); - QVERIFY(!model.find("#b")); - QVERIFY(model.find("d")); - QVERIFY(!model.contains("#b")); - QVERIFY(model.contains("d")); - - QVERIFY(!b); - QVERIFY(d); - - QCOMPARE(countSpy.count(), 1); - QCOMPARE(countSpy.last().at(0).toInt(), 1); - - QCOMPARE(buffersSpy.count(), 1); - QCOMPARE(buffersSpy.last().at(0).value >(), QList() << d); - - QCOMPARE(channelsSpy.count(), 1); - QCOMPARE(channelsSpy.last().at(0).toStringList(), QStringList()); - - QCOMPARE(modelAboutToBeResetSpy.count(), 1); - QCOMPARE(modelResetSpy.count(), 1); - - d->setPersistent(false); - - countSpy.clear(); - buffersSpy.clear(); - channelsSpy.clear(); - modelAboutToBeResetSpy.clear(); - modelResetSpy.clear(); - - // d - model.clear(); - - QCOMPARE(model.count(), 0); - QCOMPARE(model.buffers(), QList()); - QCOMPARE(model.channels(), QStringList()); - - QVERIFY(!model.get(0)); - QVERIFY(!model.find("d")); - QVERIFY(!model.contains("d")); - - QVERIFY(!d); - - QCOMPARE(countSpy.count(), 1); - QCOMPARE(countSpy.last().at(0).toInt(), 0); - - QCOMPARE(buffersSpy.count(), 1); - QCOMPARE(buffersSpy.last().at(0).value >(), QList()); - - QCOMPARE(channelsSpy.count(), 0); - - QCOMPARE(modelAboutToBeResetSpy.count(), 1); - QCOMPARE(modelResetSpy.count(), 1); - - countSpy.clear(); - buffersSpy.clear(); - channelsSpy.clear(); - modelAboutToBeResetSpy.clear(); - modelResetSpy.clear(); - - // - model.clear(); - - QCOMPARE(countSpy.count(), 0); - QCOMPARE(buffersSpy.count(), 0); - QCOMPARE(channelsSpy.count(), 0); - QCOMPARE(modelAboutToBeResetSpy.count(), 0); - QCOMPARE(modelResetSpy.count(), 0); - - QPointer e = model.add("e"); - QPointer f = model.add("f"); - - e->setPersistent(true); - f->setPersistent(true); - - countSpy.clear(); - buffersSpy.clear(); - channelsSpy.clear(); - modelAboutToBeResetSpy.clear(); - modelResetSpy.clear(); - - // e*, f* - model.clear(); - - QVERIFY(e); - QVERIFY(f); - - QCOMPARE(countSpy.count(), 0); - QCOMPARE(buffersSpy.count(), 0); - QCOMPARE(channelsSpy.count(), 0); - QCOMPARE(modelAboutToBeResetSpy.count(), 0); - QCOMPARE(modelResetSpy.count(), 0); - - qDeleteAll(model.buffers()); - - QCOMPARE(model.count(), 0); - QCOMPARE(model.buffers(), QList()); - QCOMPARE(model.channels(), QStringList()); - - QVERIFY(!model.get(0)); - QVERIFY(!model.find("e")); - QVERIFY(!model.find("f")); - QVERIFY(!model.contains("e")); - QVERIFY(!model.contains("f")); - - QVERIFY(!e); - QVERIFY(!f); - - QCOMPARE(countSpy.count(), 2); - QCOMPARE(countSpy.at(0).at(0).toInt(), 1); - QCOMPARE(countSpy.at(1).at(0).toInt(), 0); - - QCOMPARE(buffersSpy.count(), 2); - QCOMPARE(buffersSpy.at(0).at(0).value >().count(), 1); - QCOMPARE(buffersSpy.at(1).at(0).value >(), QList()); - - QCOMPARE(channelsSpy.count(), 0); - - QCOMPARE(modelAboutToBeResetSpy.count(), 0); - QCOMPARE(modelResetSpy.count(), 0); -} - -void tst_IrcBufferModel::testPersistent() -{ - IrcBufferModel model(connection); - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(waitForWritten(tst_IrcData::welcome())); - - QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); - QCOMPARE(model.count(), 1); - - QPointer channel = model.get(0)->toChannel(); - QVERIFY(channel); - - QVERIFY(!model.isPersistent()); - QVERIFY(!channel->isPersistent()); - QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); - QVERIFY(model.isEmpty()); - QVERIFY(channel); // deleteLater()'d - QCoreApplication::sendPostedEvents(channel, QEvent::DeferredDelete); - QVERIFY(!channel); // deleteLater()'d - - QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); - QCOMPARE(model.count(), 1); - channel = model.get(0)->toChannel(); - QVERIFY(channel); - - model.setPersistent(true); - QVERIFY(model.isPersistent()); - QVERIFY(!channel->isPersistent()); - QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); - QVERIFY(channel); - QCOMPARE(model.count(), 1); - - channel->setPersistent(true); - QVERIFY(model.isPersistent()); - QVERIFY(channel->isPersistent()); - QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); - QVERIFY(channel); - QCOMPARE(model.count(), 1); - - model.setPersistent(false); - QVERIFY(!model.isPersistent()); - QVERIFY(channel->isPersistent()); - QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); - QVERIFY(channel); - QCOMPARE(model.count(), 1); - - channel->setPersistent(false); - QVERIFY(!model.isPersistent()); - QVERIFY(!channel->isPersistent()); - QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); - QVERIFY(model.isEmpty()); - QVERIFY(channel); // deleteLater()'d - QCoreApplication::sendPostedEvents(channel, QEvent::DeferredDelete); - QVERIFY(!channel); // deleteLater()'d -} - -void tst_IrcBufferModel::testPrototypes() -{ - IrcBufferModel model; - - QSignalSpy bufferProtoSpy(&model, SIGNAL(bufferPrototypeChanged(IrcBuffer*))); - QSignalSpy channelProtoSpy(&model, SIGNAL(channelPrototypeChanged(IrcChannel*))); - QVERIFY(bufferProtoSpy.isValid()); - QVERIFY(channelProtoSpy.isValid()); - - model.setBufferPrototype(0); - QVERIFY(model.bufferPrototype()); - QCOMPARE(bufferProtoSpy.count(), 1); - - model.setChannelPrototype(0); - QVERIFY(model.channelPrototype()); - QCOMPARE(channelProtoSpy.count(), 1); - - IrcBuffer* bufferProto = new IrcBuffer(&model); - model.setBufferPrototype(bufferProto); - QCOMPARE(model.bufferPrototype(), bufferProto); - QCOMPARE(bufferProtoSpy.count(), 2); - - IrcChannel* channelProto = new IrcChannel(&model); - model.setChannelPrototype(channelProto); - QCOMPARE(model.channelPrototype(), channelProto); - QCOMPARE(channelProtoSpy.count(), 2); -} - -void tst_IrcBufferModel::testChanges() -{ - IrcBufferModel bufferModel; - - // IrcBufferModel signals - QSignalSpy countChangedSpy(&bufferModel, SIGNAL(countChanged(int))); - QSignalSpy addedSpy(&bufferModel, SIGNAL(added(IrcBuffer*))); - QSignalSpy removedSpy(&bufferModel, SIGNAL(removed(IrcBuffer*))); - QSignalSpy aboutToBeAddedSpy(&bufferModel, SIGNAL(aboutToBeAdded(IrcBuffer*))); - QSignalSpy aboutToBeRemovedSpy(&bufferModel, SIGNAL(aboutToBeRemoved(IrcBuffer*))); - QSignalSpy buffersChangedSpy(&bufferModel, SIGNAL(buffersChanged(QList))); - QSignalSpy channelsChangedSpy(&bufferModel, SIGNAL(channelsChanged(QStringList))); - - QVERIFY(countChangedSpy.isValid()); - QVERIFY(addedSpy.isValid()); - QVERIFY(removedSpy.isValid()); - QVERIFY(aboutToBeAddedSpy.isValid()); - QVERIFY(aboutToBeRemovedSpy.isValid()); - QVERIFY(buffersChangedSpy.isValid()); - QVERIFY(channelsChangedSpy.isValid()); - - int countChangedCount = 0; - int aboutToBeAddedCount = 0, addedCount = 0; - int aboutToBeRemovedCount = 0, removedCount = 0; - int buffersChangedCount = 0; - int channelsChangedCount = 0; - - QSignalSpy connectionChangedSpy(&bufferModel, SIGNAL(connectionChanged(IrcConnection*))); - QSignalSpy networkChangedSpy(&bufferModel, SIGNAL(networkChanged(IrcNetwork*))); - QSignalSpy messageIgnoredSpy(&bufferModel, SIGNAL(messageIgnored(IrcMessage*))); - - QVERIFY(connectionChangedSpy.isValid()); - QVERIFY(networkChangedSpy.isValid()); - QVERIFY(messageIgnoredSpy.isValid()); - - int connectionChangedCount = 0; - int networkChangedCount = 0; - int messageIgnoredCount = 0; - - // relevant QAbstractItemModel signals - QSignalSpy dataChangedSpy(&bufferModel, SIGNAL(dataChanged(QModelIndex,QModelIndex))); - QSignalSpy layoutAboutToBeChangedSpy(&bufferModel, SIGNAL(layoutAboutToBeChanged())); - QSignalSpy layoutChangedSpy(&bufferModel, SIGNAL(layoutChanged())); - QSignalSpy rowsAboutToBeInsertedSpy(&bufferModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); - QSignalSpy rowsInsertedSpy(&bufferModel, SIGNAL(rowsInserted(QModelIndex,int,int))); - QSignalSpy rowsAboutToBeRemovedSpy(&bufferModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); - QSignalSpy rowsRemovedSpy(&bufferModel, SIGNAL(rowsRemoved(QModelIndex,int,int))); - - QVERIFY(dataChangedSpy.isValid()); - QVERIFY(layoutAboutToBeChangedSpy.isValid()); - QVERIFY(layoutChangedSpy.isValid()); - QVERIFY(rowsAboutToBeInsertedSpy.isValid()); - QVERIFY(rowsInsertedSpy.isValid()); - QVERIFY(rowsAboutToBeRemovedSpy.isValid()); - QVERIFY(rowsRemovedSpy.isValid()); - - int dataChangedCount = 0; - int layoutAboutToBeChangedCount = 0, layoutChangedCount = 0; - int rowsAboutToBeInsertedCount = 0, rowsInsertedCount = 0; - int rowsAboutToBeRemovedCount = 0, rowsRemovedCount = 0; - - bufferModel.setConnection(connection); - QCOMPARE(connectionChangedSpy.count(), ++connectionChangedCount); - QCOMPARE(networkChangedSpy.count(), ++networkChangedCount); - - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(waitForWritten(tst_IrcData::welcome())); - - messageIgnoredCount = tst_IrcData::welcome().split('\n').count(); // N lines + a combined motd msg - - QCOMPARE(bufferModel.count(), 0); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QCOMPARE(bufferModel.count(), 1); - - QPointer communi = bufferModel.get(0)->toChannel(); - QVERIFY(communi); - QCOMPARE(communi->title(), QString("#communi")); - QCOMPARE(communi->name(), QString("communi")); - QCOMPARE(communi->prefix(), QString("#")); - - int previousIndex = -1; - - QList buffers = QList() << communi; - QStringList channels = QStringList() << "#communi"; - - int nextIndex = buffers.indexOf(communi); - - QCOMPARE(bufferModel.count(), buffers.count()); - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - QCOMPARE(bufferModel.channels(), channels); - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); - - QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); - QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), communi.data()); - - QCOMPARE(addedSpy.count(), ++addedCount); - QCOMPARE(addedSpy.last().at(0).value(), communi.data()); - - QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); - QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); - - QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); - QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - QVERIFY(waitForWritten(":ChanServ!ChanServ@services. NOTICE communi :fake...")); - QCOMPARE(messageIgnoredSpy.count(), ++messageIgnoredCount); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - QCOMPARE(countChangedSpy.count(), countChangedCount); - QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); - QCOMPARE(addedSpy.count(), addedCount); - QCOMPARE(buffersChangedSpy.count(), buffersChangedCount); - QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); - QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); - - QVERIFY(waitForWritten(":ChanServ!ChanServ@services. PRIVMSG communi :fake...")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QPointer ChanServ = bufferModel.get(1); - QVERIFY(ChanServ); - QCOMPARE(ChanServ->title(), QString("ChanServ")); - QCOMPARE(ChanServ->name(), QString("ChanServ")); - QCOMPARE(ChanServ->prefix(), QString()); - - previousIndex = -1; - - buffers = QList() << communi << ChanServ; - channels = QStringList() << "#communi"; - - nextIndex = buffers.indexOf(ChanServ); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - QCOMPARE(bufferModel.count(), buffers.count()); - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); - - QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); - QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), ChanServ.data()); - - QCOMPARE(addedSpy.count(), ++addedCount); - QCOMPARE(addedSpy.last().at(0).value(), ChanServ.data()); - - QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); - QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); - - QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - QVERIFY(waitForWritten(":ChanServ!ChanServ@services. NOTICE communi :fake...")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - QCOMPARE(bufferModel.count(), buffers.count()); - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - QCOMPARE(countChangedSpy.count(), countChangedCount); - QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); - QCOMPARE(addedSpy.count(), addedCount); - QCOMPARE(buffersChangedSpy.count(), buffersChangedCount); - QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); - QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); - - QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#freenode")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QPointer freenode = bufferModel.get(2)->toChannel(); - QVERIFY(freenode); - QCOMPARE(freenode->title(), QString("#freenode")); - QCOMPARE(freenode->name(), QString("freenode")); - QCOMPARE(freenode->prefix(), QString("#")); - - previousIndex = -1; - - buffers = QList() << communi << ChanServ << freenode; - channels = QStringList() << "#communi" << "#freenode"; - - nextIndex = buffers.indexOf(freenode); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); - - QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); - QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), freenode.data()); - - QCOMPARE(addedSpy.count(), ++addedCount); - QCOMPARE(addedSpy.last().at(0).value(), freenode.data()); - - QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); - QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); - - QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); - QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - bufferModel.setSortMethod(Irc::SortByTitle); - QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); - QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); - - previousIndex = -1; - - // Irc::SortByTitle - buffers = QList() << communi << freenode << ChanServ; - channels = QStringList() << "#communi" << "#freenode"; - - nextIndex = -1; - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - bufferModel.setSortMethod(Irc::SortByName); - QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); - QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); - - bufferModel.setSortOrder(Qt::DescendingOrder); - QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); - QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); - - previousIndex = -1; - - // Irc::SortByName, Qt::DescendingOrder - buffers = QList() << freenode << communi << ChanServ; - channels = QStringList() << "#communi" << "#freenode"; - - nextIndex = -1; - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - QVERIFY(waitForWritten(":qtassistant!qtassistant@hidd.en PRIVMSG communi :hola")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QPointer qtassistant = bufferModel.get(0); - QVERIFY(qtassistant); - QCOMPARE(qtassistant->title(), QString("qtassistant")); - QCOMPARE(qtassistant->name(), QString("qtassistant")); - QCOMPARE(qtassistant->prefix(), QString()); - - previousIndex = -1; - - // Irc::SortByName, Qt::DescendingOrder - buffers = QList() << qtassistant << freenode << communi << ChanServ; - channels = QStringList() << "#communi" << "#freenode"; - - nextIndex = buffers.indexOf(qtassistant); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); - - QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); - QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), qtassistant.data()); - - QCOMPARE(addedSpy.count(), ++addedCount); - QCOMPARE(addedSpy.last().at(0).value(), qtassistant.data()); - - QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); - QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); - - QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - QSignalSpy titleChangedSpy(qtassistant, SIGNAL(titleChanged(QString))); - QSignalSpy nameChangedSpy(qtassistant, SIGNAL(nameChanged(QString))); - QSignalSpy prefixChangedSpy(qtassistant, SIGNAL(prefixChanged(QString))); - - QVERIFY(titleChangedSpy.isValid()); - QVERIFY(nameChangedSpy.isValid()); - QVERIFY(prefixChangedSpy.isValid()); - - int titleChangedCount = 0; - int nameChangedCount = 0; - int prefixChangedCount = 0; - - QVERIFY(waitForWritten(":qtassistant!qtassistant@hidd.en NICK assistant :hola")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QCOMPARE(qtassistant->title(), QString("assistant")); - QCOMPARE(qtassistant->name(), QString("assistant")); - QCOMPARE(qtassistant->prefix(), QString()); - - QCOMPARE(titleChangedSpy.count(), ++titleChangedCount); - QCOMPARE(nameChangedSpy.count(), ++nameChangedCount); - QCOMPARE(prefixChangedSpy.count(), prefixChangedCount); - - previousIndex = buffers.indexOf(qtassistant); - - // Irc::SortByName, Qt::DescendingOrder - buffers = QList() << freenode << communi << ChanServ << qtassistant; // qtassistant=assistant - channels = QStringList() << "#communi" << "#freenode"; - - nextIndex = buffers.indexOf(qtassistant); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - QCOMPARE(countChangedSpy.count(), countChangedCount); - - QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); - - QCOMPARE(addedSpy.count(), addedCount); - - QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); - QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); - - QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); - - QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); - QModelIndex topLeft = dataChangedSpy.last().at(0).value(); - QModelIndex bottomRight = dataChangedSpy.last().at(0).value(); - QVERIFY(!topLeft.parent().isValid()); - QVERIFY(topLeft.isValid()); - QVERIFY(bottomRight.isValid()); - QVERIFY(topLeft == bottomRight); - QCOMPARE(topLeft.row(), previousIndex); - QCOMPARE(topLeft.column(), 0); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); - QCOMPARE(rowsRemovedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - QVERIFY(waitForWritten(":communi!communi@hidd.en PART #communi")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QVERIFY(communi); // deleteLater()'d - - QCOMPARE(aboutToBeRemovedSpy.count(), ++aboutToBeRemovedCount); - QCOMPARE(aboutToBeRemovedSpy.last().at(0).value(), communi.data()); - - QCOMPARE(removedSpy.count(), ++removedCount); - QCOMPARE(removedSpy.last().at(0).value(), communi.data()); - - previousIndex = buffers.indexOf(communi); - - QCoreApplication::sendPostedEvents(communi, QEvent::DeferredDelete); - QVERIFY(!communi); - - // Irc::SortByName, Qt::DescendingOrder - buffers = QList() << freenode << ChanServ << qtassistant; // qtassistant=assistant - channels = QStringList() << "#freenode"; - - nextIndex = buffers.indexOf(communi); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); - - QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); - - QCOMPARE(addedSpy.count(), addedCount); - - QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); - QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); - - QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); - QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); - - QCOMPARE(dataChangedSpy.count(), dataChangedCount); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); - QCOMPARE(rowsRemovedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); - - QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); - - waitForWritten(":moorcock.freenode.net 324 communi #freenode +s"); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - QCOMPARE(freenode->mode(), QString("+s")); - - QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi KICK #freenode communi")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QVERIFY(freenode); // deleteLater()'d - - QCOMPARE(aboutToBeRemovedSpy.count(), ++aboutToBeRemovedCount); - QCOMPARE(aboutToBeRemovedSpy.last().at(0).value(), freenode.data()); - - QCOMPARE(removedSpy.count(), ++removedCount); - QCOMPARE(removedSpy.last().at(0).value(), freenode.data()); - - previousIndex = buffers.indexOf(freenode); - - QCoreApplication::sendPostedEvents(freenode, QEvent::DeferredDelete); - QVERIFY(!freenode); - - // Irc::SortByName, Qt::DescendingOrder - buffers = QList() << ChanServ << qtassistant; // qtassistant=assistant - channels = QStringList(); - - nextIndex = buffers.indexOf(freenode); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); - - QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); - - QCOMPARE(addedSpy.count(), addedCount); - - QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); - QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); - - QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); - QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); - - QCOMPARE(dataChangedSpy.count(), dataChangedCount); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); - QCOMPARE(rowsRemovedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); - - QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); - - QVERIFY(waitForWritten(":communi!communi@hidd.en PRIVMSG jpnurmi :echo")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - QPointer jpnurmi = bufferModel.get(0); - QVERIFY(jpnurmi); - QCOMPARE(jpnurmi->title(), QString("jpnurmi")); - QCOMPARE(jpnurmi->name(), QString("jpnurmi")); - QCOMPARE(jpnurmi->prefix(), QString()); - - previousIndex = -1; - - // Irc::SortByName, Qt::DescendingOrder - buffers = QList() << jpnurmi << ChanServ << qtassistant; // qtassistant=assistant - channels = QStringList(); - - nextIndex = buffers.indexOf(jpnurmi); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); - - QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); - QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), jpnurmi.data()); - - QCOMPARE(addedSpy.count(), ++addedCount); - QCOMPARE(addedSpy.last().at(0).value(), jpnurmi.data()); - - QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); - QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); - - QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - QVERIFY(waitForWritten(":communi!communi@hidd.en QUIT :bye")); - QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); - - serverSocket->close(); - QVERIFY(clientSocket->waitForDisconnected(100)); - QVERIFY(!connection->isConnected()); - QVERIFY(!connection->isActive()); - - QCOMPARE(bufferModel.count(), buffers.count()); - QCOMPARE(bufferModel.buffers(), buffers); - QCOMPARE(bufferModel.channels(), channels); - - for (int i = 0; i < bufferModel.count(); ++i) { - QCOMPARE(bufferModel.get(i), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); - QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); - QVERIFY(!buffers.at(i)->isActive()); - } - - QCOMPARE(countChangedSpy.count(), countChangedCount); - QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); - QCOMPARE(addedSpy.count(), addedCount); - QCOMPARE(buffersChangedSpy.count(), buffersChangedCount); - QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); - QCOMPARE(dataChangedSpy.count(), dataChangedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); - QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); -} - -void tst_IrcBufferModel::testActive() -{ - IrcBufferModel bufferModel; - bufferModel.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(waitForWritten(tst_IrcData::welcome())); - - QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); - - IrcChannel* channel = bufferModel.get(0)->toChannel(); - IrcBuffer* query = bufferModel.add("qtassistant"); - - channel->setPersistent(true); - query->setPersistent(true); - - QSignalSpy channelActiveSpy(channel, SIGNAL(activeChanged(bool))); - QSignalSpy queryActiveSpy(query, SIGNAL(activeChanged(bool))); - QVERIFY(channelActiveSpy.isValid()); - QVERIFY(queryActiveSpy.isValid()); - int channelActiveCount = 0; - int queryActiveCount = 0; - - QVERIFY(channel->isActive()); - QVERIFY(query->isActive()); - - connection->close(); - - QVERIFY(!channel->isActive()); - QVERIFY(!query->isActive()); - - QCOMPARE(channelActiveSpy.count(), ++channelActiveCount); - QCOMPARE(queryActiveSpy.count(), ++queryActiveCount); - - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(waitForWritten(tst_IrcData::welcome())); - - QVERIFY(!channel->isActive()); - QVERIFY(query->isActive()); - - QCOMPARE(channelActiveSpy.count(), channelActiveCount); - QCOMPARE(queryActiveSpy.count(), ++queryActiveCount); - - QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); - - QVERIFY(channel->isActive()); - QVERIFY(query->isActive()); - - QCOMPARE(channelActiveSpy.count(), ++channelActiveCount); - QCOMPARE(queryActiveSpy.count(), queryActiveCount); - - QVERIFY(waitForWritten(":communi!communi@hidd.en PART #communi")); - - QVERIFY(!channel->isActive()); - QVERIFY(query->isActive()); - - QCOMPARE(channelActiveSpy.count(), ++channelActiveCount); - QCOMPARE(queryActiveSpy.count(), queryActiveCount); - - connection->close(); - - QVERIFY(!channel->isActive()); - QVERIFY(!query->isActive()); - - QCOMPARE(channelActiveSpy.count(), channelActiveCount); - QCOMPARE(queryActiveSpy.count(), ++queryActiveCount); -} - -void tst_IrcBufferModel::testRoles() -{ - IrcBufferModel model; - QHash roles = model.roleNames(); - QCOMPARE(roles.take(Qt::DisplayRole), QByteArray("display")); - QCOMPARE(roles.take(Irc::BufferRole), QByteArray("buffer")); - QCOMPARE(roles.take(Irc::ChannelRole), QByteArray("channel")); - QCOMPARE(roles.take(Irc::NameRole), QByteArray("name")); - QCOMPARE(roles.take(Irc::PrefixRole), QByteArray("prefix")); - QCOMPARE(roles.take(Irc::TitleRole), QByteArray("title")); - QVERIFY(roles.isEmpty()); -} - -void tst_IrcBufferModel::testAIM() -{ - IrcBufferModel bufferModel(connection); - IrcBuffer* a = bufferModel.add("#a"); - IrcBuffer* b = bufferModel.add("#b"); - IrcBuffer* c = bufferModel.add("c"); - IrcBuffer* o = 0; - - QAbstractItemModel* aim = &bufferModel; - QModelIndex ai = aim->index(0, 0); - QModelIndex bi = aim->index(1, 0); - QModelIndex ci = aim->index(2, 0); - QModelIndex oi = aim->index(100, 100); - - QVERIFY(ai.isValid()); - QVERIFY(bi.isValid()); - QVERIFY(ci.isValid()); - QVERIFY(!oi.isValid()); - - QCOMPARE(aim->rowCount(QModelIndex()), 3); - QCOMPARE(aim->rowCount(ai), 0); - - QCOMPARE(aim->columnCount(QModelIndex()), 1); - QCOMPARE(aim->columnCount(ai), 0); - - QCOMPARE(bufferModel.index(a), ai); - QCOMPARE(bufferModel.index(b), bi); - QCOMPARE(bufferModel.index(c), ci); - QVERIFY(!bufferModel.index(o).isValid()); - - QCOMPARE(bufferModel.buffer(ai), a); - QCOMPARE(bufferModel.buffer(bi), b); - QCOMPARE(bufferModel.buffer(ci), c); - QVERIFY(!bufferModel.buffer(oi)); - - bufferModel.setDisplayRole(Irc::TitleRole); - QCOMPARE(aim->data(ai, Qt::DisplayRole).toString(), a->title()); - QCOMPARE(aim->data(bi, Qt::DisplayRole).toString(), b->title()); - QCOMPARE(aim->data(ci, Qt::DisplayRole).toString(), c->title()); - QVERIFY(aim->data(oi, Qt::DisplayRole).toString().isEmpty()); - - bufferModel.setDisplayRole(Irc::BufferRole); - QCOMPARE(aim->data(ai, Qt::DisplayRole).value(), a); - QCOMPARE(aim->data(bi, Qt::DisplayRole).value(), b); - QCOMPARE(aim->data(ci, Qt::DisplayRole).value(), c); - QVERIFY(!aim->data(oi, Qt::DisplayRole).value()); - - QCOMPARE(aim->data(ai, Irc::BufferRole).value(), a); - QCOMPARE(aim->data(bi, Irc::BufferRole).value(), b); - QCOMPARE(aim->data(ci, Irc::BufferRole).value(), c); - QVERIFY(!aim->data(oi, Irc::BufferRole).value()); - - QCOMPARE(aim->data(ai, Irc::ChannelRole).value(), a->toChannel()); - QCOMPARE(aim->data(bi, Irc::ChannelRole).value(), b->toChannel()); - QCOMPARE(aim->data(ci, Irc::ChannelRole).value(), c->toChannel()); - QVERIFY(!aim->data(oi, Irc::ChannelRole).value()); - - QCOMPARE(aim->data(ai, Irc::TitleRole).toString(), a->title()); - QCOMPARE(aim->data(bi, Irc::TitleRole).toString(), b->title()); - QCOMPARE(aim->data(ci, Irc::TitleRole).toString(), c->title()); - QVERIFY(aim->data(oi, Irc::TitleRole).toString().isEmpty()); - - QCOMPARE(aim->data(ai, Irc::NameRole).toString(), a->name()); - QCOMPARE(aim->data(bi, Irc::NameRole).toString(), b->name()); - QCOMPARE(aim->data(ci, Irc::NameRole).toString(), c->name()); - QVERIFY(aim->data(oi, Irc::NameRole).toString().isEmpty()); - - QVERIFY(aim->data(ai, Irc::PrefixRole).toString().isEmpty()); - QVERIFY(aim->data(bi, Irc::PrefixRole).toString().isEmpty()); - QVERIFY(aim->data(ci, Irc::PrefixRole).toString().isEmpty()); - QVERIFY(aim->data(oi, Irc::PrefixRole).toString().isEmpty()); -} - -class FakeQmlBufferModel : public IrcBufferModel -{ - Q_OBJECT - friend class tst_IrcBufferModel; - -public slots: - // -Wno-overloaded-virtual - QVariant createBuffer(const QVariant& title) - { - IrcBuffer* buffer = IrcBufferModel::createBuffer(title.toString()); - buffer->setObjectName("QML buffer"); - return QVariant::fromValue(buffer); - } - QVariant createChannel(const QVariant& title) - { - IrcChannel* channel = IrcBufferModel::createChannel(title.toString()); - channel->setObjectName("QML channel"); - return QVariant::fromValue(channel); - } -}; - -void tst_IrcBufferModel::testQML() -{ - FakeQmlBufferModel model; - model.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(waitForWritten(tst_IrcData::welcome())); - - QCOMPARE(model.add("buffer")->objectName(), QString("QML buffer")); - QCOMPARE(model.add("#channel")->objectName(), QString("QML channel")); -} - -void tst_IrcBufferModel::testWarnings() -{ - IrcBufferModel model(connection); - model.setConnection(connection); - - QTest::ignoreMessage(QtCriticalMsg, "IrcBufferModel::setConnection(): changing the connection on the fly is not supported."); - - IrcConnection another; - model.setConnection(&another); -} - -QTEST_MAIN(tst_IrcBufferModel) - -#include "tst_ircbuffermodel.moc" diff --git a/libcommuni/tests/auto/ircchannel/ircchannel.pro b/libcommuni/tests/auto/ircchannel/ircchannel.pro deleted file mode 100644 index 8f9b87b..0000000 --- a/libcommuni/tests/auto/ircchannel/ircchannel.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircchannel.cpp - -include(../auto.pri) diff --git a/libcommuni/tests/auto/ircchannel/tst_ircchannel.cpp b/libcommuni/tests/auto/ircchannel/tst_ircchannel.cpp deleted file mode 100644 index 54fdf31..0000000 --- a/libcommuni/tests/auto/ircchannel/tst_ircchannel.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircchannel.h" -#include -#include - -class tst_IrcChannel : public QObject -{ - Q_OBJECT - -private slots: - void testDefaults(); - void testSignals(); - void testDebug(); -}; - -void tst_IrcChannel::testDefaults() -{ - IrcChannel channel; - QVERIFY(channel.title().isEmpty()); - QVERIFY(channel.name().isEmpty()); - QVERIFY(channel.prefix().isEmpty()); - QVERIFY(channel.isChannel()); - QVERIFY(channel.toChannel()); - QVERIFY(!channel.connection()); - QVERIFY(!channel.network()); - QVERIFY(!channel.model()); - QVERIFY(!channel.isActive()); - QVERIFY(!channel.isSticky()); - QVERIFY(!channel.isPersistent()); - QVERIFY(channel.mode().isEmpty()); - QVERIFY(channel.topic().isEmpty()); -} - -void tst_IrcChannel::testSignals() -{ - IrcChannel channel; - QSignalSpy modeSpy(&channel, SIGNAL(modeChanged(QString))); - QSignalSpy topicSpy(&channel, SIGNAL(topicChanged(QString))); - QVERIFY(modeSpy.isValid()); - QVERIFY(topicSpy.isValid()); -} - -void tst_IrcChannel::testDebug() -{ - QString str; - QDebug dbg(&str); - - dbg << static_cast(0); - QCOMPARE(str.trimmed(), QString::fromLatin1("IrcChannel(0x0)")); - str.clear(); - - IrcChannel channel; - dbg << &channel; - QVERIFY(QRegExp("IrcChannel\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); - str.clear(); - - channel.setObjectName("obj"); - dbg << &channel; - QVERIFY(QRegExp("IrcChannel\\(0x[0-9A-Fa-f]+, name=obj\\) ").exactMatch(str)); - str.clear(); - - channel.setPrefix("#"); - channel.setName("communi"); - dbg << &channel; - QVERIFY(QRegExp("IrcChannel\\(0x[0-9A-Fa-f]+, name=obj, title=#communi\\) ").exactMatch(str)); - str.clear(); -} - -QTEST_MAIN(tst_IrcChannel) - -#include "tst_ircchannel.moc" diff --git a/libcommuni/tests/auto/irccommand/irccommand.pro b/libcommuni/tests/auto/irccommand/irccommand.pro deleted file mode 100644 index 50a631e..0000000 --- a/libcommuni/tests/auto/irccommand/irccommand.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_irccommand.cpp - -include(../auto.pri) diff --git a/libcommuni/tests/auto/irccommand/tst_irccommand.cpp b/libcommuni/tests/auto/irccommand/tst_irccommand.cpp deleted file mode 100644 index 563cacc..0000000 --- a/libcommuni/tests/auto/irccommand/tst_irccommand.cpp +++ /dev/null @@ -1,529 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "irccommand.h" -#include "ircmessage.h" -#include "ircconnection.h" -#include -#include -#include -#include - -class tst_IrcCommand : public QObject -{ - Q_OBJECT - -private slots: - void testDefaults(); - - void testEncoding_data(); - void testEncoding(); - - void testConversion(); - - void testAdmin(); - void testAway(); - void testCapability(); - void testCtcpAction(); - void testCtcpReply(); - void testCtcpRequest(); - void testInfo(); - void testInvite(); - void testJoin(); - void testKick(); - void testKnock(); - void testList(); - void testMessage(); - void testMode(); - void testMotd(); - void testNames(); - void testNick(); - void testNotice(); - void testPart(); - void testPing(); - void testPong(); - void testQuit(); - void testQuote(); - void testStats(); - void testTime(); - void testTopic(); - void testTrace(); - void testUsers(); - void testVersion(); - void testWho(); - void testWhois(); - void testWhowas(); - - void testDebug(); -}; - -void tst_IrcCommand::testDefaults() -{ - IrcCommand cmd; - QVERIFY(cmd.parameters().isEmpty()); - QCOMPARE(cmd.type(), IrcCommand::Custom); - QCOMPARE(cmd.encoding(), QByteArray("UTF-8")); - - QTest::ignoreMessage(QtWarningMsg, "Reimplement IrcCommand::toString() for IrcCommand::Custom"); - QVERIFY(cmd.toString().isEmpty()); -} - -void tst_IrcCommand::testEncoding_data() -{ - QTest::addColumn("encoding"); - QTest::addColumn("actual"); - QTest::addColumn("supported"); - - QTest::newRow("null") << QByteArray() << QByteArray("UTF-8") << false; - QTest::newRow("empty") << QByteArray("") << QByteArray("UTF-8") << false; - QTest::newRow("space") << QByteArray(" ") << QByteArray("UTF-8") << false; - QTest::newRow("invalid") << QByteArray("invalid") << QByteArray("UTF-8") << false; - foreach (const QByteArray& codec, QTextCodec::availableCodecs()) - QTest::newRow(codec) << codec << codec << true; -} - -void tst_IrcCommand::testEncoding() -{ - QFETCH(QByteArray, encoding); - QFETCH(QByteArray, actual); - QFETCH(bool, supported); - - if (!supported) - QTest::ignoreMessage(QtWarningMsg, "IrcCommand::setEncoding(): unsupported encoding \"" + encoding + "\" "); - - IrcCommand cmd; - cmd.setEncoding(encoding); - QCOMPARE(cmd.encoding(), actual); -} - -void tst_IrcCommand::testConversion() -{ - QScopedPointer cmd(IrcCommand::createMessage("target", "foo bar")); - QVERIFY(cmd.data()); - QCOMPARE(cmd->type(), IrcCommand::Message); - - IrcConnection conn; - QScopedPointer msg(cmd->toMessage("prefix", &conn)); - QVERIFY(msg.data()); - - QCOMPARE(msg->type(), IrcMessage::Private); - QCOMPARE(msg->connection(), &conn); - QCOMPARE(msg->prefix(), QString("prefix")); - QCOMPARE(msg->property("target").toString(), QString("target")); - QCOMPARE(msg->property("content").toString(), QString("foo bar")); -} - -void tst_IrcCommand::testAdmin() -{ - QScopedPointer cmd(IrcCommand::createAdmin("server")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Admin); - QVERIFY(cmd->toString().contains(QRegExp("\\bADMIN\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); -} - -void tst_IrcCommand::testAway() -{ - QScopedPointer cmd(IrcCommand::createAway("reason")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Away); - QVERIFY(cmd->toString().contains(QRegExp("\\bAWAY\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\breason\\b"))); -} - -void tst_IrcCommand::testCapability() -{ - QScopedPointer cmd1(IrcCommand::createCapability("sub", QString("cap"))); - QVERIFY(cmd1.data()); - - QCOMPARE(cmd1->type(), IrcCommand::Capability); - QVERIFY(cmd1->toString().contains(QRegExp("\\bCAP\\b"))); - QVERIFY(cmd1->toString().contains(QRegExp("\\bsub\\b"))); - QVERIFY(cmd1->toString().contains(QRegExp("\\bcap\\b"))); - - QScopedPointer cmd2(IrcCommand::createCapability("sub", QStringList() << "cap1" << "cap2")); - QVERIFY(cmd2.data()); - - QCOMPARE(cmd2->type(), IrcCommand::Capability); - QVERIFY(cmd2->toString().contains(QRegExp("\\bCAP\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bsub\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bcap1\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bcap2\\b"))); -} - -void tst_IrcCommand::testCtcpAction() -{ - QScopedPointer cmd(IrcCommand::createCtcpAction("tgt", "act")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::CtcpAction); - QVERIFY(cmd->toString().contains(QRegExp("\\bPRIVMSG\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bact\\b"))); - QCOMPARE(cmd->toString().count("\01"), 2); -} - -void tst_IrcCommand::testCtcpReply() -{ - QScopedPointer cmd(IrcCommand::createCtcpReply("tgt", "rpl")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::CtcpReply); - QVERIFY(cmd->toString().contains(QRegExp("\\bNOTICE\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\brpl\\b"))); - QCOMPARE(cmd->toString().count("\01"), 2); -} - -void tst_IrcCommand::testCtcpRequest() -{ - QScopedPointer cmd(IrcCommand::createCtcpRequest("tgt", "req")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::CtcpRequest); - QVERIFY(cmd->toString().contains(QRegExp("\\bPRIVMSG\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\breq\\b"))); - QCOMPARE(cmd->toString().count("\01"), 2); -} - -void tst_IrcCommand::testInfo() -{ - QScopedPointer cmd(IrcCommand::createInfo("server")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Info); - QVERIFY(cmd->toString().contains(QRegExp("\\bINFO\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); -} - -void tst_IrcCommand::testInvite() -{ - QScopedPointer cmd(IrcCommand::createInvite("usr", "chan")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Invite); - QVERIFY(cmd->toString().contains(QRegExp("\\bINVITE\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\busr\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bchan\\b"))); -} - -void tst_IrcCommand::testJoin() -{ - QScopedPointer cmd1(IrcCommand::createJoin("chan")); - QVERIFY(cmd1.data()); - - QCOMPARE(cmd1->type(), IrcCommand::Join); - QVERIFY(cmd1->toString().contains(QRegExp("\\bJOIN\\b"))); - QVERIFY(cmd1->toString().contains(QRegExp("\\bchan\\b"))); - - QScopedPointer cmd2(IrcCommand::createJoin(QStringList() << "chan1" << "chan2")); - QVERIFY(cmd2.data()); - - QCOMPARE(cmd2->type(), IrcCommand::Join); - QVERIFY(cmd2->toString().contains(QRegExp("\\bJOIN\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bchan1\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bchan2\\b"))); -} - -void tst_IrcCommand::testKick() -{ - QScopedPointer cmd(IrcCommand::createKick("chan", "usr")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Kick); - QVERIFY(cmd->toString().contains(QRegExp("\\bKICK\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bchan\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\busr\\b"))); -} - -void tst_IrcCommand::testKnock() -{ - QScopedPointer cmd(IrcCommand::createKnock("chan")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Knock); - QVERIFY(cmd->toString().contains(QRegExp("\\bKNOCK\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bchan\\b"))); -} - -void tst_IrcCommand::testList() -{ - QScopedPointer cmd(IrcCommand::createList(QStringList() << "chan1" << "chan2", "server")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::List); - QVERIFY(cmd->toString().contains(QRegExp("\\bLIST\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bchan1\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bchan2\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); -} - -void tst_IrcCommand::testMessage() -{ - QScopedPointer cmd(IrcCommand::createMessage("tgt", "msg")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Message); - QVERIFY(cmd->toString().contains(QRegExp("\\bPRIVMSG\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bmsg\\b"))); -} - -void tst_IrcCommand::testMode() -{ - QScopedPointer cmd(IrcCommand::createMode("tgt", "mode")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Mode); - QVERIFY(cmd->toString().contains(QRegExp("\\bMODE\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bmode\\b"))); -} - -void tst_IrcCommand::testMotd() -{ - QScopedPointer cmd(IrcCommand::createMotd("server")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Motd); - QVERIFY(cmd->toString().contains(QRegExp("\\bMOTD\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); -} - -void tst_IrcCommand::testNames() -{ - QScopedPointer cmd1(IrcCommand::createNames("chan")); - QVERIFY(cmd1.data()); - - QCOMPARE(cmd1->type(), IrcCommand::Names); - QVERIFY(cmd1->toString().contains(QRegExp("\\bNAMES\\b"))); - QVERIFY(cmd1->toString().contains(QRegExp("\\bchan\\b"))); - - QScopedPointer cmd2(IrcCommand::createNames(QStringList() << "chan1" << "chan2")); - QVERIFY(cmd2.data()); - - QCOMPARE(cmd2->type(), IrcCommand::Names); - QVERIFY(cmd2->toString().contains(QRegExp("\\bNAMES\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bchan1\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bchan2\\b"))); -} - -void tst_IrcCommand::testNick() -{ - QScopedPointer cmd(IrcCommand::createNick("nick")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Nick); - QVERIFY(cmd->toString().contains(QRegExp("\\bNICK\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bnick\\b"))); -} - -void tst_IrcCommand::testNotice() -{ - QScopedPointer cmd(IrcCommand::createNotice("tgt", "msg")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Notice); - QVERIFY(cmd->toString().contains(QRegExp("\\bNOTICE\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bmsg\\b"))); -} - -void tst_IrcCommand::testPart() -{ - QScopedPointer cmd1(IrcCommand::createPart("chan")); - QVERIFY(cmd1.data()); - - QCOMPARE(cmd1->type(), IrcCommand::Part); - QVERIFY(cmd1->toString().contains(QRegExp("\\bPART\\b"))); - QVERIFY(cmd1->toString().contains(QRegExp("\\bchan\\b"))); - - QScopedPointer cmd2(IrcCommand::createPart(QStringList() << "chan1" << "chan2")); - QVERIFY(cmd2.data()); - - QCOMPARE(cmd2->type(), IrcCommand::Part); - QVERIFY(cmd2->toString().contains(QRegExp("\\bPART\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bchan1\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bchan2\\b"))); -} - -void tst_IrcCommand::testPing() -{ - QScopedPointer cmd(IrcCommand::createPing("arg")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Ping); - QVERIFY(cmd->toString().contains(QRegExp("\\bPING\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\barg\\b"))); -} - -void tst_IrcCommand::testPong() -{ - QScopedPointer cmd(IrcCommand::createPong("arg")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Pong); - QVERIFY(cmd->toString().contains(QRegExp("\\bPONG\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\barg\\b"))); -} - -void tst_IrcCommand::testQuit() -{ - QScopedPointer cmd(IrcCommand::createQuit("reason")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Quit); - QVERIFY(cmd->toString().contains(QRegExp("\\bQUIT\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\breason\\b"))); -} - -void tst_IrcCommand::testQuote() -{ - QScopedPointer cmd1(IrcCommand::createQuote("CUSTOM")); - QVERIFY(cmd1.data()); - - QCOMPARE(cmd1->type(), IrcCommand::Quote); - QVERIFY(cmd1->toString().contains(QRegExp("\\bCUSTOM\\b"))); - - QScopedPointer cmd2(IrcCommand::createQuote(QStringList() << "FOO" << "BAR")); - QVERIFY(cmd2.data()); - - QCOMPARE(cmd2->type(), IrcCommand::Quote); - QVERIFY(cmd2->toString().contains(QRegExp("\\bFOO\\b"))); - QVERIFY(cmd2->toString().contains(QRegExp("\\bBAR\\b"))); -} - -void tst_IrcCommand::testStats() -{ - QScopedPointer cmd(IrcCommand::createStats("query", "server")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Stats); - QVERIFY(cmd->toString().contains(QRegExp("\\bSTATS\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bquery\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); -} - -void tst_IrcCommand::testTime() -{ - QScopedPointer cmd(IrcCommand::createTime("server")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Time); - QVERIFY(cmd->toString().contains(QRegExp("\\bTIME\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); -} - -void tst_IrcCommand::testTopic() -{ - QScopedPointer cmd(IrcCommand::createTopic("chan", "topic")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Topic); - QVERIFY(cmd->toString().contains(QRegExp("\\bTOPIC\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bchan\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\btopic\\b"))); -} - -void tst_IrcCommand::testTrace() -{ - QScopedPointer cmd(IrcCommand::createTrace("target")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Trace); - QVERIFY(cmd->toString().contains(QRegExp("\\bTRACE\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\btarget\\b"))); -} - -void tst_IrcCommand::testUsers() -{ - QScopedPointer cmd(IrcCommand::createUsers("server")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Users); - QVERIFY(cmd->toString().contains(QRegExp("\\bUSERS\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); -} - -void tst_IrcCommand::testVersion() -{ - QScopedPointer cmd(IrcCommand::createVersion("user")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Version); - QVERIFY(cmd->toString().contains(QRegExp("\\bVERSION\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\buser\\b"))); -} - -void tst_IrcCommand::testWho() -{ - QScopedPointer cmd(IrcCommand::createWho("mask")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Who); - QVERIFY(cmd->toString().contains(QRegExp("\\bWHO\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bmask\\b"))); -} - -void tst_IrcCommand::testWhois() -{ - QScopedPointer cmd(IrcCommand::createWhois("mask")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Whois); - QVERIFY(cmd->toString().contains(QRegExp("\\bWHOIS\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bmask\\b"))); -} - -void tst_IrcCommand::testWhowas() -{ - QScopedPointer cmd(IrcCommand::createWhowas("mask")); - QVERIFY(cmd.data()); - - QCOMPARE(cmd->type(), IrcCommand::Whowas); - QVERIFY(cmd->toString().contains(QRegExp("\\bWHOWAS\\b"))); - QVERIFY(cmd->toString().contains(QRegExp("\\bmask\\b"))); -} - -void tst_IrcCommand::testDebug() -{ - QString str; - QDebug dbg(&str); - - dbg << static_cast(0); - QCOMPARE(str.trimmed(), QString::fromLatin1("IrcCommand(0x0)")); - str.clear(); - - IrcCommand command; - QTest::ignoreMessage(QtWarningMsg, "Reimplement IrcCommand::toString() for IrcCommand::Custom"); - dbg << &command; - QVERIFY(QRegExp("IrcCommand\\(0x[0-9A-Fa-f]+, type=Custom\\) ").exactMatch(str)); - str.clear(); - - command.setType(IrcCommand::Quit); - dbg << &command; - QVERIFY(QRegExp("IrcCommand\\(0x[0-9A-Fa-f]+, type=Quit, \"QUIT :\"\\) ").exactMatch(str)); - str.clear(); - - command.setObjectName("foo"); - dbg << &command; - QVERIFY(QRegExp("IrcCommand\\(0x[0-9A-Fa-f]+, name=foo, type=Quit, \"QUIT :\"\\) ").exactMatch(str)); - str.clear(); - - dbg << IrcCommand::Join; - QCOMPARE(str.trimmed(), QString::fromLatin1("Join")); - str.clear(); -} - -QTEST_MAIN(tst_IrcCommand) - -#include "tst_irccommand.moc" diff --git a/libcommuni/tests/auto/irccommandparser/irccommandparser.pro b/libcommuni/tests/auto/irccommandparser/irccommandparser.pro deleted file mode 100644 index 2fe0bc1..0000000 --- a/libcommuni/tests/auto/irccommandparser/irccommandparser.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_irccommandparser.cpp - -include(../auto.pri) diff --git a/libcommuni/tests/auto/irccommandparser/tst_irccommandparser.cpp b/libcommuni/tests/auto/irccommandparser/tst_irccommandparser.cpp deleted file mode 100644 index 6476f28..0000000 --- a/libcommuni/tests/auto/irccommandparser/tst_irccommandparser.cpp +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "irccommandparser.h" -#include - -class tst_IrcCommandParser : public QObject -{ - Q_OBJECT - -private slots: - void testParse_data(); - void testParse(); - void testTriggers(); - void testTarget(); - void testChannels(); - void testCommands(); - void testClear(); - void testReset(); - void testAddRemove(); - void testSyntax_data(); - void testSyntax(); - void testTolerancy(); - void testCustom(); - void testWhitespace(); -}; - -void tst_IrcCommandParser::testParse_data() -{ - QTest::addColumn("target"); - QTest::addColumn("input"); - QTest::addColumn("output"); - - QTest::newRow("msg") << QString("#communi") << QString("Hello all!") << QString("PRIVMSG #communi :Hello all!"); - QTest::newRow("//msg") << QString("#communi") << QString("//msg test") << QString("PRIVMSG #communi :/msg test"); - QTest::newRow("/ /msg") << QString("#communi") << QString("/ /msg test") << QString("PRIVMSG #communi :/msg test"); - - QTest::newRow("join1") << QString("#communi") << QString("/JOIN") << QString(); - QTest::newRow("join2") << QString("#communi") << QString("/JOIN #chan") << QString("JOIN #chan"); - QTest::newRow("join3") << QString("#communi") << QString("/JOIN #chan secret") << QString("JOIN #chan secret"); - QTest::newRow("join4") << QString("#communi") << QString("/JOIN #chan too secret") << QString(); - - QTest::newRow("part1") << QString("#communi") << QString("/PART") << QString("PART #communi"); - QTest::newRow("part2") << QString("#communi") << QString("/PART #communi") << QString("PART #communi"); - QTest::newRow("part3") << QString("#communi") << QString("/PART #not-exist") << QString("PART #communi :#not-exist"); - QTest::newRow("part4") << QString("#communi") << QString("/PART hasta la vista") << QString("PART #communi :hasta la vista"); - QTest::newRow("part5") << QString("#communi") << QString("/PART #chan hasta la vista") << QString("PART #communi :#chan hasta la vista"); - - QTest::newRow("kick1") << QString("#communi") << QString("/KICK") << QString(); - QTest::newRow("kick2") << QString("#communi") << QString("/KICK #communi") << QString(); - QTest::newRow("kick3") << QString("#communi") << QString("/KICK jpnurmi") << QString("KICK #communi jpnurmi"); - QTest::newRow("kick4") << QString("jpnurmi") << QString("/KICK jpnurmi") << QString(); - QTest::newRow("kick5") << QString("#communi") << QString("/KICK #communi jpnurmi") << QString("KICK #communi jpnurmi"); - QTest::newRow("kick6") << QString("jpnurmi") << QString("/KICK jpnurmi jpnurmi") << QString(); - QTest::newRow("kick7") << QString("#communi") << QString("/KICK #communi jpnurmi hasta la vista") << QString("KICK #communi jpnurmi :hasta la vista"); - QTest::newRow("kick8") << QString("jpnurmi") << QString("/KICK jpnurmi jpnurmi hasta la vista") << QString(); - QTest::newRow("kick9") << QString("#communi") << QString("/KICK jpnurmi hasta la vista") << QString("KICK #communi jpnurmi :hasta la vista"); - - QTest::newRow("me1") << QString("jpnurmi") << QString("/ME") << QString(); - QTest::newRow("me2") << QString("#communi") << QString("/ME loves communi") << QString("PRIVMSG #communi :\1ACTION loves communi\1"); - QTest::newRow("me3") << QString("jpnurmi") << QString("/ME loves communi") << QString("PRIVMSG jpnurmi :\1ACTION loves communi\1"); - - QTest::newRow("action1") << QString("jpnurmi") << QString("/ACTION") << QString(); - QTest::newRow("action2") << QString("#communi") << QString("/ACTION #communi loves communi") << QString("PRIVMSG #communi :\1ACTION loves communi\1"); - QTest::newRow("action3") << QString("jpnurmi") << QString("/ACTION jpnurmi loves communi") << QString("PRIVMSG jpnurmi :\1ACTION loves communi\1"); - QTest::newRow("action4") << QString("jpnurmi") << QString("/ACTION #communi loves communi") << QString("PRIVMSG #communi :\1ACTION loves communi\1"); -} - -void tst_IrcCommandParser::testParse() -{ - QFETCH(QString, target); - QFETCH(QString, input); - QFETCH(QString, output); - - IrcCommandParser parser; - parser.setTolerant(true); - parser.setTriggers(QStringList("/")); - QCOMPARE(parser.triggers(), QStringList("/")); - - parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); - parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); - parser.addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); - parser.addCommand(IrcCommand::CtcpAction, "ME [target] "); - parser.addCommand(IrcCommand::CtcpAction, "ACTION "); - - parser.setTarget(target); - parser.setChannels(QStringList() << "#freenode" << "#communi"); - - IrcCommand* cmd = parser.parse(input); - QCOMPARE(cmd ? cmd->toString() : QString(), output); -} - -void tst_IrcCommandParser::testTriggers() -{ - IrcCommandParser parser; - parser.setTriggers(QStringList("/")); - parser.addCommand(IrcCommand::Join, "JOIN #channel"); - parser.setTarget("#target"); - - QSignalSpy triggerSpy(&parser, SIGNAL(triggersChanged(QStringList))); - QVERIFY(triggerSpy.isValid()); - - parser.setTriggers(QStringList("!")); - QCOMPARE(parser.triggers(), QStringList("!")); - QCOMPARE(triggerSpy.count(), 1); - QCOMPARE(triggerSpy.last().at(0).toStringList(), QStringList("!")); - - IrcCommand* cmd = parser.parse("!join #communi"); - QVERIFY(cmd); - QCOMPARE(cmd->type(), IrcCommand::Join); - QCOMPARE(cmd->toString(), QString("JOIN #communi")); - delete cmd; - - parser.setTriggers(QStringList()); - QCOMPARE(parser.triggers(), QStringList()); - QCOMPARE(triggerSpy.count(), 2); - QCOMPARE(triggerSpy.last().at(0).toStringList(), QStringList()); - - cmd = parser.parse("!join #communi"); - QVERIFY(!cmd); - - parser.setTolerant(true); - cmd = parser.parse("!join #communi"); - QCOMPARE(cmd->type(), IrcCommand::Message); - QCOMPARE(cmd->toString(), QString("PRIVMSG #target :!join #communi")); - delete cmd; - - QVERIFY(!parser.parse("")); -} - -void tst_IrcCommandParser::testTarget() -{ - IrcCommandParser parser; - QVERIFY(parser.target().isEmpty()); - - QSignalSpy targetSpy(&parser, SIGNAL(targetChanged(QString))); - QVERIFY(targetSpy.isValid()); - - parser.setTarget("#tgt"); - QCOMPARE(parser.target(), QString("#tgt")); - QCOMPARE(targetSpy.count(), 1); - QCOMPARE(targetSpy.last().at(0).toString(), QString("#tgt")); - - parser.setTarget("#tgt"); - QCOMPARE(targetSpy.count(), 1); - - parser.setTarget(QString()); - QCOMPARE(parser.target(), QString()); - QCOMPARE(targetSpy.count(), 2); - QCOMPARE(targetSpy.last().at(0).toString(), QString()); -} - -void tst_IrcCommandParser::testChannels() -{ - IrcCommandParser parser; - QVERIFY(parser.channels().isEmpty()); - - QSignalSpy channelSpy(&parser, SIGNAL(channelsChanged(QStringList))); - QVERIFY(channelSpy.isValid()); - - parser.setChannels(QStringList() << "#foo" << "#bar"); - QCOMPARE(parser.channels(), QStringList() << "#foo" << "#bar"); - QCOMPARE(channelSpy.count(), 1); - QCOMPARE(channelSpy.last().at(0).toStringList(), QStringList() << "#foo" << "#bar"); - - parser.setChannels(QStringList() << "#foo" << "#bar"); - QCOMPARE(parser.channels(), QStringList() << "#foo" << "#bar"); - QCOMPARE(channelSpy.count(), 1); - - parser.setChannels(QStringList()); - QCOMPARE(parser.channels(), QStringList()); - QCOMPARE(channelSpy.count(), 2); - QCOMPARE(channelSpy.last().at(0).toStringList(), QStringList()); -} - -void tst_IrcCommandParser::testCommands() -{ - IrcCommandParser parser; - - QSignalSpy commandSpy(&parser, SIGNAL(commandsChanged(QStringList))); - QVERIFY(commandSpy.isValid()); - - parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); - parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); - parser.addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); - parser.addCommand(IrcCommand::CtcpAction, "ME [target] "); - parser.addCommand(IrcCommand::CtcpAction, "ACTION "); - - QCOMPARE(parser.commands().count(), 5); - QCOMPARE(parser.commands(), QStringList() << "ACTION" << "JOIN" << "KICK" << "ME" << "PART"); - - QCOMPARE(commandSpy.count(), 5); - QCOMPARE(commandSpy.at(0).at(0).toStringList(), QStringList() << "JOIN"); - QCOMPARE(commandSpy.at(1).at(0).toStringList(), QStringList() << "JOIN" << "PART"); - QCOMPARE(commandSpy.at(2).at(0).toStringList(), QStringList() << "JOIN" << "KICK" << "PART"); - QCOMPARE(commandSpy.at(3).at(0).toStringList(), QStringList() << "JOIN" << "KICK" << "ME" << "PART"); - QCOMPARE(commandSpy.at(4).at(0).toStringList(), QStringList() << "ACTION" << "JOIN" << "KICK" << "ME" << "PART"); -} - -void tst_IrcCommandParser::testClear() -{ - IrcCommandParser parser; - parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); - parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); - parser.addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); - parser.addCommand(IrcCommand::CtcpAction, "ME [target] "); - parser.addCommand(IrcCommand::CtcpAction, "ACTION "); - QCOMPARE(parser.commands().count(), 5); - - QSignalSpy commandSpy(&parser, SIGNAL(commandsChanged(QStringList))); - QVERIFY(commandSpy.isValid()); - - parser.clear(); - QVERIFY(parser.commands().isEmpty()); - QCOMPARE(commandSpy.count(), 1); - QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList()); - - parser.clear(); - QVERIFY(parser.commands().isEmpty()); - QCOMPARE(commandSpy.count(), 1); -} - -void tst_IrcCommandParser::testReset() -{ - IrcCommandParser parser; - - QSignalSpy targetSpy(&parser, SIGNAL(targetChanged(QString))); - QVERIFY(targetSpy.isValid()); - - QSignalSpy channelSpy(&parser, SIGNAL(channelsChanged(QStringList))); - QVERIFY(channelSpy.isValid()); - - parser.setTarget("#tgt"); - QCOMPARE(targetSpy.count(), 1); - QCOMPARE(targetSpy.last().at(0).toString(), QString("#tgt")); - - parser.setChannels(QStringList() << "#foo" << "#bar"); - QCOMPARE(channelSpy.count(), 1); - QCOMPARE(channelSpy.last().at(0).toStringList(), QStringList() << "#foo" << "#bar"); - - parser.reset(); - - QCOMPARE(targetSpy.count(), 2); - QCOMPARE(targetSpy.last().at(0).toString(), QString()); - - QCOMPARE(channelSpy.count(), 2); - QCOMPARE(channelSpy.last().at(0).toStringList(), QStringList()); - - parser.reset(); - QCOMPARE(targetSpy.count(), 2); - QCOMPARE(channelSpy.count(), 2); -} - -void tst_IrcCommandParser::testAddRemove() -{ - IrcCommandParser parser; - QVERIFY(parser.commands().isEmpty()); - - QSignalSpy commandSpy(&parser, SIGNAL(commandsChanged(QStringList))); - QVERIFY(commandSpy.isValid()); - - parser.addCommand(IrcCommand::Join, "join <#channel> ()"); - QCOMPARE(parser.commands(), QStringList() << "JOIN"); - QCOMPARE(commandSpy.count(), 1); - QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "JOIN"); - - parser.addCommand(IrcCommand::Join, "join "); - QCOMPARE(parser.commands(), QStringList() << "JOIN"); - QCOMPARE(commandSpy.count(), 1); - QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "JOIN"); - - parser.addCommand(IrcCommand::Part, "Part (<#channel>) ()"); - QCOMPARE(parser.commands(), QStringList() << "JOIN" << "PART"); - QCOMPARE(commandSpy.count(), 2); - QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "JOIN" << "PART"); - - parser.addCommand(IrcCommand::Part, "PART "); - QCOMPARE(parser.commands(), QStringList() << "JOIN" << "PART"); - QCOMPARE(commandSpy.count(), 2); - QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "JOIN" << "PART"); - - parser.removeCommand(IrcCommand::Join); - QCOMPARE(parser.commands(), QStringList() << "PART"); - QCOMPARE(commandSpy.count(), 3); - QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "PART"); - - parser.removeCommand(IrcCommand::Part, "PART "); - QCOMPARE(parser.commands(), QStringList() << "PART"); - QCOMPARE(commandSpy.count(), 3); - QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "PART"); - - parser.removeCommand(IrcCommand::Part, "Part (<#channel>) ()"); - QCOMPARE(parser.commands(), QStringList()); - QCOMPARE(commandSpy.count(), 4); - QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList()); - QVERIFY(parser.commands().isEmpty()); -} - -void tst_IrcCommandParser::testSyntax_data() -{ - QTest::addColumn("command"); - QTest::addColumn("syntax"); - QTest::addColumn("details"); - QTest::addColumn("expected"); - - QTest::newRow("full") - << QString("foo") - << QString("FOO [param] <#chan> () ()") - << uint(IrcCommandParser::Full) - << QString("FOO [param] <#chan> () ()"); - - QTest::newRow("no target") - << QString("fOO") - << QString("FOO [param] <#chan> () ()") - << uint(IrcCommandParser::NoTarget) - << QString("FOO <#chan> () ()"); - - QTest::newRow("no ellipsis") - << QString("fOO") - << QString("FOO [param] <#chan> () ()") - << uint(IrcCommandParser::NoEllipsis) - << QString("FOO [param] <#chan> () ()"); - - QTest::newRow("no prefix") - << QString("fOO") - << QString("FOO [param] <#chan> () ()") - << uint(IrcCommandParser::NoPrefix) - << QString("FOO [param] () ()"); - - QTest::newRow("no parentheses") - << QString("Foo") - << QString("FOO [param] <#chan> () ()") - << uint(IrcCommandParser::NoParentheses) - << QString("FOO [param] <#chan> "); - - QTest::newRow("no brackets") - << QString("FOO") - << QString("FOO [param] <#chan> () ()") - << uint(IrcCommandParser::NoBrackets) - << QString("FOO param <#chan> () ()"); - - QTest::newRow("no angles") - << QString("FOO") - << QString("FOO [param] <#chan> () ()") - << uint(IrcCommandParser::NoAngles) - << QString("FOO [param] #chan (arg) (rest...)"); - - QTest::newRow("visual") - << QString("FOO") - << QString("FOO [param] <#chan> () ()") - << uint(IrcCommandParser::Visual) - << QString("FOO () ()"); -} - -void tst_IrcCommandParser::testSyntax() -{ - QFETCH(QString, command); - QFETCH(QString, syntax); - QFETCH(uint, details); - QFETCH(QString, expected); - - IrcCommandParser parser; - parser.addCommand(IrcCommand::Custom, syntax); - QString actual = parser.syntax(command, IrcCommandParser::Details(details)); - QCOMPARE(actual, expected); -} - -void tst_IrcCommandParser::testTolerancy() -{ - IrcCommandParser parser; - parser.setTriggers(QStringList("/")); - QVERIFY(!parser.isTolerant()); - - IrcCommand* cmd = parser.parse("/NS help"); - QVERIFY(!cmd); - - QSignalSpy tolerancySpy(&parser, SIGNAL(tolerancyChanged(bool))); - QVERIFY(tolerancySpy.isValid()); - - parser.setTolerant(true); - QVERIFY(parser.isTolerant()); - QCOMPARE(tolerancySpy.count(), 1); - QCOMPARE(tolerancySpy.last().at(0).toBool(), true); - - parser.setTolerant(true); - QVERIFY(parser.isTolerant()); - QCOMPARE(tolerancySpy.count(), 1); - - cmd = parser.parse("/NS help"); - QVERIFY(cmd); - QCOMPARE(cmd->type(), IrcCommand::Quote); - QCOMPARE(cmd->toString(), QString("NS help")); - - parser.setTolerant(false); - QVERIFY(!parser.isTolerant()); - QCOMPARE(tolerancySpy.count(), 2); - QCOMPARE(tolerancySpy.last().at(0).toBool(), false); -} - -void tst_IrcCommandParser::testCustom() -{ - IrcCommandParser parser; - parser.setTriggers(QStringList("/")); - - parser.addCommand(IrcCommand::Custom, "Hello "); - QCOMPARE(parser.commands(), QStringList() << "HELLO"); - QCOMPARE(parser.syntax("HELLO"), QString("HELLO ")); - - QVERIFY(!parser.parse("/hello")); - QVERIFY(!parser.parse("/hello foo")); - QVERIFY(!parser.parse("/hello foo bar")); - QVERIFY(!parser.parse("/hello foo bar foo baz")); - - IrcCommand* cmd = parser.parse("/hello foo bar baz"); - QVERIFY(cmd); - QCOMPARE(cmd->type(), IrcCommand::Custom); - QCOMPARE(cmd->parameters(), QStringList() << "HELLO" << "foo" << "bar" << "baz"); - delete cmd; -} - -void tst_IrcCommandParser::testWhitespace() -{ - IrcCommandParser parser; - parser.setTriggers(QStringList("/")); - parser.addCommand(IrcCommand::Custom, "TEST "); - - IrcCommand* cmd = parser.parse("/test foo bar baz"); - QVERIFY(cmd); - QCOMPARE(cmd->type(), IrcCommand::Custom); - QCOMPARE(cmd->parameters(), QStringList() << "TEST" << "foo bar baz"); - delete cmd; -} - -QTEST_MAIN(tst_IrcCommandParser) - -#include "tst_irccommandparser.moc" diff --git a/libcommuni/tests/auto/irccompleter/irccompleter.pro b/libcommuni/tests/auto/irccompleter/irccompleter.pro deleted file mode 100644 index 5d8306a..0000000 --- a/libcommuni/tests/auto/irccompleter/irccompleter.pro +++ /dev/null @@ -1,8 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_irccompleter.cpp - -include(../shared/shared.pri) -include(../auto.pri) diff --git a/libcommuni/tests/auto/irccompleter/tst_irccompleter.cpp b/libcommuni/tests/auto/irccompleter/tst_irccompleter.cpp deleted file mode 100644 index 5eef644..0000000 --- a/libcommuni/tests/auto/irccompleter/tst_irccompleter.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "irccompleter.h" -#include "ircbuffermodel.h" -#include "irccommandparser.h" -#include "ircchannel.h" -#include "ircbuffer.h" -#include -#include "tst_ircclientserver.h" -#include "tst_ircdata.h" - -class tst_IrcCompleter : public tst_IrcClientServer -{ - Q_OBJECT - -private slots: - void testSuffix(); - void testBuffer(); - void testParser(); - - void testCompletion_data(); - void testCompletion(); - - void testReset(); -}; - -void tst_IrcCompleter::testSuffix() -{ - IrcCompleter completer; - QCOMPARE(completer.suffix(), QString(":")); - QCOMPARE(completer.property("suffix").toString(), QString(":")); - - QSignalSpy spy(&completer, SIGNAL(suffixChanged(QString))); - QVERIFY(spy.isValid()); - - completer.setSuffix(","); - QCOMPARE(completer.suffix(), QString(",")); - QCOMPARE(completer.property("suffix").toString(), QString(",")); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.last().at(0).toString(), QString(",")); -} - -void tst_IrcCompleter::testBuffer() -{ - qRegisterMetaType("IrcBuffer*"); - - IrcCompleter completer; - QVERIFY(!completer.buffer()); - - QSignalSpy spy(&completer, SIGNAL(bufferChanged(IrcBuffer*))); - QVERIFY(spy.isValid()); - - IrcBuffer* buffer = new IrcBuffer(&completer); - completer.setBuffer(buffer); - QCOMPARE(completer.buffer(), buffer); - QCOMPARE(completer.property("buffer").value(), buffer); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.last().at(0).value(), buffer); - - completer.setBuffer(0); - QVERIFY(!completer.buffer()); - QCOMPARE(spy.count(), 2); - QVERIFY(!spy.last().at(0).value()); -} - -void tst_IrcCompleter::testParser() -{ - qRegisterMetaType("IrcCommandParser*"); - - IrcCompleter completer; - QVERIFY(!completer.parser()); - - QSignalSpy spy(&completer, SIGNAL(parserChanged(IrcCommandParser*))); - QVERIFY(spy.isValid()); - - IrcCommandParser* parser = new IrcCommandParser(&completer); - completer.setParser(parser); - QCOMPARE(completer.parser(), parser); - QCOMPARE(completer.property("parser").value(), parser); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.last().at(0).value(), parser); - - completer.setParser(0); - QVERIFY(!completer.parser()); - QCOMPARE(spy.count(), 2); - QVERIFY(!spy.last().at(0).value()); -} - -Q_DECLARE_METATYPE(QList) -void tst_IrcCompleter::testCompletion_data() -{ - QTest::addColumn("suffix"); - QTest::addColumn("text"); - QTest::addColumn("cursor"); - QTest::addColumn("completions"); - QTest::addColumn >("positions"); - - for (int i = -1; i <= 3; ++i) - QTest::newRow("/j @ " + QByteArray::number(i)) << QString() << "/j" << i << QStringList("/JOIN ") << (QList() << QString("/JOIN ").length()); - - QTest::newRow("/q #2") << QString() << "/q" << QString("/q").length() - << (QStringList() << "/QUERY " << "/QUIT ") - << (QList() << QString("/QUERY ").length() << QString("/QUIT ").length()); - - QTest::newRow("/QUERY q") << QString() << "/quer q " << QString("/quer").length() - << (QStringList("/QUERY q ")) - << (QList() << QString("/QUERY ").length()); - - QTest::newRow("/query q") << QString() << "/query q" << QString("/query q").length() - << (QStringList() << "/query quackgyver " << "/query quelx ") - << (QList() << QString("/query quackgyver ").length() << QString("/query quelx ").length()); - - QTest::newRow("buffers") << QString() << "q" << QString("q").length() - << (QStringList() << "quackgyver " << "quelx ") - << (QList() << QString("quackgyver ").length() << QString("quelx ").length()); - - QTest::newRow("repeat") << QString() << "qtassistant " << QString("qtassistant ").length() - << (QStringList() << "qtassistant " << "qtassistant ") - << (QList() << QString("qtassistant ").length() << QString("qtassistant ").length()); - - QStringList names1; - QStringList names2; - QList positions; - foreach (const QString& name, tst_IrcData::names()) { - if (name.startsWith("je", Qt::CaseInsensitive)) { - names1 += name + ": "; - names2 += name + ", "; - positions += name.length() + 2; - } - } - QTest::newRow("je...:") << ":" << "je" << 1 << names1 << positions; - QTest::newRow("je...,") << "," << "je" << 1 << names2 << positions; - - names1.clear(); - names2.clear(); - positions.clear(); - foreach (const QString& name, tst_IrcData::names()) { - if (name.startsWith("sa", Qt::CaseInsensitive)) { - names1 += "... " + name + " "; - positions += QString("... ").length() + name.length() + QString(" ").length(); - } - } - QTest::newRow("... sa") << QString() << "... sa" << QString("... ").length() << names1 << positions; - - QTest::newRow("spaces") << QString() << "/quit foo qt rest... " << QString("/quit foo qt ").length() - << QStringList("/quit foo qtassistant rest... ") - << (QList() << QString("/quit foo qtassistant ").length()); -} - -void tst_IrcCompleter::testCompletion() -{ - QFETCH(QString, suffix); - QFETCH(QString, text); - QFETCH(int, cursor); - QFETCH(QStringList, completions); - QFETCH(QList, positions); - - IrcBufferModel model(connection); - - connection->open(); - waitForOpened(); - waitForWritten(tst_IrcData::welcome()); - waitForWritten(tst_IrcData::join()); - - model.add("qout"); - model.add("qtassistant"); - - IrcCommandParser parser; - parser.setTriggers(QStringList("/")); - parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); - parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); - parser.addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); - parser.addCommand(IrcCommand::CtcpAction, "ME [target] "); - parser.addCommand(IrcCommand::CtcpAction, "ACTION "); - parser.addCommand(IrcCommand::Custom, "QUERY "); - parser.addCommand(IrcCommand::Quit, "QUIT ()"); - - IrcCompleter completer; - completer.setSuffix(suffix); - completer.setBuffer(model.get(0)); - completer.setParser(&parser); - - QSignalSpy spy(&completer, SIGNAL(completed(QString,int))); - QVERIFY(spy.isValid()); - - for (int i = 0; i < completions.count(); ++i) { - completer.complete(text, cursor); - QCOMPARE(spy.count(), i + 1); - QCOMPARE(spy.last().at(0).toString(), completions.at(i)); - QCOMPARE(spy.last().at(1).toInt(), positions.at(i)); - } -} - -void tst_IrcCompleter::testReset() -{ - IrcBufferModel model(connection); - connection->open(); - waitForOpened(); - waitForWritten(tst_IrcData::welcome()); - waitForWritten(tst_IrcData::join()); - IrcChannel* channel = model.get(0)->toChannel(); - QVERIFY(channel); - - IrcCompleter completer; - completer.setBuffer(channel); - - QSignalSpy spy(&completer, SIGNAL(completed(QString,int))); - QVERIFY(spy.isValid()); - - completer.complete("Guest", 5); - QCOMPARE(spy.count(), 1); - QString guest1 = spy.last().at(0).toString(); - QVERIFY(guest1.startsWith("Guest")); - - completer.complete("Guest", 5); - QCOMPARE(spy.count(), 2); - QString guest2 = spy.last().at(0).toString(); - QVERIFY(guest2.startsWith("Guest")); - QVERIFY(guest2 != guest1); - - completer.reset(); - completer.complete("Guest", 5); - QCOMPARE(spy.count(), 3); - QString guest3 = spy.last().at(0).toString(); - QCOMPARE(guest3, guest1); -} - -QTEST_MAIN(tst_IrcCompleter) - -#include "tst_irccompleter.moc" diff --git a/libcommuni/tests/auto/ircconnection/ircconnection.pro b/libcommuni/tests/auto/ircconnection/ircconnection.pro deleted file mode 100644 index f505a2b..0000000 --- a/libcommuni/tests/auto/ircconnection/ircconnection.pro +++ /dev/null @@ -1,11 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircconnection.cpp - -# FakeQmlConnection::createCtcpReply() -*g++*|*clang*:QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual - -include(../shared/shared.pri) -include(../auto.pri) diff --git a/libcommuni/tests/auto/ircconnection/tst_ircconnection.cpp b/libcommuni/tests/auto/ircconnection/tst_ircconnection.cpp deleted file mode 100644 index 6f52b92..0000000 --- a/libcommuni/tests/auto/ircconnection/tst_ircconnection.cpp +++ /dev/null @@ -1,1721 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "irc.h" -#include "irccommand.h" -#include "ircprotocol.h" -#include "ircconnection.h" -#include "ircmessage.h" -#include "ircfilter.h" -#include -#include -#include -#include -#ifndef QT_NO_OPENSSL -#include -#endif - -#include "tst_ircdata.h" -#include "tst_ircclientserver.h" - -class FriendlyConnection : public IrcConnection -{ - friend class tst_IrcConnection; -}; - -class TestProtocol : public IrcProtocol -{ -public: - TestProtocol(IrcConnection* connection) : IrcProtocol(connection) - { - } - - virtual bool write(const QByteArray& data) - { - written = data; - return IrcProtocol::write(data); - } - - QByteArray written; -}; - -class tst_IrcConnection : public tst_IrcClientServer -{ - Q_OBJECT - -private slots: - void testDefaults(); - - void testHost_data(); - void testHost(); - - void testPort_data(); - void testPort(); - - void testUserName_data(); - void testUserName(); - - void testNickName_data(); - void testNickName(); - - void testRealName_data(); - void testRealName(); - - void testPassword_data(); - void testPassword(); - - void testDisplayName_data(); - void testDisplayName(); - - void testEncoding_data(); - void testEncoding(); - - void testSocket_data(); - void testSocket(); - - void testSecure(); - void testSasl(); - void testNoSasl(); - void testSsl(); - - void testOpen(); - void testEnabled(); - - void testStatus(); - void testConnection(); - void testMessages(); - void testMessageFlags(); - void testMessageBuilder(); - - void testSendCommand(); - void testSendData(); - - void testMessageFilter(); - void testCommandFilter(); - - void testDebug(); - void testWarnings(); - - void testCtcp(); -}; - -void tst_IrcConnection::testDefaults() -{ - IrcConnection connection; - QVERIFY(connection.host().isNull()); - QCOMPARE(connection.port(), 6667); - QVERIFY(connection.userName().isNull()); - QVERIFY(connection.nickName().isNull()); - QVERIFY(connection.realName().isNull()); - QVERIFY(connection.password().isNull()); - QVERIFY(connection.displayName().isNull()); - QCOMPARE(connection.encoding(), QByteArray("ISO-8859-15")); - QCOMPARE(connection.status(), IrcConnection::Inactive); - QVERIFY(!connection.isActive()); - QVERIFY(!connection.isConnected()); - QVERIFY(connection.isEnabled()); - QCOMPARE(connection.reconnectDelay(), 0); - QVERIFY(connection.socket()); - QVERIFY(!connection.isSecure()); - QVERIFY(connection.saslMechanism().isNull()); - QVERIFY(!IrcConnection::supportedSaslMechanisms().isEmpty()); - QVERIFY(connection.network()); -} - -void tst_IrcConnection::testHost_data() -{ - QTest::addColumn("host"); - - QTest::newRow("null") << QString(); - QTest::newRow("empty") << QString(""); - QTest::newRow("space") << QString(" "); - QTest::newRow("invalid") << QString("invalid"); - QTest::newRow("local") << QString("127.0.0.1"); -} - -void tst_IrcConnection::testHost() -{ - QFETCH(QString, host); - - IrcConnection connection; - QSignalSpy spy(&connection, SIGNAL(hostChanged(QString))); - QVERIFY(spy.isValid()); - connection.setHost(host); - QCOMPARE(connection.host(), host); - QCOMPARE(spy.count(), !host.isEmpty() ? 1 : 0); - if (!spy.isEmpty()) - QCOMPARE(spy.first().first().toString(), host); - - IrcConnection another(host); - QCOMPARE(another.host(), host); -} - -void tst_IrcConnection::testPort_data() -{ - QTest::addColumn("port"); - - QTest::newRow("-1") << -1; - QTest::newRow("0") << 0; - QTest::newRow("6666") << 6666; - QTest::newRow("6667") << 6667; - QTest::newRow("6668") << 6668; -} - -void tst_IrcConnection::testPort() -{ - QFETCH(int, port); - - IrcConnection connection; - QSignalSpy spy(&connection, SIGNAL(portChanged(int))); - QVERIFY(spy.isValid()); - connection.setPort(port); - QCOMPARE(connection.port(), port); - QCOMPARE(spy.count(), port != 6667 ? 1 : 0); - if (!spy.isEmpty()) - QCOMPARE(spy.first().first().toInt(), port); -} - -void tst_IrcConnection::testUserName_data() -{ - QTest::addColumn("name"); - QTest::addColumn("result"); - - QTest::newRow("null") << QString() << QString(); - QTest::newRow("empty") << QString("") << QString(""); - QTest::newRow("space") << QString(" ") << QString(""); - QTest::newRow("spaces") << QString(" foo bar ") << QString("foo"); -} - -void tst_IrcConnection::testUserName() -{ - QFETCH(QString, name); - QFETCH(QString, result); - - IrcConnection connection; - QSignalSpy spy(&connection, SIGNAL(userNameChanged(QString))); - QVERIFY(spy.isValid()); - connection.setUserName(name); - QCOMPARE(connection.userName(), result); - QCOMPARE(spy.count(), !result.isEmpty() ? 1 : 0); - if (!spy.isEmpty()) - QCOMPARE(spy.first().first().toString(), result); -} - -void tst_IrcConnection::testNickName_data() -{ - QTest::addColumn("name"); - QTest::addColumn("result"); - - QTest::newRow("null") << QString() << QString(); - QTest::newRow("empty") << QString("") << QString(""); - QTest::newRow("space") << QString(" ") << QString(""); - QTest::newRow("spaces") << QString(" foo bar ") << QString("foo"); -} - -void tst_IrcConnection::testNickName() -{ - QFETCH(QString, name); - QFETCH(QString, result); - - IrcConnection connection; - QSignalSpy spy(&connection, SIGNAL(nickNameChanged(QString))); - QVERIFY(spy.isValid()); - connection.setNickName(name); - QCOMPARE(connection.nickName(), result); - QCOMPARE(spy.count(), !result.isEmpty() ? 1 : 0); - if (!spy.isEmpty()) - QCOMPARE(spy.first().first().toString(), result); -} - -void tst_IrcConnection::testRealName_data() -{ - QTest::addColumn("name"); - QTest::addColumn("result"); - - QTest::newRow("null") << QString() << QString(); - QTest::newRow("empty") << QString("") << QString(""); - QTest::newRow("space") << QString(" ") << QString(" "); - QTest::newRow("spaces") << QString(" foo bar ") << QString(" foo bar "); -} - -void tst_IrcConnection::testRealName() -{ - QFETCH(QString, name); - QFETCH(QString, result); - - IrcConnection connection; - QSignalSpy spy(&connection, SIGNAL(realNameChanged(QString))); - QVERIFY(spy.isValid()); - connection.setRealName(name); - QCOMPARE(connection.realName(), result); - QCOMPARE(spy.count(), !result.isEmpty() ? 1 : 0); - if (!spy.isEmpty()) - QCOMPARE(spy.first().first().toString(), result); -} - -void tst_IrcConnection::testPassword_data() -{ - QTest::addColumn("passwd"); - QTest::addColumn("result"); - - QTest::newRow("null") << QString() << QString(); - QTest::newRow("empty") << QString("") << QString(""); - QTest::newRow("space") << QString(" ") << QString(" "); - QTest::newRow("spaces") << QString(" foo bar ") << QString(" foo bar "); -} - -void tst_IrcConnection::testPassword() -{ - QFETCH(QString, passwd); - QFETCH(QString, result); - - IrcConnection connection; - QSignalSpy spy(&connection, SIGNAL(passwordChanged(QString))); - QVERIFY(spy.isValid()); - connection.setPassword(passwd); - QCOMPARE(connection.password(), result); - QCOMPARE(spy.count(), !result.isEmpty() ? 1 : 0); - if (!spy.isEmpty()) - QCOMPARE(spy.first().first().toString(), result); -} - -void tst_IrcConnection::testDisplayName_data() -{ - QTest::addColumn("host"); - QTest::addColumn("name"); - QTest::addColumn("result"); - - QTest::newRow("null") << QString() << QString() << QString(); - QTest::newRow("empty") << QString() << QString("") << QString(""); - QTest::newRow("space") << QString() << QString(" ") << QString(" "); - - QTest::newRow("host") << QString("host") << QString() << QString("host"); - QTest::newRow("name") << QString() << QString("name") << QString("name"); - QTest::newRow("explicit") << QString("host") << QString("name") << QString("name"); -} - -void tst_IrcConnection::testDisplayName() -{ - QFETCH(QString, host); - QFETCH(QString, name); - QFETCH(QString, result); - - IrcConnection connection; - connection.setHost(host); - connection.setDisplayName(name); - QCOMPARE(connection.displayName(), result); -} - -void tst_IrcConnection::testEncoding_data() -{ - QTest::addColumn("encoding"); - QTest::addColumn("actual"); - QTest::addColumn("supported"); - - QTest::newRow("null") << QByteArray() << QByteArray("ISO-8859-15") << false; - QTest::newRow("empty") << QByteArray("") << QByteArray("ISO-8859-15") << false; - QTest::newRow("space") << QByteArray(" ") << QByteArray("ISO-8859-15") << false; - QTest::newRow("invalid") << QByteArray("invalid") << QByteArray("ISO-8859-15") << false; - foreach (const QByteArray& codec, QTextCodec::availableCodecs()) - QTest::newRow(codec) << codec << codec << true; -} - -void tst_IrcConnection::testEncoding() -{ - QFETCH(QByteArray, encoding); - QFETCH(QByteArray, actual); - QFETCH(bool, supported); - - if (!supported) - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setEncoding(): unsupported encoding \"" + encoding + "\" "); - - IrcConnection connection; - connection.setEncoding(encoding); - QCOMPARE(connection.encoding(), actual); -} - -Q_DECLARE_METATYPE(QAbstractSocket*) -void tst_IrcConnection::testSocket_data() -{ - QTest::addColumn("socket"); - - QTest::newRow("null") << static_cast(0); - QTest::newRow("tcp") << static_cast(new QTcpSocket(this)); -#ifndef QT_NO_OPENSSL - QTest::newRow("ssl") << static_cast(new QSslSocket(this)); -#endif -} - -void tst_IrcConnection::testSocket() -{ - QFETCH(QAbstractSocket*, socket); - - IrcConnection connection; - connection.setSocket(socket); - QCOMPARE(connection.socket(), socket); - QCOMPARE(connection.isSecure(), socket && socket->inherits("QSslSocket")); -} - -void tst_IrcConnection::testSecure() -{ - IrcConnection connection; - QSignalSpy spy(&connection, SIGNAL(secureChanged(bool))); - QVERIFY(spy.isValid()); - QVERIFY(!connection.isSecure()); - -#ifdef QT_NO_OPENSSL - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setSecure(): the Qt build does not support SSL"); -#endif - - connection.setSecure(true); - -#ifndef QT_NO_OPENSSL - QVERIFY(connection.isSecure()); - QVERIFY(connection.socket()->inherits("QSslSocket")); - QCOMPARE(spy.count(), 1); - QVERIFY(spy.first().first().toBool()); -#else - QVERIFY(!connection.isSecure()); - QVERIFY(!connection.socket()->inherits("QSslSocket")); - QCOMPARE(spy.count(), 0); -#endif - - connection.setSecure(false); - QVERIFY(!connection.isSecure()); - QVERIFY(!connection.socket()->inherits("QSslSocket")); -#ifndef QT_NO_OPENSSL - QCOMPARE(spy.count(), 2); - QVERIFY(!spy.last().last().toBool()); -#else - QCOMPARE(spy.count(), 0); -#endif -} - -void tst_IrcConnection::testSasl() -{ - QVERIFY(!IrcConnection::supportedSaslMechanisms().contains("UNKNOWN")); - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setSaslMechanism(): unsupported mechanism: 'UNKNOWN'"); - connection->setSaslMechanism("UNKNOWN"); - QVERIFY(connection->saslMechanism().isEmpty()); - - IrcProtocol* protocol = static_cast(connection.data())->protocol(); - QVERIFY(protocol); - - QVERIFY(IrcConnection::supportedSaslMechanisms().contains("PLAIN")); - connection->setSaslMechanism("PLAIN"); - QCOMPARE(connection->saslMechanism(), QString("PLAIN")); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(clientSocket->waitForBytesWritten(1000)); - QVERIFY(serverSocket->waitForReadyRead(1000)); - QByteArray written = serverSocket->readAll(); - QVERIFY(written.contains("CAP LS")); - QVERIFY(written.contains("NICK nick")); - QVERIFY(!written.contains("PASS secret")); - QVERIFY(!written.contains("CAP REQ :sasl")); - - QVERIFY(waitForWritten(":irc.freenode.net CAP * LS :sasl")); - QVERIFY(clientSocket->waitForBytesWritten(1000)); - QVERIFY(serverSocket->waitForReadyRead(1000)); - written = serverSocket->readAll(); - QVERIFY(!written.contains("CAP LS")); - QVERIFY(!written.contains("NICK nick")); - QVERIFY(!written.contains("PASS secret")); - QVERIFY(written.contains("CAP REQ :sasl")); - - // do not resume handshake too early - QCoreApplication::sendPostedEvents(protocol, QEvent::MetaCall); - QVERIFY(!clientSocket->waitForBytesWritten(1000)); - - QVERIFY(waitForWritten(":irc.freenode.net CAP user ACK :sasl")); - QVERIFY(clientSocket->waitForBytesWritten(1000)); - QVERIFY(serverSocket->waitForReadyRead(1000)); - QVERIFY(serverSocket->readAll().contains("AUTHENTICATE PLAIN")); - - QVERIFY(waitForWritten("AUTHENTICATE +")); - QVERIFY(clientSocket->waitForBytesWritten(1000)); - QVERIFY(serverSocket->waitForReadyRead(1000)); - - QByteArray response = serverSocket->readAll(); - int index = response.indexOf("AUTHENTICATE"); - QVERIFY(index != -1); - QByteArray secret = response.mid(index + 13); - index = secret.indexOf("\r\n"); - QVERIFY(index != -1); - secret.truncate(index + 1); - secret = QByteArray::fromBase64(secret); - QByteArray expected = connection->userName().toUtf8() + '\0' + - connection->userName().toUtf8() + '\0' + - connection->password().toUtf8(); - QCOMPARE(secret, expected); - - // resume handshake - QCoreApplication::sendPostedEvents(protocol, QEvent::MetaCall); - - QVERIFY(clientSocket->waitForBytesWritten(1000)); - QVERIFY(serverSocket->waitForReadyRead(1000)); - QVERIFY(serverSocket->readAll().contains("CAP END")); - - // TODO: - QVERIFY(waitForWritten(":irc.freenode.net 900 user nick!user@host nick :You are now logged in as user.")); - QVERIFY(waitForWritten(":irc.freenode.net 903 user :SASL authentication successful")); - QVERIFY(waitForWritten(":irc.freenode.net 001 user :Welcome to the freenode Internet Relay Chat Network user")); -} - -void tst_IrcConnection::testNoSasl() -{ - QVERIFY(!IrcConnection::supportedSaslMechanisms().contains("UNKNOWN")); - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setSaslMechanism(): unsupported mechanism: 'UNKNOWN'"); - connection->setSaslMechanism("UNKNOWN"); - QVERIFY(connection->saslMechanism().isEmpty()); - - IrcProtocol* protocol = static_cast(connection.data())->protocol(); - QVERIFY(protocol); - - QVERIFY(IrcConnection::supportedSaslMechanisms().contains("PLAIN")); - connection->setSaslMechanism("PLAIN"); - QCOMPARE(connection->saslMechanism(), QString("PLAIN")); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(clientSocket->waitForBytesWritten(1000)); - QVERIFY(serverSocket->waitForReadyRead(1000)); - QByteArray written = serverSocket->readAll(); - QVERIFY(written.contains("CAP LS")); - QVERIFY(written.contains("NICK nick")); - QVERIFY(!written.contains("PASS secret")); - QVERIFY(!written.contains("CAP REQ :sasl")); - - QVERIFY(waitForWritten(":irc.freenode.net CAP * LS :no s-a-s-l here")); - QVERIFY(!clientSocket->waitForBytesWritten(1000)); - QVERIFY(!serverSocket->waitForReadyRead(1000)); - QVERIFY(serverSocket->readAll().isEmpty()); - - // resume handshake - QCoreApplication::sendPostedEvents(protocol, QEvent::MetaCall); - QVERIFY(clientSocket->waitForBytesWritten(1000)); - QVERIFY(serverSocket->waitForReadyRead(1000)); - written = serverSocket->readAll(); - QVERIFY(written.contains("PASS secret")); - QVERIFY(written.contains("CAP END")); -} - -#ifndef QT_NO_OPENSSL -class SslSocket : public QSslSocket -{ - Q_OBJECT - -public: - SslSocket(QObject* parent) : QSslSocket(parent), clientEncryptionStarted(false) { } - bool clientEncryptionStarted; - -public slots: - void startClientEncryption() - { - clientEncryptionStarted = true; - QSslSocket::startClientEncryption(); - } -}; -#endif // !QT_NO_OPENSSL - -void tst_IrcConnection::testSsl() -{ -#ifndef QT_NO_OPENSSL - SslSocket* socket = new SslSocket(connection); - connection->setSocket(socket); - QCOMPARE(connection->socket(), socket); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(socket->clientEncryptionStarted); -#endif // !QT_NO_OPENSSL -} - -void tst_IrcConnection::testOpen() -{ - IrcConnection connection; - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::open(): host is empty!"); - connection.open(); - QCOMPARE(connection.status(), IrcConnection::Inactive); - - connection.setHost("irc.ser.ver"); - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::open(): userName is empty!"); - connection.open(); - QCOMPARE(connection.status(), IrcConnection::Inactive); - - connection.setUserName("user"); - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::open(): nickName is empty!"); - connection.open(); - QCOMPARE(connection.status(), IrcConnection::Inactive); - - connection.setNickName("nick"); - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::open(): realName is empty!"); - connection.open(); - QCOMPARE(connection.status(), IrcConnection::Inactive); - - connection.setRealName("real"); - connection.open(); - QVERIFY(connection.status() != IrcConnection::Inactive); - - connection.close(); - QCOMPARE(connection.status(), IrcConnection::Closed); - - connection.setEnabled(false); - connection.open(); - QCOMPARE(connection.status(), IrcConnection::Closed); -} - -void tst_IrcConnection::testEnabled() -{ - IrcConnection connection; - QVERIFY(connection.isEnabled()); - - QSignalSpy spy(&connection, SIGNAL(enabledChanged(bool))); - QVERIFY(spy.isValid()); - - connection.setEnabled(false); - QVERIFY(!connection.isEnabled()); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.last().at(0).toBool(), false); - - connection.setDisabled(true); - QVERIFY(!connection.isEnabled()); - QCOMPARE(spy.count(), 1); - - connection.setDisabled(false); - QVERIFY(connection.isEnabled()); - QCOMPARE(spy.count(), 2); - QCOMPARE(spy.last().at(0).toBool(), true); - - connection.setEnabled(true); - QVERIFY(connection.isEnabled()); - QCOMPARE(spy.count(), 2); -} - -void tst_IrcConnection::testStatus() -{ - Irc::registerMetaTypes(); - - QSignalSpy statusSpy(connection, SIGNAL(statusChanged(IrcConnection::Status))); - QSignalSpy connectingSpy(connection, SIGNAL(connecting())); - QSignalSpy connectedSpy(connection, SIGNAL(connected())); - QSignalSpy disconnectedSpy(connection, SIGNAL(disconnected())); - - QVERIFY(statusSpy.isValid()); - QVERIFY(connectingSpy.isValid()); - QVERIFY(connectedSpy.isValid()); - QVERIFY(disconnectedSpy.isValid()); - - int statusCount = 0; - int connectingCount = 0; - int connectedCount = 0; - int disconnectedCount = 0; - - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connecting); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connecting); - QCOMPARE(connectingSpy.count(), ++connectingCount); - - QVERIFY(waitForWritten(tst_IrcData::welcome())); - QVERIFY(connection->isActive()); - QVERIFY(connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connected); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connected); - QCOMPARE(connectedSpy.count(), ++connectedCount); - - clientSocket->close(); - QVERIFY(connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Closing); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Closing); - - connection->close(); - QVERIFY(!connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Closed); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Closed); - QCOMPARE(disconnectedSpy.count(), ++disconnectedCount); - - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connecting); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connecting); - QCOMPARE(connectingSpy.count(), ++connectingCount); - - QVERIFY(waitForWritten(tst_IrcData::welcome())); - QVERIFY(connection->isActive()); - QVERIFY(connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connected); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connected); - QCOMPARE(connectedSpy.count(), ++connectedCount); - - // trigger an error - serverSocket->close(); - QVERIFY(clientSocket->waitForDisconnected(100)); - QVERIFY(!connection->isConnected()); - QVERIFY(!connection->isActive()); - - QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Error); - QCOMPARE(statusSpy.count(), statusCount); - - connection->close(); - QVERIFY(!connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Closed); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Closed); - QCOMPARE(disconnectedSpy.count(), ++disconnectedCount); - - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connecting); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connecting); - QCOMPARE(connectingSpy.count(), ++connectingCount); - - QVERIFY(waitForWritten(tst_IrcData::welcome())); - QVERIFY(connection->isActive()); - QVERIFY(connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connected); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connected); - QCOMPARE(connectedSpy.count(), ++connectedCount); - - // trigger an error - automatic reconnect - connection->setReconnectDelay(1); - serverSocket->close(); - QVERIFY(clientSocket->waitForDisconnected(100)); - QVERIFY(!connection->isConnected()); - QVERIFY(!connection->isActive()); - - QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Error); - QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Waiting); - QCOMPARE(statusSpy.count(), statusCount); - - QEventLoop reconnectLoop; - QTimer::singleShot(2000, &reconnectLoop, SLOT(quit())); - connect(connection, SIGNAL(statusChanged(IrcConnection::Status)), &reconnectLoop, SLOT(quit())); - reconnectLoop.exec(); - - QVERIFY(connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connecting); - QCOMPARE(statusSpy.count(), ++statusCount); - QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connecting); - - QVERIFY(waitForOpened()); - QCOMPARE(connectingSpy.count(), ++connectingCount); - - // trigger an error _after_ quit -> no automatic reconnect - connection->quit(); - serverSocket->close(); - QVERIFY(clientSocket->waitForDisconnected(100)); - QVERIFY(!connection->isConnected()); - QVERIFY(!connection->isActive()); - QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Closing); - QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Closed); - QCOMPARE(statusSpy.count(), statusCount); -} - -void tst_IrcConnection::testConnection() -{ - Irc::registerMetaTypes(); - - TestProtocol* protocol = new TestProtocol(connection); - FriendlyConnection* friendly = static_cast(connection.data()); - friendly->setProtocol(protocol); - QCOMPARE(friendly->protocol(), protocol); - QCOMPARE(protocol->connection(), connection.data()); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connecting); - - QVERIFY(waitForWritten(":irc.ser.ver 001 nick :Welcome to the Internet Relay Chat Network nick")); - QVERIFY(connection->isActive()); - QVERIFY(connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connected); - - connection->close(); - QVERIFY(!connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Closed); - - // don't open when disabled - connection->setEnabled(false); - connection->open(); - QVERIFY(!connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Closed); - - // re-enable - connection->setEnabled(true); - connection->open(); - QVERIFY(connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connecting); - - QVERIFY(waitForOpened()); - - protocol->written.clear(); - connection->network()->requestCapability("identify-msg"); - QVERIFY(protocol->written.contains("CAP REQ")); - QVERIFY(protocol->written.contains("identify-msg")); - - protocol->written.clear(); - connection->network()->requestCapabilities(QStringList() << "sasl" << "communi"); - QVERIFY(protocol->written.contains("CAP REQ")); - QVERIFY(protocol->written.contains("sasl")); - QVERIFY(protocol->written.contains("communi")); - - QVERIFY(waitForWritten(":irc.ser.ver 001 nick :Welcome to the Internet Relay Chat Network nick")); - QVERIFY(connection->isActive()); - QVERIFY(connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Connected); - - protocol->written.clear(); - connection->setNickName("communi"); - QVERIFY(protocol->written.contains("NICK")); - QVERIFY(protocol->written.contains("communi")); - - protocol->written.clear(); - connection->quit(); - QVERIFY(protocol->written.contains("QUIT")); - - connection->close(); - QVERIFY(!connection->isActive()); - QVERIFY(!connection->isConnected()); - QCOMPARE(connection->status(), IrcConnection::Closed); -} - -class NickChanger : public QObject -{ - Q_OBJECT - -public: - NickChanger(IrcConnection* connection) : QObject(connection) - { - connect(connection, SIGNAL(nickNameReserved(QString*)), SLOT(onNickNameReserved(QString*))); - } - - QString setAlternate; - QString passedAlternate; - -public slots: - void onNickNameReserved(QString* alternate) - { - Q_ASSERT(alternate); - passedAlternate = *alternate; - *alternate = setAlternate; - } -}; - -Q_DECLARE_METATYPE(QString*) -void tst_IrcConnection::testMessages() -{ - Irc::registerMetaTypes(); - qRegisterMetaType(); - - QSignalSpy messageSpy(connection, SIGNAL(messageReceived(IrcMessage*))); - QSignalSpy capabilityMessageSpy(connection, SIGNAL(capabilityMessageReceived(IrcCapabilityMessage*))); - QSignalSpy errorMessageSpy(connection, SIGNAL(errorMessageReceived(IrcErrorMessage*))); - QSignalSpy inviteMessageSpy(connection, SIGNAL(inviteMessageReceived(IrcInviteMessage*))); - QSignalSpy joinMessageSpy(connection, SIGNAL(joinMessageReceived(IrcJoinMessage*))); - QSignalSpy kickMessageSpy(connection, SIGNAL(kickMessageReceived(IrcKickMessage*))); - QSignalSpy modeMessageSpy(connection, SIGNAL(modeMessageReceived(IrcModeMessage*))); - QSignalSpy namesMessageSpy(connection, SIGNAL(namesMessageReceived(IrcNamesMessage*))); - QSignalSpy nickMessageSpy(connection, SIGNAL(nickMessageReceived(IrcNickMessage*))); - QSignalSpy noticeMessageSpy(connection, SIGNAL(noticeMessageReceived(IrcNoticeMessage*))); - QSignalSpy numericMessageSpy(connection, SIGNAL(numericMessageReceived(IrcNumericMessage*))); - QSignalSpy motdMessageSpy(connection, SIGNAL(motdMessageReceived(IrcMotdMessage*))); - QSignalSpy partMessageSpy(connection, SIGNAL(partMessageReceived(IrcPartMessage*))); - QSignalSpy pingMessageSpy(connection, SIGNAL(pingMessageReceived(IrcPingMessage*))); - QSignalSpy pongMessageSpy(connection, SIGNAL(pongMessageReceived(IrcPongMessage*))); - QSignalSpy privateMessageSpy(connection, SIGNAL(privateMessageReceived(IrcPrivateMessage*))); - QSignalSpy quitMessageSpy(connection, SIGNAL(quitMessageReceived(IrcQuitMessage*))); - QSignalSpy topicMessageSpy(connection, SIGNAL(topicMessageReceived(IrcTopicMessage*))); - QSignalSpy whoReplyMessageSpy(connection, SIGNAL(whoReplyMessageReceived(IrcWhoReplyMessage*))); - - QVERIFY(messageSpy.isValid()); - QVERIFY(capabilityMessageSpy.isValid()); - QVERIFY(errorMessageSpy.isValid()); - QVERIFY(inviteMessageSpy.isValid()); - QVERIFY(joinMessageSpy.isValid()); - QVERIFY(kickMessageSpy.isValid()); - QVERIFY(modeMessageSpy.isValid()); - QVERIFY(namesMessageSpy.isValid()); - QVERIFY(nickMessageSpy.isValid()); - QVERIFY(noticeMessageSpy.isValid()); - QVERIFY(numericMessageSpy.isValid()); - QVERIFY(motdMessageSpy.isValid()); - QVERIFY(partMessageSpy.isValid()); - QVERIFY(pingMessageSpy.isValid()); - QVERIFY(pongMessageSpy.isValid()); - QVERIFY(privateMessageSpy.isValid()); - QVERIFY(quitMessageSpy.isValid()); - QVERIFY(topicMessageSpy.isValid()); - QVERIFY(whoReplyMessageSpy.isValid()); - - int messageCount = 0; - int numericMessageCount = 0; - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(":moorcock.freenode.net CAP * LS :account-notify extended-join identify-msg multi-prefix sasl")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(capabilityMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":moorcock.freenode.net 001 communi :Welcome to the freenode Internet Relay Chat Network communi")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=freenode KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 375 communi :- moorcock.freenode.net Message of the Day -")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 372 communi :- Welcome to moorcock.freenode.net in ...")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 376 communi :End of /MOTD command.")); - messageCount += 2; // RPL_ENDOFMOTD + IrcMotdMessage - QCOMPARE(messageSpy.count(), messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - QCOMPARE(motdMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN #freenode")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(joinMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":moorcock.freenode.net 332 communi #freenode :Welcome to #freenode | Staff are voiced; some may also be on /stats p -- feel free to /msg us at any time | FAQ: http://freenode.net/faq.shtml | Unwelcome queries? Use /mode your_nick +R to block them. | Channel guidelines: http://freenode.net/poundfreenode.shtml | Blog: http://blog.freenode.net | Please don't comment on spam/trolls.")); - messageCount += 2; // RPL_TOPIC & IrcTopicMessage - QCOMPARE(messageSpy.count(), messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - QCOMPARE(topicMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":moorcock.freenode.net 333 communi #freenode erry 1379357591")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 353 communi = #freenode :communi straterra absk007 pefn xlys Gromit TooCool Sambler gat0rs KarneAsada danis_963 Kiryx chrismeller deefloo black_male sxlnxdx bjork Kinny phobos_anomaly T13|sleeps JuxTApose Kolega2357 rorx techhelper1 hermatize Azimi iqualfragile fwilson skasturi mwallacesd mayday Guest76549 mcjohansen MangaKaDenza ARISTIDES ketas `- claptor ylluminate Cooky Brand3n cheater_1 Kirito digitaloktay Will| Iarfen abrotman smurfy Inaunt +mist Karol RougeR_")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 353 communi = #freenode :publickeating An_Ony_Moose michagogo Guest915` davidfg4 Ragnor s1lent_1 keee GingerGeek[Away] hibari derp S_T_A_N anonymuse asantoni road|runner LLckfan neoian2 aviancarrier nipples danieldaniel Pyrus Bry8Star shadowm_desktop furtardo rdymac TTSDA seaworthy Chiyo yscc Zombiebaron redpill f4cl3y Boohbah applebloom zorael kameloso^ Zetetic XAMPP wheels_up Cuppy-Cake mindlessjohnny Kymru mquin_ Rodja babilen kirin` David Affix jshyeung_ DarkAceZ karakedi")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 366 communi #freenode :End of /NAMES list.")); - messageCount += 2; // RPL_ENDOFNAMES & IrcNamesMessage - QCOMPARE(messageSpy.count(), messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - QCOMPARE(namesMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":ChanServ!ChanServ@services. NOTICE communi :[#freenode] Welcome to #freenode. All network staff are voiced in here, but may not always be around - type /stats p to get a list of on call staff. Others may be hiding so do feel free to ping and /msg us at will! Also please read the channel guidelines at http://freenode.net/poundfreenode.shtml - thanks.")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(noticeMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":services. 328 communi #freenode :http://freenode.net/")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - - QVERIFY(waitForWritten("PING :moorcock.freenode.net")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(pingMessageSpy.count(), 1); - - QVERIFY(waitForWritten("PONG :moorcock.freenode.net")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(pongMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi INVITE Communi84194 :#communi")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(inviteMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":Communi84194!ident@host NICK :communi")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(nickMessageSpy.count(), 1); - - // own nick name changes - QSignalSpy nickNameChangedSpy(connection, SIGNAL(nickNameChanged(QString))); - QVERIFY(nickNameChangedSpy.isValid()); - QVERIFY(waitForWritten(":communi!user@host NICK :own")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(nickMessageSpy.count(), 2); - QCOMPARE(connection->nickName(), QString("own")); - QCOMPARE(nickNameChangedSpy.count(), 1); - QCOMPARE(nickNameChangedSpy.last().at(0).toString(), QString("own")); - - // nick in use - QString prevNick = connection->nickName(); - NickChanger changer(connection); - changer.setAlternate = "communi_"; - QSignalSpy nickNameReservedSpy(connection, SIGNAL(nickNameReserved(QString*))); - QVERIFY(nickNameReservedSpy.isValid()); - QVERIFY(waitForWritten(":moorcock.freenode.net 433 * communi :Nickname is already in use.")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - QCOMPARE(nickNameReservedSpy.count(), 1); - QCOMPARE(changer.passedAlternate, prevNick); - - QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi MODE #communi +v communi")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(modeMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":moorcock.freenode.net 324 communi #communi +ms")); - messageCount += 2; // RPL_CHANNELMODEIS + IrcModeMessage - QCOMPARE(messageSpy.count(), messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - QCOMPARE(modeMessageSpy.count(), 2); - - QVERIFY(waitForWritten(":qtassistant!jpnurmi@qt/jpnurmi/bot/qtassistant PART #communi")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(partMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi PRIVMSG #communi :hello")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(privateMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi QUIT :Client Quit")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(quitMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi KICK #communi communi")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(kickMessageSpy.count(), 1); - - QVERIFY(waitForWritten("ERROR :just testing...")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(errorMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":hobana.freenode.net 352 communi #communi ChanServ services. services. ChanServ H@ :0 Channel Services" )); - messageCount += 2; // RPL_WHOREPLY + IrcWhoReplyMessage - QCOMPARE(messageSpy.count(), messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - QCOMPARE(whoReplyMessageSpy.count(), 1); - - QVERIFY(waitForWritten(":hobana.freenode.net 315 communi #communi :End of /WHO list.")); - QCOMPARE(messageSpy.count(), ++messageCount); - QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); - QCOMPARE(whoReplyMessageSpy.count(), 1); -} - -class MsgFilter : public QObject, public IrcMessageFilter -{ - Q_OBJECT - Q_INTERFACES(IrcMessageFilter) - -public: - MsgFilter() : count(0), type(IrcMessage::Unknown), flags(IrcMessage::None) - { - } - - bool messageFilter(IrcMessage* message) - { - ++count; - type = message->type(); - flags = message->flags(); - value = message->property(property); - return false; - } - -public: - int count; - QVariant value; - QByteArray property; - IrcMessage::Type type; - IrcMessage::Flags flags; -}; - -void tst_IrcConnection::testMessageFlags() -{ - connection->open(); - QVERIFY(waitForOpened()); - - int count = 0; - MsgFilter filter; - connection->installMessageFilter(&filter); - - QVERIFY(waitForWritten(":server CAP * LS :identify-msg")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Capability); - QCOMPARE(filter.flags, IrcMessage::None); - - QVERIFY(waitForWritten(":server CAP communi ACK :identify-msg")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Capability); - QCOMPARE(filter.flags, IrcMessage::None); - - QVERIFY(waitForWritten(":server 001 communi :Welcome...")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Numeric); - QCOMPARE(filter.flags, IrcMessage::None); - - QVERIFY(waitForWritten(":server 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=fake KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Numeric); - QCOMPARE(filter.flags, IrcMessage::None); - - QVERIFY(waitForWritten(":server 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Numeric); - QCOMPARE(filter.flags, IrcMessage::None); - - QVERIFY(waitForWritten(":server 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Numeric); - QCOMPARE(filter.flags, IrcMessage::None); - - filter.property = "content"; - QVERIFY(waitForWritten(":communi!ident@host PRIVMSG #communi :hi all")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Private); - QCOMPARE(filter.flags, IrcMessage::Own); - QCOMPARE(filter.value.toString(), QString("hi all")); - - filter.property = "content"; - QVERIFY(waitForWritten(":jpnurmi!ident@host PRIVMSG #communi :+hello there, communi")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Private); - QCOMPARE(filter.flags, IrcMessage::Identified); - QCOMPARE(filter.value.toString(), QString("hello there, communi")); - - filter.property = "content"; - QVERIFY(waitForWritten(":Guest1234!ident@host PRIVMSG #communi :-hi communi")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Private); - QCOMPARE(filter.flags, IrcMessage::Unidentified); - QCOMPARE(filter.value.toString(), QString("hi communi")); - - filter.property = "content"; - QVERIFY(waitForWritten(":communi!ident@host NOTICE #communi :hi all")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Notice); - QCOMPARE(filter.flags, IrcMessage::Own); - QCOMPARE(filter.value.toString(), QString("hi all")); - - filter.property = "content"; - QVERIFY(waitForWritten(":jpnurmi!ident@host NOTICE #communi :+hello there, communi")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Notice); - QCOMPARE(filter.flags, IrcMessage::Identified); - QCOMPARE(filter.value.toString(), QString("hello there, communi")); - - filter.property = "content"; - QVERIFY(waitForWritten(":Guest1234!ident@host NOTICE #communi :-hi communi")); - QCOMPARE(filter.count, ++count); - QCOMPARE(filter.type, IrcMessage::Notice); - QCOMPARE(filter.flags, IrcMessage::Unidentified); - QCOMPARE(filter.value.toString(), QString("hi communi")); -} - -void tst_IrcConnection::testMessageBuilder() -{ - connection->open(); - QVERIFY(waitForOpened()); - - MsgFilter filter; - connection->installMessageFilter(&filter); - - QVERIFY(waitForWritten(":my.irc.ser.ver 001 communi :Welcome...")); - QVERIFY(waitForWritten(":my.irc.ser.ver 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=fake KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server")); - QVERIFY(waitForWritten(":my.irc.ser.ver 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server")); - QVERIFY(waitForWritten(":my.irc.ser.ver 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server")); - - filter.property = "mask"; - QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); - QCOMPARE(filter.value.toString(), QString("#communi")); - - filter.property = "ident"; - QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); - QCOMPARE(filter.value.toString(), QString("~jpnurmi")); - - filter.property = "host"; - QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); - QCOMPARE(filter.value.toString(), QString("qt/jpnurmi")); - - filter.property = "server"; - QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); - QCOMPARE(filter.value.toString(), QString("his.irc.ser.ver")); - - filter.property = "nick"; - QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); - QCOMPARE(filter.value.toString(), QString("jpnurmi")); - - filter.property = "away"; - QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); - QCOMPARE(filter.value.toBool(), true); - - filter.property = "servOp"; - QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); - QCOMPARE(filter.value.toBool(), true); - - filter.property = "realName"; - QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); - QCOMPARE(filter.value.toString(), QString("J-P Nurmi")); - - filter.property = "realName"; - QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0")); - QCOMPARE(filter.value.toString(), QString()); -} - -void tst_IrcConnection::testSendCommand() -{ - IrcConnection conn; - QVERIFY(!conn.sendCommand(0)); - QVERIFY(!conn.sendCommand(IrcCommand::createQuit())); - - TestProtocol* protocol = new TestProtocol(connection); - FriendlyConnection* friendly = static_cast(connection.data()); - friendly->setProtocol(protocol); - QCOMPARE(friendly->protocol(), protocol); - QCOMPARE(protocol->connection(), connection.data()); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(connection->sendCommand(IrcCommand::createQuit())); - QVERIFY(!connection->sendCommand(0)); - QVERIFY(protocol->written.contains("QUIT")); -} - -void tst_IrcConnection::testSendData() -{ - IrcConnection conn; - QVERIFY(!conn.sendData("QUIT")); - - TestProtocol* protocol = new TestProtocol(connection); - FriendlyConnection* friendly = static_cast(connection.data()); - friendly->setProtocol(protocol); - QCOMPARE(friendly->protocol(), protocol); - QCOMPARE(protocol->connection(), connection.data()); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(connection->sendData("QUIT")); - QVERIFY(protocol->written.contains("QUIT")); -} - -class TestFilter : public QObject, public IrcMessageFilter, public IrcCommandFilter -{ - Q_OBJECT - Q_INTERFACES(IrcMessageFilter IrcCommandFilter) - -public: - void clear() - { - commitSuicide = false; - messageFiltered = 0; - commandFiltered = 0; - messageFilterEnabled = false; - commandFilterEnabled = false; - } - - bool messageFilter(IrcMessage*) - { - ++messageFiltered; - if (commitSuicide) - delete this; - return messageFilterEnabled; - } - - bool commandFilter(IrcCommand*) - { - ++commandFiltered; - if (commitSuicide) - delete this; - return commandFilterEnabled; - } - - bool commitSuicide; - int messageFiltered; - int commandFiltered; - bool messageFilterEnabled; - bool commandFilterEnabled; -}; - -void tst_IrcConnection::testMessageFilter() -{ - Irc::registerMetaTypes(); - - QSignalSpy messageSpy(connection, SIGNAL(messageReceived(IrcMessage*))); - QVERIFY(messageSpy.isValid()); - int messageCount = 0; - - TestFilter filter1; - QScopedPointer filter2(new TestFilter); - QScopedPointer filter3(new TestFilter); - - filter1.clear(); filter2->clear(); filter3->clear(); - - connection->installMessageFilter(&filter1); - connection->installMessageFilter(filter2.data()); - connection->installMessageFilter(filter3.data()); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(":moorcock.freenode.net 001 communi :Welcome to the freenode Internet Relay Chat Network communi")); - QCOMPARE(filter1.messageFiltered, 1); - QCOMPARE(filter2->messageFiltered, 1); - QCOMPARE(filter3->messageFiltered, 1); - QCOMPARE(messageSpy.count(), ++messageCount); - - filter1.clear(); filter2->clear(); filter3->clear(); - filter3->messageFilterEnabled = true; - - QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=freenode KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server")); - QCOMPARE(filter1.messageFiltered, 0); - QCOMPARE(filter2->messageFiltered, 0); - QCOMPARE(filter3->messageFiltered, 1); - QCOMPARE(messageSpy.count(), messageCount); - - filter1.clear(); filter2->clear(); filter3->clear(); - filter2->messageFilterEnabled = true; - - QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server")); - QCOMPARE(filter1.messageFiltered, 0); - QCOMPARE(filter2->messageFiltered, 1); - QCOMPARE(filter3->messageFiltered, 1); - QCOMPARE(messageSpy.count(), messageCount); - - filter1.clear(); filter2->clear(); filter3->clear(); - filter1.messageFilterEnabled = true; - - QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server")); - QCOMPARE(filter1.messageFiltered, 1); - QCOMPARE(filter2->messageFiltered, 1); - QCOMPARE(filter3->messageFiltered, 1); - QCOMPARE(messageSpy.count(), messageCount); - - filter1.clear(); filter2->clear(); filter3->clear(); - - QVERIFY(waitForWritten(":moorcock.freenode.net 375 communi :- moorcock.freenode.net Message of the Day -")); - QCOMPARE(filter1.messageFiltered, 1); - QCOMPARE(filter2->messageFiltered, 1); - QCOMPARE(filter3->messageFiltered, 1); - QCOMPARE(messageSpy.count(), ++messageCount); - - // a deleted filter gets removed - filter2.reset(); - filter1.clear(); filter3->clear(); - - QVERIFY(waitForWritten(":moorcock.freenode.net 372 communi :- Welcome to moorcock.freenode.net in ...")); - QCOMPARE(filter1.messageFiltered, 1); - QCOMPARE(filter3->messageFiltered, 1); - QCOMPARE(messageSpy.count(), ++messageCount); - - QVERIFY(waitForWritten(":moorcock.freenode.net 376 communi :End of /MOTD command.")); - messageCount += 2; // RPL_ENDOFMOTD + IrcMotdMessage - QCOMPARE(messageSpy.count(), messageCount); - - // double filters - connection->installMessageFilter(&filter1); - connection->installMessageFilter(filter3.data()); - filter1.clear(); filter3->clear(); - - QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN #freenode")); - QCOMPARE(filter1.messageFiltered, 2); - QCOMPARE(filter3->messageFiltered, 2); - QCOMPARE(messageSpy.count(), ++messageCount); - - // remove & enable double filter - filter1.clear(); filter3->clear(); - filter1.messageFilterEnabled = true; - connection->removeMessageFilter(filter3.data()); - - QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN #communi")); - QCOMPARE(filter1.messageFiltered, 1); - QCOMPARE(filter3->messageFiltered, 0); - QCOMPARE(messageSpy.count(), messageCount); - - // remove & delete - filter3.reset(); - filter1.clear(); - connection->removeMessageFilter(&filter1); - - QVERIFY(waitForWritten(":communi!~communi@hidd.en PART #communi")); - QCOMPARE(filter1.messageFiltered, 0); - QCOMPARE(messageSpy.count(), ++messageCount); - - // commit a suicide & filter - QPointer suicidal1 = new TestFilter; - connection->installMessageFilter(suicidal1); - suicidal1->clear(); - suicidal1->messageFilterEnabled = true; - suicidal1->commitSuicide = true; - - QVERIFY(waitForWritten(":communi!~communi@hidd.en PART #freenode")); - QCOMPARE(messageSpy.count(), messageCount); - QVERIFY(!suicidal1); - - // commit a suicide & don't filter - QPointer suicidal2 = new TestFilter; - connection->installMessageFilter(suicidal2); - suicidal2->clear(); - suicidal2->commitSuicide = true; - - QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN #qt")); - QVERIFY(!suicidal2); -} - -void tst_IrcConnection::testCommandFilter() -{ - TestProtocol* protocol = new TestProtocol(connection); - FriendlyConnection* friendly = static_cast(connection.data()); - friendly->setProtocol(protocol); - QCOMPARE(friendly->protocol(), protocol); - QCOMPARE(protocol->connection(), connection.data()); - - TestFilter filter1; - QScopedPointer filter2(new TestFilter); - QScopedPointer filter3(new TestFilter); - - filter1.clear(); filter2->clear(); filter3->clear(); - - connection->installCommandFilter(&filter1); - connection->installCommandFilter(filter2.data()); - connection->installCommandFilter(filter3.data()); - - connection->open(); - QVERIFY(waitForOpened()); - - connection->sendCommand(IrcCommand::createJoin("#freenode")); - QCOMPARE(filter1.commandFiltered, 1); - QCOMPARE(filter2->commandFiltered, 1); - QCOMPARE(filter3->commandFiltered, 1); - QVERIFY(!protocol->written.isEmpty()); - - protocol->written.clear(); - filter1.clear(); filter2->clear(); filter3->clear(); - filter3->commandFilterEnabled = true; - - connection->sendCommand(IrcCommand::createJoin("#communi")); - QCOMPARE(filter1.commandFiltered, 0); - QCOMPARE(filter2->commandFiltered, 0); - QCOMPARE(filter3->commandFiltered, 1); - QVERIFY(protocol->written.isEmpty()); - - protocol->written.clear(); - filter1.clear(); filter2->clear(); filter3->clear(); - filter2->commandFilterEnabled = true; - - connection->sendCommand(IrcCommand::createJoin("#qt")); - QCOMPARE(filter1.commandFiltered, 0); - QCOMPARE(filter2->commandFiltered, 1); - QCOMPARE(filter3->commandFiltered, 1); - QVERIFY(protocol->written.isEmpty()); - - protocol->written.clear(); - filter1.clear(); filter2->clear(); filter3->clear(); - filter1.commandFilterEnabled = true; - - connection->sendCommand(IrcCommand::createPart("#freenode")); - QCOMPARE(filter1.commandFiltered, 1); - QCOMPARE(filter2->commandFiltered, 1); - QCOMPARE(filter3->commandFiltered, 1); - QVERIFY(protocol->written.isEmpty()); - - protocol->written.clear(); - filter1.clear(); filter2->clear(); filter3->clear(); - - connection->sendCommand(IrcCommand::createPart("#communi")); - QCOMPARE(filter1.commandFiltered, 1); - QCOMPARE(filter2->commandFiltered, 1); - QCOMPARE(filter3->commandFiltered, 1); - QVERIFY(!protocol->written.isEmpty()); - - // a deleted filter gets removed - filter2.reset(); - filter1.clear(); filter3->clear(); - protocol->written.clear(); - - connection->sendCommand(IrcCommand::createPart("#qt")); - QCOMPARE(filter1.commandFiltered, 1); - QCOMPARE(filter3->commandFiltered, 1); - QVERIFY(!protocol->written.isEmpty()); - - // double filters - connection->installCommandFilter(&filter1); - connection->installCommandFilter(filter3.data()); - filter1.clear(); filter3->clear(); - protocol->written.clear(); - - connection->sendCommand(IrcCommand::createJoin("#freenode")); - QCOMPARE(filter1.commandFiltered, 2); - QCOMPARE(filter3->commandFiltered, 2); - QVERIFY(!protocol->written.isEmpty()); - - // remove & enable double filter - filter1.clear(); filter3->clear(); - filter1.commandFilterEnabled = true; - connection->removeCommandFilter(filter3.data()); - protocol->written.clear(); - - connection->sendCommand(IrcCommand::createJoin("#communi")); - QCOMPARE(filter1.commandFiltered, 1); - QCOMPARE(filter3->commandFiltered, 0); - QVERIFY(protocol->written.isEmpty()); - - // remove & delete - filter3.reset(); - filter1.clear(); - connection->removeCommandFilter(&filter1); - protocol->written.clear(); - - connection->sendCommand(IrcCommand::createJoin("#qt")); - QCOMPARE(filter1.commandFiltered, 0); - QVERIFY(!protocol->written.isEmpty()); - - // commit a suicide - QPointer suicidal = new TestFilter; - connection->installCommandFilter(suicidal); - suicidal->commitSuicide = true; - - connection->sendCommand(IrcCommand::createPart("#qt")); - QVERIFY(!suicidal); -} - -void tst_IrcConnection::testDebug() -{ - QString str; - QDebug dbg(&str); - - dbg << static_cast(0); - QCOMPARE(str.trimmed(), QString::fromLatin1("IrcConnection(0x0)")); - str.clear(); - - IrcConnection connection; - dbg << &connection; - QVERIFY(QRegExp("IrcConnection\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); - str.clear(); - - connection.setHost("irc.freenode.net"); - dbg << &connection; - QVERIFY(QRegExp("IrcConnection\\(0x[0-9A-Fa-f]+, irc.freenode.net\\) ").exactMatch(str)); - str.clear(); - - connection.setDisplayName("Freenode"); - dbg << &connection; - QVERIFY(QRegExp("IrcConnection\\(0x[0-9A-Fa-f]+, Freenode\\) ").exactMatch(str)); - str.clear(); - - dbg << IrcConnection::Connected; - QCOMPARE(str.trimmed(), QString::fromLatin1("Connected")); - str.clear(); -} - -void tst_IrcConnection::testWarnings() -{ - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(connection->isActive()); - - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setHost() has no effect until re-connect"); - connection->setHost("foo"); - - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setPort() has no effect until re-connect"); - connection->setPort(1234); - - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setUserName() has no effect until re-connect"); - connection->setUserName("foo"); - - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setRealName() has no effect until re-connect"); - connection->setRealName("foo"); - - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setPassword() has no effect until re-connect"); - connection->setPassword("foo"); - - QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setSaslMechanism() has no effect until re-connect"); - connection->setSaslMechanism("PLAIN"); -} - -class FakeQmlConnection : public IrcConnection -{ - Q_OBJECT - friend class tst_IrcConnection; - -public slots: - // -Wno-overloaded-virtual - QVariant createCtcpReply(const QVariant& request) - { - return QVariant::fromValue(IrcConnection::createCtcpReply(request.value())); - } -}; - -void tst_IrcConnection::testCtcp() -{ - FriendlyConnection* friendly = static_cast(connection.data()); - - // PING - IrcMessage* msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1PING timestamp\1", connection); - QScopedPointer pingRequest(qobject_cast(msg)); - QVERIFY(pingRequest.data()); - - QScopedPointer pingReply(friendly->createCtcpReply(pingRequest.data())); - QVERIFY(pingReply.data()); - QCOMPARE(pingReply->type(), IrcCommand::CtcpReply); - QCOMPARE(pingReply->toString(), QString("NOTICE nick :\1PING timestamp\1")); - - // TIME - msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1TIME\1", connection); - QScopedPointer timeRequest(qobject_cast(msg)); - QVERIFY(timeRequest); - - QScopedPointer timeReply(friendly->createCtcpReply(timeRequest.data())); - QVERIFY(timeReply.data()); - QCOMPARE(timeReply->type(), IrcCommand::CtcpReply); - QCOMPARE(timeReply->toString(), QString("NOTICE nick :\1TIME %1\1").arg(QLocale().toString(QDateTime::currentDateTime(), QLocale::ShortFormat))); - - // VERSION - msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1VERSION\1", connection); - QScopedPointer versionRequest(qobject_cast(msg)); - QVERIFY(versionRequest.data()); - - QScopedPointer versionReply(friendly->createCtcpReply(versionRequest.data())); - QVERIFY(versionReply.data()); - QCOMPARE(versionReply->type(), IrcCommand::CtcpReply); - QVERIFY(versionReply->toString().startsWith("NOTICE nick :\1VERSION ")); - QVERIFY(versionReply->toString().contains(Irc::version())); - QVERIFY(versionReply->toString().endsWith("\1")); - - // SOURCE - msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1SOURCE\1", connection); - QScopedPointer sourceRequest(qobject_cast(msg)); - QVERIFY(sourceRequest.data()); - - QScopedPointer sourceReply(friendly->createCtcpReply(sourceRequest.data())); - QVERIFY(sourceReply.data()); - QCOMPARE(sourceReply->type(), IrcCommand::CtcpReply); - QVERIFY(sourceReply->toString().startsWith("NOTICE nick :\1SOURCE ")); - QVERIFY(sourceReply->toString().contains("http://")); - QVERIFY(sourceReply->toString().endsWith("\1")); - - // CLIENTINFO - msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1CLIENTINFO\1", connection); - QScopedPointer infoRequest(qobject_cast(msg)); - QVERIFY(infoRequest.data()); - - QScopedPointer infoReply(friendly->createCtcpReply(infoRequest.data())); - QVERIFY(infoReply.data()); - QCOMPARE(infoReply->type(), IrcCommand::CtcpReply); - QVERIFY(infoReply->toString().startsWith("NOTICE nick :\1CLIENTINFO ")); - QVERIFY(infoReply->toString().contains("PING")); - QVERIFY(infoReply->toString().contains("TIME")); - QVERIFY(infoReply->toString().contains("VERSION")); - QVERIFY(infoReply->toString().contains("SOURCE")); - QVERIFY(infoReply->toString().endsWith("\1")); - - // QML compatibility - FakeQmlConnection qmlConnection; - qmlConnection.setUserName("user"); - qmlConnection.setNickName("nick"); - qmlConnection.setRealName("real"); - qmlConnection.setPassword("secret"); - qmlConnection.setHost("127.0.0.1"); - qmlConnection.setPort(server->serverPort()); - - TestProtocol* qmlProtocol = new TestProtocol(&qmlConnection); - qmlConnection.setProtocol(qmlProtocol); - qmlConnection.open(); - - QVERIFY(server->waitForNewConnection(200)); - QAbstractSocket* qmlServerSocket = server->nextPendingConnection(); - QVERIFY(qmlServerSocket); - QAbstractSocket* qmlClientSocket = qmlConnection.socket(); - QVERIFY(qmlClientSocket); - QVERIFY(qmlClientSocket->waitForConnected(200)); - - qmlProtocol->written.clear(); - qmlServerSocket->write(":nick!user@host PRIVMSG communi :\1PING qml\1\r\n"); - QVERIFY(qmlServerSocket->waitForBytesWritten(1000)); - QVERIFY(qmlClientSocket->waitForReadyRead(1000)); - QCOMPARE(qmlProtocol->written, QByteArray("NOTICE nick :\1PING qml\1")); - - connection->open(); - QVERIFY(waitForOpened()); - - TestProtocol* protocol = new TestProtocol(friendly); - friendly->setProtocol(protocol); - QCOMPARE(friendly->protocol(), protocol); - QCOMPARE(protocol->connection(), friendly); - - // PING - protocol->written.clear(); - QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1PING timestamp\1\r\n")); - QCOMPARE(protocol->written, QByteArray("NOTICE nick :\1PING timestamp\1")); - - // TIME - protocol->written.clear(); - QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1TIME\1\r\n")); - QVERIFY(protocol->written.startsWith("NOTICE nick :\1TIME ")); - QVERIFY(protocol->written.endsWith("\1")); - - // VERSION - protocol->written.clear(); - QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1VERSION\1\r\n")); - QVERIFY(protocol->written.startsWith("NOTICE nick :\1VERSION ")); - QVERIFY(protocol->written.contains(Irc::version().toUtf8())); - QVERIFY(protocol->written.endsWith("\1")); - - // SOURCE - protocol->written.clear(); - QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1SOURCE\1\r\n")); - QVERIFY(protocol->written.startsWith("NOTICE nick :\1SOURCE ")); - QVERIFY(protocol->written.contains("http://")); - QVERIFY(protocol->written.endsWith("\1")); - - // CLIENTINFO - protocol->written.clear(); - QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1CLIENTINFO\1\r\n")); - QVERIFY(protocol->written.startsWith("NOTICE nick :\1CLIENTINFO ")); - QVERIFY(protocol->written.contains("PING")); - QVERIFY(protocol->written.contains("TIME")); - QVERIFY(protocol->written.contains("VERSION")); - QVERIFY(protocol->written.contains("SOURCE")); - QVERIFY(protocol->written.endsWith("\1")); -} - -QTEST_MAIN(tst_IrcConnection) - -#include "tst_ircconnection.moc" diff --git a/libcommuni/tests/auto/irclagtimer/irclagtimer.pro b/libcommuni/tests/auto/irclagtimer/irclagtimer.pro deleted file mode 100644 index bcaac4c..0000000 --- a/libcommuni/tests/auto/irclagtimer/irclagtimer.pro +++ /dev/null @@ -1,8 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_irclagtimer.cpp - -include(../shared/shared.pri) -include(../auto.pri) diff --git a/libcommuni/tests/auto/irclagtimer/tst_irclagtimer.cpp b/libcommuni/tests/auto/irclagtimer/tst_irclagtimer.cpp deleted file mode 100644 index 3a69042..0000000 --- a/libcommuni/tests/auto/irclagtimer/tst_irclagtimer.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "irclagtimer.h" -#include "ircconnection.h" -#include "tst_ircclientserver.h" -#include "tst_ircdata.h" -#include - -class tst_IrcLagTimer : public tst_IrcClientServer -{ - Q_OBJECT - -private slots: - void testDefaults(); - void testInterval(); - void testConnection(); - void testLag(); -}; - -void tst_IrcLagTimer::testDefaults() -{ - IrcLagTimer timer; - QCOMPARE(timer.lag(), qint64(-1)); - QVERIFY(!timer.connection()); - QCOMPARE(timer.interval(), 60); -} - -void tst_IrcLagTimer::testInterval() -{ - IrcLagTimer timer; - timer.setInterval(INT_MIN); - QCOMPARE(timer.interval(), INT_MIN); - timer.setInterval(0); - QCOMPARE(timer.interval(), 0); - timer.setInterval(INT_MAX); - QCOMPARE(timer.interval(), INT_MAX); -} - -void tst_IrcLagTimer::testConnection() -{ - IrcLagTimer timer(connection); - QCOMPARE(timer.connection(), connection.data()); - timer.setConnection(0); - QVERIFY(!timer.connection()); - timer.setConnection(connection); - QCOMPARE(timer.connection(), connection.data()); -} - -void tst_IrcLagTimer::testLag() -{ -#if QT_VERSION >= 0x040700 - IrcLagTimer timer(connection); - - QSignalSpy lagSpy(&timer, SIGNAL(lagChanged(qint64))); - QVERIFY(lagSpy.isValid()); - int lagCount = 0; - - connection->open(); - QVERIFY(waitForOpened()); - - QCOMPARE(timer.lag(), -1ll); - - QVERIFY(waitForWritten(tst_IrcData::welcome())); - - // cheat a bit to avoid waiting a 1s interval at minimum... - QMetaObject::invokeMethod(&timer, "_irc_pingServer"); - QVERIFY(clientSocket->waitForBytesWritten(1000)); - QVERIFY(serverSocket->waitForReadyRead(1000)); - - QRegExp rx("PING communi/(\\d+)"); - QString written = QString::fromUtf8(serverSocket->readAll()); - QVERIFY(rx.indexIn(written) != -1); - - waitForWritten(QString(":irc.ser.ver PONG communi communi/%1").arg(QDateTime::currentMSecsSinceEpoch() - 1234ll).toUtf8()); - QVERIFY(timer.lag() >= 1234ll); - QCOMPARE(lagSpy.count(), ++lagCount); - QVERIFY(lagSpy.last().at(0).toLongLong() >= 1234ll); - - timer.setConnection(0); - QCOMPARE(timer.lag(), -1ll); - QCOMPARE(lagSpy.count(), ++lagCount); - QCOMPARE(lagSpy.last().at(0).toLongLong(), -1ll); - - timer.setConnection(connection); - QCOMPARE(timer.lag(), -1ll); - QCOMPARE(lagSpy.count(), lagCount); - - waitForWritten(QString(":irc.ser.ver PONG communi communi/%1").arg(QDateTime::currentMSecsSinceEpoch() - 4321ll).toUtf8()); - QVERIFY(timer.lag() >= 4321ll); - QCOMPARE(lagSpy.count(), ++lagCount); - QVERIFY(lagSpy.last().at(0).toLongLong() >= 4321ll); - - connection->close(); - QCOMPARE(timer.lag(), -1ll); - QCOMPARE(lagSpy.count(), ++lagCount); - QCOMPARE(lagSpy.last().at(0).toLongLong(), -1ll); -#endif // QT_VERSION >= 0x040700 -} - -QTEST_MAIN(tst_IrcLagTimer) - -#include "tst_irclagtimer.moc" diff --git a/libcommuni/tests/auto/ircmessage/ircmessage.pro b/libcommuni/tests/auto/ircmessage/ircmessage.pro deleted file mode 100644 index c13ba14..0000000 --- a/libcommuni/tests/auto/ircmessage/ircmessage.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircmessage.cpp - -include(../auto.pri) diff --git a/libcommuni/tests/auto/ircmessage/tst_ircmessage.cpp b/libcommuni/tests/auto/ircmessage/tst_ircmessage.cpp deleted file mode 100644 index f96c50a..0000000 --- a/libcommuni/tests/auto/ircmessage/tst_ircmessage.cpp +++ /dev/null @@ -1,973 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircmessage.h" -#include "ircconnection.h" -#include "ircprotocol.h" -#include -#include -#include -#include - -#ifdef Q_OS_LINUX -#include "ircmessagedecoder_p.h" -#endif // Q_OS_LINUX - -class tst_IrcMessage : public QObject -{ - Q_OBJECT - -private slots: - void testDefaults(); - - void testPrefix_data(); - void testPrefix(); - - void testParameters_data(); - void testParameters(); - - void testFlags(); - - void testEncoding_data(); - void testEncoding(); - - void testDecoder_data(); - void testDecoder(); - - void testTags_data(); - void testTags(); - - void testCapabilityMessage_data(); - void testCapabilityMessage(); - void testErrorMessage_data(); - void testErrorMessage(); - void testInviteMessage_data(); - void testInviteMessage(); - void testJoinMessage_data(); - void testJoinMessage(); - void testKickMessage_data(); - void testKickMessage(); - void testNamesMessage(); - void testNickMessage_data(); - void testNickMessage(); - void testNoticeMessage_data(); - void testNoticeMessage(); - void testNumericMessage_data(); - void testNumericMessage(); - void testModeMessage_data(); - void testModeMessage(); - void testMotdMessage(); - void testPartMessage_data(); - void testPartMessage(); - void testPingMessage(); - void testPongMessage(); - void testPrivateMessage_data(); - void testPrivateMessage(); - void testQuitMessage_data(); - void testQuitMessage(); - void testTopicMessage_data(); - void testTopicMessage(); - void testWhoReplyMessage_data(); - void testWhoReplyMessage(); - - void testDebug(); -}; - -void tst_IrcMessage::testDefaults() -{ - IrcMessage msg(0); - QVERIFY(!msg.isValid()); - QVERIFY(!msg.connection()); - QCOMPARE(msg.type(), IrcMessage::Unknown); - QCOMPARE(msg.flags(), IrcMessage::None); - QCOMPARE(msg.encoding(), QByteArray("ISO-8859-15")); - QVERIFY(msg.prefix().isNull()); - QVERIFY(msg.nick().isNull()); - QVERIFY(msg.ident().isNull()); - QVERIFY(msg.host().isNull()); - QVERIFY(msg.command().isNull()); - QVERIFY(msg.parameters().isEmpty()); - QVERIFY(msg.toData().isEmpty()); -} - -void tst_IrcMessage::testPrefix_data() -{ - QTest::addColumn("prefix"); - QTest::addColumn("expected"); - QTest::addColumn("nick"); - QTest::addColumn("ident"); - QTest::addColumn("host"); - - QTest::newRow("null") << QString() << QString() << QString() << QString() << QString(); - QTest::newRow("empty") << QString("") << QString("") << QString() << QString() << QString(); - QTest::newRow("space") << QString(" ") << QString(" ") << QString() << QString() << QString(); - QTest::newRow("nick!ident@host") << QString("nick!ident@host") << QString("nick!ident@host") << QString("nick") << QString("ident") << QString("host"); -} - -void tst_IrcMessage::testPrefix() -{ - QFETCH(QString, prefix); - QFETCH(QString, expected); - QFETCH(QString, nick); - QFETCH(QString, ident); - QFETCH(QString, host); - - IrcMessage msg(0); - msg.setPrefix(prefix); - QCOMPARE(msg.prefix(), expected); - QCOMPARE(msg.nick(), nick); - QCOMPARE(msg.ident(), ident); - QCOMPARE(msg.host(), host); -} - -void tst_IrcMessage::testParameters_data() -{ - Irc::registerMetaTypes(); - - QTest::addColumn("prefix"); - QTest::addColumn("command"); - QTest::addColumn("params"); - QTest::addColumn("type"); - - QTest::newRow("null") << QString() << QString() << QStringList() << IrcMessage::Unknown; - QTest::newRow("message") << QString("nick!ident@host") << QString("PRIVMSG") << QStringList("p") << IrcMessage::Private; - QTest::newRow("notice") << QString("nick!ident@host") << QString("NOTICE") << QStringList("p") << IrcMessage::Notice; -} - -void tst_IrcMessage::testParameters() -{ - QFETCH(QString, prefix); - QFETCH(QString, command); - QFETCH(QStringList, params); - QFETCH(IrcMessage::Type, type); - - IrcConnection connection; - QScopedPointer message(IrcMessage::fromParameters(prefix, command, params, &connection)); - QCOMPARE(message->type(), type); - QCOMPARE(message->prefix(), prefix); - QCOMPARE(message->command(), command); - QCOMPARE(message->parameters(), params); -} - -void tst_IrcMessage::testFlags() -{ - IrcMessage msg(0); - msg.setPrefix("a!b@c"); - QCOMPARE(msg.flags(), IrcMessage::None); -} - -void tst_IrcMessage::testEncoding_data() -{ - QTest::addColumn("encoding"); - QTest::addColumn("actual"); - QTest::addColumn("supported"); - - QTest::newRow("null") << QByteArray() << QByteArray("ISO-8859-15") << false; - QTest::newRow("empty") << QByteArray("") << QByteArray("ISO-8859-15") << false; - QTest::newRow("space") << QByteArray(" ") << QByteArray("ISO-8859-15") << false; - QTest::newRow("invalid") << QByteArray("invalid") << QByteArray("ISO-8859-15") << false; - foreach (const QByteArray& codec, QTextCodec::availableCodecs()) - QTest::newRow(codec) << codec << codec << true; -} - -void tst_IrcMessage::testEncoding() -{ - QFETCH(QByteArray, encoding); - QFETCH(QByteArray, actual); - QFETCH(bool, supported); - - if (!supported) - QTest::ignoreMessage(QtWarningMsg, "IrcMessage::setEncoding(): unsupported encoding \"" + encoding + "\" "); - - IrcMessage msg(0); - msg.setEncoding(encoding); - QCOMPARE(msg.encoding(), actual); -} - -void tst_IrcMessage::testDecoder_data() -{ - QTest::addColumn("encoding"); - QTest::addColumn("base64"); - - QTest::newRow("windows-1251") << QByteArray("windows-1251") << QByteArray("7+Xt8eju7eXw4Owg7+7k5OXr/O375Q=="); - QTest::newRow("EUC-JP") << QByteArray("EUC-JP") << QByteArray("pKSkxKTHpOKkyaSzpMek4qGhpbml3qXbyMc="); - QTest::newRow("Shift-JIS") << QByteArray("Shift-JIS") << QByteArray("lbaOmoNSgVuDaJVcg1aDdINn"); - QTest::newRow("ISO-8859-15") << QByteArray("ISO-8859-15") << QByteArray("5Gl0aWVucORpduQ="); // TODO: QByteArray("5OQ="); -} - -void tst_IrcMessage::testDecoder() -{ - QFETCH(QByteArray, encoding); - QFETCH(QByteArray, base64); - -#ifdef Q_OS_LINUX - // others have problems with symbols (win) or private headers (osx frameworks) - IrcMessageDecoder decoder; - QString actual = decoder.decode(QByteArray::fromBase64(base64), encoding); - QString expected = QTextCodec::codecForName(encoding)->toUnicode(QByteArray::fromBase64(base64)); - QCOMPARE(actual, expected); -#endif // Q_OS_LINUX -} - -void tst_IrcMessage::testTags_data() -{ - QTest::addColumn("data"); - QTest::addColumn("tags"); - QTest::addColumn("prefix"); - QTest::addColumn("command"); - QTest::addColumn("target"); - QTest::addColumn("content"); - - QVariantMap tags; - tags.insert("aaa", "bbb"); - tags.insert("ccc", ""); - tags.insert("example.com/ddd", "eee"); - - QTest::newRow("example") << QByteArray("@aaa=bbb;ccc;example.com/ddd=eee :nick!ident@host.com PRIVMSG me :Hello") - << tags << "nick!ident@host.com" << "PRIVMSG" << "me" << "Hello"; -} - -void tst_IrcMessage::testTags() -{ - QFETCH(QByteArray, data); - QFETCH(QVariantMap, tags); - QFETCH(QString, prefix); - QFETCH(QString, command); - QFETCH(QString, target); - QFETCH(QString, content); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->tags(), tags); - QCOMPARE(message->prefix(), prefix); - QCOMPARE(message->command(), command); - QCOMPARE(message->property("target").toString(), target); - QCOMPARE(message->property("content").toString(), content); -} - -void tst_IrcMessage::testCapabilityMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("subCommand"); - QTest::addColumn("capabilities"); - - QTest::newRow("no prefix") << true << QByteArray("CAP") << QString() << QStringList(); - QTest::newRow("empty prefix") << false << QByteArray(": CAP") << QString() << QStringList(); - QTest::newRow("no params") << true << QByteArray(":server CAP") << QString() << QStringList(); - - QTest::newRow("ls") << true << QByteArray(":server CAP * LS :identify-msg sasl") << QString("LS") << (QStringList() << "identify-msg" << "sasl"); - QTest::newRow("ack") << true << QByteArray(":server CAP communi ACK :identify-msg") << QString("ACK") << (QStringList() << "identify-msg"); - QTest::newRow("nak") << true << QByteArray(":server CAP communi NAK :sasl") << QString("NAK") << (QStringList() << "sasl"); -} - -void tst_IrcMessage::testCapabilityMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, subCommand); - QFETCH(QStringList, capabilities); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Capability); - QCOMPARE(message->command(), QString("CAP")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("subCommand").toString(), subCommand); - QCOMPARE(message->property("capabilities").toStringList(), capabilities); - - IrcCapabilityMessage* capabilityMessage = qobject_cast(message); - QVERIFY(capabilityMessage); - QCOMPARE(capabilityMessage->isValid(), valid); - QCOMPARE(capabilityMessage->subCommand(), subCommand); - QCOMPARE(capabilityMessage->capabilities(), capabilities); -} - -void tst_IrcMessage::testErrorMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("error"); - - QTest::newRow("no prefix") << true << QByteArray("ERROR error1") << QString("error1"); - QTest::newRow("empty prefix") << false << QByteArray(": ERROR error1") << QString("error1"); - QTest::newRow("no params") << false << QByteArray(":server ERROR") << QString(); - QTest::newRow("all ok") << true << QByteArray(":server ERROR error1") << QString("error1"); -} - -void tst_IrcMessage::testErrorMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, error); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Error); - QCOMPARE(message->command(), QString("ERROR")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("error").toString(), error); - - IrcErrorMessage* errorMessage = qobject_cast(message); - QVERIFY(errorMessage); - QCOMPARE(errorMessage->isValid(), valid); - QCOMPARE(errorMessage->error(), error); -} - -void tst_IrcMessage::testInviteMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("user"); - QTest::addColumn("channel"); - - QTest::newRow("no prefix") << true << QByteArray("INVITE Wiz #Dust") << QString("Wiz") << QString("#Dust"); - QTest::newRow("empty prefix") << false << QByteArray(": INVITE Wiz #Dust") << QString("Wiz") << QString("#Dust"); - QTest::newRow("no params") << false << QByteArray(":Angel INVITE") << QString() << QString(); - QTest::newRow("no channel") << false << QByteArray(":Angel INVITE Wiz") << QString("Wiz") << QString(); - QTest::newRow("all ok") << true << QByteArray(":Angel INVITE Wiz #Dust") << QString("Wiz") << QString("#Dust"); -} - -void tst_IrcMessage::testInviteMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, channel); - QFETCH(QString, user); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Invite); - QCOMPARE(message->command(), QString("INVITE")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("channel").toString(), channel); - QCOMPARE(message->property("user").toString(), user); - - IrcInviteMessage* inviteMessage = qobject_cast(message); - QVERIFY(inviteMessage); - QCOMPARE(inviteMessage->isValid(), valid); - QCOMPARE(inviteMessage->channel(), channel); - QCOMPARE(inviteMessage->user(), user); -} - -void tst_IrcMessage::testJoinMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("channel"); - - QTest::newRow("no prefix") << true << QByteArray("JOIN #Twilight_zone") << QString("#Twilight_zone"); - QTest::newRow("empty prefix") << false << QByteArray(": JOIN #Twilight_zone") << QString("#Twilight_zone"); - QTest::newRow("no params") << false << QByteArray(":WiZ JOIN") << QString(); - QTest::newRow("all ok") << true << QByteArray(":WiZ JOIN #Twilight_zone") << QString("#Twilight_zone"); -} - -void tst_IrcMessage::testJoinMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, channel); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Join); - QCOMPARE(message->command(), QString("JOIN")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("channel").toString(), channel); - - IrcJoinMessage* joinMessage = qobject_cast(message); - QVERIFY(joinMessage); - QCOMPARE(joinMessage->isValid(), valid); - QCOMPARE(joinMessage->channel(), channel); -} - -void tst_IrcMessage::testKickMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("channel"); - QTest::addColumn("user"); - QTest::addColumn("reason"); - - QTest::newRow("no prefix") << true << QByteArray("KICK #Finnish John") << QString("#Finnish") << QString("John") << QString(); - QTest::newRow("empty prefix") << false << QByteArray(": KICK #Finnish John") << QString("#Finnish") << QString("John") << QString(); - QTest::newRow("no params") << false << QByteArray(":WiZ KICK") << QString() << QString() << QString(); - QTest::newRow("no user") << false << QByteArray(":WiZ KICK #Finnish") << QString("#Finnish") << QString() << QString(); - QTest::newRow("no reason") << true << QByteArray(":WiZ KICK #Finnish John") << QString("#Finnish") << QString("John") << QString(); - QTest::newRow("all ok") << true << QByteArray(":WiZ KICK #Finnish John :Another reason") << QString("#Finnish") << QString("John") << QString("Another reason"); -} - -void tst_IrcMessage::testKickMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, channel); - QFETCH(QString, user); - QFETCH(QString, reason); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Kick); - QCOMPARE(message->command(), QString("KICK")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("channel").toString(), channel); - QCOMPARE(message->property("user").toString(), user); - QCOMPARE(message->property("reason").toString(), reason); - - IrcKickMessage* kickMessage = qobject_cast(message); - QVERIFY(kickMessage); - QCOMPARE(kickMessage->isValid(), valid); - QCOMPARE(kickMessage->channel(), channel); - QCOMPARE(kickMessage->user(), user); - QCOMPARE(kickMessage->reason(), reason); -} - -void tst_IrcMessage::testNamesMessage() -{ - IrcConnection connection; - IrcNamesMessage message(&connection); - message.setPrefix("nick!ident@host"); - message.setParameters(QStringList() << "chan" << "usr1" << "usr2" << "usr3"); - QVERIFY(message.isValid()); - QCOMPARE(message.type(), IrcMessage::Names); - QCOMPARE(message.command(), QString("NAMES")); - QCOMPARE(message.channel(), QString("chan")); - QCOMPARE(message.names(), QStringList() << "usr1" << "usr2" << "usr3"); -} - -void tst_IrcMessage::testNickMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("oldNick"); - QTest::addColumn("newNick"); - - QTest::newRow("no prefix") << true << QByteArray("NICK Kilroy") << QString() << QString("Kilroy"); - QTest::newRow("empty prefix") << false << QByteArray(": NICK Kilroy") << QString() << QString("Kilroy"); - QTest::newRow("no params") << false << QByteArray(":WiZ NICK") << QString("WiZ") << QString(); - QTest::newRow("all ok") << true << QByteArray(":WiZ NICK Kilroy") << QString("WiZ") << QString("Kilroy"); -} - -void tst_IrcMessage::testNickMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, oldNick); - QFETCH(QString, newNick); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Nick); - QCOMPARE(message->command(), QString("NICK")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("oldNick").toString(), oldNick); - QCOMPARE(message->property("newNick").toString(), newNick); - - IrcNickMessage* nickMessage = qobject_cast(message); - QVERIFY(nickMessage); - QCOMPARE(nickMessage->isValid(), valid); - QCOMPARE(nickMessage->oldNick(), oldNick); - QCOMPARE(nickMessage->newNick(), newNick); -} - -void tst_IrcMessage::testNoticeMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("target"); - QTest::addColumn("content"); - QTest::addColumn("priv"); - QTest::addColumn("reply"); - - QTest::newRow("no prefix") << true << QByteArray("NOTICE Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false; - QTest::newRow("empty prefix") << false << QByteArray(": NOTICE Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false; - QTest::newRow("no params") << false << QByteArray(":Angel NOTICE Wiz") << QString("Wiz") << QString() << false << false; - QTest::newRow("all ok") << true << QByteArray(":Angel NOTICE Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false; - QTest::newRow("private") << true << QByteArray(":Angel NOTICE communi :Hello are you receiving this message ?") << QString("communi") << QString("Hello are you receiving this message ?") << true << false; - QTest::newRow("reply") << true << QByteArray(":Angel NOTICE Wiz :\1Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << true; -} - -void tst_IrcMessage::testNoticeMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, target); - QFETCH(QString, content); - QFETCH(bool, priv); - QFETCH(bool, reply); - - IrcConnection connection; - connection.setNickName("communi"); - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Notice); - QCOMPARE(message->command(), QString("NOTICE")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("target").toString(), target); - QCOMPARE(message->property("content").toString(), content); - QCOMPARE(message->property("private").toBool(), priv); - QCOMPARE(message->property("reply").toBool(), reply); - - IrcNoticeMessage* noticeMessage = qobject_cast(message); - QVERIFY(noticeMessage); - QCOMPARE(noticeMessage->isValid(), valid); - QCOMPARE(noticeMessage->target(), target); - QCOMPARE(noticeMessage->content(), content); - QCOMPARE(noticeMessage->isPrivate(), priv); - QCOMPARE(noticeMessage->isReply(), reply); -} - -void tst_IrcMessage::testNumericMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("code"); - - QTest::newRow("no prefix") << true << QByteArray("123 Kilroy") << 123; - QTest::newRow("empty prefix") << false << QByteArray(": 123 Kilroy") << 123; - QTest::newRow("no params") << true << QByteArray(":WiZ 456") << 456; - QTest::newRow("all ok") << true << QByteArray(":WiZ 789 Kilroy") << 789; -} - -void tst_IrcMessage::testNumericMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(int, code); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Numeric); - QVERIFY(message->command().toInt() > 0); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("code").toInt(), code); - - IrcNumericMessage* numericMessage = qobject_cast(message); - QVERIFY(numericMessage); - QCOMPARE(numericMessage->isValid(), valid); - QCOMPARE(numericMessage->code(), code); -} - -void tst_IrcMessage::testModeMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("target"); - QTest::addColumn("mode"); - QTest::addColumn("argument"); - - QTest::newRow("no prefix") << true << QByteArray("MODE Kilroy -w") << QString("Kilroy") << QString("-w") << QString(); - QTest::newRow("empty prefix") << false << QByteArray(": MODE Kilroy -w") << QString("Kilroy") << QString("-w") << QString(); - QTest::newRow("no params") << false << QByteArray(":WiZ MODE Kilroy") << QString("Kilroy") << QString() << QString(); - QTest::newRow("all ok") << true << QByteArray(":WiZ MODE Kilroy -w") << QString("Kilroy") << QString("-w") << QString(); - - QTest::newRow("1") << true << QByteArray(":WiZ MODE #Finnish +im") << QString("#Finnish") << QString("+im") << QString(); - QTest::newRow("2") << true << QByteArray(":Angel MODE #Finnish +o Kilroy") << QString("#Finnish") << QString("+o") << QString("Kilroy"); - QTest::newRow("3") << true << QByteArray(":Kilroy MODE #Finnish +v Wiz") << QString("#Finnish") << QString("+v") << QString("Wiz"); - QTest::newRow("4a") << true << QByteArray("MODE #Fins -s") << QString("#Fins") << QString("-s") << QString(); - QTest::newRow("4b") << false << QByteArray(": MODE #Fins -s") << QString("#Fins") << QString("-s") << QString(); - QTest::newRow("5") << true << QByteArray(":WiZ MODE #42 +k oulu") << QString("#42") << QString("+k") << QString("oulu"); - QTest::newRow("6a") << true << QByteArray("MODE #eu-opers +l 10") << QString("#eu-opers") << QString("+l") << QString("10"); - QTest::newRow("6b") << false << QByteArray(": MODE #eu-opers +l 10") << QString("#eu-opers") << QString("+l") << QString("10"); - QTest::newRow("7") << true << QByteArray(":nobody MODE &oulu +b") << QString("&oulu") << QString("+b") << QString(); - QTest::newRow("8") << true << QByteArray(":someone MODE &oulu +b *!*@*") << QString("&oulu") << QString("+b") << QString("*!*@*"); - QTest::newRow("9") << true << QByteArray(":anyone MODE &oulu +b *!*@*.edu") << QString("&oulu") << QString("+b") << QString("*!*@*.edu"); - QTest::newRow("10a") << true << QByteArray("MODE WiZ -w") << QString("WiZ") << QString("-w") << QString(); - QTest::newRow("10b") << false << QByteArray(": MODE WiZ -w") << QString("WiZ") << QString("-w") << QString(); - QTest::newRow("11") << true << QByteArray(":Angel MODE Angel +i") << QString("Angel") << QString("+i") << QString(); - QTest::newRow("12") << true << QByteArray(":WiZ MODE WiZ -o") << QString("WiZ") << QString("-o") << QString(); - - QTest::newRow("args") << true << QByteArray(":someone MODE #chan +lk 10 secret") << QString("#chan") << QString("+lk") << QString("10 secret"); -} - -void tst_IrcMessage::testModeMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, target); - QFETCH(QString, mode); - QFETCH(QString, argument); - - const QString arg = argument.split(" ", QString::SkipEmptyParts).value(0); - const QStringList args = argument.split(" ", QString::SkipEmptyParts); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Mode); - QCOMPARE(message->command(), QString("MODE")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("target").toString(), target); - QCOMPARE(message->property("mode").toString(), mode); - QCOMPARE(message->property("argument").toString(), arg); - QCOMPARE(message->property("arguments").toStringList(), args); - - IrcModeMessage* modeMessage = qobject_cast(message); - QVERIFY(modeMessage); - QCOMPARE(modeMessage->isValid(), valid); - QCOMPARE(modeMessage->target(), target); - QCOMPARE(modeMessage->mode(), mode); - QCOMPARE(modeMessage->argument(), arg); - QCOMPARE(modeMessage->arguments(), args); -} - -void tst_IrcMessage::testMotdMessage() -{ - IrcConnection connection; - IrcMotdMessage message(&connection); - message.setPrefix("nick!ident@host"); - QStringList params; - params += "user"; - params += ":server 375 user :- server Message of the Day"; - params += ":server 372 user :- Welcome..."; - params += ":server 376 user :End of /MOTD command"; - message.setParameters(params); - QVERIFY(message.isValid()); - QCOMPARE(message.type(), IrcMessage::Motd); - QCOMPARE(message.command(), QString("MOTD")); - QCOMPARE(message.lines(), QStringList(params.mid(1))); -} - -void tst_IrcMessage::testPartMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("channel"); - QTest::addColumn("reason"); - - QTest::newRow("no prefix") << true << QByteArray("PART #Twilight_zone") << QString("#Twilight_zone") << QString(); - QTest::newRow("empty prefix") << false << QByteArray(": PART #Twilight_zone") << QString("#Twilight_zone") << QString(); - QTest::newRow("no params") << false << QByteArray(":WiZ PART") << QString() << QString(); - QTest::newRow("no reason") << true << QByteArray(":WiZ PART #Twilight_zone") << QString("#Twilight_zone") << QString(); - QTest::newRow("all ok") << true << QByteArray(":WiZ PART #Twilight_zone :Gone to have lunch") << QString("#Twilight_zone") << QString("Gone to have lunch"); -} - -void tst_IrcMessage::testPartMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, channel); - QFETCH(QString, reason); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Part); - QCOMPARE(message->command(), QString("PART")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("channel").toString(), channel); - QCOMPARE(message->property("reason").toString(), reason); - - IrcPartMessage* partMessage = qobject_cast(message); - QVERIFY(partMessage); - QCOMPARE(partMessage->isValid(), valid); - QCOMPARE(partMessage->channel(), channel); - QCOMPARE(partMessage->reason(), reason); -} - -void tst_IrcMessage::testPingMessage() -{ - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData("PING :arg", &connection); - QCOMPARE(message->type(), IrcMessage::Ping); - QCOMPARE(message->command(), QString("PING")); - QCOMPARE(message->property("command").toString(), QString("PING")); - QVERIFY(message->property("valid").toBool()); - QCOMPARE(message->property("argument").toString(), QString("arg")); - - IrcPingMessage* pingMessage = qobject_cast(message); - QVERIFY(pingMessage); - QVERIFY(pingMessage->isValid()); - QCOMPARE(pingMessage->argument(), QString("arg")); -} - -void tst_IrcMessage::testPongMessage() -{ - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData("PONG tgt :arg", &connection); - QCOMPARE(message->type(), IrcMessage::Pong); - QCOMPARE(message->command(), QString("PONG")); - QCOMPARE(message->property("command").toString(), QString("PONG")); - QVERIFY(message->property("valid").toBool()); - QCOMPARE(message->property("argument").toString(), QString("arg")); - - IrcPongMessage* pongMessage = qobject_cast(message); - QVERIFY(pongMessage); - QVERIFY(pongMessage->isValid()); - QCOMPARE(pongMessage->argument(), QString("arg")); -} - -void tst_IrcMessage::testPrivateMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("cap"); - QTest::addColumn("data"); - QTest::addColumn("target"); - QTest::addColumn("content"); - QTest::addColumn("priv"); - QTest::addColumn("action"); - QTest::addColumn("request"); - QTest::addColumn("flags"); - - QTest::newRow("no prefix") << true << QString() << QByteArray("PRIVMSG Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); - QTest::newRow("empty prefix") << false << QString() << QByteArray(": PRIVMSG Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); - QTest::newRow("no params") << false << QString() << QByteArray(":Angel PRIVMSG Wiz") << QString("Wiz") << QString() << false << false << false << static_cast(IrcMessage::None); - QTest::newRow("all ok") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); - QTest::newRow("private") << true << QString() << QByteArray(":Angel PRIVMSG communi :Hello are you receiving this message ?") << QString("communi") << QString("Hello are you receiving this message ?") << true << false << false << static_cast(IrcMessage::None); - QTest::newRow("action") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :\1ACTION Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << true << false << static_cast(IrcMessage::None); - QTest::newRow("request") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :\1Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << true << static_cast(IrcMessage::None); - - QTest::newRow("identified") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :+Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::Identified); - QTest::newRow("identified private") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG communi :+Hello are you receiving this message ?") << QString("communi") << QString("Hello are you receiving this message ?") << true << false << false << static_cast(IrcMessage::Identified); - QTest::newRow("identified action") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :+\1ACTION Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << true << false << static_cast(IrcMessage::Identified); - QTest::newRow("identified request") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :+\1Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << true << static_cast(IrcMessage::Identified); - - QTest::newRow("unidentified") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :-Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::Unidentified); - QTest::newRow("unidentified private") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG communi :-Hello are you receiving this message ?") << QString("communi") << QString("Hello are you receiving this message ?") << true << false << false << static_cast(IrcMessage::Unidentified); - QTest::newRow("unidentified action") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :-\1ACTION Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << true << false << static_cast(IrcMessage::Unidentified); - QTest::newRow("unidentified request") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :-\1Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << true << static_cast(IrcMessage::Unidentified); - - QTest::newRow("no-caps identified") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :+Hello are you receiving this message ?") << QString("Wiz") << QString("+Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); - QTest::newRow("no-caps unidentified") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :-Hello are you receiving this message ?") << QString("Wiz") << QString("-Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); -} - -class TestProtocol : public IrcProtocol -{ -public: - TestProtocol(const QString& cap, IrcConnection* connection) : IrcProtocol(connection) - { - QSet caps; - caps.insert(cap); - setAvailableCapabilities(caps); - setActiveCapabilities(caps); - } -}; - -class FriendConnection : public IrcConnection -{ - friend class tst_IrcMessage; -}; - -void tst_IrcMessage::testPrivateMessage() -{ - QFETCH(bool, valid); - QFETCH(QString, cap); - QFETCH(QByteArray, data); - QFETCH(QString, target); - QFETCH(QString, content); - QFETCH(bool, priv); - QFETCH(bool, action); - QFETCH(bool, request); - QFETCH(uint, flags); - - IrcConnection connection; - connection.setNickName("communi"); - TestProtocol protocol(cap, &connection); - static_cast(&connection)->setProtocol(&protocol); - - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Private); - QCOMPARE(message->command(), QString("PRIVMSG")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("target").toString(), target); - QCOMPARE(message->property("content").toString(), content); - QCOMPARE(message->property("private").toBool(), priv); - QCOMPARE(message->property("action").toBool(), action); - QCOMPARE(message->property("request").toBool(), request); - QCOMPARE(message->property("flags").toUInt(), flags); - - IrcPrivateMessage* privateMessage = qobject_cast(message); - QVERIFY(privateMessage); - QCOMPARE(privateMessage->isValid(), valid); - QCOMPARE(privateMessage->target(), target); - QCOMPARE(privateMessage->content(), content); - QCOMPARE(privateMessage->isPrivate(), priv); - QCOMPARE(privateMessage->isAction(), action); - QCOMPARE(privateMessage->isRequest(), request); - QCOMPARE(static_cast(privateMessage->flags()), flags); -} - -void tst_IrcMessage::testQuitMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("reason"); - - QTest::newRow("no prefix") << true << QByteArray("QUIT :Gone to have lunch") << QString("Gone to have lunch"); - QTest::newRow("empty prefix") << false << QByteArray(": QUIT :Gone to have lunch") << QString("Gone to have lunch"); - QTest::newRow("no params") << true << QByteArray(":WiZ QUIT") << QString(); - QTest::newRow("all ok") << true << QByteArray(":WiZ QUIT :Gone to have lunch") << QString("Gone to have lunch"); -} - -void tst_IrcMessage::testQuitMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, reason); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Quit); - QCOMPARE(message->command(), QString("QUIT")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("reason").toString(), reason); - - IrcQuitMessage* quitMessage = qobject_cast(message); - QVERIFY(quitMessage); - QCOMPARE(quitMessage->isValid(), valid); - QCOMPARE(quitMessage->reason(), reason); -} - -void tst_IrcMessage::testTopicMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("data"); - QTest::addColumn("channel"); - QTest::addColumn("topic"); - QTest::addColumn("reply"); - - QTest::newRow("no prefix") << true << QByteArray("TOPIC #test") << QString("#test") << QString() << false; - QTest::newRow("empty prefix") << false << QByteArray(": TOPIC #test") << QString("#test") << QString() << false; - QTest::newRow("no params") << false << QByteArray(":WiZ TOPIC") << QString() << QString() << false; - QTest::newRow("no topic") << true << QByteArray(":WiZ TOPIC #test") << QString("#test") << QString() << false; - QTest::newRow("all ok") << true << QByteArray(":WiZ TOPIC #test :another topic") << QString("#test") << QString("another topic") << false; - // TODO: QTest::newRow("numeric") << true << QByteArray(":server 332 user #test :foo bar") << QString("#test") << QString("foo bar") << true; -} - -void tst_IrcMessage::testTopicMessage() -{ - QFETCH(bool, valid); - QFETCH(QByteArray, data); - QFETCH(QString, channel); - QFETCH(QString, topic); - QFETCH(bool, reply); - - IrcConnection connection; - IrcMessage* message = IrcMessage::fromData(data, &connection); - QCOMPARE(message->type(), IrcMessage::Topic); - QCOMPARE(message->command(), QString("TOPIC")); - QCOMPARE(message->property("valid").toBool(), valid); - QCOMPARE(message->property("channel").toString(), channel); - QCOMPARE(message->property("topic").toString(), topic); - QCOMPARE(message->property("reply").toBool(), reply); - - IrcTopicMessage* topicMessage = qobject_cast(message); - QVERIFY(topicMessage); - QCOMPARE(topicMessage->isValid(), valid); - QCOMPARE(topicMessage->channel(), channel); - QCOMPARE(topicMessage->topic(), topic); - QCOMPARE(topicMessage->isReply(), reply); -} - -void tst_IrcMessage::testWhoReplyMessage_data() -{ - QTest::addColumn("valid"); - QTest::addColumn("prefix"); - QTest::addColumn("params"); - QTest::addColumn("mask"); - QTest::addColumn("server"); - QTest::addColumn("away"); - QTest::addColumn("servOp"); - QTest::addColumn("realName"); - - QTest::newRow("normal") << true << "nick!ident@host" - << (QStringList() << "#mask" << "irc.ser.ver" << "H@" << "real name") - << "#mask" << "irc.ser.ver" << false << false << "real name"; - - QTest::newRow("away") << true << "nick!ident@host" - << (QStringList() << "*" << "127.0.0.1" << "G@" << "real name") - << "*" << "127.0.0.1" << true << false << "real name"; - - QTest::newRow("serv op") << true << "nick!ident@host" - << (QStringList() << "*" << "127.0.0.1" << "H*@" << "real name") - << "*" << "127.0.0.1" << false << true << "real name"; - - QTest::newRow("no name") << true << "nick!ident@host" - << (QStringList() << "#mask" << "irc.ser.ver" << "H@" << "") - << "#mask" << "irc.ser.ver" << false << false << ""; -} - -void tst_IrcMessage::testWhoReplyMessage() -{ - QFETCH(bool, valid); - QFETCH(QString, prefix); - QFETCH(QStringList, params); - QFETCH(QString, mask); - QFETCH(QString, server); - QFETCH(bool, away); - QFETCH(bool, servOp); - QFETCH(QString, realName); - - IrcConnection connection; - IrcWhoReplyMessage message(&connection); - message.setPrefix(prefix); - message.setParameters(params); - QCOMPARE(message.isValid(), valid); - QCOMPARE(message.type(), IrcMessage::WhoReply); - // TODO: QCOMPARE(message.command(), QString::number(Irc::RPL_WHOREPLY)); - QCOMPARE(message.mask(), mask); - QCOMPARE(message.server(), server); - QCOMPARE(message.isAway(), away); - QCOMPARE(message.isServOp(), servOp); - QCOMPARE(message.realName(), realName); - - QCOMPARE(message.property("valid").toBool(), valid); - QCOMPARE(message.property("mask").toString(), mask); - QCOMPARE(message.property("server").toString(), server); - QCOMPARE(message.property("away").toBool(), away); - QCOMPARE(message.property("servOp").toBool(), servOp); - QCOMPARE(message.property("realName").toString(), realName); -} - -void tst_IrcMessage::testDebug() -{ - QString str; - QDebug dbg(&str); - - dbg << static_cast(0); - QCOMPARE(str.trimmed(), QString::fromLatin1("IrcMessage(0x0)")); - str.clear(); - - IrcMessage message(0); - dbg << &message; - QVERIFY(QRegExp("IrcMessage\\(0x[0-9A-Fa-f]+, flags=\\(None\\)\\) ").exactMatch(str)); - str.clear(); - - message.setObjectName("foo"); - dbg << &message; - QVERIFY(QRegExp("IrcMessage\\(0x[0-9A-Fa-f]+, name=foo, flags=\\(None\\)\\) ").exactMatch(str)); - str.clear(); - - message.setPrefix("nick!ident@host"); - dbg << &message; - QVERIFY(QRegExp("IrcMessage\\(0x[0-9A-Fa-f]+, name=foo, flags=\\(None\\), prefix=nick!ident@host\\) ").exactMatch(str)); - str.clear(); - - message.setCommand("COMMAND"); - dbg << &message; - QVERIFY(QRegExp("IrcMessage\\(0x[0-9A-Fa-f]+, name=foo, flags=\\(None\\), prefix=nick!ident@host, command=COMMAND\\) ").exactMatch(str)); - str.clear(); - - dbg << IrcMessage::Join; - QCOMPARE(str.trimmed(), QString::fromLatin1("Join")); - str.clear(); - - dbg << IrcMessage::Unidentified; - QCOMPARE(str.trimmed(), QString::fromLatin1("Unidentified")); - str.clear(); - - dbg << (IrcMessage::Own | IrcMessage::Identified | IrcMessage::Unidentified); - QCOMPARE(str.trimmed(), QString::fromLatin1("(Own|Identified|Unidentified)")); - str.clear(); - - dbg << IrcModeMessage::Channel; - QCOMPARE(str.trimmed(), QString::fromLatin1("Channel")); - str.clear(); -} - -QTEST_MAIN(tst_IrcMessage) - -#include "tst_ircmessage.moc" diff --git a/libcommuni/tests/auto/ircnetwork/ircnetwork.pro b/libcommuni/tests/auto/ircnetwork/ircnetwork.pro deleted file mode 100644 index d4bebfb..0000000 --- a/libcommuni/tests/auto/ircnetwork/ircnetwork.pro +++ /dev/null @@ -1,8 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircnetwork.cpp - -include(../shared/shared.pri) -include(../auto.pri) diff --git a/libcommuni/tests/auto/ircnetwork/tst_ircnetwork.cpp b/libcommuni/tests/auto/ircnetwork/tst_ircnetwork.cpp deleted file mode 100644 index 5237659..0000000 --- a/libcommuni/tests/auto/ircnetwork/tst_ircnetwork.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircnetwork.h" -#include "irccommand.h" -#include "ircconnection.h" -#include -#include -#include "tst_ircclientserver.h" -#include "tst_ircdata.h" -#ifdef Q_OS_LINUX -#include "ircnetwork_p.h" -#endif // Q_OS_LINUX - -class tst_IrcNetwork : public tst_IrcClientServer -{ - Q_OBJECT - -private slots: - void testDefaults(); - - void testInfo_data(); - void testInfo(); - - void testCapabilities_data(); - void testCapabilities(); - - void testDebug(); -}; - -void tst_IrcNetwork::testDefaults() -{ - IrcConnection connection; - IrcNetwork* network = connection.network(); - QVERIFY(!network->isInitialized()); - QVERIFY(network->name().isNull()); - QVERIFY(network->modes().isEmpty()); - QVERIFY(network->prefixes().isEmpty()); - QVERIFY(network->channelTypes().isEmpty()); - QVERIFY(network->availableCapabilities().isEmpty()); - QVERIFY(network->requestedCapabilities().isEmpty()); - QVERIFY(network->activeCapabilities().isEmpty()); -} - -void tst_IrcNetwork::testInfo_data() -{ - QTest::addColumn("welcome"); - QTest::addColumn("name"); - QTest::addColumn("modes"); - QTest::addColumn("prefixes"); - QTest::addColumn("channelTypes"); - - QTest::newRow("freenode") << tst_IrcData::welcome("freenode") << "freenode" << "ov" << "@+" << "#"; - QTest::newRow("ircnet") << tst_IrcData::welcome("ircnet") << "IRCNet" << "ov" << "@+" << "#&!+"; - QTest::newRow("euirc") << tst_IrcData::welcome("euirc") << "euIRCnet" << "qaohv" << "*!@%+" << "#&+"; -} - -void tst_IrcNetwork::testInfo() -{ - QFETCH(QByteArray, welcome); - QFETCH(QString, name); - QFETCH(QString, modes); - QFETCH(QString, prefixes); - QFETCH(QString, channelTypes); - - IrcNetwork* network = connection->network(); - - QSignalSpy initSpy(network, SIGNAL(initialized())); - QSignalSpy nameSpy(network, SIGNAL(nameChanged(QString))); - QSignalSpy modesSpy(network, SIGNAL(modesChanged(QStringList))); - QSignalSpy prefixesSpy(network, SIGNAL(prefixesChanged(QStringList))); - QSignalSpy channelTypesSpy(network, SIGNAL(channelTypesChanged(QStringList))); - - QVERIFY(initSpy.isValid()); - QVERIFY(nameSpy.isValid()); - QVERIFY(modesSpy.isValid()); - QVERIFY(prefixesSpy.isValid()); - QVERIFY(channelTypesSpy.isValid()); - - connection->open(); - QVERIFY(waitForOpened()); - QVERIFY(waitForWritten(welcome)); - - QVERIFY(network->isInitialized()); - - QCOMPARE(network->name(), name); - QCOMPARE(network->modes(), modes.split("", QString::SkipEmptyParts)); - QCOMPARE(network->prefixes(), prefixes.split("", QString::SkipEmptyParts)); - QCOMPARE(network->channelTypes(), channelTypes.split("", QString::SkipEmptyParts)); - - QCOMPARE(network->prefixes().count(), network->modes().count()); - for (int i = 0; i < network->prefixes().count(); ++i) { - QString prefix = network->prefixes().at(i); - QString mode = network->modes().at(i); - QCOMPARE(network->prefixToMode(prefix), mode); - QCOMPARE(network->modeToPrefix(mode), prefix); - } - - QVERIFY(!network->channelTypes().isEmpty()); - QVERIFY(!network->isChannel("foo")); - QVERIFY(network->isChannel(network->channelTypes().at(0) + "foo")); - - QVERIFY(!network->channelModes(IrcNetwork::TypeA).isEmpty()); - QVERIFY(!network->channelModes(IrcNetwork::TypeB).isEmpty()); - QVERIFY(!network->channelModes(IrcNetwork::TypeC).isEmpty()); - QVERIFY(!network->channelModes(IrcNetwork::TypeD).isEmpty()); - - if (welcome.contains("NICKLEN=")) - QVERIFY(network->numericLimit(IrcNetwork::NickLength) != -1); - else - QCOMPARE(network->numericLimit(IrcNetwork::NickLength), -1); - if (welcome.contains("CHANNELLEN=")) - QVERIFY(network->numericLimit(IrcNetwork::ChannelLength) != -1); - else - QCOMPARE(network->numericLimit(IrcNetwork::ChannelLength), -1); - if (welcome.contains("TOPICLEN=")) - QVERIFY(network->numericLimit(IrcNetwork::TopicLength) != -1); - else - QCOMPARE(network->numericLimit(IrcNetwork::TopicLength), -1); - if (welcome.contains("KICKLEN=")) - QVERIFY(network->numericLimit(IrcNetwork::KickReasonLength) != -1); - else - QCOMPARE(network->numericLimit(IrcNetwork::KickReasonLength), -1); - if (welcome.contains("AWAYLEN=")) - QVERIFY(network->numericLimit(IrcNetwork::AwayReasonLength) != -1); - else - QCOMPARE(network->numericLimit(IrcNetwork::AwayReasonLength), -1); - if (welcome.contains("MODES=")) - QVERIFY(network->numericLimit(IrcNetwork::ModeCount) != -1); - else - QCOMPARE(network->numericLimit(IrcNetwork::ModeCount), -1); - - QCOMPARE(network->numericLimit(IrcNetwork::MessageLength), 512); // hard-coded :/ - - if (welcome.contains("MAXLIST=")) { - bool limited = false; - foreach (const QString& mode, network->modes()) - if (network->modeLimit(mode) != -1) - limited = true; - QVERIFY(limited); - } - - if (welcome.contains("CHANLIMIT=")) { - bool limited = false; - foreach (const QString& type, network->channelTypes()) - if (network->channelLimit(type) != -1) - limited = true; - QVERIFY(limited); - } - - if (welcome.contains("TARGMAX=")) { - bool limited = false; - IrcCommand command; - for (int i = IrcCommand::Admin; i <= IrcCommand::Whowas; ++i) { - if (i != IrcCommand::Custom) { - command.setType(static_cast(i)); - QString cmd = command.toString().split(" ", QString::SkipEmptyParts).value(0); - if (network->targetLimit(cmd) != -1) - limited = true; - } - } - QVERIFY(limited); - } - - QCOMPARE(initSpy.count(), 1); - QCOMPARE(nameSpy.count(), 1); - QCOMPARE(modesSpy.count(), 1); - QCOMPARE(prefixesSpy.count(), 1); - QCOMPARE(channelTypesSpy.count(), 1); - - QCOMPARE(nameSpy.first().first().toString(), name); - QCOMPARE(modesSpy.first().first().toStringList(), modes.split("", QString::SkipEmptyParts)); - QCOMPARE(prefixesSpy.first().first().toStringList(), prefixes.split("", QString::SkipEmptyParts)); - QCOMPARE(channelTypesSpy.first().first().toStringList(), channelTypes.split("", QString::SkipEmptyParts)); -} - -void tst_IrcNetwork::testCapabilities_data() -{ - QTest::addColumn("initialCaps"); - QTest::addColumn("requestedCaps"); - QTest::addColumn("ackedCaps"); - QTest::addColumn("nakedCaps"); - QTest::addColumn("listedCaps"); - QTest::addColumn("availableCaps"); - QTest::addColumn("activeCaps"); - - QTest::newRow("empty") << QString() - << QString() - << QString() - << QString() - << QString() - << QString() - << QString(); - - QTest::newRow("sasl") << QString("multi-prefix sasl identify-msg") // initial - << QString("sasl") // requested - << QString("sasl") // acked - << QString() // naked - << QString("sasl identify-msg multi-prefix") // listed - << QString("sasl identify-msg multi-prefix") // available - << QString("sasl"); // active - - QTest::newRow("unk") << QString("multi-prefix sasl identify-msg") // initial - << QString("unk") // requested - << QString() // acked - << QString("nak") // naked - << QString("multi-prefix sasl identify-msg") // listed - << QString("multi-prefix sasl identify-msg") // available - << QString(); // active - - QTest::newRow("nak all") << QString("multi-prefix sasl identify-msg") // initial - << QString("sasl identify-msg multi-prefix") // requested - << QString() // acked - << QString("sasl identify-msg multi-prefix") // naked - << QString("sasl identify-msg multi-prefix") // listed - << QString("sasl identify-msg multi-prefix") // available - << QString(); // active - - QTest::newRow("sticky") << QString("=sticky") // initial - << QString("sticky") // requested - << QString("=sticky") // acked - << QString() // naked - << QString() // listed - << QString("sticky") // available - << QString("sticky"); // active - - QTest::newRow("ackmod") << QString("~ackmod") // initial - << QString("ackmod") // requested - << QString("~ackmod") // acked - << QString() // naked - << QString() // listed - << QString("ackmod") // available - << QString("ackmod"); // active - - QTest::newRow("acksticky") << QString("~=acksticky") // initial - << QString("acksticky") // requested - << QString("=~acksticky") // acked - << QString() // naked - << QString() // listed - << QString("acksticky") // available - << QString("acksticky"); // active -} - -static bool equalCaps(const QString& left, const QString& right) -{ - return left.split(" ", QString::SkipEmptyParts).toSet() == right.split(" ", QString::SkipEmptyParts).toSet(); -} - -void tst_IrcNetwork::testCapabilities() -{ - QFETCH(QString, initialCaps); - QFETCH(QString, requestedCaps); - QFETCH(QString, ackedCaps); - QFETCH(QString, nakedCaps); - QFETCH(QString, listedCaps); - QFETCH(QString, availableCaps); - QFETCH(QString, activeCaps); - - IrcNetwork* network = connection->network(); - - QSignalSpy availableSpy(network, SIGNAL(availableCapabilitiesChanged(QStringList))); - QSignalSpy requestedSpy(network, SIGNAL(requestedCapabilitiesChanged(QStringList))); - QSignalSpy activeSpy(network, SIGNAL(activeCapabilitiesChanged(QStringList))); - QSignalSpy requestingSpy(network, SIGNAL(requestingCapabilities())); - - QVERIFY(availableSpy.isValid()); - QVERIFY(requestedSpy.isValid()); - QVERIFY(activeSpy.isValid()); - QVERIFY(requestingSpy.isValid()); - - int availableCount = 0; - int requestedCount = 0; - int activeCount = 0; - int requestingCount = 0; - - if (!requestedCaps.isEmpty()) { - network->setRequestedCapabilities(requestedCaps.split(" ", QString::SkipEmptyParts)); - ++requestedCount; - } - QCOMPARE(requestedSpy.count(), requestedCount); - - foreach (const QString& cap, availableCaps.split(" ", QString::SkipEmptyParts)) - QVERIFY(!network->hasCapability(cap)); - foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) - QVERIFY(!network->isCapable(cap)); - - connection->open(); - QVERIFY(waitForOpened()); - - if (!initialCaps.isEmpty()) { - // typical ircd: "*", znc: "unknown-nick" - QVERIFY(waitForWritten(":irc.ser.ver CAP unknown-nick LS :" + initialCaps.toUtf8())); - ++availableCount; - ++requestingCount; - } - QCOMPARE(availableSpy.count(), availableCount); - QCOMPARE(requestingSpy.count(), requestingCount); - - foreach (const QString& cap, availableCaps.split(" ", QString::SkipEmptyParts)) - QVERIFY(network->hasCapability(cap)); - foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) - QVERIFY(!network->isCapable(cap)); - - if (!ackedCaps.isEmpty()) { - QVERIFY(waitForWritten(":irc.ser.ver CAP jpnurmi ACK :" + ackedCaps.toUtf8())); - ++activeCount; - } - QCOMPARE(activeSpy.count(), activeCount); - - foreach (const QString& cap, availableCaps.split(" ", QString::SkipEmptyParts)) - QVERIFY(network->hasCapability(cap)); - foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) - QVERIFY(network->isCapable(cap)); - - if (!nakedCaps.isEmpty()) - QVERIFY(waitForWritten(":irc.ser.ver CAP jpnurmi NAK :" + nakedCaps.toUtf8())); - - QVERIFY(waitForWritten(tst_IrcData::welcome())); - - if (!listedCaps.isEmpty()) { - QVERIFY(waitForWritten(":irc.ser.ver CAP jpnurmi LS :" + listedCaps.toUtf8())); - if (!equalCaps(listedCaps, initialCaps)) - ++availableCount; - } - QCOMPARE(availableSpy.count(), availableCount); - - QVERIFY(equalCaps(network->availableCapabilities().join(" "), availableCaps)); - QVERIFY(equalCaps(network->activeCapabilities().join(" "), activeCaps)); - QVERIFY(equalCaps(network->requestedCapabilities().join(" "), requestedCaps)); - - QCOMPARE(requestedSpy.count(), requestedCount); - QCOMPARE(requestingSpy.count(), requestingCount); - QCOMPARE(availableSpy.count(), availableCount); - QCOMPARE(activeSpy.count(), activeCount); - - foreach (const QString& cap, availableCaps.split(" ", QString::SkipEmptyParts)) - QVERIFY(network->hasCapability(cap)); - foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) - QVERIFY(network->isCapable(cap)); - - // -> CLEAR - QString clearCaps; - foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) - clearCaps += QString("-") + cap; - QVERIFY(waitForWritten(":irc.ser.ver CAP jpnurmi ACK :" + clearCaps.toUtf8())); - - if (!activeCaps.isEmpty()) - ++activeCount; - QCOMPARE(activeSpy.count(), activeCount); -} - -void tst_IrcNetwork::testDebug() -{ - QString str; - QDebug dbg(&str); - - dbg << static_cast(0); - QCOMPARE(str.trimmed(), QString::fromLatin1("IrcNetwork(0x0)")); - str.clear(); - - IrcConnection connection; - dbg << connection.network(); - QVERIFY(QRegExp("IrcNetwork\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); - str.clear(); - - connection.network()->setObjectName("obj"); - dbg << connection.network(); - QVERIFY(QRegExp("IrcNetwork\\(0x[0-9A-Fa-f]+, name=obj\\) ").exactMatch(str)); - str.clear(); - -#ifdef Q_OS_LINUX - // others have problems with symbols (win) or private headers (osx frameworks) - IrcNetworkPrivate::get(connection.network())->name = "net"; - dbg << connection.network(); - QVERIFY(QRegExp("IrcNetwork\\(0x[0-9A-Fa-f]+, name=obj, network=net\\) ").exactMatch(str)); - str.clear(); -#endif // Q_OS_LINUX - - dbg << IrcNetwork::MessageLength; - QCOMPARE(str.trimmed(), QString::fromLatin1("MessageLength")); - str.clear(); - - dbg << IrcNetwork::AllTypes; - QCOMPARE(str.trimmed(), QString::fromLatin1("AllTypes")); - str.clear(); - - dbg << (IrcNetwork::TypeA | IrcNetwork::TypeD); - QCOMPARE(str.trimmed(), QString::fromLatin1("(TypeA|TypeD)")); - str.clear(); - - dbg << (IrcNetwork::TypeB | IrcNetwork::TypeC); - QCOMPARE(str.trimmed(), QString::fromLatin1("(TypeB|TypeC)")); - str.clear(); - - dbg << (IrcNetwork::TypeA | IrcNetwork::TypeB | IrcNetwork::TypeC | IrcNetwork::TypeD); - QCOMPARE(str.trimmed(), QString::fromLatin1("(AllTypes)")); - str.clear(); -} - -QTEST_MAIN(tst_IrcNetwork) - -#include "tst_ircnetwork.moc" diff --git a/libcommuni/tests/auto/ircpalette/ircpalette.pro b/libcommuni/tests/auto/ircpalette/ircpalette.pro deleted file mode 100644 index a31264d..0000000 --- a/libcommuni/tests/auto/ircpalette/ircpalette.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircpalette.cpp - -include(../auto.pri) diff --git a/libcommuni/tests/auto/ircpalette/tst_ircpalette.cpp b/libcommuni/tests/auto/ircpalette/tst_ircpalette.cpp deleted file mode 100644 index 756b78d..0000000 --- a/libcommuni/tests/auto/ircpalette/tst_ircpalette.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "irc.h" -#include "ircpalette.h" -#include "irctextformat.h" -#include - -class tst_IrcPalette : public QObject -{ - Q_OBJECT - -private slots: - void testDefaults(); - void testColorNames(); - void testProperties_data(); - void testProperties(); -}; - -void tst_IrcPalette::testDefaults() -{ - IrcTextFormat format; - QVERIFY(format.palette()); - IrcPalette* palette = format.palette(); - QVERIFY(!palette->colorNames().isEmpty()); - for (int i = Irc::White; i <= Irc::LightGray; ++i) - QVERIFY(!palette->colorName(i).isEmpty()); - QCOMPARE(palette->colorName(-1, "fallback"), QString("fallback")); -} - -void tst_IrcPalette::testColorNames() -{ - IrcTextFormat format; - QVERIFY(format.palette()); - IrcPalette* palette = format.palette(); - QMap colorNames; - for (int i = -1; i <= 123; ++i) { - colorNames.insert(i, QString::number(i)); - palette->setColorName(i, QString::number(i)); - QCOMPARE(palette->colorName(i), QString::number(i)); - } - QCOMPARE(palette->colorNames(), colorNames); - - QMap dummies; - for (int i = 0; i < 100; i += 3) - dummies.insert(i, QString::number(i) + "-dummy"); - palette->setColorNames(dummies); - QCOMPARE(palette->colorNames(), dummies); -} - -void tst_IrcPalette::testProperties_data() -{ - QTest::addColumn("color"); - QTest::addColumn("prop"); - - QTest::newRow("white") << Irc::White << "white"; - QTest::newRow("black") << Irc::Black << "black"; - QTest::newRow("blue") << Irc::Blue << "blue"; - QTest::newRow("green") << Irc::Green << "green"; - QTest::newRow("red") << Irc::Red << "red"; - QTest::newRow("brown") << Irc::Brown << "brown"; - QTest::newRow("purple") << Irc::Purple << "purple"; - QTest::newRow("orange") << Irc::Orange << "orange"; - QTest::newRow("yellow") << Irc::Yellow << "yellow"; - QTest::newRow("lightGreen") << Irc::LightGreen << "lightGreen"; - QTest::newRow("cyan") << Irc::Cyan << "cyan"; - QTest::newRow("lightCyan") << Irc::LightCyan << "lightCyan"; - QTest::newRow("lightBlue") << Irc::LightBlue << "lightBlue"; - QTest::newRow("pink") << Irc::Pink << "pink"; - QTest::newRow("gray") << Irc::Gray << "gray"; - QTest::newRow("lightGray") << Irc::LightGray << "lightGray"; -} - -void tst_IrcPalette::testProperties() -{ - QFETCH(Irc::Color, color); - QFETCH(QString, prop); - - IrcTextFormat format; - QVERIFY(format.palette()); - IrcPalette* palette = format.palette(); - - QCOMPARE(palette->property(prop.toUtf8()).toString(), prop.toLower()); - - QVERIFY(palette->setProperty(prop.toUtf8(), QString("dummy"))); - QCOMPARE(palette->colorName(color), QString("dummy")); - QCOMPARE(palette->property(prop.toUtf8()).toString(), QString("dummy")); - - palette->setColorName(color, QString("dummier")); - QCOMPARE(palette->colorName(color), QString("dummier")); - QCOMPARE(palette->property(prop.toUtf8()).toString(), QString("dummier")); -} - -QTEST_MAIN(tst_IrcPalette) - -#include "tst_ircpalette.moc" diff --git a/libcommuni/tests/auto/irctextformat/irctextformat.pro b/libcommuni/tests/auto/irctextformat/irctextformat.pro deleted file mode 100644 index 3b90b66..0000000 --- a/libcommuni/tests/auto/irctextformat/irctextformat.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_irctextformat.cpp - -include(../auto.pri) diff --git a/libcommuni/tests/auto/irctextformat/tst_irctextformat.cpp b/libcommuni/tests/auto/irctextformat/tst_irctextformat.cpp deleted file mode 100644 index 377a438..0000000 --- a/libcommuni/tests/auto/irctextformat/tst_irctextformat.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "irc.h" -#include "irctextformat.h" -#include "ircpalette.h" -#include - -class tst_IrcTextFormat : public QObject -{ - Q_OBJECT - -private slots: - void testDefaults(); - void testPlainText_data(); - void testPlainText(); - void testHtml_data(); - void testHtml(); - void testUrls_data(); - void testUrls(); -}; - -void tst_IrcTextFormat::testDefaults() -{ - IrcTextFormat format; - QVERIFY(format.palette()); - QVERIFY(!format.urlPattern().isEmpty()); - QCOMPARE(format.spanFormat(), IrcTextFormat::SpanStyle); -} - -void tst_IrcTextFormat::testPlainText_data() -{ - QTest::addColumn("input"); - QTest::addColumn("output"); - - QTest::newRow("bold") << "\02bold\x0f" << "bold"; - QTest::newRow("line-through") << "\x13line-through\x0f" << "line-through"; - QTest::newRow("underline") << "\x15underline\x0f" << "underline"; - QTest::newRow("inverse") << "\x16inverse\x0f" << "inverse"; - QTest::newRow("italic") << "\x1ditalic\x0f" << "italic"; - QTest::newRow("underline") << "\x1funderline\x0f" << "underline"; - - IrcTextFormat format; - QVERIFY(format.palette()); - IrcPalette* palette = format.palette(); - for (int i = Irc::White; i <= Irc::LightGray; ++i) { - QString color = palette->colorName(i); - QTest::newRow(color.toUtf8()) << QString("\x03%1%2\x0f").arg(i).arg(color) << color; - } - - QTest::newRow("dummy \\x03") << "foo\x03 \02bold\x0f bar\x03" << "foo bold bar"; - QTest::newRow("extra \\x0f") << "foo\x0f \02bold\x0f bar\x0f" << "foo bold bar"; - QTest::newRow("background") << QString("foo \x03%1,%1red\x0f on \x03%1,%1red\x03 bar").arg(Irc::Red) << "foo red on red bar"; -} - -void tst_IrcTextFormat::testPlainText() -{ - QFETCH(QString, input); - QFETCH(QString, output); - - IrcTextFormat format; - QCOMPARE(format.toPlainText(input), output); - - format.parse(input); - QCOMPARE(format.plainText(), output); -} - -void tst_IrcTextFormat::testHtml_data() -{ - qRegisterMetaType(); - - QTest::addColumn("span"); - QTest::addColumn("input"); - QTest::addColumn("output"); - - QTest::newRow("style=bold") << IrcTextFormat::SpanStyle << "foo \02bold\x0f and \02bold\02 bar" << "foo bold and bold bar"; - QTest::newRow("class=bold") << IrcTextFormat::SpanClass << "foo \02bold\x0f and \02bold\02 bar" << "foo bold and bold bar"; - - QTest::newRow("style=line-through") << IrcTextFormat::SpanStyle << "foo \x13line\x0f and \x13through\x13 bar" << "foo line and through bar"; - QTest::newRow("class=line-through") << IrcTextFormat::SpanClass << "foo \x13line\x0f and \x13through\x13 bar" << "foo line and through bar"; - - QTest::newRow("style=underline1") << IrcTextFormat::SpanStyle << "foo \x15under\x0f and \x15line\x15 bar" << "foo under and line bar"; - - QTest::newRow("style=inverse") << IrcTextFormat::SpanStyle << "foo \x16inverse\x0f and \x16inverse\x16 bar" << "foo inverse and inverse bar"; - QTest::newRow("class=inverse") << IrcTextFormat::SpanClass << "foo \x16inverse\x0f and \x16inverse\x16 bar" << "foo inverse and inverse bar"; - - QTest::newRow("style=italic") << IrcTextFormat::SpanStyle << "foo \x1ditalic\x0f and \x1ditalic\x1d bar" << "foo italic and italic bar"; - QTest::newRow("class=italic") << IrcTextFormat::SpanClass << "foo \x1ditalic\x0f and \x1ditalic\x1d bar" << "foo italic and italic bar"; - - QTest::newRow("style=underline2") << IrcTextFormat::SpanStyle << "foo \x1funder\x0f and \x1fline\x1f bar" << "foo under and line bar"; - - IrcTextFormat format; - QVERIFY(format.palette()); - IrcPalette* palette = format.palette(); - for (int i = Irc::White; i <= Irc::LightGray; ++i) { - QString color = palette->colorName(i); - QTest::newRow(QString("style=%1").arg(color).toUtf8()) << IrcTextFormat::SpanStyle << QString("foo \x03%1%2\x0f and \x03%1%2\x03 bar").arg(i).arg(color) << QString("foo %1 and %1 bar").arg(color); - QTest::newRow(QString("class=%1").arg(color).toUtf8()) << IrcTextFormat::SpanClass << QString("foo \x03%1%2\x0f and \x03%1%2\x03 bar").arg(i).arg(color) << QString("foo %1 and %1 bar").arg(color); - } - - QTest::newRow("extra \\x0f") << IrcTextFormat::SpanStyle << "foo\x0f \02bold\x0f bar\x0f" << "foo bold bar"; - - QTest::newRow("style=background") << IrcTextFormat::SpanStyle << QString("foo \x03%1,%1red\x0f on \x03%1,%1red\x03 bar").arg(Irc::Red) << "foo red on red bar"; - QTest::newRow("class=background") << IrcTextFormat::SpanClass << QString("foo \x03%1,%1red\x0f on \x03%1,%1red\x03 bar").arg(Irc::Red) << "foo red on red bar"; -} - -void tst_IrcTextFormat::testHtml() -{ - QFETCH(IrcTextFormat::SpanFormat, span); - QFETCH(QString, input); - QFETCH(QString, output); - - IrcTextFormat format; - format.setSpanFormat(span); - QCOMPARE(format.toHtml(input), output); - - format.parse(input); - QCOMPARE(format.html(), output); -} - -Q_DECLARE_METATYPE(QList) -void tst_IrcTextFormat::testUrls_data() -{ - qRegisterMetaType >(); - - QTest::addColumn("pattern"); - QTest::addColumn("input"); - QTest::addColumn("output"); - QTest::addColumn >("urls"); - - QString defaultPattern = IrcTextFormat().urlPattern(); - - QTest::newRow("www.fi") << defaultPattern << "www.fi" << "www.fi" << (QList() << QUrl("http://www.fi")); - QTest::newRow("ftp.funet.fi") << defaultPattern << "ftp.funet.fi" << "ftp.funet.fi" << (QList() << QUrl("ftp://ftp.funet.fi")); - QTest::newRow("jpnurmi@gmail.com") << defaultPattern << "jpnurmi@gmail.com" << "jpnurmi@gmail.com" << (QList() << QUrl("mailto:jpnurmi@gmail.com")); - QTest::newRow("quote") << defaultPattern << "http://en.wikipedia.org/wiki/Shamir's_Secret_Sharing" << "http://en.wikipedia.org/wiki/Shamir's_Secret_Sharing" << (QList() << QUrl("http://en.wikipedia.org/wiki/Shamir's_Secret_Sharing")); - QTest::newRow("percent") << defaultPattern << "http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing" << "http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing" << (QList() << QUrl("http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing")); - QTest::newRow("parentheses") << defaultPattern << "http://en.wikipedia.org/wiki/Qt_(software)" << "http://en.wikipedia.org/wiki/Qt_(software)" << (QList() << QUrl("http://en.wikipedia.org/wiki/Qt_(software)")); - QTest::newRow("hash & comma") << defaultPattern << "https://codereview.qt-project.org/#change,1" << "https://codereview.qt-project.org/#change,1" << (QList() << QUrl("https://codereview.qt-project.org/#change,1")); - QTest::newRow("equal & question & ampersand") << defaultPattern << "https://www.google.no/imghp?hl=en&tab=wi" << "https://www.google.no/imghp?hl=en&tab=wi" << (QList() << QUrl("https://www.google.no/imghp?hl=en&tab=wi")); - QTest::newRow("github commits") << defaultPattern << "https://github.com/communi/libcommuni/compare/ebf3c8ea47dc...19d66ddcb122" << "https://github.com/communi/libcommuni/compare/ebf3c8ea47dc...19d66ddcb122" << (QList() << QUrl("https://github.com/communi/libcommuni/compare/ebf3c8ea47dc...19d66ddcb122")); - QTest::newRow("multiple") << defaultPattern << "www.fi ftp.funet.fi jpnurmi@gmail.com" << "www.fi ftp.funet.fi jpnurmi@gmail.com" << (QList() << QUrl("http://www.fi") << QUrl("ftp://ftp.funet.fi") << QUrl("mailto:jpnurmi@gmail.com")); - QTest::newRow("empty pattern") << QString() << "www.fi ftp.funet.fi jpnurmi@gmail.com" << "www.fi ftp.funet.fi jpnurmi@gmail.com" << QList(); - - QTest::newRow("info") << defaultPattern - << QString("[freenode-info] if you're at a conference and other people are having trouble connecting, please mention it to staff: http://freenode.net/faq.shtml#gettinghelp") - << QString("[freenode-info] if you're at a conference and other people are having trouble connecting, please mention it to staff: http://freenode.net/faq.shtml#gettinghelp") - << (QList() << QUrl("http://freenode.net/faq.shtml#gettinghelp")); - QTest::newRow("topic") << defaultPattern - << QString("Communi 1.2.2 - IRC framework || Home: http://communi.github.com || Docs: http://communi.github.com/doc || MeeGo: http://store.ovi.com/content/219150") - << QString("Communi 1.2.2 - IRC framework || Home: http://communi.github.com || Docs: http://communi.github.com/doc || MeeGo: http://store.ovi.com/content/219150") - << (QList() << QUrl("http://communi.github.com") << QUrl("http://communi.github.com/doc") << QUrl("http://store.ovi.com/content/219150")); - QTest::newRow("commit") << defaultPattern - << QString("[communi-desktop] jpnurmi pushed 2 new commits to master: https://github.com/communi/communi-desktop/compare/257ca915a490...8832bfe8d0b8") - << QString("[communi-desktop] jpnurmi pushed 2 new commits to master: https://github.com/communi/communi-desktop/compare/257ca915a490...8832bfe8d0b8") - << (QList() << QUrl("https://github.com/communi/communi-desktop/compare/257ca915a490...8832bfe8d0b8")); - QTest::newRow("with protocol") << defaultPattern - << QString("aa http://www.fi bb ftp://ftp.funet.fi cc") - << QString("aa http://www.fi bb ftp://ftp.funet.fi cc") - << (QList() << QUrl("http://www.fi") << QUrl("ftp://ftp.funet.fi")); - QTest::newRow("without protocol") << defaultPattern - << QString("aa www.fi bb ftp.funet.fi cc jpnurmi@gmail.com dd") - << QString("aa www.fi bb ftp.funet.fi cc jpnurmi@gmail.com dd") - << (QList() << QUrl("http://www.fi") << QUrl("ftp://ftp.funet.fi") << QUrl("mailto:jpnurmi@gmail.com")); -} - -void tst_IrcTextFormat::testUrls() -{ - QFETCH(QString, pattern); - QFETCH(QString, input); - QFETCH(QString, output); - QFETCH(QList, urls); - - IrcTextFormat format; - format.setUrlPattern(pattern); - QCOMPARE(format.urlPattern(), pattern); - QCOMPARE(format.toHtml(input), output); - - format.parse(input); - QCOMPARE(format.html(), output); - QCOMPARE(format.urls(), urls); -} - -QTEST_MAIN(tst_IrcTextFormat) - -#include "tst_irctextformat.moc" diff --git a/libcommuni/tests/auto/ircuser/ircuser.pro b/libcommuni/tests/auto/ircuser/ircuser.pro deleted file mode 100644 index b81617f..0000000 --- a/libcommuni/tests/auto/ircuser/ircuser.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircuser.cpp - -include(../auto.pri) diff --git a/libcommuni/tests/auto/ircuser/tst_ircuser.cpp b/libcommuni/tests/auto/ircuser/tst_ircuser.cpp deleted file mode 100644 index c575c14..0000000 --- a/libcommuni/tests/auto/ircuser/tst_ircuser.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircuser.h" -#include -#include -#ifdef Q_OS_LINUX -#include "ircuser_p.h" -#endif // Q_OS_LINUX - -class tst_IrcUser : public QObject -{ - Q_OBJECT - -private slots: - void testDefaults(); - void testSignals(); - void testDebug(); -}; - -void tst_IrcUser::testDefaults() -{ - IrcUser user; - QVERIFY(user.title().isEmpty()); - QVERIFY(user.name().isEmpty()); - QVERIFY(user.prefix().isEmpty()); - QVERIFY(user.mode().isEmpty()); - QVERIFY(!user.isServOp()); - QVERIFY(!user.isAway()); - QVERIFY(!user.channel()); -} - -void tst_IrcUser::testSignals() -{ - IrcUser user; - QSignalSpy titleSpy(&user, SIGNAL(titleChanged(QString))); - QSignalSpy nameSpy(&user, SIGNAL(nameChanged(QString))); - QSignalSpy prefixSpy(&user, SIGNAL(prefixChanged(QString))); - QSignalSpy modeSpy(&user, SIGNAL(modeChanged(QString))); - QSignalSpy servOpSpy(&user, SIGNAL(servOpChanged(bool))); - QSignalSpy awaySpy(&user, SIGNAL(awayChanged(bool))); - QVERIFY(titleSpy.isValid()); - QVERIFY(nameSpy.isValid()); - QVERIFY(prefixSpy.isValid()); - QVERIFY(modeSpy.isValid()); - QVERIFY(servOpSpy.isValid()); - QVERIFY(awaySpy.isValid()); -} - -void tst_IrcUser::testDebug() -{ - QString str; - QDebug dbg(&str); - - dbg << static_cast(0); - QCOMPARE(str.trimmed(), QString::fromLatin1("IrcUser(0x0)")); - str.clear(); - - IrcUser user; - dbg << &user; - QVERIFY(QRegExp("IrcUser\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); - str.clear(); - - user.setObjectName("obj"); - dbg << &user; - QVERIFY(QRegExp("IrcUser\\(0x[0-9A-Fa-f]+, name=obj\\) ").exactMatch(str)); - str.clear(); - -#ifdef Q_OS_LINUX - // others have problems with symbols (win) or private headers (osx frameworks) - IrcUserPrivate::get(&user)->setName("usr"); - dbg << &user; - QVERIFY(QRegExp("IrcUser\\(0x[0-9A-Fa-f]+, name=obj, user=usr\\) ").exactMatch(str)); - str.clear(); -#endif // Q_OS_LINUX -} - -QTEST_MAIN(tst_IrcUser) - -#include "tst_ircuser.moc" diff --git a/libcommuni/tests/auto/ircusermodel/ircusermodel.pro b/libcommuni/tests/auto/ircusermodel/ircusermodel.pro deleted file mode 100644 index 941d2ec..0000000 --- a/libcommuni/tests/auto/ircusermodel/ircusermodel.pro +++ /dev/null @@ -1,8 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircusermodel.cpp - -include(../shared/shared.pri) -include(../auto.pri) diff --git a/libcommuni/tests/auto/ircusermodel/tst_ircusermodel.cpp b/libcommuni/tests/auto/ircusermodel/tst_ircusermodel.cpp deleted file mode 100644 index 20c1d5f..0000000 --- a/libcommuni/tests/auto/ircusermodel/tst_ircusermodel.cpp +++ /dev/null @@ -1,1688 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircusermodel.h" -#include "ircconnection.h" -#include "ircbuffermodel.h" -#include "ircchannel.h" -#include "ircuser.h" -#include "irc.h" - -#include "tst_ircdata.h" -#include "tst_ircclientserver.h" - -#include - -static bool caseInsensitiveLessThan(const QString& s1, const QString& s2) -{ - return s1.compare(s2, Qt::CaseInsensitive) < 0; -} - -static bool caseInsensitiveGreaterThan(const QString& s1, const QString& s2) -{ - return s1.compare(s2, Qt::CaseInsensitive) > 0; -} - -class tst_IrcUserModel : public tst_IrcClientServer -{ - Q_OBJECT - -public: - tst_IrcUserModel(); - -private slots: - void testDefaults(); - void testClear(); - void testSorting_data(); - void testSorting(); - void testActivity_freenode(); - void testActivity_ircnet(); - void testActivity_euirc(); - void testChanges(); - void testRoles(); - void testAIM(); - void testUser(); -}; - -Q_DECLARE_METATYPE(QModelIndex) -tst_IrcUserModel::tst_IrcUserModel() -{ - Irc::registerMetaTypes(); - qRegisterMetaType(); - qRegisterMetaType("IrcUser*"); - qRegisterMetaType("IrcChannel*"); - qRegisterMetaType >("QList"); -} - -void tst_IrcUserModel::testDefaults() -{ - IrcUserModel model; - QCOMPARE(model.count(), 0); - QVERIFY(model.isEmpty()); - QVERIFY(model.names().isEmpty()); - QVERIFY(model.users().isEmpty()); - QCOMPARE(model.displayRole(), Irc::TitleRole); - QVERIFY(!model.channel()); - QCOMPARE(model.sortMethod(), Irc::SortByHand); - QCOMPARE(model.sortOrder(), Qt::AscendingOrder); -} - -void tst_IrcUserModel::testClear() -{ - IrcBufferModel bufferModel; - bufferModel.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(tst_IrcData::welcome())); - QCOMPARE(bufferModel.count(), 0); - waitForWritten(":communi!communi@hidd.en JOIN :#channel"); - QCOMPARE(bufferModel.count(), 1); - - QPointer channel = bufferModel.get(0)->toChannel(); - QVERIFY(channel); - - IrcUserModel userModel; - userModel.setChannel(channel); - waitForWritten(":irc.ser.ver 353 communi = #channel :a @b +c"); - waitForWritten(":irc.ser.ver 366 communi #channel :End of /NAMES list."); - QCOMPARE(userModel.count(), 3); - - QPointer a = userModel.find("a"); - QPointer b = userModel.find("b"); - QPointer c = userModel.find("c"); - - QVERIFY(a); - QVERIFY(b); - QVERIFY(c); - - QSignalSpy countSpy(&userModel, SIGNAL(countChanged(int))); - QSignalSpy emptySpy(&userModel, SIGNAL(emptyChanged(bool))); - QSignalSpy usersSpy(&userModel, SIGNAL(usersChanged(QList))); - QSignalSpy namesSpy(&userModel, SIGNAL(namesChanged(QStringList))); - QSignalSpy modelAboutToBeResetSpy(&userModel, SIGNAL(modelAboutToBeReset())); - QSignalSpy modelResetSpy(&userModel, SIGNAL(modelReset())); - - QVERIFY(countSpy.isValid()); - QVERIFY(emptySpy.isValid()); - QVERIFY(usersSpy.isValid()); - QVERIFY(namesSpy.isValid()); - QVERIFY(modelAboutToBeResetSpy.isValid()); - QVERIFY(modelResetSpy.isValid()); - - userModel.clear(); - - QCOMPARE(userModel.count(), 0); - QVERIFY(userModel.isEmpty()); - QCOMPARE(userModel.users(), QList()); - QCOMPARE(userModel.names(), QStringList()); - - QVERIFY(!userModel.get(0)); - QVERIFY(!userModel.find("a")); - QVERIFY(!userModel.find("b")); - QVERIFY(!userModel.find("c")); - QVERIFY(!userModel.contains("a")); - QVERIFY(!userModel.contains("b")); - QVERIFY(!userModel.contains("c")); - - QCOMPARE(countSpy.count(), 1); - QCOMPARE(countSpy.last().at(0).toInt(), 0); - - QCOMPARE(emptySpy.count(), 1); - QCOMPARE(emptySpy.last().at(0).toBool(), true); - - QCOMPARE(usersSpy.count(), 1); - QCOMPARE(usersSpy.last().at(0).value >(), QList()); - - QCOMPARE(namesSpy.count(), 1); - QCOMPARE(namesSpy.last().at(0).toStringList(), QStringList()); - - QCOMPARE(modelAboutToBeResetSpy.count(), 1); - QCOMPARE(modelResetSpy.count(), 1); - - QVERIFY(a); - QVERIFY(b); - QVERIFY(c); - - bufferModel.clear(); - - QVERIFY(!a); - QVERIFY(!b); - QVERIFY(!c); -} - -void tst_IrcUserModel::testSorting_data() -{ - QTest::addColumn("welcomeData"); - QTest::addColumn("joinData"); - QTest::addColumn("names"); - QTest::addColumn("admins"); - QTest::addColumn("ops"); - QTest::addColumn("halfops"); - QTest::addColumn("voices"); - - foreach (const QByteArray& key, tst_IrcData::keys()) { - QTest::newRow(key) - << tst_IrcData::welcome(key) - << tst_IrcData::join(key) - << tst_IrcData::names(key) - << tst_IrcData::admins(key) - << tst_IrcData::ops(key) - << tst_IrcData::halfops(key) - << tst_IrcData::voices(key); - } -} - -void tst_IrcUserModel::testSorting() -{ - QFETCH(QByteArray, welcomeData); - QFETCH(QByteArray, joinData); - QFETCH(QStringList, names); - QFETCH(QStringList, admins); - QFETCH(QStringList, ops); - QFETCH(QStringList, halfops); - QFETCH(QStringList, voices); - - IrcBufferModel bufferModel; - bufferModel.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(welcomeData)); - QCOMPARE(bufferModel.count(), 0); - - QVERIFY(waitForWritten(joinData)); - - QCOMPARE(bufferModel.count(), 1); - IrcChannel* channel = bufferModel.get(0)->toChannel(); - QVERIFY(channel); - - IrcUserModel staticModel(channel); - QCOMPARE(staticModel.count(), names.count()); - for (int i = 0; i < staticModel.count(); ++i) { - IrcUser* user = staticModel.get(i); - QCOMPARE(user->name(), names.at(i)); - if (admins.contains(user->name())) { - QCOMPARE(user->mode(), QString("a")); - QCOMPARE(user->prefix(), QString("!")); - } else if (ops.contains(user->name())) { - QCOMPARE(user->mode(), QString("o")); - QCOMPARE(user->prefix(), QString("@")); - } else if (halfops.contains(user->name())) { - QCOMPARE(user->mode(), QString("h")); - QCOMPARE(user->prefix(), QString("%")); - } else if (voices.contains(user->name())) { - QCOMPARE(user->mode(), QString("v")); - QCOMPARE(user->prefix(), QString("+")); - } - } - - QStringList sorted = names; - qSort(sorted); - QCOMPARE(staticModel.names(), sorted); - - // IGNORE INVALID COLUMNS - staticModel.sort(-1, Qt::AscendingOrder); - for (int i = 0; i < staticModel.count(); ++i) - QCOMPARE(staticModel.get(i)->name(), names.at(i)); - - staticModel.sort(1, Qt::AscendingOrder); - for (int i = 0; i < staticModel.count(); ++i) - QCOMPARE(staticModel.get(i)->name(), names.at(i)); - - // STATIC - BY NAME - ASCENDING - staticModel.setSortMethod(Irc::SortByName); - staticModel.sort(0, Qt::AscendingOrder); - - QStringList nasc = names; - qSort(nasc.begin(), nasc.end(), caseInsensitiveLessThan); - - for (int i = 0; i < staticModel.count(); ++i) - QCOMPARE(staticModel.get(i)->name(), nasc.at(i)); - - // STATIC - BY NAME - DESCENDING - staticModel.setSortMethod(Irc::SortByName); - staticModel.sort(0, Qt::DescendingOrder); - - QStringList ndesc = names; - qSort(ndesc.begin(), ndesc.end(), caseInsensitiveGreaterThan); - - for (int i = 0; i < staticModel.count(); ++i) - QCOMPARE(staticModel.get(i)->name(), ndesc.at(i)); - - // STATIC - BY TITLE - ASCENDING - staticModel.setSortMethod(Irc::SortByTitle); - staticModel.sort(0, Qt::AscendingOrder); - - QStringList aasc = admins; - qSort(aasc.begin(), aasc.end(), caseInsensitiveLessThan); - - QStringList oasc = ops; - qSort(oasc.begin(), oasc.end(), caseInsensitiveLessThan); - - QStringList hasc = halfops; - qSort(hasc.begin(), hasc.end(), caseInsensitiveLessThan); - - QStringList vasc = voices; - qSort(vasc.begin(), vasc.end(), caseInsensitiveLessThan); - - QStringList tasc = aasc + oasc + hasc + vasc + nasc; - // remove duplicates - foreach (const QString& voice, voices) - tasc.removeAt(tasc.lastIndexOf(voice)); - foreach (const QString& halfop, halfops) - tasc.removeAt(tasc.lastIndexOf(halfop)); - foreach (const QString& op, ops) - tasc.removeAt(tasc.lastIndexOf(op)); - foreach (const QString& admin, admins) - tasc.removeAt(tasc.lastIndexOf(admin)); - - for (int i = 0; i < staticModel.count(); ++i) - QCOMPARE(staticModel.get(i)->name(), tasc.at(i)); - - // STATIC - BY TITLE - DESCENDING - staticModel.setSortMethod(Irc::SortByTitle); - staticModel.sort(0, Qt::DescendingOrder); - - QStringList adesc = admins; - qSort(adesc.begin(), adesc.end(), caseInsensitiveGreaterThan); - - QStringList odesc = ops; - qSort(odesc.begin(), odesc.end(), caseInsensitiveGreaterThan); - - QStringList hdesc = halfops; - qSort(hdesc.begin(), hdesc.end(), caseInsensitiveGreaterThan); - - QStringList vdesc = voices; - qSort(vdesc.begin(), vdesc.end(), caseInsensitiveGreaterThan); - - QStringList tdesc = ndesc + vdesc + hdesc + odesc + adesc; - // remove duplicates - foreach (const QString& voice, voices) - tdesc.removeAt(tdesc.indexOf(voice)); - foreach (const QString& halfop, halfops) - tdesc.removeAt(tdesc.indexOf(halfop)); - foreach (const QString& op, ops) - tdesc.removeAt(tdesc.indexOf(op)); - foreach (const QString& admin, admins) - tdesc.removeAt(tdesc.indexOf(admin)); - - for (int i = 0; i < staticModel.count(); ++i) - QCOMPARE(staticModel.get(i)->name(), tdesc.at(i)); - - // DYNAMIC - BY NAME, TITLE & ACTIVITY - ASCENDING - IrcUserModel dynamicModel(channel); - - dynamicModel.setSortMethod(Irc::SortByName); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), nasc.at(i)); - - dynamicModel.setSortMethod(Irc::SortByTitle); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), tasc.at(i)); - - dynamicModel.setSortMethod(Irc::SortByActivity); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), names.at(i)); - - // DYNAMIC - BY NAME, TITLE & ACTIVITY - DESCENDING - dynamicModel.setSortOrder(Qt::DescendingOrder); - - dynamicModel.setSortMethod(Irc::SortByName); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), ndesc.at(i)); - - dynamicModel.setSortMethod(Irc::SortByTitle); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), tdesc.at(i)); - - dynamicModel.setSortMethod(Irc::SortByActivity); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), names.at(names.count() - 1 - i)); - - // RESTORE USERS IN ASCENDING ORDER - dynamicModel.setSortOrder(Qt::AscendingOrder); - - dynamicModel.setChannel(0); - dynamicModel.setSortMethod(Irc::SortByName); - dynamicModel.setChannel(channel); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), nasc.at(i)); - - dynamicModel.setChannel(0); - dynamicModel.setSortMethod(Irc::SortByTitle); - dynamicModel.setChannel(channel); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), tasc.at(i)); - - dynamicModel.setChannel(0); - dynamicModel.setSortMethod(Irc::SortByActivity); - dynamicModel.setChannel(channel); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), names.at(i)); - - // RESTORE USERS IN DESCENDING ORDER - dynamicModel.setSortOrder(Qt::DescendingOrder); - - dynamicModel.setChannel(0); - dynamicModel.setSortMethod(Irc::SortByName); - dynamicModel.setChannel(channel); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), ndesc.at(i)); - - dynamicModel.setChannel(0); - dynamicModel.setSortMethod(Irc::SortByTitle); - dynamicModel.setChannel(channel); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), tdesc.at(i)); - - dynamicModel.setChannel(0); - dynamicModel.setSortMethod(Irc::SortByActivity); - dynamicModel.setChannel(channel); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), names.at(names.count() - 1 - i)); - - // DO NOTHING - dynamicModel.sort(Irc::SortByHand); - for (int i = 0; i < dynamicModel.count(); ++i) - QCOMPARE(dynamicModel.get(i)->name(), names.at(names.count() - 1 - i)); -} - -void tst_IrcUserModel::testActivity_freenode() -{ - IrcBufferModel bufferModel; - bufferModel.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(tst_IrcData::welcome("freenode"))); - QCOMPARE(bufferModel.count(), 0); - - QVERIFY(waitForWritten(tst_IrcData::join("freenode"))); - - QCOMPARE(bufferModel.count(), 1); - IrcChannel* channel = bufferModel.get(0)->toChannel(); - QVERIFY(channel); - - QStringList names = tst_IrcData::names("freenode"); - - IrcUserModel activityModel(channel); - activityModel.setSortMethod(Irc::SortByActivity); - - int count = names.count(); - - QVERIFY(waitForWritten(":smurfy!~smurfy@hidd.en PART #freenode")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("smurfy")); - - QVERIFY(waitForWritten(":ToApolytoXaos!~ToApolyto@hidd.en QUIT :Quit: Leaving")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("ToApolytoXaos")); - - QVERIFY(waitForWritten(":agsrv!~guest@hidd.en JOIN #freenode")); - QCOMPARE(activityModel.count(), ++count); - QCOMPARE(activityModel.indexOf(activityModel.find("agsrv")), 0); - - QVERIFY(waitForWritten(":Hello71!~Hello71@hidd.en PRIVMSG #freenode :straterra: there are many users on it")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("Hello71")), 0); - QCOMPARE(activityModel.indexOf(activityModel.find("straterra")), 1); - - QVERIFY(waitForWritten(":straterra!straterra@hidd.en PRIVMSG #freenode :what?")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("straterra")), 0); - QCOMPARE(activityModel.indexOf(activityModel.find("Hello71")), 1); - - QVERIFY(waitForWritten(":JuxTApose!~indigital@hidd.en NICK :JuxTApose_afk")); - QCOMPARE(activityModel.count(), count); - QVERIFY(!activityModel.contains("JuxTApose")); - QCOMPARE(activityModel.indexOf(activityModel.find("JuxTApose_afk")), 0); - QCOMPARE(activityModel.indexOf(activityModel.find("straterra")), 1); - QCOMPARE(activityModel.indexOf(activityModel.find("Hello71")), 2); - - QVERIFY(waitForWritten(":communi!communi@hidd.en PRIVMSG #freenode :+tomaw: ping")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("communi")), 0); - QCOMPARE(activityModel.indexOf(activityModel.find("tomaw")), 1); - - QVERIFY(waitForWritten(":Hello71!~Hello71@hidd.en NOTICE #freenode :just testing...")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("Hello71")), 0); -} - -void tst_IrcUserModel::testActivity_ircnet() -{ - IrcBufferModel bufferModel; - bufferModel.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(tst_IrcData::welcome("ircnet"))); - QCOMPARE(bufferModel.count(), 0); - - QVERIFY(waitForWritten(tst_IrcData::join("ircnet"))); - - QCOMPARE(bufferModel.count(), 1); - IrcChannel* channel = bufferModel.get(0)->toChannel(); - QVERIFY(channel); - - QStringList names = tst_IrcData::names("ircnet"); - - IrcUserModel activityModel(channel); - activityModel.setSortMethod(Irc::SortByActivity); - - int count = names.count(); - - QVERIFY(waitForWritten(":_box!~box@hidd.en QUIT :Broken pipe")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("_box")); - - QVERIFY(waitForWritten(":ip!~v6@hidd.en QUIT :Connection reset by peer")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("ip")); - - QVERIFY(waitForWritten(":[m]!m@hidd.en MODE #uptimed +b *!*x@does.matter.not*")); - QCOMPARE(activityModel.count(), count); - - QVERIFY(waitForWritten(":[m]!m@hidd.en KICK #uptimed \\x00 :lame exit sorry :P")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("\\x00")); - - QVERIFY(waitForWritten(":_box!~box@hidd.en JOIN :#uptimed")); - QCOMPARE(activityModel.count(), ++count); - QCOMPARE(activityModel.indexOf(activityModel.find("_box")), 0); - - QVERIFY(waitForWritten(":Voicer!mrozu@hidd.en MODE #uptimed +v _box")); - QCOMPARE(activityModel.count(), count); - - QVERIFY(waitForWritten(":t0r-!t0r@hidd.en PRIVMSG #uptimed :there is no sense for _box and ip to join the contest")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("t0r-")), 0); - - QVERIFY(waitForWritten(":ip!~v6@hidd.en JOIN :#uptimed")); - QCOMPARE(activityModel.count(), ++count); - QCOMPARE(activityModel.indexOf(activityModel.find("ip")), 0); - - QVERIFY(waitForWritten(":Voicer!mrozu@hidd.en MODE #uptimed +v ip")); - QCOMPARE(activityModel.count(), count); - - QVERIFY(waitForWritten(":[m]!m@hidd.en MODE #uptimed +b *!*v6@*.does.matter.not")); - QCOMPARE(activityModel.count(), count); - - QVERIFY(waitForWritten(":[m]!m@hidd.en KICK #uptimed ip :no reason")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("ip")); - - QVERIFY(waitForWritten(":t0r-!t0r@hidd.en PRIVMSG #uptimed :they are going down every second")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("t0r-")), 0); - - QVERIFY(waitForWritten(":t0r-!t0r@hidd.en PRIVMSG #uptimed :yeah")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("t0r-")), 0); - - QVERIFY(waitForWritten(":[m]!m@hidd.en MODE #uptimed -b *!*box@*.does.not.matter")); - QCOMPARE(activityModel.count(), count); - - QVERIFY(waitForWritten(":[m]!m@hidd.en KICK #uptimed _box :no reason")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("_box")); -} - -void tst_IrcUserModel::testActivity_euirc() -{ - IrcBufferModel bufferModel; - bufferModel.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(tst_IrcData::welcome("euirc"))); - QCOMPARE(bufferModel.count(), 0); - - QVERIFY(waitForWritten(tst_IrcData::join("euirc"))); - - QCOMPARE(bufferModel.count(), 1); - IrcChannel* channel = bufferModel.get(0)->toChannel(); - QVERIFY(channel); - - QStringList names = tst_IrcData::names("euirc"); - - IrcUserModel activityModel(channel); - activityModel.setSortMethod(Irc::SortByActivity); - - int count = names.count(); - - QVERIFY(waitForWritten(":Marko10_000!~marko@hidd.en JOIN :#euirc\n")); - QCOMPARE(activityModel.count(), ++count); - QCOMPARE(activityModel.indexOf(activityModel.find("Marko10_000")), 0); - - QVERIFY(waitForWritten(":Marko10_000!~marko@hidd.en NICK :Guest775\n")); - QCOMPARE(activityModel.count(), count); - QVERIFY(!activityModel.contains("Marko10_000")); - QCOMPARE(activityModel.indexOf(activityModel.find("Guest775")), 0); - - QVERIFY(waitForWritten(":Guest775!~marko@hidd.en QUIT :Quit: Verlassend\n")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("Guest775")); - - QVERIFY(waitForWritten(":Marko10_000!~marko@hidd.en JOIN :#euirc\n")); - QCOMPARE(activityModel.count(), ++count); - QCOMPARE(activityModel.indexOf(activityModel.find("Marko10_000")), 0); - - QVERIFY(waitForWritten(":Guest774!absk007@hidd.en QUIT :Quit: Good Bye. I Quit...\n")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("Guest774")); - - QVERIFY(waitForWritten(":absk007!absk007@hidd.en JOIN :#euirc\n")); - QCOMPARE(activityModel.count(), ++count); - QCOMPARE(activityModel.indexOf(activityModel.find("absk007")), 0); - - QVERIFY(waitForWritten(":charly6!~Miranda@hidd.en QUIT :Client exited\n")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("charly6")); - - QVERIFY(waitForWritten(":absk007!absk007@hidd.en NICK :Guest776\n")); - QCOMPARE(activityModel.count(), count); - QVERIFY(!activityModel.contains("absk007")); - QCOMPARE(activityModel.indexOf(activityModel.find("Guest776")), 0); - - QVERIFY(waitForWritten(":Tina-chan_onAir!~kvirc@hidd.en NICK :Tina-chan\n")); - QCOMPARE(activityModel.count(), count); - QVERIFY(!activityModel.contains("Tina-chan_onAir")); - QCOMPARE(activityModel.indexOf(activityModel.find("Tina-chan")), 0); - - QVERIFY(waitForWritten(":Guest776!absk007@hidd.en NICK :absk007\n")); - QCOMPARE(activityModel.count(), count); - QVERIFY(!activityModel.contains("Guest776")); - QCOMPARE(activityModel.indexOf(activityModel.find("absk007")), 0); - - QVERIFY(waitForWritten(":aleksandr!~aleksandr@hidd.en PRIVMSG #euirc :absk007, last warning. fix your client/script\n")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("aleksandr")), 0); - QCOMPARE(activityModel.indexOf(activityModel.find("absk007")), 1); - - QVERIFY(waitForWritten(":charly6!~Miranda@hidd.en JOIN :#euirc\n")); - QCOMPARE(activityModel.count(), ++count); - QCOMPARE(activityModel.indexOf(activityModel.find("charly6")), 0); - - QVERIFY(waitForWritten(":absk007!absk007@hidd.en PRIVMSG #euirc :aleksandr, what did i do this time?\n")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("absk007")), 0); - QCOMPARE(activityModel.indexOf(activityModel.find("aleksandr")), 1); - - QVERIFY(waitForWritten(":aleksandr!~aleksandr@hidd.en PRIVMSG #euirc :if you need help, join #opers\n")); - QCOMPARE(activityModel.count(), count); - QCOMPARE(activityModel.indexOf(activityModel.find("aleksandr")), 0); - - QVERIFY(waitForWritten(":charly6!~Miranda@hidd.en QUIT :Client exited\n")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("charly6")); - - QVERIFY(waitForWritten(":icefly!~icefly@hidd.en PART #euirc :Once you know what it is you want to be true, instinct is a very useful device for enabling you to know that it is\n")); - QCOMPARE(activityModel.count(), --count); - QVERIFY(!activityModel.contains("icefly")); - - QVERIFY(waitForWritten(":icefly!~icefly@hidd.en JOIN :#euirc\n")); - QCOMPARE(activityModel.count(), ++count); - QCOMPARE(activityModel.indexOf(activityModel.find("icefly")), 0); -} - -void tst_IrcUserModel::testChanges() -{ - IrcUserModel userModel; - - // IrcUserModel signals - QSignalSpy addedSpy(&userModel, SIGNAL(added(IrcUser*))); - QSignalSpy removedSpy(&userModel, SIGNAL(removed(IrcUser*))); - QSignalSpy aboutToBeAddedSpy(&userModel, SIGNAL(aboutToBeAdded(IrcUser*))); - QSignalSpy aboutToBeRemovedSpy(&userModel, SIGNAL(aboutToBeRemoved(IrcUser*))); - QSignalSpy countChangedSpy(&userModel, SIGNAL(countChanged(int))); - QSignalSpy namesChangedSpy(&userModel, SIGNAL(namesChanged(QStringList))); - QSignalSpy usersChangedSpy(&userModel, SIGNAL(usersChanged(QList))); - QSignalSpy channelChangedSpy(&userModel, SIGNAL(channelChanged(IrcChannel*))); - - QVERIFY(addedSpy.isValid()); - QVERIFY(removedSpy.isValid()); - QVERIFY(aboutToBeAddedSpy.isValid()); - QVERIFY(aboutToBeRemovedSpy.isValid()); - QVERIFY(countChangedSpy.isValid()); - QVERIFY(namesChangedSpy.isValid()); - QVERIFY(usersChangedSpy.isValid()); - QVERIFY(channelChangedSpy.isValid()); - - int aboutToBeAddedCount = 0, addedCount = 0; - int aboutToBeRemovedCount = 0, removedCount = 0; - int countChangedCount = 0; - int namesChangedCount = 0; - int usersChangedCount = 0; - int channelChangedCount = 0; - - // relevant QAbstractItemModel signals - QSignalSpy dataChangedSpy(&userModel, SIGNAL(dataChanged(QModelIndex,QModelIndex))); - QSignalSpy modelAboutToBeResetSpy(&userModel, SIGNAL(modelAboutToBeReset())); - QSignalSpy modelResetSpy(&userModel, SIGNAL(modelReset())); - QSignalSpy layoutAboutToBeChangedSpy(&userModel, SIGNAL(layoutAboutToBeChanged())); - QSignalSpy layoutChangedSpy(&userModel, SIGNAL(layoutChanged())); - QSignalSpy rowsAboutToBeInsertedSpy(&userModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); - QSignalSpy rowsInsertedSpy(&userModel, SIGNAL(rowsInserted(QModelIndex,int,int))); - QSignalSpy rowsAboutToBeRemovedSpy(&userModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); - QSignalSpy rowsRemovedSpy(&userModel, SIGNAL(rowsRemoved(QModelIndex,int,int))); - - QVERIFY(dataChangedSpy.isValid()); - QVERIFY(modelAboutToBeResetSpy.isValid()); - QVERIFY(modelResetSpy.isValid()); - QVERIFY(layoutAboutToBeChangedSpy.isValid()); - QVERIFY(layoutChangedSpy.isValid()); - QVERIFY(rowsAboutToBeInsertedSpy.isValid()); - QVERIFY(rowsInsertedSpy.isValid()); - QVERIFY(rowsAboutToBeRemovedSpy.isValid()); - QVERIFY(rowsRemovedSpy.isValid()); - - int dataChangedCount = 0; - int modelAboutToBeResetCount = 0, modelResetCount = 0; - int layoutAboutToBeChangedCount = 0, layoutChangedCount = 0; - int rowsAboutToBeInsertedCount = 0, rowsInsertedCount = 0; - int rowsAboutToBeRemovedCount = 0, rowsRemovedCount = 0; - - // ### setup #communi (5): communi @ChanServ +qtassistant Guest1234 +qout - IrcBufferModel bufferModel; - bufferModel.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(tst_IrcData::welcome())); - QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN :#communi")); - QVERIFY(waitForWritten(":irc.ifi.uio.no 353 communi = #communi :communi @ChanServ +qtassistant Guest1234 +qout")); - QVERIFY(waitForWritten(":irc.ifi.uio.no 366 communi #communi :End of NAMES list.")); - QCOMPARE(bufferModel.count(), 1); - IrcChannel* channel = bufferModel.get(0)->toChannel(); - QVERIFY(channel); - QCOMPARE(channel->title(), QString("#communi")); - - // ### ready to go! - userModel.setChannel(channel); - QCOMPARE(channelChangedSpy.count(), ++channelChangedCount); - QCOMPARE(channelChangedSpy.last().at(0).value(), channel); - QCOMPARE(modelAboutToBeResetSpy.count(), ++modelAboutToBeResetCount); - QCOMPARE(modelResetSpy.count(), ++modelResetCount); - - QStringList names = QStringList() << "communi" << "ChanServ" << "qtassistant" << "Guest1234" << "qout"; - QStringList titles = QStringList() << "communi" << "@ChanServ" << "+qtassistant" << "Guest1234" << "+qout"; - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - } - - QPointer communi = userModel.get(0); - QVERIFY(communi); - QCOMPARE(communi->name(), QString("communi")); - QCOMPARE(communi->mode(), QString()); - QCOMPARE(communi->prefix(), QString()); - - QPointer ChanServ = userModel.get(1); - QVERIFY(ChanServ); - QCOMPARE(ChanServ->name(), QString("ChanServ")); - QCOMPARE(ChanServ->mode(), QString("o")); - QCOMPARE(ChanServ->prefix(), QString("@")); - - QPointer qtassistant = userModel.get(2); - QVERIFY(qtassistant); - QCOMPARE(qtassistant->name(), QString("qtassistant")); - QCOMPARE(qtassistant->mode(), QString("v")); - QCOMPARE(qtassistant->prefix(), QString("+")); - - QPointer Guest1234 = userModel.get(3); - QVERIFY(Guest1234); - QCOMPARE(Guest1234->name(), QString("Guest1234")); - QCOMPARE(Guest1234->mode(), QString()); - QCOMPARE(Guest1234->prefix(), QString()); - - QPointer qout = userModel.get(4); - QVERIFY(qout); - QCOMPARE(qout->name(), QString("qout")); - QCOMPARE(qout->mode(), QString("v")); - QCOMPARE(qout->prefix(), QString("+")); - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), 5); - - QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); - QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest1234" << "communi" << "qout" << "qtassistant"); - - QList users = QList() << communi << ChanServ << qtassistant << Guest1234 << qout; - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), users); - - // ### trigger sort -> layout change - userModel.setSortMethod(Irc::SortByTitle); - QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); - QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); - - // Irc::SortByTitle - users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; - names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest1234"; - titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest1234"; - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - // ### trigger sort -> layout change - userModel.setSortMethod(Irc::SortByName); - QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); - QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); - - // Irc::SortByName - users = QList() << ChanServ << communi << Guest1234 << qout << qtassistant; - names = QStringList() << "ChanServ" << "communi" << "Guest1234" << "qout" << "qtassistant"; - titles = QStringList() << "@ChanServ" << "communi" << "Guest1234" << "+qout" << "+qtassistant"; - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - // ### trigger model reset - userModel.setChannel(0); - QCOMPARE(channelChangedSpy.count(), ++channelChangedCount); - QCOMPARE(channelChangedSpy.last().at(0).value(), static_cast(0)); - QCOMPARE(modelAboutToBeResetSpy.count(), ++modelAboutToBeResetCount); - QCOMPARE(modelResetSpy.count(), ++modelResetCount); - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), 0); - - QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); - QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList()); - - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), QList()); - - // ### empty model -> no layout change - userModel.setSortMethod(Irc::SortByActivity); - QCOMPARE(layoutAboutToBeChangedSpy.count(), layoutAboutToBeChangedCount); - QCOMPARE(layoutChangedSpy.count(), layoutChangedCount); - - // ### reset again - userModel.setChannel(channel); - QCOMPARE(modelAboutToBeResetSpy.count(), ++modelAboutToBeResetCount); - QCOMPARE(modelResetSpy.count(), ++modelResetCount); - - // Irc::SortByActivity - users = QList() << communi << ChanServ << qtassistant << Guest1234 << qout; - names = QStringList() << "communi" << "ChanServ" << "qtassistant" << "Guest1234" << "qout"; - titles = QStringList() << "communi" << "@ChanServ" << "+qtassistant" << "Guest1234" << "+qout"; - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), users.count()); - - QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); - QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest1234" << "communi" << "qout" << "qtassistant"); - - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), users); - - QSignalSpy guestTitleChangedSpy(Guest1234, SIGNAL(titleChanged(QString))); - QSignalSpy guestNameChangedSpy(Guest1234, SIGNAL(nameChanged(QString))); - QSignalSpy guestPrefixChangedSpy(Guest1234, SIGNAL(prefixChanged(QString))); - QSignalSpy guestModeChangedSpy(Guest1234, SIGNAL(modeChanged(QString))); - QVERIFY(guestTitleChangedSpy.isValid()); - QVERIFY(guestNameChangedSpy.isValid()); - QVERIFY(guestPrefixChangedSpy.isValid()); - QVERIFY(guestModeChangedSpy.isValid()); - - int guestTitleChangedCount = 0; - int guestNameChangedCount = 0; - int guestPrefixChangedCount = 0; - int guestModeChangedCount = 0; - - // ### sorted by activity -> trigger a change in names & users, count remains intact - QVERIFY(waitForWritten(":Guest1234!~Guest1234@hidd.en NICK :Guest5678")); - - QCOMPARE(Guest1234->name(), QString("Guest5678")); - QCOMPARE(Guest1234->title(), QString("Guest5678")); - - QCOMPARE(guestTitleChangedSpy.count(), ++guestTitleChangedCount); - QCOMPARE(guestTitleChangedSpy.last().at(0).toString(), QString("Guest5678")); - - QCOMPARE(guestNameChangedSpy.count(), ++guestNameChangedCount); - QCOMPARE(guestNameChangedSpy.last().at(0).toString(), QString("Guest5678")); - - QCOMPARE(guestPrefixChangedSpy.count(), guestPrefixChangedCount); - QCOMPARE(guestModeChangedSpy.count(), guestModeChangedCount); - - int previousIndex = users.indexOf(Guest1234); - - // Irc::SortByActivity - users = QList() << Guest1234 << communi << ChanServ << qtassistant << qout; - names = QStringList() << "Guest5678" << "communi" << "ChanServ" << "qtassistant" << "qout"; - titles = QStringList() << "Guest5678" << "communi" << "@ChanServ" << "+qtassistant" << "+qout"; - - int nextIndex = users.indexOf(Guest1234); - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), countChangedCount); - - QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); - QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest5678" << "communi" << "qout" << "qtassistant"); - - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), users); - - QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); - QModelIndex topLeft = dataChangedSpy.last().at(0).value(); - QModelIndex bottomRight = dataChangedSpy.last().at(0).value(); - QVERIFY(topLeft.isValid()); - QVERIFY(bottomRight.isValid()); - QVERIFY(topLeft == bottomRight); - QCOMPARE(topLeft.row(), previousIndex); - QCOMPARE(topLeft.column(), 0); - - // TODO: nick change AND activity promotion - // => would ideally still result to just one change... - rowsAboutToBeRemovedCount += 2; - rowsRemovedCount += 2; - rowsAboutToBeInsertedCount += 2; - rowsInsertedCount += 2; - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - // ### trigger sort -> layout change - userModel.setSortMethod(Irc::SortByTitle); - QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); - QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); - - // Irc::SortByTitle - users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; - names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest5678"; - titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest5678"; - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - // ### sorted by title -> trigger a change in names & users, count remains intact - QVERIFY(waitForWritten(":Guest5678!~Guest1234@hidd.en NICK :Guest1234")); - - QCOMPARE(Guest1234->name(), QString("Guest1234")); - QCOMPARE(Guest1234->title(), QString("Guest1234")); - - QCOMPARE(guestTitleChangedSpy.count(), ++guestTitleChangedCount); - QCOMPARE(guestTitleChangedSpy.last().at(0).toString(), QString("Guest1234")); - - QCOMPARE(guestNameChangedSpy.count(), ++guestNameChangedCount); - QCOMPARE(guestNameChangedSpy.last().at(0).toString(), QString("Guest1234")); - - QCOMPARE(guestPrefixChangedSpy.count(), guestPrefixChangedCount); - QCOMPARE(guestModeChangedSpy.count(), guestModeChangedCount); - - previousIndex = users.indexOf(Guest1234); - - // Irc::SortByTitle - users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; - names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest1234"; - titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest1234"; - - nextIndex = users.indexOf(Guest1234); - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), countChangedCount); - - QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); - QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest1234" << "communi" << "qout" << "qtassistant"); - - QCOMPARE(usersChangedSpy.count(), usersChangedCount); - - QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); - topLeft = dataChangedSpy.last().at(0).value(); - bottomRight = dataChangedSpy.last().at(1).value(); - QVERIFY(topLeft.isValid()); - QVERIFY(bottomRight.isValid()); - QVERIFY(topLeft == bottomRight); - QCOMPARE(topLeft.row(), 4); - QCOMPARE(topLeft.column(), 0); - - // TODO: nick change without index change - // => would ideally result to merely a data change... - QCOMPARE(previousIndex, nextIndex); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); - QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - // ### sorted by title -> trigger a change in users, count & names remain intact - QVERIFY(waitForWritten(":ChanServ!ChanServ@services. MODE #communi +v Guest1234")); - - QCOMPARE(Guest1234->name(), QString("Guest1234")); - QCOMPARE(Guest1234->title(), QString("+Guest1234")); - QCOMPARE(Guest1234->prefix(), QString("+")); - QCOMPARE(Guest1234->mode(), QString("v")); - - QCOMPARE(guestTitleChangedSpy.count(), ++guestTitleChangedCount); - QCOMPARE(guestTitleChangedSpy.last().at(0).toString(), QString("+Guest1234")); - - QCOMPARE(guestNameChangedSpy.count(), guestNameChangedCount); - - QCOMPARE(guestPrefixChangedSpy.count(), ++guestPrefixChangedCount); - QCOMPARE(guestPrefixChangedSpy.last().at(0).toString(), QString("+")); - - QCOMPARE(guestModeChangedSpy.count(), ++guestModeChangedCount); - QCOMPARE(guestModeChangedSpy.last().at(0).toString(), QString("v")); - - previousIndex = users.indexOf(Guest1234); - - // Irc::SortByTitle - users = QList() << ChanServ << Guest1234 << qout << qtassistant << communi; - names = QStringList() << "ChanServ" << "Guest1234" << "qout" << "qtassistant" << "communi"; - titles = QStringList() << "@ChanServ" << "+Guest1234" << "+qout" << "+qtassistant" << "communi"; - - nextIndex = users.indexOf(Guest1234); - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), countChangedCount); - - QCOMPARE(namesChangedSpy.count(), namesChangedCount); - - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), users); - - QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); - topLeft = dataChangedSpy.last().at(0).value(); - bottomRight = dataChangedSpy.last().at(1).value(); - QVERIFY(topLeft.isValid()); - QVERIFY(bottomRight.isValid()); - QVERIFY(topLeft == bottomRight); - QCOMPARE(topLeft.row(), previousIndex); - QCOMPARE(topLeft.column(), 0); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); - QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - // ### sorted by title -> trigger a change in users, count & names remain intact - QVERIFY(waitForWritten(":ChanServ!ChanServ@services. MODE #communi -v Guest1234")); - - QCOMPARE(Guest1234->name(), QString("Guest1234")); - QCOMPARE(Guest1234->title(), QString("Guest1234")); - QCOMPARE(Guest1234->prefix(), QString()); - QCOMPARE(Guest1234->mode(), QString()); - - QCOMPARE(guestTitleChangedSpy.count(), ++guestTitleChangedCount); - QCOMPARE(guestTitleChangedSpy.last().at(0).toString(), QString("Guest1234")); - - QCOMPARE(guestNameChangedSpy.count(), guestNameChangedCount); - - QCOMPARE(guestPrefixChangedSpy.count(), ++guestPrefixChangedCount); - QCOMPARE(guestPrefixChangedSpy.last().at(0).toString(), QString()); - - QCOMPARE(guestModeChangedSpy.count(), ++guestModeChangedCount); - QCOMPARE(guestModeChangedSpy.last().at(0).toString(), QString()); - - previousIndex = users.indexOf(Guest1234); - - // Irc::SortByTitle - users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; - names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest1234"; - titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest1234"; - - nextIndex = users.indexOf(Guest1234); - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), countChangedCount); - - QCOMPARE(namesChangedSpy.count(), namesChangedCount); - - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), users); - - QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); - topLeft = dataChangedSpy.last().at(0).value(); - bottomRight = dataChangedSpy.last().at(1).value(); - QVERIFY(topLeft.isValid()); - QVERIFY(bottomRight.isValid()); - QVERIFY(topLeft == bottomRight); - QCOMPARE(topLeft.row(), previousIndex); - QCOMPARE(topLeft.column(), 0); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); - QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - // ### sorted by title -> trigger a change in count, users & names - QVERIFY(waitForWritten(":Guest1234!~Guest1234@hidd.en PART #communi")); - - QVERIFY(Guest1234); // deleteLater()'d - - QCOMPARE(aboutToBeRemovedSpy.count(), ++aboutToBeRemovedCount); - QCOMPARE(aboutToBeRemovedSpy.last().at(0).value(), Guest1234.data()); - - QCOMPARE(removedSpy.count(), ++removedCount); - QCOMPARE(removedSpy.last().at(0).value(), Guest1234.data()); - - previousIndex = users.indexOf(Guest1234); - - QCoreApplication::sendPostedEvents(Guest1234, QEvent::DeferredDelete); - QVERIFY(!Guest1234); - - // Irc::SortByTitle - users = QList() << ChanServ << qout << qtassistant << communi; - names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi"; - titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi"; - - nextIndex = users.indexOf(Guest1234); - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), users.count()); - - QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); - QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "communi" << "qout" << "qtassistant"); - - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), users); - - QCOMPARE(dataChangedSpy.count(), dataChangedCount); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); - QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); - - QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); - - // ### sorted by title -> trigger a change in count, users & names - QVERIFY(waitForWritten(":Guest1234!~Guest1234@hidd.en JOIN #communi")); - - Guest1234 = userModel.find("Guest1234"); - QVERIFY(Guest1234); - - QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); - QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), Guest1234.data()); - - QCOMPARE(addedSpy.count(), ++addedCount); - QCOMPARE(addedSpy.last().at(0).value(), Guest1234.data()); - - previousIndex = users.indexOf(Guest1234); - - // Irc::SortByTitle - users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; - names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest1234"; - titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest1234"; - - nextIndex = users.indexOf(Guest1234); - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), users.count()); - - QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); - QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest1234" << "communi" << "qout" << "qtassistant"); - - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), users); - - QCOMPARE(dataChangedSpy.count(), dataChangedCount); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - QPointer Bot = Guest1234; - - QSignalSpy botTitleChangedSpy(Guest1234, SIGNAL(titleChanged(QString))); - QSignalSpy botNameChangedSpy(Guest1234, SIGNAL(nameChanged(QString))); - QSignalSpy botPrefixChangedSpy(Guest1234, SIGNAL(prefixChanged(QString))); - QSignalSpy botModeChangedSpy(Guest1234, SIGNAL(modeChanged(QString))); - QVERIFY(botTitleChangedSpy.isValid()); - QVERIFY(botNameChangedSpy.isValid()); - QVERIFY(botPrefixChangedSpy.isValid()); - QVERIFY(botModeChangedSpy.isValid()); - - int botTitleChangedCount = 0; - int botNameChangedCount = 0; - int botPrefixChangedCount = 0; - int botModeChangedCount = 0; - - // ### sorted by title -> trigger a change in users & names, count remains intact - QVERIFY(waitForWritten(":Guest1234!~Guest1234@hidd.en NICK :Bot")); - - QCOMPARE(Bot->name(), QString("Bot")); - QCOMPARE(Bot->title(), QString("Bot")); - - QCOMPARE(botTitleChangedSpy.count(), ++botTitleChangedCount); - QCOMPARE(botTitleChangedSpy.last().at(0).toString(), QString("Bot")); - - QCOMPARE(botNameChangedSpy.count(), ++botNameChangedCount); - QCOMPARE(botNameChangedSpy.last().at(0).toString(), QString("Bot")); - - QCOMPARE(botPrefixChangedSpy.count(), botPrefixChangedCount); - QCOMPARE(botModeChangedSpy.count(), botModeChangedCount); - - previousIndex = users.indexOf(Bot); - - // Irc::SortByTitle - users = QList() << ChanServ << qout << qtassistant << Bot << communi; - names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "Bot" << "communi"; - titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "Bot" << "communi"; - - nextIndex = users.indexOf(Bot); - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), countChangedCount); - - QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); - QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "Bot" << "ChanServ" << "communi" << "qout" << "qtassistant"); - - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), users); - - QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); - topLeft = dataChangedSpy.last().at(0).value(); - bottomRight = dataChangedSpy.last().at(0).value(); - QVERIFY(topLeft.isValid()); - QVERIFY(bottomRight.isValid()); - QVERIFY(topLeft == bottomRight); - QCOMPARE(topLeft.row(), previousIndex); - QCOMPARE(topLeft.column(), 0); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); - QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); - QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - // ### sorted by name, descending -> trigger a change in count, users & names - userModel.setSortOrder(Qt::DescendingOrder); - userModel.setSortMethod(Irc::SortByName); - QVERIFY(waitForWritten(":fake!fake@hidd.en JOIN #communi")); - - QPointer fake = userModel.find("fake"); - QVERIFY(fake); - - QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); - QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), fake.data()); - - QCOMPARE(addedSpy.count(), ++addedCount); - QCOMPARE(addedSpy.last().at(0).value(), fake.data()); - - previousIndex = users.indexOf(fake); - - // Irc::SortByName - descending - users = QList() << qtassistant << qout << fake << communi << ChanServ << Bot; - names = QStringList() << "qtassistant" << "qout" << "fake" << "communi" << "ChanServ" << "Bot"; - titles = QStringList() << "+qtassistant" << "+qout" << "fake" << "communi" << "@ChanServ" << "Bot"; - - nextIndex = users.indexOf(fake); - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), ++countChangedCount); - QCOMPARE(countChangedSpy.last().at(0).toInt(), users.count()); - - QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); - QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "Bot" << "ChanServ" << "communi" << "fake" << "qout" << "qtassistant"); - - QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); - QCOMPARE(usersChangedSpy.last().at(0).value >(), users); - - QCOMPARE(dataChangedSpy.count(), dataChangedCount); - - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - - QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); - - QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); - QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); - QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); - QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); - - // QUIT -> no changes - QVERIFY(waitForWritten(":communi!communi@hidd.en QUIT :bye")); - - QCOMPARE(userModel.count(), names.count()); - for (int i = 0; i < userModel.count(); ++i) { - QCOMPARE(userModel.get(i)->name(), names.at(i)); - QCOMPARE(userModel.get(i)->title(), titles.at(i)); - QCOMPARE(userModel.get(i), users.at(i)); - } - - QCOMPARE(countChangedSpy.count(), countChangedCount); - QCOMPARE(namesChangedSpy.count(), namesChangedCount); - QCOMPARE(usersChangedSpy.count(), usersChangedCount); - QCOMPARE(dataChangedSpy.count(), dataChangedCount); - QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); - QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); - QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); - QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); - QCOMPARE(modelAboutToBeResetSpy.count(), modelAboutToBeResetCount); - QCOMPARE(modelResetSpy.count(), modelResetCount); -} - -void tst_IrcUserModel::testRoles() -{ - IrcUserModel model; - QHash roles = model.roleNames(); - QCOMPARE(roles.take(Qt::DisplayRole), QByteArray("display")); - QCOMPARE(roles.take(Irc::UserRole), QByteArray("user")); - QCOMPARE(roles.take(Irc::NameRole), QByteArray("name")); - QCOMPARE(roles.take(Irc::PrefixRole), QByteArray("prefix")); - QCOMPARE(roles.take(Irc::ModeRole), QByteArray("mode")); - QCOMPARE(roles.take(Irc::TitleRole), QByteArray("title")); - QVERIFY(roles.isEmpty()); -} - -void tst_IrcUserModel::testAIM() -{ - IrcBufferModel bufferModel; - bufferModel.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(tst_IrcData::welcome())); - QCOMPARE(bufferModel.count(), 0); - waitForWritten(":communi!communi@hidd.en JOIN :#channel"); - QCOMPARE(bufferModel.count(), 1); - - IrcUserModel userModel(bufferModel.get(0)); - waitForWritten(":irc.ser.ver 353 communi = #channel :a @b +c"); - waitForWritten(":irc.ser.ver 366 communi #channel :End of /NAMES list."); - QCOMPARE(userModel.count(), 3); - - IrcUser* a = userModel.find("a"); - IrcUser* b = userModel.find("b"); - IrcUser* c = userModel.find("c"); - IrcUser* o = 0; - - QVERIFY(a); - QVERIFY(b); - QVERIFY(c); - - QAbstractItemModel* aim = &userModel; - QModelIndex ai = aim->index(0, 0); - QModelIndex bi = aim->index(1, 0); - QModelIndex ci = aim->index(2, 0); - QModelIndex oi = aim->index(100, 100); - - QVERIFY(ai.isValid()); - QVERIFY(bi.isValid()); - QVERIFY(ci.isValid()); - QVERIFY(!oi.isValid()); - - QCOMPARE(aim->rowCount(QModelIndex()), 3); - QCOMPARE(aim->rowCount(ai), 0); - - QCOMPARE(aim->columnCount(QModelIndex()), 1); - QCOMPARE(aim->columnCount(ai), 0); - - QCOMPARE(userModel.index(a), ai); - QCOMPARE(userModel.index(b), bi); - QCOMPARE(userModel.index(c), ci); - QVERIFY(!userModel.index(o).isValid()); - - QCOMPARE(userModel.user(ai), a); - QCOMPARE(userModel.user(bi), b); - QCOMPARE(userModel.user(ci), c); - QVERIFY(!userModel.user(oi)); - - userModel.setDisplayRole(Irc::TitleRole); - QCOMPARE(aim->data(ai, Qt::DisplayRole).toString(), a->title()); - QCOMPARE(aim->data(bi, Qt::DisplayRole).toString(), b->title()); - QCOMPARE(aim->data(ci, Qt::DisplayRole).toString(), c->title()); - QVERIFY(aim->data(oi, Qt::DisplayRole).toString().isEmpty()); - - userModel.setDisplayRole(Irc::UserRole); - QCOMPARE(aim->data(ai, Qt::DisplayRole).value(), a); - QCOMPARE(aim->data(bi, Qt::DisplayRole).value(), b); - QCOMPARE(aim->data(ci, Qt::DisplayRole).value(), c); - QVERIFY(!aim->data(oi, Qt::DisplayRole).value()); - - QCOMPARE(aim->data(ai, Irc::UserRole).value(), a); - QCOMPARE(aim->data(bi, Irc::UserRole).value(), b); - QCOMPARE(aim->data(ci, Irc::UserRole).value(), c); - QVERIFY(!aim->data(oi, Irc::UserRole).value()); - - QCOMPARE(aim->data(ai, Irc::TitleRole).toString(), a->title()); - QCOMPARE(aim->data(bi, Irc::TitleRole).toString(), b->title()); - QCOMPARE(aim->data(ci, Irc::TitleRole).toString(), c->title()); - QVERIFY(aim->data(oi, Irc::TitleRole).toString().isEmpty()); - - QCOMPARE(aim->data(ai, Irc::NameRole).toString(), a->name()); - QCOMPARE(aim->data(bi, Irc::NameRole).toString(), b->name()); - QCOMPARE(aim->data(ci, Irc::NameRole).toString(), c->name()); - QVERIFY(aim->data(oi, Irc::NameRole).toString().isEmpty()); - - QVERIFY(aim->data(ai, Irc::PrefixRole).toString().isEmpty()); - QCOMPARE(aim->data(bi, Irc::PrefixRole).toString(), QString("@")); - QCOMPARE(aim->data(ci, Irc::PrefixRole).toString(), QString("+")); - QVERIFY(aim->data(oi, Irc::PrefixRole).toString().isEmpty()); - - QVERIFY(aim->data(ai, Irc::ModeRole).toString().isEmpty()); - QCOMPARE(aim->data(bi, Irc::ModeRole).toString(), QString("o")); - QCOMPARE(aim->data(ci, Irc::ModeRole).toString(), QString("v")); - QVERIFY(aim->data(oi, Irc::ModeRole).toString().isEmpty()); -} - -void tst_IrcUserModel::testUser() -{ - IrcUserModel userModel; - - // ### setup #communi (5): communi @ChanServ +qtassistant Guest1234 +qout - IrcBufferModel bufferModel; - bufferModel.setConnection(connection); - - connection->open(); - QVERIFY(waitForOpened()); - - QVERIFY(waitForWritten(tst_IrcData::welcome())); - QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN :#communi")); - QVERIFY(waitForWritten(":irc.ifi.uio.no 353 communi = #communi :communi @ChanServ +qtassistant Guest1234 +qout")); - QVERIFY(waitForWritten(":irc.ifi.uio.no 366 communi #communi :End of NAMES list.")); - QCOMPARE(bufferModel.count(), 1); - IrcChannel* channel = bufferModel.get(0)->toChannel(); - QVERIFY(channel); - QCOMPARE(channel->title(), QString("#communi")); - - // ### ready to go! - userModel.setChannel(channel); - QCOMPARE(userModel.count(), 5); - - QPointer communi = userModel.get(0); - QVERIFY(communi); - QCOMPARE(communi->name(), QString("communi")); - QVERIFY(!communi->isAway()); - QVERIFY(!communi->isServOp()); - - QPointer ChanServ = userModel.get(1); - QVERIFY(ChanServ); - QCOMPARE(ChanServ->name(), QString("ChanServ")); - QVERIFY(!ChanServ->isAway()); - QVERIFY(!ChanServ->isServOp()); - - QPointer qtassistant = userModel.get(2); - QVERIFY(qtassistant); - QCOMPARE(qtassistant->name(), QString("qtassistant")); - QVERIFY(!qtassistant->isAway()); - QVERIFY(!qtassistant->isServOp()); - - QPointer Guest1234 = userModel.get(3); - QVERIFY(Guest1234); - QCOMPARE(Guest1234->name(), QString("Guest1234")); - QVERIFY(!Guest1234->isAway()); - QVERIFY(!Guest1234->isServOp()); - - QPointer qout = userModel.get(4); - QVERIFY(qout); - QCOMPARE(qout->name(), QString("qout")); - QVERIFY(!qout->isAway()); - QVERIFY(!qout->isServOp()); - - QSignalSpy communiAwaySpy(communi.data(), SIGNAL(awayChanged(bool))); - QSignalSpy ChanServAwaySpy(ChanServ.data(), SIGNAL(awayChanged(bool))); - QSignalSpy qtassistantAwaySpy(qtassistant.data(), SIGNAL(awayChanged(bool))); - QSignalSpy Guest1234AwaySpy(Guest1234.data(), SIGNAL(awayChanged(bool))); - QSignalSpy qoutAwaySpy(qout.data(), SIGNAL(awayChanged(bool))); - - QVERIFY(communiAwaySpy.isValid()); - QVERIFY(ChanServAwaySpy.isValid()); - QVERIFY(qtassistantAwaySpy.isValid()); - QVERIFY(Guest1234AwaySpy.isValid()); - QVERIFY(qoutAwaySpy.isValid()); - - QSignalSpy communiServOpSpy(communi.data(), SIGNAL(servOpChanged(bool))); - QSignalSpy ChanServServOpSpy(ChanServ.data(), SIGNAL(servOpChanged(bool))); - QSignalSpy qtassistantServOpSpy(qtassistant.data(), SIGNAL(servOpChanged(bool))); - QSignalSpy Guest1234ServOpSpy(Guest1234.data(), SIGNAL(servOpChanged(bool))); - QSignalSpy qoutServOpSpy(qout.data(), SIGNAL(servOpChanged(bool))); - - QVERIFY(communiServOpSpy.isValid()); - QVERIFY(ChanServServOpSpy.isValid()); - QVERIFY(qtassistantServOpSpy.isValid()); - QVERIFY(Guest1234ServOpSpy.isValid()); - QVERIFY(qoutServOpSpy.isValid()); - - // first round - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~communi hidd.en irc.ifi.uio.no communi H* :0 Communi")); - QVERIFY(!communi->isAway()); - QVERIFY(communi->isServOp()); - QCOMPARE(communiAwaySpy.count(), 0); - QCOMPARE(communiServOpSpy.count(), 1); - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ChanServ services. irc.ifi.uio.no ChanServ H@ :0 ChanServ")); - QVERIFY(!ChanServ->isAway()); - QVERIFY(!ChanServ->isServOp()); - QCOMPARE(ChanServAwaySpy.count(), 0); - QCOMPARE(ChanServServOpSpy.count(), 0); - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~qtassistant hidd.en irc.ifi.uio.no qtassistant G+ :0 Qt Assistant")); - QVERIFY(qtassistant->isAway()); - QVERIFY(!qtassistant->isServOp()); - QCOMPARE(qtassistantAwaySpy.count(), 1); - QCOMPARE(qtassistantServOpSpy.count(), 0); - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~guest hidd.en irc.ifi.uio.no Guest1234 H :0 Just a guest...")); - QVERIFY(!Guest1234->isAway()); - QVERIFY(!Guest1234->isServOp()); - QCOMPARE(Guest1234AwaySpy.count(), 0); - QCOMPARE(Guest1234ServOpSpy.count(), 0); - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~qout hidd.en irc.ifi.uio.no qout G+ :0")); - QVERIFY(qout->isAway()); - QVERIFY(!qout->isServOp()); - QCOMPARE(qoutAwaySpy.count(), 1); - QCOMPARE(qoutServOpSpy.count(), 0); - - // second round - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~communi hidd.en irc.ifi.uio.no communi G@ :0 Communi")); - QVERIFY(communi->isAway()); - QVERIFY(!communi->isServOp()); - QCOMPARE(communiAwaySpy.count(), 1); - QCOMPARE(communiServOpSpy.count(), 2); - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ChanServ services. irc.ifi.uio.no ChanServ H@ :0 ChanServ")); - QVERIFY(!ChanServ->isAway()); - QVERIFY(!ChanServ->isServOp()); - QCOMPARE(ChanServAwaySpy.count(), 0); - QCOMPARE(ChanServServOpSpy.count(), 0); - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~qtassistant hidd.en irc.ifi.uio.no qtassistant H+ :0 Qt Assistant")); - QVERIFY(!qtassistant->isAway()); - QVERIFY(!qtassistant->isServOp()); - QCOMPARE(qtassistantAwaySpy.count(), 2); - QCOMPARE(qtassistantServOpSpy.count(), 0); - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~guest hidd.en irc.ifi.uio.no Guest1234 G :0 Just a guest...")); - QVERIFY(Guest1234->isAway()); - QVERIFY(!Guest1234->isServOp()); - QCOMPARE(Guest1234AwaySpy.count(), 1); - QCOMPARE(Guest1234ServOpSpy.count(), 0); - - QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~qout hidd.en irc.ifi.uio.no qout G+ :0")); - QVERIFY(qout->isAway()); - QVERIFY(!qout->isServOp()); - QCOMPARE(qoutAwaySpy.count(), 1); - QCOMPARE(qoutServOpSpy.count(), 0); -} - -QTEST_MAIN(tst_IrcUserModel) - -#include "tst_ircusermodel.moc" diff --git a/libcommuni/tests/auto/shared/shared.pri b/libcommuni/tests/auto/shared/shared.pri deleted file mode 100644 index 1b7258b..0000000 --- a/libcommuni/tests/auto/shared/shared.pri +++ /dev/null @@ -1,16 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -DEPENDPATH += $$PWD -INCLUDEPATH += $$PWD - -HEADERS += $$PWD/tst_euirc.h -HEADERS += $$PWD/tst_freenode.h -HEADERS += $$PWD/tst_ircnet.h - -HEADERS += $$PWD/tst_ircdata.h -SOURCES += $$PWD/tst_ircdata.cpp - -HEADERS += $$PWD/tst_ircclientserver.h -SOURCES += $$PWD/tst_ircclientserver.cpp diff --git a/libcommuni/tests/auto/shared/tst_euirc.h b/libcommuni/tests/auto/shared/tst_euirc.h deleted file mode 100644 index 116e8a2..0000000 --- a/libcommuni/tests/auto/shared/tst_euirc.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#ifndef TST_EUIRC_H -#define TST_EUIRC_H - -static const char* euirc_welcome = - ":irc.rbx.fr.euirc.net 001 communi :Welcome to the euIRCnet IRC Network communi!~communi@hidd.en\n" - ":irc.rbx.fr.euirc.net 002 communi :Your host is irc.rbx.fr.euirc.net, running version euIRCd 1.3.4-e544f33+debug\n" - ":irc.rbx.fr.euirc.net 003 communi :This server was created Mon Jul 08 2013 at 07:09:56 CEST\n" - ":irc.rbx.fr.euirc.net 004 communi irc.rbx.fr.euirc.net euIRCd 1.3.4-e544f33+debug oOiRwhsSaHANCrxjWqBZ1dtcpPUnTI vhoaqpsmtinrRQKVHOAYCNcSXUTxW5beIwklfLBuFM\n" - ":irc.rbx.fr.euirc.net 005 communi NETWORK=euIRCnet WATCH=128 SAFELIST PREFIX=(qaohv)*!@%+ CHANMODES=bewI,k,flBL,cimnprstxACHKNOQRiTSVWXY5 CHANTYPES=#&+ KICKLEN=307 KNOCK MAP MAXLIST=bewI:100 MODES=6 NICKLEN=30 SILENCE=5 TOPICLEN=307 AWAYLEN=307 WALLCHOPS CHANNELLEN=32 MAXCHANNELS=30 MAXTARGETS=20 INVEX=I EXCEPT=e :are available on this server\n" - ":irc.rbx.fr.euirc.net 005 communi STARTTLS :are available on this server\n" - ":irc.rbx.fr.euirc.net 251 communi :There are 14 users and 2768 invisible on 10 servers\n" - ":irc.rbx.fr.euirc.net 252 communi 24 :operator(s) online\n" - ":irc.rbx.fr.euirc.net 253 communi 1 :unknown connection(s)\n" - ":irc.rbx.fr.euirc.net 254 communi 1671 :channels formed\n" - ":irc.rbx.fr.euirc.net 255 communi :I have 1060 clients and 1 servers\n" - ":irc.rbx.fr.euirc.net 265 communi :Current Local Users: 1060 Max: 1221\n" - ":irc.rbx.fr.euirc.net 266 communi :Current Global Users: 2782 Max: 11082\n" - ":irc.rbx.fr.euirc.net 375 communi :- irc.rbx.fr.euirc.net Message of the Day -\n" - ":irc.rbx.fr.euirc.net 376 communi :End of /MOTD command\n"; - -static const char* euirc_join = - ":communi!~communi@hidd.en JOIN :#euirc\n" - ":irc.rbx.fr.euirc.net 332 communi #euirc :Welcome to euIRC || Problems? Join #opers || www.euirc.net || SSL and S/MIME authentication now available on all servers (port 6697) || euIRC meets facebook: www.facebook.com/euirc\n" - ":irc.rbx.fr.euirc.net 333 communi #euirc Renne 1370272649\n" - ":irc.rbx.fr.euirc.net 353 communi = #euirc :communi Guest774 burning_rabbit %aleksandr netsplit Jerry Brueggus charly6 HermiNe %brue Mercutio stephan48 NeinnHomer Luthandorius Technomagier |Baron| Laknu_ Polizist1 !alamar rhonabwy @Vampi Mayday @Road radic MorkiTorki PRoTaGoNiST Simik|ZzZZ @][flat][ statsbot7 !mensch holygoth firefly Kanibal Luchs xinator CR|Noah|Away MrWolf !specon CR|Dani %leni CR|Sven @Renne Revi Arovin pinGUUin Vampire666 gastgast_\n" - ":irc.rbx.fr.euirc.net 353 communi = #euirc :konqui Tina-chan_onAir picoFF @medice SLXViper !TC sb Kn0p3XX SlySing faZe Icedream Der_Orwischer Goggy g00fy Burle klaxa [Chaos|Krieger] Guest14697 Tehlak icefly Herr_Vorragend Ding Nothing4You Sven|Off Zarquod !jun|per scaba meister Hikaru-Shindo Alx Kinji-san Guest13553 !Chibisuke\n" - ":irc.rbx.fr.euirc.net 366 communi #euirc :End of /NAMES list.\n"; - -static const char* euirc_names = - "communi Guest774 burning_rabbit aleksandr netsplit Jerry Brueggus charly6 HermiNe brue Mercutio stephan48 NeinnHomer Luthandorius Technomagier |Baron| Laknu_ Polizist1 alamar rhonabwy Vampi Mayday Road radic MorkiTorki PRoTaGoNiST Simik|ZzZZ ][flat][ statsbot7 mensch holygoth firefly Kanibal Luchs xinator CR|Noah|Away MrWolf specon CR|Dani leni CR|Sven Renne Revi Arovin pinGUUin Vampire666 gastgast_ " - "konqui Tina-chan_onAir picoFF medice SLXViper TC sb Kn0p3XX SlySing faZe Icedream Der_Orwischer Goggy g00fy Burle klaxa [Chaos|Krieger] Guest14697 Tehlak icefly Herr_Vorragend Ding Nothing4You Sven|Off Zarquod jun|per scaba meister Hikaru-Shindo Alx Kinji-san Guest13553 Chibisuke"; - -static const char* euirc_admins = "alamar mensch specon TC jun|per Chibisuke"; -static const char* euirc_ops = "Vampi Road ][flat][ Renne medice"; -static const char* euirc_halfops = "aleksandr brue leni"; -static const char* euirc_voices = ""; - -#endif // TST_EUIRC_H diff --git a/libcommuni/tests/auto/shared/tst_freenode.h b/libcommuni/tests/auto/shared/tst_freenode.h deleted file mode 100644 index 345abeb..0000000 --- a/libcommuni/tests/auto/shared/tst_freenode.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#ifndef TST_FREENODE_H -#define TST_FREENODE_H - -static const char* freenode_welcome = - ":moorcock.freenode.net NOTICE * :*** Looking up your hostname...\r\n" - ":moorcock.freenode.net NOTICE * :*** Checking Ident\r\n" - ":moorcock.freenode.net NOTICE * :*** Found your hostname\r\n" - ":moorcock.freenode.net NOTICE * :*** No Ident response\r\n" - ":moorcock.freenode.net 001 communi :Welcome to the freenode Internet Relay Chat Network communi\r\n" - ":moorcock.freenode.net 002 communi :Your host is moorcock.freenode.net[50.22.136.18/6667], running version ircd-seven-1.1.3\r\n" - ":moorcock.freenode.net 003 communi :This server was created Mon Dec 31 2012 at 15:37:06 CST\r\n" - ":moorcock.freenode.net 004 communi moorcock.freenode.net ircd-seven-1.1.3 DOQRSZaghilopswz CFILMPQSbcefgijklmnopqrstvz bkloveqjfI\r\n" - ":moorcock.freenode.net 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=freenode KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server\r\n" - ":moorcock.freenode.net 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server\r\n" - ":moorcock.freenode.net 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server\r\n" - ":moorcock.freenode.net 251 communi :There are 231 users and 88216 invisible on 29 servers\r\n" - ":moorcock.freenode.net 252 communi 36 :IRC Operators online\r\n" - ":moorcock.freenode.net 253 communi 12 :unknown connection(s)\r\n" - ":moorcock.freenode.net 254 communi 49792 :channels formed\r\n" - ":moorcock.freenode.net 255 communi :I have 4723 clients and 1 servers\r\n" - ":moorcock.freenode.net 265 communi 4723 7446 :Current local users 4723, max 7446\r\n" - ":moorcock.freenode.net 266 communi 88447 92550 :Current global users 88447, max 92550\r\n" - ":moorcock.freenode.net 250 communi :Highest connection count: 7447 (7446 clients) (1286042 connections received)\r\n" - ":moorcock.freenode.net 375 communi :- moorcock.freenode.net Message of the Day -\r\n" - ":moorcock.freenode.net 372 communi :- Welcome to moorcock.freenode.net in ...\r\n" - ":moorcock.freenode.net 376 communi :End of /MOTD command.\r\n"; - -static const char* freenode_join = - ":communi!~communi@hidd.en JOIN #freenode\r\n" - ":moorcock.freenode.net 332 communi #freenode :Welcome to #freenode | Staff are voiced; some may also be on /stats p -- feel free to /msg us at any time | FAQ: http://freenode.net/faq.shtml | Unwelcome queries? Use /mode your_nick +R to block them. | Channel guidelines: http://freenode.net/poundfreenode.shtml | Blog: http://blog.freenode.net | Please don't comment on spam/trolls.\r\n" - ":moorcock.freenode.net 333 communi #freenode erry 1379357591\r\n" - ":moorcock.freenode.net 353 communi = #freenode :communi straterra absk007 pefn xlys Gromit TooCool Sambler gat0rs KarneAsada danis_963 Kiryx chrismeller deefloo black_male sxlnxdx bjork Kinny phobos_anomaly T13|sleeps JuxTApose Kolega2357 rorx techhelper1 hermatize Azimi iqualfragile fwilson skasturi mwallacesd mayday Guest76549 mcjohansen MangaKaDenza ARISTIDES ketas `- claptor ylluminate Cooky Brand3n cheater_1 Kirito digitaloktay Will| Iarfen abrotman smurfy Inaunt +mist Karol RougeR_\r\n" - ":moorcock.freenode.net 353 communi = #freenode :publickeating An_Ony_Moose michagogo Guest915` davidfg4 Ragnor s1lent_1 keee GingerGeek[Away] hibari derp S_T_A_N anonymuse asantoni road|runner LLckfan neoian2 aviancarrier nipples danieldaniel Pyrus Bry8Star shadowm_desktop furtardo rdymac TTSDA seaworthy Chiyo yscc Zombiebaron redpill f4cl3y Boohbah applebloom zorael kameloso^ Zetetic XAMPP wheels_up Cuppy-Cake mindlessjohnny Kymru mquin_ Rodja babilen kirin` David Affix jshyeung_ DarkAceZ karakedi\r\n" - ":moorcock.freenode.net 353 communi = #freenode :jraglin AdriDJ ToApolytoXaos whaletechno jlf Ricardo__ TmvC Sigma00 Casmo breck7 Oldiesmann Rappy naomi thiras moli FRCorey_ iderik glebihan cool_name Dwade09 UniOn eMBee Samual johnnymoo_logsta darknyan mlk dyay xBytez hammond M2Ys4U kobain monoprotic MiLK_ Noldorin njm Nomado Alina-malina abchirk_ Johannes13_ scorche dreamfighter Lars_G DCMT TomyLobo King_Hual No_One fling Mike_H CoreISP djdoody fdd pipitas Subo1977 jef redarrow marcoecc bin_sh TReK\r\n" - ":moorcock.freenode.net 353 communi = #freenode :[MortiKi] traveller__ Catie DarkG HisaoNakai scounder alone Corycia rudyismydog ToBeFree mcalabrese micadeyeye_ Sembei candlejackson cobra-the-joker ElectricDuck fuzeman swoolley ali_h dungodung oleo brain8675 Jordach rdy4watever KillYourTV coffeee levine m4v dvu ty _nova jgeboski Olipro CheckDavid impulse150 Shadow` jarr0dsz an3k Sove daemon Sary t0rben monkeyjuice Blas alexa the_TORmentor Transfusion kensington Spaceghost wolfmitchell lubmil synick\r\n" - ":moorcock.freenode.net 353 communi = #freenode :bitnumus krassomat zerox kel39 basiclaser tristero blaxnake themill meznak chinkung DJJeff RBecker XDS2010_ iamblue_cloud excilan Ristovski +JamesTait DrJ pfffx d9b4bef9 Corvus` s0ckpuppet Guest73279 Fritz7 JBreit zinx KhashayaR p3lim_ krisha quackgyver salkaman j4jackj Guest86053 nmmm wiretapped lunchdump goose sam Zarthus jje sl3dge Vutral sins- weie_ +Myrtti _raymond_ KindOne youlysses Mizael jeffz` meet_praveen STalKer-X osxdude surfdue torako\r\n" - ":moorcock.freenode.net 353 communi = #freenode :niloc132_ connor_goodwolf \\mSg vemacs iViLe slobber zendeavor drbean Tonitrus Nightmare ssbr GorillaPatch TingPing +Pricey james41382 Chenguang Jyothis RansomTime zz_Enviious TakinOver chrisss404 Brando753 mduca SlashLife_ Fuchs DW-Drew Firzen__ Suprano duke johest_ infinem Birdman3131 tmtowtdi Guest61594 BearPerson GiGaHuRtZ Hausas sdamashek salamanderrake jwbirdsong themadhatter mahomet smeggysmeg +kloeri_ kameloso Simonn ryukafalz tigrmesh Borg\r\n" - ":moorcock.freenode.net 353 communi = #freenode :Kingdom RougeR Venusaur resistivecorpse rush2end destiny rylinaux gskellig Wonkaewt philip quelx hside tann bolt btcvixen joako pr0ggie Xiti` arpita_ Hewn Argus Shippo +Tabmow FrankZZ Olanzapin zhezhe swiatos Argure Cathy JKL1234- Elfix Suicide cali urkl laissez-f sig-wall Guest76477 Rix jok- Guest41925 Thehelpfulone Nimrod oscailt stalled anexus _val_ Luke-Jr Konomi German__ acanete knuth Wildblue` juser Reshesnik Saiban corelax brr JoeK DarkSkyes\r\n" - ":moorcock.freenode.net 353 communi = #freenode :BullShark Zhaofeng_Li vidplace7 aji APLU RiverRat jerome Bateau raSter^ chipster Vito PigFlu Sprocks evaldoxie Atlas petan javalover MobiusL yerodin Barras2 Barras Humbedooh Niichan SlicerDicer slax0r Brodeles Aurora tandoori Davey Culator|Away gtmanfred kPa ex0a contempt Xack ecks prawnsalad wirehack7 nyuszika7h around Kelsie CaHogan mrpeenut24 Mozart IceCraft LifeIspain andrex sloof thismat troybattey notori0us UbuPhillup lasers BlastHardcheese muskeg\r\n" - ":moorcock.freenode.net 353 communi = #freenode :archigos +jayne XJR-9 realazthat Geert ahf nim edk spb @ChanServ Azure +nhandler a3li edggeek zol Bigcheese stylus DrBash ingo ningrat zu +tomaw felipe QueenOfFrance dxrt Y_Ichiro sysdef Ju576 rwg [NOT|HERE] sili Snowolf Shnaw tapout Joori GriGore665 LoganCloud Osaka funtapaz MidnighToker codeM0nK3Y Zen kinlo +Corey raj c0ded Remco Vikrant_ xander chadi |L| Shockk nickg ajpiano guntbert funkyHat +erry Mkaysi meingtsla seaLne EvilBlueShark pdelvo Strog\r\n" - ":moorcock.freenode.net 353 communi = #freenode :geb Vlad Deathspawn mdan Zidonuke jjs999jjs Bry8Star4 inthecompanyof Motzfeldt jlouis mooky avelldiroll tonsofpcs d2r Loki JPT Jamesofur +kloeri Paradox924X Zx3 cruxeternus sdx23 adaptr PwnSauce mattb J21 likewhoa scorche|sh hellome Geek_Juice xorpp Sonar_Guy luckman212 danar psybear eir StarRain sparticus stux|RC-only go|dfish teneightypea BaW d10n riddle Tm_T dive EvilJStoker glowsticks kode54 stwalkerster pocoyo shiftplusone bburhans trucMuche\r\n" - ":moorcock.freenode.net 353 communi = #freenode :moonlight +yano kevank jmfcool BranchPredictor pppingme Namikaze EvilOne FZTMm Sakaki Lord_Aizen demosdemon JasonDC duracrisis IHateHavingToReg +D[_] AlexJFox Th0masR0ss back Exio4 kunwon1 kc8qvp jeblair Jeruvy Kadet EmLeX aways Kester Spr0cket Thorne csssuf iotku nb solution Zanzibar em mwheeler x56 ChauffeR_ phrozen77 ivan`` The_Cop Monkeh ishanyx Whopper ghz JStoker brabo_ Triskelios sosby PoohBear Clete2 ErrantEgo SebastianFlyte JT jose rubick\r\n" - ":moorcock.freenode.net 353 communi = #freenode :RDash[AW] wwraith Hazel|artemis mrgaryniger tabeaux crazedpsyc +denny mh0 TheDrums Nothing4You_ Fieldy akawaka thumbs +Dave2 aghos_ Carly-_ Necrosan K1rk ClaudiaU_ HeavyMetal Zenum KOD3N cooldude mshaw milky sepeck Nineain nxp ktr TheLordOfTime dmlloyd sunitknandi arikb pumba Webu `DiM danmackay zomGreg tomboy_ callumacrae Devels rsrx zz_dbRenaud trout Kye Romance _ruben sfan5 brabo lassefaxoe Arieh John13 +ldunn OldSoul|4SiOS501 evilmquin xrated Ishaq\r\n" - ":moorcock.freenode.net 353 communi = #freenode :phreak turboroot ra roxell topyli jeremias doily Nazca Aehmlo_away nutron +christel +niko DLange drdanick AndrewBarber mediko psk1 TheJH skrip_kid +jbroome +njan RainbowDashh +Plazma vedalken254 codethought md_5 michagogo|cloud brad lolcat +LoRez MissionCritical honzik666 variousnefarious AlanBell tdfischer EricK|AFK AsadH apollo13 Wug[Hyperspace] nullrouted|cloud PeerLesS DarthGandalf cbdev shroud badunkadunk Happzz fortytwo netchip Mike3620 newton\r\n" - ":moorcock.freenode.net 353 communi = #freenode :Detch Gnumarcoo Brownout Junaos ThalinVien evilErrantEgo Bladerunner +JonathanD Beothoric FloTiX Alenah Raccoon ow GLolol c45y coinspelunk mysteerimasa real_alien tburg SPF|Cloud Cloudiumn like2helpU iMast777 geoffw8__ troyt Hypnotoad nkuttler Sjsws1078_ apoplexy3 trawl AntiSpamMeta ShadowNinja Kernel|Panic vinylGhost GaelanAintAround dlu corentin shark KnownUnown pentiumone133 AimHere Mad7Scientist SaMOOrai Fabianius alamar morphium espiral Someguy123\r\n" - ":moorcock.freenode.net 353 communi = #freenode :LIP DURgod tehKitten an0nmat1r FuriousRage nanotube jrgifford Mez +gry n4x TDJACR phuzion ohm BradND TheUni OzBorne RumpledElf Internet13 Muzer lostlabyrinth SeySayux midnightmagic drathir Sling firebird +jtrucks Red_M Stary2001 localhost jefferai mosh sweet_kid +RichiH Nothing4You hvxgr FastLizard4 bren2010 Slasher VunKruz sohum MogDog DJones fooly Arokh swords anaconda rcombs Wiretap jeffmjack petteyg TW1920 grawity JakeOrrall mac-mini _Cr4zi3_VM\r\n" - ":moorcock.freenode.net 353 communi = #freenode :Djole ShapeShifter499 AccessDenied jlcl Jguy sucheta XgF avermedia_ Pyker evil alpha Affliction Spitfire Fohlen rtbt humvee ka6sox benhunter09 mavensk asherkin +Elwell amithkk SolarAquarion chalcedony amarshall mrtux GarethAdams gary_chiang SilentPenguin ebuch_ +jbroome_ TW1920__ LaserShark msimkins Playb3yond music2myear maksbotan tenobi noko eighty4 bitpushr bucketm0use Amrykid phantomcircuit WorldEmperor Reisen pjschmitt armansito piney Yajirobe\r\n" - ":moorcock.freenode.net 353 communi = #freenode :neuro_sys JordanJ2 z3uS kline Clinteger Taylor albel727 Kharec Rarity Tzunamii VictorRedtail|Sa Peng KWC10 Axew iPod Jasper_Deng_away RyanKnack unreal Haseo aegis mst SecretAgent wapiflapi ghoti _spk_ jeremyb LjL +marienz _TMM_ Archer +gheraint cebor Chris_G Schoentoon jsec Bradford|Nosta addshore cyphase jmbsvicetto liori Plasmastar Skunky chaoscon heinrich5991 nealph catsup SierraAR davidhadas levarnu ping- daurnimator Cr0iX ksx4system Lars_G_ Maple__\r\n" - ":moorcock.freenode.net 353 communi = #freenode :PcJamesy rej froggyman LanceBNC Vorpal RojoD asakura jaybe Kyle IsoAnon neal__ G ski ibenox Adran Shirik WaffleZ MRX Damage-X Guest90323 jericon irc_adama Nietzschale Mack d1b balrog ikonia GTAXL Michail1 CoJaBo SkyDreamer suborbital Stryyker farn Matrixiumn Fira benonsoftware kaictl jdiez spectra FriendlyFascist Cyclone Koma dwfreed Phoebus jamesd MichaelC|Mobile PennStater SwedFTP +spaceinvader jumperboy Zic Graet ake gbyers[Away] MJ94 keeleysam Dwarf\r\n" - ":moorcock.freenode.net 353 communi = #freenode :NiTeMaRe arkeet Jake_D alvinek_ debris` Guest13246 infojunky ChrisAM Novacha ImTheBitch capri MartynKeigher BlackoutIsHere WannabeZNC EViLSLuT DrRen KamusHadenes deadpool graphitemaster xy andy_ Cydrobolt Metaleer Oprah Hello71 dirtydawg [Derek] basic` wei2912 nesthib poutine Angelo Simba WormDrink robink zymurgy Guest89644 SirCmpwn enchilado dominikh vivekrai Utility Jason bazhang paddymahoney pinPoint brainproxy TheEpTic Revi N7 Lyude edibsk mb06cs\r\n" - ":moorcock.freenode.net 353 communi = #freenode :bray90820 IdleOne Console kPa_ shadowm winocm spot digikwondo blishchrot MichaelC swagemon Whiskey win2012 VideoDudeMike HavokOC FailPowah ix007 phenom JZTech101 ohama eric1212 Timbo zz_dlu joey Wooble Willis pseubodot lbft elky BlueShark haxxed JamesOff ndngvr` overrider lahwran plasticboy idoru DXtremz Adonis SeanieB Gizmokid2005 Aerox3 Disori ludkiller dhoss_ c xid b_jonas lurst TheLonelyGod Nietzsche MillHouse Guest19968 AlexP Stoo psycho_oreos G1eb\r\n" - ":moorcock.freenode.net 353 communi = #freenode :Obfuscate ggherdov dStruct auscompgeek bdfoster tharkun aperson GeordieNorman mfamos irv +tt argv Psi-Jack cups Cprossu TheBadShepperd Magiobiwan mkb Steakanbake three18ti lysobit raztoki Chex Sellyme caf Guest76346 Louis Lexi sa`tan truexfan81 nitrix CodesInChaos Deus N3LRX Tsunamifox tgs3 multiply JakeSaysSays epochwolf totte +t cam daemoneye stump Sargun ekeih tauntaun Milenko vvv upgrayeddd mrrothhcloud___ _anonymous +issyl0 smokex Pici\r\n" - ":moorcock.freenode.net 366 communi #freenode :End of /NAMES list.\r\n" - ":ChanServ!ChanServ@services. NOTICE communi :[#freenode] Welcome to #freenode. All network staff are voiced in here, but may not always be around - type /stats p to get a list of on call staff. Others may be hiding so do feel free to ping and /msg us at will! Also please read the channel guidelines at http://freenode.net/poundfreenode.shtml - thanks.\r\n" - ":services. 328 communi #freenode :http://freenode.net/\r\n"; - -static const char* freenode_names = - "communi straterra absk007 pefn xlys Gromit TooCool Sambler gat0rs KarneAsada danis_963 Kiryx chrismeller deefloo black_male sxlnxdx bjork Kinny phobos_anomaly T13|sleeps JuxTApose Kolega2357 rorx techhelper1 hermatize Azimi iqualfragile fwilson skasturi mwallacesd mayday Guest76549 mcjohansen MangaKaDenza ARISTIDES ketas `- claptor ylluminate Cooky Brand3n cheater_1 Kirito digitaloktay Will| Iarfen abrotman smurfy Inaunt mist Karol RougeR_ " - "publickeating An_Ony_Moose michagogo Guest915` davidfg4 Ragnor s1lent_1 keee GingerGeek[Away] hibari derp S_T_A_N anonymuse asantoni road|runner LLckfan neoian2 aviancarrier nipples danieldaniel Pyrus Bry8Star shadowm_desktop furtardo rdymac TTSDA seaworthy Chiyo yscc Zombiebaron redpill f4cl3y Boohbah applebloom zorael kameloso^ Zetetic XAMPP wheels_up Cuppy-Cake mindlessjohnny Kymru mquin_ Rodja babilen kirin` David Affix jshyeung_ DarkAceZ karakedi " - "jraglin AdriDJ ToApolytoXaos whaletechno jlf Ricardo__ TmvC Sigma00 Casmo breck7 Oldiesmann Rappy naomi thiras moli FRCorey_ iderik glebihan cool_name Dwade09 UniOn eMBee Samual johnnymoo_logsta darknyan mlk dyay xBytez hammond M2Ys4U kobain monoprotic MiLK_ Noldorin njm Nomado Alina-malina abchirk_ Johannes13_ scorche dreamfighter Lars_G DCMT TomyLobo King_Hual No_One fling Mike_H CoreISP djdoody fdd pipitas Subo1977 jef redarrow marcoecc bin_sh TReK " - "[MortiKi] traveller__ Catie DarkG HisaoNakai scounder alone Corycia rudyismydog ToBeFree mcalabrese micadeyeye_ Sembei candlejackson cobra-the-joker ElectricDuck fuzeman swoolley ali_h dungodung oleo brain8675 Jordach rdy4watever KillYourTV coffeee levine m4v dvu ty _nova jgeboski Olipro CheckDavid impulse150 Shadow` jarr0dsz an3k Sove daemon Sary t0rben monkeyjuice Blas alexa the_TORmentor Transfusion kensington Spaceghost wolfmitchell lubmil synick " - "bitnumus krassomat zerox kel39 basiclaser tristero blaxnake themill meznak chinkung DJJeff RBecker XDS2010_ iamblue_cloud excilan Ristovski JamesTait DrJ pfffx d9b4bef9 Corvus` s0ckpuppet Guest73279 Fritz7 JBreit zinx KhashayaR p3lim_ krisha quackgyver salkaman j4jackj Guest86053 nmmm wiretapped lunchdump goose sam Zarthus jje sl3dge Vutral sins- weie_ Myrtti _raymond_ KindOne youlysses Mizael jeffz` meet_praveen STalKer-X osxdude surfdue torako " - "niloc132_ connor_goodwolf \\mSg vemacs iViLe slobber zendeavor drbean Tonitrus Nightmare ssbr GorillaPatch TingPing Pricey james41382 Chenguang Jyothis RansomTime zz_Enviious TakinOver chrisss404 Brando753 mduca SlashLife_ Fuchs DW-Drew Firzen__ Suprano duke johest_ infinem Birdman3131 tmtowtdi Guest61594 BearPerson GiGaHuRtZ Hausas sdamashek salamanderrake jwbirdsong themadhatter mahomet smeggysmeg kloeri_ kameloso Simonn ryukafalz tigrmesh Borg " - "Kingdom RougeR Venusaur resistivecorpse rush2end destiny rylinaux gskellig Wonkaewt philip quelx hside tann bolt btcvixen joako pr0ggie Xiti` arpita_ Hewn Argus Shippo Tabmow FrankZZ Olanzapin zhezhe swiatos Argure Cathy JKL1234- Elfix Suicide cali urkl laissez-f sig-wall Guest76477 Rix jok- Guest41925 Thehelpfulone Nimrod oscailt stalled anexus _val_ Luke-Jr Konomi German__ acanete knuth Wildblue` juser Reshesnik Saiban corelax brr JoeK DarkSkyes " - "BullShark Zhaofeng_Li vidplace7 aji APLU RiverRat jerome Bateau raSter^ chipster Vito PigFlu Sprocks evaldoxie Atlas petan javalover MobiusL yerodin Barras2 Barras Humbedooh Niichan SlicerDicer slax0r Brodeles Aurora tandoori Davey Culator|Away gtmanfred kPa ex0a contempt Xack ecks prawnsalad wirehack7 nyuszika7h around Kelsie CaHogan mrpeenut24 Mozart IceCraft LifeIspain andrex sloof thismat troybattey notori0us UbuPhillup lasers BlastHardcheese muskeg " - "archigos jayne XJR-9 realazthat Geert ahf nim edk spb ChanServ Azure nhandler a3li edggeek zol Bigcheese stylus DrBash ingo ningrat zu tomaw felipe QueenOfFrance dxrt Y_Ichiro sysdef Ju576 rwg [NOT|HERE] sili Snowolf Shnaw tapout Joori GriGore665 LoganCloud Osaka funtapaz MidnighToker codeM0nK3Y Zen kinlo Corey raj c0ded Remco Vikrant_ xander chadi |L| Shockk nickg ajpiano guntbert funkyHat erry Mkaysi meingtsla seaLne EvilBlueShark pdelvo Strog " - "geb Vlad Deathspawn mdan Zidonuke jjs999jjs Bry8Star4 inthecompanyof Motzfeldt jlouis mooky avelldiroll tonsofpcs d2r Loki JPT Jamesofur kloeri Paradox924X Zx3 cruxeternus sdx23 adaptr PwnSauce mattb J21 likewhoa scorche|sh hellome Geek_Juice xorpp Sonar_Guy luckman212 danar psybear eir StarRain sparticus stux|RC-only go|dfish teneightypea BaW d10n riddle Tm_T dive EvilJStoker glowsticks kode54 stwalkerster pocoyo shiftplusone bburhans trucMuche " - "moonlight yano kevank jmfcool BranchPredictor pppingme Namikaze EvilOne FZTMm Sakaki Lord_Aizen demosdemon JasonDC duracrisis IHateHavingToReg D[_] AlexJFox Th0masR0ss back Exio4 kunwon1 kc8qvp jeblair Jeruvy Kadet EmLeX aways Kester Spr0cket Thorne csssuf iotku nb solution Zanzibar em mwheeler x56 ChauffeR_ phrozen77 ivan`` The_Cop Monkeh ishanyx Whopper ghz JStoker brabo_ Triskelios sosby PoohBear Clete2 ErrantEgo SebastianFlyte JT jose rubick " - "RDash[AW] wwraith Hazel|artemis mrgaryniger tabeaux crazedpsyc denny mh0 TheDrums Nothing4You_ Fieldy akawaka thumbs Dave2 aghos_ Carly-_ Necrosan K1rk ClaudiaU_ HeavyMetal Zenum KOD3N cooldude mshaw milky sepeck Nineain nxp ktr TheLordOfTime dmlloyd sunitknandi arikb pumba Webu `DiM danmackay zomGreg tomboy_ callumacrae Devels rsrx zz_dbRenaud trout Kye Romance _ruben sfan5 brabo lassefaxoe Arieh John13 ldunn OldSoul|4SiOS501 evilmquin xrated Ishaq " - "phreak turboroot ra roxell topyli jeremias doily Nazca Aehmlo_away nutron christel niko DLange drdanick AndrewBarber mediko psk1 TheJH skrip_kid jbroome njan RainbowDashh Plazma vedalken254 codethought md_5 michagogo|cloud brad lolcat LoRez MissionCritical honzik666 variousnefarious AlanBell tdfischer EricK|AFK AsadH apollo13 Wug[Hyperspace] nullrouted|cloud PeerLesS DarthGandalf cbdev shroud badunkadunk Happzz fortytwo netchip Mike3620 newton " - "Detch Gnumarcoo Brownout Junaos ThalinVien evilErrantEgo Bladerunner JonathanD Beothoric FloTiX Alenah Raccoon ow GLolol c45y coinspelunk mysteerimasa real_alien tburg SPF|Cloud Cloudiumn like2helpU iMast777 geoffw8__ troyt Hypnotoad nkuttler Sjsws1078_ apoplexy3 trawl AntiSpamMeta ShadowNinja Kernel|Panic vinylGhost GaelanAintAround dlu corentin shark KnownUnown pentiumone133 AimHere Mad7Scientist SaMOOrai Fabianius alamar morphium espiral Someguy123 " - "LIP DURgod tehKitten an0nmat1r FuriousRage nanotube jrgifford Mez gry n4x TDJACR phuzion ohm BradND TheUni OzBorne RumpledElf Internet13 Muzer lostlabyrinth SeySayux midnightmagic drathir Sling firebird jtrucks Red_M Stary2001 localhost jefferai mosh sweet_kid RichiH Nothing4You hvxgr FastLizard4 bren2010 Slasher VunKruz sohum MogDog DJones fooly Arokh swords anaconda rcombs Wiretap jeffmjack petteyg TW1920 grawity JakeOrrall mac-mini _Cr4zi3_VM " - "Djole ShapeShifter499 AccessDenied jlcl Jguy sucheta XgF avermedia_ Pyker evil alpha Affliction Spitfire Fohlen rtbt humvee ka6sox benhunter09 mavensk asherkin Elwell amithkk SolarAquarion chalcedony amarshall mrtux GarethAdams gary_chiang SilentPenguin ebuch_ jbroome_ TW1920__ LaserShark msimkins Playb3yond music2myear maksbotan tenobi noko eighty4 bitpushr bucketm0use Amrykid phantomcircuit WorldEmperor Reisen pjschmitt armansito piney Yajirobe " - "neuro_sys JordanJ2 z3uS kline Clinteger Taylor albel727 Kharec Rarity Tzunamii VictorRedtail|Sa Peng KWC10 Axew iPod Jasper_Deng_away RyanKnack unreal Haseo aegis mst SecretAgent wapiflapi ghoti _spk_ jeremyb LjL marienz _TMM_ Archer gheraint cebor Chris_G Schoentoon jsec Bradford|Nosta addshore cyphase jmbsvicetto liori Plasmastar Skunky chaoscon heinrich5991 nealph catsup SierraAR davidhadas levarnu ping- daurnimator Cr0iX ksx4system Lars_G_ Maple__ " - "PcJamesy rej froggyman LanceBNC Vorpal RojoD asakura jaybe Kyle IsoAnon neal__ G ski ibenox Adran Shirik WaffleZ MRX Damage-X Guest90323 jericon irc_adama Nietzschale Mack d1b balrog ikonia GTAXL Michail1 CoJaBo SkyDreamer suborbital Stryyker farn Matrixiumn Fira benonsoftware kaictl jdiez spectra FriendlyFascist Cyclone Koma dwfreed Phoebus jamesd MichaelC|Mobile PennStater SwedFTP spaceinvader jumperboy Zic Graet ake gbyers[Away] MJ94 keeleysam Dwarf " - "NiTeMaRe arkeet Jake_D alvinek_ debris` Guest13246 infojunky ChrisAM Novacha ImTheBitch capri MartynKeigher BlackoutIsHere WannabeZNC EViLSLuT DrRen KamusHadenes deadpool graphitemaster xy andy_ Cydrobolt Metaleer Oprah Hello71 dirtydawg [Derek] basic` wei2912 nesthib poutine Angelo Simba WormDrink robink zymurgy Guest89644 SirCmpwn enchilado dominikh vivekrai Utility Jason bazhang paddymahoney pinPoint brainproxy TheEpTic Revi N7 Lyude edibsk mb06cs " - "bray90820 IdleOne Console kPa_ shadowm winocm spot digikwondo blishchrot MichaelC swagemon Whiskey win2012 VideoDudeMike HavokOC FailPowah ix007 phenom JZTech101 ohama eric1212 Timbo zz_dlu joey Wooble Willis pseubodot lbft elky BlueShark haxxed JamesOff ndngvr` overrider lahwran plasticboy idoru DXtremz Adonis SeanieB Gizmokid2005 Aerox3 Disori ludkiller dhoss_ c xid b_jonas lurst TheLonelyGod Nietzsche MillHouse Guest19968 AlexP Stoo psycho_oreos G1eb " - "Obfuscate ggherdov dStruct auscompgeek bdfoster tharkun aperson GeordieNorman mfamos irv tt argv Psi-Jack cups Cprossu TheBadShepperd Magiobiwan mkb Steakanbake three18ti lysobit raztoki Chex Sellyme caf Guest76346 Louis Lexi sa`tan truexfan81 nitrix CodesInChaos Deus N3LRX Tsunamifox tgs3 multiply JakeSaysSays epochwolf totte t cam daemoneye stump Sargun ekeih tauntaun Milenko vvv upgrayeddd mrrothhcloud___ _anonymous issyl0 smokex Pici"; - -static const char* freenode_admins = ""; -static const char* freenode_ops = "ChanServ"; -static const char* freenode_halfops = ""; -static const char* freenode_voices = "mist JamesTait Myrtti Pricey kloeri_ Tabmow jayne nhandler tomaw Corey erry kloeri yano D[_] denny Dave2 ldunn christel niko jbroome njan Plazma LoRez JonathanD gry jtrucks RichiH Elwell jbroome_ marienz gheraint spaceinvader tt t issyl0"; - -#endif // TST_FREENODE_H diff --git a/libcommuni/tests/auto/shared/tst_ircclientserver.cpp b/libcommuni/tests/auto/shared/tst_ircclientserver.cpp deleted file mode 100644 index 2a76ead..0000000 --- a/libcommuni/tests/auto/shared/tst_ircclientserver.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "tst_ircclientserver.h" - -tst_IrcClientServer::tst_IrcClientServer() -{ - server = new QTcpServer(this); -} - -void tst_IrcClientServer::initTestCase() -{ - QVERIFY(server->listen()); -} - -void tst_IrcClientServer::cleanupTestCase() -{ - server->close(); -} - -void tst_IrcClientServer::init() -{ - connection = new IrcConnection(this); - connection->setUserName("user"); - connection->setNickName("nick"); - connection->setRealName("real"); - connection->setPassword("secret"); - connection->setHost("127.0.0.1"); - connection->setPort(server->serverPort()); -} - -void tst_IrcClientServer::cleanup() -{ - delete connection; -} - -bool tst_IrcClientServer::waitForOpened(int timeout) -{ - if (!server->waitForNewConnection(timeout)) - return false; - serverSocket = server->nextPendingConnection(); - clientSocket = connection->socket(); - return serverSocket && clientSocket && clientSocket->waitForConnected(1000); -} - -bool tst_IrcClientServer::waitForWritten(const QByteArray& data, int timeout) -{ - if (!data.isNull()) { - if (data.count('\n') > 1) { - bool success = true; - foreach (const QByteArray& line, data.split('\n')) - success &= waitForWritten(line + '\n', timeout); - return success; - } - if (data.endsWith('\r') || data.endsWith('\n')) - serverSocket->write(data); - else - serverSocket->write(data + "\r\n"); - } - return serverSocket->waitForBytesWritten(timeout) && clientSocket->waitForReadyRead(timeout); -} diff --git a/libcommuni/tests/auto/shared/tst_ircclientserver.h b/libcommuni/tests/auto/shared/tst_ircclientserver.h deleted file mode 100644 index ae72f29..0000000 --- a/libcommuni/tests/auto/shared/tst_ircclientserver.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#ifndef TST_IRCCLIENTSERVER_H -#define TST_IRCCLIENTSERVER_H - -#include - -#include -#include -#include -#include - -#if QT_VERSION >= 0x050000 -#define Q4SKIP(description) QSKIP(description) -#else -#define Q4SKIP(description) QSKIP(description, SkipAll) -#endif - -class tst_IrcClientServer : public QObject -{ - Q_OBJECT - -public: - tst_IrcClientServer(); - -private slots: - void initTestCase(); - void cleanupTestCase(); - - void init(); - void cleanup(); - -protected: - bool waitForOpened(int timeout = 200); - bool waitForWritten(const QByteArray& data, int timeout = 1000); - - QPointer server; - QPointer serverSocket; - QPointer connection; - QPointer clientSocket; -}; - -#endif // TST_IRCCLIENTSERVER_H diff --git a/libcommuni/tests/auto/shared/tst_ircdata.cpp b/libcommuni/tests/auto/shared/tst_ircdata.cpp deleted file mode 100644 index b3a11b2..0000000 --- a/libcommuni/tests/auto/shared/tst_ircdata.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "tst_ircdata.h" -#include "tst_freenode.h" -#include "tst_ircnet.h" -#include "tst_euirc.h" - -QList tst_IrcData::keys() -{ - return QList() << "freenode" << "ircnet" << "euirc"; -} - -QByteArray tst_IrcData::welcome(const QByteArray& key) -{ - static QHash blobs; - if (blobs.isEmpty()) { - blobs.insert("freenode", freenode_welcome); - blobs.insert("ircnet", ircnet_welcome); - blobs.insert("euirc", euirc_welcome); - } - return blobs.value(key.isEmpty() ? keys().first() : key); -} - -QByteArray tst_IrcData::join(const QByteArray& key) -{ - static QHash blobs; - if (blobs.isEmpty()) { - blobs.insert("freenode", freenode_join); - blobs.insert("ircnet", ircnet_join); - blobs.insert("euirc", euirc_join); - } - return blobs.value(key.isEmpty() ? keys().first() : key); -} - -QStringList tst_IrcData::names(const QByteArray& key) -{ - static QHash blobs; - if (blobs.isEmpty()) { - blobs.insert("freenode", QString::fromUtf8(freenode_names).split(" ")); - blobs.insert("ircnet", QString::fromUtf8(ircnet_names).split(" ")); - blobs.insert("euirc", QString::fromUtf8(euirc_names).split(" ")); - } - return blobs.value(key.isEmpty() ? keys().first() : key); -} - -QStringList tst_IrcData::admins(const QByteArray& key) -{ - static QHash blobs; - if (blobs.isEmpty()) { - blobs.insert("freenode", QString::fromUtf8(freenode_admins).split(" ")); - blobs.insert("ircnet", QString::fromUtf8(ircnet_admins).split(" ")); - blobs.insert("euirc", QString::fromUtf8(euirc_admins).split(" ")); - } - return blobs.value(key.isEmpty() ? keys().first() : key); -} - -QStringList tst_IrcData::ops(const QByteArray& key) -{ - static QHash blobs; - if (blobs.isEmpty()) { - blobs.insert("freenode", QString::fromUtf8(freenode_ops).split(" ")); - blobs.insert("ircnet", QString::fromUtf8(ircnet_ops).split(" ")); - blobs.insert("euirc", QString::fromUtf8(euirc_ops).split(" ")); - } - return blobs.value(key.isEmpty() ? keys().first() : key); -} - -QStringList tst_IrcData::halfops(const QByteArray& key) -{ - static QHash blobs; - if (blobs.isEmpty()) { - blobs.insert("freenode", QString::fromUtf8(freenode_halfops).split(" ")); - blobs.insert("ircnet", QString::fromUtf8(ircnet_halfops).split(" ")); - blobs.insert("euirc", QString::fromUtf8(euirc_halfops).split(" ")); - } - return blobs.value(key.isEmpty() ? keys().first() : key); -} - -QStringList tst_IrcData::voices(const QByteArray& key) -{ - static QHash blobs; - if (blobs.isEmpty()) { - blobs.insert("freenode", QString::fromUtf8(freenode_voices).split(" ")); - blobs.insert("ircnet", QString::fromUtf8(ircnet_voices).split(" ")); - blobs.insert("euirc", QString::fromUtf8(euirc_voices).split(" ")); - } - return blobs.value(key.isEmpty() ? keys().first() : key); -} diff --git a/libcommuni/tests/auto/shared/tst_ircdata.h b/libcommuni/tests/auto/shared/tst_ircdata.h deleted file mode 100644 index c5126f8..0000000 --- a/libcommuni/tests/auto/shared/tst_ircdata.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#ifndef TST_IRCDATA_H -#define TST_IRCDATA_H - -#include -#include -#include -#include -#include - -class tst_IrcData -{ -public: - static QList keys(); - static QByteArray welcome(const QByteArray& key = QByteArray()); - static QByteArray join(const QByteArray& key = QByteArray()); - static QStringList names(const QByteArray& key = QByteArray()); - static QStringList admins(const QByteArray& key = QByteArray()); - static QStringList ops(const QByteArray& key = QByteArray()); - static QStringList halfops(const QByteArray& key = QByteArray()); - static QStringList voices(const QByteArray& key = QByteArray()); -}; - -#endif // TST_IRCDATA_H diff --git a/libcommuni/tests/auto/shared/tst_ircnet.h b/libcommuni/tests/auto/shared/tst_ircnet.h deleted file mode 100644 index e0fb7d4..0000000 --- a/libcommuni/tests/auto/shared/tst_ircnet.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#ifndef TST_IRCNET_H -#define TST_IRCNET_H - -static const char* ircnet_welcome = - ":irc.ifi.uio.no 020 * :Please wait while we process your connection.\r\n" - ":irc.ifi.uio.no 001 communi :Welcome to the Internet Relay Network communi!~communi@hidd.en\r\n" - ":irc.ifi.uio.no 002 communi :Your host is irc.ifi.uio.no, running version 2.11.2p3\r\n" - ":irc.ifi.uio.no 003 communi :This server was created Wed Aug 8 2012 at 10:28:47 CEST\r\n" - ":irc.ifi.uio.no 004 communi irc.ifi.uio.no 2.11.2p3 aoOirw abeiIklmnoOpqrRstv\r\n" - ":irc.ifi.uio.no 005 communi RFC2812 PREFIX=(ov)@+ CHANTYPES=#&!+ MODES=3 CHANLIMIT=#&!+:21 NICKLEN=15 TOPICLEN=255 KICKLEN=255 MAXLIST=beIR:64 CHANNELLEN=50 IDCHAN=!:5 CHANMODES=beIR,k,l,imnpstaqr :are supported by this server\r\n" - ":irc.ifi.uio.no 005 communi PENALTY FNC EXCEPTS=e INVEX=I CASEMAPPING=ascii NETWORK=IRCNet :are supported by this server\r\n" - ":irc.ifi.uio.no 042 communi 578IAAESX :your unique ID\r\n" - ":irc.ifi.uio.no 251 communi :There are 55235 users and 5 services on 27 servers\r\n" - ":irc.ifi.uio.no 252 communi 95 :operators online\r\n" - ":irc.ifi.uio.no 254 communi 30892 :channels formed\r\n" - ":irc.ifi.uio.no 255 communi :I have 447 users, 0 services and 4 servers\r\n" - ":irc.ifi.uio.no 265 communi 447 456 :Current local users 447, max 456\r\n" - ":irc.ifi.uio.no 266 communi 55235 58824 :Current global users 55235, max 58824\r\n" - ":irc.ifi.uio.no 375 communi :- irc.ifi.uio.no Message of the Day -\r\n" - ":irc.ifi.uio.no 376 communi :End of MOTD command.\r\n"; - -static const char* ircnet_join = - ":communi!~communi@hidd.en JOIN :#uptimed\r\n" - ":irc.ifi.uio.no 332 communi #uptimed :UPTIME CONTEST - STARTS WITH 600 VOICES / The winner gets a 1 year SHELL\r\n" - ":irc.ifi.uio.no 333 communi #uptimed t0r-!t0r@hidd.en 1380194318\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :communi +_box +Ste` +`ViRuS` +sensej +ip +\\x00 +Dos +Plato +sonik +[daro] +056DABT1Q @Voicer +Elcid +NICK +ComeAsYouAre +nightmare +AboutAGirl +once +Arwen +vizion @artico +OnceW3reWarrior +NT2000 +Coolio +babka +dziadek +OnceWereWarrior +kaban +nabak +uytrew +705AAFHDM +705AAFHDO +705AAFHDN +ggefew +233EAGIRG +adsfds +[jp] +233DADVTX +233DADVTW +vaginakkk +szok +datanetek +deeee +italiano +knbb +em +robo +dupeczka +233DADWSZ +mofaya +fogiel +[nsa]\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+vagina +evil_ +vaginallo +why +evil` +inci +yhw +zazaza +ewe +bandoz +zeus +[animanera] +{artic} @Uptimed +sisiako +italianos +elite +polishpower +nsa` +`artic` +RedDevil +varna +s +rudy +draven +lupo +ijnnk +quest[2] +desapir +itsab +r0d +keep +An0nym0uz +_sparco +nsa- +KaPPa +devilkickers +wannie +PaulAnunda +TuOmaS- +Ainame +TeSsIer +MarkrIckeR +Markvillam +LasteS +JaMeS_ +CriStiaNo +IvanaCosta +brunodp +HackYou +Ducentesimo +Created +Ciwarshak\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+BroLy +BriatoRe +tasya +cpanel +liana +shoutcast +humantourch +myznc +kopisusu +ainah +IRC +knb +ipv4 +zguba +{ +rudi +idur +ls_212 +[goku] +xman +josip +mushroom +ajo +Patty +alien^ +ReMoNDiNi +marselo +NiTr0 +iOrOxxo +DartagnaN +TheCure +FurisO +MetroNotte +ToRSoLo +register +init-zero +Pilszcz +DjCaro +wamper +ToRQUaTo +Alison +Wenni^_^ +Hambi +MzMaNdY +Howie^^ +Chiwai +EkinCheng +Jenny^_^ @abuser` +die @Mgla +rcu +|jp| +|be| +egg +suka +ircoholik\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+|de| @ruciu +japanase +zncbot +latitanz +kafir +sparco +invisible +elk +jazz +esprit +strange +rex +grasshopper +miracle +outlaw @t0r- +veronica +artic| @[m] +ToRDo +ToRRoNe +MusSi +ToRBiDo +gozmit +ToReRo +ToRReNTe +Mediterraneo +Sugar +unregistered +bohjan +biskut +xdos +unix +cheap +android +birc +edit +Robocop +Neon +Temp +Apofis +Seth +Sokar +Iron +Control +Kiler +mrozek +widzewiak +klesk +Dj +Rcnet +mybsd +lis +[d] +resu` +ussus_ +ksychy +sp +kln\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+psk +Kulf0n +daro +darecki +pan_ban +Anonymouz +atos +MarRosso +CommenDa +miglia +Spike +Sc0rpion +Krotone +ViboValentia +Arcaverde +AlcaTRaz +Adriatico +MescaliNa +PiPo_ +RogeS +sm0k +kakashi +naintails +smuga +howkey +aven[gers] +[neo] +[dill] +Aptajm +marcin +founder +roger +feedback +M-k +Madmax +Piramida +Hator +Loginek +Lill +Polibuda +Zeus` +bouncer +msdos +gurl +kongsi +mamak +scid +mylinux +sock +nana +ibm +samba +k-pop +gyna +k-chat +mail\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+chat +yatie +ircap +Ho-Nam +mynet +rindunet +qip +eggies +db +fakap +loco +mircpro +mircbot +mynic +bladez +hackintosh +egghelp +kampung +cisco +girl +skepticals +nickname +Uncle-B +bohsia +mircx @Grypsio +kaktej +Asia +HelpAR +VaneSSaBeLL +AcHIni +DjuNaBarnEs +HydRA +WilHElm- +BrIanCHon +LiLi +Br0doWski +Apus +BoUdin0 +ERebpAR +RetIculum +TucANA +CAsIk +CANes +PuppIs +BeNaZech +BeRnaRDus +Lupus +IzrAileviC +UlAIn +AdaMI +Bartels +AGliNK +Helon +UlpAR\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+BemELmaNS +DelphINus +AbBati +FoRNAx +BenKvicH +Ulseth +PIctoR +BeJJini +BroOWn +Br00k +AffanNU +Achenbach +BelloTTo +AbrHHam +CeNtAuRus +Agutte +AlbrECht +AnGeLico +Ar13S +TAuRus +BeReNIces +AzARfAR +AquIlA +Br0uwEr +BreYtenbaCH +CAsImAR +CAssIopeIA +ColumbA +CRux +EuGen +GeoFFrY +HiPPolyter +HoRologIum +LAceRtA +LeoMINoR +NIsAIn +NIsseth +NoRmA +PaVl0viC +ScoRpIus +SeRpeNs +ShuRImAR +artic +TitoAguiAri +ZIRpAR +TuRfAR +VAnIkAIn +VolANs +NIspAR\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+CAsImAl +ThiErry +INdus +Cetus +PeTerFraNcio +GRus +MadDox +PIscIs +VulpeculA +CeCily +TRIANgulum +CApRIcoRNus +FraNtz +TuRIen +AdeMollo +BrIgnOni +AgReSti +AustRAle +BoTTinI +BouVIer +BrenTANA +BriNdiSi +CAelum +DoRAdo +ErNIeBarnEs +Helseth +JeNNiferBart +leBrocQUy +Lepus +LyNx +OctANs +OphIuchus +PeNeTriL +PIsces +PyxIs +roKkmAn +SAgIttA +TelescopIum +CRAteR +PeRseus +ShuRpAR +CAsseth +BeLLini +ChAmAeleoN +MIcRoscopIum +Ad0lphE +BoReAlIs +ARA_ +CARINA\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+AquARIus_ +BartoLomeo +ShuRon +t0r__ +YaAcovAgam +Betty- +HydRus +ANDRoMeD2 +Mercurio +HeRcules_ +ORIoN- +Br00ker +Cepheus +276XAAAPU +PegAsus_ +CAspAR +BoUchE +MoNoceRos +URsAMAjoR +CAsIl +AivaZZovskKy +ERIdANus +BoUdeWijNS +LyR4 +ERebseth +ShuRseth +AleChiNskY +LIbRA +Leo +AceRbi +AuRIgA +BeNNo +Bootes_ +BriSSaud +CIRcINus +DRAco +SAgIttAR2us +WaSHingt0n +JUliUs- +TuRIk +HansBellmEs +PAvo +SculptoR +AddNet +GemINI +ANtlIA +ShuRkAn +BoUcheR +Br0wn\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+URsAMINoR +VelA +CoRvus_ +BoWerANO +AustRINA +Agn0l +KaziMIerZ +PhoeNIx- +Scutum +SebAStieN +VIRgo_ +CANceR_ +CygNus_ +ZIRseth +t0r_ +ERebon +Equuleus +BouLAngeR +CAson +SextANs +JBelliNi +BourdiDIchoN +AzARAth +DiLDoSauRo +PumPinks +Callisto +Cosenza +Meschino +Portos +IoRobot +Eclipse +HighLander +T0XiC +Popoff +PaLLa +Indiano +MDma +Eastie +BleacH +PoSiX +Slash_ +InUtero +FormaGGino +riggiu +tirrenico +papera +MaXMerilio +MalandriNo +ToRTiGLia\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+ToRToRa +BeLGo +NetBeans +NeverMind +BlackSp1rit +Ionico +Anfetamina +t0r +ladyshrew +ToRoNTo +AsTRo` +ToRCeTTo +EnSi +ToRNaDo +ToRReTTa +MaGReBiNo +ToRBoSo +ToRSiDa +ToRCia +ToRCiCoLLo +Wokie +RuMeNiNo +ToRTiNo +TheOne +NOP +oVaCoD +KiFFa +CLeMeNTiNo +ToRaCe +EviLDoG +PoPkiss +NeverDown +EleCTrO +CaM3LS_ +Hulk +StocaZZico +YoUbEgGaReD +Ocean +aLBaNiN0 +CaNeSeCCo +AlwaysBack +Crimson +OuRwEeRiCiN +Shorty +BeeDeePee +Punker +ToRaLBa +BeSTio +BaBy_BluE\r\n" - ":irc.ifi.uio.no 353 communi = #uptimed :+TeSTiCoLo^ +BieBeron +Prosexionist +svansen +artic^\r\n" - ":irc.ifi.uio.no 366 communi #uptimed :End of NAMES list.\r\n"; - -static const char* ircnet_names = - "communi _box Ste` `ViRuS` sensej ip \\x00 Dos Plato sonik [daro] 056DABT1Q Voicer Elcid NICK ComeAsYouAre nightmare AboutAGirl once Arwen vizion artico OnceW3reWarrior NT2000 Coolio babka dziadek OnceWereWarrior kaban nabak uytrew 705AAFHDM 705AAFHDO 705AAFHDN ggefew 233EAGIRG adsfds [jp] 233DADVTX 233DADVTW vaginakkk szok datanetek deeee italiano knbb em robo dupeczka 233DADWSZ mofaya fogiel [nsa] " - "vagina evil_ vaginallo why evil` inci yhw zazaza ewe bandoz zeus [animanera] {artic} Uptimed sisiako italianos elite polishpower nsa` `artic` RedDevil varna s rudy draven lupo ijnnk quest[2] desapir itsab r0d keep An0nym0uz _sparco nsa- KaPPa devilkickers wannie PaulAnunda TuOmaS- Ainame TeSsIer MarkrIckeR Markvillam LasteS JaMeS_ CriStiaNo IvanaCosta brunodp HackYou Ducentesimo Created Ciwarshak " - "BroLy BriatoRe tasya cpanel liana shoutcast humantourch myznc kopisusu ainah IRC knb ipv4 zguba { rudi idur ls_212 [goku] xman josip mushroom ajo Patty alien^ ReMoNDiNi marselo NiTr0 iOrOxxo DartagnaN TheCure FurisO MetroNotte ToRSoLo register init-zero Pilszcz DjCaro wamper ToRQUaTo Alison Wenni^_^ Hambi MzMaNdY Howie^^ Chiwai EkinCheng Jenny^_^ abuser` die Mgla rcu |jp| |be| egg suka ircoholik " - "|de| ruciu japanase zncbot latitanz kafir sparco invisible elk jazz esprit strange rex grasshopper miracle outlaw t0r- veronica artic| [m] ToRDo ToRRoNe MusSi ToRBiDo gozmit ToReRo ToRReNTe Mediterraneo Sugar unregistered bohjan biskut xdos unix cheap android birc edit Robocop Neon Temp Apofis Seth Sokar Iron Control Kiler mrozek widzewiak klesk Dj Rcnet mybsd lis [d] resu` ussus_ ksychy sp kln " - "psk Kulf0n daro darecki pan_ban Anonymouz atos MarRosso CommenDa miglia Spike Sc0rpion Krotone ViboValentia Arcaverde AlcaTRaz Adriatico MescaliNa PiPo_ RogeS sm0k kakashi naintails smuga howkey aven[gers] [neo] [dill] Aptajm marcin founder roger feedback M-k Madmax Piramida Hator Loginek Lill Polibuda Zeus` bouncer msdos gurl kongsi mamak scid mylinux sock nana ibm samba k-pop gyna k-chat mail " - "chat yatie ircap Ho-Nam mynet rindunet qip eggies db fakap loco mircpro mircbot mynic bladez hackintosh egghelp kampung cisco girl skepticals nickname Uncle-B bohsia mircx Grypsio kaktej Asia HelpAR VaneSSaBeLL AcHIni DjuNaBarnEs HydRA WilHElm- BrIanCHon LiLi Br0doWski Apus BoUdin0 ERebpAR RetIculum TucANA CAsIk CANes PuppIs BeNaZech BeRnaRDus Lupus IzrAileviC UlAIn AdaMI Bartels AGliNK Helon UlpAR " - "BemELmaNS DelphINus AbBati FoRNAx BenKvicH Ulseth PIctoR BeJJini BroOWn Br00k AffanNU Achenbach BelloTTo AbrHHam CeNtAuRus Agutte AlbrECht AnGeLico Ar13S TAuRus BeReNIces AzARfAR AquIlA Br0uwEr BreYtenbaCH CAsImAR CAssIopeIA ColumbA CRux EuGen GeoFFrY HiPPolyter HoRologIum LAceRtA LeoMINoR NIsAIn NIsseth NoRmA PaVl0viC ScoRpIus SeRpeNs ShuRImAR artic TitoAguiAri ZIRpAR TuRfAR VAnIkAIn VolANs NIspAR " - "CAsImAl ThiErry INdus Cetus PeTerFraNcio GRus MadDox PIscIs VulpeculA CeCily TRIANgulum CApRIcoRNus FraNtz TuRIen AdeMollo BrIgnOni AgReSti AustRAle BoTTinI BouVIer BrenTANA BriNdiSi CAelum DoRAdo ErNIeBarnEs Helseth JeNNiferBart leBrocQUy Lepus LyNx OctANs OphIuchus PeNeTriL PIsces PyxIs roKkmAn SAgIttA TelescopIum CRAteR PeRseus ShuRpAR CAsseth BeLLini ChAmAeleoN MIcRoscopIum Ad0lphE BoReAlIs ARA_ CARINA " - "AquARIus_ BartoLomeo ShuRon t0r__ YaAcovAgam Betty- HydRus ANDRoMeD2 Mercurio HeRcules_ ORIoN- Br00ker Cepheus 276XAAAPU PegAsus_ CAspAR BoUchE MoNoceRos URsAMAjoR CAsIl AivaZZovskKy ERIdANus BoUdeWijNS LyR4 ERebseth ShuRseth AleChiNskY LIbRA Leo AceRbi AuRIgA BeNNo Bootes_ BriSSaud CIRcINus DRAco SAgIttAR2us WaSHingt0n JUliUs- TuRIk HansBellmEs PAvo SculptoR AddNet GemINI ANtlIA ShuRkAn BoUcheR Br0wn " - "URsAMINoR VelA CoRvus_ BoWerANO AustRINA Agn0l KaziMIerZ PhoeNIx- Scutum SebAStieN VIRgo_ CANceR_ CygNus_ ZIRseth t0r_ ERebon Equuleus BouLAngeR CAson SextANs JBelliNi BourdiDIchoN AzARAth DiLDoSauRo PumPinks Callisto Cosenza Meschino Portos IoRobot Eclipse HighLander T0XiC Popoff PaLLa Indiano MDma Eastie BleacH PoSiX Slash_ InUtero FormaGGino riggiu tirrenico papera MaXMerilio MalandriNo ToRTiGLia " - "ToRToRa BeLGo NetBeans NeverMind BlackSp1rit Ionico Anfetamina t0r ladyshrew ToRoNTo AsTRo` ToRCeTTo EnSi ToRNaDo ToRReTTa MaGReBiNo ToRBoSo ToRSiDa ToRCia ToRCiCoLLo Wokie RuMeNiNo ToRTiNo TheOne NOP oVaCoD KiFFa CLeMeNTiNo ToRaCe EviLDoG PoPkiss NeverDown EleCTrO CaM3LS_ Hulk StocaZZico YoUbEgGaReD Ocean aLBaNiN0 CaNeSeCCo AlwaysBack Crimson OuRwEeRiCiN Shorty BeeDeePee Punker ToRaLBa BeSTio BaBy_BluE " - "TeSTiCoLo^ BieBeron Prosexionist svansen artic^"; - -static const char* ircnet_admins = ""; -static const char* ircnet_ops = "Voicer artico Uptimed abuser` Mgla ruciu t0r- [m] Grypsio"; -static const char* ircnet_halfops = ""; - -static const char* ircnet_voices = - "_box Ste` `ViRuS` sensej ip \\x00 Dos Plato sonik [daro] 056DABT1Q Elcid NICK ComeAsYouAre nightmare AboutAGirl once Arwen vizion OnceW3reWarrior NT2000 Coolio babka dziadek OnceWereWarrior kaban nabak uytrew 705AAFHDM 705AAFHDO 705AAFHDN ggefew 233EAGIRG adsfds [jp] 233DADVTX 233DADVTW vaginakkk szok datanetek deeee italiano knbb em robo dupeczka 233DADWSZ mofaya fogiel [nsa] " - "vagina evil_ vaginallo why evil` inci yhw zazaza ewe bandoz zeus [animanera] {artic} sisiako italianos elite polishpower nsa` `artic` RedDevil varna s rudy draven lupo ijnnk quest[2] desapir itsab r0d keep An0nym0uz _sparco nsa- KaPPa devilkickers wannie PaulAnunda TuOmaS- Ainame TeSsIer MarkrIckeR Markvillam LasteS JaMeS_ CriStiaNo IvanaCosta brunodp HackYou Ducentesimo Created Ciwarshak " - "BroLy BriatoRe tasya cpanel liana shoutcast humantourch myznc kopisusu ainah IRC knb ipv4 zguba { rudi idur ls_212 [goku] xman josip mushroom ajo Patty alien^ ReMoNDiNi marselo NiTr0 iOrOxxo DartagnaN TheCure FurisO MetroNotte ToRSoLo register init-zero Pilszcz DjCaro wamper ToRQUaTo Alison Wenni^_^ Hambi MzMaNdY Howie^^ Chiwai EkinCheng Jenny^_^ die rcu |jp| |be| egg suka ircoholik " - "|de| japanase zncbot latitanz kafir sparco invisible elk jazz esprit strange rex grasshopper miracle outlaw veronica artic| ToRDo ToRRoNe MusSi ToRBiDo gozmit ToReRo ToRReNTe Mediterraneo Sugar unregistered bohjan biskut xdos unix cheap android birc edit Robocop Neon Temp Apofis Seth Sokar Iron Control Kiler mrozek widzewiak klesk Dj Rcnet mybsd lis [d] resu` ussus_ ksychy sp kln " - "psk Kulf0n daro darecki pan_ban Anonymouz atos MarRosso CommenDa miglia Spike Sc0rpion Krotone ViboValentia Arcaverde AlcaTRaz Adriatico MescaliNa PiPo_ RogeS sm0k kakashi naintails smuga howkey aven[gers] [neo] [dill] Aptajm marcin founder roger feedback M-k Madmax Piramida Hator Loginek Lill Polibuda Zeus` bouncer msdos gurl kongsi mamak scid mylinux sock nana ibm samba k-pop gyna k-chat mail " - "chat yatie ircap Ho-Nam mynet rindunet qip eggies db fakap loco mircpro mircbot mynic bladez hackintosh egghelp kampung cisco girl skepticals nickname Uncle-B bohsia mircx kaktej Asia HelpAR VaneSSaBeLL AcHIni DjuNaBarnEs HydRA WilHElm- BrIanCHon LiLi Br0doWski Apus BoUdin0 ERebpAR RetIculum TucANA CAsIk CANes PuppIs BeNaZech BeRnaRDus Lupus IzrAileviC UlAIn AdaMI Bartels AGliNK Helon UlpAR " - "BemELmaNS DelphINus AbBati FoRNAx BenKvicH Ulseth PIctoR BeJJini BroOWn Br00k AffanNU Achenbach BelloTTo AbrHHam CeNtAuRus Agutte AlbrECht AnGeLico Ar13S TAuRus BeReNIces AzARfAR AquIlA Br0uwEr BreYtenbaCH CAsImAR CAssIopeIA ColumbA CRux EuGen GeoFFrY HiPPolyter HoRologIum LAceRtA LeoMINoR NIsAIn NIsseth NoRmA PaVl0viC ScoRpIus SeRpeNs ShuRImAR artic TitoAguiAri ZIRpAR TuRfAR VAnIkAIn VolANs NIspAR " - "CAsImAl ThiErry INdus Cetus PeTerFraNcio GRus MadDox PIscIs VulpeculA CeCily TRIANgulum CApRIcoRNus FraNtz TuRIen AdeMollo BrIgnOni AgReSti AustRAle BoTTinI BouVIer BrenTANA BriNdiSi CAelum DoRAdo ErNIeBarnEs Helseth JeNNiferBart leBrocQUy Lepus LyNx OctANs OphIuchus PeNeTriL PIsces PyxIs roKkmAn SAgIttA TelescopIum CRAteR PeRseus ShuRpAR CAsseth BeLLini ChAmAeleoN MIcRoscopIum Ad0lphE BoReAlIs ARA_ CARINA " - "AquARIus_ BartoLomeo ShuRon t0r__ YaAcovAgam Betty- HydRus ANDRoMeD2 Mercurio HeRcules_ ORIoN- Br00ker Cepheus 276XAAAPU PegAsus_ CAspAR BoUchE MoNoceRos URsAMAjoR CAsIl AivaZZovskKy ERIdANus BoUdeWijNS LyR4 ERebseth ShuRseth AleChiNskY LIbRA Leo AceRbi AuRIgA BeNNo Bootes_ BriSSaud CIRcINus DRAco SAgIttAR2us WaSHingt0n JUliUs- TuRIk HansBellmEs PAvo SculptoR AddNet GemINI ANtlIA ShuRkAn BoUcheR Br0wn " - "URsAMINoR VelA CoRvus_ BoWerANO AustRINA Agn0l KaziMIerZ PhoeNIx- Scutum SebAStieN VIRgo_ CANceR_ CygNus_ ZIRseth t0r_ ERebon Equuleus BouLAngeR CAson SextANs JBelliNi BourdiDIchoN AzARAth DiLDoSauRo PumPinks Callisto Cosenza Meschino Portos IoRobot Eclipse HighLander T0XiC Popoff PaLLa Indiano MDma Eastie BleacH PoSiX Slash_ InUtero FormaGGino riggiu tirrenico papera MaXMerilio MalandriNo ToRTiGLia " - "ToRToRa BeLGo NetBeans NeverMind BlackSp1rit Ionico Anfetamina t0r ladyshrew ToRoNTo AsTRo` ToRCeTTo EnSi ToRNaDo ToRReTTa MaGReBiNo ToRBoSo ToRSiDa ToRCia ToRCiCoLLo Wokie RuMeNiNo ToRTiNo TheOne NOP oVaCoD KiFFa CLeMeNTiNo ToRaCe EviLDoG PoPkiss NeverDown EleCTrO CaM3LS_ Hulk StocaZZico YoUbEgGaReD Ocean aLBaNiN0 CaNeSeCCo AlwaysBack Crimson OuRwEeRiCiN Shorty BeeDeePee Punker ToRaLBa BeSTio BaBy_BluE " - "TeSTiCoLo^ BieBeron Prosexionist svansen artic^"; - -#endif // TST_IRCNET_H diff --git a/libcommuni/tests/benchmarks/benchmarks.pri b/libcommuni/tests/benchmarks/benchmarks.pri deleted file mode 100644 index 537efa0..0000000 --- a/libcommuni/tests/benchmarks/benchmarks.pri +++ /dev/null @@ -1,9 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -QT = core network testlib -CONFIG += testcase -CONFIG -= app_bundle - -include(../tests.pri) diff --git a/libcommuni/tests/benchmarks/benchmarks.pro b/libcommuni/tests/benchmarks/benchmarks.pro deleted file mode 100644 index ec48f5f..0000000 --- a/libcommuni/tests/benchmarks/benchmarks.pro +++ /dev/null @@ -1,12 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = subdirs - -SUBDIRS += ircmessage -SUBDIRS += irctextformat - -# - windows has problems with symbols -# - mac with private headers (frameworks) -!win32:!mac:SUBDIRS += ircmessagedecoder diff --git a/libcommuni/tests/benchmarks/ircmessage/ircmessage.pro b/libcommuni/tests/benchmarks/ircmessage/ircmessage.pro deleted file mode 100644 index 0a94dc8..0000000 --- a/libcommuni/tests/benchmarks/ircmessage/ircmessage.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircmessage.cpp - -include(../benchmarks.pri) diff --git a/libcommuni/tests/benchmarks/ircmessage/tst_ircmessage.cpp b/libcommuni/tests/benchmarks/ircmessage/tst_ircmessage.cpp deleted file mode 100644 index 47b1b5c..0000000 --- a/libcommuni/tests/benchmarks/ircmessage/tst_ircmessage.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircmessage.h" -#include "ircconnection.h" -#include - -static const QByteArray MSG_32_5("Vestibulum eu libero eget metus."); -static const QByteArray MSG_64_9("Phasellus enim dui, sodales sed tincidunt quis, ultricies metus."); -static const QByteArray MSG_128_19("Ut porttitor volutpat tristique. Aenean semper ligula eget nulla condimentum tempor in quis felis. Sed sem diam, tincidunt amet."); -static const QByteArray MSG_256_37("Vestibulum quis lorem velit, a varius augue. Suspendisse risus augue, ultricies at convallis in, elementum in velit. Fusce fermentum congue augue sit amet dapibus. Fusce ultrices urna ut tortor laoreet a aliquet elit lobortis. Suspendisse volutpat posuere."); -static const QByteArray MSG_512_75("Nam leo risus, accumsan a sagittis eget, posuere eu velit. Morbi mattis auctor risus, vel consequat massa pulvinar nec. Proin aliquam convallis elit nec egestas. Pellentesque accumsan placerat augue, id volutpat nibh dictum vel. Aenean venenatis varius feugiat. Nullam molestie, ipsum id dignissim vulputate, eros urna vestibulum massa, in vehicula lacus nisi vitae risus. Ut nunc nunc, venenatis a mattis auctor, dictum et sem. Nulla posuere libero ut tortor elementum egestas. Aliquam egestas suscipit posuere."); - -class tst_IrcMessage : public QObject -{ - Q_OBJECT - -private slots: - void testFromData_data(); - void testFromData(); -}; - -void tst_IrcMessage::testFromData_data() -{ - QTest::addColumn("data"); - - QTest::newRow("null") << QByteArray(); - QTest::newRow("empty") << QByteArray(""); - - QTest::newRow("32 chars / 5 words") << MSG_32_5; - QTest::newRow("64 chars / 9 words") << MSG_64_9; - QTest::newRow("128 chars / 19 words") << MSG_128_19; - QTest::newRow("256 chars / 37 words") << MSG_256_37; - QTest::newRow("512 chars / 75 words") << MSG_512_75; - - QTest::newRow("32 chars / 5 words") << MSG_32_5; - QTest::newRow("64 chars / 9 words") << MSG_64_9; - QTest::newRow("128 chars / 19 words") << MSG_128_19; - QTest::newRow("256 chars / 37 words") << MSG_256_37; - QTest::newRow("512 chars / 75 words") << MSG_512_75; -} - -void tst_IrcMessage::testFromData() -{ - QFETCH(QByteArray, data); - - IrcConnection connection; - QBENCHMARK { - IrcMessage::fromData(data, &connection); - } -} - -QTEST_MAIN(tst_IrcMessage) - -#include "tst_ircmessage.moc" diff --git a/libcommuni/tests/benchmarks/ircmessagedecoder/ircmessagedecoder.pro b/libcommuni/tests/benchmarks/ircmessagedecoder/ircmessagedecoder.pro deleted file mode 100644 index 1ace28b..0000000 --- a/libcommuni/tests/benchmarks/ircmessagedecoder/ircmessagedecoder.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_ircmessagedecoder.cpp - -include(../benchmarks.pri) diff --git a/libcommuni/tests/benchmarks/ircmessagedecoder/tst_ircmessagedecoder.cpp b/libcommuni/tests/benchmarks/ircmessagedecoder/tst_ircmessagedecoder.cpp deleted file mode 100644 index f26e1f8..0000000 --- a/libcommuni/tests/benchmarks/ircmessagedecoder/tst_ircmessagedecoder.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "ircmessagedecoder_p.h" -#include -#include -#include - -static const QByteArray MSG_32_5("Vestibulum eu libero eget metus."); -static const QByteArray MSG_64_9("Phasellus enim dui, sodales sed tincidunt quis, ultricies metus."); -static const QByteArray MSG_128_19("Ut porttitor volutpat tristique. Aenean semper ligula eget nulla condimentum tempor in quis felis. Sed sem diam, tincidunt amet."); -static const QByteArray MSG_256_37("Vestibulum quis lorem velit, a varius augue. Suspendisse risus augue, ultricies at convallis in, elementum in velit. Fusce fermentum congue augue sit amet dapibus. Fusce ultrices urna ut tortor laoreet a aliquet elit lobortis. Suspendisse volutpat posuere."); -static const QByteArray MSG_512_75("Nam leo risus, accumsan a sagittis eget, posuere eu velit. Morbi mattis auctor risus, vel consequat massa pulvinar nec. Proin aliquam convallis elit nec egestas. Pellentesque accumsan placerat augue, id volutpat nibh dictum vel. Aenean venenatis varius feugiat. Nullam molestie, ipsum id dignissim vulputate, eros urna vestibulum massa, in vehicula lacus nisi vitae risus. Ut nunc nunc, venenatis a mattis auctor, dictum et sem. Nulla posuere libero ut tortor elementum egestas. Aliquam egestas suscipit posuere."); - -class tst_IrcMessageDecoder : public QObject -{ - Q_OBJECT - -private slots: - void testDecode_data(); - void testDecode(); -}; - -void tst_IrcMessageDecoder::testDecode_data() -{ - QTest::addColumn("data"); - - QTest::newRow("null") << QByteArray(); - QTest::newRow("empty") << QByteArray(""); - - QTest::newRow("32 chars / 5 words") << MSG_32_5; - QTest::newRow("64 chars / 9 words") << MSG_64_9; - QTest::newRow("128 chars / 19 words") << MSG_128_19; - QTest::newRow("256 chars / 37 words") << MSG_256_37; - QTest::newRow("512 chars / 75 words") << MSG_512_75; - - QTest::newRow("32 chars / 5 words") << MSG_32_5; - QTest::newRow("64 chars / 9 words") << MSG_64_9; - QTest::newRow("128 chars / 19 words") << MSG_128_19; - QTest::newRow("256 chars / 37 words") << MSG_256_37; - QTest::newRow("512 chars / 75 words") << MSG_512_75; -} - -void tst_IrcMessageDecoder::testDecode() -{ - QFETCH(QByteArray, data); - - IrcMessageDecoder decoder; - QBENCHMARK { - decoder.decode(data, "ISO-8859-15"); - } -} - -QTEST_MAIN(tst_IrcMessageDecoder) - -#include "tst_ircmessagedecoder.moc" diff --git a/libcommuni/tests/benchmarks/irctextformat/irctextformat.pro b/libcommuni/tests/benchmarks/irctextformat/irctextformat.pro deleted file mode 100644 index 61091aa..0000000 --- a/libcommuni/tests/benchmarks/irctextformat/irctextformat.pro +++ /dev/null @@ -1,7 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -SOURCES += tst_irctextformat.cpp - -include(../benchmarks.pri) diff --git a/libcommuni/tests/benchmarks/irctextformat/tst_irctextformat.cpp b/libcommuni/tests/benchmarks/irctextformat/tst_irctextformat.cpp deleted file mode 100644 index 1da9483..0000000 --- a/libcommuni/tests/benchmarks/irctextformat/tst_irctextformat.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include "irctextformat.h" -#include - -class tst_IrcTextFormat : public QObject -{ - Q_OBJECT - -private slots: - void testToHtml_data(); - void testToHtml(); -}; - -void tst_IrcTextFormat::testToHtml_data() -{ - QTest::addColumn("text"); - - QTest::newRow("info") << QString("[freenode-info] if you're at a conference and other people are having trouble connecting, please mention it to staff: http://freenode.net/faq.shtml#gettinghelp"); - QTest::newRow("topic") << QString("Communi 1.2.2 - IRC framework || Home: http://communi.github.com || Docs: http://communi.github.com/doc || MeeGo: http://store.ovi.com/content/219150"); - QTest::newRow("commit") << QString("[communi-desktop] jpnurmi pushed 2 new commits to master: https://github.com/communi/communi-desktop/compare/257ca915a490...8832bfe8d0b8"); - QTest::newRow("welcome") << QString("Welcome to the Communi development lounge. Communi for MeeGo/Symbian users are kindly asked to submit a review in Nokia Store."); -} - -void tst_IrcTextFormat::testToHtml() -{ - QFETCH(QString, text); - - IrcTextFormat format; - QBENCHMARK { - format.toHtml(text); - } -} - -QTEST_MAIN(tst_IrcTextFormat) - -#include "tst_irctextformat.moc" diff --git a/libcommuni/tests/build/build.pro b/libcommuni/tests/build/build.pro deleted file mode 100644 index 4f1eb29..0000000 --- a/libcommuni/tests/build/build.pro +++ /dev/null @@ -1,6 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = subdirs -SUBDIRS += embed install namespace diff --git a/libcommuni/tests/build/embed/embed.pro b/libcommuni/tests/build/embed/embed.pro deleted file mode 100644 index 6dc3b5d..0000000 --- a/libcommuni/tests/build/embed/embed.pro +++ /dev/null @@ -1,11 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = app -TARGET = embed -QT += network - -include(../../../src/src.pri) - -SOURCES += main.cpp diff --git a/libcommuni/tests/build/embed/main.cpp b/libcommuni/tests/build/embed/main.cpp deleted file mode 100644 index 48449a8..0000000 --- a/libcommuni/tests/build/embed/main.cpp +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include -#include -#include - -int main() -{ - IrcConnection s; - IrcBuffer b; - IrcTextFormat f; -} diff --git a/libcommuni/tests/build/install/install.pro b/libcommuni/tests/build/install/install.pro deleted file mode 100644 index 5aa824e..0000000 --- a/libcommuni/tests/build/install/install.pro +++ /dev/null @@ -1,12 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = app -TARGET = embed -QT += network - -CONFIG += communi -COMMUNI += core model util - -SOURCES += main.cpp diff --git a/libcommuni/tests/build/install/main.cpp b/libcommuni/tests/build/install/main.cpp deleted file mode 100644 index e006424..0000000 --- a/libcommuni/tests/build/install/main.cpp +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include -#include -#include - -int main() -{ - IrcConnection s; - IrcBuffer b; - IrcTextFormat f; -} diff --git a/libcommuni/tests/build/namespace/main.cpp b/libcommuni/tests/build/namespace/main.cpp deleted file mode 100644 index 73d7e10..0000000 --- a/libcommuni/tests/build/namespace/main.cpp +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2008-2014 The Communi Project - * - * This test is free, and not covered by the BSD license. There is no - * restriction applied to their modification, redistribution, using and so on. - * You can study them, modify them, use them in your own program - either - * completely or partially. - */ - -#include -#include -#include - -int main() -{ - Communi::IrcConnection s; - Communi::IrcBuffer b; - Communi::IrcTextFormat f; -} diff --git a/libcommuni/tests/build/namespace/namespace.pro b/libcommuni/tests/build/namespace/namespace.pro deleted file mode 100644 index fdd1c92..0000000 --- a/libcommuni/tests/build/namespace/namespace.pro +++ /dev/null @@ -1,12 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = app -TARGET = embed -QT += network - -DEFINES += IRC_NAMESPACE=Communi -include(../../../src/src.pri) - -SOURCES += main.cpp diff --git a/libcommuni/tests/tests.pri b/libcommuni/tests/tests.pri deleted file mode 100644 index 04588b0..0000000 --- a/libcommuni/tests/tests.pri +++ /dev/null @@ -1,25 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TARGET = tst_$$basename(_PRO_FILE_PWD_) - -DEPENDPATH += $$_PRO_FILE_PWD_ -INCLUDEPATH += $$_PRO_FILE_PWD_ - -CONFIG += install_name no_testcase_installs - -!verbose:CONFIG += silent - -CONFIG(debug, debug|release) { - OBJECTS_DIR = debug - MOC_DIR = debug -} else { - OBJECTS_DIR = release - MOC_DIR = release -} - -IRC_BUILDDIR = $$OUT_PWD/../../.. - -IRC_MODULES = IrcCore IrcModel IrcUtil -include(../src/module_deps.pri) diff --git a/libcommuni/tests/tests.pro b/libcommuni/tests/tests.pro deleted file mode 100644 index bbe5635..0000000 --- a/libcommuni/tests/tests.pro +++ /dev/null @@ -1,18 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -TEMPLATE = subdirs -SUBDIRS += auto -!no_benchmarks:SUBDIRS += benchmarks - -mac { - # TODO: install_name_tool? - check.commands += cd auto && - check.commands += DYLD_FRAMEWORK_PATH=$$OUT_PWD/../lib $(MAKE) check - !no_benchmarks { - check.commands += && cd ../benchmarks && - check.commands += DYLD_FRAMEWORK_PATH=$$OUT_PWD/../lib $(MAKE) check - } - QMAKE_EXTRA_TARGETS += check -} diff --git a/libcommuni/version.pri b/libcommuni/version.pri deleted file mode 100644 index a16d8d1..0000000 --- a/libcommuni/version.pri +++ /dev/null @@ -1,5 +0,0 @@ -###################################################################### -# Communi -###################################################################### - -IRC_VERSION = 3.2.0 diff --git a/main.cpp b/main.cpp deleted file mode 100644 index d69a266..0000000 --- a/main.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include "crsm.hpp" - -int main(int argc, char *argv[]) -{ - QCoreApplication a(argc, argv); - - CRSM *CrServerManager=new CRSM(&a); - if(!CrServerManager->isOk()) - return 1; - CrServerManager->start(); - return a.exec(); -} diff --git a/reload-CRSM b/reload-CRSM deleted file mode 100755 index d4e87c9..0000000 --- a/reload-CRSM +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -netcat localhost 9372 < /dev/null -systemd -/reload -EOF diff --git a/src/ClientInfo.hpp b/src/ClientInfo.hpp new file mode 100644 index 0000000..8099b59 --- /dev/null +++ b/src/ClientInfo.hpp @@ -0,0 +1,112 @@ +#pragma once + +#include +#include + +enum ClientInterface { + Auto = 0, + Clonk = 1, + IRC = 1 << 1, + Management = 1 << 2 +}; + + +class ManagementConnection { +public: + ManagementConnection() {} + ManagementConnection(QTcpSocket* socket, const QString& name = "") : socket(socket), name(name) {} + + QTcpSocket* socket = 0; + QString name = ""; +}; + +class ClientInfo +{ + +public: + ClientInterface interface = Clonk; + QString nick = ""; + + int CUID = 0; + QString pcName = ""; + bool activated = false; + + QList antiFloodList; + + QString target = ""; + ManagementConnection management; + + + static inline ClientInfo ircClient(QString nick, QString target = "") + { + ClientInfo ret; + ret.interface = IRC; + ret.nick = nick; + if(target.isEmpty()) + { + target = nick; + } + ret.target = target; + return ret; + } + + static inline ClientInfo clonkClient(QString nick, QString pcName, int CUID, bool activated = false) + { + ClientInfo ret; + ret.interface = Clonk; + ret.nick = nick; + ret.pcName = pcName; + ret.CUID = CUID; + ret.activated = activated; + return ret; + } + + static inline ClientInfo managementClient(ManagementConnection conn) + { + ClientInfo ret; + ret.interface = Management; + ret.management = conn; + ret.nick = conn.name; + return ret; + } + + static inline ClientInfo autoClient() + { + ClientInfo ret; + ret.interface = Auto; + return ret; + } + + inline bool operator==(const ClientInfo& other) const + { + return other.interface == interface && other.nick == nick && (interface == Clonk ? other.pcName == pcName && other.CUID == CUID : true); + } + + inline bool operator!=(const ClientInfo& other) const + { + return !operator==(other); + } + + inline bool operator<(const ClientInfo& other) const + { + return toString() < other.toString(); + } + + inline QString toString() const + { + return interface == Auto ? "~auto~" : interface == Management ? management.name + " {CLI}" : (!nick.isEmpty() ? nick + (interface == Clonk ? " (" + pcName + ")" : " [IRC]") : ""); + } + + inline bool floodCheck(int maxCount, int floodTimeSecs, QDateTime newDateTime = QDateTime::currentDateTime()) + { + foreach(const QDateTime& dateTime, antiFloodList) + { + if(dateTime.secsTo(newDateTime) > floodTimeSecs) + { + antiFloodList.removeAll(dateTime); + } + } + antiFloodList.push_back(newDateTime); + return antiFloodList.size() > maxCount; + } +}; diff --git a/src/CmdFunctionRef.hpp b/src/CmdFunctionRef.hpp new file mode 100644 index 0000000..f862823 --- /dev/null +++ b/src/CmdFunctionRef.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include + +class CRSM; + +#define CMD_FUNCTION(name) void name(const QString& cmd, const QString& args, const ClientInfo& client, UserType userType) +#define CMD_FUNCTION_IMPL(name) void CRSM::name(const QString& cmd, const QString& args, const ClientInfo& client, UserType userType) { (void)cmd; (void)args; (void)client; (void)userType; + +enum UserType { + User = 0, + Admin = 1, + Moderator = 2, + Max = Moderator +}; + +typedef void (CRSM::*CmdFunction)(const QString&, const QString&, const ClientInfo&, UserType); + +const QMap userTypeStrings { + {User, "Benutzer"}, + {Admin, "Rundenadmin oder Moderator"}, + {Moderator, "Moderator"} +}; + +struct CmdFunctionRef +{ + CmdFunction func = nullptr; + int interfaces = Clonk | IRC; + UserType userType = User; + QString shortDescription = ""; + QString longDescription = ""; + QString name = ""; + QString argList = ""; + + CmdFunctionRef(QString name, CmdFunction func, int interfaces, UserType userType, const QString& shortDescription = "", QString argList = "", const QString &longDescription = "") : func(func), interfaces(interfaces), userType(userType), shortDescription(shortDescription), longDescription(longDescription), name(name), argList(argList) + { + + } + + CmdFunctionRef() + { + + } +}; diff --git a/src/CrServerManager.pro b/src/CrServerManager.pro new file mode 100644 index 0000000..5323fea --- /dev/null +++ b/src/CrServerManager.pro @@ -0,0 +1,31 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2013-07-05T17:31:49 +# +#------------------------------------------------- + +QT += core + +QT -= gui + +TARGET = CrServerManager +CONFIG += console +CONFIG -= app_bundle + +include(libcommuni/src/core/core.pri) + +TEMPLATE = app + + +SOURCES += main.cpp \ + crsm.cpp \ + ProcessManager.cpp + +HEADERS += \ + CmdFunctionRef.hpp \ + ClientInfo.hpp \ + crsm.hpp \ + ProcessManager.hpp + +equals(QT_ARCH, "x86_64"):linux-*: DEFINES += Q_OS_LINUX64 +QMAKE_CXXFLAGS *= -std=c++11 -Wall -Wextra -Werror -Wunused diff --git a/src/ProcessManager.cpp b/src/ProcessManager.cpp new file mode 100644 index 0000000..6d2efe8 --- /dev/null +++ b/src/ProcessManager.cpp @@ -0,0 +1,245 @@ +#include "ProcessManager.hpp" + +#include +#include + +ProcessManager::ProcessManager(const QString &newPrefix, const QString &newId, bool useStdErr, QObject *parent) : QObject(parent), prefix(newPrefix), id(newId), useStdErr(useStdErr) +{ + if(id.isEmpty()) + { + id = QString::number(qrand()) + "-"; + } + stdIn.setFileName(prefix + id + "stdin"); + stdOut.setFileName(prefix + id + "stdout"); + stdErr.setFileName(prefix + id + "stderr"); + ctrlIn.setFileName(prefix + id + "ctrlin"); + ctrlOut.setFileName(prefix + id + "ctrlout"); + bool reattaching = false; + if(!ctrlIn.exists()) + { + if(!QProcess::startDetached("ProcessManager", QStringList() << prefix + id)) + { + return; + } + qDebug() << "Started new ProcessManager"; + qDebug() << "Waiting for ctrl-files"; + while(!ctrlIn.exists() || !ctrlOut.exists()); + } + else + { + qDebug() << "Reattaching"; + reattaching = true; + } + if(!ctrlIn.open(QFile::WriteOnly | QFile::Unbuffered)) + { + qDebug() << "ctrlin not open" << ctrlIn.errorString(); + return; + } + qDebug() << "Opened ctrlin"; + ctrlIn.write("HELLO\n"); + if(!ctrlOut.open(QFile::ReadOnly)) + { + qDebug() << "ctrlout not open" << ctrlOut.errorString(); + return; + } + qDebug() << "Opened ctrlout"; + if(ctrlOut.readLine() != "HELLO\n") + { + qDebug() << "not HELLO"; + return; + } + qDebug() << "HELLO"; + ctrlOutNotifier = new QSocketNotifier(ctrlOut.handle(), QSocketNotifier::Read, this); + connect(ctrlOutNotifier, SIGNAL(activated(int)), this, SLOT(ctrlOutReadyRead())); + ok = true; + if(reattaching) + { + ctrlIn.write("STATUS\n"); + QByteArray status = ctrlOut.readLine(); + if(status != "NOTRUNNING\n") + { + QRegExp runningExp("^RUNNING: (\\d+)\n$"); + if(runningExp.exactMatch(QString::fromUtf8(status))) + { + pid = runningExp.cap(1).toInt(); + running = connectToIO(); + } + } + } +} + +ProcessManager::~ProcessManager() +{ + +} + +bool ProcessManager::isOk() +{ + return ok; +} + +bool ProcessManager::isRunning() +{ + return ok && running; +} + +bool ProcessManager::start(const QString &program, QStringList args) +{ + if(!ok || running) + { + return false; + } + for(int i = 0; i < args.length(); ++i) + { + args[i] = args[i].replace('\\', "\\\\").replace(' ', "\\ "); + } + ctrlIn.write("START " + program.toUtf8() + " " + args.join(' ').toUtf8() + "\n"); + QRegExp runningExp("^RUNNING: (\\d+)\n$"); + if(!runningExp.exactMatch(ctrlOut.readLine())) + { + return false; + } + else + { + pid = runningExp.cap(1).toInt(); + return running = connectToIO(); + } +} + +QByteArray ProcessManager::readAll() +{ + return stdOut.readAll(); +} + +QByteArray ProcessManager::readLine() +{ + return stdOut.readLine(); +} + +qint64 ProcessManager::write(const QByteArray &data) +{ + if(stdIn.isWritable()) + { + return stdIn.write(data); + } + else + { + return -1; + } +} + +bool ProcessManager::isWritable() +{ + return ok && running && stdIn.isOpen() && stdIn.isWritable(); +} + +bool ProcessManager::setWorkingDirectory(const QString &path) +{ + if(!ok || !ctrlIn.isWritable() || running) + { + return false; + } + ctrlIn.write("CD " + path.toUtf8() + "\n"); + if(ctrlOut.readLine() != "CHANGED\n") + { + return false; + } + else + { + return true; + } +} + +void ProcessManager::kill() +{ + if(ok && running && ctrlIn.isWritable()) + { + ctrlIn.write("KILL\n"); + } +} + +void ProcessManager::exit() +{ + ctrlIn.write("EXIT\n"); +} + +void ProcessManager::closeProgFifos() +{ + ctrlIn.write("CLOSE\n"); + stdIn.close(); + stdOut.close(); + stdErr.close(); + DELETE_SAVE(stdOutNotifier); + DELETE_SAVE(stdErrNotifier); +} + +QString ProcessManager::ID() +{ + return id; +} + +void ProcessManager::ctrlOutReadyRead() +{ + QString what = QString::fromUtf8(ctrlOut.readLine()); + QRegExp quitExp("^QUIT: (\\d+)\n"); + if(quitExp.exactMatch(what)) + { + exitCode = quitExp.cap(1).toInt(); + running = false; + stdOut.close(); + stdErr.close(); + stdIn.close(); + DELETE_SAVE(stdOutNotifier); + DELETE_SAVE(stdErrNotifier); + emit finished(exitCode); + } +} + +void ProcessManager::_stdOutReadyRead() +{ + if(!stdOut.isOpen()) + { + DELETE_SAVE(stdOutNotifier); + } + emit readyRead(); +} + +void ProcessManager::_stdErrReadyRead() +{ + if(!stdErr.isOpen()) + { + DELETE_SAVE(stdErrNotifier); + } + emit stdErrReadyRead(); +} + +bool ProcessManager::connectToIO() +{ + if(!stdOut.open(QFile::ReadOnly)) + { + qDebug() << "stdout not open" << stdOut.errorString(); + return false; + } + qDebug() << "Opened stdout"; + if(!stdErr.open(QFile::ReadOnly)) + { + qDebug() << "stderr not open" << stdOut.errorString(); + return false; + } + qDebug() << "Opened stderr"; + if(!stdIn.open(QFile::WriteOnly | QFile::Unbuffered)) + { + qDebug() << "stdin not open" << stdOut.errorString(); + return false; + } + qDebug() << "Opened stdin"; + stdOutNotifier = new QSocketNotifier(stdOut.handle(), QSocketNotifier::Read, this); + connect(stdOutNotifier, SIGNAL(activated(int)), this, SLOT(_stdOutReadyRead())); + if(useStdErr) + { + stdErrNotifier = new QSocketNotifier(stdErr.handle(), QSocketNotifier::Read, this); + connect(stdErrNotifier, SIGNAL(activated(int)), this, SLOT(_stdErrReadyRead())); + } + return true; +} + diff --git a/src/ProcessManager.hpp b/src/ProcessManager.hpp new file mode 100644 index 0000000..7782cb3 --- /dev/null +++ b/src/ProcessManager.hpp @@ -0,0 +1,75 @@ +#ifndef PROCESSMANAGER_HPP +#define PROCESSMANAGER_HPP + +#define DELETE_SAVE(x) if(x != 0) \ +{\ + delete x;\ + x = 0;\ +} + +#include +#include +#include + +class ProcessManager : public QObject +{ + Q_OBJECT +public: + explicit ProcessManager(const QString& prefix, const QString& id = "", bool useStdErr = false, QObject *parent = 0); + ~ProcessManager(); + + bool isOk(); + bool isRunning(); + bool start(const QString& program, QStringList args); + + QByteArray readAll(); + QByteArray readLine(); + qint64 write(const QByteArray& data); + bool isWritable(); + bool setWorkingDirectory(const QString& path); + + void kill(); + void exit(); + + void closeProgFifos(); + + QString ID(); + +signals: + void readyRead(); + void stdErrReadyRead(); + void finished(int); + +public slots: + +private slots: + void ctrlOutReadyRead(); + void _stdOutReadyRead(); + void _stdErrReadyRead(); + +private: + QString prefix; + QString id; + + QFile ctrlIn; + QFile ctrlOut; + QFile stdIn; + QFile stdOut; + QFile stdErr; + + QSocketNotifier* ctrlOutNotifier = 0; + QSocketNotifier* stdOutNotifier = 0; + QSocketNotifier* stdErrNotifier = 0; + + bool useStdErr = false; + + bool ok = false; + bool running = false; + + int pid = 0; + int exitCode = 0; + + bool connectToIO(); +}; + +#endif // PROCESSMANAGER_HPP diff --git a/src/crsm.cpp b/src/crsm.cpp new file mode 100644 index 0000000..9a48058 --- /dev/null +++ b/src/crsm.cpp @@ -0,0 +1,2184 @@ +#include "crsm.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +#define CMD_SIGN "!" + +#define MGMT_BUFFER_FILENAME "CRSM-MGMT-Buffer" + +CRSM::CRSM(QObject *parent) : + QObject(parent) +{ + qsrand(QDateTime::currentMSecsSinceEpoch()); + codec = QTextCodec::codecForName("Windows-1252"); + qout = new QTextStream(stdout, QIODevice::WriteOnly | QIODevice::Unbuffered); + qin = new QTextStream(stdin, QIODevice::ReadOnly); + qout->setCodec(QTextCodec::codecForName("UTF-8")); + + outputBuffer.setFileName(MGMT_BUFFER_FILENAME); + outputBuffer.open(QFile::WriteOnly | QFile::Unbuffered); + + args << "/fullscreen" << "/config:config" << "/lobby:60" << "/nosignup"; + finish = false; + + readConfig(); + + connect(&managementServer, SIGNAL(newConnection()), this, SLOT(newManagementConnection())); + managementServer.listen(QHostAddress::LocalHostIPv6, settings["ManagementPort"].toUInt()); + + listC4Folders(); + readScenarios(); + + if(settings.contains("ReattachId")) + { + processManager = new ProcessManager("CRSM-Clonkserver-", settings["ReattachId"]); + } + else + { + processManager = new ProcessManager("CRSM-Clonkserver-"); + } + + + if(!processManager->isOk()) + { + out("Could not start Process Manager!"); + settings.remove("ReattachId"); + writeConfig(); + return; + } + + settings["ReattachId"] = processManager->ID(); + writeConfig(); + + if(processManager->isRunning()) + { + writeToServer("Server Manager läuft wieder.\nBis zur nächsten Runde könnte unerwartetes Verhalten auftreten.\n"); + } + + setupCmds(); + + connect(&greetMapper, SIGNAL(mapped(QString)), this, SLOT(greet(QString))); + + autoHost = settings["AutoHost"] == "true"; + + connect(processManager, SIGNAL(readyRead()), this, SLOT(readServerOutput())); + //connect(processManager, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError())); + connect(processManager, SIGNAL(finished(int)), this, SLOT(scenarioFinished())); + //QSocketNotifier *inNotifier = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read,this); + //connect(inNotifier, SIGNAL(activated(int)), this, SLOT(readInput())); + + QFile *reallog = new QFile(settings["ClonkDirectory"]+"CRSM.log"); + reallog->open(QIODevice::Append | QIODevice::Text); + logstream.setDevice(reallog); + + if(settings["UseIrc"] == "true") + { + prepareAndConnectIrc(); + } + else + { + settings["IrcUseIngameChat"] = "false"; + } + + ok = true; +} + +CRSM::~CRSM() +{ +} + +void CRSM::start() +{ + if(autoHost && !processManager->isRunning()) + nextScen(); +} + +bool CRSM::isOk() +{ + return ok; +} + +void CRSM::readServerOutput() +{ + static QRegExp timeRemover("^>?\\s*\\[(\\d\\d:\\d\\d:\\d\\d)\\]\\s+(.*)$"); + QString what(processManager->readLine()); + + if(settings["ServerUsesReadline"] == "true") + { + while(writtenToServer.length() > 0 && what.length() > 0 && writtenToServer.at(0) == what.at(0)) + { + writtenToServer.remove(0, 1); + what.remove(0, 1); + } + + if(what.at(0) == '>') + what.remove(0, 1); + } + + if(what.isEmpty()) + return; + + logstream << what.trimmed() << endl; + + if(settings["UseIrc"] == "true") + { + foreach(const QString &mess, what.split("\n", QString::SkipEmptyParts)) + foreach(const QString &mod, ircModIOList) + { + connection->sendCommand(IrcCommand::createNotice(mod, mess)); + } + } + out(what.trimmed() + "\n"); + if(!timeRemover.exactMatch(what)) + return; + what = timeRemover.cap(2).trimmed(); + + static QRegExp userexp("^\\s*(\\*?)\\s*<(.*)\\|(\\d+)\\|([^>]*)>\\s+(.*)$"); + if(userexp.exactMatch(what)) + { + bool isMeMessage = (userexp.cap(1) == "*"); + QString user = userexp.cap(4); + QString pcName = userexp.cap(2); + int cuid = userexp.cap(3).toInt(); + if(pcName != settings["ServerPCName"]) + { + ClientInfo& info = getClientInfo(pcName, cuid, user); + if(info.floodCheck(settings["AntiFloodCount"].toInt(), settings["AntiFloodTime"].toInt(), QDateTime(QDate::currentDate(), QTime::fromString(timeRemover.cap(1), "hh:mm:ss")))) + { + kick(pcName, "Flooding! Maximal " + settings["AntiFloodCount"] + " Nachrichten in " + settings["AntiFloodTime"] + "s"); + } + else if(!isMeMessage) + { + QString msg = userexp.cap(5).trimmed(); + QRegExp commandExp("^\\" CMD_SIGN "([^ ]+)(\\s+(.*)\\s*)?$"); + if(commandExp.exactMatch(msg)) + { + QString command = commandExp.cap(1).trimmed(); + QString commandArgs = commandExp.cap(2).trimmed(); + if(!cmd(command, commandArgs, info)) + { + respond(info, "Unbekannter Befehl: \"" + command + "\"!\n"); + } + + } + else if(session["IrcUseIngameChat"] == "true") + { + connection->sendCommand(IrcCommand::createMessage(settings["IrcIngameChannel"], "[Clonk]<" + user + "> " + msg)); + } + } + } + } + static QRegExp joinExp("^Client (.+) (?:verbunden|connected)\\.\\s*$"); + if(joinExp.exactMatch(what)) + { + static QRegExp infoMatch("^<(.*)\\|(\\d+)\\|(.*)>$"); + if(infoMatch.exactMatch(joinExp.cap(1))) + { + const ClientInfo& info = ClientInfo::clonkClient(infoMatch.cap(3), infoMatch.cap(1), infoMatch.cap(2).toInt()); + clients.insert(info.pcName, info); + QTimer *timer = new QTimer; + connect(timer, SIGNAL(timeout()), &greetMapper, SLOT(map())); + connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater())); + greetMapper.setMapping(timer, info.pcName); + timer->start(1000); + if(session["IrcUseIngameChat"] == "true") + { + connection->sendCommand(IrcCommand::createMessage(settings["IrcIngameChannel"], "[Clonk] " + info.toString() + " verbunden.")); + } + } + } + + static QRegExp activatedExp("^Client (.+) (?:aktiviert|activated)\\.\\s*$"); + if(activatedExp.exactMatch(what)) + { + QRegExp infoMatch("^<(.*)\\|(\\d+)\\|(.*)>$"); + if(infoMatch.exactMatch(joinExp.cap(1))) + { + ClientInfo &info = getClientInfo(infoMatch.cap(1), infoMatch.cap(2).toInt(), infoMatch.cap(3)); + info.activated = true; + } + } + + static QRegExp deactivatedExp("^Client (.+) (?:deaktiviert|deactivated)\\.\\s*$"); + if(deactivatedExp.exactMatch(what)) + { + QRegExp infoMatch("^<(.*)\\|(\\d+)\\|(.*)>$"); + if(infoMatch.exactMatch(joinExp.cap(1))) + { + ClientInfo &info = getClientInfo(infoMatch.cap(1), infoMatch.cap(2).toInt(), infoMatch.cap(3)); + info.activated = false; + } + } + + static QRegExp startExp("^Start!\\s*$"); + if(startExp.exactMatch(what)) + { + if(session["league"] != "true") + { + writeToServer(QString("/set maxplayer 0\n")); + } + session["running"] = "true"; + } + + + static QRegExp leaveExp("^Client (.+) (?:entfernt|removed)(.*)"); + if(leaveExp.exactMatch(what)) + { + QRegExp infoMatch("^<(.*)\\|(\\d+)\\|(.*)>$"); + if(infoMatch.exactMatch(leaveExp.cap(1))) + { + ClientInfo &info = getClientInfo(infoMatch.cap(1), infoMatch.cap(2).toInt(), infoMatch.cap(3)); + writeToServer(QString(info.nick +" ist ein L34V0R!\n")); + + if(session["IrcUseIngameChat"] == "true") + { + connection->sendCommand(IrcCommand::createMessage(settings["IrcIngameChannel"], "[Clonk] " + info.toString() + " entfernt" + leaveExp.cap(2))); + } + + if(info == sessionAdmin) + { + leaveAdmins.insert(info, QDateTime::currentDateTime()); + writeToServer("Rundenadmin wurde freigegeben.\n"); + sessionAdmin = ClientInfo(); + } + + clients.remove(info.pcName); + } + if(clients.size() == 0 && userlist.length() > 0 && session["userwish"] != "true") + { + processManager->closeProgFifos(); + } + else if(clients.size() == 0 && settings["EmptyTimer"] != "-1" && (session["CountDown"] == "false" || session["CountDown"].toInt() > settings["EmptyTimer"].toInt())) + { + writeToServer("/start " + settings["EmptyTimer"] + "\n"); + } + } + + static QRegExp countDownExp("^(?:Das Spiel beginnt in (\\d+) Sekunden\\!|The game will start in (\\d+) seconds\\.)"); + if(countDownExp.exactMatch(what)) + { + session["CountDown"] = countDownExp.cap(1); + } + + static QRegExp countDownStopExp("^(?:Spielstart abgebrochen\\.|Game start aborted\\.)"); + if(countDownStopExp.exactMatch(what)) + { + session["CountDown"] = "false"; + } +} + +/*void CRSM::processError() +{ + *qout << processManager->errorString() << endl; +}*/ + +void CRSM::readInput() +{ + QString what(qin->readLine()); + if(what == "/exitdetach" || what == "/exitupdate") + { + if(what == "/exitupdate") + { + writeToServer("Der Server Manager wird upgedatet. Befehle funktionieren temporär nicht.\n"); + } + settings["ReattachId"] = processManager->ID(); + writeConfig(); + QCoreApplication::quit(); + return; + } + if(what == "/exit") + { + processManager->closeProgFifos(); + settings.remove("ReattachId"); + finish = true; + if(session["hosting"] != "true") + scenarioFinished(); + return; + } + if(what == "/exitafter") + { + finish = true; + out("Will exit after this round."); + return; + } + if(what == "/next") + { + skipCurrent(); + return; + } + if(what == "/skip") + { + QString skipped; + if((skipped = skipScen()) != "") + { + out("Skipped \"" + skipped + "\".\n"); + } + else + out("User list is empty!\n"); + + return; + } + if(what == "/reload") + { + out("Reloading config...\n"); + lists.clear(); + settings.clear(); + ircModChecks.clear(); + ircMods.clear(); + ircModFifosOld.clear(); + ircModIOList.clear(); + ircStatusFifos.clear(); + readConfig(); + return; + } + + if(what == "/help") printAdditionalHelp(); + writeToServer(what+"\n"); +} + +void CRSM::nextScen() +{ + session["hosting"] = "true"; + if(userlist.length()>0) + { + startScen(userlist.at(0), args); + userlist.removeFirst(); + session["userwish"] = "true"; + } + else + { + startScen(nextAutoScens.first(), args); + nextAutoScens.removeFirst(); + updateNextAutoScens(); + } +} + +void CRSM::printAdditionalHelp() +{ + out("/exit stops the actual Clonk Server and exits the Server Manager.\n" + "/exitafter exits the Server Manager after the current round.\n" + "/next stops the actual Clonk Server and starts a new one.\n" + "/reload rereads the config file.\n" + "/skip removes the first scenario in user wish list.\n" + "Clonk commands following...\n"); +} + +void CRSM::readLog() +{ + QString temp(logfile->readLine().trimmed()); + if(temp != "") logstream << temp << endl; +} + +void CRSM::scenarioFinished() +{ + if(finish) + { + writeConfig(); + processManager->exit(); + if(connection != 0) + { + connection->quit(settings["IrcQuitMessage"]); + connect(connection, SIGNAL(disconnected()), QCoreApplication::instance(), SLOT(quit())); + QTimer::singleShot(500, QCoreApplication::instance(), SLOT(quit())); + } + else + QCoreApplication::quit(); + return; + } + session.clear(); + sessionAdmin = ClientInfo(); + ircAdmin = ClientInfo(); + clients.clear(); + leaveAdmins.clear(); + if((autoHost || userlist.length() > 0) && !finish) + nextScen(); + else if(!settings["IrcIngameChannel"].isEmpty()) + { + connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Kein laufendes Spiel.")); + QFile lastScenFile(LAST_SCEN_FILE_NAME); + QFile curScenFile(CUR_SCEN_FILE_NAME); + curScenFile.open(QFile::ReadOnly); + lastScenFile.open(QFile::WriteOnly); + lastScenFile.write(curScenFile.readAll()); + lastScenFile.close(); + curScenFile.close(); + curScenFile.open(QFile::WriteOnly); + curScenFile.close(); + } +} + +void CRSM::ircMessageReceived(IrcMessage *message) +{ + if(message->isOwn()) + return; + if(message->type() == IrcMessage::Notice) + { + if(message->nick() == "NickServ") + { + QStringList split = message->parameters().at(1).split(' ', QString::SkipEmptyParts); + if(((IrcNoticeMessage*)message)->content().contains("nickname is registered")) + { + connection->sendCommand(IrcCommand::createMessage("NickServ", "IDENTIFY " + settings["IrcNick"] + " " + settings["IrcPassword"])); + } + else if(split.first() == "STATUS") + { + QString statusNick = split.at(1); + int status = split.at(2).toInt(); + if(ircStatusFifos.contains(statusNick)) + { + QList> &fifo = ircStatusFifos[statusNick]; + while(fifo.size() > 0) + { + (this->*fifo.first().second)(fifo.first().first, status, ClientInfo::ircClient(statusNick)); + fifo.removeFirst(); + } + } + } + } + } + else if(message->type() == IrcMessage::Private) + { + QString target = message->parameters().at(0); + if(message->parameters().at(0) == connection->nickName()) + target = message->nick(); + QString mess = message->parameters().at(1).trimmed(); + if(target == settings["IrcIngameChannel"]) + { + writeToServer("[IRC]<" + message->nick() + "> " + mess + "\n"); + } + else if(mess.left(QString(CMD_SIGN).length()) == CMD_SIGN && mess.length() > QString(CMD_SIGN).length()) + { + QStringList args = mess.right(mess.length() - QString(CMD_SIGN).length()).split(" ", QString::SkipEmptyParts); + QString command = args.first().trimmed(); + args.removeFirst(); + QString arg = args.join(" ").trimmed(); + const ClientInfo& client = ClientInfo::ircClient(message->nick(), target); + if(!cmd(command, arg, client)) + { + respond(client, "Unbekannter Befehl: \"" + command + "\"!"); + } + } + else if(message->nick() == target && ircMods.contains(target)) + { + if(aliasWishEditor == target) + { + editAliasWishes(mess); + } + else if(ircModIOList.contains(message->nick())) + { + QString writeMessage; + if(mess.at(0) == '\\') + { + mess[0] = '/'; + } + else + { + writeMessage = "[IRC]<" + message->nick() + "> "; + } + writeMessage += mess; + writeToServer(writeMessage + "\n"); + } + } + } + else if(message->type() == IrcMessage::Join) + { + QString joinChannel = message->parameters().at(0); + connection->sendCommand(IrcCommand::createMessage(joinChannel, "Hallo " + message->nick() + "!")); + if(joinChannel == settings["IrcIngameChannel"]) + { + writeToServer("[IRC] " + message->nick() + " hat den Channel betreten." + "\n"); + } + else + ircCheckUserStatus(ClientInfo::ircClient(message->nick()), ClientInfo::ircClient(message->nick()), &CRSM::ircModCmd); + } + else if(message->type() == IrcMessage::Quit) + { + ircMods.removeAll(message->nick()); + ircModChecks.removeAll(message->nick()); + ircModIOList.removeAll(message->nick()); + if(aliasWishEditor == message->nick()) + { + stopAliasWishEditing(); + } + if(ircAdmin == ClientInfo::ircClient(message->nick())) + { + ircAdmin = ClientInfo(); + } + } + else if(message->type() == IrcMessage::Kick) + { + if(message->parameters().at(1) == connection->nickName()) + { + connection->sendCommand(IrcCommand::createJoin(message->parameters().at(0))); + } + } + else if(message->type() == IrcMessage::Part) + { + QString leaveChannel = message->parameters().at(0); + if(leaveChannel == settings["IrcIngameChannel"]) + { + writeToServer("[IRC] " + message->nick() + " hat den Channel verlassen." + "\n"); + } + } + else if(message->type() == IrcMessage::Mode) + { + QRegExp modeExp("^\\+[a-zA-Z]*(a|o)"); + if(message->parameters().size() >= 3 && message->parameters().at(0) == settings["IrcIngameChannel"] && modeExp.exactMatch(message->parameters().at(1)) && message->parameters().at(2) == settings["IrcNick"]) + { + if(settings["IrcUseIngameChat"] == "true" && !settings["IrcIngameChannel"].isEmpty()) + { + if(session["hosting"] != "true") + { + connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Kein laufendes Spiel.")); + } + else + { + connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Aktuelles Szenario: " + session["scenname"] + " | Ingamechat ist " + (session["IrcUseIngameChat"] == "true" ? "" : "de") + "aktviert.")); + } + } + } + } +} + +void CRSM::greet(QString pcName) +{ + if(!clients.contains(pcName)) + return; + const ClientInfo &info = clients.value(pcName); + writeToServer(QString("Hallo " + info.nick + "!\n")); + if(leaveAdmins.contains(info)) + { + int timeGone; + if((timeGone = leaveAdmins.value(info).secsTo(QDateTime::currentDateTime())) < settings["RegainAdminTime"].toInt() && sessionAdmin != ClientInfo()) + { + writeToServer(info.nick + "! Der Rundenadmin wurde freigegeben, weil du das Spiel verlassen hast.\nDu hast noch " + QString::number(settings["RegainAdminTime"].toInt() - timeGone) + "s Zeit um den Rundenadmin zurückzuholen.\n"); + } + else + { + leaveAdmins.remove(info); + } + } +} + +void CRSM::newManagementConnection() +{ + QTcpSocket* sock = managementServer.nextPendingConnection(); + connect(sock, SIGNAL(readyRead()), this, SLOT(newManagementData())); + connect(sock, SIGNAL(disconnected()), this, SLOT(managementConnectionDisconnected())); + sock->write(QString("Willkommen beim CRSM-Management-Interface!\nIhr Name: ").toUtf8()); +} + +void CRSM::newManagementData() +{ + QTcpSocket* sock = (QTcpSocket*)sender(); + QString allData = sock->readAll().trimmed(); + foreach(const QString& data, allData.split('\n')) + { + if(!managementConnections.contains(sock)) + { + if(data.isEmpty()) + { + sock->write("Ihr Name: "); + } + else + { + ManagementConnection conn; + conn.socket = sock; + conn.name = data; + managementConnections.insert(sock, conn); + out(conn.name + " logged in on Management-Interface.\n"); + replayOutputBuffer(sock); + } + } + else + { + if(data.isEmpty()) + { + continue; + } + ManagementConnection& conn = managementConnections[sock]; + if(data.at(0) == '/') + { + QStringList split = data.right(data.length() - 1).split(' '); + QString cmdName = split.first(); + split.removeFirst(); + if(cmd(cmdName, split.join(' '), ClientInfo::managementClient(conn))) + { + continue; + } + else + { + writeToServer(data + "\n"); + } + } + else + { + writeToServer("[CLI]<" + conn.name + "> " + data + "\n"); + } + } + } +} + +void CRSM::managementConnectionDisconnected() +{ + QTcpSocket* sock = (QTcpSocket*)sender(); + out(managementConnections.value(sock).name + "disconnected from Management-Interface."); + if(managementConnections.contains(sock)) + { + managementConnections.remove(sock); + } +} + +void CRSM::updateNextAutoScens() +{ + while(nextAutoScens.length() < settings["UserListLength"].toInt()) + { + ScenarioSettings next(""); + if(settings["RandomizeAutoHosting"] == "true") + { + next = autolist.at(qrand() % autolist.length()); + } + else + { + next = autolist.at(current); + if(++current >= autolist.length()) current = 0; + } + if(next.randomLeague) + { + next.league = qrand() % 2; + } + nextAutoScens.append(next); + } +} + +void CRSM::startScen(const ScenarioSettings &scen, QStringList argList) +{ + QString filename; + QFile lastScenFile(LAST_SCEN_FILE_NAME); + QFile curScenFile(CUR_SCEN_FILE_NAME); + curScenFile.open(QFile::ReadOnly); + lastScenFile.open(QFile::WriteOnly); + lastScenFile.write(curScenFile.readAll()); + lastScenFile.close(); + curScenFile.close(); + curScenFile.open(QFile::WriteOnly); + curScenFile.write(scen.name.toUtf8()); + curScenFile.close(); + QFile scoreboardFile(SCOREBOARD_FILE_NAME); + scoreboardFile.open(QFile::WriteOnly); + scoreboardFile.close(); + + session["scenname"] = scen.name; + session["IrcUseIngameChat"] = settings["IrcUseIngameChat"]; + if(settings["IrcUseIngameChat"] == "true" && !settings["IrcIngameChannel"].isEmpty()) + { + connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Aktuelles Szenario: " + session["scenname"] + " | Ingamechat ist " + (session["IrcUseIngameChat"] == "true" ? "" : "de") + "aktviert.")); + } + filename = scen.name; + while(maps["Alias"].contains(filename)) + filename = maps["Alias"].value(filename); + //processManager->setWorkingDirectory(QDir::currentPath()); + if(scen.league) + { + argList << "/league"; + session["league"] = "true"; + } + else + { + argList << "/noleague"; + } + argList << filename; + processManager->setWorkingDirectory(settings["ClonkDirectory"]); + processManager->start(settings["ServerExecutable"], argList); +} + +void CRSM::readConfig() +{ + lists.clear(); + settings.clear(); + settings["IrcReconnectDelay"] = "10"; + settings["EmptyTimer"] = "60"; + settings["MaxUserWishes"] = "2"; + settings["MaxScenWishes"] = "2"; + settings["AntiFloodCount"] = "5"; + settings["AntiFloodTime"] = "3"; + settings["RegainAdminTime"] = "120"; + settings["ServerExecutable"] = "clonk-server"; + settings["Arguments"] = "/fullscreen /lobby:300 /nosignup Objects.c4d"; + settings["ClonkConfig"] = "config"; + settings["UserListLength"] ="5"; + settings["ManagementPort"] = "9372"; + + QFile config(CONFIG_FILE_NAME); + if(!config.exists()) + { + config.open(QIODevice::WriteOnly | QIODevice::Text); + writeConfig(); + } + else if(config.open(QIODevice::ReadOnly | QIODevice::Text)) + { + QRegExp confExp("^([^=]+)=(.*)$"); + QRegExp confPlusExp("^([^=]+)\\+=(.*)$"); + QRegExp confMapExp("^([^\\[]+)\\[([^\\]]+)\\]\\s*=\\s*(.*)$"); + QString line; + for(;;) + { + line = config.readLine().trimmed(); + if(confPlusExp.exactMatch(line)) + { + lists[confPlusExp.cap(1).trimmed()].push_back(confPlusExp.cap(2).trimmed()); + } + else if(confMapExp.exactMatch(line)) + { + maps[confMapExp.cap(1).trimmed()][confMapExp.cap(2).trimmed()] = confMapExp.cap(3).trimmed(); + } + else if(confExp.exactMatch(line)) + { + settings.insert(confExp.cap(1).trimmed(),confExp.cap(2).trimmed()); + } + if(config.atEnd()) + break; + } + } + + out("config:\n"); + foreach(const QString &key, settings.keys()) + { + out(key + " = " + settings.value(key) + "\n"); + } + out("\n"); + foreach(const QString &key, lists.keys()) + { + out(key + ":\n"); + foreach(const QString &val, lists.value(key)) + { + out("\t" + val + "\n"); + } + } + out("\n"); + foreach(const QString &key, maps.keys()) + { + out(key + ":\n"); + foreach(const QString &mapkey, maps.value(key).keys()) + { + out("\t[" + mapkey + "]" + " = " + maps.value(key).value(mapkey) + "\n"); + } + } + out("\n"); + args = settings["Arguments"].split(" "); + args << "/config:"+settings["ClonkConfig"]; + settings["ClonkDirectory"] = QFileInfo(settings["ServerExecutable"]).absoluteDir().absolutePath()+QDir::separator(); + + QFile clonkconfig(settings["ClonkConfig"]); + if(!clonkconfig.exists()) + out("WARNING: Clonk's config file is not existing!"); + else + { + clonkconfig.open(QFile::ReadOnly); + QRegExp nickExp("^\\s*Nick=\"(.*)\"\\s*$"); + QRegExp pcNameExp("^\\s*LocalName=\"(.*)\"\\s*$"); + foreach(const QString &line, QString(clonkconfig.readAll().trimmed()).split("\n")) + { + if(nickExp.exactMatch(line)) + { + settings["ServerNick"] = nickExp.cap(1); + break; + } + else if(pcNameExp.exactMatch(line)) + { + settings["ServerPCName"] = pcNameExp.cap(1); + break; + } + } + out("\n"); + out("ClonkDirectory = " + settings.value("ClonkDirectory") + "\n"); + out("ServerNick = " + settings.value("ServerNick") + "\n"); + } + out("\n"); + bool ok; + ushort mgmtPort = settings["ManagementPort"].toUShort(&ok); + if(!ok || mgmtPort == 0) + { + settings["ManagementPort"] = "9372"; + } +} + + +void CRSM::readScenarios() +{ + QFile scenfile("scenarios.lst"); + if(!scenfile.exists()) + { + out("No scenarios.lst found!"); + scenfile.open(QFile::WriteOnly); + scenfile.write("Worlds.c4f/Goldmine.c4s"); + scenfile.close(); + } + scenfile.open(QFile::ReadOnly); + QStringList scenlist = QString(scenfile.readAll()).trimmed().split("\n",QString::SkipEmptyParts); + out("Scenarios in list:\n"); + autolist.clear(); + nextAutoScens.clear(); + current = 0; + foreach(const QString &args, scenlist) + { + ScenarioSettings scen(args, ClientInfo::autoClient()); + QStringList argList = args.split(' ', QString::KeepEmptyParts); + if(argList.first().trimmed() == "--league") + { + argList.removeFirst(); + scen.league = true; + scen.name = argList.join(' '); + } + else if(argList.first().trimmed() == "--random-league") + { + argList.removeFirst(); + scen.randomLeague = true; + scen.name = argList.join(' '); + } + QString scenName = scen.name; + if(!(scen.name = scenPath(scen.name)).isEmpty()) + { + out(scen.name + "\n"); + autolist.append(scen); + } + else + { + out("WARNING: Scenario " + scenName + " not found!\n"); + } + } + + out("\n"); + + scenfile.close(); + updateNextAutoScens(); +} + +void CRSM::listC4Folders() +{ + out("Listing Contents of C4Folders..."); + QDirIterator it(settings["ClonkDirectory"], QDirIterator::FollowSymlinks); + for(; it.hasNext(); it.next()) + { + if(it.fileName() == ".." || it.fileName() == ".") + continue; + if((it.fileInfo().suffix() == "c4f" || (it.fileInfo().isDir() && !QDir(it.fileInfo().absoluteFilePath()).entryList(QStringList() << "*.c4f" << "*.c4s").isEmpty())) && it.fileName() != "." && it.fileName() != ".." && !lists["IgnoreFolders"].contains(it.fileInfo().baseName())) + { + const QStringList& list = listC4Folder(it.filePath()); + if(!list.isEmpty()) + { + QFile listFile(it.filePath()+".lst"); + listFile.open(QFile::WriteOnly); + foreach(const QString& scen, list) + { + listFile.write(scen.toUtf8() + "\n"); + } + listFile.close(); + } + } + } + out(QString(3, '\b') + ": Finished\n"); +} + +void CRSM::cleanUp() +{ + out("\nCleaning up Clonk Folder...\n"); + QDirIterator it(settings["ClonkDirectory"]+"Network/", QDirIterator::FollowSymlinks | QDirIterator::Subdirectories); + for(; it.hasNext(); it.next()) + if(it.fileInfo().exists()) QFile(it.fileInfo().absoluteFilePath()).remove(); + out("\n"); +} + +QString CRSM::scenPath(QString scenName) +{ + bool isAlias = false; + QString aliasName; + foreach(const QString& alias, maps["Alias"].keys()) + { + if(alias.compare(scenName, Qt::CaseInsensitive) == 0) + { + aliasName = scenName = alias; + break; + } + } + while(maps["Alias"].contains(scenName)) + { + scenName = maps["Alias"].value(scenName); + isAlias = true; + } + QFileInfo fileInfo(settings["ClonkDirectory"] + scenName); + if(fileInfo.suffix() != "c4s") + { + return QString(); + } + bool exists = fileInfo.exists(); + if(exists && isAlias) + { + return aliasName; + } + if(exists) + { + return scenName; + } + else + { + QStringList split = scenName.split('/'); + QString name = scenName.right(scenName.length() - split.first().length() - 1); + if(split.length() >= 2) + { + if(split.first().right(4) == ".c4f") + { + const QStringList& entryList = QDir(settings["ClonkDirectory"]).entryList(QStringList() << "*.c4f"); + QString folderName = split.first(); + foreach(const QString& entry, entryList) + { + if(entry.compare(folderName, Qt::CaseInsensitive) == 0) + { + folderName = entry; + break; + } + } + QFile lstFile(settings["ClonkDirectory"] + folderName + ".lst"); + if(lstFile.exists()) + { + lstFile.open(QFile::ReadOnly); + while(!lstFile.atEnd()) + { + const QString& line = lstFile.readLine().trimmed(); + if(line.compare(name, Qt::CaseInsensitive) == 0) + { + lstFile.close(); + if(isAlias) + { + return aliasName; + } + else + { + return folderName + '/' + line; + } + } + } + } + lstFile.close(); + } + } + } + return QString(); +} + +QString CRSM::listScenarios(QString commandArgs) +{ + QString ret; + if(commandArgs.isEmpty()) + { + ret += "Folgende Szenarien stehen zur Auswahl:\n"; + QDirIterator it(settings["ClonkDirectory"], QDirIterator::FollowSymlinks); + for(; it.hasNext(); it.next()) + { + if(it.fileInfo().suffix() == "c4s" && !it.fileInfo().absoluteFilePath().contains(settings["ClonkDirectory"]+"Network/")) + ret += QString(" "+it.fileInfo().absoluteFilePath().replace(settings["ClonkDirectory"],"")+"\n"); + } + ret += "-----------------------------------------------------------------\nFolgende Ordner stehen zur Auswahl:\n"; + QDirIterator folderIt(settings["ClonkDirectory"], QDirIterator::FollowSymlinks); + for(; folderIt.hasNext(); folderIt.next()) + { + if(folderIt.fileInfo().suffix() == "lst" && !folderIt.fileInfo().absoluteFilePath().contains(settings["ClonkDirectory"]+"Network/") && !lists["IgnoreFolders"].contains(folderIt.fileInfo().baseName())) + ret += QString(" "+folderIt.fileInfo().absoluteFilePath().left(folderIt.fileInfo().absoluteFilePath().length() - 4).replace(settings["ClonkDirectory"],"")+"\n"); + } + } + else if(commandArgs.toLower() == "aliase") + { + ret += "Vorhandene Aliase:\n"; + foreach(const QString &alias, maps["Alias"].keys()) + { + ret += QString(" " + alias + " = " + maps["Alias"].value(alias) + "\n"); + } + } + else + { + QFile file(settings["ClonkDirectory"] + commandArgs + ".lst"); + if(file.exists()) + { + ret += "Der Ordner \"" + commandArgs + QString("\" enthält folgende Szenarien:\n"); + file.open(QFile::ReadOnly); + while(!file.atEnd()) + ret += " " + QString::fromUtf8(file.readLine()).trimmed() + "\n"; + } + else + ret += "Der Ordner \"" + commandArgs + "\" wurde nicht gefunden!\n"; + } + return ret; +} + +QString CRSM::printQueue() +{ + QString ret; + if(userlist.length() == 0 && !autoHost) + { + return "Die Warteschlange ist leer.\n"; + } + ret = "Folgende Szenarien befinden sich in der Warteschlange:\n"; + for(int i = 0; i < settings["UserListLength"].toInt(); ++i) + { + const ScenarioSettings *scen; + if(i < userlist.length()) + { + scen = &userlist.at(i); + } + else if(!autoHost) + { + break; + } + else + { + scen = &nextAutoScens.at(i - userlist.length()); + } + ret += "\t" + QString::number(i + 1) + ". " + scen->name + (scen->league ? " in der Liga" : "") + " (" + scen->wishClient.toString() + ")\n"; + } + return ret; +} + +void CRSM::ircCheckModCmd(const QString &nick, CmdFunctionRef func, QString arg) +{ + ircModFifos[nick].append(qMakePair(func, arg)); + ircCheckUserStatus(ClientInfo::ircClient(nick), ClientInfo::ircClient(nick), &CRSM::ircModCmd); +} + +QString CRSM::skipScen() +{ + if(userlist.length() > 0) + { + QString skipped = userlist.first().name + " (" + userlist.first().wishClient.toString() + ")"; + userlist.removeFirst(); + return skipped; + } + else + return ""; +} + +bool CRSM::skipCurrent() +{ + if(processManager->isRunning()) + { + processManager->closeProgFifos(); + return true; + } + return false; +} + +void CRSM::writeToServer(const QString &message) +{ + if(!processManager->isWritable()) + return; + int i = 0; + QStringList split = message.split('\n', QString::KeepEmptyParts); + foreach(QString line, split) + { + if(!line.isEmpty()) + { + if(i < split.length() - 1) + line += "\n"; + while(line.length() > 240) + { + QString linePart = line.left(240); + int pos = linePart.lastIndexOf(QRegExp("\\s")); + bool wordSplit = false; + if(pos <= 0) + { + pos = 240; + wordSplit = true; + } + linePart = line.left(pos); + line = line.right(line.length() - pos); + if(wordSplit) + { + linePart += "-"; + } + linePart += "\n"; + processManager->write(codec->fromUnicode(linePart)); + if(settings["ServerUsesReadline"] == "true") + { + if(writtenToServer.length() > settings["ReadlineRereadLimit"].toInt()) + writtenToServer.clear(); + writtenToServer += codec->fromUnicode(linePart); + } + } + processManager->write(codec->fromUnicode(line)); + if(settings["ServerUsesReadline"] == "true") + { + if(writtenToServer.length() > settings["ReadlineRereadLimit"].toInt()) + writtenToServer.clear(); + writtenToServer += codec->fromUnicode(line); + } + } + ++i; + } +} + +void CRSM::writeConfig() +{ + QFile config(CONFIG_FILE_NAME); + config.open(QFile::WriteOnly); + + QTextStream configStream(&config); + + foreach(const QString &key, settings.keys()) + { + configStream << key << " = " << settings.value(key) << endl; + } + configStream << endl; + foreach(const QString &key, lists.keys()) + { + foreach(const QString &val, lists.value(key)) + { + configStream << key << " += " << val << endl; + } + } + configStream << endl; + foreach(const QString &key, maps.keys()) + { + foreach(const QString &mapkey, maps.value(key).keys()) + { + configStream << key << "[" << mapkey << "]" << " = " << maps.value(key).value(mapkey) << endl; + } + } + configStream << endl; + + config.close(); +} + +QString CRSM::addAliasWish(const QString ¶m) +{ + QRegExp aliasExp("^([^=]+)=(.*)$"); + if(aliasExp.exactMatch(param)) + { + const QString &alias = aliasExp.cap(1).trimmed(); + const QString &scen = aliasExp.cap(2).trimmed(); + QString scenP = scen; + if(maps["Alias"].contains(alias)) + { + return "Alias ist bereits vergeben!"; + } + else if(maps["AliasWishes"].contains(alias)) + { + return "Alias ist bereits als Wunsch vergeben!"; + } + else if(!(scenP = scenPath(scen)).isEmpty()) + { + maps["AliasWishes"].insert(alias, scenP); + informModsAboutAliasWish(); + return "Aliaswunsch ist hinterlegt!"; + } + else + { + return "Szenario \"" + scen + "\" wurde nicht gefunden!"; + } + } + else + { + return "Eingabefehler! Siehe !help für mehr Informationen."; + } +} + +void CRSM::informModsAboutAliasWish() +{ + foreach(const QString& mod, ircMods) + { + connection->sendCommand(IrcCommand::createNotice(mod, "Ein neuer Aliaswunsch ist verfügbar. Insgesamt verfügbar: " + QString::number(maps["AliasWishes"].size()))); + } +} + +void CRSM::editAliasWishes() +{ + if(maps["AliasWishes"].isEmpty()) + { + connection->sendCommand(IrcCommand::createMessage(aliasWishEditor, "Keine Aliaswünsche " + (currentAliasWish == "" ? QString("") : QString("mehr ")) + "vorhanden.")); + stopAliasWishEditing(); + } + else + { + currentAliasWish = maps["AliasWishes"].firstKey(); + connection->sendCommand(IrcCommand::createMessage(aliasWishEditor, currentAliasWish + " = " + maps["AliasWishes"][currentAliasWish] + " [Ja|Nein|Stop]")); + } +} + +void CRSM::editAliasWishes(const QString &message) +{ + if(message.toLower() == "j" || message.toLower() == "ja") + { + maps["Alias"][currentAliasWish] = maps["AliasWishes"][currentAliasWish]; + maps["AliasWishes"].remove(currentAliasWish); + } + else if(message.toLower() == "n" || message.toLower() == "nein") + { + maps["AliasWishes"].remove(currentAliasWish); + } + else if(message.toLower() == "s" || message.toLower() == "stop") + { + connection->sendCommand(IrcCommand::createMessage(aliasWishEditor, "Aliaswunsch-Bearbeitung gestoppt.")); + stopAliasWishEditing(); + return; + } + else + { + connection->sendCommand(IrcCommand::createMessage(aliasWishEditor, "\"" + message + "\" ist keine Antwortmöglichkeit. Antwortmöglichkeiten: [Ja|Nein|Stop]")); + } + editAliasWishes(); +} + +void CRSM::stopAliasWishEditing() +{ + aliasWishEditor = ""; + currentAliasWish = ""; +} + +QString CRSM::ircActivateIngameChat(bool activated) +{ + if(settings["IrcUseIngameChat"] == "true" && !settings["IrcIngameChannel"].isEmpty()) + { + session["IrcUseIngameChat"] = activated ? "true" : "false"; + connection->sendCommand(IrcCommand::createTopic(settings["IrcIngameChannel"], "Aktuelles Szenario: " + session["scenname"] + " | Ingamechat ist " + (session["IrcUseIngameChat"] == "true" ? "" : "de") + "aktviert.")); + return "Ingamechat wurde " + (session["IrcUseIngameChat"] == "true" ? QString("") : QString("de")) + "aktviert."; + } + else + return "Ingamechat ist administrativ deaktiviert!"; +} + +QStringList CRSM::listC4Folder(const QString &path) +{ + QStringList ret; + QFileInfo fileInfo(path); + if(fileInfo.isDir()) + { + QDir dir(path); + const QStringList folderList = dir.entryList(QStringList() << "*.c4f", QDir::NoFilter, QDir::Name | QDir::IgnoreCase); + ret.append(dir.entryList(QStringList() << "*.c4s", QDir::NoFilter, QDir::Name | QDir::IgnoreCase)); + foreach(const QString &folder, folderList) + { + const QStringList &folderList = listC4Folder(path + '/' + folder); + foreach (const QString &scen, folderList) { + ret.append(folder + '/' + scen); + } + } + } + else + { + QProcess c4group; + c4group.start(settings["ClonkDirectory"]+C4GROUP_EXECUTABLE, QStringList() << path << "-l", QProcess::ReadOnly); + c4group.waitForFinished(); + c4group.readLine(); + QRegExp finishExp("^\\d+ Entries, \\d+ Bytes$"); + QRegExp scenarioExp("^(.*\\.c4s)\\s+\\d+ Bytes\\s.*$"); + QRegExp folderExp("^(.*\\.c4f)\\s+\\d+ Bytes\\s.*$"); + QString line; + while(!c4group.atEnd()) + { + line = codec->toUnicode(c4group.readLine().trimmed()); + if(line.isEmpty()) + continue; + if(finishExp.exactMatch(line)) + break; + if(scenarioExp.exactMatch(line)) + { + ret.append(scenarioExp.cap(1)); + } + else if(folderExp.exactMatch(line)) + { + const QStringList &folderList = listC4Folder(path + '/' + folderExp.cap(1)); + foreach (const QString &scen, folderList) { + ret.append(folderExp.cap(1) + '/' + scen); + } + } + } + } + return ret; +} + +void CRSM::addCommand(const QString &name, CmdFunction func, int interfaces, UserType userType, const QString &shortDescription, const QString &argList, const QString &longDescription) +{ + cmds.insert(name.trimmed(), CmdFunctionRef(name.trimmed(), func, interfaces, userType, shortDescription, argList, longDescription)); +} + +bool CRSM::cmdExists(const QString &name, ClientInterface interface) +{ + return cmds.contains(name) && cmds.value(name).interfaces & interface; +} + +bool CRSM::cmd(const QString &name, const QString &args, const ClientInfo &client) +{ + if(cmdExists(name, client.interface)) + { + const CmdFunctionRef& cmdRef = cmds.value(name); + switch(client.interface) + { + case Clonk: + if(clientUserType(client) >= cmdRef.userType) + { + (this->*cmdRef.func)(name, args, client, clientUserType(client)); + } + else + { + rightsFailMessage(client, cmdRef.userType); + } + break; + case IRC: + if(cmdRef.userType == User || ((cmdRef.userType == Admin && (clientUserType(client) >= Admin)) || (cmdRef.userType == Moderator && clientUserType(client) >= Moderator))) + { + (this->*cmdRef.func)(name, args, client, clientUserType(client)); + } + else if(cmdRef.userType >= Admin) + { + ircCheckModCmd(client.nick, cmdRef, args); + } + break; + case Management: + (this->*cmdRef.func)(name, args, client, UserType::Max); + break; + case Auto: //just to avoid the compiler warning, there can't be a command from this interface + break; + } + + return true; + } + else + { + return false; + } +} + +void CRSM::rightsFailMessage(const ClientInfo &info, UserType minUserType) +{ + respond(info, "Nur ein " + userTypeStrings.value(minUserType) + " kann diesen Befehl verwenden.\n", RespondType::PrivateNotice); +} + +UserType CRSM::clientUserType(const ClientInfo &client) +{ + switch(client.interface) + { + case Clonk: + if(lists["Moderators"].contains(QString::number(client.CUID))) + return Moderator; + if(sessionAdmin == client) + return Admin; + break; + case IRC: + if(ircMods.contains(client.nick)) + return Moderator; + else if(ircAdmin == client) + return Admin; + break; + case Management: + return Max; + case Auto: //just to avoid the compiler warning + break; + } + + return User; +} + +void CRSM::setupCmds() +{ + addCommand("admin", &CRSM::admin, Clonk | IRC, User, "Ohne Name trägt es den Autor der Nachricht als Rundenadmin ein, bzw. mit Name den Spieler mit entsprechendem Namen, insofern nicht bereits ein Rundenadmin feststeht.", "[Chatnick¦PC-Name]"); + addCommand("ingameadmin", &CRSM::ingameadmin, IRC | Management, Admin, "Legt den Ingame-Rundenadmin fest.", ""); + if(settings["UseIrc"] == "true") + { + addCommand("ircadmin", &CRSM::ircadmin, Clonk | Management, Admin, "Legt den IRC-Rundenadmin fest.", "", "Legt den IRC-Rundenadmin fest. Der IRC-Admin kann über den IRC dieselben Aktionen durchführen wie der Ingame-Rundenadmin."); + } + addCommand("noadmin", &CRSM::noadmin, Clonk | IRC | Management, Admin, "Entzieht dem (IRC-)Rundenadmin seine Rechte, damit jemand anders Rundenadmin sein kann."); + addCommand("aliaswish", &CRSM::aliaswish, Clonk | IRC, User, "Deponiert den Wunsch, als Alias für einzutragen. Ein Moderator entscheidet darüber.", " = "); + if(settings["IrcUseIngameChat"] == "true") + { + addCommand("ircchat", &CRSM::ircchat, Clonk | Management, Admin, "Schaltet den Irc-Ingame-Chat ein bzw. aus.", ""); + addCommand("ingamechat", &CRSM::ircchat, IRC | Management, Admin, "Schaltet den Irc-Ingame-Chat ein bzw. aus.", ""); + } + addCommand("queue", &CRSM::queue, Clonk | IRC | Management, User, "Zeigt die nächsten " + settings["UserListLength"] + " Szenarien auf der Warteliste."); + addCommand("host", &CRSM::host, Clonk | IRC | Management, User, "Nimmt das angegebene Szenario in die Warteschlange auf. Optional in der Liga, wenn \"--league\" angegeben wird.", "[--league] "); + addCommand("list", &CRSM::list, Clonk | IRC | Management, User, "Listet alle definierten Aliase oder alle möglichen Szenarien und Ordner auf, bzw. alle Szenarien im Ordner oder Rundenordner.", "[Aliase¦Rundenordner[.c4f]]"); + addCommand("clientlist", &CRSM::clientlist, IRC | Management, User, "Listet alle verbundenen Clients mit PC-Name und Chatnick auf."); + addCommand("help", &CRSM::help, Clonk | IRC | Management, User, "Zeigt die Hilfe an.", "[long¦Befehlsname]", "Listet alle verfügbaren Befehle auf. Mit long werden alle verfügbaren Befehle mit Kurzbeschreibung aufgelistet."); + addCommand("stop", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Stoppt einen laufenden Countdown."); + addCommand("start", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Startet den Countdown.", "[Countdownzeit in s]"); + addCommand("teamdist", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Ändert die Teamverteilung.", ""); + addCommand("plrteam", &CRSM::passToClonk, Clonk | IRC, Admin, "Ändert das Team eines Spielers.", " ", "Verschiebt in das ."); + addCommand("pause", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Pausiert das Spiel."); + addCommand("unpause", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Setzt das pausierte Spiel fort."); + addCommand("observer", &CRSM::pcNamePassToClonk, Clonk | IRC | Management, Admin, "Der angegebene Host muss zuschauen.", ""); + addCommand("deactivate", &CRSM::pcNamePassToClonk, Clonk | IRC | Management, Admin, "Deaktiviert den angegebenen Host.", ""); + addCommand("activate", &CRSM::pcNamePassToClonk, Clonk | IRC | Management, Admin, "Aktiviert den angegebenen Host.", ""); + addCommand("kick", &CRSM::pcNamePassToClonk, Clonk | IRC | Management, Admin, "Kickt den angegebenen Host.", ""); + addCommand("script", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Führt das angegebene Script aus.", " + +$treeview +$search +$mathjax + +$extrastylesheet + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +
+
$projectname +  $projectnumber +
+
$projectbrief
+
+
$projectbrief
+
$searchbox
+
+ + diff --git a/src/libcommuni/doc/mainpage.dox b/src/libcommuni/doc/mainpage.dox new file mode 100644 index 0000000..622fb23 --- /dev/null +++ b/src/libcommuni/doc/mainpage.dox @@ -0,0 +1,54 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/*! + \mainpage Communi - a cross-platform IRC framework written with %Qt + + \section introduction Introduction + + Communi is a cross-platform IRC + framework written with Qt. Communi provides a set of tools + for enabling IRC connectivity in Qt-based C++ and QML applications. + + IRC (Internet Relay Chat protocol) is a simple text-based communication protocol. IRC was created + back in 1988 and is still popular particularly amongst open source projects. The Communi project's + own IRC channel \c \#communi is located on Freenode. + + \section getting-started Getting started + + Communi is divided in three modules. + The following classes from the \ref core module are the most essential classes to get started. + + \li IrcConnection manages a connection to an IRC server. + \li IrcNetwork provides information about the connected IRC network. + \li IrcMessage represents a message received from the IRC server. + \li IrcCommand represents a command sent to the IRC server. + + Refer to the \ref usage document, and the list of + examples for further details and help. + */ diff --git a/src/libcommuni/doc/minimal.dox b/src/libcommuni/doc/minimal.dox new file mode 100644 index 0000000..810f404 --- /dev/null +++ b/src/libcommuni/doc/minimal.dox @@ -0,0 +1,46 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/*! + \page minimal Minimal example + + The example illustrates the minimum amount of code required for: + \li Setting up and opening a connection, + \li joining a channel, + \li sending a channel message, + \li and quiting. + + \snippet minimal/main.cpp minimal + + Files: + \li \ref examples/minimal/main.cpp + + \file examples/minimal/main.cpp + \brief \ref minimal + \include examples/minimal/main.cpp + */ diff --git a/src/libcommuni/doc/modules.dox b/src/libcommuni/doc/modules.dox new file mode 100644 index 0000000..ee72180 --- /dev/null +++ b/src/libcommuni/doc/modules.dox @@ -0,0 +1,85 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/*! + \file irccore.h + \brief \#include <\ref core "IrcCore"> + */ + +/*! + \file ircmodel.h + \brief \#include <\ref models "IrcModel"> + */ + +/*! + \file ircutil.h + \brief \#include <\ref util "IrcUtil"> + */ + +/*! + \defgroup core IrcCore + \brief Core classes to manage IRC connections, receive messages and send commands. + + In order to enable the module, add the following lines to your qmake project (.pro) file: + \code + CONFIG += communi + COMMUNI += core + \endcode + + This sets up the necessary include paths and linker rules in order to use the module. + */ + +/*! + \defgroup models IrcModel + \brief Model classes to keep track of queries, channels and users. + + In order to enable the module, add the following lines to your qmake project (.pro) file: + \code + CONFIG += communi + COMMUNI += core model + \endcode + + This sets up the necessary include paths and linker rules in order to use the module. + + \note IrcModel depends on \ref core "IrcCore" + */ + +/*! + \defgroup util IrcUtil + \brief Miscellaneous utility classes for common IRC client related needs. + + In order to enable the module, add the following lines to your qmake project (.pro) file: + \code + CONFIG += communi + COMMUNI += core model util + \endcode + + This sets up the necessary include paths and linker rules in order to use the module. + + \note IrcUtil depends on \ref core "IrcCore" and \ref models "IrcModel" + */ diff --git a/src/libcommuni/doc/qml.dox b/src/libcommuni/doc/qml.dox new file mode 100644 index 0000000..da46191 --- /dev/null +++ b/src/libcommuni/doc/qml.dox @@ -0,0 +1,160 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/*! + \page qml QML compatibility + + Communi strives for full QML support. The property-based APIs have been + designed QML compatibility in mind. Almost all the types can be registered + to QML and used as is. + + A ready-made QML plugin is also provided for convenience. The plugin does + QML type registration and is made available via the following import: + + \code + import Communi 3.0 + \endcode + + \section qml-type-registration Type registration + + The following snippet illustrates how the Communi QML plugin does the type + registration. The same can be done manually in application code to avoid + the need of deploying the Communi QML plugin. + + \snippet src/imports/qml2/plugin.cpp qml-register-types + + \section qml-connecting-to-irc Connecting to IRC + + In order to connect to IRC in QML, declare an IrcConnection instance, + set the desired properties, and call \ref IrcConnection::open() + "connection.open()". + + \code + IrcConnection { + id: freenode + host: "irc.freenode.net" + userName: "communi" + nickName: "Communi" + Math.round(Math.random() * 9999) + realName: "Communi QML example" + } + \endcode + + \section qml-sending-commands Sending commands + + Even though the IrcCommand::createXxx() methods are static, QML does not + provide a way to call them without an IrcCommand instance. Thus, in order + to create and send commands, declare an instance of IrcCommand, call any + createXxx() method to create a command, and finally send it via + IrcCommand::sendCommand(). + + \code + IrcCommand { id: command } + + IrcConnection { + onConnected: { + var cmd = command.createJoin(channel) + sendCommand(cmd) + } + } + \endcode + + \section qml-channels-and-queries Channels and queries + + In order to keep track of channels and queries, declare an instance of + IrcBufferModel. Notice that it can be used directly as a data model for + QML types such as ListView and Repeater. + + \code + IrcBufferModel { + id: bufferModel + connection: freenode + } + \endcode + + IrcBufferModel creates channel and query buffers automatically when + the client joins channels and receives private messages, respectively. + + A typical IRC client has a special server buffer for messages that + are not targeted to any specific channel or query. This can be easily + achieved by declaring an instance of IrcBuffer and forwarding the + messages ignored by IrcBufferModel to it. + + \code + IrcBuffer { + id: serverBuffer + name: freenode.displayName + Component.onCompleted: bufferModel.add(serverBuffer) + } + + IrcBufferModel { + id: bufferModel + connection: freenode + onMessageIgnored: serverBuffer.receiveMessage(message) + } + \endcode + + \section qml-channel-users Channel users + + In order to keep track of channel users, create an instance of IrcUserModel. + It can be also used directly as a data model for QML types such as ListView + and Repeater. + + \code + IrcUserModel { + id: userModel + channel: currentBuffer.toChannel() + } + \endcode + + \section qml-parsing-user-commands Parsing user commands + + IrcCommandParser helps with parsing commands from user input. In order to + take it in use, declare an instance of IrcCommandParser and introduce the + desired commands. + + Notice that commands are often context sensitive. While some command may + accept an optional parameter that is filled up with the current target + (channel/query) name when absent, another command may always inject the + current target name as a certain parameter. Therefore IrcCommandParser + must be kept up-to-date with the current target and the list of channels. + + \code + IrcCommandParser { + id: parser + triggers: ["/"] + target: currentBuffer.title + channels: bufferModel.channels + Component.onCompleted: { + parser.addCommand(IrcCommand.Join, "JOIN <#channel> ()"); + parser.addCommand(IrcCommand.Part, "PART (<#channel>) ()"); + parser.addCommand(IrcCommand.Kick, "KICK (<#channel>) ()"); + parser.addCommand(IrcCommand.CtcpAction, "ME [target] "); + } + } + \endcode + */ diff --git a/src/libcommuni/doc/qmlbot.dox b/src/libcommuni/doc/qmlbot.dox new file mode 100644 index 0000000..13d76ec --- /dev/null +++ b/src/libcommuni/doc/qmlbot.dox @@ -0,0 +1,71 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/*! + \page qmlbot QML bot example + + The QML bot example is a simplified version of the \ref bot "bot example", + written in QML. See the \ref qml article for more QML specific details. + + \image html qmlbot.png "The QML bot example in action" + + The following snippet illustrates how IrcConnection is prepared and opened, + and how a command is queued to automatically join a channel when connected. + + \snippet qmlbot/qml/main.qml connection + + The example utilizes IrcCommandParser for parsing commands from messages + received from other clients. In order to take the parser in use, the supported + commands must be teached, as illustrated below. Some of the commands are context + sensitive, and the parser must be therefore kept aware of the list of channels + the bot is on. This is easily achieved by binding the IrcCommandParser::channels + property to the value of the IrcBufferModel::channels property. Furthermore, like + a typical IRC bot, the commands are triggered using a slightly different syntax in + queries and channels. + + \snippet qmlbot/qml/main.qml parser + + The bot listens to incoming messages via \ref IrcConnection::messageReceived(). + The current target is chosen based on whether the incoming message is a channel + or a private message. Each message content is parsed for commands that were + taught earlier. + + \snippet qmlbot/qml/main.qml receive + + Files: + \li \ref examples/qmlbot/main.cpp + \li \ref examples/qmlbot/qml/main.qml + + \file examples/qmlbot/main.cpp + \brief \ref qmlbot + \include examples/qmlbot/main.cpp + + \file examples/qmlbot/qml/main.qml + \brief \ref qmlbot + \include examples/qmlbot/qml/main.qml + */ diff --git a/src/libcommuni/doc/qmlbot.png b/src/libcommuni/doc/qmlbot.png new file mode 100644 index 0000000..6d6c87f Binary files /dev/null and b/src/libcommuni/doc/qmlbot.png differ diff --git a/src/libcommuni/doc/quick.dox b/src/libcommuni/doc/quick.dox new file mode 100644 index 0000000..347854e --- /dev/null +++ b/src/libcommuni/doc/quick.dox @@ -0,0 +1,91 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/*! + \page quick Qt Quick example + + The example illustrates how to create a simple GUI client using %Qt Quick. + + \image html quick.png "The Qt Quick example in action" + + If you're curious what the example does behind the scenes, try setting an + environment variable \c IRC_DEBUG=1 in order to enable verbose debug output + as explained in \ref debugging. + + Files: + \li \ref examples/quick/main.cpp + \li \ref examples/quick/qml/main.qml + \li \ref examples/quick/qml/BufferListView.qml + \li \ref examples/quick/qml/ChatPage.qml + \li \ref examples/quick/qml/ConnectPage.qml + \li \ref examples/quick/qml/MessageFormatter.qml + \li \ref examples/quick/qml/TextBrowser.qml + \li \ref examples/quick/qml/TextEntry.qml + \li \ref examples/quick/qml/TopicLabel.qml + \li \ref examples/quick/qml/UserListView.qml + + \file examples/quick/main.cpp + \brief \ref quick + \include examples/quick/main.cpp + + \file examples/quick/qml/main.qml + \brief \ref quick + \include examples/quick/qml/main.qml + + \file examples/quick/qml/BufferListView.qml + \brief \ref quick + \include examples/quick/qml/BufferListView.qml + + \file examples/quick/qml/ChatPage.qml + \brief \ref quick + \include examples/quick/qml/ChatPage.qml + + \file examples/quick/qml/ConnectPage.qml + \brief \ref quick + \include examples/quick/qml/ConnectPage.qml + + \file examples/quick/qml/MessageFormatter.qml + \brief \ref quick + \include examples/quick/qml/MessageFormatter.qml + + \file examples/quick/qml/TextBrowser.qml + \brief \ref quick + \include examples/quick/qml/TextBrowser.qml + + \file examples/quick/qml/TextEntry.qml + \brief \ref quick + \include examples/quick/qml/TextEntry.qml + + \file examples/quick/qml/TopicLabel.qml + \brief \ref quick + \include examples/quick/qml/TopicLabel.qml + + \file examples/quick/qml/UserListView.qml + \brief \ref quick + \include examples/quick/qml/UserListView.qml + */ diff --git a/src/libcommuni/doc/quick.png b/src/libcommuni/doc/quick.png new file mode 100644 index 0000000..c3d3cc7 Binary files /dev/null and b/src/libcommuni/doc/quick.png differ diff --git a/src/libcommuni/doc/usage.dox b/src/libcommuni/doc/usage.dox new file mode 100644 index 0000000..669bf94 --- /dev/null +++ b/src/libcommuni/doc/usage.dox @@ -0,0 +1,81 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/*! + \page usage Using Communi + + \section using-as-a-library Using as a library + + In order to use Communi as a library, build and install Communi using the standard mantra: + \code + $ qmake + $ make + $ sudo make install + \endcode + + This integrates Communi with qmake from the corresponding %Qt installation. To take Communi + in use in your application, add the following lines to your qmake project (.pro) file: + \code + CONFIG += communi + COMMUNI += core model util + \endcode + + This sets up the necessary include paths and linker rules in order to use the library. + Notice that the needed Communi modules can be controlled via + the \c COMMUNI qmake variable. The above example enables all available + modules. + + \section buiding-into-application Building into application + + In order to embed the whole Communi to an application, add the following line to your + qmake project (.pro) file: + \code + include(path/to/libcommuni/src/src.pri) + \endcode + + Alternatively, only specific module(s) can be included, for example: + \code + include(path/to/libcommuni/src/core/core.pri) + include(path/to/libcommuni/src/util/util.pri) + \endcode + + This sets up the necessary include paths, and builds Communi sources into the application + for convenient deployment on systems that do not have Communi installed. This option is + also convenient when adding Communi as a Git submodule to your project tree. + + \section namespace-support Namespace support + + The Communi source code can be compiled into a namespace to for example + avoid symbol conflicts. In order to embed a namespaced Communi to an + application, add the following lines to your qmake project (.pro) file: + + \code + DEFINES += IRC_NAMESPACE=Communi + include(path/to/libcommuni/src/src.pri) + \endcode + */ diff --git a/src/libcommuni/examples/bot/bot.pro b/src/libcommuni/examples/bot/bot.pro new file mode 100644 index 0000000..1f4f434 --- /dev/null +++ b/src/libcommuni/examples/bot/bot.pro @@ -0,0 +1,17 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = app +TARGET = bot +DEPENDPATH += . +INCLUDEPATH += . +CONFIG += console +CONFIG -= app_bundle +QT = core network + +# Input +HEADERS += ircbot.h +SOURCES += ircbot.cpp main.cpp + +include(../examples.pri) diff --git a/src/libcommuni/examples/bot/ircbot.cpp b/src/libcommuni/examples/bot/ircbot.cpp new file mode 100644 index 0000000..1891e62 --- /dev/null +++ b/src/libcommuni/examples/bot/ircbot.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircbot.h" +#include +#include +#include +#include + +IrcBot::IrcBot(QObject* parent) : IrcConnection(parent) +{ +//! [messages] + connect(this, SIGNAL(privateMessageReceived(IrcPrivateMessage*)), this, SLOT(processMessage(IrcPrivateMessage*))); +//! [messages] + +//! [commands] + parser.addCommand(IrcCommand::CtcpAction, "ACT [target] "); + parser.addCommand(IrcCommand::Custom, "HELP ()"); + parser.addCommand(IrcCommand::Nick, "NICK "); + parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); + parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); + parser.addCommand(IrcCommand::Quit, "QUIT ()"); + parser.addCommand(IrcCommand::Message, "SAY [target] "); +//! [commands] + + bufferModel.setConnection(this); +//! [channels] + connect(&bufferModel, SIGNAL(channelsChanged(QStringList)), &parser, SLOT(setChannels(QStringList))); +//! [channels] +} + +void IrcBot::join(QString channel) +{ + sendCommand(IrcCommand::createJoin(channel)); +} + +//![receive] +void IrcBot::processMessage(IrcPrivateMessage* message) +{ + if (message->isPrivate()) { + // private message: reply to the message sender + // => triggers: "! " and " " + parser.setTarget(message->nick()); + parser.setTriggers(QStringList() << "!" << ""); + } else { + // channel message: reply to the target channel + // => triggers: "! " and "bot: " + parser.setTarget(message->target()); + parser.setTriggers(QStringList() << "!" << nickName().append(":")); + } + + IrcCommand* cmd = parser.parse(message->content()); + if (cmd) { + if (cmd->type() == IrcCommand::Custom && cmd->parameters().value(0) == "HELP") { + help(cmd->parameters().mid(1)); + } else { + sendCommand(cmd); + + if (cmd->type() == IrcCommand::Quit) { + connect(this, SIGNAL(disconnected()), qApp, SLOT(quit())); + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + } + } +} +//![receive] + +void IrcBot::help(QStringList commands) +{ + if (commands.isEmpty()) + commands = parser.commands(); + + QString target = parser.target(); + foreach (const QString& command, commands) { + QString syntax = parser.syntax(command); + sendCommand(IrcCommand::createMessage(target, syntax)); + } +} diff --git a/src/libcommuni/examples/bot/ircbot.h b/src/libcommuni/examples/bot/ircbot.h new file mode 100644 index 0000000..1a88a01 --- /dev/null +++ b/src/libcommuni/examples/bot/ircbot.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#ifndef IRCBOT_H +#define IRCBOT_H + +#include +#include +#include + +class IrcBot : public IrcConnection +{ + Q_OBJECT + +public: + IrcBot(QObject* parent = 0); + +public slots: + void join(QString channel); + +private slots: + void processMessage(IrcPrivateMessage* message); + +private: + void help(QStringList commands); + + IrcCommandParser parser; + IrcBufferModel bufferModel; +}; + +#endif // IRCBOT_H diff --git a/src/libcommuni/examples/bot/main.cpp b/src/libcommuni/examples/bot/main.cpp new file mode 100644 index 0000000..526f776 --- /dev/null +++ b/src/libcommuni/examples/bot/main.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include +#include "ircbot.h" + +int main(int argc, char* argv[]) +{ + QCoreApplication app(argc, argv); + + // enable debug output + qputenv("IRC_DEBUG", "1"); + qsrand(QTime::currentTime().msec()); + + IrcBot bot; + bot.setHost("irc.freenode.net"); + bot.setUserName("communi"); + bot.setNickName("Bot" + QString::number(qrand() % 9999)); + bot.setRealName("Communi " + Irc::version() + " example bot"); + + bool joined = false; + QStringList args = app.arguments(); + for (int i = 0; i < args.count(); ++i) { + QString arg = args.at(i); + if (arg == "-help") { + qDebug() << "Usage:" << argv[0] << "(-host ) (-port ) (-ssl) (-nick ) (-user ) (-password ) (-channel )"; + return 0; + } else if (arg == "-port") { + bool ok = false; + int port = args.value(++i).toInt(&ok); + if (ok) + bot.setPort(port); + } else if (arg == "-ssl") { + bot.setSecure(true); + } else if (arg == "-host") { + bot.setHost(args.value(++i)); + } else if (arg == "-user") { + bot.setUserName(args.value(++i)); + } else if (arg == "-password") { + bot.setPassword(args.value(++i)); + } else if (arg == "-nick") { + bot.setNickName(args.value(++i)); + } else if (arg == "-channel") { + bot.join(args.value(++i)); + joined = true; + } + } + if (!joined) + bot.join("#communi"); + + bot.open(); + return app.exec(); +} diff --git a/src/libcommuni/examples/client/client.pro b/src/libcommuni/examples/client/client.pro new file mode 100644 index 0000000..5e91b12 --- /dev/null +++ b/src/libcommuni/examples/client/client.pro @@ -0,0 +1,16 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = app +TARGET = client +DEPENDPATH += . +INCLUDEPATH += . +QT = core network gui +greaterThan(QT_MAJOR_VERSION, 4):QT += widgets + +# Input +HEADERS += ircclient.h ircmessageformatter.h +SOURCES += ircclient.cpp ircmessageformatter.cpp main.cpp + +include(../examples.pri) diff --git a/src/libcommuni/examples/client/ircclient.cpp b/src/libcommuni/examples/client/ircclient.cpp new file mode 100644 index 0000000..c33043b --- /dev/null +++ b/src/libcommuni/examples/client/ircclient.cpp @@ -0,0 +1,321 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircclient.h" +#include "ircmessageformatter.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const char* CHANNEL = "#communi"; +static const char* SERVER = "irc.freenode.net"; + +IrcClient::IrcClient(QWidget* parent) : QSplitter(parent) +{ + createParser(); + createConnection(); + createCompleter(); + createUserList(); + createLayout(); + createBufferList(); + + // queue a command to automatically join the channel when connected + connection->sendCommand(IrcCommand::createJoin(CHANNEL)); + connection->open(); + + textEdit->append(IrcMessageFormatter::formatMessage(tr("! Welcome to the Communi %1 example client.").arg(IRC_VERSION_STR))); + textEdit->append(IrcMessageFormatter::formatMessage(tr("! This example connects %1 and joins %2.").arg(SERVER, CHANNEL))); + textEdit->append(IrcMessageFormatter::formatMessage(tr("! PS. Available commands: JOIN, ME, NICK, PART"))); +} + +IrcClient::~IrcClient() +{ + if (connection->isActive()) { + connection->quit(connection->realName()); + connection->close(); + } +} + +void IrcClient::onConnected() +{ + textEdit->append(IrcMessageFormatter::formatMessage("! Connected to %1.").arg(SERVER)); + textEdit->append(IrcMessageFormatter::formatMessage("! Joining %1...").arg(CHANNEL)); +} + +void IrcClient::onConnecting() +{ + textEdit->append(IrcMessageFormatter::formatMessage("! Connecting %1...").arg(SERVER)); +} + +void IrcClient::onDisconnected() +{ + textEdit->append(IrcMessageFormatter::formatMessage("! Disconnected from %1.").arg(SERVER)); +} + +void IrcClient::onTextEdited() +{ + // clear the possible error indication + lineEdit->setStyleSheet(QString()); +} + +void IrcClient::onTextEntered() +{ + QString input = lineEdit->text(); + IrcCommand* command = parser->parse(input); + if (command) { + connection->sendCommand(command); + + // echo own messages (servers do not send our own messages back) + if (command->type() == IrcCommand::Message || command->type() == IrcCommand::CtcpAction) { + IrcMessage* msg = command->toMessage(connection->nickName(), connection); + receiveMessage(msg); + delete msg; + } + + lineEdit->clear(); + } else if (input.length() > 1) { + QString error; + QString command = lineEdit->text().mid(1).split(" ", QString::SkipEmptyParts).value(0).toUpper(); + if (parser->commands().contains(command)) + error = tr("[ERROR] Syntax: %1").arg(parser->syntax(command).replace("<", "<").replace(">", ">")); + else + error = tr("[ERROR] Unknown command: %1").arg(command); + textEdit->append(IrcMessageFormatter::formatMessage(error)); + lineEdit->setStyleSheet("background: salmon"); + } +} + +void IrcClient::onCompletion() +{ + completer->complete(lineEdit->text(), lineEdit->cursorPosition()); +} + +void IrcClient::onCompleted(const QString& text, int cursor) +{ + lineEdit->setText(text); + lineEdit->setCursorPosition(cursor); +} + +void IrcClient::onBufferAdded(IrcBuffer* buffer) +{ + // joined a buffer - start listening to buffer specific messages + connect(buffer, SIGNAL(messageReceived(IrcMessage*)), this, SLOT(receiveMessage(IrcMessage*))); + + // create a document for storing the buffer specific messages + QTextDocument* document = new QTextDocument(buffer); + documents.insert(buffer, document); + + // create a sorted model for buffer users + IrcUserModel* userModel = new IrcUserModel(buffer); + userModel->setSortMethod(Irc::SortByTitle); + userModels.insert(buffer, userModel); + + // activate the new buffer + int idx = bufferModel->buffers().indexOf(buffer); + if (idx != -1) + bufferList->setCurrentIndex(bufferModel->index(idx)); +} + +void IrcClient::onBufferRemoved(IrcBuffer* buffer) +{ + // the buffer specific models and documents are no longer needed + delete userModels.take(buffer); + delete documents.take(buffer); +} + +void IrcClient::onBufferActivated(const QModelIndex& index) +{ + IrcBuffer* buffer = index.data(Irc::BufferRole).value(); + + // document, user list and nick completion for the current buffer + textEdit->setDocument(documents.value(buffer)); + textEdit->verticalScrollBar()->triggerAction(QScrollBar::SliderToMaximum); + userList->setModel(userModels.value(buffer)); + completer->setBuffer(buffer); + + // keep the command parser aware of the context + if (buffer) + parser->setTarget(buffer->title()); +} + +void IrcClient::onUserActivated(const QModelIndex& index) +{ + IrcUser* user = index.data(Irc::UserRole).value(); + + if (user) { + IrcBuffer* buffer = bufferModel->add(user->name()); + + // activate the new query + int idx = bufferModel->buffers().indexOf(buffer); + if (idx != -1) + bufferList->setCurrentIndex(bufferModel->index(idx)); + } +} + +static void appendHtml(QTextDocument* document, const QString& html) +{ + QTextCursor cursor(document); + cursor.beginEditBlock(); + cursor.movePosition(QTextCursor::End); + if (!document->isEmpty()) + cursor.insertBlock(); + cursor.insertHtml(html); + cursor.endEditBlock(); +} + +void IrcClient::receiveMessage(IrcMessage* message) +{ + IrcBuffer* buffer = qobject_cast(sender()); + if (!buffer) + buffer = bufferList->currentIndex().data(Irc::BufferRole).value(); + + QTextDocument* document = documents.value(buffer); + if (document) { + QString html = IrcMessageFormatter::formatMessage(message); + if (!html.isEmpty()) { + if (document == textEdit->document()) + textEdit->append(html); + else + appendHtml(document, html); + } + } +} + +void IrcClient::createLayout() +{ + setWindowTitle(tr("Communi %1 example client").arg(IRC_VERSION_STR)); + + // a read-only text editor for showing the messages + textEdit = new QTextEdit(this); + textEdit->setReadOnly(true); + + // a line editor for entering commands + lineEdit = new QLineEdit(this); + lineEdit->setAttribute(Qt::WA_MacShowFocusRect, false); + textEdit->setFocusProxy(lineEdit); + connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(onTextEntered())); + connect(lineEdit, SIGNAL(textEdited(QString)), this, SLOT(onTextEdited())); + + // the rest is just setting up the UI layout... + QSplitter* splitter = new QSplitter(this); + splitter->setHandleWidth(1); + splitter->addWidget(textEdit); + splitter->addWidget(userList); + splitter->setStretchFactor(0, 5); + splitter->setStretchFactor(1, 1); + + QWidget* container = new QWidget(this); + QVBoxLayout* layout = new QVBoxLayout(container); + layout->setSpacing(0); + layout->setMargin(0); + layout->addWidget(splitter); + layout->addWidget(lineEdit); + + addWidget(container); + + setHandleWidth(1); +} + +void IrcClient::createCompleter() +{ + // nick name completion + completer = new IrcCompleter(this); + completer->setParser(parser); + connect(completer, SIGNAL(completed(QString,int)), this, SLOT(onCompleted(QString,int))); + + QShortcut* shortcut = new QShortcut(Qt::Key_Tab, this); + connect(shortcut, SIGNAL(activated()), this, SLOT(onCompletion())); +} + +void IrcClient::createParser() +{ + // create a command parser and teach it some commands. notice also + // that we must keep the command parser aware of the context in + // createUi() and onBufferActivated() + + parser = new IrcCommandParser(this); + parser->setTolerant(true); + parser->setTriggers(QStringList("/")); + parser->addCommand(IrcCommand::Join, "JOIN <#channel> ()"); + parser->addCommand(IrcCommand::CtcpAction, "ME [target] "); + parser->addCommand(IrcCommand::Mode, "MODE () () ()"); + parser->addCommand(IrcCommand::Nick, "NICK "); + parser->addCommand(IrcCommand::Part, "PART (<#channel>) ()"); +} + +void IrcClient::createUserList() +{ + // a list of channel users + userList = new QListView(this); + userList->setFocusPolicy(Qt::NoFocus); + + // open a private query when double clicking a user + connect(userList, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onUserActivated(QModelIndex))); +} + +void IrcClient::createBufferList() +{ + bufferModel = new IrcBufferModel(connection); + connect(bufferModel, SIGNAL(added(IrcBuffer*)), this, SLOT(onBufferAdded(IrcBuffer*))); + connect(bufferModel, SIGNAL(removed(IrcBuffer*)), this, SLOT(onBufferRemoved(IrcBuffer*))); + + bufferList = new QListView(this); + bufferList->setFocusPolicy(Qt::NoFocus); + bufferList->setModel(bufferModel); + + // keep the command parser aware of the context + connect(bufferModel, SIGNAL(channelsChanged(QStringList)), parser, SLOT(setChannels(QStringList))); + + // keep track of the current buffer, see also onBufferActivated() + connect(bufferList->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(onBufferActivated(QModelIndex))); + + // create a server buffer for non-targeted messages... + IrcBuffer* serverBuffer = bufferModel->add(connection->host()); + + // ...and connect it to IrcBufferModel::messageIgnored() + connect(bufferModel, SIGNAL(messageIgnored(IrcMessage*)), serverBuffer, SLOT(receiveMessage(IrcMessage*))); + + insertWidget(0, bufferList); + + setStretchFactor(0, 1); + setStretchFactor(1, 3); +} + +void IrcClient::createConnection() +{ + connection = new IrcConnection(this); + connect(connection, SIGNAL(connected()), this, SLOT(onConnected())); + connect(connection, SIGNAL(connecting()), this, SLOT(onConnecting())); + connect(connection, SIGNAL(disconnected()), this, SLOT(onDisconnected())); + + qsrand(QTime::currentTime().msec()); + + connection->setHost(SERVER); + connection->setUserName("communi"); + connection->setNickName(tr("Client%1").arg(qrand() % 9999)); + connection->setRealName(tr("Communi %1 example client").arg(IRC_VERSION_STR)); +} diff --git a/src/libcommuni/examples/client/ircclient.h b/src/libcommuni/examples/client/ircclient.h new file mode 100644 index 0000000..9d6ee3c --- /dev/null +++ b/src/libcommuni/examples/client/ircclient.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#ifndef IRCCLIENT_H +#define IRCCLIENT_H + +#include +#include + +class IrcBuffer; +class IrcMessage; +class IrcUserModel; +class IrcCompleter; +class IrcConnection; +class IrcBufferModel; +class IrcCommandParser; + +QT_FORWARD_DECLARE_CLASS(QLineEdit) +QT_FORWARD_DECLARE_CLASS(QListView) +QT_FORWARD_DECLARE_CLASS(QTextEdit) +QT_FORWARD_DECLARE_CLASS(QModelIndex) +QT_FORWARD_DECLARE_CLASS(QTextDocument) + +class IrcClient : public QSplitter +{ + Q_OBJECT + +public: + IrcClient(QWidget* parent = 0); + ~IrcClient(); + +private slots: + void onConnected(); + void onConnecting(); + void onDisconnected(); + + void onTextEdited(); + void onTextEntered(); + + void onCompletion(); + void onCompleted(const QString& text, int cursor); + + void onBufferAdded(IrcBuffer* buffer); + void onBufferRemoved(IrcBuffer* buffer); + + void onBufferActivated(const QModelIndex& index); + void onUserActivated(const QModelIndex& index); + + void receiveMessage(IrcMessage* message); + +private: + void createLayout(); + void createCompleter(); + void createParser(); + void createUserList(); + void createBufferList(); + void createConnection(); + + QLineEdit* lineEdit; + QTextEdit* textEdit; + QListView* userList; + QListView* bufferList; + + IrcCompleter* completer; + IrcCommandParser* parser; + IrcConnection* connection; + IrcBufferModel* bufferModel; + QHash userModels; + QHash documents; +}; + +#endif // IRCCLIENT_H diff --git a/src/libcommuni/examples/client/ircmessageformatter.cpp b/src/libcommuni/examples/client/ircmessageformatter.cpp new file mode 100644 index 0000000..6537664 --- /dev/null +++ b/src/libcommuni/examples/client/ircmessageformatter.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircmessageformatter.h" + +#include +#include +#include +#include + +QString IrcMessageFormatter::formatMessage(IrcMessage* message) +{ + QString formatted; + switch (message->type()) { + case IrcMessage::Join: + formatted = formatJoinMessage(static_cast(message)); + break; + case IrcMessage::Mode: + formatted = formatModeMessage(static_cast(message)); + break; + case IrcMessage::Names: + formatted = formatNamesMessage(static_cast(message)); + break; + case IrcMessage::Nick: + formatted = formatNickMessage(static_cast(message)); + break; + case IrcMessage::Part: + formatted = formatPartMessage(static_cast(message)); + break; + case IrcMessage::Private: + formatted = formatPrivateMessage(static_cast(message)); + break; + case IrcMessage::Quit: + formatted = formatQuitMessage(static_cast(message)); + break; + default: + break; + } + return formatMessage(formatted); +} + +QString IrcMessageFormatter::formatMessage(const QString& message) +{ + if (!message.isEmpty()) { + QString formatted = QObject::tr("[%1] %2").arg(QTime::currentTime().toString(), message); + if (message.startsWith("!")) + formatted = QObject::tr("%1").arg(formatted); + else if (message.startsWith("*")) + formatted = QObject::tr("%1").arg(formatted); + else if (message.startsWith("[")) + formatted = QObject::tr("%1").arg(formatted); + return formatted; + } + return QString(); +} + +QString IrcMessageFormatter::formatJoinMessage(IrcJoinMessage* message) +{ + if (message->flags() & IrcMessage::Own) + return QObject::tr("! You have joined %1 as %2").arg(message->channel(), message->nick()); + else + return QObject::tr("! %1 has joined %2").arg(message->nick(), message->channel()); +} + +QString IrcMessageFormatter::formatModeMessage(IrcModeMessage* message) +{ + QString args = message->arguments().join(" "); + if (message->isReply()) + return QObject::tr("! %1 mode is %2 %3").arg(message->target(), message->mode(), args); + else + return QObject::tr("! %1 sets mode %2 %3 %4").arg(message->nick(), message->target(), message->mode(), args); +} + +QString IrcMessageFormatter::formatNamesMessage(IrcNamesMessage* message) +{ + return QObject::tr("! %1 has %2 users").arg(message->channel()).arg(message->names().count()); +} + +QString IrcMessageFormatter::formatNickMessage(IrcNickMessage* message) +{ + return QObject::tr("! %1 has changed nick to %2").arg(message->oldNick(), message->newNick()); +} + +QString IrcMessageFormatter::formatPartMessage(IrcPartMessage* message) +{ + if (message->reason().isEmpty()) + return QObject::tr("! %1 has left %2").arg(message->nick(), message->channel()); + else + return QObject::tr("! %1 has left %2 (%3)").arg(message->nick(), message->channel(), message->reason()); +} + +QString IrcMessageFormatter::formatPrivateMessage(IrcPrivateMessage* message) +{ + const QString content = IrcTextFormat().toHtml(message->content()); + if (message->isAction()) + return QObject::tr("* %1 %2").arg(message->nick(), content); + else + return QObject::tr("<%1> %2").arg(message->nick(),content); +} + +QString IrcMessageFormatter::formatQuitMessage(IrcQuitMessage* message) +{ + if (message->reason().isEmpty()) + return QObject::tr("! %1 has quit").arg(message->nick()); + else + return QObject::tr("! %1 has quit (%2)").arg(message->nick(), message->reason()); +} diff --git a/src/libcommuni/examples/client/ircmessageformatter.h b/src/libcommuni/examples/client/ircmessageformatter.h new file mode 100644 index 0000000..f91be50 --- /dev/null +++ b/src/libcommuni/examples/client/ircmessageformatter.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#ifndef IRCMESSAGEFORMATTER_H +#define IRCMESSAGEFORMATTER_H + +#include + +class IrcMessageFormatter +{ +public: + static QString formatMessage(IrcMessage* message); + static QString formatMessage(const QString& message); + +private: + static QString formatJoinMessage(IrcJoinMessage* message); + static QString formatModeMessage(IrcModeMessage* message); + static QString formatNamesMessage(IrcNamesMessage* message); + static QString formatNickMessage(IrcNickMessage* message); + static QString formatPartMessage(IrcPartMessage* message); + static QString formatPrivateMessage(IrcPrivateMessage* message); + static QString formatQuitMessage(IrcQuitMessage* message); +}; + +#endif // IRCMESSAGEFORMATTER_H diff --git a/src/libcommuni/examples/client/main.cpp b/src/libcommuni/examples/client/main.cpp new file mode 100644 index 0000000..951ee91 --- /dev/null +++ b/src/libcommuni/examples/client/main.cpp @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include +#include "ircclient.h" + +int main(int argc, char* argv[]) +{ + QApplication app(argc, argv); + IrcClient client; + client.resize(800, 480); + client.show(); + return app.exec(); +} diff --git a/src/libcommuni/examples/examples.pri b/src/libcommuni/examples/examples.pri new file mode 100644 index 0000000..bc9b138 --- /dev/null +++ b/src/libcommuni/examples/examples.pri @@ -0,0 +1,24 @@ +###################################################################### +# Communi +###################################################################### + +!verbose:CONFIG += silent + +CONFIG(debug, debug|release) { + OBJECTS_DIR = debug + MOC_DIR = debug + RCC_DIR = debug + UI_DIR = debug +} else { + OBJECTS_DIR = release + MOC_DIR = release + RCC_DIR = release + UI_DIR = release +} + +developer { + include(../src/src.pri) +} else { + IRC_MODULES = IrcCore IrcModel IrcUtil + include(../src/module_deps.pri) +} diff --git a/src/libcommuni/examples/examples.pro b/src/libcommuni/examples/examples.pro new file mode 100644 index 0000000..48d9906 --- /dev/null +++ b/src/libcommuni/examples/examples.pro @@ -0,0 +1,13 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = subdirs +SUBDIRS += bot client minimal + +!lessThan(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 1) { + qtHaveModule(qml):SUBDIRS += qmlbot +} +!lessThan(QT_MAJOR_VERSION, 5):!lessThan(QT_MINOR_VERSION, 2) { + qtHaveModule(quick):SUBDIRS += quick +} diff --git a/src/libcommuni/examples/minimal/main.cpp b/src/libcommuni/examples/minimal/main.cpp new file mode 100644 index 0000000..790280e --- /dev/null +++ b/src/libcommuni/examples/minimal/main.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include +#include +#include +#include + +#ifndef IRC_DOXYGEN +int main(int argc, char* argv[]) +{ + QCoreApplication app(argc, argv); + + // enable debug output + //qputenv("IRC_DEBUG", "1"); + qsrand(QTime::currentTime().msec()); + +//! [minimal] + IrcConnection connection("irc.rbx.fr.euirc.net"); + connection.setUserName("communi"); + connection.setNickName(QString("Minimal%1").arg(qrand() % 9999)); + connection.setRealName(QString("Communi %1 minimal example").arg(Irc::version())); + connection.sendCommand(IrcCommand::createJoin("#clonk-tod")); + connection.sendCommand(IrcCommand::createMessage("#clonk-tod", "Hi, kthxbye!")); + connection.sendCommand(IrcCommand::createQuit()); + connection.open(); +//! [minimal] + + QObject::connect(&connection, SIGNAL(disconnected()), &app, SLOT(quit())); + return app.exec(); +} +#endif diff --git a/src/libcommuni/examples/minimal/minimal.pro b/src/libcommuni/examples/minimal/minimal.pro new file mode 100644 index 0000000..5dd8584 --- /dev/null +++ b/src/libcommuni/examples/minimal/minimal.pro @@ -0,0 +1,16 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = app +TARGET = minimal +DEPENDPATH += . +INCLUDEPATH += . +CONFIG += console +CONFIG -= app_bundle +QT = core network + +# Input +SOURCES += main.cpp + +include(../examples.pri) diff --git a/src/libcommuni/examples/qmlbot/main.cpp b/src/libcommuni/examples/qmlbot/main.cpp new file mode 100644 index 0000000..d74e909 --- /dev/null +++ b/src/libcommuni/examples/qmlbot/main.cpp @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include +#include + +int main(int argc, char* argv[]) +{ + QCoreApplication app(argc, argv); + + // enable debug output + qputenv("IRC_DEBUG", "1"); + + QQmlApplicationEngine engine(QUrl("qrc:/main.qml")); + return app.exec(); +} diff --git a/src/libcommuni/examples/qmlbot/qml/main.qml b/src/libcommuni/examples/qmlbot/qml/main.qml new file mode 100644 index 0000000..2dad458 --- /dev/null +++ b/src/libcommuni/examples/qmlbot/qml/main.qml @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQml 2.0 +import Communi 3.0 + +QtObject { + id: bot + + property string channel: "#communi" + + property Irc irc: Irc { id: irc } + property IrcCommand command: IrcCommand { id: command } + + property IrcBufferModel model: IrcBufferModel { + id: model + +//! [connection] + connection: IrcConnection { + id: connection + + host: "irc.freenode.net" + userName: "communi" + nickName: "QmlBot" + Math.round(Math.random() * 9999) + realName: qsTr("Communi %1 QML bot example").arg(irc.version()) + + Component.onCompleted: { + // queue a command to automatically join a channel when connected + sendCommand(command.createJoin(channel)) + open() + } +//! [connection] + +//! [receive] + onMessageReceived: { + if (message.type === IrcMessage.Private) { + // - in private, reply to the message sender + // - on channel, reply to the target channel + parser.target = message.private ? message.nick : message.target + + var command = parser.parse(message.content) + if (command) { + // send the command to the IRC server + sendCommand(command) + if (command.type === IrcCommand.Quit) { + // close the connection & quit the app when a !quit command was received + close() + Qt.quit() + } + } + } + } +//! [receive] + } + } + +//! [parser] + property IrcCommandParser parser: IrcCommandParser { + id: parser + + // keep the parser aware of the context + channels: model.channels + + // - on channel, respond to: "! " and "bot: " + // - in query, respond to: "! " and " " + triggers: connection.network.isChannel(target) ? ["!", connection.nickName + ":"] : ["!", ""] + + Component.onCompleted: { + // teach the bot some commands + parser.addCommand(IrcCommand.Nick, "NICK "); + parser.addCommand(IrcCommand.Join, "JOIN <#channel> ()"); + parser.addCommand(IrcCommand.Part, "PART (<#channel>) ()"); + parser.addCommand(IrcCommand.Quit, "QUIT ()"); + parser.addCommand(IrcCommand.Message, "SAY [target] "); + } + } +//! [parser] +} diff --git a/src/libcommuni/examples/qmlbot/qmlbot.pro b/src/libcommuni/examples/qmlbot/qmlbot.pro new file mode 100644 index 0000000..95c2961 --- /dev/null +++ b/src/libcommuni/examples/qmlbot/qmlbot.pro @@ -0,0 +1,22 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = app +TARGET = qmlbot +DEPENDPATH += . +INCLUDEPATH += . +CONFIG += console +CONFIG -= app_bundle +QT = core network qml + +lessThan(QT_MAJOR_VERSION, 5)|lessThan(QT_MINOR_VERSION, 1) { + error(The QML2 based example requires Qt 5.1 or newer but Qt $$[QT_VERSION] was detected.) +} + +# Input +SOURCES += main.cpp +RESOURCES += qmlbot.qrc +OTHER_FILES += qml/main.qml + +include(../examples.pri) diff --git a/src/libcommuni/examples/qmlbot/qmlbot.qrc b/src/libcommuni/examples/qmlbot/qmlbot.qrc new file mode 100644 index 0000000..5f94096 --- /dev/null +++ b/src/libcommuni/examples/qmlbot/qmlbot.qrc @@ -0,0 +1,5 @@ + + + qml/main.qml + + diff --git a/src/libcommuni/examples/quick/main.cpp b/src/libcommuni/examples/quick/main.cpp new file mode 100644 index 0000000..c503b98 --- /dev/null +++ b/src/libcommuni/examples/quick/main.cpp @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include +#include + +int main(int argc, char* argv[]) +{ + QGuiApplication app(argc, argv); + app.setOrganizationName("Commmuni"); + app.setApplicationName("QtQuick Example"); + QQmlApplicationEngine engine(QUrl("qrc:/main.qml")); + return app.exec(); +} diff --git a/src/libcommuni/examples/quick/qml/BufferListView.qml b/src/libcommuni/examples/quick/qml/BufferListView.qml new file mode 100644 index 0000000..3d277b6 --- /dev/null +++ b/src/libcommuni/examples/quick/qml/BufferListView.qml @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import Communi 3.0 + +Rectangle { + id: background + + property alias bufferModel: listView.model + property IrcBuffer currentBuffer + + signal closed(IrcBuffer buffer) + + color: "#edf3fe" + + Rectangle { + id: frame + anchors.fill: parent + anchors.topMargin: -1 + color: "transparent" + border.color: "#aaa" + } + + Menu { + id: menu + MenuItem { + text: qsTr("Close") + shortcut: qsTr("Ctrl+W") + enabled: !!currentBuffer + onTriggered: closed(currentBuffer) + } + } + + ScrollView { + id: scrollView + + anchors.fill: parent + anchors.topMargin: -1 + + ListView { + id: listView + + delegate: Rectangle { + property bool first: index === 0 + property bool current: model.buffer === currentBuffer + anchors.left: parent ? parent.left : undefined + anchors.right: parent ? parent.right : undefined + anchors.margins: 1 + height: Math.max(21, label.implicitHeight + 5) + color: first ? "#ddd" : current ? "#b5d5ff" : "transparent" + Rectangle { + visible: first + width: parent.width + height: 1 + anchors.bottom: parent.bottom + anchors.fill: parent + anchors.leftMargin: -1 + anchors.rightMargin: -1 + color: "transparent" + border.color: "#aaa" + } + Label { + id: label + text: model.title + font.bold: first + anchors.margins: 2 + anchors.leftMargin: 6 + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton + onPressed: { + currentBuffer = model.buffer + if (mouse.button === Qt.RightButton) + menu.popup() + } + } + } + } + } +} diff --git a/src/libcommuni/examples/quick/qml/ChatPage.qml b/src/libcommuni/examples/quick/qml/ChatPage.qml new file mode 100644 index 0000000..474b950 --- /dev/null +++ b/src/libcommuni/examples/quick/qml/ChatPage.qml @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 +import Communi 3.0 + +Item { + id: page + + property IrcBuffer serverBuffer + property alias bufferModel: bufferListView.bufferModel + property alias currentBuffer: bufferListView.currentBuffer + property IrcChannel currentChannel: currentBuffer ? currentBuffer.toChannel() : null + + Connections { + target: bufferModel + onAdded: currentBuffer = buffer + onAboutToBeRemoved: { + var idx = bufferModel.indexOf(buffer) + currentBuffer = bufferModel.get(idx + 1) || bufferModel.get(Math.max(0, idx - 1)) + } + } + + SplitView { + anchors.fill: parent + + handleDelegate: Item { } + + BufferListView { + id: bufferListView + width: page.width / 6 + onClosed: { + if (buffer === serverBuffer) { + bufferModel.quit() + } else { + if (buffer.channel) + buffer.part(qsTr("Communi %1 QtQuick example").arg(irc.version())) + bufferModel.remove(buffer) + } + } + } + + Column { + Layout.fillWidth: true + + TopicLabel { + id: topicLabel + width: parent.width + visible: currentChannel + channel: currentChannel + } + + SplitView { + width: parent.width + height: parent.height - (currentChannel ? topicLabel.height : 0) - textEntry.height + + handleDelegate: Item { } + + Item { + id: stack + + width: 1; height: 1 + Layout.fillWidth: true + Layout.fillHeight: true + + Repeater { + anchors.fill: parent + model: bufferModel + delegate: TextBrowser { + anchors.fill: parent + buffer: model.buffer + visible: buffer == currentBuffer + } + } + } + + UserListView { + width: page.width / 6 + visible: currentChannel + channel: currentChannel + onQueried: currentBuffer = currentBuffer.model.add(user.name) + } + } + + TextEntry { + id: textEntry + width: parent.width + buffer: currentBuffer + enabled: currentBuffer + onMessageSent: currentBuffer.receiveMessage(message) + + Connections { + target: page + onCurrentBufferChanged: { + if (page.visible && currentBuffer) + textEntry.forceActiveFocus() + } + } + } + } + } +} diff --git a/src/libcommuni/examples/quick/qml/ConnectPage.qml b/src/libcommuni/examples/quick/qml/ConnectPage.qml new file mode 100644 index 0000000..8a7c296 --- /dev/null +++ b/src/libcommuni/examples/quick/qml/ConnectPage.qml @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.0 +import Qt.labs.settings 1.0 +import Communi 3.0 + +Item { + id: page + + property string host: hostField.text || hostField.placeholderText + property int port: portField.value + property bool secure: secureField.checked + property bool sasl: saslField.checked + property string nickName: nickNameField.text || nickNameField.placeholderText + property string realName: realNameField.text || realNameField.placeholderText + property string userName: userNameField.text || userNameField.placeholderText + property string password: passwordField.text + property string channel: channelField.text || channelField.placeholderText + + Settings { + id: settings + property alias host: hostField.text + property alias port: portField.value + property alias secure: secureField.checked + property alias sasl: saslField.checked + property alias nickName: nickNameField.text + property alias realName: realNameField.text + property alias userName: userNameField.text + property alias password: passwordField.text + property alias channel: channelField.text + } + + signal accepted() + signal rejected() + + implicitWidth: grid.implicitWidth + row.implicitWidth + implicitHeight: grid.implicitHeight + row.implicitHeight + 48 + + GridLayout { + id: grid + + width: page.width * 2 / 3 + anchors.centerIn: parent + anchors.verticalCenterOffset: -row.height + 12 + + columns: 2 + rowSpacing: 12 + columnSpacing: 12 + + Label { text: qsTr("Host:") } + TextField { + id: hostField + focus: true + Layout.fillWidth: true + placeholderText: "irc.freenode.net" + } + + Label { text: qsTr("Port:") } + RowLayout { + SpinBox { + id: portField + value: 6667 + minimumValue: 1024 + maximumValue: 65535 + Layout.fillWidth: true + } + CheckBox { + id: secureField + text: qsTr("SSL") + } + CheckBox { + id: saslField + text: qsTr("SASL") + } + } + + Label { text: qsTr("Nick name:") } + TextField { + id: nickNameField + Layout.fillWidth: true + placeholderText: "Quick" + Math.round(Math.random() * 9999) + } + + Label { text: qsTr("Real name:") } + TextField { + id: realNameField + Layout.fillWidth: true + placeholderText: qsTr("Communi %1 QtQuick example").arg(irc.version()) + } + + Label { text: qsTr("User name:") } + TextField { + id: userNameField + Layout.fillWidth: true + placeholderText: "communi" + } + + Label { text: qsTr("Password:") } + TextField { + id: passwordField + echoMode: TextInput.Password + Layout.fillWidth: true + } + + Label { text: qsTr("Channel:") } + TextField { + id: channelField + Layout.fillWidth: true + placeholderText: "#communi" + } + } + + Keys.onReturnPressed: { + if (okButton.enabled) + page.accepted() + } + + Keys.onEnterPressed: { + if (okButton.enabled) + page.accepted() + } + + Keys.onEscapePressed: { + if (cancelButton.enabled) + page.rejected() + } + + RowLayout { + id: row + + anchors.margins: 12 + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + + Item { Layout.fillWidth: true } + + Button { + id: okButton + text: qsTr("Ok") + enabled: page.visible + onClicked: page.accepted() + } + + Button { + id: cancelButton + text: qsTr("Cancel") + onClicked: page.rejected() + } + } +} diff --git a/src/libcommuni/examples/quick/qml/MessageFormatter.qml b/src/libcommuni/examples/quick/qml/MessageFormatter.qml new file mode 100644 index 0000000..754ca1c --- /dev/null +++ b/src/libcommuni/examples/quick/qml/MessageFormatter.qml @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import Communi 3.0 + +QtObject { + id: root + + property IrcTextFormat textFormat: IrcTextFormat { + id: textFormat + + palette.gray: "#606060" + palette.lightGray: "#808080" + + // http://ethanschoonover.com/solarized + palette.blue: "#268bd2" + palette.green: "#859900" + palette.red: "#dc322f" + palette.brown: "#cb4b16" + palette.purple: "#6c71c4" + palette.orange: "#cb4b16" + palette.yellow: "#b58900" + palette.lightGreen: "#859900" + palette.cyan: "#2aa198" + palette.lightCyan: "#2aa198" + palette.lightBlue: "#268bd2" + palette.pink: "#6c71c4" + } + + function formatMessage(message) { + var formatted + switch (message.type) { + case IrcMessage.Invite: formatted = formatInviteMessage(message); break + case IrcMessage.Join: formatted = formatJoinMessage(message); break + case IrcMessage.Kick: formatted = formatKickMessage(message); break + case IrcMessage.Mode: formatted = formatModeMessage(message); break + case IrcMessage.Names: formatted = formatNamesMessage(message); break + case IrcMessage.Nick: formatted = formatNickMessage(message); break + case IrcMessage.Notice: formatted = formatNoticeMessage(message); break + case IrcMessage.Numeric: formatted = formatNumericMessage(message); break + case IrcMessage.Part: formatted = formatPartMessage(message); break + case IrcMessage.Private: formatted = formatPrivateMessage(message); break + case IrcMessage.Quit: formatted = formatQuitMessage(message); break + case IrcMessage.Topic: formatted = formatTopicMessage(message); break + } + return formatText(formatted, message.timeStamp) + } + + function formatText(text, timeStamp) { + if (text) { + switch (text[0]) { + case '!': text = qsTr("%1").arg(text); break; + case '[': text = qsTr("%1").arg(text); break; + case '*': text = qsTr("%1").arg(text); break; + case '?': text = qsTr("%1").arg(text); break; + default: break; + } + + return qsTr("[%1] %2").arg(Qt.formatTime(timeStamp, "hh:mm:ss")).arg(text) + } + } + + function formatInviteMessage(message) { + var sender = formatName(message.nick) + return qsTr("! %1 invited to %3").arg(sender).arg(message.channel) + } + + function formatJoinMessage(message) { + var sender = formatName(message.nick) + return qsTr("! %1 joined %2").arg(sender).arg(message.channel) + } + + function formatKickMessage(message) { + var sender = formatName(message.nick) + var user = formatName(message.user) + if (message.reason.length) + return qsTr("! %1 kicked %2 (%3)").arg(sender).arg(user).arg(message.reason) + return qsTr("! %1 kicked %2").arg(sender).arg(user) + } + + function formatModeMessage(message) { + var sender = formatName(message.nick) + if (message.reply) + return qsTr("! %1 mode is %2 %3").arg(message.target).arg(message.mode).arg(message.argument) + return qsTr("! %1 sets mode %2 %3").arg(sender).arg(message.mode).arg(message.argument) + } + + function formatNamesMessage(message) { + return qsTr("! %1 has %2 users").arg(message.channel).arg(message.names.length) + } + + function formatNickMessage(message) { + var sender = formatName(message.nick) + var nick = formatName(message.newNick) + return qsTr("! %1 changed nick to %2").arg(sender).arg(nick) + } + + function formatNoticeMessage(message) { + var sender = formatName(message.nick) + var content = formatHtml(message.content) + return qsTr("[%1] %2").arg(sender).arg(content) + } + + function formatNumericMessage(message) { + switch (message.code) { + case Irc.RPL_TOPIC: + case Irc.RPL_TOPICWHOTIME: + case Irc.RPL_CHANNEL_URL: + case Irc.RPL_NAMREPLY: + case Irc.RPL_ENDOFNAMES: + return // ignore + default: + return qsTr("[%1] %2").arg(message.code).arg(message.parameters.slice(1).join(" ")) + } + } + + function formatPartMessage(message) { + var sender = formatName(message.nick) + if (message.reason.length) + return qsTr("! %1 parted %2 (%3)").arg(sender).arg(message.channel).arg(formatHtml(message.reason)) + return qsTr("! %1 parted %2").arg(sender).arg(message.channel) + } + + function formatPrivateMessage(message) { + var sender = formatName(message.nick) + var content = formatHtml(message.content) + if (message.action) + return qsTr("* %1 %2").arg(sender).arg(content) + if (message.request) + return qsTr("! %1 requested %2").arg(sender).arg(content.split(" ")[0].toLowerCase()) + return qsTr("<%1> %2").arg(sender).arg(content) + } + + function formatQuitMessage(message) { + var sender = formatName(message.nick) + if (message.reason.length) + return qsTr("! %1 has quit (%2)").arg(sender).arg(formatHtml(message.reason)) + return qsTr("! %1 has quit").arg(sender) + } + + function formatTopicMessage(message) { + var sender = formatName(message.nick) + var topic = formatHtml(message.topic) + var channel = message.channel + if (message.reply) + return qsTr("! %1 topic is \"%2\"").arg(channel).arg(topic) + return qsTr("! %1 sets topic \"%2\" on %3").arg(sender).arg(topic).arg(channel) + } + + function formatHtml(message) { + return textFormat.toHtml(message) + } + + function formatName(name) { + var color = hslToRgb((hashCode(name) % 359)/359, 0.5, 0.25) + var r = ("0" + Math.round(Math.abs(color[0])).toString(16)).substr(-2) + var g = ("0" + Math.round(Math.abs(color[1])).toString(16)).substr(-2) + var b = ("0" + Math.round(Math.abs(color[2])).toString(16)).substr(-2) + return qsTr("%2").arg(r+g+b).arg(name); + } + + function hashCode(str) { + var hash = 0; + if (str.length == 0) return hash; + for (var i = 0; i < str.length; i++) { + var chr = str.charCodeAt(i); + hash = ((hash<<5)-hash)+chr; + hash = hash & hash; // Convert to 32bit integer + } + return hash; + } + + /** + * Converts an HSL color value to RGB. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes h, s, and l are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + * + * @param Number h The hue + * @param Number s The saturation + * @param Number l The lightness + * @return Array The RGB representation + */ + function hslToRgb(h, s, l){ + var r, g, b; + + function hue2rgb(p, q, t){ + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s == 0){ + r = g = b = l; // achromatic + }else{ + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return [r * 255, g * 255, b * 255]; + } +} diff --git a/src/libcommuni/examples/quick/qml/TextBrowser.qml b/src/libcommuni/examples/quick/qml/TextBrowser.qml new file mode 100644 index 0000000..fb013bc --- /dev/null +++ b/src/libcommuni/examples/quick/qml/TextBrowser.qml @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import Communi 3.0 + +Item { + id: background + + property IrcBuffer buffer + + implicitWidth: textArea.implicitWidth + implicitHeight: textArea.implicitHeight + + MessageFormatter { + id: formatter + } + + Connections { + target: buffer + onMessageReceived: { + var line = formatter.formatMessage(message) + if (line) + textArea.append(line) + } + } + + TextArea { + id: textArea + + anchors.fill: parent + anchors.topMargin: -1 + anchors.leftMargin: -1 + anchors.bottomMargin: -1 + + readOnly: true + textFormat: Qt.RichText + frameVisible: false + } +} diff --git a/src/libcommuni/examples/quick/qml/TextEntry.qml b/src/libcommuni/examples/quick/qml/TextEntry.qml new file mode 100644 index 0000000..4201e86 --- /dev/null +++ b/src/libcommuni/examples/quick/qml/TextEntry.qml @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 +import Communi 3.1 + +TextField { + id: textField + + property alias buffer: completer.buffer + + signal messageSent(IrcMessage message) + + focus: true + placeholderText: qsTr("...") + + Keys.onTabPressed: completer.complete(text, cursorPosition) + + IrcCompleter { + id: completer + + onCompleted: { + textField.text = text + textField.cursorPosition = cursor + } + + parser: IrcCommandParser { + id: parser + + tolerant: true + triggers: ["/"] + channels: buffer ? buffer.model.channels : [] + target: buffer ? buffer.title : "" + + Component.onCompleted: { + parser.addCommand(IrcCommand.Join, "JOIN <#channel> ()") + parser.addCommand(IrcCommand.CtcpAction, "ME [target] ") + parser.addCommand(IrcCommand.Nick, "NICK ") + parser.addCommand(IrcCommand.Part, "PART (<#channel>) ()") + } + } + } + + style: TextFieldStyle { + background: Rectangle { + color: palette.base + Rectangle { + color: "transparent" + anchors.fill: parent + anchors.leftMargin: -1 + border.color: "#aaa" + } + } + } + + onAccepted: { + var cmd = parser.parse(text) + if (cmd) { + buffer.connection.sendCommand(cmd) + if (cmd.type === IrcCommand.Message + || cmd.type === IrcCommand.CtcpAction + || cmd.type === IrcCommand.Notice) { + var msg = cmd.toMessage(buffer.connection.nickName, buffer.connection) + textField.messageSent(msg) + } + textField.text = "" + } + } +} diff --git a/src/libcommuni/examples/quick/qml/TopicLabel.qml b/src/libcommuni/examples/quick/qml/TopicLabel.qml new file mode 100644 index 0000000..4009304 --- /dev/null +++ b/src/libcommuni/examples/quick/qml/TopicLabel.qml @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import Communi 3.0 + +Rectangle { + id: background + + property IrcChannel channel + + color: "#ddd" + height: Math.max(20, label.implicitHeight + 4) + + IrcTextFormat { + id: textFormat + } + + Label { + id: label + + anchors.margins: 2 + anchors.leftMargin: 4 + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + wrapMode: Text.Wrap + text: channel && channel.topic ? textFormat.toHtml(channel.topic) : "-" + } + + Rectangle { + id: frame + + color: "transparent" + anchors.fill: parent + anchors.topMargin: -1 + anchors.leftMargin: -1 + border.color: "#aaa" + } +} diff --git a/src/libcommuni/examples/quick/qml/UserListView.qml b/src/libcommuni/examples/quick/qml/UserListView.qml new file mode 100644 index 0000000..6daf06b --- /dev/null +++ b/src/libcommuni/examples/quick/qml/UserListView.qml @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import Communi 3.0 + +Rectangle { + id: background + + property IrcChannel channel + + signal queried(IrcUser user) + + color: "#edf3fe" + + Rectangle { + id: frame + anchors.fill: parent + color: "transparent" + border.color: "#aaa" + anchors.topMargin: -1 + anchors.leftMargin: -1 + anchors.bottomMargin: -1 + } + + ScrollView { + id: scrollView + + anchors.fill: parent + anchors.topMargin: -1 + anchors.bottomMargin: -1 + + ListView { + id: listView + + model: IrcUserModel { + id: userModel + sortMethod: Irc.SortByTitle + channel: background.channel + onChannelChanged: listView.currentIndex = -1 + } + + delegate: Rectangle { + width: parent.width + height: Math.max(20, label.implicitHeight + 4) + color: ListView.isCurrentItem ? "#b5d5ff" : "transparent" + Label { + id: label + text: model.title + anchors.margins: 2 + anchors.leftMargin: 6 + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: parent + onPressed: listView.currentIndex = index + onDoubleClicked: queried(model.user) + } + } + } + } +} diff --git a/src/libcommuni/examples/quick/qml/main.qml b/src/libcommuni/examples/quick/qml/main.qml new file mode 100644 index 0000000..8c431ad --- /dev/null +++ b/src/libcommuni/examples/quick/qml/main.qml @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import Communi 3.0 + +ApplicationWindow { + id: window + + visible: true + title: qsTr("Communi %1 QtQuick example").arg(irc.version()) + + width: 800 + height: 480 + + minimumWidth: connectPage.implicitWidth + minimumHeight: connectPage.implicitHeight + + color: Qt.darker(palette.base, 1.06) + + SystemPalette { id: palette } + + Irc { id: irc } + IrcCommand { id: cmd } + + ConnectPage { + id: connectPage + anchors.fill: parent + visible: !connection.active + onAccepted: { + chatPage.currentBuffer = serverBuffer + connection.sendCommand(cmd.createJoin(channel)) + connection.open() + } + onRejected: Qt.quit() + } + + ChatPage { + id: chatPage + anchors.fill: parent + visible: connection.active + bufferModel: IrcBufferModel { + id: bufferModel + sortMethod: Irc.SortByTitle + connection: IrcConnection { + id: connection + host: connectPage.host + port: connectPage.port + secure: connectPage.secure + saslMechanism: connectPage.sasl ? supportedSaslMechanisms[0] : "" + nickName: connectPage.nickName + realName: connectPage.realName + userName: connectPage.userName + password: connectPage.password + } + onMessageIgnored: serverBuffer.receiveMessage(message) + function quit() { + bufferModel.clear() + connection.quit(qsTr("Communi %1 QtQuick example").arg(irc.version())) + connection.close() + } + } + serverBuffer: IrcBuffer { + id: serverBuffer + sticky: true + persistent: true + name: connection.displayName + Component.onCompleted: bufferModel.add(serverBuffer) + } + } + + Component.onDestruction: bufferModel.quit() +} diff --git a/src/libcommuni/examples/quick/quick.pro b/src/libcommuni/examples/quick/quick.pro new file mode 100644 index 0000000..10690af --- /dev/null +++ b/src/libcommuni/examples/quick/quick.pro @@ -0,0 +1,28 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = app +TARGET = quick +DEPENDPATH += . +INCLUDEPATH += . +QT += network quick + +lessThan(QT_MAJOR_VERSION, 5)|lessThan(QT_MINOR_VERSION, 2) { + error(The Qt Quick 2 based example requires Qt 5.2 or newer but Qt $$[QT_VERSION] was detected.) +} + +# Input +SOURCES += main.cpp +RESOURCES += quick.qrc +OTHER_FILES += qml/main.qml +OTHER_FILES += qml/BufferListView.qml +OTHER_FILES += qml/ChatPage.qml +OTHER_FILES += qml/ConnectPage.qml +OTHER_FILES += qml/MessageFormatter.qml +OTHER_FILES += qml/TextBrowser.qml +OTHER_FILES += qml/TextEntry.qml +OTHER_FILES += qml/TopicLabel.qml +OTHER_FILES += qml/UserListView.qml + +include(../examples.pri) diff --git a/src/libcommuni/examples/quick/quick.qrc b/src/libcommuni/examples/quick/quick.qrc new file mode 100644 index 0000000..aba83b9 --- /dev/null +++ b/src/libcommuni/examples/quick/quick.qrc @@ -0,0 +1,13 @@ + + + qml/main.qml + qml/BufferListView.qml + qml/ChatPage.qml + qml/ConnectPage.qml + qml/MessageFormatter.qml + qml/TextBrowser.qml + qml/TextEntry.qml + qml/TopicLabel.qml + qml/UserListView.qml + + diff --git a/src/libcommuni/features/communi.prf b/src/libcommuni/features/communi.prf new file mode 100644 index 0000000..fe3fb2f --- /dev/null +++ b/src/libcommuni/features/communi.prf @@ -0,0 +1,41 @@ +###################################################################### +# Communi +###################################################################### + +isEmpty(COMMUNI):error(Usage: \"CONFIG += communi\" and \"COMMUNI += \" \(available modules: core model util\)) + +include(communi-config.prf) + +isEmpty(IRC_INSTALL_LIBS):IRC_INSTALL_LIBS = $$[QT_INSTALL_LIBS] +isEmpty(IRC_INSTALL_BINS):IRC_INSTALL_BINS = $$[QT_INSTALL_BINS] +isEmpty(IRC_INSTALL_HEADERS):IRC_INSTALL_HEADERS = $$[QT_INSTALL_HEADERS]/Communi + +macx:!qt_no_framework { + QMAKE_FRAMEWORKPATH += $$IRC_INSTALL_LIBS +} else { + INCLUDEPATH += $$IRC_INSTALL_HEADERS + DEPENDPATH += $$IRC_INSTALL_HEADERS + LIBS += -L$$IRC_INSTALL_LIBS +} + +IRC_MODULES = +for(MODULE, COMMUNI) { + MODULE = $$lower($$MODULE) + isEqual(MODULE, "core"):IRC_MODULES *= IrcCore + else:isEqual(MODULE, "model"):IRC_MODULES *= IrcModel + else:isEqual(MODULE, "util"):IRC_MODULES *= IrcUtil +} + +for(IRC_MODULE, IRC_MODULES) { + macx:!qt_no_framework { + INCLUDEPATH += $$IRC_INSTALL_LIBS/$${IRC_MODULE}.framework/Headers + LIBS += -framework $$IRC_MODULE + } else { + INCLUDEPATH += $$IRC_INSTALL_HEADERS/$$IRC_MODULE + DEPENDPATH += $$IRC_INSTALL_HEADERS/$$IRC_MODULE + REAL_TEMPLATE = $$TEMPLATE + TEMPLATE = fakelib + LIBS += -l$$qtLibraryTarget($$IRC_MODULE) + TEMPLATE = $$REAL_TEMPLATE + } +} diff --git a/src/libcommuni/include/IrcCore/Irc b/src/libcommuni/include/IrcCore/Irc new file mode 100644 index 0000000..c7f8af4 --- /dev/null +++ b/src/libcommuni/include/IrcCore/Irc @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcCommand b/src/libcommuni/include/IrcCore/IrcCommand new file mode 100644 index 0000000..a9b4889 --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcCommand @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcCommandFilter b/src/libcommuni/include/IrcCore/IrcCommandFilter new file mode 100644 index 0000000..1edae38 --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcCommandFilter @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcConnection b/src/libcommuni/include/IrcCore/IrcConnection new file mode 100644 index 0000000..75c878e --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcConnection @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcCore b/src/libcommuni/include/IrcCore/IrcCore new file mode 100644 index 0000000..918016d --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcCore @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcFilter b/src/libcommuni/include/IrcCore/IrcFilter new file mode 100644 index 0000000..1edae38 --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcFilter @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcGlobal b/src/libcommuni/include/IrcCore/IrcGlobal new file mode 100644 index 0000000..af36086 --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcGlobal @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcMessage b/src/libcommuni/include/IrcCore/IrcMessage new file mode 100644 index 0000000..4c767f6 --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcMessage @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcMessageFilter b/src/libcommuni/include/IrcCore/IrcMessageFilter new file mode 100644 index 0000000..1edae38 --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcMessageFilter @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcNetwork b/src/libcommuni/include/IrcCore/IrcNetwork new file mode 100644 index 0000000..c298490 --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcNetwork @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/IrcProtocol b/src/libcommuni/include/IrcCore/IrcProtocol new file mode 100644 index 0000000..5ec3d80 --- /dev/null +++ b/src/libcommuni/include/IrcCore/IrcProtocol @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/irc.h b/src/libcommuni/include/IrcCore/irc.h new file mode 100644 index 0000000..911528a --- /dev/null +++ b/src/libcommuni/include/IrcCore/irc.h @@ -0,0 +1,557 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRC_H +#define IRC_H + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +#ifdef IRC_DOXYGEN +namespace Irc +{ + Q_INVOKABLE QString version(); + Q_INVOKABLE QString codeToString(int code); + Q_INVOKABLE QString nickFromPrefix(const QString& prefix); + Q_INVOKABLE QString identFromPrefix(const QString& prefix); + Q_INVOKABLE QString hostFromPrefix(const QString& prefix); + Q_INVOKABLE void registerMetaTypes(); +#else +class IRC_CORE_EXPORT Irc : public QObject +{ + Q_OBJECT + Q_ENUMS(Color DataRole SortMethod Code) + +public: + Q_INVOKABLE static QString version(); + Q_INVOKABLE static QString codeToString(int code); + Q_INVOKABLE static QString nickFromPrefix(const QString& prefix); + Q_INVOKABLE static QString identFromPrefix(const QString& prefix); + Q_INVOKABLE static QString hostFromPrefix(const QString& prefix); + Q_INVOKABLE static void registerMetaTypes(); +#endif + + enum Color { + White = 0, + Black = 1, + Blue = 2, + Green = 3, + Red = 4, + Brown = 5, + Purple = 6, + Orange = 7, + Yellow = 8, + LightGreen = 9, + Cyan = 10, + LightCyan = 11, + LightBlue = 12, + Pink = 13, + Gray = 14, + LightGray = 15 + }; + + enum DataRole { + UserRole = Qt::UserRole, + BufferRole, + ChannelRole, + NameRole, + PrefixRole, + ModeRole, + TitleRole + }; + + enum SortMethod { + SortByHand, + SortByName, + SortByTitle, + SortByActivity + }; + + enum Code { + RPL_WELCOME = 1, + RPL_YOURHOST = 2, + RPL_CREATED = 3, + RPL_MYINFO = 4, + RPL_ISUPPORT = 5, + RPL_SNOMASK = 8, + RPL_STATMEMTOT = 9, + RPL_BOUNCE = 10, + RPL_STATMEM = 10, + RPL_YOURCOOKIE = 14, + RPL_YOURID = 42, + RPL_SAVENICK = 43, + RPL_ATTEMPTINGJUNC = 50, + RPL_ATTEMPTINGREROUTE = 51, + RPL_TRACELINK = 200, + RPL_TRACECONNECTING = 201, + RPL_TRACEHANDSHAKE = 202, + RPL_TRACEUNKNOWN = 203, + RPL_TRACEOPERATOR = 204, + RPL_TRACEUSER = 205, + RPL_TRACESERVER = 206, + RPL_TRACESERVICE = 207, + RPL_TRACENEWTYPE = 208, + RPL_TRACECLASS = 209, + RPL_TRACERECONNECT = 210, + RPL_STATS = 210, + RPL_STATSLINKINFO = 211, + RPL_STATSCOMMANDS = 212, + RPL_STATSCLINE = 213, + RPL_STATSNLINE = 214, + RPL_STATSILINE = 215, + RPL_STATSKLINE = 216, + RPL_STATSQLINE = 217, + RPL_STATSYLINE = 218, + RPL_ENDOFSTATS = 219, + RPL_UMODEIS = 221, + RPL_MODLIST = 222, + RPL_SQLINE_NICK = 222, + RPL_STATSZLINE = 225, + RPL_STATSCOUNT = 226, + RPL_SERVICEINFO = 231, + RPL_ENDOFSERVICES = 232, + RPL_SERVICE = 233, + RPL_SERVLIST = 234, + RPL_SERVLISTEND = 235, + RPL_STATSVERBOSE = 236, + RPL_STATSENGINE = 237, + RPL_STATSIAUTH = 239, + RPL_STATSVLINE = 240, + RPL_STATSLLINE = 241, + RPL_STATSUPTIME = 242, + RPL_STATSOLINE = 243, + RPL_STATSHLINE = 244, + RPL_STATSSLINE = 245, + RPL_STATSPING = 246, + RPL_STATSBLINE = 247, + RPL_STATSDEFINE = 248, + RPL_STATSDEBUG = 249, + RPL_STATSDLINE = 250, + RPL_STATSCONN = 250, + RPL_LUSERCLIENT = 251, + RPL_LUSEROP = 252, + RPL_LUSERUNKNOWN = 253, + RPL_LUSERCHANNELS = 254, + RPL_LUSERME = 255, + RPL_ADMINME = 256, + RPL_ADMINLOC1 = 257, + RPL_ADMINLOC2 = 258, + RPL_ADMINEMAIL = 259, + RPL_TRACELOG = 261, + RPL_TRACEPING = 262, + RPL_TRACEEND = 262, + RPL_TRYAGAIN = 263, + RPL_LOCALUSERS = 265, + RPL_GLOBALUSERS = 266, + RPL_START_NETSTAT = 267, + RPL_NETSTAT = 268, + RPL_END_NETSTAT = 269, + RPL_PRIVS = 270, + RPL_SILELIST = 271, + RPL_ENDOFSILELIST = 272, + RPL_NOTIFY = 273, + RPL_ENDNOTIFY = 274, + RPL_STATSDELTA = 274, + RPL_VCHANEXIST = 276, + RPL_VCHANLIST = 277, + RPL_VCHANHELP = 278, + RPL_GLIST = 280, + RPL_ENDOFGLIST = 281, + RPL_ACCEPTLIST = 281, + RPL_ENDOFACCEPT = 282, + RPL_JUPELIST = 282, + RPL_ENDOFJUPELIST = 283, + RPL_FEATURE = 284, + RPL_GLIST_HASH = 285, + RPL_CHANINFO_HANDLE = 285, + RPL_NEWHOSTIS = 285, + RPL_CHANINFO_USERS = 286, + RPL_CHKHEAD = 286, + RPL_CHANINFO_CHOPS = 287, + RPL_CHANUSER = 287, + RPL_CHANINFO_VOICES = 288, + RPL_PATCHHEAD = 288, + RPL_CHANINFO_AWAY = 289, + RPL_PATCHCON = 289, + RPL_CHANINFO_OPERS = 290, + RPL_HELPHDR = 290, + RPL_DATASTR = 290, + RPL_CHANINFO_BANNED = 291, + RPL_HELPOP = 291, + RPL_ENDOFCHECK = 291, + RPL_CHANINFO_BANS = 292, + RPL_HELPTLR = 292, + RPL_CHANINFO_INVITE = 293, + RPL_HELPHLP = 293, + RPL_CHANINFO_INVITES = 294, + RPL_HELPFWD = 294, + RPL_CHANINFO_KICK = 295, + RPL_HELPIGN = 295, + RPL_CHANINFO_KICKS = 296, + RPL_END_CHANINFO = 299, + RPL_NONE = 300, + RPL_AWAY = 301, + RPL_USERHOST = 302, + RPL_ISON = 303, + RPL_TEXT = 304, + RPL_UNAWAY = 305, + RPL_NOWAWAY = 306, + RPL_WHOISREGNICK = 307, + RPL_SUSERHOST = 307, + RPL_NOTIFYACTION = 308, + RPL_WHOISADMIN = 308, + RPL_NICKTRACE = 309, + RPL_WHOISSADMIN = 309, + RPL_WHOISHELPER = 309, + RPL_WHOISSVCMSG = 310, + RPL_WHOISHELPOP = 310, + RPL_WHOISSERVICE = 310, + RPL_WHOISUSER = 311, + RPL_WHOISSERVER = 312, + RPL_WHOISOPERATOR = 313, + RPL_WHOWASUSER = 314, + RPL_ENDOFWHO = 315, + RPL_WHOISCHANOP = 316, + RPL_WHOISIDLE = 317, + RPL_ENDOFWHOIS = 318, + RPL_WHOISCHANNELS = 319, + RPL_WHOISVIRT = 320, + RPL_WHOIS_HIDDEN = 320, + RPL_WHOISSPECIAL = 320, + RPL_LISTSTART = 321, + RPL_LIST = 322, + RPL_LISTEND = 323, + RPL_CHANNELMODEIS = 324, + RPL_UNIQOPIS = 325, + RPL_CHANNELPASSIS = 325, + RPL_NOCHANPASS = 326, + RPL_CHPASSUNKNOWN = 327, + RPL_CHANNEL_URL = 328, + RPL_CREATIONTIME = 329, + RPL_WHOWAS_TIME = 330, + RPL_WHOISACCOUNT = 330, + RPL_NOTOPIC = 331, + RPL_TOPIC = 332, + RPL_TOPICWHOTIME = 333, + RPL_LISTUSAGE = 334, + RPL_COMMANDSYNTAX = 334, + RPL_LISTSYNTAX = 334, + RPL_CHANPASSOK = 338, + RPL_WHOISACTUALLY = 338, + RPL_BADCHANPASS = 339, + RPL_INVITING = 341, + RPL_SUMMONING = 342, + RPL_INVITED = 345, + RPL_INVITELIST = 346, + RPL_ENDOFINVITELIST = 347, + RPL_EXCEPTLIST = 348, + RPL_ENDOFEXCEPTLIST = 349, + RPL_VERSION = 351, + RPL_WHOREPLY = 352, + RPL_NAMREPLY = 353, + RPL_WHOSPCRPL = 354, + RPL_NAMREPLY_ = 355, + RPL_KILLDONE = 361, + RPL_CLOSING = 362, + RPL_CLOSEEND = 363, + RPL_LINKS = 364, + RPL_ENDOFLINKS = 365, + RPL_ENDOFNAMES = 366, + RPL_BANLIST = 367, + RPL_ENDOFBANLIST = 368, + RPL_ENDOFWHOWAS = 369, + RPL_INFO = 371, + RPL_MOTD = 372, + RPL_INFOSTART = 373, + RPL_ENDOFINFO = 374, + RPL_MOTDSTART = 375, + RPL_ENDOFMOTD = 376, + RPL_KICKEXPIRED = 377, + RPL_SPAM = 377, + RPL_BANEXPIRED = 378, + RPL_WHOISHOST = 378, + RPL_KICKLINKED = 379, + RPL_WHOISMODES = 379, + RPL_BANLINKED = 380, + RPL_YOURHELPER = 380, + RPL_YOUREOPER = 381, + RPL_REHASHING = 382, + RPL_YOURESERVICE = 383, + RPL_MYPORTIS = 384, + RPL_NOTOPERANYMORE = 385, + RPL_QLIST = 386, + RPL_IRCOPS = 386, + RPL_ENDOFQLIST = 387, + RPL_ENDOFIRCOPS = 387, + RPL_ALIST = 388, + RPL_ENDOFALIST = 389, + RPL_TIME = 391, + RPL_USERSSTART = 392, + RPL_USERS = 393, + RPL_ENDOFUSERS = 394, + RPL_NOUSERS = 395, + RPL_HOSTHIDDEN = 396, + ERR_UNKNOWNERROR = 400, + ERR_NOSUCHNICK = 401, + ERR_NOSUCHSERVER = 402, + ERR_NOSUCHCHANNEL = 403, + ERR_CANNOTSENDTOCHAN = 404, + ERR_TOOMANYCHANNELS = 405, + ERR_WASNOSUCHNICK = 406, + ERR_TOOMANYTARGETS = 407, + ERR_NOSUCHSERVICE = 408, + ERR_NOCOLORSONCHAN = 408, + ERR_NOORIGIN = 409, + ERR_NORECIPIENT = 411, + ERR_NOTEXTTOSEND = 412, + ERR_NOTOPLEVEL = 413, + ERR_WILDTOPLEVEL = 414, + ERR_BADMASK = 415, + ERR_TOOMANYMATCHES = 416, + ERR_QUERYTOOLONG = 416, + ERR_LENGTHTRUNCATED = 419, + ERR_UNKNOWNCOMMAND = 421, + ERR_NOMOTD = 422, + ERR_NOADMININFO = 423, + ERR_FILEERROR = 424, + ERR_NOOPERMOTD = 425, + ERR_TOOMANYAWAY = 429, + ERR_EVENTNICKCHANGE = 430, + ERR_NONICKNAMEGIVEN = 431, + ERR_ERRONEUSNICKNAME = 432, + ERR_NICKNAMEINUSE = 433, + ERR_SERVICENAMEINUSE = 434, + ERR_NORULES = 434, + ERR_SERVICECONFUSED = 435, + ERR_BANONCHAN = 435, + ERR_NICKCOLLISION = 436, + ERR_UNAVAILRESOURCE = 437, + ERR_BANNICKCHANGE = 437, + ERR_NICKTOOFAST = 438, + ERR_DEAD = 438, + ERR_TARGETTOOFAST = 439, + ERR_SERVICESDOWN = 440, + ERR_USERNOTINCHANNEL = 441, + ERR_NOTONCHANNEL = 442, + ERR_USERONCHANNEL = 443, + ERR_NOLOGIN = 444, + ERR_SUMMONDISABLED = 445, + ERR_USERSDISABLED = 446, + ERR_NONICKCHANGE = 447, + ERR_NOTIMPLEMENTED = 449, + ERR_NOTREGISTERED = 451, + ERR_IDCOLLISION = 452, + ERR_NICKLOST = 453, + ERR_HOSTILENAME = 455, + ERR_ACCEPTFULL = 456, + ERR_ACCEPTEXIST = 457, + ERR_ACCEPTNOT = 458, + ERR_NOHIDING = 459, + ERR_NOTFORHALFOPS = 460, + ERR_NEEDMOREPARAMS = 461, + ERR_ALREADYREGISTERED = 462, + ERR_NOPERMFORHOST = 463, + ERR_PASSWDMISMATCH = 464, + ERR_YOUREBANNEDCREEP = 465, + ERR_YOUWILLBEBANNED = 466, + ERR_KEYSET = 467, + ERR_INVALIDUSERNAME = 468, + ERR_ONLYSERVERSCANCHANGE = 468, + ERR_LINKSET = 469, + ERR_LINKCHANNEL = 470, + ERR_KICKEDFROMCHAN = 470, + ERR_CHANNELISFULL = 471, + ERR_UNKNOWNMODE = 472, + ERR_INVITEONLYCHAN = 473, + ERR_BANNEDFROMCHAN = 474, + ERR_BADCHANNELKEY = 475, + ERR_BADCHANMASK = 476, + ERR_NOCHANMODES = 477, + ERR_NEEDREGGEDNICK = 477, + ERR_BANLISTFULL = 478, + ERR_BADCHANNAME = 479, + ERR_LINKFAIL = 479, + ERR_NOULINE = 480, + ERR_CANNOTKNOCK = 480, + ERR_NOPRIVILEGES = 481, + ERR_CHANOPRIVSNEEDED = 482, + ERR_CANTKILLSERVER = 483, + ERR_RESTRICTED = 484, + ERR_ISCHANSERVICE = 484, + ERR_DESYNC = 484, + ERR_ATTACKDENY = 484, + ERR_UNIQOPRIVSNEEDED = 485, + ERR_KILLDENY = 485, + ERR_CANTKICKADMIN = 485, + ERR_ISREALSERVICE = 485, + ERR_NONONREG = 486, + ERR_HTMDISABLED = 486, + ERR_ACCOUNTONLY = 486, + ERR_CHANTOORECENT = 487, + ERR_MSGSERVICES = 487, + ERR_TSLESSCHAN = 488, + ERR_VOICENEEDED = 489, + ERR_SECUREONLYCHAN = 489, + ERR_NOOPERHOST = 491, + ERR_NOSERVICEHOST = 492, + ERR_NOFEATURE = 493, + ERR_BADFEATURE = 494, + ERR_BADLOGTYPE = 495, + ERR_BADLOGSYS = 496, + ERR_BADLOGVALUE = 497, + ERR_ISOPERLCHAN = 498, + ERR_CHANOWNPRIVNEEDED = 499, + ERR_UMODEUNKNOWNFLAG = 501, + ERR_USERSDONTMATCH = 502, + ERR_GHOSTEDCLIENT = 503, + ERR_VWORLDWARN = 503, + ERR_USERNOTONSERV = 504, + ERR_SILELISTFULL = 511, + ERR_TOOMANYWATCH = 512, + ERR_BADPING = 513, + ERR_INVALID_ERROR = 514, + ERR_TOOMANYDCC = 514, + ERR_BADEXPIRE = 515, + ERR_DONTCHEAT = 516, + ERR_DISABLED = 517, + ERR_NOINVITE = 518, + ERR_LONGMASK = 518, + ERR_ADMONLY = 519, + ERR_TOOMANYUSERS = 519, + ERR_OPERONLY = 520, + ERR_MASKTOOWIDE = 520, + ERR_WHOTRUNC = 520, + ERR_LISTSYNTAX = 521, + ERR_WHOSYNTAX = 522, + ERR_WHOLIMEXCEED = 523, + ERR_QUARANTINED = 524, + ERR_OPERSPVERIFY = 524, + ERR_REMOTEPFX = 525, + ERR_PFXUNROUTABLE = 526, + ERR_BADHOSTMASK = 550, + ERR_HOSTUNAVAIL = 551, + ERR_USINGSLINE = 552, + ERR_STATSSLINE = 553, + RPL_LOGON = 600, + RPL_LOGOFF = 601, + RPL_WATCHOFF = 602, + RPL_WATCHSTAT = 603, + RPL_NOWON = 604, + RPL_NOWOFF = 605, + RPL_WATCHLIST = 606, + RPL_ENDOFWATCHLIST = 607, + RPL_WATCHCLEAR = 608, + RPL_ISOPER = 610, + RPL_ISLOCOP = 611, + RPL_ISNOTOPER = 612, + RPL_ENDOFISOPER = 613, + RPL_DCCSTATUS = 617, + RPL_DCCLIST = 618, + RPL_ENDOFDCCLIST = 619, + RPL_WHOWASHOST = 619, + RPL_DCCINFO = 620, + RPL_ENDOFO = 626, + RPL_SETTINGS = 630, + RPL_ENDOFSETTINGS = 631, + RPL_DUMPING = 640, + RPL_DUMPRPL = 641, + RPL_EODUMP = 642, + RPL_TRACEROUTE_HOP = 660, + RPL_TRACEROUTE_START = 661, + RPL_MODECHANGEWARN = 662, + RPL_CHANREDIR = 663, + RPL_SERVMODEIS = 664, + RPL_OTHERUMODEIS = 665, + RPL_ENDOF_GENERIC = 666, + RPL_WHOWASDETAILS = 670, + RPL_WHOISSECURE = 671, + RPL_UNKNOWNMODES = 672, + RPL_CANNOTSETMODES = 673, + RPL_LUSERSTAFF = 678, + RPL_TIMEONSERVERIS = 679, + RPL_NETWORKS = 682, + RPL_YOURLANGUAGEIS = 687, + RPL_LANGUAGE = 688, + RPL_WHOISSTAFF = 689, + RPL_WHOISLANGUAGE = 690, + RPL_HELPSTART = 704, + RPL_HELPTXT = 705, + RPL_ENDOFHELP = 706, + RPL_ETRACEFULL = 708, + RPL_ETRACE = 709, + RPL_KNOCK = 710, + RPL_KNOCKDLVR = 711, + ERR_TOOMANYKNOCK = 712, + ERR_CHANOPEN = 713, + ERR_KNOCKONCHAN = 714, + ERR_KNOCKDISABLED = 715, + RPL_TARGUMODEG = 716, + RPL_TARGNOTIFY = 717, + RPL_UMODEGMSG = 718, + RPL_ENDOFOMOTD = 722, + ERR_NOPRIVS = 723, + RPL_TESTMARK = 724, + RPL_TESTLINE = 725, + RPL_NOTESTLINE = 726, + RPL_XINFO = 771, + RPL_XINFOSTART = 773, + RPL_XINFOEND = 774, + ERR_CANNOTDOCOMMAND = 972, + ERR_CANNOTCHANGEUMODE = 973, + ERR_CANNOTCHANGECHANMODE = 974, + ERR_CANNOTCHANGESERVERMODE = 975, + ERR_CANNOTSENDTONICK = 976, + ERR_UNKNOWNSERVERMODE = 977, + ERR_SERVERMODELOCK = 979, + ERR_BADCHARENCODING = 980, + ERR_TOOMANYLANGUAGES = 981, + ERR_NOLANGUAGE = 982, + ERR_TEXTTOOSHORT = 983, + ERR_NUMERIC_ERR = 999 + }; +}; + +#ifndef QT_NO_DEBUG_STREAM +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, Irc::Code code); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, Irc::DataRole role); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, Irc::Color color); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, Irc::SortMethod method); +#endif // QT_NO_DEBUG_STREAM + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(Irc::Code)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(Irc::DataRole)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(Irc::Color)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(Irc::SortMethod)) + +#endif // IRC_H diff --git a/src/libcommuni/include/IrcCore/irccommand.h b/src/libcommuni/include/IrcCore/irccommand.h new file mode 100644 index 0000000..e532755 --- /dev/null +++ b/src/libcommuni/include/IrcCore/irccommand.h @@ -0,0 +1,158 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCCOMMAND_H +#define IRCCOMMAND_H + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcMessage; +class IrcConnection; +class IrcCommandPrivate; + +class IRC_CORE_EXPORT IrcCommand : public QObject +{ + Q_OBJECT + Q_PROPERTY(QStringList parameters READ parameters WRITE setParameters) + Q_PROPERTY(QByteArray encoding READ encoding WRITE setEncoding) + Q_PROPERTY(Type type READ type WRITE setType) + Q_ENUMS(Type) + +public: + enum Type { + Admin, + Away, + Capability, + CtcpAction, + CtcpReply, + CtcpRequest, + Custom, + Info, + Invite, + Join, + Kick, + Knock, + List, + Message, + Mode, + Motd, + Names, + Nick, + Notice, + Part, + Ping, + Pong, + Quit, + Quote, + Stats, + Time, + Topic, + Trace, + Users, + Version, + Who, + Whois, + Whowas + }; + + explicit IrcCommand(QObject* parent = 0); + virtual ~IrcCommand(); + + Type type() const; + void setType(Type type); + + QStringList parameters() const; + void setParameters(const QStringList& parameters); + + QByteArray encoding() const; + void setEncoding(const QByteArray& encoding); + + virtual QString toString() const; + + Q_INVOKABLE IrcMessage* toMessage(const QString& prefix, IrcConnection* connection) const; + + Q_INVOKABLE static IrcCommand* createAdmin(const QString& server = QString()); + Q_INVOKABLE static IrcCommand* createAway(const QString& reason = QString()); + Q_INVOKABLE static IrcCommand* createCapability(const QString& subCommand, const QString& capability); + Q_INVOKABLE static IrcCommand* createCapability(const QString& subCommand, const QStringList& capabilities = QStringList()); + Q_INVOKABLE static IrcCommand* createCtcpAction(const QString& target, const QString& action); + Q_INVOKABLE static IrcCommand* createCtcpReply(const QString& target, const QString& reply); + Q_INVOKABLE static IrcCommand* createCtcpRequest(const QString& target, const QString& request); + Q_INVOKABLE static IrcCommand* createInfo(const QString& server = QString()); + Q_INVOKABLE static IrcCommand* createInvite(const QString& user, const QString& channel); + Q_INVOKABLE static IrcCommand* createJoin(const QString& channel, const QString& key = QString()); + Q_INVOKABLE static IrcCommand* createJoin(const QStringList& channels, const QStringList& keys = QStringList()); + Q_INVOKABLE static IrcCommand* createKick(const QString& channel, const QString& user, const QString& reason = QString()); + Q_INVOKABLE static IrcCommand* createKnock(const QString& channel, const QString& message = QString()); + Q_INVOKABLE static IrcCommand* createList(const QStringList& channels = QStringList(), const QString& server = QString()); + Q_INVOKABLE static IrcCommand* createMessage(const QString& target, const QString& message); + Q_INVOKABLE static IrcCommand* createMode(const QString& target, const QString& mode = QString(), const QString& arg = QString()); + Q_INVOKABLE static IrcCommand* createMotd(const QString& server = QString()); + Q_INVOKABLE static IrcCommand* createNames(const QString& channel = QString(), const QString& server = QString()); + Q_INVOKABLE static IrcCommand* createNames(const QStringList& channels, const QString& server = QString()); + Q_INVOKABLE static IrcCommand* createNick(const QString& nick); + Q_INVOKABLE static IrcCommand* createNotice(const QString& target, const QString& notice); + Q_INVOKABLE static IrcCommand* createPart(const QString& channel, const QString& reason = QString()); + Q_INVOKABLE static IrcCommand* createPart(const QStringList& channels, const QString& reason = QString()); + Q_INVOKABLE static IrcCommand* createPing(const QString& argument); + Q_INVOKABLE static IrcCommand* createPong(const QString& argument); + Q_INVOKABLE static IrcCommand* createQuit(const QString& reason = QString()); + Q_INVOKABLE static IrcCommand* createQuote(const QString& raw); + Q_INVOKABLE static IrcCommand* createQuote(const QStringList& parameters); + Q_INVOKABLE static IrcCommand* createStats(const QString& query, const QString& server = QString()); + Q_INVOKABLE static IrcCommand* createTime(const QString& server = QString()); + Q_INVOKABLE static IrcCommand* createTopic(const QString& channel, const QString& topic = QString()); + Q_INVOKABLE static IrcCommand* createTrace(const QString& target = QString()); + Q_INVOKABLE static IrcCommand* createUsers(const QString& server = QString()); + Q_INVOKABLE static IrcCommand* createVersion(const QString& user = QString()); + Q_INVOKABLE static IrcCommand* createWho(const QString& mask, bool operators = false); + Q_INVOKABLE static IrcCommand* createWhois(const QString& user); + Q_INVOKABLE static IrcCommand* createWhowas(const QString& user, int count = 1); + +private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcCommand) + Q_DISABLE_COPY(IrcCommand) +}; + +#ifndef QT_NO_DEBUG_STREAM +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcCommand::Type type); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, const IrcCommand* command); +#endif // QT_NO_DEBUG_STREAM + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCommand*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCommand::Type)) + +#endif // IRCCOMMAND_H diff --git a/src/libcommuni/include/IrcCore/irccommandfilter.h b/src/libcommuni/include/IrcCore/irccommandfilter.h new file mode 100644 index 0000000..1edae38 --- /dev/null +++ b/src/libcommuni/include/IrcCore/irccommandfilter.h @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/ircconnection.h b/src/libcommuni/include/IrcCore/ircconnection.h new file mode 100644 index 0000000..5ce26a5 --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircconnection.h @@ -0,0 +1,240 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCCONNECTION_H +#define IRCCONNECTION_H + +#include +#include +#include +#include +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcCommand; +class IrcProtocol; +class IrcConnectionPrivate; + +class IRC_CORE_EXPORT IrcConnection : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString host READ host WRITE setHost NOTIFY hostChanged) + Q_PROPERTY(int port READ port WRITE setPort NOTIFY portChanged) + Q_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged) + Q_PROPERTY(QString nickName READ nickName WRITE setNickName NOTIFY nickNameChanged) + Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged) + Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged) + Q_PROPERTY(QString displayName READ displayName WRITE setDisplayName NOTIFY displayNameChanged) + Q_PROPERTY(QVariantMap userData READ userData WRITE setUserData NOTIFY userDataChanged) + Q_PROPERTY(QByteArray encoding READ encoding WRITE setEncoding) + Q_PROPERTY(Status status READ status NOTIFY statusChanged) + Q_PROPERTY(bool active READ isActive NOTIFY statusChanged) + Q_PROPERTY(bool connected READ isConnected NOTIFY statusChanged) + Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) + Q_PROPERTY(int reconnectDelay READ reconnectDelay WRITE setReconnectDelay NOTIFY reconnectDelayChanged) + Q_PROPERTY(QAbstractSocket* socket READ socket WRITE setSocket) + Q_PROPERTY(bool secure READ isSecure WRITE setSecure NOTIFY secureChanged) + Q_PROPERTY(bool secureSupported READ isSecureSupported) + Q_PROPERTY(QString saslMechanism READ saslMechanism WRITE setSaslMechanism NOTIFY saslMechanismChanged) + Q_PROPERTY(QStringList supportedSaslMechanisms READ supportedSaslMechanisms CONSTANT) + Q_PROPERTY(IrcNetwork* network READ network CONSTANT) + Q_PROPERTY(IrcProtocol* protocol READ protocol WRITE setProtocol) + Q_ENUMS(Status) + +public: + explicit IrcConnection(QObject* parent = 0); + explicit IrcConnection(const QString& host, QObject* parent = 0); + virtual ~IrcConnection(); + + QString host() const; + void setHost(const QString& host); + + int port() const; + void setPort(int port); + + QString userName() const; + void setUserName(const QString& name); + + QString nickName() const; + void setNickName(const QString& name); + + QString realName() const; + void setRealName(const QString& name); + + QString password() const; + void setPassword(const QString& password); + + QString displayName() const; + void setDisplayName(const QString& name); + + QVariantMap userData() const; + void setUserData(const QVariantMap& data); + + QByteArray encoding() const; + void setEncoding(const QByteArray& encoding); + + enum Status { + Inactive, + Waiting, + Connecting, + Connected, + Closing, + Closed, + Error + }; + Status status() const; + bool isActive() const; + bool isConnected() const; + bool isEnabled() const; + + int reconnectDelay() const; + void setReconnectDelay(int seconds); + + QAbstractSocket* socket() const; + void setSocket(QAbstractSocket* socket); + + bool isSecure() const; + void setSecure(bool secure); + static bool isSecureSupported(); + + QString saslMechanism() const; + void setSaslMechanism(const QString& mechanism); + + static QStringList supportedSaslMechanisms(); + + IrcNetwork* network() const; + + IrcProtocol* protocol() const; + void setProtocol(IrcProtocol* protocol); + + void installMessageFilter(QObject* filter); + void removeMessageFilter(QObject* filter); + + void installCommandFilter(QObject* filter); + void removeCommandFilter(QObject* filter); + + Q_INVOKABLE QByteArray saveState(int version = 0) const; + Q_INVOKABLE bool restoreState(const QByteArray& state, int version = 0); + +public Q_SLOTS: + void open(); + void close(); + void quit(const QString& reason = QString()); + void setEnabled(bool enabled = true); + void setDisabled(bool disabled = true); + + bool sendCommand(IrcCommand* command); + bool sendData(const QByteArray& data); + bool sendRaw(const QString& message); + +Q_SIGNALS: + void connecting(); + void connected(); + void disconnected(); + void statusChanged(IrcConnection::Status status); + void socketError(QAbstractSocket::SocketError error); + void socketStateChanged(QAbstractSocket::SocketState state); + void secureError(); + + void nickNameReserved(QString* alternate); // deprecated + void nickNameRequired(const QString& reserved, QString* alternate); + void channelKeyRequired(const QString& channel, QString* key); + + void messageReceived(IrcMessage* message); + + void capabilityMessageReceived(IrcCapabilityMessage* message); + void errorMessageReceived(IrcErrorMessage* message); + void inviteMessageReceived(IrcInviteMessage* message); + void joinMessageReceived(IrcJoinMessage* message); + void kickMessageReceived(IrcKickMessage* message); + void modeMessageReceived(IrcModeMessage* message); + void namesMessageReceived(IrcNamesMessage* message); + void nickMessageReceived(IrcNickMessage* message); + void noticeMessageReceived(IrcNoticeMessage* message); + void numericMessageReceived(IrcNumericMessage* message); + void motdMessageReceived(IrcMotdMessage* message); + void partMessageReceived(IrcPartMessage* message); + void pingMessageReceived(IrcPingMessage* message); + void pongMessageReceived(IrcPongMessage* message); + void privateMessageReceived(IrcPrivateMessage* message); + void quitMessageReceived(IrcQuitMessage* message); + void topicMessageReceived(IrcTopicMessage* message); + void whoReplyMessageReceived(IrcWhoReplyMessage* message); + + void hostChanged(const QString& host); + void portChanged(int port); + void userNameChanged(const QString& name); + void nickNameChanged(const QString& name); + void realNameChanged(const QString& name); + void passwordChanged(const QString& password); + void displayNameChanged(const QString& name); + void userDataChanged(const QVariantMap& data); + + void reconnectDelayChanged(int seconds); + void enabledChanged(bool enabled); + void secureChanged(bool secure); + void saslMechanismChanged(const QString& mechanism); + + void destroyed(IrcConnection* connection); + +protected Q_SLOTS: + virtual IrcCommand* createCtcpReply(IrcPrivateMessage* request) const; + +private: + friend class IrcProtocol; + friend class IrcProtocolPrivate; + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcConnection) + Q_DISABLE_COPY(IrcConnection) + + Q_PRIVATE_SLOT(d_func(), void _irc_connected()) + Q_PRIVATE_SLOT(d_func(), void _irc_disconnected()) + Q_PRIVATE_SLOT(d_func(), void _irc_error(QAbstractSocket::SocketError)) + Q_PRIVATE_SLOT(d_func(), void _irc_state(QAbstractSocket::SocketState)) + Q_PRIVATE_SLOT(d_func(), void _irc_sslErrors()) + Q_PRIVATE_SLOT(d_func(), void _irc_reconnect()) + Q_PRIVATE_SLOT(d_func(), void _irc_readData()) + Q_PRIVATE_SLOT(d_func(), void _irc_filterDestroyed(QObject*)) +}; + +#ifndef QT_NO_DEBUG_STREAM +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcConnection::Status status); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, const IrcConnection* connection); +#endif // QT_NO_DEBUG_STREAM + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcConnection*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcConnection::Status)) + +#endif // IRCCONNECTION_H diff --git a/src/libcommuni/include/IrcCore/ircconnection_p.h b/src/libcommuni/include/IrcCore/ircconnection_p.h new file mode 100644 index 0000000..f9e91ab --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircconnection_p.h @@ -0,0 +1,105 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCCONNECTION_P_H +#define IRCCONNECTION_P_H + +#include "ircconnection.h" + +#include +#include +#include +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcMessageFilter; +class IrcCommandFilter; + +class IrcConnectionPrivate +{ + Q_DECLARE_PUBLIC(IrcConnection) + +public: + IrcConnectionPrivate(); + + void init(IrcConnection* connection); + + void _irc_connected(); + void _irc_disconnected(); + void _irc_error(QAbstractSocket::SocketError error); + void _irc_state(QAbstractSocket::SocketState state); + void _irc_sslErrors(); + void _irc_reconnect(); + void _irc_readData(); + + void _irc_filterDestroyed(QObject* filter); + + void setNick(const QString& nick); + void setStatus(IrcConnection::Status status); + void setInfo(const QHash& info); + + void receiveMessage(IrcMessage* msg); + IrcCommand* createCtcpReply(IrcPrivateMessage* request); + + static IrcConnectionPrivate* get(const IrcConnection* connection) + { + return connection->d_ptr.data(); + } + + IrcConnection* q_ptr; + QByteArray encoding; + IrcNetwork* network; + IrcProtocol* protocol; + QAbstractSocket* socket; + QString host; + int port; + QString userName; + QString nickName; + QString realName; + QString password; + QString displayName; + QVariantMap userData; + QTimer reconnecter; + QString saslMechanism; + bool enabled; + IrcConnection::Status status; + QList pendingCommands; + QList commandFilters; + QList messageFilters; + QStack activeCommandFilters; + bool sslErrors; + bool closed; +}; + +IRC_END_NAMESPACE + +#endif // IRCCONNECTION_P_H diff --git a/src/libcommuni/include/IrcCore/irccore.h b/src/libcommuni/include/IrcCore/irccore.h new file mode 100644 index 0000000..b5ca266 --- /dev/null +++ b/src/libcommuni/include/IrcCore/irccore.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCCORE_H +#define IRCCORE_H + +#include "irc.h" +#include "irccommand.h" +#include "ircconnection.h" +#include "ircglobal.h" +#include "ircmessage.h" +#include "ircfilter.h" +#include "ircnetwork.h" +#include "ircprotocol.h" + +IRC_BEGIN_NAMESPACE + +namespace IrcCore { + void registerMetaTypes(); +} + +IRC_END_NAMESPACE + +#endif // IRCCORE_H diff --git a/src/libcommuni/include/IrcCore/ircfilter.h b/src/libcommuni/include/IrcCore/ircfilter.h new file mode 100644 index 0000000..a2536fc --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircfilter.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCFILTER_H +#define IRCFILTER_H + +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcMessage; +class IrcCommand; + +class IRC_CORE_EXPORT IrcMessageFilter +{ +public: + virtual ~IrcMessageFilter() { } + virtual bool messageFilter(IrcMessage* message) = 0; +}; + +class IRC_CORE_EXPORT IrcCommandFilter +{ +public: + virtual ~IrcCommandFilter() { } + virtual bool commandFilter(IrcCommand* command) = 0; +}; + +IRC_END_NAMESPACE + +// TODO: fixme +#ifdef IRC_NAMESPACE +using IRC_NAMESPACE::IrcMessageFilter; +using IRC_NAMESPACE::IrcCommandFilter; +#endif + +Q_DECLARE_INTERFACE(IrcMessageFilter, "Communi.IrcMessageFilter") +Q_DECLARE_INTERFACE(IrcCommandFilter, "Communi.IrcCommandFilter") + +#endif // IRCFILTER_H diff --git a/src/libcommuni/include/IrcCore/ircglobal.h b/src/libcommuni/include/IrcCore/ircglobal.h new file mode 100644 index 0000000..d088dba --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircglobal.h @@ -0,0 +1,117 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCGLOBAL_H +#define IRCGLOBAL_H + +#include + +/*! + \file ircglobal.h + \brief \#include <\ref ircglobal.h "IrcGlobal"> + */ + +#if defined(IRC_SHARED) +# +# if defined(BUILD_IRC_CORE) +# define IRC_CORE_EXPORT Q_DECL_EXPORT +# else +# define IRC_CORE_EXPORT Q_DECL_IMPORT +# endif +# +# if defined(BUILD_IRC_MODEL) +# define IRC_MODEL_EXPORT Q_DECL_EXPORT +# else +# define IRC_MODEL_EXPORT Q_DECL_IMPORT +# endif +# +# if defined(BUILD_IRC_UTIL) +# define IRC_UTIL_EXPORT Q_DECL_EXPORT +# else +# define IRC_UTIL_EXPORT Q_DECL_IMPORT +# endif +# +#elif defined(IRC_STATIC) || defined(BUILD_IRC_CORE) || defined(BUILD_IRC_MODEL) || defined(BUILD_IRC_UTIL) +# +# define IRC_CORE_EXPORT +# define IRC_MODEL_EXPORT +# define IRC_UTIL_EXPORT +# +#else +# error Installation problem: either IRC_SHARED or IRC_STATIC must be defined! +#endif + +/*! + \def IRC_VERSION + + This macro expands a numeric value of the form 0xMMNNPP (MM = major, NN = minor, PP = patch) that specifies Communi's version number. + For example, if you compile your application against Communi 1.2.3, the IRC_VERSION macro will expand to 0x010203. + + You can use IRC_VERSION to use the latest Communi features where available. For example: + \code + #if IRC_VERSION >= 0x000300 + // SSL support since version 0.3.0 + connection->setSocket(new QSslSocket(connection)); + #endif + \endcode + + \sa Irc::version() + */ +#define IRC_VERSION 0x030200 + +/*! + \def IRC_VERSION_STR + + This macro expands to a string that specifies Communi's version number (for example, "1.2.3"). + This is the version against which the application is compiled. + + \sa Irc::version() + */ +#define IRC_VERSION_STR "3.2.0" + +#ifdef IRC_NAMESPACE + +# define IRC_PREPEND_NAMESPACE(name) ::IRC_NAMESPACE::name +# define IRC_USE_NAMESPACE using namespace ::IRC_NAMESPACE; +# define IRC_BEGIN_NAMESPACE namespace IRC_NAMESPACE { +# define IRC_END_NAMESPACE } +# define IRC_FORWARD_DECLARE_CLASS(name) \ + IRC_BEGIN_NAMESPACE class name; IRC_END_NAMESPACE \ + using IRC_PREPEND_NAMESPACE(name); + +#else + +# define IRC_PREPEND_NAMESPACE(name) ::name +# define IRC_USE_NAMESPACE +# define IRC_BEGIN_NAMESPACE +# define IRC_END_NAMESPACE +# define IRC_FORWARD_DECLARE_CLASS(name) class name; + +#endif // IRC_NAMESPACE + +#endif // IRCGLOBAL_H diff --git a/src/libcommuni/include/IrcCore/ircmessage.h b/src/libcommuni/include/IrcCore/ircmessage.h new file mode 100644 index 0000000..02b8c86 --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircmessage.h @@ -0,0 +1,519 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCMESSAGE_H +#define IRCMESSAGE_H + +#include +#include +#include +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcCommand; +class IrcNetwork; +class IrcConnection; +class IrcMessagePrivate; + +class IRC_CORE_EXPORT IrcMessage : public QObject +{ + Q_OBJECT + Q_PROPERTY(IrcConnection* connection READ connection) + Q_PROPERTY(IrcNetwork* network READ network) + Q_PROPERTY(Type type READ type) + Q_PROPERTY(bool own READ isOwn) + Q_PROPERTY(Flags flags READ flags) + Q_PROPERTY(bool valid READ isValid) + Q_PROPERTY(QString command READ command) + Q_PROPERTY(QString prefix READ prefix WRITE setPrefix) + Q_PROPERTY(QString nick READ nick) + Q_PROPERTY(QString ident READ ident) + Q_PROPERTY(QString host READ host) + Q_PROPERTY(QStringList parameters READ parameters WRITE setParameters) + Q_PROPERTY(QDateTime timeStamp READ timeStamp WRITE setTimeStamp) + Q_PROPERTY(QVariantMap tags READ tags WRITE setTags) + Q_ENUMS(Type Flag) + Q_FLAGS(Flags) + +public: + enum Type { + Unknown, + Capability, + Error, + Invite, + Join, + Kick, + Mode, + Motd, + Names, + Nick, + Notice, + Numeric, + Part, + Ping, + Pong, + Private, + Quit, + Topic, + WhoReply + }; + + enum Flag { + None = 0x0, + Own = 0x1, + Identified = 0x2, + Unidentified = 0x4, + Playback = 0x8 + }; + Q_DECLARE_FLAGS(Flags, Flag) + + Q_INVOKABLE explicit IrcMessage(IrcConnection* connection); + virtual ~IrcMessage(); + + IrcConnection* connection() const; + IrcNetwork* network() const; + + Type type() const; + bool isOwn() const; + + Flags flags() const; + void setFlags(Flags flags); + + QString command() const; + void setCommand(const QString& command); + + QString prefix() const; + void setPrefix(const QString& prefix); + + QString nick() const; + QString ident() const; + QString host() const; + + QStringList parameters() const; + void setParameters(const QStringList& parameters); + + virtual bool isValid() const; + + QDateTime timeStamp() const; + void setTimeStamp(const QDateTime& timeStamp); + + QByteArray encoding() const; + void setEncoding(const QByteArray& encoding); + + QVariantMap tags() const; + void setTags(const QVariantMap& tags); + + Q_INVOKABLE QByteArray toData() const; + Q_INVOKABLE static IrcMessage* fromData(const QByteArray& data, IrcConnection* connection); + Q_INVOKABLE static IrcMessage* fromParameters(const QString& prefix, const QString& command, const QStringList& parameters, IrcConnection* connection); + +protected: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcMessage) + Q_DISABLE_COPY(IrcMessage) +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(IrcMessage::Flags) + +class IRC_CORE_EXPORT IrcCapabilityMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString subCommand READ subCommand) + Q_PROPERTY(QStringList capabilities READ capabilities) + +public: + Q_INVOKABLE explicit IrcCapabilityMessage(IrcConnection* connection); + + QString subCommand() const; + QStringList capabilities() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcCapabilityMessage) +}; + +class IRC_CORE_EXPORT IrcErrorMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString error READ error) + +public: + Q_INVOKABLE explicit IrcErrorMessage(IrcConnection* connection); + + QString error() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcErrorMessage) +}; + +class IRC_CORE_EXPORT IrcInviteMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString user READ user) + Q_PROPERTY(QString channel READ channel) + +public: + Q_INVOKABLE explicit IrcInviteMessage(IrcConnection* connection); + + QString user() const; + QString channel() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcInviteMessage) +}; + +class IRC_CORE_EXPORT IrcJoinMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString channel READ channel) + +public: + Q_INVOKABLE explicit IrcJoinMessage(IrcConnection* connection); + + QString channel() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcJoinMessage) +}; + +class IRC_CORE_EXPORT IrcKickMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString channel READ channel) + Q_PROPERTY(QString user READ user) + Q_PROPERTY(QString reason READ reason) + +public: + Q_INVOKABLE explicit IrcKickMessage(IrcConnection* connection); + + QString channel() const; + QString user() const; + QString reason() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcKickMessage) +}; + +class IRC_CORE_EXPORT IrcModeMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString target READ target) + Q_PROPERTY(QString mode READ mode) + Q_PROPERTY(QString argument READ argument) + Q_PROPERTY(QStringList arguments READ arguments) + Q_PROPERTY(bool reply READ isReply) + Q_PROPERTY(Kind kind READ kind) + Q_ENUMS(Kind) + +public: + Q_INVOKABLE explicit IrcModeMessage(IrcConnection* connection); + + QString target() const; + QString mode() const; + QString argument() const; + QStringList arguments() const; + bool isReply() const; + + enum Kind { Channel, User }; + Kind kind() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcModeMessage) +}; + +class IRC_CORE_EXPORT IrcMotdMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QStringList lines READ lines) + +public: + Q_INVOKABLE explicit IrcMotdMessage(IrcConnection* connection); + + QStringList lines() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcMotdMessage) +}; + +class IRC_CORE_EXPORT IrcNamesMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString channel READ channel) + Q_PROPERTY(QStringList names READ names) + +public: + Q_INVOKABLE explicit IrcNamesMessage(IrcConnection* connection); + + QString channel() const; + QStringList names() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcNamesMessage) +}; + +class IRC_CORE_EXPORT IrcNickMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString oldNick READ oldNick) + Q_PROPERTY(QString newNick READ newNick) + +public: + Q_INVOKABLE explicit IrcNickMessage(IrcConnection* connection); + + QString oldNick() const; + QString newNick() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcNickMessage) +}; + +class IRC_CORE_EXPORT IrcNoticeMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString target READ target) + Q_PROPERTY(QString content READ content) + Q_PROPERTY(bool private READ isPrivate) + Q_PROPERTY(bool reply READ isReply) + +public: + Q_INVOKABLE explicit IrcNoticeMessage(IrcConnection* connection); + + QString target() const; + QString content() const; + bool isPrivate() const; + bool isReply() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcNoticeMessage) +}; + +class IRC_CORE_EXPORT IrcNumericMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(int code READ code) + +public: + Q_INVOKABLE explicit IrcNumericMessage(IrcConnection* connection); + + int code() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcNumericMessage) +}; + +class IRC_CORE_EXPORT IrcPartMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString channel READ channel) + Q_PROPERTY(QString reason READ reason) + +public: + Q_INVOKABLE explicit IrcPartMessage(IrcConnection* connection); + + QString channel() const; + QString reason() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcPartMessage) +}; + +class IRC_CORE_EXPORT IrcPingMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString argument READ argument) + +public: + Q_INVOKABLE explicit IrcPingMessage(IrcConnection* connection); + + QString argument() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcPingMessage) +}; + +class IRC_CORE_EXPORT IrcPongMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString argument READ argument) + +public: + Q_INVOKABLE explicit IrcPongMessage(IrcConnection* connection); + + QString argument() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcPongMessage) +}; + +class IRC_CORE_EXPORT IrcPrivateMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString target READ target) + Q_PROPERTY(QString content READ content) + Q_PROPERTY(bool private READ isPrivate) + Q_PROPERTY(bool action READ isAction) + Q_PROPERTY(bool request READ isRequest) + +public: + Q_INVOKABLE explicit IrcPrivateMessage(IrcConnection* connection); + + QString target() const; + QString content() const; + bool isPrivate() const; + bool isAction() const; + bool isRequest() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcPrivateMessage) +}; + +class IRC_CORE_EXPORT IrcQuitMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString reason READ reason) + +public: + Q_INVOKABLE explicit IrcQuitMessage(IrcConnection* connection); + + QString reason() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcQuitMessage) +}; + +class IRC_CORE_EXPORT IrcTopicMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString channel READ channel) + Q_PROPERTY(QString topic READ topic) + Q_PROPERTY(bool reply READ isReply) + +public: + Q_INVOKABLE explicit IrcTopicMessage(IrcConnection* connection); + + QString channel() const; + QString topic() const; + bool isReply() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcTopicMessage) +}; + +class IRC_CORE_EXPORT IrcWhoReplyMessage : public IrcMessage +{ + Q_OBJECT + Q_PROPERTY(QString mask READ mask) + Q_PROPERTY(QString server READ server) + Q_PROPERTY(bool away READ isAway) + Q_PROPERTY(bool servOp READ isServOp) + Q_PROPERTY(QString realName READ realName) + +public: + Q_INVOKABLE explicit IrcWhoReplyMessage(IrcConnection* connection); + + QString mask() const; + QString server() const; + bool isAway() const; + bool isServOp() const; + QString realName() const; + + bool isValid() const; + +private: + Q_DISABLE_COPY(IrcWhoReplyMessage) +}; + +#ifndef QT_NO_DEBUG_STREAM +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcMessage::Type type); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcMessage::Flag flag); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcMessage::Flags flags); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcModeMessage::Kind kind); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, const IrcMessage* message); +#endif // QT_NO_DEBUG_STREAM + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcMessage::Type)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCapabilityMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcErrorMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcInviteMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcJoinMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcKickMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcModeMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcMotdMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNamesMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNickMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNoticeMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNumericMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPartMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPingMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPongMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPrivateMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcQuitMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcTopicMessage*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcWhoReplyMessage*)) + +#endif // IRCMESSAGE_H diff --git a/src/libcommuni/include/IrcCore/ircmessage_p.h b/src/libcommuni/include/IrcCore/ircmessage_p.h new file mode 100644 index 0000000..b2b50e1 --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircmessage_p.h @@ -0,0 +1,124 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCMESSAGE_P_H +#define IRCMESSAGE_P_H + +#include +#include +#include +#include +#include +#include + +#include "ircmessage.h" + +IRC_BEGIN_NAMESPACE + +class IrcConnection; + +template +class IrcExplicitValue +{ +public: + IrcExplicitValue() : exp(false), null(true) { } + IrcExplicitValue(const T& value) : v(value), exp(false), null(false) { } + + bool isNull() const { return null; } + bool isExplicit() const { return exp; } + + const T& value() const { return v; } + void setValue(const T& value) { v = value; exp = true; null = false; } + + void clear() { v = T(); exp = false; null = true; } + +private: + T v; + bool exp; + bool null; +}; + +class IrcMessageData +{ +public: + static IrcMessageData fromData(const QByteArray& data); + + QByteArray content; + QByteArray prefix; + QByteArray command; + QList params; + QMap tags; +}; + +class IrcMessagePrivate +{ +public: + IrcMessagePrivate(); + + QString prefix() const; + void setPrefix(const QString& prefix); + + QString nick() const; + QString ident() const; + QString host() const; + + QString command() const; + void setCommand(const QString& command); + + QStringList params() const; + QString param(int index) const; + void setParams(const QStringList& params); + + QVariantMap tags() const; + void setTags(const QVariantMap& tags); + + QByteArray content() const; + + void invalidate(); + + static QString decode(const QByteArray& data, const QByteArray& encoding); + static bool parsePrefix(const QString& prefix, QString* nick, QString* ident, QString* host); + + IrcConnection* connection; + IrcMessage::Type type; + QDateTime timeStamp; + QByteArray encoding; + mutable int flags; + IrcMessageData data; + +private: + mutable QString m_nick, m_ident, m_host; + mutable IrcExplicitValue m_prefix; + mutable IrcExplicitValue m_command; + mutable IrcExplicitValue m_params; + mutable IrcExplicitValue m_tags; +}; + +IRC_END_NAMESPACE + +#endif // IRCMESSAGE_P_H diff --git a/src/libcommuni/include/IrcCore/ircmessagebuilder_p.h b/src/libcommuni/include/IrcCore/ircmessagebuilder_p.h new file mode 100644 index 0000000..3047eda --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircmessagebuilder_p.h @@ -0,0 +1,63 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCMESSAGEBUILDER_P_H +#define IRCMESSAGEBUILDER_P_H + +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcConnection; +class IrcMessage; +class IrcNumericMessage; + +class IrcMessageBuilder : public QObject +{ + Q_OBJECT + +public: + IrcMessageBuilder(IrcConnection* connection); + + void processMessage(IrcNumericMessage* message); + +Q_SIGNALS: + void messageReceived(IrcMessage* message); + +private: + struct Data { + IrcConnection* connection; + IrcMessage* message; + } d; +}; + +IRC_END_NAMESPACE + +#endif // IRCMESSAGEBUILDER_P_H diff --git a/src/libcommuni/include/IrcCore/ircmessagedecoder_p.h b/src/libcommuni/include/IrcCore/ircmessagedecoder_p.h new file mode 100644 index 0000000..005053e --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircmessagedecoder_p.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCMESSAGEDECODER_P_H +#define IRCMESSAGEDECODER_P_H + +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcMessageDecoder +{ +public: + IrcMessageDecoder(); + ~IrcMessageDecoder(); + + QString decode(const QByteArray& data, const QByteArray& encoding) const; + +private: + void initialize(); + void uninitialize(); + QByteArray codecForData(const QByteArray& data) const; + + struct Data { + void* detector; + } d; +}; + +IRC_END_NAMESPACE + +#endif // IRCMESSAGEDECODER_P_H diff --git a/src/libcommuni/include/IrcCore/ircmessagefilter.h b/src/libcommuni/include/IrcCore/ircmessagefilter.h new file mode 100644 index 0000000..1edae38 --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircmessagefilter.h @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcCore/ircnetwork.h b/src/libcommuni/include/IrcCore/ircnetwork.h new file mode 100644 index 0000000..6b2a5d2 --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircnetwork.h @@ -0,0 +1,147 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCNETWORK_H +#define IRCNETWORK_H + +#include +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcConnection; +class IrcNetworkPrivate; + +class IRC_CORE_EXPORT IrcNetwork : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool initialized READ isInitialized NOTIFY initialized) + Q_PROPERTY(QString name READ name NOTIFY nameChanged) + Q_PROPERTY(QStringList modes READ modes NOTIFY modesChanged) + Q_PROPERTY(QStringList prefixes READ prefixes NOTIFY prefixesChanged) + Q_PROPERTY(QStringList channelTypes READ channelTypes NOTIFY channelTypesChanged) + Q_PROPERTY(QStringList availableCapabilities READ availableCapabilities NOTIFY availableCapabilitiesChanged) + Q_PROPERTY(QStringList requestedCapabilities READ requestedCapabilities WRITE setRequestedCapabilities NOTIFY requestedCapabilitiesChanged) + Q_PROPERTY(QStringList activeCapabilities READ activeCapabilities NOTIFY activeCapabilitiesChanged) + Q_ENUMS(Limit ModeType) + Q_FLAGS(ModeTypes) + +public: + virtual ~IrcNetwork(); + + bool isInitialized(); + + QString name() const; + + QStringList modes() const; + QStringList prefixes() const; + + Q_INVOKABLE QString modeToPrefix(const QString& mode) const; + Q_INVOKABLE QString prefixToMode(const QString& prefix) const; + + QStringList channelTypes() const; + + Q_INVOKABLE bool isChannel(const QString& name) const; + + enum ModeType { + TypeA = 0x1, + TypeB = 0x2, + TypeC = 0x4, + TypeD = 0x8, + AllTypes = 0xf + }; + Q_DECLARE_FLAGS(ModeTypes, ModeType) + + Q_INVOKABLE QStringList channelModes(IrcNetwork::ModeTypes types) const; + + enum Limit { + NickLength, + ChannelLength, + TopicLength, + MessageLength, + KickReasonLength, + AwayReasonLength, + ModeCount + }; + + Q_INVOKABLE int numericLimit(IrcNetwork::Limit limit) const; + + Q_INVOKABLE int modeLimit(const QString& mode) const; + Q_INVOKABLE int channelLimit(const QString& type) const; + Q_INVOKABLE int targetLimit(const QString& command) const; + + QStringList availableCapabilities() const; + QStringList requestedCapabilities() const; + QStringList activeCapabilities() const; + + Q_INVOKABLE bool hasCapability(const QString& capability) const; + Q_INVOKABLE bool isCapable(const QString& capability) const; + +public Q_SLOTS: + bool requestCapability(const QString& capability); + bool requestCapabilities(const QStringList& capabilities); + void setRequestedCapabilities(const QStringList& capabilities); + +Q_SIGNALS: + void initialized(); + void nameChanged(const QString& name); + void modesChanged(const QStringList& modes); + void prefixesChanged(const QStringList& prefixes); + void channelTypesChanged(const QStringList& types); + void availableCapabilitiesChanged(const QStringList& capabilities); + void requestedCapabilitiesChanged(const QStringList& capabilities); + void activeCapabilitiesChanged(const QStringList& capabilities); + void requestingCapabilities(); + +private: + friend class IrcProtocol; + friend class IrcConnection; + explicit IrcNetwork(IrcConnection* connection); + + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcNetwork) + Q_DISABLE_COPY(IrcNetwork) +}; + +#ifndef QT_NO_DEBUG_STREAM +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcNetwork::Limit limit); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcNetwork::ModeType type); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, IrcNetwork::ModeTypes types); +IRC_CORE_EXPORT QDebug operator<<(QDebug debug, const IrcNetwork* network); +#endif // QT_NO_DEBUG_STREAM + +Q_DECLARE_OPERATORS_FOR_FLAGS(IrcNetwork::ModeTypes) + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcNetwork*)) + +#endif // IRCNETWORK_H diff --git a/src/libcommuni/include/IrcCore/ircnetwork_p.h b/src/libcommuni/include/IrcCore/ircnetwork_p.h new file mode 100644 index 0000000..22e6435 --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircnetwork_p.h @@ -0,0 +1,78 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCNETWORK_P_H +#define IRCNETWORK_P_H + +#include "ircnetwork.h" + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcNetworkPrivate +{ + Q_DECLARE_PUBLIC(IrcNetwork) + +public: + IrcNetworkPrivate(); + + void setInfo(const QHash& info); + void setAvailableCapabilities(const QSet& capabilities); + void setActiveCapabilities(const QSet& capabilities); + + void setName(const QString& name); + void setModes(const QStringList& modes); + void setPrefixes(const QStringList& prefixes); + void setChannelTypes(const QStringList& types); + + static IrcNetwork* create(IrcConnection* connection) + { + return new IrcNetwork(connection); + } + + static IrcNetworkPrivate* get(const IrcNetwork* network) + { + return network->d_ptr.data(); + } + + IrcNetwork* q_ptr; + QPointer connection; + bool initialized; + QString name; + QStringList modes, prefixes, channelTypes, channelModes; + QHash numericLimits, modeLimits, channelLimits, targetLimits; + QSet availableCaps, requestedCaps, activeCaps; +}; + +IRC_END_NAMESPACE + +#endif // IRCNETWORK_P_H diff --git a/src/libcommuni/include/IrcCore/ircprotocol.h b/src/libcommuni/include/IrcCore/ircprotocol.h new file mode 100644 index 0000000..ae600c4 --- /dev/null +++ b/src/libcommuni/include/IrcCore/ircprotocol.h @@ -0,0 +1,85 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCPROTOCOL_H +#define IRCPROTOCOL_H + +#include +#include +#include +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcMessage; +class IrcProtocolPrivate; + +class IRC_CORE_EXPORT IrcProtocol : public QObject +{ + Q_OBJECT + Q_PROPERTY(IrcConnection* connection READ connection) + Q_PROPERTY(QAbstractSocket* socket READ socket) + +public: + explicit IrcProtocol(IrcConnection* connection); + virtual ~IrcProtocol(); + + IrcConnection* connection() const; + QAbstractSocket* socket() const; + + virtual void open(); + virtual void close(); + + virtual void read(); + virtual bool write(const QByteArray& data); + +public Q_SLOTS: + void receiveMessage(IrcMessage* message); + +protected Q_SLOTS: + void setNickName(const QString& name); + void setStatus(IrcConnection::Status status); + void setInfo(const QHash& info); + void setAvailableCapabilities(const QSet& capabilities); + void setActiveCapabilities(const QSet& capabilities); + +private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcProtocol) + Q_DISABLE_COPY(IrcProtocol) + + Q_PRIVATE_SLOT(d_func(), void _irc_pauseHandshake()) + Q_PRIVATE_SLOT(d_func(), void _irc_resumeHandshake()) +}; + +IRC_END_NAMESPACE + +#endif // IRCPROTOCOL_H diff --git a/src/libcommuni/include/IrcModel/IrcBuffer b/src/libcommuni/include/IrcModel/IrcBuffer new file mode 100644 index 0000000..4c88f75 --- /dev/null +++ b/src/libcommuni/include/IrcModel/IrcBuffer @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcModel/IrcBufferModel b/src/libcommuni/include/IrcModel/IrcBufferModel new file mode 100644 index 0000000..149310e --- /dev/null +++ b/src/libcommuni/include/IrcModel/IrcBufferModel @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcModel/IrcChannel b/src/libcommuni/include/IrcModel/IrcChannel new file mode 100644 index 0000000..9392686 --- /dev/null +++ b/src/libcommuni/include/IrcModel/IrcChannel @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcModel/IrcModel b/src/libcommuni/include/IrcModel/IrcModel new file mode 100644 index 0000000..0ca546f --- /dev/null +++ b/src/libcommuni/include/IrcModel/IrcModel @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcModel/IrcUser b/src/libcommuni/include/IrcModel/IrcUser new file mode 100644 index 0000000..7b7b69e --- /dev/null +++ b/src/libcommuni/include/IrcModel/IrcUser @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcModel/IrcUserModel b/src/libcommuni/include/IrcModel/IrcUserModel new file mode 100644 index 0000000..90a67b7 --- /dev/null +++ b/src/libcommuni/include/IrcModel/IrcUserModel @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcModel/ircbuffer.h b/src/libcommuni/include/IrcModel/ircbuffer.h new file mode 100644 index 0000000..69cc69f --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircbuffer.h @@ -0,0 +1,126 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCBUFFER_H +#define IRCBUFFER_H + +#include +#include +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcChannel; +class IrcCommand; +class IrcMessage; +class IrcNetwork; +class IrcConnection; +class IrcBufferModel; +class IrcBufferPrivate; + +class IRC_MODEL_EXPORT IrcBuffer : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString title READ title NOTIFY titleChanged) + Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) + Q_PROPERTY(QString prefix READ prefix WRITE setPrefix NOTIFY prefixChanged) + Q_PROPERTY(IrcConnection* connection READ connection CONSTANT) + Q_PROPERTY(IrcNetwork* network READ network CONSTANT) + Q_PROPERTY(IrcBufferModel* model READ model CONSTANT) + Q_PROPERTY(bool active READ isActive NOTIFY activeChanged) + Q_PROPERTY(bool channel READ isChannel CONSTANT) + Q_PROPERTY(bool sticky READ isSticky WRITE setSticky NOTIFY stickyChanged) + Q_PROPERTY(bool persistent READ isPersistent WRITE setPersistent NOTIFY persistentChanged) + Q_PROPERTY(QVariantMap userData READ userData WRITE setUserData NOTIFY userDataChanged) + +public: + Q_INVOKABLE explicit IrcBuffer(QObject* parent = 0); + virtual ~IrcBuffer(); + + QString title() const; + QString name() const; + QString prefix() const; + + bool isChannel() const; + Q_INVOKABLE IrcChannel* toChannel(); + + IrcConnection* connection() const; + IrcNetwork* network() const; + IrcBufferModel* model() const; + + virtual bool isActive() const; + + bool isSticky() const; + void setSticky(bool sticky); + + bool isPersistent() const; + void setPersistent(bool persistent); + + QVariantMap userData() const; + void setUserData(const QVariantMap& data); + + Q_INVOKABLE bool sendCommand(IrcCommand* command); + +public Q_SLOTS: + void setName(const QString& name); + void setPrefix(const QString& prefix); + void receiveMessage(IrcMessage* message); + virtual void close(const QString& reason = QString()); + +Q_SIGNALS: + void titleChanged(const QString& title); + void nameChanged(const QString& name); + void prefixChanged(const QString& name); + void messageReceived(IrcMessage* message); + void destroyed(IrcBuffer* buffer); + void activeChanged(bool active); + void stickyChanged(bool sticky); + void persistentChanged(bool persistent); + void userDataChanged(const QVariantMap& data); + +protected: + IrcBuffer(IrcBufferPrivate& dd, QObject* parent); + + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcBuffer) + Q_DISABLE_COPY(IrcBuffer) +}; + +#ifndef QT_NO_DEBUG_STREAM +IRC_MODEL_EXPORT QDebug operator<<(QDebug debug, const IrcBuffer* buffer); +#endif // QT_NO_DEBUG_STREAM + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcBuffer*)) +Q_DECLARE_METATYPE(QList) + +#endif // IRCBUFFER_H diff --git a/src/libcommuni/include/IrcModel/ircbuffer_p.h b/src/libcommuni/include/IrcModel/ircbuffer_p.h new file mode 100644 index 0000000..cadc043 --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircbuffer_p.h @@ -0,0 +1,90 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCBUFFER_P_H +#define IRCBUFFER_P_H + +#include "ircbuffer.h" +#include "ircmessage.h" +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcUser; +class IrcUserModel; + +class IrcBufferPrivate +{ + Q_DECLARE_PUBLIC(IrcBuffer) + +public: + IrcBufferPrivate(); + virtual ~IrcBufferPrivate(); + + virtual void init(const QString& title, IrcBufferModel* model); + virtual void connected(); + virtual void disconnected(); + + void setName(const QString& name); + void setPrefix(const QString& prefix); + void setModel(IrcBufferModel* model); + + bool processMessage(IrcMessage* message); + + virtual bool processJoinMessage(IrcJoinMessage* message); + virtual bool processKickMessage(IrcKickMessage* message); + virtual bool processModeMessage(IrcModeMessage* message); + virtual bool processNamesMessage(IrcNamesMessage* message); + virtual bool processNickMessage(IrcNickMessage* message); + virtual bool processNoticeMessage(IrcNoticeMessage* message); + virtual bool processNumericMessage(IrcNumericMessage* message); + virtual bool processPartMessage(IrcPartMessage* message); + virtual bool processPrivateMessage(IrcPrivateMessage* message); + virtual bool processQuitMessage(IrcQuitMessage* message); + virtual bool processTopicMessage(IrcTopicMessage* message); + virtual bool processWhoReplyMessage(IrcWhoReplyMessage* message); + + static IrcBufferPrivate* get(IrcBuffer* buffer) + { + return buffer->d_func(); + } + + IrcBuffer* q_ptr; + IrcBufferModel* model; + QString name; + QString prefix; + bool persistent; + bool sticky; + QVariantMap userData; +}; + +IRC_END_NAMESPACE + +#endif // IRCBUFFER_P_H diff --git a/src/libcommuni/include/IrcModel/ircbuffermodel.h b/src/libcommuni/include/IrcModel/ircbuffermodel.h new file mode 100644 index 0000000..ef23fc4 --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircbuffermodel.h @@ -0,0 +1,158 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCBUFFERMODEL_H +#define IRCBUFFERMODEL_H + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcBuffer; +class IrcChannel; +class IrcMessage; +class IrcNetwork; +class IrcConnection; +class IrcBufferModelPrivate; + +class IRC_MODEL_EXPORT IrcBufferModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(int count READ count NOTIFY countChanged) + Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged) + Q_PROPERTY(Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder) + Q_PROPERTY(Irc::SortMethod sortMethod READ sortMethod WRITE setSortMethod) + Q_PROPERTY(QStringList channels READ channels NOTIFY channelsChanged) + Q_PROPERTY(Irc::DataRole displayRole READ displayRole WRITE setDisplayRole) + Q_PROPERTY(bool persistent READ isPersistent WRITE setPersistent NOTIFY persistentChanged) + Q_PROPERTY(QList buffers READ buffers NOTIFY buffersChanged) + Q_PROPERTY(IrcConnection* connection READ connection WRITE setConnection NOTIFY connectionChanged) + Q_PROPERTY(IrcNetwork* network READ network NOTIFY networkChanged) + Q_PROPERTY(IrcBuffer* bufferPrototype READ bufferPrototype WRITE setBufferPrototype NOTIFY bufferPrototypeChanged) + Q_PROPERTY(IrcChannel* channelPrototype READ channelPrototype WRITE setChannelPrototype NOTIFY channelPrototypeChanged) + +public: + explicit IrcBufferModel(QObject* parent = 0); + virtual ~IrcBufferModel(); + + IrcConnection* connection() const; + void setConnection(IrcConnection* connection); + + IrcNetwork* network() const; + + int count() const; + bool isEmpty() const; + QStringList channels() const; + QList buffers() const; + Q_INVOKABLE IrcBuffer* get(int index) const; + Q_INVOKABLE IrcBuffer* find(const QString& title) const; + Q_INVOKABLE bool contains(const QString& title) const; + Q_INVOKABLE int indexOf(IrcBuffer* buffer) const; + + Q_INVOKABLE IrcBuffer* add(const QString& title); + Q_INVOKABLE void add(IrcBuffer* buffer); + Q_INVOKABLE void remove(const QString& title); + Q_INVOKABLE void remove(IrcBuffer* buffer); + + Qt::SortOrder sortOrder() const; + void setSortOrder(Qt::SortOrder order); + + Irc::SortMethod sortMethod() const; + void setSortMethod(Irc::SortMethod method); + + Irc::DataRole displayRole() const; + void setDisplayRole(Irc::DataRole role); + + bool isPersistent() const; + void setPersistent(bool persistent); + + QModelIndex index(IrcBuffer* buffer) const; + IrcBuffer* buffer(const QModelIndex& index) const; + + QHash roleNames() const; + int rowCount(const QModelIndex& parent = QModelIndex()) const; + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const; + + IrcBuffer* bufferPrototype() const; + void setBufferPrototype(IrcBuffer* prototype); + + IrcChannel* channelPrototype() const; + void setChannelPrototype(IrcChannel* prototype); + + Q_INVOKABLE QByteArray saveState(int version = 0) const; + Q_INVOKABLE bool restoreState(const QByteArray& state, int version = 0); + +public Q_SLOTS: + void clear(); + void receiveMessage(IrcMessage* message); + void sort(int column = 0, Qt::SortOrder order = Qt::AscendingOrder); + void sort(Irc::SortMethod method, Qt::SortOrder order = Qt::AscendingOrder); + +Q_SIGNALS: + void countChanged(int count); + void emptyChanged(bool empty); + void added(IrcBuffer* buffer); + void removed(IrcBuffer* buffer); + void aboutToBeAdded(IrcBuffer* buffer); + void aboutToBeRemoved(IrcBuffer* buffer); + void persistentChanged(bool persistent); + void buffersChanged(const QList& buffers); + void channelsChanged(const QStringList& channels); + void connectionChanged(IrcConnection* connection); + void networkChanged(IrcNetwork* network); + void messageIgnored(IrcMessage* message); + void bufferPrototypeChanged(IrcBuffer* prototype); + void channelPrototypeChanged(IrcChannel* prototype); + void destroyed(IrcBufferModel* model); + +protected Q_SLOTS: + virtual IrcBuffer* createBuffer(const QString& title); + virtual IrcChannel* createChannel(const QString& title); + +protected: + virtual bool lessThan(IrcBuffer* one, IrcBuffer* another, Irc::SortMethod method) const; + +private: + friend class IrcBufferLessThan; + friend class IrcBufferGreaterThan; + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcBufferModel) + Q_DISABLE_COPY(IrcBufferModel) + + Q_PRIVATE_SLOT(d_func(), void _irc_connected()) + Q_PRIVATE_SLOT(d_func(), void _irc_disconnected()) + Q_PRIVATE_SLOT(d_func(), void _irc_bufferDestroyed(IrcBuffer*)) +}; + +IRC_END_NAMESPACE + +#endif // IRCBUFFERMODEL_H diff --git a/src/libcommuni/include/IrcModel/ircbuffermodel_p.h b/src/libcommuni/include/IrcModel/ircbuffermodel_p.h new file mode 100644 index 0000000..c7446b0 --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircbuffermodel_p.h @@ -0,0 +1,89 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCBUFFERMODEL_P_H +#define IRCBUFFERMODEL_P_H + +#include "ircbuffer.h" +#include "ircfilter.h" +#include "ircbuffermodel.h" +#include + +IRC_BEGIN_NAMESPACE + +class IrcBufferModelPrivate : public QObject, public IrcMessageFilter, public IrcCommandFilter +{ + Q_OBJECT + Q_DECLARE_PUBLIC(IrcBufferModel) + Q_INTERFACES(IrcMessageFilter IrcCommandFilter) + +public: + IrcBufferModelPrivate(); + + bool messageFilter(IrcMessage* message); + bool commandFilter(IrcCommand* command); + + IrcBuffer* createBufferHelper(const QString& title); + IrcChannel* createChannelHelper(const QString& title); + + IrcBuffer* createBuffer(const QString& title); + void destroyBuffer(const QString& title, bool force = false); + + void addBuffer(IrcBuffer* buffer, bool notify = true); + void insertBuffer(int index, IrcBuffer* buffer, bool notify = true); + void removeBuffer(IrcBuffer* buffer, bool notify = true); + bool renameBuffer(const QString& from, const QString& to); + + bool processMessage(const QString& title, IrcMessage* message, bool create = false); + + void _irc_connected(); + void _irc_disconnected(); + void _irc_bufferDestroyed(IrcBuffer* buffer); + + static IrcBufferModelPrivate* get(IrcBufferModel* model) + { + return model->d_func(); + } + + IrcBufferModel* q_ptr; + Irc::DataRole role; + QPointer connection; + QList bufferList; + QMap bufferMap; + QHash keys; + QStringList channels; + Irc::SortMethod sortMethod; + Qt::SortOrder sortOrder; + IrcBuffer* bufferProto; + IrcChannel* channelProto; + bool persistent; +}; + +IRC_END_NAMESPACE + +#endif // IRCBUFFERMODEL_P_H diff --git a/src/libcommuni/include/IrcModel/ircchannel.h b/src/libcommuni/include/IrcModel/ircchannel.h new file mode 100644 index 0000000..e16de90 --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircchannel.h @@ -0,0 +1,81 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCCHANNEL_H +#define IRCCHANNEL_H + +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcChannelPrivate; + +class IRC_MODEL_EXPORT IrcChannel : public IrcBuffer +{ + Q_OBJECT + Q_PROPERTY(QString key READ key NOTIFY keyChanged) + Q_PROPERTY(QString mode READ mode NOTIFY modeChanged) + Q_PROPERTY(QString topic READ topic NOTIFY topicChanged) + +public: + Q_INVOKABLE explicit IrcChannel(QObject* parent = 0); + virtual ~IrcChannel(); + + QString key() const; + QString mode() const; + QString topic() const; + + virtual bool isActive() const; + +public Q_SLOTS: + void join(const QString& key = QString()); + void part(const QString& reason = QString()); + void close(const QString& reason = QString()); + +Q_SIGNALS: + void keyChanged(const QString& key); + void modeChanged(const QString& mode); + void topicChanged(const QString& topic); + void destroyed(IrcChannel* channel); +private: + Q_DECLARE_PRIVATE(IrcChannel) + Q_DISABLE_COPY(IrcChannel) +}; + +#ifndef QT_NO_DEBUG_STREAM +IRC_MODEL_EXPORT QDebug operator<<(QDebug debug, const IrcChannel* channel); +#endif // QT_NO_DEBUG_STREAM + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcChannel*)) +Q_DECLARE_METATYPE(QList) + +#endif // IRCCHANNEL diff --git a/src/libcommuni/include/IrcModel/ircchannel_p.h b/src/libcommuni/include/IrcModel/ircchannel_p.h new file mode 100644 index 0000000..9da375b --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircchannel_p.h @@ -0,0 +1,99 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCCHANNEL_P_H +#define IRCCHANNEL_P_H + +#include "ircchannel.h" +#include "ircnetwork.h" +#include "ircbuffer_p.h" +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcChannelPrivate : public IrcBufferPrivate +{ + Q_DECLARE_PUBLIC(IrcChannel) + +public: + IrcChannelPrivate(); + virtual ~IrcChannelPrivate(); + + virtual void init(const QString& title, IrcBufferModel* model); + virtual void connected(); + virtual void disconnected(); + + void setActive(bool active); + + void changeModes(const QString& value, const QStringList& arguments); + void setModes(const QString& value, const QStringList& arguments); + void setTopic(const QString& value); + void setKey(const QString& value); + + void addUser(const QString& user); + bool removeUser(const QString& user); + void setUsers(const QStringList& users); + bool renameUser(const QString& from, const QString& to); + void setUserMode(const QString& user, const QString& mode); + void promoteUser(const QString& user); + void setUserAway(const QString &name, const bool& away); + void setUserServOp(const QString &name, const bool& servOp); + + virtual bool processJoinMessage(IrcJoinMessage* message); + virtual bool processKickMessage(IrcKickMessage* message); + virtual bool processModeMessage(IrcModeMessage* message); + virtual bool processNamesMessage(IrcNamesMessage* message); + virtual bool processNickMessage(IrcNickMessage* message); + virtual bool processNoticeMessage(IrcNoticeMessage* message); + virtual bool processNumericMessage(IrcNumericMessage* message); + virtual bool processPartMessage(IrcPartMessage* message); + virtual bool processPrivateMessage(IrcPrivateMessage* message); + virtual bool processQuitMessage(IrcQuitMessage* message); + virtual bool processTopicMessage(IrcTopicMessage* message); + virtual bool processWhoReplyMessage(IrcWhoReplyMessage* message); + + static IrcChannelPrivate* get(IrcChannel* channel) + { + return channel->d_func(); + } + + QMap modes; + QString topic; + bool active; + QStringList names; + QList userList; + QList activeUsers; + QMap userMap; + QList userModels; +}; + +IRC_END_NAMESPACE + +#endif // IRCCHANNEL_P_H diff --git a/src/libcommuni/include/IrcModel/ircmodel.h b/src/libcommuni/include/IrcModel/ircmodel.h new file mode 100644 index 0000000..45ac4bd --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircmodel.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCMODEL_H +#define IRCMODEL_H + +#include "ircbuffer.h" +#include "ircbuffermodel.h" +#include "ircchannel.h" +#include "ircuser.h" +#include "ircusermodel.h" + +IRC_BEGIN_NAMESPACE + +namespace IrcModel { + void registerMetaTypes(); +} + +IRC_END_NAMESPACE + +#endif // IRCMODEL_H diff --git a/src/libcommuni/include/IrcModel/ircuser.h b/src/libcommuni/include/IrcModel/ircuser.h new file mode 100644 index 0000000..9e59a9f --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircuser.h @@ -0,0 +1,89 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCUSER_H +#define IRCUSER_H + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcChannel; +class IrcUserPrivate; + +class IRC_MODEL_EXPORT IrcUser : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString title READ title NOTIFY titleChanged) + Q_PROPERTY(QString name READ name NOTIFY nameChanged) + Q_PROPERTY(QString prefix READ prefix NOTIFY prefixChanged) + Q_PROPERTY(QString mode READ mode NOTIFY modeChanged) + Q_PROPERTY(bool servOp READ isServOp NOTIFY servOpChanged) + Q_PROPERTY(bool away READ isAway NOTIFY awayChanged) + Q_PROPERTY(IrcChannel* channel READ channel CONSTANT) + +public: + explicit IrcUser(QObject* parent = 0); + virtual ~IrcUser(); + + QString title() const; + QString name() const; + QString prefix() const; + QString mode() const; + bool isServOp() const; + bool isAway() const; + + IrcChannel* channel() const; + +Q_SIGNALS: + void titleChanged(const QString& title); + void nameChanged(const QString& name); + void prefixChanged(const QString& prefix); + void modeChanged(const QString& mode); + void servOpChanged(bool servOp); + void awayChanged(bool away); + +private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcUser) + Q_DISABLE_COPY(IrcUser) +}; + +#ifndef QT_NO_DEBUG_STREAM +IRC_MODEL_EXPORT QDebug operator<<(QDebug debug, const IrcUser* user); +#endif // QT_NO_DEBUG_STREAM + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcUser*)) +Q_DECLARE_METATYPE(QList) + +#endif // IRCUSER_H diff --git a/src/libcommuni/include/IrcModel/ircuser_p.h b/src/libcommuni/include/IrcModel/ircuser_p.h new file mode 100644 index 0000000..0e88e6b --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircuser_p.h @@ -0,0 +1,63 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCUSER_P_H +#define IRCUSER_P_H + +#include "ircuser.h" + +IRC_BEGIN_NAMESPACE + +class IrcUserPrivate +{ + Q_DECLARE_PUBLIC(IrcUser) + +public: + void setName(const QString& n); + void setPrefix(const QString& p); + void setMode(const QString& m); + void setServOp(const bool& o); + void setAway(const bool& a); + + static IrcUserPrivate* get(IrcUser* user) + { + return user->d_func(); + } + + IrcUser* q_ptr; + IrcChannel* channel; + QString name; + QString prefix; + QString mode; + bool servOp; + bool away; +}; + +IRC_END_NAMESPACE + +#endif // IRCUSER_P_H diff --git a/src/libcommuni/include/IrcModel/ircusermodel.h b/src/libcommuni/include/IrcModel/ircusermodel.h new file mode 100644 index 0000000..331af37 --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircusermodel.h @@ -0,0 +1,119 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCUSERMODEL_H +#define IRCUSERMODEL_H + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcUser; +class IrcChannel; +class IrcMessage; +class IrcUserModelPrivate; + +class IRC_MODEL_EXPORT IrcUserModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(int count READ count NOTIFY countChanged) + Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged) + Q_PROPERTY(QStringList names READ names NOTIFY namesChanged) + Q_PROPERTY(QList users READ users NOTIFY usersChanged) + Q_PROPERTY(Irc::DataRole displayRole READ displayRole WRITE setDisplayRole) + Q_PROPERTY(IrcChannel* channel READ channel WRITE setChannel NOTIFY channelChanged) + Q_PROPERTY(Irc::SortMethod sortMethod READ sortMethod WRITE setSortMethod) + Q_PROPERTY(Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder) + +public: + explicit IrcUserModel(QObject* parent = 0); + virtual ~IrcUserModel(); + + IrcChannel* channel() const; + void setChannel(IrcChannel* channel); + + int count() const; + bool isEmpty() const; + QStringList names() const; + QList users() const; + Q_INVOKABLE IrcUser* get(int index) const; + Q_INVOKABLE IrcUser* find(const QString& name) const; + Q_INVOKABLE bool contains(const QString& name) const; + Q_INVOKABLE int indexOf(IrcUser* user) const; + + Irc::DataRole displayRole() const; + void setDisplayRole(Irc::DataRole role); + + Irc::SortMethod sortMethod() const; + void setSortMethod(Irc::SortMethod method); + + Qt::SortOrder sortOrder() const; + void setSortOrder(Qt::SortOrder order); + + QModelIndex index(IrcUser* user) const; + IrcUser* user(const QModelIndex& index) const; + + QHash roleNames() const; + int rowCount(const QModelIndex& parent = QModelIndex()) const; + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const; + +public Q_SLOTS: + void clear(); + void sort(int column = 0, Qt::SortOrder order = Qt::AscendingOrder); + void sort(Irc::SortMethod method, Qt::SortOrder order = Qt::AscendingOrder); + +Q_SIGNALS: + void added(IrcUser* user); + void removed(IrcUser* user); + void aboutToBeAdded(IrcUser* user); + void aboutToBeRemoved(IrcUser* user); + void countChanged(int count); + void emptyChanged(bool empty); + void namesChanged(const QStringList& names); + void usersChanged(const QList& users); + void channelChanged(IrcChannel* channel); + +protected: + virtual bool lessThan(IrcUser* one, IrcUser* another, Irc::SortMethod method) const; + +private: + friend class IrcUserLessThan; + friend class IrcChannelPrivate; + friend class IrcUserGreaterThan; + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcUserModel) + Q_DISABLE_COPY(IrcUserModel) +}; + +IRC_END_NAMESPACE + +#endif // IRCUSERMODEL_H diff --git a/src/libcommuni/include/IrcModel/ircusermodel_p.h b/src/libcommuni/include/IrcModel/ircusermodel_p.h new file mode 100644 index 0000000..45c00bb --- /dev/null +++ b/src/libcommuni/include/IrcModel/ircusermodel_p.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCUSERMODEL_P_H +#define IRCUSERMODEL_P_H + +#include "ircuser.h" +#include "ircchannel_p.h" +#include "ircusermodel.h" +#include + +IRC_BEGIN_NAMESPACE + +class IrcUserModelPrivate +{ + Q_DECLARE_PUBLIC(IrcUserModel) + +public: + IrcUserModelPrivate(); + + void addUser(IrcUser* user, bool notify = true); + void insertUser(int index, IrcUser* user, bool notify = true); + void removeUser(IrcUser* user, bool notify = true); + void setUsers(const QList& users, bool reset = true); + void renameUser(IrcUser* user); + void setUserMode(IrcUser* user); + void promoteUser(IrcUser* user); + + static IrcUserModelPrivate* get(IrcUserModel* model) + { + return model->d_func(); + } + + IrcUserModel* q_ptr; + Irc::DataRole role; + QList userList; + QPointer channel; + Irc::SortMethod sortMethod; + Qt::SortOrder sortOrder; +}; + +IRC_END_NAMESPACE + +#endif // IRCUSERMODEL_P_H diff --git a/src/libcommuni/include/IrcUtil/IrcCommandParser b/src/libcommuni/include/IrcUtil/IrcCommandParser new file mode 100644 index 0000000..0cac681 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/IrcCommandParser @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcUtil/IrcCompleter b/src/libcommuni/include/IrcUtil/IrcCompleter new file mode 100644 index 0000000..7f561f4 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/IrcCompleter @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcUtil/IrcLagTimer b/src/libcommuni/include/IrcUtil/IrcLagTimer new file mode 100644 index 0000000..d290939 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/IrcLagTimer @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcUtil/IrcPalette b/src/libcommuni/include/IrcUtil/IrcPalette new file mode 100644 index 0000000..b82c1c0 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/IrcPalette @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcUtil/IrcTextFormat b/src/libcommuni/include/IrcUtil/IrcTextFormat new file mode 100644 index 0000000..f78fd81 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/IrcTextFormat @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcUtil/IrcUtil b/src/libcommuni/include/IrcUtil/IrcUtil new file mode 100644 index 0000000..64e9f15 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/IrcUtil @@ -0,0 +1 @@ +#include diff --git a/src/libcommuni/include/IrcUtil/irccommandparser.h b/src/libcommuni/include/IrcUtil/irccommandparser.h new file mode 100644 index 0000000..c31a6f2 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/irccommandparser.h @@ -0,0 +1,112 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCCOMMANDPARSER_H +#define IRCCOMMANDPARSER_H + +#include +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcCommandParserPrivate; + +class IRC_UTIL_EXPORT IrcCommandParser : public QObject +{ + Q_OBJECT + Q_PROPERTY(QStringList commands READ commands NOTIFY commandsChanged) + Q_PROPERTY(QStringList triggers READ triggers WRITE setTriggers NOTIFY triggersChanged) + Q_PROPERTY(QStringList channels READ channels WRITE setChannels NOTIFY channelsChanged) + Q_PROPERTY(QString target READ target WRITE setTarget NOTIFY targetChanged) + Q_PROPERTY(bool tolerant READ isTolerant WRITE setTolerant NOTIFY tolerancyChanged) + Q_FLAGS(Details) + +public: + explicit IrcCommandParser(QObject* parent = 0); + virtual ~IrcCommandParser(); + + QStringList commands() const; + + enum Detail { + Full = 0x0, + NoTarget = 0x1, + NoPrefix = 0x2, + NoEllipsis = 0x4, + NoParentheses = 0x8, + NoBrackets = 0x10, + NoAngles = 0x20, + Visual = NoTarget | NoPrefix | NoEllipsis + }; + Q_DECLARE_FLAGS(Details, Detail) + + Q_INVOKABLE QString syntax(const QString& command, Details details = Visual) const; + + Q_INVOKABLE void addCommand(IrcCommand::Type type, const QString& syntax); + Q_INVOKABLE void removeCommand(IrcCommand::Type type, const QString& syntax = QString()); + + QStringList triggers() const; + + QString target() const; + QStringList channels() const; + + bool isTolerant() const; + void setTolerant(bool tolerant); + + Q_INVOKABLE IrcCommand* parse(const QString& input) const; + +public Q_SLOTS: + void clear(); + void reset(); + + void setTriggers(const QStringList& triggers); + void setChannels(const QStringList& channels); + void setTarget(const QString& target); + +Q_SIGNALS: + void commandsChanged(const QStringList& commands); + void triggersChanged(const QStringList& triggers); + void channelsChanged(const QStringList& channels); + void targetChanged(const QString& target); + void tolerancyChanged(bool tolerant); + +private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcCommandParser) + Q_DISABLE_COPY(IrcCommandParser) +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(IrcCommandParser::Details) + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCommandParser*)) + +#endif // IRCCOMMANDPARSER_H diff --git a/src/libcommuni/include/IrcUtil/irccommandparser_p.h b/src/libcommuni/include/IrcUtil/irccommandparser_p.h new file mode 100644 index 0000000..d22fd6d --- /dev/null +++ b/src/libcommuni/include/IrcUtil/irccommandparser_p.h @@ -0,0 +1,96 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCCOMMANDPARSER_P_H +#define IRCCOMMANDPARSER_P_H + +#include "irccommandparser.h" +#include "irccommand.h" + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +struct IrcParameterInfo +{ + IrcParameterInfo() : optional(false), channel(false), current(false), multi(false) { } + bool optional; + bool channel; + bool current; + bool multi; + QString value; + QString syntax; +}; + +struct IrcCommandInfo +{ + IrcCommandInfo() : type(IrcCommand::Custom), min(0), max(0) { } + + QString fullSyntax() + { + return command + QLatin1Char(' ') + syntax; + } + + IrcCommand::Type type; + QString command; + QString syntax; + int min, max; + QList params; +}; + +class IrcCommandParserPrivate +{ +public: + IrcCommandParserPrivate(); + + QList find(const QString& command) const; + static IrcCommandInfo parseSyntax(IrcCommand::Type type, const QString& syntax); + IrcCommand* parseCommand(const IrcCommandInfo& command, const QString& input) const; + bool processParameters(const IrcCommandInfo& command, const QString& input, QStringList* params) const; + bool processCommand(QString* input, int* removed = 0) const; + bool processMessage(QString* input, int* removed = 0) const; + bool onChannel() const; + + static IrcCommandParserPrivate* get(IrcCommandParser* parser) + { + return parser->d_func(); + } + + bool tolerant; + QString target; + QStringList triggers; + QStringList channels; + QMultiMap commands; +}; + +IRC_END_NAMESPACE + +#endif // IRCCOMMANDPARSER_P_H diff --git a/src/libcommuni/include/IrcUtil/irccompleter.h b/src/libcommuni/include/IrcUtil/irccompleter.h new file mode 100644 index 0000000..f4c33ab --- /dev/null +++ b/src/libcommuni/include/IrcUtil/irccompleter.h @@ -0,0 +1,90 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCCOMPLETER_H +#define IRCCOMPLETER_H + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcBuffer; +class IrcCommandParser; +class IrcCompleterPrivate; + +class IRC_UTIL_EXPORT IrcCompleter : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString suffix READ suffix WRITE setSuffix NOTIFY suffixChanged) + Q_PROPERTY(IrcBuffer* buffer READ buffer WRITE setBuffer NOTIFY bufferChanged) + Q_PROPERTY(IrcCommandParser* parser READ parser WRITE setParser NOTIFY parserChanged) + Q_ENUMS(Direction) + +public: + explicit IrcCompleter(QObject* parent = 0); + virtual ~IrcCompleter(); + + enum Direction { + Forward, + Backward + }; + + QString suffix() const; + IrcBuffer* buffer() const; + IrcCommandParser* parser() const; + +public Q_SLOTS: + void setSuffix(const QString& suffix); + void setBuffer(IrcBuffer* buffer); + void setParser(IrcCommandParser* parser); + + void complete(const QString& text, int cursor, Direction direction = Forward); + void reset(); + +Q_SIGNALS: + void suffixChanged(const QString& suffix); + void bufferChanged(IrcBuffer* buffer); + void parserChanged(IrcCommandParser* parser); + + void completed(const QString& text, int cursor); + +private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcCompleter) + Q_DISABLE_COPY(IrcCompleter) +}; + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCompleter*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcCompleter::Direction)) + +#endif // IRCCOMPLETER_H diff --git a/src/libcommuni/include/IrcUtil/irclagtimer.h b/src/libcommuni/include/IrcUtil/irclagtimer.h new file mode 100644 index 0000000..29816d8 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/irclagtimer.h @@ -0,0 +1,78 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCLAGTIMER_H +#define IRCLAGTIMER_H + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcConnection; +class IrcLagTimerPrivate; + +class IRC_UTIL_EXPORT IrcLagTimer : public QObject +{ + Q_OBJECT + Q_PROPERTY(qint64 lag READ lag NOTIFY lagChanged) + Q_PROPERTY(int interval READ interval WRITE setInterval) + Q_PROPERTY(IrcConnection* connection READ connection WRITE setConnection) + +public: + explicit IrcLagTimer(QObject* parent = 0); + virtual ~IrcLagTimer(); + + IrcConnection* connection() const; + void setConnection(IrcConnection* connection); + + qint64 lag() const; + + int interval() const; + void setInterval(int seconds); + +Q_SIGNALS: + void lagChanged(qint64 lag); + +private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcLagTimer) + Q_DISABLE_COPY(IrcLagTimer) + + Q_PRIVATE_SLOT(d_func(), void _irc_connected()) + Q_PRIVATE_SLOT(d_func(), void _irc_pingServer()) + Q_PRIVATE_SLOT(d_func(), void _irc_disconnected()) +}; + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcLagTimer*)) + +#endif // IRCLAGTIMER_H diff --git a/src/libcommuni/include/IrcUtil/irclagtimer_p.h b/src/libcommuni/include/IrcUtil/irclagtimer_p.h new file mode 100644 index 0000000..712f4a9 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/irclagtimer_p.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCLAGTIMER_P_H +#define IRCLAGTIMER_P_H + +#include "irclagtimer.h" +#include "ircfilter.h" +#include + +IRC_BEGIN_NAMESPACE + +class IrcPongMessage; + +class IrcLagTimerPrivate : public QObject, public IrcMessageFilter +{ + Q_OBJECT + Q_INTERFACES(IrcMessageFilter) + Q_DECLARE_PUBLIC(IrcLagTimer) + +public: + IrcLagTimerPrivate(); + + bool messageFilter(IrcMessage* msg); + bool processPongReply(IrcPongMessage* msg); + + void _irc_connected(); + void _irc_pingServer(); + void _irc_disconnected(); + + void updateTimer(); + void updateLag(qint64 value); + + IrcLagTimer* q_ptr; + IrcConnection* connection; + QTimer timer; + int interval; + qint64 lag; +}; + +IRC_END_NAMESPACE + +#endif // IRCLAGTIMER_P_H diff --git a/src/libcommuni/include/IrcUtil/ircpalette.h b/src/libcommuni/include/IrcUtil/ircpalette.h new file mode 100644 index 0000000..735ff17 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/ircpalette.h @@ -0,0 +1,133 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCPALETTE_H +#define IRCPALETTE_H + +#include +#include +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcPalettePrivate; + +class IRC_UTIL_EXPORT IrcPalette : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString white READ white WRITE setWhite) + Q_PROPERTY(QString black READ black WRITE setBlack) + Q_PROPERTY(QString blue READ blue WRITE setBlue) + Q_PROPERTY(QString green READ green WRITE setGreen) + Q_PROPERTY(QString red READ red WRITE setRed) + Q_PROPERTY(QString brown READ brown WRITE setBrown) + Q_PROPERTY(QString purple READ purple WRITE setPurple) + Q_PROPERTY(QString orange READ orange WRITE setOrange) + Q_PROPERTY(QString yellow READ yellow WRITE setYellow) + Q_PROPERTY(QString lightGreen READ lightGreen WRITE setLightGreen) + Q_PROPERTY(QString cyan READ cyan WRITE setCyan) + Q_PROPERTY(QString lightCyan READ lightCyan WRITE setLightCyan) + Q_PROPERTY(QString lightBlue READ lightBlue WRITE setLightBlue) + Q_PROPERTY(QString pink READ pink WRITE setPink) + Q_PROPERTY(QString gray READ gray WRITE setGray) + Q_PROPERTY(QString lightGray READ lightGray WRITE setLightGray) + +public: + ~IrcPalette(); + + QMap colorNames() const; + void setColorNames(const QMap& names); + + QString colorName(int color, const QString& fallback = QLatin1String("black")) const; + void setColorName(int color, const QString& name); + + QString white() const; + void setWhite(const QString& color); + + QString black() const; + void setBlack(const QString& color); + + QString blue() const; + void setBlue(const QString& color); + + QString green() const; + void setGreen(const QString& color); + + QString red() const; + void setRed(const QString& color); + + QString brown() const; + void setBrown(const QString& color); + + QString purple() const; + void setPurple(const QString& color); + + QString orange() const; + void setOrange(const QString& color); + + QString yellow() const; + void setYellow(const QString& color); + + QString lightGreen() const; + void setLightGreen(const QString& color); + + QString cyan() const; + void setCyan(const QString& color); + + QString lightCyan() const; + void setLightCyan(const QString& color); + + QString lightBlue() const; + void setLightBlue(const QString& color); + + QString pink() const; + void setPink(const QString& color); + + QString gray() const; + void setGray(const QString& color); + + QString lightGray() const; + void setLightGray(const QString& color); + +private: + friend class IrcTextFormat; + explicit IrcPalette(QObject* parent); + + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcPalette) + Q_DISABLE_COPY(IrcPalette) +}; + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcPalette*)) + +#endif // IRCPALETTE_H diff --git a/src/libcommuni/include/IrcUtil/irctextformat.h b/src/libcommuni/include/IrcUtil/irctextformat.h new file mode 100644 index 0000000..5056b79 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/irctextformat.h @@ -0,0 +1,90 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCTEXTFORMAT_H +#define IRCTEXTFORMAT_H + +#include +#include +#include +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcPalette; +class IrcTextFormatPrivate; + +class IRC_UTIL_EXPORT IrcTextFormat : public QObject +{ + Q_OBJECT + Q_PROPERTY(IrcPalette* palette READ palette CONSTANT) + Q_PROPERTY(QString urlPattern READ urlPattern WRITE setUrlPattern) + Q_PROPERTY(QString plainText READ plainText) + Q_PROPERTY(QString html READ html) + Q_PROPERTY(QList urls READ urls) + Q_ENUMS(SpanFormat) + +public: + explicit IrcTextFormat(QObject* parent = 0); + virtual ~IrcTextFormat(); + + IrcPalette* palette() const; + + QString urlPattern() const; + void setUrlPattern(const QString& pattern); + + enum SpanFormat { SpanStyle, SpanClass }; + + SpanFormat spanFormat() const; + void setSpanFormat(SpanFormat format); + + Q_INVOKABLE QString toHtml(const QString& text) const; + Q_INVOKABLE QString toPlainText(const QString& text) const; + + QString plainText() const; + QString html() const; + QList urls() const; + +public Q_SLOTS: + void parse(const QString& text); + +private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(IrcTextFormat) + Q_DISABLE_COPY(IrcTextFormat) +}; + +IRC_END_NAMESPACE + +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcTextFormat*)) +Q_DECLARE_METATYPE(IRC_PREPEND_NAMESPACE(IrcTextFormat::SpanFormat)) + +#endif // IRCTEXTFORMAT_H diff --git a/src/libcommuni/include/IrcUtil/irctoken_p.h b/src/libcommuni/include/IrcUtil/irctoken_p.h new file mode 100644 index 0000000..0e1b707 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/irctoken_p.h @@ -0,0 +1,81 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCTOKEN_P_H +#define IRCTOKEN_P_H + +#include "ircglobal.h" +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcToken +{ +public: + IrcToken() : idx(-1), pos(-1) { } + IrcToken(int index, int position, const QString& text) + : idx(index), pos(position), str(text) { } + + bool isValid() const { return idx != -1; } + int index() const { return idx; } + int position() const { return pos; } + int length() const { return str.length(); } + QString text() const { return str; } + +private: + int idx; + int pos; + QString str; + friend class IrcTokenizer; +}; + +class IrcTokenizer +{ +public: + IrcTokenizer(const QString& str = QString()); + + int count() const; + bool isEmpty() const; + QList tokens() const; + IrcToken at(int index) const; + IrcTokenizer mid(int index) const; + + void clear(); + void replace(int index, const QString& text); + IrcToken find(int pos) const; + QString toString() const; + +private: + int len; + QList t; +}; + +IRC_END_NAMESPACE + +#endif // IRCTOKEN_P_H diff --git a/src/libcommuni/include/IrcUtil/ircutil.h b/src/libcommuni/include/IrcUtil/ircutil.h new file mode 100644 index 0000000..6e39f18 --- /dev/null +++ b/src/libcommuni/include/IrcUtil/ircutil.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef IRCUTIL_H +#define IRCUTIL_H + +#include "irccommandparser.h" +#include "irccompleter.h" +#include "irclagtimer.h" +#include "ircpalette.h" +#include "irctextformat.h" + +IRC_BEGIN_NAMESPACE + +namespace IrcUtil { + void registerMetaTypes(); +} + +IRC_END_NAMESPACE + +#endif // IRCUTIL_H diff --git a/src/libcommuni/libcommuni.pro b/src/libcommuni/libcommuni.pro new file mode 100644 index 0000000..08b39b0 --- /dev/null +++ b/src/libcommuni/libcommuni.pro @@ -0,0 +1,121 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = subdirs +SUBDIRS += src +CONFIG += ordered + +!no_tests { + SUBDIRS += tests +} else { + message(Tests disabled) +} + +!no_examples { + SUBDIRS += examples +} else { + message(Examples disabled) +} + +lessThan(QT_MAJOR_VERSION, 5) { + lessThan(QT_MAJOR_VERSION, 4) | lessThan(QT_MINOR_VERSION, 6) { + error(Communi requires Qt 4.6 or newer but Qt $$[QT_VERSION] was detected.) + } + defineTest(write_file) { + first = true + for(line, $$2) { + !isEmpty(first):system(echo $$line > $$1) + else:system(echo $$line >> $$1) + first = + } + return(true) + } +} + +static:CONFIG_LINES += "DEFINES+=IRC_STATIC" +else:CONFIG_LINES += "DEFINES+=IRC_SHARED" + +include(version.pri) +IRC_VERSION_MAJOR = $$section(IRC_VERSION, ., 0, 0) +IRC_VERSION_MINOR = $$section(IRC_VERSION, ., 1, 1) +IRC_VERSION_PATCH = $$section(IRC_VERSION, ., 2, 2) + +CONFIG_LINES += "IRC_VERSION=$$IRC_VERSION" +CONFIG_LINES += "IRC_VERSION_MAJOR=$$IRC_VERSION_MAJOR" +CONFIG_LINES += "IRC_VERSION_MINOR=$$IRC_VERSION_MINOR" +CONFIG_LINES += "IRC_VERSION_PATCH=$$IRC_VERSION_PATCH" + +isEmpty(IRC_INSTALL_LIBS):IRC_INSTALL_LIBS = $$[QT_INSTALL_LIBS] +isEmpty(IRC_INSTALL_BINS):IRC_INSTALL_BINS = $$[QT_INSTALL_BINS] +isEmpty(IRC_INSTALL_HEADERS):IRC_INSTALL_HEADERS = $$[QT_INSTALL_HEADERS]/Communi +isEmpty(IRC_INSTALL_FEATURES) { + isEqual(QT_MAJOR_VERSION, 5):IRC_INSTALL_FEATURES = $$[QT_HOST_DATA]/mkspecs/features + else:IRC_INSTALL_FEATURES = $$[QMAKE_MKSPECS]/features +} + +# qt4/win: WARNING: Unescaped backslashes are deprecated +!win32|greaterThan(QT_MAJOR_VERSION, 4) { + CONFIG_LINES += "IRC_INSTALL_LIBS=$$IRC_INSTALL_LIBS" + CONFIG_LINES += "IRC_INSTALL_BINS=$$IRC_INSTALL_BINS" + CONFIG_LINES += "IRC_INSTALL_HEADERS=$$IRC_INSTALL_HEADERS" + CONFIG_LINES += "IRC_INSTALL_FEATURES=$$IRC_INSTALL_FEATURES" +} + +IRC_CONFIG = $${OUT_PWD}$${QMAKE_DIR_SEP}communi-config.prf +write_file($$IRC_CONFIG, CONFIG_LINES) + +CONFIG_VARS = $${OUT_PWD}$${QMAKE_DIR_SEP}.config.vars +exists($$CONFIG_VARS) { + CONFIG_LINES += "include\\\($$CONFIG_VARS\\\)" +} +QMAKE_CACHE = $${OUT_PWD}$${QMAKE_DIR_SEP}.qmake.cache +write_file($$QMAKE_CACHE, CONFIG_LINES) + +OTHER_FILES += .gitignore +OTHER_FILES += .travis.yml +OTHER_FILES += AUTHORS +OTHER_FILES += CHANGELOG +OTHER_FILES += configure +OTHER_FILES += Doxyfile +OTHER_FILES += INSTALL +OTHER_FILES += LICENSE +OTHER_FILES += README +OTHER_FILES += features/communi.prf + +include(doc/doc.pri) + +features.files += features/communi.prf +features.files += $$OUT_PWD/communi-config.prf +features.path = $$IRC_INSTALL_FEATURES +INSTALLS += features + +!build_pass { + macx { + !qt_no_framework { + message(Building Communi $$IRC_VERSION (framework)) + } else { + message(Building Communi $$IRC_VERSION (dylib)) + } + } else { + message(Building Communi $$IRC_VERSION) + } +} + +coverage { + cov_zerocounters.CONFIG += recursive + cov_zerocounters.recurse = src + QMAKE_EXTRA_TARGETS += cov_zerocounters + + cov_capture.CONFIG += recursive + cov_capture.recurse = src + QMAKE_EXTRA_TARGETS += cov_capture + + cov_genhtml.CONFIG += recursive + cov_genhtml.recurse = src + QMAKE_EXTRA_TARGETS += cov_genhtml + + coverage.depends += first cov_zerocounters check cov_capture cov_genhtml + QMAKE_EXTRA_TARGETS += coverage + !build_pass:message(Code coverage collection enabled) +} diff --git a/src/libcommuni/src/3rdparty/icu/icu.pri b/src/libcommuni/src/3rdparty/icu/icu.pri new file mode 100644 index 0000000..352c218 --- /dev/null +++ b/src/libcommuni/src/3rdparty/icu/icu.pri @@ -0,0 +1,44 @@ +###################################################################### +# Communi +###################################################################### + +include(../pkg.pri) + +pkgExists(icu) { + CONFIG += link_pkgconfig + PKGCONFIG += icu +} else:pkgExists(icu-i18n) { + CONFIG += link_pkgconfig + PKGCONFIG += icu-i18n +} + +isEmpty(PKGCONFIG) { + win32 { + isEmpty(ICU_DIR):ICU_DIR = $$(ICU_DIR) + isEmpty(ICU_DIR):ICU_DIR = C:/ICU + !build_pass { + !exists($$ICU_DIR) { + error("ICU support has been enabled, but the ICU installation \ + has not been found at $${ICU_DIR}. Please download and \ + install ICU from http://icu-project.org and/or specify \ + ICU_DIR to match the installation location.") + } else { + message("Using ICU from $${ICU_DIR}") + } + } + INCLUDEPATH += $$ICU_DIR/include + contains(QMAKE_TARGET.arch, x86_64):LIBS += -L$$ICU_DIR/lib64 + else:LIBS += -L$$ICU_DIR/lib + LIBS += -licuuc + + # icudata vs. icudt + exists($$ICU_DIR/bin/icudata*.dll):LIBS += -licudata + else:LIBS += -licudt + + # icui18n vs. icuin + exists($$ICU_DIR/bin/icui18n*.dll):LIBS += -licui18n + else:LIBS += -licuin + } else { + LIBS += -licui18n -licudata -licuuc + } +} diff --git a/src/libcommuni/src/3rdparty/mozilla/mozilla.pri b/src/libcommuni/src/3rdparty/mozilla/mozilla.pri new file mode 100644 index 0000000..3e279d9 --- /dev/null +++ b/src/libcommuni/src/3rdparty/mozilla/mozilla.pri @@ -0,0 +1,5 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += $$PWD/rdf_utils.c diff --git a/src/libcommuni/src/3rdparty/mozilla/rdf_utils.c b/src/libcommuni/src/3rdparty/mozilla/rdf_utils.c new file mode 100644 index 0000000..c1329f7 --- /dev/null +++ b/src/libcommuni/src/3rdparty/mozilla/rdf_utils.c @@ -0,0 +1,132 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +/* + This file implements utility routines for the rdf data model. + For more information on this file, contact rjc or guha + For more information on RDF, look at the RDF section of www.mozilla.org +*/ + +#define kLeft1BitMask 0x80 +#define kLeft2BitsMask 0xC0 +#define kLeft3BitsMask 0xE0 +#define kLeft4BitsMask 0xF0 +#define kLeft5BitsMask 0xF8 +#define kLeft6BitsMask 0xFC +#define kLeft7BitsMask 0xFE + +#define k2BytesLeadByte kLeft2BitsMask +#define k3BytesLeadByte kLeft3BitsMask +#define k4BytesLeadByte kLeft4BitsMask +#define k5BytesLeadByte kLeft5BitsMask +#define k6BytesLeadByte kLeft6BitsMask +#define kTrialByte kLeft1BitMask + +#define UTF8_1Byte(c) ( 0 == ((c) & kLeft1BitMask)) +#define UTF8_2Bytes(c) ( k2BytesLeadByte == ((c) & kLeft3BitsMask)) +#define UTF8_3Bytes(c) ( k3BytesLeadByte == ((c) & kLeft4BitsMask)) +#define UTF8_4Bytes(c) ( k4BytesLeadByte == ((c) & kLeft5BitsMask)) +#define UTF8_5Bytes(c) ( k5BytesLeadByte == ((c) & kLeft6BitsMask)) +#define UTF8_6Bytes(c) ( k6BytesLeadByte == ((c) & kLeft7BitsMask)) +#define UTF8_ValidTrialByte(c) ( kTrialByte == ((c) & kLeft2BitsMask)) + +int IsUTF8Text(const unsigned char* utf8, int len) +{ + int i; + int j; + int clen; + for(i =0; i < len; i += clen) + { + if(UTF8_1Byte(utf8[i])) + { + clen = 1; + } else if(UTF8_2Bytes(utf8[i])) { + clen = 2; + /* No enough trail bytes */ + if( (i + clen) > len) + return 0; + /* 0000 0000 - 0000 007F : should encode in less bytes */ + if(0 == (utf8[i] & 0x1E )) + return 0; + } else if(UTF8_3Bytes(utf8[i])) { + clen = 3; + /* No enough trail bytes */ + if( (i + clen) > len) + return 0; + /* a single Surrogate should not show in 3 bytes UTF8, instead, the pair should be intepreted + as one single UCS4 char and encoded UTF8 in 4 bytes */ + if((0xED == utf8[i] ) && (0xA0 == (utf8[i+1] & 0xA0 ) )) + return 0; + /* 0000 0000 - 0000 07FF : should encode in less bytes */ + if((0 == (utf8[i] & 0x0F )) && (0 == (utf8[i+1] & 0x20 ) )) + return 0; + } else if(UTF8_4Bytes(utf8[i])) { + clen = 4; + /* No enough trail bytes */ + if( (i + clen) > len) + return 0; + /* 0000 0000 - 0000 FFFF : should encode in less bytes */ + if((0 == (utf8[i] & 0x07 )) && (0 == (utf8[i+1] & 0x30 )) ) + return 0; + } else if(UTF8_5Bytes(utf8[i])) { + clen = 5; + /* No enough trail bytes */ + if( (i + clen) > len) + return 0; + /* 0000 0000 - 001F FFFF : should encode in less bytes */ + if((0 == (utf8[i] & 0x03 )) && (0 == (utf8[i+1] & 0x38 )) ) + return 0; + } else if(UTF8_6Bytes(utf8[i])) { + clen = 6; + /* No enough trail bytes */ + if( (i + clen) > len) + return 0; + /* 0000 0000 - 03FF FFFF : should encode in less bytes */ + if((0 == (utf8[i] & 0x01 )) && (0 == (utf8[i+1] & 0x3E )) ) + return 0; + } else { + return 0; + } + for(j = 1; j /dev/null):return(true) + return(false) +} diff --git a/src/libcommuni/src/3rdparty/qblowfish/LICENSE b/src/libcommuni/src/3rdparty/qblowfish/LICENSE new file mode 100644 index 0000000..db148cb --- /dev/null +++ b/src/libcommuni/src/3rdparty/qblowfish/LICENSE @@ -0,0 +1,23 @@ +QBlowfish is licensed under the MIT License + +Copyright © 2012 Roopesh Chander + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject +to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/libcommuni/src/3rdparty/qblowfish/README.md b/src/libcommuni/src/3rdparty/qblowfish/README.md new file mode 100644 index 0000000..fb961bb --- /dev/null +++ b/src/libcommuni/src/3rdparty/qblowfish/README.md @@ -0,0 +1,28 @@ +# QBlowfish + +QBlowfish is a [Qt](http://qt.nokia.com/) implementation of the [Blowfish](http://www.schneier.com/blowfish.html) encryption algorithm, as described in the original Blowfish [paper](http://www.schneier.com/paper-blowfish-fse.html) by Bruce Schneier. + +The Blowfish algorithm requires the input in 8-byte blocks. To simplify usage, QBlowfish can optionally add [PKCS5 padding](http://tools.ietf.org/html/rfc5652#section-6.3) to the input data. (For example, if the input is only 60 bytes long, 4 bytes will be padded to bring the bytecount to a multiple of 8.) When padding is enabled during decryption, QBlowfish will also remove the padded bytes from the output. + +You only need to add 3 files (src/*) to your project. You can then use the QBlowfish class to encrypt and decrypt stuff. + + QByteArray secretKey("This is a secret") + QString clearText("Stuff to encrypt"); + + QBlowfish bf(secretKey); + bf.setPaddingEnabled(true); + QByteArray encryptedBa = bf.encrypted(clearText.toUtf8()); + +A more detailed example is included in the repo. + +QBlowfish is not optimized for speed. It processes the data in bytes (most other Blowfish implementations seem to work on 4-byte words) and is endianness-agnostic. + +### Tests + +Unit tests are written using QTestLib. Tests include [the official test vectors](http://www.schneier.com/code/vectors.txt). + +QBlowfish has been tested with Qt 4.8 on Windows and Linux. + +### License + +QBlowfish is published under the MIT license. diff --git a/src/libcommuni/src/3rdparty/qblowfish/qblowfish.cpp b/src/libcommuni/src/3rdparty/qblowfish/qblowfish.cpp new file mode 100644 index 0000000..605ff24 --- /dev/null +++ b/src/libcommuni/src/3rdparty/qblowfish/qblowfish.cpp @@ -0,0 +1,277 @@ +/* + This file is part of QBlowfish and is licensed under the MIT License + + Copyright (C) 2012 Roopesh Chander + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject + to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "qblowfish.h" +#include "qblowfish_p.h" +#include +#include + +QBlowfish::QBlowfish(const QByteArray &key) + : m_key(key) + , m_initialized(false) + , m_paddingEnabled(false) +{ +} + +void QBlowfish::setPaddingEnabled(bool enabled) +{ + m_paddingEnabled = enabled; +} + +bool QBlowfish::isPaddingEnabled() const +{ + return m_paddingEnabled; +} + +QByteArray QBlowfish::encrypted(const QByteArray &_clearText) +{ + QByteArray clearText(_clearText); + if (clearText.isEmpty()) { + return QByteArray(); + } + + if (isPaddingEnabled()) { + // Add padding as per PKCS5 + // Ref: RFC 5652 http://tools.ietf.org/html/rfc5652#section-6.3 + quint8 paddingLength = 8 - (clearText.size() % 8); + QByteArray paddingBa(paddingLength, static_cast(paddingLength)); + clearText.append(paddingBa); + } else { + if (clearText.size() % 8 != 0) { + qWarning("Cannot encrypt. Clear-text length is not a multiple of 8 and padding is not enabled."); + return QByteArray(); + } + } + + Q_ASSERT(clearText.size() % 8 == 0); + if ((clearText.size() % 8 == 0) && init()) { + + QByteArray copyBa(clearText.constData(), clearText.size()); + for (int i = 0; i < clearText.size(); i += 8) { + coreEncrypt(copyBa.data() + i); + } + return copyBa; + + } + return QByteArray(); +} + +QByteArray QBlowfish::decrypted(const QByteArray &cipherText) +{ + if (cipherText.isEmpty()) { + return QByteArray(); + } + + Q_ASSERT(cipherText.size() % 8 == 0); + if ((cipherText.size() % 8 == 0) && init()) { + + QByteArray copyBa(cipherText.constData(), cipherText.size()); + for (int i = 0; i < cipherText.size(); i += 8) { + coreDecrypt(copyBa.data() + i); + } + + if (isPaddingEnabled()) { + // Remove padding as per PKCS5 + quint8 paddingLength = static_cast(copyBa.right(1).at(0)); + QByteArray paddingBa(paddingLength, static_cast(paddingLength)); + if (copyBa.right(paddingLength) == paddingBa) { + return copyBa.left(copyBa.length() - paddingLength); + } + return QByteArray(); + } + return copyBa; + } + return QByteArray(); +} + +/* + Core encryption code follows. This is an implementation of the Blowfish algorithm as described at: + http://www.schneier.com/paper-blowfish-fse.html +*/ + +bool QBlowfish::init() +{ + if (m_initialized) { + return true; + } + + if (m_key.isEmpty()) { + qWarning("Cannot init. Key is empty."); + return false; + } + + m_sbox1 = QByteArray::fromHex(QByteArray::fromRawData(sbox0, SBOX_SIZE_BYTES * 2)); + m_sbox2 = QByteArray::fromHex(QByteArray::fromRawData(sbox1, SBOX_SIZE_BYTES * 2)); + m_sbox3 = QByteArray::fromHex(QByteArray::fromRawData(sbox2, SBOX_SIZE_BYTES * 2)); + m_sbox4 = QByteArray::fromHex(QByteArray::fromRawData(sbox3, SBOX_SIZE_BYTES * 2)); + m_parray = QByteArray::fromHex(QByteArray::fromRawData(parray, PARRAY_SIZE_BYTES * 2)); + + const QByteArray &key = m_key; + int keyLength = key.length(); + for (int i = 0; i < PARRAY_SIZE_BYTES; i++) { + m_parray[i] = static_cast(static_cast(m_parray[i]) ^ static_cast(key[i % keyLength])); + } + + char seed[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + // Update p-array + for (int i = 0; i < (PARRAY_SIZE_BYTES / 4); i += 2) { + coreEncrypt(seed); + for (int j = 0; j < 8; j++) { + // P1 = xL; P2 = xR + m_parray[i * 4 + j] = seed[j]; + } + } + + // Update s-boxes + for (int sboxIndex = 1; sboxIndex <= 4; sboxIndex++) { + QByteArray *sbox = 0; + switch (sboxIndex) { + case 1: sbox = &m_sbox1; break; + case 2: sbox = &m_sbox2; break; + case 3: sbox = &m_sbox3; break; + case 4: sbox = &m_sbox4; break; + default: Q_ASSERT(false); + } + Q_ASSERT(sbox != 0); + + for (int i = 0; i < (SBOX_SIZE_BYTES / 4); i += 2) { + coreEncrypt(seed); + for (int j = 0; j < 8; j++) { + // S1,1 = xL; S1,2 = xR + sbox->operator[](i * 4 + j) = seed[j]; + } + } + } + + m_initialized = true; + return true; +} + +void QBlowfish::coreEncrypt(char *x) // encrypts 8 bytes pointed to by x, result is written to the same location +{ + // Divide x into two 32-bit halves: xL, xR + char *xL = x; + char *xR = x + 4; + uchar f_xL_bytes[4] = { 0, 0, 0, 0 }; + + for (int i = 0; i < 16; i++) { + + // xL = xL XOR Pi + for (int j = 0; j < 4; j++) { + // quint8 old_xL = xL[j]; + xL[j] = static_cast(static_cast(xL[j]) ^ static_cast(m_parray[i * 4 + j])); + } + + // Divide xL into four eight-bit quarters: a, b, c, and d + quint8 a = static_cast(xL[0]); + quint8 b = static_cast(xL[1]); + quint8 c = static_cast(xL[2]); + quint8 d = static_cast(xL[3]); + + // F(xL) = ((S1,a + S2,b mod 2**32) XOR S3,c) + S4,d mod 2**32 + quint32 s1a = qFromBigEndian(reinterpret_cast(m_sbox1.constData() + a * 4)); + quint32 s2b = qFromBigEndian(reinterpret_cast(m_sbox2.constData() + b * 4)); + quint32 s3c = qFromBigEndian(reinterpret_cast(m_sbox3.constData() + c * 4)); + quint32 s4d = qFromBigEndian(reinterpret_cast(m_sbox4.constData() + d * 4)); + quint32 f_xL = ((((s1a + s2b) & 0xffffffff) ^ s3c) + s4d) & 0xffffffff; + qToBigEndian(f_xL, f_xL_bytes); + + // xR = F(xL) XOR xR + for (int j = 0; j < 4; j++) { + xR[j] = static_cast(static_cast(f_xL_bytes[j]) ^ static_cast(xR[j])); + } + + // Swap xL and xR, but not in the last iteration + if (i != 15) { + for (int j = 0; j < 4; j++) { + char temp = xL[j]; + xL[j] = xR[j]; + xR[j] = temp; + } + } + + } + + // xR = xR XOR P17 + // xL = xL XOR P18 + for (int j = 0; j < 4; j++) { + xR[j] = static_cast(static_cast(xR[j]) ^ static_cast(m_parray[16 * 4 + j])); + xL[j] = static_cast(static_cast(xL[j]) ^ static_cast(m_parray[17 * 4 + j])); + } +} + +void QBlowfish::coreDecrypt(char *x) // decrypts 8 bytes pointed to by x, result is written to the same location +{ + // Divide x into two 32-bit halves: xL, xR + char *xL = x; + char *xR = x + 4; + uchar f_xL_bytes[4] = { 0, 0, 0, 0 }; + + // xL = xL XOR P18 + // xR = xR XOR P17 + for (int j = 0; j < 4; j++) { + xL[j] = static_cast(static_cast(xL[j]) ^ static_cast(m_parray[17 * 4 + j])); + xR[j] = static_cast(static_cast(xR[j]) ^ static_cast(m_parray[16 * 4 + j])); + } + + for (int i = 15; i >= 0; i--) { + + // Swap xL and xR, but not in the first iteration + if (i != 15) { + for (int j = 0; j < 4; j++) { + char temp = xL[j]; + xL[j] = xR[j]; + xR[j] = temp; + } + } + + // Divide xL into four eight-bit quarters: a, b, c, and d + quint8 a = static_cast(xL[0]); + quint8 b = static_cast(xL[1]); + quint8 c = static_cast(xL[2]); + quint8 d = static_cast(xL[3]); + + // F(xL) = ((S1,a + S2,b mod 2**32) XOR S3,c) + S4,d mod 2**32 + quint32 s1a = qFromBigEndian(reinterpret_cast(m_sbox1.constData() + a * 4)); + quint32 s2b = qFromBigEndian(reinterpret_cast(m_sbox2.constData() + b * 4)); + quint32 s3c = qFromBigEndian(reinterpret_cast(m_sbox3.constData() + c * 4)); + quint32 s4d = qFromBigEndian(reinterpret_cast(m_sbox4.constData() + d * 4)); + quint32 f_xL = ((((s1a + s2b) & 0xffffffff) ^ s3c) + s4d) & 0xffffffff; + qToBigEndian(f_xL, f_xL_bytes); + + // xR = F(xL) XOR xR + for (int j = 0; j < 4; j++) { + xR[j] = static_cast(static_cast(f_xL_bytes[j]) ^ static_cast(xR[j])); + } + + // xL = xL XOR Pi + for (int j = 0; j < 4; j++) { + xL[j] = static_cast(static_cast(xL[j]) ^ static_cast(m_parray[i * 4 + j])); + } + + } +} diff --git a/src/libcommuni/src/3rdparty/qblowfish/qblowfish.h b/src/libcommuni/src/3rdparty/qblowfish/qblowfish.h new file mode 100644 index 0000000..100a2e6 --- /dev/null +++ b/src/libcommuni/src/3rdparty/qblowfish/qblowfish.h @@ -0,0 +1,46 @@ +#ifndef QBLOWFISH_H +#define QBLOWFISH_H + +#include + +class QBlowfish +{ +public: + QBlowfish(const QByteArray &key); + bool init(); + + // Padding: + // + // Blowfish works on 8-byte blocks. Padding makes it usable even + // in case where the input size is not in exact 8-byte blocks. + // + // If padding is disabled (the default), encrypted() will work only if the + // input size (in bytes) is a multiple of 8. (If it's not a multiple of 8, + // encrypted() will return a null bytearray.) + // + // If padding is enabled, we increase the input length to a multiple of 8 + // by padding bytes as per PKCS5 + // + // If padding was enabled during encryption, it should be enabled during + // decryption for correct decryption (and vice versa). + + void setPaddingEnabled(bool enabled); + bool isPaddingEnabled() const; + + // Encrypt / decrypt + QByteArray encrypted(const QByteArray &clearText); + QByteArray decrypted(const QByteArray &cipherText); + +private: + // core encrypt/decrypt methods, encrypts/decrypts in-place + void coreEncrypt(char *x); + void coreDecrypt(char *x); + + QByteArray m_key; + bool m_initialized; + bool m_paddingEnabled; + QByteArray m_parray; + QByteArray m_sbox1, m_sbox2, m_sbox3, m_sbox4; +}; + +#endif // QBLOWFISH_H diff --git a/src/libcommuni/src/3rdparty/qblowfish/qblowfish.pri b/src/libcommuni/src/3rdparty/qblowfish/qblowfish.pri new file mode 100644 index 0000000..5d01670 --- /dev/null +++ b/src/libcommuni/src/3rdparty/qblowfish/qblowfish.pri @@ -0,0 +1,11 @@ +###################################################################### +# Communi +###################################################################### + +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD + +HEADERS += $$PWD/qblowfish.h +HEADERS += $$PWD/qblowfish_p.h + +SOURCES += $$PWD/qblowfish.cpp diff --git a/src/libcommuni/src/3rdparty/qblowfish/qblowfish_p.h b/src/libcommuni/src/3rdparty/qblowfish/qblowfish_p.h new file mode 100644 index 0000000..3e15083 --- /dev/null +++ b/src/libcommuni/src/3rdparty/qblowfish/qblowfish_p.h @@ -0,0 +1,201 @@ +/* + Source: http://www.schneier.com/code/constants.txt +*/ + +#ifndef Q_BLOWFISH_P_H +#define Q_BLOWFISH_P_H + +#define SBOX_SIZE_BYTES (256 * 4) +#define PARRAY_SIZE_BYTES (18 * 4) + +char sbox0[] = + "d1310ba698dfb5ac2ffd72dbd01adfb7b8e1afed6a267e96" + "ba7c9045f12c7f9924a19947b3916cf70801f2e2858efc16" + "636920d871574e69a458fea3f4933d7e0d95748f728eb658" + "718bcd5882154aee7b54a41dc25a59b59c30d5392af26013" + "c5d1b023286085f0ca417918b8db38ef8e79dcb0603a180e" + "6c9e0e8bb01e8a3ed71577c1bd314b2778af2fda55605c60" + "e65525f3aa55ab945748986263e8144055ca396a2aab10b6" + "b4cc5c341141e8cea15486af7c72e993b3ee1411636fbc2a" + "2ba9c55d741831f6ce5c3e169b87931eafd6ba336c24cf5c" + "7a325381289586773b8f48986b4bb9afc4bfe81b66282193" + "61d809ccfb21a991487cac605dec8032ef845d5de98575b1" + "dc262302eb651b8823893e81d396acc50f6d6ff383f44239" + "2e0b4482a484200469c8f04a9e1f9b5e21c66842f6e96c9a" + "670c9c61abd388f06a51a0d2d8542f68960fa728ab5133a3" + "6eef0b6c137a3be4ba3bf0507efb2a98a1f1651d39af0176" + "66ca593e82430e888cee8619456f9fb47d84a5c33b8b5ebe" + "e06f75d885c12073401a449f56c16aa64ed3aa62363f7706" + "1bfedf72429b023d37d0d724d00a1248db0fead349f1c09b" + "075372c980991b7b25d479d8f6e8def7e3fe501ab6794c3b" + "976ce0bd04c006bac1a94fb6409f60c45e5c9ec2196a2463" + "68fb6faf3e6c53b51339b2eb3b52ec6f6dfc511f9b30952c" + "cc814544af5ebd09bee3d004de334afd660f2807192e4bb3" + "c0cba85745c8740fd20b5f39b9d3fbdb5579c0bd1a60320a" + "d6a100c6402c7279679f25fefb1fa3cc8ea5e9f8db3222f8" + "3c7516dffd616b152f501ec8ad0552ab323db5fafd238760" + "53317b483e00df829e5c57bbca6f8ca01a87562edf1769db" + "d542a8f6287effc3ac6732c68c4f5573695b27b0bbca58c8" + "e1ffa35db8f011a010fa3d98fd2183b84afcb56c2dd1d35b" + "9a53e479b6f84565d28e49bc4bfb9790e1ddf2daa4cb7e33" + "62fb1341cee4c6e8ef20cada36774c01d07e9efe2bf11fb4" + "95dbda4dae909198eaad8e716b93d5a0d08ed1d0afc725e0" + "8e3c5b2f8e7594b78ff6e2fbf2122b648888b812900df01c" + "4fad5ea0688fc31cd1cff191b3a8c1ad2f2f2218be0e1777" + "ea752dfe8b021fa1e5a0cc0fb56f74e818acf3d6ce89e299" + "b4a84fe0fd13e0b77cc43b81d2ada8d9165fa26680957705" + "93cc7314211a1477e6ad206577b5fa86c75442f5fb9d35cf" + "ebcdaf0c7b3e89a0d6411bd3ae1e7e4900250e2d2071b35e" + "226800bb57b8e0af2464369bf009b91e5563911d59dfa6aa" + "78c14389d95a537f207d5ba202e5b9c5832603766295cfa9" + "11c819684e734a41b3472dca7b14a94a1b5100529a532915" + "d60f573fbc9bc6e42b60a47681e6740008ba6fb5571be91f" + "f296ec6b2a0dd915b6636521e7b9f9b6ff34052ec5855664" + "53b02d5da99f8fa108ba47996e85076a" +; + +char sbox1[] = + "4b7a70e9b5b32944db75092ec4192623ad6ea6b049a7df7d" + "9cee60b88fedb266ecaa8c71699a17ff5664526cc2b19ee1" + "193602a575094c29a0591340e4183a3e3f54989a5b429d65" + "6b8fe4d699f73fd6a1d29c07efe830f54d2d38e6f0255dc1" + "4cdd20868470eb266382e9c6021ecc5e09686b3f3ebaefc9" + "3c9718146b6a70a1687f358452a0e286b79c5305aa500737" + "3e07841c7fdeae5c8e7d44ec5716f2b8b03ada37f0500c0d" + "f01c1f040200b3ffae0cf51a3cb574b225837a58dc0921bd" + "d19113f97ca92ff69432477322f547013ae5e58137c2dadc" + "c8b576349af3dda7a94461460fd0030eecc8c73ea4751e41" + "e238cd993bea0e2f3280bba1183eb3314e548b384f6db908" + "6f420d03f60a04bf2cb8129024977c795679b072bcaf89af" + "de9a771fd9930810b38bae12dccf3f2e5512721f2e6b7124" + "501adde69f84cd877a5847187408da17bc9f9abce94b7d8c" + "ec7aec3adb851dfa63094366c464c3d2ef1c18473215d908" + "dd433b3724c2ba1612a14d432a65c45150940002133ae4dd" + "71dff89e10314e5581ac77d65f11199b043556f1d7a3c76b" + "3c11183b5924a509f28fe6ed97f1fbfa9ebabf2c1e153c6e" + "86e34570eae96fb1860e5e0a5a3e2ab3771fe71c4e3d06fa" + "2965dcb999e71d0f803e89d65266c8252e4cc9789c10b36a" + "c6150eba94e2ea78a5fc3c531e0a2df4f2f74ea7361d2b3d" + "1939260f19c279605223a708f71312b6ebadfe6eeac31f66" + "e3bc4595a67bc883b17f37d1018cff28c332ddefbe6c5aa5" + "6558218568ab9802eecea50fdb2f953b2aef7dad5b6e2f84" + "1521b62829076170ecdd4775619f151013cca830eb61bd96" + "0334fe1eaa0363cfb5735c904c70a239d59e9e0bcbaade14" + "eecc86bc60622ca79cab5cabb2f3846e648b1eaf19bdf0ca" + "a02369b9655abb5040685a323c2ab4b3319ee9d5c021b8f7" + "9b540b19875fa09995f7997e623d7da8f837889a97e32d77" + "11ed935f166812810e358829c7e61fd696dedfa17858ba99" + "57f584a51b2272639b83c3ff1ac24696cdb30aeb532e3054" + "8fd948e46dbc312858ebf2ef34c6ffeafe28ed61ee7c3c73" + "5d4a14d9e864b7e342105d14203e13e045eee2b6a3aaabea" + "db6c4f15facb4fd0c742f442ef6abbb5654f3b1d41cd2105" + "d81e799e86854dc7e44b476a3d816250cf62a1f25b8d2646" + "fc8883a0c1c7b6a37f1524c369cb749247848a0b5692b285" + "095bbf00ad19489d1462b17423820e0058428d2a0c55f5ea" + "1dadf43e233f70613372f0928d937e41d65fecf16c223bdb" + "7cde3759cbee74604085f2a7ce77326ea607808419f8509e" + "e8efd85561d99735a969a7aac50c06c25a04abfc800bcadc" + "9e447a2ec3453484fdd567050e1e9ec9db73dbd3105588cd" + "675fda79e3674340c5c43465713e38d83d28f89ef16dff20" + "153e21e78fb03d4ae6e39f2bdb83adf7" +; + +char sbox2[] = + "e93d5a68948140f7f64c261c94692934411520f77602d4f7" + "bcf46b2ed4a20068d40824713320f46a43b7d4b7500061af" + "1e39f62e9724454614214f74bf8b88404d95fc1d96b591af" + "70f4ddd366a02f45bfbc09ec03bd97857fac6dd031cb8504" + "96eb27b355fd3941da2547e6abca0a9a28507825530429f4" + "0a2c86dae9b66dfb68dc1462d7486900680ec0a427a18dee" + "4f3ffea2e887ad8cb58ce0067af4d6b6aace1e7cd3375fec" + "ce78a399406b2a4220fe9e35d9f385b9ee39d7ab3b124e8b" + "1dc9faf74b6d185626a36631eae397b23a6efa74dd5b4332" + "6841e7f7ca7820fbfb0af54ed8feb397454056acba489527" + "55533a3a20838d87fe6ba9b7d096954b55a867bca1159a58" + "cca9296399e1db33a62a4a563f3125f95ef47e1c9029317c" + "fdf8e80204272f7080bb155c05282ce395c11548e4c66d22" + "48c1133fc70f86dc07f9c9ee41041f0f404779a45d886e17" + "325f51ebd59bc0d1f2bcc18f41113564257b7834602a9c60" + "dff8e8a31f636c1b0e12b4c202e1329eaf664fd1cad18115" + "6b2395e0333e92e13b240b62eebeb92285b2a20ee6ba0d99" + "de720c8c2da2f728d012784595b794fd647d0862e7ccf5f0" + "5449a36f877d48fac39dfd27f33e8d1e0a476341992eff74" + "3a6f6eabf4f8fd37a812dc60a1ebddf8991be14cdb6e6b0d" + "c67b55106d672c372765d43bdcd0e804f1290dc7cc00ffa3" + "b5390f92690fed0b667b9ffbcedb7d9ca091cf0bd9155ea3" + "bb132f88515bad247b9479bf763bd6eb37392eb3cc115979" + "8026e297f42e312d6842ada7c66a2b3b12754ccc782ef11c" + "6a124237b79251e706a1bbe64bfb63501a6b101811caedfa" + "3d25bdd8e2e1c3c9444216590a121386d90cec6ed5abea2a" + "64af674eda86a85fbebfe98864e4c3fe9dbc8057f0f7c086" + "60787bf86003604dd1fd8346f6381fb07745ae04d736fccc" + "83426b33f01eab71b08041873c005e5f77a057bebde8ae24" + "55464299bf582e614e58f48ff2ddfda2f474ef388789bdc2" + "5366f9c3c8b38e74b475f25546fcd9b97aeb26618b1ddf84" + "846a0e79915f95e2466e598e20b457708cd55591c902de4c" + "b90bace1bb8205d011a862487574a99eb77f19b6e0a9dc09" + "662d09a1c4324633e85a1f0209f0be8c4a99a0251d6efe10" + "1ab93d1d0ba5a4dfa186f20f2868f169dcb7da83573906fe" + "a1e2ce9b4fcd7f5250115e01a70683faa002b5c40de6d027" + "9af88c27773f8641c3604c0661a806b5f0177a28c0f586e0" + "006058aa30dc7d6211e69ed72338ea6353c2dd94c2c21634" + "bbcbee5690bcb6deebfc7da1ce591d766f05e4094b7c0188" + "39720a3d7c927c2486e3725f724d9db91ac15bb4d39eb8fc" + "ed54557808fca5b5d83d7cd34dad0fc41e50ef5eb161e6f8" + "a28514d96c51133c6fd5c7e756e14ec4362abfceddc6c837" + "d79a323492638212670efa8e406000e0" +; + +char sbox3[] = + "3a39ce37d3faf5cfabc277375ac52d1b5cb0679e4fa33742" + "d382274099bc9bbed5118e9dbf0f7315d62d1c7ec700c47b" + "b78c1b6b21a19045b26eb1be6a366eb45748ab2fbc946e79" + "c6a376d26549c2c8530ff8ee468dde7dd5730a1d4cd04dc6" + "2939bbdba9ba4650ac9526e8be5ee304a1fad5f06a2d519a" + "63ef8ce29a86ee22c089c2b843242ef6a51e03aa9cf2d0a4" + "83c061ba9be96a4d8fe51550ba645bd62826a2f9a73a3ae1" + "4ba99586ef5562e9c72fefd3f752f7da3f046f6977fa0a59" + "80e4a91587b086019b09e6ad3b3ee593e990fd5a9e34d797" + "2cf0b7d9022b8b5196d5ac3a017da67dd1cf3ed67c7d2d28" + "1f9f25cfadf2b89b5ad6b4725a88f54ce029ac71e019a5e6" + "47b0acfded93fa9be8d3c48d283b57ccf8d5662979132e28" + "785f0191ed756055f7960e44e3d35e8c15056dd488f46dba" + "03a161250564f0bdc3eb9e153c9057a297271aeca93a072a" + "1b3f6d9b1e6321f5f59c66fb26dcf3197533d928b155fdf5" + "035634828aba3cbb28517711c20ad9f8abcc5167ccad925f" + "4de817513830dc8e379d58629320f991ea7a90c2fb3e7bce" + "5121ce64774fbe32a8b6e37ec3293d4648de53696413e680" + "a2ae0810dd6db22469852dfd09072166b39a460a6445c0dd" + "586cdecf1c20c8ae5bbef7dd1b588d40ccd2017f6bb4e3bb" + "dda26a7e3a59ff453e350a44bcb4cdd572eacea8fa6484bb" + "8d6612aebf3c6f47d29be463542f5d9eaec2771bf64e6370" + "740e0d8de75b1357f8721671af537d5d4040cb084eb4e2cc" + "34d2466a0115af84e1b0042895983a1d06b89fb4ce6ea048" + "6f3f3b823520ab82011a1d4b277227f8611560b1e7933fdc" + "bb3a792b344525bda08839e151ce794b2f32c9b7a01fbac9" + "e01cc87ebcc7d1f6cf0111c3a1e8aac71a908749d44fbd9a" + "d0dadecbd50ada380339c32ac69136678df9317ce0b12b4f" + "f79e59b743f5bb3af2d519ff27d9459cbf97222c15e6fc2a" + "0f91fc719b941525fae59361ceb69cebc2a8645912baa8d1" + "b6c1075ee3056a0c10d25065cb03a442e0ec6e0e1698db3b" + "4c98a0be3278e9649f1f9532e0d392dfd3a0342b8971f21e" + "1b0a74414ba3348cc5be7120c37632d8df359f8d9b992f2e" + "e60b6f470fe3f11de54cda541edad891ce6279cfcd3e7e6f" + "1618b166fd2c1d05848fd2c5f6fb2299f523f357a6327623" + "93a8353156cccd02acf081625a75ebb56e16369788d273cc" + "de96629281b949d04c50901b71c65614e6c6c7bd327a140a" + "45e1d006c3f27b9ac9aa53fd62a80f00bb25bfe235bdd2f6" + "71126905b2040222b6cbcf7ccd769c2b53113ec01640e3d3" + "38abbd602547adf0ba38209cf746ce7677afa1c520756060" + "85cbfe4e8ae88dd87aaaf9b04cf9aa7e1948c25c02fb8a8c" + "01c36ae4d6ebe1f990d4f869a65cdea03f09252dc208e69f" + "b74e6132ce77e25b578fdfe33ac372e6" +; + +char parray[] = + "243f6a8885a308d313198a2e03707344a4093822299f31d0" + "082efa98ec4e6c89452821e638d01377be5466cf34e90c6c" + "c0ac29b7c97c50dd3f84d5b5b54709179216d5d98979fb1b" +; + +#endif // Q_BLOWFISH_P_H diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS b/src/libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS new file mode 100644 index 0000000..0b87f99 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/AUTHORS @@ -0,0 +1 @@ +BYVoid diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/CMakeLists.txt b/src/libcommuni/src/3rdparty/uchardet-0.0.1/CMakeLists.txt new file mode 100644 index 0000000..0dde2cc --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/CMakeLists.txt @@ -0,0 +1,78 @@ +######## Project settings +cmake_minimum_required(VERSION 2.8) +set (PACKAGE_NAME opencc) +project (${PACKAGE_NAME} CXX) +enable_testing() + +######## Package information +set (PACKAGE_URL http://code.google.com/p/uchardet/) +set (PACKAGE_BUGREPORT http://code.google.com/p/uchardet/issues/entry) +set (UCHARDET_VERSION_MAJOR 0) +set (UCHARDET_VERSION_MINOR 0) +set (UCHARDET_VERSION_REVISION 1) + +if (CMAKE_BUILD_TYPE MATCHES Debug) + set (version_suffix .Debug) +endif (CMAKE_BUILD_TYPE MATCHES Debug) + +set ( + UCHARDET_VERSION + ${UCHARDET_VERSION_MAJOR}.${UCHARDET_VERSION_MINOR}.${UCHARDET_VERSION_REVISION}${version_suffix} +) + +######## Windows + +if (WIN32) + set(CMAKE_SHARED_LIBRARY_PREFIX ${CMAKE_INSTALL_PREFIX}) + set(CMAKE_STATIC_LIBRARY_PREFIX ${CMAKE_INSTALL_PREFIX}) +endif (WIN32) + +######## Directory + +set (DIR_PREFIX ${CMAKE_INSTALL_PREFIX}) +set (DIR_LIBRARY ${DIR_PREFIX}/${CMAKE_SHARED_LIBRARY_PREFIX}) +set (DIR_LIBRARY_STATIC ${DIR_PREFIX}/${CMAKE_STATIC_LIBRARY_PREFIX}) +set (DIR_INCLUDE ${DIR_PREFIX}/include) +set (DIR_SHARE ${DIR_PREFIX}/share) +set (DIR_BIN ${DIR_PREFIX}/bin) +set (DIR_ETC ${DIR_PREFIX}/etc) + +if (DEFINED CMAKE_INSTALL_LIBDIR) + set (DIR_LIBRARY ${CMAKE_INSTALL_LIBDIR}) + set (DIR_LIBRARY_STATIC ${CMAKE_INSTALL_LIBDIR}) +endif (DEFINED CMAKE_INSTALL_LIBDIR) + +if (DEFINED SHARE_INSTALL_PREFIX) + set (DIR_SHARE ${SHARE_INSTALL_PREFIX}) +endif (DEFINED SHARE_INSTALL_PREFIX) + +if (DEFINED INCLUDE_INSTALL_DIR) + set (DIR_INCLUDE ${INCLUDE_INSTALL_DIR}) +endif (DEFINED INCLUDE_INSTALL_DIR) + +if (DEFINED SYSCONF_INSTALL_DIR) + set (DIR_ETC ${SYSCONF_INSTALL_DIR}) +endif (DEFINED SYSCONF_INSTALL_DIR) + +set (DIR_SHARE_UCHARDET ${DIR_SHARE}/opencc) +set (DIR_SHARE_LOCALE ${DIR_SHARE}/locale) + +######## Configuration + +configure_file( + uchardet.pc.in + uchardet.pc + @ONLY +) + +install( + FILES + ${CMAKE_BINARY_DIR}/uchardet.pc + DESTINATION + ${DIR_LIBRARY}/pkgconfig +) + +######## Subdirectories + +add_subdirectory(src) +add_subdirectory(doc) diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/COPYING b/src/libcommuni/src/3rdparty/uchardet-0.0.1/COPYING new file mode 100644 index 0000000..7714141 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/COPYING @@ -0,0 +1,470 @@ + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL b/src/libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL new file mode 100644 index 0000000..8d0ab8f --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/INSTALL @@ -0,0 +1,4 @@ +Execute release.sh or manually make a directory and check in, and execute + cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release && make +Then install + sudo make install diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt b/src/libcommuni/src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt new file mode 100644 index 0000000..f14354e --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/doc/CMakeLists.txt @@ -0,0 +1,6 @@ +install( + FILES + uchardet.1 + DESTINATION + ${DIR_SHARE}/man/man1 +) diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/doc/uchardet.1 b/src/libcommuni/src/3rdparty/uchardet-0.0.1/doc/uchardet.1 new file mode 100644 index 0000000..7d187fe --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/doc/uchardet.1 @@ -0,0 +1,18 @@ +.TH UCHARDET "1" "July 2011" "uchardet " "User Commands" +.SH NAME +uchardet \- universalchardet (Universal Charset Detector) +.SH DESCRIPTION +uchardet Command Line Tool +.SS "Usage:" +.HP +uchardet [\fBOptions\fR] [\fBFile\fR] +.HP +\fB\-v\fR +Print version and build information. +.HP +\fB\-h\fR +Print help text. +.HP +.IP +.PP +uchardet Command Line Tool diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/script/debug.sh b/src/libcommuni/src/3rdparty/uchardet-0.0.1/script/debug.sh new file mode 100644 index 0000000..f85d69b --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/script/debug.sh @@ -0,0 +1,9 @@ +mkdir --parents debug \ +&& cd debug + +cmake \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_INSTALL_PREFIX=`pwd`/root \ + .. \ +&& make \ +&& make install diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/script/release.sh b/src/libcommuni/src/3rdparty/uchardet-0.0.1/script/release.sh new file mode 100644 index 0000000..21a5f6e --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/script/release.sh @@ -0,0 +1,8 @@ +mkdir --parents release \ +&& cd release + +cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + .. \ +&& make diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/script/win32.sh b/src/libcommuni/src/3rdparty/uchardet-0.0.1/script/win32.sh new file mode 100644 index 0000000..b757380 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/script/win32.sh @@ -0,0 +1,7 @@ +mkdir --parents win32 \ +&& cd win32 \ +&& cmake .. \ + -G "MSYS Makefiles" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="" \ +&& make \ No newline at end of file diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab new file mode 100644 index 0000000..fd6b0e0 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/Big5Freq.tab @@ -0,0 +1,943 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// Big5 frequency table +// by Taiwan's Mandarin Promotion Council +// + +/****************************************************************************** + * 128 --> 0.42261 + * 256 --> 0.57851 + * 512 --> 0.74851 + * 1024 --> 0.89384 + * 2048 --> 0.97583 + * + * Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 + * Random Distribution Ration = 512/(5401-512)=0.105 + * + * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + *****************************************************************************/ + +#define BIG5_TYPICAL_DISTRIBUTION_RATIO (float)0.75 + + +//Char to FreqOrder table , +#define BIG5_TABLE_SIZE 5376 + +static const PRInt16 Big5CharToFreqOrder[] = +{ + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, // 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, // 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, // 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, // 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, // 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, // 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, // 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, // 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, // 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, // 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, // 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, // 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, // 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, // 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, // 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, // 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, // 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, // 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, // 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, // 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, // 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, // 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, // 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, // 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, // 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, // 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, // 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, // 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, // 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, // 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, // 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, // 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, // 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, // 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, // 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, // 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, // 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, // 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, // 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, // 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, // 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, // 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, // 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, // 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, // 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, // 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, // 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, // 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, // 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, // 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, // 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, // 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, // 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, // 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, // 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, // 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, // 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, // 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, // 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, // 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, // 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, // 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, // 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, // 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, // 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, // 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, // 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, // 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, // 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, // 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, // 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, // 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, // 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, // 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, // 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, // 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, // 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, // 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, // 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, // 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, // 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, // 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, // 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, // 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, // 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, // 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, // 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, // 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, // 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, // 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, // 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, // 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, // 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, // 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, // 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, // 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, // 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, // 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, // 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, // 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, // 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, // 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, // 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, // 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, // 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, // 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, // 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, // 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, // 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, // 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, // 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, // 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, // 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, // 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, // 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, // 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, // 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, // 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, // 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, // 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, // 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, // 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, // 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, // 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, // 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, // 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, // 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, // 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, // 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, // 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, // 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, // 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, // 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, // 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, // 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, // 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, // 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, // 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, // 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, // 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, // 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, // 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, // 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, // 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, // 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, // 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, // 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, // 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, // 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, // 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, // 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, // 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, // 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, // 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, // 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, // 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, // 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, // 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, // 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, // 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, // 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, // 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, // 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, // 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, // 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, // 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, // 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, // 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, // 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, // 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, // 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, // 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, // 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, // 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, // 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, // 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, // 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, // 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, // 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, // 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, // 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, // 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, // 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, // 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, // 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, // 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, // 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, // 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, // 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, // 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, // 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, // 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, // 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, // 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, // 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, // 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, // 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, // 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, // 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, // 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, // 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, // 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, // 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, // 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, // 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, // 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, // 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, // 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, // 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, // 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, // 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, // 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, // 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, // 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, // 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, // 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, // 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, // 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, // 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, // 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, // 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, // 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, // 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, // 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, // 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, // 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, // 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, // 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, // 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, // 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, // 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, // 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, // 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, // 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, // 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, // 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, // 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, // 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, // 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, // 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, // 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, // 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, // 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, // 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, // 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, // 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, // 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, // 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, // 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, // 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, // 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, // 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, // 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, // 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, // 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, // 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, // 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, // 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, // 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, // 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, // 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, // 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, // 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, // 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, // 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, // 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, // 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, // 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, // 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, // 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, // 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, // 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, // 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, // 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, // 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, // 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, // 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, // 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, // 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, // 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, // 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, // 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, // 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, // 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, // 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, // 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, // 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, // 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, // 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, // 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, // 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, // 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, // 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, // 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, // 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, // 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, // 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, // 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, // 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, // 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, // 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, // 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, // 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, // 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, // 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, // 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, // 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, // 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, // 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, // 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, // 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, // 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, // 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, // 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, // 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, // 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, // 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, // 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, // 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, // 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, // 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, // 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, // 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, // 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, // 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, // 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, // 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, // 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, // 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, // 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, // 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, // 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, // 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, // 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, // 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, // 5376 //last 512 + +/*************************************************************************************** + *Everything below is of no interest for detection purpose * + *************************************************************************************** + +2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, // 5392 +2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, // 5408 +5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, // 5424 +5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, // 5440 +5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, // 5456 +5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, // 5472 +5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, // 5488 +5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, // 5504 +5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, // 5520 +5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, // 5536 +5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, // 5552 +5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, // 5568 +5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, // 5584 +5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, // 5600 +6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, // 5616 +6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, // 5632 +6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, // 5648 +6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, // 5664 +6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, // 5680 +6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, // 5696 +6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, // 5712 +6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, // 5728 +6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, // 5744 +6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, // 5760 +6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, // 5776 +6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, // 5792 +6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, // 5808 +6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, // 5824 +6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, // 5840 +6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, // 5856 +6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, // 5872 +6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, // 5888 +6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, // 5904 +6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, // 5920 +6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, // 5936 +6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, // 5952 +6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, // 5968 +6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, // 5984 +6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, // 6000 +6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, // 6016 +6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, // 6032 +6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, // 6048 +6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, // 6064 +6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, // 6080 +6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, // 6096 +6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, // 6112 +6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, // 6128 +6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, // 6144 +6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, // 6160 +6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, // 6176 +6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, // 6192 +6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, // 6208 +6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, // 6224 +6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, // 6240 +6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, // 6256 +3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, // 6272 +6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, // 6288 +6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, // 6304 +3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, // 6320 +6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, // 6336 +6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, // 6352 +6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, // 6368 +6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, // 6384 +6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, // 6400 +6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, // 6416 +6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, // 6432 +4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, // 6448 +6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, // 6464 +6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, // 6480 +3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, // 6496 +6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, // 6512 +6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, // 6528 +6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, // 6544 +6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, // 6560 +6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, // 6576 +6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, // 6592 +6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, // 6608 +6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, // 6624 +6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, // 6640 +6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, // 6656 +6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, // 6672 +7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, // 6688 +7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, // 6704 +7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, // 6720 +7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, // 6736 +7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, // 6752 +7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, // 6768 +7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, // 6784 +7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, // 6800 +7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, // 6816 +7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, // 6832 +7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, // 6848 +7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, // 6864 +7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, // 6880 +7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, // 6896 +7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, // 6912 +7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, // 6928 +7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, // 6944 +7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, // 6960 +7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, // 6976 +7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, // 6992 +7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, // 7008 +7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, // 7024 +7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, // 7040 +7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, // 7056 +7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, // 7072 +7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, // 7088 +7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, // 7104 +7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, // 7120 +7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, // 7136 +7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, // 7152 +7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, // 7168 +7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, // 7184 +7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, // 7200 +7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, // 7216 +7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, // 7232 +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, // 7248 +7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, // 7264 +7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, // 7280 +7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, // 7296 +7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, // 7312 +7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, // 7328 +7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, // 7344 +7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, // 7360 +7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, // 7376 +7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, // 7392 +7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, // 7408 +7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, // 7424 +7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, // 7440 +3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, // 7456 +7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, // 7472 +7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, // 7488 +7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, // 7504 +7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, // 7520 +4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, // 7536 +7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, // 7552 +7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, // 7568 +7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, // 7584 +7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, // 7600 +7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, // 7616 +7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, // 7632 +7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, // 7648 +7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, // 7664 +7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, // 7680 +7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, // 7696 +7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, // 7712 +8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, // 7728 +8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, // 7744 +8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, // 7760 +8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, // 7776 +8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, // 7792 +8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, // 7808 +8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, // 7824 +8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, // 7840 +8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, // 7856 +8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, // 7872 +8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, // 7888 +8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, // 7904 +8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, // 7920 +8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, // 7936 +8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, // 7952 +8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, // 7968 +8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, // 7984 +8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, // 8000 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, // 8016 +8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, // 8032 +8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, // 8048 +8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, // 8064 +8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, // 8080 +8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, // 8096 +8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, // 8112 +8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, // 8128 +8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, // 8144 +8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, // 8160 +8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, // 8176 +8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, // 8192 +8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, // 8208 +8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, // 8224 +8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, // 8240 +8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, // 8256 +8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, // 8272 +8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, // 8288 +8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, // 8304 +8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, // 8320 +8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, // 8336 +8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, // 8352 +8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, // 8368 +8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, // 8384 +8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, // 8400 +8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, // 8416 +8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, // 8432 +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, // 8448 +8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, // 8464 +8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, // 8480 +8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, // 8496 +8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, // 8512 +8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, // 8528 +8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, // 8544 +8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, // 8560 +8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, // 8576 +8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, // 8592 +8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, // 8608 +8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, // 8624 +8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, // 8640 +8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, // 8656 +8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, // 8672 +8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, // 8688 +4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, // 8704 +8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, // 8720 +8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, // 8736 +8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, // 8752 +8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, // 8768 +9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, // 8784 +9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, // 8800 +9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, // 8816 +9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, // 8832 +9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, // 8848 +9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, // 8864 +9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, // 8880 +9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, // 8896 +9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, // 8912 +9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, // 8928 +9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, // 8944 +9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, // 8960 +9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, // 8976 +9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, // 8992 +9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, // 9008 +9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, // 9024 +9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, // 9040 +9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, // 9056 +9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, // 9072 +9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, // 9088 +9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, // 9104 +9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, // 9120 +9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, // 9136 +9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, // 9152 +9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, // 9168 +9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, // 9184 +9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, // 9200 +9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, // 9216 +9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, // 9232 +9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, // 9248 +9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, // 9264 +9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, // 9280 +9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, // 9296 +9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, // 9312 +9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, // 9328 +9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, // 9344 +9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, // 9360 +9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, // 9376 +3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, // 9392 +9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, // 9408 +9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, // 9424 +9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, // 9440 +4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, // 9456 +9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, // 9472 +9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, // 9488 +9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, // 9504 +9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, // 9520 +9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, // 9536 +9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, // 9552 +9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, // 9568 +9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, // 9584 +9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, // 9600 +9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, // 9616 +9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, // 9632 +9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, // 9648 +9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, // 9664 +9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, // 9680 +9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, // 9696 +9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, // 9712 +9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, // 9728 +9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, // 9744 +9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, // 9760 +9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, // 9776 +9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, // 9792 +9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, // 9808 +9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, // 9824 +10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, // 9840 +10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, // 9856 +10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, // 9872 +10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, // 9888 +10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, // 9904 +10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, // 9920 +10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, // 9936 +10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, // 9952 +10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, // 9968 +4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, // 9984 +10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, //10000 +10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, //10016 +10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, //10032 +10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, //10048 +10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, //10064 +10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, //10080 +10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, //10096 +10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, //10112 +4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, //10128 +10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, //10144 +10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, //10160 +10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, //10176 +10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, //10192 +10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, //10208 +10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, //10224 +10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, //10240 +10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, //10256 +10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, //10272 +10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, //10288 +10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, //10304 +10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, //10320 +10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, //10336 +10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, //10352 +10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, //10368 +10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, //10384 +10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, //10400 +4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, //10416 +10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, //10432 +10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, //10448 +10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, //10464 +10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, //10480 +10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, //10496 +10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, //10512 +10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, //10528 +10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, //10544 +10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, //10560 +10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, //10576 +10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, //10592 +10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, //10608 +10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, //10624 +10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, //10640 +10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, //10656 +10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, //10672 +10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, //10688 +10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, //10704 +10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, //10720 +10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, //10736 +10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, //10752 +10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, //10768 +10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, //10784 +10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, //10800 +10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, //10816 +10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, //10832 +10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, //10848 +10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, //10864 +10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, //10880 +10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, //10896 +11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, //10912 +11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, //10928 +11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, //10944 +4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, //10960 +11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, //10976 +11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, //10992 +11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, //11008 +11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, //11024 +11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, //11040 +11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, //11056 +11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, //11072 +11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, //11088 +11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, //11104 +11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, //11120 +11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, //11136 +11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, //11152 +11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, //11168 +11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, //11184 +11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, //11200 +11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, //11216 +11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, //11232 +11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, //11248 +11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, //11264 +11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, //11280 +11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, //11296 +11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, //11312 +11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, //11328 +11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, //11344 +11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, //11360 +11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, //11376 +11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, //11392 +11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, //11408 +11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, //11424 +11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, //11440 +11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, //11456 +11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, //11472 +4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, //11488 +11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, //11504 +11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, //11520 +11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, //11536 +11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, //11552 +11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, //11568 +11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, //11584 +11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, //11600 +11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, //11616 +11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, //11632 +11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, //11648 +11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, //11664 +11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, //11680 +11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, //11696 +11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, //11712 +11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, //11728 +11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, //11744 +11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, //11760 +11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, //11776 +11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, //11792 +11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, //11808 +11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, //11824 +11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, //11840 +11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, //11856 +11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, //11872 +11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, //11888 +11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, //11904 +11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, //11920 +11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, //11936 +12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, //11952 +12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, //11968 +12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, //11984 +12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, //12000 +12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, //12016 +12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, //12032 +12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, //12048 +12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, //12064 +12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, //12080 +12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, //12096 +12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, //12112 +12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, //12128 +12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, //12144 +12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, //12160 +12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, //12176 +4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, //12192 +4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, //12208 +4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, //12224 +12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, //12240 +12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, //12256 +12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, //12272 +12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, //12288 +12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, //12304 +12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, //12320 +12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, //12336 +12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, //12352 +12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, //12368 +12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, //12384 +12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, //12400 +12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, //12416 +12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, //12432 +12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, //12448 +12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, //12464 +12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, //12480 +12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, //12496 +12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, //12512 +12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, //12528 +12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, //12544 +12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, //12560 +12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, //12576 +12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, //12592 +12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, //12608 +12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, //12624 +12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, //12640 +12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, //12656 +12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, //12672 +12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, //12688 +12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, //12704 +12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, //12720 +12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, //12736 +12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, //12752 +12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, //12768 +12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, //12784 +12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, //12800 +12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, //12816 +12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, //12832 +12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, //12848 +12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, //12864 +12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, //12880 +12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, //12896 +12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, //12912 +12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, //12928 +12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, //12944 +12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, //12960 +12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, //12976 +4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, //12992 +13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, //13008 +13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, //13024 +13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, //13040 +13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, //13056 +13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, //13072 +13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, //13088 +13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, //13104 +4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, //13120 +13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, //13136 +13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, //13152 +13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, //13168 +13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, //13184 +13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, //13200 +13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, //13216 +13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, //13232 +13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, //13248 +13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, //13264 +13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, //13280 +13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, //13296 +13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, //13312 +13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, //13328 +13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, //13344 +13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, //13360 +5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, //13376 +13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, //13392 +13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, //13408 +13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, //13424 +13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, //13440 +13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, //13456 +13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, //13472 +13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, //13488 +13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, //13504 +13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, //13520 +13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, //13536 +13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, //13552 +13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, //13568 +13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, //13584 +13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, //13600 +13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, //13616 +13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, //13632 +13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, //13648 +13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, //13664 +13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, //13680 +13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, //13696 +13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, //13712 +13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, //13728 +13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, //13744 +13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, //13760 +13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, //13776 +13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, //13792 +13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, //13808 +13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, //13824 +13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, //13840 +13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, //13856 +13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, //13872 +13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, //13888 +13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, //13904 +13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, //13920 +13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, //13936 +13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, //13952 +13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, //13968 +13968,13969,13970,13971,13972, //13973 +****************************************************************************************/ +}; diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt new file mode 100644 index 0000000..0b26a3b --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CMakeLists.txt @@ -0,0 +1,106 @@ + +set( + UCHARDET_HEADERS + uchardet.h +) + +set( + UCHARDET_SOURCES + CharDistribution.cpp + JpCntx.cpp + LangBulgarianModel.cpp + LangCyrillicModel.cpp + LangGreekModel.cpp + LangHungarianModel.cpp + LangHebrewModel.cpp + LangThaiModel.cpp + nsHebrewProber.cpp + nsCharSetProber.cpp + nsBig5Prober.cpp + nsEUCJPProber.cpp + nsEUCKRProber.cpp + nsEUCTWProber.cpp + nsEscCharsetProber.cpp + nsEscSM.cpp + nsGB2312Prober.cpp + nsMBCSGroupProber.cpp + nsMBCSSM.cpp + nsSBCSGroupProber.cpp + nsSBCharSetProber.cpp + nsSJISProber.cpp + nsUTF8Prober.cpp + nsLatin1Prober.cpp + nsUniversalDetector.cpp + uchardet.cpp +) + +set (UCHARDET_TARGET libuchardet) +set (UCHARDET_STATIC_TARGET libuchardet_static) + +add_definitions( + -DPKGDATADIR="${DIR_SHARE_OPENCC}" + -DLOCALEDIR="${DIR_SHARE_LOCALE}" + -DVERSION="${UCHARDET_VERSION}" + -DPACKAGE_NAME="${PACKAGE_NAME}" + -Wall +) + +add_library( + ${UCHARDET_TARGET} + SHARED + ${UCHARDET_SOURCES} +) + +add_library( + ${UCHARDET_STATIC_TARGET} + STATIC + ${UCHARDET_SOURCES} +) + +set_target_properties( + ${UCHARDET_TARGET} + ${UCHARDET_STATIC_TARGET} + PROPERTIES + LINKER_LANGUAGE + CXX + OUTPUT_NAME + uchardet + VERSION + 0.0.0 + SOVERSION + 0 +) + +if (CMAKE_BUILD_TYPE MATCHES Debug) + add_definitions( + -O0 + -g3 + ) +endif (CMAKE_BUILD_TYPE MATCHES Debug) + +if (NOT WIN32) +install( + TARGETS + ${UCHARDET_TARGET} + LIBRARY DESTINATION + ${DIR_LIBRARY} +) +endif (NOT WIN32) + +install( + TARGETS + ${UCHARDET_STATIC_TARGET} + ARCHIVE DESTINATION + ${DIR_LIBRARY_STATIC} +) + +install( + FILES + ${UCHARDET_HEADERS} + DESTINATION + ${DIR_INCLUDE}/uchardet +) + +include(symbols.cmake) + +add_subdirectory(tools) diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.cpp new file mode 100644 index 0000000..488d9bc --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.cpp @@ -0,0 +1,109 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "CharDistribution.h" + +#include "JISFreq.tab" +#include "Big5Freq.tab" +#include "EUCKRFreq.tab" +#include "EUCTWFreq.tab" +#include "GB2312Freq.tab" + +#define SURE_YES 0.99f +#define SURE_NO 0.01f + +//return confidence base on received data +float CharDistributionAnalysis::GetConfidence(void) +{ + //if we didn't receive any character in our consideration range, or the + // number of frequent characters is below the minimum threshold, return + // negative answer + if (mTotalChars <= 0 || mFreqChars <= mDataThreshold) + return SURE_NO; + + if (mTotalChars != mFreqChars) { + float r = mFreqChars / ((mTotalChars - mFreqChars) * mTypicalDistributionRatio); + + if (r < SURE_YES) + return r; + } + //normalize confidence, (we don't want to be 100% sure) + return SURE_YES; +} + +EUCTWDistributionAnalysis::EUCTWDistributionAnalysis() +{ + mCharToFreqOrder = EUCTWCharToFreqOrder; + mTableSize = EUCTW_TABLE_SIZE; + mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO; +} + +EUCKRDistributionAnalysis::EUCKRDistributionAnalysis() +{ + mCharToFreqOrder = EUCKRCharToFreqOrder; + mTableSize = EUCKR_TABLE_SIZE; + mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO; +} + +GB2312DistributionAnalysis::GB2312DistributionAnalysis() +{ + mCharToFreqOrder = GB2312CharToFreqOrder; + mTableSize = GB2312_TABLE_SIZE; + mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO; +} + +Big5DistributionAnalysis::Big5DistributionAnalysis() +{ + mCharToFreqOrder = Big5CharToFreqOrder; + mTableSize = BIG5_TABLE_SIZE; + mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO; +} + +SJISDistributionAnalysis::SJISDistributionAnalysis() +{ + mCharToFreqOrder = JISCharToFreqOrder; + mTableSize = JIS_TABLE_SIZE; + mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO; +} + +EUCJPDistributionAnalysis::EUCJPDistributionAnalysis() +{ + mCharToFreqOrder = JISCharToFreqOrder; + mTableSize = JIS_TABLE_SIZE; + mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO; +} + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.h new file mode 100644 index 0000000..945b9ac --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/CharDistribution.h @@ -0,0 +1,242 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef CharDistribution_h__ +#define CharDistribution_h__ + +#include "nscore.h" + +#define ENOUGH_DATA_THRESHOLD 1024 + +#define MINIMUM_DATA_THRESHOLD 4 + +class CharDistributionAnalysis +{ +public: + CharDistributionAnalysis() {Reset(PR_FALSE);} + + //feed a block of data and do distribution analysis + void HandleData(const char* /*aBuf*/, PRUint32 /*aLen*/) {} + + //Feed a character with known length + void HandleOneChar(const char* aStr, PRUint32 aCharLen) + { + PRInt32 order; + + //we only care about 2-bytes character in our distribution analysis + order = (aCharLen == 2) ? GetOrder(aStr) : -1; + + if (order >= 0) + { + mTotalChars++; + //order is valid + if ((PRUint32)order < mTableSize) + { + if (512 > mCharToFreqOrder[order]) + mFreqChars++; + } + } + } + + //return confidence base on existing data + float GetConfidence(void); + + //Reset analyser, clear any state + void Reset(PRBool aIsPreferredLanguage) + { + mDone = PR_FALSE; + mTotalChars = 0; + mFreqChars = 0; + mDataThreshold = aIsPreferredLanguage ? 0 : MINIMUM_DATA_THRESHOLD; + } + + //This function is for future extension. Caller can use this function to control + //analyser's behavior + void SetOpion(){} + + //It is not necessary to receive all data to draw conclusion. For charset detection, + // certain amount of data is enough + PRBool GotEnoughData() {return mTotalChars > ENOUGH_DATA_THRESHOLD;} + +protected: + //we do not handle character base on its original encoding string, but + //convert this encoding string to a number, here called order. + //This allow multiple encoding of a language to share one frequency table + virtual PRInt32 GetOrder(const char* /*str*/) {return -1;} + + //If this flag is set to PR_TRUE, detection is done and conclusion has been made + PRBool mDone; + + //The number of characters whose frequency order is less than 512 + PRUint32 mFreqChars; + + //Total character encounted. + PRUint32 mTotalChars; + + //Number of hi-byte characters needed to trigger detection + PRUint32 mDataThreshold; + + //Mapping table to get frequency order from char order (get from GetOrder()) + const PRInt16 *mCharToFreqOrder; + + //Size of above table + PRUint32 mTableSize; + + //This is a constant value varies from language to language, it is used in + //calculating confidence. See my paper for further detail. + float mTypicalDistributionRatio; +}; + + +class EUCTWDistributionAnalysis: public CharDistributionAnalysis +{ +public: + EUCTWDistributionAnalysis(); +protected: + + //for euc-TW encoding, we are interested + // first byte range: 0xc4 -- 0xfe + // second byte range: 0xa1 -- 0xfe + //no validation needed here. State machine has done that + PRInt32 GetOrder(const char* str) + { if ((unsigned char)*str >= (unsigned char)0xc4) + return 94*((unsigned char)str[0]-(unsigned char)0xc4) + (unsigned char)str[1] - (unsigned char)0xa1; + else + return -1; + } +}; + + +class EUCKRDistributionAnalysis : public CharDistributionAnalysis +{ +public: + EUCKRDistributionAnalysis(); +protected: + //for euc-KR encoding, we are interested + // first byte range: 0xb0 -- 0xfe + // second byte range: 0xa1 -- 0xfe + //no validation needed here. State machine has done that + PRInt32 GetOrder(const char* str) + { if ((unsigned char)*str >= (unsigned char)0xb0) + return 94*((unsigned char)str[0]-(unsigned char)0xb0) + (unsigned char)str[1] - (unsigned char)0xa1; + else + return -1; + } +}; + +class GB2312DistributionAnalysis : public CharDistributionAnalysis +{ +public: + GB2312DistributionAnalysis(); +protected: + //for GB2312 encoding, we are interested + // first byte range: 0xb0 -- 0xfe + // second byte range: 0xa1 -- 0xfe + //no validation needed here. State machine has done that + PRInt32 GetOrder(const char* str) + { if ((unsigned char)*str >= (unsigned char)0xb0 && (unsigned char)str[1] >= (unsigned char)0xa1) + return 94*((unsigned char)str[0]-(unsigned char)0xb0) + (unsigned char)str[1] - (unsigned char)0xa1; + else + return -1; + } +}; + + +class Big5DistributionAnalysis : public CharDistributionAnalysis +{ +public: + Big5DistributionAnalysis(); +protected: + //for big5 encoding, we are interested + // first byte range: 0xa4 -- 0xfe + // second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + //no validation needed here. State machine has done that + PRInt32 GetOrder(const char* str) + { if ((unsigned char)*str >= (unsigned char)0xa4) + if ((unsigned char)str[1] >= (unsigned char)0xa1) + return 157*((unsigned char)str[0]-(unsigned char)0xa4) + (unsigned char)str[1] - (unsigned char)0xa1 +63; + else + return 157*((unsigned char)str[0]-(unsigned char)0xa4) + (unsigned char)str[1] - (unsigned char)0x40; + else + return -1; + } +}; + +class SJISDistributionAnalysis : public CharDistributionAnalysis +{ +public: + SJISDistributionAnalysis(); +protected: + //for sjis encoding, we are interested + // first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + // second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + //no validation needed here. State machine has done that + PRInt32 GetOrder(const char* str) + { + PRInt32 order; + if ((unsigned char)*str >= (unsigned char)0x81 && (unsigned char)*str <= (unsigned char)0x9f) + order = 188 * ((unsigned char)str[0]-(unsigned char)0x81); + else if ((unsigned char)*str >= (unsigned char)0xe0 && (unsigned char)*str <= (unsigned char)0xef) + order = 188 * ((unsigned char)str[0]-(unsigned char)0xe0 + 31); + else + return -1; + order += (unsigned char)*(str+1) - 0x40; + if ((unsigned char)str[1] > (unsigned char)0x7f) + order--; + return order; + } +}; + +class EUCJPDistributionAnalysis : public CharDistributionAnalysis +{ +public: + EUCJPDistributionAnalysis(); +protected: + //for euc-JP encoding, we are interested + // first byte range: 0xa0 -- 0xfe + // second byte range: 0xa1 -- 0xfe + //no validation needed here. State machine has done that + PRInt32 GetOrder(const char* str) + { if ((unsigned char)*str >= (unsigned char)0xa0) + return 94*((unsigned char)str[0]-(unsigned char)0xa1) + (unsigned char)str[1] - (unsigned char)0xa1; + else + return -1; + } +}; + +#endif //CharDistribution_h__ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab new file mode 100644 index 0000000..d2c5047 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCKRFreq.tab @@ -0,0 +1,614 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +//Sampling from about 20M text materials include literature and computer technology + +/****************************************************************************** + * 128 --> 0.79 + * 256 --> 0.92 + * 512 --> 0.986 + * 1024 --> 0.99944 + * 2048 --> 0.99999 + * + * Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 + * Random Distribution Ration = 512 / (2350-512) = 0.279. + * + * Typical Distribution Ratio + *****************************************************************************/ + +#define EUCKR_TYPICAL_DISTRIBUTION_RATIO (float) 6.0 + +#define EUCKR_TABLE_SIZE 2352 + +//Char to FreqOrder table , +static const PRInt16 EUCKRCharToFreqOrder[] = +{ + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, //512, 256 + +/*************************************************************************************** + *Everything below is of no interest for detection purpose * + *************************************************************************************** + +2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, +2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, +2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, +2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, +2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, +2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, +2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, +2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, +2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, +2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, +2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, +2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, +2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, +2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, +1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, +2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, +2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, +2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, +2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, +2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, +2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, +2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, +2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, +2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, +3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, +3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, +3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, +3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, +3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, +3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, +3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, +3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, +3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, +3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, +3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, +3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, +3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, +3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, +3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, +3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, +3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, +3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, +3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, +3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, +3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, +3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, +3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, +3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, +3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, +3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, +3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, +3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, +3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, +3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, +3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, +3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, +1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, +1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, +3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, +3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, +3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, +3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, +3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, +3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, +3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, +3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, +3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, +3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, +3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, +3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, +3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, +1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, +3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, +3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, +3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, +3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, +3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, +3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, +3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, +1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, +3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, +3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, +3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, +3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, +1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, +3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, +3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, +3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, +3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, +3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, +3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, +3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, +4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, +4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, +1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, +4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, +4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, +4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, +4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, +4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, +4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, +4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, +4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, +4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, +4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, +4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, +4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, +4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, +4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, +4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, +4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, +4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, +4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, +4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, +4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, +4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, +4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, +4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, +4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, +4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, +4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, +4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, +4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, +4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, +4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, +4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, +4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, +4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, +4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, +4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, +4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, +4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, +4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, +4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, +4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, +4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, +4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, +1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, +4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, +4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, +4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, +4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, +4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, +4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, +4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, +4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, +4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, +4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, +4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, +4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, +4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, +4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, +4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, +4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, +4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, +4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, +4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, +4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, +5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, +5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, +1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, +5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, +5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, +5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, +5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, +5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, +1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, +5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, +5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, +5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, +5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, +5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, +1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, +5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, +5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, +5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, +5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, +5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, +5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, +5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, +5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, +5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, +5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, +5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, +5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, +5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, +5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, +5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, +5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, +5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, +5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, +5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, +5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, +5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, +5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, +5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, +1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, +5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, +5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, +5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, +5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, +1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, +5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, +5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, +5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, +5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, +5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, +1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, +5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, +1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, +5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, +5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, +5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, +5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, +5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, +5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, +5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, +5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, +5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, +5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, +5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, +5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, +5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, +5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, +6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, +6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, +6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, +6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, +6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, +6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, +6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, +6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, +6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, +6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, +6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, +6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, +6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, +6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, +6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, +6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, +6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, //1024 +6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, +6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, +6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, +6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, +6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, +6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, +6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, +6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, +6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, +6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, +6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, +6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, +6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, +6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, +6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, +6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, +6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, +6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, +1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, +6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, +6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, +6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, +6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, +6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, +1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, +6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, +1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, +6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, +6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, +6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, +1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, +6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, +6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, +6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, +6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, +6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, +6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, +6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, +6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, +6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, +6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, +6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, +6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, +6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, +6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, +6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, +6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, +6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, +7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, +7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, +7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, +7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, +7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, +7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, +7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, +7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, +7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, +7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, +7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, +7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, +7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, +7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, +7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, +7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, +7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, +7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, +7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, +7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, +7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, +7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, +7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, +7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, +7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, +7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, +7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, +7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, +7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, +7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, +7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, +7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, +7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, +7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, +7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, +7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, +7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, +7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, +7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, +7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, +7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, +7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, +7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, +7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, +7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, +7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, +7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, +7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, +7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, +7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, +7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, +7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, +7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, +7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, +7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, +7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, +7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, +8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, +8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, +8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, +8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, +8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, +8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, +8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, +8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, +8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, +8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, +8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, +8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, +8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, +8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, +8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, +8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, +8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, +8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, +8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, +8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, +8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, +8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, +8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, +8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, +8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, +8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, +8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, +8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, +8736,8737,8738,8739,8740,8741 +****************************************************************************************/ +}; + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab new file mode 100644 index 0000000..3a189ae --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/EUCTWFreq.tab @@ -0,0 +1,447 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// EUCTW frequency table +// Converted from big5 work +// by Taiwan's Mandarin Promotion Council +// + + +/****************************************************************************** + * 128 --> 0.42261 + * 256 --> 0.57851 + * 512 --> 0.74851 + * 1024 --> 0.89384 + * 2048 --> 0.97583 + * + * Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 + * Random Distribution Ration = 512/(5401-512)=0.105 + * + * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + *****************************************************************************/ + +#define EUCTW_TYPICAL_DISTRIBUTION_RATIO (float)0.75 + +//Char to FreqOrder table , +#define EUCTW_TABLE_SIZE 8102 + +static const PRInt16 EUCTWCharToFreqOrder[] = +{ + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, // 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, // 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, // 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, // 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, // 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, // 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, // 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, // 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, // 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, // 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, // 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, // 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, // 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, // 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, // 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, // 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, // 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, // 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, // 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, // 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, // 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, // 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, // 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, // 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, // 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, // 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, // 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, // 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, // 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, // 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, // 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, // 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, // 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, // 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, // 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, // 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, // 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, // 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, // 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, // 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, // 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, // 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, // 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, // 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, // 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, // 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, // 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, // 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, // 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, // 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, // 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, // 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, // 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, // 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, // 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, // 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, // 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, // 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, // 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, // 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, // 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, // 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, // 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, // 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, // 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, // 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, // 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, // 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, // 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, // 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, // 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, // 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, // 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, // 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, // 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, // 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, // 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, // 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, // 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, // 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, // 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, // 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, // 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, // 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, // 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, // 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, // 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, // 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, // 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, // 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, // 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, // 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, // 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, // 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, // 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, // 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, // 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, // 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, // 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, // 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, // 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, // 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, // 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, // 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, // 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, // 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, // 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, // 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, // 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, // 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, // 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, // 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, // 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, // 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, // 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, // 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, // 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, // 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, // 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, // 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, // 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, // 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, // 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, // 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, // 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, // 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, // 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, // 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, // 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, // 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, // 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, // 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, // 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, // 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, // 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, // 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, // 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, // 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, // 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, // 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, // 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, // 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, // 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, // 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, // 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, // 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, // 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, // 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, // 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, // 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, // 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, // 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, // 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, // 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, // 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, // 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, // 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, // 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, // 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, // 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, // 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, // 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, // 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, // 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, // 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, // 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, // 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, // 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, // 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, // 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, // 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, // 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, // 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, // 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, // 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, // 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, // 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, // 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, // 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, // 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, // 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, // 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, // 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, // 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, // 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, // 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, // 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, // 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, // 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, // 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, // 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, // 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, // 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, // 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, // 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, // 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, // 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, // 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, // 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, // 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, // 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, // 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, // 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, // 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, // 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, // 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, // 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, // 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, // 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, // 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, // 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, // 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, // 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, // 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, // 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, // 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, // 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, // 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, // 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, // 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, // 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, // 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, // 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, // 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, // 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, // 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, // 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, // 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, // 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, // 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, // 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, // 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, // 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, // 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, // 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, // 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, // 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, // 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, // 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, // 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, // 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, // 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, // 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, // 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, // 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, // 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, // 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, // 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, // 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, // 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, // 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, // 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, // 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, // 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, // 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, // 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, // 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, // 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, // 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, // 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, // 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, // 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, // 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, // 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, // 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, // 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, // 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, // 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, // 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, // 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, // 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, // 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, // 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, // 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, // 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, // 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, // 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, // 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, // 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, // 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, // 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, // 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, // 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, // 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, // 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, // 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, // 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, // 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, // 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, // 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, // 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, // 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, // 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, // 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, // 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, // 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, // 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, // 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, // 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, // 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, // 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, // 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, // 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, // 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, // 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, // 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, // 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, // 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, // 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, // 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, // 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, // 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, // 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, // 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, // 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, // 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, // 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, // 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, // 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, // 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, // 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, // 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, // 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, // 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, // 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, // 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, // 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, // 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, // 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, // 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, // 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, // 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, // 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, // 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, // 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, // 8102 + +/*************************************************************************************** + *Everything below is of no interest for detection purpose * + *************************************************************************************** + +2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, // 8118 +2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, // 8134 +8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, // 8150 +8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, // 8166 +8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, // 8182 +8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, // 8198 +8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, // 8214 +8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, // 8230 +8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, // 8246 +8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, // 8262 +8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, // 8278 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, // 8294 +8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, // 8310 +8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, // 8326 +8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, // 8342 +8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, // 8358 +8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, // 8374 +8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, // 8390 +8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, // 8406 +8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, // 8422 +8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, // 8438 +8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, // 8454 +8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, // 8470 +8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, // 8486 +8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, // 8502 +8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, // 8518 +8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, // 8534 +8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, // 8550 +8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, // 8566 +8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, // 8582 +8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, // 8598 +8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, // 8614 +8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, // 8630 +8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, // 8646 +8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, // 8662 +8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, // 8678 +8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, // 8694 +8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, // 8710 +8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, // 8726 +8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741, // 8742 //13973 +****************************************************************************************/ +}; + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab new file mode 100644 index 0000000..aee12ca --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/GB2312Freq.tab @@ -0,0 +1,491 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +//GB2312 most frequently used character table + +//Char to FreqOrder table , from hz6763 + +/****************************************************************************** + * 512 --> 0.79 -- 0.79 + * 1024 --> 0.92 -- 0.13 + * 2048 --> 0.98 -- 0.06 + * 6768 --> 1.00 -- 0.02 + * + * Idea Distribution Ratio = 0.79135/(1-0.79135) = 3.79 + * Random Distribution Ration = 512 / (3755 - 512) = 0.157 + * + * Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + *****************************************************************************/ + +#define GB2312_TYPICAL_DISTRIBUTION_RATIO (float)0.9 + +#define GB2312_TABLE_SIZE 3760 + +static const PRInt16 GB2312CharToFreqOrder[] = +{ +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, //last 512 + +/*************************************************************************************** + *Everything below is of no interest for detection purpose * + *************************************************************************************** + +5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, +5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, +5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, +3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, +4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, +5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, +5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, +4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, +4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, +4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, +4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, +3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, +6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, +4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, +6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, +4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, +4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, +4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, +5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, +3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, +4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, +3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, +4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, +4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, +6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, +6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, +5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, +4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, +6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, +4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, +5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, +5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, +5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, +6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, +3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, +6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, +4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, +5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, +6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, +6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, +4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, +5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, +4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, +5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, +5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, +4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, +4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, +5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, +4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, +4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, +5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, +4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, +4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, +4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, +5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, +5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, +4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, +3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, +4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, +6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, +5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, +5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, +4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, +6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, +5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, +6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, +4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, +5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, +5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, +3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, +5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, +6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, +4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, +6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, +4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, +4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, +6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, +3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, +6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, +4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, +3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, +3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, +3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, +4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, +2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, +5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, +4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, +5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, +5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, +5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, +4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, +5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, +4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, +5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, +1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, +3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, +4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, +4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, +6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, +4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, +5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, +3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, +5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, +5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, +5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, +3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, +5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, +5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, +3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, +5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, +5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, +5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, +6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, +4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, +6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, +4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, +3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, +4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, +5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, +5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, +5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, +3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, +3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, +6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, +6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, +5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, +6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, +6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, +6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, +6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, +6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, +5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, +6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, +6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, +3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, +3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, +4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, +4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, +3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, +5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, +5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, +5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, +5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, +5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, +4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, +5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, +6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, +5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, +4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, +4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, +6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, +3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, +4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, +4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, +5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, +6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, +6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, +4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, +6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, +5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, +5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, +5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, +5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, +5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, +4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, +5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, +5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, +5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, +5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, +6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, +4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, +5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, +4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, +4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, +6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, +4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, +6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, +3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, +5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, +6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, +6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, +6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, +5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, +6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, +6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, +3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, +5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, +4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767, +*******************************************************************************/ +}; + + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JISFreq.tab b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JISFreq.tab new file mode 100644 index 0000000..715321f --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JISFreq.tab @@ -0,0 +1,589 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +//Sampling from about 20M text materials include literature and computer technology + +// Japanese frequency table, applied to both S-JIS and EUC-JP +//They are sorted in order. + +/****************************************************************************** + * 128 --> 0.77094 + * 256 --> 0.85710 + * 512 --> 0.92635 + * 1024 --> 0.97130 + * 2048 --> 0.99431 + * + * Idea Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 + * Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 + * + * Typical Distribution Ratio, 25% of IDR + *****************************************************************************/ + +#define JIS_TYPICAL_DISTRIBUTION_RATIO (float) 3.0 + + +//Char to FreqOrder table , +#define JIS_TABLE_SIZE 4368 + +static const PRInt16 JISCharToFreqOrder[] = +{ + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, // 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, // 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, // 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, // 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, // 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, // 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, // 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, // 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, // 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, // 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, // 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, // 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, // 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, // 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, // 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, // 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, // 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, // 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, // 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, // 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, // 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, // 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, // 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, // 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, // 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, // 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, // 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, // 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, // 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, // 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, // 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, // 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, // 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, // 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, // 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, // 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, // 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, // 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, // 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, // 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, // 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, // 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, // 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, // 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, // 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, // 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, // 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, // 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, // 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, // 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, // 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, // 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, // 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, // 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, // 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, // 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, // 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, // 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, // 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, // 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, // 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, // 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, // 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, // 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, // 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, // 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, // 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, // 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, // 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, // 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, // 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, // 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, // 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, // 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, // 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, // 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, // 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, // 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, // 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, // 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, // 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, // 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, // 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, // 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, // 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, // 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, // 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, // 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, // 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, // 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, // 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, // 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, // 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, // 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, // 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, // 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, // 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, // 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, // 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, // 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, // 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, // 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, // 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, // 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, // 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, // 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, // 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, // 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, // 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, // 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, // 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, // 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, // 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, // 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, // 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, // 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, // 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, // 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, // 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, // 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, // 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, // 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, // 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, // 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, // 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, // 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, // 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, // 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, // 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, // 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, // 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, // 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, // 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, // 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, // 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, // 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, // 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, // 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, // 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, // 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, // 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, // 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, // 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, // 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, // 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, // 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, // 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, // 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, // 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, // 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, // 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, // 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, // 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, // 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, // 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, // 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, // 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, // 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, // 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, // 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, // 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, // 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, // 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, // 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, // 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, // 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, // 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, // 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, // 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, // 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, // 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, // 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, // 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, // 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, // 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, // 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, // 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, // 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, // 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, // 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, // 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, // 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, // 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, // 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, // 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, // 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, // 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, // 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, // 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, // 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, // 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, // 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, // 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, // 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, // 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, // 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, // 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, // 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, // 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, // 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, // 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, // 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, // 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, // 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, // 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, // 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, // 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, // 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, // 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, // 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, // 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, // 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, // 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, // 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, // 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, // 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, // 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, // 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, // 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, // 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, // 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, // 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, // 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, // 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, // 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, // 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, // 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, // 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, // 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, // 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, // 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, // 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, // 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, // 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, // 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, // 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, // 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, // 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, // 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, // 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, // 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, // 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, // 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, // 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, // 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, // 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, // 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, // 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, // 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, // 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, // 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, // 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, // 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, // 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, // 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, // 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, // 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, // 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, // 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, // 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, // 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, // 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, // 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, // 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, // 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, // 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, // 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, // 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, // 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, // 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, // 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, // 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, // 4368 //last 512 + +/*************************************************************************************** + *Everything below is of no interest for detection purpose * + *************************************************************************************** + +2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, // 4384 +6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, // 4400 +6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, // 4416 +6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, // 4432 +6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, // 4448 +4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, // 4464 +4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, // 4480 +3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, // 4496 +3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, // 4512 +4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, // 4528 +3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, // 4544 +6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, // 4560 +4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, // 4576 +6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, // 4592 +6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, // 4608 +6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, // 4624 +6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, // 4640 +6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, // 4656 +6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, // 4672 +3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, // 4688 +3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, // 4704 +6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, // 4720 +2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, // 4736 +4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, // 4752 +4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, // 4768 +4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, // 4784 +6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, // 4800 +3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, // 4816 +4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, // 4832 +4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, // 4848 +6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, // 4864 +4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, // 4880 +6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, // 4896 +3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, // 4912 +2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, // 4928 +4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, // 4944 +2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, // 4960 +6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, // 4976 +4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, // 4992 +6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, // 5008 +6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, // 5024 +6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, // 5040 +4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, // 5056 +6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, // 5072 +2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, // 5088 +6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, // 5104 +4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, // 5120 +6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, // 5136 +4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, // 5152 +4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, // 5168 +6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, // 5184 +6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, // 5200 +6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, // 5216 +3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, // 5232 +1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, // 5248 +3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, // 5264 +3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, // 5280 +4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, // 5296 +6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, // 5312 +3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, // 5328 +6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, // 5344 +3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, // 5360 +3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, // 5376 +2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, // 5392 +6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, // 5408 +6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, // 5424 +3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, // 5440 +6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, // 5456 +3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, // 5472 +6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, // 5488 +6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, // 5504 +6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, // 5520 +4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, // 5536 +6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, // 5552 +4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, // 5568 +3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, // 5584 +3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, // 5600 +6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, // 5616 +6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, // 5632 +4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, // 5648 +6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, // 5664 +6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, // 5680 +6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, // 5696 +6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, // 5712 +6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, // 5728 +6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, // 5744 +4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, // 5760 +4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, // 5776 +3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, // 5792 +6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, // 5808 +4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, // 5824 +2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, // 5840 +6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, // 5856 +6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, // 5872 +4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, // 5888 +2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, // 5904 +4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, // 5920 +2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, // 5936 +4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, // 5952 +4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, // 5968 +4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, // 5984 +6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, // 6000 +3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, // 6016 +6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, // 6032 +3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, // 6048 +6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, // 6064 +2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, // 6080 +3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, // 6096 +7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, // 6112 +2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, // 6128 +3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, // 6144 +3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, // 6160 +3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, // 6176 +3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, // 6192 +7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, // 6208 +7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, // 6224 +7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, // 6240 +7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, // 6256 +7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, // 6272 +4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, // 6288 +3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, // 6304 +3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, // 6320 +4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, // 6336 +3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, // 6352 +3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, // 6368 +7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, // 6384 +4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, // 6400 +7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, // 6416 +7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, // 6432 +7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, // 6448 +7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, // 6464 +7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, // 6480 +4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, // 6496 +4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, // 6512 +7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, // 6528 +3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, // 6544 +4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, // 6560 +7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, // 6576 +7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, // 6592 +4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, // 6608 +3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, // 6624 +3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, // 6640 +7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, // 6656 +4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, // 6672 +4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, // 6688 +4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, // 6704 +4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, // 6720 +4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, // 6736 +4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, // 6752 +7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, // 6768 +7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, // 6784 +7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, // 6800 +7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, // 6816 +7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, // 6832 +2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, // 6848 +3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, // 6864 +7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, // 6880 +7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, // 6896 +3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, // 6912 +4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, // 6928 +3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, // 6944 +3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, // 6960 +2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, // 6976 +7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, // 6992 +7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, // 7008 +4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, // 7024 +3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, // 7040 +3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, // 7056 +7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, // 7072 +7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, // 7088 +7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, // 7104 +4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, // 7120 +7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, // 7136 +2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, // 7152 +3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, // 7168 +4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, // 7184 +7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, // 7200 +4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, // 7216 +4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, // 7232 +7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, // 7248 +7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, // 7264 +5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, // 7280 +7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, // 7296 +7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, // 7312 +7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, // 7328 +7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, // 7344 +7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, // 7360 +5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, // 7376 +5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, // 7392 +7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, // 7408 +3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, // 7424 +7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, // 7440 +7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, // 7456 +3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, // 7472 +7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, // 7488 +7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, // 7504 +1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, // 7520 +3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, // 7536 +4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, // 7552 +2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, // 7568 +3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, // 7584 +2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, // 7600 +5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, // 7616 +4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, // 7632 +4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, // 7648 +5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, // 7664 +7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, // 7680 +7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, // 7696 +7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, // 7712 +7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, // 7728 +3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, // 7744 +7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, // 7760 +3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, // 7776 +7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, // 7792 +4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, // 7808 +7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, // 7824 +7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, // 7840 +7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, // 7856 +7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, // 7872 +7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, // 7888 +7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, // 7904 +7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, // 7920 +7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, // 7936 +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, // 7952 +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, // 7968 +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, // 7984 +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, // 8000 +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, // 8016 +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, // 8032 +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, // 8048 +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, // 8064 +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, // 8080 +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, // 8096 +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, // 8112 +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, // 8128 +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, // 8144 +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, // 8160 +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, // 8176 +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, // 8192 +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, // 8208 +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, // 8224 +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, // 8240 +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, // 8256 +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, // 8272 +****************************************************************************************/ + +}; + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp new file mode 100644 index 0000000..3f74fb4 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.cpp @@ -0,0 +1,230 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nscore.h" +#include "JpCntx.h" + +//This is hiragana 2-char sequence table, the number in each cell represents its frequency category +const PRUint8 jp2CharContext[83][83] = +{ +{ 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,}, +{ 2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4,}, +{ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,}, +{ 0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4,}, +{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, +{ 0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4,}, +{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, +{ 0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3,}, +{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, +{ 0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4,}, +{ 1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4,}, +{ 0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3,}, +{ 0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3,}, +{ 0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3,}, +{ 0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4,}, +{ 0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3,}, +{ 2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4,}, +{ 0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3,}, +{ 0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5,}, +{ 0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3,}, +{ 2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5,}, +{ 0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4,}, +{ 1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4,}, +{ 0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3,}, +{ 0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3,}, +{ 0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3,}, +{ 0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5,}, +{ 0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4,}, +{ 0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5,}, +{ 0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3,}, +{ 0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4,}, +{ 0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4,}, +{ 0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4,}, +{ 0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1,}, +{ 0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,}, +{ 1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3,}, +{ 0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0,}, +{ 0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3,}, +{ 0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3,}, +{ 0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5,}, +{ 0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4,}, +{ 2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5,}, +{ 0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3,}, +{ 0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3,}, +{ 0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3,}, +{ 0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3,}, +{ 0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4,}, +{ 0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4,}, +{ 0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2,}, +{ 0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3,}, +{ 0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3,}, +{ 0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3,}, +{ 0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3,}, +{ 0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4,}, +{ 0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3,}, +{ 0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4,}, +{ 0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3,}, +{ 0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3,}, +{ 0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4,}, +{ 0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4,}, +{ 0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3,}, +{ 2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4,}, +{ 0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4,}, +{ 0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3,}, +{ 0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4,}, +{ 0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4,}, +{ 1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4,}, +{ 0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3,}, +{ 0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,}, +{ 0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2,}, +{ 0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3,}, +{ 0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3,}, +{ 0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5,}, +{ 0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3,}, +{ 0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4,}, +{ 1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4,}, +{ 0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4,}, +{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, +{ 0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3,}, +{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1,}, +{ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2,}, +{ 0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3,}, +{ 0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1,}, +}; + +#define MINIMUM_DATA_THRESHOLD 4 + +void JapaneseContextAnalysis::HandleData(const char* aBuf, PRUint32 aLen) +{ + PRUint32 charLen; + PRInt32 order; + PRUint32 i; + + if (mDone) + return; + + //The buffer we got is byte oriented, and a character may span in more than one + //buffers. In case the last one or two byte in last buffer is not complete, we + //record how many byte needed to complete that character and skip these bytes here. + //We can choose to record those bytes as well and analyse the character once it + //is complete, but since a character will not make much difference, by simply skipping + //this character will simply our logic and improve performance. + for (i = mNeedToSkipCharNum; i < aLen; ) + { + order = GetOrder(aBuf+i, &charLen); + i+= charLen; + if (i > aLen){ + mNeedToSkipCharNum = i - aLen; + mLastCharOrder = -1; + } + else + { + if (order != -1 && mLastCharOrder != -1) + { + mTotalRel ++; + if (mTotalRel > MAX_REL_THRESHOLD) + { + mDone = PR_TRUE; + break; + } + mRelSample[jp2CharContext[mLastCharOrder][order]]++; + } + mLastCharOrder = order; + } + } + + return; +} + +void JapaneseContextAnalysis::Reset(PRBool aIsPreferredLanguage) +{ + mTotalRel = 0; + for (PRUint32 i = 0; i < NUM_OF_CATEGORY; i++) + mRelSample[i] = 0; + mNeedToSkipCharNum = 0; + mLastCharOrder = -1; + mDone = PR_FALSE; + mDataThreshold = aIsPreferredLanguage ? 0 : MINIMUM_DATA_THRESHOLD; +} +#define DONT_KNOW (float)-1 + +float JapaneseContextAnalysis::GetConfidence(void) +{ + //This is just one way to calculate confidence. It works well for me. + if (mTotalRel > mDataThreshold) + return ((float)(mTotalRel - mRelSample[0]))/mTotalRel; + else + return (float)DONT_KNOW; +} + + +PRInt32 SJISContextAnalysis::GetOrder(const char* str, PRUint32 *charLen) +{ + //find out current char's byte length + if (((unsigned char)*str >= (unsigned char)0x81 && (unsigned char)*str <= (unsigned char)0x9f) || + ((unsigned char)*str >= (unsigned char)0xe0 && (unsigned char)*str <= (unsigned char)0xfc)) + *charLen = 2; + else + *charLen = 1; + + //return its order if it is hiragana + if (*str == '\202' && + (unsigned char)*(str+1) >= (unsigned char)0x9f && + (unsigned char)*(str+1) <= (unsigned char)0xf1) + return (unsigned char)*(str+1) - (unsigned char)0x9f; + return -1; +} + +PRInt32 EUCJPContextAnalysis::GetOrder(const char* str, PRUint32 *charLen) +{ + //find out current char's byte length + if ((unsigned char)*str == (unsigned char)0x8e || + ((unsigned char)*str >= (unsigned char)0xa1 && + (unsigned char)*str <= (unsigned char)0xfe)) + *charLen = 2; + else if ((unsigned char)*str == (unsigned char)0x8f) + *charLen = 3; + else + *charLen = 1; + + //return its order if it is hiragana + if ((unsigned char)*str == (unsigned char)0xa4 && + (unsigned char)*(str+1) >= (unsigned char)0xa1 && + (unsigned char)*(str+1) <= (unsigned char)0xf3) + return (unsigned char)*(str+1) - (unsigned char)0xa1; + return -1; +} diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.h new file mode 100644 index 0000000..fe8fcb8 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/JpCntx.h @@ -0,0 +1,140 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef __JPCNTX_H__ +#define __JPCNTX_H__ + +#define NUM_OF_CATEGORY 6 + +#include "nscore.h" + +#define ENOUGH_REL_THRESHOLD 100 +#define MAX_REL_THRESHOLD 1000 + +//hiragana frequency category table +extern const PRUint8 jp2CharContext[83][83]; + +class JapaneseContextAnalysis +{ +public: + JapaneseContextAnalysis() {Reset(PR_FALSE);} + + void HandleData(const char* aBuf, PRUint32 aLen); + + void HandleOneChar(const char* aStr, PRUint32 aCharLen) + { + PRInt32 order; + + //if we received enough data, stop here + if (mTotalRel > MAX_REL_THRESHOLD) mDone = PR_TRUE; + if (mDone) return; + + //Only 2-bytes characters are of our interest + order = (aCharLen == 2) ? GetOrder(aStr) : -1; + if (order != -1 && mLastCharOrder != -1) + { + mTotalRel++; + //count this sequence to its category counter + mRelSample[jp2CharContext[mLastCharOrder][order]]++; + } + mLastCharOrder = order; + } + + float GetConfidence(void); + void Reset(PRBool aIsPreferredLanguage); + void SetOpion(){} + PRBool GotEnoughData() {return mTotalRel > ENOUGH_REL_THRESHOLD;} + +protected: + virtual PRInt32 GetOrder(const char* str, PRUint32 *charLen) = 0; + virtual PRInt32 GetOrder(const char* str) = 0; + + //category counters, each integer counts sequences in its category + PRUint32 mRelSample[NUM_OF_CATEGORY]; + + //total sequence received + PRUint32 mTotalRel; + + //Number of sequences needed to trigger detection + PRUint32 mDataThreshold; + + //The order of previous char + PRInt32 mLastCharOrder; + + //if last byte in current buffer is not the last byte of a character, we + //need to know how many byte to skip in next buffer. + PRUint32 mNeedToSkipCharNum; + + //If this flag is set to PR_TRUE, detection is done and conclusion has been made + PRBool mDone; +}; + + +class SJISContextAnalysis : public JapaneseContextAnalysis +{ + //SJISContextAnalysis(){}; +protected: + PRInt32 GetOrder(const char* str, PRUint32 *charLen); + + PRInt32 GetOrder(const char* str) + { + //We only interested in Hiragana, so first byte is '\202' + if (*str == '\202' && + (unsigned char)*(str+1) >= (unsigned char)0x9f && + (unsigned char)*(str+1) <= (unsigned char)0xf1) + return (unsigned char)*(str+1) - (unsigned char)0x9f; + return -1; + } +}; + +class EUCJPContextAnalysis : public JapaneseContextAnalysis +{ +protected: + PRInt32 GetOrder(const char* str, PRUint32 *charLen); + PRInt32 GetOrder(const char* str) + //We only interested in Hiragana, so first byte is '\244' + { + if (*str == '\244' && + (unsigned char)*(str+1) >= (unsigned char)0xa1 && + (unsigned char)*(str+1) <= (unsigned char)0xf3) + return (unsigned char)*(str+1) - (unsigned char)0xa1; + return -1; + } +}; + +#endif /* __JPCNTX_H__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangBulgarianModel.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangBulgarianModel.cpp new file mode 100644 index 0000000..0f73282 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangBulgarianModel.cpp @@ -0,0 +1,245 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsSBCharSetProber.h" +/**************************************************************** +255: Control characters that usually does not exist in any text +254: Carriage/Return +253: symbol (punctuation) that does not belong to word +252: 0 - 9 + +*****************************************************************/ + +//Character Mapping Table: +//this talbe is modified base on win1251BulgarianCharToOrderMap, so +//only number <64 is sure valid + +static const unsigned char Latin5_BulgarianCharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, //80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, //90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, //a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, //c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, //e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, //f0 +}; + +static const unsigned char win1251BulgarianCharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, //80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, //90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, //a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, //b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, //d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, //f0 +}; + +//Model Table: +//total sequences: 100% +//first 512 sequences: 96.9392% +//first 1024 sequences:3.0618% +//rest sequences: 0.2992% +//negative sequences: 0.0020% +static const PRUint8 BulgarianLangModel[] = +{ +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +}; + +const SequenceModel Latin5BulgarianModel = +{ + Latin5_BulgarianCharToOrderMap, + BulgarianLangModel, + (float)0.969392, + PR_FALSE, + "ISO-8859-5" +}; + +const SequenceModel Win1251BulgarianModel = +{ + win1251BulgarianCharToOrderMap, + BulgarianLangModel, + (float)0.969392, + PR_FALSE, + "windows-1251" +}; diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangCyrillicModel.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangCyrillicModel.cpp new file mode 100644 index 0000000..d8e73e8 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangCyrillicModel.cpp @@ -0,0 +1,355 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsSBCharSetProber.h" + + + +//KOI8-R language model +//Character Mapping Table: +static const unsigned char KOI8R_CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, //80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, //90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, //a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, //b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, //c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, //d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, //e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, //f0 +}; + +static const unsigned char win1251_CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +}; + +static const unsigned char latin5_CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +}; + +static const unsigned char macCyrillic_CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +}; + +static const unsigned char IBM855_CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +}; + +static const unsigned char IBM866_CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +}; + +//Model Table: +//total sequences: 100% +//first 512 sequences: 97.6601% +//first 1024 sequences: 2.3389% +//rest sequences: 0.1237% +//negative sequences: 0.0009% +static const PRUint8 RussianLangModel[] = +{ +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +}; + + +const SequenceModel Koi8rModel = +{ + KOI8R_CharToOrderMap, + RussianLangModel, + (float)0.976601, + PR_FALSE, + "KOI8-R" +}; + +const SequenceModel Win1251Model = +{ + win1251_CharToOrderMap, + RussianLangModel, + (float)0.976601, + PR_FALSE, + "windows-1251" +}; + +const SequenceModel Latin5Model = +{ + latin5_CharToOrderMap, + RussianLangModel, + (float)0.976601, + PR_FALSE, + "ISO-8859-5" +}; + +const SequenceModel MacCyrillicModel = +{ + macCyrillic_CharToOrderMap, + RussianLangModel, + (float)0.976601, + PR_FALSE, + "x-mac-cyrillic" +}; + +const SequenceModel Ibm866Model = +{ + IBM866_CharToOrderMap, + RussianLangModel, + (float)0.976601, + PR_FALSE, + "IBM866" +}; + +const SequenceModel Ibm855Model = +{ + IBM855_CharToOrderMap, + RussianLangModel, + (float)0.976601, + PR_FALSE, + "IBM855" +}; diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp new file mode 100644 index 0000000..30c65dc --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangGreekModel.cpp @@ -0,0 +1,244 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsSBCharSetProber.h" +/**************************************************************** +255: Control characters that usually does not exist in any text +254: Carriage/Return +253: symbol (punctuation) that does not belong to word +252: 0 - 9 + +*****************************************************************/ + +//Character Mapping Table: +static const unsigned char Latin7_CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90 ++253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, //b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, //f0 +}; + + + +static const unsigned char win1253_CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90 ++253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, //b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, //f0 +}; + +//Model Table: +//total sequences: 100% +//first 512 sequences: 98.2851% +//first 1024 sequences:1.7001% +//rest sequences: 0.0359% +//negative sequences: 0.0148% +static const PRUint8 GreekLangModel[] = +{ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; + +const SequenceModel Latin7Model = +{ + Latin7_CharToOrderMap, + GreekLangModel, + (float)0.982851, + PR_FALSE, + "ISO-8859-7" +}; + +const SequenceModel Win1253Model = +{ + win1253_CharToOrderMap, + GreekLangModel, + (float)0.982851, + PR_FALSE, + "windows-1253" +}; diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHebrewModel.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHebrewModel.cpp new file mode 100644 index 0000000..a4e10ad --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHebrewModel.cpp @@ -0,0 +1,219 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Simon Montagu + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shoshannah Forbes + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsSBCharSetProber.h" + + +/**************************************************************** +255: Control characters that usually does not exist in any text +254: Carriage/Return +253: symbol (punctuation) that does not belong to word +252: 0 - 9 + +*****************************************************************/ + +//Windows-1255 language model +//Character Mapping Table: +static const unsigned char win1255_CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, //40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, //50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, //60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, //70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +}; + +//Model Table: +//total sequences: 100% +//first 512 sequences: 98.4004% +//first 1024 sequences: 1.5981% +//rest sequences: 0.087% +//negative sequences: 0.0015% +static const PRUint8 HebrewLangModel[] = +{ +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +}; + +const SequenceModel Win1255Model = +{ + win1255_CharToOrderMap, + HebrewLangModel, + (float)0.984004, + PR_FALSE, + "windows-1255" +}; + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHungarianModel.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHungarianModel.cpp new file mode 100644 index 0000000..3af2f58 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangHungarianModel.cpp @@ -0,0 +1,242 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsSBCharSetProber.h" +/**************************************************************** +255: Control characters that usually does not exist in any text +254: Carriage/Return +253: symbol (punctuation) that does not belong to word +252: 0 - 9 + +*****************************************************************/ + +//Character Mapping Table: +static const unsigned char Latin2_HungarianCharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +}; + +static const unsigned char win1250HungarianCharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +}; + +//Model Table: +//total sequences: 100% +//first 512 sequences: 94.7368% +//first 1024 sequences:5.2623% +//rest sequences: 0.8894% +//negative sequences: 0.0009% +static const PRUint8 HungarianLangModel[] = +{ +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +}; + +const SequenceModel Latin2HungarianModel = +{ + Latin2_HungarianCharToOrderMap, + HungarianLangModel, + (float)0.947368, + PR_TRUE, + "ISO-8859-2" +}; + +const SequenceModel Win1250HungarianModel = +{ + win1250HungarianCharToOrderMap, + HungarianLangModel, + (float)0.947368, + PR_TRUE, + "windows-1250" +}; diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp new file mode 100644 index 0000000..8145ffa --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/LangThaiModel.cpp @@ -0,0 +1,221 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsSBCharSetProber.h" + + +/**************************************************************** +255: Control characters that usually does not exist in any text +254: Carriage/Return +253: symbol (punctuation) that does not belong to word +252: 0 - 9 + +*****************************************************************/ + +//The following result for thai was collected from a limited sample (1M). + +//Character Mapping Table: +static const unsigned char TIS620CharToOrderMap[] = +{ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 ++253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, //40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, //50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, //60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, //70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +}; + + + + +//Model Table: +//total sequences: 100% +//first 512 sequences: 92.6386% +//first 1024 sequences:7.3177% +//rest sequences: 1.0230% +//negative sequences: 0.0436% +static const PRUint8 ThaiLangModel[] = +{ +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; + + +const SequenceModel TIS620ThaiModel = +{ + TIS620CharToOrderMap, + ThaiLangModel, + (float)0.926386, + PR_FALSE, + "TIS-620" +}; diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp new file mode 100644 index 0000000..7a85abb --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.cpp @@ -0,0 +1,88 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsBig5Prober.h" + +void nsBig5Prober::Reset(void) +{ + mCodingSM->Reset(); + mState = eDetecting; + mDistributionAnalyser.Reset(mIsPreferredLanguage); +} + +nsProbingState nsBig5Prober::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsSMState codingState; + + for (PRUint32 i = 0; i < aLen; i++) + { + codingState = mCodingSM->NextState(aBuf[i]); + if (codingState == eItsMe) + { + mState = eFoundIt; + break; + } + if (codingState == eStart) + { + PRUint32 charLen = mCodingSM->GetCurrentCharLen(); + + if (i == 0) + { + mLastChar[1] = aBuf[0]; + mDistributionAnalyser.HandleOneChar(mLastChar, charLen); + } + else + mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); + } + } + + mLastChar[0] = aBuf[aLen-1]; + + if (mState == eDetecting) + if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) + mState = eFoundIt; + + return mState; +} + +float nsBig5Prober::GetConfidence(void) +{ + float distribCf = mDistributionAnalyser.GetConfidence(); + + return (float)distribCf; +} + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h new file mode 100644 index 0000000..5ae3576 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsBig5Prober.h @@ -0,0 +1,74 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsBig5Prober_h__ +#define nsBig5Prober_h__ + +#include "nsCharSetProber.h" +#include "nsCodingStateMachine.h" +#include "CharDistribution.h" + +class nsBig5Prober: public nsCharSetProber { +public: + nsBig5Prober(PRBool aIsPreferredLanguage) + :mIsPreferredLanguage(aIsPreferredLanguage) + {mCodingSM = new nsCodingStateMachine(&Big5SMModel); + Reset();} + virtual ~nsBig5Prober(void){delete mCodingSM;} + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName() {return "Big5";} + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +protected: + void GetDistribution(PRUint32 aCharLen, const char* aStr); + + nsCodingStateMachine* mCodingSM; + nsProbingState mState; + + //Big5ContextAnalysis mContextAnalyser; + Big5DistributionAnalysis mDistributionAnalyser; + char mLastChar[2]; + PRBool mIsPreferredLanguage; + +}; + + +#endif /* nsBig5Prober_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.cpp new file mode 100644 index 0000000..0429dd1 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.cpp @@ -0,0 +1,125 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsCharSetProber.h" +#include "prmem.h" + +//This filter applies to all scripts which do not use English characters +PRBool nsCharSetProber::FilterWithoutEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen) +{ + char *newptr; + char *prevPtr, *curPtr; + + PRBool meetMSB = PR_FALSE; + newptr = *newBuf = (char*)PR_Malloc(aLen); + if (!newptr) + return PR_FALSE; + + for (curPtr = prevPtr = (char*)aBuf; curPtr < aBuf+aLen; curPtr++) + { + if (*curPtr & 0x80) + { + meetMSB = PR_TRUE; + } + else if (*curPtr < 'A' || (*curPtr > 'Z' && *curPtr < 'a') || *curPtr > 'z') + { + //current char is a symbol, most likely a punctuation. we treat it as segment delimiter + if (meetMSB && curPtr > prevPtr) + //this segment contains more than single symbol, and it has upper ASCII, we need to keep it + { + while (prevPtr < curPtr) *newptr++ = *prevPtr++; + prevPtr++; + *newptr++ = ' '; + meetMSB = PR_FALSE; + } + else //ignore current segment. (either because it is just a symbol or just an English word) + prevPtr = curPtr+1; + } + } + if (meetMSB && curPtr > prevPtr) + while (prevPtr < curPtr) *newptr++ = *prevPtr++; + + newLen = newptr - *newBuf; + + return PR_TRUE; +} + +//This filter applies to all scripts which contain both English characters and upper ASCII characters. +PRBool nsCharSetProber::FilterWithEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen) +{ + //do filtering to reduce load to probers + char *newptr; + char *prevPtr, *curPtr; + PRBool isInTag = PR_FALSE; + + newptr = *newBuf = (char*)PR_Malloc(aLen); + if (!newptr) + return PR_FALSE; + + for (curPtr = prevPtr = (char*)aBuf; curPtr < aBuf+aLen; curPtr++) + { + if (*curPtr == '>') + isInTag = PR_FALSE; + else if (*curPtr == '<') + isInTag = PR_TRUE; + + if (!(*curPtr & 0x80) && + (*curPtr < 'A' || (*curPtr > 'Z' && *curPtr < 'a') || *curPtr > 'z') ) + { + if (curPtr > prevPtr && !isInTag) // Current segment contains more than just a symbol + // and it is not inside a tag, keep it. + { + while (prevPtr < curPtr) *newptr++ = *prevPtr++; + prevPtr++; + *newptr++ = ' '; + } + else + prevPtr = curPtr+1; + } + } + + // If the current segment contains more than just a symbol + // and it is not inside a tag then keep it. + if (!isInTag) + while (prevPtr < curPtr) + *newptr++ = *prevPtr++; + + newLen = newptr - *newBuf; + + return PR_TRUE; +} diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.h new file mode 100644 index 0000000..c078ccf --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCharSetProber.h @@ -0,0 +1,76 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#ifndef nsCharSetProber_h__ +#define nsCharSetProber_h__ + +#include "nscore.h" + +//#define DEBUG_chardet // Uncomment this for debug dump. + +typedef enum { + eDetecting = 0, //We are still detecting, no sure answer yet, but caller can ask for confidence. + eFoundIt = 1, //That's a positive answer + eNotMe = 2 //Negative answer +} nsProbingState; + +#define SHORTCUT_THRESHOLD (float)0.95 + +class nsCharSetProber { +public: + virtual ~nsCharSetProber() {} + virtual const char* GetCharSetName() = 0; + virtual nsProbingState HandleData(const char* aBuf, PRUint32 aLen) = 0; + virtual nsProbingState GetState(void) = 0; + virtual void Reset(void) = 0; + virtual float GetConfidence(void) = 0; + virtual void SetOpion() = 0; + +#ifdef DEBUG_chardet + virtual void DumpStatus() {}; +#endif + + // Helper functions used in the Latin1 and Group probers. + // both functions Allocate a new buffer for newBuf. This buffer should be + // freed by the caller using PR_FREEIF. + // Both functions return PR_FALSE in case of memory allocation failure. + static PRBool FilterWithoutEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen); + static PRBool FilterWithEnglishLetters(const char* aBuf, PRUint32 aLen, char** newBuf, PRUint32& newLen); + +}; + +#endif /* nsCharSetProber_h__ */ diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCodingStateMachine.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCodingStateMachine.h new file mode 100644 index 0000000..819f9ab --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsCodingStateMachine.h @@ -0,0 +1,104 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#ifndef nsCodingStateMachine_h__ +#define nsCodingStateMachine_h__ + +#include "nsPkgInt.h" + +typedef enum { + eStart = 0, + eError = 1, + eItsMe = 2 +} nsSMState; + +#define GETCLASS(c) GETFROMPCK(((unsigned char)(c)), mModel->classTable) + +//state machine model +typedef struct +{ + nsPkgInt classTable; + PRUint32 classFactor; + nsPkgInt stateTable; + const PRUint32* charLenTable; + const char* name; +} SMModel; + +class nsCodingStateMachine { +public: + nsCodingStateMachine(const SMModel* sm) : mModel(sm) { mCurrentState = eStart; } + nsSMState NextState(char c){ + //for each byte we get its class , if it is first byte, we also get byte length + PRUint32 byteCls = GETCLASS(c); + if (mCurrentState == eStart) + { + mCurrentBytePos = 0; + mCurrentCharLen = mModel->charLenTable[byteCls]; + } + //from byte's class and stateTable, we get its next state + mCurrentState=(nsSMState)GETFROMPCK(mCurrentState*(mModel->classFactor)+byteCls, + mModel->stateTable); + mCurrentBytePos++; + return mCurrentState; + } + PRUint32 GetCurrentCharLen(void) {return mCurrentCharLen;} + void Reset(void) {mCurrentState = eStart;} + const char * GetCodingStateMachine() {return mModel->name;} + +protected: + nsSMState mCurrentState; + PRUint32 mCurrentCharLen; + PRUint32 mCurrentBytePos; + + const SMModel *mModel; +}; + +extern const SMModel UTF8SMModel; +extern const SMModel Big5SMModel; +extern const SMModel EUCJPSMModel; +extern const SMModel EUCKRSMModel; +extern const SMModel EUCTWSMModel; +extern const SMModel GB18030SMModel; +extern const SMModel SJISSMModel; + + +extern const SMModel HZSMModel; +extern const SMModel ISO2022CNSMModel; +extern const SMModel ISO2022JPSMModel; +extern const SMModel ISO2022KRSMModel; + +#endif /* nsCodingStateMachine_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp new file mode 100644 index 0000000..54861b3 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.cpp @@ -0,0 +1,99 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// for japanese encoding, obeserve characteristic: +// 1, kana character (or hankaku?) often have hight frequency of appereance +// 2, kana character often exist in group +// 3, certain combination of kana is never used in japanese language + +#include "nsEUCJPProber.h" + +void nsEUCJPProber::Reset(void) +{ + mCodingSM->Reset(); + mState = eDetecting; + mContextAnalyser.Reset(mIsPreferredLanguage); + mDistributionAnalyser.Reset(mIsPreferredLanguage); +} + +nsProbingState nsEUCJPProber::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsSMState codingState; + + for (PRUint32 i = 0; i < aLen; i++) + { + codingState = mCodingSM->NextState(aBuf[i]); + if (codingState == eItsMe) + { + mState = eFoundIt; + break; + } + if (codingState == eStart) + { + PRUint32 charLen = mCodingSM->GetCurrentCharLen(); + + if (i == 0) + { + mLastChar[1] = aBuf[0]; + mContextAnalyser.HandleOneChar(mLastChar, charLen); + mDistributionAnalyser.HandleOneChar(mLastChar, charLen); + } + else + { + mContextAnalyser.HandleOneChar(aBuf+i-1, charLen); + mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); + } + } + } + + mLastChar[0] = aBuf[aLen-1]; + + if (mState == eDetecting) + if (mContextAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) + mState = eFoundIt; + + return mState; +} + +float nsEUCJPProber::GetConfidence(void) +{ + float contxtCf = mContextAnalyser.GetConfidence(); + float distribCf = mDistributionAnalyser.GetConfidence(); + + return (contxtCf > distribCf ? contxtCf : distribCf); +} + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h new file mode 100644 index 0000000..a7a2f51 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCJPProber.h @@ -0,0 +1,78 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// for S-JIS encoding, obeserve characteristic: +// 1, kana character (or hankaku?) often have hight frequency of appereance +// 2, kana character often exist in group +// 3, certain combination of kana is never used in japanese language + +#ifndef nsEUCJPProber_h__ +#define nsEUCJPProber_h__ + +#include "nsCharSetProber.h" +#include "nsCodingStateMachine.h" +#include "JpCntx.h" +#include "CharDistribution.h" + +class nsEUCJPProber: public nsCharSetProber { +public: + nsEUCJPProber(PRBool aIsPreferredLanguage) + :mIsPreferredLanguage(aIsPreferredLanguage) + {mCodingSM = new nsCodingStateMachine(&EUCJPSMModel); + Reset();} + virtual ~nsEUCJPProber(void){delete mCodingSM;} + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName() {return "EUC-JP";} + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +protected: + nsCodingStateMachine* mCodingSM; + nsProbingState mState; + + EUCJPContextAnalysis mContextAnalyser; + EUCJPDistributionAnalysis mDistributionAnalyser; + + char mLastChar[2]; + PRBool mIsPreferredLanguage; +}; + + +#endif /* nsEUCJPProber_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp new file mode 100644 index 0000000..3632f1f --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.cpp @@ -0,0 +1,91 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsEUCKRProber.h" + +void nsEUCKRProber::Reset(void) +{ + mCodingSM->Reset(); + mState = eDetecting; + mDistributionAnalyser.Reset(mIsPreferredLanguage); + //mContextAnalyser.Reset(); +} + +nsProbingState nsEUCKRProber::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsSMState codingState; + + for (PRUint32 i = 0; i < aLen; i++) + { + codingState = mCodingSM->NextState(aBuf[i]); + if (codingState == eItsMe) + { + mState = eFoundIt; + break; + } + if (codingState == eStart) + { + PRUint32 charLen = mCodingSM->GetCurrentCharLen(); + + if (i == 0) + { + mLastChar[1] = aBuf[0]; + mDistributionAnalyser.HandleOneChar(mLastChar, charLen); + } + else + mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); + } + } + + mLastChar[0] = aBuf[aLen-1]; + + if (mState == eDetecting) + if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) + mState = eFoundIt; +// else +// mDistributionAnalyser.HandleData(aBuf, aLen); + + return mState; +} + +float nsEUCKRProber::GetConfidence(void) +{ + float distribCf = mDistributionAnalyser.GetConfidence(); + + return (float)distribCf; +} + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h new file mode 100644 index 0000000..8e09984 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCKRProber.h @@ -0,0 +1,75 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsEUCKRProber_h__ +#define nsEUCKRProber_h__ + +#include "nsCharSetProber.h" +#include "nsCodingStateMachine.h" +#include "CharDistribution.h" + +class nsEUCKRProber: public nsCharSetProber { +public: + nsEUCKRProber(PRBool aIsPreferredLanguage) + :mIsPreferredLanguage(aIsPreferredLanguage) + {mCodingSM = new nsCodingStateMachine(&EUCKRSMModel); + Reset(); + } + virtual ~nsEUCKRProber(void){delete mCodingSM;} + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName() {return "EUC-KR";} + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +protected: + void GetDistribution(PRUint32 aCharLen, const char* aStr); + + nsCodingStateMachine* mCodingSM; + nsProbingState mState; + + //EUCKRContextAnalysis mContextAnalyser; + EUCKRDistributionAnalysis mDistributionAnalyser; + char mLastChar[2]; + PRBool mIsPreferredLanguage; + +}; + + +#endif /* nsEUCKRProber_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp new file mode 100644 index 0000000..a06e074 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.cpp @@ -0,0 +1,91 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsEUCTWProber.h" + +void nsEUCTWProber::Reset(void) +{ + mCodingSM->Reset(); + mState = eDetecting; + mDistributionAnalyser.Reset(mIsPreferredLanguage); + //mContextAnalyser.Reset(); +} + +nsProbingState nsEUCTWProber::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsSMState codingState; + + for (PRUint32 i = 0; i < aLen; i++) + { + codingState = mCodingSM->NextState(aBuf[i]); + if (codingState == eItsMe) + { + mState = eFoundIt; + break; + } + if (codingState == eStart) + { + PRUint32 charLen = mCodingSM->GetCurrentCharLen(); + + if (i == 0) + { + mLastChar[1] = aBuf[0]; + mDistributionAnalyser.HandleOneChar(mLastChar, charLen); + } + else + mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); + } + } + + mLastChar[0] = aBuf[aLen-1]; + + if (mState == eDetecting) + if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) + mState = eFoundIt; +// else +// mDistributionAnalyser.HandleData(aBuf, aLen); + + return mState; +} + +float nsEUCTWProber::GetConfidence(void) +{ + float distribCf = mDistributionAnalyser.GetConfidence(); + + return (float)distribCf; +} + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h new file mode 100644 index 0000000..911d50b --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEUCTWProber.h @@ -0,0 +1,74 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsEUCTWProber_h__ +#define nsEUCTWProber_h__ + +#include "nsCharSetProber.h" +#include "nsCodingStateMachine.h" +#include "CharDistribution.h" + +class nsEUCTWProber: public nsCharSetProber { +public: + nsEUCTWProber(PRBool aIsPreferredLanguage) + :mIsPreferredLanguage(aIsPreferredLanguage) + {mCodingSM = new nsCodingStateMachine(&EUCTWSMModel); + Reset();} + virtual ~nsEUCTWProber(void){delete mCodingSM;} + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName() {return "x-euc-tw";} + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +protected: + void GetDistribution(PRUint32 aCharLen, const char* aStr); + + nsCodingStateMachine* mCodingSM; + nsProbingState mState; + + //EUCTWContextAnalysis mContextAnalyser; + EUCTWDistributionAnalysis mDistributionAnalyser; + char mLastChar[2]; + PRBool mIsPreferredLanguage; + +}; + + +#endif /* nsEUCTWProber_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.cpp new file mode 100644 index 0000000..464c753 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.cpp @@ -0,0 +1,101 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + +#include "nsEscCharsetProber.h" +#include "nsUniversalDetector.h" + +nsEscCharSetProber::nsEscCharSetProber(PRUint32 aLanguageFilter) +{ + for (PRUint32 i = 0; i < NUM_OF_ESC_CHARSETS; i++) + mCodingSM[i] = nsnull; + if (aLanguageFilter & NS_FILTER_CHINESE_SIMPLIFIED) + { + mCodingSM[0] = new nsCodingStateMachine(&HZSMModel); + mCodingSM[1] = new nsCodingStateMachine(&ISO2022CNSMModel); + } + if (aLanguageFilter & NS_FILTER_JAPANESE) + mCodingSM[2] = new nsCodingStateMachine(&ISO2022JPSMModel); + if (aLanguageFilter & NS_FILTER_KOREAN) + mCodingSM[3] = new nsCodingStateMachine(&ISO2022KRSMModel); + mActiveSM = NUM_OF_ESC_CHARSETS; + mState = eDetecting; + mDetectedCharset = nsnull; +} + +nsEscCharSetProber::~nsEscCharSetProber(void) +{ + for (PRUint32 i = 0; i < NUM_OF_ESC_CHARSETS; i++) + delete mCodingSM[i]; +} + +void nsEscCharSetProber::Reset(void) +{ + mState = eDetecting; + for (PRUint32 i = 0; i < NUM_OF_ESC_CHARSETS; i++) + if (mCodingSM[i]) + mCodingSM[i]->Reset(); + mActiveSM = NUM_OF_ESC_CHARSETS; + mDetectedCharset = nsnull; +} + +nsProbingState nsEscCharSetProber::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsSMState codingState; + PRInt32 j; + PRUint32 i; + + for ( i = 0; i < aLen && mState == eDetecting; i++) + { + for (j = mActiveSM-1; j>= 0; j--) + { + if (mCodingSM[j]) + { + codingState = mCodingSM[j]->NextState(aBuf[i]); + if (codingState == eItsMe) + { + mState = eFoundIt; + mDetectedCharset = mCodingSM[j]->GetCodingStateMachine(); + return mState; + } + } + } + } + + return mState; +} + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.h new file mode 100644 index 0000000..4b648e0 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscCharsetProber.h @@ -0,0 +1,67 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsEscCharSetProber_h__ +#define nsEscCharSetProber_h__ + +#include "nsCharSetProber.h" +#include "nsCodingStateMachine.h" + +#define NUM_OF_ESC_CHARSETS 4 + +class nsEscCharSetProber: public nsCharSetProber { +public: + nsEscCharSetProber(PRUint32 aLanguageFilter); + virtual ~nsEscCharSetProber(void); + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName() {return mDetectedCharset;} + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void){return (float)0.99;} + void SetOpion() {} + +protected: + void GetDistribution(PRUint32 aCharLen, const char* aStr); + + nsCodingStateMachine* mCodingSM[NUM_OF_ESC_CHARSETS] ; + PRUint32 mActiveSM; + nsProbingState mState; + const char * mDetectedCharset; +}; + +#endif /* nsEscCharSetProber_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp new file mode 100644 index 0000000..eed1b7c --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsEscSM.cpp @@ -0,0 +1,263 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#include "nsCodingStateMachine.h" + +static const PRUint32 HZ_cls[ 256 / 8 ] = { +PCK4BITS(1,0,0,0,0,0,0,0), // 00 - 07 +PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f +PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 +PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f +PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27 +PCK4BITS(0,0,0,0,0,0,0,0), // 28 - 2f +PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 +PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f +PCK4BITS(0,0,0,0,0,0,0,0), // 40 - 47 +PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f +PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 +PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f +PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 +PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f +PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 +PCK4BITS(0,0,0,4,0,5,2,0), // 78 - 7f +PCK4BITS(1,1,1,1,1,1,1,1), // 80 - 87 +PCK4BITS(1,1,1,1,1,1,1,1), // 88 - 8f +PCK4BITS(1,1,1,1,1,1,1,1), // 90 - 97 +PCK4BITS(1,1,1,1,1,1,1,1), // 98 - 9f +PCK4BITS(1,1,1,1,1,1,1,1), // a0 - a7 +PCK4BITS(1,1,1,1,1,1,1,1), // a8 - af +PCK4BITS(1,1,1,1,1,1,1,1), // b0 - b7 +PCK4BITS(1,1,1,1,1,1,1,1), // b8 - bf +PCK4BITS(1,1,1,1,1,1,1,1), // c0 - c7 +PCK4BITS(1,1,1,1,1,1,1,1), // c8 - cf +PCK4BITS(1,1,1,1,1,1,1,1), // d0 - d7 +PCK4BITS(1,1,1,1,1,1,1,1), // d8 - df +PCK4BITS(1,1,1,1,1,1,1,1), // e0 - e7 +PCK4BITS(1,1,1,1,1,1,1,1), // e8 - ef +PCK4BITS(1,1,1,1,1,1,1,1), // f0 - f7 +PCK4BITS(1,1,1,1,1,1,1,1) // f8 - ff +}; + + +static const PRUint32 HZ_st [ 6] = { +PCK4BITS(eStart,eError, 3,eStart,eStart,eStart,eError,eError),//00-07 +PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f +PCK4BITS(eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError),//10-17 +PCK4BITS( 5,eError, 6,eError, 5, 5, 4,eError),//18-1f +PCK4BITS( 4,eError, 4, 4, 4,eError, 4,eError),//20-27 +PCK4BITS( 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f +}; + +static const PRUint32 HZCharLenTable[] = {0, 0, 0, 0, 0, 0}; + +const SMModel HZSMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, HZ_cls }, + 6, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, HZ_st }, + HZCharLenTable, + "HZ-GB-2312", +}; + + +static const PRUint32 ISO2022CN_cls [ 256 / 8 ] = { +PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07 +PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f +PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 +PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f +PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27 +PCK4BITS(0,3,0,0,0,0,0,0), // 28 - 2f +PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 +PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f +PCK4BITS(0,0,0,4,0,0,0,0), // 40 - 47 +PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f +PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 +PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f +PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 +PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f +PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 +PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f +PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87 +PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f +PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97 +PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f +PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 +PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af +PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 +PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf +PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 +PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf +PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 +PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df +PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 +PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef +PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 +PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff +}; + + +static const PRUint32 ISO2022CN_st [ 8] = { +PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eStart,eStart),//00-07 +PCK4BITS(eStart,eError,eError,eError,eError,eError,eError,eError),//08-0f +PCK4BITS(eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//10-17 +PCK4BITS(eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError),//18-1f +PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//20-27 +PCK4BITS( 5, 6,eError,eError,eError,eError,eError,eError),//28-2f +PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//30-37 +PCK4BITS(eError,eError,eError,eError,eError,eItsMe,eError,eStart) //38-3f +}; + +static const PRUint32 ISO2022CNCharLenTable[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + +const SMModel ISO2022CNSMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022CN_cls }, + 9, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022CN_st }, + ISO2022CNCharLenTable, + "ISO-2022-CN", +}; + +static const PRUint32 ISO2022JP_cls [ 256 / 8 ] = { +PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07 +PCK4BITS(0,0,0,0,0,0,2,2), // 08 - 0f +PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 +PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f +PCK4BITS(0,0,0,0,7,0,0,0), // 20 - 27 +PCK4BITS(3,0,0,0,0,0,0,0), // 28 - 2f +PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 +PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f +PCK4BITS(6,0,4,0,8,0,0,0), // 40 - 47 +PCK4BITS(0,9,5,0,0,0,0,0), // 48 - 4f +PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 +PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f +PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 +PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f +PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 +PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f +PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87 +PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f +PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97 +PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f +PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 +PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af +PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 +PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf +PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 +PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf +PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 +PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df +PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 +PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef +PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 +PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff +}; + + +static const PRUint32 ISO2022JP_st [ 9] = { +PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eStart,eStart),//00-07 +PCK4BITS(eStart,eStart,eError,eError,eError,eError,eError,eError),//08-0f +PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//10-17 +PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError),//18-1f +PCK4BITS(eError, 5,eError,eError,eError, 4,eError,eError),//20-27 +PCK4BITS(eError,eError,eError, 6,eItsMe,eError,eItsMe,eError),//28-2f +PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//30-37 +PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//38-3f +PCK4BITS(eError,eError,eError,eError,eItsMe,eError,eStart,eStart) //40-47 +}; + +static const PRUint32 ISO2022JPCharLenTable[] = {0, 0, 0, 0, 0, 0, 0, 0}; + +const SMModel ISO2022JPSMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022JP_cls }, + 10, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022JP_st }, + ISO2022JPCharLenTable, + "ISO-2022-JP", +}; + +static const PRUint32 ISO2022KR_cls [ 256 / 8 ] = { +PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07 +PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f +PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 +PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f +PCK4BITS(0,0,0,0,3,0,0,0), // 20 - 27 +PCK4BITS(0,4,0,0,0,0,0,0), // 28 - 2f +PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 +PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f +PCK4BITS(0,0,0,5,0,0,0,0), // 40 - 47 +PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f +PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 +PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f +PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 +PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f +PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 +PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f +PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87 +PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f +PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97 +PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f +PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 +PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af +PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 +PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf +PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 +PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf +PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 +PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df +PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 +PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef +PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 +PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff +}; + + +static const PRUint32 ISO2022KR_st [ 5] = { +PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eError,eError),//00-07 +PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f +PCK4BITS(eItsMe,eItsMe,eError,eError,eError, 4,eError,eError),//10-17 +PCK4BITS(eError,eError,eError,eError, 5,eError,eError,eError),//18-1f +PCK4BITS(eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart) //20-27 +}; + +static const PRUint32 ISO2022KRCharLenTable[] = {0, 0, 0, 0, 0, 0}; + +const SMModel ISO2022KRSMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022KR_cls }, + 6, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022KR_st }, + ISO2022KRCharLenTable, + "ISO-2022-KR", +}; + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp new file mode 100644 index 0000000..b6d469c --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.cpp @@ -0,0 +1,96 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// for S-JIS encoding, obeserve characteristic: +// 1, kana character (or hankaku?) often have hight frequency of appereance +// 2, kana character often exist in group +// 3, certain combination of kana is never used in japanese language + +#include "nsGB2312Prober.h" + +void nsGB18030Prober::Reset(void) +{ + mCodingSM->Reset(); + mState = eDetecting; + mDistributionAnalyser.Reset(mIsPreferredLanguage); + //mContextAnalyser.Reset(); +} + +nsProbingState nsGB18030Prober::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsSMState codingState; + + for (PRUint32 i = 0; i < aLen; i++) + { + codingState = mCodingSM->NextState(aBuf[i]); + if (codingState == eItsMe) + { + mState = eFoundIt; + break; + } + if (codingState == eStart) + { + PRUint32 charLen = mCodingSM->GetCurrentCharLen(); + + if (i == 0) + { + mLastChar[1] = aBuf[0]; + mDistributionAnalyser.HandleOneChar(mLastChar, charLen); + } + else + mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); + } + } + + mLastChar[0] = aBuf[aLen-1]; + + if (mState == eDetecting) + if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) + mState = eFoundIt; +// else +// mDistributionAnalyser.HandleData(aBuf, aLen); + + return mState; +} + +float nsGB18030Prober::GetConfidence(void) +{ + float distribCf = mDistributionAnalyser.GetConfidence(); + + return (float)distribCf; +} + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h new file mode 100644 index 0000000..4bdac3b --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsGB2312Prober.h @@ -0,0 +1,76 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsGB2312Prober_h__ +#define nsGB2312Prober_h__ + +#include "nsCharSetProber.h" +#include "nsCodingStateMachine.h" +#include "CharDistribution.h" + +// We use gb18030 to replace gb2312, because 18030 is a superset. + +class nsGB18030Prober: public nsCharSetProber { +public: + nsGB18030Prober(PRBool aIsPreferredLanguage) + :mIsPreferredLanguage(aIsPreferredLanguage) + {mCodingSM = new nsCodingStateMachine(&GB18030SMModel); + Reset();} + virtual ~nsGB18030Prober(void){delete mCodingSM;} + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName() {return "gb18030";} + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +protected: + void GetDistribution(PRUint32 aCharLen, const char* aStr); + + nsCodingStateMachine* mCodingSM; + nsProbingState mState; + + //GB2312ContextAnalysis mContextAnalyser; + GB2312DistributionAnalysis mDistributionAnalyser; + char mLastChar[2]; + PRBool mIsPreferredLanguage; + +}; + + +#endif /* nsGB2312Prober_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp new file mode 100644 index 0000000..b148ce3 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.cpp @@ -0,0 +1,194 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Shy Shalom + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsHebrewProber.h" +#include + +// windows-1255 / ISO-8859-8 code points of interest +#define FINAL_KAF ('\xea') +#define NORMAL_KAF ('\xeb') +#define FINAL_MEM ('\xed') +#define NORMAL_MEM ('\xee') +#define FINAL_NUN ('\xef') +#define NORMAL_NUN ('\xf0') +#define FINAL_PE ('\xf3') +#define NORMAL_PE ('\xf4') +#define FINAL_TSADI ('\xf5') +#define NORMAL_TSADI ('\xf6') + +// Minimum Visual vs Logical final letter score difference. +// If the difference is below this, don't rely solely on the final letter score distance. +#define MIN_FINAL_CHAR_DISTANCE (5) + +// Minimum Visual vs Logical model score difference. +// If the difference is below this, don't rely at all on the model score distance. +#define MIN_MODEL_DISTANCE (0.01) + +#define VISUAL_HEBREW_NAME ("ISO-8859-8") +#define LOGICAL_HEBREW_NAME ("windows-1255") + +PRBool nsHebrewProber::isFinal(char c) +{ + return ((c == FINAL_KAF) || (c == FINAL_MEM) || (c == FINAL_NUN) || (c == FINAL_PE) || (c == FINAL_TSADI)); +} + +PRBool nsHebrewProber::isNonFinal(char c) +{ + return ((c == NORMAL_KAF) || (c == NORMAL_MEM) || (c == NORMAL_NUN) || (c == NORMAL_PE)); + // The normal Tsadi is not a good Non-Final letter due to words like + // 'lechotet' (to chat) containing an apostrophe after the tsadi. This + // apostrophe is converted to a space in FilterWithoutEnglishLetters causing + // the Non-Final tsadi to appear at an end of a word even though this is not + // the case in the original text. + // The letters Pe and Kaf rarely display a related behavior of not being a + // good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' for + // example legally end with a Non-Final Pe or Kaf. However, the benefit of + // these letters as Non-Final letters outweighs the damage since these words + // are quite rare. +} + +/** HandleData + * Final letter analysis for logical-visual decision. + * Look for evidence that the received buffer is either logical Hebrew or + * visual Hebrew. + * The following cases are checked: + * 1) A word longer than 1 letter, ending with a final letter. This is an + * indication that the text is laid out "naturally" since the final letter + * really appears at the end. +1 for logical score. + * 2) A word longer than 1 letter, ending with a Non-Final letter. In normal + * Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, should not end with + * the Non-Final form of that letter. Exceptions to this rule are mentioned + * above in isNonFinal(). This is an indication that the text is laid out + * backwards. +1 for visual score + * 3) A word longer than 1 letter, starting with a final letter. Final letters + * should not appear at the beginning of a word. This is an indication that + * the text is laid out backwards. +1 for visual score. + * + * The visual score and logical score are accumulated throughout the text and + * are finally checked against each other in GetCharSetName(). + * No checking for final letters in the middle of words is done since that case + * is not an indication for either Logical or Visual text. + * + * The input buffer should not contain any white spaces that are not (' ') + * or any low-ascii punctuation marks. + */ +nsProbingState nsHebrewProber::HandleData(const char* aBuf, PRUint32 aLen) +{ + // Both model probers say it's not them. No reason to continue. + if (GetState() == eNotMe) + return eNotMe; + + const char *curPtr, *endPtr = aBuf+aLen; + char cur; + + for (curPtr = (char*)aBuf; curPtr < endPtr; ++curPtr) + { + cur = *curPtr; + if (cur == ' ') // We stand on a space - a word just ended + { + if (mBeforePrev != ' ') // *(curPtr-2) was not a space so prev is not a 1 letter word + { + if (isFinal(mPrev)) // case (1) [-2:not space][-1:final letter][cur:space] + ++mFinalCharLogicalScore; + else if (isNonFinal(mPrev)) // case (2) [-2:not space][-1:Non-Final letter][cur:space] + ++mFinalCharVisualScore; + } + } + else // Not standing on a space + { + if ((mBeforePrev == ' ') && (isFinal(mPrev)) && (cur != ' ')) // case (3) [-2:space][-1:final letter][cur:not space] + ++mFinalCharVisualScore; + } + mBeforePrev = mPrev; + mPrev = cur; + } + + // Forever detecting, till the end or until both model probers return eNotMe (handled above). + return eDetecting; +} + +// Make the decision: is it Logical or Visual? +const char* nsHebrewProber::GetCharSetName() +{ + // If the final letter score distance is dominant enough, rely on it. + PRInt32 finalsub = mFinalCharLogicalScore - mFinalCharVisualScore; + if (finalsub >= MIN_FINAL_CHAR_DISTANCE) + return LOGICAL_HEBREW_NAME; + if (finalsub <= -(MIN_FINAL_CHAR_DISTANCE)) + return VISUAL_HEBREW_NAME; + + // It's not dominant enough, try to rely on the model scores instead. + float modelsub = mLogicalProb->GetConfidence() - mVisualProb->GetConfidence(); + if (modelsub > MIN_MODEL_DISTANCE) + return LOGICAL_HEBREW_NAME; + if (modelsub < -(MIN_MODEL_DISTANCE)) + return VISUAL_HEBREW_NAME; + + // Still no good, back to final letter distance, maybe it'll save the day. + if (finalsub < 0) + return VISUAL_HEBREW_NAME; + + // (finalsub > 0 - Logical) or (don't know what to do) default to Logical. + return LOGICAL_HEBREW_NAME; +} + + +void nsHebrewProber::Reset(void) +{ + mFinalCharLogicalScore = 0; + mFinalCharVisualScore = 0; + + // mPrev and mBeforePrev are initialized to space in order to simulate a word + // delimiter at the beginning of the data + mPrev = ' '; + mBeforePrev = ' '; +} + +nsProbingState nsHebrewProber::GetState(void) +{ + // Remain active as long as any of the model probers are active. + if ((mLogicalProb->GetState() == eNotMe) && (mVisualProb->GetState() == eNotMe)) + return eNotMe; + return eDetecting; +} + +#ifdef DEBUG_chardet +void nsHebrewProber::DumpStatus() +{ + printf(" HEB: %d - %d [Logical-Visual score]\r\n", mFinalCharLogicalScore, mFinalCharVisualScore); +} +#endif diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.h new file mode 100644 index 0000000..eedfed4 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsHebrewProber.h @@ -0,0 +1,176 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Shy Shalom + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer: All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsHebrewProber_h__ +#define nsHebrewProber_h__ + +#include "nsSBCharSetProber.h" + +// This prober doesn't actually recognize a language or a charset. +// It is a helper prober for the use of the Hebrew model probers +class nsHebrewProber: public nsCharSetProber +{ +public: + nsHebrewProber(void) :mLogicalProb(0), mVisualProb(0) { Reset(); } + + virtual ~nsHebrewProber(void) {} + virtual nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + virtual const char* GetCharSetName(); + virtual void Reset(void); + + virtual nsProbingState GetState(void); + + virtual float GetConfidence(void) { return (float)0.0; } + virtual void SetOpion() {} + + void SetModelProbers(nsCharSetProber *logicalPrb, nsCharSetProber *visualPrb) + { mLogicalProb = logicalPrb; mVisualProb = visualPrb; } + +#ifdef DEBUG_chardet + virtual void DumpStatus(); +#endif + +protected: + static PRBool isFinal(char c); + static PRBool isNonFinal(char c); + + PRInt32 mFinalCharLogicalScore, mFinalCharVisualScore; + + // The two last characters seen in the previous buffer. + char mPrev, mBeforePrev; + + // These probers are owned by the group prober. + nsCharSetProber *mLogicalProb, *mVisualProb; +}; + +/** + * ** General ideas of the Hebrew charset recognition ** + * + * Four main charsets exist in Hebrew: + * "ISO-8859-8" - Visual Hebrew + * "windows-1255" - Logical Hebrew + * "ISO-8859-8-I" - Logical Hebrew + * "x-mac-hebrew" - ?? Logical Hebrew ?? + * + * Both "ISO" charsets use a completely identical set of code points, whereas + * "windows-1255" and "x-mac-hebrew" are two different proper supersets of + * these code points. windows-1255 defines additional characters in the range + * 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific + * diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. + * x-mac-hebrew defines similar additional code points but with a different + * mapping. + * + * As far as an average Hebrew text with no diacritics is concerned, all four + * charsets are identical with respect to code points. Meaning that for the + * main Hebrew alphabet, all four map the same values to all 27 Hebrew letters + * (including final letters). + * + * The dominant difference between these charsets is their directionality. + * "Visual" directionality means that the text is ordered as if the renderer is + * not aware of a BIDI rendering algorithm. The renderer sees the text and + * draws it from left to right. The text itself when ordered naturally is read + * backwards. A buffer of Visual Hebrew generally looks like so: + * "[last word of first line spelled backwards] [whole line ordered backwards + * and spelled backwards] [first word of first line spelled backwards] + * [end of line] [last word of second line] ... etc' " + * adding punctuation marks, numbers and English text to visual text is + * naturally also "visual" and from left to right. + * + * "Logical" directionality means the text is ordered "naturally" according to + * the order it is read. It is the responsibility of the renderer to display + * the text from right to left. A BIDI algorithm is used to place general + * punctuation marks, numbers and English text in the text. + * + * Texts in x-mac-hebrew are almost impossible to find on the Internet. From + * what little evidence I could find, it seems that its general directionality + * is Logical. + * + * To sum up all of the above, the Hebrew probing mechanism knows about two + * charsets: + * Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are + * backwards while line order is natural. For charset recognition purposes + * the line order is unimportant (In fact, for this implementation, even + * word order is unimportant). + * Logical Hebrew - "windows-1255" - normal, naturally ordered text. + * + * "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be + * specifically identified. + * "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew + * that contain special punctuation marks or diacritics is displayed with + * some unconverted characters showing as question marks. This problem might + * be corrected using another model prober for x-mac-hebrew. Due to the fact + * that x-mac-hebrew texts are so rare, writing another model prober isn't + * worth the effort and performance hit. + * + * *** The Prober *** + * + * The prober is divided between two nsSBCharSetProbers and an nsHebrewProber, + * all of which are managed, created, fed data, inquired and deleted by the + * nsSBCSGroupProber. The two nsSBCharSetProbers identify that the text is in + * fact some kind of Hebrew, Logical or Visual. The final decision about which + * one is it is made by the nsHebrewProber by combining final-letter scores + * with the scores of the two nsSBCharSetProbers to produce a final answer. + * + * The nsSBCSGroupProber is responsible for stripping the original text of HTML + * tags, English characters, numbers, low-ASCII punctuation characters, spaces + * and new lines. It reduces any sequence of such characters to a single space. + * The buffer fed to each prober in the SBCS group prober is pure text in + * high-ASCII. + * The two nsSBCharSetProbers (model probers) share the same language model: + * Win1255Model. + * The first nsSBCharSetProber uses the model normally as any other + * nsSBCharSetProber does, to recognize windows-1255, upon which this model was + * built. The second nsSBCharSetProber is told to make the pair-of-letter + * lookup in the language model backwards. This in practice exactly simulates + * a visual Hebrew model using the windows-1255 logical Hebrew model. + * + * The nsHebrewProber is not using any language model. All it does is look for + * final-letter evidence suggesting the text is either logical Hebrew or visual + * Hebrew. Disjointed from the model probers, the results of the nsHebrewProber + * alone are meaningless. nsHebrewProber always returns 0.00 as confidence + * since it never identifies a charset by itself. Instead, the pointer to the + * nsHebrewProber is passed to the model probers as a helper "Name Prober". + * When the Group prober receives a positive identification from any prober, + * it asks for the name of the charset identified. If the prober queried is a + * Hebrew model prober, the model prober forwards the call to the + * nsHebrewProber to make the final decision. In the nsHebrewProber, the + * decision is made according to the final-letters scores maintained and Both + * model probers scores. The answer is returned in the form of the name of the + * charset identified, either "windows-1255" or "ISO-8859-8". + * + */ +#endif /* nsHebrewProber_h__ */ diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp new file mode 100644 index 0000000..7694ef7 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.cpp @@ -0,0 +1,182 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsLatin1Prober.h" +#include "prmem.h" +#include + +#define UDF 0 // undefined +#define OTH 1 //other +#define ASC 2 // ascii capital letter +#define ASS 3 // ascii small letter +#define ACV 4 // accent capital vowel +#define ACO 5 // accent capital other +#define ASV 6 // accent small vowel +#define ASO 7 // accent small other +#define CLASS_NUM 8 // total classes + +static const unsigned char Latin1_CharToClass[] = +{ + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, // 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, // 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, // 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, // 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, // 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, // 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, // 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, // B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, // C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, // C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, // D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, // D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, // E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, // E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, // F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, // F8 - FF +}; + + +/* 0 : illegal + 1 : very unlikely + 2 : normal + 3 : very likely +*/ +static const unsigned char Latin1ClassModel[] = +{ +/* UDF OTH ASC ASS ACV ACO ASV ASO */ +/*UDF*/ 0, 0, 0, 0, 0, 0, 0, 0, +/*OTH*/ 0, 3, 3, 3, 3, 3, 3, 3, +/*ASC*/ 0, 3, 3, 3, 3, 3, 3, 3, +/*ASS*/ 0, 3, 3, 3, 1, 1, 3, 3, +/*ACV*/ 0, 3, 3, 3, 1, 2, 1, 2, +/*ACO*/ 0, 3, 3, 3, 3, 3, 3, 3, +/*ASV*/ 0, 3, 1, 3, 1, 1, 1, 3, +/*ASO*/ 0, 3, 1, 3, 1, 1, 3, 3, +}; + +void nsLatin1Prober::Reset(void) +{ + mState = eDetecting; + mLastCharClass = OTH; + for (int i = 0; i < FREQ_CAT_NUM; i++) + mFreqCounter[i] = 0; +} + + +nsProbingState nsLatin1Prober::HandleData(const char* aBuf, PRUint32 aLen) +{ + char *newBuf1 = 0; + PRUint32 newLen1 = 0; + + if (!FilterWithEnglishLetters(aBuf, aLen, &newBuf1, newLen1)) { + newBuf1 = (char*)aBuf; + newLen1 = aLen; + } + + unsigned char charClass; + unsigned char freq; + for (PRUint32 i = 0; i < newLen1; i++) + { + charClass = Latin1_CharToClass[(unsigned char)newBuf1[i]]; + freq = Latin1ClassModel[mLastCharClass*CLASS_NUM + charClass]; + if (freq == 0) { + mState = eNotMe; + break; + } + mFreqCounter[freq]++; + mLastCharClass = charClass; + } + + if (newBuf1 != aBuf) + PR_FREEIF(newBuf1); + + return mState; +} + +float nsLatin1Prober::GetConfidence(void) +{ + if (mState == eNotMe) + return 0.01f; + + float confidence; + PRUint32 total = 0; + for (PRInt32 i = 0; i < FREQ_CAT_NUM; i++) + total += mFreqCounter[i]; + + if(!total) + confidence = 0.0f; + else + { + confidence = mFreqCounter[3]*1.0f / total; + confidence -= mFreqCounter[1]*20.0f/total; + } + + if (confidence < 0.0f) + confidence = 0.0f; + + // lower the confidence of latin1 so that other more accurate detector + // can take priority. + confidence *= 0.50f; + + return confidence; +} + +#ifdef DEBUG_chardet +void nsLatin1Prober::DumpStatus() +{ + printf(" Latin1Prober: %1.3f [%s]\r\n", GetConfidence(), GetCharSetName()); +} +#endif + + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h new file mode 100644 index 0000000..5145e96 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsLatin1Prober.h @@ -0,0 +1,70 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsLatin1Prober_h__ +#define nsLatin1Prober_h__ + +#include "nsCharSetProber.h" + +#define FREQ_CAT_NUM 4 + +class nsLatin1Prober: public nsCharSetProber { +public: + nsLatin1Prober(void){Reset();} + virtual ~nsLatin1Prober(void){} + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName() {return "windows-1252";} + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +#ifdef DEBUG_chardet + virtual void DumpStatus(); +#endif + +protected: + + nsProbingState mState; + char mLastCharClass; + PRUint32 mFreqCounter[FREQ_CAT_NUM]; +}; + + +#endif /* nsLatin1Prober_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.cpp new file mode 100644 index 0000000..f161165 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.cpp @@ -0,0 +1,230 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * Proofpoint, Inc. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#include + +#include "nsMBCSGroupProber.h" +#include "nsUniversalDetector.h" + +#if defined(DEBUG_chardet) || defined(DEBUG_jgmyers) +const char *ProberName[] = +{ + "UTF8", + "SJIS", + "EUCJP", + "GB18030", + "EUCKR", + "Big5", + "EUCTW", +}; + +#endif + +nsMBCSGroupProber::nsMBCSGroupProber(PRUint32 aLanguageFilter) +{ + for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) + mProbers[i] = nsnull; + + mProbers[0] = new nsUTF8Prober(); + if (aLanguageFilter & NS_FILTER_JAPANESE) + { + mProbers[1] = new nsSJISProber(aLanguageFilter == NS_FILTER_JAPANESE); + mProbers[2] = new nsEUCJPProber(aLanguageFilter == NS_FILTER_JAPANESE); + } + if (aLanguageFilter & NS_FILTER_CHINESE_SIMPLIFIED) + mProbers[3] = new nsGB18030Prober(aLanguageFilter == NS_FILTER_CHINESE_SIMPLIFIED); + if (aLanguageFilter & NS_FILTER_KOREAN) + mProbers[4] = new nsEUCKRProber(aLanguageFilter == NS_FILTER_KOREAN); + if (aLanguageFilter & NS_FILTER_CHINESE_TRADITIONAL) + { + mProbers[5] = new nsBig5Prober(aLanguageFilter == NS_FILTER_CHINESE_TRADITIONAL); + mProbers[6] = new nsEUCTWProber(aLanguageFilter == NS_FILTER_CHINESE_TRADITIONAL); + } + Reset(); +} + +nsMBCSGroupProber::~nsMBCSGroupProber() +{ + for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) + { + delete mProbers[i]; + } +} + +const char* nsMBCSGroupProber::GetCharSetName() +{ + if (mBestGuess == -1) + { + GetConfidence(); + if (mBestGuess == -1) + mBestGuess = 0; + } + return mProbers[mBestGuess]->GetCharSetName(); +} + +void nsMBCSGroupProber::Reset(void) +{ + mActiveNum = 0; + for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) + { + if (mProbers[i]) + { + mProbers[i]->Reset(); + mIsActive[i] = PR_TRUE; + ++mActiveNum; + } + else + mIsActive[i] = PR_FALSE; + } + mBestGuess = -1; + mState = eDetecting; + mKeepNext = 0; +} + +nsProbingState nsMBCSGroupProber::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsProbingState st; + PRUint32 start = 0; + PRUint32 keepNext = mKeepNext; + + //do filtering to reduce load to probers + for (PRUint32 pos = 0; pos < aLen; ++pos) + { + if (aBuf[pos] & 0x80) + { + if (!keepNext) + start = pos; + keepNext = 2; + } + else if (keepNext) + { + if (--keepNext == 0) + { + for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) + { + if (!mIsActive[i]) + continue; + st = mProbers[i]->HandleData(aBuf + start, pos + 1 - start); + if (st == eFoundIt) + { + mBestGuess = i; + mState = eFoundIt; + return mState; + } + } + } + } + } + + if (keepNext) { + for (PRUint32 i = 0; i < NUM_OF_PROBERS; i++) + { + if (!mIsActive[i]) + continue; + st = mProbers[i]->HandleData(aBuf + start, aLen - start); + if (st == eFoundIt) + { + mBestGuess = i; + mState = eFoundIt; + return mState; + } + } + } + mKeepNext = keepNext; + + return mState; +} + +float nsMBCSGroupProber::GetConfidence(void) +{ + PRUint32 i; + float bestConf = 0.0, cf; + + switch (mState) + { + case eFoundIt: + return (float)0.99; + case eNotMe: + return (float)0.01; + default: + for (i = 0; i < NUM_OF_PROBERS; i++) + { + if (!mIsActive[i]) + continue; + cf = mProbers[i]->GetConfidence(); + if (bestConf < cf) + { + bestConf = cf; + mBestGuess = i; + } + } + } + return bestConf; +} + +#ifdef DEBUG_chardet +void nsMBCSGroupProber::DumpStatus() +{ + PRUint32 i; + float cf; + + GetConfidence(); + for (i = 0; i < NUM_OF_PROBERS; i++) + { + if (!mIsActive[i]) + printf(" MBCS inactive: [%s] (confidence is too low).\r\n", ProberName[i]); + else + { + cf = mProbers[i]->GetConfidence(); + printf(" MBCS %1.3f: [%s]\r\n", cf, ProberName[i]); + } + } +} +#endif + +#ifdef DEBUG_jgmyers +void nsMBCSGroupProber::GetDetectorState(nsUniversalDetector::DetectorState (&states)[nsUniversalDetector::NumDetectors], PRUint32 &offset) +{ + for (PRUint32 i = 0; i < NUM_OF_PROBERS; ++i) { + states[offset].name = ProberName[i]; + states[offset].isActive = mIsActive[i]; + states[offset].confidence = mIsActive[i] ? mProbers[i]->GetConfidence() : 0.0; + ++offset; + } +} +#endif /* DEBUG_jgmyers */ diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.h new file mode 100644 index 0000000..c4e9964 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSGroupProber.h @@ -0,0 +1,80 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Proofpoint, Inc. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsMBCSGroupProber_h__ +#define nsMBCSGroupProber_h__ + +#include "nsSJISProber.h" +#include "nsUTF8Prober.h" +#include "nsEUCJPProber.h" +#include "nsGB2312Prober.h" +#include "nsEUCKRProber.h" +#include "nsBig5Prober.h" +#include "nsEUCTWProber.h" + +#define NUM_OF_PROBERS 7 + +class nsMBCSGroupProber: public nsCharSetProber { +public: + nsMBCSGroupProber(PRUint32 aLanguageFilter); + virtual ~nsMBCSGroupProber(); + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName(); + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +#ifdef DEBUG_chardet + void DumpStatus(); +#endif +#ifdef DEBUG_jgmyers + void GetDetectorState(nsUniversalDetector::DetectorState (&states)[nsUniversalDetector::NumDetectors], PRUint32 &offset); +#endif + +protected: + nsProbingState mState; + nsCharSetProber* mProbers[NUM_OF_PROBERS]; + PRBool mIsActive[NUM_OF_PROBERS]; + PRInt32 mBestGuess; + PRUint32 mActiveNum; + PRUint32 mKeepNext; +}; + +#endif /* nsMBCSGroupProber_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp new file mode 100644 index 0000000..584e931 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsMBCSSM.cpp @@ -0,0 +1,513 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#include "nsCodingStateMachine.h" + +/* +Modification from frank tang's original work: +. 0x00 is allowed as a legal character. Since some web pages contains this char in + text stream. +*/ + +// BIG5 + +static const PRUint32 BIG5_cls [ 256 / 8 ] = { +//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 +PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 //allow 0x00 as legal value +PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f +PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 +PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f +PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 +PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f +PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 +PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f +PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 +PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f +PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 +PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f +PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 +PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f +PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 +PCK4BITS(2,2,2,2,2,2,2,1), // 78 - 7f +PCK4BITS(4,4,4,4,4,4,4,4), // 80 - 87 +PCK4BITS(4,4,4,4,4,4,4,4), // 88 - 8f +PCK4BITS(4,4,4,4,4,4,4,4), // 90 - 97 +PCK4BITS(4,4,4,4,4,4,4,4), // 98 - 9f +PCK4BITS(4,3,3,3,3,3,3,3), // a0 - a7 +PCK4BITS(3,3,3,3,3,3,3,3), // a8 - af +PCK4BITS(3,3,3,3,3,3,3,3), // b0 - b7 +PCK4BITS(3,3,3,3,3,3,3,3), // b8 - bf +PCK4BITS(3,3,3,3,3,3,3,3), // c0 - c7 +PCK4BITS(3,3,3,3,3,3,3,3), // c8 - cf +PCK4BITS(3,3,3,3,3,3,3,3), // d0 - d7 +PCK4BITS(3,3,3,3,3,3,3,3), // d8 - df +PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7 +PCK4BITS(3,3,3,3,3,3,3,3), // e8 - ef +PCK4BITS(3,3,3,3,3,3,3,3), // f0 - f7 +PCK4BITS(3,3,3,3,3,3,3,0) // f8 - ff +}; + + +static const PRUint32 BIG5_st [ 3] = { +PCK4BITS(eError,eStart,eStart, 3,eError,eError,eError,eError),//00-07 +PCK4BITS(eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError),//08-0f +PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart) //10-17 +}; + +static const PRUint32 Big5CharLenTable[] = {0, 1, 1, 2, 0}; + +SMModel const Big5SMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_cls }, + 5, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_st }, + Big5CharLenTable, + "Big5", +}; + +static const PRUint32 EUCJP_cls [ 256 / 8 ] = { +//PCK4BITS(5,4,4,4,4,4,4,4), // 00 - 07 +PCK4BITS(4,4,4,4,4,4,4,4), // 00 - 07 +PCK4BITS(4,4,4,4,4,4,5,5), // 08 - 0f +PCK4BITS(4,4,4,4,4,4,4,4), // 10 - 17 +PCK4BITS(4,4,4,5,4,4,4,4), // 18 - 1f +PCK4BITS(4,4,4,4,4,4,4,4), // 20 - 27 +PCK4BITS(4,4,4,4,4,4,4,4), // 28 - 2f +PCK4BITS(4,4,4,4,4,4,4,4), // 30 - 37 +PCK4BITS(4,4,4,4,4,4,4,4), // 38 - 3f +PCK4BITS(4,4,4,4,4,4,4,4), // 40 - 47 +PCK4BITS(4,4,4,4,4,4,4,4), // 48 - 4f +PCK4BITS(4,4,4,4,4,4,4,4), // 50 - 57 +PCK4BITS(4,4,4,4,4,4,4,4), // 58 - 5f +PCK4BITS(4,4,4,4,4,4,4,4), // 60 - 67 +PCK4BITS(4,4,4,4,4,4,4,4), // 68 - 6f +PCK4BITS(4,4,4,4,4,4,4,4), // 70 - 77 +PCK4BITS(4,4,4,4,4,4,4,4), // 78 - 7f +PCK4BITS(5,5,5,5,5,5,5,5), // 80 - 87 +PCK4BITS(5,5,5,5,5,5,1,3), // 88 - 8f +PCK4BITS(5,5,5,5,5,5,5,5), // 90 - 97 +PCK4BITS(5,5,5,5,5,5,5,5), // 98 - 9f +PCK4BITS(5,2,2,2,2,2,2,2), // a0 - a7 +PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af +PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 +PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf +PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 +PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf +PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 +PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df +PCK4BITS(0,0,0,0,0,0,0,0), // e0 - e7 +PCK4BITS(0,0,0,0,0,0,0,0), // e8 - ef +PCK4BITS(0,0,0,0,0,0,0,0), // f0 - f7 +PCK4BITS(0,0,0,0,0,0,0,5) // f8 - ff +}; + + +static const PRUint32 EUCJP_st [ 5] = { +PCK4BITS( 3, 4, 3, 5,eStart,eError,eError,eError),//00-07 +PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f +PCK4BITS(eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError),//10-17 +PCK4BITS(eError,eError,eStart,eError,eError,eError, 3,eError),//18-1f +PCK4BITS( 3,eError,eError,eError,eStart,eStart,eStart,eStart) //20-27 +}; + +static const PRUint32 EUCJPCharLenTable[] = {2, 2, 2, 3, 1, 0}; + +const SMModel EUCJPSMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCJP_cls }, + 6, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCJP_st }, + EUCJPCharLenTable, + "EUC-JP", +}; + +static const PRUint32 EUCKR_cls [ 256 / 8 ] = { +//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 +PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 +PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f +PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 +PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f +PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 +PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f +PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 +PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f +PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47 +PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f +PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57 +PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f +PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67 +PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f +PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77 +PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f +PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87 +PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f +PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97 +PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f +PCK4BITS(0,2,2,2,2,2,2,2), // a0 - a7 +PCK4BITS(2,2,2,2,2,3,3,3), // a8 - af +PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 +PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf +PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 +PCK4BITS(2,3,2,2,2,2,2,2), // c8 - cf +PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 +PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df +PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 +PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef +PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 +PCK4BITS(2,2,2,2,2,2,2,0) // f8 - ff +}; + + +static const PRUint32 EUCKR_st [ 2] = { +PCK4BITS(eError,eStart, 3,eError,eError,eError,eError,eError),//00-07 +PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f +}; + +static const PRUint32 EUCKRCharLenTable[] = {0, 1, 2, 0}; + +const SMModel EUCKRSMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_cls }, + 4, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_st }, + EUCKRCharLenTable, + "EUC-KR", +}; + +static const PRUint32 EUCTW_cls [ 256 / 8 ] = { +//PCK4BITS(0,2,2,2,2,2,2,2), // 00 - 07 +PCK4BITS(2,2,2,2,2,2,2,2), // 00 - 07 +PCK4BITS(2,2,2,2,2,2,0,0), // 08 - 0f +PCK4BITS(2,2,2,2,2,2,2,2), // 10 - 17 +PCK4BITS(2,2,2,0,2,2,2,2), // 18 - 1f +PCK4BITS(2,2,2,2,2,2,2,2), // 20 - 27 +PCK4BITS(2,2,2,2,2,2,2,2), // 28 - 2f +PCK4BITS(2,2,2,2,2,2,2,2), // 30 - 37 +PCK4BITS(2,2,2,2,2,2,2,2), // 38 - 3f +PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 +PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f +PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 +PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f +PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 +PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f +PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 +PCK4BITS(2,2,2,2,2,2,2,2), // 78 - 7f +PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87 +PCK4BITS(0,0,0,0,0,0,6,0), // 88 - 8f +PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97 +PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f +PCK4BITS(0,3,4,4,4,4,4,4), // a0 - a7 +PCK4BITS(5,5,1,1,1,1,1,1), // a8 - af +PCK4BITS(1,1,1,1,1,1,1,1), // b0 - b7 +PCK4BITS(1,1,1,1,1,1,1,1), // b8 - bf +PCK4BITS(1,1,3,1,3,3,3,3), // c0 - c7 +PCK4BITS(3,3,3,3,3,3,3,3), // c8 - cf +PCK4BITS(3,3,3,3,3,3,3,3), // d0 - d7 +PCK4BITS(3,3,3,3,3,3,3,3), // d8 - df +PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7 +PCK4BITS(3,3,3,3,3,3,3,3), // e8 - ef +PCK4BITS(3,3,3,3,3,3,3,3), // f0 - f7 +PCK4BITS(3,3,3,3,3,3,3,0) // f8 - ff +}; + + +static const PRUint32 EUCTW_st [ 6] = { +PCK4BITS(eError,eError,eStart, 3, 3, 3, 4,eError),//00-07 +PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f +PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError),//10-17 +PCK4BITS(eStart,eStart,eStart,eError,eError,eError,eError,eError),//18-1f +PCK4BITS( 5,eError,eError,eError,eStart,eError,eStart,eStart),//20-27 +PCK4BITS(eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f +}; + +static const PRUint32 EUCTWCharLenTable[] = {0, 0, 1, 2, 2, 2, 3}; + +const SMModel EUCTWSMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_cls }, + 7, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_st }, + EUCTWCharLenTable, + "x-euc-tw", +}; + +/* obsolete GB2312 by gb18030 +static PRUint32 GB2312_cls [ 256 / 8 ] = { +//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 +PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 +PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f +PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 +PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f +PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 +PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f +PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 +PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f +PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47 +PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f +PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57 +PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f +PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67 +PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f +PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77 +PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f +PCK4BITS(1,0,0,0,0,0,0,0), // 80 - 87 +PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f +PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97 +PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f +PCK4BITS(0,2,2,2,2,2,2,2), // a0 - a7 +PCK4BITS(2,2,3,3,3,3,3,3), // a8 - af +PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 +PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf +PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 +PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf +PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 +PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df +PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 +PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef +PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 +PCK4BITS(2,2,2,2,2,2,2,0) // f8 - ff +}; + + +static PRUint32 GB2312_st [ 2] = { +PCK4BITS(eError,eStart, 3,eError,eError,eError,eError,eError),//00-07 +PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f +}; + +static const PRUint32 GB2312CharLenTable[] = {0, 1, 2, 0}; + +SMModel GB2312SMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_cls }, + 4, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_st }, + GB2312CharLenTable, + "GB2312", +}; +*/ + +// the following state machine data was created by perl script in +// intl/chardet/tools. It should be the same as in PSM detector. +static const PRUint32 GB18030_cls [ 256 / 8 ] = { +PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 +PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f +PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 +PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f +PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 +PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f +PCK4BITS(3,3,3,3,3,3,3,3), // 30 - 37 +PCK4BITS(3,3,1,1,1,1,1,1), // 38 - 3f +PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 +PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f +PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 +PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f +PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 +PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f +PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 +PCK4BITS(2,2,2,2,2,2,2,4), // 78 - 7f +PCK4BITS(5,6,6,6,6,6,6,6), // 80 - 87 +PCK4BITS(6,6,6,6,6,6,6,6), // 88 - 8f +PCK4BITS(6,6,6,6,6,6,6,6), // 90 - 97 +PCK4BITS(6,6,6,6,6,6,6,6), // 98 - 9f +PCK4BITS(6,6,6,6,6,6,6,6), // a0 - a7 +PCK4BITS(6,6,6,6,6,6,6,6), // a8 - af +PCK4BITS(6,6,6,6,6,6,6,6), // b0 - b7 +PCK4BITS(6,6,6,6,6,6,6,6), // b8 - bf +PCK4BITS(6,6,6,6,6,6,6,6), // c0 - c7 +PCK4BITS(6,6,6,6,6,6,6,6), // c8 - cf +PCK4BITS(6,6,6,6,6,6,6,6), // d0 - d7 +PCK4BITS(6,6,6,6,6,6,6,6), // d8 - df +PCK4BITS(6,6,6,6,6,6,6,6), // e0 - e7 +PCK4BITS(6,6,6,6,6,6,6,6), // e8 - ef +PCK4BITS(6,6,6,6,6,6,6,6), // f0 - f7 +PCK4BITS(6,6,6,6,6,6,6,0) // f8 - ff +}; + + +static const PRUint32 GB18030_st [ 6] = { +PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart, 3,eError),//00-07 +PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f +PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart),//10-17 +PCK4BITS( 4,eError,eStart,eStart,eError,eError,eError,eError),//18-1f +PCK4BITS(eError,eError, 5,eError,eError,eError,eItsMe,eError),//20-27 +PCK4BITS(eError,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f +}; + +// To be accurate, the length of class 6 can be either 2 or 4. +// But it is not necessary to discriminate between the two since +// it is used for frequency analysis only, and we are validing +// each code range there as well. So it is safe to set it to be +// 2 here. +static const PRUint32 GB18030CharLenTable[] = {0, 1, 1, 1, 1, 1, 2}; + +const SMModel GB18030SMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_cls }, + 7, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_st }, + GB18030CharLenTable, + "GB18030", +}; + +// sjis + +static const PRUint32 SJIS_cls [ 256 / 8 ] = { +//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 +PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 +PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f +PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 +PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f +PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 +PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f +PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 +PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f +PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 +PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f +PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 +PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f +PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 +PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f +PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 +PCK4BITS(2,2,2,2,2,2,2,1), // 78 - 7f +PCK4BITS(3,3,3,3,3,3,3,3), // 80 - 87 +PCK4BITS(3,3,3,3,3,3,3,3), // 88 - 8f +PCK4BITS(3,3,3,3,3,3,3,3), // 90 - 97 +PCK4BITS(3,3,3,3,3,3,3,3), // 98 - 9f +//0xa0 is illegal in sjis encoding, but some pages does +//contain such byte. We need to be more error forgiven. +PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 +PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af +PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 +PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf +PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 +PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf +PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 +PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df +PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7 +PCK4BITS(3,3,3,3,3,4,4,4), // e8 - ef +PCK4BITS(4,4,4,4,4,4,4,4), // f0 - f7 +PCK4BITS(4,4,4,4,4,0,0,0) // f8 - ff +}; + + +static const PRUint32 SJIS_st [ 3] = { +PCK4BITS(eError,eStart,eStart, 3,eError,eError,eError,eError),//00-07 +PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f +PCK4BITS(eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart) //10-17 +}; + +static const PRUint32 SJISCharLenTable[] = {0, 1, 1, 2, 0, 0}; + +const SMModel SJISSMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, SJIS_cls }, + 6, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, SJIS_st }, + SJISCharLenTable, + "Shift_JIS", +}; + + +static const PRUint32 UTF8_cls [ 256 / 8 ] = { +//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 +PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 //allow 0x00 as a legal value +PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f +PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 +PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f +PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 +PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f +PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 +PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f +PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47 +PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f +PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57 +PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f +PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67 +PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f +PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77 +PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f +PCK4BITS(2,2,2,2,3,3,3,3), // 80 - 87 +PCK4BITS(4,4,4,4,4,4,4,4), // 88 - 8f +PCK4BITS(4,4,4,4,4,4,4,4), // 90 - 97 +PCK4BITS(4,4,4,4,4,4,4,4), // 98 - 9f +PCK4BITS(5,5,5,5,5,5,5,5), // a0 - a7 +PCK4BITS(5,5,5,5,5,5,5,5), // a8 - af +PCK4BITS(5,5,5,5,5,5,5,5), // b0 - b7 +PCK4BITS(5,5,5,5,5,5,5,5), // b8 - bf +PCK4BITS(0,0,6,6,6,6,6,6), // c0 - c7 +PCK4BITS(6,6,6,6,6,6,6,6), // c8 - cf +PCK4BITS(6,6,6,6,6,6,6,6), // d0 - d7 +PCK4BITS(6,6,6,6,6,6,6,6), // d8 - df +PCK4BITS(7,8,8,8,8,8,8,8), // e0 - e7 +PCK4BITS(8,8,8,8,8,9,8,8), // e8 - ef +PCK4BITS(10,11,11,11,11,11,11,11), // f0 - f7 +PCK4BITS(12,13,13,13,14,15,0,0) // f8 - ff +}; + + +static const PRUint32 UTF8_st [ 26] = { +PCK4BITS(eError,eStart,eError,eError,eError,eError, 12, 10),//00-07 +PCK4BITS( 9, 11, 8, 7, 6, 5, 4, 3),//08-0f +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//10-17 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//18-1f +PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//20-27 +PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//28-2f +PCK4BITS(eError,eError, 5, 5, 5, 5,eError,eError),//30-37 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//38-3f +PCK4BITS(eError,eError,eError, 5, 5, 5,eError,eError),//40-47 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//48-4f +PCK4BITS(eError,eError, 7, 7, 7, 7,eError,eError),//50-57 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//58-5f +PCK4BITS(eError,eError,eError,eError, 7, 7,eError,eError),//60-67 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//68-6f +PCK4BITS(eError,eError, 9, 9, 9, 9,eError,eError),//70-77 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//78-7f +PCK4BITS(eError,eError,eError,eError,eError, 9,eError,eError),//80-87 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//88-8f +PCK4BITS(eError,eError, 12, 12, 12, 12,eError,eError),//90-97 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//98-9f +PCK4BITS(eError,eError,eError,eError,eError, 12,eError,eError),//a0-a7 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//a8-af +PCK4BITS(eError,eError, 12, 12, 12,eError,eError,eError),//b0-b7 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError),//b8-bf +PCK4BITS(eError,eError,eStart,eStart,eStart,eStart,eError,eError),//c0-c7 +PCK4BITS(eError,eError,eError,eError,eError,eError,eError,eError) //c8-cf +}; + +static const PRUint32 UTF8CharLenTable[] = {0, 1, 0, 0, 0, 0, 2, 3, + 3, 3, 4, 4, 5, 5, 6, 6 }; + +const SMModel UTF8SMModel = { + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UTF8_cls }, + 16, + {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, UTF8_st }, + UTF8CharLenTable, + "UTF-8", +}; + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h new file mode 100644 index 0000000..3caa912 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsPkgInt.h @@ -0,0 +1,89 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsPkgInt_h__ +#define nsPkgInt_h__ +#include "nscore.h" + +typedef enum { + eIdxSft4bits = 3, + eIdxSft8bits = 2, + eIdxSft16bits = 1 +} nsIdxSft; + +typedef enum { + eSftMsk4bits = 7, + eSftMsk8bits = 3, + eSftMsk16bits = 1 +} nsSftMsk; + +typedef enum { + eBitSft4bits = 2, + eBitSft8bits = 3, + eBitSft16bits = 4 +} nsBitSft; + +typedef enum { + eUnitMsk4bits = 0x0000000FL, + eUnitMsk8bits = 0x000000FFL, + eUnitMsk16bits = 0x0000FFFFL +} nsUnitMsk; + +typedef struct nsPkgInt { + nsIdxSft idxsft; + nsSftMsk sftmsk; + nsBitSft bitsft; + nsUnitMsk unitmsk; + const PRUint32* const data; +} nsPkgInt; + + +#define PCK16BITS(a,b) ((PRUint32)(((b) << 16) | (a))) + +#define PCK8BITS(a,b,c,d) PCK16BITS( ((PRUint32)(((b) << 8) | (a))), \ + ((PRUint32)(((d) << 8) | (c)))) + +#define PCK4BITS(a,b,c,d,e,f,g,h) PCK8BITS( ((PRUint32)(((b) << 4) | (a))), \ + ((PRUint32)(((d) << 4) | (c))), \ + ((PRUint32)(((f) << 4) | (e))), \ + ((PRUint32)(((h) << 4) | (g))) ) + +#define GETFROMPCK(i, c) \ + (((((c).data)[(i)>>(c).idxsft])>>(((i)&(c).sftmsk)<<(c).bitsft))&(c).unitmsk) + +#endif /* nsPkgInt_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.cpp new file mode 100644 index 0000000..d8fef87 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.cpp @@ -0,0 +1,224 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include +#include "prmem.h" + +#include "nsSBCharSetProber.h" +#include "nsSBCSGroupProber.h" + +#include "nsHebrewProber.h" + +nsSBCSGroupProber::nsSBCSGroupProber() +{ + mProbers[0] = new nsSingleByteCharSetProber(&Win1251Model); + mProbers[1] = new nsSingleByteCharSetProber(&Koi8rModel); + mProbers[2] = new nsSingleByteCharSetProber(&Latin5Model); + mProbers[3] = new nsSingleByteCharSetProber(&MacCyrillicModel); + mProbers[4] = new nsSingleByteCharSetProber(&Ibm866Model); + mProbers[5] = new nsSingleByteCharSetProber(&Ibm855Model); + mProbers[6] = new nsSingleByteCharSetProber(&Latin7Model); + mProbers[7] = new nsSingleByteCharSetProber(&Win1253Model); + mProbers[8] = new nsSingleByteCharSetProber(&Latin5BulgarianModel); + mProbers[9] = new nsSingleByteCharSetProber(&Win1251BulgarianModel); + mProbers[10] = new nsSingleByteCharSetProber(&TIS620ThaiModel); + + nsHebrewProber *hebprober = new nsHebrewProber(); + // Notice: Any change in these indexes - 10,11,12 must be reflected + // in the code below as well. + mProbers[11] = hebprober; + mProbers[12] = new nsSingleByteCharSetProber(&Win1255Model, PR_FALSE, hebprober); // Logical Hebrew + mProbers[13] = new nsSingleByteCharSetProber(&Win1255Model, PR_TRUE, hebprober); // Visual Hebrew + // Tell the Hebrew prober about the logical and visual probers + if (mProbers[11] && mProbers[12] && mProbers[13]) // all are not null + { + hebprober->SetModelProbers(mProbers[12], mProbers[13]); + } + else // One or more is null. avoid any Hebrew probing, null them all + { + for (PRUint32 i = 11; i <= 13; ++i) + { + delete mProbers[i]; + mProbers[i] = 0; + } + } + + // disable latin2 before latin1 is available, otherwise all latin1 + // will be detected as latin2 because of their similarity. + //mProbers[10] = new nsSingleByteCharSetProber(&Latin2HungarianModel); + //mProbers[11] = new nsSingleByteCharSetProber(&Win1250HungarianModel); + + Reset(); +} + +nsSBCSGroupProber::~nsSBCSGroupProber() +{ + for (PRUint32 i = 0; i < NUM_OF_SBCS_PROBERS; i++) + { + delete mProbers[i]; + } +} + + +const char* nsSBCSGroupProber::GetCharSetName() +{ + //if we have no answer yet + if (mBestGuess == -1) + { + GetConfidence(); + //no charset seems positive + if (mBestGuess == -1) + //we will use default. + mBestGuess = 0; + } + return mProbers[mBestGuess]->GetCharSetName(); +} + +void nsSBCSGroupProber::Reset(void) +{ + mActiveNum = 0; + for (PRUint32 i = 0; i < NUM_OF_SBCS_PROBERS; i++) + { + if (mProbers[i]) // not null + { + mProbers[i]->Reset(); + mIsActive[i] = PR_TRUE; + ++mActiveNum; + } + else + mIsActive[i] = PR_FALSE; + } + mBestGuess = -1; + mState = eDetecting; +} + + +nsProbingState nsSBCSGroupProber::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsProbingState st; + PRUint32 i; + char *newBuf1 = 0; + PRUint32 newLen1 = 0; + + //apply filter to original buffer, and we got new buffer back + //depend on what script it is, we will feed them the new buffer + //we got after applying proper filter + //this is done without any consideration to KeepEnglishLetters + //of each prober since as of now, there are no probers here which + //recognize languages with English characters. + if (!FilterWithoutEnglishLetters(aBuf, aLen, &newBuf1, newLen1)) + goto done; + + if (newLen1 == 0) + goto done; // Nothing to see here, move on. + + for (i = 0; i < NUM_OF_SBCS_PROBERS; i++) + { + if (!mIsActive[i]) + continue; + st = mProbers[i]->HandleData(newBuf1, newLen1); + if (st == eFoundIt) + { + mBestGuess = i; + mState = eFoundIt; + break; + } + else if (st == eNotMe) + { + mIsActive[i] = PR_FALSE; + mActiveNum--; + if (mActiveNum <= 0) + { + mState = eNotMe; + break; + } + } + } + +done: + PR_FREEIF(newBuf1); + + return mState; +} + +float nsSBCSGroupProber::GetConfidence(void) +{ + PRUint32 i; + float bestConf = 0.0, cf; + + switch (mState) + { + case eFoundIt: + return (float)0.99; //sure yes + case eNotMe: + return (float)0.01; //sure no + default: + for (i = 0; i < NUM_OF_SBCS_PROBERS; i++) + { + if (!mIsActive[i]) + continue; + cf = mProbers[i]->GetConfidence(); + if (bestConf < cf) + { + bestConf = cf; + mBestGuess = i; + } + } + } + return bestConf; +} + +#ifdef DEBUG_chardet +void nsSBCSGroupProber::DumpStatus() +{ + PRUint32 i; + float cf; + + cf = GetConfidence(); + printf(" SBCS Group Prober --------begin status \r\n"); + for (i = 0; i < NUM_OF_SBCS_PROBERS; i++) + { + if (!mIsActive[i]) + printf(" inactive: [%s] (i.e. confidence is too low).\r\n", mProbers[i]->GetCharSetName()); + else + mProbers[i]->DumpStatus(); + } + printf(" SBCS Group found best match [%s] confidence %f.\r\n", + mProbers[mBestGuess]->GetCharSetName(), cf); +} +#endif diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.h new file mode 100644 index 0000000..cfbf7e1 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCSGroupProber.h @@ -0,0 +1,70 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsSBCSGroupProber_h__ +#define nsSBCSGroupProber_h__ + + +#define NUM_OF_SBCS_PROBERS 14 + +class nsCharSetProber; +class nsSBCSGroupProber: public nsCharSetProber { +public: + nsSBCSGroupProber(); + virtual ~nsSBCSGroupProber(); + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName(); + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +#ifdef DEBUG_chardet + void DumpStatus(); +#endif + +protected: + nsProbingState mState; + nsCharSetProber* mProbers[NUM_OF_SBCS_PROBERS]; + PRBool mIsActive[NUM_OF_SBCS_PROBERS]; + PRInt32 mBestGuess; + PRUint32 mActiveNum; +}; + +#endif /* nsSBCSGroupProber_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.cpp new file mode 100644 index 0000000..2a59fd7 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.cpp @@ -0,0 +1,126 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#include +#include "nsSBCharSetProber.h" + +nsProbingState nsSingleByteCharSetProber::HandleData(const char* aBuf, PRUint32 aLen) +{ + unsigned char order; + + for (PRUint32 i = 0; i < aLen; i++) + { + order = mModel->charToOrderMap[(unsigned char)aBuf[i]]; + + if (order < SYMBOL_CAT_ORDER) + mTotalChar++; + if (order < SAMPLE_SIZE) + { + mFreqChar++; + + if (mLastOrder < SAMPLE_SIZE) + { + mTotalSeqs++; + if (!mReversed) + ++(mSeqCounters[mModel->precedenceMatrix[mLastOrder*SAMPLE_SIZE+order]]); + else // reverse the order of the letters in the lookup + ++(mSeqCounters[mModel->precedenceMatrix[order*SAMPLE_SIZE+mLastOrder]]); + } + } + mLastOrder = order; + } + + if (mState == eDetecting) + if (mTotalSeqs > SB_ENOUGH_REL_THRESHOLD) + { + float cf = GetConfidence(); + if (cf > POSITIVE_SHORTCUT_THRESHOLD) + mState = eFoundIt; + else if (cf < NEGATIVE_SHORTCUT_THRESHOLD) + mState = eNotMe; + } + + return mState; +} + +void nsSingleByteCharSetProber::Reset(void) +{ + mState = eDetecting; + mLastOrder = 255; + for (PRUint32 i = 0; i < NUMBER_OF_SEQ_CAT; i++) + mSeqCounters[i] = 0; + mTotalSeqs = 0; + mTotalChar = 0; + mFreqChar = 0; +} + +//#define NEGATIVE_APPROACH 1 + +float nsSingleByteCharSetProber::GetConfidence(void) +{ +#ifdef NEGATIVE_APPROACH + if (mTotalSeqs > 0) + if (mTotalSeqs > mSeqCounters[NEGATIVE_CAT]*10 ) + return ((float)(mTotalSeqs - mSeqCounters[NEGATIVE_CAT]*10))/mTotalSeqs * mFreqChar / mTotalChar; + return (float)0.01; +#else //POSITIVE_APPROACH + float r; + + if (mTotalSeqs > 0) { + r = ((float)1.0) * mSeqCounters[POSITIVE_CAT] / mTotalSeqs / mModel->mTypicalPositiveRatio; + r = r*mFreqChar/mTotalChar; + if (r >= (float)1.00) + r = (float)0.99; + return r; + } + return (float)0.01; +#endif +} + +const char* nsSingleByteCharSetProber::GetCharSetName() +{ + if (!mNameProber) + return mModel->charsetName; + return mNameProber->GetCharSetName(); +} + +#ifdef DEBUG_chardet +void nsSingleByteCharSetProber::DumpStatus() +{ + printf(" SBCS: %1.3f [%s]\r\n", GetConfidence(), GetCharSetName()); +} +#endif diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.h new file mode 100644 index 0000000..d7180dc --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSBCharSetProber.h @@ -0,0 +1,125 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#ifndef nsSingleByteCharSetProber_h__ +#define nsSingleByteCharSetProber_h__ + +#include "nsCharSetProber.h" + +#define SAMPLE_SIZE 64 +#define SB_ENOUGH_REL_THRESHOLD 1024 +#define POSITIVE_SHORTCUT_THRESHOLD (float)0.95 +#define NEGATIVE_SHORTCUT_THRESHOLD (float)0.05 +#define SYMBOL_CAT_ORDER 250 +#define NUMBER_OF_SEQ_CAT 4 +#define POSITIVE_CAT (NUMBER_OF_SEQ_CAT-1) +#define NEGATIVE_CAT 0 + +typedef struct +{ + const unsigned char* const charToOrderMap; // [256] table use to find a char's order + const PRUint8* const precedenceMatrix; // [SAMPLE_SIZE][SAMPLE_SIZE]; table to find a 2-char sequence's frequency + float mTypicalPositiveRatio; // = freqSeqs / totalSeqs + PRBool keepEnglishLetter; // says if this script contains English characters (not implemented) + const char* const charsetName; +} SequenceModel; + + +class nsSingleByteCharSetProber : public nsCharSetProber{ +public: + nsSingleByteCharSetProber(const SequenceModel *model) + :mModel(model), mReversed(PR_FALSE), mNameProber(0) { Reset(); } + nsSingleByteCharSetProber(const SequenceModel *model, PRBool reversed, nsCharSetProber* nameProber) + :mModel(model), mReversed(reversed), mNameProber(nameProber) { Reset(); } + + virtual const char* GetCharSetName(); + virtual nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + virtual nsProbingState GetState(void) {return mState;} + virtual void Reset(void); + virtual float GetConfidence(void); + virtual void SetOpion() {} + + // This feature is not implemented yet. any current language model + // contain this parameter as PR_FALSE. No one is looking at this + // parameter or calling this method. + // Moreover, the nsSBCSGroupProber which calls the HandleData of this + // prober has a hard-coded call to FilterWithoutEnglishLetters which gets rid + // of the English letters. + PRBool KeepEnglishLetters() {return mModel->keepEnglishLetter;} // (not implemented) + +#ifdef DEBUG_chardet + virtual void DumpStatus(); +#endif + +protected: + nsProbingState mState; + const SequenceModel* const mModel; + const PRBool mReversed; // PR_TRUE if we need to reverse every pair in the model lookup + + //char order of last character + unsigned char mLastOrder; + + PRUint32 mTotalSeqs; + PRUint32 mSeqCounters[NUMBER_OF_SEQ_CAT]; + + PRUint32 mTotalChar; + //characters that fall in our sampling range + PRUint32 mFreqChar; + + // Optional auxiliary prober for name decision. created and destroyed by the GroupProber + nsCharSetProber* mNameProber; + +}; + + +extern const SequenceModel Koi8rModel; +extern const SequenceModel Win1251Model; +extern const SequenceModel Latin5Model; +extern const SequenceModel MacCyrillicModel; +extern const SequenceModel Ibm866Model; +extern const SequenceModel Ibm855Model; +extern const SequenceModel Latin7Model; +extern const SequenceModel Win1253Model; +extern const SequenceModel Latin5BulgarianModel; +extern const SequenceModel Win1251BulgarianModel; +extern const SequenceModel Latin2HungarianModel; +extern const SequenceModel Win1250HungarianModel; +extern const SequenceModel Win1255Model; +extern const SequenceModel TIS620ThaiModel; + +#endif /* nsSingleByteCharSetProber_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp new file mode 100644 index 0000000..c7842f6 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.cpp @@ -0,0 +1,98 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// for S-JIS encoding, obeserve characteristic: +// 1, kana character (or hankaku?) often have hight frequency of appereance +// 2, kana character often exist in group +// 3, certain combination of kana is never used in japanese language + +#include "nsSJISProber.h" + +void nsSJISProber::Reset(void) +{ + mCodingSM->Reset(); + mState = eDetecting; + mContextAnalyser.Reset(mIsPreferredLanguage); + mDistributionAnalyser.Reset(mIsPreferredLanguage); +} + +nsProbingState nsSJISProber::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsSMState codingState; + + for (PRUint32 i = 0; i < aLen; i++) + { + codingState = mCodingSM->NextState(aBuf[i]); + if (codingState == eItsMe) + { + mState = eFoundIt; + break; + } + if (codingState == eStart) + { + PRUint32 charLen = mCodingSM->GetCurrentCharLen(); + if (i == 0) + { + mLastChar[1] = aBuf[0]; + mContextAnalyser.HandleOneChar(mLastChar+2-charLen, charLen); + mDistributionAnalyser.HandleOneChar(mLastChar, charLen); + } + else + { + mContextAnalyser.HandleOneChar(aBuf+i+1-charLen, charLen); + mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); + } + } + } + + mLastChar[0] = aBuf[aLen-1]; + + if (mState == eDetecting) + if (mContextAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) + mState = eFoundIt; + + return mState; +} + +float nsSJISProber::GetConfidence(void) +{ + float contxtCf = mContextAnalyser.GetConfidence(); + float distribCf = mDistributionAnalyser.GetConfidence(); + + return (contxtCf > distribCf ? contxtCf : distribCf); +} + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h new file mode 100644 index 0000000..1efb6e3 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsSJISProber.h @@ -0,0 +1,80 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// for S-JIS encoding, obeserve characteristic: +// 1, kana character (or hankaku?) often have hight frequency of appereance +// 2, kana character often exist in group +// 3, certain combination of kana is never used in japanese language + +#ifndef nsSJISProber_h__ +#define nsSJISProber_h__ + +#include "nsCharSetProber.h" +#include "nsCodingStateMachine.h" +#include "JpCntx.h" +#include "CharDistribution.h" + + +class nsSJISProber: public nsCharSetProber { +public: + nsSJISProber(PRBool aIsPreferredLanguage) + :mIsPreferredLanguage(aIsPreferredLanguage) + {mCodingSM = new nsCodingStateMachine(&SJISSMModel); + Reset();} + virtual ~nsSJISProber(void){delete mCodingSM;} + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName() {return "Shift_JIS";} + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +protected: + nsCodingStateMachine* mCodingSM; + nsProbingState mState; + + SJISContextAnalysis mContextAnalyser; + SJISDistributionAnalysis mDistributionAnalyser; + + char mLastChar[2]; + PRBool mIsPreferredLanguage; + +}; + + +#endif /* nsSJISProber_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp new file mode 100644 index 0000000..ab8d9f7 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.cpp @@ -0,0 +1,87 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsUTF8Prober.h" + +void nsUTF8Prober::Reset(void) +{ + mCodingSM->Reset(); + mNumOfMBChar = 0; + mState = eDetecting; +} + +nsProbingState nsUTF8Prober::HandleData(const char* aBuf, PRUint32 aLen) +{ + nsSMState codingState; + + for (PRUint32 i = 0; i < aLen; i++) + { + codingState = mCodingSM->NextState(aBuf[i]); + if (codingState == eItsMe) + { + mState = eFoundIt; + break; + } + if (codingState == eStart) + { + if (mCodingSM->GetCurrentCharLen() >= 2) + mNumOfMBChar++; + } + } + + if (mState == eDetecting) + if (GetConfidence() > SHORTCUT_THRESHOLD) + mState = eFoundIt; + return mState; +} + +#define ONE_CHAR_PROB (float)0.50 + +float nsUTF8Prober::GetConfidence(void) +{ + float unlike = (float)0.99; + + if (mNumOfMBChar < 6) + { + for (PRUint32 i = 0; i < mNumOfMBChar; i++) + unlike *= ONE_CHAR_PROB; + return (float)1.0 - unlike; + } + else + return (float)0.99; +} + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h new file mode 100644 index 0000000..21c91c4 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUTF8Prober.h @@ -0,0 +1,64 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsUTF8Prober_h__ +#define nsUTF8Prober_h__ + +#include "nsCharSetProber.h" +#include "nsCodingStateMachine.h" + +class nsUTF8Prober: public nsCharSetProber { +public: + nsUTF8Prober(){mNumOfMBChar = 0; + mCodingSM = new nsCodingStateMachine(&UTF8SMModel); + Reset(); } + virtual ~nsUTF8Prober(){delete mCodingSM;} + nsProbingState HandleData(const char* aBuf, PRUint32 aLen); + const char* GetCharSetName() {return "UTF-8";} + nsProbingState GetState(void) {return mState;} + void Reset(void); + float GetConfidence(void); + void SetOpion() {} + +protected: + nsCodingStateMachine* mCodingSM; + nsProbingState mState; + PRUint32 mNumOfMBChar; +}; + +#endif /* nsUTF8Prober_h__ */ + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.cpp new file mode 100644 index 0000000..7af8f95 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.cpp @@ -0,0 +1,280 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Shy Shalom + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nscore.h" + +#include "nsUniversalDetector.h" + +#include "nsMBCSGroupProber.h" +#include "nsSBCSGroupProber.h" +#include "nsEscCharsetProber.h" +#include "nsLatin1Prober.h" + +nsUniversalDetector::nsUniversalDetector(PRUint32 aLanguageFilter) +{ + mDone = PR_FALSE; + mBestGuess = -1; //illegal value as signal + mInTag = PR_FALSE; + mEscCharSetProber = nsnull; + + mStart = PR_TRUE; + mDetectedCharset = nsnull; + mGotData = PR_FALSE; + mInputState = ePureAscii; + mLastChar = '\0'; + mLanguageFilter = aLanguageFilter; + + PRUint32 i; + for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++) + mCharSetProbers[i] = nsnull; +} + +nsUniversalDetector::~nsUniversalDetector() +{ + for (PRInt32 i = 0; i < NUM_OF_CHARSET_PROBERS; i++) + delete mCharSetProbers[i]; + + delete mEscCharSetProber; +} + +void +nsUniversalDetector::Reset() +{ + mDone = PR_FALSE; + mBestGuess = -1; //illegal value as signal + mInTag = PR_FALSE; + + mStart = PR_TRUE; + mDetectedCharset = nsnull; + mGotData = PR_FALSE; + mInputState = ePureAscii; + mLastChar = '\0'; + + if (mEscCharSetProber) + mEscCharSetProber->Reset(); + + PRUint32 i; + for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++) + if (mCharSetProbers[i]) + mCharSetProbers[i]->Reset(); +} + +//--------------------------------------------------------------------- +#define SHORTCUT_THRESHOLD (float)0.95 +#define MINIMUM_THRESHOLD (float)0.20 + +nsresult nsUniversalDetector::HandleData(const char* aBuf, PRUint32 aLen) +{ + if(mDone) + return NS_OK; + + if (aLen > 0) + mGotData = PR_TRUE; + + //If the data starts with BOM, we know it is UTF + if (mStart) + { + mStart = PR_FALSE; + if (aLen > 2) + switch (aBuf[0]) + { + case '\xEF': + if (('\xBB' == aBuf[1]) && ('\xBF' == aBuf[2])) + // EF BB BF UTF-8 encoded BOM + mDetectedCharset = "UTF-8"; + break; + case '\xFE': + if ('\xFF' == aBuf[1]) + // FE FF UTF-16, big endian BOM + mDetectedCharset = "UTF-16"; + break; + case '\xFF': + if ('\xFE' == aBuf[1]) + // FF FE UTF-16, little endian BOM + mDetectedCharset = "UTF-16"; + break; + } // switch + + if (mDetectedCharset) + { + mDone = PR_TRUE; + return NS_OK; + } + } + + PRUint32 i; + for (i = 0; i < aLen; i++) + { + //other than 0xa0, if every othe character is ascii, the page is ascii + if (aBuf[i] & '\x80' && aBuf[i] != '\xA0') //Since many Ascii only page contains NBSP + { + //we got a non-ascii byte (high-byte) + if (mInputState != eHighbyte) + { + //adjust state + mInputState = eHighbyte; + + //kill mEscCharSetProber if it is active + if (mEscCharSetProber) { + delete mEscCharSetProber; + mEscCharSetProber = nsnull; + } + + //start multibyte and singlebyte charset prober + if (nsnull == mCharSetProbers[0]) + { + mCharSetProbers[0] = new nsMBCSGroupProber(mLanguageFilter); + if (nsnull == mCharSetProbers[0]) + return NS_ERROR_OUT_OF_MEMORY; + } + if (nsnull == mCharSetProbers[1] && + (mLanguageFilter & NS_FILTER_NON_CJK)) + { + mCharSetProbers[1] = new nsSBCSGroupProber; + if (nsnull == mCharSetProbers[1]) + return NS_ERROR_OUT_OF_MEMORY; + } + if (nsnull == mCharSetProbers[2]) + { + mCharSetProbers[2] = new nsLatin1Prober; + if (nsnull == mCharSetProbers[2]) + return NS_ERROR_OUT_OF_MEMORY; + } + } + } + else + { + //ok, just pure ascii so far + if ( ePureAscii == mInputState && + (aBuf[i] == '\033' || (aBuf[i] == '{' && mLastChar == '~')) ) + { + //found escape character or HZ "~{" + mInputState = eEscAscii; + } + mLastChar = aBuf[i]; + } + } + + nsProbingState st; + switch (mInputState) + { + case eEscAscii: + if (nsnull == mEscCharSetProber) { + mEscCharSetProber = new nsEscCharSetProber(mLanguageFilter); + if (nsnull == mEscCharSetProber) + return NS_ERROR_OUT_OF_MEMORY; + } + st = mEscCharSetProber->HandleData(aBuf, aLen); + if (st == eFoundIt) + { + mDone = PR_TRUE; + mDetectedCharset = mEscCharSetProber->GetCharSetName(); + } + break; + case eHighbyte: + for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++) + { + if (mCharSetProbers[i]) + { + st = mCharSetProbers[i]->HandleData(aBuf, aLen); + if (st == eFoundIt) + { + mDone = PR_TRUE; + mDetectedCharset = mCharSetProbers[i]->GetCharSetName(); + return NS_OK; + } + } + } + break; + + default: //pure ascii + ;//do nothing here + } + return NS_OK; +} + + +//--------------------------------------------------------------------- +void nsUniversalDetector::DataEnd() +{ + if (!mGotData) + { + // we haven't got any data yet, return immediately + // caller program sometimes call DataEnd before anything has been sent to detector + return; + } + + if (mDetectedCharset) + { + mDone = PR_TRUE; + Report(mDetectedCharset); + return; + } + + switch (mInputState) + { + case eHighbyte: + { + float proberConfidence; + float maxProberConfidence = (float)0.0; + PRInt32 maxProber = 0; + + for (PRInt32 i = 0; i < NUM_OF_CHARSET_PROBERS; i++) + { + if (mCharSetProbers[i]) + { + proberConfidence = mCharSetProbers[i]->GetConfidence(); + if (proberConfidence > maxProberConfidence) + { + maxProberConfidence = proberConfidence; + maxProber = i; + } + } + } + //do not report anything because we are not confident of it, that's in fact a negative answer + if (maxProberConfidence > MINIMUM_THRESHOLD) + Report(mCharSetProbers[maxProber]->GetCharSetName()); + } + break; + case eEscAscii: + break; + default: + ; + } + return; +} diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.h new file mode 100644 index 0000000..525f722 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nsUniversalDetector.h @@ -0,0 +1,89 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsUniversalDetector_h__ +#define nsUniversalDetector_h__ + +class nsCharSetProber; + +#define NUM_OF_CHARSET_PROBERS 3 + +typedef enum { + ePureAscii = 0, + eEscAscii = 1, + eHighbyte = 2 +} nsInputState; + +#define NS_FILTER_CHINESE_SIMPLIFIED 0x01 +#define NS_FILTER_CHINESE_TRADITIONAL 0x02 +#define NS_FILTER_JAPANESE 0x04 +#define NS_FILTER_KOREAN 0x08 +#define NS_FILTER_NON_CJK 0x10 +#define NS_FILTER_ALL 0x1F +#define NS_FILTER_CHINESE (NS_FILTER_CHINESE_SIMPLIFIED | \ + NS_FILTER_CHINESE_TRADITIONAL) +#define NS_FILTER_CJK (NS_FILTER_CHINESE_SIMPLIFIED | \ + NS_FILTER_CHINESE_TRADITIONAL | \ + NS_FILTER_JAPANESE | \ + NS_FILTER_KOREAN) + +class nsUniversalDetector { +public: + nsUniversalDetector(PRUint32 aLanguageFilter); + virtual ~nsUniversalDetector(); + virtual nsresult HandleData(const char* aBuf, PRUint32 aLen); + virtual void DataEnd(void); + +protected: + virtual void Report(const char* aCharset) = 0; + virtual void Reset(); + nsInputState mInputState; + PRBool mDone; + PRBool mInTag; + PRBool mStart; + PRBool mGotData; + char mLastChar; + const char * mDetectedCharset; + PRInt32 mBestGuess; + PRUint32 mLanguageFilter; + + nsCharSetProber *mCharSetProbers[NUM_OF_CHARSET_PROBERS]; + nsCharSetProber *mEscCharSetProber; +}; + +#endif + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nscore.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nscore.h new file mode 100644 index 0000000..e0b5a72 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/nscore.h @@ -0,0 +1,59 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Kohei TAKETA + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#ifndef nsDummyCore_h__ +#define nsDummyCore_h__ + +typedef bool PRBool; +typedef int PRInt32; +typedef unsigned int PRUint32; +typedef short PRInt16; +typedef unsigned short PRUint16; +typedef signed char PRInt8; +typedef unsigned char PRUint8; + +#define PR_FALSE false +#define PR_TRUE true +#define nsnull 0 + + +enum nsresult +{ + NS_OK, + NS_ERROR_OUT_OF_MEMORY +}; + +#endif diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/prmem.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/prmem.h new file mode 100644 index 0000000..1485397 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/prmem.h @@ -0,0 +1,49 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Kohei TAKETA + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#ifndef nsDummyPrmem_h__ +#define nsDummyPrmem_h__ + +#include + +inline void* PR_Malloc(size_t len) +{ + return malloc(len); +} + +#define PR_FREEIF(p) if (p) free(p) + +#endif diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/symbols.cmake b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/symbols.cmake new file mode 100644 index 0000000..2aa4601 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/symbols.cmake @@ -0,0 +1,38 @@ +set( + UCHARDET_SYMBOLS + uchardet_new + uchardet_delete + uchardet_handle_data + uchardet_data_end + uchardet_reset + uchardet_get_charset +) + +set (LINK_FLAGS "") + +if (APPLE) + + # Create a symbols_list file for the darwin linker + string(REPLACE ";" "\n_" _symbols "${UCHARDET_SYMBOLS}") + set(_symbols_list "${CMAKE_CURRENT_BINARY_DIR}/symbols.list") + file(WRITE ${_symbols_list} "_${_symbols}\n") + set(LINK_FLAGS + "${LINK_FLAGS} -Wl,-exported_symbols_list,'${_symbols_list}'") + +elseif (CMAKE_C_COMPILER_ID STREQUAL GNU) + # Create a version script for GNU ld. + set(_symbols "{ global: ${UCHARDET_SYMBOLS}; local: *; };") + set(_version_script "${CMAKE_CURRENT_BINARY_DIR}/version.script") + file(WRITE ${_version_script} "${_symbols}\n") + + set(LINK_FLAGS "${LINK_FLAGS} -Wl,--version-script,'${_version_script}'") + +endif (APPLE) + +set_target_properties( + ${LIBUCHARDET_TARGET} + ${LIBUCHARDET_STATIC_TARGET} + PROPERTIES + LINK_FLAGS + "${LINK_FLAGS}" +) diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/CMakeLists.txt b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/CMakeLists.txt new file mode 100644 index 0000000..7ad3ff5 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/CMakeLists.txt @@ -0,0 +1,23 @@ +set( + UCHARDET_SOURCES + uchardet.cpp +) + +add_executable( + uchardet + ${UCHARDET_SOURCES} +) + +target_link_libraries( + uchardet + ${UCHARDET_TARGET} +) + +install( + TARGETS + uchardet + RUNTIME + DESTINATION + ${DIR_BIN} +) + diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp new file mode 100644 index 0000000..b2b6bea --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/tools/uchardet.cpp @@ -0,0 +1,141 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * BYVoid + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#include "../uchardet.h" +#include +#include +#include +#include +#include + +#ifndef VERSION +#define VERSION "Unknown" +#endif +#define BUFFER_SIZE 65536 + +char buffer[BUFFER_SIZE]; + +void detect(FILE * fp) +{ + uchardet_t handle = uchardet_new(); + + while (!feof(fp)) + { + size_t len = fread(buffer, 1, BUFFER_SIZE, fp); + int retval = uchardet_handle_data(handle, buffer, len); + if (retval != 0) + { + fprintf(stderr, "Handle data error.\n"); + exit(0); + } + } + uchardet_data_end(handle); + + const char * charset = uchardet_get_charset(handle); + if (*charset) + printf("%s\n", charset); + else + printf("ascii/unknown\n"); + + uchardet_delete(handle); +} + +void show_version() +{ + printf("\n"); + printf("uchardet Command Line Tool\n"); + printf("Version %s\n", VERSION); + printf("\n"); + printf("Author: %s\n", "BYVoid"); + printf("Bug Report: %s\n", "http://code.google.com/p/uchardet/issues/entry"); + printf("\n"); +} + +void show_usage() +{ + show_version(); + printf("Usage:\n"); + printf(" uchardet [Options] [File]\n"); + printf("\n"); + printf("Options:\n"); + printf(" -v, --version Print version and build information.\n"); + printf(" -h, --help Print this help.\n"); + printf("\n"); +} + +int main(int argc, char ** argv) +{ + static struct option longopts[] = + { + { "version", no_argument, NULL, 'v' }, + { "help", no_argument, NULL, 'h' }, + { 0, 0, 0, 0 }, + }; + + static int oc; + while((oc = getopt_long(argc, argv, "vh", longopts, NULL)) != -1) + { + switch (oc) + { + case 'v': + show_version(); + return 0; + case 'h': + show_usage(); + return 0; + case '?': + printf("Please use %s --help.\n", argv[0]); + return 1; + } + } + + FILE * f = stdin; + if (argc == 2) + { + f = fopen(argv[1], "r"); + if (f == NULL) + { + fprintf(stderr, "Cannot open file.\n"); + return 1; + } + } + + detect(f); + + fclose(f); + + return 0; +} diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.cpp b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.cpp new file mode 100644 index 0000000..74ab63c --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.cpp @@ -0,0 +1,105 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * BYVoid + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#include "uchardet.h" +#include "nscore.h" +#include "nsUniversalDetector.h" +#include + +using std::string; + +class HandleUniversalDetector : public nsUniversalDetector +{ +protected: + string m_charset; + +public: + HandleUniversalDetector() + : nsUniversalDetector(NS_FILTER_ALL) + { + m_charset = ""; + } + + virtual ~HandleUniversalDetector() + {} + + virtual void Report(const char* charset) + { + m_charset = charset; + } + + virtual void Reset() + { + nsUniversalDetector::Reset(); + m_charset = ""; + } + + const char* GetCharset() const + { + return m_charset.c_str(); + } +}; + +uchardet_t uchardet_new() +{ + return reinterpret_cast (new HandleUniversalDetector()); +} + +void uchardet_delete(uchardet_t ud) +{ + delete reinterpret_cast(ud); +} + +int uchardet_handle_data(uchardet_t ud, const char * data, size_t len) +{ + nsresult ret = reinterpret_cast(ud)->HandleData(data, (PRUint32)len); + return (ret != NS_OK); +} + +void uchardet_data_end(uchardet_t ud) +{ + reinterpret_cast(ud)->DataEnd(); +} + +void uchardet_reset(uchardet_t ud) +{ + reinterpret_cast(ud)->Reset(); +} + +const char* uchardet_get_charset(uchardet_t ud) +{ + return reinterpret_cast(ud)->GetCharset(); +} diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.h b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.h new file mode 100644 index 0000000..533666a --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/src/uchardet.h @@ -0,0 +1,92 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Universal charset detector code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * BYVoid + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +#ifndef ___UCHARDET_H___ +#define ___UCHARDET_H___ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef void * uchardet_t; + +/** + * Create an encoding detector. + * @return a handle of a instance of uchardet + */ +uchardet_t uchardet_new(); + +/** + * Delete an encoding detector. + * @param ud [in] handle of a instance of uchardet + */ +void uchardet_delete(uchardet_t ud); + +/** + * Feed data to an encoding detector. + * @param ud [in] handle of a instance of uchardet + * @param data [in] data + * @param len [in] number of byte of data + * @return non-zero number on failure. + */ +int uchardet_handle_data(uchardet_t ud, const char * data, size_t len); + +/** + * Notify an end of data to an encoding detctor. + * @param ud [in] handle of a instance of uchardet + */ +void uchardet_data_end(uchardet_t ud); + +/** + * Reset an encoding detector. + * @param ud [in] handle of a instance of uchardet + */ +void uchardet_reset(uchardet_t ud); + +/** + * Get the name of encoding that was detected. + * @param ud [in] handle of a instance of uchardet + * @return name of charset on success and "" on failure or pure ascii. + */ +const char * uchardet_get_charset(uchardet_t ud); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/big5.txt b/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/big5.txt new file mode 100644 index 0000000..59db954 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/big5.txt @@ -0,0 +1 @@ +ÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤åÁcÅ餤¤å \ No newline at end of file diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/gb18030.txt b/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/gb18030.txt new file mode 100644 index 0000000..962df87 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/gb18030.txt @@ -0,0 +1 @@ +¼òÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎļòÌåÖÐÎÄ \ No newline at end of file diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/shift_jis.txt b/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/shift_jis.txt new file mode 100644 index 0000000..a580281 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/shift_jis.txt @@ -0,0 +1 @@ +“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê“ú–{Œê diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/utf8.txt b/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/utf8.txt new file mode 100644 index 0000000..cd66b08 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/test/utf8.txt @@ -0,0 +1 @@ +汉字漢字統一編碼è¬åœ‹ç¢¼ diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pc.in b/src/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pc.in new file mode 100644 index 0000000..7e2e279 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pc.in @@ -0,0 +1,11 @@ +prefix=@DIR_PREFIX@ +exec_prefix=${prefix} +libdir=@DIR_LIBRARY@ +includedir=@DIR_INCLUDE@ + +Name: uchardet +Description: universalchardet +Version: @UCHARDET_VERSION@ +Requires: +Libs: -L${libdir} -luchardet +Cflags: -I${includedir}/uchardet diff --git a/src/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pri b/src/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pri new file mode 100644 index 0000000..6fcefa6 --- /dev/null +++ b/src/libcommuni/src/3rdparty/uchardet-0.0.1/uchardet.pri @@ -0,0 +1,62 @@ +###################################################################### +# Communi +###################################################################### + +INCLUDEPATH += $$PWD/src +DEPENDPATH += $$PWD/src + +HEADERS += $$PWD/src/Big5Freq.tab +HEADERS += $$PWD/src/EUCKRFreq.tab +HEADERS += $$PWD/src/EUCTWFreq.tab +HEADERS += $$PWD/src/GB2312Freq.tab +HEADERS += $$PWD/src/JISFreq.tab + +HEADERS += $$PWD/src/CharDistribution.h +HEADERS += $$PWD/src/JpCntx.h +HEADERS += $$PWD/src/nsBig5Prober.h +HEADERS += $$PWD/src/nsCharSetProber.h +HEADERS += $$PWD/src/nsCodingStateMachine.h +HEADERS += $$PWD/src/nscore.h +HEADERS += $$PWD/src/nsEscCharsetProber.h +HEADERS += $$PWD/src/nsEUCJPProber.h +HEADERS += $$PWD/src/nsEUCKRProber.h +HEADERS += $$PWD/src/nsEUCTWProber.h +HEADERS += $$PWD/src/nsGB2312Prober.h +HEADERS += $$PWD/src/nsHebrewProber.h +HEADERS += $$PWD/src/nsLatin1Prober.h +HEADERS += $$PWD/src/nsMBCSGroupProber.h +HEADERS += $$PWD/src/nsPkgInt.h +HEADERS += $$PWD/src/nsSBCharSetProber.h +HEADERS += $$PWD/src/nsSBCSGroupProber.h +HEADERS += $$PWD/src/nsSJISProber.h +HEADERS += $$PWD/src/nsUniversalDetector.h +HEADERS += $$PWD/src/nsUTF8Prober.h +HEADERS += $$PWD/src/prmem.h +HEADERS += $$PWD/src/uchardet.h + +SOURCES += $$PWD/src/CharDistribution.cpp +SOURCES += $$PWD/src/JpCntx.cpp +SOURCES += $$PWD/src/LangBulgarianModel.cpp +SOURCES += $$PWD/src/LangCyrillicModel.cpp +SOURCES += $$PWD/src/LangGreekModel.cpp +SOURCES += $$PWD/src/LangHungarianModel.cpp +SOURCES += $$PWD/src/LangHebrewModel.cpp +SOURCES += $$PWD/src/LangThaiModel.cpp +SOURCES += $$PWD/src/nsHebrewProber.cpp +SOURCES += $$PWD/src/nsCharSetProber.cpp +SOURCES += $$PWD/src/nsBig5Prober.cpp +SOURCES += $$PWD/src/nsEUCJPProber.cpp +SOURCES += $$PWD/src/nsEUCKRProber.cpp +SOURCES += $$PWD/src/nsEUCTWProber.cpp +SOURCES += $$PWD/src/nsEscCharsetProber.cpp +SOURCES += $$PWD/src/nsEscSM.cpp +SOURCES += $$PWD/src/nsGB2312Prober.cpp +SOURCES += $$PWD/src/nsMBCSGroupProber.cpp +SOURCES += $$PWD/src/nsMBCSSM.cpp +SOURCES += $$PWD/src/nsSBCSGroupProber.cpp +SOURCES += $$PWD/src/nsSBCharSetProber.cpp +SOURCES += $$PWD/src/nsSJISProber.cpp +SOURCES += $$PWD/src/nsUTF8Prober.cpp +SOURCES += $$PWD/src/nsLatin1Prober.cpp +SOURCES += $$PWD/src/nsUniversalDetector.cpp +SOURCES += $$PWD/src/uchardet.cpp diff --git a/src/libcommuni/src/core/core.pri b/src/libcommuni/src/core/core.pri new file mode 100644 index 0000000..3d4a0b1 --- /dev/null +++ b/src/libcommuni/src/core/core.pri @@ -0,0 +1,65 @@ +###################################################################### +# Communi +###################################################################### + +DEFINES += BUILD_IRC_CORE +QT += network + +INCDIR = $$PWD/../../include/IrcCore + +DEPENDPATH += $$PWD $$INCDIR +INCLUDEPATH += $$PWD $$INCDIR + +CONV_HEADERS = $$INCDIR/Irc +CONV_HEADERS += $$INCDIR/IrcCommand +CONV_HEADERS += $$INCDIR/IrcCommandFilter +CONV_HEADERS += $$INCDIR/IrcConnection +CONV_HEADERS += $$INCDIR/IrcCore +CONV_HEADERS += $$INCDIR/IrcGlobal +CONV_HEADERS += $$INCDIR/IrcMessage +CONV_HEADERS += $$INCDIR/IrcMessageFilter +CONV_HEADERS += $$INCDIR/IrcNetwork +CONV_HEADERS += $$INCDIR/IrcProtocol + +PUB_HEADERS = $$INCDIR/irc.h +PUB_HEADERS += $$INCDIR/irccommand.h +PUB_HEADERS += $$INCDIR/ircconnection.h +PUB_HEADERS += $$INCDIR/irccore.h +PUB_HEADERS += $$INCDIR/ircfilter.h +PUB_HEADERS += $$INCDIR/ircglobal.h +PUB_HEADERS += $$INCDIR/ircmessage.h +PUB_HEADERS += $$INCDIR/ircnetwork.h +PUB_HEADERS += $$INCDIR/ircprotocol.h + +PRIV_HEADERS = $$INCDIR/ircconnection_p.h +PRIV_HEADERS += $$INCDIR/ircmessage_p.h +PRIV_HEADERS += $$INCDIR/ircmessagebuilder_p.h +PRIV_HEADERS += $$INCDIR/ircmessagedecoder_p.h +PRIV_HEADERS += $$INCDIR/ircnetwork_p.h + +HEADERS += $$PUB_HEADERS +HEADERS += $$PRIV_HEADERS + +SOURCES += $$PWD/irc.cpp +SOURCES += $$PWD/irccommand.cpp +SOURCES += $$PWD/ircconnection.cpp +SOURCES += $$PWD/irccore.cpp +SOURCES += $$PWD/ircfilter.cpp +SOURCES += $$PWD/ircmessage.cpp +SOURCES += $$PWD/ircmessage_p.cpp +SOURCES += $$PWD/ircmessagebuilder.cpp +SOURCES += $$PWD/ircmessagedecoder.cpp +SOURCES += $$PWD/ircnetwork.cpp +SOURCES += $$PWD/ircprotocol.cpp + +include(../3rdparty/mozilla/mozilla.pri) + +CONFIG(icu, icu|no_icu) { + DEFINES += HAVE_ICU + SOURCES += $$PWD/ircmessagedecoder_icu.cpp + include(../3rdparty/icu/icu.pri) +} else { + DEFINES += HAVE_UCHARDET + SOURCES += $$PWD/ircmessagedecoder_uchardet.cpp + include(../3rdparty/uchardet-0.0.1/uchardet.pri) +} diff --git a/src/libcommuni/src/core/core.pro b/src/libcommuni/src/core/core.pro new file mode 100644 index 0000000..a9a0c5a --- /dev/null +++ b/src/libcommuni/src/core/core.pro @@ -0,0 +1,8 @@ +###################################################################### +# Communi +###################################################################### + +IRC_MODULE = IrcCore +include(core.pri) +include(../module_build.pri) +include(../module_install.pri) diff --git a/src/libcommuni/src/core/irc.cpp b/src/libcommuni/src/core/irc.cpp new file mode 100644 index 0000000..5a51645 --- /dev/null +++ b/src/libcommuni/src/core/irc.cpp @@ -0,0 +1,172 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "irc.h" +#include "irccore.h" +#include "irccommand.h" +#include "ircconnection.h" +#include "ircmessage_p.h" +#include +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file irc.h + \brief \#include <Irc> + */ + +/*! + \namespace Irc + \ingroup core + \brief Miscellaneous identifiers used throughout the library. + */ + +/*! + Returns the version number of Communi at run-time as a string (for example, "1.2.3"). + This may be a different version than the version the application was compiled against. + + \sa IRC_VERSION, IRC_VERSION_STR + */ +QString Irc::version() +{ + return QLatin1String(IRC_VERSION_STR); +} + +/*! + Returns the numeric \a code as a string or a null string if the code is unknown. + + \sa Irc::Code, IrcNumericMessage::code() + */ +QString Irc::codeToString(int code) +{ + const int index = Irc::staticMetaObject.indexOfEnumerator("Code"); + QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); + return QLatin1String(enumerator.valueToKey(code)); +} + +/*! + Returns the nick part of the specified \a prefix. + + Nick part of a prefix as specified in RFC 1459: +
+    <nick> [ '!' <ident> ] [ '@' <host> ]
+    
+ + \sa IrcMessage::prefix, IrcMessage::nick + */ +QString Irc::nickFromPrefix(const QString& prefix) +{ + QString nick; + IrcMessagePrivate::parsePrefix(prefix, &nick, 0, 0); + return nick; +} + +/*! + Returns the ident part of the specified \a prefix. + + Ident part of a prefix as specified in RFC 1459: +
+    <nick> [ '!' <ident> ] [ '@' <host> ]
+    
+ + \sa IrcMessage::prefix, IrcMessage::ident + */ +QString Irc::identFromPrefix(const QString& prefix) +{ + QString ident; + IrcMessagePrivate::parsePrefix(prefix, 0, &ident, 0); + return ident; +} + +/*! + Returns the host part of the specified \a prefix. + + Host part of a prefix as specified in RFC 1459: +
+    <nick> [ '!' <ident> ] [ '@' <host> ]
+    
+ + \sa IrcMessage::prefix, IrcMessage::host + */ +QString Irc::hostFromPrefix(const QString& prefix) +{ + QString host; + IrcMessagePrivate::parsePrefix(prefix, 0, 0, &host); + return host; +} + +/*! + \deprecated Use IrcCore::registerMetaTypes() instead. + */ +void Irc::registerMetaTypes() +{ + IrcCore::registerMetaTypes(); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, Irc::Code code) +{ + const int index = Irc::staticMetaObject.indexOfEnumerator("Code"); + QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(code); + debug << (key ? key : "Unknown"); + return debug; +} + +QDebug operator<<(QDebug debug, Irc::DataRole role) +{ + const int index = Irc::staticMetaObject.indexOfEnumerator("DataRole"); + QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(role); + debug << (key ? key : "Unknown"); + return debug; +} + +QDebug operator<<(QDebug debug, Irc::Color color) +{ + const int index = Irc::staticMetaObject.indexOfEnumerator("Color"); + QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(color); + debug << (key ? key : "Unknown"); + return debug; +} + +QDebug operator<<(QDebug debug, Irc::SortMethod method) +{ + const int index = Irc::staticMetaObject.indexOfEnumerator("SortMethod"); + QMetaEnum enumerator = Irc::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(method); + debug << (key ? key : "Unknown"); + return debug; +} +#endif // QT_NO_DEBUG_STREAM + +#include "moc_irc.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/irccommand.cpp b/src/libcommuni/src/core/irccommand.cpp new file mode 100644 index 0000000..d7e9b30 --- /dev/null +++ b/src/libcommuni/src/core/irccommand.cpp @@ -0,0 +1,851 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "irccommand.h" +#include "ircmessage.h" +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file irccommand.h + \brief \#include <IrcCommand> + */ + +/*! + \class IrcCommand irccommand.h + \ingroup core + \brief Provides the most common commands. + + The IrcCommand class supports the most common IRC commands out of the box, + and can be extended for custom commands as well. See IrcCommand::Type for + the list of built-in command types. IRC commands, as in IrcCommand instances, + are sent to the IRC server via IrcConnection::sendCommand(). + + \section creating-commands Creating commands + + It is recommended to create IrcCommand instances via static + IrcCommand::createXxx() methods. + + \warning IrcCommand instances must be allocated on the heap, since + IrcConnection::sendCommand() takes ownership of the command and deletes + it once it has been sent. + + \section custom-commands Custom commands + + A "custom command" here refers to command types not listed in IrcCommand::Type, + the list of built-in command types. There are two ways to send custom commands: + \li by passing the string representation of a command directly to + IrcConnection::sendRaw() or IrcConnection::sendData(), or + \li by subclassing IrcCommand and reimplementing + IrcCommand::toString(), which eventually creates the string representation + of the command. + + Example implementation of a custom command: + \code + class IrcServerCommand : public IrcCommand + { + Q_OBJECT + public: + explicit IrcServerCommand(QObject* parent = 0) : IrcCommand(parent) + { + } + + // provided for convenience, to ensure correct parameter order + static IrcCommand* create(const QString& serverName, int hopCount, const QString& info) + { + IrcCommand* command = new IrcServerCommand; + command->setParameters(QStringList() << serverName << QString::number(hopCount) << info); + return command; + } + + // reimplemented from IrcCommand::toString() + virtual toString() const + { + // SERVER + return QString("SERVER %1 %2 %3").arg(params.value(0), params.value(1), params.value(2)); + } + }; + \endcode + + \sa IrcConnection::sendCommand(), IrcConnection::sendRaw(), IrcCommand::Type + */ + +/*! + \enum IrcCommand::Type + This enum describes the built-in command types. + */ + +/*! + \var IrcCommand::Admin + \brief An admin command (ADMIN) is used to query server admin info. + */ + +/*! + \var IrcCommand::Away + \brief An away command (AWAY) is used to set the away status. + */ + +/*! + \var IrcCommand::Capability + \brief A capability command (CAP) is used to manage connection capabilities. + */ + +/*! + \var IrcCommand::CtcpAction + \brief A CTCP action command is used to send an action message to channels and users. + */ + +/*! + \var IrcCommand::CtcpReply + \brief A CTCP reply command is used to send a reply to a request. + */ + +/*! + \var IrcCommand::CtcpRequest + \brief A CTCP request command is used to send a request. + */ + +/*! + \var IrcCommand::Custom + \brief A custom command + */ + +/*! + \var IrcCommand::Info + \brief An info command (INFO) is used to query server info. + */ + +/*! + \var IrcCommand::Invite + \brief An invite command (INVITE) is used to invite users to a channel. + */ + +/*! + \var IrcCommand::Join + \brief A join command (JOIN) is used to start listening a specific channel. + */ + +/*! + \var IrcCommand::Kick + \brief A kick command (KICK) is used to forcibly remove a user from a channel. + */ + +/*! + \var IrcCommand::Knock + \brief A knock command (KNOCK) is used to request channel invitation. + */ + +/*! + \var IrcCommand::List + \brief A list command (LIST) is used to list channels and their topics. + */ + +/*! + \var IrcCommand::Message + \brief A message command (PRIVMSG) is used to send private messages to channels and users. + */ + +/*! + \var IrcCommand::Mode + \brief A mode command (MODE) is used to change the mode of users and channels. + */ + +/*! + \var IrcCommand::Motd + \brief A message of the day command (MOTD) is used to query the message of the day. + */ + +/*! + \var IrcCommand::Names + \brief A names command (NAMES) is used to list all nicknames on a channel. + */ + +/*! + \var IrcCommand::Nick + \brief A nick command (NICK) is used to give user a nickname or change the previous one. + */ + +/*! + \var IrcCommand::Notice + \brief A notice command (NOTICE) is used to send notice messages to channels and users. + */ + +/*! + \var IrcCommand::Part + \brief A part command (PART) causes the client to be removed from the channel. + */ + +/*! + \var IrcCommand::Quit + \brief A quit command (QUIT) is used to end a client connection. + */ + +/*! + \var IrcCommand::Quote + \brief A quote command is used to send a raw message to the server. + */ + +/*! + \var IrcCommand::Stats + \brief A stats command (STATS) is used to query server statistics. + */ + +/*! + \var IrcCommand::Time + \brief A time command (TIME) is used to query local server time. + */ + +/*! + \var IrcCommand::Topic + \brief A topic command (TOPIC) is used to change or view the topic of a channel. + */ + +/*! + \var IrcCommand::Trace + \brief A trace command (TRACE) is used to trace the connection path to a target. + */ + +/*! + \var IrcCommand::Users + \brief A users command (USERS) is used to query server users. + */ + +/*! + \var IrcCommand::Version + \brief A version command (VERSION) is used to query user or server version. + */ + +/*! + \var IrcCommand::Who + \brief A who command (WHO) is used to generate a query which returns a list of matching users. + */ + +/*! + \var IrcCommand::Whois + \brief A whois command (WHOIS) is used to query information about a particular user. + */ + +/*! + \var IrcCommand::Whowas + \brief A whowas command (WHOWAS) is used to query information about a user that no longer exists. + */ + +#ifndef IRC_DOXYGEN +class IrcCommandPrivate +{ +public: + IrcCommandPrivate() : encoding("UTF-8") { } + + QString params(int index) const; + + IrcCommand::Type type; + QStringList parameters; + QByteArray encoding; + + static IrcCommand* createCommand(IrcCommand::Type type, const QStringList& parameters); +}; + +QString IrcCommandPrivate::params(int index) const +{ + return QStringList(parameters.mid(index)).join(QLatin1String(" ")); +} + +IrcCommand* IrcCommandPrivate::createCommand(IrcCommand::Type type, const QStringList& parameters) +{ + IrcCommand* command = new IrcCommand; + command->setType(type); + command->setParameters(parameters); + return command; +} +#endif // IRC_DOXYGEN + +/*! + Constructs a new IrcCommand with \a parent. + */ +IrcCommand::IrcCommand(QObject* parent) : QObject(parent), d_ptr(new IrcCommandPrivate) +{ + Q_D(IrcCommand); + d->type = Custom; +} + +/*! + Destructs the IRC command. + */ +IrcCommand::~IrcCommand() +{ +} + +/*! + This property holds the command type. + + \par Access functions: + \li IrcCommand::Type type() const + \li void setType(IrcCommand::Type type) + */ +IrcCommand::Type IrcCommand::type() const +{ + Q_D(const IrcCommand); + return d->type; +} + +void IrcCommand::setType(Type type) +{ + Q_D(IrcCommand); + d->type = type; +} + +/*! + This property holds the command parameters. + + \par Access functions: + \li QStringList parameters() const + \li void setParameters(const QStringList& parameters) + */ +QStringList IrcCommand::parameters() const +{ + Q_D(const IrcCommand); + return d->parameters; +} + +void IrcCommand::setParameters(const QStringList& parameters) +{ + Q_D(IrcCommand); + d->parameters = parameters; +} + +/*! + This property holds the encoding that is used when + sending the command via IrcConnection::sendCommand(). + + See QTextCodec::availableCodes() for the list of + supported encodings. The default value is \c "UTF-8". + + \par Access functions: + \li QByteArray encoding() const + \li void setEncoding(const QByteArray& encoding) + + \sa QTextCodec::availableCodecs() + */ +QByteArray IrcCommand::encoding() const +{ + Q_D(const IrcCommand); + return d->encoding; +} + +void IrcCommand::setEncoding(const QByteArray& encoding) +{ + Q_D(IrcCommand); + extern bool irc_is_supported_encoding(const QByteArray& encoding); // ircmessagedecoder.cpp + if (!irc_is_supported_encoding(encoding)) { + qWarning() << "IrcCommand::setEncoding(): unsupported encoding" << encoding; + return; + } + d->encoding = encoding; +} + +/*! + Returns the command as a string. + + Reimplement for custom commands. + \sa IrcCommand::Custom + */ +QString IrcCommand::toString() const +{ + Q_D(const IrcCommand); + const QString p0 = d->parameters.value(0); + const QString p1 = d->parameters.value(1); + const QString p2 = d->parameters.value(2); + + switch (d->type) { + case Admin: return QString("ADMIN %1").arg(p0); // server + case Away: return QString("AWAY :%1").arg(d->params(0)); // reason + case Capability: return QString("CAP %1 :%2").arg(p0, d->params(1)); // subcmd, caps + case CtcpAction: return QString("PRIVMSG %1 :\1ACTION %2\1").arg(p0, d->params(1)); // target, msg + case CtcpRequest: return QString("PRIVMSG %1 :\1%2\1").arg(p0, d->params(1)); // target, msg + case CtcpReply: return QString("NOTICE %1 :\1%2\1").arg(p0, d->params(1)); // target, msg + case Info: return QString("INFO %1").arg(p0); // server + case Invite: return QString("INVITE %1 %2").arg(p0, p1); // user, chan + case Join: return p1.isNull() ? QString("JOIN %1").arg(p0) : QString("JOIN %1 %2").arg(p0, p1); // chan, key + case Kick: return p2.isNull() ? QString("KICK %1 %2").arg(p0, p1) : QString("KICK %1 %2 :%3").arg(p0, p1, d->params(2)); // chan, user, reason + case Knock: return QString("KNOCK %1 %2").arg(p0, p1); // chan, msg + case List: return p1.isNull() ? QString("LIST %1").arg(p0) : QString("LIST %1 %2").arg(p0, p1); // chan, server + case Message: return QString("PRIVMSG %1 :%2").arg(p0, d->params(1)); // target, msg + case Mode: return QString("MODE ") + d->parameters.join(" "); // target, mode, arg + case Motd: return QString("MOTD %1").arg(p0); // server + case Names: return QString("NAMES %1").arg(p0); // chan + case Nick: return QString("NICK %1").arg(p0); // nick + case Notice: return QString("NOTICE %1 :%2").arg(p0, d->params(1)); // target, msg + case Part: return p1.isNull() ? QString("PART %1").arg(p0) : QString("PART %1 :%2").arg(p0, d->params(1)); // chan, reason + case Ping: return QString("PING %1").arg(p0); // argument + case Pong: return QString("PONG %1").arg(p0); // argument + case Quit: return QString("QUIT :%1").arg(d->params(0)); // reason + case Quote: return d->parameters.join(" "); + case Stats: return QString("STATS %1 %2").arg(p0, p1); // query, server + case Time: return QString("TIME %1").arg(p0); // server + case Topic: return p1.isNull() ? QString("TOPIC %1").arg(p0) : QString("TOPIC %1 :%2").arg(p0, d->params(1)); // chan, topic + case Trace: return QString("TRACE %1").arg(p0); // target + case Users: return QString("USERS %1").arg(p0); // server + case Version: return p0.isNull() ? QString("VERSION") : QString("PRIVMSG %1 :\1VERSION\1").arg(p0); // user + case Who: return QString("WHO %1").arg(p0); // user + case Whois: return QString("WHOIS %1 %1").arg(p0); // user + case Whowas: return QString("WHOWAS %1 %1").arg(p0); // user + + case Custom: qWarning("Reimplement IrcCommand::toString() for IrcCommand::Custom"); + default: return QString(); + } +} + +/*! + Creates a new message from this command for \a prefix and \a connection. + + Notice that IRC servers do not echo sent message commands back to the client. + This function is particularly useful for converting sent message commands as + messages for presentation purposes. + + \code + if (command->type() == IrcCommand::Message) { + IrcMessage* message = command->toMessage(connection->nickName(), connection); + receiveMessage(message); + message->deleteLater(); + } + \endcode + */ +IrcMessage* IrcCommand::toMessage(const QString& prefix, IrcConnection* connection) const +{ + return IrcMessage::fromData(":" + prefix.toUtf8() + " " + toString().toUtf8(), connection); +} + +/*! + Creates a new ADMIN command with type IrcCommand::Admin and optional parameter \a server. + + This command shows admin info for the specified \a server, + or the current server if not specified. + */ +IrcCommand* IrcCommand::createAdmin(const QString& server) +{ + return IrcCommandPrivate::createCommand(Admin, QStringList() << server); +} + +/*! + Creates a new AWAY command with type IrcCommand::Away and optional parameter \a reason. + + Provides the server with \a reason to automatically send in reply to a private + message directed at the user. If \a reason is omitted, the away status is removed. + */ +IrcCommand* IrcCommand::createAway(const QString& reason) +{ + return IrcCommandPrivate::createCommand(Away, QStringList() << reason); +} + +/*! + Creates a new capability command with type IrcCommand::Capability and parameters \a subCommand and a \a capability. + + Available subcommands are: LS, LIST, REQ, ACK, NAK, CLEAR and END. + */ +IrcCommand* IrcCommand::createCapability(const QString& subCommand, const QString& capability) +{ + return createCapability(subCommand, QStringList() << capability); +} + +/*! + Creates a new capability command with type IrcCommand::Capability and parameters \a subCommand and optional \a capabilities. + + Available subcommands are: LS, LIST, REQ, ACK, NAK, CLEAR and END. + */ +IrcCommand* IrcCommand::createCapability(const QString& subCommand, const QStringList& capabilities) +{ + return IrcCommandPrivate::createCommand(Capability, QStringList() << subCommand << capabilities.join(QLatin1String(" "))); +} + +/*! + Creates a new CTCP action command with type IrcCommand::CtcpAction and parameters \a target and \a action. + */ +IrcCommand* IrcCommand::createCtcpAction(const QString& target, const QString& action) +{ + return IrcCommandPrivate::createCommand(CtcpAction, QStringList() << target << action); +} + +/*! + Creates a new CTCP reply command with type IrcCommand::CtcpReply and parameters \a target and \a reply. + */ +IrcCommand* IrcCommand::createCtcpReply(const QString& target, const QString& reply) +{ + return IrcCommandPrivate::createCommand(CtcpReply, QStringList() << target << reply); +} + +/*! + Creates a new CTCP request command with type IrcCommand::CtcpRequest and parameters \a target and \a request. + */ +IrcCommand* IrcCommand::createCtcpRequest(const QString& target, const QString& request) +{ + return IrcCommandPrivate::createCommand(CtcpRequest, QStringList() << target << request); +} + +/*! + Creates a new INFO command with type IrcCommand::Info and optional parameter \a server. + + This command shows info for the specified \a server, + or the current server if not specified. + */ +IrcCommand* IrcCommand::createInfo(const QString& server) +{ + return IrcCommandPrivate::createCommand(Info, QStringList() << server); +} + +/*! + Creates a new INVITE command with type IrcCommand::Invite and parameters \a user and \a channel. + + This command invites \a user to the \a channel. The channel does not have to exist, but + if it does, only members of the channel are allowed to invite other clients. if the + channel mode +i (invite-only) is set, only channel operators may invite other clients. + */ +IrcCommand* IrcCommand::createInvite(const QString& user, const QString& channel) +{ + return IrcCommandPrivate::createCommand(Invite, QStringList() << user << channel); +} + +/*! + Creates a new JOIN command with type IrcCommand::Join and parameters \a channel and optional \a key. + + This command joins the \a channel using \a key if specified. + If the channel does not exist, it will be created. + */ +IrcCommand* IrcCommand::createJoin(const QString& channel, const QString& key) +{ + return IrcCommandPrivate::createCommand(Join, QStringList() << channel << key); +} + +/*! + This overload is provided for convenience. + */ +IrcCommand* IrcCommand::createJoin(const QStringList& channels, const QStringList& keys) +{ + return IrcCommandPrivate::createCommand(Join, QStringList() << channels.join(",") << keys.join(",")); +} + +/*! + Creates a new KICK command with type IrcCommand::Kick and parameters \a channel, \a user and optional \a reason. + + This command forcibly removes \a user from \a channel, + and may only be issued by channel operators. + */ +IrcCommand* IrcCommand::createKick(const QString& channel, const QString& user, const QString& reason) +{ + return IrcCommandPrivate::createCommand(Kick, QStringList() << channel << user << reason); +} + +/*! + Creates a new KNOCK command with type IrcCommand::Knock and parameters \a channel and optional \a message. + + This command sends an invitation request to a \a channel with an optional \a message. + + \note The command is not formally defined by an RFC, but is supported by most major IRC daemons. + Support is indicated in a RPL_ISUPPORT reply (numeric 005) with the KNOCK keyword. + */ +IrcCommand* IrcCommand::createKnock(const QString& channel, const QString& message) +{ + return IrcCommandPrivate::createCommand(Knock, QStringList() << channel << message); +} + +/*! + Creates a new LIST command with type IrcCommand::List and optional parameters \a channels and \a server. + + This command lists all channels on the server. If \a channels are given, it will list the channel topics. + If \a server is given, the command will be forwarded to \a server for evaluation. + */ +IrcCommand* IrcCommand::createList(const QStringList& channels, const QString& server) +{ + return IrcCommandPrivate::createCommand(List, QStringList() << channels.join(",") << server); +} + +/*! + Creates a new PRIVMSG command with type IrcCommand::Message and parameters \a target and \a message. + + This command sends \a message to \a target, which is usually a user or channel. + */ +IrcCommand* IrcCommand::createMessage(const QString& target, const QString& message) +{ + return IrcCommandPrivate::createCommand(Message, QStringList() << target << message); +} + +/*! + Creates a new MODE command with type IrcCommand::Mode and parameters \a target and optional \a mode and \a arg. + + This command is used to set both user and channel modes. + */ +IrcCommand* IrcCommand::createMode(const QString& target, const QString& mode, const QString& arg) +{ + return IrcCommandPrivate::createCommand(Mode, QStringList() << target << mode << arg); +} + +/*! + Creates a new MOTD command with type IrcCommand::Motd and optional parameter \a server. + + This command shows the message of the day on the specified \a server, + or the current server if not specified. + */ +IrcCommand* IrcCommand::createMotd(const QString& server) +{ + return IrcCommandPrivate::createCommand(Motd, QStringList() << server); +} + +/*! + Creates a new NAMES command with type IrcCommand::Names and parameter \a channel. + + This command lists all users on the \a channel, optionally limiting to the given \a server. + + If \a channel is omitted, all users are shown, grouped by channel name with + all users who are not on a channel being shown as part of channel "*". + If \a server is specified, the command is sent to \a server for evaluation. +*/ +IrcCommand* IrcCommand::createNames(const QString& channel, const QString& server) +{ + return IrcCommandPrivate::createCommand(Names, QStringList() << channel << server); +} + +/*! + This overload is provided for convenience. + */ +IrcCommand* IrcCommand::createNames(const QStringList& channels, const QString& server) +{ + return IrcCommandPrivate::createCommand(Names, QStringList() << channels.join(",") << server); +} + +/*! + Creates a new NICK command with type IrcCommand::Nick and parameter \a nick. + + This command allows a client to change their IRC nickname. + */ +IrcCommand* IrcCommand::createNick(const QString& nick) +{ + return IrcCommandPrivate::createCommand(Nick, QStringList() << nick); +} + +/*! + Creates a new NOTICE command with type IrcCommand::Notice and parameters \a target and \a message. + + This command sends \a notice to \a target, which is usually a user or channel. + + \note The command works similarly to PRIVMSG, except automatic replies must never be sent in reply to NOTICE messages. + */ +IrcCommand* IrcCommand::createNotice(const QString& target, const QString& message) +{ + return IrcCommandPrivate::createCommand(Notice, QStringList() << target << message); +} + +/*! + Creates a new PART command with type IrcCommand::Part and parameters \a channel and optional \a reason. + + This command causes the client to leave the specified channel. + */ +IrcCommand* IrcCommand::createPart(const QString& channel, const QString& reason) +{ + return IrcCommandPrivate::createCommand(Part, QStringList() << channel << reason); +} + +/*! + This overload is provided for convenience. + */ +IrcCommand* IrcCommand::createPart(const QStringList& channels, const QString& reason) +{ + return IrcCommandPrivate::createCommand(Part, QStringList() << channels.join(",") << reason); +} + +/*! + Creates a new PING command with type IrcCommand::Ping and \a argument. + */ +IrcCommand* IrcCommand::createPing(const QString& argument) +{ + return IrcCommandPrivate::createCommand(Ping, QStringList() << argument); +} + +/*! + Creates a new PONG command with type IrcCommand::Pong and \a argument. + */ +IrcCommand* IrcCommand::createPong(const QString& argument) +{ + return IrcCommandPrivate::createCommand(Pong, QStringList() << argument); +} + +/*! + Creates a new QUIT command with type IrcCommand::Quit and optional parameter \a reason. + */ +IrcCommand* IrcCommand::createQuit(const QString& reason) +{ + return IrcCommandPrivate::createCommand(Quit, QStringList() << reason); +} + +/*! + Creates a new QUOTE command with type IrcCommand::Quote and \a raw. + */ +IrcCommand* IrcCommand::createQuote(const QString& raw) +{ + return IrcCommandPrivate::createCommand(Quote, QStringList() << raw); +} + +/*! + Creates a new QUOTE command with type IrcCommand::Quote and \a parameters. + */ +IrcCommand* IrcCommand::createQuote(const QStringList& parameters) +{ + return IrcCommandPrivate::createCommand(Quote, parameters); +} + +/*! + Creates a new STATS command with type IrcCommand::Stats and parameters \a query and optional \a server. + + This command queries statistics about the specified \a server, + or the current server if not specified. + */ +IrcCommand* IrcCommand::createStats(const QString& query, const QString& server) +{ + return IrcCommandPrivate::createCommand(Stats, QStringList() << query << server); +} + +/*! + Creates a new TIME command with type IrcCommand::Time and optional parameter \a server. + + This command queries local time of the specified \a server, + or the current server if not specified. + */ +IrcCommand* IrcCommand::createTime(const QString& server) +{ + return IrcCommandPrivate::createCommand(Time, QStringList() << server); +} + +/*! + Creates a new TOPIC command with type IrcCommand::Topic and parameters \a channel and optional \a topic. + + This command allows the client to query or set the channel topic on \a channel. + If \a topic is given, it sets the channel topic to \a topic. + If channel mode +t is set, only a channel operator may set the topic. + */ +IrcCommand* IrcCommand::createTopic(const QString& channel, const QString& topic) +{ + return IrcCommandPrivate::createCommand(Topic, QStringList() << channel << topic); +} + +/*! + Creates a new TRACE command with type IrcCommand::Trace and optional parameter \a target. + + This command traces the connection path across the IRC network + to the current server or to a specific \a target (server or client) + in a similar method to traceroute. + */ +IrcCommand* IrcCommand::createTrace(const QString& target) +{ + return IrcCommandPrivate::createCommand(Trace, QStringList() << target); +} + +/*! + Creates a new USERS command with type IrcCommand::Users and optional parameter \a server. + + This command queries the users of the specified \a server, + or the current server if not specified. + */ +IrcCommand* IrcCommand::createUsers(const QString& server) +{ + return IrcCommandPrivate::createCommand(Users, QStringList() << server); +} + +/*! + Creates a new command with type IrcCommand::Version and optional parameter \a user. + + This command queries the version of the specified \a user's client (CTCP REQUEST VERSION), + or the current server (VERSION) if not specified. + */ +IrcCommand* IrcCommand::createVersion(const QString& user) +{ + return IrcCommandPrivate::createCommand(Version, QStringList() << user); +} + +/*! + Creates a new WHO command with type IrcCommand::Who and parameters \a mask and optional \a operators. + + This command returns a list of users who match \a mask, + optionally matching only IRC \a operators. + */ +IrcCommand* IrcCommand::createWho(const QString& mask, bool operators) +{ + return IrcCommandPrivate::createCommand(Who, QStringList() << mask << (operators ? "o" : "")); +} + +/*! + Creates a new WHOIS command with type IrcCommand::Whois and parameter \a user. + + This command returns information about \a user. + */ +IrcCommand* IrcCommand::createWhois(const QString& user) +{ + return IrcCommandPrivate::createCommand(Whois, QStringList() << user); +} + +/*! + Creates a new WHOWAS command with type IrcCommand::Whowas and parameters \a user and optional \a count. + + This command returns information about a \a user that is no longer online + (due to client disconnection, or nickname changes). If given, the server + will return information from the last \a count times the nickname has been used. + */ +IrcCommand* IrcCommand::createWhowas(const QString& user, int count) +{ + return IrcCommandPrivate::createCommand(Whowas, QStringList() << user << QString::number(count)); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, IrcCommand::Type type) +{ + const int index = IrcCommand::staticMetaObject.indexOfEnumerator("Type"); + QMetaEnum enumerator = IrcCommand::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(type); + debug << (key ? key : "Unknown"); + return debug; +} + +QDebug operator<<(QDebug debug, const IrcCommand* command) +{ + if (!command) + return debug << "IrcCommand(0x0) "; + debug.nospace() << command->metaObject()->className() << '(' << (void*) command; + if (!command->objectName().isEmpty()) + debug.nospace() << ", name=" << qPrintable(command->objectName()); + debug.nospace() << ", type=" << command->type(); + QString str = command->toString(); + if (!str.isEmpty()) + debug.nospace() << ", " << str.left(20); + debug.nospace() << ')'; + return debug.space(); +} +#endif // QT_NO_DEBUG_STREAM + +#include "moc_irccommand.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircconnection.cpp b/src/libcommuni/src/core/ircconnection.cpp new file mode 100644 index 0000000..837aa16 --- /dev/null +++ b/src/libcommuni/src/core/ircconnection.cpp @@ -0,0 +1,1508 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircconnection.h" +#include "ircconnection_p.h" +#include "ircnetwork_p.h" +#include "ircprotocol.h" +#include "ircnetwork.h" +#include "irccommand.h" +#include "ircmessage.h" +#include "ircfilter.h" +#include "irc.h" +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef QT_NO_OPENSSL +#include +#include +#endif // QT_NO_OPENSSL +#include +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file ircconnection.h + \brief \#include <IrcConnection> + */ + +/*! + \class IrcConnection ircconnection.h IrcConnection + \ingroup core + \brief Provides means to establish a connection to an IRC server. + + \section connection-management Connection management + + Before \ref open() "opening" a connection, it must be first initialized + with \ref host, \ref userName, \ref nickName and \ref realName. + + The connection status may be queried at any time via status(). Also + \ref active "isActive()" and \ref connected "isConnected()" are provided + for convenience. In addition to the \ref status "statusChanged()" signal, + the most important statuses are informed via the following convenience + signals: + \li connecting() - + The connection is being established. + \li \ref connected "connected()" - + The IRC connection has been established, and the server is ready to receive commands. + \li disconnected() - + The connection has been lost. + + \section receiving-messages Receiving messages + + Whenever a message is received from the server, the messageReceived() + signal is emitted. Also message type specific signals are provided + for convenience. See messageReceived() and IrcMessage and its + subclasses for more details. + + \section sending-commands Sending commands + + Sending commands to a server is most conveniently done by creating + them via the various static \ref IrcCommand "IrcCommand::createXxx()" + methods and passing them to sendCommand(). Also sendData() is provided + for more low-level access. See IrcCommand for more details. + + \section example Example + + \code + IrcConnection* connection = new IrcConnection(this); + connect(connection, SIGNAL(messageReceived(IrcMessage*)), this, SLOT(onMessageReceived(IrcMessage*))); + connection->setHost("irc.server.com"); + connection->setUserName("me"); + connection->setNickName("myself"); + connection->setRealName("And I"); + connection->sendCommand(IrcCommand::createJoin("#mine")); + connection->open(); + \endcode + + \sa IrcNetwork, IrcMessage, IrcCommand + */ + +/*! + \enum IrcConnection::Status + This enum describes the connection status. + */ + +/*! + \var IrcConnection::Inactive + \brief The connection is inactive. + */ + +/*! + \var IrcConnection::Waiting + \brief The connection is waiting for a reconnect. + */ + +/*! + \var IrcConnection::Connecting + \brief The connection is being established. + */ + +/*! + \var IrcConnection::Connected + \brief The connection has been established. + */ + +/*! + \var IrcConnection::Closing + \brief The connection is being closed. + */ + +/*! + \var IrcConnection::Closed + \brief The connection has been closed. + */ + +/*! + \var IrcConnection::Error + \brief The connection has encountered an error. + */ + +/*! + \fn void IrcConnection::connecting() + + This signal is emitted when the connection is being established. + + The underlying \ref socket has connected, but the IRC handshake is + not yet finished and the server is not yet ready to receive commands. + */ + +/*! + \fn void IrcConnection::nickNameRequired(const QString& reserved, QString* alternate) + + This signal is emitted when the requested nick name is \a reserved + and an \a alternate nick name should be provided. + + An alternate nick name may be set via the provided argument, by changing + the \ref nickName property, or by sending a nick command directly. + + \sa IrcCommand::createNick(), Irc::ERR_NICKNAMEINUSE, Irc::ERR_NICKCOLLISION + */ + +/*! + \fn void IrcConnection::channelKeyRequired(const QString& channel, QString* key) + + This signal is emitted when joining a \a channel requires a \a key. + The key may be set via the provided argument, or by sending a new + join command directly. + + \sa IrcCommand::createJoin(), Irc::ERR_BADCHANNELKEY + */ + +/*! + \fn void IrcConnection::disconnected() + + This signal is emitted when the connection has been lost. + */ + +/*! + \fn void IrcConnection::socketError(QAbstractSocket::SocketError error) + + This signal is emitted when a \ref socket \a error occurs. + + \sa QAbstractSocket::error() + */ + +/*! + \fn void IrcConnection::socketStateChanged(QAbstractSocket::SocketState state) + + This signal is emitted when the \a state of the underlying \ref socket changes. + + \sa QAbstractSocket::stateChanged() + */ + +/*! + \since 3.2 + \fn void IrcConnection::secureError() + + This signal is emitted when SSL socket error occurs. + + Either QSslSocket::sslErrors() was emitted, or the remote host closed + the connection without QSslSocket::sslErrors() being emitted meaning + that the server is not SSL-enabled. + */ + +/*! + \fn void IrcConnection::messageReceived(IrcMessage* message) + + This signal is emitted when a \a message is received. + + In addition, message type specific signals are provided for convenience: + \li void capabilityMessageReceived(\ref IrcCapabilityMessage* message) + \li void errorMessageReceived(\ref IrcErrorMessage* message) + \li void inviteMessageReceived(\ref IrcInviteMessage* message) + \li void joinMessageReceived(\ref IrcJoinMessage* message) + \li void kickMessageReceived(\ref IrcKickMessage* message) + \li void modeMessageReceived(\ref IrcModeMessage* message) + \li void namesMessageReceived(\ref IrcNamesMessage* message) + \li void nickMessageReceived(\ref IrcNickMessage* message) + \li void noticeMessageReceived(\ref IrcNoticeMessage* message) + \li void numericMessageReceived(\ref IrcNumericMessage* message) + \li void motdMessageReceived(\ref IrcMotdMessage* message) + \li void partMessageReceived(\ref IrcPartMessage* message) + \li void pingMessageReceived(\ref IrcPingMessage* message) + \li void pongMessageReceived(\ref IrcPongMessage* message) + \li void privateMessageReceived(\ref IrcPrivateMessage* message) + \li void quitMessageReceived(\ref IrcQuitMessage* message) + \li void topicMessageReceived(\ref IrcTopicMessage* message) + */ + +#ifndef IRC_DOXYGEN +template +static void irc_debug(IrcConnection* connection, const char* msg, const T& arg) +{ + static bool dbg = qgetenv("IRC_DEBUG").toInt(); + if (dbg) { + const QString desc = QString::fromLatin1("IrcConnection(%1)").arg(connection->displayName()); + qDebug() << qPrintable(desc) << msg << arg; + } +} + +IrcConnectionPrivate::IrcConnectionPrivate() : + q_ptr(0), + encoding("ISO-8859-15"), + network(0), + protocol(0), + socket(0), + host(), + port(6667), + userName(), + nickName(), + realName(), + enabled(true), + status(IrcConnection::Inactive), + sslErrors(false), + closed(false) +{ +} + +void IrcConnectionPrivate::init(IrcConnection* connection) +{ + q_ptr = connection; + network = IrcNetworkPrivate::create(connection); + connection->setSocket(new QTcpSocket(connection)); + connection->setProtocol(new IrcProtocol(connection)); + QObject::connect(&reconnecter, SIGNAL(timeout()), connection, SLOT(_irc_reconnect())); +} + +void IrcConnectionPrivate::_irc_connected() +{ + Q_Q(IrcConnection); + closed = false; + sslErrors = false; + emit q->connecting(); + if (q->isSecure()) + QMetaObject::invokeMethod(socket, "startClientEncryption"); + protocol->open(); +} + +void IrcConnectionPrivate::_irc_disconnected() +{ + Q_Q(IrcConnection); + protocol->close(); + emit q->disconnected(); + if (enabled && !sslErrors && (status != IrcConnection::Closed || !closed) && !reconnecter.isActive() && reconnecter.interval() > 0) { + reconnecter.start(); + setStatus(IrcConnection::Waiting); + } +} + +void IrcConnectionPrivate::_irc_error(QAbstractSocket::SocketError error) +{ + Q_Q(IrcConnection); + if (!closed && !sslErrors && error == QAbstractSocket::RemoteHostClosedError && q->isSecure()) { + irc_debug(q, "SSL error:", "no SSL available"); + setStatus(IrcConnection::Error); + sslErrors = true; + emit q->secureError(); + } else if (!closed || (error != QAbstractSocket::RemoteHostClosedError && error != QAbstractSocket::UnknownSocketError)) { + irc_debug(q, "socket error:", error); + emit q->socketError(error); + setStatus(IrcConnection::Error); + } +} + +void IrcConnectionPrivate::_irc_sslErrors() +{ + Q_Q(IrcConnection); + QStringList errors; +#ifndef QT_NO_OPENSSL + QSslSocket* ssl = qobject_cast(socket); + if (ssl) { + foreach (const QSslError& error, ssl->sslErrors()) + errors += error.errorString(); + } +#endif + irc_debug(q, "SSL handshake errors:", errors); + sslErrors = true; + emit q->secureError(); +} + +void IrcConnectionPrivate::_irc_state(QAbstractSocket::SocketState state) +{ + Q_Q(IrcConnection); + switch (state) { + case QAbstractSocket::UnconnectedState: + if (closed) + setStatus(IrcConnection::Closed); + break; + case QAbstractSocket::ClosingState: + if (status != IrcConnection::Error) + setStatus(IrcConnection::Closing); + break; + case QAbstractSocket::HostLookupState: + case QAbstractSocket::ConnectingState: + case QAbstractSocket::ConnectedState: + default: + setStatus(IrcConnection::Connecting); + break; + } + emit q->socketStateChanged(state); +} + +void IrcConnectionPrivate::_irc_reconnect() +{ + Q_Q(IrcConnection); + if (!q->isActive()) { + reconnecter.stop(); + q->open(); + } +} + +void IrcConnectionPrivate::_irc_readData() +{ + protocol->read(); +} + +void IrcConnectionPrivate::_irc_filterDestroyed(QObject* filter) +{ + messageFilters.removeAll(filter); + commandFilters.removeAll(filter); +} + +void IrcConnectionPrivate::setNick(const QString& nick) +{ + Q_Q(IrcConnection); + if (nickName != nick) { + nickName = nick; + emit q->nickNameChanged(nick); + } +} + +void IrcConnectionPrivate::setStatus(IrcConnection::Status value) +{ + Q_Q(IrcConnection); + if (status != value) { + const bool wasConnected = q->isConnected(); + status = value; + emit q->statusChanged(value); + + if (!wasConnected && q->isConnected()) { + emit q->connected(); + foreach (IrcCommand* cmd, pendingCommands) + q->sendCommand(cmd); + pendingCommands.clear(); + } + irc_debug(q, "status:", status); + } +} + +void IrcConnectionPrivate::setInfo(const QHash& info) +{ + Q_Q(IrcConnection); + const QString oldName = q->displayName(); + IrcNetworkPrivate* priv = IrcNetworkPrivate::get(network); + priv->setInfo(info); + const QString newName = q->displayName(); + if (oldName != newName) + emit q->displayNameChanged(newName); +} + +void IrcConnectionPrivate::receiveMessage(IrcMessage* msg) +{ + Q_Q(IrcConnection); + bool filtered = false; + for (int i = messageFilters.count() - 1; !filtered && i >= 0; --i) { + IrcMessageFilter* filter = qobject_cast(messageFilters.at(i)); + if (filter) + filtered |= filter->messageFilter(msg); + } + + if (!filtered) { + emit q->messageReceived(msg); + + switch (msg->type()) { + case IrcMessage::Nick: + emit q->nickMessageReceived(static_cast(msg)); + break; + case IrcMessage::Quit: + emit q->quitMessageReceived(static_cast(msg)); + break; + case IrcMessage::Join: + emit q->joinMessageReceived(static_cast(msg)); + break; + case IrcMessage::Part: + emit q->partMessageReceived(static_cast(msg)); + break; + case IrcMessage::Topic: + emit q->topicMessageReceived(static_cast(msg)); + break; + case IrcMessage::WhoReply: + emit q->whoReplyMessageReceived(static_cast(msg)); + break; + case IrcMessage::Invite: + emit q->inviteMessageReceived(static_cast(msg)); + break; + case IrcMessage::Kick: + emit q->kickMessageReceived(static_cast(msg)); + break; + case IrcMessage::Mode: + emit q->modeMessageReceived(static_cast(msg)); + break; + case IrcMessage::Private: + emit q->privateMessageReceived(static_cast(msg)); + break; + case IrcMessage::Notice: + emit q->noticeMessageReceived(static_cast(msg)); + break; + case IrcMessage::Ping: + emit q->pingMessageReceived(static_cast(msg)); + break; + case IrcMessage::Pong: + emit q->pongMessageReceived(static_cast(msg)); + break; + case IrcMessage::Error: + emit q->errorMessageReceived(static_cast(msg)); + break; + case IrcMessage::Numeric: + emit q->numericMessageReceived(static_cast(msg)); + break; + case IrcMessage::Capability: + emit q->capabilityMessageReceived(static_cast(msg)); + break; + case IrcMessage::Motd: + emit q->motdMessageReceived(static_cast(msg)); + break; + case IrcMessage::Names: + emit q->namesMessageReceived(static_cast(msg)); + break; + case IrcMessage::Unknown: + default: + break; + } + } + msg->deleteLater(); +} + +IrcCommand* IrcConnectionPrivate::createCtcpReply(IrcPrivateMessage* request) +{ + Q_Q(IrcConnection); + IrcCommand* reply = 0; + const QMetaObject* metaObject = q->metaObject(); + int idx = metaObject->indexOfMethod("createCtcpReply(QVariant)"); + if (idx != -1) { + // QML: QVariant createCtcpReply(QVariant) + QVariant ret; + QMetaMethod method = metaObject->method(idx); + method.invoke(q, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(request))); + reply = ret.value(); + } else { + // C++: IrcCommand* createCtcpReply(IrcPrivateMessage*) + idx = metaObject->indexOfMethod("createCtcpReply(IrcPrivateMessage*)"); + QMetaMethod method = metaObject->method(idx); + method.invoke(q, Q_RETURN_ARG(IrcCommand*, reply), Q_ARG(IrcPrivateMessage*, request)); + } + return reply; +} +#endif // IRC_DOXYGEN + +/*! + Constructs a new IRC connection with \a parent. + */ +IrcConnection::IrcConnection(QObject* parent) : QObject(parent), d_ptr(new IrcConnectionPrivate) +{ + Q_D(IrcConnection); + d->init(this); +} + +/*! + Constructs a new IRC connection with \a host and \a parent. + */ +IrcConnection::IrcConnection(const QString& host, QObject* parent) : QObject(parent), d_ptr(new IrcConnectionPrivate) +{ + Q_D(IrcConnection); + d->init(this); + setHost(host); +} + +/*! + Destructs the IRC connection. + */ +IrcConnection::~IrcConnection() +{ + close(); + emit destroyed(this); +} + +/*! + This property holds the FALLBACK encoding for received messages. + + The fallback encoding is used when the message is detected not + to be valid \c UTF-8 and the consequent auto-detection of message + encoding fails. See QTextCodec::availableCodecs() for the list of + supported encodings. + + The default value is \c ISO-8859-15. + + \par Access functions: + \li QByteArray encoding() const + \li void setEncoding(const QByteArray& encoding) + + \sa QTextCodec::availableCodecs(), QTextCodec::codecForLocale() + */ +QByteArray IrcConnection::encoding() const +{ + Q_D(const IrcConnection); + return d->encoding; +} + +void IrcConnection::setEncoding(const QByteArray& encoding) +{ + Q_D(IrcConnection); + extern bool irc_is_supported_encoding(const QByteArray& encoding); // ircmessagedecoder.cpp + if (!irc_is_supported_encoding(encoding)) { + qWarning() << "IrcConnection::setEncoding(): unsupported encoding" << encoding; + return; + } + d->encoding = encoding; +} + +/*! + This property holds the server host. + + \par Access functions: + \li QString host() const + \li void setHost(const QString& host) + + \par Notifier signal: + \li void hostChanged(const QString& host) + */ +QString IrcConnection::host() const +{ + Q_D(const IrcConnection); + return d->host; +} + +void IrcConnection::setHost(const QString& host) +{ + Q_D(IrcConnection); + if (d->host != host) { + if (isActive()) + qWarning("IrcConnection::setHost() has no effect until re-connect"); + const QString oldName = displayName(); + d->host = host; + emit hostChanged(host); + const QString newName = displayName(); + if (oldName != newName) + emit displayNameChanged(newName); + } +} + +/*! + This property holds the server port. + + The default value is \c 6667. + + \par Access functions: + \li int port() const + \li void setPort(int port) + + \par Notifier signal: + \li void portChanged(int port) + */ +int IrcConnection::port() const +{ + Q_D(const IrcConnection); + return d->port; +} + +void IrcConnection::setPort(int port) +{ + Q_D(IrcConnection); + if (d->port != port) { + if (isActive()) + qWarning("IrcConnection::setPort() has no effect until re-connect"); + d->port = port; + emit portChanged(port); + } +} + +/*! + This property holds the user name. + + \note Changing the user name has no effect until the connection is re-established. + + \par Access functions: + \li QString userName() const + \li void setUserName(const QString& name) + + \par Notifier signal: + \li void userNameChanged(const QString& name) + */ +QString IrcConnection::userName() const +{ + Q_D(const IrcConnection); + return d->userName; +} + +void IrcConnection::setUserName(const QString& name) +{ + Q_D(IrcConnection); + QString user = name.split(" ", QString::SkipEmptyParts).value(0).trimmed(); + if (d->userName != user) { + if (isActive()) + qWarning("IrcConnection::setUserName() has no effect until re-connect"); + d->userName = user; + emit userNameChanged(user); + } +} + +/*! + This property holds the nick name. + + \par Access functions: + \li QString nickName() const + \li void setNickName(const QString& name) + + \par Notifier signal: + \li void nickNameChanged(const QString& name) + */ +QString IrcConnection::nickName() const +{ + Q_D(const IrcConnection); + return d->nickName; +} + +void IrcConnection::setNickName(const QString& name) +{ + Q_D(IrcConnection); + QString nick = name.split(" ", QString::SkipEmptyParts).value(0).trimmed(); + if (d->nickName != nick) { + if (isActive()) + sendCommand(IrcCommand::createNick(nick)); + else + d->setNick(nick); + } +} + +/*! + This property holds the real name. + + \note Changing the real name has no effect until the connection is re-established. + + \par Access functions: + \li QString realName() const + \li void setRealName(const QString& name) + + \par Notifier signal: + \li void realNameChanged(const QString& name) + */ +QString IrcConnection::realName() const +{ + Q_D(const IrcConnection); + return d->realName; +} + +void IrcConnection::setRealName(const QString& name) +{ + Q_D(IrcConnection); + if (d->realName != name) { + if (isActive()) + qWarning("IrcConnection::setRealName() has no effect until re-connect"); + d->realName = name; + emit realNameChanged(name); + } +} + +/*! + This property holds the password. + + \par Access functions: + \li QString password() const + \li void setPassword(const QString& password) + + \par Notifier signal: + \li void passwordChanged(const QString& password) + */ +QString IrcConnection::password() const +{ + Q_D(const IrcConnection); + return d->password; +} + +void IrcConnection::setPassword(const QString& password) +{ + Q_D(IrcConnection); + if (d->password != password) { + if (isActive()) + qWarning("IrcConnection::setPassword() has no effect until re-connect"); + d->password = password; + emit passwordChanged(password); + } +} + +/*! + This property holds the display name. + + Unless explicitly set, display name resolves to IrcNetwork::name + or IrcConnection::host while the former is not known. + + \par Access functions: + \li QString displayName() const + \li void setDisplayName(const QString& name) + + \par Notifier signal: + \li void displayNameChanged(const QString& name) + */ +QString IrcConnection::displayName() const +{ + Q_D(const IrcConnection); + QString name = d->displayName; + if (name.isEmpty()) + name = d->network->name(); + if (name.isEmpty()) + name = d->host; + return name; +} + +void IrcConnection::setDisplayName(const QString& name) +{ + Q_D(IrcConnection); + if (d->displayName != name) { + d->displayName = name; + emit displayNameChanged(name); + } +} + +/*! + \since 3.1 + + This property holds arbitrary user data. + + \par Access functions: + \li QVariantMap userData() const + \li void setUserData(const QVariantMap& data) + + \par Notifier signal: + \li void userDataChanged(const QVariantMap& data) + */ +QVariantMap IrcConnection::userData() const +{ + Q_D(const IrcConnection); + return d->userData; +} + +void IrcConnection::setUserData(const QVariantMap& data) +{ + Q_D(IrcConnection); + if (d->userData != data) { + d->userData = data; + emit userDataChanged(data); + } +} + +/*! + \property Status IrcConnection::status + This property holds the connection status. + + \par Access function: + \li Status status() const + + \par Notifier signal: + \li void statusChanged(Status status) + */ +IrcConnection::Status IrcConnection::status() const +{ + Q_D(const IrcConnection); + return d->status; +} + +/*! + \property bool IrcConnection::active + This property holds whether the connection is active. + + The connection is considered active when its either connecting, connected or closing. + + \par Access function: + \li bool isActive() const + */ +bool IrcConnection::isActive() const +{ + Q_D(const IrcConnection); + return d->status == Connecting || d->status == Connected || d->status == Closing; +} + +/*! + \property bool IrcConnection::connected + This property holds whether the connection has been established. + + The connection has been established when the welcome message + has been received and the server is ready to receive commands. + + \sa Irc::RPL_WELCOME + + \par Access function: + \li bool isConnected() const + + \par Notifier signal: + \li void connected() + */ +bool IrcConnection::isConnected() const +{ + Q_D(const IrcConnection); + return d->status == Connected; +} + +/*! + \property bool IrcConnection::enabled + This property holds whether the connection is enabled. + + The default value is \c true. + + When set to \c false, a disabled connection does nothing when open() is called. + + \par Access functions: + \li bool isEnabled() const + \li void setEnabled(bool enabled) [slot] + \li void setDisabled(bool disabled) [slot] + + \par Notifier signal: + \li void enabledChanged(bool enabled) + */ +bool IrcConnection::isEnabled() const +{ + Q_D(const IrcConnection); + return d->enabled; +} + +void IrcConnection::setEnabled(bool enabled) +{ + Q_D(IrcConnection); + if (d->enabled != enabled) { + d->enabled = enabled; + emit enabledChanged(enabled); + } +} + +void IrcConnection::setDisabled(bool disabled) +{ + setEnabled(!disabled); +} + +/*! + \property int IrcConnection::reconnectDelay + This property holds the reconnect delay in seconds. + + A positive (greater than zero) value enables automatic reconnect. + When the connection is lost due to a socket error, IrcConnection + will automatically attempt to reconnect after the specified delay. + + The default value is \c 0 (automatic reconnect disabled). + + \par Access functions: + \li int reconnectDelay() const + \li void setReconnectDelay(int seconds) + + \par Notifier signal: + \li void reconnectDelayChanged(int seconds) + */ +int IrcConnection::reconnectDelay() const +{ + Q_D(const IrcConnection); + return d->reconnecter.interval() / 1000; +} + +void IrcConnection::setReconnectDelay(int seconds) +{ + Q_D(IrcConnection); + const int interval = qMax(0, seconds) * 1000; + if (d->reconnecter.interval() != interval) { + d->reconnecter.setInterval(interval); + emit reconnectDelayChanged(interval); + } +} + +/*! + This property holds the socket. The default value is an instance of QTcpSocket. + + The previously set socket is deleted if its parent is \c this. + + \note IrcConnection supports QSslSocket in the way that it automatically + calls QSslSocket::startClientEncryption() while connecting. + + \par Access functions: + \li \ref QAbstractSocket* socket() const + \li void setSocket(\ref QAbstractSocket* socket) + + \sa IrcConnection::secure + */ +QAbstractSocket* IrcConnection::socket() const +{ + Q_D(const IrcConnection); + return d->socket; +} + +void IrcConnection::setSocket(QAbstractSocket* socket) +{ + Q_D(IrcConnection); + if (d->socket != socket) { + if (d->socket) { + d->socket->disconnect(this); + if (d->socket->parent() == this) + d->socket->deleteLater(); + } + + d->socket = socket; + if (socket) { + connect(socket, SIGNAL(connected()), this, SLOT(_irc_connected())); + connect(socket, SIGNAL(disconnected()), this, SLOT(_irc_disconnected())); + connect(socket, SIGNAL(readyRead()), this, SLOT(_irc_readData())); + connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(_irc_error(QAbstractSocket::SocketError))); + connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(_irc_state(QAbstractSocket::SocketState))); + if (isSecure()) + connect(socket, SIGNAL(sslErrors(QList)), this, SLOT(_irc_sslErrors())); + } + } +} + +/*! + \property bool IrcConnection::secure + This property holds whether the socket is an SSL socket. + + This property is provided for convenience. Calling + \code + connection->setSecure(true); + \endcode + + is equivalent to: + + \code + QSslSocket* socket = new QSslSocket(socket); + socket->setPeerVerifyMode(QSslSocket::QueryPeer); + connection->setSocket(socket); + \endcode + + \note IrcConnection does not handle SSL errors, see + QSslSocket::sslErrors() for more details on the subject. + + \par Access functions: + \li bool isSecure() const + \li void setSecure(bool secure) + + \par Notifier signal: + \li void secureChanged(bool secure) + + \sa secureSupported, IrcConnection::socket + */ +bool IrcConnection::isSecure() const +{ +#ifdef QT_NO_OPENSSL + return false; +#else + return qobject_cast(socket()); +#endif // QT_NO_OPENSSL +} + +void IrcConnection::setSecure(bool secure) +{ +#ifdef QT_NO_OPENSSL + if (secure) { + qWarning("IrcConnection::setSecure(): the Qt build does not support SSL"); + return; + } +#else + if (secure && !QSslSocket::supportsSsl()) { + qWarning("IrcConnection::setSecure(): the platform does not support SSL - try installing OpenSSL"); + return; + } + + QSslSocket* sslSocket = qobject_cast(socket()); + if (secure && !sslSocket) { + sslSocket = new QSslSocket(this); + sslSocket->setPeerVerifyMode(QSslSocket::QueryPeer); + setSocket(sslSocket); + emit secureChanged(true); + } else if (!secure && sslSocket) { + setSocket(new QTcpSocket(this)); + emit secureChanged(false); + } +#endif // !QT_NO_OPENSSL +} + +/*! + \since 3.2 + \property bool IrcConnection::secureSupported + This property holds whether SSL is supported. + + The value may be \c false for the following reasons: + \li Qt was built without SSL support (\c QT_NO_SSL is defined), or + \li The platform does not support SSL (QSslSocket::supportsSsl() returns \c false). + + \par Access function: + \li static bool isSecureSupported() + + \sa secure, QSslSocket::supportsSsl() + */ + +bool IrcConnection::isSecureSupported() +{ +#ifdef QT_NO_OPENSSL + return false; +#else + return QSslSocket::supportsSsl(); +#endif +} + +/*! + This property holds the used SASL (Simple Authentication and Security Layer) mechanism. + + \par Access functions: + \li QString saslMechanism() const + \li void setSaslMechanism(const QString& mechanism) + + \par Notifier signal: + \li void saslMechanismChanged(const QString& mechanism) + + \sa supportedSaslMechanisms + */ +QString IrcConnection::saslMechanism() const +{ + Q_D(const IrcConnection); + return d->saslMechanism; +} + +void IrcConnection::setSaslMechanism(const QString& mechanism) +{ + Q_D(IrcConnection); + if (!mechanism.isEmpty() && !supportedSaslMechanisms().contains(mechanism.toUpper())) { + qWarning("IrcConnection::setSaslMechanism(): unsupported mechanism: '%s'", qPrintable(mechanism)); + return; + } + if (d->saslMechanism != mechanism) { + if (isActive()) + qWarning("IrcConnection::setSaslMechanism() has no effect until re-connect"); + d->saslMechanism = mechanism.toUpper(); + emit saslMechanismChanged(mechanism); + } +} + +/*! + This property holds the list of supported SASL (Simple Authentication and Security Layer) mechanisms. + + \par Access function: + \li static QStringList supportedSaslMechanisms() + + \sa saslMechanism + */ +QStringList IrcConnection::supportedSaslMechanisms() +{ + return QStringList() << QLatin1String("PLAIN"); +} + +/*! + This property holds the network information. + + \par Access function: + \li IrcNetwork* network() const + */ +IrcNetwork* IrcConnection::network() const +{ + Q_D(const IrcConnection); + return d->network; +} + +/*! + Opens a connection to the server. + + The function does nothing when the connection is already \ref active + or explicitly \ref enabled "disabled". + + \note The function merely outputs a warnings and returns immediately if + either \ref host, \ref userName, \ref nickName or \ref realName is empty. + */ +void IrcConnection::open() +{ + Q_D(IrcConnection); + if (d->host.isEmpty()) { + qWarning("IrcConnection::open(): host is empty!"); + return; + } + if (d->userName.isEmpty()) { + qWarning("IrcConnection::open(): userName is empty!"); + return; + } + if (d->nickName.isEmpty()) { + qWarning("IrcConnection::open(): nickName is empty!"); + return; + } + if (d->realName.isEmpty()) { + qWarning("IrcConnection::open(): realName is empty!"); + return; + } + if (d->enabled && d->socket && !isActive()) + d->socket->connectToHost(d->host, d->port); +} + +/*! + Immediately closes the connection to the server. + + Calling close() makes the connection close immediately and thus might lead to + "remote host closed the connection". In order to quit gracefully, call quit() + first. This function attempts to flush the underlying socket, but this does + not guarantee that the server ever receives the QUIT command if the connection + is closed immediately after sending the command. In order to ensure a graceful + quit, let the server handle closing the connection. + + C++ example: + \code + connection->quit(reason); + QTimer::singleShot(timeout, connection, SLOT(deleteLater())); + \endcode + + QML example: + \code + connection.quit(reason); + connection.destroy(timeout); + \endcode + + \sa quit() + */ +void IrcConnection::close() +{ + Q_D(IrcConnection); + if (d->socket) { + d->closed = true; + d->socket->flush(); + d->socket->abort(); + d->socket->disconnectFromHost(); + if (d->socket->state() == QAbstractSocket::UnconnectedState) + d->setStatus(Closed); + d->reconnecter.stop(); + } +} + +/*! + Sends a quit command with an optionally specified \a reason. + + This method is provided for convenience. It is equal to: + \code + IrcCommand* command = IrcCommand::createQuit(reason); + connection->sendCommand(command); + \endcode + + \sa IrcCommand::createQuit() + */ +void IrcConnection::quit(const QString& reason) +{ + sendCommand(IrcCommand::createQuit(reason)); +} + +/*! + Sends a \a command to the server. + + If the connection is not active, the \a command is queued and sent + later when the connection has been established. + + \note If the command has a valid parent, it is an indication that + the caller of this method is be responsible for freeing the command. + If the command does not have a valid parent (like the commands + created via various IrcCommand::createXxx() methods) the connection + will take ownership of the command and delete it once it has been + sent. Thus, the command must have been allocated on the heap and + it is not safe to access the command after it has been sent. + + \sa sendData() + */ +bool IrcConnection::sendCommand(IrcCommand* command) +{ + Q_D(IrcConnection); + bool res = false; + if (command) { + bool filtered = false; + for (int i = d->commandFilters.count() - 1; !filtered && i >= 0; --i) { + QObject* filter = d->commandFilters.at(i); + IrcCommandFilter* commandFilter = qobject_cast(filter); + if (commandFilter && !d->activeCommandFilters.contains(filter)) { + d->activeCommandFilters.push(filter); + filtered |= commandFilter->commandFilter(command); + d->activeCommandFilters.pop(); + } + } + if (filtered) + return false; + + if (isActive()) { + QTextCodec* codec = QTextCodec::codecForName(command->encoding()); + Q_ASSERT(codec); + res = sendData(codec->fromUnicode(command->toString())); + if (!command->parent()) + command->deleteLater(); + } else { + Q_D(IrcConnection); + d->pendingCommands += command; + } + } + return res; +} + +/*! + Sends raw \a data to the server. + + \sa sendCommand() + */ +bool IrcConnection::sendData(const QByteArray& data) +{ + Q_D(IrcConnection); + if (d->socket) { + static bool dbg = qgetenv("IRC_DEBUG").toInt(); + if (dbg) qDebug() << "->" << data; + if (!d->closed && data.length() >= 4) { + const QByteArray cmd = data.left(5).toUpper(); + if (cmd.startsWith("QUIT") && (data.length() == 4 || QChar(data.at(4)).isSpace())) + d->closed = true; + } + return d->protocol->write(data); + } + return false; +} + +/*! + Sends raw \a message to the server using UTF-8 encoding. + + \sa sendData(), sendCommand() + */ +bool IrcConnection::sendRaw(const QString& message) +{ + return sendData(message.toUtf8()); +} + +/*! + Installs a message \a filter on the connection. The \a filter must implement the IrcMessageFilter interface. + + A message filter receives all messages that are sent to the connection. The filter + receives messages via the \ref IrcMessageFilter::messageFilter() "messageFilter()" + function. The function must return \c true if the message should be filtered, + (i.e. stopped); otherwise it must return \c false. + + If multiple message filters are installed on the same connection, the filter + that was installed last is activated first. + + \sa removeMessageFilter() + */ +void IrcConnection::installMessageFilter(QObject* filter) +{ + Q_D(IrcConnection); + IrcMessageFilter* msgFilter = qobject_cast(filter); + if (msgFilter) { + d->messageFilters += filter; + connect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(_irc_filterDestroyed(QObject*)), Qt::UniqueConnection); + } +} + +/*! + Removes a message \a filter from the connection. + + The request is ignored if such message filter has not been installed. + All message filters for a connection are automatically removed + when the connection is destroyed. + + \sa installMessageFilter() + */ +void IrcConnection::removeMessageFilter(QObject* filter) +{ + Q_D(IrcConnection); + IrcMessageFilter* msgFilter = qobject_cast(filter); + if (msgFilter) { + d->messageFilters.removeAll(filter); + disconnect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(_irc_filterDestroyed(QObject*))); + } +} + +/*! + Installs a command \a filter on the connection. The \a filter must implement the IrcCommandFilter interface. + + A command filter receives all commands that are sent from the connection. The filter + receives commands via the \ref IrcCommandFilter::commandFilter() "commandFilter()" + function. The function must return \c true if the command should be filtered, + (i.e. stopped); otherwise it must return \c false. + + If multiple command filters are installed on the same connection, the filter + that was installed last is activated first. + + \sa removeCommandFilter() + */ +void IrcConnection::installCommandFilter(QObject* filter) +{ + Q_D(IrcConnection); + IrcCommandFilter* cmdFilter = qobject_cast(filter); + if (cmdFilter) { + d->commandFilters += filter; + connect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(_irc_filterDestroyed(QObject*)), Qt::UniqueConnection); + } +} + +/*! + Removes a command \a filter from the connection. + + The request is ignored if such command filter has not been installed. + All command filters for a connection are automatically removed when + the connection is destroyed. + + \sa installCommandFilter() + */ +void IrcConnection::removeCommandFilter(QObject* filter) +{ + Q_D(IrcConnection); + IrcCommandFilter* cmdFilter = qobject_cast(filter); + if (cmdFilter) { + d->commandFilters.removeAll(filter); + disconnect(filter, SIGNAL(destroyed(QObject*)), this, SLOT(_irc_filterDestroyed(QObject*))); + } +} + +/*! + \since 3.1 + + Saves the state of the connection. The \a version number is stored as part of the state data. + + To restore the saved state, pass the return value and \a version number to restoreState(). + */ +QByteArray IrcConnection::saveState(int version) const +{ + QVariantMap args; + args.insert("version", version); + args.insert("host", host()); + args.insert("port", port()); + args.insert("userName", userName()); + args.insert("nickName", nickName()); + args.insert("realName", realName()); + args.insert("password", password()); + args.insert("displayName", displayName()); + args.insert("userData", userData()); + args.insert("encoding", encoding()); + args.insert("enabled", isEnabled()); + args.insert("reconnectDelay", reconnectDelay()); + args.insert("secure", isSecure()); + args.insert("saslMechanism", saslMechanism()); + + QByteArray state; + QDataStream out(&state, QIODevice::WriteOnly); + out << args; + return state; +} + +/*! + \since 3.1 + + Restores the \a state of the connection. The \a version number is compared with that stored in \a state. + If they do not match, the connection state is left unchanged, and this function returns \c false; otherwise, + the state is restored, and \c true is returned. + + \sa saveState() + */ +bool IrcConnection::restoreState(const QByteArray& state, int version) +{ + if (isActive()) + return false; + + QVariantMap args; + QDataStream in(state); + in >> args; + if (in.status() != QDataStream::Ok || args.value("version", -1).toInt() != version) + return false; + + setHost(args.value("host", host()).toString()); + setPort(args.value("port", port()).toInt()); + setUserName(args.value("userName", userName()).toString()); + setNickName(args.value("nickName", nickName()).toString()); + setRealName(args.value("realName", realName()).toString()); + setPassword(args.value("password", password()).toString()); + setDisplayName(args.value("displayName").toString()); + setUserData(args.value("userData", userData()).toMap()); + setEncoding(args.value("encoding", encoding()).toByteArray()); + setEnabled(args.value("enabled", isEnabled()).toBool()); + setReconnectDelay(args.value("reconnectDelay", reconnectDelay()).toInt()); + setSecure(args.value("secure", isSecure()).toBool()); + setSaslMechanism(args.value("saslMechanism", saslMechanism()).toString()); + return true; +} + +/*! + Creates a reply command for the CTCP \a request. + + The default implementation handles the following CTCP requests: CLIENTINFO, PING, SOURCE, TIME and VERSION. + + Reimplement this function in order to alter or omit the default replies. + */ +IrcCommand* IrcConnection::createCtcpReply(IrcPrivateMessage* request) const +{ + QString reply; + QString type = request->content().split(" ", QString::SkipEmptyParts).value(0).toUpper(); + if (type == "PING") + reply = request->content(); + else if (type == "TIME") + reply = QLatin1String("TIME ") + QLocale().toString(QDateTime::currentDateTime(), QLocale::ShortFormat); + else if (type == "VERSION") + reply = QLatin1String("VERSION Using libcommuni ") + Irc::version() + QLatin1String(" - http://communi.github.com"); + else if (type == "SOURCE") + reply = QLatin1String("SOURCE http://communi.github.com"); + else if (type == "CLIENTINFO") + reply = QLatin1String("CLIENTINFO PING SOURCE TIME VERSION"); + if (!reply.isEmpty()) + return IrcCommand::createCtcpReply(request->nick(), reply); + return 0; +} + +/*! + \since 3.2 + + This property holds the protocol. + + The previously set protocol is deleted if its parent is \c this. + + \par Access functions: + \li \ref IrcProtocol* protocol() const + \li void setProtocol(\ref IrcProtocol* protocol) + */ +IrcProtocol* IrcConnection::protocol() const +{ + Q_D(const IrcConnection); + return d->protocol; +} + +void IrcConnection::setProtocol(IrcProtocol* proto) +{ + Q_D(IrcConnection); + if (d->protocol != proto) { + if (d->protocol && d->protocol->parent() == this) + delete d->protocol; + d->protocol = proto; + } +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, IrcConnection::Status status) +{ + const int index = IrcConnection::staticMetaObject.indexOfEnumerator("Status"); + QMetaEnum enumerator = IrcConnection::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(status); + debug << (key ? key : "Unknown"); + return debug; +} + +QDebug operator<<(QDebug debug, const IrcConnection* connection) +{ + if (!connection) + return debug << "IrcConnection(0x0) "; + debug.nospace() << connection->metaObject()->className() << '(' << (void*) connection; + if (!connection->displayName().isEmpty()) + debug.nospace() << ", " << qPrintable(connection->displayName()); + debug.nospace() << ')'; + return debug.space(); +} +#endif // QT_NO_DEBUG_STREAM + +#include "moc_ircconnection.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/irccore.cpp b/src/libcommuni/src/core/irccore.cpp new file mode 100644 index 0000000..f6453c8 --- /dev/null +++ b/src/libcommuni/src/core/irccore.cpp @@ -0,0 +1,90 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "irccore.h" + +IRC_BEGIN_NAMESPACE + +/*! + \file irccore.h + \brief \#include <IrcCore> + */ + +/*! + \namespace IrcCore + \ingroup core + \brief Module meta-type registration. + */ + +namespace IrcCore { + + /*! + Registers IrcCore types to the %Qt meta-system. + + \sa IrcModel::registerMetaTypes(), IrcUtil::registerMetaTypes(), qRegisterMetaType() + */ + void registerMetaTypes() + { + qRegisterMetaType("Irc::Color"); + qRegisterMetaType("Irc::DataRole"); + qRegisterMetaType("Irc::SortMethod"); + qRegisterMetaType("Irc::Code"); + + qRegisterMetaType("IrcConnection*"); + qRegisterMetaType("IrcConnection::Status"); + + qRegisterMetaType("IrcNetwork*"); + + qRegisterMetaType("IrcCommand*"); + qRegisterMetaType("IrcCommand::Type"); + + qRegisterMetaType("IrcMessage*"); + qRegisterMetaType("IrcMessage::Type"); + + qRegisterMetaType("IrcCapabilityMessage*"); + qRegisterMetaType("IrcErrorMessage*"); + qRegisterMetaType("IrcInviteMessage*"); + qRegisterMetaType("IrcJoinMessage*"); + qRegisterMetaType("IrcKickMessage*"); + qRegisterMetaType("IrcModeMessage*"); + qRegisterMetaType("IrcNamesMessage*"); + qRegisterMetaType("IrcNickMessage*"); + qRegisterMetaType("IrcNoticeMessage*"); + qRegisterMetaType("IrcNumericMessage*"); + qRegisterMetaType("IrcMotdMessage*"); + qRegisterMetaType("IrcPartMessage*"); + qRegisterMetaType("IrcPingMessage*"); + qRegisterMetaType("IrcPongMessage*"); + qRegisterMetaType("IrcPrivateMessage*"); + qRegisterMetaType("IrcQuitMessage*"); + qRegisterMetaType("IrcTopicMessage*"); + qRegisterMetaType("IrcWhoReplyMessage*"); + } +} + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircfilter.cpp b/src/libcommuni/src/core/ircfilter.cpp new file mode 100644 index 0000000..054badb --- /dev/null +++ b/src/libcommuni/src/core/ircfilter.cpp @@ -0,0 +1,248 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircfilter.h" + +IRC_BEGIN_NAMESPACE + +/*! + \file ircfilter.h + \brief \#include <\ref ircfilter.h "IrcFilter"> + */ + +/*! + \file ircmessagefilter.h + \brief \#include <IrcMessageFilter> + */ + +/*! + \file irccommandfilter.h + \brief \#include <IrcCommandFilter> + */ + +/*! + \class IrcMessageFilter ircfilter.h + \ingroup core + \brief Provides an interface for filtering messages + + IrcMessageFilter may be used to intercept messages before + IrcConnection::messageReceived() is emitted and the messages get delivered + further. In order to use IrcMessageFilter, it must be installed via + IrcConnection::installMessageFilter(). + + Message filtering is mostly useful for handling specific replies before + the rest of the application receives it. This way there is no need to + for example ignore and hide such replies later in the application code. + + The following example sends a PING command after each PRIVMSG command. + A consequent PONG reply from the server verifies that the PRIVMSG has + been also processed. + + \code + class CommandVerifier : public QObject, + public IrcCommandFilter, + public IrcMessageFilter + { + Q_OBJECT + Q_INTERFACES(IrcCommandFilter IrcMessageFilter) + + public: + CommandVerifier(IrcConnection* parent) : + QObject(parent), identifier(0), connection(parent) + { + connection->installMessageFilter(this); + connection->installCommandFilter(this); + } + + virtual bool commandFilter(IrcCommand* cmd) + { + if (cmd->type() == IrcCommand::Message) { + cmd->setParent(this); // take ownership + connection->sendCommand(cmd); + commands.insert(++identifier, cmd); + connection->sendData("PING communi/" + QByteArray::number(identifier)); + return true; + } + return false; + } + + virtual bool messageFilter(IrcMessage* msg) + { + if (msg->type() == IrcMessage::Pong) { + QString arg = static_cast(msg)->argument(); + if (arg.startsWith("communi/")) { + bool ok = false; + quint64 id = arg.mid(8).toULongLong(&ok); + if (ok) { + IrcCommand* command = commands.take(id); + if (command) { + emit verified(command); + command->deleteLater(); + return true; + } + } + } + } + return false; + } + + signals: + void verified(IrcCommand* cmd); + + private: + quint64 identifier; + IrcConnection* connection; + QMap commands; + }; + \endcode + + \sa IrcConnection::installMessageFilter(), IrcCommandFilter + */ + +/*! + \fn IrcMessageFilter::~IrcMessageFilter() + Destructs the message filter. + + The message filter is automatically removed from any connection(s) + it is installed on. + + \sa IrcConnection::removeMessageFilter() + */ + +/*! + \fn virtual bool IrcMessageFilter::messageFilter(IrcMessage* message) = 0 + + Reimplement this function to filter messages from installed connections. + + Return \c true to filter the message out, i.e. stop it being handled further; + otherwise return \c false. + + \sa IrcConnection::installMessageFilter() + */ + +/*! + \class IrcCommandFilter ircfilter.h + \ingroup core + \brief Provides an interface for filtering commands + + IrcCommandFilter may be used to intercept commands before they + get sent further. In order to use IrcCommandFilter, it must be + installed via IrcConnection::installCommandFilter(). + + Command filtering can be useful doing extra tasks for specific + type of commands. The following example sends a PING command + after each PRIVMSG command. A consequent PONG reply from the + server verifies that the PRIVMSG has been also processed. + + \code + class CommandVerifier : public QObject, + public IrcCommandFilter, + public IrcMessageFilter + { + Q_OBJECT + Q_INTERFACES(IrcCommandFilter IrcMessageFilter) + + public: + CommandVerifier(IrcConnection* parent) : + QObject(parent), identifier(0), connection(parent) + { + connection->installMessageFilter(this); + connection->installCommandFilter(this); + } + + virtual bool commandFilter(IrcCommand* cmd) + { + if (cmd->type() == IrcCommand::Message) { + cmd->setParent(this); // take ownership + connection->sendCommand(cmd); + commands.insert(++identifier, cmd); + connection->sendData("PING communi/" + QByteArray::number(identifier)); + return true; + } + return false; + } + + virtual bool messageFilter(IrcMessage* msg) + { + if (msg->type() == IrcMessage::Pong) { + QString arg = static_cast(msg)->argument(); + if (arg.startsWith("communi/")) { + bool ok = false; + quint64 id = arg.mid(8).toULongLong(&ok); + if (ok) { + IrcCommand* command = commands.take(id); + if (command) { + emit verified(command); + command->deleteLater(); + return true; + } + } + } + } + return false; + } + + signals: + void verified(IrcCommand* cmd); + + private: + quint64 identifier; + IrcConnection* connection; + QMap commands; + }; + \endcode + + \note Notice that it is safe to call IrcConnection::sendCommand() + from IrcCommandFilter::commandFilter(). Such commands won't get + delivered back to the \b same filter to avoid recursion. + + \sa IrcConnection::installCommandFilter(), IrcMessageFilter + */ + +/*! + \fn IrcCommandFilter::~IrcCommandFilter() + Destructs the command filter. + + The command filter is automatically removed from any connection(s) + it is installed on. + + \sa IrcConnection::removeCommandFilter() + */ + +/*! + \fn virtual bool IrcCommandFilter::commandFilter(IrcCommand* command) = 0 + + Reimplement this function to filter commands to installed connections. + + Return \c true to filter the command out, i.e. stop it being handled further; + otherwise return \c false. + + \sa IrcConnection::installCommandFilter() + */ + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircmessage.cpp b/src/libcommuni/src/core/ircmessage.cpp new file mode 100644 index 0000000..eaca6ab --- /dev/null +++ b/src/libcommuni/src/core/ircmessage.cpp @@ -0,0 +1,1604 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircmessage.h" +#include "ircmessage_p.h" +#include "ircconnection.h" +#include "ircconnection_p.h" +#include "ircnetwork.h" +#include "irccommand.h" +#include "irc.h" +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file ircmessage.h + \brief \#include <IrcMessage> + */ + +/*! + \class IrcMessage ircmessage.h + \ingroup core + \ingroup message + \brief The base class of all messages. + + IRC messages are received from an IRC server. IrcConnection translates received + messages into IrcMessage instances and emits the IrcConnection::messageReceived() + signal upon message received. + + Subclasses of IrcMessage contain specialized accessors for parameters that + are specific to the particular type of message. See IrcMessage::Type for + the list of supported message types. + + \sa IrcConnection::messageReceived(), IrcMessage::Type + */ + +/*! + \enum IrcMessage::Type + This enum describes the supported message types. + */ + +/*! + \var IrcMessage::Unknown + \brief An unknown message (IrcMessage). + */ + +/*! + \var IrcMessage::Capability + \brief A capability message (IrcCapabilityMessage). + */ + +/*! + \var IrcMessage::Error + \brief An error message (IrcErrorMessage). + */ + +/*! + \var IrcMessage::Invite + \brief An invite message (IrcInviteMessage). + */ + +/*! + \var IrcMessage::Join + \brief A join message (IrcJoinMessage). + */ + +/*! + \var IrcMessage::Kick + \brief A kick message (IrcKickMessage). + */ + +/*! + \var IrcMessage::Mode + \brief A mode message (IrcModeMessage). + */ + +/*! + \var IrcMessage::Motd + \brief A message of the day (IrcMotdMessage). + */ + +/*! + \var IrcMessage::Names + \brief A names message (IrcNamesMessage). + */ + +/*! + \var IrcMessage::Nick + \brief A nick message (IrcNickMessage). + */ + +/*! + \var IrcMessage::Notice + \brief A notice message (IrcNoticeMessage). + */ + +/*! + \var IrcMessage::Numeric + \brief A numeric message (IrcNumericMessage). + */ + +/*! + \var IrcMessage::Part + \brief A part message (IrcPartMessage). + */ + +/*! + \var IrcMessage::Ping + \brief A ping message (IrcPingMessage). + */ + +/*! + \var IrcMessage::Pong + \brief A pong message (IrcPongMessage). + */ + +/*! + \var IrcMessage::Private + \brief A private message (IrcPrivateMessage). + */ + +/*! + \var IrcMessage::Quit + \brief A quit message (IrcQuitMessage). + */ + +/*! + \var IrcMessage::Topic + \brief A topic message (IrcTopicMessage). + */ + +/*! + \enum IrcMessage::Flag + This enum describes the supported message flags. + */ + +/*! + \var IrcMessage::None + \brief The message has no flags. + */ + +/*! + \var IrcMessage::Own + \brief The message is user's own message. + */ + +/*! + \var IrcMessage::Identified + \brief The message is identified. + */ + +/*! + \var IrcMessage::Unidentified + \brief The message is unidentified. + */ + +/*! + \since 3.2 + \var IrcMessage::Playback + \brief The message is playback. + */ + +static const QMetaObject* irc_command_meta_object(const QString& command) +{ + static QHash metaObjects; + if (metaObjects.isEmpty()) { + metaObjects.insert("CAP", &IrcCapabilityMessage::staticMetaObject); + metaObjects.insert("ERROR", &IrcErrorMessage::staticMetaObject); + metaObjects.insert("INVITE", &IrcInviteMessage::staticMetaObject); + metaObjects.insert("JOIN", &IrcJoinMessage::staticMetaObject); + metaObjects.insert("KICK", &IrcKickMessage::staticMetaObject); + metaObjects.insert("MODE", &IrcModeMessage::staticMetaObject); + metaObjects.insert("NICK", &IrcNickMessage::staticMetaObject); + metaObjects.insert("NOTICE", &IrcNoticeMessage::staticMetaObject); + metaObjects.insert("PART", &IrcPartMessage::staticMetaObject); + metaObjects.insert("PING", &IrcPingMessage::staticMetaObject); + metaObjects.insert("PONG", &IrcPongMessage::staticMetaObject); + metaObjects.insert("PRIVMSG", &IrcPrivateMessage::staticMetaObject); + metaObjects.insert("QUIT", &IrcQuitMessage::staticMetaObject); + metaObjects.insert("TOPIC", &IrcTopicMessage::staticMetaObject); + } + + const QMetaObject* metaObject = metaObjects.value(command.toUpper()); + if (!metaObject) { + bool ok = false; + command.toInt(&ok); + if (ok) + metaObject = &IrcNumericMessage::staticMetaObject; + } + if (!metaObject) + metaObject = &IrcMessage::staticMetaObject; + return metaObject; +} + +/*! + Constructs a new IrcMessage with \a connection. + */ +IrcMessage::IrcMessage(IrcConnection* connection) : QObject(connection), d_ptr(new IrcMessagePrivate) +{ + Q_D(IrcMessage); + d->connection = connection; +} + +/*! + Destructs the message. + */ +IrcMessage::~IrcMessage() +{ +} + +/*! + This property holds the message connection. + + \par Access function: + \li \ref IrcConnection* connection() const + */ +IrcConnection* IrcMessage::connection() const +{ + Q_D(const IrcMessage); + return d->connection; +} + +/*! + This property holds the message network. + + \par Access function: + \li \ref IrcNetwork* network() const + */ +IrcNetwork* IrcMessage::network() const +{ + Q_D(const IrcMessage); + return d->connection ? d->connection->network() : 0; +} + +/*! + This property holds the message type. + + \par Access function: + \li \ref IrcMessage::Type type() const + */ +IrcMessage::Type IrcMessage::type() const +{ + Q_D(const IrcMessage); + return d->type; +} + +/*! + \since 3.2 + \property bool IrcMessage::own + + This property holds whether the message is user's own. + + This property is provided for convenience. It is equivalent + of testing for the IrcMessage::Own flag. + + \par Access function: + \li bool isOwn() const + */ +bool IrcMessage::isOwn() const +{ + return flags() & Own; +} + +/*! + This property holds the message flags. + + \par Access function: + \li \ref IrcMessage::Flag "IrcMessage::Flags" flags() const + \li void setFlags(\ref IrcMessage::Flag "IrcMessage::Flags" flags) (\b Since 3.2) + */ +IrcMessage::Flags IrcMessage::flags() const +{ + Q_D(const IrcMessage); + if (d->flags == -1) { + d->flags = IrcMessage::None; + if (d->connection) { + if (!d->prefix().isEmpty() && d->nick() == d->connection->nickName()) + d->flags |= IrcMessage::Own; + + if ((d->type == IrcMessage::Private || d->type == IrcMessage::Notice) && + network()->activeCapabilities().contains("identify-msg")) { + QString msg = property("content").toString(); + if (msg.startsWith("+")) + d->flags |= IrcMessage::Identified; + else if (msg.startsWith("-")) + d->flags |= IrcMessage::Unidentified; + } + } + } + return IrcMessage::Flags(d->flags); +} + +void IrcMessage::setFlags(IrcMessage::Flags flags) +{ + Q_D(IrcMessage); + d->flags = flags; +} + +/*! + This property holds the message command. + + \par Access functions: + \li QString command() const + \li void setCommand(const QString& command) + */ +QString IrcMessage::command() const +{ + Q_D(const IrcMessage); + return d->command(); +} + +void IrcMessage::setCommand(const QString& command) +{ + Q_D(IrcMessage); + d->setCommand(command); +} + +/*! + This property holds the message sender prefix. + + The prefix consists of \ref nick, \ref ident and \ref host as specified in RFC 1459: +
+    <prefix> ::= <\ref nick> [ '!' <\ref ident> ] [ '@' <\ref host> ]
+    
+ + \par Access functions: + \li QString prefix() const + \li void setPrefix(const QString& prefix) + */ +QString IrcMessage::prefix() const +{ + Q_D(const IrcMessage); + return d->prefix(); +} + +void IrcMessage::setPrefix(const QString& prefix) +{ + Q_D(IrcMessage); + d->setPrefix(prefix); +} + +/*! + This property holds the message sender nick. + + Nick is part of the sender \ref prefix as specified in RFC 1459: +
+    <nick> [ '!' <\ref ident> ] [ '@' <\ref host> ]
+    
+ + \par Access function: + \li QString nick() const + */ +QString IrcMessage::nick() const +{ + Q_D(const IrcMessage); + return d->nick(); +} + +/*! + This property holds the message sender ident. + + Ident is part of the sender \ref prefix as specified in RFC 1459: +
+    <\ref nick> [ '!' <ident> ] [ '@' <\ref host> ]
+    
+ + \par Access function: + \li QString ident() const + */ +QString IrcMessage::ident() const +{ + Q_D(const IrcMessage); + return d->ident(); +} + +/*! + This property holds the message sender host. + + Host is part of the sender \ref prefix as specified in RFC 1459: +
+    <\ref nick> [ '!' <\ref ident> ] [ '@' <host> ]
+    
+ + \par Access function: + \li QString host() const + */ +QString IrcMessage::host() const +{ + Q_D(const IrcMessage); + return d->host(); +} + +/*! + This property holds the message parameters. + + \par Access functions: + \li QStringList parameters() const + \li void setParameters(const QStringList& parameters) + */ +QStringList IrcMessage::parameters() const +{ + Q_D(const IrcMessage); + return d->params(); +} + +void IrcMessage::setParameters(const QStringList& parameters) +{ + Q_D(IrcMessage); + d->setParams(parameters); +} + +/*! + This property holds the message time stamp. + + \par Access functions: + \li QDateTime timeStamp() const + \li void setTimeStamp(const QDateTime& timeStamp) + */ +QDateTime IrcMessage::timeStamp() const +{ + Q_D(const IrcMessage); + return d->timeStamp; +} + +void IrcMessage::setTimeStamp(const QDateTime& timeStamp) +{ + Q_D(IrcMessage); + d->timeStamp = timeStamp; +} + +/*! + This property holds the FALLBACK encoding for the message. + + The fallback encoding is used when the message is detected not + to be valid UTF-8 and the consequent auto-detection of message + encoding fails. See QTextCodec::availableCodes() for the list of + supported encodings. + + The default value is ISO-8859-15. + + \par Access functions: + \li QByteArray encoding() const + \li void setEncoding(const QByteArray& encoding) + + \sa QTextCodec::availableCodecs(), QTextCodec::codecForLocale() + */ +QByteArray IrcMessage::encoding() const +{ + Q_D(const IrcMessage); + return d->encoding; +} + +void IrcMessage::setEncoding(const QByteArray& encoding) +{ + Q_D(IrcMessage); + extern bool irc_is_supported_encoding(const QByteArray& encoding); // ircmessagedecoder.cpp + if (!irc_is_supported_encoding(encoding)) { + qWarning() << "IrcMessage::setEncoding(): unsupported encoding" << encoding; + return; + } + d->encoding = encoding; + d->invalidate(); +} + +/*! + \since 3.1 + + This property holds the message tags. + + \par Access functions: + \li QVariantMap tags() const + \li void setTags(const QVariantMap& tags) + + \sa IRCv3.2 Message Tags + */ +QVariantMap IrcMessage::tags() const +{ + Q_D(const IrcMessage); + return d->tags(); +} + +void IrcMessage::setTags(const QVariantMap& tags) +{ + Q_D(IrcMessage); + d->setTags(tags); +} + +/*! + Creates a new message from \a data and \a connection. + */ +IrcMessage* IrcMessage::fromData(const QByteArray& data, IrcConnection* connection) +{ + IrcMessage* message = 0; + IrcMessageData md = IrcMessageData::fromData(data); + const QMetaObject* metaObject = irc_command_meta_object(md.command); + if (metaObject) { + message = qobject_cast(metaObject->newInstance(Q_ARG(IrcConnection*, connection))); + Q_ASSERT(message); + message->d_ptr->data = md; + } + return message; +} + +/*! + Creates a new message from \a prefix, \a command and \a parameters with \a connection. + */ +IrcMessage* IrcMessage::fromParameters(const QString& prefix, const QString& command, const QStringList& parameters, IrcConnection* connection) +{ + IrcMessage* message = 0; + const QMetaObject* metaObject = irc_command_meta_object(command); + if (metaObject) { + message = qobject_cast(metaObject->newInstance(Q_ARG(IrcConnection*, connection))); + Q_ASSERT(message); + message->setPrefix(prefix); + message->setCommand(command); + message->setParameters(parameters); + } + return message; +} + +/*! + \property bool IrcMessage::valid + This property is \c true if the message is valid; otherwise \c false. + + A message is considered valid if the prefix is not empty + and the parameters match the message. + + \par Access function: + \li bool isValid() const + */ +bool IrcMessage::isValid() const +{ + Q_D(const IrcMessage); + return d->connection && !prefix().isNull(); +} + +/*! + Returns the message as received from an IRC server. + */ +QByteArray IrcMessage::toData() const +{ + Q_D(const IrcMessage); + return d->content(); +} + +/*! + \class IrcCapabilityMessage ircmessage.h + \ingroup message + \brief Represents a capability message. + */ + +/*! + Constructs a new IrcCapabilityMessage with \a connection. + */ +IrcCapabilityMessage::IrcCapabilityMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Capability; +} + +/*! + This property holds the subcommand. + + The following capability subcommands are defined: + LS, LIST, REQ, ACK, NAK, CLEAR, END + + \par Access function: + \li QString subCommand() const + */ +QString IrcCapabilityMessage::subCommand() const +{ + Q_D(const IrcMessage); + return d->param(1); +} + +/*! + This property holds the capabilities. + + A list of capabilities may exist for the following + subcommands: LS, LIST, REQ, ACK and NAK. + + \par Access function: + \li QStringList capabilities() const + */ +QStringList IrcCapabilityMessage::capabilities() const +{ + Q_D(const IrcMessage); + QStringList caps; + QStringList params = d->params(); + if (params.count() > 2) + caps = params.last().split(QLatin1Char(' '), QString::SkipEmptyParts); + return caps; +} + +bool IrcCapabilityMessage::isValid() const +{ + return IrcMessage::isValid(); +} + +/*! + \class IrcErrorMessage ircmessage.h + \ingroup message + \brief Represents an error message. + */ + +/*! + Constructs a new IrcErrorMessage with \a connection. + */ +IrcErrorMessage::IrcErrorMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Error; +} + +/*! + This property holds the error. + + \par Access function: + \li QString error() const + */ +QString IrcErrorMessage::error() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +bool IrcErrorMessage::isValid() const +{ + return IrcMessage::isValid() && !error().isEmpty(); +} + +/*! + \class IrcInviteMessage ircmessage.h + \ingroup message + \brief Represents an invite message. + */ + +/*! + Constructs a new IrcInviteMessage with \a connection. + */ +IrcInviteMessage::IrcInviteMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Invite; +} + +/*! + This property holds the user in question. + + \par Access function: + \li QString user() const + */ +QString IrcInviteMessage::user() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +/*! + This property holds the channel in question. + + \par Access function: + \li QString channel() const + */ +QString IrcInviteMessage::channel() const +{ + Q_D(const IrcMessage); + return d->param(1); +} + +bool IrcInviteMessage::isValid() const +{ + return IrcMessage::isValid() && !user().isEmpty() && !channel().isEmpty(); +} + +/*! + \class IrcJoinMessage ircmessage.h + \ingroup message + \brief Represents a join message. + */ + +/*! + Constructs a new IrcJoinMessage with \a connection. + */ +IrcJoinMessage::IrcJoinMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Join; +} + +/*! + This property holds the channel in question. + + \par Access function: + \li QString channel() const + */ +QString IrcJoinMessage::channel() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +bool IrcJoinMessage::isValid() const +{ + return IrcMessage::isValid() && !channel().isEmpty(); +} + +/*! + \class IrcKickMessage ircmessage.h + \ingroup message + \brief Represents a kick message. + */ + +/*! + Constructs a new IrcKickMessage with \a connection. + */ +IrcKickMessage::IrcKickMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Kick; +} + +/*! + This property holds the channel in question. + + \par Access function: + \li QString channel() const + */ +QString IrcKickMessage::channel() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +/*! + This property holds the user in question. + + \par Access function: + \li QString user() const + */ +QString IrcKickMessage::user() const +{ + Q_D(const IrcMessage); + return d->param(1); +} + +/*! + This property holds the optional kick reason. + + \par Access function: + \li QString reason() const + */ +QString IrcKickMessage::reason() const +{ + Q_D(const IrcMessage); + return d->param(2); +} + +bool IrcKickMessage::isValid() const +{ + return IrcMessage::isValid() && !channel().isEmpty() && !user().isEmpty(); +} + +/*! + \class IrcModeMessage ircmessage.h + \ingroup message + \brief Represents a mode message. + */ + +/*! + \enum IrcModeMessage::Kind + This enum describes the kind of modes. + */ + +/*! + \var IrcModeMessage::Channel + \brief Channel mode + */ + +/*! + \var IrcModeMessage::User + \brief User mode + */ + +/*! + Constructs a new IrcModeMessage with \a connection. + */ +IrcModeMessage::IrcModeMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Mode; +} + +/*! + This property holds the target channel or user in question. + + \par Access function: + \li QString target() const + */ +QString IrcModeMessage::target() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +/*! + This property holds the channel or user mode. + + \par Access function: + \li QString mode() const + */ +QString IrcModeMessage::mode() const +{ + Q_D(const IrcMessage); + return d->param(1); +} + +/*! + This property holds the first mode argument. + + \par Access function: + \li QString argument() const + */ +QString IrcModeMessage::argument() const +{ + Q_D(const IrcMessage); + return d->param(2); +} + +/*! + \since 3.1 + + This property holds the all mode arguments. + + \par Access function: + \li QStringList arguments() const + */ +QStringList IrcModeMessage::arguments() const +{ + Q_D(const IrcMessage); + return d->params().mid(2); +} + +/*! + This property holds whether the message is a reply. + + Mode messages are sent when a mode changes (\c false) + and when joining a channel (\c true). + + \par Access function: + \li bool isReply() const + + \sa Irc::RPL_CHANNELMODEIS + */ +bool IrcModeMessage::isReply() const +{ + Q_D(const IrcMessage); + int rpl = d->command().toInt(); + return rpl == Irc::RPL_CHANNELMODEIS; +} + +/*! + This property holds the kind of the mode. + + \par Access function: + \li Kind kind() const + */ +IrcModeMessage::Kind IrcModeMessage::kind() const +{ + Q_D(const IrcMessage); + const IrcNetwork* network = d->connection->network(); + const QStringList channelModes = network->channelModes(IrcNetwork::AllTypes); + const QString m = mode().remove(QLatin1Char('+')).remove(QLatin1Char('-')); + for (int i = 0; i < m.length(); ++i) { + if (!channelModes.contains(m.at(i))) + return User; + } + return Channel; +} + +bool IrcModeMessage::isValid() const +{ + return IrcMessage::isValid() && !target().isEmpty() && !mode().isEmpty(); +} + +/*! + \class IrcMotdMessage ircmessage.h + \ingroup message + \brief Represents a message of the day. + */ + +/*! + Constructs a new IrcMotdMessage with \a connection. + */ +IrcMotdMessage::IrcMotdMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Motd; + setCommand(QLatin1String("MOTD")); +} + +/*! + This property holds the message of the day lines. + + \par Access function: + \li QStringList lines() const + */ +QStringList IrcMotdMessage::lines() const +{ + Q_D(const IrcMessage); + return d->params().mid(1); +} + +bool IrcMotdMessage::isValid() const +{ + Q_D(const IrcMessage); + return IrcMessage::isValid() && !d->params().isEmpty(); +} + +/*! + \class IrcNamesMessage ircmessage.h + \ingroup message + \brief Represents a names list message. + */ + +/*! + Constructs a new IrcNamesMessage with \a connection. + */ +IrcNamesMessage::IrcNamesMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Names; + setCommand(QLatin1String("NAMES")); +} + +/*! + This property holds the channel. + + \par Access function: + \li QString channel() const + */ +QString IrcNamesMessage::channel() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +/*! + This property holds the list of names. + + \par Access function: + \li QStringList names() const + */ +QStringList IrcNamesMessage::names() const +{ + Q_D(const IrcMessage); + return d->params().mid(1); +} + +bool IrcNamesMessage::isValid() const +{ + Q_D(const IrcMessage); + return IrcMessage::isValid() && !d->params().isEmpty(); +} + +/*! + \class IrcNickMessage ircmessage.h + \ingroup message + \brief Represents a nick message. + */ + +/*! + Constructs a new IrcNickMessage with \a connection. + */ +IrcNickMessage::IrcNickMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Nick; +} + +/*! + This property holds the old nick. + + This property is provided for symmetry with \ref newNick + and is equal to \ref nick. + + \par Access function: + \li QString oldNick() const + */ +QString IrcNickMessage::oldNick() const +{ + Q_D(const IrcMessage); + return d->nick(); +} + +/*! + This property holds the new nick. + + \par Access function: + \li QString newNick() const + */ +QString IrcNickMessage::newNick() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +bool IrcNickMessage::isValid() const +{ + return IrcMessage::isValid() && !newNick().isEmpty(); +} + +/*! + \class IrcNoticeMessage ircmessage.h + \ingroup message + \brief Represents a notice message. + */ + +/*! + Constructs a new IrcNoticeMessage with \a connection. + */ +IrcNoticeMessage::IrcNoticeMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Notice; +} + +/*! + This property holds the target channel or user in question. + + \par Access function: + \li QString target() const + */ +QString IrcNoticeMessage::target() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +/*! + This property holds the message content. + + \par Access function: + \li QString content() const + */ +QString IrcNoticeMessage::content() const +{ + Q_D(const IrcMessage); + QString msg = d->param(1); + if (flags() & (Identified | Unidentified)) + msg.remove(0, 1); + if (isReply()) { + msg.remove(0, 1); + msg.chop(1); + } + return msg; +} + +/*! + \property bool IrcNoticeMessage::private + This property is \c true if the notice is private, + or \c false if it is a channel notice. + + \par Access function: + \li bool isPrivate() const + */ +bool IrcNoticeMessage::isPrivate() const +{ + Q_D(const IrcMessage); + if (d->connection) + return !target().compare(d->connection->nickName(), Qt::CaseInsensitive); + return false; +} + +/*! + \property bool IrcNoticeMessage::reply + This property is \c true if the message is a reply; otherwise \c false. + + \par Access function: + \li bool isReply() const + */ +bool IrcNoticeMessage::isReply() const +{ + Q_D(const IrcMessage); + QString msg = d->param(1); + return msg.startsWith('\1') && msg.endsWith('\1'); +} + +bool IrcNoticeMessage::isValid() const +{ + return IrcMessage::isValid() && !target().isEmpty() && !content().isEmpty(); +} + +/*! + \class IrcNumericMessage ircmessage.h + \ingroup message + \brief Represents a numeric message. + */ + +/*! + Constructs a new IrcNumericMessage with \a connection. + */ +IrcNumericMessage::IrcNumericMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Numeric; +} + +/*! + This property holds the numeric code. + + \par Access function: + \li int code() const + */ +int IrcNumericMessage::code() const +{ + Q_D(const IrcMessage); + bool ok = false; + int number = d->command().toInt(&ok); + return ok ? number : -1; +} + +bool IrcNumericMessage::isValid() const +{ + return IrcMessage::isValid() && code() != -1; +} + +/*! + \class IrcPartMessage ircmessage.h + \ingroup message + \brief Represents a part message. + */ + +/*! + Constructs a new IrcPartMessage with \a connection. + */ +IrcPartMessage::IrcPartMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Part; +} + +/*! + This property holds the channel in question. + + \par Access function: + \li QString channel() const + */ +QString IrcPartMessage::channel() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +/*! + This property holds the optional part reason. + + \par Access function: + \li QString reason() const + */ +QString IrcPartMessage::reason() const +{ + Q_D(const IrcMessage); + return d->param(1); +} + +bool IrcPartMessage::isValid() const +{ + return IrcMessage::isValid() && !channel().isEmpty(); +} + +/*! + \class IrcPingMessage ircmessage.h + \ingroup message + \brief Represents a ping message. + */ + +/*! + Constructs a new IrcPingMessage with \a connection. + */ +IrcPingMessage::IrcPingMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Ping; +} + +/*! + This property holds the optional message argument. + + \par Access function: + \li QString argument() const + */ +QString IrcPingMessage::argument() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +bool IrcPingMessage::isValid() const +{ + return IrcMessage::isValid(); +} + +/*! + \class IrcPongMessage ircmessage.h + \ingroup message + \brief Represents a pong message. + */ + +/*! + Constructs a new IrcPongMessage with \a connection. + */ +IrcPongMessage::IrcPongMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Pong; +} + +/*! + This property holds the optional message argument. + + \par Access function: + \li QString argument() const + */ +QString IrcPongMessage::argument() const +{ + Q_D(const IrcMessage); + return d->param(1); +} + +bool IrcPongMessage::isValid() const +{ + return IrcMessage::isValid(); +} + +/*! + \class IrcPrivateMessage ircmessage.h + \ingroup message + \brief Represents a private message. + */ + +/*! + Constructs a new IrcPrivateMessage with \a connection. + */ +IrcPrivateMessage::IrcPrivateMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Private; +} + +/*! + This property holds the target channel or user in question. + + \par Access function: + \li QString target() const + */ +QString IrcPrivateMessage::target() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +/*! + This property holds the message content. + + \par Access function: + \li QString content() const + */ +QString IrcPrivateMessage::content() const +{ + Q_D(const IrcMessage); + QString msg = d->param(1); + if (flags() & (Identified | Unidentified)) + msg.remove(0, 1); + const bool act = isAction(); + const bool req = isRequest(); + if (act) msg.remove(0, 8); + if (req) msg.remove(0, 1); + if (act || req) msg.chop(1); + return msg; +} + +/*! + \property bool IrcPrivateMessage::private + This property is \c true if the message is private, + or \c false if it is a channel message. + + \par Access function: + \li bool isPrivate() const + */ +bool IrcPrivateMessage::isPrivate() const +{ + Q_D(const IrcMessage); + if (d->connection) + return !target().compare(d->connection->nickName(), Qt::CaseInsensitive); + return false; +} + +/*! + \property bool IrcPrivateMessage::action + This property is \c true if the message is an action; otherwise \c false. + + \par Access function: + \li bool isAction() const + */ +bool IrcPrivateMessage::isAction() const +{ + Q_D(const IrcMessage); + QString msg = d->param(1); + if (flags() & (Identified | Unidentified)) + msg.remove(0, 1); + return msg.startsWith("\1ACTION ") && msg.endsWith('\1'); +} + +/*! + \property bool IrcPrivateMessage::request + This property is \c true if the message is a request; otherwise \c false. + + \par Access function: + \li bool isRequest() const + */ +bool IrcPrivateMessage::isRequest() const +{ + Q_D(const IrcMessage); + QString msg = d->param(1); + if (flags() & (Identified | Unidentified)) + msg.remove(0, 1); + return msg.startsWith('\1') && msg.endsWith('\1') && !isAction(); +} + +bool IrcPrivateMessage::isValid() const +{ + return IrcMessage::isValid() && !target().isEmpty() && !content().isEmpty(); +} + +/*! + \class IrcQuitMessage ircmessage.h + \ingroup message + \brief Represents a quit message. + */ + +/*! + Constructs a new IrcQuitMessage with \a connection. + */ +IrcQuitMessage::IrcQuitMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Quit; +} + +/*! + This property holds the optional quit reason. + + \par Access function: + \li QString reason() const + */ +QString IrcQuitMessage::reason() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +bool IrcQuitMessage::isValid() const +{ + return IrcMessage::isValid(); +} + +/*! + \class IrcTopicMessage ircmessage.h + \ingroup message + \brief Represents a topic message. + */ + +/*! + Constructs a new IrcTopicMessage with \a connection. + */ +IrcTopicMessage::IrcTopicMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = Topic; +} + +/*! + This property holds the channel in question. + + \par Access function: + \li QString channel() const + */ +QString IrcTopicMessage::channel() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +/*! + This property holds the new channel topic. + + \par Access function: + \li QString topic() const + */ +QString IrcTopicMessage::topic() const +{ + Q_D(const IrcMessage); + return d->param(1); +} + +/*! + This property holds whether the message is a reply. + + Topic messages are sent in three situations: + \li as a notification of a topic change (\c false), + \li as a reply when joining a channel (\c true), or + \li as a reply when explicitly querying the channel topic (\c true). + + \par Access function: + \li bool isReply() const + + \sa Irc::RPL_TOPIC, Irc::RPL_NOTOPIC, IrcTopicCommand + */ +bool IrcTopicMessage::isReply() const +{ + Q_D(const IrcMessage); + int rpl = d->command().toInt(); + return rpl == Irc::RPL_TOPIC || rpl == Irc::RPL_NOTOPIC; +} + +bool IrcTopicMessage::isValid() const +{ + return IrcMessage::isValid() && !channel().isEmpty(); +} + +/*! + \since 3.1 + \class IrcWhoReplyMessage ircmessage.h + \ingroup message + \brief Represents a reply message to a WHO command. + */ + +/*! + Constructs a new IrcWhoReplyMessage with \a connection. + */ +IrcWhoReplyMessage::IrcWhoReplyMessage(IrcConnection* connection) : IrcMessage(connection) +{ + Q_D(IrcMessage); + d->type = WhoReply; +} + +/*! + This property holds the mask. + + \par Access function: + \li QString mask() const + */ +QString IrcWhoReplyMessage::mask() const +{ + Q_D(const IrcMessage); + return d->param(0); +} + +/*! + This property holds the server of the user. + + \par Access function: + \li QString server() const + */ +QString IrcWhoReplyMessage::server() const +{ + Q_D(const IrcMessage); + return d->param(1); +} + +/*! + \property bool IrcWhoReplyMessage::away + This property holds whether the user is away. + + \par Access function: + \li QString isAway() const + */ +bool IrcWhoReplyMessage::isAway() const +{ + Q_D(const IrcMessage); + return d->param(2).contains("G"); +} + +/*! + \property bool IrcWhoReplyMessage::servOp + This property holds whether the user is a server operator. + + \par Access function: + \li QString isServOp() const + */ +bool IrcWhoReplyMessage::isServOp() const +{ + Q_D(const IrcMessage); + return d->param(2).contains("*"); +} + +/*! + This property holds the real name of the user. + + \par Access function: + \li QString realName() const + */ +QString IrcWhoReplyMessage::realName() const +{ + Q_D(const IrcMessage); + return d->param(3); +} + +bool IrcWhoReplyMessage::isValid() const +{ + return IrcMessage::isValid() && !mask().isEmpty() && !nick().isEmpty(); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, IrcMessage::Type type) +{ + const int index = IrcMessage::staticMetaObject.indexOfEnumerator("Type"); + QMetaEnum enumerator = IrcMessage::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(type); + debug << (key ? key : "Unknown"); + return debug; +} + +QDebug operator<<(QDebug debug, IrcMessage::Flag flag) +{ + const int index = IrcMessage::staticMetaObject.indexOfEnumerator("Flag"); + QMetaEnum enumerator = IrcMessage::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(flag); + debug << (key ? key : "None"); + return debug; +} + +QDebug operator<<(QDebug debug, IrcMessage::Flags flags) +{ + QStringList lst; + if (flags == IrcMessage::None) + lst << "None"; + if (flags & IrcMessage::Own) + lst << "Own"; + if (flags & IrcMessage::Identified) + lst << "Identified"; + if (flags & IrcMessage::Unidentified) + lst << "Unidentified"; + debug.nospace() << '(' << qPrintable(lst.join("|")) << ')'; + return debug; +} + +QDebug operator<<(QDebug debug, IrcModeMessage::Kind kind) +{ + const int index = IrcModeMessage::staticMetaObject.indexOfEnumerator("Kind"); + QMetaEnum enumerator = IrcModeMessage::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(kind); + debug << (key ? key : "Unknown"); + return debug; +} + +QDebug operator<<(QDebug debug, const IrcMessage* message) +{ + if (!message) + return debug << "IrcMessage(0x0) "; + debug.nospace() << message->metaObject()->className() << '(' << (void*) message; + if (!message->objectName().isEmpty()) + debug.nospace() << ", name=" << qPrintable(message->objectName()); + debug.nospace() << ", flags=" << message->flags(); + if (!message->prefix().isEmpty()) + debug.nospace() << ", prefix=" << qPrintable(message->prefix()); + if (!message->command().isEmpty()) + debug.nospace() << ", command=" << qPrintable(message->command()); + debug.nospace() << ')'; + return debug.space(); +} +#endif // QT_NO_DEBUG_STREAM + +#include "moc_ircmessage.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircmessage_p.cpp b/src/libcommuni/src/core/ircmessage_p.cpp new file mode 100644 index 0000000..e5fdd24 --- /dev/null +++ b/src/libcommuni/src/core/ircmessage_p.cpp @@ -0,0 +1,284 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircmessage_p.h" +#include "ircmessagedecoder_p.h" + +IRC_BEGIN_NAMESPACE + +#ifndef IRC_DOXYGEN +IrcMessagePrivate::IrcMessagePrivate() : + connection(0), type(IrcMessage::Unknown), timeStamp(QDateTime::currentDateTime()), encoding("ISO-8859-15"), flags(-1) +{ +} + +QString IrcMessagePrivate::prefix() const +{ + if (!m_prefix.isExplicit() && m_prefix.isNull() && !data.prefix.isNull()) { + if (data.prefix.startsWith(':')) { + if (data.prefix.length() > 1) + m_prefix = decode(data.prefix.mid(1), encoding); + } else { + // empty (not null) + m_prefix = QString(""); + } + } + return m_prefix.value(); +} + +void IrcMessagePrivate::setPrefix(const QString& prefix) +{ + m_prefix.setValue(prefix); + m_nick.clear(); + m_ident.clear(); + m_host.clear(); +} + +QString IrcMessagePrivate::nick() const +{ + if (m_nick.isNull()) + parsePrefix(prefix(), &m_nick, &m_ident, &m_host); + return m_nick; +} + +QString IrcMessagePrivate::ident() const +{ + if (m_ident.isNull()) + parsePrefix(prefix(), &m_nick, &m_ident, &m_host); + return m_ident; +} + +QString IrcMessagePrivate::host() const +{ + if (m_host.isNull()) + parsePrefix(prefix(), &m_nick, &m_ident, &m_host); + return m_host; +} + +QString IrcMessagePrivate::command() const +{ + if (!m_command.isExplicit() && m_command.isNull() && !data.command.isNull()) + m_command = decode(data.command, encoding); + return m_command.value(); +} + +void IrcMessagePrivate::setCommand(const QString& command) +{ + m_command.setValue(command); +} + +QStringList IrcMessagePrivate::params() const +{ + if (!m_params.isExplicit() && m_params.isNull() && !data.params.isEmpty()) { + QStringList params; + foreach (const QByteArray& param, data.params) + params += decode(param, encoding); + m_params = params; + } + return m_params.value(); +} + +QString IrcMessagePrivate::param(int index) const +{ + return params().value(index); +} + +void IrcMessagePrivate::setParams(const QStringList& params) +{ + m_params.setValue(params); +} + +QVariantMap IrcMessagePrivate::tags() const +{ + if (!m_tags.isExplicit() && m_tags.isNull() && !data.tags.isEmpty()) { + QVariantMap tags; + QMap::const_iterator it; + for (it = data.tags.constBegin(); it != data.tags.constEnd(); ++it) + tags.insert(decode(it.key(), encoding), decode(it.value(), encoding)); + m_tags = tags; + } + return m_tags.value(); +} + +void IrcMessagePrivate::setTags(const QVariantMap& tags) +{ + m_tags.setValue(tags); +} + +QByteArray IrcMessagePrivate::content() const +{ + if (m_prefix.isExplicit() || m_command.isExplicit() || m_params.isExplicit() || m_tags.isExplicit()) { + QByteArray data; + + // format + QStringList tt; + const QVariantMap t = tags(); + for (QVariantMap::const_iterator it = t.begin(); it != t.end(); ++it) + tt += it.key() + QLatin1Char('=') + it.value().toString(); + if (!tt.isEmpty()) + data += '@' + tt.join(QLatin1String(";")).toUtf8() + ' '; + + // format + const QString p = prefix(); + if (!p.isEmpty()) + data += ':' + p.toUtf8() + ' '; + + // format + data += command().toUtf8(); + + // format + foreach (const QString& param, params()) { + data += ' '; + if (param.contains(QLatin1Char(' '))) + data += ':'; + data += param.toUtf8(); + } + return data; + } + + return data.content; +} + +void IrcMessagePrivate::invalidate() +{ + m_nick.clear(); + m_ident.clear(); + m_host.clear(); + + m_prefix.clear(); + m_command.clear(); + m_params.clear(); + m_tags.clear(); +} + +IrcMessageData IrcMessageData::fromData(const QByteArray& data) +{ + IrcMessageData message; + message.content = data; + + // From RFC 1459: + // ::= [':' ] + // ::= | [ '!' ] [ '@' ] + // ::= { } | + // ::= ' ' { ' ' } + // ::= [ ':' | ] + // ::= + // ::= + + // IRCv3.2 Message Tags + // ::= ['@' ] [':' ] + // ::= [';' ]* + // ::= ['=' ] + // ::= [ '/' ] + // ::= + // ::= + + QByteArray process = data; + + // parse + if (process.startsWith('@')) { + process.remove(0, 1); + QByteArray tags = process.left(process.indexOf(' ')); + foreach (const QByteArray& tag, tags.split(';')) { + const int idx = tag.indexOf('='); + if (idx != -1) + message.tags.insert(tag.left(idx), tag.mid(idx + 1)); + else + message.tags.insert(tag, QByteArray()); + } + process.remove(0, tags.length() + 1); + } + + // parse + if (process.startsWith(':')) { + message.prefix = process.left(process.indexOf(' ')); + process.remove(0, message.prefix.length() + 1); + } else { + // empty (not null) + message.prefix = QByteArray(""); + } + + // parse + message.command = process.mid(0, process.indexOf(' ')); + process.remove(0, message.command.length() + 1); + + // parse + while (!process.isEmpty()) { + if (process.startsWith(':')) { + process.remove(0, 1); + message.params += process; + process.clear(); + } else { + QByteArray param = process.mid(0, process.indexOf(' ')); + process.remove(0, param.length() + 1); + message.params += param; + } + } + + return message; +} + +QString IrcMessagePrivate::decode(const QByteArray& data, const QByteArray& encoding) +{ + // TODO: not thread safe + static IrcMessageDecoder decoder; + return decoder.decode(data, encoding); +} + +bool IrcMessagePrivate::parsePrefix(const QString& prefix, QString* nick, QString* ident, QString* host) +{ + const QString trimmed = prefix.trimmed(); + if (trimmed.contains(QLatin1Char(' '))) + return false; + + const int len = trimmed.length(); + const int ex = trimmed.indexOf(QLatin1Char('!')); + const int at = trimmed.indexOf(QLatin1Char('@')); + + if (ex == -1 && at == -1) { + if (nick) *nick = trimmed; + } else if (ex > 0 && at > 0 && ex + 1 < at && at < len - 1) { + if (nick) *nick = trimmed.mid(0, ex); + if (ident) *ident = trimmed.mid(ex + 1, at - ex - 1); + if (host) *host = trimmed.mid(at + 1); + } else if (ex > 0 && ex < len - 1 && at == -1) { + if (nick) *nick = trimmed.mid(0, ex); + if (ident) *ident = trimmed.mid(ex + 1); + } else if (at > 0 && at < len - 1 && ex == -1) { + if (nick) *nick = trimmed.mid(0, at); + if (host) *host = trimmed.mid(at + 1); + } else { + return false; + } + return true; +} +#endif // IRC_DOXYGEN + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircmessagebuilder.cpp b/src/libcommuni/src/core/ircmessagebuilder.cpp new file mode 100644 index 0000000..298ac79 --- /dev/null +++ b/src/libcommuni/src/core/ircmessagebuilder.cpp @@ -0,0 +1,121 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircmessagebuilder_p.h" +#include "ircmessage.h" +#include "irc.h" + +IRC_BEGIN_NAMESPACE + +#ifndef IRC_DOXYGEN +IrcMessageBuilder::IrcMessageBuilder(IrcConnection* connection) +{ + d.connection = connection; + d.message = 0; +} + +void IrcMessageBuilder::processMessage(IrcNumericMessage* message) +{ + switch (message->code()) { + case Irc::RPL_MOTDSTART: + d.message = new IrcMotdMessage(d.connection); + d.message->setPrefix(message->prefix()); + d.message->setParameters(QStringList(message->parameters().value(0))); + break; + case Irc::RPL_MOTD: + d.message->setParameters(d.message->parameters() << message->parameters().value(1)); + break; + case Irc::RPL_ENDOFMOTD: + d.message->setTimeStamp(message->timeStamp()); + emit messageReceived(d.message); + d.message = 0; + break; + + case Irc::RPL_NAMREPLY: { + if (!d.message) + d.message = new IrcNamesMessage(d.connection); + d.message->setPrefix(message->prefix()); + int count = message->parameters().count(); + QString channel = message->parameters().value(count - 2); + QStringList names = d.message->parameters().mid(1); + names += message->parameters().value(count - 1).split(QLatin1Char(' '), QString::SkipEmptyParts); + d.message->setParameters(QStringList() << channel << names); + break; + } + case Irc::RPL_ENDOFNAMES: + d.message->setTimeStamp(message->timeStamp()); + emit messageReceived(d.message); + d.message = 0; + break; + + case Irc::RPL_TOPIC: + case Irc::RPL_NOTOPIC: + d.message = new IrcTopicMessage(d.connection); + d.message->setPrefix(message->prefix()); + d.message->setTimeStamp(message->timeStamp()); + d.message->setCommand(QString::number(message->code())); + d.message->setParameters(QStringList() << message->parameters().value(1) << message->parameters().value(2)); + emit messageReceived(d.message); + d.message = 0; + break; + + case Irc::RPL_WHOREPLY: { + d.message = new IrcWhoReplyMessage(d.connection); + d.message->setPrefix(message->parameters().value(5) // nick + + QLatin1Char('!') + message->parameters().value(2) // ident + + QLatin1Char('@') + message->parameters().value(3)); // host + d.message->setTimeStamp(message->timeStamp()); + d.message->setCommand(QString::number(message->code())); + d.message->setParameters(QStringList() << message->parameters().value(1) // mask + << message->parameters().value(4) // server + << message->parameters().value(6)); // status + QString last = message->parameters().value(7); + int index = last.indexOf(QLatin1Char(' ')); // ignore hopcount + if (index != -1) + d.message->setParameters(d.message->parameters() << last.mid(index + 1)); // real name + emit messageReceived(d.message); + d.message = 0; + break; + } + + case Irc::RPL_CHANNELMODEIS: + d.message = new IrcModeMessage(d.connection); + d.message->setPrefix(message->prefix()); + d.message->setTimeStamp(message->timeStamp()); + d.message->setCommand(QString::number(message->code())); + d.message->setParameters(message->parameters().mid(1)); + emit messageReceived(d.message); + d.message = 0; + break; + } +} +#endif // IRC_DOXYGEN + +#include "moc_ircmessagebuilder_p.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircmessagedecoder.cpp b/src/libcommuni/src/core/ircmessagedecoder.cpp new file mode 100644 index 0000000..1e2eb25 --- /dev/null +++ b/src/libcommuni/src/core/ircmessagedecoder.cpp @@ -0,0 +1,73 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircmessagedecoder_p.h" +#include +#include + +#ifndef IRC_DOXYGEN +extern "C" { + int IsUTF8Text(const char* utf8, int len); +} + +IRC_BEGIN_NAMESPACE + +IRC_CORE_EXPORT bool irc_is_supported_encoding(const QByteArray& encoding) +{ + static QSet codecs = QTextCodec::availableCodecs().toSet(); + return codecs.contains(encoding); +} + +IrcMessageDecoder::IrcMessageDecoder() +{ + initialize(); +} + +IrcMessageDecoder::~IrcMessageDecoder() +{ + uninitialize(); +} + +QString IrcMessageDecoder::decode(const QByteArray& data, const QByteArray& encoding) const +{ + QTextCodec* codec = 0; + if (IsUTF8Text(data, data.length())) { + codec = QTextCodec::codecForName("UTF-8"); + } else { + QByteArray name = codecForData(data); + codec = QTextCodec::codecForName(name); + } + + if (!codec) + codec = QTextCodec::codecForName(encoding); + Q_ASSERT(codec); + return codec->toUnicode(data); +} +#endif // IRC_DOXYGEN + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircmessagedecoder_icu.cpp b/src/libcommuni/src/core/ircmessagedecoder_icu.cpp new file mode 100644 index 0000000..2c303fc --- /dev/null +++ b/src/libcommuni/src/core/ircmessagedecoder_icu.cpp @@ -0,0 +1,68 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircmessagedecoder_p.h" +#include + +IRC_BEGIN_NAMESPACE + +#ifndef IRC_DOXYGEN +#define UCSD(x) reinterpret_cast(x) + +void IrcMessageDecoder::initialize() +{ + UErrorCode status = U_ZERO_ERROR; + d.detector = ucsdet_open(&status); + if (U_FAILURE(status)) + qWarning("IrcMessageDecoder: ICU initialization failed: %s", u_errorName(status)); +} + +void IrcMessageDecoder::uninitialize() +{ + ucsdet_close(UCSD(d.detector)); +} + +QByteArray IrcMessageDecoder::codecForData(const QByteArray &data) const +{ + QByteArray encoding; + UErrorCode status = U_ZERO_ERROR; + if (d.detector) { + ucsdet_setText(UCSD(d.detector), data.constData(), data.length(), &status); + if (!U_FAILURE(status)) { + const UCharsetMatch* match = ucsdet_detect(UCSD(d.detector), &status); + if (match && !U_FAILURE(status)) + encoding = ucsdet_getName(match, &status); + } + } + if (U_FAILURE(status)) + qWarning("IrcMessageDecoder::codecForData() failed: %s", u_errorName(status)); + return encoding; +} +#endif // IRC_DOXYGEN + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircmessagedecoder_uchardet.cpp b/src/libcommuni/src/core/ircmessagedecoder_uchardet.cpp new file mode 100644 index 0000000..8f0be8b --- /dev/null +++ b/src/libcommuni/src/core/ircmessagedecoder_uchardet.cpp @@ -0,0 +1,56 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircmessagedecoder_p.h" +#include "uchardet.h" + +IRC_BEGIN_NAMESPACE + +#ifndef IRC_DOXYGEN +#define UCD(x) reinterpret_cast(x) + +void IrcMessageDecoder::initialize() +{ + d.detector = uchardet_new(); +} + +void IrcMessageDecoder::uninitialize() +{ + uchardet_delete(UCD(d.detector)); +} + +QByteArray IrcMessageDecoder::codecForData(const QByteArray &data) const +{ + uchardet_reset(UCD(d.detector)); + uchardet_handle_data(UCD(d.detector), data.constData(), data.length()); + uchardet_data_end(UCD(d.detector)); + return uchardet_get_charset(UCD(d.detector)); +} +#endif // IRC_DOXYGEN + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircnetwork.cpp b/src/libcommuni/src/core/ircnetwork.cpp new file mode 100644 index 0000000..d73a9be --- /dev/null +++ b/src/libcommuni/src/core/ircnetwork.cpp @@ -0,0 +1,687 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircnetwork.h" +#include "ircnetwork_p.h" +#include "ircconnection_p.h" +#include "ircprotocol.h" +#include "ircconnection.h" +#include "irccommand.h" +#include +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file ircnetwork.h + \brief \#include <IrcNetwork> + */ + +/*! + \class IrcNetwork ircnetwork.h IrcNetwork + \ingroup core + \brief Provides network information and capability management. + + \section info Network information + + IrcNetwork provides various information about the IRC network of a + \ref IrcConnection::network "connection". This includes the \ref name + "network name", supported \ref channelTypes "channel types", channel + user \ref modes "mode characters" and \ref prefixes "prefix letters", + and various \ref numericLimit "numeric limitations", such as the maximum + nick, channel, topic and message lengths. + + Furthermore, IrcNetwork provides convenient methods for converting channel user + \ref modeToPrefix() "modes to prefixes" and \ref prefixToMode() "vice versa" and + testing whether a target name \ref isChannel() "is a channel". + + \note Most properties have empty values until the network + information has been \ref initialized. + + \section capabilities Capability management + + IrcNetwork also provides means for capability management. It maintais a + list of \ref availableCapabilities "available" and \ref activeCapabilities + "active" capabilities, automatically \ref requestedCapabilities "requests" + desired capabilities, and provides convenient methods for \ref requestCapability() + "manual capability requests". + + \sa IrcConnection::network + */ + +/*! + \fn void IrcNetwork::requestingCapabilities() + + This signal is emitted when capabilities are being requested. + + Normally it is enough to add the desired capabilities to the + list of \ref requestedCapabilities "requested capabilities". + Connect to this signal in order to implement more advanced + capability handling eg. based on which capabilities are \ref + availableCapabilities "available". + + \sa requestedCapabilities, availableCapabilities + */ + +/*! + \enum IrcNetwork::ModeType + This enum describes the channel mode types. + */ + +/*! + \var IrcNetwork::TypeA + \brief Type A modes + + Modes that add or remove an address to or from a list. + These modes always take a parameter when sent by the server to a + client; when sent by a client, they may be specified without a + parameter, which requests the server to display the current + contents of the corresponding list on the channel to the client. + */ + +/*! + \var IrcNetwork::TypeB + \brief Type B modes + + Modes that change a setting on the channel. These modes + always take a parameter. + */ + +/*! + \var IrcNetwork::TypeC + \brief Type C modes + + Modes that change a setting on the channel. These modes + take a parameter only when set; the parameter is absent when the + mode is removed both in the client's and server's MODE command. + */ + +/*! + \var IrcNetwork::TypeD + \brief Type D modes + + Modes that change a setting on the channel. These modes + never take a parameter. + */ + +/*! + \var IrcNetwork::AllTypes + \brief All type modes + */ + +/*! + \enum IrcNetwork::Limit + This enum describes the numeric limit types. + */ + +/*! + \var IrcNetwork::NickLength + \brief The maximum nick name length + */ + +/*! + \var IrcNetwork::ChannelLength + \brief The maximum channel name length + */ + +/*! + \var IrcNetwork::TopicLength + \brief The maximum channel topic length + */ + +/*! + \var IrcNetwork::MessageLength + \brief The maximum message length + */ + +/*! + \var IrcNetwork::KickReasonLength + \brief The maximum kick reason length + */ + +/*! + \var IrcNetwork::AwayReasonLength + \brief The maximum away reason length + */ + +/*! + \var IrcNetwork::ModeCount + \brief The maximum number of channel modes allowed per mode command + */ + +#ifndef IRC_DOXYGEN +IrcNetworkPrivate::IrcNetworkPrivate() : q_ptr(0), initialized(false) +{ +} + +static QHash numericValues(const QString& parameter) +{ + QHash values; + const QStringList keyValues = parameter.split(",", QString::SkipEmptyParts); + foreach (const QString& keyValue, keyValues) + values.insert(keyValue.section(":", 0, 0), keyValue.section(":", 1, 1).toInt()); + return values; +} + +void IrcNetworkPrivate::setInfo(const QHash& info) +{ + Q_Q(IrcNetwork); + if (info.contains("NETWORK")) + setName(info.value("NETWORK")); + if (info.contains("PREFIX")) { + const QString pfx = info.value("PREFIX"); + setModes(pfx.mid(1, pfx.indexOf(')') - 1).split("", QString::SkipEmptyParts)); + setPrefixes(pfx.mid(pfx.indexOf(')') + 1).split("", QString::SkipEmptyParts)); + } + if (info.contains("CHANTYPES")) + setChannelTypes(info.value("CHANTYPES").split("", QString::SkipEmptyParts)); + + // TODO: + if (info.contains("NICKLEN")) + numericLimits.insert("NICKLEN", info.value("NICKLEN").toInt()); + if (info.contains("CHANNELLEN")) + numericLimits.insert("CHANNELLEN", info.value("CHANNELLEN").toInt()); + if (info.contains("TOPICLEN")) + numericLimits.insert("TOPICLEN", info.value("TOPICLEN").toInt()); + if (info.contains("KICKLEN")) + numericLimits.insert("KICKLEN", info.value("KICKLEN").toInt()); + if (info.contains("AWAYLEN")) + numericLimits.insert("AWAYLEN", info.value("AWAYLEN").toInt()); + if (info.contains("MODES")) + numericLimits.insert("MODES", info.value("MODES").toInt()); + if (info.contains("CHANMODES")) + channelModes = info.value("CHANMODES").split(",", QString::SkipEmptyParts); + if (info.contains("MAXLIST")) + modeLimits = numericValues(info.value("MAXLIST")); + if (info.contains("CHANLIMIT")) + channelLimits = numericValues(info.value("CHANLIMIT")); + if (info.contains("TARGMAX")) + targetLimits = numericValues(info.value("TARGMAX")); + + if (!initialized) { + initialized = true; + emit q->initialized(); + } +} + +void IrcNetworkPrivate::setAvailableCapabilities(const QSet& capabilities) +{ + Q_Q(IrcNetwork); + if (availableCaps != capabilities) { + availableCaps = capabilities; + emit q->availableCapabilitiesChanged(availableCaps.toList()); + } +} + +void IrcNetworkPrivate::setActiveCapabilities(const QSet& capabilities) +{ + Q_Q(IrcNetwork); + if (activeCaps != capabilities) { + activeCaps = capabilities; + emit q->activeCapabilitiesChanged(activeCaps.toList()); + } +} + +void IrcNetworkPrivate::setName(const QString& value) +{ + Q_Q(IrcNetwork); + if (name != value) { + name = value; + emit q->nameChanged(value); + } +} + +void IrcNetworkPrivate::setModes(const QStringList& value) +{ + Q_Q(IrcNetwork); + if (modes != value) { + modes = value; + emit q->modesChanged(value); + } +} + +void IrcNetworkPrivate::setPrefixes(const QStringList& value) +{ + Q_Q(IrcNetwork); + if (prefixes != value) { + prefixes = value; + emit q->prefixesChanged(value); + } +} + +void IrcNetworkPrivate::setChannelTypes(const QStringList& value) +{ + Q_Q(IrcNetwork); + if (channelTypes != value) { + channelTypes = value; + emit q->channelTypesChanged(value); + } +} +#endif // IRC_DOXYGEN + +/*! + \internal + Constructs a new network object for IRC \a connection. + */ +IrcNetwork::IrcNetwork(IrcConnection* connection) : QObject(connection), d_ptr(new IrcNetworkPrivate) +{ + Q_D(IrcNetwork); + d->q_ptr = this; + d->connection = connection; +} + +/*! + \internal + Destructs the IRC network. + */ +IrcNetwork::~IrcNetwork() +{ +} + +/*! + \property bool IrcNetwork::initialized + This property holds whether the network information has been initialized. + + Most properties have empty values until the server provides the + relevant network information during the client-server handshake. + + \par Access function: + \li bool isInitialized() const + + \par Notifier signal: + \li void initialized() + */ +bool IrcNetwork::isInitialized() +{ + Q_D(const IrcNetwork); + return d->initialized; +} + +/*! + This property holds the network name. + + \par Access function: + \li QString name() const + + \par Notifier signal: + \li void nameChanged(const QString& name) + */ +QString IrcNetwork::name() const +{ + Q_D(const IrcNetwork); + return d->name; +} + +/*! + This property holds the supported channel user mode letters. + + Examples of typical channel user modes: + Description | Mode | Prefix + -----------------|------------|------- + Channel operator | \b o | @ + Voiced user | \b v | + + + \par Access function: + \li QStringList modes() const + + \par Notifier signal: + \li void modesChanged(const QStringList& modes) + + \sa prefixes, modeToPrefix() + */ +QStringList IrcNetwork::modes() const +{ + Q_D(const IrcNetwork); + return d->modes; +} + +/*! + This property holds the supported channel user mode prefix characters. + + Examples of typical channel user modes: + Description | Mode | Prefix + -----------------|------------|------- + Channel operator | o | \b @ + Voiced user | v | \b + + + \par Access function: + \li QStringList prefixes() const + + \par Notifier signal: + \li void prefixesChanged(const QStringList& prefixes) + + \sa modes, prefixToMode() + */ +QStringList IrcNetwork::prefixes() const +{ + Q_D(const IrcNetwork); + return d->prefixes; +} + +/*! + Converts a channel user mode letter to a prefix character. + + \sa modes, prefixToMode() + */ +QString IrcNetwork::modeToPrefix(const QString& mode) const +{ + Q_D(const IrcNetwork); + return d->prefixes.value(d->modes.indexOf(mode)); +} + +/*! + Converts a channel mode prefix character to a mode letter. + + \sa prefixes, modeToPrefix() + */ +QString IrcNetwork::prefixToMode(const QString& prefix) const +{ + Q_D(const IrcNetwork); + return d->modes.value(d->prefixes.indexOf(prefix)); +} + +/*! + This property holds the supported channel type prefix characters. + + Examples of typical channel types: + Description | Type | Example + -----------------|------|--------- + Normal channel | \# | \#communi + Local channel | & | &foo + + \par Access function: + \li QStringList channelTypes() const + + \par Notifier signal: + \li void channelTypesChanged(const QStringList& types) + */ +QStringList IrcNetwork::channelTypes() const +{ + Q_D(const IrcNetwork); + return d->channelTypes; +} + +/*! + Returns \c true if the \a name is a channel. + + \code + QString name = ...; + if (connection->network()->isChannel(name)) + doSomeChannelAction(name); + \endcode + + \sa channelTypes + */ +bool IrcNetwork::isChannel(const QString& name) const +{ + Q_D(const IrcNetwork); + return !name.isEmpty() && d->channelTypes.contains(name.at(0)); +} + +/*! + Returns the supported channel modes for specified \a types. + + \sa ModeType + */ +QStringList IrcNetwork::channelModes(IrcNetwork::ModeTypes types) const +{ + Q_D(const IrcNetwork); + QStringList modes; + if (types & TypeA) + modes += d->channelModes.value(0).split("", QString::SkipEmptyParts); + if (types & TypeB) + modes += d->channelModes.value(1).split("", QString::SkipEmptyParts); + if (types & TypeC) + modes += d->channelModes.value(2).split("", QString::SkipEmptyParts); + if (types & TypeD) + modes += d->channelModes.value(3).split("", QString::SkipEmptyParts); + return modes; +} + +/*! + Returns a numeric type of \a limit, or \c -1 if the limitation is not known. + + \sa modeLimit(), channelLimit(), targetLimit() + */ +int IrcNetwork::numericLimit(Limit limit) const +{ + Q_D(const IrcNetwork); + QString key; + switch (limit) { + case NickLength: key = QLatin1String("NICKLEN"); break; + case ChannelLength: key = QLatin1String("CHANNELLEN"); break; + case TopicLength: key = QLatin1String("TOPICLEN"); break; + case MessageLength: return 512; // RFC 1459 + case KickReasonLength: key = QLatin1String("KICKLEN"); break; + case AwayReasonLength: key = QLatin1String("AWAYLEN"); break; + case ModeCount: key = QLatin1String("MODES"); break; + } + return d->numericLimits.value(key, -1); +} + +/*! + Returns the limit of entries in the list per \a mode, or \c -1 if the limitation is not known. + + \sa modes() + */ +int IrcNetwork::modeLimit(const QString& mode) const +{ + Q_D(const IrcNetwork); + return d->modeLimits.value(mode); +} + +/*! + Returns the limit for a \a type of channels, or \c -1 if the limitation is not known. + + \sa channelTypes() + */ +int IrcNetwork::channelLimit(const QString& type) const +{ + Q_D(const IrcNetwork); + return d->channelLimits.value(type); +} + +/*! + Returns the limit of targets for a \a command, or \c -1 if the limitation is not known. + */ +int IrcNetwork::targetLimit(const QString& command) const +{ + Q_D(const IrcNetwork); + return d->targetLimits.value(command); +} + +/*! + This property holds the available capabilities. + + \par Access function: + \li QStringList availableCapabilities() const + + \par Notifier signal: + \li void availableCapabilitiesChanged(const QStringList& capabilities) + + \sa requestedCapabilities, activeCapabilities + */ +QStringList IrcNetwork::availableCapabilities() const +{ + Q_D(const IrcNetwork); + return d->availableCaps.toList(); +} + +/*! + This property holds the active capabilities. + + \par Access function: + \li QStringList activeCapabilities() const + + \par Notifier signal: + \li void activeCapabilitiesChanged(const QStringList& capabilities) + + \sa requestedCapabilities, availableCapabilities + */ +QStringList IrcNetwork::activeCapabilities() const +{ + Q_D(const IrcNetwork); + return d->activeCaps.toList(); +} + +/*! + Returns \c true if the \a capability is \b available. + + \sa availableCapabilities + */ +bool IrcNetwork::hasCapability(const QString& capability) const +{ + Q_D(const IrcNetwork); + return d->availableCaps.contains(capability); +} + +/*! + Returns \c true if the \a capability is \b active. + + \sa activeCapabilities + */ +bool IrcNetwork::isCapable(const QString& capability) const +{ + Q_D(const IrcNetwork); + return d->activeCaps.contains(capability); +} + +/*! + Requests the specified \a capability. + + \note The \a capability is NOT added to the list of \ref requestedCapabilities + "requested capabilities" to avoid them "piling up". + */ +bool IrcNetwork::requestCapability(const QString& capability) +{ + Q_D(IrcNetwork); + if (d->connection) + return d->connection->sendCommand(IrcCommand::createCapability(QLatin1String("REQ"), capability)); + return false; +} + +/*! + Requests the specified \a capabilities. + + \note The \a capabilities are NOT added to the list of \ref requestedCapabilities + "requested capabilities" to avoid them "piling up". + */ +bool IrcNetwork::requestCapabilities(const QStringList& capabilities) +{ + Q_D(IrcNetwork); + if (d->connection && d->connection->isActive()) + return d->connection->sendCommand(IrcCommand::createCapability(QLatin1String("REQ"), capabilities)); + return false; +} + +/*! + This property holds the requested capabilities. + + These capabilities are automatically requested during the handshake, + right after requestingCapabilities() has been emitted. + + \par Access functions: + \li QStringList requestedCapabilities() const + \li void setRequestedCapabilities(const QStringList& capabilities) + + \par Notifier signal: + \li void requestedCapabilitiesChanged(const QStringList& capabilities) + + \sa availableCapabilities, activeCapabilities + */ +QStringList IrcNetwork::requestedCapabilities() const +{ + Q_D(const IrcNetwork); + return d->requestedCaps.toList(); +} + +void IrcNetwork::setRequestedCapabilities(const QStringList& capabilities) +{ + Q_D(IrcNetwork); + const QSet caps = capabilities.toSet(); + if (d->requestedCaps != caps) { + d->requestedCaps = caps; + emit requestedCapabilitiesChanged(caps.toList()); + } +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, IrcNetwork::Limit limit) +{ + const int index = IrcNetwork::staticMetaObject.indexOfEnumerator("Limit"); + QMetaEnum enumerator = IrcNetwork::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(limit); + debug << (key ? key : "Unknown"); + return debug; +} + +QDebug operator<<(QDebug debug, IrcNetwork::ModeType type) +{ + const int index = IrcNetwork::staticMetaObject.indexOfEnumerator("ModeType"); + QMetaEnum enumerator = IrcNetwork::staticMetaObject.enumerator(index); + const char* key = enumerator.valueToKey(type); + debug << (key ? key : "Unknown"); + return debug; +} + +QDebug operator<<(QDebug debug, IrcNetwork::ModeTypes types) +{ + QStringList lst; + if (types == IrcNetwork::AllTypes) { + lst << "AllTypes"; + } else { + if (types & IrcNetwork::TypeA) + lst << "TypeA"; + if (types & IrcNetwork::TypeB) + lst << "TypeB"; + if (types & IrcNetwork::TypeC) + lst << "TypeC"; + if (types & IrcNetwork::TypeD) + lst << "TypeD"; + } + debug.nospace() << '(' << qPrintable(lst.join("|")) << ')'; + return debug; +} + +QDebug operator<<(QDebug debug, const IrcNetwork* network) +{ + if (!network) + return debug << "IrcNetwork(0x0) "; + debug.nospace() << network->metaObject()->className() << '(' << (void*) network; + if (!network->objectName().isEmpty()) + debug.nospace() << ", name=" << qPrintable(network->objectName()); + if (!network->name().isEmpty()) + debug.nospace() << ", network=" << qPrintable(network->name()); + debug.nospace() << ')'; + return debug.space(); +} +#endif // QT_NO_DEBUG_STREAM + +#include "moc_ircnetwork.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/core/ircprotocol.cpp b/src/libcommuni/src/core/ircprotocol.cpp new file mode 100644 index 0000000..9d42126 --- /dev/null +++ b/src/libcommuni/src/core/ircprotocol.cpp @@ -0,0 +1,480 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircprotocol.h" +#include "ircconnection_p.h" +#include "ircmessagebuilder_p.h" +#include "ircnetwork_p.h" +#include "ircconnection.h" +#include "ircmessage.h" +#include "irccommand.h" +#include "irc.h" +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file ircprotocol.h + \brief \#include <IrcProtocol> + */ + +/*! + \since 3.2 + \class IrcProtocol ircprotocol.h IrcProtocol + \ingroup core + \brief Implements the IRC protocol and provides means for implementing support for custom protocols. + + \sa IrcConnection::protocol + */ + +#ifndef IRC_DOXYGEN +class IrcProtocolPrivate +{ + Q_DECLARE_PUBLIC(IrcProtocol) + +public: + IrcProtocolPrivate(); + + void authenticate(bool secure); + + void readLines(const QByteArray& delimiter); + void processLine(const QByteArray& line); + + void handleNumericMessage(IrcNumericMessage* msg); + void handlePrivateMessage(IrcPrivateMessage* msg); + void handleCapabilityMessage(IrcCapabilityMessage* msg); + + void _irc_pauseHandshake(); + void _irc_resumeHandshake(); + + IrcProtocol* q_ptr; + IrcConnection* connection; + IrcMessageBuilder* builder; + QHash info; + QByteArray buffer; + bool resumed; + bool authed; +}; + +IrcProtocolPrivate::IrcProtocolPrivate() : q_ptr(0), connection(0), builder(0), resumed(false), authed(false) +{ +} + +void IrcProtocolPrivate::authenticate(bool secure) +{ + const QString password = connection->password(); + if (!password.isEmpty()) { + if (secure) { + const QByteArray userName = connection->userName().toUtf8(); + const QByteArray data = userName + '\0' + userName + '\0' + password.toUtf8(); + authed = connection->sendData("AUTHENTICATE " + data.toBase64()); + } else { + authed = connection->sendRaw(QString("PASS %1").arg(password)); + } + } +} + +void IrcProtocolPrivate::readLines(const QByteArray& delimiter) +{ + int i = -1; + while ((i = buffer.indexOf(delimiter)) != -1) { + QByteArray line = buffer.left(i).trimmed(); + buffer = buffer.mid(i + delimiter.length()); + if (!line.isEmpty()) + processLine(line); + } +} + +void IrcProtocolPrivate::processLine(const QByteArray& line) +{ + Q_Q(IrcProtocol); + static bool dbg = qgetenv("IRC_DEBUG").toInt(); + if (dbg) qDebug() << line; + + if (line.startsWith("AUTHENTICATE") && !connection->saslMechanism().isEmpty()) { + const QList args = line.split(' '); + if (args.count() == 2 && args.at(1) == "+") + authenticate(true); + if (!connection->isConnected()) + QMetaObject::invokeMethod(q, "_irc_resumeHandshake", Qt::QueuedConnection); + return; + } + + IrcMessage* msg = IrcMessage::fromData(line, connection); + if (msg) { + msg->setEncoding(connection->encoding()); + + switch (msg->type()) { + case IrcMessage::Capability: + handleCapabilityMessage(static_cast(msg)); + break; + case IrcMessage::Nick: + if (msg->flags() & IrcMessage::Own) + q->setNickName(static_cast(msg)->newNick()); + break; + case IrcMessage::Numeric: + handleNumericMessage(static_cast(msg)); + break; + case IrcMessage::Ping: + connection->sendRaw("PONG " + static_cast(msg)->argument()); + break; + case IrcMessage::Private: + handlePrivateMessage(static_cast(msg)); + break; + default: + break; + } + q->receiveMessage(msg); + } +} + +void IrcProtocolPrivate::handleNumericMessage(IrcNumericMessage* msg) +{ + Q_Q(IrcProtocol); + switch (msg->code()) { + case Irc::RPL_WELCOME: + q->setNickName(msg->parameters().value(0)); + q->setStatus(IrcConnection::Connected); + break; + case Irc::RPL_ISUPPORT: { + foreach (const QString& param, msg->parameters().mid(1)) { + QStringList keyValue = param.split("=", QString::SkipEmptyParts); + info.insert(keyValue.value(0), keyValue.value(1)); + } + break; + } + case Irc::ERR_NOMOTD: + case Irc::RPL_MOTDSTART: + q->setInfo(info); + break; + case Irc::ERR_NICKNAMEINUSE: + case Irc::ERR_NICKCOLLISION: { + QString alternate = connection->nickName(); + emit connection->nickNameReserved(&alternate); + if (!alternate.isEmpty() && alternate != connection->nickName()) { + connection->setNickName(alternate); + } else { + emit connection->nickNameRequired(msg->parameters().value(1), &alternate); + if (!alternate.isEmpty() && alternate != connection->nickName()) + connection->setNickName(alternate); + } + break; + } + case Irc::ERR_BADCHANNELKEY: { + QString key; + QString channel = msg->parameters().value(1); + emit connection->channelKeyRequired(channel, &key); + if (!key.isEmpty()) + connection->sendCommand(IrcCommand::createJoin(channel, key)); + break; + } + default: + break; + } +} + +void IrcProtocolPrivate::handlePrivateMessage(IrcPrivateMessage* msg) +{ + if (msg->isRequest()) { + IrcCommand* reply = IrcConnectionPrivate::get(connection)->createCtcpReply(msg); + if (reply) + connection->sendCommand(reply); + } +} + +static void handleCapability(QSet* caps, const QString& cap) +{ + Q_ASSERT(caps); + // sticky modifier (once the cap is enabled, it cannot be disabled) + QLatin1Char stickyMod('='); + // ack modifier (the cap must be acked by the client to fully enable/disable) + QLatin1Char ackMod('~'); + // disable modifier (the cap should be disabled) + QLatin1Char disMod('-'); + + QString name = cap; + while (name.startsWith(stickyMod) || name.startsWith(ackMod)) + name.remove(0, 1); + + if (name.startsWith(disMod)) + caps->remove(name.mid(1)); + else + caps->insert(name); +} + +void IrcProtocolPrivate::handleCapabilityMessage(IrcCapabilityMessage* msg) +{ + Q_Q(IrcProtocol); + const bool connected = connection->isConnected(); + const QString subCommand = msg->subCommand(); + if (subCommand == "LS") { + QSet availableCaps = connection->network()->availableCapabilities().toSet(); + foreach (const QString& cap, msg->capabilities()) + handleCapability(&availableCaps, cap); + q->setAvailableCapabilities(availableCaps); + + if (!connected) { + QMetaObject::invokeMethod(connection->network(), "requestingCapabilities"); + QStringList requestedCaps = connection->network()->requestedCapabilities(); + const QStringList params = msg->parameters(); + if (params.value(params.count() - 1) != QLatin1String("*")) { + if (!connection->saslMechanism().isEmpty() && availableCaps.contains(QLatin1String("sasl"))) + requestedCaps += QLatin1String("sasl"); + } + if (!requestedCaps.isEmpty()) + connection->sendRaw("CAP REQ :" + requestedCaps.join(" ")); + else + QMetaObject::invokeMethod(q, "_irc_resumeHandshake", Qt::QueuedConnection); + } + } else if (subCommand == "ACK" || subCommand == "NAK") { + bool auth = false; + if (subCommand == "ACK") { + QSet activeCaps = connection->network()->activeCapabilities().toSet(); + foreach (const QString& cap, msg->capabilities()) { + handleCapability(&activeCaps, cap); + if (cap == "sasl" && !connection->saslMechanism().isEmpty() && !connection->password().isEmpty()) + auth = connection->sendRaw("AUTHENTICATE " + connection->saslMechanism()); + } + q->setActiveCapabilities(activeCaps); + } + + if (!connected && !auth) + QMetaObject::invokeMethod(q, "_irc_resumeHandshake", Qt::QueuedConnection); + } +} + +void IrcProtocolPrivate::_irc_pauseHandshake() +{ + // Send CAP LS first; if the server understands it this will + // temporarily pause the handshake until CAP END is sent, so we + // know whether the server supports the CAP extension. + connection->sendData("CAP LS"); + resumed = false; + authed = false; +} + +void IrcProtocolPrivate::_irc_resumeHandshake() +{ + if (!resumed && !connection->isConnected()) { + if (!authed && !connection->saslMechanism().isEmpty() && !connection->password().isEmpty()) + authenticate(false); + connection->sendData("CAP END"); + } + resumed = true; +} +#endif // IRC_DOXYGEN + +/*! + Constructs a new IRC protocol for \a connection. + */ +IrcProtocol::IrcProtocol(IrcConnection* connection) : QObject(connection), d_ptr(new IrcProtocolPrivate) +{ + Q_D(IrcProtocol); + d->q_ptr = this; + d->connection = connection; + d->builder = new IrcMessageBuilder(connection); + connect(d->builder, SIGNAL(messageReceived(IrcMessage*)), this, SLOT(receiveMessage(IrcMessage*))); +} + +/*! + Destructs the IRC protocol. + */ +IrcProtocol::~IrcProtocol() +{ + Q_D(IrcProtocol); + delete d->builder; +} + +/*! + This property holds the connection. + + \par Access function: + \li \ref IrcConnection* connection() const + */ +IrcConnection* IrcProtocol::connection() const +{ + Q_D(const IrcProtocol); + return d->connection; +} + +/*! + This property holds the socket. + + \par Access functions: + \li \ref QAbstractSocket* socket() const + */ +QAbstractSocket* IrcProtocol::socket() const +{ + Q_D(const IrcProtocol); + return d->connection->socket(); +} + +/*! + This method is called when the connection has been established. + + The default implementation sends the \c NICK, \c USER and \c PASSWORD commands as defined in + RFC 1459. + + Furthermore, it sends a CAP LS command as specified in + IRC Client Capabilities Extension. + */ +void IrcProtocol::open() +{ + Q_D(IrcProtocol); + d->_irc_pauseHandshake(); + + if (d->connection->saslMechanism().isEmpty() && !d->connection->password().isEmpty()) + d->authenticate(false); + + d->connection->sendRaw(QString("NICK %1").arg(d->connection->nickName())); + d->connection->sendRaw(QString("USER %1 hostname servername :%2").arg(d->connection->userName(), d->connection->realName())); +} + +/*! + This method is called when the connection has been lost. + */ +void IrcProtocol::close() +{ +} + +/*! + This method is called when the \ref socket has new data available for read. + + The default implementation reads lines as specified in + RFC 1459. + + \sa socket + */ +void IrcProtocol::read() +{ + Q_D(IrcProtocol); + d->buffer += socket()->readAll(); + // try reading RFC compliant message lines first + d->readLines("\r\n"); + // fall back to RFC incompliant lines... + d->readLines("\n"); +} + +/*! + This method is called when raw \a data should be written to the \ref socket. + + The default implementation writes the data and appends \c "\r\n" as specified in + RFC 1459. + + \sa socket + */ +bool IrcProtocol::write(const QByteArray& data) +{ + return socket()->write(data + QByteArray("\r\n")) != -1; +} + +/*! + This method should be called by the protocol implementation + to make the underlying IRC connection receive a \a message. + + \sa IrcConnection::messageReceived() + */ +void IrcProtocol::receiveMessage(IrcMessage* message) +{ + Q_D(IrcProtocol); + IrcConnectionPrivate* priv = IrcConnectionPrivate::get(d->connection); + priv->receiveMessage(message); + if (message->type() == IrcMessage::Numeric) + d->builder->processMessage(static_cast(message)); +} + +/*! + This method should be called by the protocol implementation to + notify the underlying IRC connection about a nick \a name change. + + \sa IrcConnection::nickName + */ +void IrcProtocol::setNickName(const QString& name) +{ + Q_D(IrcProtocol); + IrcConnectionPrivate* priv = IrcConnectionPrivate::get(d->connection); + priv->setNick(name); +} + +/*! + This method should be called by the protocol implementation + to notify the underlying IRC connection about a \a status change. + + \sa IrcConnection::status + */ +void IrcProtocol::setStatus(IrcConnection::Status status) +{ + Q_D(IrcProtocol); + IrcConnectionPrivate* priv = IrcConnectionPrivate::get(d->connection); + priv->setStatus(status); +} + +/*! + This method should be called by the protocol implementation + to initialize the underlying IRC network connection \a info. + + \sa IrcNetwork::initialized + */ +void IrcProtocol::setInfo(const QHash& info) +{ + Q_D(IrcProtocol); + if (!info.isEmpty()) { + IrcConnectionPrivate* priv = IrcConnectionPrivate::get(d->connection); + priv->setInfo(info); + } +} + +/*! + This method should be called by the protocol implementation to notify + the underlying IRC network about a change in available \a capabilities. + + \sa IrcNetwork::availableCapabilities + */ +void IrcProtocol::setAvailableCapabilities(const QSet& capabilities) +{ + Q_D(IrcProtocol); + IrcNetworkPrivate* priv = IrcNetworkPrivate::get(d->connection->network()); + priv->setAvailableCapabilities(capabilities); +} + +/*! + This method should be called by the protocol implementation to notify + the underlying IRC network about a change in active \a capabilities. + + \sa IrcNetwork::activeCapabilities + */ +void IrcProtocol::setActiveCapabilities(const QSet& capabilities) +{ + Q_D(IrcProtocol); + IrcNetworkPrivate* priv = IrcNetworkPrivate::get(d->connection->network()); + priv->setActiveCapabilities(capabilities); +} + +#include "moc_ircprotocol.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/imports/imports.pri b/src/libcommuni/src/imports/imports.pri new file mode 100644 index 0000000..1edd926 --- /dev/null +++ b/src/libcommuni/src/imports/imports.pri @@ -0,0 +1,17 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = lib +TARGET = $$qtLibraryTarget($$TARGET) +CONFIG += plugin +!verbose:CONFIG += silent +contains(QT_CONFIG, debug_and_release) { + win32|mac:!wince*:!win32-msvc:!macx-xcode:CONFIG += debug_and_release build_all +} + +IRC_SOURCEDIR = $$PWD/../../ +IRC_BUILDDIR = $$OUT_PWD/../../../ + +IRC_MODULES = IrcCore IrcModel IrcUtil +include(../module_deps.pri) diff --git a/src/libcommuni/src/imports/imports.pro b/src/libcommuni/src/imports/imports.pro new file mode 100644 index 0000000..425909a --- /dev/null +++ b/src/libcommuni/src/imports/imports.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = subdirs +greaterThan(QT_MAJOR_VERSION, 4):qtHaveModule(qml):SUBDIRS += qml2 +else:!lessThan(QT_MAJOR_VERSION, 4):!lessThan(QT_MINOR_VERSION, 7):SUBDIRS += qml1 diff --git a/src/libcommuni/src/imports/qml1/plugin.cpp b/src/libcommuni/src/imports/qml1/plugin.cpp new file mode 100644 index 0000000..bb66c2e --- /dev/null +++ b/src/libcommuni/src/imports/qml1/plugin.cpp @@ -0,0 +1,138 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcQmlFilter : public QObject, + public IrcCommandFilter, + public IrcMessageFilter +{ + Q_OBJECT + Q_INTERFACES(IrcCommandFilter IrcMessageFilter) + Q_PROPERTY(IrcConnection* connection READ connection WRITE setConnection NOTIFY connectionChanged) + +public: + IrcQmlFilter(QObject* parent = 0) : QObject(parent), conn(0) { } + + IrcConnection* connection() const { return conn; } + void setConnection(IrcConnection* connection) + { + if (conn != connection) { + if (conn) { + conn->removeCommandFilter(this); + conn->removeMessageFilter(this); + } + conn = connection; + if (conn) { + conn->installCommandFilter(this); + conn->installMessageFilter(this); + } + emit connectionChanged(); + } + } + + bool commandFilter(IrcCommand* cmd) + { + // QML: QVariant commandFilter(QVariant) + const QMetaObject* mo = metaObject(); + int idx = mo->indexOfMethod("commandFilter(QVariant)"); + if (idx != -1) { + QVariant ret; + QMetaMethod method = mo->method(idx); + method.invoke(this, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(cmd))); + return ret.toBool(); + } + return false; + } + + bool messageFilter(IrcMessage* msg) + { + // QML: QVariant messageFilter(QVariant) + const QMetaObject* mo = metaObject(); + int idx = mo->indexOfMethod("messageFilter(QVariant)"); + if (idx != -1) { + QVariant ret; + QMetaMethod method = mo->method(idx); + method.invoke(this, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(msg))); + return ret.toBool(); + } + return false; + } + +signals: + void connectionChanged(); + +private: + QPointer conn; +}; + +class CommuniPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT + +public: + void registerTypes(const char* uri) { + // IrcCore + Irc::registerMetaTypes(); + qmlRegisterType(uri, 3, 0, "Irc"); + qmlRegisterType(uri, 3, 2, "Irc"); + qmlRegisterType(uri, 3, 0, "IrcCommand"); + qmlRegisterType(uri, 3, 0, "IrcConnection"); + qmlRegisterUncreatableType(uri, 3, 0, "IrcMessage", "Cannot create an instance of IrcMessage. Use IrcConnection::messageReceived() signal instead."); + qmlRegisterUncreatableType(uri, 3, 0, "IrcNetwork", "Cannot create an instance of IrcNetwork. Use IrcConnection::network property instead."); + qmlRegisterType(uri, 3, 0, "IrcMessageFilter"); + qmlRegisterType(uri, 3, 0, "IrcCommandFilter"); + qmlRegisterType(uri, 3, 0, "IrcFilter"); + + // IrcModel + qmlRegisterType(uri, 3, 0, "IrcBuffer"); + qmlRegisterType(uri, 3, 0, "IrcBufferModel"); + qmlRegisterType(uri, 3, 0, "IrcChannel"); + qmlRegisterType(uri, 3, 0, "IrcUser"); + qmlRegisterType(uri, 3, 0, "IrcUserModel"); + + // IrcUtil + qmlRegisterType(uri, 3, 0, "IrcCommandParser"); + qmlRegisterType(uri, 3, 0, "IrcLagTimer"); + qmlRegisterType(uri, 3, 0, "IrcTextFormat"); + qmlRegisterUncreatableType(uri, 3, 0, "IrcPalette", "Cannot create an instance of IrcPalette. Use IrcTextFormat::palette property instead."); + qmlRegisterType(uri, 3, 1, "IrcCompleter"); + } +}; + +IRC_END_NAMESPACE + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(communiplugin, CommuniPlugin); diff --git a/src/libcommuni/src/imports/qml1/plugins.qmltypes b/src/libcommuni/src/imports/qml1/plugins.qmltypes new file mode 100644 index 0000000..1be56cc --- /dev/null +++ b/src/libcommuni/src/imports/qml1/plugins.qmltypes @@ -0,0 +1,1929 @@ +import QtQuick.tooling 1.1 + +// This file describes the plugin-supplied types contained in the library. +// It is used for QML tooling purposes only. + +Module { + Component { + name: "Irc" + prototype: "QObject" + exports: [ + "Communi/Irc 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Enum { + name: "Color" + values: { + "White": 0, + "Black": 1, + "Blue": 2, + "Green": 3, + "Red": 4, + "Brown": 5, + "Purple": 6, + "Orange": 7, + "Yellow": 8, + "LightGreen": 9, + "Cyan": 10, + "LightCyan": 11, + "LightBlue": 12, + "Pink": 13, + "Gray": 14, + "LightGray": 15 + } + } + Enum { + name: "DataRole" + values: { + "UserRole": 32, + "BufferRole": 33, + "ChannelRole": 34, + "NameRole": 35, + "PrefixRole": 36, + "ModeRole": 37, + "TitleRole": 38 + } + } + Enum { + name: "SortMethod" + values: { + "SortByHand": 0, + "SortByName": 1, + "SortByTitle": 2, + "SortByActivity": 3 + } + } + Enum { + name: "Code" + values: { + "RPL_WELCOME": 1, + "RPL_YOURHOST": 2, + "RPL_CREATED": 3, + "RPL_MYINFO": 4, + "RPL_ISUPPORT": 5, + "RPL_SNOMASK": 8, + "RPL_STATMEMTOT": 9, + "RPL_BOUNCE": 10, + "RPL_STATMEM": 10, + "RPL_YOURCOOKIE": 14, + "RPL_YOURID": 42, + "RPL_SAVENICK": 43, + "RPL_ATTEMPTINGJUNC": 50, + "RPL_ATTEMPTINGREROUTE": 51, + "RPL_TRACELINK": 200, + "RPL_TRACECONNECTING": 201, + "RPL_TRACEHANDSHAKE": 202, + "RPL_TRACEUNKNOWN": 203, + "RPL_TRACEOPERATOR": 204, + "RPL_TRACEUSER": 205, + "RPL_TRACESERVER": 206, + "RPL_TRACESERVICE": 207, + "RPL_TRACENEWTYPE": 208, + "RPL_TRACECLASS": 209, + "RPL_TRACERECONNECT": 210, + "RPL_STATS": 210, + "RPL_STATSLINKINFO": 211, + "RPL_STATSCOMMANDS": 212, + "RPL_STATSCLINE": 213, + "RPL_STATSNLINE": 214, + "RPL_STATSILINE": 215, + "RPL_STATSKLINE": 216, + "RPL_STATSQLINE": 217, + "RPL_STATSYLINE": 218, + "RPL_ENDOFSTATS": 219, + "RPL_UMODEIS": 221, + "RPL_MODLIST": 222, + "RPL_SQLINE_NICK": 222, + "RPL_STATSZLINE": 225, + "RPL_STATSCOUNT": 226, + "RPL_SERVICEINFO": 231, + "RPL_ENDOFSERVICES": 232, + "RPL_SERVICE": 233, + "RPL_SERVLIST": 234, + "RPL_SERVLISTEND": 235, + "RPL_STATSVERBOSE": 236, + "RPL_STATSENGINE": 237, + "RPL_STATSIAUTH": 239, + "RPL_STATSVLINE": 240, + "RPL_STATSLLINE": 241, + "RPL_STATSUPTIME": 242, + "RPL_STATSOLINE": 243, + "RPL_STATSHLINE": 244, + "RPL_STATSSLINE": 245, + "RPL_STATSPING": 246, + "RPL_STATSBLINE": 247, + "RPL_STATSDEFINE": 248, + "RPL_STATSDEBUG": 249, + "RPL_STATSDLINE": 250, + "RPL_STATSCONN": 250, + "RPL_LUSERCLIENT": 251, + "RPL_LUSEROP": 252, + "RPL_LUSERUNKNOWN": 253, + "RPL_LUSERCHANNELS": 254, + "RPL_LUSERME": 255, + "RPL_ADMINME": 256, + "RPL_ADMINLOC1": 257, + "RPL_ADMINLOC2": 258, + "RPL_ADMINEMAIL": 259, + "RPL_TRACELOG": 261, + "RPL_TRACEPING": 262, + "RPL_TRACEEND": 262, + "RPL_TRYAGAIN": 263, + "RPL_LOCALUSERS": 265, + "RPL_GLOBALUSERS": 266, + "RPL_START_NETSTAT": 267, + "RPL_NETSTAT": 268, + "RPL_END_NETSTAT": 269, + "RPL_PRIVS": 270, + "RPL_SILELIST": 271, + "RPL_ENDOFSILELIST": 272, + "RPL_NOTIFY": 273, + "RPL_ENDNOTIFY": 274, + "RPL_STATSDELTA": 274, + "RPL_VCHANEXIST": 276, + "RPL_VCHANLIST": 277, + "RPL_VCHANHELP": 278, + "RPL_GLIST": 280, + "RPL_ENDOFGLIST": 281, + "RPL_ACCEPTLIST": 281, + "RPL_ENDOFACCEPT": 282, + "RPL_JUPELIST": 282, + "RPL_ENDOFJUPELIST": 283, + "RPL_FEATURE": 284, + "RPL_GLIST_HASH": 285, + "RPL_CHANINFO_HANDLE": 285, + "RPL_NEWHOSTIS": 285, + "RPL_CHANINFO_USERS": 286, + "RPL_CHKHEAD": 286, + "RPL_CHANINFO_CHOPS": 287, + "RPL_CHANUSER": 287, + "RPL_CHANINFO_VOICES": 288, + "RPL_PATCHHEAD": 288, + "RPL_CHANINFO_AWAY": 289, + "RPL_PATCHCON": 289, + "RPL_CHANINFO_OPERS": 290, + "RPL_HELPHDR": 290, + "RPL_DATASTR": 290, + "RPL_CHANINFO_BANNED": 291, + "RPL_HELPOP": 291, + "RPL_ENDOFCHECK": 291, + "RPL_CHANINFO_BANS": 292, + "RPL_HELPTLR": 292, + "RPL_CHANINFO_INVITE": 293, + "RPL_HELPHLP": 293, + "RPL_CHANINFO_INVITES": 294, + "RPL_HELPFWD": 294, + "RPL_CHANINFO_KICK": 295, + "RPL_HELPIGN": 295, + "RPL_CHANINFO_KICKS": 296, + "RPL_END_CHANINFO": 299, + "RPL_NONE": 300, + "RPL_AWAY": 301, + "RPL_USERHOST": 302, + "RPL_ISON": 303, + "RPL_TEXT": 304, + "RPL_UNAWAY": 305, + "RPL_NOWAWAY": 306, + "RPL_WHOISREGNICK": 307, + "RPL_SUSERHOST": 307, + "RPL_NOTIFYACTION": 308, + "RPL_WHOISADMIN": 308, + "RPL_NICKTRACE": 309, + "RPL_WHOISSADMIN": 309, + "RPL_WHOISHELPER": 309, + "RPL_WHOISSVCMSG": 310, + "RPL_WHOISHELPOP": 310, + "RPL_WHOISSERVICE": 310, + "RPL_WHOISUSER": 311, + "RPL_WHOISSERVER": 312, + "RPL_WHOISOPERATOR": 313, + "RPL_WHOWASUSER": 314, + "RPL_ENDOFWHO": 315, + "RPL_WHOISCHANOP": 316, + "RPL_WHOISIDLE": 317, + "RPL_ENDOFWHOIS": 318, + "RPL_WHOISCHANNELS": 319, + "RPL_WHOISVIRT": 320, + "RPL_WHOIS_HIDDEN": 320, + "RPL_WHOISSPECIAL": 320, + "RPL_LISTSTART": 321, + "RPL_LIST": 322, + "RPL_LISTEND": 323, + "RPL_CHANNELMODEIS": 324, + "RPL_UNIQOPIS": 325, + "RPL_CHANNELPASSIS": 325, + "RPL_NOCHANPASS": 326, + "RPL_CHPASSUNKNOWN": 327, + "RPL_CHANNEL_URL": 328, + "RPL_CREATIONTIME": 329, + "RPL_WHOWAS_TIME": 330, + "RPL_WHOISACCOUNT": 330, + "RPL_NOTOPIC": 331, + "RPL_TOPIC": 332, + "RPL_TOPICWHOTIME": 333, + "RPL_LISTUSAGE": 334, + "RPL_COMMANDSYNTAX": 334, + "RPL_LISTSYNTAX": 334, + "RPL_CHANPASSOK": 338, + "RPL_WHOISACTUALLY": 338, + "RPL_BADCHANPASS": 339, + "RPL_INVITING": 341, + "RPL_SUMMONING": 342, + "RPL_INVITED": 345, + "RPL_INVITELIST": 346, + "RPL_ENDOFINVITELIST": 347, + "RPL_EXCEPTLIST": 348, + "RPL_ENDOFEXCEPTLIST": 349, + "RPL_VERSION": 351, + "RPL_WHOREPLY": 352, + "RPL_NAMREPLY": 353, + "RPL_WHOSPCRPL": 354, + "RPL_NAMREPLY_": 355, + "RPL_KILLDONE": 361, + "RPL_CLOSING": 362, + "RPL_CLOSEEND": 363, + "RPL_LINKS": 364, + "RPL_ENDOFLINKS": 365, + "RPL_ENDOFNAMES": 366, + "RPL_BANLIST": 367, + "RPL_ENDOFBANLIST": 368, + "RPL_ENDOFWHOWAS": 369, + "RPL_INFO": 371, + "RPL_MOTD": 372, + "RPL_INFOSTART": 373, + "RPL_ENDOFINFO": 374, + "RPL_MOTDSTART": 375, + "RPL_ENDOFMOTD": 376, + "RPL_KICKEXPIRED": 377, + "RPL_SPAM": 377, + "RPL_BANEXPIRED": 378, + "RPL_WHOISHOST": 378, + "RPL_KICKLINKED": 379, + "RPL_WHOISMODES": 379, + "RPL_BANLINKED": 380, + "RPL_YOURHELPER": 380, + "RPL_YOUREOPER": 381, + "RPL_REHASHING": 382, + "RPL_YOURESERVICE": 383, + "RPL_MYPORTIS": 384, + "RPL_NOTOPERANYMORE": 385, + "RPL_QLIST": 386, + "RPL_IRCOPS": 386, + "RPL_ENDOFQLIST": 387, + "RPL_ENDOFIRCOPS": 387, + "RPL_ALIST": 388, + "RPL_ENDOFALIST": 389, + "RPL_TIME": 391, + "RPL_USERSSTART": 392, + "RPL_USERS": 393, + "RPL_ENDOFUSERS": 394, + "RPL_NOUSERS": 395, + "RPL_HOSTHIDDEN": 396, + "ERR_UNKNOWNERROR": 400, + "ERR_NOSUCHNICK": 401, + "ERR_NOSUCHSERVER": 402, + "ERR_NOSUCHCHANNEL": 403, + "ERR_CANNOTSENDTOCHAN": 404, + "ERR_TOOMANYCHANNELS": 405, + "ERR_WASNOSUCHNICK": 406, + "ERR_TOOMANYTARGETS": 407, + "ERR_NOSUCHSERVICE": 408, + "ERR_NOCOLORSONCHAN": 408, + "ERR_NOORIGIN": 409, + "ERR_NORECIPIENT": 411, + "ERR_NOTEXTTOSEND": 412, + "ERR_NOTOPLEVEL": 413, + "ERR_WILDTOPLEVEL": 414, + "ERR_BADMASK": 415, + "ERR_TOOMANYMATCHES": 416, + "ERR_QUERYTOOLONG": 416, + "ERR_LENGTHTRUNCATED": 419, + "ERR_UNKNOWNCOMMAND": 421, + "ERR_NOMOTD": 422, + "ERR_NOADMININFO": 423, + "ERR_FILEERROR": 424, + "ERR_NOOPERMOTD": 425, + "ERR_TOOMANYAWAY": 429, + "ERR_EVENTNICKCHANGE": 430, + "ERR_NONICKNAMEGIVEN": 431, + "ERR_ERRONEUSNICKNAME": 432, + "ERR_NICKNAMEINUSE": 433, + "ERR_SERVICENAMEINUSE": 434, + "ERR_NORULES": 434, + "ERR_SERVICECONFUSED": 435, + "ERR_BANONCHAN": 435, + "ERR_NICKCOLLISION": 436, + "ERR_UNAVAILRESOURCE": 437, + "ERR_BANNICKCHANGE": 437, + "ERR_NICKTOOFAST": 438, + "ERR_DEAD": 438, + "ERR_TARGETTOOFAST": 439, + "ERR_SERVICESDOWN": 440, + "ERR_USERNOTINCHANNEL": 441, + "ERR_NOTONCHANNEL": 442, + "ERR_USERONCHANNEL": 443, + "ERR_NOLOGIN": 444, + "ERR_SUMMONDISABLED": 445, + "ERR_USERSDISABLED": 446, + "ERR_NONICKCHANGE": 447, + "ERR_NOTIMPLEMENTED": 449, + "ERR_NOTREGISTERED": 451, + "ERR_IDCOLLISION": 452, + "ERR_NICKLOST": 453, + "ERR_HOSTILENAME": 455, + "ERR_ACCEPTFULL": 456, + "ERR_ACCEPTEXIST": 457, + "ERR_ACCEPTNOT": 458, + "ERR_NOHIDING": 459, + "ERR_NOTFORHALFOPS": 460, + "ERR_NEEDMOREPARAMS": 461, + "ERR_ALREADYREGISTERED": 462, + "ERR_NOPERMFORHOST": 463, + "ERR_PASSWDMISMATCH": 464, + "ERR_YOUREBANNEDCREEP": 465, + "ERR_YOUWILLBEBANNED": 466, + "ERR_KEYSET": 467, + "ERR_INVALIDUSERNAME": 468, + "ERR_ONLYSERVERSCANCHANGE": 468, + "ERR_LINKSET": 469, + "ERR_LINKCHANNEL": 470, + "ERR_KICKEDFROMCHAN": 470, + "ERR_CHANNELISFULL": 471, + "ERR_UNKNOWNMODE": 472, + "ERR_INVITEONLYCHAN": 473, + "ERR_BANNEDFROMCHAN": 474, + "ERR_BADCHANNELKEY": 475, + "ERR_BADCHANMASK": 476, + "ERR_NOCHANMODES": 477, + "ERR_NEEDREGGEDNICK": 477, + "ERR_BANLISTFULL": 478, + "ERR_BADCHANNAME": 479, + "ERR_LINKFAIL": 479, + "ERR_NOULINE": 480, + "ERR_CANNOTKNOCK": 480, + "ERR_NOPRIVILEGES": 481, + "ERR_CHANOPRIVSNEEDED": 482, + "ERR_CANTKILLSERVER": 483, + "ERR_RESTRICTED": 484, + "ERR_ISCHANSERVICE": 484, + "ERR_DESYNC": 484, + "ERR_ATTACKDENY": 484, + "ERR_UNIQOPRIVSNEEDED": 485, + "ERR_KILLDENY": 485, + "ERR_CANTKICKADMIN": 485, + "ERR_ISREALSERVICE": 485, + "ERR_NONONREG": 486, + "ERR_HTMDISABLED": 486, + "ERR_ACCOUNTONLY": 486, + "ERR_CHANTOORECENT": 487, + "ERR_MSGSERVICES": 487, + "ERR_TSLESSCHAN": 488, + "ERR_VOICENEEDED": 489, + "ERR_SECUREONLYCHAN": 489, + "ERR_NOOPERHOST": 491, + "ERR_NOSERVICEHOST": 492, + "ERR_NOFEATURE": 493, + "ERR_BADFEATURE": 494, + "ERR_BADLOGTYPE": 495, + "ERR_BADLOGSYS": 496, + "ERR_BADLOGVALUE": 497, + "ERR_ISOPERLCHAN": 498, + "ERR_CHANOWNPRIVNEEDED": 499, + "ERR_UMODEUNKNOWNFLAG": 501, + "ERR_USERSDONTMATCH": 502, + "ERR_GHOSTEDCLIENT": 503, + "ERR_VWORLDWARN": 503, + "ERR_USERNOTONSERV": 504, + "ERR_SILELISTFULL": 511, + "ERR_TOOMANYWATCH": 512, + "ERR_BADPING": 513, + "ERR_INVALID_ERROR": 514, + "ERR_TOOMANYDCC": 514, + "ERR_BADEXPIRE": 515, + "ERR_DONTCHEAT": 516, + "ERR_DISABLED": 517, + "ERR_NOINVITE": 518, + "ERR_LONGMASK": 518, + "ERR_ADMONLY": 519, + "ERR_TOOMANYUSERS": 519, + "ERR_OPERONLY": 520, + "ERR_MASKTOOWIDE": 520, + "ERR_WHOTRUNC": 520, + "ERR_LISTSYNTAX": 521, + "ERR_WHOSYNTAX": 522, + "ERR_WHOLIMEXCEED": 523, + "ERR_QUARANTINED": 524, + "ERR_OPERSPVERIFY": 524, + "ERR_REMOTEPFX": 525, + "ERR_PFXUNROUTABLE": 526, + "ERR_BADHOSTMASK": 550, + "ERR_HOSTUNAVAIL": 551, + "ERR_USINGSLINE": 552, + "ERR_STATSSLINE": 553, + "RPL_LOGON": 600, + "RPL_LOGOFF": 601, + "RPL_WATCHOFF": 602, + "RPL_WATCHSTAT": 603, + "RPL_NOWON": 604, + "RPL_NOWOFF": 605, + "RPL_WATCHLIST": 606, + "RPL_ENDOFWATCHLIST": 607, + "RPL_WATCHCLEAR": 608, + "RPL_ISOPER": 610, + "RPL_ISLOCOP": 611, + "RPL_ISNOTOPER": 612, + "RPL_ENDOFISOPER": 613, + "RPL_DCCSTATUS": 617, + "RPL_DCCLIST": 618, + "RPL_ENDOFDCCLIST": 619, + "RPL_WHOWASHOST": 619, + "RPL_DCCINFO": 620, + "RPL_ENDOFO": 626, + "RPL_SETTINGS": 630, + "RPL_ENDOFSETTINGS": 631, + "RPL_DUMPING": 640, + "RPL_DUMPRPL": 641, + "RPL_EODUMP": 642, + "RPL_TRACEROUTE_HOP": 660, + "RPL_TRACEROUTE_START": 661, + "RPL_MODECHANGEWARN": 662, + "RPL_CHANREDIR": 663, + "RPL_SERVMODEIS": 664, + "RPL_OTHERUMODEIS": 665, + "RPL_ENDOF_GENERIC": 666, + "RPL_WHOWASDETAILS": 670, + "RPL_WHOISSECURE": 671, + "RPL_UNKNOWNMODES": 672, + "RPL_CANNOTSETMODES": 673, + "RPL_LUSERSTAFF": 678, + "RPL_TIMEONSERVERIS": 679, + "RPL_NETWORKS": 682, + "RPL_YOURLANGUAGEIS": 687, + "RPL_LANGUAGE": 688, + "RPL_WHOISSTAFF": 689, + "RPL_WHOISLANGUAGE": 690, + "RPL_HELPSTART": 704, + "RPL_HELPTXT": 705, + "RPL_ENDOFHELP": 706, + "RPL_ETRACEFULL": 708, + "RPL_ETRACE": 709, + "RPL_KNOCK": 710, + "RPL_KNOCKDLVR": 711, + "ERR_TOOMANYKNOCK": 712, + "ERR_CHANOPEN": 713, + "ERR_KNOCKONCHAN": 714, + "ERR_KNOCKDISABLED": 715, + "RPL_TARGUMODEG": 716, + "RPL_TARGNOTIFY": 717, + "RPL_UMODEGMSG": 718, + "RPL_ENDOFOMOTD": 722, + "ERR_NOPRIVS": 723, + "RPL_TESTMARK": 724, + "RPL_TESTLINE": 725, + "RPL_NOTESTLINE": 726, + "RPL_XINFO": 771, + "RPL_XINFOSTART": 773, + "RPL_XINFOEND": 774, + "ERR_CANNOTDOCOMMAND": 972, + "ERR_CANNOTCHANGEUMODE": 973, + "ERR_CANNOTCHANGECHANMODE": 974, + "ERR_CANNOTCHANGESERVERMODE": 975, + "ERR_CANNOTSENDTONICK": 976, + "ERR_UNKNOWNSERVERMODE": 977, + "ERR_SERVERMODELOCK": 979, + "ERR_BADCHARENCODING": 980, + "ERR_TOOMANYLANGUAGES": 981, + "ERR_NOLANGUAGE": 982, + "ERR_TEXTTOOSHORT": 983, + "ERR_NUMERIC_ERR": 999 + } + } + Method { name: "version"; type: "string" } + Method { + name: "codeToString" + type: "string" + Parameter { name: "code"; type: "int" } + } + Method { + name: "nickFromPrefix" + type: "string" + Parameter { name: "prefix"; type: "string" } + } + Method { + name: "identFromPrefix" + type: "string" + Parameter { name: "prefix"; type: "string" } + } + Method { + name: "hostFromPrefix" + type: "string" + Parameter { name: "prefix"; type: "string" } + } + Method { name: "registerMetaTypes" } + } + Component { + name: "IrcBuffer" + prototype: "QObject" + exports: [ + "Communi/IrcBuffer 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Property { name: "title"; type: "string"; isReadonly: true } + Property { name: "name"; type: "string" } + Property { name: "prefix"; type: "string" } + Property { name: "connection"; type: "IrcConnection"; isReadonly: true; isPointer: true } + Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } + Property { name: "model"; type: "IrcBufferModel"; isReadonly: true; isPointer: true } + Property { name: "active"; type: "bool"; isReadonly: true } + Property { name: "channel"; type: "bool"; isReadonly: true } + Property { name: "sticky"; type: "bool" } + Property { name: "persistent"; type: "bool" } + Signal { + name: "titleChanged" + Parameter { name: "title"; type: "string" } + } + Signal { + name: "nameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "prefixChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "messageReceived" + Parameter { name: "message"; type: "IrcMessage"; isPointer: true } + } + Signal { + name: "destroyed" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "activeChanged" + Parameter { name: "active"; type: "bool" } + } + Signal { + name: "stickyChanged" + Parameter { name: "sticky"; type: "bool" } + } + Signal { + name: "persistentChanged" + Parameter { name: "persistent"; type: "bool" } + } + Method { + name: "setName" + Parameter { name: "name"; type: "string" } + } + Method { + name: "setPrefix" + Parameter { name: "prefix"; type: "string" } + } + Method { + name: "receiveMessage" + Parameter { name: "message"; type: "IrcMessage"; isPointer: true } + } + Method { name: "toChannel"; type: "IrcChannel*" } + Method { + name: "sendCommand" + type: "bool" + Parameter { name: "command"; type: "IrcCommand"; isPointer: true } + } + } + Component { + name: "IrcBufferModel" + prototype: "QAbstractListModel" + exports: [ + "Communi/IrcBufferModel 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Property { name: "count"; type: "int"; isReadonly: true } + Property { name: "sortOrder"; type: "Qt::SortOrder" } + Property { name: "sortMethod"; type: "Irc::SortMethod" } + Property { name: "channels"; type: "QStringList"; isReadonly: true } + Property { name: "displayRole"; type: "Irc::DataRole" } + Property { name: "buffers"; type: "QList"; isReadonly: true } + Property { name: "connection"; type: "IrcConnection"; isPointer: true } + Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } + Property { name: "bufferPrototype"; type: "IrcBuffer"; isPointer: true } + Property { name: "channelPrototype"; type: "IrcChannel"; isPointer: true } + Signal { + name: "countChanged" + Parameter { name: "count"; type: "int" } + } + Signal { + name: "added" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "removed" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "aboutToBeAdded" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "aboutToBeRemoved" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "buffersChanged" + Parameter { name: "buffers"; type: "QList" } + } + Signal { + name: "channelsChanged" + Parameter { name: "channels"; type: "QStringList" } + } + Signal { + name: "connectionChanged" + Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } + } + Signal { + name: "networkChanged" + Parameter { name: "network"; type: "IrcNetwork"; isPointer: true } + } + Signal { + name: "messageIgnored" + Parameter { name: "message"; type: "IrcMessage"; isPointer: true } + } + Signal { + name: "bufferPrototypeChanged" + Parameter { name: "prototype"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "channelPrototypeChanged" + Parameter { name: "prototype"; type: "IrcChannel"; isPointer: true } + } + Method { name: "clear" } + Method { + name: "sort" + Parameter { name: "column"; type: "int" } + Parameter { name: "order"; type: "Qt::SortOrder" } + } + Method { + name: "sort" + Parameter { name: "column"; type: "int" } + } + Method { name: "sort" } + Method { + name: "sort" + Parameter { name: "method"; type: "Irc::SortMethod" } + Parameter { name: "order"; type: "Qt::SortOrder" } + } + Method { + name: "sort" + Parameter { name: "method"; type: "Irc::SortMethod" } + } + Method { + name: "get" + type: "IrcBuffer*" + Parameter { name: "index"; type: "int" } + } + Method { + name: "find" + type: "IrcBuffer*" + Parameter { name: "title"; type: "string" } + } + Method { + name: "contains" + type: "bool" + Parameter { name: "title"; type: "string" } + } + Method { + name: "indexOf" + type: "int" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Method { + name: "add" + type: "IrcBuffer*" + Parameter { name: "title"; type: "string" } + } + Method { + name: "add" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Method { + name: "remove" + Parameter { name: "title"; type: "string" } + } + Method { + name: "remove" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + } + Component { + name: "IrcChannel" + prototype: "IrcBuffer" + exports: [ + "Communi/IrcChannel 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Property { name: "mode"; type: "string"; isReadonly: true } + Property { name: "topic"; type: "string"; isReadonly: true } + Signal { + name: "modeChanged" + Parameter { name: "mode"; type: "string" } + } + Signal { + name: "topicChanged" + Parameter { name: "topic"; type: "string" } + } + Method { + name: "part" + Parameter { name: "reason"; type: "string" } + } + Method { name: "part" } + } + Component { + name: "IrcCommand" + prototype: "QObject" + exports: [ + "Communi/IrcCommand 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Enum { + name: "Type" + values: { + "Admin": 0, + "Away": 1, + "Capability": 2, + "CtcpAction": 3, + "CtcpReply": 4, + "CtcpRequest": 5, + "Custom": 6, + "Info": 7, + "Invite": 8, + "Join": 9, + "Kick": 10, + "Knock": 11, + "List": 12, + "Message": 13, + "Mode": 14, + "Motd": 15, + "Names": 16, + "Nick": 17, + "Notice": 18, + "Part": 19, + "Ping": 20, + "Pong": 21, + "Quit": 22, + "Quote": 23, + "Stats": 24, + "Time": 25, + "Topic": 26, + "Trace": 27, + "Users": 28, + "Version": 29, + "Who": 30, + "Whois": 31, + "Whowas": 32 + } + } + Property { name: "parameters"; type: "QStringList" } + Property { name: "encoding"; type: "QByteArray" } + Property { name: "type"; type: "Type" } + Method { + name: "toMessage" + type: "IrcMessage*" + Parameter { name: "prefix"; type: "string" } + Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } + } + Method { + name: "createAdmin" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createAdmin"; type: "IrcCommand*" } + Method { + name: "createAway" + type: "IrcCommand*" + Parameter { name: "reason"; type: "string" } + } + Method { name: "createAway"; type: "IrcCommand*" } + Method { + name: "createCapability" + type: "IrcCommand*" + Parameter { name: "subCommand"; type: "string" } + Parameter { name: "capability"; type: "string" } + } + Method { + name: "createCapability" + type: "IrcCommand*" + Parameter { name: "subCommand"; type: "string" } + Parameter { name: "capabilities"; type: "QStringList" } + } + Method { + name: "createCapability" + type: "IrcCommand*" + Parameter { name: "subCommand"; type: "string" } + } + Method { + name: "createCtcpAction" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "action"; type: "string" } + } + Method { + name: "createCtcpReply" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "reply"; type: "string" } + } + Method { + name: "createCtcpRequest" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "request"; type: "string" } + } + Method { + name: "createInfo" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createInfo"; type: "IrcCommand*" } + Method { + name: "createInvite" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createJoin" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "key"; type: "string" } + } + Method { + name: "createJoin" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createJoin" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + Parameter { name: "keys"; type: "QStringList" } + } + Method { + name: "createJoin" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + } + Method { + name: "createKick" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "user"; type: "string" } + Parameter { name: "reason"; type: "string" } + } + Method { + name: "createKick" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "user"; type: "string" } + } + Method { + name: "createKnock" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "message"; type: "string" } + } + Method { + name: "createKnock" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createList" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + Parameter { name: "server"; type: "string" } + } + Method { + name: "createList" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + } + Method { name: "createList"; type: "IrcCommand*" } + Method { + name: "createMessage" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "message"; type: "string" } + } + Method { + name: "createMode" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "mode"; type: "string" } + Parameter { name: "arg"; type: "string" } + } + Method { + name: "createMode" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "mode"; type: "string" } + } + Method { + name: "createMode" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + } + Method { + name: "createMotd" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createMotd"; type: "IrcCommand*" } + Method { + name: "createNames" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "server"; type: "string" } + } + Method { + name: "createNames" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { name: "createNames"; type: "IrcCommand*" } + Method { + name: "createNames" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + Parameter { name: "server"; type: "string" } + } + Method { + name: "createNames" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + } + Method { + name: "createNick" + type: "IrcCommand*" + Parameter { name: "nick"; type: "string" } + } + Method { + name: "createNotice" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "notice"; type: "string" } + } + Method { + name: "createPart" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "reason"; type: "string" } + } + Method { + name: "createPart" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createPart" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + Parameter { name: "reason"; type: "string" } + } + Method { + name: "createPart" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + } + Method { + name: "createPing" + type: "IrcCommand*" + Parameter { name: "argument"; type: "string" } + } + Method { + name: "createPong" + type: "IrcCommand*" + Parameter { name: "argument"; type: "string" } + } + Method { + name: "createQuit" + type: "IrcCommand*" + Parameter { name: "reason"; type: "string" } + } + Method { name: "createQuit"; type: "IrcCommand*" } + Method { + name: "createQuote" + type: "IrcCommand*" + Parameter { name: "raw"; type: "string" } + } + Method { + name: "createQuote" + type: "IrcCommand*" + Parameter { name: "parameters"; type: "QStringList" } + } + Method { + name: "createStats" + type: "IrcCommand*" + Parameter { name: "query"; type: "string" } + Parameter { name: "server"; type: "string" } + } + Method { + name: "createStats" + type: "IrcCommand*" + Parameter { name: "query"; type: "string" } + } + Method { + name: "createTime" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createTime"; type: "IrcCommand*" } + Method { + name: "createTopic" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "topic"; type: "string" } + } + Method { + name: "createTopic" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createTrace" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + } + Method { name: "createTrace"; type: "IrcCommand*" } + Method { + name: "createUsers" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createUsers"; type: "IrcCommand*" } + Method { + name: "createVersion" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + } + Method { name: "createVersion"; type: "IrcCommand*" } + Method { + name: "createWho" + type: "IrcCommand*" + Parameter { name: "mask"; type: "string" } + Parameter { name: "operators"; type: "bool" } + } + Method { + name: "createWho" + type: "IrcCommand*" + Parameter { name: "mask"; type: "string" } + } + Method { + name: "createWhois" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + } + Method { + name: "createWhowas" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + Parameter { name: "count"; type: "int" } + } + Method { + name: "createWhowas" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + } + } + Component { + name: "IrcCommandParser" + prototype: "QObject" + exports: [ + "Communi/IrcCommandParser 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Enum { + name: "Details" + values: { + "Full": 0, + "NoTarget": 1, + "NoPrefix": 2, + "NoEllipsis": 4, + "NoParentheses": 8, + "NoBrackets": 16, + "NoAngles": 32, + "Visual": 7 + } + } + Property { name: "commands"; type: "QStringList"; isReadonly: true } + Property { name: "triggers"; type: "QStringList" } + Property { name: "channels"; type: "QStringList" } + Property { name: "target"; type: "string" } + Property { name: "tolerant"; type: "bool" } + Signal { + name: "commandsChanged" + Parameter { name: "commands"; type: "QStringList" } + } + Signal { + name: "triggersChanged" + Parameter { name: "triggers"; type: "QStringList" } + } + Signal { + name: "channelsChanged" + Parameter { name: "channels"; type: "QStringList" } + } + Signal { + name: "targetChanged" + Parameter { name: "target"; type: "string" } + } + Signal { + name: "tolerancyChanged" + Parameter { name: "tolerant"; type: "bool" } + } + Method { name: "clear" } + Method { name: "reset" } + Method { + name: "setTriggers" + Parameter { name: "triggers"; type: "QStringList" } + } + Method { + name: "setChannels" + Parameter { name: "channels"; type: "QStringList" } + } + Method { + name: "setTarget" + Parameter { name: "target"; type: "string" } + } + Method { + name: "syntax" + type: "string" + Parameter { name: "command"; type: "string" } + Parameter { name: "details"; type: "Details" } + } + Method { + name: "syntax" + type: "string" + Parameter { name: "command"; type: "string" } + } + Method { + name: "addCommand" + Parameter { name: "type"; type: "IrcCommand::Type" } + Parameter { name: "syntax"; type: "string" } + } + Method { + name: "removeCommand" + Parameter { name: "type"; type: "IrcCommand::Type" } + Parameter { name: "syntax"; type: "string" } + } + Method { + name: "removeCommand" + Parameter { name: "type"; type: "IrcCommand::Type" } + } + Method { + name: "parse" + type: "IrcCommand*" + Parameter { name: "input"; type: "string" } + } + } + Component { + name: "IrcConnection" + prototype: "QObject" + exports: [ + "Communi/IrcConnection 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Enum { + name: "Status" + values: { + "Inactive": 0, + "Waiting": 1, + "Connecting": 2, + "Connected": 3, + "Closing": 4, + "Closed": 5, + "Error": 6 + } + } + Property { name: "host"; type: "string" } + Property { name: "port"; type: "int" } + Property { name: "userName"; type: "string" } + Property { name: "nickName"; type: "string" } + Property { name: "realName"; type: "string" } + Property { name: "password"; type: "string" } + Property { name: "displayName"; type: "string" } + Property { name: "encoding"; type: "QByteArray" } + Property { name: "status"; type: "Status"; isReadonly: true } + Property { name: "active"; type: "bool"; isReadonly: true } + Property { name: "connected"; type: "bool"; isReadonly: true } + Property { name: "enabled"; type: "bool" } + Property { name: "reconnectDelay"; type: "int" } + Property { name: "socket"; type: "QAbstractSocket"; isPointer: true } + Property { name: "secure"; type: "bool" } + Property { name: "saslMechanism"; type: "string" } + Property { name: "supportedSaslMechanisms"; type: "QStringList"; isReadonly: true } + Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } + Signal { name: "connecting" } + Signal { + name: "nickNameReserved" + Parameter { name: "alternate"; type: "string"; isPointer: true } + } + Signal { name: "connected" } + Signal { name: "disconnected" } + Signal { + name: "statusChanged" + Parameter { name: "status"; type: "IrcConnection::Status" } + } + Signal { + name: "socketError" + Parameter { name: "error"; type: "QAbstractSocket::SocketError" } + } + Signal { + name: "socketStateChanged" + Parameter { name: "state"; type: "QAbstractSocket::SocketState" } + } + Signal { + name: "messageReceived" + Parameter { name: "message"; type: "IrcMessage"; isPointer: true } + } + Signal { + name: "capabilityMessageReceived" + Parameter { name: "message"; type: "IrcCapabilityMessage"; isPointer: true } + } + Signal { + name: "errorMessageReceived" + Parameter { name: "message"; type: "IrcErrorMessage"; isPointer: true } + } + Signal { + name: "inviteMessageReceived" + Parameter { name: "message"; type: "IrcInviteMessage"; isPointer: true } + } + Signal { + name: "joinMessageReceived" + Parameter { name: "message"; type: "IrcJoinMessage"; isPointer: true } + } + Signal { + name: "kickMessageReceived" + Parameter { name: "message"; type: "IrcKickMessage"; isPointer: true } + } + Signal { + name: "modeMessageReceived" + Parameter { name: "message"; type: "IrcModeMessage"; isPointer: true } + } + Signal { + name: "namesMessageReceived" + Parameter { name: "message"; type: "IrcNamesMessage"; isPointer: true } + } + Signal { + name: "nickMessageReceived" + Parameter { name: "message"; type: "IrcNickMessage"; isPointer: true } + } + Signal { + name: "noticeMessageReceived" + Parameter { name: "message"; type: "IrcNoticeMessage"; isPointer: true } + } + Signal { + name: "numericMessageReceived" + Parameter { name: "message"; type: "IrcNumericMessage"; isPointer: true } + } + Signal { + name: "motdMessageReceived" + Parameter { name: "message"; type: "IrcMotdMessage"; isPointer: true } + } + Signal { + name: "partMessageReceived" + Parameter { name: "message"; type: "IrcPartMessage"; isPointer: true } + } + Signal { + name: "pingMessageReceived" + Parameter { name: "message"; type: "IrcPingMessage"; isPointer: true } + } + Signal { + name: "pongMessageReceived" + Parameter { name: "message"; type: "IrcPongMessage"; isPointer: true } + } + Signal { + name: "privateMessageReceived" + Parameter { name: "message"; type: "IrcPrivateMessage"; isPointer: true } + } + Signal { + name: "quitMessageReceived" + Parameter { name: "message"; type: "IrcQuitMessage"; isPointer: true } + } + Signal { + name: "topicMessageReceived" + Parameter { name: "message"; type: "IrcTopicMessage"; isPointer: true } + } + Signal { + name: "hostChanged" + Parameter { name: "host"; type: "string" } + } + Signal { + name: "portChanged" + Parameter { name: "port"; type: "int" } + } + Signal { + name: "userNameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "nickNameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "realNameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "passwordChanged" + Parameter { name: "password"; type: "string" } + } + Signal { + name: "displayNameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "reconnectDelayChanged" + Parameter { name: "seconds"; type: "int" } + } + Signal { + name: "enabledChanged" + Parameter { name: "enabled"; type: "bool" } + } + Signal { + name: "secureChanged" + Parameter { name: "secure"; type: "bool" } + } + Signal { + name: "saslMechanismChanged" + Parameter { name: "mechanism"; type: "string" } + } + Method { name: "open" } + Method { name: "close" } + Method { + name: "quit" + Parameter { name: "reason"; type: "string" } + } + Method { name: "quit" } + Method { + name: "setEnabled" + Parameter { name: "enabled"; type: "bool" } + } + Method { name: "setEnabled" } + Method { + name: "setDisabled" + Parameter { name: "disabled"; type: "bool" } + } + Method { name: "setDisabled" } + Method { + name: "sendCommand" + type: "bool" + Parameter { name: "command"; type: "IrcCommand"; isPointer: true } + } + Method { + name: "sendData" + type: "bool" + Parameter { name: "data"; type: "QByteArray" } + } + Method { + name: "sendRaw" + type: "bool" + Parameter { name: "message"; type: "string" } + } + } + Component { + name: "IrcLagTimer" + prototype: "QObject" + exports: [ + "Communi/IrcLagTimer 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Property { name: "lag"; type: "qint64"; isReadonly: true } + Property { name: "interval"; type: "int" } + Property { name: "connection"; type: "IrcConnection"; isPointer: true } + Signal { + name: "lagChanged" + Parameter { name: "lag"; type: "qint64" } + } + } + Component { + name: "IrcMessage" + prototype: "QObject" + exports: [ + "Communi/IrcMessage 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Enum { + name: "Type" + values: { + "Unknown": 0, + "Capability": 1, + "Error": 2, + "Invite": 3, + "Join": 4, + "Kick": 5, + "Mode": 6, + "Motd": 7, + "Names": 8, + "Nick": 9, + "Notice": 10, + "Numeric": 11, + "Part": 12, + "Ping": 13, + "Pong": 14, + "Private": 15, + "Quit": 16, + "Topic": 17 + } + } + Enum { + name: "Flag" + values: { + "None": 0, + "Own": 1, + "Identified": 2, + "Unidentified": 4 + } + } + Enum { + name: "Flags" + values: { + "None": 0, + "Own": 1, + "Identified": 2, + "Unidentified": 4 + } + } + Property { name: "connection"; type: "IrcConnection"; isReadonly: true; isPointer: true } + Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } + Property { name: "type"; type: "Type"; isReadonly: true } + Property { name: "flags"; type: "Flags"; isReadonly: true } + Property { name: "valid"; type: "bool"; isReadonly: true } + Property { name: "command"; type: "string"; isReadonly: true } + Property { name: "prefix"; type: "string" } + Property { name: "nick"; type: "string"; isReadonly: true } + Property { name: "ident"; type: "string"; isReadonly: true } + Property { name: "host"; type: "string"; isReadonly: true } + Property { name: "parameters"; type: "QStringList" } + Property { name: "timeStamp"; type: "QDateTime" } + Method { name: "toData"; type: "QByteArray" } + Method { + name: "fromData" + type: "IrcMessage*" + Parameter { name: "data"; type: "QByteArray" } + Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } + } + Method { + name: "fromParameters" + type: "IrcMessage*" + Parameter { name: "prefix"; type: "string" } + Parameter { name: "command"; type: "string" } + Parameter { name: "parameters"; type: "QStringList" } + Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } + } + } + Component { + name: "IrcNetwork" + prototype: "QObject" + exports: [ + "Communi/IrcNetwork 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Enum { + name: "ModeType" + values: { + "TypeA": 1, + "TypeB": 2, + "TypeC": 4, + "TypeD": 8, + "AllTypes": 15 + } + } + Enum { + name: "ModeTypes" + values: { + "TypeA": 1, + "TypeB": 2, + "TypeC": 4, + "TypeD": 8, + "AllTypes": 15 + } + } + Enum { + name: "Limit" + values: { + "NickLength": 0, + "ChannelLength": 1, + "TopicLength": 2, + "MessageLength": 3, + "KickReasonLength": 4, + "AwayReasonLength": 5, + "ModeCount": 6 + } + } + Property { name: "initialized"; type: "bool"; isReadonly: true } + Property { name: "name"; type: "string"; isReadonly: true } + Property { name: "modes"; type: "QStringList"; isReadonly: true } + Property { name: "prefixes"; type: "QStringList"; isReadonly: true } + Property { name: "channelTypes"; type: "QStringList"; isReadonly: true } + Property { name: "availableCapabilities"; type: "QStringList"; isReadonly: true } + Property { name: "requestedCapabilities"; type: "QStringList" } + Property { name: "activeCapabilities"; type: "QStringList"; isReadonly: true } + Signal { name: "initialized" } + Signal { + name: "nameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "modesChanged" + Parameter { name: "modes"; type: "QStringList" } + } + Signal { + name: "prefixesChanged" + Parameter { name: "prefixes"; type: "QStringList" } + } + Signal { + name: "channelTypesChanged" + Parameter { name: "types"; type: "QStringList" } + } + Signal { + name: "availableCapabilitiesChanged" + Parameter { name: "capabilities"; type: "QStringList" } + } + Signal { + name: "requestedCapabilitiesChanged" + Parameter { name: "capabilities"; type: "QStringList" } + } + Signal { + name: "activeCapabilitiesChanged" + Parameter { name: "capabilities"; type: "QStringList" } + } + Signal { name: "requestingCapabilities" } + Method { + name: "requestCapability" + type: "bool" + Parameter { name: "capability"; type: "string" } + } + Method { + name: "requestCapabilities" + type: "bool" + Parameter { name: "capabilities"; type: "QStringList" } + } + Method { + name: "setRequestedCapabilities" + Parameter { name: "capabilities"; type: "QStringList" } + } + Method { + name: "modeToPrefix" + type: "string" + Parameter { name: "mode"; type: "string" } + } + Method { + name: "prefixToMode" + type: "string" + Parameter { name: "prefix"; type: "string" } + } + Method { + name: "isChannel" + type: "bool" + Parameter { name: "name"; type: "string" } + } + Method { + name: "channelModes" + type: "QStringList" + Parameter { name: "types"; type: "IrcNetwork::ModeTypes" } + } + Method { + name: "numericLimit" + type: "int" + Parameter { name: "limit"; type: "IrcNetwork::Limit" } + } + Method { + name: "modeLimit" + type: "int" + Parameter { name: "mode"; type: "string" } + } + Method { + name: "channelLimit" + type: "int" + Parameter { name: "type"; type: "string" } + } + Method { + name: "targetLimit" + type: "int" + Parameter { name: "command"; type: "string" } + } + Method { + name: "hasCapability" + type: "bool" + Parameter { name: "capability"; type: "string" } + } + Method { + name: "isCapable" + type: "bool" + Parameter { name: "capability"; type: "string" } + } + } + Component { + name: "IrcPalette" + prototype: "QObject" + exports: [ + "Communi/IrcPalette 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Property { name: "white"; type: "string" } + Property { name: "black"; type: "string" } + Property { name: "blue"; type: "string" } + Property { name: "green"; type: "string" } + Property { name: "red"; type: "string" } + Property { name: "brown"; type: "string" } + Property { name: "purple"; type: "string" } + Property { name: "orange"; type: "string" } + Property { name: "yellow"; type: "string" } + Property { name: "lightGreen"; type: "string" } + Property { name: "cyan"; type: "string" } + Property { name: "lightCyan"; type: "string" } + Property { name: "lightBlue"; type: "string" } + Property { name: "pink"; type: "string" } + Property { name: "gray"; type: "string" } + Property { name: "lightGray"; type: "string" } + } + Component { + name: "IrcQmlFilter" + prototype: "QObject" + exports: [ + "Communi/IrcCommandFilter 3.0", + "Communi/IrcFilter 3.0", + "Communi/IrcMessageFilter 3.0" + ] + exportMetaObjectRevisions: [ + 0, + 0, + 0 + ] + Property { name: "connection"; type: "IrcConnection"; isPointer: true } + Signal { name: "connectionChanged" } + } + Component { + name: "IrcTextFormat" + prototype: "QObject" + exports: [ + "Communi/IrcTextFormat 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Property { name: "palette"; type: "IrcPalette"; isReadonly: true; isPointer: true } + Property { name: "urlPattern"; type: "string" } + Method { + name: "toHtml" + type: "string" + Parameter { name: "text"; type: "string" } + } + Method { + name: "toPlainText" + type: "string" + Parameter { name: "text"; type: "string" } + } + } + Component { + name: "IrcUser" + prototype: "QObject" + exports: [ + "Communi/IrcUser 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Property { name: "title"; type: "string"; isReadonly: true } + Property { name: "name"; type: "string"; isReadonly: true } + Property { name: "prefix"; type: "string"; isReadonly: true } + Property { name: "mode"; type: "string"; isReadonly: true } + Property { name: "channel"; type: "IrcChannel"; isReadonly: true; isPointer: true } + Signal { + name: "titleChanged" + Parameter { name: "title"; type: "string" } + } + Signal { + name: "nameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "prefixChanged" + Parameter { name: "prefix"; type: "string" } + } + Signal { + name: "modeChanged" + Parameter { name: "mode"; type: "string" } + } + } + Component { + name: "IrcUserModel" + prototype: "QAbstractListModel" + exports: [ + "Communi/IrcUserModel 3.0" + ] + exportMetaObjectRevisions: [ + 0 + ] + Property { name: "count"; type: "int"; isReadonly: true } + Property { name: "names"; type: "QStringList"; isReadonly: true } + Property { name: "users"; type: "QList"; isReadonly: true } + Property { name: "displayRole"; type: "Irc::DataRole" } + Property { name: "channel"; type: "IrcChannel"; isPointer: true } + Property { name: "sortMethod"; type: "Irc::SortMethod" } + Property { name: "sortOrder"; type: "Qt::SortOrder" } + Signal { + name: "added" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + Signal { + name: "removed" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + Signal { + name: "aboutToBeAdded" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + Signal { + name: "aboutToBeRemoved" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + Signal { + name: "countChanged" + Parameter { name: "count"; type: "int" } + } + Signal { + name: "namesChanged" + Parameter { name: "names"; type: "QStringList" } + } + Signal { + name: "usersChanged" + Parameter { name: "users"; type: "QList" } + } + Signal { + name: "channelChanged" + Parameter { name: "channel"; type: "IrcChannel"; isPointer: true } + } + Method { name: "clear" } + Method { + name: "sort" + Parameter { name: "column"; type: "int" } + Parameter { name: "order"; type: "Qt::SortOrder" } + } + Method { + name: "sort" + Parameter { name: "column"; type: "int" } + } + Method { name: "sort" } + Method { + name: "sort" + Parameter { name: "method"; type: "Irc::SortMethod" } + Parameter { name: "order"; type: "Qt::SortOrder" } + } + Method { + name: "sort" + Parameter { name: "method"; type: "Irc::SortMethod" } + } + Method { + name: "get" + type: "IrcUser*" + Parameter { name: "index"; type: "int" } + } + Method { + name: "find" + type: "IrcUser*" + Parameter { name: "name"; type: "string" } + } + Method { + name: "contains" + type: "bool" + Parameter { name: "name"; type: "string" } + } + Method { + name: "indexOf" + type: "int" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + } + Component { + name: "QAbstractItemModel" + prototype: "QObject" + Signal { + name: "dataChanged" + Parameter { name: "topLeft"; type: "QModelIndex" } + Parameter { name: "bottomRight"; type: "QModelIndex" } + } + Signal { + name: "headerDataChanged" + Parameter { name: "orientation"; type: "Qt::Orientation" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { name: "layoutChanged" } + Signal { name: "layoutAboutToBeChanged" } + Signal { + name: "rowsAboutToBeInserted" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "rowsInserted" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "rowsAboutToBeRemoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "rowsRemoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "columnsAboutToBeInserted" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "columnsInserted" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "columnsAboutToBeRemoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "columnsRemoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { name: "modelAboutToBeReset" } + Signal { name: "modelReset" } + Signal { + name: "rowsAboutToBeMoved" + Parameter { name: "sourceParent"; type: "QModelIndex" } + Parameter { name: "sourceStart"; type: "int" } + Parameter { name: "sourceEnd"; type: "int" } + Parameter { name: "destinationParent"; type: "QModelIndex" } + Parameter { name: "destinationRow"; type: "int" } + } + Signal { + name: "rowsMoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "start"; type: "int" } + Parameter { name: "end"; type: "int" } + Parameter { name: "destination"; type: "QModelIndex" } + Parameter { name: "row"; type: "int" } + } + Signal { + name: "columnsAboutToBeMoved" + Parameter { name: "sourceParent"; type: "QModelIndex" } + Parameter { name: "sourceStart"; type: "int" } + Parameter { name: "sourceEnd"; type: "int" } + Parameter { name: "destinationParent"; type: "QModelIndex" } + Parameter { name: "destinationColumn"; type: "int" } + } + Signal { + name: "columnsMoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "start"; type: "int" } + Parameter { name: "end"; type: "int" } + Parameter { name: "destination"; type: "QModelIndex" } + Parameter { name: "column"; type: "int" } + } + Method { name: "submit"; type: "bool" } + Method { name: "revert" } + } + Component { name: "QAbstractListModel"; prototype: "QAbstractItemModel" } +} diff --git a/src/libcommuni/src/imports/qml1/qml1.pro b/src/libcommuni/src/imports/qml1/qml1.pro new file mode 100644 index 0000000..ddee6a2 --- /dev/null +++ b/src/libcommuni/src/imports/qml1/qml1.pro @@ -0,0 +1,30 @@ +###################################################################### +# Communi +###################################################################### + +TARGET = communiplugin +QT = core network declarative +TARGETPATH = Communi +DESTDIR = ../../../imports/$$TARGETPATH + +SOURCES += plugin.cpp +OTHER_FILES += qmldir plugins.qmltypes + +isEmpty(IRC_INSTALL_IMPORTS):IRC_INSTALL_IMPORTS = $$[QT_INSTALL_IMPORTS] + +!no_install_imports { + target.path = $$IRC_INSTALL_IMPORTS/$$TARGETPATH + INSTALLS += target + + other_files.files = $$OTHER_FILES + other_files.path = $$IRC_INSTALL_IMPORTS/$$TARGETPATH + INSTALLS += other_files +} + +for(other_file, OTHER_FILES) { + ARGUMENTS = $${PWD}$${QMAKE_DIR_SEP}$$other_file $$DESTDIR + !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK += && + QMAKE_POST_LINK += $$QMAKE_COPY $$replace(ARGUMENTS, /, $$QMAKE_DIR_SEP) +} + +include(../imports.pri) diff --git a/src/libcommuni/src/imports/qml1/qmldir b/src/libcommuni/src/imports/qml1/qmldir new file mode 100644 index 0000000..2de93f6 --- /dev/null +++ b/src/libcommuni/src/imports/qml1/qmldir @@ -0,0 +1 @@ +plugin communiplugin diff --git a/src/libcommuni/src/imports/qml2/plugin.cpp b/src/libcommuni/src/imports/qml2/plugin.cpp new file mode 100644 index 0000000..12b8781 --- /dev/null +++ b/src/libcommuni/src/imports/qml2/plugin.cpp @@ -0,0 +1,139 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +class IrcQmlFilter : public QObject, + public IrcCommandFilter, + public IrcMessageFilter +{ + Q_OBJECT + Q_INTERFACES(IrcCommandFilter IrcMessageFilter) + Q_PROPERTY(IrcConnection* connection READ connection WRITE setConnection NOTIFY connectionChanged) + +public: + IrcQmlFilter(QObject* parent = 0) : QObject(parent), conn(0) { } + + IrcConnection* connection() const { return conn; } + void setConnection(IrcConnection* connection) + { + if (conn != connection) { + if (conn) { + conn->removeCommandFilter(this); + conn->removeMessageFilter(this); + } + conn = connection; + if (conn) { + conn->installCommandFilter(this); + conn->installMessageFilter(this); + } + emit connectionChanged(); + } + } + + bool commandFilter(IrcCommand* cmd) + { + // QML: QVariant commandFilter(QVariant) + const QMetaObject* mo = metaObject(); + int idx = mo->indexOfMethod("commandFilter(QVariant)"); + if (idx != -1) { + QVariant ret; + QMetaMethod method = mo->method(idx); + method.invoke(this, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(cmd))); + return ret.toBool(); + } + return false; + } + + bool messageFilter(IrcMessage* msg) + { + // QML: QVariant messageFilter(QVariant) + const QMetaObject* mo = metaObject(); + int idx = mo->indexOfMethod("messageFilter(QVariant)"); + if (idx != -1) { + QVariant ret; + QMetaMethod method = mo->method(idx); + method.invoke(this, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, QVariant::fromValue(msg))); + return ret.toBool(); + } + return false; + } + +signals: + void connectionChanged(); + +private: + QPointer conn; +}; + +class CommuniPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "Communi.QQmlExtensionInterface") + +public: + void registerTypes(const char* uri) { +//! [qml-register-types] + // IrcCore + Irc::registerMetaTypes(); + qmlRegisterType(uri, 3, 0, "Irc"); + qmlRegisterType(uri, 3, 2, "Irc"); + qmlRegisterType(uri, 3, 0, "IrcCommand"); + qmlRegisterType(uri, 3, 0, "IrcConnection"); + qmlRegisterUncreatableType(uri, 3, 0, "IrcMessage", "Cannot create an instance of IrcMessage. Use IrcConnection::messageReceived() signal instead."); + qmlRegisterUncreatableType(uri, 3, 0, "IrcNetwork", "Cannot create an instance of IrcNetwork. Use IrcConnection::network property instead."); + qmlRegisterType(uri, 3, 0, "IrcMessageFilter"); + qmlRegisterType(uri, 3, 0, "IrcCommandFilter"); + qmlRegisterType(uri, 3, 0, "IrcFilter"); + + // IrcModel + qmlRegisterType(uri, 3, 0, "IrcBuffer"); + qmlRegisterType(uri, 3, 0, "IrcBufferModel"); + qmlRegisterType(uri, 3, 0, "IrcChannel"); + qmlRegisterType(uri, 3, 0, "IrcUser"); + qmlRegisterType(uri, 3, 0, "IrcUserModel"); + + // IrcUtil + qmlRegisterType(uri, 3, 0, "IrcCommandParser"); + qmlRegisterType(uri, 3, 0, "IrcLagTimer"); + qmlRegisterType(uri, 3, 0, "IrcTextFormat"); + qmlRegisterUncreatableType(uri, 3, 0, "IrcPalette", "Cannot create an instance of IrcPalette. Use IrcTextFormat::palette property instead."); + qmlRegisterType(uri, 3, 1, "IrcCompleter"); +//! [qml-register-types] + } +}; + +IRC_END_NAMESPACE + +#include "plugin.moc" diff --git a/src/libcommuni/src/imports/qml2/plugins.qmltypes b/src/libcommuni/src/imports/qml2/plugins.qmltypes new file mode 100644 index 0000000..b0af7b4 --- /dev/null +++ b/src/libcommuni/src/imports/qml2/plugins.qmltypes @@ -0,0 +1,1769 @@ +import QtQuick.tooling 1.1 + +// This file describes the plugin-supplied types contained in the library. +// It is used for QML tooling purposes only. +// +// This file was auto-generated by: +// 'qmlplugindump -nonrelocatable Communi 3.0' + +Module { + Component { + name: "Irc" + prototype: "QObject" + exports: ["Communi/Irc 3.0"] + exportMetaObjectRevisions: [0] + Enum { + name: "Color" + values: { + "White": 0, + "Black": 1, + "Blue": 2, + "Green": 3, + "Red": 4, + "Brown": 5, + "Purple": 6, + "Orange": 7, + "Yellow": 8, + "LightGreen": 9, + "Cyan": 10, + "LightCyan": 11, + "LightBlue": 12, + "Pink": 13, + "Gray": 14, + "LightGray": 15 + } + } + Enum { + name: "DataRole" + values: { + "UserRole": 256, + "BufferRole": 257, + "ChannelRole": 258, + "NameRole": 259, + "PrefixRole": 260, + "ModeRole": 261, + "TitleRole": 262 + } + } + Enum { + name: "SortMethod" + values: { + "SortByHand": 0, + "SortByName": 1, + "SortByTitle": 2, + "SortByActivity": 3 + } + } + Enum { + name: "Code" + values: { + "RPL_WELCOME": 1, + "RPL_YOURHOST": 2, + "RPL_CREATED": 3, + "RPL_MYINFO": 4, + "RPL_ISUPPORT": 5, + "RPL_SNOMASK": 8, + "RPL_STATMEMTOT": 9, + "RPL_BOUNCE": 10, + "RPL_STATMEM": 10, + "RPL_YOURCOOKIE": 14, + "RPL_YOURID": 42, + "RPL_SAVENICK": 43, + "RPL_ATTEMPTINGJUNC": 50, + "RPL_ATTEMPTINGREROUTE": 51, + "RPL_TRACELINK": 200, + "RPL_TRACECONNECTING": 201, + "RPL_TRACEHANDSHAKE": 202, + "RPL_TRACEUNKNOWN": 203, + "RPL_TRACEOPERATOR": 204, + "RPL_TRACEUSER": 205, + "RPL_TRACESERVER": 206, + "RPL_TRACESERVICE": 207, + "RPL_TRACENEWTYPE": 208, + "RPL_TRACECLASS": 209, + "RPL_TRACERECONNECT": 210, + "RPL_STATS": 210, + "RPL_STATSLINKINFO": 211, + "RPL_STATSCOMMANDS": 212, + "RPL_STATSCLINE": 213, + "RPL_STATSNLINE": 214, + "RPL_STATSILINE": 215, + "RPL_STATSKLINE": 216, + "RPL_STATSQLINE": 217, + "RPL_STATSYLINE": 218, + "RPL_ENDOFSTATS": 219, + "RPL_UMODEIS": 221, + "RPL_MODLIST": 222, + "RPL_SQLINE_NICK": 222, + "RPL_STATSZLINE": 225, + "RPL_STATSCOUNT": 226, + "RPL_SERVICEINFO": 231, + "RPL_ENDOFSERVICES": 232, + "RPL_SERVICE": 233, + "RPL_SERVLIST": 234, + "RPL_SERVLISTEND": 235, + "RPL_STATSVERBOSE": 236, + "RPL_STATSENGINE": 237, + "RPL_STATSIAUTH": 239, + "RPL_STATSVLINE": 240, + "RPL_STATSLLINE": 241, + "RPL_STATSUPTIME": 242, + "RPL_STATSOLINE": 243, + "RPL_STATSHLINE": 244, + "RPL_STATSSLINE": 245, + "RPL_STATSPING": 246, + "RPL_STATSBLINE": 247, + "RPL_STATSDEFINE": 248, + "RPL_STATSDEBUG": 249, + "RPL_STATSDLINE": 250, + "RPL_STATSCONN": 250, + "RPL_LUSERCLIENT": 251, + "RPL_LUSEROP": 252, + "RPL_LUSERUNKNOWN": 253, + "RPL_LUSERCHANNELS": 254, + "RPL_LUSERME": 255, + "RPL_ADMINME": 256, + "RPL_ADMINLOC1": 257, + "RPL_ADMINLOC2": 258, + "RPL_ADMINEMAIL": 259, + "RPL_TRACELOG": 261, + "RPL_TRACEPING": 262, + "RPL_TRACEEND": 262, + "RPL_TRYAGAIN": 263, + "RPL_LOCALUSERS": 265, + "RPL_GLOBALUSERS": 266, + "RPL_START_NETSTAT": 267, + "RPL_NETSTAT": 268, + "RPL_END_NETSTAT": 269, + "RPL_PRIVS": 270, + "RPL_SILELIST": 271, + "RPL_ENDOFSILELIST": 272, + "RPL_NOTIFY": 273, + "RPL_ENDNOTIFY": 274, + "RPL_STATSDELTA": 274, + "RPL_VCHANEXIST": 276, + "RPL_VCHANLIST": 277, + "RPL_VCHANHELP": 278, + "RPL_GLIST": 280, + "RPL_ENDOFGLIST": 281, + "RPL_ACCEPTLIST": 281, + "RPL_ENDOFACCEPT": 282, + "RPL_JUPELIST": 282, + "RPL_ENDOFJUPELIST": 283, + "RPL_FEATURE": 284, + "RPL_GLIST_HASH": 285, + "RPL_CHANINFO_HANDLE": 285, + "RPL_NEWHOSTIS": 285, + "RPL_CHANINFO_USERS": 286, + "RPL_CHKHEAD": 286, + "RPL_CHANINFO_CHOPS": 287, + "RPL_CHANUSER": 287, + "RPL_CHANINFO_VOICES": 288, + "RPL_PATCHHEAD": 288, + "RPL_CHANINFO_AWAY": 289, + "RPL_PATCHCON": 289, + "RPL_CHANINFO_OPERS": 290, + "RPL_HELPHDR": 290, + "RPL_DATASTR": 290, + "RPL_CHANINFO_BANNED": 291, + "RPL_HELPOP": 291, + "RPL_ENDOFCHECK": 291, + "RPL_CHANINFO_BANS": 292, + "RPL_HELPTLR": 292, + "RPL_CHANINFO_INVITE": 293, + "RPL_HELPHLP": 293, + "RPL_CHANINFO_INVITES": 294, + "RPL_HELPFWD": 294, + "RPL_CHANINFO_KICK": 295, + "RPL_HELPIGN": 295, + "RPL_CHANINFO_KICKS": 296, + "RPL_END_CHANINFO": 299, + "RPL_NONE": 300, + "RPL_AWAY": 301, + "RPL_USERHOST": 302, + "RPL_ISON": 303, + "RPL_TEXT": 304, + "RPL_UNAWAY": 305, + "RPL_NOWAWAY": 306, + "RPL_WHOISREGNICK": 307, + "RPL_SUSERHOST": 307, + "RPL_NOTIFYACTION": 308, + "RPL_WHOISADMIN": 308, + "RPL_NICKTRACE": 309, + "RPL_WHOISSADMIN": 309, + "RPL_WHOISHELPER": 309, + "RPL_WHOISSVCMSG": 310, + "RPL_WHOISHELPOP": 310, + "RPL_WHOISSERVICE": 310, + "RPL_WHOISUSER": 311, + "RPL_WHOISSERVER": 312, + "RPL_WHOISOPERATOR": 313, + "RPL_WHOWASUSER": 314, + "RPL_ENDOFWHO": 315, + "RPL_WHOISCHANOP": 316, + "RPL_WHOISIDLE": 317, + "RPL_ENDOFWHOIS": 318, + "RPL_WHOISCHANNELS": 319, + "RPL_WHOISVIRT": 320, + "RPL_WHOIS_HIDDEN": 320, + "RPL_WHOISSPECIAL": 320, + "RPL_LISTSTART": 321, + "RPL_LIST": 322, + "RPL_LISTEND": 323, + "RPL_CHANNELMODEIS": 324, + "RPL_UNIQOPIS": 325, + "RPL_CHANNELPASSIS": 325, + "RPL_NOCHANPASS": 326, + "RPL_CHPASSUNKNOWN": 327, + "RPL_CHANNEL_URL": 328, + "RPL_CREATIONTIME": 329, + "RPL_WHOWAS_TIME": 330, + "RPL_WHOISACCOUNT": 330, + "RPL_NOTOPIC": 331, + "RPL_TOPIC": 332, + "RPL_TOPICWHOTIME": 333, + "RPL_LISTUSAGE": 334, + "RPL_COMMANDSYNTAX": 334, + "RPL_LISTSYNTAX": 334, + "RPL_CHANPASSOK": 338, + "RPL_WHOISACTUALLY": 338, + "RPL_BADCHANPASS": 339, + "RPL_INVITING": 341, + "RPL_SUMMONING": 342, + "RPL_INVITED": 345, + "RPL_INVITELIST": 346, + "RPL_ENDOFINVITELIST": 347, + "RPL_EXCEPTLIST": 348, + "RPL_ENDOFEXCEPTLIST": 349, + "RPL_VERSION": 351, + "RPL_WHOREPLY": 352, + "RPL_NAMREPLY": 353, + "RPL_WHOSPCRPL": 354, + "RPL_NAMREPLY_": 355, + "RPL_KILLDONE": 361, + "RPL_CLOSING": 362, + "RPL_CLOSEEND": 363, + "RPL_LINKS": 364, + "RPL_ENDOFLINKS": 365, + "RPL_ENDOFNAMES": 366, + "RPL_BANLIST": 367, + "RPL_ENDOFBANLIST": 368, + "RPL_ENDOFWHOWAS": 369, + "RPL_INFO": 371, + "RPL_MOTD": 372, + "RPL_INFOSTART": 373, + "RPL_ENDOFINFO": 374, + "RPL_MOTDSTART": 375, + "RPL_ENDOFMOTD": 376, + "RPL_KICKEXPIRED": 377, + "RPL_SPAM": 377, + "RPL_BANEXPIRED": 378, + "RPL_WHOISHOST": 378, + "RPL_KICKLINKED": 379, + "RPL_WHOISMODES": 379, + "RPL_BANLINKED": 380, + "RPL_YOURHELPER": 380, + "RPL_YOUREOPER": 381, + "RPL_REHASHING": 382, + "RPL_YOURESERVICE": 383, + "RPL_MYPORTIS": 384, + "RPL_NOTOPERANYMORE": 385, + "RPL_QLIST": 386, + "RPL_IRCOPS": 386, + "RPL_ENDOFQLIST": 387, + "RPL_ENDOFIRCOPS": 387, + "RPL_ALIST": 388, + "RPL_ENDOFALIST": 389, + "RPL_TIME": 391, + "RPL_USERSSTART": 392, + "RPL_USERS": 393, + "RPL_ENDOFUSERS": 394, + "RPL_NOUSERS": 395, + "RPL_HOSTHIDDEN": 396, + "ERR_UNKNOWNERROR": 400, + "ERR_NOSUCHNICK": 401, + "ERR_NOSUCHSERVER": 402, + "ERR_NOSUCHCHANNEL": 403, + "ERR_CANNOTSENDTOCHAN": 404, + "ERR_TOOMANYCHANNELS": 405, + "ERR_WASNOSUCHNICK": 406, + "ERR_TOOMANYTARGETS": 407, + "ERR_NOSUCHSERVICE": 408, + "ERR_NOCOLORSONCHAN": 408, + "ERR_NOORIGIN": 409, + "ERR_NORECIPIENT": 411, + "ERR_NOTEXTTOSEND": 412, + "ERR_NOTOPLEVEL": 413, + "ERR_WILDTOPLEVEL": 414, + "ERR_BADMASK": 415, + "ERR_TOOMANYMATCHES": 416, + "ERR_QUERYTOOLONG": 416, + "ERR_LENGTHTRUNCATED": 419, + "ERR_UNKNOWNCOMMAND": 421, + "ERR_NOMOTD": 422, + "ERR_NOADMININFO": 423, + "ERR_FILEERROR": 424, + "ERR_NOOPERMOTD": 425, + "ERR_TOOMANYAWAY": 429, + "ERR_EVENTNICKCHANGE": 430, + "ERR_NONICKNAMEGIVEN": 431, + "ERR_ERRONEUSNICKNAME": 432, + "ERR_NICKNAMEINUSE": 433, + "ERR_SERVICENAMEINUSE": 434, + "ERR_NORULES": 434, + "ERR_SERVICECONFUSED": 435, + "ERR_BANONCHAN": 435, + "ERR_NICKCOLLISION": 436, + "ERR_UNAVAILRESOURCE": 437, + "ERR_BANNICKCHANGE": 437, + "ERR_NICKTOOFAST": 438, + "ERR_DEAD": 438, + "ERR_TARGETTOOFAST": 439, + "ERR_SERVICESDOWN": 440, + "ERR_USERNOTINCHANNEL": 441, + "ERR_NOTONCHANNEL": 442, + "ERR_USERONCHANNEL": 443, + "ERR_NOLOGIN": 444, + "ERR_SUMMONDISABLED": 445, + "ERR_USERSDISABLED": 446, + "ERR_NONICKCHANGE": 447, + "ERR_NOTIMPLEMENTED": 449, + "ERR_NOTREGISTERED": 451, + "ERR_IDCOLLISION": 452, + "ERR_NICKLOST": 453, + "ERR_HOSTILENAME": 455, + "ERR_ACCEPTFULL": 456, + "ERR_ACCEPTEXIST": 457, + "ERR_ACCEPTNOT": 458, + "ERR_NOHIDING": 459, + "ERR_NOTFORHALFOPS": 460, + "ERR_NEEDMOREPARAMS": 461, + "ERR_ALREADYREGISTERED": 462, + "ERR_NOPERMFORHOST": 463, + "ERR_PASSWDMISMATCH": 464, + "ERR_YOUREBANNEDCREEP": 465, + "ERR_YOUWILLBEBANNED": 466, + "ERR_KEYSET": 467, + "ERR_INVALIDUSERNAME": 468, + "ERR_ONLYSERVERSCANCHANGE": 468, + "ERR_LINKSET": 469, + "ERR_LINKCHANNEL": 470, + "ERR_KICKEDFROMCHAN": 470, + "ERR_CHANNELISFULL": 471, + "ERR_UNKNOWNMODE": 472, + "ERR_INVITEONLYCHAN": 473, + "ERR_BANNEDFROMCHAN": 474, + "ERR_BADCHANNELKEY": 475, + "ERR_BADCHANMASK": 476, + "ERR_NOCHANMODES": 477, + "ERR_NEEDREGGEDNICK": 477, + "ERR_BANLISTFULL": 478, + "ERR_BADCHANNAME": 479, + "ERR_LINKFAIL": 479, + "ERR_NOULINE": 480, + "ERR_CANNOTKNOCK": 480, + "ERR_NOPRIVILEGES": 481, + "ERR_CHANOPRIVSNEEDED": 482, + "ERR_CANTKILLSERVER": 483, + "ERR_RESTRICTED": 484, + "ERR_ISCHANSERVICE": 484, + "ERR_DESYNC": 484, + "ERR_ATTACKDENY": 484, + "ERR_UNIQOPRIVSNEEDED": 485, + "ERR_KILLDENY": 485, + "ERR_CANTKICKADMIN": 485, + "ERR_ISREALSERVICE": 485, + "ERR_NONONREG": 486, + "ERR_HTMDISABLED": 486, + "ERR_ACCOUNTONLY": 486, + "ERR_CHANTOORECENT": 487, + "ERR_MSGSERVICES": 487, + "ERR_TSLESSCHAN": 488, + "ERR_VOICENEEDED": 489, + "ERR_SECUREONLYCHAN": 489, + "ERR_NOOPERHOST": 491, + "ERR_NOSERVICEHOST": 492, + "ERR_NOFEATURE": 493, + "ERR_BADFEATURE": 494, + "ERR_BADLOGTYPE": 495, + "ERR_BADLOGSYS": 496, + "ERR_BADLOGVALUE": 497, + "ERR_ISOPERLCHAN": 498, + "ERR_CHANOWNPRIVNEEDED": 499, + "ERR_UMODEUNKNOWNFLAG": 501, + "ERR_USERSDONTMATCH": 502, + "ERR_GHOSTEDCLIENT": 503, + "ERR_VWORLDWARN": 503, + "ERR_USERNOTONSERV": 504, + "ERR_SILELISTFULL": 511, + "ERR_TOOMANYWATCH": 512, + "ERR_BADPING": 513, + "ERR_INVALID_ERROR": 514, + "ERR_TOOMANYDCC": 514, + "ERR_BADEXPIRE": 515, + "ERR_DONTCHEAT": 516, + "ERR_DISABLED": 517, + "ERR_NOINVITE": 518, + "ERR_LONGMASK": 518, + "ERR_ADMONLY": 519, + "ERR_TOOMANYUSERS": 519, + "ERR_OPERONLY": 520, + "ERR_MASKTOOWIDE": 520, + "ERR_WHOTRUNC": 520, + "ERR_LISTSYNTAX": 521, + "ERR_WHOSYNTAX": 522, + "ERR_WHOLIMEXCEED": 523, + "ERR_QUARANTINED": 524, + "ERR_OPERSPVERIFY": 524, + "ERR_REMOTEPFX": 525, + "ERR_PFXUNROUTABLE": 526, + "ERR_BADHOSTMASK": 550, + "ERR_HOSTUNAVAIL": 551, + "ERR_USINGSLINE": 552, + "ERR_STATSSLINE": 553, + "RPL_LOGON": 600, + "RPL_LOGOFF": 601, + "RPL_WATCHOFF": 602, + "RPL_WATCHSTAT": 603, + "RPL_NOWON": 604, + "RPL_NOWOFF": 605, + "RPL_WATCHLIST": 606, + "RPL_ENDOFWATCHLIST": 607, + "RPL_WATCHCLEAR": 608, + "RPL_ISOPER": 610, + "RPL_ISLOCOP": 611, + "RPL_ISNOTOPER": 612, + "RPL_ENDOFISOPER": 613, + "RPL_DCCSTATUS": 617, + "RPL_DCCLIST": 618, + "RPL_ENDOFDCCLIST": 619, + "RPL_WHOWASHOST": 619, + "RPL_DCCINFO": 620, + "RPL_ENDOFO": 626, + "RPL_SETTINGS": 630, + "RPL_ENDOFSETTINGS": 631, + "RPL_DUMPING": 640, + "RPL_DUMPRPL": 641, + "RPL_EODUMP": 642, + "RPL_TRACEROUTE_HOP": 660, + "RPL_TRACEROUTE_START": 661, + "RPL_MODECHANGEWARN": 662, + "RPL_CHANREDIR": 663, + "RPL_SERVMODEIS": 664, + "RPL_OTHERUMODEIS": 665, + "RPL_ENDOF_GENERIC": 666, + "RPL_WHOWASDETAILS": 670, + "RPL_WHOISSECURE": 671, + "RPL_UNKNOWNMODES": 672, + "RPL_CANNOTSETMODES": 673, + "RPL_LUSERSTAFF": 678, + "RPL_TIMEONSERVERIS": 679, + "RPL_NETWORKS": 682, + "RPL_YOURLANGUAGEIS": 687, + "RPL_LANGUAGE": 688, + "RPL_WHOISSTAFF": 689, + "RPL_WHOISLANGUAGE": 690, + "RPL_HELPSTART": 704, + "RPL_HELPTXT": 705, + "RPL_ENDOFHELP": 706, + "RPL_ETRACEFULL": 708, + "RPL_ETRACE": 709, + "RPL_KNOCK": 710, + "RPL_KNOCKDLVR": 711, + "ERR_TOOMANYKNOCK": 712, + "ERR_CHANOPEN": 713, + "ERR_KNOCKONCHAN": 714, + "ERR_KNOCKDISABLED": 715, + "RPL_TARGUMODEG": 716, + "RPL_TARGNOTIFY": 717, + "RPL_UMODEGMSG": 718, + "RPL_ENDOFOMOTD": 722, + "ERR_NOPRIVS": 723, + "RPL_TESTMARK": 724, + "RPL_TESTLINE": 725, + "RPL_NOTESTLINE": 726, + "RPL_XINFO": 771, + "RPL_XINFOSTART": 773, + "RPL_XINFOEND": 774, + "ERR_CANNOTDOCOMMAND": 972, + "ERR_CANNOTCHANGEUMODE": 973, + "ERR_CANNOTCHANGECHANMODE": 974, + "ERR_CANNOTCHANGESERVERMODE": 975, + "ERR_CANNOTSENDTONICK": 976, + "ERR_UNKNOWNSERVERMODE": 977, + "ERR_SERVERMODELOCK": 979, + "ERR_BADCHARENCODING": 980, + "ERR_TOOMANYLANGUAGES": 981, + "ERR_NOLANGUAGE": 982, + "ERR_TEXTTOOSHORT": 983, + "ERR_NUMERIC_ERR": 999 + } + } + Method { name: "version"; type: "string" } + Method { + name: "codeToString" + type: "string" + Parameter { name: "code"; type: "int" } + } + Method { + name: "nickFromPrefix" + type: "string" + Parameter { name: "prefix"; type: "string" } + } + Method { + name: "identFromPrefix" + type: "string" + Parameter { name: "prefix"; type: "string" } + } + Method { + name: "hostFromPrefix" + type: "string" + Parameter { name: "prefix"; type: "string" } + } + Method { name: "registerMetaTypes" } + } + Component { + name: "IrcBuffer" + prototype: "QObject" + exports: ["Communi/IrcBuffer 3.0"] + exportMetaObjectRevisions: [0] + Property { name: "title"; type: "string"; isReadonly: true } + Property { name: "name"; type: "string" } + Property { name: "prefix"; type: "string" } + Property { name: "connection"; type: "IrcConnection"; isReadonly: true; isPointer: true } + Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } + Property { name: "model"; type: "IrcBufferModel"; isReadonly: true; isPointer: true } + Property { name: "active"; type: "bool"; isReadonly: true } + Property { name: "channel"; type: "bool"; isReadonly: true } + Property { name: "sticky"; type: "bool" } + Property { name: "persistent"; type: "bool" } + Signal { + name: "titleChanged" + Parameter { name: "title"; type: "string" } + } + Signal { + name: "nameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "prefixChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "messageReceived" + Parameter { name: "message"; type: "IrcMessage"; isPointer: true } + } + Signal { + name: "destroyed" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "activeChanged" + Parameter { name: "active"; type: "bool" } + } + Signal { + name: "stickyChanged" + Parameter { name: "sticky"; type: "bool" } + } + Signal { + name: "persistentChanged" + Parameter { name: "persistent"; type: "bool" } + } + Method { + name: "setName" + Parameter { name: "name"; type: "string" } + } + Method { + name: "setPrefix" + Parameter { name: "prefix"; type: "string" } + } + Method { + name: "receiveMessage" + Parameter { name: "message"; type: "IrcMessage"; isPointer: true } + } + Method { name: "toChannel"; type: "IrcChannel*" } + Method { + name: "sendCommand" + type: "bool" + Parameter { name: "command"; type: "IrcCommand"; isPointer: true } + } + } + Component { + name: "IrcBufferModel" + prototype: "QAbstractListModel" + exports: ["Communi/IrcBufferModel 3.0"] + exportMetaObjectRevisions: [0] + Property { name: "count"; type: "int"; isReadonly: true } + Property { name: "sortOrder"; type: "Qt::SortOrder" } + Property { name: "sortMethod"; type: "Irc::SortMethod" } + Property { name: "channels"; type: "QStringList"; isReadonly: true } + Property { name: "displayRole"; type: "Irc::DataRole" } + Property { name: "buffers"; type: "QList"; isReadonly: true } + Property { name: "connection"; type: "IrcConnection"; isPointer: true } + Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } + Property { name: "bufferPrototype"; type: "IrcBuffer"; isPointer: true } + Property { name: "channelPrototype"; type: "IrcChannel"; isPointer: true } + Signal { + name: "countChanged" + Parameter { name: "count"; type: "int" } + } + Signal { + name: "added" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "removed" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "aboutToBeAdded" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "aboutToBeRemoved" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "buffersChanged" + Parameter { name: "buffers"; type: "QList" } + } + Signal { + name: "channelsChanged" + Parameter { name: "channels"; type: "QStringList" } + } + Signal { + name: "connectionChanged" + Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } + } + Signal { + name: "networkChanged" + Parameter { name: "network"; type: "IrcNetwork"; isPointer: true } + } + Signal { + name: "messageIgnored" + Parameter { name: "message"; type: "IrcMessage"; isPointer: true } + } + Signal { + name: "bufferPrototypeChanged" + Parameter { name: "prototype"; type: "IrcBuffer"; isPointer: true } + } + Signal { + name: "channelPrototypeChanged" + Parameter { name: "prototype"; type: "IrcChannel"; isPointer: true } + } + Method { name: "clear" } + Method { + name: "sort" + Parameter { name: "column"; type: "int" } + Parameter { name: "order"; type: "Qt::SortOrder" } + } + Method { + name: "sort" + Parameter { name: "column"; type: "int" } + } + Method { name: "sort" } + Method { + name: "sort" + Parameter { name: "method"; type: "Irc::SortMethod" } + Parameter { name: "order"; type: "Qt::SortOrder" } + } + Method { + name: "sort" + Parameter { name: "method"; type: "Irc::SortMethod" } + } + Method { + name: "get" + type: "IrcBuffer*" + Parameter { name: "index"; type: "int" } + } + Method { + name: "find" + type: "IrcBuffer*" + Parameter { name: "title"; type: "string" } + } + Method { + name: "contains" + type: "bool" + Parameter { name: "title"; type: "string" } + } + Method { + name: "indexOf" + type: "int" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Method { + name: "add" + type: "IrcBuffer*" + Parameter { name: "title"; type: "string" } + } + Method { + name: "add" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + Method { + name: "remove" + Parameter { name: "title"; type: "string" } + } + Method { + name: "remove" + Parameter { name: "buffer"; type: "IrcBuffer"; isPointer: true } + } + } + Component { + name: "IrcChannel" + prototype: "IrcBuffer" + exports: ["Communi/IrcChannel 3.0"] + exportMetaObjectRevisions: [0] + Property { name: "mode"; type: "string"; isReadonly: true } + Property { name: "topic"; type: "string"; isReadonly: true } + Signal { + name: "modeChanged" + Parameter { name: "mode"; type: "string" } + } + Signal { + name: "topicChanged" + Parameter { name: "topic"; type: "string" } + } + Method { + name: "part" + Parameter { name: "reason"; type: "string" } + } + Method { name: "part" } + } + Component { + name: "IrcCommand" + prototype: "QObject" + exports: ["Communi/IrcCommand 3.0"] + exportMetaObjectRevisions: [0] + Enum { + name: "Type" + values: { + "Admin": 0, + "Away": 1, + "Capability": 2, + "CtcpAction": 3, + "CtcpReply": 4, + "CtcpRequest": 5, + "Custom": 6, + "Info": 7, + "Invite": 8, + "Join": 9, + "Kick": 10, + "Knock": 11, + "List": 12, + "Message": 13, + "Mode": 14, + "Motd": 15, + "Names": 16, + "Nick": 17, + "Notice": 18, + "Part": 19, + "Ping": 20, + "Pong": 21, + "Quit": 22, + "Quote": 23, + "Stats": 24, + "Time": 25, + "Topic": 26, + "Trace": 27, + "Users": 28, + "Version": 29, + "Who": 30, + "Whois": 31, + "Whowas": 32 + } + } + Property { name: "parameters"; type: "QStringList" } + Property { name: "encoding"; type: "QByteArray" } + Property { name: "type"; type: "Type" } + Method { + name: "toMessage" + type: "IrcMessage*" + Parameter { name: "prefix"; type: "string" } + Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } + } + Method { + name: "createAdmin" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createAdmin"; type: "IrcCommand*" } + Method { + name: "createAway" + type: "IrcCommand*" + Parameter { name: "reason"; type: "string" } + } + Method { name: "createAway"; type: "IrcCommand*" } + Method { + name: "createCapability" + type: "IrcCommand*" + Parameter { name: "subCommand"; type: "string" } + Parameter { name: "capability"; type: "string" } + } + Method { + name: "createCapability" + type: "IrcCommand*" + Parameter { name: "subCommand"; type: "string" } + Parameter { name: "capabilities"; type: "QStringList" } + } + Method { + name: "createCapability" + type: "IrcCommand*" + Parameter { name: "subCommand"; type: "string" } + } + Method { + name: "createCtcpAction" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "action"; type: "string" } + } + Method { + name: "createCtcpReply" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "reply"; type: "string" } + } + Method { + name: "createCtcpRequest" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "request"; type: "string" } + } + Method { + name: "createInfo" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createInfo"; type: "IrcCommand*" } + Method { + name: "createInvite" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createJoin" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "key"; type: "string" } + } + Method { + name: "createJoin" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createJoin" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + Parameter { name: "keys"; type: "QStringList" } + } + Method { + name: "createJoin" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + } + Method { + name: "createKick" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "user"; type: "string" } + Parameter { name: "reason"; type: "string" } + } + Method { + name: "createKick" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "user"; type: "string" } + } + Method { + name: "createKnock" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "message"; type: "string" } + } + Method { + name: "createKnock" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createList" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + Parameter { name: "server"; type: "string" } + } + Method { + name: "createList" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + } + Method { name: "createList"; type: "IrcCommand*" } + Method { + name: "createMessage" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "message"; type: "string" } + } + Method { + name: "createMode" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "mode"; type: "string" } + Parameter { name: "arg"; type: "string" } + } + Method { + name: "createMode" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "mode"; type: "string" } + } + Method { + name: "createMode" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + } + Method { + name: "createMotd" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createMotd"; type: "IrcCommand*" } + Method { + name: "createNames" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "server"; type: "string" } + } + Method { + name: "createNames" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { name: "createNames"; type: "IrcCommand*" } + Method { + name: "createNames" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + Parameter { name: "server"; type: "string" } + } + Method { + name: "createNames" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + } + Method { + name: "createNick" + type: "IrcCommand*" + Parameter { name: "nick"; type: "string" } + } + Method { + name: "createNotice" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + Parameter { name: "notice"; type: "string" } + } + Method { + name: "createPart" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "reason"; type: "string" } + } + Method { + name: "createPart" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createPart" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + Parameter { name: "reason"; type: "string" } + } + Method { + name: "createPart" + type: "IrcCommand*" + Parameter { name: "channels"; type: "QStringList" } + } + Method { + name: "createPing" + type: "IrcCommand*" + Parameter { name: "argument"; type: "string" } + } + Method { + name: "createPong" + type: "IrcCommand*" + Parameter { name: "argument"; type: "string" } + } + Method { + name: "createQuit" + type: "IrcCommand*" + Parameter { name: "reason"; type: "string" } + } + Method { name: "createQuit"; type: "IrcCommand*" } + Method { + name: "createQuote" + type: "IrcCommand*" + Parameter { name: "raw"; type: "string" } + } + Method { + name: "createQuote" + type: "IrcCommand*" + Parameter { name: "parameters"; type: "QStringList" } + } + Method { + name: "createStats" + type: "IrcCommand*" + Parameter { name: "query"; type: "string" } + Parameter { name: "server"; type: "string" } + } + Method { + name: "createStats" + type: "IrcCommand*" + Parameter { name: "query"; type: "string" } + } + Method { + name: "createTime" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createTime"; type: "IrcCommand*" } + Method { + name: "createTopic" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + Parameter { name: "topic"; type: "string" } + } + Method { + name: "createTopic" + type: "IrcCommand*" + Parameter { name: "channel"; type: "string" } + } + Method { + name: "createTrace" + type: "IrcCommand*" + Parameter { name: "target"; type: "string" } + } + Method { name: "createTrace"; type: "IrcCommand*" } + Method { + name: "createUsers" + type: "IrcCommand*" + Parameter { name: "server"; type: "string" } + } + Method { name: "createUsers"; type: "IrcCommand*" } + Method { + name: "createVersion" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + } + Method { name: "createVersion"; type: "IrcCommand*" } + Method { + name: "createWho" + type: "IrcCommand*" + Parameter { name: "mask"; type: "string" } + Parameter { name: "operators"; type: "bool" } + } + Method { + name: "createWho" + type: "IrcCommand*" + Parameter { name: "mask"; type: "string" } + } + Method { + name: "createWhois" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + } + Method { + name: "createWhowas" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + Parameter { name: "count"; type: "int" } + } + Method { + name: "createWhowas" + type: "IrcCommand*" + Parameter { name: "user"; type: "string" } + } + } + Component { + name: "IrcCommandParser" + prototype: "QObject" + exports: ["Communi/IrcCommandParser 3.0"] + exportMetaObjectRevisions: [0] + Enum { + name: "Details" + values: { + "Full": 0, + "NoTarget": 1, + "NoPrefix": 2, + "NoEllipsis": 4, + "NoParentheses": 8, + "NoBrackets": 16, + "NoAngles": 32, + "Visual": 7 + } + } + Property { name: "commands"; type: "QStringList"; isReadonly: true } + Property { name: "triggers"; type: "QStringList" } + Property { name: "channels"; type: "QStringList" } + Property { name: "target"; type: "string" } + Property { name: "tolerant"; type: "bool" } + Signal { + name: "commandsChanged" + Parameter { name: "commands"; type: "QStringList" } + } + Signal { + name: "triggersChanged" + Parameter { name: "triggers"; type: "QStringList" } + } + Signal { + name: "channelsChanged" + Parameter { name: "channels"; type: "QStringList" } + } + Signal { + name: "targetChanged" + Parameter { name: "target"; type: "string" } + } + Signal { + name: "tolerancyChanged" + Parameter { name: "tolerant"; type: "bool" } + } + Method { name: "clear" } + Method { name: "reset" } + Method { + name: "setTriggers" + Parameter { name: "triggers"; type: "QStringList" } + } + Method { + name: "setChannels" + Parameter { name: "channels"; type: "QStringList" } + } + Method { + name: "setTarget" + Parameter { name: "target"; type: "string" } + } + Method { + name: "syntax" + type: "string" + Parameter { name: "command"; type: "string" } + Parameter { name: "details"; type: "Details" } + } + Method { + name: "syntax" + type: "string" + Parameter { name: "command"; type: "string" } + } + Method { + name: "addCommand" + Parameter { name: "type"; type: "IrcCommand::Type" } + Parameter { name: "syntax"; type: "string" } + } + Method { + name: "removeCommand" + Parameter { name: "type"; type: "IrcCommand::Type" } + Parameter { name: "syntax"; type: "string" } + } + Method { + name: "removeCommand" + Parameter { name: "type"; type: "IrcCommand::Type" } + } + Method { + name: "parse" + type: "IrcCommand*" + Parameter { name: "input"; type: "string" } + } + } + Component { + name: "IrcConnection" + prototype: "QObject" + exports: ["Communi/IrcConnection 3.0"] + exportMetaObjectRevisions: [0] + Enum { + name: "Status" + values: { + "Inactive": 0, + "Waiting": 1, + "Connecting": 2, + "Connected": 3, + "Closing": 4, + "Closed": 5, + "Error": 6 + } + } + Property { name: "host"; type: "string" } + Property { name: "port"; type: "int" } + Property { name: "userName"; type: "string" } + Property { name: "nickName"; type: "string" } + Property { name: "realName"; type: "string" } + Property { name: "password"; type: "string" } + Property { name: "displayName"; type: "string" } + Property { name: "encoding"; type: "QByteArray" } + Property { name: "status"; type: "Status"; isReadonly: true } + Property { name: "active"; type: "bool"; isReadonly: true } + Property { name: "connected"; type: "bool"; isReadonly: true } + Property { name: "enabled"; type: "bool" } + Property { name: "reconnectDelay"; type: "int" } + Property { name: "socket"; type: "QAbstractSocket"; isPointer: true } + Property { name: "secure"; type: "bool" } + Property { name: "saslMechanism"; type: "string" } + Property { name: "supportedSaslMechanisms"; type: "QStringList"; isReadonly: true } + Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } + Signal { name: "connecting" } + Signal { + name: "nickNameReserved" + Parameter { name: "alternate"; type: "string"; isPointer: true } + } + Signal { name: "connected" } + Signal { name: "disconnected" } + Signal { + name: "statusChanged" + Parameter { name: "status"; type: "IrcConnection::Status" } + } + Signal { + name: "socketError" + Parameter { name: "error"; type: "QAbstractSocket::SocketError" } + } + Signal { + name: "socketStateChanged" + Parameter { name: "state"; type: "QAbstractSocket::SocketState" } + } + Signal { + name: "messageReceived" + Parameter { name: "message"; type: "IrcMessage"; isPointer: true } + } + Signal { + name: "capabilityMessageReceived" + Parameter { name: "message"; type: "IrcCapabilityMessage"; isPointer: true } + } + Signal { + name: "errorMessageReceived" + Parameter { name: "message"; type: "IrcErrorMessage"; isPointer: true } + } + Signal { + name: "inviteMessageReceived" + Parameter { name: "message"; type: "IrcInviteMessage"; isPointer: true } + } + Signal { + name: "joinMessageReceived" + Parameter { name: "message"; type: "IrcJoinMessage"; isPointer: true } + } + Signal { + name: "kickMessageReceived" + Parameter { name: "message"; type: "IrcKickMessage"; isPointer: true } + } + Signal { + name: "modeMessageReceived" + Parameter { name: "message"; type: "IrcModeMessage"; isPointer: true } + } + Signal { + name: "namesMessageReceived" + Parameter { name: "message"; type: "IrcNamesMessage"; isPointer: true } + } + Signal { + name: "nickMessageReceived" + Parameter { name: "message"; type: "IrcNickMessage"; isPointer: true } + } + Signal { + name: "noticeMessageReceived" + Parameter { name: "message"; type: "IrcNoticeMessage"; isPointer: true } + } + Signal { + name: "numericMessageReceived" + Parameter { name: "message"; type: "IrcNumericMessage"; isPointer: true } + } + Signal { + name: "motdMessageReceived" + Parameter { name: "message"; type: "IrcMotdMessage"; isPointer: true } + } + Signal { + name: "partMessageReceived" + Parameter { name: "message"; type: "IrcPartMessage"; isPointer: true } + } + Signal { + name: "pingMessageReceived" + Parameter { name: "message"; type: "IrcPingMessage"; isPointer: true } + } + Signal { + name: "pongMessageReceived" + Parameter { name: "message"; type: "IrcPongMessage"; isPointer: true } + } + Signal { + name: "privateMessageReceived" + Parameter { name: "message"; type: "IrcPrivateMessage"; isPointer: true } + } + Signal { + name: "quitMessageReceived" + Parameter { name: "message"; type: "IrcQuitMessage"; isPointer: true } + } + Signal { + name: "topicMessageReceived" + Parameter { name: "message"; type: "IrcTopicMessage"; isPointer: true } + } + Signal { + name: "hostChanged" + Parameter { name: "host"; type: "string" } + } + Signal { + name: "portChanged" + Parameter { name: "port"; type: "int" } + } + Signal { + name: "userNameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "nickNameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "realNameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "passwordChanged" + Parameter { name: "password"; type: "string" } + } + Signal { + name: "displayNameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "reconnectDelayChanged" + Parameter { name: "seconds"; type: "int" } + } + Signal { + name: "enabledChanged" + Parameter { name: "enabled"; type: "bool" } + } + Signal { + name: "secureChanged" + Parameter { name: "secure"; type: "bool" } + } + Signal { + name: "saslMechanismChanged" + Parameter { name: "mechanism"; type: "string" } + } + Method { name: "open" } + Method { name: "close" } + Method { + name: "quit" + Parameter { name: "reason"; type: "string" } + } + Method { name: "quit" } + Method { + name: "setEnabled" + Parameter { name: "enabled"; type: "bool" } + } + Method { name: "setEnabled" } + Method { + name: "setDisabled" + Parameter { name: "disabled"; type: "bool" } + } + Method { name: "setDisabled" } + Method { + name: "sendCommand" + type: "bool" + Parameter { name: "command"; type: "IrcCommand"; isPointer: true } + } + Method { + name: "sendData" + type: "bool" + Parameter { name: "data"; type: "QByteArray" } + } + Method { + name: "sendRaw" + type: "bool" + Parameter { name: "message"; type: "string" } + } + } + Component { + name: "IrcLagTimer" + prototype: "QObject" + exports: ["Communi/IrcLagTimer 3.0"] + exportMetaObjectRevisions: [0] + Property { name: "lag"; type: "qlonglong"; isReadonly: true } + Property { name: "interval"; type: "int" } + Property { name: "connection"; type: "IrcConnection"; isPointer: true } + Signal { + name: "lagChanged" + Parameter { name: "lag"; type: "qlonglong" } + } + } + Component { + name: "IrcMessage" + prototype: "QObject" + exports: ["Communi/IrcMessage 3.0"] + exportMetaObjectRevisions: [0] + Enum { + name: "Type" + values: { + "Unknown": 0, + "Capability": 1, + "Error": 2, + "Invite": 3, + "Join": 4, + "Kick": 5, + "Mode": 6, + "Motd": 7, + "Names": 8, + "Nick": 9, + "Notice": 10, + "Numeric": 11, + "Part": 12, + "Ping": 13, + "Pong": 14, + "Private": 15, + "Quit": 16, + "Topic": 17 + } + } + Enum { + name: "Flag" + values: { + "None": 0, + "Own": 1, + "Identified": 2, + "Unidentified": 4 + } + } + Enum { + name: "Flags" + values: { + "None": 0, + "Own": 1, + "Identified": 2, + "Unidentified": 4 + } + } + Property { name: "connection"; type: "IrcConnection"; isReadonly: true; isPointer: true } + Property { name: "network"; type: "IrcNetwork"; isReadonly: true; isPointer: true } + Property { name: "type"; type: "Type"; isReadonly: true } + Property { name: "flags"; type: "Flags"; isReadonly: true } + Property { name: "valid"; type: "bool"; isReadonly: true } + Property { name: "command"; type: "string"; isReadonly: true } + Property { name: "prefix"; type: "string" } + Property { name: "nick"; type: "string"; isReadonly: true } + Property { name: "ident"; type: "string"; isReadonly: true } + Property { name: "host"; type: "string"; isReadonly: true } + Property { name: "parameters"; type: "QStringList" } + Property { name: "timeStamp"; type: "QDateTime" } + Method { name: "toData"; type: "QByteArray" } + Method { + name: "fromData" + type: "IrcMessage*" + Parameter { name: "data"; type: "QByteArray" } + Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } + } + Method { + name: "fromParameters" + type: "IrcMessage*" + Parameter { name: "prefix"; type: "string" } + Parameter { name: "command"; type: "string" } + Parameter { name: "parameters"; type: "QStringList" } + Parameter { name: "connection"; type: "IrcConnection"; isPointer: true } + } + } + Component { + name: "IrcNetwork" + prototype: "QObject" + exports: ["Communi/IrcNetwork 3.0"] + exportMetaObjectRevisions: [0] + Enum { + name: "ModeType" + values: { + "TypeA": 1, + "TypeB": 2, + "TypeC": 4, + "TypeD": 8, + "AllTypes": 15 + } + } + Enum { + name: "ModeTypes" + values: { + "TypeA": 1, + "TypeB": 2, + "TypeC": 4, + "TypeD": 8, + "AllTypes": 15 + } + } + Enum { + name: "Limit" + values: { + "NickLength": 0, + "ChannelLength": 1, + "TopicLength": 2, + "MessageLength": 3, + "KickReasonLength": 4, + "AwayReasonLength": 5, + "ModeCount": 6 + } + } + Property { name: "initialized"; type: "bool"; isReadonly: true } + Property { name: "name"; type: "string"; isReadonly: true } + Property { name: "modes"; type: "QStringList"; isReadonly: true } + Property { name: "prefixes"; type: "QStringList"; isReadonly: true } + Property { name: "channelTypes"; type: "QStringList"; isReadonly: true } + Property { name: "availableCapabilities"; type: "QStringList"; isReadonly: true } + Property { name: "requestedCapabilities"; type: "QStringList" } + Property { name: "activeCapabilities"; type: "QStringList"; isReadonly: true } + Signal { name: "initialized" } + Signal { + name: "nameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "modesChanged" + Parameter { name: "modes"; type: "QStringList" } + } + Signal { + name: "prefixesChanged" + Parameter { name: "prefixes"; type: "QStringList" } + } + Signal { + name: "channelTypesChanged" + Parameter { name: "types"; type: "QStringList" } + } + Signal { + name: "availableCapabilitiesChanged" + Parameter { name: "capabilities"; type: "QStringList" } + } + Signal { + name: "requestedCapabilitiesChanged" + Parameter { name: "capabilities"; type: "QStringList" } + } + Signal { + name: "activeCapabilitiesChanged" + Parameter { name: "capabilities"; type: "QStringList" } + } + Signal { name: "requestingCapabilities" } + Method { + name: "requestCapability" + type: "bool" + Parameter { name: "capability"; type: "string" } + } + Method { + name: "requestCapabilities" + type: "bool" + Parameter { name: "capabilities"; type: "QStringList" } + } + Method { + name: "setRequestedCapabilities" + Parameter { name: "capabilities"; type: "QStringList" } + } + Method { + name: "modeToPrefix" + type: "string" + Parameter { name: "mode"; type: "string" } + } + Method { + name: "prefixToMode" + type: "string" + Parameter { name: "prefix"; type: "string" } + } + Method { + name: "isChannel" + type: "bool" + Parameter { name: "name"; type: "string" } + } + Method { + name: "channelModes" + type: "QStringList" + Parameter { name: "types"; type: "IrcNetwork::ModeTypes" } + } + Method { + name: "numericLimit" + type: "int" + Parameter { name: "limit"; type: "IrcNetwork::Limit" } + } + Method { + name: "modeLimit" + type: "int" + Parameter { name: "mode"; type: "string" } + } + Method { + name: "channelLimit" + type: "int" + Parameter { name: "type"; type: "string" } + } + Method { + name: "targetLimit" + type: "int" + Parameter { name: "command"; type: "string" } + } + Method { + name: "hasCapability" + type: "bool" + Parameter { name: "capability"; type: "string" } + } + Method { + name: "isCapable" + type: "bool" + Parameter { name: "capability"; type: "string" } + } + } + Component { + name: "IrcPalette" + prototype: "QObject" + exports: ["Communi/IrcPalette 3.0"] + exportMetaObjectRevisions: [0] + Property { name: "white"; type: "string" } + Property { name: "black"; type: "string" } + Property { name: "blue"; type: "string" } + Property { name: "green"; type: "string" } + Property { name: "red"; type: "string" } + Property { name: "brown"; type: "string" } + Property { name: "purple"; type: "string" } + Property { name: "orange"; type: "string" } + Property { name: "yellow"; type: "string" } + Property { name: "lightGreen"; type: "string" } + Property { name: "cyan"; type: "string" } + Property { name: "lightCyan"; type: "string" } + Property { name: "lightBlue"; type: "string" } + Property { name: "pink"; type: "string" } + Property { name: "gray"; type: "string" } + Property { name: "lightGray"; type: "string" } + } + Component { + name: "IrcQmlFilter" + prototype: "QObject" + exports: [ + "Communi/IrcCommandFilter 3.0", + "Communi/IrcFilter 3.0", + "Communi/IrcMessageFilter 3.0" + ] + exportMetaObjectRevisions: [0, 0, 0] + Property { name: "connection"; type: "IrcConnection"; isPointer: true } + } + Component { + name: "IrcTextFormat" + prototype: "QObject" + exports: ["Communi/IrcTextFormat 3.0"] + exportMetaObjectRevisions: [0] + Property { name: "palette"; type: "IrcPalette"; isReadonly: true; isPointer: true } + Property { name: "urlPattern"; type: "string" } + Method { + name: "toHtml" + type: "string" + Parameter { name: "text"; type: "string" } + } + Method { + name: "toPlainText" + type: "string" + Parameter { name: "text"; type: "string" } + } + } + Component { + name: "IrcUser" + prototype: "QObject" + exports: ["Communi/IrcUser 3.0"] + exportMetaObjectRevisions: [0] + Property { name: "title"; type: "string"; isReadonly: true } + Property { name: "name"; type: "string"; isReadonly: true } + Property { name: "prefix"; type: "string"; isReadonly: true } + Property { name: "mode"; type: "string"; isReadonly: true } + Property { name: "channel"; type: "IrcChannel"; isReadonly: true; isPointer: true } + Signal { + name: "titleChanged" + Parameter { name: "title"; type: "string" } + } + Signal { + name: "nameChanged" + Parameter { name: "name"; type: "string" } + } + Signal { + name: "prefixChanged" + Parameter { name: "prefix"; type: "string" } + } + Signal { + name: "modeChanged" + Parameter { name: "mode"; type: "string" } + } + } + Component { + name: "IrcUserModel" + prototype: "QAbstractListModel" + exports: ["Communi/IrcUserModel 3.0"] + exportMetaObjectRevisions: [0] + Property { name: "count"; type: "int"; isReadonly: true } + Property { name: "names"; type: "QStringList"; isReadonly: true } + Property { name: "users"; type: "QList"; isReadonly: true } + Property { name: "displayRole"; type: "Irc::DataRole" } + Property { name: "channel"; type: "IrcChannel"; isPointer: true } + Property { name: "sortMethod"; type: "Irc::SortMethod" } + Property { name: "sortOrder"; type: "Qt::SortOrder" } + Signal { + name: "added" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + Signal { + name: "removed" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + Signal { + name: "aboutToBeAdded" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + Signal { + name: "aboutToBeRemoved" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + Signal { + name: "countChanged" + Parameter { name: "count"; type: "int" } + } + Signal { + name: "namesChanged" + Parameter { name: "names"; type: "QStringList" } + } + Signal { + name: "usersChanged" + Parameter { name: "users"; type: "QList" } + } + Signal { + name: "channelChanged" + Parameter { name: "channel"; type: "IrcChannel"; isPointer: true } + } + Method { name: "clear" } + Method { + name: "sort" + Parameter { name: "column"; type: "int" } + Parameter { name: "order"; type: "Qt::SortOrder" } + } + Method { + name: "sort" + Parameter { name: "column"; type: "int" } + } + Method { name: "sort" } + Method { + name: "sort" + Parameter { name: "method"; type: "Irc::SortMethod" } + Parameter { name: "order"; type: "Qt::SortOrder" } + } + Method { + name: "sort" + Parameter { name: "method"; type: "Irc::SortMethod" } + } + Method { + name: "get" + type: "IrcUser*" + Parameter { name: "index"; type: "int" } + } + Method { + name: "find" + type: "IrcUser*" + Parameter { name: "name"; type: "string" } + } + Method { + name: "contains" + type: "bool" + Parameter { name: "name"; type: "string" } + } + Method { + name: "indexOf" + type: "int" + Parameter { name: "user"; type: "IrcUser"; isPointer: true } + } + } +} diff --git a/src/libcommuni/src/imports/qml2/qml2.pro b/src/libcommuni/src/imports/qml2/qml2.pro new file mode 100644 index 0000000..7a39b94 --- /dev/null +++ b/src/libcommuni/src/imports/qml2/qml2.pro @@ -0,0 +1,30 @@ +###################################################################### +# Communi +###################################################################### + +TARGET = communiplugin +QT = core network qml +TARGETPATH = Communi +DESTDIR = ../../../qml/$$TARGETPATH + +SOURCES += plugin.cpp +OTHER_FILES += qmldir plugins.qmltypes + +isEmpty(IRC_INSTALL_QML):IRC_INSTALL_QML = $$[QT_INSTALL_QML] + +!no_install_qml { + target.path = $$IRC_INSTALL_QML/$$TARGETPATH + INSTALLS += target + + other_files.files = $$OTHER_FILES + other_files.path = $$IRC_INSTALL_QML/$$TARGETPATH + INSTALLS += other_files +} + +for(other_file, OTHER_FILES) { + ARGUMENTS = $${PWD}$${QMAKE_DIR_SEP}$$other_file $$DESTDIR + !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK += && + QMAKE_POST_LINK += $$QMAKE_COPY $$replace(ARGUMENTS, /, $$QMAKE_DIR_SEP) +} + +include(../imports.pri) diff --git a/src/libcommuni/src/imports/qml2/qmldir b/src/libcommuni/src/imports/qml2/qmldir new file mode 100644 index 0000000..659cc21 --- /dev/null +++ b/src/libcommuni/src/imports/qml2/qmldir @@ -0,0 +1,2 @@ +module Communi +plugin communiplugin diff --git a/src/libcommuni/src/model/ircbuffer.cpp b/src/libcommuni/src/model/ircbuffer.cpp new file mode 100644 index 0000000..e7aa6b9 --- /dev/null +++ b/src/libcommuni/src/model/ircbuffer.cpp @@ -0,0 +1,593 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircbuffer.h" +#include "ircbuffer_p.h" +#include "ircbuffermodel.h" +#include "ircbuffermodel_p.h" +#include "ircconnection.h" +#include "ircchannel.h" + +IRC_BEGIN_NAMESPACE + +/*! + \file ircbuffer.h + \brief \#include <IrcBuffer> + */ + +/*! + \class IrcBuffer ircbuffer.h + \ingroup models + \brief Keeps track of buffer status. + + \sa IrcBufferModel +*/ + +/*! + \fn void IrcBuffer::messageReceived(IrcMessage* message) + + This signal is emitted when a buffer specific message is received. + + The message may one of the following types: + - IrcMessage::Join + - IrcMessage::Kick + - IrcMessage::Mode + - IrcMessage::Names + - IrcMessage::Nick + - IrcMessage::Notice + - IrcMessage::Numeric + - IrcMessage::Part + - IrcMessage::Private + - IrcMessage::Quit + - IrcMessage::Topic + + \sa IrcConnection::messageReceived(), IrcBufferModel::messageIgnored() + */ + +#ifndef IRC_DOXYGEN +IrcBufferPrivate::IrcBufferPrivate() + : q_ptr(0), model(0), persistent(false), sticky(false) +{ + qRegisterMetaType(); + qRegisterMetaType >(); +} + +IrcBufferPrivate::~IrcBufferPrivate() +{ +} + +void IrcBufferPrivate::init(const QString& title, IrcBufferModel* m) +{ + name = title; + setModel(m); +} + +void IrcBufferPrivate::connected() +{ + Q_Q(IrcBuffer); + emit q->activeChanged(q->isActive()); +} + +void IrcBufferPrivate::disconnected() +{ + Q_Q(IrcBuffer); + emit q->activeChanged(q->isActive()); +} + +void IrcBufferPrivate::setName(const QString& value) +{ + Q_Q(IrcBuffer); + if (name != value) { + const QString oldTitle = q->title(); + name = value; + emit q->nameChanged(name); + emit q->titleChanged(q->title()); + if (model) + IrcBufferModelPrivate::get(model)->renameBuffer(oldTitle, q->title()); + } +} + +void IrcBufferPrivate::setPrefix(const QString& value) +{ + Q_Q(IrcBuffer); + if (prefix != value) { + const QString oldTitle = q->title(); + prefix = value; + emit q->prefixChanged(prefix); + emit q->titleChanged(q->title()); + if (model) + IrcBufferModelPrivate::get(model)->renameBuffer(oldTitle, q->title()); + } +} + +void IrcBufferPrivate::setModel(IrcBufferModel* value) +{ + model = value; +} + +bool IrcBufferPrivate::processMessage(IrcMessage* message) +{ + Q_Q(IrcBuffer); + bool processed = false; + switch (message->type()) { + case IrcMessage::Join: + processed = processJoinMessage(static_cast(message)); + break; + case IrcMessage::Kick: + processed = processKickMessage(static_cast(message)); + break; + case IrcMessage::Mode: + processed = processModeMessage(static_cast(message)); + break; + case IrcMessage::Names: + processed = processNamesMessage(static_cast(message)); + break; + case IrcMessage::Nick: + processed = processNickMessage(static_cast(message)); + break; + case IrcMessage::Notice: + processed = processNoticeMessage(static_cast(message)); + break; + case IrcMessage::Numeric: + processed = processNumericMessage(static_cast(message)); + break; + case IrcMessage::Part: + processed = processPartMessage(static_cast(message)); + break; + case IrcMessage::Private: + processed = processPrivateMessage(static_cast(message)); + break; + case IrcMessage::Quit: + processed = processQuitMessage(static_cast(message)); + break; + case IrcMessage::Topic: + processed = processTopicMessage(static_cast(message)); + break; + case IrcMessage::WhoReply: + processed = processWhoReplyMessage(static_cast(message)); + break; + default: + break; + } + if (processed) + emit q->messageReceived(message); + return processed; +} + +bool IrcBufferPrivate::processJoinMessage(IrcJoinMessage* message) +{ + Q_UNUSED(message); + return false; +} + +bool IrcBufferPrivate::processKickMessage(IrcKickMessage* message) +{ + Q_UNUSED(message); + return false; +} + +bool IrcBufferPrivate::processModeMessage(IrcModeMessage* message) +{ + Q_UNUSED(message); + return false; +} + +bool IrcBufferPrivate::processNamesMessage(IrcNamesMessage* message) +{ + Q_UNUSED(message); + return false; +} + +bool IrcBufferPrivate::processNickMessage(IrcNickMessage* message) +{ + if (!(message->flags() & IrcMessage::Playback) && !message->nick().compare(name, Qt::CaseInsensitive)) { + setName(message->newNick()); + return true; + } + return !message->newNick().compare(name, Qt::CaseInsensitive); +} + +bool IrcBufferPrivate::processNoticeMessage(IrcNoticeMessage* message) +{ + Q_UNUSED(message); + return true; +} + +bool IrcBufferPrivate::processNumericMessage(IrcNumericMessage* message) +{ + Q_UNUSED(message); + return true; +} + +bool IrcBufferPrivate::processPartMessage(IrcPartMessage* message) +{ + Q_UNUSED(message); + return false; +} + +bool IrcBufferPrivate::processPrivateMessage(IrcPrivateMessage* message) +{ + Q_UNUSED(message); + return true; +} + +bool IrcBufferPrivate::processQuitMessage(IrcQuitMessage* message) +{ + return !message->nick().compare(name, Qt::CaseInsensitive); +} + +bool IrcBufferPrivate::processTopicMessage(IrcTopicMessage* message) +{ + Q_UNUSED(message); + return false; +} + +bool IrcBufferPrivate::processWhoReplyMessage(IrcWhoReplyMessage *message) +{ + Q_UNUSED(message); + return true; +} +#endif // IRC_DOXYGEN + +/*! + Constructs a new buffer object with \a parent. + */ +IrcBuffer::IrcBuffer(QObject* parent) + : QObject(parent), d_ptr(new IrcBufferPrivate) +{ + Q_D(IrcBuffer); + d->q_ptr = this; +} + +/*! + \internal + */ +IrcBuffer::IrcBuffer(IrcBufferPrivate& dd, QObject* parent) + : QObject(parent), d_ptr(&dd) +{ + Q_D(IrcBuffer); + d->q_ptr = this; +} + +/*! + Destructs the buffer object. + */ +IrcBuffer::~IrcBuffer() +{ + emit destroyed(this); +} + +/*! + This property holds the whole buffer title. + + The title consists of \ref prefix and \ref name. + + \par Access function: + \li QString title() const + + \par Notifier signal: + \li void titleChanged(const QString& title) + */ +QString IrcBuffer::title() const +{ + Q_D(const IrcBuffer); + return d->prefix + d->name; +} + +/*! + This property holds the name part of the buffer \ref title. + + \par Access functions: + \li QString name() const + \li void setName(const QString& name) [slot] + + \par Notifier signal: + \li void nameChanged(const QString& name) + */ +QString IrcBuffer::name() const +{ + Q_D(const IrcBuffer); + return d->name; +} + +void IrcBuffer::setName(const QString& name) +{ + Q_D(IrcBuffer); + d->setName(name); +} + +/*! + This property holds the prefix part of the buffer \ref title. + + \par Access functions: + \li QString prefix() const + \li void setPrefix(const QString& prefix) [slot] + + \par Notifier signal: + \li void prefixChanged(const QString& prefix) + */ +QString IrcBuffer::prefix() const +{ + Q_D(const IrcBuffer); + return d->prefix; +} + +void IrcBuffer::setPrefix(const QString& prefix) +{ + Q_D(IrcBuffer); + return d->setPrefix(prefix); +} + +/*! + \property bool IrcBuffer::channel + This property holds whether the buffer is a channel. + + \par Access function: + \li bool isChannel() const + + \sa toChannel() + */ +bool IrcBuffer::isChannel() const +{ + return qobject_cast(this); +} + +/*! + Returns the buffer cast to a IrcChannel, + if the class is actually a channel, \c 0 otherwise. + + \sa \ref channel "isChannel()" +*/ +IrcChannel* IrcBuffer::toChannel() +{ + return qobject_cast(this); +} + +/*! + This property holds the connection of the buffer. + + \par Access function: + \li \ref IrcConnection* connection() const + */ +IrcConnection* IrcBuffer::connection() const +{ + Q_D(const IrcBuffer); + return d->model ? d->model->connection() : 0; +} + +/*! + This property holds the network of the buffer. + + \par Access function: + \li \ref IrcNetwork* network() const + */ +IrcNetwork* IrcBuffer::network() const +{ + Q_D(const IrcBuffer); + return d->model ? d->model->network() : 0; +} + +/*! + This property holds the model of the buffer. + + \par Access function: + \li \ref IrcBufferModel* model() const + */ +IrcBufferModel* IrcBuffer::model() const +{ + Q_D(const IrcBuffer); + return d->model; +} + +/*! + \property bool IrcBuffer::active + This property holds whether the buffer is active. + + A buffer is considered active when a %connection is established. Furthermore, + channel buffers are only considered active when the user is on the channel. + + \par Access function: + \li bool isActive() const + + \par Notifier signal: + \li void activeChanged(bool active) + + \sa IrcConnection::connected + */ +bool IrcBuffer::isActive() const +{ + if (IrcConnection* c = connection()) + return c->isConnected(); + return false; +} + +/*! + \property bool IrcBuffer::sticky + This property holds whether the buffer is sticky. + + A sticky buffer stays in the beginning (Qt::AscendingOrder) or + end (Qt::DescendingOrder) of the list of buffers in IrcBufferModel. + + The default value is \c false. + + \par Access functions: + \li bool isSticky() const + \li void setSticky(bool sticky) + + \par Notifier signal: + \li void stickyChanged(bool sticky) + */ + +bool IrcBuffer::isSticky() const +{ + Q_D(const IrcBuffer); + return d->sticky; +} + +void IrcBuffer::setSticky(bool sticky) +{ + Q_D(IrcBuffer); + if (d->sticky != sticky) { + d->sticky = sticky; + emit stickyChanged(sticky); + } +} + +/*! + \property bool IrcBuffer::persistent + This property holds whether the buffer is persistent. + + The default value is \c false. + + A persistent buffer does not get removed and destructed + when calling IrcBufferModel::clear(), or when when leaving + the corresponding channel. In order to remove a persistent + buffer, either explicitly call IrcBufferModel::remove() or + delete the buffer. + + \par Access functions: + \li bool isPersistent() const + \li void setPersistent(bool persistent) + + \par Notifier signal: + \li void persistentChanged(bool persistent) + */ + +bool IrcBuffer::isPersistent() const +{ + Q_D(const IrcBuffer); + return d->persistent; +} + +void IrcBuffer::setPersistent(bool persistent) +{ + Q_D(IrcBuffer); + if (d->persistent != persistent) { + d->persistent = persistent; + emit persistentChanged(persistent); + } +} + +/*! + \since 3.1 + + This property holds arbitrary user data. + + \par Access functions: + \li QVariantMap userData() const + \li void setUserData(const QVariantMap& data) + + \par Notifier signal: + \li void userDataChanged(const QVariantMap& data) + */ +QVariantMap IrcBuffer::userData() const +{ + Q_D(const IrcBuffer); + return d->userData; +} + +void IrcBuffer::setUserData(const QVariantMap& data) +{ + Q_D(IrcBuffer); + if (d->userData != data) { + d->userData = data; + emit userDataChanged(data); + } +} + +/*! + Sends a \a command to the server. + + This method is provided for convenience. It is equal to: + \code + IrcConnection* connection = buffer->connection(); + connection->sendCommand(command); + \endcode + + \sa IrcConnection::sendCommand() + */ +bool IrcBuffer::sendCommand(IrcCommand* command) +{ + if (IrcConnection* c = connection()) + return c->sendCommand(command); + return false; +} + +/*! + Emits messageReceived() with \a message. + + IrcBufferModel handles only buffer specific messages and delivers them + to the appropriate IrcBuffer instances. When applications decide to handle + IrcBuffer::messageReceived(), IrcBufferModel::messageIgnored() makes it + easy to implement handling for the rest, non-buffer specific messages. + This method can be used to forward such ignored messages to the desired + buffers (for instance the one that is currently active in the GUI). + */ +void IrcBuffer::receiveMessage(IrcMessage* message) +{ + if (message) + emit messageReceived(message); +} + +/*! + \since 3.1 + + Closes the buffer with an optional \a reason. + + The default implementation removes the buffer from its \ref model. + Furthermore, IrcChannel parts the channel with \a reason and custom + IrcBuffer subclasses might do some additional tasks. + + \sa IrcChannel::close() + */ +void IrcBuffer::close(const QString& reason) +{ + Q_UNUSED(reason); + Q_D(const IrcBuffer); + if (d->model) + d->model->remove(this); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, const IrcBuffer* buffer) +{ + if (!buffer) + return debug << "IrcBuffer(0x0) "; + debug.nospace() << buffer->metaObject()->className() << '(' << (void*) buffer; + if (!buffer->objectName().isEmpty()) + debug.nospace() << ", name=" << qPrintable(buffer->objectName()); + if (!buffer->title().isEmpty()) + debug.nospace() << ", title=" << qPrintable(buffer->title()); + debug.nospace() << ')'; + return debug.space(); +} +#endif // QT_NO_DEBUG_STREAM + +#include "moc_ircbuffer.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/model/ircbuffermodel.cpp b/src/libcommuni/src/model/ircbuffermodel.cpp new file mode 100644 index 0000000..c037a53 --- /dev/null +++ b/src/libcommuni/src/model/ircbuffermodel.cpp @@ -0,0 +1,1168 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircbuffermodel.h" +#include "ircbuffermodel_p.h" +#include "ircchannel_p.h" +#include "ircbuffer_p.h" +#include "ircnetwork.h" +#include "ircchannel.h" +#include "ircmessage.h" +#include "irccommand.h" +#include "ircconnection.h" +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file ircbuffermodel.h + \brief \#include <IrcBufferModel> + */ + +/*! + \class IrcBufferModel ircbuffermodel.h + \ingroup models + \brief Keeps track of buffers. + + IrcBufferModel automatically keeps track of channel and query buffers + and manages IrcBuffer instances for them. It will notify via signals + when channel and query buffers are added and/or removed. IrcBufferModel + can be used directly as a data model for Qt's item views - both in C++ + and QML. + + \code + IrcConnection* connection = new IrcConnection(this); + IrcBufferModel* model = new IrcBufferModel(connection); + connect(model, SIGNAL(added(IrcBuffer*)), this, SLOT(onBufferAdded(IrcBuffer*))); + connect(model, SIGNAL(removed(IrcBuffer*)), this, SLOT(onBufferRemoved(IrcBuffer*))); + listView->setModel(model); + \endcode + */ + +/*! + \fn void IrcBufferModel::added(IrcBuffer* buffer) + + This signal is emitted when a \a buffer is added to the list of buffers. + */ + +/*! + \fn void IrcBufferModel::removed(IrcBuffer* buffer) + + This signal is emitted when a \a buffer is removed from the list of buffers. + */ + +/*! + \fn void IrcBufferModel::aboutToBeAdded(IrcBuffer* buffer) + + This signal is emitted just before a \a buffer is added to the list of buffers. + */ + +/*! + \fn void IrcBufferModel::aboutToBeRemoved(IrcBuffer* buffer) + + This signal is emitted just before a \a buffer is removed from the list of buffers. + */ + +/*! + \fn void IrcBufferModel::messageIgnored(IrcMessage* message) + + This signal is emitted when a message was ignored. + + IrcBufferModel handles only buffer specific messages and delivers + them to the appropriate IrcBuffer instances. When applications decide + to handle IrcBuffer::messageReceived(), this signal makes it easy to + implement handling for the rest, non-buffer specific messages. + + \sa IrcConnection::messageReceived(), IrcBuffer::messageReceived() + */ + +#ifndef IRC_DOXYGEN +class IrcBufferLessThan +{ +public: + IrcBufferLessThan(IrcBufferModel* model, Irc::SortMethod method) : model(model), method(method) { } + bool operator()(IrcBuffer* b1, IrcBuffer* b2) const { return model->lessThan(b1, b2, method); } +private: + IrcBufferModel* model; + Irc::SortMethod method; +}; + +class IrcBufferGreaterThan +{ +public: + IrcBufferGreaterThan(IrcBufferModel* model, Irc::SortMethod method) : model(model), method(method) { } + bool operator()(IrcBuffer* b1, IrcBuffer* b2) const { return model->lessThan(b2, b1, method); } +private: + IrcBufferModel* model; + Irc::SortMethod method; +}; + +IrcBufferModelPrivate::IrcBufferModelPrivate() : q_ptr(0), role(Irc::TitleRole), + sortMethod(Irc::SortByHand), sortOrder(Qt::AscendingOrder), + bufferProto(0), channelProto(0), persistent(false) +{ +} + +bool IrcBufferModelPrivate::messageFilter(IrcMessage* msg) +{ + Q_Q(IrcBufferModel); + if (msg->type() == IrcMessage::Join && msg->flags() & IrcMessage::Own) + createBuffer(static_cast(msg)->channel()); + + bool processed = false; + switch (msg->type()) { + case IrcMessage::Nick: + case IrcMessage::Quit: + foreach (IrcBuffer* buffer, bufferList) { + if (buffer->isActive()) + IrcBufferPrivate::get(buffer)->processMessage(msg); + } + processed = true; + break; + + case IrcMessage::Join: + case IrcMessage::Part: + case IrcMessage::Kick: + case IrcMessage::Names: + case IrcMessage::Topic: + processed = processMessage(msg->property("channel").toString(), msg); + break; + + case IrcMessage::WhoReply: + processed = processMessage(static_cast(msg)->mask(), msg); + break; + + case IrcMessage::Private: + if (IrcPrivateMessage* pm = static_cast(msg)) + processed = !pm->isRequest() && (processMessage(pm->target(), pm, pm->flags() & IrcMessage::Own) || processMessage(pm->nick(), pm, true)); + break; + + case IrcMessage::Notice: + if (IrcNoticeMessage* no = static_cast(msg)) + processed = !no->isReply() && (processMessage(no->target(), no, no->flags() & IrcMessage::Own) || processMessage(no->nick(), no)); + break; + + case IrcMessage::Mode: + processed = processMessage(static_cast(msg)->target(), msg); + break; + + case IrcMessage::Numeric: + // TODO: any other special cases besides RPL_NAMREPLY? + if (static_cast(msg)->code() == Irc::RPL_NAMREPLY) { + const int count = msg->parameters().count(); + const QString channel = msg->parameters().value(count - 2); + processed = processMessage(channel, msg); + } else { + processed = processMessage(msg->parameters().value(1), msg); + } + break; + + default: + break; + } + + if (!processed) + emit q->messageIgnored(msg); + + if (!(msg->flags() & IrcMessage::Playback)) { + if (msg->type() == IrcMessage::Part && msg->flags() & IrcMessage::Own) { + destroyBuffer(static_cast(msg)->channel()); + } else if (msg->type() == IrcMessage::Kick) { + const IrcKickMessage* kickMsg = static_cast(msg); + if (!kickMsg->user().compare(msg->connection()->nickName(), Qt::CaseInsensitive)) + destroyBuffer(kickMsg->channel()); + } + } + return false; +} + +bool IrcBufferModelPrivate::commandFilter(IrcCommand* cmd) +{ + if (cmd->type() == IrcCommand::Join) { + const QString channel = cmd->parameters().value(0).toLower(); + const QString key = cmd->parameters().value(1); + if (!key.isEmpty()) + keys.insert(channel, key); + else + keys.remove(channel); + } + return false; +} + +IrcBuffer* IrcBufferModelPrivate::createBufferHelper(const QString& title) +{ + Q_Q(IrcBufferModel); + IrcBuffer* buffer = 0; + const QMetaObject* metaObject = q->metaObject(); + int idx = metaObject->indexOfMethod("createBuffer(QVariant)"); + if (idx != -1) { + // QML: QVariant createBuffer(QVariant) + QVariant ret; + QMetaMethod method = metaObject->method(idx); + method.invoke(q, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, title)); + buffer = ret.value(); + } else { + // C++: IrcBuffer* createBuffer(QString) + idx = metaObject->indexOfMethod("createBuffer(QString)"); + QMetaMethod method = metaObject->method(idx); + method.invoke(q, Q_RETURN_ARG(IrcBuffer*, buffer), Q_ARG(QString, title)); + } + return buffer; +} + +IrcChannel* IrcBufferModelPrivate::createChannelHelper(const QString& title) +{ + Q_Q(IrcBufferModel); + IrcChannel* channel = 0; + const QMetaObject* metaObject = q->metaObject(); + int idx = metaObject->indexOfMethod("createChannel(QVariant)"); + if (idx != -1) { + // QML: QVariant createChannel(QVariant) + QVariant ret; + QMetaMethod method = metaObject->method(idx); + method.invoke(q, Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, title)); + channel = ret.value(); + } else { + // C++: IrcChannel* createChannel(QString) + idx = metaObject->indexOfMethod("createChannel(QString)"); + QMetaMethod method = metaObject->method(idx); + method.invoke(q, Q_RETURN_ARG(IrcChannel*, channel), Q_ARG(QString, title)); + } + return channel; +} + +IrcBuffer* IrcBufferModelPrivate::createBuffer(const QString& title) +{ + Q_Q(IrcBufferModel); + IrcBuffer* buffer = bufferMap.value(title.toLower()); + if (!buffer) { + if (connection && connection->network()->isChannel(title)) + buffer = createChannelHelper(title); + else + buffer = createBufferHelper(title); + if (buffer) { + IrcBufferPrivate::get(buffer)->init(title, q); + addBuffer(buffer); + } + } + return buffer; +} + +void IrcBufferModelPrivate::destroyBuffer(const QString& title, bool force) +{ + IrcBuffer* buffer = bufferMap.value(title.toLower()); + if (buffer && (force || (!persistent && !buffer->isPersistent()))) { + removeBuffer(buffer); + buffer->deleteLater(); + } +} + +void IrcBufferModelPrivate::addBuffer(IrcBuffer* buffer, bool notify) +{ + insertBuffer(-1, buffer, notify); +} + +void IrcBufferModelPrivate::insertBuffer(int index, IrcBuffer* buffer, bool notify) +{ + Q_Q(IrcBufferModel); + if (buffer && !bufferList.contains(buffer)) { + const QString title = buffer->title(); + const QString lower = title.toLower(); + if (bufferMap.contains(lower)) { + qWarning() << "IrcBufferModel: ignored duplicate buffer" << title; + return; + } + IrcBufferPrivate::get(buffer)->setModel(q); + const bool isChannel = buffer->isChannel(); + if (sortMethod != Irc::SortByHand) { + QList::iterator it; + if (sortOrder == Qt::AscendingOrder) + it = qUpperBound(bufferList.begin(), bufferList.end(), buffer, IrcBufferLessThan(q, sortMethod)); + else + it = qUpperBound(bufferList.begin(), bufferList.end(), buffer, IrcBufferGreaterThan(q, sortMethod)); + index = it - bufferList.begin(); + } else if (index == -1) { + index = bufferList.count(); + } + if (notify) + emit q->aboutToBeAdded(buffer); + q->beginInsertRows(QModelIndex(), index, index); + bufferList.insert(index, buffer); + bufferMap.insert(lower, buffer); + if (isChannel) { + channels += title; + if (keys.contains(lower)) + IrcChannelPrivate::get(buffer->toChannel())->setKey(keys.take(lower)); + } + q->connect(buffer, SIGNAL(destroyed(IrcBuffer*)), SLOT(_irc_bufferDestroyed(IrcBuffer*))); + q->endInsertRows(); + if (notify) { + emit q->added(buffer); + if (isChannel) + emit q->channelsChanged(channels); + emit q->buffersChanged(bufferList); + emit q->countChanged(bufferList.count()); + if (bufferList.count() == 1) + emit q->emptyChanged(false); + } + } +} + +void IrcBufferModelPrivate::removeBuffer(IrcBuffer* buffer, bool notify) +{ + Q_Q(IrcBufferModel); + int idx = bufferList.indexOf(buffer); + if (idx != -1) { + const bool isChannel = buffer->isChannel(); + if (notify) + emit q->aboutToBeRemoved(buffer); + q->beginRemoveRows(QModelIndex(), idx, idx); + bufferList.removeAt(idx); + bufferMap.remove(buffer->title().toLower()); + if (isChannel) + channels.removeOne(buffer->title()); + q->endRemoveRows(); + if (notify) { + emit q->removed(buffer); + if (isChannel) + emit q->channelsChanged(channels); + emit q->buffersChanged(bufferList); + emit q->countChanged(bufferList.count()); + if (bufferList.isEmpty()) + emit q->emptyChanged(true); + } + } +} + +bool IrcBufferModelPrivate::renameBuffer(const QString& from, const QString& to) +{ + Q_Q(IrcBufferModel); + const QString fromLower = from.toLower(); + const QString toLower = to.toLower(); + if (bufferMap.contains(toLower)) + destroyBuffer(toLower, true); + if (bufferMap.contains(fromLower)) { + IrcBuffer* buffer = bufferMap.take(fromLower); + bufferMap.insert(toLower, buffer); + + const int idx = bufferList.indexOf(buffer); + QModelIndex index = q->index(idx); + emit q->dataChanged(index, index); + + if (sortMethod != Irc::SortByHand) { + QList buffers = bufferList; + const bool notify = false; + removeBuffer(buffer, notify); + insertBuffer(-1, buffer, notify); + if (buffers != bufferList) + emit q->buffersChanged(bufferList); + } + return true; + } + return false; +} + +bool IrcBufferModelPrivate::processMessage(const QString& title, IrcMessage* message, bool create) +{ + IrcBuffer* buffer = bufferMap.value(title.toLower()); + if (!buffer && create && !title.contains(QLatin1Char('*'))) + buffer = createBuffer(title); + if (buffer) + return IrcBufferPrivate::get(buffer)->processMessage(message); + return false; +} + +void IrcBufferModelPrivate::_irc_connected() +{ + foreach (IrcBuffer* buffer, bufferList) + IrcBufferPrivate::get(buffer)->connected(); +} + +void IrcBufferModelPrivate::_irc_disconnected() +{ + foreach (IrcBuffer* buffer, bufferList) + IrcBufferPrivate::get(buffer)->disconnected(); +} + +void IrcBufferModelPrivate::_irc_bufferDestroyed(IrcBuffer* buffer) +{ + removeBuffer(buffer); +} +#endif // IRC_DOXYGEN + +/*! + Constructs a new model with \a parent. + + \note If \a parent is an instance of IrcConnection, it will be + automatically assigned to \ref IrcBufferModel::connection "connection". + */ +IrcBufferModel::IrcBufferModel(QObject* parent) + : QAbstractListModel(parent), d_ptr(new IrcBufferModelPrivate) +{ + Q_D(IrcBufferModel); + d->q_ptr = this; + setBufferPrototype(new IrcBuffer(this)); + setChannelPrototype(new IrcChannel(this)); + setConnection(qobject_cast(parent)); +} + +/*! + Destructs the model. + */ +IrcBufferModel::~IrcBufferModel() +{ + Q_D(IrcBufferModel); + foreach (IrcBuffer* buffer, d->bufferList) { + buffer->disconnect(this); + delete buffer; + } + d->bufferList.clear(); + d->bufferMap.clear(); + d->channels.clear(); + emit destroyed(this); +} + +/*! + This property holds the connection. + + \par Access functions: + \li \ref IrcConnection* connection() const + \li void setConnection(\ref IrcConnection* connection) + + \warning Changing the connection on the fly is not supported. + */ +IrcConnection* IrcBufferModel::connection() const +{ + Q_D(const IrcBufferModel); + return d->connection; +} + +void IrcBufferModel::setConnection(IrcConnection* connection) +{ + Q_D(IrcBufferModel); + if (d->connection != connection) { + if (d->connection) { + qCritical("IrcBufferModel::setConnection(): changing the connection on the fly is not supported."); + return; + } + d->connection = connection; + d->connection->installMessageFilter(d); + d->connection->installCommandFilter(d); + connect(d->connection, SIGNAL(connected()), this, SLOT(_irc_connected())); + connect(d->connection, SIGNAL(disconnected()), this, SLOT(_irc_disconnected())); + emit connectionChanged(connection); + emit networkChanged(network()); + } +} + +/*! + This property holds the network. + + \par Access functions: + \li \ref IrcNetwork* network() const + */ +IrcNetwork* IrcBufferModel::network() const +{ + Q_D(const IrcBufferModel); + return d->connection ? d->connection->network() : 0; +} + +/*! + This property holds the number of buffers. + + \par Access function: + \li int count() const + + \par Notifier signal: + \li void countChanged(int count) + */ +int IrcBufferModel::count() const +{ + return rowCount(); +} + +/*! + \since 3.1 + \property bool IrcBufferModel::empty + + This property holds the whether the model is empty. + + \par Access function: + \li bool isEmpty() const + + \par Notifier signal: + \li void emptyChanged(bool empty) + */ +bool IrcBufferModel::isEmpty() const +{ + Q_D(const IrcBufferModel); + return d->bufferList.isEmpty(); +} + +/*! + This property holds the list of channel names. + + \par Access function: + \li QStringList channels() const + + \par Notifier signal: + \li void channelsChanged(const QStringList& channels) + */ +QStringList IrcBufferModel::channels() const +{ + Q_D(const IrcBufferModel); + return d->channels; +} + +/*! + This property holds the list of buffers. + + \par Access function: + \li QList<\ref IrcBuffer*> buffers() const + + \par Notifier signal: + \li void buffersChanged(const QList<\ref IrcBuffer*>& buffers) + */ +QList IrcBufferModel::buffers() const +{ + Q_D(const IrcBufferModel); + return d->bufferList; +} + +/*! + Returns the buffer object at \a index. + */ +IrcBuffer* IrcBufferModel::get(int index) const +{ + Q_D(const IrcBufferModel); + return d->bufferList.value(index); +} + +/*! + Returns the buffer object for \a title or \c 0 if not found. + */ +IrcBuffer* IrcBufferModel::find(const QString& title) const +{ + Q_D(const IrcBufferModel); + return d->bufferMap.value(title.toLower()); +} + +/*! + Returns \c true if the model contains \a title. + */ +bool IrcBufferModel::contains(const QString& title) const +{ + Q_D(const IrcBufferModel); + return d->bufferMap.contains(title.toLower()); +} + +/*! + Returns the index of the specified \a buffer, + or \c -1 if the model does not contain the \a buffer. + */ +int IrcBufferModel::indexOf(IrcBuffer* buffer) const +{ + Q_D(const IrcBufferModel); + return d->bufferList.indexOf(buffer); +} + +/*! + Adds a buffer with \a title to the model and returns it. + */ +IrcBuffer* IrcBufferModel::add(const QString& title) +{ + Q_D(IrcBufferModel); + return d->createBuffer(title); +} + +/*! + Adds the \a buffer to the model. + */ +void IrcBufferModel::add(IrcBuffer* buffer) +{ + Q_D(IrcBufferModel); + d->addBuffer(buffer); +} + +/*! + Removes and destroys a buffer with \a title from the model. + */ +void IrcBufferModel::remove(const QString& title) +{ + Q_D(IrcBufferModel); + d->destroyBuffer(title, true); +} + +/*! + Removes and destroys a \a buffer from the model. + */ +void IrcBufferModel::remove(IrcBuffer* buffer) +{ + delete buffer; +} + +/*! + This property holds the display role. + + The specified data role is returned for Qt::DisplayRole. + + The default value is \ref Irc::TitleRole. + + \par Access functions: + \li \ref Irc::DataRole displayRole() const + \li void setDisplayRole(\ref Irc::DataRole role) + */ +Irc::DataRole IrcBufferModel::displayRole() const +{ + Q_D(const IrcBufferModel); + return d->role; +} + +void IrcBufferModel::setDisplayRole(Irc::DataRole role) +{ + Q_D(IrcBufferModel); + d->role = role; +} + +/*! + \since 3.1 + + \property bool IrcBufferModel::persistent + This property holds whether the model is persistent. + + The default value is \c false. + + A persistent model does not remove and destruct channel buffers + automatically when leaving the corresponding channels. In order + to remove buffers from a persistent model, either call + IrcBufferModel::remove() or delete the buffer. + + \par Access functions: + \li bool isPersistent() const + \li void setPersistent(bool persistent) + + \par Notifier signal: + \li void persistentChanged(bool persistent) + */ +bool IrcBufferModel::isPersistent() const +{ + Q_D(const IrcBufferModel); + return d->persistent; +} + +void IrcBufferModel::setPersistent(bool persistent) +{ + Q_D(IrcBufferModel); + if (d->persistent != persistent) { + d->persistent = persistent; + emit persistentChanged(persistent); + } +} + +/*! + Returns the model index for \a buffer. + */ +QModelIndex IrcBufferModel::index(IrcBuffer* buffer) const +{ + Q_D(const IrcBufferModel); + return index(d->bufferList.indexOf(buffer)); +} + +/*! + Returns the buffer for model \a index. + */ +IrcBuffer* IrcBufferModel::buffer(const QModelIndex& index) const +{ + if (!hasIndex(index.row(), index.column())) + return 0; + + return static_cast(index.internalPointer()); +} + +/*! + This property holds the model sort order. + + The default value is \c Qt::AscendingOrder. + + \par Access functions: + \li Qt::SortOrder sortOrder() const + \li void setSortOrder(Qt::SortOrder order) + + \sa sort(), lessThan() + */ +Qt::SortOrder IrcBufferModel::sortOrder() const +{ + Q_D(const IrcBufferModel); + return d->sortOrder; +} + +void IrcBufferModel::setSortOrder(Qt::SortOrder order) +{ + Q_D(IrcBufferModel); + if (d->sortOrder != order) { + d->sortOrder = order; + if (d->sortMethod != Irc::SortByHand && !d->bufferList.isEmpty()) + sort(d->sortMethod, d->sortOrder); + } +} + +/*! + This property holds the model sort method. + + The default value is \c Irc::SortByHand. + + Method | Description | Example + -----------------|-------------------------------------------------------------------|------------------------------------------------- + Irc::SortByHand | Buffers are not sorted automatically, but only by calling sort(). | - + Irc::SortByName | Buffers are sorted alphabetically, ignoring any channel prefix. | "bot", "#communi", "#freenode", "jpnurmi", "#qt" + Irc::SortByTitle | Buffers are sorted alphabetically, and channels before queries. | "#communi", "#freenode", "#qt", "bot", "jpnurmi" + + \par Access functions: + \li Irc::SortMethod sortMethod() const + \li void setSortMethod(Irc::SortMethod method) + + \sa sort(), lessThan() + */ +Irc::SortMethod IrcBufferModel::sortMethod() const +{ + Q_D(const IrcBufferModel); + return d->sortMethod; +} + +void IrcBufferModel::setSortMethod(Irc::SortMethod method) +{ + Q_D(IrcBufferModel); + if (d->sortMethod != method) { + d->sortMethod = method; + if (d->sortMethod != Irc::SortByHand && !d->bufferList.isEmpty()) + sort(d->sortMethod, d->sortOrder); + } +} + +/*! + Clears the model. + + All buffers except \ref IrcBuffer::persistent "persistent" buffers are removed and destroyed. + + In order to remove a persistent buffer, either explicitly call remove() or delete the buffer. + */ +void IrcBufferModel::clear() +{ + Q_D(IrcBufferModel); + if (!d->bufferList.isEmpty()) { + bool bufferRemoved = false; + bool channelRemoved = false; + foreach (IrcBuffer* buffer, d->bufferList) { + if (!buffer->isPersistent()) { + if (!bufferRemoved) { + beginResetModel(); + bufferRemoved = true; + } + channelRemoved |= buffer->isChannel(); + buffer->disconnect(this); + d->bufferList.removeOne(buffer); + d->channels.removeOne(buffer->title()); + d->bufferMap.remove(buffer->title().toLower()); + delete buffer; + } + } + if (bufferRemoved) { + endResetModel(); + if (channelRemoved) + emit channelsChanged(d->channels); + emit buffersChanged(d->bufferList); + emit countChanged(d->bufferList.count()); + if (d->bufferList.isEmpty()) + emit emptyChanged(true); + } + } +} + +/*! + Makes the model receive and handle \a message. + */ +void IrcBufferModel::receiveMessage(IrcMessage* message) +{ + Q_D(IrcBufferModel); + d->messageFilter(message); +} + +/*! + Sorts the model using the given \a order. + */ +void IrcBufferModel::sort(int column, Qt::SortOrder order) +{ + Q_D(IrcBufferModel); + if (column == 0) + sort(d->sortMethod, order); +} + +/*! + Sorts the model using the given \a method and \a order. + + \sa lessThan() + */ +void IrcBufferModel::sort(Irc::SortMethod method, Qt::SortOrder order) +{ + Q_D(IrcBufferModel); + if (method == Irc::SortByHand) + return; + + emit layoutAboutToBeChanged(); + + QList persistentBuffers; + QModelIndexList oldPersistentIndexes = persistentIndexList(); + foreach (const QModelIndex& index, oldPersistentIndexes) + persistentBuffers += static_cast(index.internalPointer()); + + if (order == Qt::AscendingOrder) + qSort(d->bufferList.begin(), d->bufferList.end(), IrcBufferLessThan(this, method)); + else + qSort(d->bufferList.begin(), d->bufferList.end(), IrcBufferGreaterThan(this, method)); + + QModelIndexList newPersistentIndexes; + foreach (IrcBuffer* buffer, persistentBuffers) + newPersistentIndexes += index(d->bufferList.indexOf(buffer)); + changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); + + emit layoutChanged(); +} + +/*! + Creates a buffer object with \a title. + + IrcBufferModel will automatically call this factory method when a + need for the buffer object occurs ie. a private message is received. + + The default implementation creates an instance of the buffer prototype. + Reimplement this function in order to alter the default behavior. + + \sa bufferPrototype + */ +IrcBuffer* IrcBufferModel::createBuffer(const QString& title) +{ + Q_D(IrcBufferModel); + Q_UNUSED(title); + QObject* instance = d->bufferProto->metaObject()->newInstance(Q_ARG(QObject*, this)); + return qobject_cast(instance); +} + +/*! + Creates a channel object with \a title. + + IrcBufferModel will automatically call this factory method when a + need for the channel object occurs ie. a channel is being joined. + + The default implementation creates an instance of the channel prototype. + Reimplement this function in order to alter the default behavior. + + \sa channelPrototype + */ +IrcChannel* IrcBufferModel::createChannel(const QString& title) +{ + Q_D(IrcBufferModel); + Q_UNUSED(title); + QObject* instance = d->channelProto->metaObject()->newInstance(Q_ARG(QObject*, this)); + return qobject_cast(instance); +} + +/*! + Returns \c true if \a one buffer is "less than" \a another, + otherwise returns \c false. + + The default implementation sorts according to the specified sort method. + Reimplement this function in order to customize the sort order. + + \sa sort(), sortMethod + */ +bool IrcBufferModel::lessThan(IrcBuffer* one, IrcBuffer* another, Irc::SortMethod method) const +{ + if (one->isSticky() != another->isSticky()) + return one->isSticky(); + + if (method == Irc::SortByTitle) { + const QStringList prefixes = one->network()->channelTypes(); + + const QString p1 = one->prefix(); + const QString p2 = another->prefix(); + + const int i1 = !p1.isEmpty() ? prefixes.indexOf(p1.at(0)) : -1; + const int i2 = !p2.isEmpty() ? prefixes.indexOf(p2.at(0)) : -1; + + if (i1 >= 0 && i2 < 0) + return true; + if (i1 < 0 && i2 >= 0) + return false; + if (i1 >= 0 && i2 >= 0 && i1 != i2) + return i1 < i2; + } + + // Irc::SortByName + const QString n1 = one->name(); + const QString n2 = another->name(); + return n1.compare(n2, Qt::CaseInsensitive) < 0; +} + +/*! + The following role names are provided by default: + + Role | Name | Type | Example + -----------------|------------|-------------|-------- + Qt::DisplayRole | "display" | 1) | - + Irc::BufferRole | "buffer" | IrcBuffer* | <object> + Irc::ChannelRole | "channel" | IrcChannel* | <object> + Irc::NameRole | "name" | QString | "communi" + Irc::PrefixRole | "prefix" | QString | "#" + Irc::TitleRole | "title" | QString | "#communi" + + 1) The type depends on \ref displayRole. + */ +QHash IrcBufferModel::roleNames() const +{ + QHash roles; + roles[Qt::DisplayRole] = "display"; + roles[Irc::BufferRole] = "buffer"; + roles[Irc::ChannelRole] = "channel"; + roles[Irc::NameRole] = "name"; + roles[Irc::PrefixRole] = "prefix"; + roles[Irc::TitleRole] = "title"; + return roles; +} + +/*! + Returns the number of buffers. + */ +int IrcBufferModel::rowCount(const QModelIndex& parent) const +{ + if (parent.isValid()) + return 0; + + Q_D(const IrcBufferModel); + return d->bufferList.count(); +} + +/*! + Returns the data for specified \a role and user referred to by by the \a index. + */ +QVariant IrcBufferModel::data(const QModelIndex& index, int role) const +{ + Q_D(const IrcBufferModel); + if (!hasIndex(index.row(), index.column(), index.parent())) + return QVariant(); + + IrcBuffer* buffer = static_cast(index.internalPointer()); + Q_ASSERT(buffer); + + switch (role) { + case Qt::DisplayRole: + return data(index, d->role); + case Irc::BufferRole: + return QVariant::fromValue(buffer); + case Irc::ChannelRole: + return QVariant::fromValue(buffer->toChannel()); + case Irc::NameRole: + return buffer->name(); + case Irc::PrefixRole: + return buffer->prefix(); + case Irc::TitleRole: + return buffer->title(); + } + + return QVariant(); +} + +/*! + Returns the index of the item in the model specified by the given \a row, \a column and \a parent index. + */ +QModelIndex IrcBufferModel::index(int row, int column, const QModelIndex& parent) const +{ + Q_D(const IrcBufferModel); + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + return createIndex(row, column, d->bufferList.at(row)); +} + +/*! + This property holds the buffer prototype. + + The prototype is used by the default implementation of createBuffer(). + + \note The prototype must have an invokable constructor. + + \par Access functions: + \li \ref IrcBuffer* bufferPrototype() const + \li void setBufferPrototype(\ref IrcBuffer* prototype) + */ +IrcBuffer* IrcBufferModel::bufferPrototype() const +{ + Q_D(const IrcBufferModel); + return d->bufferProto; +} + +void IrcBufferModel::setBufferPrototype(IrcBuffer* prototype) +{ + Q_D(IrcBufferModel); + if (d->bufferProto != prototype) { + if (d->bufferProto && d->bufferProto->parent() == this) + delete d->bufferProto; + d->bufferProto = prototype ? prototype : new IrcBuffer(this); + emit bufferPrototypeChanged(d->bufferProto); + } +} + +/*! + This property holds the channel prototype. + + The prototype is used by the default implementation of createChannel(). + + \note The prototype must have an invokable constructor. + + \par Access functions: + \li \ref IrcChannel* channelPrototype() const + \li void setChannelPrototype(\ref IrcChannel* prototype) + */ +IrcChannel* IrcBufferModel::channelPrototype() const +{ + Q_D(const IrcBufferModel); + return d->channelProto; +} + +void IrcBufferModel::setChannelPrototype(IrcChannel* prototype) +{ + Q_D(IrcBufferModel); + if (d->channelProto != prototype) { + if (d->channelProto && d->channelProto->parent() == this) + delete d->channelProto; + d->channelProto = prototype ? prototype : new IrcChannel(this); + emit channelPrototypeChanged(d->channelProto); + } +} + +/*! + \since 3.1 + + Saves the state of the model. The \a version number is stored as part of the state data. + + To restore the saved state, pass the return value and \a version number to restoreState(). + */ +QByteArray IrcBufferModel::saveState(int version) const +{ + Q_D(const IrcBufferModel); + QVariantMap args; + args.insert("version", version); + args.insert("sortOrder", d->sortOrder); + args.insert("sortMethod", d->sortMethod); + args.insert("displayRole", d->role); + args.insert("persistent", d->persistent); + + QVariantList bufs; + foreach (IrcBuffer* buffer, d->bufferList) { + QVariantMap b; + b.insert("channel", buffer->isChannel()); + b.insert("name", buffer->name()); + b.insert("prefix", buffer->prefix()); + b.insert("title", buffer->title()); + if (IrcChannel* channel = buffer->toChannel()) { + IrcChannelPrivate* p = IrcChannelPrivate::get(channel); + b.insert("modes", QStringList(p->modes.keys())); + b.insert("args", QStringList(p->modes.values())); + b.insert("topic", channel->topic()); + } + b.insert("stick", buffer->isSticky()); + b.insert("persistent", buffer->isPersistent()); + b.insert("userData", buffer->userData()); + bufs += b; + } + args.insert("buffers", bufs); + + QByteArray state; + QDataStream out(&state, QIODevice::WriteOnly); + out << args; + return state; +} + +/*! + \since 3.1 + + Restores the \a state of the model. The \a version number is compared with that stored in \a state. + If they do not match, the model state is left unchanged, and this function returns \c false; otherwise, + the state is restored, and \c true is returned. + + \sa saveState() + */ +bool IrcBufferModel::restoreState(const QByteArray& state, int version) +{ + Q_D(IrcBufferModel); + QVariantMap args; + QDataStream in(state); + in >> args; + if (in.status() != QDataStream::Ok || args.value("version", -1).toInt() != version) + return false; + + setSortOrder(static_cast(args.value("sortOrder", sortOrder()).toInt())); + setSortMethod(static_cast(args.value("sortMethod", sortMethod()).toInt())); + setDisplayRole(static_cast(args.value("displayRole", displayRole()).toInt())); + setPersistent(args.value("persistent", isPersistent()).toBool()); + + QVariantList buffers = args.value("buffers").toList(); + foreach (const QVariant& v, buffers) { + QVariantMap b = v.toMap(); + IrcBuffer* buffer = find(b.value("title").toString()); + if (!buffer) { + if (b.value("channel").toBool()) + buffer = d->createChannelHelper(b.value("title").toString()); + else + buffer = d->createBufferHelper(b.value("title").toString()); + buffer->setName(b.value("name").toString()); + buffer->setPrefix(b.value("prefix").toString()); + buffer->setSticky(b.value("sticky").toBool()); + buffer->setPersistent(b.value("persistent").toBool()); + buffer->setUserData(b.value("userData").toMap()); + add(buffer); + } + IrcChannel* channel = buffer->toChannel(); + if (channel && !channel->isActive()) { + IrcChannelPrivate* p = IrcChannelPrivate::get(channel); + const QStringList modes = b.value("modes").toStringList(); + const QStringList args = b.value("args").toStringList(); + for (int i = 0; i < modes.count(); ++i) + p->modes.insert(modes.at(i), args.value(i)); + channel->join(); + } + } + return true; +} + +#include "moc_ircbuffermodel.cpp" +#include "moc_ircbuffermodel_p.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/model/ircchannel.cpp b/src/libcommuni/src/model/ircchannel.cpp new file mode 100644 index 0000000..15b4bc2 --- /dev/null +++ b/src/libcommuni/src/model/ircchannel.cpp @@ -0,0 +1,623 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircchannel.h" +#include "ircchannel_p.h" +#include "ircusermodel.h" +#include "ircusermodel_p.h" +#include "ircbuffermodel.h" +#include "ircbuffermodel_p.h" +#include "ircconnection.h" +#include "ircnetwork.h" +#include "irccommand.h" +#include "ircuser_p.h" +#include "irc.h" + +IRC_BEGIN_NAMESPACE + +/*! + \file ircchannel.h + \brief \#include <IrcChannel> + */ + +/*! + \class IrcChannel ircchannel.h + \ingroup models + \brief Keeps track of channel status. + + \sa IrcBufferModel +*/ + +#ifndef IRC_DOXYGEN +static QString getPrefix(const QString& name, const QStringList& prefixes) +{ + int i = 0; + while (i < name.length() && prefixes.contains(name.at(i))) + ++i; + return name.left(i); +} + +static QString channelName(const QString& title, const QStringList& prefixes) +{ + int i = 0; + while (i < title.length() && prefixes.contains(title.at(i))) + ++i; + return title.mid(i); +} + +static QString userName(const QString& name, const QStringList& prefixes) +{ + QString copy = name; + while (!copy.isEmpty() && prefixes.contains(copy.at(0))) + copy.remove(0, 1); + return Irc::nickFromPrefix(copy); +} + +IrcChannelPrivate::IrcChannelPrivate() : active(false) +{ + qRegisterMetaType(); + qRegisterMetaType >(); +} + +IrcChannelPrivate::~IrcChannelPrivate() +{ +} + +void IrcChannelPrivate::init(const QString& title, IrcBufferModel* m) +{ + IrcBufferPrivate::init(title, m); + + const QStringList chanTypes = m->network()->channelTypes(); + prefix = getPrefix(title, chanTypes); + name = channelName(title, chanTypes); +} + +void IrcChannelPrivate::connected() +{ + // not active until joined + setActive(false); +} + +void IrcChannelPrivate::disconnected() +{ + setActive(false); +} + +void IrcChannelPrivate::setActive(bool value) +{ + Q_Q(IrcChannel); + if (active != value) { + active = value; + emit q->activeChanged(active); + } +} + +void IrcChannelPrivate::changeModes(const QString& value, const QStringList& arguments) +{ + Q_Q(IrcChannel); + const IrcNetwork* network = q->network(); + + QMap ms = modes; + QStringList args = arguments; + + bool add = true; + for (int i = 0; i < value.size(); ++i) { + const QString m = value.at(i); + if (m == QLatin1String("+")) { + add = true; + } else if (m == QLatin1String("-")) { + add = false; + } else { + if (add) { + QString a; + if (!args.isEmpty() && network && network->channelModes(IrcNetwork::TypeB | IrcNetwork::TypeC).contains(m)) + a = args.takeFirst(); + ms.insert(m, a); + } else { + ms.remove(m); + } + } + } + + if (modes != ms) { + setKey(ms.value(QLatin1String("k"))); + modes = ms; + emit q->modeChanged(q->mode()); + } +} + +void IrcChannelPrivate::setModes(const QString& value, const QStringList& arguments) +{ + Q_Q(IrcChannel); + const IrcNetwork* network = q->network(); + + QMap ms; + QStringList args = arguments; + + for (int i = 0; i < value.size(); ++i) { + const QString m = value.at(i); + if (m != QLatin1String("+") && m != QLatin1String("-")) { + QString a; + if (!args.isEmpty() && network && network->channelModes(IrcNetwork::TypeB | IrcNetwork::TypeC).contains(m)) + a = args.takeFirst(); + ms.insert(m, a); + } + } + + if (modes != ms) { + setKey(ms.value(QLatin1String("k"))); + modes = ms; + emit q->modeChanged(q->mode()); + } +} + +void IrcChannelPrivate::setTopic(const QString& value) +{ + Q_Q(IrcChannel); + if (topic != value) { + topic = value; + emit q->topicChanged(topic); + } +} + +void IrcChannelPrivate::setKey(const QString& value) +{ + Q_Q(IrcChannel); + if (modes.value(QLatin1String("k")) != value) { + modes.insert(QLatin1String("k"), value); + emit q->keyChanged(value); + } +} + +void IrcChannelPrivate::addUser(const QString& name) +{ + Q_Q(IrcChannel); + const QStringList prefixes = q->network()->prefixes(); + + IrcUser* user = new IrcUser(q); + IrcUserPrivate* priv = IrcUserPrivate::get(user); + priv->channel = q; + priv->setName(userName(name, prefixes)); + priv->setPrefix(getPrefix(name, prefixes)); + priv->setMode(q->network()->prefixToMode(user->prefix())); + activeUsers.prepend(user); + userList.append(user); + userMap.insert(user->name(), user); + names = userMap.keys(); + + foreach (IrcUserModel* model, userModels) + IrcUserModelPrivate::get(model)->addUser(user); +} + +bool IrcChannelPrivate::removeUser(const QString& name) +{ + if (IrcUser* user = userMap.value(name)) { + userMap.remove(name); + names = userMap.keys(); + userList.removeOne(user); + activeUsers.removeOne(user); + foreach (IrcUserModel* model, userModels) + IrcUserModelPrivate::get(model)->removeUser(user); + user->deleteLater(); + return true; + } + return false; +} + +void IrcChannelPrivate::setUsers(const QStringList& users) +{ + Q_Q(IrcChannel); + const QStringList prefixes = q->network()->prefixes(); + + qDeleteAll(userList); + userMap.clear(); + userList.clear(); + activeUsers.clear(); + + foreach (const QString& name, users) { + IrcUser* user = new IrcUser(q); + IrcUserPrivate* priv = IrcUserPrivate::get(user); + priv->channel = q; + priv->setName(userName(name, prefixes)); + priv->setPrefix(getPrefix(name, prefixes)); + priv->setMode(q->network()->prefixToMode(user->prefix())); + activeUsers.append(user); + userList.append(user); + userMap.insert(user->name(), user); + } + names = userMap.keys(); + + foreach (IrcUserModel* model, userModels) + IrcUserModelPrivate::get(model)->setUsers(userList); +} + +bool IrcChannelPrivate::renameUser(const QString& from, const QString& to) +{ + if (IrcUser* user = userMap.take(from)) { + IrcUserPrivate::get(user)->setName(to); + userMap.insert(to, user); + names = userMap.keys(); + + foreach (IrcUserModel* model, userModels) { + IrcUserModelPrivate::get(model)->renameUser(user); + emit model->namesChanged(names); + } + return true; + } + return false; +} + +void IrcChannelPrivate::setUserMode(const QString& name, const QString& command) +{ + if (IrcUser* user = userMap.value(name)) { + bool add = true; + QString mode = user->mode(); + QString prefix = user->prefix(); + const IrcNetwork* network = model->network(); + for (int i = 0; i < command.size(); ++i) { + QChar c = command.at(i); + if (c == QLatin1Char('+')) { + add = true; + } else if (c == QLatin1Char('-')) { + add = false; + } else { + QString p = network->modeToPrefix(c); + if (add) { + if (!mode.contains(c)) + mode += c; + if (!prefix.contains(p)) + prefix += p; + } else { + mode.remove(c); + prefix.remove(p); + } + } + } + + QString sortedMode; + foreach (const QString& m, network->modes()) + if (mode.contains(m)) + sortedMode += m; + + QString sortedPrefix; + foreach (const QString& p, network->prefixes()) + if (prefix.contains(p)) + sortedPrefix += p; + + IrcUserPrivate* priv = IrcUserPrivate::get(user); + priv->setPrefix(sortedPrefix); + priv->setMode(sortedMode); + + foreach (IrcUserModel* model, userModels) + IrcUserModelPrivate::get(model)->setUserMode(user); + } +} + +void IrcChannelPrivate::promoteUser(const QString& name) +{ + if (IrcUser* user = userMap.value(name)) { + const int idx = activeUsers.indexOf(user); + Q_ASSERT(idx != -1); + activeUsers.move(idx, 0); + foreach (IrcUserModel* model, userModels) + IrcUserModelPrivate::get(model)->promoteUser(user); + } +} + +void IrcChannelPrivate::setUserAway(const QString& name, const bool &away) +{ + if (IrcUser* user = userMap.value(name)) { + IrcUserPrivate* priv = IrcUserPrivate::get(user); + + priv->setAway(away); + } +} + +void IrcChannelPrivate::setUserServOp(const QString& name, const bool &servOp) +{ + if (IrcUser* user = userMap.value(name)) { + IrcUserPrivate* priv = IrcUserPrivate::get(user); + + priv->setServOp(servOp); + } +} + +bool IrcChannelPrivate::processJoinMessage(IrcJoinMessage* message) +{ + if (!(message->flags() & IrcMessage::Playback)) { + if (message->flags() & IrcMessage::Own) + setActive(true); + else + addUser(message->nick()); + } + return true; +} + +bool IrcChannelPrivate::processKickMessage(IrcKickMessage* message) +{ + if (!(message->flags() & IrcMessage::Playback)) { + if (!message->user().compare(message->connection()->nickName(), Qt::CaseInsensitive)) { + setActive(false); + return true; + } + return removeUser(message->user()); + } + return userMap.contains(message->user()); +} + +bool IrcChannelPrivate::processModeMessage(IrcModeMessage* message) +{ + if (!(message->flags() & IrcMessage::Playback)) { + if (message->kind() == IrcModeMessage::Channel) { + if (message->isReply()) + setModes(message->mode(), message->arguments()); + else + changeModes(message->mode(), message->arguments()); + return true; + } else if (!message->argument().isEmpty()) { + setUserMode(message->argument(), message->mode()); + } + } + return true; +} + +bool IrcChannelPrivate::processNamesMessage(IrcNamesMessage* message) +{ + if (!(message->flags() & IrcMessage::Playback)) + setUsers(message->names()); + return true; +} + +bool IrcChannelPrivate::processNickMessage(IrcNickMessage* message) +{ + const bool renamed = renameUser(message->oldNick(), message->newNick()); + if (renamed) + promoteUser(message->newNick()); + return renamed; +} + +bool IrcChannelPrivate::processNoticeMessage(IrcNoticeMessage* message) +{ + promoteUser(message->nick()); + return true; +} + +bool IrcChannelPrivate::processNumericMessage(IrcNumericMessage* message) +{ + promoteUser(message->nick()); + return true; +} + +bool IrcChannelPrivate::processPartMessage(IrcPartMessage* message) +{ + if (!(message->flags() & IrcMessage::Playback)) { + if (message->flags() & IrcMessage::Own) { + setActive(false); + return true; + } + return removeUser(message->nick()); + } + return true; +} + +bool IrcChannelPrivate::processPrivateMessage(IrcPrivateMessage* message) +{ + const QString content = message->content(); + const bool prefixed = !content.isEmpty() && message->network()->prefixes().contains(content.at(0)); + foreach (IrcUser* user, activeUsers) { + const QString str = prefixed ? user->title() : user->name(); + if (content.startsWith(str)) { + promoteUser(user->name()); + break; + } + } + promoteUser(message->nick()); + return true; +} + +bool IrcChannelPrivate::processQuitMessage(IrcQuitMessage* message) +{ + if (!(message->flags() & IrcMessage::Playback)) { + if (message->flags() & IrcMessage::Own) { + setActive(false); + return true; + } + return removeUser(message->nick()) || IrcBufferPrivate::processQuitMessage(message); + } + return userMap.contains(message->nick()) || IrcBufferPrivate::processQuitMessage(message); +} + +bool IrcChannelPrivate::processTopicMessage(IrcTopicMessage* message) +{ + if (!(message->flags() & IrcMessage::Playback)) + setTopic(message->topic()); + return true; +} + +bool IrcChannelPrivate::processWhoReplyMessage(IrcWhoReplyMessage *message) +{ + if(message->isValid()) { + setUserAway(message->nick(), message->isAway()); + setUserServOp(message->nick(), message->isServOp()); + return true; + } + return false; +} +#endif // IRC_DOXYGEN + +/*! + Constructs a new channel object with \a parent. + */ +IrcChannel::IrcChannel(QObject* parent) + : IrcBuffer(*new IrcChannelPrivate, parent) +{ +} + +/*! + Destructs the channel object. + */ +IrcChannel::~IrcChannel() +{ + Q_D(IrcChannel); + qDeleteAll(d->userList); + d->userList.clear(); + d->userMap.clear(); + d->names.clear(); + d->userModels.clear(); + emit destroyed(this); +} + +/*! + \since 3.1 + + This property holds the channel key. + + \par Access function: + \li QString key() const + + \par Notifier signal: + \li void keyChanged(const QString& key) + */ +QString IrcChannel::key() const +{ + Q_D(const IrcChannel); + return d->modes.value(QLatin1String("k")); +} + +/*! + This property holds the complete channel mode including possible arguments. + + \par Access function: + \li QString mode() const + + \par Notifier signal: + \li void modeChanged(const QString& mode) + */ +QString IrcChannel::mode() const +{ + Q_D(const IrcChannel); + QString m = QStringList(d->modes.keys()).join(QString()); + QStringList a = d->modes.values(); + a.removeAll(QString()); + if (!a.isEmpty()) + m += QLatin1String(" ") + a.join(QLatin1String(" ")); + if (!m.isEmpty()) + m.prepend(QLatin1String("+")); + return m; +} + +/*! + This property holds the channel topic. + + \par Access function: + \li QString topic() const + + \par Notifier signal: + \li void topicChanged(const QString& topic) + */ +QString IrcChannel::topic() const +{ + Q_D(const IrcChannel); + return d->topic; +} + +bool IrcChannel::isActive() const +{ + Q_D(const IrcChannel); + return IrcBuffer::isActive() && d->active; +} + +/*! + \since 3.1 + + Joins the channel with an optional \a key. + + This method is provided for convenience. It is equal to: + \code + IrcCommand* command = IrcCommand::createJoin(channel->title(), key); + channel->sendCommand(command); + \endcode + + \sa IrcBuffer::sendCommand(), IrcCommand::createJoin() + */ +void IrcChannel::join(const QString& key) +{ + Q_D(IrcChannel); + if (!key.isEmpty()) + d->setKey(key); + sendCommand(IrcCommand::createJoin(title(), IrcChannel::key())); +} + +/*! + Parts the channel with an optional \a reason. + + This method is provided for convenience. It is equal to: + \code + IrcCommand* command = IrcCommand::createPart(channel->title(), reason); + channel->sendCommand(command); + \endcode + + \sa IrcBuffer::sendCommand(), IrcCommand::createPart() + */ +void IrcChannel::part(const QString& reason) +{ + sendCommand(IrcCommand::createPart(title(), reason)); +} + +/*! + \since 3.1 + + Closes the channel with an optional \a reason. + + \sa IrcBuffer::close(), IrcChannel::part() + */ +void IrcChannel::close(const QString& reason) +{ + if (isActive()) + part(reason); + IrcBuffer::close(reason); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, const IrcChannel* channel) +{ + if (!channel) + return debug << "IrcChannel(0x0) "; + debug.nospace() << channel->metaObject()->className() << '(' << (void*) channel; + if (!channel->objectName().isEmpty()) + debug.nospace() << ", name=" << qPrintable(channel->objectName()); + if (!channel->title().isEmpty()) + debug.nospace() << ", title=" << qPrintable(channel->title()); + debug.nospace() << ')'; + return debug.space(); +} +#endif // QT_NO_DEBUG_STREAM + +#include "moc_ircchannel.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/model/ircmodel.cpp b/src/libcommuni/src/model/ircmodel.cpp new file mode 100644 index 0000000..7032db5 --- /dev/null +++ b/src/libcommuni/src/model/ircmodel.cpp @@ -0,0 +1,61 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircmodel.h" + +IRC_BEGIN_NAMESPACE + +/*! + \file ircmodel.h + \brief \#include <IrcModel> + */ + +/*! + \namespace IrcModel + \ingroup models + \brief Module meta-type registration. + */ + +namespace IrcModel { + + /*! + Registers IrcModel types to the %Qt meta-system. + + \sa IrcCore::registerMetaTypes(), IrcUtil::registerMetaTypes(), qRegisterMetaType() + */ + void registerMetaTypes() + { + qRegisterMetaType("IrcBuffer*"); + qRegisterMetaType("IrcBufferModel*"); + qRegisterMetaType("IrcChannel*"); + qRegisterMetaType("IrcUser*"); + qRegisterMetaType("IrcUserModel*"); + } +} + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/model/ircuser.cpp b/src/libcommuni/src/model/ircuser.cpp new file mode 100644 index 0000000..d46e7a3 --- /dev/null +++ b/src/libcommuni/src/model/ircuser.cpp @@ -0,0 +1,266 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircuser.h" +#include "ircuser_p.h" +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file ircuser.h + \brief \#include <IrcUser> + */ + +/*! + \class IrcUser ircuser.h + \ingroup models + \brief Keeps track of user status on a channel. + + \sa IrcUserModel +*/ + +#ifndef IRC_DOXYGEN +void IrcUserPrivate::setName(const QString& n) +{ + Q_Q(IrcUser); + if (name != n) { + name = n; + emit q->nameChanged(name); + emit q->titleChanged(q->title()); + } +} + +void IrcUserPrivate::setPrefix(const QString& p) +{ + Q_Q(IrcUser); + if (prefix != p) { + prefix = p; + emit q->prefixChanged(prefix); + emit q->titleChanged(q->title()); + } +} + +void IrcUserPrivate::setMode(const QString& m) +{ + Q_Q(IrcUser); + if (mode != m) { + mode = m; + emit q->modeChanged(mode); + } +} + +void IrcUserPrivate::setServOp(const bool& o) +{ + Q_Q(IrcUser); + if (servOp != o) { + servOp = o; + emit q->servOpChanged(servOp); + } +} + +void IrcUserPrivate::setAway(const bool& a) +{ + Q_Q(IrcUser); + if (away != a) { + away = a; + emit q->awayChanged(away); + } +} +#endif // IRC_DOXYGEN + +/*! + Constructs a new user with \a parent. + */ +IrcUser::IrcUser(QObject* parent) + : QObject(parent), d_ptr(new IrcUserPrivate) +{ + Q_D(IrcUser); + d->q_ptr = this; + d->channel = 0; + d->away = false; + d->servOp = false; +} + +/*! + Destructs the user object. + */ +IrcUser::~IrcUser() +{ +} + +/*! + This property holds the title. + + The title consists of \ref prefix and \ref name. + + \par Access function: + \li QString title() const + + \par Notifier signal: + \li void titleChanged(const QString& title) + */ +QString IrcUser::title() const +{ + Q_D(const IrcUser); + return d->prefix.left(1) + d->name; +} + +/*! + This property holds the name. + + \par Access function: + \li QString name() const + + \par Notifier signal: + \li void nameChanged(const QString& name) + */ +QString IrcUser::name() const +{ + Q_D(const IrcUser); + return d->name; +} + +/*! + This property holds the prefix character. + + Typical prefix characters are \c @ (op) and \c + (voice). + + \par Access function: + \li QString prefix() const + + \par Notifier signal: + \li void prefixChanged(const QString& prefix) + */ +QString IrcUser::prefix() const +{ + Q_D(const IrcUser); + return d->prefix; +} + +/*! + This property holds the mode letter. + + Typical mode letters are \c o (op) and \c v (voice). + + \par Access function: + \li QString mode() const + + \par Notifier signal: + \li void modeChanged(const QString& mode) + */ +QString IrcUser::mode() const +{ + Q_D(const IrcUser); + return d->mode; +} + +/*! + \since 3.1 + + \property bool IrcUser::servOp + This property holds whether the user is a server operator. + + \note IRC servers do not send this information by default. + In order to fetch the information for all users on a channel, + issue a WHO command on the channel: + \code + IrcChannel* channel = user->channel(); + IrcCommand* command = IrcCommand::createWho(channel->title()); + channel->sendCommand(command); + \endcode + + \par Access function: + \li bool isServOp() const + + \par Notifier signal: + \li void servOpChanged(bool servOp) + */ +bool IrcUser::isServOp() const +{ + Q_D(const IrcUser); + return d->servOp; +} + +/*! + \since 3.1 + + \property bool IrcUser::away + This property holds whether the user is marked as being away. + + \note IRC servers do not send this information by default. + In order to fetch the information for all users on a channel, + issue a WHO command on the channel: + \code + IrcChannel* channel = user->channel(); + IrcCommand* command = IrcCommand::createWho(channel->title()); + channel->sendCommand(command); + \endcode + + \par Access function: + \li bool isAway() const + + \par Notifier signal: + \li void awayChanged(bool away) + */ +bool IrcUser::isAway() const +{ + Q_D(const IrcUser); + return d->away; +} + +/*! + This property holds the channel of the user. + + \par Access function: + \li \ref IrcChannel* channel() const + */ +IrcChannel* IrcUser::channel() const +{ + Q_D(const IrcUser); + return d->channel; +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, const IrcUser* user) +{ + if (!user) + return debug << "IrcUser(0x0) "; + debug.nospace() << user->metaObject()->className() << '(' << (void*) user; + if (!user->objectName().isEmpty()) + debug.nospace() << ", name=" << qPrintable(user->objectName()); + if (!user->name().isEmpty()) + debug.nospace() << ", user=" << qPrintable(user->name()); + debug.nospace() << ')'; + return debug.space(); +} +#endif // QT_NO_DEBUG_STREAM + +#include "moc_ircuser.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/model/ircusermodel.cpp b/src/libcommuni/src/model/ircusermodel.cpp new file mode 100644 index 0000000..23f13fb --- /dev/null +++ b/src/libcommuni/src/model/ircusermodel.cpp @@ -0,0 +1,709 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircusermodel.h" +#include "ircusermodel_p.h" +#include "ircbuffermodel.h" +#include "ircconnection.h" +#include "ircchannel_p.h" +#include "ircuser.h" +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file ircusermodel.h + \brief \#include <IrcUserModel> + */ + +/*! + \class IrcUserModel ircusermodel.h + \ingroup models + \brief Keeps track of channel users. + + In order to keep track of channel users, create an instance of IrcUserModel. + It will notify via signals when users are added and/or removed. IrcUserModel + can be used directly as a data model for Qt's item views - both in C++ and QML. + + \code + void ChatView::setChannel(IrcChannel* channel) + { + IrcUserModel* model = new IrcUserModel(channel); + connect(model, SIGNAL(added(IrcUser*)), this, SLOT(onUserAdded(IrcUser*))); + connect(model, SIGNAL(removed(IrcUser*)), this, SLOT(onUserRemoved(IrcUser*))); + nickCompleter->setModel(model); + userListView->setModel(model); + } + \endcode +*/ + +/*! + \fn void IrcUserModel::added(IrcUser* user) + + This signal is emitted when a \a user is added to the list of users. + */ + +/*! + \fn void IrcUserModel::removed(IrcUser* user) + + This signal is emitted when a \a user is removed from the list of users. + */ + +/*! + \fn void IrcUserModel::aboutToBeAdded(IrcUser* user) + + This signal is emitted just before a \a user is added to the list of users. + */ + +/*! + \fn void IrcUserModel::aboutToBeRemoved(IrcUser* user) + + This signal is emitted just before a \a user is removed from the list of users. + */ + +#ifndef IRC_DOXYGEN +class IrcUserLessThan +{ +public: + IrcUserLessThan(IrcUserModel* model, Irc::SortMethod method) : model(model), method(method) { } + bool operator()(IrcUser* u1, IrcUser* u2) const { return model->lessThan(u1, u2, method); } +private: + IrcUserModel* model; + Irc::SortMethod method; +}; + +class IrcUserGreaterThan +{ +public: + IrcUserGreaterThan(IrcUserModel* model, Irc::SortMethod method) : model(model), method(method) { } + bool operator()(IrcUser* u1, IrcUser* u2) const { return model->lessThan(u2, u1, method); } +private: + IrcUserModel* model; + Irc::SortMethod method; +}; + +IrcUserModelPrivate::IrcUserModelPrivate() : q_ptr(0), role(Irc::TitleRole), + sortMethod(Irc::SortByHand), sortOrder(Qt::AscendingOrder) +{ +} + +void IrcUserModelPrivate::addUser(IrcUser* user, bool notify) +{ + insertUser(-1, user, notify); +} + +void IrcUserModelPrivate::insertUser(int index, IrcUser* user, bool notify) +{ + Q_Q(IrcUserModel); + if (index == -1) + index = userList.count(); + if (sortMethod != Irc::SortByHand) { + QList::iterator it; + if (sortOrder == Qt::AscendingOrder) + it = qUpperBound(userList.begin(), userList.end(), user, IrcUserLessThan(q, sortMethod)); + else + it = qUpperBound(userList.begin(), userList.end(), user, IrcUserGreaterThan(q, sortMethod)); + index = it - userList.begin(); + } + if (notify) + emit q->aboutToBeAdded(user); + q->beginInsertRows(QModelIndex(), index, index); + userList.insert(index, user); + q->endInsertRows(); + if (notify) { + emit q->added(user); + emit q->namesChanged(IrcChannelPrivate::get(channel)->names); + emit q->usersChanged(userList); + emit q->countChanged(userList.count()); + if (userList.count() == 1) + emit q->emptyChanged(false); + } +} + +void IrcUserModelPrivate::removeUser(IrcUser* user, bool notify) +{ + Q_Q(IrcUserModel); + int idx = userList.indexOf(user); + if (idx != -1) { + if (notify) + emit q->aboutToBeRemoved(user); + q->beginRemoveRows(QModelIndex(), idx, idx); + userList.removeAt(idx); + q->endRemoveRows(); + if (notify) { + emit q->removed(user); + emit q->namesChanged(IrcChannelPrivate::get(channel)->names); + emit q->usersChanged(userList); + emit q->countChanged(userList.count()); + if (userList.isEmpty()) + emit q->emptyChanged(true); + } + } +} + +void IrcUserModelPrivate::setUsers(const QList& users, bool reset) +{ + Q_Q(IrcUserModel); + bool wasEmpty = userList.isEmpty(); + if (reset) + q->beginResetModel(); + userList = users; + if (sortMethod != Irc::SortByHand) { + if (sortOrder == Qt::AscendingOrder) + qSort(userList.begin(), userList.end(), IrcUserLessThan(q, sortMethod)); + else + qSort(userList.begin(), userList.end(), IrcUserGreaterThan(q, sortMethod)); + } + if (reset) + q->endResetModel(); + QStringList names; + if (channel) + names = IrcChannelPrivate::get(channel)->names; + emit q->namesChanged(names); + emit q->usersChanged(userList); + emit q->countChanged(userList.count()); + if (wasEmpty != userList.isEmpty()) + emit q->emptyChanged(userList.isEmpty()); +} + +void IrcUserModelPrivate::renameUser(IrcUser* user) +{ + Q_Q(IrcUserModel); + const int idx = userList.indexOf(user); + if (idx != -1) { + QModelIndex index = q->index(idx, 0); + emit q->dataChanged(index, index); + + if (sortMethod != Irc::SortByHand) { + QList users = userList; + const bool notify = false; + removeUser(user, notify); + insertUser(-1, user, notify); + if (users != userList) + emit q->usersChanged(userList); + } + } +} + +void IrcUserModelPrivate::setUserMode(IrcUser* user) +{ + Q_Q(IrcUserModel); + const int idx = userList.indexOf(user); + if (idx != -1) { + QModelIndex index = q->index(idx, 0); + emit q->dataChanged(index, index); + + if (sortMethod == Irc::SortByTitle) { + const bool notify = false; + removeUser(user, notify); + insertUser(0, user, notify); + emit q->usersChanged(userList); + } + } +} + +void IrcUserModelPrivate::promoteUser(IrcUser* user) +{ + Q_Q(IrcUserModel); + if (sortMethod == Irc::SortByActivity) { + const bool notify = false; + removeUser(user, notify); + insertUser(0, user, notify); + emit q->usersChanged(userList); + } +} +#endif // IRC_DOXYGEN + +/*! + Constructs a new model with \a parent. + + \note If \a parent is an instance of IrcChannel, it will be + automatically assigned to \ref IrcUserModel::channel "channel". + */ +IrcUserModel::IrcUserModel(QObject* parent) : QAbstractListModel(parent), d_ptr(new IrcUserModelPrivate) +{ + Q_D(IrcUserModel); + d->q_ptr = this; + setChannel(qobject_cast(parent)); + + qRegisterMetaType(); + qRegisterMetaType >(); +} + +/*! + Destructs the model. + */ +IrcUserModel::~IrcUserModel() +{ + Q_D(IrcUserModel); + if (d->channel) + IrcChannelPrivate::get(d->channel)->userModels.removeOne(this); +} + +/*! + This property holds the channel. + + \par Access functions: + \li \ref IrcChannel* channel() const + \li void setChannel(\ref IrcChannel* channel) + + \par Notifier signal: + \li void channelChanged(\ref IrcChannel* channel) + */ +IrcChannel* IrcUserModel::channel() const +{ + Q_D(const IrcUserModel); + return d->channel; +} + +void IrcUserModel::setChannel(IrcChannel* channel) +{ + Q_D(IrcUserModel); + if (d->channel != channel) { + beginResetModel(); + if (d->channel) + IrcChannelPrivate::get(d->channel)->userModels.removeOne(this); + + d->channel = channel; + + QList users; + if (d->channel) { + IrcChannelPrivate::get(d->channel)->userModels.append(this); + if (d->sortMethod == Irc::SortByActivity) + users = IrcChannelPrivate::get(d->channel)->activeUsers; + else + users = IrcChannelPrivate::get(d->channel)->userList; + } + const bool reset = false; + d->setUsers(users, reset); + endResetModel(); + + emit channelChanged(channel); + } +} + +/*! + This property holds the number of users on the channel. + + \par Access function: + \li int count() const + + \par Notifier signal: + \li void countChanged(int count) + */ +int IrcUserModel::count() const +{ + return rowCount(); +} + +/*! + \since 3.1 + \property bool IrcUserModel::empty + + This property holds the whether the model is empty. + + \par Access function: + \li bool isEmpty() const + + \par Notifier signal: + \li void emptyChanged(bool empty) + */ +bool IrcUserModel::isEmpty() const +{ + Q_D(const IrcUserModel); + return d->userList.isEmpty(); +} + +/*! + This property holds the list of names in alphabetical order. + + \par Access function: + \li QStringList names() const + + \par Notifier signal: + \li void namesChanged(const QStringList& names) + */ +QStringList IrcUserModel::names() const +{ + Q_D(const IrcUserModel); + if (d->channel && !d->userList.isEmpty()) + return IrcChannelPrivate::get(d->channel)->names; + return QStringList(); +} + +/*! + This property holds the list of users. + + The order of users is kept as sent from the server. + + \par Access function: + \li QList<\ref IrcUser*> users() const + + \par Notifier signal: + \li void usersChanged(const QList<\ref IrcUser*>& users) + */ +QList IrcUserModel::users() const +{ + Q_D(const IrcUserModel); + return d->userList; +} + +/*! + Returns the user object at \a index. + */ +IrcUser* IrcUserModel::get(int index) const +{ + Q_D(const IrcUserModel); + return d->userList.value(index); +} + +/*! + Returns the user object for \a name or \c 0 if not found. + */ +IrcUser* IrcUserModel::find(const QString& name) const +{ + Q_D(const IrcUserModel); + if (d->channel && !d->userList.isEmpty()) + return IrcChannelPrivate::get(d->channel)->userMap.value(name); + return 0; +} + +/*! + Returns \c true if the model contains \a name. + */ +bool IrcUserModel::contains(const QString& name) const +{ + Q_D(const IrcUserModel); + if (d->channel && !d->userList.isEmpty()) + return IrcChannelPrivate::get(d->channel)->userMap.contains(name); + return false; +} + +/*! + Returns the index of the specified \a user, + or \c -1 if the model does not contain the \a user. + */ +int IrcUserModel::indexOf(IrcUser* user) const +{ + Q_D(const IrcUserModel); + return d->userList.indexOf(user); +} + +/*! + This property holds the model sort method. + + The default value is \c Irc::SortByHand. + + Method | Description | Example + --------------------|---------------------------------------------------------------------------------------------------|---------------------------------------------- + Irc::SortByHand | Users are not sorted automatically, but only by calling sort(). | - + Irc::SortByName | Users are sorted alphabetically, ignoring any mode prefix. | "bot", "@ChanServ", "jpnurmi", "+qtassistant" + Irc::SortByTitle | Users are sorted alphabetically, and special users (operators, voiced users) before normal users. | "@ChanServ", "+qtassistant", "bot", "jpnurmi" + Irc::SortByActivity | Users are sorted based on their activity, last active and mentioned (1) users first. | - + + 1) For performance reasons, IrcUserModel does \b not scan the whole channel + messages to find out if a channel user was mentioned. IrcUserModel merely + checks if channel messages \b begin with the name of a user in the model. + + \par Access functions: + \li Irc::SortMethod sortMethod() const + \li void setSortMethod(Irc::SortMethod method) + + \sa sort(), lessThan() + */ +Irc::SortMethod IrcUserModel::sortMethod() const +{ + Q_D(const IrcUserModel); + return d->sortMethod; +} + +void IrcUserModel::setSortMethod(Irc::SortMethod method) +{ + Q_D(IrcUserModel); + if (d->sortMethod != method) { + d->sortMethod = method; + if (method == Irc::SortByActivity && d->channel) + d->userList = IrcChannelPrivate::get(d->channel)->activeUsers; + if (d->sortMethod != Irc::SortByHand && !d->userList.isEmpty()) + sort(d->sortMethod, d->sortOrder); + } +} + +/*! + This property holds the model sort order. + + The default value is \c Qt::AscendingOrder. + + \par Access functions: + \li Qt::SortOrder sortOrder() const + \li void setSortOrder(Qt::SortOrder order) + + \sa sort(), lessThan() + */ +Qt::SortOrder IrcUserModel::sortOrder() const +{ + Q_D(const IrcUserModel); + return d->sortOrder; +} + +void IrcUserModel::setSortOrder(Qt::SortOrder order) +{ + Q_D(IrcUserModel); + if (d->sortOrder != order) { + d->sortOrder = order; + if (d->sortMethod != Irc::SortByHand && !d->userList.isEmpty()) + sort(d->sortMethod, d->sortOrder); + } +} + +/*! + This property holds the display role. + + The specified data role is returned for Qt::DisplayRole. + + The default value is \ref Irc::TitleRole. + + \par Access functions: + \li \ref Irc::DataRole displayRole() const + \li void setDisplayRole(\ref Irc::DataRole role) + */ +Irc::DataRole IrcUserModel::displayRole() const +{ + Q_D(const IrcUserModel); + return d->role; +} + +void IrcUserModel::setDisplayRole(Irc::DataRole role) +{ + Q_D(IrcUserModel); + d->role = role; +} + +/*! + Returns the model index for \a user. + */ +QModelIndex IrcUserModel::index(IrcUser* user) const +{ + Q_D(const IrcUserModel); + return index(d->userList.indexOf(user)); +} + +/*! + Returns the user for model \a index. + */ +IrcUser* IrcUserModel::user(const QModelIndex& index) const +{ + if (!hasIndex(index.row(), index.column())) + return 0; + + return static_cast(index.internalPointer()); +} + +/*! + The following role names are provided by default: + + Role | Name | Type | Example + --------------- | ----------|----------|-------- + Qt::DisplayRole | "display" | 1) | - + Irc::UserRole | "user" | IrcUser* | <object> + Irc::NameRole | "name" | QString | "jpnurmi" + Irc::PrefixRole | "prefix" | QString | "@" + Irc::ModeRole | "mode" | QString | "o" + Irc::TitleRole | "title" | QString | "@jpnurmi" + + 1) The type depends on \ref displayRole. + */ +QHash IrcUserModel::roleNames() const +{ + QHash roles; + roles[Qt::DisplayRole] = "display"; + roles[Irc::UserRole] = "user"; + roles[Irc::NameRole] = "name"; + roles[Irc::PrefixRole] = "prefix"; + roles[Irc::ModeRole] = "mode"; + roles[Irc::TitleRole] = "title"; + return roles; +} + +/*! + Returns the number of users on the channel. + */ +int IrcUserModel::rowCount(const QModelIndex& parent) const +{ + Q_D(const IrcUserModel); + if (parent.isValid() || !d->channel) + return 0; + + return d->userList.count(); +} + +/*! + Returns the data for specified \a role referred to by the \a index. + + \sa Irc::DataRole, roleNames() + */ +QVariant IrcUserModel::data(const QModelIndex& index, int role) const +{ + Q_D(const IrcUserModel); + if (!d->channel || !hasIndex(index.row(), index.column(), index.parent())) + return QVariant(); + + IrcUser* user = static_cast(index.internalPointer()); + Q_ASSERT(user); + + switch (role) { + case Qt::DisplayRole: + return data(index, d->role); + case Irc::UserRole: + return QVariant::fromValue(user); + case Irc::NameRole: + return user->name(); + case Irc::PrefixRole: + return user->prefix().left(1); + case Irc::ModeRole: + return user->mode().left(1); + case Irc::TitleRole: + return user->title(); + } + + return QVariant(); +} + +/*! + Returns the index of the item in the model specified by the given \a row, \a column and \a parent index. + */ +QModelIndex IrcUserModel::index(int row, int column, const QModelIndex& parent) const +{ + Q_D(const IrcUserModel); + if (!d->channel || !hasIndex(row, column, parent)) + return QModelIndex(); + + return createIndex(row, column, d->userList.value(row)); +} + +/*! + Clears the model. + */ +void IrcUserModel::clear() +{ + Q_D(IrcUserModel); + if (!d->userList.isEmpty()) { + beginResetModel(); + d->userList.clear(); + endResetModel(); + emit namesChanged(QStringList()); + emit usersChanged(QList()); + emit countChanged(0); + emit emptyChanged(true); + } +} + +/*! + Sorts the model using the given \a order. + */ +void IrcUserModel::sort(int column, Qt::SortOrder order) +{ + Q_D(IrcUserModel); + if (column == 0) + sort(d->sortMethod, order); +} + +/*! + Sorts the model using the given \a method and \a order. + + \sa lessThan() + */ +void IrcUserModel::sort(Irc::SortMethod method, Qt::SortOrder order) +{ + Q_D(IrcUserModel); + if (method == Irc::SortByHand) + return; + + emit layoutAboutToBeChanged(); + + QList persistentUsers; + QModelIndexList oldPersistentIndexes = persistentIndexList(); + foreach (const QModelIndex& index, oldPersistentIndexes) + persistentUsers += static_cast(index.internalPointer()); + + if (order == Qt::AscendingOrder) + qSort(d->userList.begin(), d->userList.end(), IrcUserLessThan(this, method)); + else + qSort(d->userList.begin(), d->userList.end(), IrcUserGreaterThan(this, method)); + + QModelIndexList newPersistentIndexes; + foreach (IrcUser* user, persistentUsers) + newPersistentIndexes += index(d->userList.indexOf(user)); + changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); + + emit layoutChanged(); +} + +/*! + Returns \c true if \a one buffer is "less than" \a another, + otherwise returns \c false. + + The default implementation sorts according to the specified sort method. + Reimplement this function in order to customize the sort order. + + \sa sort(), sortMethod + */ +bool IrcUserModel::lessThan(IrcUser* one, IrcUser* another, Irc::SortMethod method) const +{ + if (method == Irc::SortByActivity) { + QList activeUsers = IrcChannelPrivate::get(one->channel())->activeUsers; + const int i1 = activeUsers.indexOf(one); + const int i2 = activeUsers.indexOf(another); + return i1 < i2; + } else if (method == Irc::SortByTitle) { + const IrcNetwork* network = one->channel()->network(); + const QStringList prefixes = network->prefixes(); + + const QString p1 = one->prefix(); + const QString p2 = another->prefix(); + + const int i1 = !p1.isEmpty() ? prefixes.indexOf(p1.at(0)) : -1; + const int i2 = !p2.isEmpty() ? prefixes.indexOf(p2.at(0)) : -1; + + if (i1 >= 0 && i2 < 0) + return true; + if (i1 < 0 && i2 >= 0) + return false; + if (i1 >= 0 && i2 >= 0 && i1 != i2) + return i1 < i2; + } + + // Irc::SortByName + const QString n1 = one->name(); + const QString n2 = another->name(); + return n1.compare(n2, Qt::CaseInsensitive) < 0; +} + +#include "moc_ircusermodel.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/model/model.pri b/src/libcommuni/src/model/model.pri new file mode 100644 index 0000000..38212a0 --- /dev/null +++ b/src/libcommuni/src/model/model.pri @@ -0,0 +1,40 @@ +###################################################################### +# Communi +###################################################################### + +DEFINES += BUILD_IRC_MODEL + +INCDIR = $$PWD/../../include/IrcModel + +DEPENDPATH += $$PWD $$INCDIR +INCLUDEPATH += $$PWD $$INCDIR + +CONV_HEADERS = $$INCDIR/IrcBuffer +CONV_HEADERS += $$INCDIR/IrcBufferModel +CONV_HEADERS += $$INCDIR/IrcChannel +CONV_HEADERS += $$INCDIR/IrcModel +CONV_HEADERS += $$INCDIR/IrcUser +CONV_HEADERS += $$INCDIR/IrcUserModel + +PUB_HEADERS = $$INCDIR/ircbuffer.h +PUB_HEADERS += $$INCDIR/ircbuffermodel.h +PUB_HEADERS += $$INCDIR/ircchannel.h +PUB_HEADERS += $$INCDIR/ircmodel.h +PUB_HEADERS += $$INCDIR/ircuser.h +PUB_HEADERS += $$INCDIR/ircusermodel.h + +PRIV_HEADERS = $$INCDIR/ircbuffer_p.h +PRIV_HEADERS += $$INCDIR/ircbuffermodel_p.h +PRIV_HEADERS += $$INCDIR/ircchannel_p.h +PRIV_HEADERS += $$INCDIR/ircuser_p.h +PRIV_HEADERS += $$INCDIR/ircusermodel_p.h + +HEADERS += $$PUB_HEADERS +HEADERS += $$PRIV_HEADERS + +SOURCES += $$PWD/ircbuffer.cpp +SOURCES += $$PWD/ircbuffermodel.cpp +SOURCES += $$PWD/ircchannel.cpp +SOURCES += $$PWD/ircmodel.cpp +SOURCES += $$PWD/ircuser.cpp +SOURCES += $$PWD/ircusermodel.cpp diff --git a/src/libcommuni/src/model/model.pro b/src/libcommuni/src/model/model.pro new file mode 100644 index 0000000..5a35306 --- /dev/null +++ b/src/libcommuni/src/model/model.pro @@ -0,0 +1,11 @@ +###################################################################### +# Communi +###################################################################### + +IRC_MODULE = IrcModel +include(model.pri) +include(../module_build.pri) +include(../module_install.pri) + +IRC_MODULES = IrcCore +include(../module_deps.pri) diff --git a/src/libcommuni/src/module_build.pri b/src/libcommuni/src/module_build.pri new file mode 100644 index 0000000..75205a2 --- /dev/null +++ b/src/libcommuni/src/module_build.pri @@ -0,0 +1,57 @@ +###################################################################### +# Communi +###################################################################### + +isEmpty(IRC_MODULE):error(IRC_MODULE must be set) + +TEMPLATE = lib +TARGET = $$qtLibraryTarget($$IRC_MODULE) +QT = core network +!verbose:CONFIG += silent +contains(QT_CONFIG, debug_and_release) { + win32|mac:!wince*:!win32-msvc:!macx-xcode:CONFIG += debug_and_release build_all +} + +include(../version.pri) +!win32:VERSION = $$IRC_VERSION + +isEmpty(IRC_BUILDDIR):IRC_BUILDDIR = $$OUT_PWD/../.. + +DESTDIR = $$IRC_BUILDDIR/lib +DLLDESTDIR = $$IRC_BUILDDIR/bin + +!flat { + CONFIG(debug, debug|release) { + OBJECTS_DIR = debug + MOC_DIR = debug + } else { + OBJECTS_DIR = release + MOC_DIR = release + } +} + +DISTFILES += $$CONV_HEADERS + +coverage { + QMAKE_CLEAN += $$OBJECTS_DIR/*.gcda $$OBJECTS_DIR/*.gcno + + LIBS += -lgcov + QMAKE_CXXFLAGS += -g -Wall -fprofile-arcs -ftest-coverage -O0 + QMAKE_LDFLAGS += -g -Wall -fprofile-arcs -ftest-coverage -O0 + + zerocounters.commands = @lcov --directory \$(OBJECTS_DIR) --zerocounters + QMAKE_EXTRA_TARGETS += zerocounters + + capture.file = ../../coverage/$${IRC_MODULE}.cov + capture.commands = @mkdir -p ../../coverage + capture.commands += && lcov --base-directory $$_PRO_FILE_PWD_ --directory \$(OBJECTS_DIR) --capture --output-file $$capture.file + capture.filters = \"/usr/*\" \"moc_*.cpp\" \"*3rdparty/*\" \"*QtCore/*\" \"*QtNetwork/*\" \"*corelib/*\" \"*network/*\" + !isEqual(IRC_MODULE, "IrcCore"):capture.filters += \"*/IrcCore/*\" + !isEqual(IRC_MODULE, "IrcModel"):capture.filters += \"*/IrcModel/*\" + capture.commands += && lcov --remove $$capture.file $$capture.filters --output-file $$capture.file + QMAKE_EXTRA_TARGETS += capture + + genhtml.dir = ../../coverage/$${IRC_MODULE} + genhtml.commands = @genhtml --output-directory $$genhtml.dir $$capture.file + QMAKE_EXTRA_TARGETS += genhtml +} diff --git a/src/libcommuni/src/module_deps.pri b/src/libcommuni/src/module_deps.pri new file mode 100644 index 0000000..055166e --- /dev/null +++ b/src/libcommuni/src/module_deps.pri @@ -0,0 +1,36 @@ +###################################################################### +# Communi +###################################################################### + +isEmpty(IRC_MODULES):error(IRC_MODULES must be set) + +isEmpty(IRC_BUILDDIR):IRC_BUILDDIR = $$OUT_PWD/../.. +IRC_LIBDIR = $$IRC_BUILDDIR/lib + +isEmpty(IRC_SOURCEDIR):IRC_SOURCEDIR = $$PWD/.. +IRC_INCDIR = $$IRC_SOURCEDIR/include + +INCLUDEPATH += $$IRC_INCDIR + +for(IRC_MODULE, IRC_MODULES) { + !contains(DEFINES, IRC_STATIC):macx:!qt_no_framework { + INCLUDEPATH += $$IRC_LIBDIR/$${IRC_MODULE}.framework/Headers + QMAKE_LFLAGS += -F$$IRC_LIBDIR # inject before system frameworks + LIBS += -framework $$IRC_MODULE + install_name { + !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK += && + QMAKE_POST_LINK += install_name_tool -change \ + "$$[QT_INSTALL_LIBS]/$${IRC_MODULE}.framework/Versions/3/$${IRC_MODULE}" \ + "$$IRC_LIBDIR/$${IRC_MODULE}.framework/Versions/3/$${IRC_MODULE}" $$TARGET + } + } else { + INCLUDEPATH += $$IRC_INCDIR/$$IRC_MODULE + DEPENDPATH += $$IRC_INCDIR/$$IRC_MODULE + QMAKE_LIBDIR += $$IRC_LIBDIR # injects before system libdirs + REAL_TEMPLATE = $$TEMPLATE + TEMPLATE = fakelib + LIBS += -l$$qtLibraryTarget($$IRC_MODULE) + TEMPLATE = $$REAL_TEMPLATE + !no_rpath:QMAKE_RPATHDIR += $$IRC_LIBDIR + } +} diff --git a/src/libcommuni/src/module_install.pri b/src/libcommuni/src/module_install.pri new file mode 100644 index 0000000..7685de2 --- /dev/null +++ b/src/libcommuni/src/module_install.pri @@ -0,0 +1,38 @@ +###################################################################### +# Communi +###################################################################### + +isEmpty(IRC_MODULE):error(IRC_MODULE must be set) + +isEmpty(IRC_INSTALL_LIBS):IRC_INSTALL_LIBS = $$[QT_INSTALL_LIBS] +isEmpty(IRC_INSTALL_BINS):IRC_INSTALL_BINS = $$[QT_INSTALL_BINS] +isEmpty(IRC_INSTALL_HEADERS):IRC_INSTALL_HEADERS = $$[QT_INSTALL_HEADERS]/Communi + +!no_install_libs { + target.path = $$IRC_INSTALL_LIBS + INSTALLS += target +} + +!no_install_bins { + dlltarget.path = $$IRC_INSTALL_BINS + INSTALLS += dlltarget +} + +macx:CONFIG(qt_framework, qt_framework|qt_no_framework) { + CONFIG += lib_bundle debug_and_release + CONFIG(debug, debug|release) { + !build_pass:CONFIG += build_all + } else { #release + !debug_and_release|build_pass { + FRAMEWORK_HEADERS.version = Versions + FRAMEWORK_HEADERS.files = $$PUB_HEADERS $$CONV_HEADERS + FRAMEWORK_HEADERS.path = Headers + } + QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS + } + QMAKE_LFLAGS_SONAME = -Wl,-install_name,$$IRC_INSTALL_LIBS/ +} else:!no_install_headers { + headers.files = $$PUB_HEADERS $$CONV_HEADERS + headers.path = $$IRC_INSTALL_HEADERS/$$IRC_MODULE + INSTALLS += headers +} diff --git a/src/libcommuni/src/src.pri b/src/libcommuni/src/src.pri new file mode 100644 index 0000000..72dd368 --- /dev/null +++ b/src/libcommuni/src/src.pri @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +include(core/core.pri) +include(model/model.pri) +include(util/util.pri) diff --git a/src/libcommuni/src/src.pro b/src/libcommuni/src/src.pro new file mode 100644 index 0000000..1322cdb --- /dev/null +++ b/src/libcommuni/src/src.pro @@ -0,0 +1,27 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = subdirs +SUBDIRS += core model util imports + +model.depends = core +util.depends = core model +imports.depends = core model util + +coverage { + cov_zerocounters.CONFIG += recursive + cov_zerocounters.recurse = core model util + cov_zerocounters.recurse_target = zerocounters + QMAKE_EXTRA_TARGETS += cov_zerocounters + + cov_capture.CONFIG += recursive + cov_capture.recurse = core model util + cov_capture.recurse_target = capture + QMAKE_EXTRA_TARGETS += cov_capture + + cov_genhtml.CONFIG += recursive + cov_genhtml.recurse = core model util + cov_genhtml.recurse_target = genhtml + QMAKE_EXTRA_TARGETS += cov_genhtml +} diff --git a/src/libcommuni/src/util/irccommandparser.cpp b/src/libcommuni/src/util/irccommandparser.cpp new file mode 100644 index 0000000..e686a37 --- /dev/null +++ b/src/libcommuni/src/util/irccommandparser.cpp @@ -0,0 +1,597 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "irccommandparser.h" +#include "irccommandparser_p.h" +#include "irctoken_p.h" +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file irccommandparser.h + \brief \#include <IrcCommandParser> + */ + +/*! + \class IrcCommandParser irccommandparser.h + \ingroup util + \brief Parses commands from user input. + + \section syntax Syntax + + Since the list of supported commands and the exact syntax for each + command is application specific, IrcCommandParser does not provide + any built-in command syntaxes. It is left up to the applications + to introduce the supported commands and syntaxes. + IrcCommandParser supports the following command syntax markup: + + Syntax | Example | Description + -------------------|----------------------|------------ + <param> | <target> | A required parameter. + (<param>) | (<key>) | An optional parameter. + <param...> | <message...> | A required parameter, multiple words accepted. (1) + (<param...>) | (<message...>) | An optional parameter, multiple words accepted. (1) + (<\#param>) | (<\#channel>) | An optional channel parameter. (2) + [param] | [target] | Inject the current target. + + -# Multi-word parameters are only supported in the last parameter position. + -# An optional channel parameter is filled up with the current channel when absent. + + The following example presents introducing some typical commands. + \code + IrcCommandParser* parser = new IrcCommandParser(this); + parser->addCommand(IrcCommand::Join, "JOIN <#channel> ()"); + parser->addCommand(IrcCommand::Part, "PART (<#channel>) ()"); + parser->addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); + parser->addCommand(IrcCommand::CtcpAction, "ME [target] "); + parser->addCommand(IrcCommand::CtcpAction, "ACTION "); + \endcode + + \note The parameter names are insignificant, but descriptive + parameter names are recommended for the sake of readability. + + \section context Context + + Notice that commands are often context sensitive. While some command + may accept an optional parameter that is filled up with the current + target (channel/query) name when absent, another command may always + inject the current target name as a certain parameter. Therefore + IrcCommandParser must be kept up-to-date with the \ref target + "current target" and the \ref channels "list of channels". + + \code + // currently in a query, and also present on some channels + parser->setTarget("jpnurmi"); + parser->setChannels(QStringList() << "#communi" << "#freenode"); + \endcode + + \section command-triggers Command triggers + + IrcCommandParser serves as a generic parser for typical IRC commands. + It can be utilized for parsing commands from user input in GUI clients, + and from messages from other clients when implementing IRC bots. + + The command parsing behavior is controlled by setting up command + \ref triggers. Whilst a typical GUI client might use \c "/" as a command + trigger, an IRC bot might use \c "!" and the nick name of the bot. The + following snippet illustrates a typical GUI client usage. + + \code + parser->setTarget("#communi"); + parser->setTriggers(QStringList() << "/"); + parser->parse(input); + \endcode + + \p + Input | Result | Description + ------------------|---------------------|------------ + "hello" | IrcCommand::Message | No matching command trigger => a message "hello" to \#communi + "/join #channel" | IrcCommand::Join | Matching command trigger => a command to join "#channel" + + See the \ref bot "bot example" to see how the parser can be effectively utilized for IRC bots. + + \section parse-custom-commands Custom commands + + The parser also supports such custom client specific commands that + are not sent to the server. Since IrcCommand does not know how to + handle custom commands, the parser treats them as a special case + injecting the command as a first parameter. + + \code + IrcParser parser; + parser.addCommand(IrcCommand::Custom, "QUERY "); + IrcCommand* command = parser.parse("/query jpnurmi"); + Q_ASSERT(command->type() == IrcCommand::Custom); + qDebug() << command->parameters(); // ("QUERY", "jpnurmi") + \endcode + */ + +/*! + \enum IrcCommandParser::Detail + This enum describes the available syntax details. + */ + +/*! + \var IrcCommandParser::Full + \brief The syntax in full details + */ + +/*! + \var IrcCommandParser::NoTarget + \brief The syntax has injected [target] removed + */ + +/*! + \var IrcCommandParser::NoPrefix + \brief The syntax has \#channel prefixes removed + */ + +/*! + \var IrcCommandParser::NoEllipsis + \brief The syntax has ellipsis... removed + */ + +/*! + \var IrcCommandParser::NoParentheses + \brief The syntax has parentheses () removed + */ + +/*! + \var IrcCommandParser::NoBrackets + \brief The syntax has brackets [] removed + */ + +/*! + \var IrcCommandParser::NoAngles + \brief The syntax has angle brackets <> removed + */ + +/*! + \var IrcCommandParser::Visual + \brief The syntax suitable for visual representation + */ + +#ifndef IRC_DOXYGEN +IrcCommandParserPrivate::IrcCommandParserPrivate() : tolerant(false) +{ +} + +QList IrcCommandParserPrivate::find(const QString& command) const +{ + QList result; + foreach (const IrcCommandInfo& cmd, commands) { + if (cmd.command == command) + result += cmd; + } + return result; +} + +static inline bool isOptional(const QString& token) +{ + return token.startsWith(QLatin1Char('(')) && token.endsWith(QLatin1Char(')')); +} + +static inline bool isMultiWord(const QString& token) +{ + return token.contains(QLatin1String("...")); +} + +static inline bool isChannel(const QString& token) +{ + return token.contains(QLatin1Char('#')); +} + +static inline bool isCurrent(const QString& token) +{ + return token.startsWith(QLatin1Char('[')) && token.endsWith(QLatin1Char(']')); +} + +IrcCommandInfo IrcCommandParserPrivate::parseSyntax(IrcCommand::Type type, const QString& syntax) +{ + IrcCommandInfo cmd; + QStringList tokens = syntax.split(QLatin1Char(' '), QString::SkipEmptyParts); + if (!tokens.isEmpty()) { + cmd.type = type; + cmd.command = tokens.takeFirst().toUpper(); + cmd.syntax = tokens.join(QLatin1String(" ")); + cmd.max = tokens.count(); + + IrcParameterInfo param; + for (int i = 0; i < tokens.count(); ++i) { + const QString& token = tokens.at(i); + param.optional = isOptional(token); + param.channel = isChannel(token); + param.current = isCurrent(token); + param.multi = isMultiWord(token); + if (!param.optional) + ++cmd.min; + if (param.optional && param.channel) + ++cmd.min; + const bool last = (i == tokens.count() - 1); + if (last && param.multi) + cmd.max = INT_MAX; + cmd.params += param; + } + } + return cmd; +} + +IrcCommand* IrcCommandParserPrivate::parseCommand(const IrcCommandInfo& command, const QString& input) const +{ + IrcCommand* cmd = 0; + QStringList params; + if (processParameters(command, input, ¶ms)) { + const int count = params.count(); + if (count >= command.min && count <= command.max) { + cmd = new IrcCommand; + cmd->setType(command.type); + if (command.type == IrcCommand::Custom) + params.prepend(command.command); + cmd->setParameters(params); + } + } + return cmd; +} + +bool IrcCommandParserPrivate::processParameters(const IrcCommandInfo& command, const QString& input, QStringList* params) const +{ + IrcTokenizer tokenizer(input); + for (int i = 0; i < command.params.count(); ++i) { + const IrcParameterInfo& info = command.params.at(i); + const IrcToken token = tokenizer.at(0); + if (info.optional && info.channel) { + if (onChannel()) { + if (!token.isValid() || !channels.contains(token.text(), Qt::CaseInsensitive)) { + params->append(target); + } else if (token.isValid()) { + tokenizer = tokenizer.mid(1); + params->append(token.text()); + } + } else if (!channels.contains(token.text())) { + return false; + } + } else if (info.current) { + params->append(target); + } else if (info.multi) { + const QString multi = tokenizer.toString(); + if (!multi.isEmpty()) { + params->append(multi); + tokenizer.clear(); + } + } else { + tokenizer = tokenizer.mid(1); + if (token.isValid()) + params->append(token.text()); + } + } + return tokenizer.isEmpty(); +} + +bool IrcCommandParserPrivate::processCommand(QString* input, int* removed) const +{ + foreach (const QString& trigger, triggers) { + if (tolerant && trigger.length() == 1 && (input->startsWith(trigger.repeated(2)) || input->startsWith(trigger + QLatin1Char(' ')))) { + // treat "//cmd" and "/ /cmd" as message (-> "/cmd") + input->remove(0, 1); + if (removed) + *removed = 1; + return false; + } else if (input->startsWith(trigger)) { + input->remove(0, trigger.length()); + if (removed) + *removed = trigger.length(); + return true; + } + } + return false; +} + +bool IrcCommandParserPrivate::processMessage(QString* input, int* removed) const +{ + if (input->isEmpty()) + return false; + if (triggers.isEmpty()) + return tolerant; + if (processCommand(input, removed)) + return false; + return tolerant; +} + +bool IrcCommandParserPrivate::onChannel() const +{ + return channels.contains(target, Qt::CaseInsensitive); +} +#endif // IRC_DOXYGEN + +/*! + Constructs a command parser with \a parent. + */ +IrcCommandParser::IrcCommandParser(QObject* parent) : QObject(parent), d_ptr(new IrcCommandParserPrivate) +{ +} + +/*! + Destructs the command parser. + */ +IrcCommandParser::~IrcCommandParser() +{ +} + +/*! + This property holds the known commands. + + The commands are uppercased and in alphabetical order. + + \par Access function: + \li QStringList commands() const + + \par Notifier signal: + \li void commandsChanged(const QStringList& commands) + + \sa addCommand(), removeCommand() + */ +QStringList IrcCommandParser::commands() const +{ + Q_D(const IrcCommandParser); + return d->commands.uniqueKeys(); +} + +/*! + Returns syntax for the given \a command in given \a details level. + */ +QString IrcCommandParser::syntax(const QString& command, Details details) const +{ + Q_D(const IrcCommandParser); + IrcCommandInfo info = d->find(command.toUpper()).value(0); + if (!info.command.isEmpty()) { + QString str = info.fullSyntax(); + if (details != Full) { + if (details & NoTarget) + str.remove(QRegExp("\\[[^\\]]+\\]")); + if (details & NoPrefix) + str.remove("#"); + if (details & NoEllipsis) + str.remove("..."); + if (details & NoParentheses) + str.remove("(").remove(")"); + if (details & NoBrackets) + str.remove("[").remove("]"); + if (details & NoAngles) + str.remove("<").remove(">"); + } + return str.simplified(); + } + return QString(); +} + +/*! + Adds a command with \a type and \a syntax. + */ +void IrcCommandParser::addCommand(IrcCommand::Type type, const QString& syntax) +{ + Q_D(IrcCommandParser); + IrcCommandInfo cmd = d->parseSyntax(type, syntax); + if (!cmd.command.isEmpty()) { + const bool contains = d->commands.contains(cmd.command); + d->commands.insert(cmd.command, cmd); + if (!contains) + emit commandsChanged(commands()); + } +} + +/*! + Removes the command with \a type and \a syntax. + */ +void IrcCommandParser::removeCommand(IrcCommand::Type type, const QString& syntax) +{ + Q_D(IrcCommandParser); + bool changed = false; + QMutableMapIterator it(d->commands); + while (it.hasNext()) { + IrcCommandInfo cmd = it.next().value(); + if (cmd.type == type && (syntax.isEmpty() || !syntax.compare(cmd.fullSyntax(), Qt::CaseInsensitive))) { + it.remove(); + if (!d->commands.contains(cmd.command)) + changed = true; + } + } + if (changed) + emit commandsChanged(commands()); +} + +/*! + This property holds the available channels. + + \par Access functions: + \li QStringList channels() const + \li void setChannels(const QStringList& channels) [slot] + + \par Notifier signal: + \li void channelsChanged(const QStringList& channels) + + \sa IrcBufferModel::channels() + */ +QStringList IrcCommandParser::channels() const +{ + Q_D(const IrcCommandParser); + return d->channels; +} + +void IrcCommandParser::setChannels(const QStringList& channels) +{ + Q_D(IrcCommandParser); + if (d->channels != channels) { + d->channels = channels; + emit channelsChanged(channels); + } +} + +/*! + This property holds the current target. + + \par Access functions: + \li QString target() const + \li void setTarget(const QString& target) [slot] + + \par Notifier signal: + \li void targetChanged(const QString& target) + */ +QString IrcCommandParser::target() const +{ + Q_D(const IrcCommandParser); + return d->target; +} + +void IrcCommandParser::setTarget(const QString& target) +{ + Q_D(IrcCommandParser); + if (d->target != target) { + d->target = target; + emit targetChanged(target); + } +} + +/*! + This property holds the command triggers. + + \par Access functions: + \li QStringList triggers() const + \li void setTriggers(const QStringList& triggers) [slot] + + \par Notifier signal: + \li void triggersChanged(const QStringList& triggers) + */ +QStringList IrcCommandParser::triggers() const +{ + Q_D(const IrcCommandParser); + return d->triggers; +} + +void IrcCommandParser::setTriggers(const QStringList& triggers) +{ + Q_D(IrcCommandParser); + if (d->triggers != triggers) { + d->triggers = triggers; + emit triggersChanged(triggers); + } +} + +/*! + \property bool IrcCommandParser::tolerant + + This property holds whether the parser is tolerant. + + A tolerant parser creates message commands out of input that does not + start with a command trigger, and raw server commands when the input + starts with a command trigger but the command is unrecognized. Known + commands with invalid arguments are still considered invalid. + + The default value is \c false. + + \par Access functions: + \li bool isTolerant() const + \li void setTolerant(bool tolerant) + + \par Notifier signal: + \li void tolerancyChanged(bool tolerant) + + \sa IrcCommand::Quote + */ +bool IrcCommandParser::isTolerant() const +{ + Q_D(const IrcCommandParser); + return d->tolerant; +} + +void IrcCommandParser::setTolerant(bool tolerant) +{ + Q_D(IrcCommandParser); + if (d->tolerant != tolerant) { + d->tolerant = tolerant; + emit tolerancyChanged(tolerant); + } +} + +/*! + Parses and returns the command for \a input, or \c 0 if the input is not valid. + */ +IrcCommand* IrcCommandParser::parse(const QString& input) const +{ + Q_D(const IrcCommandParser); + QString message = input; + if (d->processMessage(&message)) { + return IrcCommand::createMessage(d->target, message.trimmed()); + } else if (!message.isEmpty()) { + IrcTokenizer tokenizer(message); + const QString command = tokenizer.at(0).text().toUpper(); + QString params = tokenizer.mid(1).toString(); + const QList commands = d->find(command); + if (!commands.isEmpty()) { + foreach (const IrcCommandInfo& c, commands) { + IrcCommand* cmd = d->parseCommand(c, params); + if (cmd) + return cmd; + } + } else if (d->tolerant) { + IrcCommandInfo custom = d->parseSyntax(IrcCommand::Quote, QString(QLatin1String("%1 ()")).arg(command)); + params.prepend(custom.command + QLatin1Char(' ')); + return d->parseCommand(custom, params); + } + } + return 0; +} + +/*! + Clears the list of commands. + + \sa reset() + */ +void IrcCommandParser::clear() +{ + Q_D(IrcCommandParser); + if (!d->commands.isEmpty()) { + d->commands.clear(); + emit commandsChanged(QStringList()); + } +} + +/*! + Resets the channels and the current target. + + \sa clear() + */ +void IrcCommandParser::reset() +{ + setChannels(QStringList()); + setTarget(QString()); +} + +#include "moc_irccommandparser.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/util/irccompleter.cpp b/src/libcommuni/src/util/irccompleter.cpp new file mode 100644 index 0000000..430167a --- /dev/null +++ b/src/libcommuni/src/util/irccompleter.cpp @@ -0,0 +1,405 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "irccompleter.h" +#include "irccommandparser.h" +#include "irccommandparser_p.h" +#include "ircbuffermodel.h" +#include "ircusermodel.h" +#include "ircnetwork.h" +#include "ircchannel.h" +#include "irctoken_p.h" +#include "ircuser.h" + +#include +#include +#include +#include + +IRC_BEGIN_NAMESPACE + +/*! + \file irccompleter.h + \brief \#include <IrcCompleter> + */ + +/*! + \since 3.1 + \class IrcCompleter irccompleter.h + \ingroup util + \brief Provides command and name completion. + + IrcCompleter provides command and name completion for a text input field. The completer + is made context aware by assigning a command \ref IrcCompleter::parser "parser" and a + \ref buffer that is currently active in the GUI. The parser is used for completing + commands, and the buffer is used for completing buffer and user names. + + In order to perform a completion, call complete() with the current text input field + content and the cursor position. If a suitable completion is found, the completed() + signal is emitted with a suggestion for a new content and cursor position for the + text input field. + + \code + TextField { + id: textField + + Keys.onTabPressed: completer.complete(text, cursorPosition) + + IrcCompleter { + id: completer + + buffer: ... + parser: ... + + onCompleted: { + textField.text = text + textField.cursorPosition = cursor + } + } + } + \endcode + + \sa IrcCommandParser, IrcBuffer + */ + +/*! + \fn void IrcCompleter::completed(const QString& text, int cursor) + + This signal is emitted when a suitable completion with \a text and \a cursor position is found. + */ + +#ifndef IRC_DOXYGEN + +static bool isPrefixed(const QString& text, int pos, const QStringList& prefixes, int* len) +{ + foreach (const QString& prefix, prefixes) { + const int ll = prefix.length(); + if (text.mid(pos, ll) == prefix) { + if (len) + *len = 0; + return true; + } else if (text.mid(pos - ll, ll) == prefix) { + if (len) + *len = ll; + return true; + } + } + return false; +} + +struct IrcCompletion +{ + IrcCompletion() : text(), cursor(-1) { } + IrcCompletion(const QString& txt, int pos) : text(txt), cursor(pos) { } + bool isValid() const { return !text.isNull() && cursor != -1; } + bool operator ==(const IrcCompletion& other) const { return text == other.text && cursor == other.cursor; } + bool operator !=(const IrcCompletion& other) const { return text != other.text || cursor != other.cursor; } + QString text; + int cursor; +}; + +class IrcCompleterPrivate +{ + Q_DECLARE_PUBLIC(IrcCompleter) + +public: + IrcCompleterPrivate(); + + void completeNext(IrcCompleter::Direction direction); + QList completeCommands(const QString& text, int pos) const; + QList completeWords(const QString& text, int pos) const; + + IrcCompleter* q_ptr; + + int index; + int cursor; + QString text; + QList completions; + + QString suffix; + QPointer buffer; + QPointer parser; +}; + +IrcCompleterPrivate::IrcCompleterPrivate() : q_ptr(0), index(-1), cursor(-1), suffix(":"), buffer(0), parser(0) +{ +} + +void IrcCompleterPrivate::completeNext(IrcCompleter::Direction direction) +{ + Q_Q(IrcCompleter); + Q_ASSERT(!completions.isEmpty()); + if (direction == IrcCompleter::Forward) { + index = (index + 1) % completions.length(); + } else { + if (--index < 0) + index = completions.length() - 1; + } + if (index >= 0 && index < completions.length()) { + const IrcCompletion completion = completions.at(index); + text = completion.text; + cursor = completion.cursor; + emit q->completed(text, cursor); + } +} + +static IrcCompletion completeCommand(const QString& text, const QString& command) +{ + IrcTokenizer tokenizer(text); + tokenizer.replace(0, command); + QString completion = tokenizer.toString(); + int next = command.length(); + if (next >= completion.length() || completion.at(next) != QLatin1Char(' ')) + completion.insert(next, QLatin1Char(' ')); + return IrcCompletion(completion, ++next); +} + +QList IrcCompleterPrivate::completeCommands(const QString& text, int pos) const +{ + if (!parser) + return QList(); + + QList completions; + + int removed = 0; + QString input = text; + IrcCommandParserPrivate* pp = IrcCommandParserPrivate::get(parser); + if (pp->processCommand(&input, &removed)) { + const QString command = input.split(QLatin1Char(' '), QString::SkipEmptyParts).value(0).toUpper(); + if (!command.isEmpty()) { + foreach (const IrcCommandInfo& cmd, pp->commands) { + if (cmd.command == command) + return QList() << completeCommand(text, text.left(removed) + cmd.command); + if (cmd.command.startsWith(command)) + completions += completeCommand(text, text.left(removed) + cmd.command); + } + } + // TODO: context sensitive command parameter completion + Q_UNUSED(pos); + } + return completions; +} + +static IrcCompletion completeWord(const QString& text, int from, int len, const QString& word) +{ + QString completion = QString(text).replace(from, len, word); + int next = from + word.length(); + if (next >= completion.length() || completion.at(next) != QLatin1Char(' ')) + completion.insert(next, QLatin1Char(' ')); + return IrcCompletion(completion, ++next); +} + +QList IrcCompleterPrivate::completeWords(const QString& text, int pos) const +{ + if (!buffer || !buffer->network()) + return QList(); + + QList completions; + + const IrcToken token = IrcTokenizer(text).find(pos); + const QPair bounds = qMakePair(token.position(), token.length()); + if (bounds.first != -1 && bounds.second != -1) { + const QString word = text.mid(bounds.first, bounds.second); + + int pfx = 0; + QString prefix; + bool isChannel = isPrefixed(text, bounds.first, buffer->network()->channelTypes(), &pfx); + if (isChannel && pfx > 0) + prefix = text.mid(bounds.first - pfx, pfx); + + if (!isChannel) { + IrcUserModel userModel; + userModel.setSortMethod(Irc::SortByActivity); + userModel.setChannel(qobject_cast(buffer)); + foreach (IrcUser* user, userModel.users()) { + if (user->name().startsWith(word, Qt::CaseInsensitive)) { + QString name = user->name(); + if (token.index() == 0) + name += suffix; + IrcCompletion completion = completeWord(text, bounds.first, bounds.second, name); + if (completion.isValid() && !completions.contains(completion)) + completions += completion; + } + } + } + + QList buffers = buffer->model()->buffers(); + buffers.move(buffers.indexOf(buffer), 0); // promote the current buffer + foreach (IrcBuffer* buffer, buffers) { + QString title = buffer->title(); + if (!isChannel && token.index() == 0) + title += suffix; + IrcCompletion completion; + if (title.startsWith(word, Qt::CaseInsensitive)) + completion = completeWord(text, bounds.first, bounds.second, title); + else if (isChannel && !prefix.isEmpty() && title.startsWith(prefix + word, Qt::CaseInsensitive)) + completion = completeWord(text, bounds.first - prefix.length(), bounds.second + prefix.length(), title); + if (completion.isValid() && !completions.contains(completion)) + completions += completion; + } + } + return completions; +} +#endif // IRC_DOXYGEN + +/*! + Constructs a completer with \a parent. + */ +IrcCompleter::IrcCompleter(QObject* parent) : QObject(parent), d_ptr(new IrcCompleterPrivate) +{ + Q_D(IrcCompleter); + d->q_ptr = this; +} + +/*! + Destructs the completer. + */ +IrcCompleter::~IrcCompleter() +{ +} + +/*! + This property holds the completion suffix. + + The suffix is appended to the end of a completed nick name, but + only when the nick name is in the beginning of completed text. + + The default value is \c ":". + + \par Access functions: + \li QString suffix() const + \li void setSuffix(const QString& suffix) [slot] + + \par Notifier signal: + \li void suffixChanged(const QString& suffix) + */ +QString IrcCompleter::suffix() const +{ + Q_D(const IrcCompleter); + return d->suffix; +} + +void IrcCompleter::setSuffix(const QString& suffix) +{ + Q_D(IrcCompleter); + if (d->suffix != suffix) { + d->suffix = suffix; + emit suffixChanged(suffix); + } +} + +/*! + This property holds the buffer used for name completion. + + \par Access functions: + \li \ref IrcBuffer* buffer() const + \li void setBuffer(\ref IrcBuffer* buffer) [slot] + + \par Notifier signal: + \li void bufferChanged(\ref IrcBuffer* buffer) + */ +IrcBuffer* IrcCompleter::buffer() const +{ + Q_D(const IrcCompleter); + return d->buffer; +} + +void IrcCompleter::setBuffer(IrcBuffer* buffer) +{ + Q_D(IrcCompleter); + if (d->buffer != buffer) { + d->buffer = buffer; + emit bufferChanged(buffer); + } +} + +/*! + This property holds the parser used for command completion. + + \par Access functions: + \li \ref IrcCommandParser* parser() const + \li void setParser(\ref IrcCommandParser* parser) [slot] + + \par Notifier signal: + \li void parserChanged(\ref IrcCommandParser* parser) + */ +IrcCommandParser* IrcCompleter::parser() const +{ + Q_D(const IrcCompleter); + return d->parser; +} + +void IrcCompleter::setParser(IrcCommandParser* parser) +{ + Q_D(IrcCompleter); + if (d->parser != parser) { + d->parser = parser; + emit parserChanged(parser); + } +} + +/*! + Completes \a text at \a cursor position, iterating multiple + matches to the specified \a direction, and emits completed() + if a suitable completion is found. + */ +void IrcCompleter::complete(const QString& text, int cursor, Direction direction) +{ + Q_D(IrcCompleter); + if (!d->completions.isEmpty() && d->cursor == cursor && d->text == text) { + d->completeNext(direction); + return; + } + + QList completions = d->completeCommands(text, cursor); + if (completions.isEmpty() || IrcTokenizer(text).find(cursor).index() > 0) + completions = d->completeWords(text, cursor); + + if (d->completions != completions) { + d->index = -1; + d->completions = completions; + } + if (!d->completions.isEmpty()) + d->completeNext(direction); +} + +/*! + Resets the completer state. + */ +void IrcCompleter::reset() +{ + Q_D(IrcCompleter); + d->index = -1; + d->cursor = -1; + d->text.clear(); + d->completions.clear(); +} + +#include "moc_irccompleter.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/util/irclagtimer.cpp b/src/libcommuni/src/util/irclagtimer.cpp new file mode 100644 index 0000000..b1612f7 --- /dev/null +++ b/src/libcommuni/src/util/irclagtimer.cpp @@ -0,0 +1,243 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "irclagtimer.h" +#include "irclagtimer_p.h" +#include "ircconnection.h" +#include "ircmessage.h" +#include "irccommand.h" +#include + +IRC_BEGIN_NAMESPACE + +static const int DEFAULT_INTERVAL = 60; + +/*! + \file irclagtimer.h + \brief \#include <IrcLagTimer> + */ + +/*! + \class IrcLagTimer irclagtimer.h + \ingroup util + \brief Provides a timer for measuring lag. + + \note IrcLagTimer relies on functionality introduced in Qt 4.7.0, and is + therefore not functional when built against earlier versions of Qt. + */ + +/*! + \fn void IrcLagTimer::lagChanged(qint64 lag) + + This signal is emitted when the \a lag has changed. + */ + +#ifndef IRC_DOXYGEN +IrcLagTimerPrivate::IrcLagTimerPrivate() : q_ptr(0), connection(0), interval(DEFAULT_INTERVAL), lag(-1) +{ +} + +bool IrcLagTimerPrivate::messageFilter(IrcMessage* msg) +{ + if (msg->type() == IrcMessage::Pong) + return processPongReply(static_cast(msg)); + return false; +} + +bool IrcLagTimerPrivate::processPongReply(IrcPongMessage* msg) +{ +#if QT_VERSION >= 0x040700 + // TODO: configurable format? + if (msg->argument().startsWith("communi/")) { + bool ok = false; + qint64 timestamp = msg->argument().mid(8).toLongLong(&ok); + if (ok) { + updateLag(QDateTime::currentMSecsSinceEpoch() - timestamp); + return true; + } + } +#endif // QT_VERSION + return false; +} + +void IrcLagTimerPrivate::_irc_connected() +{ +#if QT_VERSION >= 0x040700 + if (interval > 0) + timer.start(); +#endif // QT_VERSION +} + +void IrcLagTimerPrivate::_irc_pingServer() +{ +#if QT_VERSION >= 0x040700 + // TODO: configurable format? + QString argument = QString("communi/%1").arg(QDateTime::currentMSecsSinceEpoch()); + IrcCommand* cmd = IrcCommand::createPing(argument); + connection->sendCommand(cmd); +#endif // QT_VERSION +} + +void IrcLagTimerPrivate::_irc_disconnected() +{ +#if QT_VERSION >= 0x040700 + updateLag(-1); + if (timer.isActive()) + timer.stop(); +#endif // QT_VERSION +} + +void IrcLagTimerPrivate::updateTimer() +{ +#if QT_VERSION >= 0x040700 + if (connection && interval > 0) { + timer.setInterval(interval * 1000); + if (!timer.isActive() && connection->isConnected()) + timer.start(); + } else { + if (timer.isActive()) + timer.stop(); + updateLag(-1); + } +#endif // QT_VERSION +} + +void IrcLagTimerPrivate::updateLag(qint64 value) +{ + Q_Q(IrcLagTimer); + if (lag != value) { + lag = qMax(-1ll, value); + emit q->lagChanged(lag); + } +} +#endif // IRC_DOXYGEN + +/*! + Constructs a new lag timer with \a parent. + + \note If \a parent is an instance of IrcConnection, it will be + automatically assigned to \ref IrcLagTimer::connection "connection". + */ +IrcLagTimer::IrcLagTimer(QObject* parent) : QObject(parent), d_ptr(new IrcLagTimerPrivate) +{ + Q_D(IrcLagTimer); + d->q_ptr = this; + connect(&d->timer, SIGNAL(timeout()), this, SLOT(_irc_pingServer())); + setConnection(qobject_cast(parent)); +} + +/*! + Destructs the lag timer. + */ +IrcLagTimer::~IrcLagTimer() +{ +} + +/*! + This property holds the associated connection. + + \par Access functions: + \li IrcConnection* connection() const + \li void setConnection(IrcConnection* connection) + */ +IrcConnection* IrcLagTimer::connection() const +{ + Q_D(const IrcLagTimer); + return d->connection; +} + +void IrcLagTimer::setConnection(IrcConnection* connection) +{ + Q_D(IrcLagTimer); + if (d->connection != connection) { + if (d->connection) { + d->connection->removeMessageFilter(d); + disconnect(d->connection, SIGNAL(connected()), this, SLOT(_irc_connected())); + disconnect(d->connection, SIGNAL(disconnected()), this, SLOT(_irc_disconnected())); + } + d->connection = connection; + if (connection) { + connection->installMessageFilter(d); + connect(connection, SIGNAL(connected()), this, SLOT(_irc_connected())); + connect(connection, SIGNAL(disconnected()), this, SLOT(_irc_disconnected())); + } + d->updateLag(-1); + d->updateTimer(); + } +} + +/*! + This property holds the current lag in milliseconds. + + The value is \c -1 when + \li the connection is not connected, + \li the lag has not yet been measured, + \li the lag timer is disabled (interval <= 0s), or + \li the Qt version is too old (4.7.0 or later is required). + + \par Access function: + \li qint64 lag() const + + \par Notifier signal: + \li void lagChanged(qint64 lag) + */ +qint64 IrcLagTimer::lag() const +{ + Q_D(const IrcLagTimer); + return d->lag; +} + +/*! + This property holds the lag measurement interval in seconds. + + The default value is \c 60 seconds. A value equal to or + less than \c 0 seconds disables the lag measurement. + + \par Access functions: + \li int interval() const + \li void setInterval(int seconds) + */ +int IrcLagTimer::interval() const +{ + Q_D(const IrcLagTimer); + return d->interval; +} + +void IrcLagTimer::setInterval(int seconds) +{ + Q_D(IrcLagTimer); + if (d->interval != seconds) { + d->interval = seconds; + d->updateTimer(); + } +} + +#include "moc_irclagtimer.cpp" +#include "moc_irclagtimer_p.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/util/ircpalette.cpp b/src/libcommuni/src/util/ircpalette.cpp new file mode 100644 index 0000000..fe31035 --- /dev/null +++ b/src/libcommuni/src/util/ircpalette.cpp @@ -0,0 +1,527 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircpalette.h" +#include "irc.h" + +IRC_BEGIN_NAMESPACE + +/*! + \file ircpalette.h + \brief \#include <IrcPalette> + */ + +/*! + \class IrcPalette ircpalette.h + \ingroup util + \brief Specifies a palette of IRC colors. + + IrcPalette is used to specify the desired IRC color palette when + converting IRC-style formatted messages to HTML using IrcTextFormat. + + \code + IrcTextFormat format; + IrcPalette* palette = format.palette(); + palette->setColorName(Irc::Red, "#ff3333"); + palette->setColorName(Irc::Green, "#33ff33"); + palette->setColorName(Irc::Blue, "#3333ff"); + // ... + + QString html = format.toHtml(message); + \endcode + + \sa Irc::Color, mIRC colors, SVG color keyword names + */ + +class IrcPalettePrivate +{ +public: + QMap colors; +}; + +static QMap& irc_default_colors() +{ + static QMap x; + if (x.isEmpty()) { + x.insert(Irc::White, QLatin1String("white")); + x.insert(Irc::Black, QLatin1String("black")); + x.insert(Irc::Blue, QLatin1String("blue")); + x.insert(Irc::Green, QLatin1String("green")); + x.insert(Irc::Red, QLatin1String("red")); + x.insert(Irc::Brown, QLatin1String("brown")); + x.insert(Irc::Purple, QLatin1String("purple")); + x.insert(Irc::Orange, QLatin1String("orange")); + x.insert(Irc::Yellow, QLatin1String("yellow")); + x.insert(Irc::LightGreen, QLatin1String("lightgreen")); + x.insert(Irc::Cyan, QLatin1String("cyan")); + x.insert(Irc::LightCyan, QLatin1String("lightcyan")); + x.insert(Irc::LightBlue, QLatin1String("lightblue")); + x.insert(Irc::Pink, QLatin1String("pink")); + x.insert(Irc::Gray, QLatin1String("gray")); + x.insert(Irc::LightGray, QLatin1String("lightgray")); + } + return x; +} + +/*! + \internal + Constructs a new palette with \a parent. + */ +IrcPalette::IrcPalette(QObject* parent) : QObject(parent), d_ptr(new IrcPalettePrivate) +{ + Q_D(IrcPalette); + d->colors = irc_default_colors(); +} + +/*! + \internal + Destructs the palette. + */ +IrcPalette::~IrcPalette() +{ +} + +/*! + This property holds the white color name. + + The default value is \c "white". + + \par Access functions: + \li QString white() const + \li void setWhite(const QString& color) + + \sa Irc::White + */ +QString IrcPalette::white() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::White); +} + +void IrcPalette::setWhite(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::White, color); +} + +/*! + This property holds the black color name. + + The default value is \c "black". + + \par Access functions: + \li QString black() const + \li void setBlack(const QString& color) + + \sa Irc::Black + */ +QString IrcPalette::black() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Black); +} + +void IrcPalette::setBlack(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Black, color); +} + +/*! + This property holds the blue color name. + + The default value is \c "blue". + + \par Access functions: + \li QString blue() const + \li void setBlue(const QString& color) + + \sa Irc::Blue + */ +QString IrcPalette::blue() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Blue); +} + +void IrcPalette::setBlue(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Blue, color); +} + +/*! + This property holds the green color name. + + The default value is \c "green". + + \par Access functions: + \li QString green() const + \li void setGreen(const QString& color) + + \sa Irc::Green + */ +QString IrcPalette::green() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Green); +} + +void IrcPalette::setGreen(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Green, color); +} + +/*! + This property holds the red color name. + + The default value is \c "red". + + \par Access functions: + \li QString red() const + \li void setRed(const QString& color) + + \sa Irc::Red + */ +QString IrcPalette::red() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Red); +} + +void IrcPalette::setRed(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Red, color); +} + +/*! + This property holds the brown color name. + + The default value is \c "brown". + + \par Access functions: + \li QString brown() const + \li void setBrown(const QString& color) + + \sa Irc::Brown + */ +QString IrcPalette::brown() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Brown); +} + +void IrcPalette::setBrown(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Brown, color); +} + +/*! + This property holds the purple color name. + + The default value is \c "purple". + + \par Access functions: + \li QString purple() const + \li void setPurple(const QString& color) + + \sa Irc::Purple + */ +QString IrcPalette::purple() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Purple); +} + +void IrcPalette::setPurple(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Purple, color); +} + +/*! + This property holds the orange color name. + + The default value is \c "orange". + + \par Access functions: + \li QString orange() const + \li void setOrange(const QString& color) + + \sa Irc::Orange + */ +QString IrcPalette::orange() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Orange); +} + +void IrcPalette::setOrange(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Orange, color); +} + +/*! + This property holds the yellow color name. + + The default value is \c "yellow". + + \par Access functions: + \li QString yellow() const + \li void setYellow(const QString& color) + + \sa Irc::Yellow + */ +QString IrcPalette::yellow() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Yellow); +} + +void IrcPalette::setYellow(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Yellow, color); +} + +/*! + This property holds the light green color name. + + The default value is \c "lightgreen". + + \par Access functions: + \li QString lightGreen() const + \li void setLightGreen(const QString& color) + + \sa Irc::LightGreen + */ +QString IrcPalette::lightGreen() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::LightGreen); +} + +void IrcPalette::setLightGreen(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::LightGreen, color); +} + +/*! + This property holds the cyan color name. + + The default value is \c "cyan". + + \par Access functions: + \li QString cyan() const + \li void setCyan(const QString& color) + + \sa Irc::Cyan + */ +QString IrcPalette::cyan() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Cyan); +} + +void IrcPalette::setCyan(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Cyan, color); +} + +/*! + This property holds the light cyan color name. + + The default value is \c "lightcyan". + + \par Access functions: + \li QString lightCyan() const + \li void setLightCyan(const QString& color) + + \sa Irc::LightCyan + */ +QString IrcPalette::lightCyan() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::LightCyan); +} + +void IrcPalette::setLightCyan(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::LightCyan, color); +} + +/*! + This property holds the light blue color name. + + The default value is \c "lightblue". + + \par Access functions: + \li QString lightBlue() const + \li void setLightBlue(const QString& color) + + \sa Irc::LightBlue + */ +QString IrcPalette::lightBlue() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::LightBlue); +} + +void IrcPalette::setLightBlue(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::LightBlue, color); +} + +/*! + This property holds the pink color name. + + The default value is \c "pink". + + \par Access functions: + \li QString pink() const + \li void setPink(const QString& color) + + \sa Irc::Pink + */ +QString IrcPalette::pink() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Pink); +} + +void IrcPalette::setPink(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Pink, color); +} + +/*! + This property holds the gray color name. + + The default value is \c "gray". + + \par Access functions: + \li QString gray() const + \li void setGray(const QString& color) + + \sa Irc::Gray + */ +QString IrcPalette::gray() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::Gray); +} + +void IrcPalette::setGray(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::Gray, color); +} + +/*! + This property holds the light gray color name. + + The default value is \c "lightgray". + + \par Access functions: + \li QString lightGray() const + \li void setLightGray(const QString& color) + + \sa Irc::LightGray + */ +QString IrcPalette::lightGray() const +{ + Q_D(const IrcPalette); + return d->colors.value(Irc::LightGray); +} + +void IrcPalette::setLightGray(const QString& color) +{ + Q_D(IrcPalette); + d->colors.insert(Irc::LightGray, color); +} + +/*! + Returns the map of color names. + */ +QMap IrcPalette::colorNames() const +{ + Q_D(const IrcPalette); + return d->colors; +} + +/*! + Sets the map of color \a names. + */ +void IrcPalette::setColorNames(const QMap& names) +{ + Q_D(IrcPalette); + d->colors = names; +} + +/*! + Converts a \a color code to a color name. If the \a color code + is unknown, the function returns the \a fallback color name. +*/ +QString IrcPalette::colorName(int color, const QString& fallback) const +{ + Q_D(const IrcPalette); + return d->colors.value(color, fallback); +} + +/*! + Assigns a \a name for \a color code. + + The color \a name may be in one of these formats: + + \li \#RGB (each of R, G, and B is a single hex digit) + \li \#RRGGBB + \li \#RRRGGGBBB + \li \#RRRRGGGGBBBB + \li A name from the list of colors defined in the list of SVG color keyword names + provided by the World Wide Web Consortium; for example, "steelblue" or "gainsboro". These color names work on all platforms. Note that these + color names are not the same as defined by the Qt::GlobalColor enums, e.g. "green" and Qt::green does not refer to the same color. + \li transparent - representing the absence of a color. +*/ +void IrcPalette::setColorName(int color, const QString& name) +{ + Q_D(IrcPalette); + d->colors.insert(color, name); +} + +#include "moc_ircpalette.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/util/irctextformat.cpp b/src/libcommuni/src/util/irctextformat.cpp new file mode 100644 index 0000000..072de47 --- /dev/null +++ b/src/libcommuni/src/util/irctextformat.cpp @@ -0,0 +1,550 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + Parts of this code come from Konversation and are copyrighted to: + Copyright (C) 2002 Dario Abatianni + Copyright (C) 2004 Peter Simonsson + Copyright (C) 2006-2008 Eike Hein + Copyright (C) 2004-2009 Eli Mackenzie +*/ + +#include "irctextformat.h" +#include "ircpalette.h" +#if QT_VERSION >= 0x050000 +#include +#endif +#include +#include +#include +#include "irc.h" + +IRC_BEGIN_NAMESPACE + +/*! + \file irctextformat.h + \brief \#include <IrcTextFormat> + */ + +/*! + \class IrcTextFormat irctextformat.h + \ingroup util + \brief Provides methods for text formatting. + + IrcTextFormat is used to convert IRC-style formatted messages to either + plain text or HTML. When converting to plain text, the IRC-style formatting + (colors, bold, underline etc.) are simply stripped away. When converting + to HTML, the IRC-style formatting is converted to the corresponding HTML + formatting. + + \code + IrcTextFormat format; + QString text = format.toPlainText(message); + + format.palette()->setColorName(Irc::Red, "#ff3333"); + format.palette()->setColorName(Irc::Green, "#33ff33"); + format.palette()->setColorName(Irc::Blue, "#3333ff"); + // ... + QString html = format.toHtml(message); + \endcode + + \sa IrcPalette + */ + +/*! + \enum IrcTextFormat::SpanFormat + This enum describes the supported formats for HTML span-elements. + */ + +/*! + \var IrcTextFormat::SpanStyle + \brief HTML span-elements with style-attributes. + */ + +/*! + \var IrcTextFormat::SpanClass + \brief HTML span-elements with class-attributes. + */ + +class IrcTextFormatPrivate +{ +public: + void parse(const QString& str, QString* text, QString* html, QList* urls) const; + + QString plainText; + QString html; + QList urls; + QString urlPattern; + IrcPalette* palette; + IrcTextFormat::SpanFormat spanFormat; +}; + +static bool parseColors(const QString& message, int pos, int* len, int* fg = 0, int* bg = 0) +{ + // fg(,bg) + *len = 0; + if (fg) + *fg = -1; + if (bg) + *bg = -1; + QRegExp rx(QLatin1String("(\\d{1,2})(?:,(\\d{1,2}))?")); + int idx = rx.indexIn(message, pos); + if (idx == pos) { + *len = rx.matchedLength(); + if (fg) + *fg = rx.cap(1).toInt(); + if (bg) { + bool ok = false; + int tmp = rx.cap(2).toInt(&ok); + if (ok) + *bg = tmp; + } + } + return *len > 0; +} + +static QString generateLink(const QString& protocol, const QString& href) +{ + const char* exclude = ":/?@%#=+&,"; + const QByteArray url = QUrl::toPercentEncoding(href, exclude); + return QString(QLatin1String("%3")).arg(protocol, url, href); +} + +static QString parseLinks(const QString& message, const QString& pattern, QList* urls) +{ + QString processed = message; +#if QT_VERSION >= 0x050000 + int offset = 0; + QRegularExpression rx(pattern); + QRegularExpressionMatchIterator it = rx.globalMatch(message); + while (it.hasNext()) { + QRegularExpressionMatch match = it.next(); + QString protocol; + if (match.capturedRef(2).isEmpty()) { + QStringRef link = match.capturedRef(1); + if (link.startsWith(QStringLiteral("ftp."), Qt::CaseInsensitive)) + protocol = QStringLiteral("ftp://"); + else if (link.contains(QStringLiteral("@"))) + protocol = QStringLiteral("mailto:"); + else + protocol = QStringLiteral("http://"); + } + + const int start = match.capturedStart(); + const int len = match.capturedEnd() - start; + const QString href = match.captured(); + const QString link = generateLink(protocol, href); + processed.replace(start + offset, len, link); + offset += link.length() - len; + if (urls) + urls->append(QUrl(protocol + href)); + } +#else + int pos = 0; + QRegExp rx(pattern); + while ((pos = rx.indexIn(processed, pos)) >= 0) { + int len = rx.matchedLength(); + QString href = processed.mid(pos, len); + + QString protocol; + if (rx.cap(2).isEmpty()) { + if (rx.cap(1).contains(QLatin1Char('@'))) + protocol = QLatin1String("mailto:"); + else if (rx.cap(1).startsWith(QLatin1String("ftp."), Qt::CaseInsensitive)) + protocol = QLatin1String("ftp://"); + else + protocol = QLatin1String("http://"); + } + + QString link = generateLink(protocol, href); + processed.replace(pos, len, link); + pos += link.length(); + if (urls) + urls->append(QUrl(protocol + href)); + } +#endif + return processed; +} + +void IrcTextFormatPrivate::parse(const QString& str, QString* text, QString* html, QList* urls) const +{ + QString processed = str; + + // TODO: + //processed.replace(QLatin1Char('&'), QLatin1String("&")); + processed.replace(QLatin1Char('<'), QLatin1String("<")); + //processed.replace(QLatin1Char('>'), QLatin1String(">")); + //processed.replace(QLatin1Char('"'), QLatin1String(""")); + //processed.replace(QLatin1Char('\''), QLatin1String("'")); + //processed.replace(QLatin1Char('\t'), QLatin1String(" ")); + + enum { + None = 0x0, + Bold = 0x1, + Italic = 0x4, + LineThrough = 0x8, + Underline = 0x10, + Inverse = 0x20 + }; + int state = None; + + int pos = 0; + int len = 0; + int fg = -1; + int bg = -1; + int depth = 0; + bool potentialUrl = false; + while (pos < processed.size()) { + QString replacement; + switch (processed.at(pos).unicode()) { + case '\x02': // bold + if (state & Bold) { + depth--; + replacement = QLatin1String(""); + } else { + depth++; + if (spanFormat == IrcTextFormat::SpanStyle) + replacement = QLatin1String(""); + else + replacement = QLatin1String(""); + } + state ^= Bold; + break; + + case '\x03': // color + if (parseColors(processed, pos + 1, &len, &fg, &bg)) { + depth++; + if (spanFormat == IrcTextFormat::SpanStyle) { + QStringList styles; + styles += QString(QLatin1String("color: %1")).arg(palette->colorName(fg, QLatin1String("black"))); + if (bg != -1) + styles += QString(QLatin1String("background-color: %1")).arg(palette->colorName(bg, QLatin1String("transparent"))); + replacement = QString(QLatin1String("")).arg(styles.join(QLatin1String("; "))); + } else { + QStringList classes; + classes += palette->colorName(fg, QLatin1String("black")); + if (bg != -1) + classes += palette->colorName(bg, QLatin1String("transparent")) + QLatin1String("-background"); + replacement = QString(QLatin1String("")).arg(classes.join(QLatin1String(" "))); + } + // \x03FF(,BB) + processed.replace(pos, len + 1, replacement); + pos += replacement.length(); + continue; + } else { + depth--; + replacement = QLatin1String(""); + } + break; + + //case '\x09': // italic + case '\x1d': // italic + if (state & Italic) { + depth--; + replacement = QLatin1String(""); + } else { + depth++; + if (spanFormat == IrcTextFormat::SpanStyle) + replacement = QLatin1String(""); + else + replacement = QLatin1String(""); + } + state ^= Italic; + break; + + case '\x13': // line-through + if (state & LineThrough) { + depth--; + replacement = QLatin1String(""); + } else { + depth++; + if (spanFormat == IrcTextFormat::SpanStyle) + replacement = QLatin1String(""); + else + replacement = QLatin1String(""); + } + state ^= LineThrough; + break; + + case '\x15': // underline + case '\x1f': // underline + if (state & Underline) { + depth--; + replacement = QLatin1String(""); + } else { + depth++; + if (spanFormat == IrcTextFormat::SpanStyle) + replacement = QLatin1String(""); + else + replacement = QLatin1String(""); + } + state ^= Underline; + break; + + case '\x16': // inverse + if (state & Inverse) { + depth--; + replacement = QLatin1String(""); + } else { + depth++; + if (spanFormat == IrcTextFormat::SpanStyle) + replacement = QLatin1String(""); + else + replacement = QLatin1String(""); + } + state ^= Inverse; + break; + + case '\x0f': // none + if (depth > 0) + replacement = QString(QLatin1String("")).repeated(depth); + else + processed.remove(pos--, 1); // must rewind back for ++pos below... + state = None; + depth = 0; + break; + + case '.': + case '/': + case ':': + // a dot, slash or colon NOT surrounded by a space indicates a potential URL + if (!potentialUrl && pos > 0 && !processed.at(pos - 1).isSpace() + && pos < processed.length() - 1 && !processed.at(pos + 1).isSpace()) + potentialUrl = true; + // flow through + default: + if (text) + *text += processed.at(pos); + break; + } + + if (!replacement.isEmpty()) { + processed.replace(pos, 1, replacement); + pos += replacement.length(); + } else { + ++pos; + } + } + + if ((html || urls) && potentialUrl && !urlPattern.isEmpty()) + processed = parseLinks(processed, urlPattern, urls); + if (html) + *html = processed; +} + +/*! + Constructs a new text format with \a parent. + */ +IrcTextFormat::IrcTextFormat(QObject* parent) : QObject(parent), d_ptr(new IrcTextFormatPrivate) +{ + Q_D(IrcTextFormat); + d->palette = new IrcPalette(this); + d->urlPattern = QString("\\b((?:(?:([a-z][\\w\\.-]+:/{1,3})|www|ftp\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|\\}\\]|[^\\s`!()\\[\\]{};:'\".,<>?%1%2%3%4%5%6])|[a-z0-9.\\-+_]+@[a-z0-9.\\-]+[.][a-z]{1,5}[^\\s/`!()\\[\\]{};:'\".,<>?%1%2%3%4%5%6]))").arg(QChar(0x00AB)).arg(QChar(0x00BB)).arg(QChar(0x201C)).arg(QChar(0x201D)).arg(QChar(0x2018)).arg(QChar(0x2019)); + d->spanFormat = SpanStyle; +} + +/*! + Destructs the text format. + */ +IrcTextFormat::~IrcTextFormat() +{ +} + +/*! + This property holds the palette used for color formatting. + + \par Access function: + \li \ref IrcPalette* palette() const + */ +IrcPalette* IrcTextFormat::palette() const +{ + Q_D(const IrcTextFormat); + return d->palette; +} + +/*! + This property holds the regular expression pattern used for matching URLs. + + \par Access functions: + \li QString urlPattern() const + \li void setUrlPattern(const QString& pattern) + */ +QString IrcTextFormat::urlPattern() const +{ + Q_D(const IrcTextFormat); + return d->urlPattern; +} + +void IrcTextFormat::setUrlPattern(const QString& pattern) +{ + Q_D(IrcTextFormat); + d->urlPattern = pattern; +} + +/*! + \since 3.1 + + This property holds the format used for HTML span-elements. + + IrcTextFormat uses HTML span-elements for converting the IRC-style text + formatting to the corresponding HTML formatting. The \ref SpanStyle format + generates self contained span-elements with style-attributes, resulting to + HTML that is ready to be used with Qt's rich text classes without additional + styling. For more flexible styling, the \ref SpanClass generates span-elements + with class-attributes that can be styled with additional style sheets. + + The default value is \ref SpanStyle. The following table illustrates the + difference between \ref SpanStyle and \ref SpanClass HTML formatting: + + IRC format | SpanStyle | SpanClass + --------------------------------------- | ----------------------------------------------------------------------|---------- + Bold ("\02...\0F") | <span style='font-weight: bold'>...</span> | <span class='bold'>...</span> + Color ("\03fg...\0F") | <span style='color: fg;'>...</span> | <span class='fg'>...</span> + Background ("\03fgbg...\0F") | <span style='color: fg; background-color: bg'>...</span> | <span class='fg bg-background'>...</span> + Italic ("\09...\0F") | <span style='font-style: italic'>...</span> | <span class='italic'>...</span> + Line-through ("\13...\0F") | <span style='text-decoration: line-through'>...</span> | <span class='line-through'>...</span> + Underline ("\15...\0F" or "\1F...\0F") | <span style='text-decoration: underline'>...</span> | <span class='underline'>...</span> + Inverse ("\16...\0F") | <span style='text-decoration: inverse'>...</span> | <span class='inverse'>...</span> + + \par Access functions: + \li \ref SpanFormat spanFormat() const + \li void setSpanFormat(\ref SpanFormat format) + */ +IrcTextFormat::SpanFormat IrcTextFormat::spanFormat() const +{ + Q_D(const IrcTextFormat); + return d->spanFormat; +} + +void IrcTextFormat::setSpanFormat(IrcTextFormat::SpanFormat format) +{ + Q_D(IrcTextFormat); + d->spanFormat = format; +} + + +/*! + Converts \a text to HTML. This function parses the text and replaces + IRC-style formatting (colors, bold, underline etc.) to the corresponding + HTML formatting. Furthermore, this function detects URLs and replaces + them with appropriate HTML hyperlinks. + + \note URL detection can be disabled by setting an empty + regular expression pattern used for matching URLs. + + \sa toPlainText(), parse(), palette, urlPattern, spanFormat +*/ +QString IrcTextFormat::toHtml(const QString& text) const +{ + Q_D(const IrcTextFormat); + QString html; + d->parse(text, 0, &html, 0); + return html; +} + +/*! + Converts \a text to plain text. This function parses the text and + strips away IRC-style formatting (colors, bold, underline etc.) + + \sa toHtml(), parse() +*/ +QString IrcTextFormat::toPlainText(const QString& text) const +{ + Q_D(const IrcTextFormat); + QString plain; + d->parse(text, &plain, 0, 0); + return plain; +} + +/*! + \since 3.2 + + This property holds the current plain text content. + + \par Access function: + \li QString plainText() const + + \sa parse(), html, urls + */ +QString IrcTextFormat::plainText() const +{ + Q_D(const IrcTextFormat); + return d->plainText; +} + +/*! + \since 3.2 + + This property holds the current HTML content. + + \par Access function: + \li QString html() const + + \sa parse(), plainText, urls + */ +QString IrcTextFormat::html() const +{ + Q_D(const IrcTextFormat); + return d->html; +} + +/*! + \since 3.2 + + This property holds the current list of URLs. + + \par Access function: + \li QList urls() const + + \sa parse(), plainText, html + */ +QList IrcTextFormat::urls() const +{ + Q_D(const IrcTextFormat); + return d->urls; +} + +/*! + \since 3.2 + + Parses \a text converting it to plain text and HTML and detects URLs. + + \sa plainText, html, urls + */ +void IrcTextFormat::parse(const QString& text) +{ + Q_D(IrcTextFormat); + d->plainText.clear(); + d->html.clear(); + d->urls.clear(); + d->parse(text, &d->plainText, &d->html, &d->urls); +} + +#include "moc_irctextformat.cpp" + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/util/irctoken.cpp b/src/libcommuni/src/util/irctoken.cpp new file mode 100644 index 0000000..97f44a4 --- /dev/null +++ b/src/libcommuni/src/util/irctoken.cpp @@ -0,0 +1,125 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "irctoken_p.h" +#include + +IRC_BEGIN_NAMESPACE + +#ifndef IRC_DOXYGEN +static QList tokenize(const QString& str) +{ + int idx = -1; + int pos = 0; + QList tokens; + foreach (const QString& txt, str.split(QLatin1String(" "))) { + if (!txt.isEmpty()) + tokens += IrcToken(++idx, pos, txt); + pos += txt.length() + 1; + } + return tokens; +} + +IrcTokenizer::IrcTokenizer(const QString& str) : len(str.length()), t(tokenize(str)) +{ +} + +int IrcTokenizer::count() const +{ + return t.count(); +} + +bool IrcTokenizer::isEmpty() const +{ + return t.isEmpty(); +} + +QList IrcTokenizer::tokens() const +{ + return t; +} + +IrcToken IrcTokenizer::at(int index) const +{ + return t.value(index); +} + +IrcTokenizer IrcTokenizer::mid(int index) const +{ + IrcTokenizer tt; + tt.t = t.mid(index); + if (!tt.isEmpty()) { + int d = tt.t.first().position(); + tt.len = len - d; + for (int i = 0; i < tt.t.length(); ++i) { + tt.t[i].idx = i; + tt.t[i].pos -= d; + } + } + return tt; +} + +void IrcTokenizer::clear() +{ + t.clear(); +} + +void IrcTokenizer::replace(int index, const QString& text) +{ + IrcToken token = t.value(index); + if (token.isValid()) { + int d = text.length() - token.length(); + token = IrcToken(index, token.position(), text); + t.replace(index, token); + len += d; + for (int i = index + 1; i < t.length(); ++i) + t[i].pos += d; + } +} + +IrcToken IrcTokenizer::find(int pos) const +{ + IrcToken token; + foreach (const IrcToken& tk, t) { + if (tk.position() > pos) + break; + token = tk; + } + return token; +} + +QString IrcTokenizer::toString() const +{ + QString str(len, QLatin1Char(' ')); + foreach (const IrcToken& token, t) + str.replace(token.position(), token.length(), token.text()); + return str; +} +#endif // IRC_DOXYGEN + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/util/ircutil.cpp b/src/libcommuni/src/util/ircutil.cpp new file mode 100644 index 0000000..efcb591 --- /dev/null +++ b/src/libcommuni/src/util/ircutil.cpp @@ -0,0 +1,61 @@ +/* + Copyright (C) 2008-2014 The Communi Project + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "ircutil.h" + +IRC_BEGIN_NAMESPACE + +/*! + \file ircutil.h + \brief \#include <IrcUtil> + */ + +/*! + \namespace IrcUtil + \ingroup util + \brief Module meta-type registration. + */ + +namespace IrcUtil { + + /*! + Registers IrcUtil types to the %Qt meta-system. + + \sa IrcCore::registerMetaTypes(), IrcModel::registerMetaTypes(), qRegisterMetaType() + */ + void registerMetaTypes() + { + qRegisterMetaType("IrcCommandParser*"); + qRegisterMetaType("IrcCompleter*"); + qRegisterMetaType("IrcLagTimer*"); + qRegisterMetaType("IrcPalette*"); + qRegisterMetaType("IrcTextFormat*"); + } +} + +IRC_END_NAMESPACE diff --git a/src/libcommuni/src/util/util.pri b/src/libcommuni/src/util/util.pri new file mode 100644 index 0000000..ad4b69f --- /dev/null +++ b/src/libcommuni/src/util/util.pri @@ -0,0 +1,39 @@ +###################################################################### +# Communi +###################################################################### + +DEFINES += BUILD_IRC_UTIL + +INCDIR = $$PWD/../../include/IrcUtil + +DEPENDPATH += $$PWD $$INCDIR +INCLUDEPATH += $$PWD $$INCDIR + +CONV_HEADERS += $$INCDIR/IrcCommandParser +CONV_HEADERS += $$INCDIR/IrcCompleter +CONV_HEADERS += $$INCDIR/IrcLagTimer +CONV_HEADERS += $$INCDIR/IrcPalette +CONV_HEADERS += $$INCDIR/IrcTextFormat +CONV_HEADERS += $$INCDIR/IrcUtil + +PUB_HEADERS += $$INCDIR/irccommandparser.h +PUB_HEADERS += $$INCDIR/irccompleter.h +PUB_HEADERS += $$INCDIR/irclagtimer.h +PUB_HEADERS += $$INCDIR/ircpalette.h +PUB_HEADERS += $$INCDIR/irctextformat.h +PUB_HEADERS += $$INCDIR/ircutil.h + +PRIV_HEADERS = $$INCDIR/irccommandparser_p.h +PRIV_HEADERS += $$INCDIR/irclagtimer_p.h +PRIV_HEADERS += $$INCDIR/irctoken_p.h + +HEADERS += $$PUB_HEADERS +HEADERS += $$PRIV_HEADERS + +SOURCES += $$PWD/irccommandparser.cpp +SOURCES += $$PWD/irccompleter.cpp +SOURCES += $$PWD/irclagtimer.cpp +SOURCES += $$PWD/ircpalette.cpp +SOURCES += $$PWD/irctextformat.cpp +SOURCES += $$PWD/irctoken.cpp +SOURCES += $$PWD/ircutil.cpp diff --git a/src/libcommuni/src/util/util.pro b/src/libcommuni/src/util/util.pro new file mode 100644 index 0000000..bc55556 --- /dev/null +++ b/src/libcommuni/src/util/util.pro @@ -0,0 +1,11 @@ +###################################################################### +# Communi +###################################################################### + +IRC_MODULE = IrcUtil +include(util.pri) +include(../module_build.pri) +include(../module_install.pri) + +IRC_MODULES = IrcCore IrcModel +include(../module_deps.pri) diff --git a/src/libcommuni/tests/auto/auto.pri b/src/libcommuni/tests/auto/auto.pri new file mode 100644 index 0000000..537efa0 --- /dev/null +++ b/src/libcommuni/tests/auto/auto.pri @@ -0,0 +1,9 @@ +###################################################################### +# Communi +###################################################################### + +QT = core network testlib +CONFIG += testcase +CONFIG -= app_bundle + +include(../tests.pri) diff --git a/src/libcommuni/tests/auto/auto.pro b/src/libcommuni/tests/auto/auto.pro new file mode 100644 index 0000000..e06d77c --- /dev/null +++ b/src/libcommuni/tests/auto/auto.pro @@ -0,0 +1,26 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = subdirs + +# IrcCore +SUBDIRS += irc +SUBDIRS += ircconnection +SUBDIRS += irccommand +SUBDIRS += ircmessage +SUBDIRS += ircnetwork + +# IrcModel +SUBDIRS += ircbuffer +SUBDIRS += ircbuffermodel +SUBDIRS += ircchannel +SUBDIRS += ircuser +SUBDIRS += ircusermodel + +# IrcUtil +SUBDIRS += irccommandparser +SUBDIRS += irccompleter +SUBDIRS += irclagtimer +SUBDIRS += ircpalette +SUBDIRS += irctextformat diff --git a/src/libcommuni/tests/auto/irc/irc.pro b/src/libcommuni/tests/auto/irc/irc.pro new file mode 100644 index 0000000..8270c47 --- /dev/null +++ b/src/libcommuni/tests/auto/irc/irc.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_irc.cpp + +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/irc/tst_irc.cpp b/src/libcommuni/tests/auto/irc/tst_irc.cpp new file mode 100644 index 0000000..2a39f0b --- /dev/null +++ b/src/libcommuni/tests/auto/irc/tst_irc.cpp @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "irc.h" +#include +#include + +class tst_Irc : public QObject +{ + Q_OBJECT + +private slots: + void testCreation(); + void testVersion(); + + void testCodeToString_data(); + void testCodeToString(); + + void testMetaObject(); + + void testPrefix_data(); + void testPrefix(); + + void testDebug(); +}; + +void tst_Irc::testCreation() +{ + Irc ircStatic; + Q_UNUSED(ircStatic); + + QScopedPointer ircDynamic(new Irc); + Q_UNUSED(ircDynamic); +} + +void tst_Irc::testVersion() +{ + QVERIFY(!Irc::version().isEmpty()); +} + +void tst_Irc::testCodeToString_data() +{ + QTest::addColumn("code"); + QTest::addColumn("str"); + + QTest::newRow("RPL_WELCOME") << 1 << QString("RPL_WELCOME"); + QTest::newRow("RPL_ISUPPORT") << 5 << QString("RPL_ISUPPORT"); + QTest::newRow("RPL_TOPIC") << 332 << QString("RPL_TOPIC"); + QTest::newRow("RPL_NAMREPLY") << 353 << QString("RPL_NAMREPLY"); + QTest::newRow("RPL_ENDOFNAMES") << 366 << QString("RPL_ENDOFNAMES"); + + QTest::newRow("ERR_NOSUCHNICK") << 401 << QString("ERR_NOSUCHNICK"); + QTest::newRow("ERR_NOSUCHCHANNEL") << 403 << QString("ERR_NOSUCHCHANNEL"); + QTest::newRow("ERR_NICKNAMEINUSE") << 433 << QString("ERR_NICKNAMEINUSE"); + QTest::newRow("ERR_OPERONLY") << 520 << QString("ERR_OPERONLY"); +} + +void tst_Irc::testCodeToString() +{ + QFETCH(int, code); + QFETCH(QString, str); + + QCOMPARE(Irc::codeToString(code), str); +} + +void tst_Irc::testMetaObject() +{ + Irc irc; + + QVERIFY(Irc::staticMetaObject.indexOfEnumerator("Code") != -1); + QVERIFY(Irc::staticMetaObject.indexOfEnumerator("Color") != -1); + QVERIFY(Irc::staticMetaObject.indexOfEnumerator("DataRole") != -1); + + QString ver; + QVERIFY(QMetaObject::invokeMethod(&irc, "version", Q_RETURN_ARG(QString, ver))); + QCOMPARE(ver, Irc::version()); + + QString str; + QVERIFY(QMetaObject::invokeMethod(&irc, "codeToString", Q_RETURN_ARG(QString, str), Q_ARG(int, Irc::RPL_ISUPPORT))); + QCOMPARE(str, Irc::codeToString(Irc::RPL_ISUPPORT)); +} + +void tst_Irc::testPrefix_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("prefix"); + QTest::addColumn("expectedNick"); + QTest::addColumn("expectedIdent"); + QTest::addColumn("expectedHost"); + + QTest::newRow("null") << false << QString() << QString() << QString() << QString(); + QTest::newRow("empty") << false << QString("") << QString("") << QString("") << QString(""); + QTest::newRow("trimmed") << true << QString(" n!u@h ") << QString("n") << QString("u") << QString("h"); + QTest::newRow("n!u@h") << true << QString("n!u@h") << QString("n") << QString("u") << QString("h"); + + QTest::newRow("n@h") << true << QString("n@h") << QString("n") << QString() << QString("h"); + QTest::newRow("n!u") << true << QString("n!u") << QString("n") << QString("u") << QString(); + QTest::newRow("!u@h") << false << QString("!u@h") << QString() << QString() << QString(); + QTest::newRow("n!@h") << false << QString("n!@h") << QString() << QString() << QString(); + QTest::newRow("n!u@") << false << QString("n!u@") << QString() << QString() << QString(); + + QTest::newRow("n !u@h") << false << QString("n !u@h") << QString() << QString() << QString(); + QTest::newRow("n! u@h") << false << QString("n! u@h") << QString() << QString() << QString(); + QTest::newRow("n!u @h") << false << QString("n!u @h") << QString() << QString() << QString(); + QTest::newRow("n!u@ h") << false << QString("n!u@ h") << QString() << QString() << QString(); + QTest::newRow("n ! u @ h") << false << QString("n ! u @ h") << QString() << QString() << QString(); +} + +void tst_Irc::testPrefix() +{ + QFETCH(bool, valid); + QFETCH(QString, prefix); + QFETCH(QString, expectedNick); + QFETCH(QString, expectedIdent); + QFETCH(QString, expectedHost); + + QString actualNick = Irc::nickFromPrefix(prefix); + QString actualIdent = Irc::identFromPrefix(prefix); + QString actualHost = Irc::hostFromPrefix(prefix); + + Q_UNUSED(valid); + QCOMPARE(expectedNick, actualNick); + QCOMPARE(expectedIdent, actualIdent); + QCOMPARE(expectedHost, actualHost); +} + +void tst_Irc::testDebug() +{ + QString str; + QDebug dbg(&str); + + dbg << Irc::RPL_AWAY; + QCOMPARE(str.trimmed(), QString::fromLatin1("RPL_AWAY")); + str.clear(); + + dbg << Irc::NameRole; + QCOMPARE(str.trimmed(), QString::fromLatin1("NameRole")); + str.clear(); + + dbg << Irc::Brown; + QCOMPARE(str.trimmed(), QString::fromLatin1("Brown")); + str.clear(); + + dbg << Irc::SortByActivity; + QCOMPARE(str.trimmed(), QString::fromLatin1("SortByActivity")); + str.clear(); +} + +QTEST_MAIN(tst_Irc) + +#include "tst_irc.moc" diff --git a/src/libcommuni/tests/auto/ircbuffer/ircbuffer.pro b/src/libcommuni/tests/auto/ircbuffer/ircbuffer.pro new file mode 100644 index 0000000..1c0080c --- /dev/null +++ b/src/libcommuni/tests/auto/ircbuffer/ircbuffer.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircbuffer.cpp + +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircbuffer/tst_ircbuffer.cpp b/src/libcommuni/tests/auto/ircbuffer/tst_ircbuffer.cpp new file mode 100644 index 0000000..1d124fb --- /dev/null +++ b/src/libcommuni/tests/auto/ircbuffer/tst_ircbuffer.cpp @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircbuffer.h" +#include "ircmessage.h" +#include +#include + +class tst_IrcBuffer : public QObject +{ + Q_OBJECT + +private slots: + void testDefaults(); + void testTitleNamePrefix(); + void testSticky(); + void testPersistent(); + void testReceive(); + void testDebug(); +}; + +void tst_IrcBuffer::testDefaults() +{ + IrcBuffer buffer; + QVERIFY(buffer.title().isEmpty()); + QVERIFY(buffer.name().isEmpty()); + QVERIFY(buffer.prefix().isEmpty()); + QVERIFY(!buffer.isChannel()); + QVERIFY(!buffer.toChannel()); + QVERIFY(!buffer.connection()); + QVERIFY(!buffer.network()); + QVERIFY(!buffer.model()); + QVERIFY(!buffer.isActive()); + QVERIFY(!buffer.isSticky()); + QVERIFY(!buffer.isPersistent()); +} + +void tst_IrcBuffer::testTitleNamePrefix() +{ + IrcBuffer buffer; + + QSignalSpy titleSpy(&buffer, SIGNAL(titleChanged(QString))); + QSignalSpy nameSpy(&buffer, SIGNAL(nameChanged(QString))); + QSignalSpy prefixSpy(&buffer, SIGNAL(prefixChanged(QString))); + QVERIFY(titleSpy.isValid()); + QVERIFY(nameSpy.isValid()); + QVERIFY(prefixSpy.isValid()); + + buffer.setName("name"); + QCOMPARE(buffer.title(), QString("name")); + QCOMPARE(buffer.name(), QString("name")); + QCOMPARE(buffer.prefix(), QString()); + QCOMPARE(titleSpy.count(), 1); + QCOMPARE(titleSpy.last().first().toString(), QString("name")); + QCOMPARE(nameSpy.count(), 1); + QCOMPARE(nameSpy.last().first().toString(), QString("name")); + QCOMPARE(prefixSpy.count(), 0); + + buffer.setPrefix("prefix"); + QCOMPARE(buffer.title(), QString("prefixname")); + QCOMPARE(buffer.name(), QString("name")); + QCOMPARE(buffer.prefix(), QString("prefix")); + QCOMPARE(titleSpy.count(), 2); + QCOMPARE(titleSpy.last().first().toString(), QString("prefixname")); + QCOMPARE(nameSpy.count(), 1); + QCOMPARE(prefixSpy.count(), 1); + QCOMPARE(prefixSpy.last().first().toString(), QString("prefix")); +} + +void tst_IrcBuffer::testSticky() +{ + IrcBuffer buffer; + QVERIFY(!buffer.isSticky()); + + QSignalSpy spy(&buffer, SIGNAL(stickyChanged(bool))); + QVERIFY(spy.isValid()); + + buffer.setSticky(true); + QVERIFY(buffer.isSticky()); + QCOMPARE(spy.count(), 1); + QVERIFY(spy.last().last().toBool()); + + buffer.setSticky(false); + QVERIFY(!buffer.isSticky()); + QCOMPARE(spy.count(), 2); + QVERIFY(!spy.last().last().toBool()); +} + +void tst_IrcBuffer::testPersistent() +{ + IrcBuffer buffer; + QVERIFY(!buffer.isPersistent()); + + QSignalSpy spy(&buffer, SIGNAL(persistentChanged(bool))); + QVERIFY(spy.isValid()); + + buffer.setPersistent(true); + QVERIFY(buffer.isPersistent()); + QCOMPARE(spy.count(), 1); + QVERIFY(spy.last().last().toBool()); + + buffer.setPersistent(false); + QVERIFY(!buffer.isPersistent()); + QCOMPARE(spy.count(), 2); + QVERIFY(!spy.last().last().toBool()); +} + +void tst_IrcBuffer::testReceive() +{ + Irc::registerMetaTypes(); + + IrcBuffer buffer; + + QSignalSpy spy(&buffer, SIGNAL(messageReceived(IrcMessage*))); + QVERIFY(spy.isValid()); + + buffer.receiveMessage(0); + QCOMPARE(spy.count(), 0); + + IrcMessage msg(0); + buffer.receiveMessage(&msg); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.last().at(0).value(), &msg); +} + +void tst_IrcBuffer::testDebug() +{ + QString str; + QDebug dbg(&str); + + dbg << static_cast(0); + QCOMPARE(str.trimmed(), QString::fromLatin1("IrcBuffer(0x0)")); + str.clear(); + + IrcBuffer buffer; + dbg << &buffer; + QVERIFY(QRegExp("IrcBuffer\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); + str.clear(); + + buffer.setObjectName("obj"); + dbg << &buffer; + QVERIFY(QRegExp("IrcBuffer\\(0x[0-9A-Fa-f]+, name=obj\\) ").exactMatch(str)); + str.clear(); + + buffer.setName("buf"); + dbg << &buffer; + QVERIFY(QRegExp("IrcBuffer\\(0x[0-9A-Fa-f]+, name=obj, title=buf\\) ").exactMatch(str)); + str.clear(); +} + +QTEST_MAIN(tst_IrcBuffer) + +#include "tst_ircbuffer.moc" diff --git a/src/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro b/src/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro new file mode 100644 index 0000000..16cf4c9 --- /dev/null +++ b/src/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro @@ -0,0 +1,11 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircbuffermodel.cpp + +# FakeQmlBufferModel::createXxx() +*g++*|*clang*:QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual + +include(../shared/shared.pri) +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp b/src/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp new file mode 100644 index 0000000..60ec958 --- /dev/null +++ b/src/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp @@ -0,0 +1,1461 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircbuffermodel.h" +#include "ircconnection.h" +#include "ircchannel.h" +#include "ircbuffer.h" +#include +#include "tst_ircclientserver.h" +#include "tst_ircdata.h" + +class tst_IrcBufferModel : public tst_IrcClientServer +{ + Q_OBJECT + +public: + tst_IrcBufferModel(); + +private slots: + void testDefaults(); + void testBufferInit(); + void testAddRemove(); + void testSorting(); + void testClear(); + void testPersistent(); + void testPrototypes(); + void testChanges(); + void testActive(); + void testRoles(); + void testAIM(); + void testQML(); + void testWarnings(); +}; + +Q_DECLARE_METATYPE(QModelIndex) +tst_IrcBufferModel::tst_IrcBufferModel() +{ + Irc::registerMetaTypes(); + qRegisterMetaType(); + qRegisterMetaType("IrcBuffer*"); + qRegisterMetaType("IrcChannel*"); + qRegisterMetaType("IrcConnection*"); + qRegisterMetaType >("QList"); + qRegisterMetaType >("QList"); +} + +void tst_IrcBufferModel::testDefaults() +{ + IrcBufferModel model; + QCOMPARE(model.count(), 0); + QVERIFY(model.isEmpty()); + QCOMPARE(model.sortOrder(), Qt::AscendingOrder); + QCOMPARE(model.sortMethod(), Irc::SortByHand); + QVERIFY(model.channels().isEmpty()); + QCOMPARE(model.displayRole(), Irc::TitleRole); + QVERIFY(!model.isPersistent()); + QVERIFY(model.buffers().isEmpty()); + QVERIFY(!model.connection()); + QVERIFY(!model.network()); + QVERIFY(model.bufferPrototype()); + QVERIFY(model.channelPrototype()); +} + +void tst_IrcBufferModel::testBufferInit() +{ + IrcBufferModel model(connection); + model.setSortMethod(Irc::SortByTitle); + IrcBuffer* buffer1 = new IrcBuffer(&model); + buffer1->setName("1"); + model.add(buffer1); + IrcBuffer* buffer2 = new IrcBuffer(&model); + buffer2->setName("2"); + model.add(buffer2); +} + +void tst_IrcBufferModel::testAddRemove() +{ + IrcBufferModel model; + + QSignalSpy countSpy(&model, SIGNAL(countChanged(int))); + QSignalSpy emptySpy(&model, SIGNAL(emptyChanged(bool))); + QSignalSpy addedSpy(&model, SIGNAL(added(IrcBuffer*))); + QSignalSpy removedSpy(&model, SIGNAL(removed(IrcBuffer*))); + QSignalSpy aboutToBeAddedSpy(&model, SIGNAL(aboutToBeAdded(IrcBuffer*))); + QSignalSpy aboutToBeRemovedSpy(&model, SIGNAL(aboutToBeRemoved(IrcBuffer*))); + QSignalSpy buffersSpy(&model, SIGNAL(buffersChanged(QList))); + QSignalSpy channelsSpy(&model, SIGNAL(channelsChanged(QStringList))); + QVERIFY(countSpy.isValid()); + QVERIFY(emptySpy.isValid()); + QVERIFY(addedSpy.isValid()); + QVERIFY(removedSpy.isValid()); + QVERIFY(aboutToBeAddedSpy.isValid()); + QVERIFY(aboutToBeRemovedSpy.isValid()); + QVERIFY(buffersSpy.isValid()); + QVERIFY(channelsSpy.isValid()); + + // IrcBuffer* IrcBufferModel::add(const QString& title) + IrcBuffer* first = model.add("first"); + QCOMPARE(model.count(), 1); + QVERIFY(!model.isEmpty()); + QCOMPARE(model.get(0), first); + QCOMPARE(model.find("first"), first); + QCOMPARE(model.buffers(), QList() << first); + QVERIFY(model.contains("first")); + QCOMPARE(model.indexOf(first), 0); + QVERIFY(model.channels().isEmpty()); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(countSpy.last().last().toInt(), 1); + QCOMPARE(emptySpy.count(), 1); + QCOMPARE(emptySpy.last().last().toBool(), false); + QCOMPARE(aboutToBeAddedSpy.count(), 1); + QCOMPARE(aboutToBeAddedSpy.last().last().value(), first); + QCOMPARE(addedSpy.count(), 1); + QCOMPARE(addedSpy.last().last().value(), first); + QCOMPARE(buffersSpy.count(), 1); + QCOMPARE(buffersSpy.last().last().value >(), QList() << first); + QCOMPARE(channelsSpy.count(), 0); + + QModelIndex firstIdx = model.index(first); + QVERIFY(firstIdx.isValid()); + QCOMPARE(firstIdx.data(Irc::NameRole).toString(), QString("first")); + QCOMPARE(firstIdx.data(Irc::TitleRole).toString(), QString("first")); + QCOMPARE(firstIdx.data(Irc::PrefixRole).toString(), QString()); + QCOMPARE(firstIdx.data(Irc::BufferRole).value(), first); + QVERIFY(!firstIdx.data(Irc::ChannelRole).value()); + + // void IrcBufferModel::add(IrcBuffer* buffer) + IrcBuffer* second = new IrcBuffer(&model); + second->setName("second"); + model.add(second); + QCOMPARE(model.count(), 2); + QVERIFY(!model.isEmpty()); + QCOMPARE(model.get(1), second); + QCOMPARE(model.find("second"), second); + QCOMPARE(model.buffers(), QList() << first << second); + QVERIFY(model.contains("second")); + QCOMPARE(model.indexOf(second), 1); + QVERIFY(model.channels().isEmpty()); + + QCOMPARE(countSpy.count(), 2); + QCOMPARE(countSpy.last().last().toInt(), 2); + QCOMPARE(emptySpy.count(), 1); + QCOMPARE(aboutToBeAddedSpy.count(), 2); + QCOMPARE(aboutToBeAddedSpy.last().last().value(), second); + QCOMPARE(addedSpy.count(), 2); + QCOMPARE(addedSpy.last().last().value(), second); + QCOMPARE(buffersSpy.count(), 2); + QCOMPARE(buffersSpy.last().last().value >(), QList() << first << second); + QCOMPARE(channelsSpy.count(), 0); + + QModelIndex secondIdx = model.index(second); + QVERIFY(secondIdx.isValid()); + QCOMPARE(secondIdx.data(Irc::NameRole).toString(), QString("second")); + QCOMPARE(secondIdx.data(Irc::TitleRole).toString(), QString("second")); + QCOMPARE(secondIdx.data(Irc::PrefixRole).toString(), QString()); + QCOMPARE(secondIdx.data(Irc::BufferRole).value(), second); + QVERIFY(!secondIdx.data(Irc::ChannelRole).value()); + + // void IrcBufferModel::remove(IrcBuffer* buffer) + model.remove(second); + QCOMPARE(model.count(), 1); + QVERIFY(!model.isEmpty()); + QVERIFY(!model.find("second")); + QCOMPARE(model.buffers(), QList() << first); + QVERIFY(!model.contains("second")); + QVERIFY(model.channels().isEmpty()); + + QCOMPARE(countSpy.count(), 3); + QCOMPARE(countSpy.last().last().toInt(), 1); + QCOMPARE(emptySpy.count(), 1); + QCOMPARE(aboutToBeRemovedSpy.count(), 1); + QCOMPARE(removedSpy.count(), 1); + QCOMPARE(buffersSpy.count(), 3); + QCOMPARE(buffersSpy.last().last().value >(), QList() << first); + QCOMPARE(channelsSpy.count(), 0); + + // void IrcBufferModel::remove(const QString& title) + model.remove("first"); + QCOMPARE(model.count(), 0); + QVERIFY(model.isEmpty()); + QVERIFY(!model.find("first")); + QVERIFY(model.buffers().isEmpty()); + QVERIFY(!model.contains("first")); + QVERIFY(model.channels().isEmpty()); + + QCOMPARE(countSpy.count(), 4); + QCOMPARE(countSpy.last().last().toInt(), 0); + QCOMPARE(emptySpy.count(), 2); + QCOMPARE(emptySpy.last().last().toBool(), true); + QCOMPARE(aboutToBeRemovedSpy.count(), 2); + QCOMPARE(removedSpy.count(), 2); + QCOMPARE(buffersSpy.count(), 4); + QCOMPARE(buffersSpy.last().last().value >(), QList()); + QCOMPARE(channelsSpy.count(), 0); +} + +void tst_IrcBufferModel::testSorting() +{ + IrcBufferModel staticModel(connection); + IrcBufferModel dynamicModel(connection); + + connection->open(); + waitForOpened(); + waitForWritten(tst_IrcData::welcome()); + + IrcBuffer* b = staticModel.add("b"); + IrcBuffer* c = staticModel.add("#c"); + IrcBuffer* a = staticModel.add("#a"); + + QList buffers = QList() << b << c << a; + QCOMPARE(staticModel.buffers(), buffers); + + // IGNORE INVALID COLUMNS + staticModel.sort(-1, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + staticModel.sort(1, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY NAME - ASCENDING + buffers = QList() << a << b << c; + staticModel.setSortMethod(Irc::SortByName); + staticModel.sort(0, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY NAME - DESCENDING + buffers = QList() << c << b << a; + staticModel.setSortMethod(Irc::SortByName); + staticModel.sort(0, Qt::DescendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY TITLE - ASCENDING + buffers = QList() << a << c << b; + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY TITLE - DESCENDING + buffers = QList() << b << c << a; + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::DescendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY TITLE - ASCENDING & STICKY + c->setSticky(true); + buffers = QList() << c << a << b; + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY TITLE - ASCENDING & 2 STICKIES + b->setSticky(true); + buffers = QList() << c << b << a; + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + b = dynamicModel.add("b"); + c = dynamicModel.add("#c"); + a = dynamicModel.add("#a"); + + // DYNAMIC - BY NAME - ASCENDING + buffers = QList() << a << b << c; + dynamicModel.setSortMethod(Irc::SortByName); + QCOMPARE(dynamicModel.buffers(), buffers); + + // DYNAMIC - BY TITLE - ASCENDING + buffers = QList() << a << c << b; + dynamicModel.setSortMethod(Irc::SortByTitle); + QCOMPARE(dynamicModel.buffers(), buffers); + + dynamicModel.setSortOrder(Qt::DescendingOrder); + + // DYNAMIC - BY NAME - DESCENDING + buffers = QList() << c << b << a; + dynamicModel.setSortMethod(Irc::SortByName); + QCOMPARE(dynamicModel.buffers(), buffers); + + // DYNAMIC - BY TITLE - DESCENDING + buffers = QList() << b << c << a; + dynamicModel.setSortMethod(Irc::SortByTitle); + QCOMPARE(dynamicModel.buffers(), buffers); + + // DO NOTHING + dynamicModel.sort(Irc::SortByHand); + QCOMPARE(dynamicModel.buffers(), buffers); +} + +void tst_IrcBufferModel::testClear() +{ + IrcBufferModel model(connection); + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QPointer a = model.add("#a"); + QPointer b = model.add("#b"); + QPointer c = model.add("c"); + QPointer d = model.add("d"); + + QSignalSpy countSpy(&model, SIGNAL(countChanged(int))); + QSignalSpy buffersSpy(&model, SIGNAL(buffersChanged(QList))); + QSignalSpy channelsSpy(&model, SIGNAL(channelsChanged(QStringList))); + QSignalSpy modelAboutToBeResetSpy(&model, SIGNAL(modelAboutToBeReset())); + QSignalSpy modelResetSpy(&model, SIGNAL(modelReset())); + + QVERIFY(countSpy.isValid()); + QVERIFY(buffersSpy.isValid()); + QVERIFY(channelsSpy.isValid()); + QVERIFY(modelAboutToBeResetSpy.isValid()); + QVERIFY(modelResetSpy.isValid()); + + b->setPersistent(true); + d->setPersistent(true); + + // #a, #b*, c, d* + model.clear(); + + QCOMPARE(model.count(), 2); + QCOMPARE(model.buffers(), QList() << b << d); + QCOMPARE(model.channels(), QStringList() << "#b"); + + QCOMPARE(model.get(0), b.data()); + QCOMPARE(model.get(1), d.data()); + QVERIFY(!model.get(2)); + QVERIFY(!model.find("#a")); + QVERIFY(model.find("#b")); + QVERIFY(!model.find("c")); + QVERIFY(model.find("d")); + QVERIFY(!model.contains("#a")); + QVERIFY(model.contains("#b")); + QVERIFY(!model.contains("c")); + QVERIFY(model.contains("d")); + + QVERIFY(!a); + QVERIFY(b); + QVERIFY(!c); + QVERIFY(d); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(countSpy.last().at(0).toInt(), 2); + + QCOMPARE(buffersSpy.count(), 1); + QCOMPARE(buffersSpy.last().at(0).value >(), QList() << b << d); + + QCOMPARE(channelsSpy.count(), 1); + QCOMPARE(channelsSpy.last().at(0).toStringList(), QStringList() << "#b"); + + QCOMPARE(modelAboutToBeResetSpy.count(), 1); + QCOMPARE(modelResetSpy.count(), 1); + + b->setPersistent(false); + + countSpy.clear(); + buffersSpy.clear(); + channelsSpy.clear(); + modelAboutToBeResetSpy.clear(); + modelResetSpy.clear(); + + // #b, d* + model.clear(); + + QCOMPARE(model.count(), 1); + QCOMPARE(model.buffers(), QList() << d); + QCOMPARE(model.channels(), QStringList()); + + QCOMPARE(model.get(0), d.data()); + QVERIFY(!model.get(1)); + QVERIFY(!model.find("#b")); + QVERIFY(model.find("d")); + QVERIFY(!model.contains("#b")); + QVERIFY(model.contains("d")); + + QVERIFY(!b); + QVERIFY(d); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(countSpy.last().at(0).toInt(), 1); + + QCOMPARE(buffersSpy.count(), 1); + QCOMPARE(buffersSpy.last().at(0).value >(), QList() << d); + + QCOMPARE(channelsSpy.count(), 1); + QCOMPARE(channelsSpy.last().at(0).toStringList(), QStringList()); + + QCOMPARE(modelAboutToBeResetSpy.count(), 1); + QCOMPARE(modelResetSpy.count(), 1); + + d->setPersistent(false); + + countSpy.clear(); + buffersSpy.clear(); + channelsSpy.clear(); + modelAboutToBeResetSpy.clear(); + modelResetSpy.clear(); + + // d + model.clear(); + + QCOMPARE(model.count(), 0); + QCOMPARE(model.buffers(), QList()); + QCOMPARE(model.channels(), QStringList()); + + QVERIFY(!model.get(0)); + QVERIFY(!model.find("d")); + QVERIFY(!model.contains("d")); + + QVERIFY(!d); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(countSpy.last().at(0).toInt(), 0); + + QCOMPARE(buffersSpy.count(), 1); + QCOMPARE(buffersSpy.last().at(0).value >(), QList()); + + QCOMPARE(channelsSpy.count(), 0); + + QCOMPARE(modelAboutToBeResetSpy.count(), 1); + QCOMPARE(modelResetSpy.count(), 1); + + countSpy.clear(); + buffersSpy.clear(); + channelsSpy.clear(); + modelAboutToBeResetSpy.clear(); + modelResetSpy.clear(); + + // + model.clear(); + + QCOMPARE(countSpy.count(), 0); + QCOMPARE(buffersSpy.count(), 0); + QCOMPARE(channelsSpy.count(), 0); + QCOMPARE(modelAboutToBeResetSpy.count(), 0); + QCOMPARE(modelResetSpy.count(), 0); + + QPointer e = model.add("e"); + QPointer f = model.add("f"); + + e->setPersistent(true); + f->setPersistent(true); + + countSpy.clear(); + buffersSpy.clear(); + channelsSpy.clear(); + modelAboutToBeResetSpy.clear(); + modelResetSpy.clear(); + + // e*, f* + model.clear(); + + QVERIFY(e); + QVERIFY(f); + + QCOMPARE(countSpy.count(), 0); + QCOMPARE(buffersSpy.count(), 0); + QCOMPARE(channelsSpy.count(), 0); + QCOMPARE(modelAboutToBeResetSpy.count(), 0); + QCOMPARE(modelResetSpy.count(), 0); + + qDeleteAll(model.buffers()); + + QCOMPARE(model.count(), 0); + QCOMPARE(model.buffers(), QList()); + QCOMPARE(model.channels(), QStringList()); + + QVERIFY(!model.get(0)); + QVERIFY(!model.find("e")); + QVERIFY(!model.find("f")); + QVERIFY(!model.contains("e")); + QVERIFY(!model.contains("f")); + + QVERIFY(!e); + QVERIFY(!f); + + QCOMPARE(countSpy.count(), 2); + QCOMPARE(countSpy.at(0).at(0).toInt(), 1); + QCOMPARE(countSpy.at(1).at(0).toInt(), 0); + + QCOMPARE(buffersSpy.count(), 2); + QCOMPARE(buffersSpy.at(0).at(0).value >().count(), 1); + QCOMPARE(buffersSpy.at(1).at(0).value >(), QList()); + + QCOMPARE(channelsSpy.count(), 0); + + QCOMPARE(modelAboutToBeResetSpy.count(), 0); + QCOMPARE(modelResetSpy.count(), 0); +} + +void tst_IrcBufferModel::testPersistent() +{ + IrcBufferModel model(connection); + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + QCOMPARE(model.count(), 1); + + QPointer channel = model.get(0)->toChannel(); + QVERIFY(channel); + + QVERIFY(!model.isPersistent()); + QVERIFY(!channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(model.isEmpty()); + QVERIFY(channel); // deleteLater()'d + QCoreApplication::sendPostedEvents(channel, QEvent::DeferredDelete); + QVERIFY(!channel); // deleteLater()'d + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + QCOMPARE(model.count(), 1); + channel = model.get(0)->toChannel(); + QVERIFY(channel); + + model.setPersistent(true); + QVERIFY(model.isPersistent()); + QVERIFY(!channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(channel); + QCOMPARE(model.count(), 1); + + channel->setPersistent(true); + QVERIFY(model.isPersistent()); + QVERIFY(channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(channel); + QCOMPARE(model.count(), 1); + + model.setPersistent(false); + QVERIFY(!model.isPersistent()); + QVERIFY(channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(channel); + QCOMPARE(model.count(), 1); + + channel->setPersistent(false); + QVERIFY(!model.isPersistent()); + QVERIFY(!channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(model.isEmpty()); + QVERIFY(channel); // deleteLater()'d + QCoreApplication::sendPostedEvents(channel, QEvent::DeferredDelete); + QVERIFY(!channel); // deleteLater()'d +} + +void tst_IrcBufferModel::testPrototypes() +{ + IrcBufferModel model; + + QSignalSpy bufferProtoSpy(&model, SIGNAL(bufferPrototypeChanged(IrcBuffer*))); + QSignalSpy channelProtoSpy(&model, SIGNAL(channelPrototypeChanged(IrcChannel*))); + QVERIFY(bufferProtoSpy.isValid()); + QVERIFY(channelProtoSpy.isValid()); + + model.setBufferPrototype(0); + QVERIFY(model.bufferPrototype()); + QCOMPARE(bufferProtoSpy.count(), 1); + + model.setChannelPrototype(0); + QVERIFY(model.channelPrototype()); + QCOMPARE(channelProtoSpy.count(), 1); + + IrcBuffer* bufferProto = new IrcBuffer(&model); + model.setBufferPrototype(bufferProto); + QCOMPARE(model.bufferPrototype(), bufferProto); + QCOMPARE(bufferProtoSpy.count(), 2); + + IrcChannel* channelProto = new IrcChannel(&model); + model.setChannelPrototype(channelProto); + QCOMPARE(model.channelPrototype(), channelProto); + QCOMPARE(channelProtoSpy.count(), 2); +} + +void tst_IrcBufferModel::testChanges() +{ + IrcBufferModel bufferModel; + + // IrcBufferModel signals + QSignalSpy countChangedSpy(&bufferModel, SIGNAL(countChanged(int))); + QSignalSpy addedSpy(&bufferModel, SIGNAL(added(IrcBuffer*))); + QSignalSpy removedSpy(&bufferModel, SIGNAL(removed(IrcBuffer*))); + QSignalSpy aboutToBeAddedSpy(&bufferModel, SIGNAL(aboutToBeAdded(IrcBuffer*))); + QSignalSpy aboutToBeRemovedSpy(&bufferModel, SIGNAL(aboutToBeRemoved(IrcBuffer*))); + QSignalSpy buffersChangedSpy(&bufferModel, SIGNAL(buffersChanged(QList))); + QSignalSpy channelsChangedSpy(&bufferModel, SIGNAL(channelsChanged(QStringList))); + + QVERIFY(countChangedSpy.isValid()); + QVERIFY(addedSpy.isValid()); + QVERIFY(removedSpy.isValid()); + QVERIFY(aboutToBeAddedSpy.isValid()); + QVERIFY(aboutToBeRemovedSpy.isValid()); + QVERIFY(buffersChangedSpy.isValid()); + QVERIFY(channelsChangedSpy.isValid()); + + int countChangedCount = 0; + int aboutToBeAddedCount = 0, addedCount = 0; + int aboutToBeRemovedCount = 0, removedCount = 0; + int buffersChangedCount = 0; + int channelsChangedCount = 0; + + QSignalSpy connectionChangedSpy(&bufferModel, SIGNAL(connectionChanged(IrcConnection*))); + QSignalSpy networkChangedSpy(&bufferModel, SIGNAL(networkChanged(IrcNetwork*))); + QSignalSpy messageIgnoredSpy(&bufferModel, SIGNAL(messageIgnored(IrcMessage*))); + + QVERIFY(connectionChangedSpy.isValid()); + QVERIFY(networkChangedSpy.isValid()); + QVERIFY(messageIgnoredSpy.isValid()); + + int connectionChangedCount = 0; + int networkChangedCount = 0; + int messageIgnoredCount = 0; + + // relevant QAbstractItemModel signals + QSignalSpy dataChangedSpy(&bufferModel, SIGNAL(dataChanged(QModelIndex,QModelIndex))); + QSignalSpy layoutAboutToBeChangedSpy(&bufferModel, SIGNAL(layoutAboutToBeChanged())); + QSignalSpy layoutChangedSpy(&bufferModel, SIGNAL(layoutChanged())); + QSignalSpy rowsAboutToBeInsertedSpy(&bufferModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); + QSignalSpy rowsInsertedSpy(&bufferModel, SIGNAL(rowsInserted(QModelIndex,int,int))); + QSignalSpy rowsAboutToBeRemovedSpy(&bufferModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); + QSignalSpy rowsRemovedSpy(&bufferModel, SIGNAL(rowsRemoved(QModelIndex,int,int))); + + QVERIFY(dataChangedSpy.isValid()); + QVERIFY(layoutAboutToBeChangedSpy.isValid()); + QVERIFY(layoutChangedSpy.isValid()); + QVERIFY(rowsAboutToBeInsertedSpy.isValid()); + QVERIFY(rowsInsertedSpy.isValid()); + QVERIFY(rowsAboutToBeRemovedSpy.isValid()); + QVERIFY(rowsRemovedSpy.isValid()); + + int dataChangedCount = 0; + int layoutAboutToBeChangedCount = 0, layoutChangedCount = 0; + int rowsAboutToBeInsertedCount = 0, rowsInsertedCount = 0; + int rowsAboutToBeRemovedCount = 0, rowsRemovedCount = 0; + + bufferModel.setConnection(connection); + QCOMPARE(connectionChangedSpy.count(), ++connectionChangedCount); + QCOMPARE(networkChangedSpy.count(), ++networkChangedCount); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + messageIgnoredCount = tst_IrcData::welcome().split('\n').count(); // N lines + a combined motd msg + + QCOMPARE(bufferModel.count(), 0); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QCOMPARE(bufferModel.count(), 1); + + QPointer communi = bufferModel.get(0)->toChannel(); + QVERIFY(communi); + QCOMPARE(communi->title(), QString("#communi")); + QCOMPARE(communi->name(), QString("communi")); + QCOMPARE(communi->prefix(), QString("#")); + + int previousIndex = -1; + + QList buffers = QList() << communi; + QStringList channels = QStringList() << "#communi"; + + int nextIndex = buffers.indexOf(communi); + + QCOMPARE(bufferModel.count(), buffers.count()); + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + QCOMPARE(bufferModel.channels(), channels); + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), communi.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), communi.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); + QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QVERIFY(waitForWritten(":ChanServ!ChanServ@services. NOTICE communi :fake...")); + QCOMPARE(messageIgnoredSpy.count(), ++messageIgnoredCount); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + QCOMPARE(countChangedSpy.count(), countChangedCount); + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + QCOMPARE(addedSpy.count(), addedCount); + QCOMPARE(buffersChangedSpy.count(), buffersChangedCount); + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + + QVERIFY(waitForWritten(":ChanServ!ChanServ@services. PRIVMSG communi :fake...")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QPointer ChanServ = bufferModel.get(1); + QVERIFY(ChanServ); + QCOMPARE(ChanServ->title(), QString("ChanServ")); + QCOMPARE(ChanServ->name(), QString("ChanServ")); + QCOMPARE(ChanServ->prefix(), QString()); + + previousIndex = -1; + + buffers = QList() << communi << ChanServ; + channels = QStringList() << "#communi"; + + nextIndex = buffers.indexOf(ChanServ); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + QCOMPARE(bufferModel.count(), buffers.count()); + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), ChanServ.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), ChanServ.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QVERIFY(waitForWritten(":ChanServ!ChanServ@services. NOTICE communi :fake...")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + QCOMPARE(bufferModel.count(), buffers.count()); + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + QCOMPARE(addedSpy.count(), addedCount); + QCOMPARE(buffersChangedSpy.count(), buffersChangedCount); + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#freenode")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QPointer freenode = bufferModel.get(2)->toChannel(); + QVERIFY(freenode); + QCOMPARE(freenode->title(), QString("#freenode")); + QCOMPARE(freenode->name(), QString("freenode")); + QCOMPARE(freenode->prefix(), QString("#")); + + previousIndex = -1; + + buffers = QList() << communi << ChanServ << freenode; + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = buffers.indexOf(freenode); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), freenode.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), freenode.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); + QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + bufferModel.setSortMethod(Irc::SortByTitle); + QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); + + previousIndex = -1; + + // Irc::SortByTitle + buffers = QList() << communi << freenode << ChanServ; + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = -1; + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + bufferModel.setSortMethod(Irc::SortByName); + QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); + + bufferModel.setSortOrder(Qt::DescendingOrder); + QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); + + previousIndex = -1; + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << freenode << communi << ChanServ; + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = -1; + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QVERIFY(waitForWritten(":qtassistant!qtassistant@hidd.en PRIVMSG communi :hola")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QPointer qtassistant = bufferModel.get(0); + QVERIFY(qtassistant); + QCOMPARE(qtassistant->title(), QString("qtassistant")); + QCOMPARE(qtassistant->name(), QString("qtassistant")); + QCOMPARE(qtassistant->prefix(), QString()); + + previousIndex = -1; + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << qtassistant << freenode << communi << ChanServ; + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = buffers.indexOf(qtassistant); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), qtassistant.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), qtassistant.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QSignalSpy titleChangedSpy(qtassistant, SIGNAL(titleChanged(QString))); + QSignalSpy nameChangedSpy(qtassistant, SIGNAL(nameChanged(QString))); + QSignalSpy prefixChangedSpy(qtassistant, SIGNAL(prefixChanged(QString))); + + QVERIFY(titleChangedSpy.isValid()); + QVERIFY(nameChangedSpy.isValid()); + QVERIFY(prefixChangedSpy.isValid()); + + int titleChangedCount = 0; + int nameChangedCount = 0; + int prefixChangedCount = 0; + + QVERIFY(waitForWritten(":qtassistant!qtassistant@hidd.en NICK assistant :hola")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QCOMPARE(qtassistant->title(), QString("assistant")); + QCOMPARE(qtassistant->name(), QString("assistant")); + QCOMPARE(qtassistant->prefix(), QString()); + + QCOMPARE(titleChangedSpy.count(), ++titleChangedCount); + QCOMPARE(nameChangedSpy.count(), ++nameChangedCount); + QCOMPARE(prefixChangedSpy.count(), prefixChangedCount); + + previousIndex = buffers.indexOf(qtassistant); + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << freenode << communi << ChanServ << qtassistant; // qtassistant=assistant + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = buffers.indexOf(qtassistant); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + + QCOMPARE(addedSpy.count(), addedCount); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + + QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); + QModelIndex topLeft = dataChangedSpy.last().at(0).value(); + QModelIndex bottomRight = dataChangedSpy.last().at(0).value(); + QVERIFY(!topLeft.parent().isValid()); + QVERIFY(topLeft.isValid()); + QVERIFY(bottomRight.isValid()); + QVERIFY(topLeft == bottomRight); + QCOMPARE(topLeft.row(), previousIndex); + QCOMPARE(topLeft.column(), 0); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QVERIFY(waitForWritten(":communi!communi@hidd.en PART #communi")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QVERIFY(communi); // deleteLater()'d + + QCOMPARE(aboutToBeRemovedSpy.count(), ++aboutToBeRemovedCount); + QCOMPARE(aboutToBeRemovedSpy.last().at(0).value(), communi.data()); + + QCOMPARE(removedSpy.count(), ++removedCount); + QCOMPARE(removedSpy.last().at(0).value(), communi.data()); + + previousIndex = buffers.indexOf(communi); + + QCoreApplication::sendPostedEvents(communi, QEvent::DeferredDelete); + QVERIFY(!communi); + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << freenode << ChanServ << qtassistant; // qtassistant=assistant + channels = QStringList() << "#freenode"; + + nextIndex = buffers.indexOf(communi); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + + QCOMPARE(addedSpy.count(), addedCount); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); + QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); + + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + + waitForWritten(":moorcock.freenode.net 324 communi #freenode +s"); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + QCOMPARE(freenode->mode(), QString("+s")); + + QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi KICK #freenode communi")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QVERIFY(freenode); // deleteLater()'d + + QCOMPARE(aboutToBeRemovedSpy.count(), ++aboutToBeRemovedCount); + QCOMPARE(aboutToBeRemovedSpy.last().at(0).value(), freenode.data()); + + QCOMPARE(removedSpy.count(), ++removedCount); + QCOMPARE(removedSpy.last().at(0).value(), freenode.data()); + + previousIndex = buffers.indexOf(freenode); + + QCoreApplication::sendPostedEvents(freenode, QEvent::DeferredDelete); + QVERIFY(!freenode); + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << ChanServ << qtassistant; // qtassistant=assistant + channels = QStringList(); + + nextIndex = buffers.indexOf(freenode); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + + QCOMPARE(addedSpy.count(), addedCount); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); + QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); + + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en PRIVMSG jpnurmi :echo")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QPointer jpnurmi = bufferModel.get(0); + QVERIFY(jpnurmi); + QCOMPARE(jpnurmi->title(), QString("jpnurmi")); + QCOMPARE(jpnurmi->name(), QString("jpnurmi")); + QCOMPARE(jpnurmi->prefix(), QString()); + + previousIndex = -1; + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << jpnurmi << ChanServ << qtassistant; // qtassistant=assistant + channels = QStringList(); + + nextIndex = buffers.indexOf(jpnurmi); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), jpnurmi.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), jpnurmi.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QVERIFY(waitForWritten(":communi!communi@hidd.en QUIT :bye")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + serverSocket->close(); + QVERIFY(clientSocket->waitForDisconnected(100)); + QVERIFY(!connection->isConnected()); + QVERIFY(!connection->isActive()); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + QVERIFY(!buffers.at(i)->isActive()); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + QCOMPARE(addedSpy.count(), addedCount); + QCOMPARE(buffersChangedSpy.count(), buffersChangedCount); + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); +} + +void tst_IrcBufferModel::testActive() +{ + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + + IrcChannel* channel = bufferModel.get(0)->toChannel(); + IrcBuffer* query = bufferModel.add("qtassistant"); + + channel->setPersistent(true); + query->setPersistent(true); + + QSignalSpy channelActiveSpy(channel, SIGNAL(activeChanged(bool))); + QSignalSpy queryActiveSpy(query, SIGNAL(activeChanged(bool))); + QVERIFY(channelActiveSpy.isValid()); + QVERIFY(queryActiveSpy.isValid()); + int channelActiveCount = 0; + int queryActiveCount = 0; + + QVERIFY(channel->isActive()); + QVERIFY(query->isActive()); + + connection->close(); + + QVERIFY(!channel->isActive()); + QVERIFY(!query->isActive()); + + QCOMPARE(channelActiveSpy.count(), ++channelActiveCount); + QCOMPARE(queryActiveSpy.count(), ++queryActiveCount); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QVERIFY(!channel->isActive()); + QVERIFY(query->isActive()); + + QCOMPARE(channelActiveSpy.count(), channelActiveCount); + QCOMPARE(queryActiveSpy.count(), ++queryActiveCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + + QVERIFY(channel->isActive()); + QVERIFY(query->isActive()); + + QCOMPARE(channelActiveSpy.count(), ++channelActiveCount); + QCOMPARE(queryActiveSpy.count(), queryActiveCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en PART #communi")); + + QVERIFY(!channel->isActive()); + QVERIFY(query->isActive()); + + QCOMPARE(channelActiveSpy.count(), ++channelActiveCount); + QCOMPARE(queryActiveSpy.count(), queryActiveCount); + + connection->close(); + + QVERIFY(!channel->isActive()); + QVERIFY(!query->isActive()); + + QCOMPARE(channelActiveSpy.count(), channelActiveCount); + QCOMPARE(queryActiveSpy.count(), ++queryActiveCount); +} + +void tst_IrcBufferModel::testRoles() +{ + IrcBufferModel model; + QHash roles = model.roleNames(); + QCOMPARE(roles.take(Qt::DisplayRole), QByteArray("display")); + QCOMPARE(roles.take(Irc::BufferRole), QByteArray("buffer")); + QCOMPARE(roles.take(Irc::ChannelRole), QByteArray("channel")); + QCOMPARE(roles.take(Irc::NameRole), QByteArray("name")); + QCOMPARE(roles.take(Irc::PrefixRole), QByteArray("prefix")); + QCOMPARE(roles.take(Irc::TitleRole), QByteArray("title")); + QVERIFY(roles.isEmpty()); +} + +void tst_IrcBufferModel::testAIM() +{ + IrcBufferModel bufferModel(connection); + IrcBuffer* a = bufferModel.add("#a"); + IrcBuffer* b = bufferModel.add("#b"); + IrcBuffer* c = bufferModel.add("c"); + IrcBuffer* o = 0; + + QAbstractItemModel* aim = &bufferModel; + QModelIndex ai = aim->index(0, 0); + QModelIndex bi = aim->index(1, 0); + QModelIndex ci = aim->index(2, 0); + QModelIndex oi = aim->index(100, 100); + + QVERIFY(ai.isValid()); + QVERIFY(bi.isValid()); + QVERIFY(ci.isValid()); + QVERIFY(!oi.isValid()); + + QCOMPARE(aim->rowCount(QModelIndex()), 3); + QCOMPARE(aim->rowCount(ai), 0); + + QCOMPARE(aim->columnCount(QModelIndex()), 1); + QCOMPARE(aim->columnCount(ai), 0); + + QCOMPARE(bufferModel.index(a), ai); + QCOMPARE(bufferModel.index(b), bi); + QCOMPARE(bufferModel.index(c), ci); + QVERIFY(!bufferModel.index(o).isValid()); + + QCOMPARE(bufferModel.buffer(ai), a); + QCOMPARE(bufferModel.buffer(bi), b); + QCOMPARE(bufferModel.buffer(ci), c); + QVERIFY(!bufferModel.buffer(oi)); + + bufferModel.setDisplayRole(Irc::TitleRole); + QCOMPARE(aim->data(ai, Qt::DisplayRole).toString(), a->title()); + QCOMPARE(aim->data(bi, Qt::DisplayRole).toString(), b->title()); + QCOMPARE(aim->data(ci, Qt::DisplayRole).toString(), c->title()); + QVERIFY(aim->data(oi, Qt::DisplayRole).toString().isEmpty()); + + bufferModel.setDisplayRole(Irc::BufferRole); + QCOMPARE(aim->data(ai, Qt::DisplayRole).value(), a); + QCOMPARE(aim->data(bi, Qt::DisplayRole).value(), b); + QCOMPARE(aim->data(ci, Qt::DisplayRole).value(), c); + QVERIFY(!aim->data(oi, Qt::DisplayRole).value()); + + QCOMPARE(aim->data(ai, Irc::BufferRole).value(), a); + QCOMPARE(aim->data(bi, Irc::BufferRole).value(), b); + QCOMPARE(aim->data(ci, Irc::BufferRole).value(), c); + QVERIFY(!aim->data(oi, Irc::BufferRole).value()); + + QCOMPARE(aim->data(ai, Irc::ChannelRole).value(), a->toChannel()); + QCOMPARE(aim->data(bi, Irc::ChannelRole).value(), b->toChannel()); + QCOMPARE(aim->data(ci, Irc::ChannelRole).value(), c->toChannel()); + QVERIFY(!aim->data(oi, Irc::ChannelRole).value()); + + QCOMPARE(aim->data(ai, Irc::TitleRole).toString(), a->title()); + QCOMPARE(aim->data(bi, Irc::TitleRole).toString(), b->title()); + QCOMPARE(aim->data(ci, Irc::TitleRole).toString(), c->title()); + QVERIFY(aim->data(oi, Irc::TitleRole).toString().isEmpty()); + + QCOMPARE(aim->data(ai, Irc::NameRole).toString(), a->name()); + QCOMPARE(aim->data(bi, Irc::NameRole).toString(), b->name()); + QCOMPARE(aim->data(ci, Irc::NameRole).toString(), c->name()); + QVERIFY(aim->data(oi, Irc::NameRole).toString().isEmpty()); + + QVERIFY(aim->data(ai, Irc::PrefixRole).toString().isEmpty()); + QVERIFY(aim->data(bi, Irc::PrefixRole).toString().isEmpty()); + QVERIFY(aim->data(ci, Irc::PrefixRole).toString().isEmpty()); + QVERIFY(aim->data(oi, Irc::PrefixRole).toString().isEmpty()); +} + +class FakeQmlBufferModel : public IrcBufferModel +{ + Q_OBJECT + friend class tst_IrcBufferModel; + +public slots: + // -Wno-overloaded-virtual + QVariant createBuffer(const QVariant& title) + { + IrcBuffer* buffer = IrcBufferModel::createBuffer(title.toString()); + buffer->setObjectName("QML buffer"); + return QVariant::fromValue(buffer); + } + QVariant createChannel(const QVariant& title) + { + IrcChannel* channel = IrcBufferModel::createChannel(title.toString()); + channel->setObjectName("QML channel"); + return QVariant::fromValue(channel); + } +}; + +void tst_IrcBufferModel::testQML() +{ + FakeQmlBufferModel model; + model.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QCOMPARE(model.add("buffer")->objectName(), QString("QML buffer")); + QCOMPARE(model.add("#channel")->objectName(), QString("QML channel")); +} + +void tst_IrcBufferModel::testWarnings() +{ + IrcBufferModel model(connection); + model.setConnection(connection); + + QTest::ignoreMessage(QtCriticalMsg, "IrcBufferModel::setConnection(): changing the connection on the fly is not supported."); + + IrcConnection another; + model.setConnection(&another); +} + +QTEST_MAIN(tst_IrcBufferModel) + +#include "tst_ircbuffermodel.moc" diff --git a/src/libcommuni/tests/auto/ircchannel/ircchannel.pro b/src/libcommuni/tests/auto/ircchannel/ircchannel.pro new file mode 100644 index 0000000..8f9b87b --- /dev/null +++ b/src/libcommuni/tests/auto/ircchannel/ircchannel.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircchannel.cpp + +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircchannel/tst_ircchannel.cpp b/src/libcommuni/tests/auto/ircchannel/tst_ircchannel.cpp new file mode 100644 index 0000000..54fdf31 --- /dev/null +++ b/src/libcommuni/tests/auto/ircchannel/tst_ircchannel.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircchannel.h" +#include +#include + +class tst_IrcChannel : public QObject +{ + Q_OBJECT + +private slots: + void testDefaults(); + void testSignals(); + void testDebug(); +}; + +void tst_IrcChannel::testDefaults() +{ + IrcChannel channel; + QVERIFY(channel.title().isEmpty()); + QVERIFY(channel.name().isEmpty()); + QVERIFY(channel.prefix().isEmpty()); + QVERIFY(channel.isChannel()); + QVERIFY(channel.toChannel()); + QVERIFY(!channel.connection()); + QVERIFY(!channel.network()); + QVERIFY(!channel.model()); + QVERIFY(!channel.isActive()); + QVERIFY(!channel.isSticky()); + QVERIFY(!channel.isPersistent()); + QVERIFY(channel.mode().isEmpty()); + QVERIFY(channel.topic().isEmpty()); +} + +void tst_IrcChannel::testSignals() +{ + IrcChannel channel; + QSignalSpy modeSpy(&channel, SIGNAL(modeChanged(QString))); + QSignalSpy topicSpy(&channel, SIGNAL(topicChanged(QString))); + QVERIFY(modeSpy.isValid()); + QVERIFY(topicSpy.isValid()); +} + +void tst_IrcChannel::testDebug() +{ + QString str; + QDebug dbg(&str); + + dbg << static_cast(0); + QCOMPARE(str.trimmed(), QString::fromLatin1("IrcChannel(0x0)")); + str.clear(); + + IrcChannel channel; + dbg << &channel; + QVERIFY(QRegExp("IrcChannel\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); + str.clear(); + + channel.setObjectName("obj"); + dbg << &channel; + QVERIFY(QRegExp("IrcChannel\\(0x[0-9A-Fa-f]+, name=obj\\) ").exactMatch(str)); + str.clear(); + + channel.setPrefix("#"); + channel.setName("communi"); + dbg << &channel; + QVERIFY(QRegExp("IrcChannel\\(0x[0-9A-Fa-f]+, name=obj, title=#communi\\) ").exactMatch(str)); + str.clear(); +} + +QTEST_MAIN(tst_IrcChannel) + +#include "tst_ircchannel.moc" diff --git a/src/libcommuni/tests/auto/irccommand/irccommand.pro b/src/libcommuni/tests/auto/irccommand/irccommand.pro new file mode 100644 index 0000000..50a631e --- /dev/null +++ b/src/libcommuni/tests/auto/irccommand/irccommand.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_irccommand.cpp + +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/irccommand/tst_irccommand.cpp b/src/libcommuni/tests/auto/irccommand/tst_irccommand.cpp new file mode 100644 index 0000000..563cacc --- /dev/null +++ b/src/libcommuni/tests/auto/irccommand/tst_irccommand.cpp @@ -0,0 +1,529 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "irccommand.h" +#include "ircmessage.h" +#include "ircconnection.h" +#include +#include +#include +#include + +class tst_IrcCommand : public QObject +{ + Q_OBJECT + +private slots: + void testDefaults(); + + void testEncoding_data(); + void testEncoding(); + + void testConversion(); + + void testAdmin(); + void testAway(); + void testCapability(); + void testCtcpAction(); + void testCtcpReply(); + void testCtcpRequest(); + void testInfo(); + void testInvite(); + void testJoin(); + void testKick(); + void testKnock(); + void testList(); + void testMessage(); + void testMode(); + void testMotd(); + void testNames(); + void testNick(); + void testNotice(); + void testPart(); + void testPing(); + void testPong(); + void testQuit(); + void testQuote(); + void testStats(); + void testTime(); + void testTopic(); + void testTrace(); + void testUsers(); + void testVersion(); + void testWho(); + void testWhois(); + void testWhowas(); + + void testDebug(); +}; + +void tst_IrcCommand::testDefaults() +{ + IrcCommand cmd; + QVERIFY(cmd.parameters().isEmpty()); + QCOMPARE(cmd.type(), IrcCommand::Custom); + QCOMPARE(cmd.encoding(), QByteArray("UTF-8")); + + QTest::ignoreMessage(QtWarningMsg, "Reimplement IrcCommand::toString() for IrcCommand::Custom"); + QVERIFY(cmd.toString().isEmpty()); +} + +void tst_IrcCommand::testEncoding_data() +{ + QTest::addColumn("encoding"); + QTest::addColumn("actual"); + QTest::addColumn("supported"); + + QTest::newRow("null") << QByteArray() << QByteArray("UTF-8") << false; + QTest::newRow("empty") << QByteArray("") << QByteArray("UTF-8") << false; + QTest::newRow("space") << QByteArray(" ") << QByteArray("UTF-8") << false; + QTest::newRow("invalid") << QByteArray("invalid") << QByteArray("UTF-8") << false; + foreach (const QByteArray& codec, QTextCodec::availableCodecs()) + QTest::newRow(codec) << codec << codec << true; +} + +void tst_IrcCommand::testEncoding() +{ + QFETCH(QByteArray, encoding); + QFETCH(QByteArray, actual); + QFETCH(bool, supported); + + if (!supported) + QTest::ignoreMessage(QtWarningMsg, "IrcCommand::setEncoding(): unsupported encoding \"" + encoding + "\" "); + + IrcCommand cmd; + cmd.setEncoding(encoding); + QCOMPARE(cmd.encoding(), actual); +} + +void tst_IrcCommand::testConversion() +{ + QScopedPointer cmd(IrcCommand::createMessage("target", "foo bar")); + QVERIFY(cmd.data()); + QCOMPARE(cmd->type(), IrcCommand::Message); + + IrcConnection conn; + QScopedPointer msg(cmd->toMessage("prefix", &conn)); + QVERIFY(msg.data()); + + QCOMPARE(msg->type(), IrcMessage::Private); + QCOMPARE(msg->connection(), &conn); + QCOMPARE(msg->prefix(), QString("prefix")); + QCOMPARE(msg->property("target").toString(), QString("target")); + QCOMPARE(msg->property("content").toString(), QString("foo bar")); +} + +void tst_IrcCommand::testAdmin() +{ + QScopedPointer cmd(IrcCommand::createAdmin("server")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Admin); + QVERIFY(cmd->toString().contains(QRegExp("\\bADMIN\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); +} + +void tst_IrcCommand::testAway() +{ + QScopedPointer cmd(IrcCommand::createAway("reason")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Away); + QVERIFY(cmd->toString().contains(QRegExp("\\bAWAY\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\breason\\b"))); +} + +void tst_IrcCommand::testCapability() +{ + QScopedPointer cmd1(IrcCommand::createCapability("sub", QString("cap"))); + QVERIFY(cmd1.data()); + + QCOMPARE(cmd1->type(), IrcCommand::Capability); + QVERIFY(cmd1->toString().contains(QRegExp("\\bCAP\\b"))); + QVERIFY(cmd1->toString().contains(QRegExp("\\bsub\\b"))); + QVERIFY(cmd1->toString().contains(QRegExp("\\bcap\\b"))); + + QScopedPointer cmd2(IrcCommand::createCapability("sub", QStringList() << "cap1" << "cap2")); + QVERIFY(cmd2.data()); + + QCOMPARE(cmd2->type(), IrcCommand::Capability); + QVERIFY(cmd2->toString().contains(QRegExp("\\bCAP\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bsub\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bcap1\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bcap2\\b"))); +} + +void tst_IrcCommand::testCtcpAction() +{ + QScopedPointer cmd(IrcCommand::createCtcpAction("tgt", "act")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::CtcpAction); + QVERIFY(cmd->toString().contains(QRegExp("\\bPRIVMSG\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bact\\b"))); + QCOMPARE(cmd->toString().count("\01"), 2); +} + +void tst_IrcCommand::testCtcpReply() +{ + QScopedPointer cmd(IrcCommand::createCtcpReply("tgt", "rpl")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::CtcpReply); + QVERIFY(cmd->toString().contains(QRegExp("\\bNOTICE\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\brpl\\b"))); + QCOMPARE(cmd->toString().count("\01"), 2); +} + +void tst_IrcCommand::testCtcpRequest() +{ + QScopedPointer cmd(IrcCommand::createCtcpRequest("tgt", "req")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::CtcpRequest); + QVERIFY(cmd->toString().contains(QRegExp("\\bPRIVMSG\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\breq\\b"))); + QCOMPARE(cmd->toString().count("\01"), 2); +} + +void tst_IrcCommand::testInfo() +{ + QScopedPointer cmd(IrcCommand::createInfo("server")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Info); + QVERIFY(cmd->toString().contains(QRegExp("\\bINFO\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); +} + +void tst_IrcCommand::testInvite() +{ + QScopedPointer cmd(IrcCommand::createInvite("usr", "chan")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Invite); + QVERIFY(cmd->toString().contains(QRegExp("\\bINVITE\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\busr\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bchan\\b"))); +} + +void tst_IrcCommand::testJoin() +{ + QScopedPointer cmd1(IrcCommand::createJoin("chan")); + QVERIFY(cmd1.data()); + + QCOMPARE(cmd1->type(), IrcCommand::Join); + QVERIFY(cmd1->toString().contains(QRegExp("\\bJOIN\\b"))); + QVERIFY(cmd1->toString().contains(QRegExp("\\bchan\\b"))); + + QScopedPointer cmd2(IrcCommand::createJoin(QStringList() << "chan1" << "chan2")); + QVERIFY(cmd2.data()); + + QCOMPARE(cmd2->type(), IrcCommand::Join); + QVERIFY(cmd2->toString().contains(QRegExp("\\bJOIN\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bchan1\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bchan2\\b"))); +} + +void tst_IrcCommand::testKick() +{ + QScopedPointer cmd(IrcCommand::createKick("chan", "usr")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Kick); + QVERIFY(cmd->toString().contains(QRegExp("\\bKICK\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bchan\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\busr\\b"))); +} + +void tst_IrcCommand::testKnock() +{ + QScopedPointer cmd(IrcCommand::createKnock("chan")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Knock); + QVERIFY(cmd->toString().contains(QRegExp("\\bKNOCK\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bchan\\b"))); +} + +void tst_IrcCommand::testList() +{ + QScopedPointer cmd(IrcCommand::createList(QStringList() << "chan1" << "chan2", "server")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::List); + QVERIFY(cmd->toString().contains(QRegExp("\\bLIST\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bchan1\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bchan2\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); +} + +void tst_IrcCommand::testMessage() +{ + QScopedPointer cmd(IrcCommand::createMessage("tgt", "msg")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Message); + QVERIFY(cmd->toString().contains(QRegExp("\\bPRIVMSG\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bmsg\\b"))); +} + +void tst_IrcCommand::testMode() +{ + QScopedPointer cmd(IrcCommand::createMode("tgt", "mode")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Mode); + QVERIFY(cmd->toString().contains(QRegExp("\\bMODE\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bmode\\b"))); +} + +void tst_IrcCommand::testMotd() +{ + QScopedPointer cmd(IrcCommand::createMotd("server")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Motd); + QVERIFY(cmd->toString().contains(QRegExp("\\bMOTD\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); +} + +void tst_IrcCommand::testNames() +{ + QScopedPointer cmd1(IrcCommand::createNames("chan")); + QVERIFY(cmd1.data()); + + QCOMPARE(cmd1->type(), IrcCommand::Names); + QVERIFY(cmd1->toString().contains(QRegExp("\\bNAMES\\b"))); + QVERIFY(cmd1->toString().contains(QRegExp("\\bchan\\b"))); + + QScopedPointer cmd2(IrcCommand::createNames(QStringList() << "chan1" << "chan2")); + QVERIFY(cmd2.data()); + + QCOMPARE(cmd2->type(), IrcCommand::Names); + QVERIFY(cmd2->toString().contains(QRegExp("\\bNAMES\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bchan1\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bchan2\\b"))); +} + +void tst_IrcCommand::testNick() +{ + QScopedPointer cmd(IrcCommand::createNick("nick")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Nick); + QVERIFY(cmd->toString().contains(QRegExp("\\bNICK\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bnick\\b"))); +} + +void tst_IrcCommand::testNotice() +{ + QScopedPointer cmd(IrcCommand::createNotice("tgt", "msg")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Notice); + QVERIFY(cmd->toString().contains(QRegExp("\\bNOTICE\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\btgt\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bmsg\\b"))); +} + +void tst_IrcCommand::testPart() +{ + QScopedPointer cmd1(IrcCommand::createPart("chan")); + QVERIFY(cmd1.data()); + + QCOMPARE(cmd1->type(), IrcCommand::Part); + QVERIFY(cmd1->toString().contains(QRegExp("\\bPART\\b"))); + QVERIFY(cmd1->toString().contains(QRegExp("\\bchan\\b"))); + + QScopedPointer cmd2(IrcCommand::createPart(QStringList() << "chan1" << "chan2")); + QVERIFY(cmd2.data()); + + QCOMPARE(cmd2->type(), IrcCommand::Part); + QVERIFY(cmd2->toString().contains(QRegExp("\\bPART\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bchan1\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bchan2\\b"))); +} + +void tst_IrcCommand::testPing() +{ + QScopedPointer cmd(IrcCommand::createPing("arg")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Ping); + QVERIFY(cmd->toString().contains(QRegExp("\\bPING\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\barg\\b"))); +} + +void tst_IrcCommand::testPong() +{ + QScopedPointer cmd(IrcCommand::createPong("arg")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Pong); + QVERIFY(cmd->toString().contains(QRegExp("\\bPONG\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\barg\\b"))); +} + +void tst_IrcCommand::testQuit() +{ + QScopedPointer cmd(IrcCommand::createQuit("reason")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Quit); + QVERIFY(cmd->toString().contains(QRegExp("\\bQUIT\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\breason\\b"))); +} + +void tst_IrcCommand::testQuote() +{ + QScopedPointer cmd1(IrcCommand::createQuote("CUSTOM")); + QVERIFY(cmd1.data()); + + QCOMPARE(cmd1->type(), IrcCommand::Quote); + QVERIFY(cmd1->toString().contains(QRegExp("\\bCUSTOM\\b"))); + + QScopedPointer cmd2(IrcCommand::createQuote(QStringList() << "FOO" << "BAR")); + QVERIFY(cmd2.data()); + + QCOMPARE(cmd2->type(), IrcCommand::Quote); + QVERIFY(cmd2->toString().contains(QRegExp("\\bFOO\\b"))); + QVERIFY(cmd2->toString().contains(QRegExp("\\bBAR\\b"))); +} + +void tst_IrcCommand::testStats() +{ + QScopedPointer cmd(IrcCommand::createStats("query", "server")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Stats); + QVERIFY(cmd->toString().contains(QRegExp("\\bSTATS\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bquery\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); +} + +void tst_IrcCommand::testTime() +{ + QScopedPointer cmd(IrcCommand::createTime("server")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Time); + QVERIFY(cmd->toString().contains(QRegExp("\\bTIME\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); +} + +void tst_IrcCommand::testTopic() +{ + QScopedPointer cmd(IrcCommand::createTopic("chan", "topic")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Topic); + QVERIFY(cmd->toString().contains(QRegExp("\\bTOPIC\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bchan\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\btopic\\b"))); +} + +void tst_IrcCommand::testTrace() +{ + QScopedPointer cmd(IrcCommand::createTrace("target")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Trace); + QVERIFY(cmd->toString().contains(QRegExp("\\bTRACE\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\btarget\\b"))); +} + +void tst_IrcCommand::testUsers() +{ + QScopedPointer cmd(IrcCommand::createUsers("server")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Users); + QVERIFY(cmd->toString().contains(QRegExp("\\bUSERS\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bserver\\b"))); +} + +void tst_IrcCommand::testVersion() +{ + QScopedPointer cmd(IrcCommand::createVersion("user")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Version); + QVERIFY(cmd->toString().contains(QRegExp("\\bVERSION\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\buser\\b"))); +} + +void tst_IrcCommand::testWho() +{ + QScopedPointer cmd(IrcCommand::createWho("mask")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Who); + QVERIFY(cmd->toString().contains(QRegExp("\\bWHO\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bmask\\b"))); +} + +void tst_IrcCommand::testWhois() +{ + QScopedPointer cmd(IrcCommand::createWhois("mask")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Whois); + QVERIFY(cmd->toString().contains(QRegExp("\\bWHOIS\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bmask\\b"))); +} + +void tst_IrcCommand::testWhowas() +{ + QScopedPointer cmd(IrcCommand::createWhowas("mask")); + QVERIFY(cmd.data()); + + QCOMPARE(cmd->type(), IrcCommand::Whowas); + QVERIFY(cmd->toString().contains(QRegExp("\\bWHOWAS\\b"))); + QVERIFY(cmd->toString().contains(QRegExp("\\bmask\\b"))); +} + +void tst_IrcCommand::testDebug() +{ + QString str; + QDebug dbg(&str); + + dbg << static_cast(0); + QCOMPARE(str.trimmed(), QString::fromLatin1("IrcCommand(0x0)")); + str.clear(); + + IrcCommand command; + QTest::ignoreMessage(QtWarningMsg, "Reimplement IrcCommand::toString() for IrcCommand::Custom"); + dbg << &command; + QVERIFY(QRegExp("IrcCommand\\(0x[0-9A-Fa-f]+, type=Custom\\) ").exactMatch(str)); + str.clear(); + + command.setType(IrcCommand::Quit); + dbg << &command; + QVERIFY(QRegExp("IrcCommand\\(0x[0-9A-Fa-f]+, type=Quit, \"QUIT :\"\\) ").exactMatch(str)); + str.clear(); + + command.setObjectName("foo"); + dbg << &command; + QVERIFY(QRegExp("IrcCommand\\(0x[0-9A-Fa-f]+, name=foo, type=Quit, \"QUIT :\"\\) ").exactMatch(str)); + str.clear(); + + dbg << IrcCommand::Join; + QCOMPARE(str.trimmed(), QString::fromLatin1("Join")); + str.clear(); +} + +QTEST_MAIN(tst_IrcCommand) + +#include "tst_irccommand.moc" diff --git a/src/libcommuni/tests/auto/irccommandparser/irccommandparser.pro b/src/libcommuni/tests/auto/irccommandparser/irccommandparser.pro new file mode 100644 index 0000000..2fe0bc1 --- /dev/null +++ b/src/libcommuni/tests/auto/irccommandparser/irccommandparser.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_irccommandparser.cpp + +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/irccommandparser/tst_irccommandparser.cpp b/src/libcommuni/tests/auto/irccommandparser/tst_irccommandparser.cpp new file mode 100644 index 0000000..6476f28 --- /dev/null +++ b/src/libcommuni/tests/auto/irccommandparser/tst_irccommandparser.cpp @@ -0,0 +1,442 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "irccommandparser.h" +#include + +class tst_IrcCommandParser : public QObject +{ + Q_OBJECT + +private slots: + void testParse_data(); + void testParse(); + void testTriggers(); + void testTarget(); + void testChannels(); + void testCommands(); + void testClear(); + void testReset(); + void testAddRemove(); + void testSyntax_data(); + void testSyntax(); + void testTolerancy(); + void testCustom(); + void testWhitespace(); +}; + +void tst_IrcCommandParser::testParse_data() +{ + QTest::addColumn("target"); + QTest::addColumn("input"); + QTest::addColumn("output"); + + QTest::newRow("msg") << QString("#communi") << QString("Hello all!") << QString("PRIVMSG #communi :Hello all!"); + QTest::newRow("//msg") << QString("#communi") << QString("//msg test") << QString("PRIVMSG #communi :/msg test"); + QTest::newRow("/ /msg") << QString("#communi") << QString("/ /msg test") << QString("PRIVMSG #communi :/msg test"); + + QTest::newRow("join1") << QString("#communi") << QString("/JOIN") << QString(); + QTest::newRow("join2") << QString("#communi") << QString("/JOIN #chan") << QString("JOIN #chan"); + QTest::newRow("join3") << QString("#communi") << QString("/JOIN #chan secret") << QString("JOIN #chan secret"); + QTest::newRow("join4") << QString("#communi") << QString("/JOIN #chan too secret") << QString(); + + QTest::newRow("part1") << QString("#communi") << QString("/PART") << QString("PART #communi"); + QTest::newRow("part2") << QString("#communi") << QString("/PART #communi") << QString("PART #communi"); + QTest::newRow("part3") << QString("#communi") << QString("/PART #not-exist") << QString("PART #communi :#not-exist"); + QTest::newRow("part4") << QString("#communi") << QString("/PART hasta la vista") << QString("PART #communi :hasta la vista"); + QTest::newRow("part5") << QString("#communi") << QString("/PART #chan hasta la vista") << QString("PART #communi :#chan hasta la vista"); + + QTest::newRow("kick1") << QString("#communi") << QString("/KICK") << QString(); + QTest::newRow("kick2") << QString("#communi") << QString("/KICK #communi") << QString(); + QTest::newRow("kick3") << QString("#communi") << QString("/KICK jpnurmi") << QString("KICK #communi jpnurmi"); + QTest::newRow("kick4") << QString("jpnurmi") << QString("/KICK jpnurmi") << QString(); + QTest::newRow("kick5") << QString("#communi") << QString("/KICK #communi jpnurmi") << QString("KICK #communi jpnurmi"); + QTest::newRow("kick6") << QString("jpnurmi") << QString("/KICK jpnurmi jpnurmi") << QString(); + QTest::newRow("kick7") << QString("#communi") << QString("/KICK #communi jpnurmi hasta la vista") << QString("KICK #communi jpnurmi :hasta la vista"); + QTest::newRow("kick8") << QString("jpnurmi") << QString("/KICK jpnurmi jpnurmi hasta la vista") << QString(); + QTest::newRow("kick9") << QString("#communi") << QString("/KICK jpnurmi hasta la vista") << QString("KICK #communi jpnurmi :hasta la vista"); + + QTest::newRow("me1") << QString("jpnurmi") << QString("/ME") << QString(); + QTest::newRow("me2") << QString("#communi") << QString("/ME loves communi") << QString("PRIVMSG #communi :\1ACTION loves communi\1"); + QTest::newRow("me3") << QString("jpnurmi") << QString("/ME loves communi") << QString("PRIVMSG jpnurmi :\1ACTION loves communi\1"); + + QTest::newRow("action1") << QString("jpnurmi") << QString("/ACTION") << QString(); + QTest::newRow("action2") << QString("#communi") << QString("/ACTION #communi loves communi") << QString("PRIVMSG #communi :\1ACTION loves communi\1"); + QTest::newRow("action3") << QString("jpnurmi") << QString("/ACTION jpnurmi loves communi") << QString("PRIVMSG jpnurmi :\1ACTION loves communi\1"); + QTest::newRow("action4") << QString("jpnurmi") << QString("/ACTION #communi loves communi") << QString("PRIVMSG #communi :\1ACTION loves communi\1"); +} + +void tst_IrcCommandParser::testParse() +{ + QFETCH(QString, target); + QFETCH(QString, input); + QFETCH(QString, output); + + IrcCommandParser parser; + parser.setTolerant(true); + parser.setTriggers(QStringList("/")); + QCOMPARE(parser.triggers(), QStringList("/")); + + parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); + parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); + parser.addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); + parser.addCommand(IrcCommand::CtcpAction, "ME [target] "); + parser.addCommand(IrcCommand::CtcpAction, "ACTION "); + + parser.setTarget(target); + parser.setChannels(QStringList() << "#freenode" << "#communi"); + + IrcCommand* cmd = parser.parse(input); + QCOMPARE(cmd ? cmd->toString() : QString(), output); +} + +void tst_IrcCommandParser::testTriggers() +{ + IrcCommandParser parser; + parser.setTriggers(QStringList("/")); + parser.addCommand(IrcCommand::Join, "JOIN #channel"); + parser.setTarget("#target"); + + QSignalSpy triggerSpy(&parser, SIGNAL(triggersChanged(QStringList))); + QVERIFY(triggerSpy.isValid()); + + parser.setTriggers(QStringList("!")); + QCOMPARE(parser.triggers(), QStringList("!")); + QCOMPARE(triggerSpy.count(), 1); + QCOMPARE(triggerSpy.last().at(0).toStringList(), QStringList("!")); + + IrcCommand* cmd = parser.parse("!join #communi"); + QVERIFY(cmd); + QCOMPARE(cmd->type(), IrcCommand::Join); + QCOMPARE(cmd->toString(), QString("JOIN #communi")); + delete cmd; + + parser.setTriggers(QStringList()); + QCOMPARE(parser.triggers(), QStringList()); + QCOMPARE(triggerSpy.count(), 2); + QCOMPARE(triggerSpy.last().at(0).toStringList(), QStringList()); + + cmd = parser.parse("!join #communi"); + QVERIFY(!cmd); + + parser.setTolerant(true); + cmd = parser.parse("!join #communi"); + QCOMPARE(cmd->type(), IrcCommand::Message); + QCOMPARE(cmd->toString(), QString("PRIVMSG #target :!join #communi")); + delete cmd; + + QVERIFY(!parser.parse("")); +} + +void tst_IrcCommandParser::testTarget() +{ + IrcCommandParser parser; + QVERIFY(parser.target().isEmpty()); + + QSignalSpy targetSpy(&parser, SIGNAL(targetChanged(QString))); + QVERIFY(targetSpy.isValid()); + + parser.setTarget("#tgt"); + QCOMPARE(parser.target(), QString("#tgt")); + QCOMPARE(targetSpy.count(), 1); + QCOMPARE(targetSpy.last().at(0).toString(), QString("#tgt")); + + parser.setTarget("#tgt"); + QCOMPARE(targetSpy.count(), 1); + + parser.setTarget(QString()); + QCOMPARE(parser.target(), QString()); + QCOMPARE(targetSpy.count(), 2); + QCOMPARE(targetSpy.last().at(0).toString(), QString()); +} + +void tst_IrcCommandParser::testChannels() +{ + IrcCommandParser parser; + QVERIFY(parser.channels().isEmpty()); + + QSignalSpy channelSpy(&parser, SIGNAL(channelsChanged(QStringList))); + QVERIFY(channelSpy.isValid()); + + parser.setChannels(QStringList() << "#foo" << "#bar"); + QCOMPARE(parser.channels(), QStringList() << "#foo" << "#bar"); + QCOMPARE(channelSpy.count(), 1); + QCOMPARE(channelSpy.last().at(0).toStringList(), QStringList() << "#foo" << "#bar"); + + parser.setChannels(QStringList() << "#foo" << "#bar"); + QCOMPARE(parser.channels(), QStringList() << "#foo" << "#bar"); + QCOMPARE(channelSpy.count(), 1); + + parser.setChannels(QStringList()); + QCOMPARE(parser.channels(), QStringList()); + QCOMPARE(channelSpy.count(), 2); + QCOMPARE(channelSpy.last().at(0).toStringList(), QStringList()); +} + +void tst_IrcCommandParser::testCommands() +{ + IrcCommandParser parser; + + QSignalSpy commandSpy(&parser, SIGNAL(commandsChanged(QStringList))); + QVERIFY(commandSpy.isValid()); + + parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); + parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); + parser.addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); + parser.addCommand(IrcCommand::CtcpAction, "ME [target] "); + parser.addCommand(IrcCommand::CtcpAction, "ACTION "); + + QCOMPARE(parser.commands().count(), 5); + QCOMPARE(parser.commands(), QStringList() << "ACTION" << "JOIN" << "KICK" << "ME" << "PART"); + + QCOMPARE(commandSpy.count(), 5); + QCOMPARE(commandSpy.at(0).at(0).toStringList(), QStringList() << "JOIN"); + QCOMPARE(commandSpy.at(1).at(0).toStringList(), QStringList() << "JOIN" << "PART"); + QCOMPARE(commandSpy.at(2).at(0).toStringList(), QStringList() << "JOIN" << "KICK" << "PART"); + QCOMPARE(commandSpy.at(3).at(0).toStringList(), QStringList() << "JOIN" << "KICK" << "ME" << "PART"); + QCOMPARE(commandSpy.at(4).at(0).toStringList(), QStringList() << "ACTION" << "JOIN" << "KICK" << "ME" << "PART"); +} + +void tst_IrcCommandParser::testClear() +{ + IrcCommandParser parser; + parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); + parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); + parser.addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); + parser.addCommand(IrcCommand::CtcpAction, "ME [target] "); + parser.addCommand(IrcCommand::CtcpAction, "ACTION "); + QCOMPARE(parser.commands().count(), 5); + + QSignalSpy commandSpy(&parser, SIGNAL(commandsChanged(QStringList))); + QVERIFY(commandSpy.isValid()); + + parser.clear(); + QVERIFY(parser.commands().isEmpty()); + QCOMPARE(commandSpy.count(), 1); + QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList()); + + parser.clear(); + QVERIFY(parser.commands().isEmpty()); + QCOMPARE(commandSpy.count(), 1); +} + +void tst_IrcCommandParser::testReset() +{ + IrcCommandParser parser; + + QSignalSpy targetSpy(&parser, SIGNAL(targetChanged(QString))); + QVERIFY(targetSpy.isValid()); + + QSignalSpy channelSpy(&parser, SIGNAL(channelsChanged(QStringList))); + QVERIFY(channelSpy.isValid()); + + parser.setTarget("#tgt"); + QCOMPARE(targetSpy.count(), 1); + QCOMPARE(targetSpy.last().at(0).toString(), QString("#tgt")); + + parser.setChannels(QStringList() << "#foo" << "#bar"); + QCOMPARE(channelSpy.count(), 1); + QCOMPARE(channelSpy.last().at(0).toStringList(), QStringList() << "#foo" << "#bar"); + + parser.reset(); + + QCOMPARE(targetSpy.count(), 2); + QCOMPARE(targetSpy.last().at(0).toString(), QString()); + + QCOMPARE(channelSpy.count(), 2); + QCOMPARE(channelSpy.last().at(0).toStringList(), QStringList()); + + parser.reset(); + QCOMPARE(targetSpy.count(), 2); + QCOMPARE(channelSpy.count(), 2); +} + +void tst_IrcCommandParser::testAddRemove() +{ + IrcCommandParser parser; + QVERIFY(parser.commands().isEmpty()); + + QSignalSpy commandSpy(&parser, SIGNAL(commandsChanged(QStringList))); + QVERIFY(commandSpy.isValid()); + + parser.addCommand(IrcCommand::Join, "join <#channel> ()"); + QCOMPARE(parser.commands(), QStringList() << "JOIN"); + QCOMPARE(commandSpy.count(), 1); + QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "JOIN"); + + parser.addCommand(IrcCommand::Join, "join "); + QCOMPARE(parser.commands(), QStringList() << "JOIN"); + QCOMPARE(commandSpy.count(), 1); + QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "JOIN"); + + parser.addCommand(IrcCommand::Part, "Part (<#channel>) ()"); + QCOMPARE(parser.commands(), QStringList() << "JOIN" << "PART"); + QCOMPARE(commandSpy.count(), 2); + QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "JOIN" << "PART"); + + parser.addCommand(IrcCommand::Part, "PART "); + QCOMPARE(parser.commands(), QStringList() << "JOIN" << "PART"); + QCOMPARE(commandSpy.count(), 2); + QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "JOIN" << "PART"); + + parser.removeCommand(IrcCommand::Join); + QCOMPARE(parser.commands(), QStringList() << "PART"); + QCOMPARE(commandSpy.count(), 3); + QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "PART"); + + parser.removeCommand(IrcCommand::Part, "PART "); + QCOMPARE(parser.commands(), QStringList() << "PART"); + QCOMPARE(commandSpy.count(), 3); + QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList() << "PART"); + + parser.removeCommand(IrcCommand::Part, "Part (<#channel>) ()"); + QCOMPARE(parser.commands(), QStringList()); + QCOMPARE(commandSpy.count(), 4); + QCOMPARE(commandSpy.last().at(0).toStringList(), QStringList()); + QVERIFY(parser.commands().isEmpty()); +} + +void tst_IrcCommandParser::testSyntax_data() +{ + QTest::addColumn("command"); + QTest::addColumn("syntax"); + QTest::addColumn("details"); + QTest::addColumn("expected"); + + QTest::newRow("full") + << QString("foo") + << QString("FOO [param] <#chan> () ()") + << uint(IrcCommandParser::Full) + << QString("FOO [param] <#chan> () ()"); + + QTest::newRow("no target") + << QString("fOO") + << QString("FOO [param] <#chan> () ()") + << uint(IrcCommandParser::NoTarget) + << QString("FOO <#chan> () ()"); + + QTest::newRow("no ellipsis") + << QString("fOO") + << QString("FOO [param] <#chan> () ()") + << uint(IrcCommandParser::NoEllipsis) + << QString("FOO [param] <#chan> () ()"); + + QTest::newRow("no prefix") + << QString("fOO") + << QString("FOO [param] <#chan> () ()") + << uint(IrcCommandParser::NoPrefix) + << QString("FOO [param] () ()"); + + QTest::newRow("no parentheses") + << QString("Foo") + << QString("FOO [param] <#chan> () ()") + << uint(IrcCommandParser::NoParentheses) + << QString("FOO [param] <#chan> "); + + QTest::newRow("no brackets") + << QString("FOO") + << QString("FOO [param] <#chan> () ()") + << uint(IrcCommandParser::NoBrackets) + << QString("FOO param <#chan> () ()"); + + QTest::newRow("no angles") + << QString("FOO") + << QString("FOO [param] <#chan> () ()") + << uint(IrcCommandParser::NoAngles) + << QString("FOO [param] #chan (arg) (rest...)"); + + QTest::newRow("visual") + << QString("FOO") + << QString("FOO [param] <#chan> () ()") + << uint(IrcCommandParser::Visual) + << QString("FOO () ()"); +} + +void tst_IrcCommandParser::testSyntax() +{ + QFETCH(QString, command); + QFETCH(QString, syntax); + QFETCH(uint, details); + QFETCH(QString, expected); + + IrcCommandParser parser; + parser.addCommand(IrcCommand::Custom, syntax); + QString actual = parser.syntax(command, IrcCommandParser::Details(details)); + QCOMPARE(actual, expected); +} + +void tst_IrcCommandParser::testTolerancy() +{ + IrcCommandParser parser; + parser.setTriggers(QStringList("/")); + QVERIFY(!parser.isTolerant()); + + IrcCommand* cmd = parser.parse("/NS help"); + QVERIFY(!cmd); + + QSignalSpy tolerancySpy(&parser, SIGNAL(tolerancyChanged(bool))); + QVERIFY(tolerancySpy.isValid()); + + parser.setTolerant(true); + QVERIFY(parser.isTolerant()); + QCOMPARE(tolerancySpy.count(), 1); + QCOMPARE(tolerancySpy.last().at(0).toBool(), true); + + parser.setTolerant(true); + QVERIFY(parser.isTolerant()); + QCOMPARE(tolerancySpy.count(), 1); + + cmd = parser.parse("/NS help"); + QVERIFY(cmd); + QCOMPARE(cmd->type(), IrcCommand::Quote); + QCOMPARE(cmd->toString(), QString("NS help")); + + parser.setTolerant(false); + QVERIFY(!parser.isTolerant()); + QCOMPARE(tolerancySpy.count(), 2); + QCOMPARE(tolerancySpy.last().at(0).toBool(), false); +} + +void tst_IrcCommandParser::testCustom() +{ + IrcCommandParser parser; + parser.setTriggers(QStringList("/")); + + parser.addCommand(IrcCommand::Custom, "Hello "); + QCOMPARE(parser.commands(), QStringList() << "HELLO"); + QCOMPARE(parser.syntax("HELLO"), QString("HELLO ")); + + QVERIFY(!parser.parse("/hello")); + QVERIFY(!parser.parse("/hello foo")); + QVERIFY(!parser.parse("/hello foo bar")); + QVERIFY(!parser.parse("/hello foo bar foo baz")); + + IrcCommand* cmd = parser.parse("/hello foo bar baz"); + QVERIFY(cmd); + QCOMPARE(cmd->type(), IrcCommand::Custom); + QCOMPARE(cmd->parameters(), QStringList() << "HELLO" << "foo" << "bar" << "baz"); + delete cmd; +} + +void tst_IrcCommandParser::testWhitespace() +{ + IrcCommandParser parser; + parser.setTriggers(QStringList("/")); + parser.addCommand(IrcCommand::Custom, "TEST "); + + IrcCommand* cmd = parser.parse("/test foo bar baz"); + QVERIFY(cmd); + QCOMPARE(cmd->type(), IrcCommand::Custom); + QCOMPARE(cmd->parameters(), QStringList() << "TEST" << "foo bar baz"); + delete cmd; +} + +QTEST_MAIN(tst_IrcCommandParser) + +#include "tst_irccommandparser.moc" diff --git a/src/libcommuni/tests/auto/irccompleter/irccompleter.pro b/src/libcommuni/tests/auto/irccompleter/irccompleter.pro new file mode 100644 index 0000000..5d8306a --- /dev/null +++ b/src/libcommuni/tests/auto/irccompleter/irccompleter.pro @@ -0,0 +1,8 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_irccompleter.cpp + +include(../shared/shared.pri) +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/irccompleter/tst_irccompleter.cpp b/src/libcommuni/tests/auto/irccompleter/tst_irccompleter.cpp new file mode 100644 index 0000000..5eef644 --- /dev/null +++ b/src/libcommuni/tests/auto/irccompleter/tst_irccompleter.cpp @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "irccompleter.h" +#include "ircbuffermodel.h" +#include "irccommandparser.h" +#include "ircchannel.h" +#include "ircbuffer.h" +#include +#include "tst_ircclientserver.h" +#include "tst_ircdata.h" + +class tst_IrcCompleter : public tst_IrcClientServer +{ + Q_OBJECT + +private slots: + void testSuffix(); + void testBuffer(); + void testParser(); + + void testCompletion_data(); + void testCompletion(); + + void testReset(); +}; + +void tst_IrcCompleter::testSuffix() +{ + IrcCompleter completer; + QCOMPARE(completer.suffix(), QString(":")); + QCOMPARE(completer.property("suffix").toString(), QString(":")); + + QSignalSpy spy(&completer, SIGNAL(suffixChanged(QString))); + QVERIFY(spy.isValid()); + + completer.setSuffix(","); + QCOMPARE(completer.suffix(), QString(",")); + QCOMPARE(completer.property("suffix").toString(), QString(",")); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.last().at(0).toString(), QString(",")); +} + +void tst_IrcCompleter::testBuffer() +{ + qRegisterMetaType("IrcBuffer*"); + + IrcCompleter completer; + QVERIFY(!completer.buffer()); + + QSignalSpy spy(&completer, SIGNAL(bufferChanged(IrcBuffer*))); + QVERIFY(spy.isValid()); + + IrcBuffer* buffer = new IrcBuffer(&completer); + completer.setBuffer(buffer); + QCOMPARE(completer.buffer(), buffer); + QCOMPARE(completer.property("buffer").value(), buffer); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.last().at(0).value(), buffer); + + completer.setBuffer(0); + QVERIFY(!completer.buffer()); + QCOMPARE(spy.count(), 2); + QVERIFY(!spy.last().at(0).value()); +} + +void tst_IrcCompleter::testParser() +{ + qRegisterMetaType("IrcCommandParser*"); + + IrcCompleter completer; + QVERIFY(!completer.parser()); + + QSignalSpy spy(&completer, SIGNAL(parserChanged(IrcCommandParser*))); + QVERIFY(spy.isValid()); + + IrcCommandParser* parser = new IrcCommandParser(&completer); + completer.setParser(parser); + QCOMPARE(completer.parser(), parser); + QCOMPARE(completer.property("parser").value(), parser); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.last().at(0).value(), parser); + + completer.setParser(0); + QVERIFY(!completer.parser()); + QCOMPARE(spy.count(), 2); + QVERIFY(!spy.last().at(0).value()); +} + +Q_DECLARE_METATYPE(QList) +void tst_IrcCompleter::testCompletion_data() +{ + QTest::addColumn("suffix"); + QTest::addColumn("text"); + QTest::addColumn("cursor"); + QTest::addColumn("completions"); + QTest::addColumn >("positions"); + + for (int i = -1; i <= 3; ++i) + QTest::newRow("/j @ " + QByteArray::number(i)) << QString() << "/j" << i << QStringList("/JOIN ") << (QList() << QString("/JOIN ").length()); + + QTest::newRow("/q #2") << QString() << "/q" << QString("/q").length() + << (QStringList() << "/QUERY " << "/QUIT ") + << (QList() << QString("/QUERY ").length() << QString("/QUIT ").length()); + + QTest::newRow("/QUERY q") << QString() << "/quer q " << QString("/quer").length() + << (QStringList("/QUERY q ")) + << (QList() << QString("/QUERY ").length()); + + QTest::newRow("/query q") << QString() << "/query q" << QString("/query q").length() + << (QStringList() << "/query quackgyver " << "/query quelx ") + << (QList() << QString("/query quackgyver ").length() << QString("/query quelx ").length()); + + QTest::newRow("buffers") << QString() << "q" << QString("q").length() + << (QStringList() << "quackgyver " << "quelx ") + << (QList() << QString("quackgyver ").length() << QString("quelx ").length()); + + QTest::newRow("repeat") << QString() << "qtassistant " << QString("qtassistant ").length() + << (QStringList() << "qtassistant " << "qtassistant ") + << (QList() << QString("qtassistant ").length() << QString("qtassistant ").length()); + + QStringList names1; + QStringList names2; + QList positions; + foreach (const QString& name, tst_IrcData::names()) { + if (name.startsWith("je", Qt::CaseInsensitive)) { + names1 += name + ": "; + names2 += name + ", "; + positions += name.length() + 2; + } + } + QTest::newRow("je...:") << ":" << "je" << 1 << names1 << positions; + QTest::newRow("je...,") << "," << "je" << 1 << names2 << positions; + + names1.clear(); + names2.clear(); + positions.clear(); + foreach (const QString& name, tst_IrcData::names()) { + if (name.startsWith("sa", Qt::CaseInsensitive)) { + names1 += "... " + name + " "; + positions += QString("... ").length() + name.length() + QString(" ").length(); + } + } + QTest::newRow("... sa") << QString() << "... sa" << QString("... ").length() << names1 << positions; + + QTest::newRow("spaces") << QString() << "/quit foo qt rest... " << QString("/quit foo qt ").length() + << QStringList("/quit foo qtassistant rest... ") + << (QList() << QString("/quit foo qtassistant ").length()); +} + +void tst_IrcCompleter::testCompletion() +{ + QFETCH(QString, suffix); + QFETCH(QString, text); + QFETCH(int, cursor); + QFETCH(QStringList, completions); + QFETCH(QList, positions); + + IrcBufferModel model(connection); + + connection->open(); + waitForOpened(); + waitForWritten(tst_IrcData::welcome()); + waitForWritten(tst_IrcData::join()); + + model.add("qout"); + model.add("qtassistant"); + + IrcCommandParser parser; + parser.setTriggers(QStringList("/")); + parser.addCommand(IrcCommand::Join, "JOIN <#channel> ()"); + parser.addCommand(IrcCommand::Part, "PART (<#channel>) ()"); + parser.addCommand(IrcCommand::Kick, "KICK (<#channel>) ()"); + parser.addCommand(IrcCommand::CtcpAction, "ME [target] "); + parser.addCommand(IrcCommand::CtcpAction, "ACTION "); + parser.addCommand(IrcCommand::Custom, "QUERY "); + parser.addCommand(IrcCommand::Quit, "QUIT ()"); + + IrcCompleter completer; + completer.setSuffix(suffix); + completer.setBuffer(model.get(0)); + completer.setParser(&parser); + + QSignalSpy spy(&completer, SIGNAL(completed(QString,int))); + QVERIFY(spy.isValid()); + + for (int i = 0; i < completions.count(); ++i) { + completer.complete(text, cursor); + QCOMPARE(spy.count(), i + 1); + QCOMPARE(spy.last().at(0).toString(), completions.at(i)); + QCOMPARE(spy.last().at(1).toInt(), positions.at(i)); + } +} + +void tst_IrcCompleter::testReset() +{ + IrcBufferModel model(connection); + connection->open(); + waitForOpened(); + waitForWritten(tst_IrcData::welcome()); + waitForWritten(tst_IrcData::join()); + IrcChannel* channel = model.get(0)->toChannel(); + QVERIFY(channel); + + IrcCompleter completer; + completer.setBuffer(channel); + + QSignalSpy spy(&completer, SIGNAL(completed(QString,int))); + QVERIFY(spy.isValid()); + + completer.complete("Guest", 5); + QCOMPARE(spy.count(), 1); + QString guest1 = spy.last().at(0).toString(); + QVERIFY(guest1.startsWith("Guest")); + + completer.complete("Guest", 5); + QCOMPARE(spy.count(), 2); + QString guest2 = spy.last().at(0).toString(); + QVERIFY(guest2.startsWith("Guest")); + QVERIFY(guest2 != guest1); + + completer.reset(); + completer.complete("Guest", 5); + QCOMPARE(spy.count(), 3); + QString guest3 = spy.last().at(0).toString(); + QCOMPARE(guest3, guest1); +} + +QTEST_MAIN(tst_IrcCompleter) + +#include "tst_irccompleter.moc" diff --git a/src/libcommuni/tests/auto/ircconnection/ircconnection.pro b/src/libcommuni/tests/auto/ircconnection/ircconnection.pro new file mode 100644 index 0000000..f505a2b --- /dev/null +++ b/src/libcommuni/tests/auto/ircconnection/ircconnection.pro @@ -0,0 +1,11 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircconnection.cpp + +# FakeQmlConnection::createCtcpReply() +*g++*|*clang*:QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual + +include(../shared/shared.pri) +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircconnection/tst_ircconnection.cpp b/src/libcommuni/tests/auto/ircconnection/tst_ircconnection.cpp new file mode 100644 index 0000000..6f52b92 --- /dev/null +++ b/src/libcommuni/tests/auto/ircconnection/tst_ircconnection.cpp @@ -0,0 +1,1721 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "irc.h" +#include "irccommand.h" +#include "ircprotocol.h" +#include "ircconnection.h" +#include "ircmessage.h" +#include "ircfilter.h" +#include +#include +#include +#include +#ifndef QT_NO_OPENSSL +#include +#endif + +#include "tst_ircdata.h" +#include "tst_ircclientserver.h" + +class FriendlyConnection : public IrcConnection +{ + friend class tst_IrcConnection; +}; + +class TestProtocol : public IrcProtocol +{ +public: + TestProtocol(IrcConnection* connection) : IrcProtocol(connection) + { + } + + virtual bool write(const QByteArray& data) + { + written = data; + return IrcProtocol::write(data); + } + + QByteArray written; +}; + +class tst_IrcConnection : public tst_IrcClientServer +{ + Q_OBJECT + +private slots: + void testDefaults(); + + void testHost_data(); + void testHost(); + + void testPort_data(); + void testPort(); + + void testUserName_data(); + void testUserName(); + + void testNickName_data(); + void testNickName(); + + void testRealName_data(); + void testRealName(); + + void testPassword_data(); + void testPassword(); + + void testDisplayName_data(); + void testDisplayName(); + + void testEncoding_data(); + void testEncoding(); + + void testSocket_data(); + void testSocket(); + + void testSecure(); + void testSasl(); + void testNoSasl(); + void testSsl(); + + void testOpen(); + void testEnabled(); + + void testStatus(); + void testConnection(); + void testMessages(); + void testMessageFlags(); + void testMessageBuilder(); + + void testSendCommand(); + void testSendData(); + + void testMessageFilter(); + void testCommandFilter(); + + void testDebug(); + void testWarnings(); + + void testCtcp(); +}; + +void tst_IrcConnection::testDefaults() +{ + IrcConnection connection; + QVERIFY(connection.host().isNull()); + QCOMPARE(connection.port(), 6667); + QVERIFY(connection.userName().isNull()); + QVERIFY(connection.nickName().isNull()); + QVERIFY(connection.realName().isNull()); + QVERIFY(connection.password().isNull()); + QVERIFY(connection.displayName().isNull()); + QCOMPARE(connection.encoding(), QByteArray("ISO-8859-15")); + QCOMPARE(connection.status(), IrcConnection::Inactive); + QVERIFY(!connection.isActive()); + QVERIFY(!connection.isConnected()); + QVERIFY(connection.isEnabled()); + QCOMPARE(connection.reconnectDelay(), 0); + QVERIFY(connection.socket()); + QVERIFY(!connection.isSecure()); + QVERIFY(connection.saslMechanism().isNull()); + QVERIFY(!IrcConnection::supportedSaslMechanisms().isEmpty()); + QVERIFY(connection.network()); +} + +void tst_IrcConnection::testHost_data() +{ + QTest::addColumn("host"); + + QTest::newRow("null") << QString(); + QTest::newRow("empty") << QString(""); + QTest::newRow("space") << QString(" "); + QTest::newRow("invalid") << QString("invalid"); + QTest::newRow("local") << QString("127.0.0.1"); +} + +void tst_IrcConnection::testHost() +{ + QFETCH(QString, host); + + IrcConnection connection; + QSignalSpy spy(&connection, SIGNAL(hostChanged(QString))); + QVERIFY(spy.isValid()); + connection.setHost(host); + QCOMPARE(connection.host(), host); + QCOMPARE(spy.count(), !host.isEmpty() ? 1 : 0); + if (!spy.isEmpty()) + QCOMPARE(spy.first().first().toString(), host); + + IrcConnection another(host); + QCOMPARE(another.host(), host); +} + +void tst_IrcConnection::testPort_data() +{ + QTest::addColumn("port"); + + QTest::newRow("-1") << -1; + QTest::newRow("0") << 0; + QTest::newRow("6666") << 6666; + QTest::newRow("6667") << 6667; + QTest::newRow("6668") << 6668; +} + +void tst_IrcConnection::testPort() +{ + QFETCH(int, port); + + IrcConnection connection; + QSignalSpy spy(&connection, SIGNAL(portChanged(int))); + QVERIFY(spy.isValid()); + connection.setPort(port); + QCOMPARE(connection.port(), port); + QCOMPARE(spy.count(), port != 6667 ? 1 : 0); + if (!spy.isEmpty()) + QCOMPARE(spy.first().first().toInt(), port); +} + +void tst_IrcConnection::testUserName_data() +{ + QTest::addColumn("name"); + QTest::addColumn("result"); + + QTest::newRow("null") << QString() << QString(); + QTest::newRow("empty") << QString("") << QString(""); + QTest::newRow("space") << QString(" ") << QString(""); + QTest::newRow("spaces") << QString(" foo bar ") << QString("foo"); +} + +void tst_IrcConnection::testUserName() +{ + QFETCH(QString, name); + QFETCH(QString, result); + + IrcConnection connection; + QSignalSpy spy(&connection, SIGNAL(userNameChanged(QString))); + QVERIFY(spy.isValid()); + connection.setUserName(name); + QCOMPARE(connection.userName(), result); + QCOMPARE(spy.count(), !result.isEmpty() ? 1 : 0); + if (!spy.isEmpty()) + QCOMPARE(spy.first().first().toString(), result); +} + +void tst_IrcConnection::testNickName_data() +{ + QTest::addColumn("name"); + QTest::addColumn("result"); + + QTest::newRow("null") << QString() << QString(); + QTest::newRow("empty") << QString("") << QString(""); + QTest::newRow("space") << QString(" ") << QString(""); + QTest::newRow("spaces") << QString(" foo bar ") << QString("foo"); +} + +void tst_IrcConnection::testNickName() +{ + QFETCH(QString, name); + QFETCH(QString, result); + + IrcConnection connection; + QSignalSpy spy(&connection, SIGNAL(nickNameChanged(QString))); + QVERIFY(spy.isValid()); + connection.setNickName(name); + QCOMPARE(connection.nickName(), result); + QCOMPARE(spy.count(), !result.isEmpty() ? 1 : 0); + if (!spy.isEmpty()) + QCOMPARE(spy.first().first().toString(), result); +} + +void tst_IrcConnection::testRealName_data() +{ + QTest::addColumn("name"); + QTest::addColumn("result"); + + QTest::newRow("null") << QString() << QString(); + QTest::newRow("empty") << QString("") << QString(""); + QTest::newRow("space") << QString(" ") << QString(" "); + QTest::newRow("spaces") << QString(" foo bar ") << QString(" foo bar "); +} + +void tst_IrcConnection::testRealName() +{ + QFETCH(QString, name); + QFETCH(QString, result); + + IrcConnection connection; + QSignalSpy spy(&connection, SIGNAL(realNameChanged(QString))); + QVERIFY(spy.isValid()); + connection.setRealName(name); + QCOMPARE(connection.realName(), result); + QCOMPARE(spy.count(), !result.isEmpty() ? 1 : 0); + if (!spy.isEmpty()) + QCOMPARE(spy.first().first().toString(), result); +} + +void tst_IrcConnection::testPassword_data() +{ + QTest::addColumn("passwd"); + QTest::addColumn("result"); + + QTest::newRow("null") << QString() << QString(); + QTest::newRow("empty") << QString("") << QString(""); + QTest::newRow("space") << QString(" ") << QString(" "); + QTest::newRow("spaces") << QString(" foo bar ") << QString(" foo bar "); +} + +void tst_IrcConnection::testPassword() +{ + QFETCH(QString, passwd); + QFETCH(QString, result); + + IrcConnection connection; + QSignalSpy spy(&connection, SIGNAL(passwordChanged(QString))); + QVERIFY(spy.isValid()); + connection.setPassword(passwd); + QCOMPARE(connection.password(), result); + QCOMPARE(spy.count(), !result.isEmpty() ? 1 : 0); + if (!spy.isEmpty()) + QCOMPARE(spy.first().first().toString(), result); +} + +void tst_IrcConnection::testDisplayName_data() +{ + QTest::addColumn("host"); + QTest::addColumn("name"); + QTest::addColumn("result"); + + QTest::newRow("null") << QString() << QString() << QString(); + QTest::newRow("empty") << QString() << QString("") << QString(""); + QTest::newRow("space") << QString() << QString(" ") << QString(" "); + + QTest::newRow("host") << QString("host") << QString() << QString("host"); + QTest::newRow("name") << QString() << QString("name") << QString("name"); + QTest::newRow("explicit") << QString("host") << QString("name") << QString("name"); +} + +void tst_IrcConnection::testDisplayName() +{ + QFETCH(QString, host); + QFETCH(QString, name); + QFETCH(QString, result); + + IrcConnection connection; + connection.setHost(host); + connection.setDisplayName(name); + QCOMPARE(connection.displayName(), result); +} + +void tst_IrcConnection::testEncoding_data() +{ + QTest::addColumn("encoding"); + QTest::addColumn("actual"); + QTest::addColumn("supported"); + + QTest::newRow("null") << QByteArray() << QByteArray("ISO-8859-15") << false; + QTest::newRow("empty") << QByteArray("") << QByteArray("ISO-8859-15") << false; + QTest::newRow("space") << QByteArray(" ") << QByteArray("ISO-8859-15") << false; + QTest::newRow("invalid") << QByteArray("invalid") << QByteArray("ISO-8859-15") << false; + foreach (const QByteArray& codec, QTextCodec::availableCodecs()) + QTest::newRow(codec) << codec << codec << true; +} + +void tst_IrcConnection::testEncoding() +{ + QFETCH(QByteArray, encoding); + QFETCH(QByteArray, actual); + QFETCH(bool, supported); + + if (!supported) + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setEncoding(): unsupported encoding \"" + encoding + "\" "); + + IrcConnection connection; + connection.setEncoding(encoding); + QCOMPARE(connection.encoding(), actual); +} + +Q_DECLARE_METATYPE(QAbstractSocket*) +void tst_IrcConnection::testSocket_data() +{ + QTest::addColumn("socket"); + + QTest::newRow("null") << static_cast(0); + QTest::newRow("tcp") << static_cast(new QTcpSocket(this)); +#ifndef QT_NO_OPENSSL + QTest::newRow("ssl") << static_cast(new QSslSocket(this)); +#endif +} + +void tst_IrcConnection::testSocket() +{ + QFETCH(QAbstractSocket*, socket); + + IrcConnection connection; + connection.setSocket(socket); + QCOMPARE(connection.socket(), socket); + QCOMPARE(connection.isSecure(), socket && socket->inherits("QSslSocket")); +} + +void tst_IrcConnection::testSecure() +{ + IrcConnection connection; + QSignalSpy spy(&connection, SIGNAL(secureChanged(bool))); + QVERIFY(spy.isValid()); + QVERIFY(!connection.isSecure()); + +#ifdef QT_NO_OPENSSL + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setSecure(): the Qt build does not support SSL"); +#endif + + connection.setSecure(true); + +#ifndef QT_NO_OPENSSL + QVERIFY(connection.isSecure()); + QVERIFY(connection.socket()->inherits("QSslSocket")); + QCOMPARE(spy.count(), 1); + QVERIFY(spy.first().first().toBool()); +#else + QVERIFY(!connection.isSecure()); + QVERIFY(!connection.socket()->inherits("QSslSocket")); + QCOMPARE(spy.count(), 0); +#endif + + connection.setSecure(false); + QVERIFY(!connection.isSecure()); + QVERIFY(!connection.socket()->inherits("QSslSocket")); +#ifndef QT_NO_OPENSSL + QCOMPARE(spy.count(), 2); + QVERIFY(!spy.last().last().toBool()); +#else + QCOMPARE(spy.count(), 0); +#endif +} + +void tst_IrcConnection::testSasl() +{ + QVERIFY(!IrcConnection::supportedSaslMechanisms().contains("UNKNOWN")); + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setSaslMechanism(): unsupported mechanism: 'UNKNOWN'"); + connection->setSaslMechanism("UNKNOWN"); + QVERIFY(connection->saslMechanism().isEmpty()); + + IrcProtocol* protocol = static_cast(connection.data())->protocol(); + QVERIFY(protocol); + + QVERIFY(IrcConnection::supportedSaslMechanisms().contains("PLAIN")); + connection->setSaslMechanism("PLAIN"); + QCOMPARE(connection->saslMechanism(), QString("PLAIN")); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(clientSocket->waitForBytesWritten(1000)); + QVERIFY(serverSocket->waitForReadyRead(1000)); + QByteArray written = serverSocket->readAll(); + QVERIFY(written.contains("CAP LS")); + QVERIFY(written.contains("NICK nick")); + QVERIFY(!written.contains("PASS secret")); + QVERIFY(!written.contains("CAP REQ :sasl")); + + QVERIFY(waitForWritten(":irc.freenode.net CAP * LS :sasl")); + QVERIFY(clientSocket->waitForBytesWritten(1000)); + QVERIFY(serverSocket->waitForReadyRead(1000)); + written = serverSocket->readAll(); + QVERIFY(!written.contains("CAP LS")); + QVERIFY(!written.contains("NICK nick")); + QVERIFY(!written.contains("PASS secret")); + QVERIFY(written.contains("CAP REQ :sasl")); + + // do not resume handshake too early + QCoreApplication::sendPostedEvents(protocol, QEvent::MetaCall); + QVERIFY(!clientSocket->waitForBytesWritten(1000)); + + QVERIFY(waitForWritten(":irc.freenode.net CAP user ACK :sasl")); + QVERIFY(clientSocket->waitForBytesWritten(1000)); + QVERIFY(serverSocket->waitForReadyRead(1000)); + QVERIFY(serverSocket->readAll().contains("AUTHENTICATE PLAIN")); + + QVERIFY(waitForWritten("AUTHENTICATE +")); + QVERIFY(clientSocket->waitForBytesWritten(1000)); + QVERIFY(serverSocket->waitForReadyRead(1000)); + + QByteArray response = serverSocket->readAll(); + int index = response.indexOf("AUTHENTICATE"); + QVERIFY(index != -1); + QByteArray secret = response.mid(index + 13); + index = secret.indexOf("\r\n"); + QVERIFY(index != -1); + secret.truncate(index + 1); + secret = QByteArray::fromBase64(secret); + QByteArray expected = connection->userName().toUtf8() + '\0' + + connection->userName().toUtf8() + '\0' + + connection->password().toUtf8(); + QCOMPARE(secret, expected); + + // resume handshake + QCoreApplication::sendPostedEvents(protocol, QEvent::MetaCall); + + QVERIFY(clientSocket->waitForBytesWritten(1000)); + QVERIFY(serverSocket->waitForReadyRead(1000)); + QVERIFY(serverSocket->readAll().contains("CAP END")); + + // TODO: + QVERIFY(waitForWritten(":irc.freenode.net 900 user nick!user@host nick :You are now logged in as user.")); + QVERIFY(waitForWritten(":irc.freenode.net 903 user :SASL authentication successful")); + QVERIFY(waitForWritten(":irc.freenode.net 001 user :Welcome to the freenode Internet Relay Chat Network user")); +} + +void tst_IrcConnection::testNoSasl() +{ + QVERIFY(!IrcConnection::supportedSaslMechanisms().contains("UNKNOWN")); + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setSaslMechanism(): unsupported mechanism: 'UNKNOWN'"); + connection->setSaslMechanism("UNKNOWN"); + QVERIFY(connection->saslMechanism().isEmpty()); + + IrcProtocol* protocol = static_cast(connection.data())->protocol(); + QVERIFY(protocol); + + QVERIFY(IrcConnection::supportedSaslMechanisms().contains("PLAIN")); + connection->setSaslMechanism("PLAIN"); + QCOMPARE(connection->saslMechanism(), QString("PLAIN")); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(clientSocket->waitForBytesWritten(1000)); + QVERIFY(serverSocket->waitForReadyRead(1000)); + QByteArray written = serverSocket->readAll(); + QVERIFY(written.contains("CAP LS")); + QVERIFY(written.contains("NICK nick")); + QVERIFY(!written.contains("PASS secret")); + QVERIFY(!written.contains("CAP REQ :sasl")); + + QVERIFY(waitForWritten(":irc.freenode.net CAP * LS :no s-a-s-l here")); + QVERIFY(!clientSocket->waitForBytesWritten(1000)); + QVERIFY(!serverSocket->waitForReadyRead(1000)); + QVERIFY(serverSocket->readAll().isEmpty()); + + // resume handshake + QCoreApplication::sendPostedEvents(protocol, QEvent::MetaCall); + QVERIFY(clientSocket->waitForBytesWritten(1000)); + QVERIFY(serverSocket->waitForReadyRead(1000)); + written = serverSocket->readAll(); + QVERIFY(written.contains("PASS secret")); + QVERIFY(written.contains("CAP END")); +} + +#ifndef QT_NO_OPENSSL +class SslSocket : public QSslSocket +{ + Q_OBJECT + +public: + SslSocket(QObject* parent) : QSslSocket(parent), clientEncryptionStarted(false) { } + bool clientEncryptionStarted; + +public slots: + void startClientEncryption() + { + clientEncryptionStarted = true; + QSslSocket::startClientEncryption(); + } +}; +#endif // !QT_NO_OPENSSL + +void tst_IrcConnection::testSsl() +{ +#ifndef QT_NO_OPENSSL + SslSocket* socket = new SslSocket(connection); + connection->setSocket(socket); + QCOMPARE(connection->socket(), socket); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(socket->clientEncryptionStarted); +#endif // !QT_NO_OPENSSL +} + +void tst_IrcConnection::testOpen() +{ + IrcConnection connection; + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::open(): host is empty!"); + connection.open(); + QCOMPARE(connection.status(), IrcConnection::Inactive); + + connection.setHost("irc.ser.ver"); + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::open(): userName is empty!"); + connection.open(); + QCOMPARE(connection.status(), IrcConnection::Inactive); + + connection.setUserName("user"); + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::open(): nickName is empty!"); + connection.open(); + QCOMPARE(connection.status(), IrcConnection::Inactive); + + connection.setNickName("nick"); + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::open(): realName is empty!"); + connection.open(); + QCOMPARE(connection.status(), IrcConnection::Inactive); + + connection.setRealName("real"); + connection.open(); + QVERIFY(connection.status() != IrcConnection::Inactive); + + connection.close(); + QCOMPARE(connection.status(), IrcConnection::Closed); + + connection.setEnabled(false); + connection.open(); + QCOMPARE(connection.status(), IrcConnection::Closed); +} + +void tst_IrcConnection::testEnabled() +{ + IrcConnection connection; + QVERIFY(connection.isEnabled()); + + QSignalSpy spy(&connection, SIGNAL(enabledChanged(bool))); + QVERIFY(spy.isValid()); + + connection.setEnabled(false); + QVERIFY(!connection.isEnabled()); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.last().at(0).toBool(), false); + + connection.setDisabled(true); + QVERIFY(!connection.isEnabled()); + QCOMPARE(spy.count(), 1); + + connection.setDisabled(false); + QVERIFY(connection.isEnabled()); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.last().at(0).toBool(), true); + + connection.setEnabled(true); + QVERIFY(connection.isEnabled()); + QCOMPARE(spy.count(), 2); +} + +void tst_IrcConnection::testStatus() +{ + Irc::registerMetaTypes(); + + QSignalSpy statusSpy(connection, SIGNAL(statusChanged(IrcConnection::Status))); + QSignalSpy connectingSpy(connection, SIGNAL(connecting())); + QSignalSpy connectedSpy(connection, SIGNAL(connected())); + QSignalSpy disconnectedSpy(connection, SIGNAL(disconnected())); + + QVERIFY(statusSpy.isValid()); + QVERIFY(connectingSpy.isValid()); + QVERIFY(connectedSpy.isValid()); + QVERIFY(disconnectedSpy.isValid()); + + int statusCount = 0; + int connectingCount = 0; + int connectedCount = 0; + int disconnectedCount = 0; + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connecting); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connecting); + QCOMPARE(connectingSpy.count(), ++connectingCount); + + QVERIFY(waitForWritten(tst_IrcData::welcome())); + QVERIFY(connection->isActive()); + QVERIFY(connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connected); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connected); + QCOMPARE(connectedSpy.count(), ++connectedCount); + + clientSocket->close(); + QVERIFY(connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Closing); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Closing); + + connection->close(); + QVERIFY(!connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Closed); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Closed); + QCOMPARE(disconnectedSpy.count(), ++disconnectedCount); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connecting); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connecting); + QCOMPARE(connectingSpy.count(), ++connectingCount); + + QVERIFY(waitForWritten(tst_IrcData::welcome())); + QVERIFY(connection->isActive()); + QVERIFY(connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connected); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connected); + QCOMPARE(connectedSpy.count(), ++connectedCount); + + // trigger an error + serverSocket->close(); + QVERIFY(clientSocket->waitForDisconnected(100)); + QVERIFY(!connection->isConnected()); + QVERIFY(!connection->isActive()); + + QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Error); + QCOMPARE(statusSpy.count(), statusCount); + + connection->close(); + QVERIFY(!connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Closed); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Closed); + QCOMPARE(disconnectedSpy.count(), ++disconnectedCount); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connecting); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connecting); + QCOMPARE(connectingSpy.count(), ++connectingCount); + + QVERIFY(waitForWritten(tst_IrcData::welcome())); + QVERIFY(connection->isActive()); + QVERIFY(connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connected); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connected); + QCOMPARE(connectedSpy.count(), ++connectedCount); + + // trigger an error - automatic reconnect + connection->setReconnectDelay(1); + serverSocket->close(); + QVERIFY(clientSocket->waitForDisconnected(100)); + QVERIFY(!connection->isConnected()); + QVERIFY(!connection->isActive()); + + QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Error); + QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Waiting); + QCOMPARE(statusSpy.count(), statusCount); + + QEventLoop reconnectLoop; + QTimer::singleShot(2000, &reconnectLoop, SLOT(quit())); + connect(connection, SIGNAL(statusChanged(IrcConnection::Status)), &reconnectLoop, SLOT(quit())); + reconnectLoop.exec(); + + QVERIFY(connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connecting); + QCOMPARE(statusSpy.count(), ++statusCount); + QCOMPARE(statusSpy.last().at(0).value(), IrcConnection::Connecting); + + QVERIFY(waitForOpened()); + QCOMPARE(connectingSpy.count(), ++connectingCount); + + // trigger an error _after_ quit -> no automatic reconnect + connection->quit(); + serverSocket->close(); + QVERIFY(clientSocket->waitForDisconnected(100)); + QVERIFY(!connection->isConnected()); + QVERIFY(!connection->isActive()); + QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Closing); + QCOMPARE(statusSpy.at(statusCount++).at(0).value(), IrcConnection::Closed); + QCOMPARE(statusSpy.count(), statusCount); +} + +void tst_IrcConnection::testConnection() +{ + Irc::registerMetaTypes(); + + TestProtocol* protocol = new TestProtocol(connection); + FriendlyConnection* friendly = static_cast(connection.data()); + friendly->setProtocol(protocol); + QCOMPARE(friendly->protocol(), protocol); + QCOMPARE(protocol->connection(), connection.data()); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connecting); + + QVERIFY(waitForWritten(":irc.ser.ver 001 nick :Welcome to the Internet Relay Chat Network nick")); + QVERIFY(connection->isActive()); + QVERIFY(connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connected); + + connection->close(); + QVERIFY(!connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Closed); + + // don't open when disabled + connection->setEnabled(false); + connection->open(); + QVERIFY(!connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Closed); + + // re-enable + connection->setEnabled(true); + connection->open(); + QVERIFY(connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connecting); + + QVERIFY(waitForOpened()); + + protocol->written.clear(); + connection->network()->requestCapability("identify-msg"); + QVERIFY(protocol->written.contains("CAP REQ")); + QVERIFY(protocol->written.contains("identify-msg")); + + protocol->written.clear(); + connection->network()->requestCapabilities(QStringList() << "sasl" << "communi"); + QVERIFY(protocol->written.contains("CAP REQ")); + QVERIFY(protocol->written.contains("sasl")); + QVERIFY(protocol->written.contains("communi")); + + QVERIFY(waitForWritten(":irc.ser.ver 001 nick :Welcome to the Internet Relay Chat Network nick")); + QVERIFY(connection->isActive()); + QVERIFY(connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Connected); + + protocol->written.clear(); + connection->setNickName("communi"); + QVERIFY(protocol->written.contains("NICK")); + QVERIFY(protocol->written.contains("communi")); + + protocol->written.clear(); + connection->quit(); + QVERIFY(protocol->written.contains("QUIT")); + + connection->close(); + QVERIFY(!connection->isActive()); + QVERIFY(!connection->isConnected()); + QCOMPARE(connection->status(), IrcConnection::Closed); +} + +class NickChanger : public QObject +{ + Q_OBJECT + +public: + NickChanger(IrcConnection* connection) : QObject(connection) + { + connect(connection, SIGNAL(nickNameReserved(QString*)), SLOT(onNickNameReserved(QString*))); + } + + QString setAlternate; + QString passedAlternate; + +public slots: + void onNickNameReserved(QString* alternate) + { + Q_ASSERT(alternate); + passedAlternate = *alternate; + *alternate = setAlternate; + } +}; + +Q_DECLARE_METATYPE(QString*) +void tst_IrcConnection::testMessages() +{ + Irc::registerMetaTypes(); + qRegisterMetaType(); + + QSignalSpy messageSpy(connection, SIGNAL(messageReceived(IrcMessage*))); + QSignalSpy capabilityMessageSpy(connection, SIGNAL(capabilityMessageReceived(IrcCapabilityMessage*))); + QSignalSpy errorMessageSpy(connection, SIGNAL(errorMessageReceived(IrcErrorMessage*))); + QSignalSpy inviteMessageSpy(connection, SIGNAL(inviteMessageReceived(IrcInviteMessage*))); + QSignalSpy joinMessageSpy(connection, SIGNAL(joinMessageReceived(IrcJoinMessage*))); + QSignalSpy kickMessageSpy(connection, SIGNAL(kickMessageReceived(IrcKickMessage*))); + QSignalSpy modeMessageSpy(connection, SIGNAL(modeMessageReceived(IrcModeMessage*))); + QSignalSpy namesMessageSpy(connection, SIGNAL(namesMessageReceived(IrcNamesMessage*))); + QSignalSpy nickMessageSpy(connection, SIGNAL(nickMessageReceived(IrcNickMessage*))); + QSignalSpy noticeMessageSpy(connection, SIGNAL(noticeMessageReceived(IrcNoticeMessage*))); + QSignalSpy numericMessageSpy(connection, SIGNAL(numericMessageReceived(IrcNumericMessage*))); + QSignalSpy motdMessageSpy(connection, SIGNAL(motdMessageReceived(IrcMotdMessage*))); + QSignalSpy partMessageSpy(connection, SIGNAL(partMessageReceived(IrcPartMessage*))); + QSignalSpy pingMessageSpy(connection, SIGNAL(pingMessageReceived(IrcPingMessage*))); + QSignalSpy pongMessageSpy(connection, SIGNAL(pongMessageReceived(IrcPongMessage*))); + QSignalSpy privateMessageSpy(connection, SIGNAL(privateMessageReceived(IrcPrivateMessage*))); + QSignalSpy quitMessageSpy(connection, SIGNAL(quitMessageReceived(IrcQuitMessage*))); + QSignalSpy topicMessageSpy(connection, SIGNAL(topicMessageReceived(IrcTopicMessage*))); + QSignalSpy whoReplyMessageSpy(connection, SIGNAL(whoReplyMessageReceived(IrcWhoReplyMessage*))); + + QVERIFY(messageSpy.isValid()); + QVERIFY(capabilityMessageSpy.isValid()); + QVERIFY(errorMessageSpy.isValid()); + QVERIFY(inviteMessageSpy.isValid()); + QVERIFY(joinMessageSpy.isValid()); + QVERIFY(kickMessageSpy.isValid()); + QVERIFY(modeMessageSpy.isValid()); + QVERIFY(namesMessageSpy.isValid()); + QVERIFY(nickMessageSpy.isValid()); + QVERIFY(noticeMessageSpy.isValid()); + QVERIFY(numericMessageSpy.isValid()); + QVERIFY(motdMessageSpy.isValid()); + QVERIFY(partMessageSpy.isValid()); + QVERIFY(pingMessageSpy.isValid()); + QVERIFY(pongMessageSpy.isValid()); + QVERIFY(privateMessageSpy.isValid()); + QVERIFY(quitMessageSpy.isValid()); + QVERIFY(topicMessageSpy.isValid()); + QVERIFY(whoReplyMessageSpy.isValid()); + + int messageCount = 0; + int numericMessageCount = 0; + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(":moorcock.freenode.net CAP * LS :account-notify extended-join identify-msg multi-prefix sasl")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(capabilityMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":moorcock.freenode.net 001 communi :Welcome to the freenode Internet Relay Chat Network communi")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=freenode KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 375 communi :- moorcock.freenode.net Message of the Day -")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 372 communi :- Welcome to moorcock.freenode.net in ...")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 376 communi :End of /MOTD command.")); + messageCount += 2; // RPL_ENDOFMOTD + IrcMotdMessage + QCOMPARE(messageSpy.count(), messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + QCOMPARE(motdMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN #freenode")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(joinMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":moorcock.freenode.net 332 communi #freenode :Welcome to #freenode | Staff are voiced; some may also be on /stats p -- feel free to /msg us at any time | FAQ: http://freenode.net/faq.shtml | Unwelcome queries? Use /mode your_nick +R to block them. | Channel guidelines: http://freenode.net/poundfreenode.shtml | Blog: http://blog.freenode.net | Please don't comment on spam/trolls.")); + messageCount += 2; // RPL_TOPIC & IrcTopicMessage + QCOMPARE(messageSpy.count(), messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + QCOMPARE(topicMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":moorcock.freenode.net 333 communi #freenode erry 1379357591")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 353 communi = #freenode :communi straterra absk007 pefn xlys Gromit TooCool Sambler gat0rs KarneAsada danis_963 Kiryx chrismeller deefloo black_male sxlnxdx bjork Kinny phobos_anomaly T13|sleeps JuxTApose Kolega2357 rorx techhelper1 hermatize Azimi iqualfragile fwilson skasturi mwallacesd mayday Guest76549 mcjohansen MangaKaDenza ARISTIDES ketas `- claptor ylluminate Cooky Brand3n cheater_1 Kirito digitaloktay Will| Iarfen abrotman smurfy Inaunt +mist Karol RougeR_")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 353 communi = #freenode :publickeating An_Ony_Moose michagogo Guest915` davidfg4 Ragnor s1lent_1 keee GingerGeek[Away] hibari derp S_T_A_N anonymuse asantoni road|runner LLckfan neoian2 aviancarrier nipples danieldaniel Pyrus Bry8Star shadowm_desktop furtardo rdymac TTSDA seaworthy Chiyo yscc Zombiebaron redpill f4cl3y Boohbah applebloom zorael kameloso^ Zetetic XAMPP wheels_up Cuppy-Cake mindlessjohnny Kymru mquin_ Rodja babilen kirin` David Affix jshyeung_ DarkAceZ karakedi")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 366 communi #freenode :End of /NAMES list.")); + messageCount += 2; // RPL_ENDOFNAMES & IrcNamesMessage + QCOMPARE(messageSpy.count(), messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + QCOMPARE(namesMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":ChanServ!ChanServ@services. NOTICE communi :[#freenode] Welcome to #freenode. All network staff are voiced in here, but may not always be around - type /stats p to get a list of on call staff. Others may be hiding so do feel free to ping and /msg us at will! Also please read the channel guidelines at http://freenode.net/poundfreenode.shtml - thanks.")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(noticeMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":services. 328 communi #freenode :http://freenode.net/")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + + QVERIFY(waitForWritten("PING :moorcock.freenode.net")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(pingMessageSpy.count(), 1); + + QVERIFY(waitForWritten("PONG :moorcock.freenode.net")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(pongMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi INVITE Communi84194 :#communi")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(inviteMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":Communi84194!ident@host NICK :communi")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(nickMessageSpy.count(), 1); + + // own nick name changes + QSignalSpy nickNameChangedSpy(connection, SIGNAL(nickNameChanged(QString))); + QVERIFY(nickNameChangedSpy.isValid()); + QVERIFY(waitForWritten(":communi!user@host NICK :own")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(nickMessageSpy.count(), 2); + QCOMPARE(connection->nickName(), QString("own")); + QCOMPARE(nickNameChangedSpy.count(), 1); + QCOMPARE(nickNameChangedSpy.last().at(0).toString(), QString("own")); + + // nick in use + QString prevNick = connection->nickName(); + NickChanger changer(connection); + changer.setAlternate = "communi_"; + QSignalSpy nickNameReservedSpy(connection, SIGNAL(nickNameReserved(QString*))); + QVERIFY(nickNameReservedSpy.isValid()); + QVERIFY(waitForWritten(":moorcock.freenode.net 433 * communi :Nickname is already in use.")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + QCOMPARE(nickNameReservedSpy.count(), 1); + QCOMPARE(changer.passedAlternate, prevNick); + + QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi MODE #communi +v communi")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(modeMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":moorcock.freenode.net 324 communi #communi +ms")); + messageCount += 2; // RPL_CHANNELMODEIS + IrcModeMessage + QCOMPARE(messageSpy.count(), messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + QCOMPARE(modeMessageSpy.count(), 2); + + QVERIFY(waitForWritten(":qtassistant!jpnurmi@qt/jpnurmi/bot/qtassistant PART #communi")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(partMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi PRIVMSG #communi :hello")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(privateMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi QUIT :Client Quit")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(quitMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi KICK #communi communi")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(kickMessageSpy.count(), 1); + + QVERIFY(waitForWritten("ERROR :just testing...")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(errorMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":hobana.freenode.net 352 communi #communi ChanServ services. services. ChanServ H@ :0 Channel Services" )); + messageCount += 2; // RPL_WHOREPLY + IrcWhoReplyMessage + QCOMPARE(messageSpy.count(), messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + QCOMPARE(whoReplyMessageSpy.count(), 1); + + QVERIFY(waitForWritten(":hobana.freenode.net 315 communi #communi :End of /WHO list.")); + QCOMPARE(messageSpy.count(), ++messageCount); + QCOMPARE(numericMessageSpy.count(), ++numericMessageCount); + QCOMPARE(whoReplyMessageSpy.count(), 1); +} + +class MsgFilter : public QObject, public IrcMessageFilter +{ + Q_OBJECT + Q_INTERFACES(IrcMessageFilter) + +public: + MsgFilter() : count(0), type(IrcMessage::Unknown), flags(IrcMessage::None) + { + } + + bool messageFilter(IrcMessage* message) + { + ++count; + type = message->type(); + flags = message->flags(); + value = message->property(property); + return false; + } + +public: + int count; + QVariant value; + QByteArray property; + IrcMessage::Type type; + IrcMessage::Flags flags; +}; + +void tst_IrcConnection::testMessageFlags() +{ + connection->open(); + QVERIFY(waitForOpened()); + + int count = 0; + MsgFilter filter; + connection->installMessageFilter(&filter); + + QVERIFY(waitForWritten(":server CAP * LS :identify-msg")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Capability); + QCOMPARE(filter.flags, IrcMessage::None); + + QVERIFY(waitForWritten(":server CAP communi ACK :identify-msg")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Capability); + QCOMPARE(filter.flags, IrcMessage::None); + + QVERIFY(waitForWritten(":server 001 communi :Welcome...")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Numeric); + QCOMPARE(filter.flags, IrcMessage::None); + + QVERIFY(waitForWritten(":server 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=fake KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Numeric); + QCOMPARE(filter.flags, IrcMessage::None); + + QVERIFY(waitForWritten(":server 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Numeric); + QCOMPARE(filter.flags, IrcMessage::None); + + QVERIFY(waitForWritten(":server 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Numeric); + QCOMPARE(filter.flags, IrcMessage::None); + + filter.property = "content"; + QVERIFY(waitForWritten(":communi!ident@host PRIVMSG #communi :hi all")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Private); + QCOMPARE(filter.flags, IrcMessage::Own); + QCOMPARE(filter.value.toString(), QString("hi all")); + + filter.property = "content"; + QVERIFY(waitForWritten(":jpnurmi!ident@host PRIVMSG #communi :+hello there, communi")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Private); + QCOMPARE(filter.flags, IrcMessage::Identified); + QCOMPARE(filter.value.toString(), QString("hello there, communi")); + + filter.property = "content"; + QVERIFY(waitForWritten(":Guest1234!ident@host PRIVMSG #communi :-hi communi")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Private); + QCOMPARE(filter.flags, IrcMessage::Unidentified); + QCOMPARE(filter.value.toString(), QString("hi communi")); + + filter.property = "content"; + QVERIFY(waitForWritten(":communi!ident@host NOTICE #communi :hi all")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Notice); + QCOMPARE(filter.flags, IrcMessage::Own); + QCOMPARE(filter.value.toString(), QString("hi all")); + + filter.property = "content"; + QVERIFY(waitForWritten(":jpnurmi!ident@host NOTICE #communi :+hello there, communi")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Notice); + QCOMPARE(filter.flags, IrcMessage::Identified); + QCOMPARE(filter.value.toString(), QString("hello there, communi")); + + filter.property = "content"; + QVERIFY(waitForWritten(":Guest1234!ident@host NOTICE #communi :-hi communi")); + QCOMPARE(filter.count, ++count); + QCOMPARE(filter.type, IrcMessage::Notice); + QCOMPARE(filter.flags, IrcMessage::Unidentified); + QCOMPARE(filter.value.toString(), QString("hi communi")); +} + +void tst_IrcConnection::testMessageBuilder() +{ + connection->open(); + QVERIFY(waitForOpened()); + + MsgFilter filter; + connection->installMessageFilter(&filter); + + QVERIFY(waitForWritten(":my.irc.ser.ver 001 communi :Welcome...")); + QVERIFY(waitForWritten(":my.irc.ser.ver 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=fake KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server")); + QVERIFY(waitForWritten(":my.irc.ser.ver 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server")); + QVERIFY(waitForWritten(":my.irc.ser.ver 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server")); + + filter.property = "mask"; + QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); + QCOMPARE(filter.value.toString(), QString("#communi")); + + filter.property = "ident"; + QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); + QCOMPARE(filter.value.toString(), QString("~jpnurmi")); + + filter.property = "host"; + QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); + QCOMPARE(filter.value.toString(), QString("qt/jpnurmi")); + + filter.property = "server"; + QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); + QCOMPARE(filter.value.toString(), QString("his.irc.ser.ver")); + + filter.property = "nick"; + QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); + QCOMPARE(filter.value.toString(), QString("jpnurmi")); + + filter.property = "away"; + QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); + QCOMPARE(filter.value.toBool(), true); + + filter.property = "servOp"; + QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); + QCOMPARE(filter.value.toBool(), true); + + filter.property = "realName"; + QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0 J-P Nurmi")); + QCOMPARE(filter.value.toString(), QString("J-P Nurmi")); + + filter.property = "realName"; + QVERIFY(waitForWritten(":my.irc.ser.ver 352 communi #communi ~jpnurmi qt/jpnurmi his.irc.ser.ver jpnurmi G*@ :0")); + QCOMPARE(filter.value.toString(), QString()); +} + +void tst_IrcConnection::testSendCommand() +{ + IrcConnection conn; + QVERIFY(!conn.sendCommand(0)); + QVERIFY(!conn.sendCommand(IrcCommand::createQuit())); + + TestProtocol* protocol = new TestProtocol(connection); + FriendlyConnection* friendly = static_cast(connection.data()); + friendly->setProtocol(protocol); + QCOMPARE(friendly->protocol(), protocol); + QCOMPARE(protocol->connection(), connection.data()); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(connection->sendCommand(IrcCommand::createQuit())); + QVERIFY(!connection->sendCommand(0)); + QVERIFY(protocol->written.contains("QUIT")); +} + +void tst_IrcConnection::testSendData() +{ + IrcConnection conn; + QVERIFY(!conn.sendData("QUIT")); + + TestProtocol* protocol = new TestProtocol(connection); + FriendlyConnection* friendly = static_cast(connection.data()); + friendly->setProtocol(protocol); + QCOMPARE(friendly->protocol(), protocol); + QCOMPARE(protocol->connection(), connection.data()); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(connection->sendData("QUIT")); + QVERIFY(protocol->written.contains("QUIT")); +} + +class TestFilter : public QObject, public IrcMessageFilter, public IrcCommandFilter +{ + Q_OBJECT + Q_INTERFACES(IrcMessageFilter IrcCommandFilter) + +public: + void clear() + { + commitSuicide = false; + messageFiltered = 0; + commandFiltered = 0; + messageFilterEnabled = false; + commandFilterEnabled = false; + } + + bool messageFilter(IrcMessage*) + { + ++messageFiltered; + if (commitSuicide) + delete this; + return messageFilterEnabled; + } + + bool commandFilter(IrcCommand*) + { + ++commandFiltered; + if (commitSuicide) + delete this; + return commandFilterEnabled; + } + + bool commitSuicide; + int messageFiltered; + int commandFiltered; + bool messageFilterEnabled; + bool commandFilterEnabled; +}; + +void tst_IrcConnection::testMessageFilter() +{ + Irc::registerMetaTypes(); + + QSignalSpy messageSpy(connection, SIGNAL(messageReceived(IrcMessage*))); + QVERIFY(messageSpy.isValid()); + int messageCount = 0; + + TestFilter filter1; + QScopedPointer filter2(new TestFilter); + QScopedPointer filter3(new TestFilter); + + filter1.clear(); filter2->clear(); filter3->clear(); + + connection->installMessageFilter(&filter1); + connection->installMessageFilter(filter2.data()); + connection->installMessageFilter(filter3.data()); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(":moorcock.freenode.net 001 communi :Welcome to the freenode Internet Relay Chat Network communi")); + QCOMPARE(filter1.messageFiltered, 1); + QCOMPARE(filter2->messageFiltered, 1); + QCOMPARE(filter3->messageFiltered, 1); + QCOMPARE(messageSpy.count(), ++messageCount); + + filter1.clear(); filter2->clear(); filter3->clear(); + filter3->messageFilterEnabled = true; + + QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=freenode KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server")); + QCOMPARE(filter1.messageFiltered, 0); + QCOMPARE(filter2->messageFiltered, 0); + QCOMPARE(filter3->messageFiltered, 1); + QCOMPARE(messageSpy.count(), messageCount); + + filter1.clear(); filter2->clear(); filter3->clear(); + filter2->messageFilterEnabled = true; + + QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server")); + QCOMPARE(filter1.messageFiltered, 0); + QCOMPARE(filter2->messageFiltered, 1); + QCOMPARE(filter3->messageFiltered, 1); + QCOMPARE(messageSpy.count(), messageCount); + + filter1.clear(); filter2->clear(); filter3->clear(); + filter1.messageFilterEnabled = true; + + QVERIFY(waitForWritten(":moorcock.freenode.net 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server")); + QCOMPARE(filter1.messageFiltered, 1); + QCOMPARE(filter2->messageFiltered, 1); + QCOMPARE(filter3->messageFiltered, 1); + QCOMPARE(messageSpy.count(), messageCount); + + filter1.clear(); filter2->clear(); filter3->clear(); + + QVERIFY(waitForWritten(":moorcock.freenode.net 375 communi :- moorcock.freenode.net Message of the Day -")); + QCOMPARE(filter1.messageFiltered, 1); + QCOMPARE(filter2->messageFiltered, 1); + QCOMPARE(filter3->messageFiltered, 1); + QCOMPARE(messageSpy.count(), ++messageCount); + + // a deleted filter gets removed + filter2.reset(); + filter1.clear(); filter3->clear(); + + QVERIFY(waitForWritten(":moorcock.freenode.net 372 communi :- Welcome to moorcock.freenode.net in ...")); + QCOMPARE(filter1.messageFiltered, 1); + QCOMPARE(filter3->messageFiltered, 1); + QCOMPARE(messageSpy.count(), ++messageCount); + + QVERIFY(waitForWritten(":moorcock.freenode.net 376 communi :End of /MOTD command.")); + messageCount += 2; // RPL_ENDOFMOTD + IrcMotdMessage + QCOMPARE(messageSpy.count(), messageCount); + + // double filters + connection->installMessageFilter(&filter1); + connection->installMessageFilter(filter3.data()); + filter1.clear(); filter3->clear(); + + QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN #freenode")); + QCOMPARE(filter1.messageFiltered, 2); + QCOMPARE(filter3->messageFiltered, 2); + QCOMPARE(messageSpy.count(), ++messageCount); + + // remove & enable double filter + filter1.clear(); filter3->clear(); + filter1.messageFilterEnabled = true; + connection->removeMessageFilter(filter3.data()); + + QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN #communi")); + QCOMPARE(filter1.messageFiltered, 1); + QCOMPARE(filter3->messageFiltered, 0); + QCOMPARE(messageSpy.count(), messageCount); + + // remove & delete + filter3.reset(); + filter1.clear(); + connection->removeMessageFilter(&filter1); + + QVERIFY(waitForWritten(":communi!~communi@hidd.en PART #communi")); + QCOMPARE(filter1.messageFiltered, 0); + QCOMPARE(messageSpy.count(), ++messageCount); + + // commit a suicide & filter + QPointer suicidal1 = new TestFilter; + connection->installMessageFilter(suicidal1); + suicidal1->clear(); + suicidal1->messageFilterEnabled = true; + suicidal1->commitSuicide = true; + + QVERIFY(waitForWritten(":communi!~communi@hidd.en PART #freenode")); + QCOMPARE(messageSpy.count(), messageCount); + QVERIFY(!suicidal1); + + // commit a suicide & don't filter + QPointer suicidal2 = new TestFilter; + connection->installMessageFilter(suicidal2); + suicidal2->clear(); + suicidal2->commitSuicide = true; + + QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN #qt")); + QVERIFY(!suicidal2); +} + +void tst_IrcConnection::testCommandFilter() +{ + TestProtocol* protocol = new TestProtocol(connection); + FriendlyConnection* friendly = static_cast(connection.data()); + friendly->setProtocol(protocol); + QCOMPARE(friendly->protocol(), protocol); + QCOMPARE(protocol->connection(), connection.data()); + + TestFilter filter1; + QScopedPointer filter2(new TestFilter); + QScopedPointer filter3(new TestFilter); + + filter1.clear(); filter2->clear(); filter3->clear(); + + connection->installCommandFilter(&filter1); + connection->installCommandFilter(filter2.data()); + connection->installCommandFilter(filter3.data()); + + connection->open(); + QVERIFY(waitForOpened()); + + connection->sendCommand(IrcCommand::createJoin("#freenode")); + QCOMPARE(filter1.commandFiltered, 1); + QCOMPARE(filter2->commandFiltered, 1); + QCOMPARE(filter3->commandFiltered, 1); + QVERIFY(!protocol->written.isEmpty()); + + protocol->written.clear(); + filter1.clear(); filter2->clear(); filter3->clear(); + filter3->commandFilterEnabled = true; + + connection->sendCommand(IrcCommand::createJoin("#communi")); + QCOMPARE(filter1.commandFiltered, 0); + QCOMPARE(filter2->commandFiltered, 0); + QCOMPARE(filter3->commandFiltered, 1); + QVERIFY(protocol->written.isEmpty()); + + protocol->written.clear(); + filter1.clear(); filter2->clear(); filter3->clear(); + filter2->commandFilterEnabled = true; + + connection->sendCommand(IrcCommand::createJoin("#qt")); + QCOMPARE(filter1.commandFiltered, 0); + QCOMPARE(filter2->commandFiltered, 1); + QCOMPARE(filter3->commandFiltered, 1); + QVERIFY(protocol->written.isEmpty()); + + protocol->written.clear(); + filter1.clear(); filter2->clear(); filter3->clear(); + filter1.commandFilterEnabled = true; + + connection->sendCommand(IrcCommand::createPart("#freenode")); + QCOMPARE(filter1.commandFiltered, 1); + QCOMPARE(filter2->commandFiltered, 1); + QCOMPARE(filter3->commandFiltered, 1); + QVERIFY(protocol->written.isEmpty()); + + protocol->written.clear(); + filter1.clear(); filter2->clear(); filter3->clear(); + + connection->sendCommand(IrcCommand::createPart("#communi")); + QCOMPARE(filter1.commandFiltered, 1); + QCOMPARE(filter2->commandFiltered, 1); + QCOMPARE(filter3->commandFiltered, 1); + QVERIFY(!protocol->written.isEmpty()); + + // a deleted filter gets removed + filter2.reset(); + filter1.clear(); filter3->clear(); + protocol->written.clear(); + + connection->sendCommand(IrcCommand::createPart("#qt")); + QCOMPARE(filter1.commandFiltered, 1); + QCOMPARE(filter3->commandFiltered, 1); + QVERIFY(!protocol->written.isEmpty()); + + // double filters + connection->installCommandFilter(&filter1); + connection->installCommandFilter(filter3.data()); + filter1.clear(); filter3->clear(); + protocol->written.clear(); + + connection->sendCommand(IrcCommand::createJoin("#freenode")); + QCOMPARE(filter1.commandFiltered, 2); + QCOMPARE(filter3->commandFiltered, 2); + QVERIFY(!protocol->written.isEmpty()); + + // remove & enable double filter + filter1.clear(); filter3->clear(); + filter1.commandFilterEnabled = true; + connection->removeCommandFilter(filter3.data()); + protocol->written.clear(); + + connection->sendCommand(IrcCommand::createJoin("#communi")); + QCOMPARE(filter1.commandFiltered, 1); + QCOMPARE(filter3->commandFiltered, 0); + QVERIFY(protocol->written.isEmpty()); + + // remove & delete + filter3.reset(); + filter1.clear(); + connection->removeCommandFilter(&filter1); + protocol->written.clear(); + + connection->sendCommand(IrcCommand::createJoin("#qt")); + QCOMPARE(filter1.commandFiltered, 0); + QVERIFY(!protocol->written.isEmpty()); + + // commit a suicide + QPointer suicidal = new TestFilter; + connection->installCommandFilter(suicidal); + suicidal->commitSuicide = true; + + connection->sendCommand(IrcCommand::createPart("#qt")); + QVERIFY(!suicidal); +} + +void tst_IrcConnection::testDebug() +{ + QString str; + QDebug dbg(&str); + + dbg << static_cast(0); + QCOMPARE(str.trimmed(), QString::fromLatin1("IrcConnection(0x0)")); + str.clear(); + + IrcConnection connection; + dbg << &connection; + QVERIFY(QRegExp("IrcConnection\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); + str.clear(); + + connection.setHost("irc.freenode.net"); + dbg << &connection; + QVERIFY(QRegExp("IrcConnection\\(0x[0-9A-Fa-f]+, irc.freenode.net\\) ").exactMatch(str)); + str.clear(); + + connection.setDisplayName("Freenode"); + dbg << &connection; + QVERIFY(QRegExp("IrcConnection\\(0x[0-9A-Fa-f]+, Freenode\\) ").exactMatch(str)); + str.clear(); + + dbg << IrcConnection::Connected; + QCOMPARE(str.trimmed(), QString::fromLatin1("Connected")); + str.clear(); +} + +void tst_IrcConnection::testWarnings() +{ + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(connection->isActive()); + + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setHost() has no effect until re-connect"); + connection->setHost("foo"); + + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setPort() has no effect until re-connect"); + connection->setPort(1234); + + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setUserName() has no effect until re-connect"); + connection->setUserName("foo"); + + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setRealName() has no effect until re-connect"); + connection->setRealName("foo"); + + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setPassword() has no effect until re-connect"); + connection->setPassword("foo"); + + QTest::ignoreMessage(QtWarningMsg, "IrcConnection::setSaslMechanism() has no effect until re-connect"); + connection->setSaslMechanism("PLAIN"); +} + +class FakeQmlConnection : public IrcConnection +{ + Q_OBJECT + friend class tst_IrcConnection; + +public slots: + // -Wno-overloaded-virtual + QVariant createCtcpReply(const QVariant& request) + { + return QVariant::fromValue(IrcConnection::createCtcpReply(request.value())); + } +}; + +void tst_IrcConnection::testCtcp() +{ + FriendlyConnection* friendly = static_cast(connection.data()); + + // PING + IrcMessage* msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1PING timestamp\1", connection); + QScopedPointer pingRequest(qobject_cast(msg)); + QVERIFY(pingRequest.data()); + + QScopedPointer pingReply(friendly->createCtcpReply(pingRequest.data())); + QVERIFY(pingReply.data()); + QCOMPARE(pingReply->type(), IrcCommand::CtcpReply); + QCOMPARE(pingReply->toString(), QString("NOTICE nick :\1PING timestamp\1")); + + // TIME + msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1TIME\1", connection); + QScopedPointer timeRequest(qobject_cast(msg)); + QVERIFY(timeRequest); + + QScopedPointer timeReply(friendly->createCtcpReply(timeRequest.data())); + QVERIFY(timeReply.data()); + QCOMPARE(timeReply->type(), IrcCommand::CtcpReply); + QCOMPARE(timeReply->toString(), QString("NOTICE nick :\1TIME %1\1").arg(QLocale().toString(QDateTime::currentDateTime(), QLocale::ShortFormat))); + + // VERSION + msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1VERSION\1", connection); + QScopedPointer versionRequest(qobject_cast(msg)); + QVERIFY(versionRequest.data()); + + QScopedPointer versionReply(friendly->createCtcpReply(versionRequest.data())); + QVERIFY(versionReply.data()); + QCOMPARE(versionReply->type(), IrcCommand::CtcpReply); + QVERIFY(versionReply->toString().startsWith("NOTICE nick :\1VERSION ")); + QVERIFY(versionReply->toString().contains(Irc::version())); + QVERIFY(versionReply->toString().endsWith("\1")); + + // SOURCE + msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1SOURCE\1", connection); + QScopedPointer sourceRequest(qobject_cast(msg)); + QVERIFY(sourceRequest.data()); + + QScopedPointer sourceReply(friendly->createCtcpReply(sourceRequest.data())); + QVERIFY(sourceReply.data()); + QCOMPARE(sourceReply->type(), IrcCommand::CtcpReply); + QVERIFY(sourceReply->toString().startsWith("NOTICE nick :\1SOURCE ")); + QVERIFY(sourceReply->toString().contains("http://")); + QVERIFY(sourceReply->toString().endsWith("\1")); + + // CLIENTINFO + msg = IrcMessage::fromData(":nick!user@host PRIVMSG communi :\1CLIENTINFO\1", connection); + QScopedPointer infoRequest(qobject_cast(msg)); + QVERIFY(infoRequest.data()); + + QScopedPointer infoReply(friendly->createCtcpReply(infoRequest.data())); + QVERIFY(infoReply.data()); + QCOMPARE(infoReply->type(), IrcCommand::CtcpReply); + QVERIFY(infoReply->toString().startsWith("NOTICE nick :\1CLIENTINFO ")); + QVERIFY(infoReply->toString().contains("PING")); + QVERIFY(infoReply->toString().contains("TIME")); + QVERIFY(infoReply->toString().contains("VERSION")); + QVERIFY(infoReply->toString().contains("SOURCE")); + QVERIFY(infoReply->toString().endsWith("\1")); + + // QML compatibility + FakeQmlConnection qmlConnection; + qmlConnection.setUserName("user"); + qmlConnection.setNickName("nick"); + qmlConnection.setRealName("real"); + qmlConnection.setPassword("secret"); + qmlConnection.setHost("127.0.0.1"); + qmlConnection.setPort(server->serverPort()); + + TestProtocol* qmlProtocol = new TestProtocol(&qmlConnection); + qmlConnection.setProtocol(qmlProtocol); + qmlConnection.open(); + + QVERIFY(server->waitForNewConnection(200)); + QAbstractSocket* qmlServerSocket = server->nextPendingConnection(); + QVERIFY(qmlServerSocket); + QAbstractSocket* qmlClientSocket = qmlConnection.socket(); + QVERIFY(qmlClientSocket); + QVERIFY(qmlClientSocket->waitForConnected(200)); + + qmlProtocol->written.clear(); + qmlServerSocket->write(":nick!user@host PRIVMSG communi :\1PING qml\1\r\n"); + QVERIFY(qmlServerSocket->waitForBytesWritten(1000)); + QVERIFY(qmlClientSocket->waitForReadyRead(1000)); + QCOMPARE(qmlProtocol->written, QByteArray("NOTICE nick :\1PING qml\1")); + + connection->open(); + QVERIFY(waitForOpened()); + + TestProtocol* protocol = new TestProtocol(friendly); + friendly->setProtocol(protocol); + QCOMPARE(friendly->protocol(), protocol); + QCOMPARE(protocol->connection(), friendly); + + // PING + protocol->written.clear(); + QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1PING timestamp\1\r\n")); + QCOMPARE(protocol->written, QByteArray("NOTICE nick :\1PING timestamp\1")); + + // TIME + protocol->written.clear(); + QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1TIME\1\r\n")); + QVERIFY(protocol->written.startsWith("NOTICE nick :\1TIME ")); + QVERIFY(protocol->written.endsWith("\1")); + + // VERSION + protocol->written.clear(); + QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1VERSION\1\r\n")); + QVERIFY(protocol->written.startsWith("NOTICE nick :\1VERSION ")); + QVERIFY(protocol->written.contains(Irc::version().toUtf8())); + QVERIFY(protocol->written.endsWith("\1")); + + // SOURCE + protocol->written.clear(); + QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1SOURCE\1\r\n")); + QVERIFY(protocol->written.startsWith("NOTICE nick :\1SOURCE ")); + QVERIFY(protocol->written.contains("http://")); + QVERIFY(protocol->written.endsWith("\1")); + + // CLIENTINFO + protocol->written.clear(); + QVERIFY(waitForWritten(":nick!user@host PRIVMSG communi :\1CLIENTINFO\1\r\n")); + QVERIFY(protocol->written.startsWith("NOTICE nick :\1CLIENTINFO ")); + QVERIFY(protocol->written.contains("PING")); + QVERIFY(protocol->written.contains("TIME")); + QVERIFY(protocol->written.contains("VERSION")); + QVERIFY(protocol->written.contains("SOURCE")); + QVERIFY(protocol->written.endsWith("\1")); +} + +QTEST_MAIN(tst_IrcConnection) + +#include "tst_ircconnection.moc" diff --git a/src/libcommuni/tests/auto/irclagtimer/irclagtimer.pro b/src/libcommuni/tests/auto/irclagtimer/irclagtimer.pro new file mode 100644 index 0000000..bcaac4c --- /dev/null +++ b/src/libcommuni/tests/auto/irclagtimer/irclagtimer.pro @@ -0,0 +1,8 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_irclagtimer.cpp + +include(../shared/shared.pri) +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/irclagtimer/tst_irclagtimer.cpp b/src/libcommuni/tests/auto/irclagtimer/tst_irclagtimer.cpp new file mode 100644 index 0000000..3a69042 --- /dev/null +++ b/src/libcommuni/tests/auto/irclagtimer/tst_irclagtimer.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "irclagtimer.h" +#include "ircconnection.h" +#include "tst_ircclientserver.h" +#include "tst_ircdata.h" +#include + +class tst_IrcLagTimer : public tst_IrcClientServer +{ + Q_OBJECT + +private slots: + void testDefaults(); + void testInterval(); + void testConnection(); + void testLag(); +}; + +void tst_IrcLagTimer::testDefaults() +{ + IrcLagTimer timer; + QCOMPARE(timer.lag(), qint64(-1)); + QVERIFY(!timer.connection()); + QCOMPARE(timer.interval(), 60); +} + +void tst_IrcLagTimer::testInterval() +{ + IrcLagTimer timer; + timer.setInterval(INT_MIN); + QCOMPARE(timer.interval(), INT_MIN); + timer.setInterval(0); + QCOMPARE(timer.interval(), 0); + timer.setInterval(INT_MAX); + QCOMPARE(timer.interval(), INT_MAX); +} + +void tst_IrcLagTimer::testConnection() +{ + IrcLagTimer timer(connection); + QCOMPARE(timer.connection(), connection.data()); + timer.setConnection(0); + QVERIFY(!timer.connection()); + timer.setConnection(connection); + QCOMPARE(timer.connection(), connection.data()); +} + +void tst_IrcLagTimer::testLag() +{ +#if QT_VERSION >= 0x040700 + IrcLagTimer timer(connection); + + QSignalSpy lagSpy(&timer, SIGNAL(lagChanged(qint64))); + QVERIFY(lagSpy.isValid()); + int lagCount = 0; + + connection->open(); + QVERIFY(waitForOpened()); + + QCOMPARE(timer.lag(), -1ll); + + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + // cheat a bit to avoid waiting a 1s interval at minimum... + QMetaObject::invokeMethod(&timer, "_irc_pingServer"); + QVERIFY(clientSocket->waitForBytesWritten(1000)); + QVERIFY(serverSocket->waitForReadyRead(1000)); + + QRegExp rx("PING communi/(\\d+)"); + QString written = QString::fromUtf8(serverSocket->readAll()); + QVERIFY(rx.indexIn(written) != -1); + + waitForWritten(QString(":irc.ser.ver PONG communi communi/%1").arg(QDateTime::currentMSecsSinceEpoch() - 1234ll).toUtf8()); + QVERIFY(timer.lag() >= 1234ll); + QCOMPARE(lagSpy.count(), ++lagCount); + QVERIFY(lagSpy.last().at(0).toLongLong() >= 1234ll); + + timer.setConnection(0); + QCOMPARE(timer.lag(), -1ll); + QCOMPARE(lagSpy.count(), ++lagCount); + QCOMPARE(lagSpy.last().at(0).toLongLong(), -1ll); + + timer.setConnection(connection); + QCOMPARE(timer.lag(), -1ll); + QCOMPARE(lagSpy.count(), lagCount); + + waitForWritten(QString(":irc.ser.ver PONG communi communi/%1").arg(QDateTime::currentMSecsSinceEpoch() - 4321ll).toUtf8()); + QVERIFY(timer.lag() >= 4321ll); + QCOMPARE(lagSpy.count(), ++lagCount); + QVERIFY(lagSpy.last().at(0).toLongLong() >= 4321ll); + + connection->close(); + QCOMPARE(timer.lag(), -1ll); + QCOMPARE(lagSpy.count(), ++lagCount); + QCOMPARE(lagSpy.last().at(0).toLongLong(), -1ll); +#endif // QT_VERSION >= 0x040700 +} + +QTEST_MAIN(tst_IrcLagTimer) + +#include "tst_irclagtimer.moc" diff --git a/src/libcommuni/tests/auto/ircmessage/ircmessage.pro b/src/libcommuni/tests/auto/ircmessage/ircmessage.pro new file mode 100644 index 0000000..c13ba14 --- /dev/null +++ b/src/libcommuni/tests/auto/ircmessage/ircmessage.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircmessage.cpp + +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircmessage/tst_ircmessage.cpp b/src/libcommuni/tests/auto/ircmessage/tst_ircmessage.cpp new file mode 100644 index 0000000..f96c50a --- /dev/null +++ b/src/libcommuni/tests/auto/ircmessage/tst_ircmessage.cpp @@ -0,0 +1,973 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircmessage.h" +#include "ircconnection.h" +#include "ircprotocol.h" +#include +#include +#include +#include + +#ifdef Q_OS_LINUX +#include "ircmessagedecoder_p.h" +#endif // Q_OS_LINUX + +class tst_IrcMessage : public QObject +{ + Q_OBJECT + +private slots: + void testDefaults(); + + void testPrefix_data(); + void testPrefix(); + + void testParameters_data(); + void testParameters(); + + void testFlags(); + + void testEncoding_data(); + void testEncoding(); + + void testDecoder_data(); + void testDecoder(); + + void testTags_data(); + void testTags(); + + void testCapabilityMessage_data(); + void testCapabilityMessage(); + void testErrorMessage_data(); + void testErrorMessage(); + void testInviteMessage_data(); + void testInviteMessage(); + void testJoinMessage_data(); + void testJoinMessage(); + void testKickMessage_data(); + void testKickMessage(); + void testNamesMessage(); + void testNickMessage_data(); + void testNickMessage(); + void testNoticeMessage_data(); + void testNoticeMessage(); + void testNumericMessage_data(); + void testNumericMessage(); + void testModeMessage_data(); + void testModeMessage(); + void testMotdMessage(); + void testPartMessage_data(); + void testPartMessage(); + void testPingMessage(); + void testPongMessage(); + void testPrivateMessage_data(); + void testPrivateMessage(); + void testQuitMessage_data(); + void testQuitMessage(); + void testTopicMessage_data(); + void testTopicMessage(); + void testWhoReplyMessage_data(); + void testWhoReplyMessage(); + + void testDebug(); +}; + +void tst_IrcMessage::testDefaults() +{ + IrcMessage msg(0); + QVERIFY(!msg.isValid()); + QVERIFY(!msg.connection()); + QCOMPARE(msg.type(), IrcMessage::Unknown); + QCOMPARE(msg.flags(), IrcMessage::None); + QCOMPARE(msg.encoding(), QByteArray("ISO-8859-15")); + QVERIFY(msg.prefix().isNull()); + QVERIFY(msg.nick().isNull()); + QVERIFY(msg.ident().isNull()); + QVERIFY(msg.host().isNull()); + QVERIFY(msg.command().isNull()); + QVERIFY(msg.parameters().isEmpty()); + QVERIFY(msg.toData().isEmpty()); +} + +void tst_IrcMessage::testPrefix_data() +{ + QTest::addColumn("prefix"); + QTest::addColumn("expected"); + QTest::addColumn("nick"); + QTest::addColumn("ident"); + QTest::addColumn("host"); + + QTest::newRow("null") << QString() << QString() << QString() << QString() << QString(); + QTest::newRow("empty") << QString("") << QString("") << QString() << QString() << QString(); + QTest::newRow("space") << QString(" ") << QString(" ") << QString() << QString() << QString(); + QTest::newRow("nick!ident@host") << QString("nick!ident@host") << QString("nick!ident@host") << QString("nick") << QString("ident") << QString("host"); +} + +void tst_IrcMessage::testPrefix() +{ + QFETCH(QString, prefix); + QFETCH(QString, expected); + QFETCH(QString, nick); + QFETCH(QString, ident); + QFETCH(QString, host); + + IrcMessage msg(0); + msg.setPrefix(prefix); + QCOMPARE(msg.prefix(), expected); + QCOMPARE(msg.nick(), nick); + QCOMPARE(msg.ident(), ident); + QCOMPARE(msg.host(), host); +} + +void tst_IrcMessage::testParameters_data() +{ + Irc::registerMetaTypes(); + + QTest::addColumn("prefix"); + QTest::addColumn("command"); + QTest::addColumn("params"); + QTest::addColumn("type"); + + QTest::newRow("null") << QString() << QString() << QStringList() << IrcMessage::Unknown; + QTest::newRow("message") << QString("nick!ident@host") << QString("PRIVMSG") << QStringList("p") << IrcMessage::Private; + QTest::newRow("notice") << QString("nick!ident@host") << QString("NOTICE") << QStringList("p") << IrcMessage::Notice; +} + +void tst_IrcMessage::testParameters() +{ + QFETCH(QString, prefix); + QFETCH(QString, command); + QFETCH(QStringList, params); + QFETCH(IrcMessage::Type, type); + + IrcConnection connection; + QScopedPointer message(IrcMessage::fromParameters(prefix, command, params, &connection)); + QCOMPARE(message->type(), type); + QCOMPARE(message->prefix(), prefix); + QCOMPARE(message->command(), command); + QCOMPARE(message->parameters(), params); +} + +void tst_IrcMessage::testFlags() +{ + IrcMessage msg(0); + msg.setPrefix("a!b@c"); + QCOMPARE(msg.flags(), IrcMessage::None); +} + +void tst_IrcMessage::testEncoding_data() +{ + QTest::addColumn("encoding"); + QTest::addColumn("actual"); + QTest::addColumn("supported"); + + QTest::newRow("null") << QByteArray() << QByteArray("ISO-8859-15") << false; + QTest::newRow("empty") << QByteArray("") << QByteArray("ISO-8859-15") << false; + QTest::newRow("space") << QByteArray(" ") << QByteArray("ISO-8859-15") << false; + QTest::newRow("invalid") << QByteArray("invalid") << QByteArray("ISO-8859-15") << false; + foreach (const QByteArray& codec, QTextCodec::availableCodecs()) + QTest::newRow(codec) << codec << codec << true; +} + +void tst_IrcMessage::testEncoding() +{ + QFETCH(QByteArray, encoding); + QFETCH(QByteArray, actual); + QFETCH(bool, supported); + + if (!supported) + QTest::ignoreMessage(QtWarningMsg, "IrcMessage::setEncoding(): unsupported encoding \"" + encoding + "\" "); + + IrcMessage msg(0); + msg.setEncoding(encoding); + QCOMPARE(msg.encoding(), actual); +} + +void tst_IrcMessage::testDecoder_data() +{ + QTest::addColumn("encoding"); + QTest::addColumn("base64"); + + QTest::newRow("windows-1251") << QByteArray("windows-1251") << QByteArray("7+Xt8eju7eXw4Owg7+7k5OXr/O375Q=="); + QTest::newRow("EUC-JP") << QByteArray("EUC-JP") << QByteArray("pKSkxKTHpOKkyaSzpMek4qGhpbml3qXbyMc="); + QTest::newRow("Shift-JIS") << QByteArray("Shift-JIS") << QByteArray("lbaOmoNSgVuDaJVcg1aDdINn"); + QTest::newRow("ISO-8859-15") << QByteArray("ISO-8859-15") << QByteArray("5Gl0aWVucORpduQ="); // TODO: QByteArray("5OQ="); +} + +void tst_IrcMessage::testDecoder() +{ + QFETCH(QByteArray, encoding); + QFETCH(QByteArray, base64); + +#ifdef Q_OS_LINUX + // others have problems with symbols (win) or private headers (osx frameworks) + IrcMessageDecoder decoder; + QString actual = decoder.decode(QByteArray::fromBase64(base64), encoding); + QString expected = QTextCodec::codecForName(encoding)->toUnicode(QByteArray::fromBase64(base64)); + QCOMPARE(actual, expected); +#endif // Q_OS_LINUX +} + +void tst_IrcMessage::testTags_data() +{ + QTest::addColumn("data"); + QTest::addColumn("tags"); + QTest::addColumn("prefix"); + QTest::addColumn("command"); + QTest::addColumn("target"); + QTest::addColumn("content"); + + QVariantMap tags; + tags.insert("aaa", "bbb"); + tags.insert("ccc", ""); + tags.insert("example.com/ddd", "eee"); + + QTest::newRow("example") << QByteArray("@aaa=bbb;ccc;example.com/ddd=eee :nick!ident@host.com PRIVMSG me :Hello") + << tags << "nick!ident@host.com" << "PRIVMSG" << "me" << "Hello"; +} + +void tst_IrcMessage::testTags() +{ + QFETCH(QByteArray, data); + QFETCH(QVariantMap, tags); + QFETCH(QString, prefix); + QFETCH(QString, command); + QFETCH(QString, target); + QFETCH(QString, content); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->tags(), tags); + QCOMPARE(message->prefix(), prefix); + QCOMPARE(message->command(), command); + QCOMPARE(message->property("target").toString(), target); + QCOMPARE(message->property("content").toString(), content); +} + +void tst_IrcMessage::testCapabilityMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("subCommand"); + QTest::addColumn("capabilities"); + + QTest::newRow("no prefix") << true << QByteArray("CAP") << QString() << QStringList(); + QTest::newRow("empty prefix") << false << QByteArray(": CAP") << QString() << QStringList(); + QTest::newRow("no params") << true << QByteArray(":server CAP") << QString() << QStringList(); + + QTest::newRow("ls") << true << QByteArray(":server CAP * LS :identify-msg sasl") << QString("LS") << (QStringList() << "identify-msg" << "sasl"); + QTest::newRow("ack") << true << QByteArray(":server CAP communi ACK :identify-msg") << QString("ACK") << (QStringList() << "identify-msg"); + QTest::newRow("nak") << true << QByteArray(":server CAP communi NAK :sasl") << QString("NAK") << (QStringList() << "sasl"); +} + +void tst_IrcMessage::testCapabilityMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, subCommand); + QFETCH(QStringList, capabilities); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Capability); + QCOMPARE(message->command(), QString("CAP")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("subCommand").toString(), subCommand); + QCOMPARE(message->property("capabilities").toStringList(), capabilities); + + IrcCapabilityMessage* capabilityMessage = qobject_cast(message); + QVERIFY(capabilityMessage); + QCOMPARE(capabilityMessage->isValid(), valid); + QCOMPARE(capabilityMessage->subCommand(), subCommand); + QCOMPARE(capabilityMessage->capabilities(), capabilities); +} + +void tst_IrcMessage::testErrorMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("error"); + + QTest::newRow("no prefix") << true << QByteArray("ERROR error1") << QString("error1"); + QTest::newRow("empty prefix") << false << QByteArray(": ERROR error1") << QString("error1"); + QTest::newRow("no params") << false << QByteArray(":server ERROR") << QString(); + QTest::newRow("all ok") << true << QByteArray(":server ERROR error1") << QString("error1"); +} + +void tst_IrcMessage::testErrorMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, error); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Error); + QCOMPARE(message->command(), QString("ERROR")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("error").toString(), error); + + IrcErrorMessage* errorMessage = qobject_cast(message); + QVERIFY(errorMessage); + QCOMPARE(errorMessage->isValid(), valid); + QCOMPARE(errorMessage->error(), error); +} + +void tst_IrcMessage::testInviteMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("user"); + QTest::addColumn("channel"); + + QTest::newRow("no prefix") << true << QByteArray("INVITE Wiz #Dust") << QString("Wiz") << QString("#Dust"); + QTest::newRow("empty prefix") << false << QByteArray(": INVITE Wiz #Dust") << QString("Wiz") << QString("#Dust"); + QTest::newRow("no params") << false << QByteArray(":Angel INVITE") << QString() << QString(); + QTest::newRow("no channel") << false << QByteArray(":Angel INVITE Wiz") << QString("Wiz") << QString(); + QTest::newRow("all ok") << true << QByteArray(":Angel INVITE Wiz #Dust") << QString("Wiz") << QString("#Dust"); +} + +void tst_IrcMessage::testInviteMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, channel); + QFETCH(QString, user); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Invite); + QCOMPARE(message->command(), QString("INVITE")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("channel").toString(), channel); + QCOMPARE(message->property("user").toString(), user); + + IrcInviteMessage* inviteMessage = qobject_cast(message); + QVERIFY(inviteMessage); + QCOMPARE(inviteMessage->isValid(), valid); + QCOMPARE(inviteMessage->channel(), channel); + QCOMPARE(inviteMessage->user(), user); +} + +void tst_IrcMessage::testJoinMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("channel"); + + QTest::newRow("no prefix") << true << QByteArray("JOIN #Twilight_zone") << QString("#Twilight_zone"); + QTest::newRow("empty prefix") << false << QByteArray(": JOIN #Twilight_zone") << QString("#Twilight_zone"); + QTest::newRow("no params") << false << QByteArray(":WiZ JOIN") << QString(); + QTest::newRow("all ok") << true << QByteArray(":WiZ JOIN #Twilight_zone") << QString("#Twilight_zone"); +} + +void tst_IrcMessage::testJoinMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, channel); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Join); + QCOMPARE(message->command(), QString("JOIN")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("channel").toString(), channel); + + IrcJoinMessage* joinMessage = qobject_cast(message); + QVERIFY(joinMessage); + QCOMPARE(joinMessage->isValid(), valid); + QCOMPARE(joinMessage->channel(), channel); +} + +void tst_IrcMessage::testKickMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("channel"); + QTest::addColumn("user"); + QTest::addColumn("reason"); + + QTest::newRow("no prefix") << true << QByteArray("KICK #Finnish John") << QString("#Finnish") << QString("John") << QString(); + QTest::newRow("empty prefix") << false << QByteArray(": KICK #Finnish John") << QString("#Finnish") << QString("John") << QString(); + QTest::newRow("no params") << false << QByteArray(":WiZ KICK") << QString() << QString() << QString(); + QTest::newRow("no user") << false << QByteArray(":WiZ KICK #Finnish") << QString("#Finnish") << QString() << QString(); + QTest::newRow("no reason") << true << QByteArray(":WiZ KICK #Finnish John") << QString("#Finnish") << QString("John") << QString(); + QTest::newRow("all ok") << true << QByteArray(":WiZ KICK #Finnish John :Another reason") << QString("#Finnish") << QString("John") << QString("Another reason"); +} + +void tst_IrcMessage::testKickMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, channel); + QFETCH(QString, user); + QFETCH(QString, reason); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Kick); + QCOMPARE(message->command(), QString("KICK")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("channel").toString(), channel); + QCOMPARE(message->property("user").toString(), user); + QCOMPARE(message->property("reason").toString(), reason); + + IrcKickMessage* kickMessage = qobject_cast(message); + QVERIFY(kickMessage); + QCOMPARE(kickMessage->isValid(), valid); + QCOMPARE(kickMessage->channel(), channel); + QCOMPARE(kickMessage->user(), user); + QCOMPARE(kickMessage->reason(), reason); +} + +void tst_IrcMessage::testNamesMessage() +{ + IrcConnection connection; + IrcNamesMessage message(&connection); + message.setPrefix("nick!ident@host"); + message.setParameters(QStringList() << "chan" << "usr1" << "usr2" << "usr3"); + QVERIFY(message.isValid()); + QCOMPARE(message.type(), IrcMessage::Names); + QCOMPARE(message.command(), QString("NAMES")); + QCOMPARE(message.channel(), QString("chan")); + QCOMPARE(message.names(), QStringList() << "usr1" << "usr2" << "usr3"); +} + +void tst_IrcMessage::testNickMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("oldNick"); + QTest::addColumn("newNick"); + + QTest::newRow("no prefix") << true << QByteArray("NICK Kilroy") << QString() << QString("Kilroy"); + QTest::newRow("empty prefix") << false << QByteArray(": NICK Kilroy") << QString() << QString("Kilroy"); + QTest::newRow("no params") << false << QByteArray(":WiZ NICK") << QString("WiZ") << QString(); + QTest::newRow("all ok") << true << QByteArray(":WiZ NICK Kilroy") << QString("WiZ") << QString("Kilroy"); +} + +void tst_IrcMessage::testNickMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, oldNick); + QFETCH(QString, newNick); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Nick); + QCOMPARE(message->command(), QString("NICK")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("oldNick").toString(), oldNick); + QCOMPARE(message->property("newNick").toString(), newNick); + + IrcNickMessage* nickMessage = qobject_cast(message); + QVERIFY(nickMessage); + QCOMPARE(nickMessage->isValid(), valid); + QCOMPARE(nickMessage->oldNick(), oldNick); + QCOMPARE(nickMessage->newNick(), newNick); +} + +void tst_IrcMessage::testNoticeMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("target"); + QTest::addColumn("content"); + QTest::addColumn("priv"); + QTest::addColumn("reply"); + + QTest::newRow("no prefix") << true << QByteArray("NOTICE Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false; + QTest::newRow("empty prefix") << false << QByteArray(": NOTICE Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false; + QTest::newRow("no params") << false << QByteArray(":Angel NOTICE Wiz") << QString("Wiz") << QString() << false << false; + QTest::newRow("all ok") << true << QByteArray(":Angel NOTICE Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false; + QTest::newRow("private") << true << QByteArray(":Angel NOTICE communi :Hello are you receiving this message ?") << QString("communi") << QString("Hello are you receiving this message ?") << true << false; + QTest::newRow("reply") << true << QByteArray(":Angel NOTICE Wiz :\1Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << true; +} + +void tst_IrcMessage::testNoticeMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, target); + QFETCH(QString, content); + QFETCH(bool, priv); + QFETCH(bool, reply); + + IrcConnection connection; + connection.setNickName("communi"); + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Notice); + QCOMPARE(message->command(), QString("NOTICE")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("target").toString(), target); + QCOMPARE(message->property("content").toString(), content); + QCOMPARE(message->property("private").toBool(), priv); + QCOMPARE(message->property("reply").toBool(), reply); + + IrcNoticeMessage* noticeMessage = qobject_cast(message); + QVERIFY(noticeMessage); + QCOMPARE(noticeMessage->isValid(), valid); + QCOMPARE(noticeMessage->target(), target); + QCOMPARE(noticeMessage->content(), content); + QCOMPARE(noticeMessage->isPrivate(), priv); + QCOMPARE(noticeMessage->isReply(), reply); +} + +void tst_IrcMessage::testNumericMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("code"); + + QTest::newRow("no prefix") << true << QByteArray("123 Kilroy") << 123; + QTest::newRow("empty prefix") << false << QByteArray(": 123 Kilroy") << 123; + QTest::newRow("no params") << true << QByteArray(":WiZ 456") << 456; + QTest::newRow("all ok") << true << QByteArray(":WiZ 789 Kilroy") << 789; +} + +void tst_IrcMessage::testNumericMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(int, code); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Numeric); + QVERIFY(message->command().toInt() > 0); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("code").toInt(), code); + + IrcNumericMessage* numericMessage = qobject_cast(message); + QVERIFY(numericMessage); + QCOMPARE(numericMessage->isValid(), valid); + QCOMPARE(numericMessage->code(), code); +} + +void tst_IrcMessage::testModeMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("target"); + QTest::addColumn("mode"); + QTest::addColumn("argument"); + + QTest::newRow("no prefix") << true << QByteArray("MODE Kilroy -w") << QString("Kilroy") << QString("-w") << QString(); + QTest::newRow("empty prefix") << false << QByteArray(": MODE Kilroy -w") << QString("Kilroy") << QString("-w") << QString(); + QTest::newRow("no params") << false << QByteArray(":WiZ MODE Kilroy") << QString("Kilroy") << QString() << QString(); + QTest::newRow("all ok") << true << QByteArray(":WiZ MODE Kilroy -w") << QString("Kilroy") << QString("-w") << QString(); + + QTest::newRow("1") << true << QByteArray(":WiZ MODE #Finnish +im") << QString("#Finnish") << QString("+im") << QString(); + QTest::newRow("2") << true << QByteArray(":Angel MODE #Finnish +o Kilroy") << QString("#Finnish") << QString("+o") << QString("Kilroy"); + QTest::newRow("3") << true << QByteArray(":Kilroy MODE #Finnish +v Wiz") << QString("#Finnish") << QString("+v") << QString("Wiz"); + QTest::newRow("4a") << true << QByteArray("MODE #Fins -s") << QString("#Fins") << QString("-s") << QString(); + QTest::newRow("4b") << false << QByteArray(": MODE #Fins -s") << QString("#Fins") << QString("-s") << QString(); + QTest::newRow("5") << true << QByteArray(":WiZ MODE #42 +k oulu") << QString("#42") << QString("+k") << QString("oulu"); + QTest::newRow("6a") << true << QByteArray("MODE #eu-opers +l 10") << QString("#eu-opers") << QString("+l") << QString("10"); + QTest::newRow("6b") << false << QByteArray(": MODE #eu-opers +l 10") << QString("#eu-opers") << QString("+l") << QString("10"); + QTest::newRow("7") << true << QByteArray(":nobody MODE &oulu +b") << QString("&oulu") << QString("+b") << QString(); + QTest::newRow("8") << true << QByteArray(":someone MODE &oulu +b *!*@*") << QString("&oulu") << QString("+b") << QString("*!*@*"); + QTest::newRow("9") << true << QByteArray(":anyone MODE &oulu +b *!*@*.edu") << QString("&oulu") << QString("+b") << QString("*!*@*.edu"); + QTest::newRow("10a") << true << QByteArray("MODE WiZ -w") << QString("WiZ") << QString("-w") << QString(); + QTest::newRow("10b") << false << QByteArray(": MODE WiZ -w") << QString("WiZ") << QString("-w") << QString(); + QTest::newRow("11") << true << QByteArray(":Angel MODE Angel +i") << QString("Angel") << QString("+i") << QString(); + QTest::newRow("12") << true << QByteArray(":WiZ MODE WiZ -o") << QString("WiZ") << QString("-o") << QString(); + + QTest::newRow("args") << true << QByteArray(":someone MODE #chan +lk 10 secret") << QString("#chan") << QString("+lk") << QString("10 secret"); +} + +void tst_IrcMessage::testModeMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, target); + QFETCH(QString, mode); + QFETCH(QString, argument); + + const QString arg = argument.split(" ", QString::SkipEmptyParts).value(0); + const QStringList args = argument.split(" ", QString::SkipEmptyParts); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Mode); + QCOMPARE(message->command(), QString("MODE")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("target").toString(), target); + QCOMPARE(message->property("mode").toString(), mode); + QCOMPARE(message->property("argument").toString(), arg); + QCOMPARE(message->property("arguments").toStringList(), args); + + IrcModeMessage* modeMessage = qobject_cast(message); + QVERIFY(modeMessage); + QCOMPARE(modeMessage->isValid(), valid); + QCOMPARE(modeMessage->target(), target); + QCOMPARE(modeMessage->mode(), mode); + QCOMPARE(modeMessage->argument(), arg); + QCOMPARE(modeMessage->arguments(), args); +} + +void tst_IrcMessage::testMotdMessage() +{ + IrcConnection connection; + IrcMotdMessage message(&connection); + message.setPrefix("nick!ident@host"); + QStringList params; + params += "user"; + params += ":server 375 user :- server Message of the Day"; + params += ":server 372 user :- Welcome..."; + params += ":server 376 user :End of /MOTD command"; + message.setParameters(params); + QVERIFY(message.isValid()); + QCOMPARE(message.type(), IrcMessage::Motd); + QCOMPARE(message.command(), QString("MOTD")); + QCOMPARE(message.lines(), QStringList(params.mid(1))); +} + +void tst_IrcMessage::testPartMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("channel"); + QTest::addColumn("reason"); + + QTest::newRow("no prefix") << true << QByteArray("PART #Twilight_zone") << QString("#Twilight_zone") << QString(); + QTest::newRow("empty prefix") << false << QByteArray(": PART #Twilight_zone") << QString("#Twilight_zone") << QString(); + QTest::newRow("no params") << false << QByteArray(":WiZ PART") << QString() << QString(); + QTest::newRow("no reason") << true << QByteArray(":WiZ PART #Twilight_zone") << QString("#Twilight_zone") << QString(); + QTest::newRow("all ok") << true << QByteArray(":WiZ PART #Twilight_zone :Gone to have lunch") << QString("#Twilight_zone") << QString("Gone to have lunch"); +} + +void tst_IrcMessage::testPartMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, channel); + QFETCH(QString, reason); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Part); + QCOMPARE(message->command(), QString("PART")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("channel").toString(), channel); + QCOMPARE(message->property("reason").toString(), reason); + + IrcPartMessage* partMessage = qobject_cast(message); + QVERIFY(partMessage); + QCOMPARE(partMessage->isValid(), valid); + QCOMPARE(partMessage->channel(), channel); + QCOMPARE(partMessage->reason(), reason); +} + +void tst_IrcMessage::testPingMessage() +{ + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData("PING :arg", &connection); + QCOMPARE(message->type(), IrcMessage::Ping); + QCOMPARE(message->command(), QString("PING")); + QCOMPARE(message->property("command").toString(), QString("PING")); + QVERIFY(message->property("valid").toBool()); + QCOMPARE(message->property("argument").toString(), QString("arg")); + + IrcPingMessage* pingMessage = qobject_cast(message); + QVERIFY(pingMessage); + QVERIFY(pingMessage->isValid()); + QCOMPARE(pingMessage->argument(), QString("arg")); +} + +void tst_IrcMessage::testPongMessage() +{ + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData("PONG tgt :arg", &connection); + QCOMPARE(message->type(), IrcMessage::Pong); + QCOMPARE(message->command(), QString("PONG")); + QCOMPARE(message->property("command").toString(), QString("PONG")); + QVERIFY(message->property("valid").toBool()); + QCOMPARE(message->property("argument").toString(), QString("arg")); + + IrcPongMessage* pongMessage = qobject_cast(message); + QVERIFY(pongMessage); + QVERIFY(pongMessage->isValid()); + QCOMPARE(pongMessage->argument(), QString("arg")); +} + +void tst_IrcMessage::testPrivateMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("cap"); + QTest::addColumn("data"); + QTest::addColumn("target"); + QTest::addColumn("content"); + QTest::addColumn("priv"); + QTest::addColumn("action"); + QTest::addColumn("request"); + QTest::addColumn("flags"); + + QTest::newRow("no prefix") << true << QString() << QByteArray("PRIVMSG Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); + QTest::newRow("empty prefix") << false << QString() << QByteArray(": PRIVMSG Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); + QTest::newRow("no params") << false << QString() << QByteArray(":Angel PRIVMSG Wiz") << QString("Wiz") << QString() << false << false << false << static_cast(IrcMessage::None); + QTest::newRow("all ok") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); + QTest::newRow("private") << true << QString() << QByteArray(":Angel PRIVMSG communi :Hello are you receiving this message ?") << QString("communi") << QString("Hello are you receiving this message ?") << true << false << false << static_cast(IrcMessage::None); + QTest::newRow("action") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :\1ACTION Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << true << false << static_cast(IrcMessage::None); + QTest::newRow("request") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :\1Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << true << static_cast(IrcMessage::None); + + QTest::newRow("identified") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :+Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::Identified); + QTest::newRow("identified private") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG communi :+Hello are you receiving this message ?") << QString("communi") << QString("Hello are you receiving this message ?") << true << false << false << static_cast(IrcMessage::Identified); + QTest::newRow("identified action") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :+\1ACTION Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << true << false << static_cast(IrcMessage::Identified); + QTest::newRow("identified request") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :+\1Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << true << static_cast(IrcMessage::Identified); + + QTest::newRow("unidentified") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :-Hello are you receiving this message ?") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::Unidentified); + QTest::newRow("unidentified private") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG communi :-Hello are you receiving this message ?") << QString("communi") << QString("Hello are you receiving this message ?") << true << false << false << static_cast(IrcMessage::Unidentified); + QTest::newRow("unidentified action") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :-\1ACTION Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << true << false << static_cast(IrcMessage::Unidentified); + QTest::newRow("unidentified request") << true << QString("identify-msg") << QByteArray(":Angel PRIVMSG Wiz :-\1Hello are you receiving this message ?\1") << QString("Wiz") << QString("Hello are you receiving this message ?") << false << false << true << static_cast(IrcMessage::Unidentified); + + QTest::newRow("no-caps identified") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :+Hello are you receiving this message ?") << QString("Wiz") << QString("+Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); + QTest::newRow("no-caps unidentified") << true << QString() << QByteArray(":Angel PRIVMSG Wiz :-Hello are you receiving this message ?") << QString("Wiz") << QString("-Hello are you receiving this message ?") << false << false << false << static_cast(IrcMessage::None); +} + +class TestProtocol : public IrcProtocol +{ +public: + TestProtocol(const QString& cap, IrcConnection* connection) : IrcProtocol(connection) + { + QSet caps; + caps.insert(cap); + setAvailableCapabilities(caps); + setActiveCapabilities(caps); + } +}; + +class FriendConnection : public IrcConnection +{ + friend class tst_IrcMessage; +}; + +void tst_IrcMessage::testPrivateMessage() +{ + QFETCH(bool, valid); + QFETCH(QString, cap); + QFETCH(QByteArray, data); + QFETCH(QString, target); + QFETCH(QString, content); + QFETCH(bool, priv); + QFETCH(bool, action); + QFETCH(bool, request); + QFETCH(uint, flags); + + IrcConnection connection; + connection.setNickName("communi"); + TestProtocol protocol(cap, &connection); + static_cast(&connection)->setProtocol(&protocol); + + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Private); + QCOMPARE(message->command(), QString("PRIVMSG")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("target").toString(), target); + QCOMPARE(message->property("content").toString(), content); + QCOMPARE(message->property("private").toBool(), priv); + QCOMPARE(message->property("action").toBool(), action); + QCOMPARE(message->property("request").toBool(), request); + QCOMPARE(message->property("flags").toUInt(), flags); + + IrcPrivateMessage* privateMessage = qobject_cast(message); + QVERIFY(privateMessage); + QCOMPARE(privateMessage->isValid(), valid); + QCOMPARE(privateMessage->target(), target); + QCOMPARE(privateMessage->content(), content); + QCOMPARE(privateMessage->isPrivate(), priv); + QCOMPARE(privateMessage->isAction(), action); + QCOMPARE(privateMessage->isRequest(), request); + QCOMPARE(static_cast(privateMessage->flags()), flags); +} + +void tst_IrcMessage::testQuitMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("reason"); + + QTest::newRow("no prefix") << true << QByteArray("QUIT :Gone to have lunch") << QString("Gone to have lunch"); + QTest::newRow("empty prefix") << false << QByteArray(": QUIT :Gone to have lunch") << QString("Gone to have lunch"); + QTest::newRow("no params") << true << QByteArray(":WiZ QUIT") << QString(); + QTest::newRow("all ok") << true << QByteArray(":WiZ QUIT :Gone to have lunch") << QString("Gone to have lunch"); +} + +void tst_IrcMessage::testQuitMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, reason); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Quit); + QCOMPARE(message->command(), QString("QUIT")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("reason").toString(), reason); + + IrcQuitMessage* quitMessage = qobject_cast(message); + QVERIFY(quitMessage); + QCOMPARE(quitMessage->isValid(), valid); + QCOMPARE(quitMessage->reason(), reason); +} + +void tst_IrcMessage::testTopicMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("data"); + QTest::addColumn("channel"); + QTest::addColumn("topic"); + QTest::addColumn("reply"); + + QTest::newRow("no prefix") << true << QByteArray("TOPIC #test") << QString("#test") << QString() << false; + QTest::newRow("empty prefix") << false << QByteArray(": TOPIC #test") << QString("#test") << QString() << false; + QTest::newRow("no params") << false << QByteArray(":WiZ TOPIC") << QString() << QString() << false; + QTest::newRow("no topic") << true << QByteArray(":WiZ TOPIC #test") << QString("#test") << QString() << false; + QTest::newRow("all ok") << true << QByteArray(":WiZ TOPIC #test :another topic") << QString("#test") << QString("another topic") << false; + // TODO: QTest::newRow("numeric") << true << QByteArray(":server 332 user #test :foo bar") << QString("#test") << QString("foo bar") << true; +} + +void tst_IrcMessage::testTopicMessage() +{ + QFETCH(bool, valid); + QFETCH(QByteArray, data); + QFETCH(QString, channel); + QFETCH(QString, topic); + QFETCH(bool, reply); + + IrcConnection connection; + IrcMessage* message = IrcMessage::fromData(data, &connection); + QCOMPARE(message->type(), IrcMessage::Topic); + QCOMPARE(message->command(), QString("TOPIC")); + QCOMPARE(message->property("valid").toBool(), valid); + QCOMPARE(message->property("channel").toString(), channel); + QCOMPARE(message->property("topic").toString(), topic); + QCOMPARE(message->property("reply").toBool(), reply); + + IrcTopicMessage* topicMessage = qobject_cast(message); + QVERIFY(topicMessage); + QCOMPARE(topicMessage->isValid(), valid); + QCOMPARE(topicMessage->channel(), channel); + QCOMPARE(topicMessage->topic(), topic); + QCOMPARE(topicMessage->isReply(), reply); +} + +void tst_IrcMessage::testWhoReplyMessage_data() +{ + QTest::addColumn("valid"); + QTest::addColumn("prefix"); + QTest::addColumn("params"); + QTest::addColumn("mask"); + QTest::addColumn("server"); + QTest::addColumn("away"); + QTest::addColumn("servOp"); + QTest::addColumn("realName"); + + QTest::newRow("normal") << true << "nick!ident@host" + << (QStringList() << "#mask" << "irc.ser.ver" << "H@" << "real name") + << "#mask" << "irc.ser.ver" << false << false << "real name"; + + QTest::newRow("away") << true << "nick!ident@host" + << (QStringList() << "*" << "127.0.0.1" << "G@" << "real name") + << "*" << "127.0.0.1" << true << false << "real name"; + + QTest::newRow("serv op") << true << "nick!ident@host" + << (QStringList() << "*" << "127.0.0.1" << "H*@" << "real name") + << "*" << "127.0.0.1" << false << true << "real name"; + + QTest::newRow("no name") << true << "nick!ident@host" + << (QStringList() << "#mask" << "irc.ser.ver" << "H@" << "") + << "#mask" << "irc.ser.ver" << false << false << ""; +} + +void tst_IrcMessage::testWhoReplyMessage() +{ + QFETCH(bool, valid); + QFETCH(QString, prefix); + QFETCH(QStringList, params); + QFETCH(QString, mask); + QFETCH(QString, server); + QFETCH(bool, away); + QFETCH(bool, servOp); + QFETCH(QString, realName); + + IrcConnection connection; + IrcWhoReplyMessage message(&connection); + message.setPrefix(prefix); + message.setParameters(params); + QCOMPARE(message.isValid(), valid); + QCOMPARE(message.type(), IrcMessage::WhoReply); + // TODO: QCOMPARE(message.command(), QString::number(Irc::RPL_WHOREPLY)); + QCOMPARE(message.mask(), mask); + QCOMPARE(message.server(), server); + QCOMPARE(message.isAway(), away); + QCOMPARE(message.isServOp(), servOp); + QCOMPARE(message.realName(), realName); + + QCOMPARE(message.property("valid").toBool(), valid); + QCOMPARE(message.property("mask").toString(), mask); + QCOMPARE(message.property("server").toString(), server); + QCOMPARE(message.property("away").toBool(), away); + QCOMPARE(message.property("servOp").toBool(), servOp); + QCOMPARE(message.property("realName").toString(), realName); +} + +void tst_IrcMessage::testDebug() +{ + QString str; + QDebug dbg(&str); + + dbg << static_cast(0); + QCOMPARE(str.trimmed(), QString::fromLatin1("IrcMessage(0x0)")); + str.clear(); + + IrcMessage message(0); + dbg << &message; + QVERIFY(QRegExp("IrcMessage\\(0x[0-9A-Fa-f]+, flags=\\(None\\)\\) ").exactMatch(str)); + str.clear(); + + message.setObjectName("foo"); + dbg << &message; + QVERIFY(QRegExp("IrcMessage\\(0x[0-9A-Fa-f]+, name=foo, flags=\\(None\\)\\) ").exactMatch(str)); + str.clear(); + + message.setPrefix("nick!ident@host"); + dbg << &message; + QVERIFY(QRegExp("IrcMessage\\(0x[0-9A-Fa-f]+, name=foo, flags=\\(None\\), prefix=nick!ident@host\\) ").exactMatch(str)); + str.clear(); + + message.setCommand("COMMAND"); + dbg << &message; + QVERIFY(QRegExp("IrcMessage\\(0x[0-9A-Fa-f]+, name=foo, flags=\\(None\\), prefix=nick!ident@host, command=COMMAND\\) ").exactMatch(str)); + str.clear(); + + dbg << IrcMessage::Join; + QCOMPARE(str.trimmed(), QString::fromLatin1("Join")); + str.clear(); + + dbg << IrcMessage::Unidentified; + QCOMPARE(str.trimmed(), QString::fromLatin1("Unidentified")); + str.clear(); + + dbg << (IrcMessage::Own | IrcMessage::Identified | IrcMessage::Unidentified); + QCOMPARE(str.trimmed(), QString::fromLatin1("(Own|Identified|Unidentified)")); + str.clear(); + + dbg << IrcModeMessage::Channel; + QCOMPARE(str.trimmed(), QString::fromLatin1("Channel")); + str.clear(); +} + +QTEST_MAIN(tst_IrcMessage) + +#include "tst_ircmessage.moc" diff --git a/src/libcommuni/tests/auto/ircnetwork/ircnetwork.pro b/src/libcommuni/tests/auto/ircnetwork/ircnetwork.pro new file mode 100644 index 0000000..d4bebfb --- /dev/null +++ b/src/libcommuni/tests/auto/ircnetwork/ircnetwork.pro @@ -0,0 +1,8 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircnetwork.cpp + +include(../shared/shared.pri) +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircnetwork/tst_ircnetwork.cpp b/src/libcommuni/tests/auto/ircnetwork/tst_ircnetwork.cpp new file mode 100644 index 0000000..5237659 --- /dev/null +++ b/src/libcommuni/tests/auto/ircnetwork/tst_ircnetwork.cpp @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircnetwork.h" +#include "irccommand.h" +#include "ircconnection.h" +#include +#include +#include "tst_ircclientserver.h" +#include "tst_ircdata.h" +#ifdef Q_OS_LINUX +#include "ircnetwork_p.h" +#endif // Q_OS_LINUX + +class tst_IrcNetwork : public tst_IrcClientServer +{ + Q_OBJECT + +private slots: + void testDefaults(); + + void testInfo_data(); + void testInfo(); + + void testCapabilities_data(); + void testCapabilities(); + + void testDebug(); +}; + +void tst_IrcNetwork::testDefaults() +{ + IrcConnection connection; + IrcNetwork* network = connection.network(); + QVERIFY(!network->isInitialized()); + QVERIFY(network->name().isNull()); + QVERIFY(network->modes().isEmpty()); + QVERIFY(network->prefixes().isEmpty()); + QVERIFY(network->channelTypes().isEmpty()); + QVERIFY(network->availableCapabilities().isEmpty()); + QVERIFY(network->requestedCapabilities().isEmpty()); + QVERIFY(network->activeCapabilities().isEmpty()); +} + +void tst_IrcNetwork::testInfo_data() +{ + QTest::addColumn("welcome"); + QTest::addColumn("name"); + QTest::addColumn("modes"); + QTest::addColumn("prefixes"); + QTest::addColumn("channelTypes"); + + QTest::newRow("freenode") << tst_IrcData::welcome("freenode") << "freenode" << "ov" << "@+" << "#"; + QTest::newRow("ircnet") << tst_IrcData::welcome("ircnet") << "IRCNet" << "ov" << "@+" << "#&!+"; + QTest::newRow("euirc") << tst_IrcData::welcome("euirc") << "euIRCnet" << "qaohv" << "*!@%+" << "#&+"; +} + +void tst_IrcNetwork::testInfo() +{ + QFETCH(QByteArray, welcome); + QFETCH(QString, name); + QFETCH(QString, modes); + QFETCH(QString, prefixes); + QFETCH(QString, channelTypes); + + IrcNetwork* network = connection->network(); + + QSignalSpy initSpy(network, SIGNAL(initialized())); + QSignalSpy nameSpy(network, SIGNAL(nameChanged(QString))); + QSignalSpy modesSpy(network, SIGNAL(modesChanged(QStringList))); + QSignalSpy prefixesSpy(network, SIGNAL(prefixesChanged(QStringList))); + QSignalSpy channelTypesSpy(network, SIGNAL(channelTypesChanged(QStringList))); + + QVERIFY(initSpy.isValid()); + QVERIFY(nameSpy.isValid()); + QVERIFY(modesSpy.isValid()); + QVERIFY(prefixesSpy.isValid()); + QVERIFY(channelTypesSpy.isValid()); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(welcome)); + + QVERIFY(network->isInitialized()); + + QCOMPARE(network->name(), name); + QCOMPARE(network->modes(), modes.split("", QString::SkipEmptyParts)); + QCOMPARE(network->prefixes(), prefixes.split("", QString::SkipEmptyParts)); + QCOMPARE(network->channelTypes(), channelTypes.split("", QString::SkipEmptyParts)); + + QCOMPARE(network->prefixes().count(), network->modes().count()); + for (int i = 0; i < network->prefixes().count(); ++i) { + QString prefix = network->prefixes().at(i); + QString mode = network->modes().at(i); + QCOMPARE(network->prefixToMode(prefix), mode); + QCOMPARE(network->modeToPrefix(mode), prefix); + } + + QVERIFY(!network->channelTypes().isEmpty()); + QVERIFY(!network->isChannel("foo")); + QVERIFY(network->isChannel(network->channelTypes().at(0) + "foo")); + + QVERIFY(!network->channelModes(IrcNetwork::TypeA).isEmpty()); + QVERIFY(!network->channelModes(IrcNetwork::TypeB).isEmpty()); + QVERIFY(!network->channelModes(IrcNetwork::TypeC).isEmpty()); + QVERIFY(!network->channelModes(IrcNetwork::TypeD).isEmpty()); + + if (welcome.contains("NICKLEN=")) + QVERIFY(network->numericLimit(IrcNetwork::NickLength) != -1); + else + QCOMPARE(network->numericLimit(IrcNetwork::NickLength), -1); + if (welcome.contains("CHANNELLEN=")) + QVERIFY(network->numericLimit(IrcNetwork::ChannelLength) != -1); + else + QCOMPARE(network->numericLimit(IrcNetwork::ChannelLength), -1); + if (welcome.contains("TOPICLEN=")) + QVERIFY(network->numericLimit(IrcNetwork::TopicLength) != -1); + else + QCOMPARE(network->numericLimit(IrcNetwork::TopicLength), -1); + if (welcome.contains("KICKLEN=")) + QVERIFY(network->numericLimit(IrcNetwork::KickReasonLength) != -1); + else + QCOMPARE(network->numericLimit(IrcNetwork::KickReasonLength), -1); + if (welcome.contains("AWAYLEN=")) + QVERIFY(network->numericLimit(IrcNetwork::AwayReasonLength) != -1); + else + QCOMPARE(network->numericLimit(IrcNetwork::AwayReasonLength), -1); + if (welcome.contains("MODES=")) + QVERIFY(network->numericLimit(IrcNetwork::ModeCount) != -1); + else + QCOMPARE(network->numericLimit(IrcNetwork::ModeCount), -1); + + QCOMPARE(network->numericLimit(IrcNetwork::MessageLength), 512); // hard-coded :/ + + if (welcome.contains("MAXLIST=")) { + bool limited = false; + foreach (const QString& mode, network->modes()) + if (network->modeLimit(mode) != -1) + limited = true; + QVERIFY(limited); + } + + if (welcome.contains("CHANLIMIT=")) { + bool limited = false; + foreach (const QString& type, network->channelTypes()) + if (network->channelLimit(type) != -1) + limited = true; + QVERIFY(limited); + } + + if (welcome.contains("TARGMAX=")) { + bool limited = false; + IrcCommand command; + for (int i = IrcCommand::Admin; i <= IrcCommand::Whowas; ++i) { + if (i != IrcCommand::Custom) { + command.setType(static_cast(i)); + QString cmd = command.toString().split(" ", QString::SkipEmptyParts).value(0); + if (network->targetLimit(cmd) != -1) + limited = true; + } + } + QVERIFY(limited); + } + + QCOMPARE(initSpy.count(), 1); + QCOMPARE(nameSpy.count(), 1); + QCOMPARE(modesSpy.count(), 1); + QCOMPARE(prefixesSpy.count(), 1); + QCOMPARE(channelTypesSpy.count(), 1); + + QCOMPARE(nameSpy.first().first().toString(), name); + QCOMPARE(modesSpy.first().first().toStringList(), modes.split("", QString::SkipEmptyParts)); + QCOMPARE(prefixesSpy.first().first().toStringList(), prefixes.split("", QString::SkipEmptyParts)); + QCOMPARE(channelTypesSpy.first().first().toStringList(), channelTypes.split("", QString::SkipEmptyParts)); +} + +void tst_IrcNetwork::testCapabilities_data() +{ + QTest::addColumn("initialCaps"); + QTest::addColumn("requestedCaps"); + QTest::addColumn("ackedCaps"); + QTest::addColumn("nakedCaps"); + QTest::addColumn("listedCaps"); + QTest::addColumn("availableCaps"); + QTest::addColumn("activeCaps"); + + QTest::newRow("empty") << QString() + << QString() + << QString() + << QString() + << QString() + << QString() + << QString(); + + QTest::newRow("sasl") << QString("multi-prefix sasl identify-msg") // initial + << QString("sasl") // requested + << QString("sasl") // acked + << QString() // naked + << QString("sasl identify-msg multi-prefix") // listed + << QString("sasl identify-msg multi-prefix") // available + << QString("sasl"); // active + + QTest::newRow("unk") << QString("multi-prefix sasl identify-msg") // initial + << QString("unk") // requested + << QString() // acked + << QString("nak") // naked + << QString("multi-prefix sasl identify-msg") // listed + << QString("multi-prefix sasl identify-msg") // available + << QString(); // active + + QTest::newRow("nak all") << QString("multi-prefix sasl identify-msg") // initial + << QString("sasl identify-msg multi-prefix") // requested + << QString() // acked + << QString("sasl identify-msg multi-prefix") // naked + << QString("sasl identify-msg multi-prefix") // listed + << QString("sasl identify-msg multi-prefix") // available + << QString(); // active + + QTest::newRow("sticky") << QString("=sticky") // initial + << QString("sticky") // requested + << QString("=sticky") // acked + << QString() // naked + << QString() // listed + << QString("sticky") // available + << QString("sticky"); // active + + QTest::newRow("ackmod") << QString("~ackmod") // initial + << QString("ackmod") // requested + << QString("~ackmod") // acked + << QString() // naked + << QString() // listed + << QString("ackmod") // available + << QString("ackmod"); // active + + QTest::newRow("acksticky") << QString("~=acksticky") // initial + << QString("acksticky") // requested + << QString("=~acksticky") // acked + << QString() // naked + << QString() // listed + << QString("acksticky") // available + << QString("acksticky"); // active +} + +static bool equalCaps(const QString& left, const QString& right) +{ + return left.split(" ", QString::SkipEmptyParts).toSet() == right.split(" ", QString::SkipEmptyParts).toSet(); +} + +void tst_IrcNetwork::testCapabilities() +{ + QFETCH(QString, initialCaps); + QFETCH(QString, requestedCaps); + QFETCH(QString, ackedCaps); + QFETCH(QString, nakedCaps); + QFETCH(QString, listedCaps); + QFETCH(QString, availableCaps); + QFETCH(QString, activeCaps); + + IrcNetwork* network = connection->network(); + + QSignalSpy availableSpy(network, SIGNAL(availableCapabilitiesChanged(QStringList))); + QSignalSpy requestedSpy(network, SIGNAL(requestedCapabilitiesChanged(QStringList))); + QSignalSpy activeSpy(network, SIGNAL(activeCapabilitiesChanged(QStringList))); + QSignalSpy requestingSpy(network, SIGNAL(requestingCapabilities())); + + QVERIFY(availableSpy.isValid()); + QVERIFY(requestedSpy.isValid()); + QVERIFY(activeSpy.isValid()); + QVERIFY(requestingSpy.isValid()); + + int availableCount = 0; + int requestedCount = 0; + int activeCount = 0; + int requestingCount = 0; + + if (!requestedCaps.isEmpty()) { + network->setRequestedCapabilities(requestedCaps.split(" ", QString::SkipEmptyParts)); + ++requestedCount; + } + QCOMPARE(requestedSpy.count(), requestedCount); + + foreach (const QString& cap, availableCaps.split(" ", QString::SkipEmptyParts)) + QVERIFY(!network->hasCapability(cap)); + foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) + QVERIFY(!network->isCapable(cap)); + + connection->open(); + QVERIFY(waitForOpened()); + + if (!initialCaps.isEmpty()) { + // typical ircd: "*", znc: "unknown-nick" + QVERIFY(waitForWritten(":irc.ser.ver CAP unknown-nick LS :" + initialCaps.toUtf8())); + ++availableCount; + ++requestingCount; + } + QCOMPARE(availableSpy.count(), availableCount); + QCOMPARE(requestingSpy.count(), requestingCount); + + foreach (const QString& cap, availableCaps.split(" ", QString::SkipEmptyParts)) + QVERIFY(network->hasCapability(cap)); + foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) + QVERIFY(!network->isCapable(cap)); + + if (!ackedCaps.isEmpty()) { + QVERIFY(waitForWritten(":irc.ser.ver CAP jpnurmi ACK :" + ackedCaps.toUtf8())); + ++activeCount; + } + QCOMPARE(activeSpy.count(), activeCount); + + foreach (const QString& cap, availableCaps.split(" ", QString::SkipEmptyParts)) + QVERIFY(network->hasCapability(cap)); + foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) + QVERIFY(network->isCapable(cap)); + + if (!nakedCaps.isEmpty()) + QVERIFY(waitForWritten(":irc.ser.ver CAP jpnurmi NAK :" + nakedCaps.toUtf8())); + + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + if (!listedCaps.isEmpty()) { + QVERIFY(waitForWritten(":irc.ser.ver CAP jpnurmi LS :" + listedCaps.toUtf8())); + if (!equalCaps(listedCaps, initialCaps)) + ++availableCount; + } + QCOMPARE(availableSpy.count(), availableCount); + + QVERIFY(equalCaps(network->availableCapabilities().join(" "), availableCaps)); + QVERIFY(equalCaps(network->activeCapabilities().join(" "), activeCaps)); + QVERIFY(equalCaps(network->requestedCapabilities().join(" "), requestedCaps)); + + QCOMPARE(requestedSpy.count(), requestedCount); + QCOMPARE(requestingSpy.count(), requestingCount); + QCOMPARE(availableSpy.count(), availableCount); + QCOMPARE(activeSpy.count(), activeCount); + + foreach (const QString& cap, availableCaps.split(" ", QString::SkipEmptyParts)) + QVERIFY(network->hasCapability(cap)); + foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) + QVERIFY(network->isCapable(cap)); + + // -> CLEAR + QString clearCaps; + foreach (const QString& cap, activeCaps.split(" ", QString::SkipEmptyParts)) + clearCaps += QString("-") + cap; + QVERIFY(waitForWritten(":irc.ser.ver CAP jpnurmi ACK :" + clearCaps.toUtf8())); + + if (!activeCaps.isEmpty()) + ++activeCount; + QCOMPARE(activeSpy.count(), activeCount); +} + +void tst_IrcNetwork::testDebug() +{ + QString str; + QDebug dbg(&str); + + dbg << static_cast(0); + QCOMPARE(str.trimmed(), QString::fromLatin1("IrcNetwork(0x0)")); + str.clear(); + + IrcConnection connection; + dbg << connection.network(); + QVERIFY(QRegExp("IrcNetwork\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); + str.clear(); + + connection.network()->setObjectName("obj"); + dbg << connection.network(); + QVERIFY(QRegExp("IrcNetwork\\(0x[0-9A-Fa-f]+, name=obj\\) ").exactMatch(str)); + str.clear(); + +#ifdef Q_OS_LINUX + // others have problems with symbols (win) or private headers (osx frameworks) + IrcNetworkPrivate::get(connection.network())->name = "net"; + dbg << connection.network(); + QVERIFY(QRegExp("IrcNetwork\\(0x[0-9A-Fa-f]+, name=obj, network=net\\) ").exactMatch(str)); + str.clear(); +#endif // Q_OS_LINUX + + dbg << IrcNetwork::MessageLength; + QCOMPARE(str.trimmed(), QString::fromLatin1("MessageLength")); + str.clear(); + + dbg << IrcNetwork::AllTypes; + QCOMPARE(str.trimmed(), QString::fromLatin1("AllTypes")); + str.clear(); + + dbg << (IrcNetwork::TypeA | IrcNetwork::TypeD); + QCOMPARE(str.trimmed(), QString::fromLatin1("(TypeA|TypeD)")); + str.clear(); + + dbg << (IrcNetwork::TypeB | IrcNetwork::TypeC); + QCOMPARE(str.trimmed(), QString::fromLatin1("(TypeB|TypeC)")); + str.clear(); + + dbg << (IrcNetwork::TypeA | IrcNetwork::TypeB | IrcNetwork::TypeC | IrcNetwork::TypeD); + QCOMPARE(str.trimmed(), QString::fromLatin1("(AllTypes)")); + str.clear(); +} + +QTEST_MAIN(tst_IrcNetwork) + +#include "tst_ircnetwork.moc" diff --git a/src/libcommuni/tests/auto/ircpalette/ircpalette.pro b/src/libcommuni/tests/auto/ircpalette/ircpalette.pro new file mode 100644 index 0000000..a31264d --- /dev/null +++ b/src/libcommuni/tests/auto/ircpalette/ircpalette.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircpalette.cpp + +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircpalette/tst_ircpalette.cpp b/src/libcommuni/tests/auto/ircpalette/tst_ircpalette.cpp new file mode 100644 index 0000000..756b78d --- /dev/null +++ b/src/libcommuni/tests/auto/ircpalette/tst_ircpalette.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "irc.h" +#include "ircpalette.h" +#include "irctextformat.h" +#include + +class tst_IrcPalette : public QObject +{ + Q_OBJECT + +private slots: + void testDefaults(); + void testColorNames(); + void testProperties_data(); + void testProperties(); +}; + +void tst_IrcPalette::testDefaults() +{ + IrcTextFormat format; + QVERIFY(format.palette()); + IrcPalette* palette = format.palette(); + QVERIFY(!palette->colorNames().isEmpty()); + for (int i = Irc::White; i <= Irc::LightGray; ++i) + QVERIFY(!palette->colorName(i).isEmpty()); + QCOMPARE(palette->colorName(-1, "fallback"), QString("fallback")); +} + +void tst_IrcPalette::testColorNames() +{ + IrcTextFormat format; + QVERIFY(format.palette()); + IrcPalette* palette = format.palette(); + QMap colorNames; + for (int i = -1; i <= 123; ++i) { + colorNames.insert(i, QString::number(i)); + palette->setColorName(i, QString::number(i)); + QCOMPARE(palette->colorName(i), QString::number(i)); + } + QCOMPARE(palette->colorNames(), colorNames); + + QMap dummies; + for (int i = 0; i < 100; i += 3) + dummies.insert(i, QString::number(i) + "-dummy"); + palette->setColorNames(dummies); + QCOMPARE(palette->colorNames(), dummies); +} + +void tst_IrcPalette::testProperties_data() +{ + QTest::addColumn("color"); + QTest::addColumn("prop"); + + QTest::newRow("white") << Irc::White << "white"; + QTest::newRow("black") << Irc::Black << "black"; + QTest::newRow("blue") << Irc::Blue << "blue"; + QTest::newRow("green") << Irc::Green << "green"; + QTest::newRow("red") << Irc::Red << "red"; + QTest::newRow("brown") << Irc::Brown << "brown"; + QTest::newRow("purple") << Irc::Purple << "purple"; + QTest::newRow("orange") << Irc::Orange << "orange"; + QTest::newRow("yellow") << Irc::Yellow << "yellow"; + QTest::newRow("lightGreen") << Irc::LightGreen << "lightGreen"; + QTest::newRow("cyan") << Irc::Cyan << "cyan"; + QTest::newRow("lightCyan") << Irc::LightCyan << "lightCyan"; + QTest::newRow("lightBlue") << Irc::LightBlue << "lightBlue"; + QTest::newRow("pink") << Irc::Pink << "pink"; + QTest::newRow("gray") << Irc::Gray << "gray"; + QTest::newRow("lightGray") << Irc::LightGray << "lightGray"; +} + +void tst_IrcPalette::testProperties() +{ + QFETCH(Irc::Color, color); + QFETCH(QString, prop); + + IrcTextFormat format; + QVERIFY(format.palette()); + IrcPalette* palette = format.palette(); + + QCOMPARE(palette->property(prop.toUtf8()).toString(), prop.toLower()); + + QVERIFY(palette->setProperty(prop.toUtf8(), QString("dummy"))); + QCOMPARE(palette->colorName(color), QString("dummy")); + QCOMPARE(palette->property(prop.toUtf8()).toString(), QString("dummy")); + + palette->setColorName(color, QString("dummier")); + QCOMPARE(palette->colorName(color), QString("dummier")); + QCOMPARE(palette->property(prop.toUtf8()).toString(), QString("dummier")); +} + +QTEST_MAIN(tst_IrcPalette) + +#include "tst_ircpalette.moc" diff --git a/src/libcommuni/tests/auto/irctextformat/irctextformat.pro b/src/libcommuni/tests/auto/irctextformat/irctextformat.pro new file mode 100644 index 0000000..3b90b66 --- /dev/null +++ b/src/libcommuni/tests/auto/irctextformat/irctextformat.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_irctextformat.cpp + +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/irctextformat/tst_irctextformat.cpp b/src/libcommuni/tests/auto/irctextformat/tst_irctextformat.cpp new file mode 100644 index 0000000..377a438 --- /dev/null +++ b/src/libcommuni/tests/auto/irctextformat/tst_irctextformat.cpp @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "irc.h" +#include "irctextformat.h" +#include "ircpalette.h" +#include + +class tst_IrcTextFormat : public QObject +{ + Q_OBJECT + +private slots: + void testDefaults(); + void testPlainText_data(); + void testPlainText(); + void testHtml_data(); + void testHtml(); + void testUrls_data(); + void testUrls(); +}; + +void tst_IrcTextFormat::testDefaults() +{ + IrcTextFormat format; + QVERIFY(format.palette()); + QVERIFY(!format.urlPattern().isEmpty()); + QCOMPARE(format.spanFormat(), IrcTextFormat::SpanStyle); +} + +void tst_IrcTextFormat::testPlainText_data() +{ + QTest::addColumn("input"); + QTest::addColumn("output"); + + QTest::newRow("bold") << "\02bold\x0f" << "bold"; + QTest::newRow("line-through") << "\x13line-through\x0f" << "line-through"; + QTest::newRow("underline") << "\x15underline\x0f" << "underline"; + QTest::newRow("inverse") << "\x16inverse\x0f" << "inverse"; + QTest::newRow("italic") << "\x1ditalic\x0f" << "italic"; + QTest::newRow("underline") << "\x1funderline\x0f" << "underline"; + + IrcTextFormat format; + QVERIFY(format.palette()); + IrcPalette* palette = format.palette(); + for (int i = Irc::White; i <= Irc::LightGray; ++i) { + QString color = palette->colorName(i); + QTest::newRow(color.toUtf8()) << QString("\x03%1%2\x0f").arg(i).arg(color) << color; + } + + QTest::newRow("dummy \\x03") << "foo\x03 \02bold\x0f bar\x03" << "foo bold bar"; + QTest::newRow("extra \\x0f") << "foo\x0f \02bold\x0f bar\x0f" << "foo bold bar"; + QTest::newRow("background") << QString("foo \x03%1,%1red\x0f on \x03%1,%1red\x03 bar").arg(Irc::Red) << "foo red on red bar"; +} + +void tst_IrcTextFormat::testPlainText() +{ + QFETCH(QString, input); + QFETCH(QString, output); + + IrcTextFormat format; + QCOMPARE(format.toPlainText(input), output); + + format.parse(input); + QCOMPARE(format.plainText(), output); +} + +void tst_IrcTextFormat::testHtml_data() +{ + qRegisterMetaType(); + + QTest::addColumn("span"); + QTest::addColumn("input"); + QTest::addColumn("output"); + + QTest::newRow("style=bold") << IrcTextFormat::SpanStyle << "foo \02bold\x0f and \02bold\02 bar" << "foo bold and bold bar"; + QTest::newRow("class=bold") << IrcTextFormat::SpanClass << "foo \02bold\x0f and \02bold\02 bar" << "foo bold and bold bar"; + + QTest::newRow("style=line-through") << IrcTextFormat::SpanStyle << "foo \x13line\x0f and \x13through\x13 bar" << "foo line and through bar"; + QTest::newRow("class=line-through") << IrcTextFormat::SpanClass << "foo \x13line\x0f and \x13through\x13 bar" << "foo line and through bar"; + + QTest::newRow("style=underline1") << IrcTextFormat::SpanStyle << "foo \x15under\x0f and \x15line\x15 bar" << "foo under and line bar"; + + QTest::newRow("style=inverse") << IrcTextFormat::SpanStyle << "foo \x16inverse\x0f and \x16inverse\x16 bar" << "foo inverse and inverse bar"; + QTest::newRow("class=inverse") << IrcTextFormat::SpanClass << "foo \x16inverse\x0f and \x16inverse\x16 bar" << "foo inverse and inverse bar"; + + QTest::newRow("style=italic") << IrcTextFormat::SpanStyle << "foo \x1ditalic\x0f and \x1ditalic\x1d bar" << "foo italic and italic bar"; + QTest::newRow("class=italic") << IrcTextFormat::SpanClass << "foo \x1ditalic\x0f and \x1ditalic\x1d bar" << "foo italic and italic bar"; + + QTest::newRow("style=underline2") << IrcTextFormat::SpanStyle << "foo \x1funder\x0f and \x1fline\x1f bar" << "foo under and line bar"; + + IrcTextFormat format; + QVERIFY(format.palette()); + IrcPalette* palette = format.palette(); + for (int i = Irc::White; i <= Irc::LightGray; ++i) { + QString color = palette->colorName(i); + QTest::newRow(QString("style=%1").arg(color).toUtf8()) << IrcTextFormat::SpanStyle << QString("foo \x03%1%2\x0f and \x03%1%2\x03 bar").arg(i).arg(color) << QString("foo %1 and %1 bar").arg(color); + QTest::newRow(QString("class=%1").arg(color).toUtf8()) << IrcTextFormat::SpanClass << QString("foo \x03%1%2\x0f and \x03%1%2\x03 bar").arg(i).arg(color) << QString("foo %1 and %1 bar").arg(color); + } + + QTest::newRow("extra \\x0f") << IrcTextFormat::SpanStyle << "foo\x0f \02bold\x0f bar\x0f" << "foo bold bar"; + + QTest::newRow("style=background") << IrcTextFormat::SpanStyle << QString("foo \x03%1,%1red\x0f on \x03%1,%1red\x03 bar").arg(Irc::Red) << "foo red on red bar"; + QTest::newRow("class=background") << IrcTextFormat::SpanClass << QString("foo \x03%1,%1red\x0f on \x03%1,%1red\x03 bar").arg(Irc::Red) << "foo red on red bar"; +} + +void tst_IrcTextFormat::testHtml() +{ + QFETCH(IrcTextFormat::SpanFormat, span); + QFETCH(QString, input); + QFETCH(QString, output); + + IrcTextFormat format; + format.setSpanFormat(span); + QCOMPARE(format.toHtml(input), output); + + format.parse(input); + QCOMPARE(format.html(), output); +} + +Q_DECLARE_METATYPE(QList) +void tst_IrcTextFormat::testUrls_data() +{ + qRegisterMetaType >(); + + QTest::addColumn("pattern"); + QTest::addColumn("input"); + QTest::addColumn("output"); + QTest::addColumn >("urls"); + + QString defaultPattern = IrcTextFormat().urlPattern(); + + QTest::newRow("www.fi") << defaultPattern << "www.fi" << "www.fi" << (QList() << QUrl("http://www.fi")); + QTest::newRow("ftp.funet.fi") << defaultPattern << "ftp.funet.fi" << "ftp.funet.fi" << (QList() << QUrl("ftp://ftp.funet.fi")); + QTest::newRow("jpnurmi@gmail.com") << defaultPattern << "jpnurmi@gmail.com" << "jpnurmi@gmail.com" << (QList() << QUrl("mailto:jpnurmi@gmail.com")); + QTest::newRow("quote") << defaultPattern << "http://en.wikipedia.org/wiki/Shamir's_Secret_Sharing" << "http://en.wikipedia.org/wiki/Shamir's_Secret_Sharing" << (QList() << QUrl("http://en.wikipedia.org/wiki/Shamir's_Secret_Sharing")); + QTest::newRow("percent") << defaultPattern << "http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing" << "http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing" << (QList() << QUrl("http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing")); + QTest::newRow("parentheses") << defaultPattern << "http://en.wikipedia.org/wiki/Qt_(software)" << "http://en.wikipedia.org/wiki/Qt_(software)" << (QList() << QUrl("http://en.wikipedia.org/wiki/Qt_(software)")); + QTest::newRow("hash & comma") << defaultPattern << "https://codereview.qt-project.org/#change,1" << "https://codereview.qt-project.org/#change,1" << (QList() << QUrl("https://codereview.qt-project.org/#change,1")); + QTest::newRow("equal & question & ampersand") << defaultPattern << "https://www.google.no/imghp?hl=en&tab=wi" << "https://www.google.no/imghp?hl=en&tab=wi" << (QList() << QUrl("https://www.google.no/imghp?hl=en&tab=wi")); + QTest::newRow("github commits") << defaultPattern << "https://github.com/communi/libcommuni/compare/ebf3c8ea47dc...19d66ddcb122" << "https://github.com/communi/libcommuni/compare/ebf3c8ea47dc...19d66ddcb122" << (QList() << QUrl("https://github.com/communi/libcommuni/compare/ebf3c8ea47dc...19d66ddcb122")); + QTest::newRow("multiple") << defaultPattern << "www.fi ftp.funet.fi jpnurmi@gmail.com" << "www.fi ftp.funet.fi jpnurmi@gmail.com" << (QList() << QUrl("http://www.fi") << QUrl("ftp://ftp.funet.fi") << QUrl("mailto:jpnurmi@gmail.com")); + QTest::newRow("empty pattern") << QString() << "www.fi ftp.funet.fi jpnurmi@gmail.com" << "www.fi ftp.funet.fi jpnurmi@gmail.com" << QList(); + + QTest::newRow("info") << defaultPattern + << QString("[freenode-info] if you're at a conference and other people are having trouble connecting, please mention it to staff: http://freenode.net/faq.shtml#gettinghelp") + << QString("[freenode-info] if you're at a conference and other people are having trouble connecting, please mention it to staff: http://freenode.net/faq.shtml#gettinghelp") + << (QList() << QUrl("http://freenode.net/faq.shtml#gettinghelp")); + QTest::newRow("topic") << defaultPattern + << QString("Communi 1.2.2 - IRC framework || Home: http://communi.github.com || Docs: http://communi.github.com/doc || MeeGo: http://store.ovi.com/content/219150") + << QString("Communi 1.2.2 - IRC framework || Home: http://communi.github.com || Docs: http://communi.github.com/doc || MeeGo: http://store.ovi.com/content/219150") + << (QList() << QUrl("http://communi.github.com") << QUrl("http://communi.github.com/doc") << QUrl("http://store.ovi.com/content/219150")); + QTest::newRow("commit") << defaultPattern + << QString("[communi-desktop] jpnurmi pushed 2 new commits to master: https://github.com/communi/communi-desktop/compare/257ca915a490...8832bfe8d0b8") + << QString("[communi-desktop] jpnurmi pushed 2 new commits to master: https://github.com/communi/communi-desktop/compare/257ca915a490...8832bfe8d0b8") + << (QList() << QUrl("https://github.com/communi/communi-desktop/compare/257ca915a490...8832bfe8d0b8")); + QTest::newRow("with protocol") << defaultPattern + << QString("aa http://www.fi bb ftp://ftp.funet.fi cc") + << QString("aa http://www.fi bb ftp://ftp.funet.fi cc") + << (QList() << QUrl("http://www.fi") << QUrl("ftp://ftp.funet.fi")); + QTest::newRow("without protocol") << defaultPattern + << QString("aa www.fi bb ftp.funet.fi cc jpnurmi@gmail.com dd") + << QString("aa www.fi bb ftp.funet.fi cc jpnurmi@gmail.com dd") + << (QList() << QUrl("http://www.fi") << QUrl("ftp://ftp.funet.fi") << QUrl("mailto:jpnurmi@gmail.com")); +} + +void tst_IrcTextFormat::testUrls() +{ + QFETCH(QString, pattern); + QFETCH(QString, input); + QFETCH(QString, output); + QFETCH(QList, urls); + + IrcTextFormat format; + format.setUrlPattern(pattern); + QCOMPARE(format.urlPattern(), pattern); + QCOMPARE(format.toHtml(input), output); + + format.parse(input); + QCOMPARE(format.html(), output); + QCOMPARE(format.urls(), urls); +} + +QTEST_MAIN(tst_IrcTextFormat) + +#include "tst_irctextformat.moc" diff --git a/src/libcommuni/tests/auto/ircuser/ircuser.pro b/src/libcommuni/tests/auto/ircuser/ircuser.pro new file mode 100644 index 0000000..b81617f --- /dev/null +++ b/src/libcommuni/tests/auto/ircuser/ircuser.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircuser.cpp + +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircuser/tst_ircuser.cpp b/src/libcommuni/tests/auto/ircuser/tst_ircuser.cpp new file mode 100644 index 0000000..c575c14 --- /dev/null +++ b/src/libcommuni/tests/auto/ircuser/tst_ircuser.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircuser.h" +#include +#include +#ifdef Q_OS_LINUX +#include "ircuser_p.h" +#endif // Q_OS_LINUX + +class tst_IrcUser : public QObject +{ + Q_OBJECT + +private slots: + void testDefaults(); + void testSignals(); + void testDebug(); +}; + +void tst_IrcUser::testDefaults() +{ + IrcUser user; + QVERIFY(user.title().isEmpty()); + QVERIFY(user.name().isEmpty()); + QVERIFY(user.prefix().isEmpty()); + QVERIFY(user.mode().isEmpty()); + QVERIFY(!user.isServOp()); + QVERIFY(!user.isAway()); + QVERIFY(!user.channel()); +} + +void tst_IrcUser::testSignals() +{ + IrcUser user; + QSignalSpy titleSpy(&user, SIGNAL(titleChanged(QString))); + QSignalSpy nameSpy(&user, SIGNAL(nameChanged(QString))); + QSignalSpy prefixSpy(&user, SIGNAL(prefixChanged(QString))); + QSignalSpy modeSpy(&user, SIGNAL(modeChanged(QString))); + QSignalSpy servOpSpy(&user, SIGNAL(servOpChanged(bool))); + QSignalSpy awaySpy(&user, SIGNAL(awayChanged(bool))); + QVERIFY(titleSpy.isValid()); + QVERIFY(nameSpy.isValid()); + QVERIFY(prefixSpy.isValid()); + QVERIFY(modeSpy.isValid()); + QVERIFY(servOpSpy.isValid()); + QVERIFY(awaySpy.isValid()); +} + +void tst_IrcUser::testDebug() +{ + QString str; + QDebug dbg(&str); + + dbg << static_cast(0); + QCOMPARE(str.trimmed(), QString::fromLatin1("IrcUser(0x0)")); + str.clear(); + + IrcUser user; + dbg << &user; + QVERIFY(QRegExp("IrcUser\\(0x[0-9A-Fa-f]+\\) ").exactMatch(str)); + str.clear(); + + user.setObjectName("obj"); + dbg << &user; + QVERIFY(QRegExp("IrcUser\\(0x[0-9A-Fa-f]+, name=obj\\) ").exactMatch(str)); + str.clear(); + +#ifdef Q_OS_LINUX + // others have problems with symbols (win) or private headers (osx frameworks) + IrcUserPrivate::get(&user)->setName("usr"); + dbg << &user; + QVERIFY(QRegExp("IrcUser\\(0x[0-9A-Fa-f]+, name=obj, user=usr\\) ").exactMatch(str)); + str.clear(); +#endif // Q_OS_LINUX +} + +QTEST_MAIN(tst_IrcUser) + +#include "tst_ircuser.moc" diff --git a/src/libcommuni/tests/auto/ircusermodel/ircusermodel.pro b/src/libcommuni/tests/auto/ircusermodel/ircusermodel.pro new file mode 100644 index 0000000..941d2ec --- /dev/null +++ b/src/libcommuni/tests/auto/ircusermodel/ircusermodel.pro @@ -0,0 +1,8 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircusermodel.cpp + +include(../shared/shared.pri) +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircusermodel/tst_ircusermodel.cpp b/src/libcommuni/tests/auto/ircusermodel/tst_ircusermodel.cpp new file mode 100644 index 0000000..20c1d5f --- /dev/null +++ b/src/libcommuni/tests/auto/ircusermodel/tst_ircusermodel.cpp @@ -0,0 +1,1688 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircusermodel.h" +#include "ircconnection.h" +#include "ircbuffermodel.h" +#include "ircchannel.h" +#include "ircuser.h" +#include "irc.h" + +#include "tst_ircdata.h" +#include "tst_ircclientserver.h" + +#include + +static bool caseInsensitiveLessThan(const QString& s1, const QString& s2) +{ + return s1.compare(s2, Qt::CaseInsensitive) < 0; +} + +static bool caseInsensitiveGreaterThan(const QString& s1, const QString& s2) +{ + return s1.compare(s2, Qt::CaseInsensitive) > 0; +} + +class tst_IrcUserModel : public tst_IrcClientServer +{ + Q_OBJECT + +public: + tst_IrcUserModel(); + +private slots: + void testDefaults(); + void testClear(); + void testSorting_data(); + void testSorting(); + void testActivity_freenode(); + void testActivity_ircnet(); + void testActivity_euirc(); + void testChanges(); + void testRoles(); + void testAIM(); + void testUser(); +}; + +Q_DECLARE_METATYPE(QModelIndex) +tst_IrcUserModel::tst_IrcUserModel() +{ + Irc::registerMetaTypes(); + qRegisterMetaType(); + qRegisterMetaType("IrcUser*"); + qRegisterMetaType("IrcChannel*"); + qRegisterMetaType >("QList"); +} + +void tst_IrcUserModel::testDefaults() +{ + IrcUserModel model; + QCOMPARE(model.count(), 0); + QVERIFY(model.isEmpty()); + QVERIFY(model.names().isEmpty()); + QVERIFY(model.users().isEmpty()); + QCOMPARE(model.displayRole(), Irc::TitleRole); + QVERIFY(!model.channel()); + QCOMPARE(model.sortMethod(), Irc::SortByHand); + QCOMPARE(model.sortOrder(), Qt::AscendingOrder); +} + +void tst_IrcUserModel::testClear() +{ + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(tst_IrcData::welcome())); + QCOMPARE(bufferModel.count(), 0); + waitForWritten(":communi!communi@hidd.en JOIN :#channel"); + QCOMPARE(bufferModel.count(), 1); + + QPointer channel = bufferModel.get(0)->toChannel(); + QVERIFY(channel); + + IrcUserModel userModel; + userModel.setChannel(channel); + waitForWritten(":irc.ser.ver 353 communi = #channel :a @b +c"); + waitForWritten(":irc.ser.ver 366 communi #channel :End of /NAMES list."); + QCOMPARE(userModel.count(), 3); + + QPointer a = userModel.find("a"); + QPointer b = userModel.find("b"); + QPointer c = userModel.find("c"); + + QVERIFY(a); + QVERIFY(b); + QVERIFY(c); + + QSignalSpy countSpy(&userModel, SIGNAL(countChanged(int))); + QSignalSpy emptySpy(&userModel, SIGNAL(emptyChanged(bool))); + QSignalSpy usersSpy(&userModel, SIGNAL(usersChanged(QList))); + QSignalSpy namesSpy(&userModel, SIGNAL(namesChanged(QStringList))); + QSignalSpy modelAboutToBeResetSpy(&userModel, SIGNAL(modelAboutToBeReset())); + QSignalSpy modelResetSpy(&userModel, SIGNAL(modelReset())); + + QVERIFY(countSpy.isValid()); + QVERIFY(emptySpy.isValid()); + QVERIFY(usersSpy.isValid()); + QVERIFY(namesSpy.isValid()); + QVERIFY(modelAboutToBeResetSpy.isValid()); + QVERIFY(modelResetSpy.isValid()); + + userModel.clear(); + + QCOMPARE(userModel.count(), 0); + QVERIFY(userModel.isEmpty()); + QCOMPARE(userModel.users(), QList()); + QCOMPARE(userModel.names(), QStringList()); + + QVERIFY(!userModel.get(0)); + QVERIFY(!userModel.find("a")); + QVERIFY(!userModel.find("b")); + QVERIFY(!userModel.find("c")); + QVERIFY(!userModel.contains("a")); + QVERIFY(!userModel.contains("b")); + QVERIFY(!userModel.contains("c")); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(countSpy.last().at(0).toInt(), 0); + + QCOMPARE(emptySpy.count(), 1); + QCOMPARE(emptySpy.last().at(0).toBool(), true); + + QCOMPARE(usersSpy.count(), 1); + QCOMPARE(usersSpy.last().at(0).value >(), QList()); + + QCOMPARE(namesSpy.count(), 1); + QCOMPARE(namesSpy.last().at(0).toStringList(), QStringList()); + + QCOMPARE(modelAboutToBeResetSpy.count(), 1); + QCOMPARE(modelResetSpy.count(), 1); + + QVERIFY(a); + QVERIFY(b); + QVERIFY(c); + + bufferModel.clear(); + + QVERIFY(!a); + QVERIFY(!b); + QVERIFY(!c); +} + +void tst_IrcUserModel::testSorting_data() +{ + QTest::addColumn("welcomeData"); + QTest::addColumn("joinData"); + QTest::addColumn("names"); + QTest::addColumn("admins"); + QTest::addColumn("ops"); + QTest::addColumn("halfops"); + QTest::addColumn("voices"); + + foreach (const QByteArray& key, tst_IrcData::keys()) { + QTest::newRow(key) + << tst_IrcData::welcome(key) + << tst_IrcData::join(key) + << tst_IrcData::names(key) + << tst_IrcData::admins(key) + << tst_IrcData::ops(key) + << tst_IrcData::halfops(key) + << tst_IrcData::voices(key); + } +} + +void tst_IrcUserModel::testSorting() +{ + QFETCH(QByteArray, welcomeData); + QFETCH(QByteArray, joinData); + QFETCH(QStringList, names); + QFETCH(QStringList, admins); + QFETCH(QStringList, ops); + QFETCH(QStringList, halfops); + QFETCH(QStringList, voices); + + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(welcomeData)); + QCOMPARE(bufferModel.count(), 0); + + QVERIFY(waitForWritten(joinData)); + + QCOMPARE(bufferModel.count(), 1); + IrcChannel* channel = bufferModel.get(0)->toChannel(); + QVERIFY(channel); + + IrcUserModel staticModel(channel); + QCOMPARE(staticModel.count(), names.count()); + for (int i = 0; i < staticModel.count(); ++i) { + IrcUser* user = staticModel.get(i); + QCOMPARE(user->name(), names.at(i)); + if (admins.contains(user->name())) { + QCOMPARE(user->mode(), QString("a")); + QCOMPARE(user->prefix(), QString("!")); + } else if (ops.contains(user->name())) { + QCOMPARE(user->mode(), QString("o")); + QCOMPARE(user->prefix(), QString("@")); + } else if (halfops.contains(user->name())) { + QCOMPARE(user->mode(), QString("h")); + QCOMPARE(user->prefix(), QString("%")); + } else if (voices.contains(user->name())) { + QCOMPARE(user->mode(), QString("v")); + QCOMPARE(user->prefix(), QString("+")); + } + } + + QStringList sorted = names; + qSort(sorted); + QCOMPARE(staticModel.names(), sorted); + + // IGNORE INVALID COLUMNS + staticModel.sort(-1, Qt::AscendingOrder); + for (int i = 0; i < staticModel.count(); ++i) + QCOMPARE(staticModel.get(i)->name(), names.at(i)); + + staticModel.sort(1, Qt::AscendingOrder); + for (int i = 0; i < staticModel.count(); ++i) + QCOMPARE(staticModel.get(i)->name(), names.at(i)); + + // STATIC - BY NAME - ASCENDING + staticModel.setSortMethod(Irc::SortByName); + staticModel.sort(0, Qt::AscendingOrder); + + QStringList nasc = names; + qSort(nasc.begin(), nasc.end(), caseInsensitiveLessThan); + + for (int i = 0; i < staticModel.count(); ++i) + QCOMPARE(staticModel.get(i)->name(), nasc.at(i)); + + // STATIC - BY NAME - DESCENDING + staticModel.setSortMethod(Irc::SortByName); + staticModel.sort(0, Qt::DescendingOrder); + + QStringList ndesc = names; + qSort(ndesc.begin(), ndesc.end(), caseInsensitiveGreaterThan); + + for (int i = 0; i < staticModel.count(); ++i) + QCOMPARE(staticModel.get(i)->name(), ndesc.at(i)); + + // STATIC - BY TITLE - ASCENDING + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::AscendingOrder); + + QStringList aasc = admins; + qSort(aasc.begin(), aasc.end(), caseInsensitiveLessThan); + + QStringList oasc = ops; + qSort(oasc.begin(), oasc.end(), caseInsensitiveLessThan); + + QStringList hasc = halfops; + qSort(hasc.begin(), hasc.end(), caseInsensitiveLessThan); + + QStringList vasc = voices; + qSort(vasc.begin(), vasc.end(), caseInsensitiveLessThan); + + QStringList tasc = aasc + oasc + hasc + vasc + nasc; + // remove duplicates + foreach (const QString& voice, voices) + tasc.removeAt(tasc.lastIndexOf(voice)); + foreach (const QString& halfop, halfops) + tasc.removeAt(tasc.lastIndexOf(halfop)); + foreach (const QString& op, ops) + tasc.removeAt(tasc.lastIndexOf(op)); + foreach (const QString& admin, admins) + tasc.removeAt(tasc.lastIndexOf(admin)); + + for (int i = 0; i < staticModel.count(); ++i) + QCOMPARE(staticModel.get(i)->name(), tasc.at(i)); + + // STATIC - BY TITLE - DESCENDING + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::DescendingOrder); + + QStringList adesc = admins; + qSort(adesc.begin(), adesc.end(), caseInsensitiveGreaterThan); + + QStringList odesc = ops; + qSort(odesc.begin(), odesc.end(), caseInsensitiveGreaterThan); + + QStringList hdesc = halfops; + qSort(hdesc.begin(), hdesc.end(), caseInsensitiveGreaterThan); + + QStringList vdesc = voices; + qSort(vdesc.begin(), vdesc.end(), caseInsensitiveGreaterThan); + + QStringList tdesc = ndesc + vdesc + hdesc + odesc + adesc; + // remove duplicates + foreach (const QString& voice, voices) + tdesc.removeAt(tdesc.indexOf(voice)); + foreach (const QString& halfop, halfops) + tdesc.removeAt(tdesc.indexOf(halfop)); + foreach (const QString& op, ops) + tdesc.removeAt(tdesc.indexOf(op)); + foreach (const QString& admin, admins) + tdesc.removeAt(tdesc.indexOf(admin)); + + for (int i = 0; i < staticModel.count(); ++i) + QCOMPARE(staticModel.get(i)->name(), tdesc.at(i)); + + // DYNAMIC - BY NAME, TITLE & ACTIVITY - ASCENDING + IrcUserModel dynamicModel(channel); + + dynamicModel.setSortMethod(Irc::SortByName); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), nasc.at(i)); + + dynamicModel.setSortMethod(Irc::SortByTitle); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), tasc.at(i)); + + dynamicModel.setSortMethod(Irc::SortByActivity); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), names.at(i)); + + // DYNAMIC - BY NAME, TITLE & ACTIVITY - DESCENDING + dynamicModel.setSortOrder(Qt::DescendingOrder); + + dynamicModel.setSortMethod(Irc::SortByName); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), ndesc.at(i)); + + dynamicModel.setSortMethod(Irc::SortByTitle); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), tdesc.at(i)); + + dynamicModel.setSortMethod(Irc::SortByActivity); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), names.at(names.count() - 1 - i)); + + // RESTORE USERS IN ASCENDING ORDER + dynamicModel.setSortOrder(Qt::AscendingOrder); + + dynamicModel.setChannel(0); + dynamicModel.setSortMethod(Irc::SortByName); + dynamicModel.setChannel(channel); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), nasc.at(i)); + + dynamicModel.setChannel(0); + dynamicModel.setSortMethod(Irc::SortByTitle); + dynamicModel.setChannel(channel); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), tasc.at(i)); + + dynamicModel.setChannel(0); + dynamicModel.setSortMethod(Irc::SortByActivity); + dynamicModel.setChannel(channel); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), names.at(i)); + + // RESTORE USERS IN DESCENDING ORDER + dynamicModel.setSortOrder(Qt::DescendingOrder); + + dynamicModel.setChannel(0); + dynamicModel.setSortMethod(Irc::SortByName); + dynamicModel.setChannel(channel); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), ndesc.at(i)); + + dynamicModel.setChannel(0); + dynamicModel.setSortMethod(Irc::SortByTitle); + dynamicModel.setChannel(channel); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), tdesc.at(i)); + + dynamicModel.setChannel(0); + dynamicModel.setSortMethod(Irc::SortByActivity); + dynamicModel.setChannel(channel); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), names.at(names.count() - 1 - i)); + + // DO NOTHING + dynamicModel.sort(Irc::SortByHand); + for (int i = 0; i < dynamicModel.count(); ++i) + QCOMPARE(dynamicModel.get(i)->name(), names.at(names.count() - 1 - i)); +} + +void tst_IrcUserModel::testActivity_freenode() +{ + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(tst_IrcData::welcome("freenode"))); + QCOMPARE(bufferModel.count(), 0); + + QVERIFY(waitForWritten(tst_IrcData::join("freenode"))); + + QCOMPARE(bufferModel.count(), 1); + IrcChannel* channel = bufferModel.get(0)->toChannel(); + QVERIFY(channel); + + QStringList names = tst_IrcData::names("freenode"); + + IrcUserModel activityModel(channel); + activityModel.setSortMethod(Irc::SortByActivity); + + int count = names.count(); + + QVERIFY(waitForWritten(":smurfy!~smurfy@hidd.en PART #freenode")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("smurfy")); + + QVERIFY(waitForWritten(":ToApolytoXaos!~ToApolyto@hidd.en QUIT :Quit: Leaving")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("ToApolytoXaos")); + + QVERIFY(waitForWritten(":agsrv!~guest@hidd.en JOIN #freenode")); + QCOMPARE(activityModel.count(), ++count); + QCOMPARE(activityModel.indexOf(activityModel.find("agsrv")), 0); + + QVERIFY(waitForWritten(":Hello71!~Hello71@hidd.en PRIVMSG #freenode :straterra: there are many users on it")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("Hello71")), 0); + QCOMPARE(activityModel.indexOf(activityModel.find("straterra")), 1); + + QVERIFY(waitForWritten(":straterra!straterra@hidd.en PRIVMSG #freenode :what?")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("straterra")), 0); + QCOMPARE(activityModel.indexOf(activityModel.find("Hello71")), 1); + + QVERIFY(waitForWritten(":JuxTApose!~indigital@hidd.en NICK :JuxTApose_afk")); + QCOMPARE(activityModel.count(), count); + QVERIFY(!activityModel.contains("JuxTApose")); + QCOMPARE(activityModel.indexOf(activityModel.find("JuxTApose_afk")), 0); + QCOMPARE(activityModel.indexOf(activityModel.find("straterra")), 1); + QCOMPARE(activityModel.indexOf(activityModel.find("Hello71")), 2); + + QVERIFY(waitForWritten(":communi!communi@hidd.en PRIVMSG #freenode :+tomaw: ping")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("communi")), 0); + QCOMPARE(activityModel.indexOf(activityModel.find("tomaw")), 1); + + QVERIFY(waitForWritten(":Hello71!~Hello71@hidd.en NOTICE #freenode :just testing...")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("Hello71")), 0); +} + +void tst_IrcUserModel::testActivity_ircnet() +{ + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(tst_IrcData::welcome("ircnet"))); + QCOMPARE(bufferModel.count(), 0); + + QVERIFY(waitForWritten(tst_IrcData::join("ircnet"))); + + QCOMPARE(bufferModel.count(), 1); + IrcChannel* channel = bufferModel.get(0)->toChannel(); + QVERIFY(channel); + + QStringList names = tst_IrcData::names("ircnet"); + + IrcUserModel activityModel(channel); + activityModel.setSortMethod(Irc::SortByActivity); + + int count = names.count(); + + QVERIFY(waitForWritten(":_box!~box@hidd.en QUIT :Broken pipe")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("_box")); + + QVERIFY(waitForWritten(":ip!~v6@hidd.en QUIT :Connection reset by peer")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("ip")); + + QVERIFY(waitForWritten(":[m]!m@hidd.en MODE #uptimed +b *!*x@does.matter.not*")); + QCOMPARE(activityModel.count(), count); + + QVERIFY(waitForWritten(":[m]!m@hidd.en KICK #uptimed \\x00 :lame exit sorry :P")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("\\x00")); + + QVERIFY(waitForWritten(":_box!~box@hidd.en JOIN :#uptimed")); + QCOMPARE(activityModel.count(), ++count); + QCOMPARE(activityModel.indexOf(activityModel.find("_box")), 0); + + QVERIFY(waitForWritten(":Voicer!mrozu@hidd.en MODE #uptimed +v _box")); + QCOMPARE(activityModel.count(), count); + + QVERIFY(waitForWritten(":t0r-!t0r@hidd.en PRIVMSG #uptimed :there is no sense for _box and ip to join the contest")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("t0r-")), 0); + + QVERIFY(waitForWritten(":ip!~v6@hidd.en JOIN :#uptimed")); + QCOMPARE(activityModel.count(), ++count); + QCOMPARE(activityModel.indexOf(activityModel.find("ip")), 0); + + QVERIFY(waitForWritten(":Voicer!mrozu@hidd.en MODE #uptimed +v ip")); + QCOMPARE(activityModel.count(), count); + + QVERIFY(waitForWritten(":[m]!m@hidd.en MODE #uptimed +b *!*v6@*.does.matter.not")); + QCOMPARE(activityModel.count(), count); + + QVERIFY(waitForWritten(":[m]!m@hidd.en KICK #uptimed ip :no reason")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("ip")); + + QVERIFY(waitForWritten(":t0r-!t0r@hidd.en PRIVMSG #uptimed :they are going down every second")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("t0r-")), 0); + + QVERIFY(waitForWritten(":t0r-!t0r@hidd.en PRIVMSG #uptimed :yeah")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("t0r-")), 0); + + QVERIFY(waitForWritten(":[m]!m@hidd.en MODE #uptimed -b *!*box@*.does.not.matter")); + QCOMPARE(activityModel.count(), count); + + QVERIFY(waitForWritten(":[m]!m@hidd.en KICK #uptimed _box :no reason")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("_box")); +} + +void tst_IrcUserModel::testActivity_euirc() +{ + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(tst_IrcData::welcome("euirc"))); + QCOMPARE(bufferModel.count(), 0); + + QVERIFY(waitForWritten(tst_IrcData::join("euirc"))); + + QCOMPARE(bufferModel.count(), 1); + IrcChannel* channel = bufferModel.get(0)->toChannel(); + QVERIFY(channel); + + QStringList names = tst_IrcData::names("euirc"); + + IrcUserModel activityModel(channel); + activityModel.setSortMethod(Irc::SortByActivity); + + int count = names.count(); + + QVERIFY(waitForWritten(":Marko10_000!~marko@hidd.en JOIN :#euirc\n")); + QCOMPARE(activityModel.count(), ++count); + QCOMPARE(activityModel.indexOf(activityModel.find("Marko10_000")), 0); + + QVERIFY(waitForWritten(":Marko10_000!~marko@hidd.en NICK :Guest775\n")); + QCOMPARE(activityModel.count(), count); + QVERIFY(!activityModel.contains("Marko10_000")); + QCOMPARE(activityModel.indexOf(activityModel.find("Guest775")), 0); + + QVERIFY(waitForWritten(":Guest775!~marko@hidd.en QUIT :Quit: Verlassend\n")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("Guest775")); + + QVERIFY(waitForWritten(":Marko10_000!~marko@hidd.en JOIN :#euirc\n")); + QCOMPARE(activityModel.count(), ++count); + QCOMPARE(activityModel.indexOf(activityModel.find("Marko10_000")), 0); + + QVERIFY(waitForWritten(":Guest774!absk007@hidd.en QUIT :Quit: Good Bye. I Quit...\n")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("Guest774")); + + QVERIFY(waitForWritten(":absk007!absk007@hidd.en JOIN :#euirc\n")); + QCOMPARE(activityModel.count(), ++count); + QCOMPARE(activityModel.indexOf(activityModel.find("absk007")), 0); + + QVERIFY(waitForWritten(":charly6!~Miranda@hidd.en QUIT :Client exited\n")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("charly6")); + + QVERIFY(waitForWritten(":absk007!absk007@hidd.en NICK :Guest776\n")); + QCOMPARE(activityModel.count(), count); + QVERIFY(!activityModel.contains("absk007")); + QCOMPARE(activityModel.indexOf(activityModel.find("Guest776")), 0); + + QVERIFY(waitForWritten(":Tina-chan_onAir!~kvirc@hidd.en NICK :Tina-chan\n")); + QCOMPARE(activityModel.count(), count); + QVERIFY(!activityModel.contains("Tina-chan_onAir")); + QCOMPARE(activityModel.indexOf(activityModel.find("Tina-chan")), 0); + + QVERIFY(waitForWritten(":Guest776!absk007@hidd.en NICK :absk007\n")); + QCOMPARE(activityModel.count(), count); + QVERIFY(!activityModel.contains("Guest776")); + QCOMPARE(activityModel.indexOf(activityModel.find("absk007")), 0); + + QVERIFY(waitForWritten(":aleksandr!~aleksandr@hidd.en PRIVMSG #euirc :absk007, last warning. fix your client/script\n")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("aleksandr")), 0); + QCOMPARE(activityModel.indexOf(activityModel.find("absk007")), 1); + + QVERIFY(waitForWritten(":charly6!~Miranda@hidd.en JOIN :#euirc\n")); + QCOMPARE(activityModel.count(), ++count); + QCOMPARE(activityModel.indexOf(activityModel.find("charly6")), 0); + + QVERIFY(waitForWritten(":absk007!absk007@hidd.en PRIVMSG #euirc :aleksandr, what did i do this time?\n")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("absk007")), 0); + QCOMPARE(activityModel.indexOf(activityModel.find("aleksandr")), 1); + + QVERIFY(waitForWritten(":aleksandr!~aleksandr@hidd.en PRIVMSG #euirc :if you need help, join #opers\n")); + QCOMPARE(activityModel.count(), count); + QCOMPARE(activityModel.indexOf(activityModel.find("aleksandr")), 0); + + QVERIFY(waitForWritten(":charly6!~Miranda@hidd.en QUIT :Client exited\n")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("charly6")); + + QVERIFY(waitForWritten(":icefly!~icefly@hidd.en PART #euirc :Once you know what it is you want to be true, instinct is a very useful device for enabling you to know that it is\n")); + QCOMPARE(activityModel.count(), --count); + QVERIFY(!activityModel.contains("icefly")); + + QVERIFY(waitForWritten(":icefly!~icefly@hidd.en JOIN :#euirc\n")); + QCOMPARE(activityModel.count(), ++count); + QCOMPARE(activityModel.indexOf(activityModel.find("icefly")), 0); +} + +void tst_IrcUserModel::testChanges() +{ + IrcUserModel userModel; + + // IrcUserModel signals + QSignalSpy addedSpy(&userModel, SIGNAL(added(IrcUser*))); + QSignalSpy removedSpy(&userModel, SIGNAL(removed(IrcUser*))); + QSignalSpy aboutToBeAddedSpy(&userModel, SIGNAL(aboutToBeAdded(IrcUser*))); + QSignalSpy aboutToBeRemovedSpy(&userModel, SIGNAL(aboutToBeRemoved(IrcUser*))); + QSignalSpy countChangedSpy(&userModel, SIGNAL(countChanged(int))); + QSignalSpy namesChangedSpy(&userModel, SIGNAL(namesChanged(QStringList))); + QSignalSpy usersChangedSpy(&userModel, SIGNAL(usersChanged(QList))); + QSignalSpy channelChangedSpy(&userModel, SIGNAL(channelChanged(IrcChannel*))); + + QVERIFY(addedSpy.isValid()); + QVERIFY(removedSpy.isValid()); + QVERIFY(aboutToBeAddedSpy.isValid()); + QVERIFY(aboutToBeRemovedSpy.isValid()); + QVERIFY(countChangedSpy.isValid()); + QVERIFY(namesChangedSpy.isValid()); + QVERIFY(usersChangedSpy.isValid()); + QVERIFY(channelChangedSpy.isValid()); + + int aboutToBeAddedCount = 0, addedCount = 0; + int aboutToBeRemovedCount = 0, removedCount = 0; + int countChangedCount = 0; + int namesChangedCount = 0; + int usersChangedCount = 0; + int channelChangedCount = 0; + + // relevant QAbstractItemModel signals + QSignalSpy dataChangedSpy(&userModel, SIGNAL(dataChanged(QModelIndex,QModelIndex))); + QSignalSpy modelAboutToBeResetSpy(&userModel, SIGNAL(modelAboutToBeReset())); + QSignalSpy modelResetSpy(&userModel, SIGNAL(modelReset())); + QSignalSpy layoutAboutToBeChangedSpy(&userModel, SIGNAL(layoutAboutToBeChanged())); + QSignalSpy layoutChangedSpy(&userModel, SIGNAL(layoutChanged())); + QSignalSpy rowsAboutToBeInsertedSpy(&userModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); + QSignalSpy rowsInsertedSpy(&userModel, SIGNAL(rowsInserted(QModelIndex,int,int))); + QSignalSpy rowsAboutToBeRemovedSpy(&userModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); + QSignalSpy rowsRemovedSpy(&userModel, SIGNAL(rowsRemoved(QModelIndex,int,int))); + + QVERIFY(dataChangedSpy.isValid()); + QVERIFY(modelAboutToBeResetSpy.isValid()); + QVERIFY(modelResetSpy.isValid()); + QVERIFY(layoutAboutToBeChangedSpy.isValid()); + QVERIFY(layoutChangedSpy.isValid()); + QVERIFY(rowsAboutToBeInsertedSpy.isValid()); + QVERIFY(rowsInsertedSpy.isValid()); + QVERIFY(rowsAboutToBeRemovedSpy.isValid()); + QVERIFY(rowsRemovedSpy.isValid()); + + int dataChangedCount = 0; + int modelAboutToBeResetCount = 0, modelResetCount = 0; + int layoutAboutToBeChangedCount = 0, layoutChangedCount = 0; + int rowsAboutToBeInsertedCount = 0, rowsInsertedCount = 0; + int rowsAboutToBeRemovedCount = 0, rowsRemovedCount = 0; + + // ### setup #communi (5): communi @ChanServ +qtassistant Guest1234 +qout + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(tst_IrcData::welcome())); + QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN :#communi")); + QVERIFY(waitForWritten(":irc.ifi.uio.no 353 communi = #communi :communi @ChanServ +qtassistant Guest1234 +qout")); + QVERIFY(waitForWritten(":irc.ifi.uio.no 366 communi #communi :End of NAMES list.")); + QCOMPARE(bufferModel.count(), 1); + IrcChannel* channel = bufferModel.get(0)->toChannel(); + QVERIFY(channel); + QCOMPARE(channel->title(), QString("#communi")); + + // ### ready to go! + userModel.setChannel(channel); + QCOMPARE(channelChangedSpy.count(), ++channelChangedCount); + QCOMPARE(channelChangedSpy.last().at(0).value(), channel); + QCOMPARE(modelAboutToBeResetSpy.count(), ++modelAboutToBeResetCount); + QCOMPARE(modelResetSpy.count(), ++modelResetCount); + + QStringList names = QStringList() << "communi" << "ChanServ" << "qtassistant" << "Guest1234" << "qout"; + QStringList titles = QStringList() << "communi" << "@ChanServ" << "+qtassistant" << "Guest1234" << "+qout"; + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + } + + QPointer communi = userModel.get(0); + QVERIFY(communi); + QCOMPARE(communi->name(), QString("communi")); + QCOMPARE(communi->mode(), QString()); + QCOMPARE(communi->prefix(), QString()); + + QPointer ChanServ = userModel.get(1); + QVERIFY(ChanServ); + QCOMPARE(ChanServ->name(), QString("ChanServ")); + QCOMPARE(ChanServ->mode(), QString("o")); + QCOMPARE(ChanServ->prefix(), QString("@")); + + QPointer qtassistant = userModel.get(2); + QVERIFY(qtassistant); + QCOMPARE(qtassistant->name(), QString("qtassistant")); + QCOMPARE(qtassistant->mode(), QString("v")); + QCOMPARE(qtassistant->prefix(), QString("+")); + + QPointer Guest1234 = userModel.get(3); + QVERIFY(Guest1234); + QCOMPARE(Guest1234->name(), QString("Guest1234")); + QCOMPARE(Guest1234->mode(), QString()); + QCOMPARE(Guest1234->prefix(), QString()); + + QPointer qout = userModel.get(4); + QVERIFY(qout); + QCOMPARE(qout->name(), QString("qout")); + QCOMPARE(qout->mode(), QString("v")); + QCOMPARE(qout->prefix(), QString("+")); + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), 5); + + QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); + QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest1234" << "communi" << "qout" << "qtassistant"); + + QList users = QList() << communi << ChanServ << qtassistant << Guest1234 << qout; + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), users); + + // ### trigger sort -> layout change + userModel.setSortMethod(Irc::SortByTitle); + QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); + + // Irc::SortByTitle + users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; + names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest1234"; + titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest1234"; + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + // ### trigger sort -> layout change + userModel.setSortMethod(Irc::SortByName); + QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); + + // Irc::SortByName + users = QList() << ChanServ << communi << Guest1234 << qout << qtassistant; + names = QStringList() << "ChanServ" << "communi" << "Guest1234" << "qout" << "qtassistant"; + titles = QStringList() << "@ChanServ" << "communi" << "Guest1234" << "+qout" << "+qtassistant"; + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + // ### trigger model reset + userModel.setChannel(0); + QCOMPARE(channelChangedSpy.count(), ++channelChangedCount); + QCOMPARE(channelChangedSpy.last().at(0).value(), static_cast(0)); + QCOMPARE(modelAboutToBeResetSpy.count(), ++modelAboutToBeResetCount); + QCOMPARE(modelResetSpy.count(), ++modelResetCount); + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), 0); + + QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); + QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList()); + + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), QList()); + + // ### empty model -> no layout change + userModel.setSortMethod(Irc::SortByActivity); + QCOMPARE(layoutAboutToBeChangedSpy.count(), layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), layoutChangedCount); + + // ### reset again + userModel.setChannel(channel); + QCOMPARE(modelAboutToBeResetSpy.count(), ++modelAboutToBeResetCount); + QCOMPARE(modelResetSpy.count(), ++modelResetCount); + + // Irc::SortByActivity + users = QList() << communi << ChanServ << qtassistant << Guest1234 << qout; + names = QStringList() << "communi" << "ChanServ" << "qtassistant" << "Guest1234" << "qout"; + titles = QStringList() << "communi" << "@ChanServ" << "+qtassistant" << "Guest1234" << "+qout"; + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), users.count()); + + QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); + QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest1234" << "communi" << "qout" << "qtassistant"); + + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), users); + + QSignalSpy guestTitleChangedSpy(Guest1234, SIGNAL(titleChanged(QString))); + QSignalSpy guestNameChangedSpy(Guest1234, SIGNAL(nameChanged(QString))); + QSignalSpy guestPrefixChangedSpy(Guest1234, SIGNAL(prefixChanged(QString))); + QSignalSpy guestModeChangedSpy(Guest1234, SIGNAL(modeChanged(QString))); + QVERIFY(guestTitleChangedSpy.isValid()); + QVERIFY(guestNameChangedSpy.isValid()); + QVERIFY(guestPrefixChangedSpy.isValid()); + QVERIFY(guestModeChangedSpy.isValid()); + + int guestTitleChangedCount = 0; + int guestNameChangedCount = 0; + int guestPrefixChangedCount = 0; + int guestModeChangedCount = 0; + + // ### sorted by activity -> trigger a change in names & users, count remains intact + QVERIFY(waitForWritten(":Guest1234!~Guest1234@hidd.en NICK :Guest5678")); + + QCOMPARE(Guest1234->name(), QString("Guest5678")); + QCOMPARE(Guest1234->title(), QString("Guest5678")); + + QCOMPARE(guestTitleChangedSpy.count(), ++guestTitleChangedCount); + QCOMPARE(guestTitleChangedSpy.last().at(0).toString(), QString("Guest5678")); + + QCOMPARE(guestNameChangedSpy.count(), ++guestNameChangedCount); + QCOMPARE(guestNameChangedSpy.last().at(0).toString(), QString("Guest5678")); + + QCOMPARE(guestPrefixChangedSpy.count(), guestPrefixChangedCount); + QCOMPARE(guestModeChangedSpy.count(), guestModeChangedCount); + + int previousIndex = users.indexOf(Guest1234); + + // Irc::SortByActivity + users = QList() << Guest1234 << communi << ChanServ << qtassistant << qout; + names = QStringList() << "Guest5678" << "communi" << "ChanServ" << "qtassistant" << "qout"; + titles = QStringList() << "Guest5678" << "communi" << "@ChanServ" << "+qtassistant" << "+qout"; + + int nextIndex = users.indexOf(Guest1234); + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + + QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); + QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest5678" << "communi" << "qout" << "qtassistant"); + + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), users); + + QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); + QModelIndex topLeft = dataChangedSpy.last().at(0).value(); + QModelIndex bottomRight = dataChangedSpy.last().at(0).value(); + QVERIFY(topLeft.isValid()); + QVERIFY(bottomRight.isValid()); + QVERIFY(topLeft == bottomRight); + QCOMPARE(topLeft.row(), previousIndex); + QCOMPARE(topLeft.column(), 0); + + // TODO: nick change AND activity promotion + // => would ideally still result to just one change... + rowsAboutToBeRemovedCount += 2; + rowsRemovedCount += 2; + rowsAboutToBeInsertedCount += 2; + rowsInsertedCount += 2; + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + // ### trigger sort -> layout change + userModel.setSortMethod(Irc::SortByTitle); + QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); + + // Irc::SortByTitle + users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; + names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest5678"; + titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest5678"; + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + // ### sorted by title -> trigger a change in names & users, count remains intact + QVERIFY(waitForWritten(":Guest5678!~Guest1234@hidd.en NICK :Guest1234")); + + QCOMPARE(Guest1234->name(), QString("Guest1234")); + QCOMPARE(Guest1234->title(), QString("Guest1234")); + + QCOMPARE(guestTitleChangedSpy.count(), ++guestTitleChangedCount); + QCOMPARE(guestTitleChangedSpy.last().at(0).toString(), QString("Guest1234")); + + QCOMPARE(guestNameChangedSpy.count(), ++guestNameChangedCount); + QCOMPARE(guestNameChangedSpy.last().at(0).toString(), QString("Guest1234")); + + QCOMPARE(guestPrefixChangedSpy.count(), guestPrefixChangedCount); + QCOMPARE(guestModeChangedSpy.count(), guestModeChangedCount); + + previousIndex = users.indexOf(Guest1234); + + // Irc::SortByTitle + users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; + names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest1234"; + titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest1234"; + + nextIndex = users.indexOf(Guest1234); + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + + QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); + QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest1234" << "communi" << "qout" << "qtassistant"); + + QCOMPARE(usersChangedSpy.count(), usersChangedCount); + + QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); + topLeft = dataChangedSpy.last().at(0).value(); + bottomRight = dataChangedSpy.last().at(1).value(); + QVERIFY(topLeft.isValid()); + QVERIFY(bottomRight.isValid()); + QVERIFY(topLeft == bottomRight); + QCOMPARE(topLeft.row(), 4); + QCOMPARE(topLeft.column(), 0); + + // TODO: nick change without index change + // => would ideally result to merely a data change... + QCOMPARE(previousIndex, nextIndex); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + // ### sorted by title -> trigger a change in users, count & names remain intact + QVERIFY(waitForWritten(":ChanServ!ChanServ@services. MODE #communi +v Guest1234")); + + QCOMPARE(Guest1234->name(), QString("Guest1234")); + QCOMPARE(Guest1234->title(), QString("+Guest1234")); + QCOMPARE(Guest1234->prefix(), QString("+")); + QCOMPARE(Guest1234->mode(), QString("v")); + + QCOMPARE(guestTitleChangedSpy.count(), ++guestTitleChangedCount); + QCOMPARE(guestTitleChangedSpy.last().at(0).toString(), QString("+Guest1234")); + + QCOMPARE(guestNameChangedSpy.count(), guestNameChangedCount); + + QCOMPARE(guestPrefixChangedSpy.count(), ++guestPrefixChangedCount); + QCOMPARE(guestPrefixChangedSpy.last().at(0).toString(), QString("+")); + + QCOMPARE(guestModeChangedSpy.count(), ++guestModeChangedCount); + QCOMPARE(guestModeChangedSpy.last().at(0).toString(), QString("v")); + + previousIndex = users.indexOf(Guest1234); + + // Irc::SortByTitle + users = QList() << ChanServ << Guest1234 << qout << qtassistant << communi; + names = QStringList() << "ChanServ" << "Guest1234" << "qout" << "qtassistant" << "communi"; + titles = QStringList() << "@ChanServ" << "+Guest1234" << "+qout" << "+qtassistant" << "communi"; + + nextIndex = users.indexOf(Guest1234); + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + + QCOMPARE(namesChangedSpy.count(), namesChangedCount); + + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), users); + + QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); + topLeft = dataChangedSpy.last().at(0).value(); + bottomRight = dataChangedSpy.last().at(1).value(); + QVERIFY(topLeft.isValid()); + QVERIFY(bottomRight.isValid()); + QVERIFY(topLeft == bottomRight); + QCOMPARE(topLeft.row(), previousIndex); + QCOMPARE(topLeft.column(), 0); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + // ### sorted by title -> trigger a change in users, count & names remain intact + QVERIFY(waitForWritten(":ChanServ!ChanServ@services. MODE #communi -v Guest1234")); + + QCOMPARE(Guest1234->name(), QString("Guest1234")); + QCOMPARE(Guest1234->title(), QString("Guest1234")); + QCOMPARE(Guest1234->prefix(), QString()); + QCOMPARE(Guest1234->mode(), QString()); + + QCOMPARE(guestTitleChangedSpy.count(), ++guestTitleChangedCount); + QCOMPARE(guestTitleChangedSpy.last().at(0).toString(), QString("Guest1234")); + + QCOMPARE(guestNameChangedSpy.count(), guestNameChangedCount); + + QCOMPARE(guestPrefixChangedSpy.count(), ++guestPrefixChangedCount); + QCOMPARE(guestPrefixChangedSpy.last().at(0).toString(), QString()); + + QCOMPARE(guestModeChangedSpy.count(), ++guestModeChangedCount); + QCOMPARE(guestModeChangedSpy.last().at(0).toString(), QString()); + + previousIndex = users.indexOf(Guest1234); + + // Irc::SortByTitle + users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; + names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest1234"; + titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest1234"; + + nextIndex = users.indexOf(Guest1234); + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + + QCOMPARE(namesChangedSpy.count(), namesChangedCount); + + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), users); + + QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); + topLeft = dataChangedSpy.last().at(0).value(); + bottomRight = dataChangedSpy.last().at(1).value(); + QVERIFY(topLeft.isValid()); + QVERIFY(bottomRight.isValid()); + QVERIFY(topLeft == bottomRight); + QCOMPARE(topLeft.row(), previousIndex); + QCOMPARE(topLeft.column(), 0); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + // ### sorted by title -> trigger a change in count, users & names + QVERIFY(waitForWritten(":Guest1234!~Guest1234@hidd.en PART #communi")); + + QVERIFY(Guest1234); // deleteLater()'d + + QCOMPARE(aboutToBeRemovedSpy.count(), ++aboutToBeRemovedCount); + QCOMPARE(aboutToBeRemovedSpy.last().at(0).value(), Guest1234.data()); + + QCOMPARE(removedSpy.count(), ++removedCount); + QCOMPARE(removedSpy.last().at(0).value(), Guest1234.data()); + + previousIndex = users.indexOf(Guest1234); + + QCoreApplication::sendPostedEvents(Guest1234, QEvent::DeferredDelete); + QVERIFY(!Guest1234); + + // Irc::SortByTitle + users = QList() << ChanServ << qout << qtassistant << communi; + names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi"; + titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi"; + + nextIndex = users.indexOf(Guest1234); + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), users.count()); + + QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); + QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "communi" << "qout" << "qtassistant"); + + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), users); + + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + + // ### sorted by title -> trigger a change in count, users & names + QVERIFY(waitForWritten(":Guest1234!~Guest1234@hidd.en JOIN #communi")); + + Guest1234 = userModel.find("Guest1234"); + QVERIFY(Guest1234); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), Guest1234.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), Guest1234.data()); + + previousIndex = users.indexOf(Guest1234); + + // Irc::SortByTitle + users = QList() << ChanServ << qout << qtassistant << communi << Guest1234; + names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "communi" << "Guest1234"; + titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "communi" << "Guest1234"; + + nextIndex = users.indexOf(Guest1234); + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), users.count()); + + QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); + QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "ChanServ" << "Guest1234" << "communi" << "qout" << "qtassistant"); + + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), users); + + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QPointer Bot = Guest1234; + + QSignalSpy botTitleChangedSpy(Guest1234, SIGNAL(titleChanged(QString))); + QSignalSpy botNameChangedSpy(Guest1234, SIGNAL(nameChanged(QString))); + QSignalSpy botPrefixChangedSpy(Guest1234, SIGNAL(prefixChanged(QString))); + QSignalSpy botModeChangedSpy(Guest1234, SIGNAL(modeChanged(QString))); + QVERIFY(botTitleChangedSpy.isValid()); + QVERIFY(botNameChangedSpy.isValid()); + QVERIFY(botPrefixChangedSpy.isValid()); + QVERIFY(botModeChangedSpy.isValid()); + + int botTitleChangedCount = 0; + int botNameChangedCount = 0; + int botPrefixChangedCount = 0; + int botModeChangedCount = 0; + + // ### sorted by title -> trigger a change in users & names, count remains intact + QVERIFY(waitForWritten(":Guest1234!~Guest1234@hidd.en NICK :Bot")); + + QCOMPARE(Bot->name(), QString("Bot")); + QCOMPARE(Bot->title(), QString("Bot")); + + QCOMPARE(botTitleChangedSpy.count(), ++botTitleChangedCount); + QCOMPARE(botTitleChangedSpy.last().at(0).toString(), QString("Bot")); + + QCOMPARE(botNameChangedSpy.count(), ++botNameChangedCount); + QCOMPARE(botNameChangedSpy.last().at(0).toString(), QString("Bot")); + + QCOMPARE(botPrefixChangedSpy.count(), botPrefixChangedCount); + QCOMPARE(botModeChangedSpy.count(), botModeChangedCount); + + previousIndex = users.indexOf(Bot); + + // Irc::SortByTitle + users = QList() << ChanServ << qout << qtassistant << Bot << communi; + names = QStringList() << "ChanServ" << "qout" << "qtassistant" << "Bot" << "communi"; + titles = QStringList() << "@ChanServ" << "+qout" << "+qtassistant" << "Bot" << "communi"; + + nextIndex = users.indexOf(Bot); + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + + QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); + QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "Bot" << "ChanServ" << "communi" << "qout" << "qtassistant"); + + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), users); + + QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); + topLeft = dataChangedSpy.last().at(0).value(); + bottomRight = dataChangedSpy.last().at(0).value(); + QVERIFY(topLeft.isValid()); + QVERIFY(bottomRight.isValid()); + QVERIFY(topLeft == bottomRight); + QCOMPARE(topLeft.row(), previousIndex); + QCOMPARE(topLeft.column(), 0); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + // ### sorted by name, descending -> trigger a change in count, users & names + userModel.setSortOrder(Qt::DescendingOrder); + userModel.setSortMethod(Irc::SortByName); + QVERIFY(waitForWritten(":fake!fake@hidd.en JOIN #communi")); + + QPointer fake = userModel.find("fake"); + QVERIFY(fake); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), fake.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), fake.data()); + + previousIndex = users.indexOf(fake); + + // Irc::SortByName - descending + users = QList() << qtassistant << qout << fake << communi << ChanServ << Bot; + names = QStringList() << "qtassistant" << "qout" << "fake" << "communi" << "ChanServ" << "Bot"; + titles = QStringList() << "+qtassistant" << "+qout" << "fake" << "communi" << "@ChanServ" << "Bot"; + + nextIndex = users.indexOf(fake); + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), users.count()); + + QCOMPARE(namesChangedSpy.count(), ++namesChangedCount); + QCOMPARE(namesChangedSpy.last().at(0).toStringList(), QStringList() << "Bot" << "ChanServ" << "communi" << "fake" << "qout" << "qtassistant"); + + QCOMPARE(usersChangedSpy.count(), ++usersChangedCount); + QCOMPARE(usersChangedSpy.last().at(0).value >(), users); + + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), topLeft.parent()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + // QUIT -> no changes + QVERIFY(waitForWritten(":communi!communi@hidd.en QUIT :bye")); + + QCOMPARE(userModel.count(), names.count()); + for (int i = 0; i < userModel.count(); ++i) { + QCOMPARE(userModel.get(i)->name(), names.at(i)); + QCOMPARE(userModel.get(i)->title(), titles.at(i)); + QCOMPARE(userModel.get(i), users.at(i)); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + QCOMPARE(namesChangedSpy.count(), namesChangedCount); + QCOMPARE(usersChangedSpy.count(), usersChangedCount); + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + QCOMPARE(modelAboutToBeResetSpy.count(), modelAboutToBeResetCount); + QCOMPARE(modelResetSpy.count(), modelResetCount); +} + +void tst_IrcUserModel::testRoles() +{ + IrcUserModel model; + QHash roles = model.roleNames(); + QCOMPARE(roles.take(Qt::DisplayRole), QByteArray("display")); + QCOMPARE(roles.take(Irc::UserRole), QByteArray("user")); + QCOMPARE(roles.take(Irc::NameRole), QByteArray("name")); + QCOMPARE(roles.take(Irc::PrefixRole), QByteArray("prefix")); + QCOMPARE(roles.take(Irc::ModeRole), QByteArray("mode")); + QCOMPARE(roles.take(Irc::TitleRole), QByteArray("title")); + QVERIFY(roles.isEmpty()); +} + +void tst_IrcUserModel::testAIM() +{ + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(tst_IrcData::welcome())); + QCOMPARE(bufferModel.count(), 0); + waitForWritten(":communi!communi@hidd.en JOIN :#channel"); + QCOMPARE(bufferModel.count(), 1); + + IrcUserModel userModel(bufferModel.get(0)); + waitForWritten(":irc.ser.ver 353 communi = #channel :a @b +c"); + waitForWritten(":irc.ser.ver 366 communi #channel :End of /NAMES list."); + QCOMPARE(userModel.count(), 3); + + IrcUser* a = userModel.find("a"); + IrcUser* b = userModel.find("b"); + IrcUser* c = userModel.find("c"); + IrcUser* o = 0; + + QVERIFY(a); + QVERIFY(b); + QVERIFY(c); + + QAbstractItemModel* aim = &userModel; + QModelIndex ai = aim->index(0, 0); + QModelIndex bi = aim->index(1, 0); + QModelIndex ci = aim->index(2, 0); + QModelIndex oi = aim->index(100, 100); + + QVERIFY(ai.isValid()); + QVERIFY(bi.isValid()); + QVERIFY(ci.isValid()); + QVERIFY(!oi.isValid()); + + QCOMPARE(aim->rowCount(QModelIndex()), 3); + QCOMPARE(aim->rowCount(ai), 0); + + QCOMPARE(aim->columnCount(QModelIndex()), 1); + QCOMPARE(aim->columnCount(ai), 0); + + QCOMPARE(userModel.index(a), ai); + QCOMPARE(userModel.index(b), bi); + QCOMPARE(userModel.index(c), ci); + QVERIFY(!userModel.index(o).isValid()); + + QCOMPARE(userModel.user(ai), a); + QCOMPARE(userModel.user(bi), b); + QCOMPARE(userModel.user(ci), c); + QVERIFY(!userModel.user(oi)); + + userModel.setDisplayRole(Irc::TitleRole); + QCOMPARE(aim->data(ai, Qt::DisplayRole).toString(), a->title()); + QCOMPARE(aim->data(bi, Qt::DisplayRole).toString(), b->title()); + QCOMPARE(aim->data(ci, Qt::DisplayRole).toString(), c->title()); + QVERIFY(aim->data(oi, Qt::DisplayRole).toString().isEmpty()); + + userModel.setDisplayRole(Irc::UserRole); + QCOMPARE(aim->data(ai, Qt::DisplayRole).value(), a); + QCOMPARE(aim->data(bi, Qt::DisplayRole).value(), b); + QCOMPARE(aim->data(ci, Qt::DisplayRole).value(), c); + QVERIFY(!aim->data(oi, Qt::DisplayRole).value()); + + QCOMPARE(aim->data(ai, Irc::UserRole).value(), a); + QCOMPARE(aim->data(bi, Irc::UserRole).value(), b); + QCOMPARE(aim->data(ci, Irc::UserRole).value(), c); + QVERIFY(!aim->data(oi, Irc::UserRole).value()); + + QCOMPARE(aim->data(ai, Irc::TitleRole).toString(), a->title()); + QCOMPARE(aim->data(bi, Irc::TitleRole).toString(), b->title()); + QCOMPARE(aim->data(ci, Irc::TitleRole).toString(), c->title()); + QVERIFY(aim->data(oi, Irc::TitleRole).toString().isEmpty()); + + QCOMPARE(aim->data(ai, Irc::NameRole).toString(), a->name()); + QCOMPARE(aim->data(bi, Irc::NameRole).toString(), b->name()); + QCOMPARE(aim->data(ci, Irc::NameRole).toString(), c->name()); + QVERIFY(aim->data(oi, Irc::NameRole).toString().isEmpty()); + + QVERIFY(aim->data(ai, Irc::PrefixRole).toString().isEmpty()); + QCOMPARE(aim->data(bi, Irc::PrefixRole).toString(), QString("@")); + QCOMPARE(aim->data(ci, Irc::PrefixRole).toString(), QString("+")); + QVERIFY(aim->data(oi, Irc::PrefixRole).toString().isEmpty()); + + QVERIFY(aim->data(ai, Irc::ModeRole).toString().isEmpty()); + QCOMPARE(aim->data(bi, Irc::ModeRole).toString(), QString("o")); + QCOMPARE(aim->data(ci, Irc::ModeRole).toString(), QString("v")); + QVERIFY(aim->data(oi, Irc::ModeRole).toString().isEmpty()); +} + +void tst_IrcUserModel::testUser() +{ + IrcUserModel userModel; + + // ### setup #communi (5): communi @ChanServ +qtassistant Guest1234 +qout + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + + QVERIFY(waitForWritten(tst_IrcData::welcome())); + QVERIFY(waitForWritten(":communi!~communi@hidd.en JOIN :#communi")); + QVERIFY(waitForWritten(":irc.ifi.uio.no 353 communi = #communi :communi @ChanServ +qtassistant Guest1234 +qout")); + QVERIFY(waitForWritten(":irc.ifi.uio.no 366 communi #communi :End of NAMES list.")); + QCOMPARE(bufferModel.count(), 1); + IrcChannel* channel = bufferModel.get(0)->toChannel(); + QVERIFY(channel); + QCOMPARE(channel->title(), QString("#communi")); + + // ### ready to go! + userModel.setChannel(channel); + QCOMPARE(userModel.count(), 5); + + QPointer communi = userModel.get(0); + QVERIFY(communi); + QCOMPARE(communi->name(), QString("communi")); + QVERIFY(!communi->isAway()); + QVERIFY(!communi->isServOp()); + + QPointer ChanServ = userModel.get(1); + QVERIFY(ChanServ); + QCOMPARE(ChanServ->name(), QString("ChanServ")); + QVERIFY(!ChanServ->isAway()); + QVERIFY(!ChanServ->isServOp()); + + QPointer qtassistant = userModel.get(2); + QVERIFY(qtassistant); + QCOMPARE(qtassistant->name(), QString("qtassistant")); + QVERIFY(!qtassistant->isAway()); + QVERIFY(!qtassistant->isServOp()); + + QPointer Guest1234 = userModel.get(3); + QVERIFY(Guest1234); + QCOMPARE(Guest1234->name(), QString("Guest1234")); + QVERIFY(!Guest1234->isAway()); + QVERIFY(!Guest1234->isServOp()); + + QPointer qout = userModel.get(4); + QVERIFY(qout); + QCOMPARE(qout->name(), QString("qout")); + QVERIFY(!qout->isAway()); + QVERIFY(!qout->isServOp()); + + QSignalSpy communiAwaySpy(communi.data(), SIGNAL(awayChanged(bool))); + QSignalSpy ChanServAwaySpy(ChanServ.data(), SIGNAL(awayChanged(bool))); + QSignalSpy qtassistantAwaySpy(qtassistant.data(), SIGNAL(awayChanged(bool))); + QSignalSpy Guest1234AwaySpy(Guest1234.data(), SIGNAL(awayChanged(bool))); + QSignalSpy qoutAwaySpy(qout.data(), SIGNAL(awayChanged(bool))); + + QVERIFY(communiAwaySpy.isValid()); + QVERIFY(ChanServAwaySpy.isValid()); + QVERIFY(qtassistantAwaySpy.isValid()); + QVERIFY(Guest1234AwaySpy.isValid()); + QVERIFY(qoutAwaySpy.isValid()); + + QSignalSpy communiServOpSpy(communi.data(), SIGNAL(servOpChanged(bool))); + QSignalSpy ChanServServOpSpy(ChanServ.data(), SIGNAL(servOpChanged(bool))); + QSignalSpy qtassistantServOpSpy(qtassistant.data(), SIGNAL(servOpChanged(bool))); + QSignalSpy Guest1234ServOpSpy(Guest1234.data(), SIGNAL(servOpChanged(bool))); + QSignalSpy qoutServOpSpy(qout.data(), SIGNAL(servOpChanged(bool))); + + QVERIFY(communiServOpSpy.isValid()); + QVERIFY(ChanServServOpSpy.isValid()); + QVERIFY(qtassistantServOpSpy.isValid()); + QVERIFY(Guest1234ServOpSpy.isValid()); + QVERIFY(qoutServOpSpy.isValid()); + + // first round + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~communi hidd.en irc.ifi.uio.no communi H* :0 Communi")); + QVERIFY(!communi->isAway()); + QVERIFY(communi->isServOp()); + QCOMPARE(communiAwaySpy.count(), 0); + QCOMPARE(communiServOpSpy.count(), 1); + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ChanServ services. irc.ifi.uio.no ChanServ H@ :0 ChanServ")); + QVERIFY(!ChanServ->isAway()); + QVERIFY(!ChanServ->isServOp()); + QCOMPARE(ChanServAwaySpy.count(), 0); + QCOMPARE(ChanServServOpSpy.count(), 0); + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~qtassistant hidd.en irc.ifi.uio.no qtassistant G+ :0 Qt Assistant")); + QVERIFY(qtassistant->isAway()); + QVERIFY(!qtassistant->isServOp()); + QCOMPARE(qtassistantAwaySpy.count(), 1); + QCOMPARE(qtassistantServOpSpy.count(), 0); + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~guest hidd.en irc.ifi.uio.no Guest1234 H :0 Just a guest...")); + QVERIFY(!Guest1234->isAway()); + QVERIFY(!Guest1234->isServOp()); + QCOMPARE(Guest1234AwaySpy.count(), 0); + QCOMPARE(Guest1234ServOpSpy.count(), 0); + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~qout hidd.en irc.ifi.uio.no qout G+ :0")); + QVERIFY(qout->isAway()); + QVERIFY(!qout->isServOp()); + QCOMPARE(qoutAwaySpy.count(), 1); + QCOMPARE(qoutServOpSpy.count(), 0); + + // second round + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~communi hidd.en irc.ifi.uio.no communi G@ :0 Communi")); + QVERIFY(communi->isAway()); + QVERIFY(!communi->isServOp()); + QCOMPARE(communiAwaySpy.count(), 1); + QCOMPARE(communiServOpSpy.count(), 2); + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ChanServ services. irc.ifi.uio.no ChanServ H@ :0 ChanServ")); + QVERIFY(!ChanServ->isAway()); + QVERIFY(!ChanServ->isServOp()); + QCOMPARE(ChanServAwaySpy.count(), 0); + QCOMPARE(ChanServServOpSpy.count(), 0); + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~qtassistant hidd.en irc.ifi.uio.no qtassistant H+ :0 Qt Assistant")); + QVERIFY(!qtassistant->isAway()); + QVERIFY(!qtassistant->isServOp()); + QCOMPARE(qtassistantAwaySpy.count(), 2); + QCOMPARE(qtassistantServOpSpy.count(), 0); + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~guest hidd.en irc.ifi.uio.no Guest1234 G :0 Just a guest...")); + QVERIFY(Guest1234->isAway()); + QVERIFY(!Guest1234->isServOp()); + QCOMPARE(Guest1234AwaySpy.count(), 1); + QCOMPARE(Guest1234ServOpSpy.count(), 0); + + QVERIFY(waitForWritten(":irc.ifi.uio.no 352 communi #communi ~qout hidd.en irc.ifi.uio.no qout G+ :0")); + QVERIFY(qout->isAway()); + QVERIFY(!qout->isServOp()); + QCOMPARE(qoutAwaySpy.count(), 1); + QCOMPARE(qoutServOpSpy.count(), 0); +} + +QTEST_MAIN(tst_IrcUserModel) + +#include "tst_ircusermodel.moc" diff --git a/src/libcommuni/tests/auto/shared/shared.pri b/src/libcommuni/tests/auto/shared/shared.pri new file mode 100644 index 0000000..1b7258b --- /dev/null +++ b/src/libcommuni/tests/auto/shared/shared.pri @@ -0,0 +1,16 @@ +###################################################################### +# Communi +###################################################################### + +DEPENDPATH += $$PWD +INCLUDEPATH += $$PWD + +HEADERS += $$PWD/tst_euirc.h +HEADERS += $$PWD/tst_freenode.h +HEADERS += $$PWD/tst_ircnet.h + +HEADERS += $$PWD/tst_ircdata.h +SOURCES += $$PWD/tst_ircdata.cpp + +HEADERS += $$PWD/tst_ircclientserver.h +SOURCES += $$PWD/tst_ircclientserver.cpp diff --git a/src/libcommuni/tests/auto/shared/tst_euirc.h b/src/libcommuni/tests/auto/shared/tst_euirc.h new file mode 100644 index 0000000..116e8a2 --- /dev/null +++ b/src/libcommuni/tests/auto/shared/tst_euirc.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#ifndef TST_EUIRC_H +#define TST_EUIRC_H + +static const char* euirc_welcome = + ":irc.rbx.fr.euirc.net 001 communi :Welcome to the euIRCnet IRC Network communi!~communi@hidd.en\n" + ":irc.rbx.fr.euirc.net 002 communi :Your host is irc.rbx.fr.euirc.net, running version euIRCd 1.3.4-e544f33+debug\n" + ":irc.rbx.fr.euirc.net 003 communi :This server was created Mon Jul 08 2013 at 07:09:56 CEST\n" + ":irc.rbx.fr.euirc.net 004 communi irc.rbx.fr.euirc.net euIRCd 1.3.4-e544f33+debug oOiRwhsSaHANCrxjWqBZ1dtcpPUnTI vhoaqpsmtinrRQKVHOAYCNcSXUTxW5beIwklfLBuFM\n" + ":irc.rbx.fr.euirc.net 005 communi NETWORK=euIRCnet WATCH=128 SAFELIST PREFIX=(qaohv)*!@%+ CHANMODES=bewI,k,flBL,cimnprstxACHKNOQRiTSVWXY5 CHANTYPES=#&+ KICKLEN=307 KNOCK MAP MAXLIST=bewI:100 MODES=6 NICKLEN=30 SILENCE=5 TOPICLEN=307 AWAYLEN=307 WALLCHOPS CHANNELLEN=32 MAXCHANNELS=30 MAXTARGETS=20 INVEX=I EXCEPT=e :are available on this server\n" + ":irc.rbx.fr.euirc.net 005 communi STARTTLS :are available on this server\n" + ":irc.rbx.fr.euirc.net 251 communi :There are 14 users and 2768 invisible on 10 servers\n" + ":irc.rbx.fr.euirc.net 252 communi 24 :operator(s) online\n" + ":irc.rbx.fr.euirc.net 253 communi 1 :unknown connection(s)\n" + ":irc.rbx.fr.euirc.net 254 communi 1671 :channels formed\n" + ":irc.rbx.fr.euirc.net 255 communi :I have 1060 clients and 1 servers\n" + ":irc.rbx.fr.euirc.net 265 communi :Current Local Users: 1060 Max: 1221\n" + ":irc.rbx.fr.euirc.net 266 communi :Current Global Users: 2782 Max: 11082\n" + ":irc.rbx.fr.euirc.net 375 communi :- irc.rbx.fr.euirc.net Message of the Day -\n" + ":irc.rbx.fr.euirc.net 376 communi :End of /MOTD command\n"; + +static const char* euirc_join = + ":communi!~communi@hidd.en JOIN :#euirc\n" + ":irc.rbx.fr.euirc.net 332 communi #euirc :Welcome to euIRC || Problems? Join #opers || www.euirc.net || SSL and S/MIME authentication now available on all servers (port 6697) || euIRC meets facebook: www.facebook.com/euirc\n" + ":irc.rbx.fr.euirc.net 333 communi #euirc Renne 1370272649\n" + ":irc.rbx.fr.euirc.net 353 communi = #euirc :communi Guest774 burning_rabbit %aleksandr netsplit Jerry Brueggus charly6 HermiNe %brue Mercutio stephan48 NeinnHomer Luthandorius Technomagier |Baron| Laknu_ Polizist1 !alamar rhonabwy @Vampi Mayday @Road radic MorkiTorki PRoTaGoNiST Simik|ZzZZ @][flat][ statsbot7 !mensch holygoth firefly Kanibal Luchs xinator CR|Noah|Away MrWolf !specon CR|Dani %leni CR|Sven @Renne Revi Arovin pinGUUin Vampire666 gastgast_\n" + ":irc.rbx.fr.euirc.net 353 communi = #euirc :konqui Tina-chan_onAir picoFF @medice SLXViper !TC sb Kn0p3XX SlySing faZe Icedream Der_Orwischer Goggy g00fy Burle klaxa [Chaos|Krieger] Guest14697 Tehlak icefly Herr_Vorragend Ding Nothing4You Sven|Off Zarquod !jun|per scaba meister Hikaru-Shindo Alx Kinji-san Guest13553 !Chibisuke\n" + ":irc.rbx.fr.euirc.net 366 communi #euirc :End of /NAMES list.\n"; + +static const char* euirc_names = + "communi Guest774 burning_rabbit aleksandr netsplit Jerry Brueggus charly6 HermiNe brue Mercutio stephan48 NeinnHomer Luthandorius Technomagier |Baron| Laknu_ Polizist1 alamar rhonabwy Vampi Mayday Road radic MorkiTorki PRoTaGoNiST Simik|ZzZZ ][flat][ statsbot7 mensch holygoth firefly Kanibal Luchs xinator CR|Noah|Away MrWolf specon CR|Dani leni CR|Sven Renne Revi Arovin pinGUUin Vampire666 gastgast_ " + "konqui Tina-chan_onAir picoFF medice SLXViper TC sb Kn0p3XX SlySing faZe Icedream Der_Orwischer Goggy g00fy Burle klaxa [Chaos|Krieger] Guest14697 Tehlak icefly Herr_Vorragend Ding Nothing4You Sven|Off Zarquod jun|per scaba meister Hikaru-Shindo Alx Kinji-san Guest13553 Chibisuke"; + +static const char* euirc_admins = "alamar mensch specon TC jun|per Chibisuke"; +static const char* euirc_ops = "Vampi Road ][flat][ Renne medice"; +static const char* euirc_halfops = "aleksandr brue leni"; +static const char* euirc_voices = ""; + +#endif // TST_EUIRC_H diff --git a/src/libcommuni/tests/auto/shared/tst_freenode.h b/src/libcommuni/tests/auto/shared/tst_freenode.h new file mode 100644 index 0000000..345abeb --- /dev/null +++ b/src/libcommuni/tests/auto/shared/tst_freenode.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#ifndef TST_FREENODE_H +#define TST_FREENODE_H + +static const char* freenode_welcome = + ":moorcock.freenode.net NOTICE * :*** Looking up your hostname...\r\n" + ":moorcock.freenode.net NOTICE * :*** Checking Ident\r\n" + ":moorcock.freenode.net NOTICE * :*** Found your hostname\r\n" + ":moorcock.freenode.net NOTICE * :*** No Ident response\r\n" + ":moorcock.freenode.net 001 communi :Welcome to the freenode Internet Relay Chat Network communi\r\n" + ":moorcock.freenode.net 002 communi :Your host is moorcock.freenode.net[50.22.136.18/6667], running version ircd-seven-1.1.3\r\n" + ":moorcock.freenode.net 003 communi :This server was created Mon Dec 31 2012 at 15:37:06 CST\r\n" + ":moorcock.freenode.net 004 communi moorcock.freenode.net ircd-seven-1.1.3 DOQRSZaghilopswz CFILMPQSbcefgijklmnopqrstvz bkloveqjfI\r\n" + ":moorcock.freenode.net 005 communi CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=freenode KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server\r\n" + ":moorcock.freenode.net 005 communi CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server\r\n" + ":moorcock.freenode.net 005 communi EXTBAN=$,arxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server\r\n" + ":moorcock.freenode.net 251 communi :There are 231 users and 88216 invisible on 29 servers\r\n" + ":moorcock.freenode.net 252 communi 36 :IRC Operators online\r\n" + ":moorcock.freenode.net 253 communi 12 :unknown connection(s)\r\n" + ":moorcock.freenode.net 254 communi 49792 :channels formed\r\n" + ":moorcock.freenode.net 255 communi :I have 4723 clients and 1 servers\r\n" + ":moorcock.freenode.net 265 communi 4723 7446 :Current local users 4723, max 7446\r\n" + ":moorcock.freenode.net 266 communi 88447 92550 :Current global users 88447, max 92550\r\n" + ":moorcock.freenode.net 250 communi :Highest connection count: 7447 (7446 clients) (1286042 connections received)\r\n" + ":moorcock.freenode.net 375 communi :- moorcock.freenode.net Message of the Day -\r\n" + ":moorcock.freenode.net 372 communi :- Welcome to moorcock.freenode.net in ...\r\n" + ":moorcock.freenode.net 376 communi :End of /MOTD command.\r\n"; + +static const char* freenode_join = + ":communi!~communi@hidd.en JOIN #freenode\r\n" + ":moorcock.freenode.net 332 communi #freenode :Welcome to #freenode | Staff are voiced; some may also be on /stats p -- feel free to /msg us at any time | FAQ: http://freenode.net/faq.shtml | Unwelcome queries? Use /mode your_nick +R to block them. | Channel guidelines: http://freenode.net/poundfreenode.shtml | Blog: http://blog.freenode.net | Please don't comment on spam/trolls.\r\n" + ":moorcock.freenode.net 333 communi #freenode erry 1379357591\r\n" + ":moorcock.freenode.net 353 communi = #freenode :communi straterra absk007 pefn xlys Gromit TooCool Sambler gat0rs KarneAsada danis_963 Kiryx chrismeller deefloo black_male sxlnxdx bjork Kinny phobos_anomaly T13|sleeps JuxTApose Kolega2357 rorx techhelper1 hermatize Azimi iqualfragile fwilson skasturi mwallacesd mayday Guest76549 mcjohansen MangaKaDenza ARISTIDES ketas `- claptor ylluminate Cooky Brand3n cheater_1 Kirito digitaloktay Will| Iarfen abrotman smurfy Inaunt +mist Karol RougeR_\r\n" + ":moorcock.freenode.net 353 communi = #freenode :publickeating An_Ony_Moose michagogo Guest915` davidfg4 Ragnor s1lent_1 keee GingerGeek[Away] hibari derp S_T_A_N anonymuse asantoni road|runner LLckfan neoian2 aviancarrier nipples danieldaniel Pyrus Bry8Star shadowm_desktop furtardo rdymac TTSDA seaworthy Chiyo yscc Zombiebaron redpill f4cl3y Boohbah applebloom zorael kameloso^ Zetetic XAMPP wheels_up Cuppy-Cake mindlessjohnny Kymru mquin_ Rodja babilen kirin` David Affix jshyeung_ DarkAceZ karakedi\r\n" + ":moorcock.freenode.net 353 communi = #freenode :jraglin AdriDJ ToApolytoXaos whaletechno jlf Ricardo__ TmvC Sigma00 Casmo breck7 Oldiesmann Rappy naomi thiras moli FRCorey_ iderik glebihan cool_name Dwade09 UniOn eMBee Samual johnnymoo_logsta darknyan mlk dyay xBytez hammond M2Ys4U kobain monoprotic MiLK_ Noldorin njm Nomado Alina-malina abchirk_ Johannes13_ scorche dreamfighter Lars_G DCMT TomyLobo King_Hual No_One fling Mike_H CoreISP djdoody fdd pipitas Subo1977 jef redarrow marcoecc bin_sh TReK\r\n" + ":moorcock.freenode.net 353 communi = #freenode :[MortiKi] traveller__ Catie DarkG HisaoNakai scounder alone Corycia rudyismydog ToBeFree mcalabrese micadeyeye_ Sembei candlejackson cobra-the-joker ElectricDuck fuzeman swoolley ali_h dungodung oleo brain8675 Jordach rdy4watever KillYourTV coffeee levine m4v dvu ty _nova jgeboski Olipro CheckDavid impulse150 Shadow` jarr0dsz an3k Sove daemon Sary t0rben monkeyjuice Blas alexa the_TORmentor Transfusion kensington Spaceghost wolfmitchell lubmil synick\r\n" + ":moorcock.freenode.net 353 communi = #freenode :bitnumus krassomat zerox kel39 basiclaser tristero blaxnake themill meznak chinkung DJJeff RBecker XDS2010_ iamblue_cloud excilan Ristovski +JamesTait DrJ pfffx d9b4bef9 Corvus` s0ckpuppet Guest73279 Fritz7 JBreit zinx KhashayaR p3lim_ krisha quackgyver salkaman j4jackj Guest86053 nmmm wiretapped lunchdump goose sam Zarthus jje sl3dge Vutral sins- weie_ +Myrtti _raymond_ KindOne youlysses Mizael jeffz` meet_praveen STalKer-X osxdude surfdue torako\r\n" + ":moorcock.freenode.net 353 communi = #freenode :niloc132_ connor_goodwolf \\mSg vemacs iViLe slobber zendeavor drbean Tonitrus Nightmare ssbr GorillaPatch TingPing +Pricey james41382 Chenguang Jyothis RansomTime zz_Enviious TakinOver chrisss404 Brando753 mduca SlashLife_ Fuchs DW-Drew Firzen__ Suprano duke johest_ infinem Birdman3131 tmtowtdi Guest61594 BearPerson GiGaHuRtZ Hausas sdamashek salamanderrake jwbirdsong themadhatter mahomet smeggysmeg +kloeri_ kameloso Simonn ryukafalz tigrmesh Borg\r\n" + ":moorcock.freenode.net 353 communi = #freenode :Kingdom RougeR Venusaur resistivecorpse rush2end destiny rylinaux gskellig Wonkaewt philip quelx hside tann bolt btcvixen joako pr0ggie Xiti` arpita_ Hewn Argus Shippo +Tabmow FrankZZ Olanzapin zhezhe swiatos Argure Cathy JKL1234- Elfix Suicide cali urkl laissez-f sig-wall Guest76477 Rix jok- Guest41925 Thehelpfulone Nimrod oscailt stalled anexus _val_ Luke-Jr Konomi German__ acanete knuth Wildblue` juser Reshesnik Saiban corelax brr JoeK DarkSkyes\r\n" + ":moorcock.freenode.net 353 communi = #freenode :BullShark Zhaofeng_Li vidplace7 aji APLU RiverRat jerome Bateau raSter^ chipster Vito PigFlu Sprocks evaldoxie Atlas petan javalover MobiusL yerodin Barras2 Barras Humbedooh Niichan SlicerDicer slax0r Brodeles Aurora tandoori Davey Culator|Away gtmanfred kPa ex0a contempt Xack ecks prawnsalad wirehack7 nyuszika7h around Kelsie CaHogan mrpeenut24 Mozart IceCraft LifeIspain andrex sloof thismat troybattey notori0us UbuPhillup lasers BlastHardcheese muskeg\r\n" + ":moorcock.freenode.net 353 communi = #freenode :archigos +jayne XJR-9 realazthat Geert ahf nim edk spb @ChanServ Azure +nhandler a3li edggeek zol Bigcheese stylus DrBash ingo ningrat zu +tomaw felipe QueenOfFrance dxrt Y_Ichiro sysdef Ju576 rwg [NOT|HERE] sili Snowolf Shnaw tapout Joori GriGore665 LoganCloud Osaka funtapaz MidnighToker codeM0nK3Y Zen kinlo +Corey raj c0ded Remco Vikrant_ xander chadi |L| Shockk nickg ajpiano guntbert funkyHat +erry Mkaysi meingtsla seaLne EvilBlueShark pdelvo Strog\r\n" + ":moorcock.freenode.net 353 communi = #freenode :geb Vlad Deathspawn mdan Zidonuke jjs999jjs Bry8Star4 inthecompanyof Motzfeldt jlouis mooky avelldiroll tonsofpcs d2r Loki JPT Jamesofur +kloeri Paradox924X Zx3 cruxeternus sdx23 adaptr PwnSauce mattb J21 likewhoa scorche|sh hellome Geek_Juice xorpp Sonar_Guy luckman212 danar psybear eir StarRain sparticus stux|RC-only go|dfish teneightypea BaW d10n riddle Tm_T dive EvilJStoker glowsticks kode54 stwalkerster pocoyo shiftplusone bburhans trucMuche\r\n" + ":moorcock.freenode.net 353 communi = #freenode :moonlight +yano kevank jmfcool BranchPredictor pppingme Namikaze EvilOne FZTMm Sakaki Lord_Aizen demosdemon JasonDC duracrisis IHateHavingToReg +D[_] AlexJFox Th0masR0ss back Exio4 kunwon1 kc8qvp jeblair Jeruvy Kadet EmLeX aways Kester Spr0cket Thorne csssuf iotku nb solution Zanzibar em mwheeler x56 ChauffeR_ phrozen77 ivan`` The_Cop Monkeh ishanyx Whopper ghz JStoker brabo_ Triskelios sosby PoohBear Clete2 ErrantEgo SebastianFlyte JT jose rubick\r\n" + ":moorcock.freenode.net 353 communi = #freenode :RDash[AW] wwraith Hazel|artemis mrgaryniger tabeaux crazedpsyc +denny mh0 TheDrums Nothing4You_ Fieldy akawaka thumbs +Dave2 aghos_ Carly-_ Necrosan K1rk ClaudiaU_ HeavyMetal Zenum KOD3N cooldude mshaw milky sepeck Nineain nxp ktr TheLordOfTime dmlloyd sunitknandi arikb pumba Webu `DiM danmackay zomGreg tomboy_ callumacrae Devels rsrx zz_dbRenaud trout Kye Romance _ruben sfan5 brabo lassefaxoe Arieh John13 +ldunn OldSoul|4SiOS501 evilmquin xrated Ishaq\r\n" + ":moorcock.freenode.net 353 communi = #freenode :phreak turboroot ra roxell topyli jeremias doily Nazca Aehmlo_away nutron +christel +niko DLange drdanick AndrewBarber mediko psk1 TheJH skrip_kid +jbroome +njan RainbowDashh +Plazma vedalken254 codethought md_5 michagogo|cloud brad lolcat +LoRez MissionCritical honzik666 variousnefarious AlanBell tdfischer EricK|AFK AsadH apollo13 Wug[Hyperspace] nullrouted|cloud PeerLesS DarthGandalf cbdev shroud badunkadunk Happzz fortytwo netchip Mike3620 newton\r\n" + ":moorcock.freenode.net 353 communi = #freenode :Detch Gnumarcoo Brownout Junaos ThalinVien evilErrantEgo Bladerunner +JonathanD Beothoric FloTiX Alenah Raccoon ow GLolol c45y coinspelunk mysteerimasa real_alien tburg SPF|Cloud Cloudiumn like2helpU iMast777 geoffw8__ troyt Hypnotoad nkuttler Sjsws1078_ apoplexy3 trawl AntiSpamMeta ShadowNinja Kernel|Panic vinylGhost GaelanAintAround dlu corentin shark KnownUnown pentiumone133 AimHere Mad7Scientist SaMOOrai Fabianius alamar morphium espiral Someguy123\r\n" + ":moorcock.freenode.net 353 communi = #freenode :LIP DURgod tehKitten an0nmat1r FuriousRage nanotube jrgifford Mez +gry n4x TDJACR phuzion ohm BradND TheUni OzBorne RumpledElf Internet13 Muzer lostlabyrinth SeySayux midnightmagic drathir Sling firebird +jtrucks Red_M Stary2001 localhost jefferai mosh sweet_kid +RichiH Nothing4You hvxgr FastLizard4 bren2010 Slasher VunKruz sohum MogDog DJones fooly Arokh swords anaconda rcombs Wiretap jeffmjack petteyg TW1920 grawity JakeOrrall mac-mini _Cr4zi3_VM\r\n" + ":moorcock.freenode.net 353 communi = #freenode :Djole ShapeShifter499 AccessDenied jlcl Jguy sucheta XgF avermedia_ Pyker evil alpha Affliction Spitfire Fohlen rtbt humvee ka6sox benhunter09 mavensk asherkin +Elwell amithkk SolarAquarion chalcedony amarshall mrtux GarethAdams gary_chiang SilentPenguin ebuch_ +jbroome_ TW1920__ LaserShark msimkins Playb3yond music2myear maksbotan tenobi noko eighty4 bitpushr bucketm0use Amrykid phantomcircuit WorldEmperor Reisen pjschmitt armansito piney Yajirobe\r\n" + ":moorcock.freenode.net 353 communi = #freenode :neuro_sys JordanJ2 z3uS kline Clinteger Taylor albel727 Kharec Rarity Tzunamii VictorRedtail|Sa Peng KWC10 Axew iPod Jasper_Deng_away RyanKnack unreal Haseo aegis mst SecretAgent wapiflapi ghoti _spk_ jeremyb LjL +marienz _TMM_ Archer +gheraint cebor Chris_G Schoentoon jsec Bradford|Nosta addshore cyphase jmbsvicetto liori Plasmastar Skunky chaoscon heinrich5991 nealph catsup SierraAR davidhadas levarnu ping- daurnimator Cr0iX ksx4system Lars_G_ Maple__\r\n" + ":moorcock.freenode.net 353 communi = #freenode :PcJamesy rej froggyman LanceBNC Vorpal RojoD asakura jaybe Kyle IsoAnon neal__ G ski ibenox Adran Shirik WaffleZ MRX Damage-X Guest90323 jericon irc_adama Nietzschale Mack d1b balrog ikonia GTAXL Michail1 CoJaBo SkyDreamer suborbital Stryyker farn Matrixiumn Fira benonsoftware kaictl jdiez spectra FriendlyFascist Cyclone Koma dwfreed Phoebus jamesd MichaelC|Mobile PennStater SwedFTP +spaceinvader jumperboy Zic Graet ake gbyers[Away] MJ94 keeleysam Dwarf\r\n" + ":moorcock.freenode.net 353 communi = #freenode :NiTeMaRe arkeet Jake_D alvinek_ debris` Guest13246 infojunky ChrisAM Novacha ImTheBitch capri MartynKeigher BlackoutIsHere WannabeZNC EViLSLuT DrRen KamusHadenes deadpool graphitemaster xy andy_ Cydrobolt Metaleer Oprah Hello71 dirtydawg [Derek] basic` wei2912 nesthib poutine Angelo Simba WormDrink robink zymurgy Guest89644 SirCmpwn enchilado dominikh vivekrai Utility Jason bazhang paddymahoney pinPoint brainproxy TheEpTic Revi N7 Lyude edibsk mb06cs\r\n" + ":moorcock.freenode.net 353 communi = #freenode :bray90820 IdleOne Console kPa_ shadowm winocm spot digikwondo blishchrot MichaelC swagemon Whiskey win2012 VideoDudeMike HavokOC FailPowah ix007 phenom JZTech101 ohama eric1212 Timbo zz_dlu joey Wooble Willis pseubodot lbft elky BlueShark haxxed JamesOff ndngvr` overrider lahwran plasticboy idoru DXtremz Adonis SeanieB Gizmokid2005 Aerox3 Disori ludkiller dhoss_ c xid b_jonas lurst TheLonelyGod Nietzsche MillHouse Guest19968 AlexP Stoo psycho_oreos G1eb\r\n" + ":moorcock.freenode.net 353 communi = #freenode :Obfuscate ggherdov dStruct auscompgeek bdfoster tharkun aperson GeordieNorman mfamos irv +tt argv Psi-Jack cups Cprossu TheBadShepperd Magiobiwan mkb Steakanbake three18ti lysobit raztoki Chex Sellyme caf Guest76346 Louis Lexi sa`tan truexfan81 nitrix CodesInChaos Deus N3LRX Tsunamifox tgs3 multiply JakeSaysSays epochwolf totte +t cam daemoneye stump Sargun ekeih tauntaun Milenko vvv upgrayeddd mrrothhcloud___ _anonymous +issyl0 smokex Pici\r\n" + ":moorcock.freenode.net 366 communi #freenode :End of /NAMES list.\r\n" + ":ChanServ!ChanServ@services. NOTICE communi :[#freenode] Welcome to #freenode. All network staff are voiced in here, but may not always be around - type /stats p to get a list of on call staff. Others may be hiding so do feel free to ping and /msg us at will! Also please read the channel guidelines at http://freenode.net/poundfreenode.shtml - thanks.\r\n" + ":services. 328 communi #freenode :http://freenode.net/\r\n"; + +static const char* freenode_names = + "communi straterra absk007 pefn xlys Gromit TooCool Sambler gat0rs KarneAsada danis_963 Kiryx chrismeller deefloo black_male sxlnxdx bjork Kinny phobos_anomaly T13|sleeps JuxTApose Kolega2357 rorx techhelper1 hermatize Azimi iqualfragile fwilson skasturi mwallacesd mayday Guest76549 mcjohansen MangaKaDenza ARISTIDES ketas `- claptor ylluminate Cooky Brand3n cheater_1 Kirito digitaloktay Will| Iarfen abrotman smurfy Inaunt mist Karol RougeR_ " + "publickeating An_Ony_Moose michagogo Guest915` davidfg4 Ragnor s1lent_1 keee GingerGeek[Away] hibari derp S_T_A_N anonymuse asantoni road|runner LLckfan neoian2 aviancarrier nipples danieldaniel Pyrus Bry8Star shadowm_desktop furtardo rdymac TTSDA seaworthy Chiyo yscc Zombiebaron redpill f4cl3y Boohbah applebloom zorael kameloso^ Zetetic XAMPP wheels_up Cuppy-Cake mindlessjohnny Kymru mquin_ Rodja babilen kirin` David Affix jshyeung_ DarkAceZ karakedi " + "jraglin AdriDJ ToApolytoXaos whaletechno jlf Ricardo__ TmvC Sigma00 Casmo breck7 Oldiesmann Rappy naomi thiras moli FRCorey_ iderik glebihan cool_name Dwade09 UniOn eMBee Samual johnnymoo_logsta darknyan mlk dyay xBytez hammond M2Ys4U kobain monoprotic MiLK_ Noldorin njm Nomado Alina-malina abchirk_ Johannes13_ scorche dreamfighter Lars_G DCMT TomyLobo King_Hual No_One fling Mike_H CoreISP djdoody fdd pipitas Subo1977 jef redarrow marcoecc bin_sh TReK " + "[MortiKi] traveller__ Catie DarkG HisaoNakai scounder alone Corycia rudyismydog ToBeFree mcalabrese micadeyeye_ Sembei candlejackson cobra-the-joker ElectricDuck fuzeman swoolley ali_h dungodung oleo brain8675 Jordach rdy4watever KillYourTV coffeee levine m4v dvu ty _nova jgeboski Olipro CheckDavid impulse150 Shadow` jarr0dsz an3k Sove daemon Sary t0rben monkeyjuice Blas alexa the_TORmentor Transfusion kensington Spaceghost wolfmitchell lubmil synick " + "bitnumus krassomat zerox kel39 basiclaser tristero blaxnake themill meznak chinkung DJJeff RBecker XDS2010_ iamblue_cloud excilan Ristovski JamesTait DrJ pfffx d9b4bef9 Corvus` s0ckpuppet Guest73279 Fritz7 JBreit zinx KhashayaR p3lim_ krisha quackgyver salkaman j4jackj Guest86053 nmmm wiretapped lunchdump goose sam Zarthus jje sl3dge Vutral sins- weie_ Myrtti _raymond_ KindOne youlysses Mizael jeffz` meet_praveen STalKer-X osxdude surfdue torako " + "niloc132_ connor_goodwolf \\mSg vemacs iViLe slobber zendeavor drbean Tonitrus Nightmare ssbr GorillaPatch TingPing Pricey james41382 Chenguang Jyothis RansomTime zz_Enviious TakinOver chrisss404 Brando753 mduca SlashLife_ Fuchs DW-Drew Firzen__ Suprano duke johest_ infinem Birdman3131 tmtowtdi Guest61594 BearPerson GiGaHuRtZ Hausas sdamashek salamanderrake jwbirdsong themadhatter mahomet smeggysmeg kloeri_ kameloso Simonn ryukafalz tigrmesh Borg " + "Kingdom RougeR Venusaur resistivecorpse rush2end destiny rylinaux gskellig Wonkaewt philip quelx hside tann bolt btcvixen joako pr0ggie Xiti` arpita_ Hewn Argus Shippo Tabmow FrankZZ Olanzapin zhezhe swiatos Argure Cathy JKL1234- Elfix Suicide cali urkl laissez-f sig-wall Guest76477 Rix jok- Guest41925 Thehelpfulone Nimrod oscailt stalled anexus _val_ Luke-Jr Konomi German__ acanete knuth Wildblue` juser Reshesnik Saiban corelax brr JoeK DarkSkyes " + "BullShark Zhaofeng_Li vidplace7 aji APLU RiverRat jerome Bateau raSter^ chipster Vito PigFlu Sprocks evaldoxie Atlas petan javalover MobiusL yerodin Barras2 Barras Humbedooh Niichan SlicerDicer slax0r Brodeles Aurora tandoori Davey Culator|Away gtmanfred kPa ex0a contempt Xack ecks prawnsalad wirehack7 nyuszika7h around Kelsie CaHogan mrpeenut24 Mozart IceCraft LifeIspain andrex sloof thismat troybattey notori0us UbuPhillup lasers BlastHardcheese muskeg " + "archigos jayne XJR-9 realazthat Geert ahf nim edk spb ChanServ Azure nhandler a3li edggeek zol Bigcheese stylus DrBash ingo ningrat zu tomaw felipe QueenOfFrance dxrt Y_Ichiro sysdef Ju576 rwg [NOT|HERE] sili Snowolf Shnaw tapout Joori GriGore665 LoganCloud Osaka funtapaz MidnighToker codeM0nK3Y Zen kinlo Corey raj c0ded Remco Vikrant_ xander chadi |L| Shockk nickg ajpiano guntbert funkyHat erry Mkaysi meingtsla seaLne EvilBlueShark pdelvo Strog " + "geb Vlad Deathspawn mdan Zidonuke jjs999jjs Bry8Star4 inthecompanyof Motzfeldt jlouis mooky avelldiroll tonsofpcs d2r Loki JPT Jamesofur kloeri Paradox924X Zx3 cruxeternus sdx23 adaptr PwnSauce mattb J21 likewhoa scorche|sh hellome Geek_Juice xorpp Sonar_Guy luckman212 danar psybear eir StarRain sparticus stux|RC-only go|dfish teneightypea BaW d10n riddle Tm_T dive EvilJStoker glowsticks kode54 stwalkerster pocoyo shiftplusone bburhans trucMuche " + "moonlight yano kevank jmfcool BranchPredictor pppingme Namikaze EvilOne FZTMm Sakaki Lord_Aizen demosdemon JasonDC duracrisis IHateHavingToReg D[_] AlexJFox Th0masR0ss back Exio4 kunwon1 kc8qvp jeblair Jeruvy Kadet EmLeX aways Kester Spr0cket Thorne csssuf iotku nb solution Zanzibar em mwheeler x56 ChauffeR_ phrozen77 ivan`` The_Cop Monkeh ishanyx Whopper ghz JStoker brabo_ Triskelios sosby PoohBear Clete2 ErrantEgo SebastianFlyte JT jose rubick " + "RDash[AW] wwraith Hazel|artemis mrgaryniger tabeaux crazedpsyc denny mh0 TheDrums Nothing4You_ Fieldy akawaka thumbs Dave2 aghos_ Carly-_ Necrosan K1rk ClaudiaU_ HeavyMetal Zenum KOD3N cooldude mshaw milky sepeck Nineain nxp ktr TheLordOfTime dmlloyd sunitknandi arikb pumba Webu `DiM danmackay zomGreg tomboy_ callumacrae Devels rsrx zz_dbRenaud trout Kye Romance _ruben sfan5 brabo lassefaxoe Arieh John13 ldunn OldSoul|4SiOS501 evilmquin xrated Ishaq " + "phreak turboroot ra roxell topyli jeremias doily Nazca Aehmlo_away nutron christel niko DLange drdanick AndrewBarber mediko psk1 TheJH skrip_kid jbroome njan RainbowDashh Plazma vedalken254 codethought md_5 michagogo|cloud brad lolcat LoRez MissionCritical honzik666 variousnefarious AlanBell tdfischer EricK|AFK AsadH apollo13 Wug[Hyperspace] nullrouted|cloud PeerLesS DarthGandalf cbdev shroud badunkadunk Happzz fortytwo netchip Mike3620 newton " + "Detch Gnumarcoo Brownout Junaos ThalinVien evilErrantEgo Bladerunner JonathanD Beothoric FloTiX Alenah Raccoon ow GLolol c45y coinspelunk mysteerimasa real_alien tburg SPF|Cloud Cloudiumn like2helpU iMast777 geoffw8__ troyt Hypnotoad nkuttler Sjsws1078_ apoplexy3 trawl AntiSpamMeta ShadowNinja Kernel|Panic vinylGhost GaelanAintAround dlu corentin shark KnownUnown pentiumone133 AimHere Mad7Scientist SaMOOrai Fabianius alamar morphium espiral Someguy123 " + "LIP DURgod tehKitten an0nmat1r FuriousRage nanotube jrgifford Mez gry n4x TDJACR phuzion ohm BradND TheUni OzBorne RumpledElf Internet13 Muzer lostlabyrinth SeySayux midnightmagic drathir Sling firebird jtrucks Red_M Stary2001 localhost jefferai mosh sweet_kid RichiH Nothing4You hvxgr FastLizard4 bren2010 Slasher VunKruz sohum MogDog DJones fooly Arokh swords anaconda rcombs Wiretap jeffmjack petteyg TW1920 grawity JakeOrrall mac-mini _Cr4zi3_VM " + "Djole ShapeShifter499 AccessDenied jlcl Jguy sucheta XgF avermedia_ Pyker evil alpha Affliction Spitfire Fohlen rtbt humvee ka6sox benhunter09 mavensk asherkin Elwell amithkk SolarAquarion chalcedony amarshall mrtux GarethAdams gary_chiang SilentPenguin ebuch_ jbroome_ TW1920__ LaserShark msimkins Playb3yond music2myear maksbotan tenobi noko eighty4 bitpushr bucketm0use Amrykid phantomcircuit WorldEmperor Reisen pjschmitt armansito piney Yajirobe " + "neuro_sys JordanJ2 z3uS kline Clinteger Taylor albel727 Kharec Rarity Tzunamii VictorRedtail|Sa Peng KWC10 Axew iPod Jasper_Deng_away RyanKnack unreal Haseo aegis mst SecretAgent wapiflapi ghoti _spk_ jeremyb LjL marienz _TMM_ Archer gheraint cebor Chris_G Schoentoon jsec Bradford|Nosta addshore cyphase jmbsvicetto liori Plasmastar Skunky chaoscon heinrich5991 nealph catsup SierraAR davidhadas levarnu ping- daurnimator Cr0iX ksx4system Lars_G_ Maple__ " + "PcJamesy rej froggyman LanceBNC Vorpal RojoD asakura jaybe Kyle IsoAnon neal__ G ski ibenox Adran Shirik WaffleZ MRX Damage-X Guest90323 jericon irc_adama Nietzschale Mack d1b balrog ikonia GTAXL Michail1 CoJaBo SkyDreamer suborbital Stryyker farn Matrixiumn Fira benonsoftware kaictl jdiez spectra FriendlyFascist Cyclone Koma dwfreed Phoebus jamesd MichaelC|Mobile PennStater SwedFTP spaceinvader jumperboy Zic Graet ake gbyers[Away] MJ94 keeleysam Dwarf " + "NiTeMaRe arkeet Jake_D alvinek_ debris` Guest13246 infojunky ChrisAM Novacha ImTheBitch capri MartynKeigher BlackoutIsHere WannabeZNC EViLSLuT DrRen KamusHadenes deadpool graphitemaster xy andy_ Cydrobolt Metaleer Oprah Hello71 dirtydawg [Derek] basic` wei2912 nesthib poutine Angelo Simba WormDrink robink zymurgy Guest89644 SirCmpwn enchilado dominikh vivekrai Utility Jason bazhang paddymahoney pinPoint brainproxy TheEpTic Revi N7 Lyude edibsk mb06cs " + "bray90820 IdleOne Console kPa_ shadowm winocm spot digikwondo blishchrot MichaelC swagemon Whiskey win2012 VideoDudeMike HavokOC FailPowah ix007 phenom JZTech101 ohama eric1212 Timbo zz_dlu joey Wooble Willis pseubodot lbft elky BlueShark haxxed JamesOff ndngvr` overrider lahwran plasticboy idoru DXtremz Adonis SeanieB Gizmokid2005 Aerox3 Disori ludkiller dhoss_ c xid b_jonas lurst TheLonelyGod Nietzsche MillHouse Guest19968 AlexP Stoo psycho_oreos G1eb " + "Obfuscate ggherdov dStruct auscompgeek bdfoster tharkun aperson GeordieNorman mfamos irv tt argv Psi-Jack cups Cprossu TheBadShepperd Magiobiwan mkb Steakanbake three18ti lysobit raztoki Chex Sellyme caf Guest76346 Louis Lexi sa`tan truexfan81 nitrix CodesInChaos Deus N3LRX Tsunamifox tgs3 multiply JakeSaysSays epochwolf totte t cam daemoneye stump Sargun ekeih tauntaun Milenko vvv upgrayeddd mrrothhcloud___ _anonymous issyl0 smokex Pici"; + +static const char* freenode_admins = ""; +static const char* freenode_ops = "ChanServ"; +static const char* freenode_halfops = ""; +static const char* freenode_voices = "mist JamesTait Myrtti Pricey kloeri_ Tabmow jayne nhandler tomaw Corey erry kloeri yano D[_] denny Dave2 ldunn christel niko jbroome njan Plazma LoRez JonathanD gry jtrucks RichiH Elwell jbroome_ marienz gheraint spaceinvader tt t issyl0"; + +#endif // TST_FREENODE_H diff --git a/src/libcommuni/tests/auto/shared/tst_ircclientserver.cpp b/src/libcommuni/tests/auto/shared/tst_ircclientserver.cpp new file mode 100644 index 0000000..2a76ead --- /dev/null +++ b/src/libcommuni/tests/auto/shared/tst_ircclientserver.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "tst_ircclientserver.h" + +tst_IrcClientServer::tst_IrcClientServer() +{ + server = new QTcpServer(this); +} + +void tst_IrcClientServer::initTestCase() +{ + QVERIFY(server->listen()); +} + +void tst_IrcClientServer::cleanupTestCase() +{ + server->close(); +} + +void tst_IrcClientServer::init() +{ + connection = new IrcConnection(this); + connection->setUserName("user"); + connection->setNickName("nick"); + connection->setRealName("real"); + connection->setPassword("secret"); + connection->setHost("127.0.0.1"); + connection->setPort(server->serverPort()); +} + +void tst_IrcClientServer::cleanup() +{ + delete connection; +} + +bool tst_IrcClientServer::waitForOpened(int timeout) +{ + if (!server->waitForNewConnection(timeout)) + return false; + serverSocket = server->nextPendingConnection(); + clientSocket = connection->socket(); + return serverSocket && clientSocket && clientSocket->waitForConnected(1000); +} + +bool tst_IrcClientServer::waitForWritten(const QByteArray& data, int timeout) +{ + if (!data.isNull()) { + if (data.count('\n') > 1) { + bool success = true; + foreach (const QByteArray& line, data.split('\n')) + success &= waitForWritten(line + '\n', timeout); + return success; + } + if (data.endsWith('\r') || data.endsWith('\n')) + serverSocket->write(data); + else + serverSocket->write(data + "\r\n"); + } + return serverSocket->waitForBytesWritten(timeout) && clientSocket->waitForReadyRead(timeout); +} diff --git a/src/libcommuni/tests/auto/shared/tst_ircclientserver.h b/src/libcommuni/tests/auto/shared/tst_ircclientserver.h new file mode 100644 index 0000000..ae72f29 --- /dev/null +++ b/src/libcommuni/tests/auto/shared/tst_ircclientserver.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#ifndef TST_IRCCLIENTSERVER_H +#define TST_IRCCLIENTSERVER_H + +#include + +#include +#include +#include +#include + +#if QT_VERSION >= 0x050000 +#define Q4SKIP(description) QSKIP(description) +#else +#define Q4SKIP(description) QSKIP(description, SkipAll) +#endif + +class tst_IrcClientServer : public QObject +{ + Q_OBJECT + +public: + tst_IrcClientServer(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + + void init(); + void cleanup(); + +protected: + bool waitForOpened(int timeout = 200); + bool waitForWritten(const QByteArray& data, int timeout = 1000); + + QPointer server; + QPointer serverSocket; + QPointer connection; + QPointer clientSocket; +}; + +#endif // TST_IRCCLIENTSERVER_H diff --git a/src/libcommuni/tests/auto/shared/tst_ircdata.cpp b/src/libcommuni/tests/auto/shared/tst_ircdata.cpp new file mode 100644 index 0000000..b3a11b2 --- /dev/null +++ b/src/libcommuni/tests/auto/shared/tst_ircdata.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "tst_ircdata.h" +#include "tst_freenode.h" +#include "tst_ircnet.h" +#include "tst_euirc.h" + +QList tst_IrcData::keys() +{ + return QList() << "freenode" << "ircnet" << "euirc"; +} + +QByteArray tst_IrcData::welcome(const QByteArray& key) +{ + static QHash blobs; + if (blobs.isEmpty()) { + blobs.insert("freenode", freenode_welcome); + blobs.insert("ircnet", ircnet_welcome); + blobs.insert("euirc", euirc_welcome); + } + return blobs.value(key.isEmpty() ? keys().first() : key); +} + +QByteArray tst_IrcData::join(const QByteArray& key) +{ + static QHash blobs; + if (blobs.isEmpty()) { + blobs.insert("freenode", freenode_join); + blobs.insert("ircnet", ircnet_join); + blobs.insert("euirc", euirc_join); + } + return blobs.value(key.isEmpty() ? keys().first() : key); +} + +QStringList tst_IrcData::names(const QByteArray& key) +{ + static QHash blobs; + if (blobs.isEmpty()) { + blobs.insert("freenode", QString::fromUtf8(freenode_names).split(" ")); + blobs.insert("ircnet", QString::fromUtf8(ircnet_names).split(" ")); + blobs.insert("euirc", QString::fromUtf8(euirc_names).split(" ")); + } + return blobs.value(key.isEmpty() ? keys().first() : key); +} + +QStringList tst_IrcData::admins(const QByteArray& key) +{ + static QHash blobs; + if (blobs.isEmpty()) { + blobs.insert("freenode", QString::fromUtf8(freenode_admins).split(" ")); + blobs.insert("ircnet", QString::fromUtf8(ircnet_admins).split(" ")); + blobs.insert("euirc", QString::fromUtf8(euirc_admins).split(" ")); + } + return blobs.value(key.isEmpty() ? keys().first() : key); +} + +QStringList tst_IrcData::ops(const QByteArray& key) +{ + static QHash blobs; + if (blobs.isEmpty()) { + blobs.insert("freenode", QString::fromUtf8(freenode_ops).split(" ")); + blobs.insert("ircnet", QString::fromUtf8(ircnet_ops).split(" ")); + blobs.insert("euirc", QString::fromUtf8(euirc_ops).split(" ")); + } + return blobs.value(key.isEmpty() ? keys().first() : key); +} + +QStringList tst_IrcData::halfops(const QByteArray& key) +{ + static QHash blobs; + if (blobs.isEmpty()) { + blobs.insert("freenode", QString::fromUtf8(freenode_halfops).split(" ")); + blobs.insert("ircnet", QString::fromUtf8(ircnet_halfops).split(" ")); + blobs.insert("euirc", QString::fromUtf8(euirc_halfops).split(" ")); + } + return blobs.value(key.isEmpty() ? keys().first() : key); +} + +QStringList tst_IrcData::voices(const QByteArray& key) +{ + static QHash blobs; + if (blobs.isEmpty()) { + blobs.insert("freenode", QString::fromUtf8(freenode_voices).split(" ")); + blobs.insert("ircnet", QString::fromUtf8(ircnet_voices).split(" ")); + blobs.insert("euirc", QString::fromUtf8(euirc_voices).split(" ")); + } + return blobs.value(key.isEmpty() ? keys().first() : key); +} diff --git a/src/libcommuni/tests/auto/shared/tst_ircdata.h b/src/libcommuni/tests/auto/shared/tst_ircdata.h new file mode 100644 index 0000000..c5126f8 --- /dev/null +++ b/src/libcommuni/tests/auto/shared/tst_ircdata.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#ifndef TST_IRCDATA_H +#define TST_IRCDATA_H + +#include +#include +#include +#include +#include + +class tst_IrcData +{ +public: + static QList keys(); + static QByteArray welcome(const QByteArray& key = QByteArray()); + static QByteArray join(const QByteArray& key = QByteArray()); + static QStringList names(const QByteArray& key = QByteArray()); + static QStringList admins(const QByteArray& key = QByteArray()); + static QStringList ops(const QByteArray& key = QByteArray()); + static QStringList halfops(const QByteArray& key = QByteArray()); + static QStringList voices(const QByteArray& key = QByteArray()); +}; + +#endif // TST_IRCDATA_H diff --git a/src/libcommuni/tests/auto/shared/tst_ircnet.h b/src/libcommuni/tests/auto/shared/tst_ircnet.h new file mode 100644 index 0000000..e0fb7d4 --- /dev/null +++ b/src/libcommuni/tests/auto/shared/tst_ircnet.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#ifndef TST_IRCNET_H +#define TST_IRCNET_H + +static const char* ircnet_welcome = + ":irc.ifi.uio.no 020 * :Please wait while we process your connection.\r\n" + ":irc.ifi.uio.no 001 communi :Welcome to the Internet Relay Network communi!~communi@hidd.en\r\n" + ":irc.ifi.uio.no 002 communi :Your host is irc.ifi.uio.no, running version 2.11.2p3\r\n" + ":irc.ifi.uio.no 003 communi :This server was created Wed Aug 8 2012 at 10:28:47 CEST\r\n" + ":irc.ifi.uio.no 004 communi irc.ifi.uio.no 2.11.2p3 aoOirw abeiIklmnoOpqrRstv\r\n" + ":irc.ifi.uio.no 005 communi RFC2812 PREFIX=(ov)@+ CHANTYPES=#&!+ MODES=3 CHANLIMIT=#&!+:21 NICKLEN=15 TOPICLEN=255 KICKLEN=255 MAXLIST=beIR:64 CHANNELLEN=50 IDCHAN=!:5 CHANMODES=beIR,k,l,imnpstaqr :are supported by this server\r\n" + ":irc.ifi.uio.no 005 communi PENALTY FNC EXCEPTS=e INVEX=I CASEMAPPING=ascii NETWORK=IRCNet :are supported by this server\r\n" + ":irc.ifi.uio.no 042 communi 578IAAESX :your unique ID\r\n" + ":irc.ifi.uio.no 251 communi :There are 55235 users and 5 services on 27 servers\r\n" + ":irc.ifi.uio.no 252 communi 95 :operators online\r\n" + ":irc.ifi.uio.no 254 communi 30892 :channels formed\r\n" + ":irc.ifi.uio.no 255 communi :I have 447 users, 0 services and 4 servers\r\n" + ":irc.ifi.uio.no 265 communi 447 456 :Current local users 447, max 456\r\n" + ":irc.ifi.uio.no 266 communi 55235 58824 :Current global users 55235, max 58824\r\n" + ":irc.ifi.uio.no 375 communi :- irc.ifi.uio.no Message of the Day -\r\n" + ":irc.ifi.uio.no 376 communi :End of MOTD command.\r\n"; + +static const char* ircnet_join = + ":communi!~communi@hidd.en JOIN :#uptimed\r\n" + ":irc.ifi.uio.no 332 communi #uptimed :UPTIME CONTEST - STARTS WITH 600 VOICES / The winner gets a 1 year SHELL\r\n" + ":irc.ifi.uio.no 333 communi #uptimed t0r-!t0r@hidd.en 1380194318\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :communi +_box +Ste` +`ViRuS` +sensej +ip +\\x00 +Dos +Plato +sonik +[daro] +056DABT1Q @Voicer +Elcid +NICK +ComeAsYouAre +nightmare +AboutAGirl +once +Arwen +vizion @artico +OnceW3reWarrior +NT2000 +Coolio +babka +dziadek +OnceWereWarrior +kaban +nabak +uytrew +705AAFHDM +705AAFHDO +705AAFHDN +ggefew +233EAGIRG +adsfds +[jp] +233DADVTX +233DADVTW +vaginakkk +szok +datanetek +deeee +italiano +knbb +em +robo +dupeczka +233DADWSZ +mofaya +fogiel +[nsa]\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+vagina +evil_ +vaginallo +why +evil` +inci +yhw +zazaza +ewe +bandoz +zeus +[animanera] +{artic} @Uptimed +sisiako +italianos +elite +polishpower +nsa` +`artic` +RedDevil +varna +s +rudy +draven +lupo +ijnnk +quest[2] +desapir +itsab +r0d +keep +An0nym0uz +_sparco +nsa- +KaPPa +devilkickers +wannie +PaulAnunda +TuOmaS- +Ainame +TeSsIer +MarkrIckeR +Markvillam +LasteS +JaMeS_ +CriStiaNo +IvanaCosta +brunodp +HackYou +Ducentesimo +Created +Ciwarshak\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+BroLy +BriatoRe +tasya +cpanel +liana +shoutcast +humantourch +myznc +kopisusu +ainah +IRC +knb +ipv4 +zguba +{ +rudi +idur +ls_212 +[goku] +xman +josip +mushroom +ajo +Patty +alien^ +ReMoNDiNi +marselo +NiTr0 +iOrOxxo +DartagnaN +TheCure +FurisO +MetroNotte +ToRSoLo +register +init-zero +Pilszcz +DjCaro +wamper +ToRQUaTo +Alison +Wenni^_^ +Hambi +MzMaNdY +Howie^^ +Chiwai +EkinCheng +Jenny^_^ @abuser` +die @Mgla +rcu +|jp| +|be| +egg +suka +ircoholik\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+|de| @ruciu +japanase +zncbot +latitanz +kafir +sparco +invisible +elk +jazz +esprit +strange +rex +grasshopper +miracle +outlaw @t0r- +veronica +artic| @[m] +ToRDo +ToRRoNe +MusSi +ToRBiDo +gozmit +ToReRo +ToRReNTe +Mediterraneo +Sugar +unregistered +bohjan +biskut +xdos +unix +cheap +android +birc +edit +Robocop +Neon +Temp +Apofis +Seth +Sokar +Iron +Control +Kiler +mrozek +widzewiak +klesk +Dj +Rcnet +mybsd +lis +[d] +resu` +ussus_ +ksychy +sp +kln\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+psk +Kulf0n +daro +darecki +pan_ban +Anonymouz +atos +MarRosso +CommenDa +miglia +Spike +Sc0rpion +Krotone +ViboValentia +Arcaverde +AlcaTRaz +Adriatico +MescaliNa +PiPo_ +RogeS +sm0k +kakashi +naintails +smuga +howkey +aven[gers] +[neo] +[dill] +Aptajm +marcin +founder +roger +feedback +M-k +Madmax +Piramida +Hator +Loginek +Lill +Polibuda +Zeus` +bouncer +msdos +gurl +kongsi +mamak +scid +mylinux +sock +nana +ibm +samba +k-pop +gyna +k-chat +mail\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+chat +yatie +ircap +Ho-Nam +mynet +rindunet +qip +eggies +db +fakap +loco +mircpro +mircbot +mynic +bladez +hackintosh +egghelp +kampung +cisco +girl +skepticals +nickname +Uncle-B +bohsia +mircx @Grypsio +kaktej +Asia +HelpAR +VaneSSaBeLL +AcHIni +DjuNaBarnEs +HydRA +WilHElm- +BrIanCHon +LiLi +Br0doWski +Apus +BoUdin0 +ERebpAR +RetIculum +TucANA +CAsIk +CANes +PuppIs +BeNaZech +BeRnaRDus +Lupus +IzrAileviC +UlAIn +AdaMI +Bartels +AGliNK +Helon +UlpAR\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+BemELmaNS +DelphINus +AbBati +FoRNAx +BenKvicH +Ulseth +PIctoR +BeJJini +BroOWn +Br00k +AffanNU +Achenbach +BelloTTo +AbrHHam +CeNtAuRus +Agutte +AlbrECht +AnGeLico +Ar13S +TAuRus +BeReNIces +AzARfAR +AquIlA +Br0uwEr +BreYtenbaCH +CAsImAR +CAssIopeIA +ColumbA +CRux +EuGen +GeoFFrY +HiPPolyter +HoRologIum +LAceRtA +LeoMINoR +NIsAIn +NIsseth +NoRmA +PaVl0viC +ScoRpIus +SeRpeNs +ShuRImAR +artic +TitoAguiAri +ZIRpAR +TuRfAR +VAnIkAIn +VolANs +NIspAR\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+CAsImAl +ThiErry +INdus +Cetus +PeTerFraNcio +GRus +MadDox +PIscIs +VulpeculA +CeCily +TRIANgulum +CApRIcoRNus +FraNtz +TuRIen +AdeMollo +BrIgnOni +AgReSti +AustRAle +BoTTinI +BouVIer +BrenTANA +BriNdiSi +CAelum +DoRAdo +ErNIeBarnEs +Helseth +JeNNiferBart +leBrocQUy +Lepus +LyNx +OctANs +OphIuchus +PeNeTriL +PIsces +PyxIs +roKkmAn +SAgIttA +TelescopIum +CRAteR +PeRseus +ShuRpAR +CAsseth +BeLLini +ChAmAeleoN +MIcRoscopIum +Ad0lphE +BoReAlIs +ARA_ +CARINA\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+AquARIus_ +BartoLomeo +ShuRon +t0r__ +YaAcovAgam +Betty- +HydRus +ANDRoMeD2 +Mercurio +HeRcules_ +ORIoN- +Br00ker +Cepheus +276XAAAPU +PegAsus_ +CAspAR +BoUchE +MoNoceRos +URsAMAjoR +CAsIl +AivaZZovskKy +ERIdANus +BoUdeWijNS +LyR4 +ERebseth +ShuRseth +AleChiNskY +LIbRA +Leo +AceRbi +AuRIgA +BeNNo +Bootes_ +BriSSaud +CIRcINus +DRAco +SAgIttAR2us +WaSHingt0n +JUliUs- +TuRIk +HansBellmEs +PAvo +SculptoR +AddNet +GemINI +ANtlIA +ShuRkAn +BoUcheR +Br0wn\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+URsAMINoR +VelA +CoRvus_ +BoWerANO +AustRINA +Agn0l +KaziMIerZ +PhoeNIx- +Scutum +SebAStieN +VIRgo_ +CANceR_ +CygNus_ +ZIRseth +t0r_ +ERebon +Equuleus +BouLAngeR +CAson +SextANs +JBelliNi +BourdiDIchoN +AzARAth +DiLDoSauRo +PumPinks +Callisto +Cosenza +Meschino +Portos +IoRobot +Eclipse +HighLander +T0XiC +Popoff +PaLLa +Indiano +MDma +Eastie +BleacH +PoSiX +Slash_ +InUtero +FormaGGino +riggiu +tirrenico +papera +MaXMerilio +MalandriNo +ToRTiGLia\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+ToRToRa +BeLGo +NetBeans +NeverMind +BlackSp1rit +Ionico +Anfetamina +t0r +ladyshrew +ToRoNTo +AsTRo` +ToRCeTTo +EnSi +ToRNaDo +ToRReTTa +MaGReBiNo +ToRBoSo +ToRSiDa +ToRCia +ToRCiCoLLo +Wokie +RuMeNiNo +ToRTiNo +TheOne +NOP +oVaCoD +KiFFa +CLeMeNTiNo +ToRaCe +EviLDoG +PoPkiss +NeverDown +EleCTrO +CaM3LS_ +Hulk +StocaZZico +YoUbEgGaReD +Ocean +aLBaNiN0 +CaNeSeCCo +AlwaysBack +Crimson +OuRwEeRiCiN +Shorty +BeeDeePee +Punker +ToRaLBa +BeSTio +BaBy_BluE\r\n" + ":irc.ifi.uio.no 353 communi = #uptimed :+TeSTiCoLo^ +BieBeron +Prosexionist +svansen +artic^\r\n" + ":irc.ifi.uio.no 366 communi #uptimed :End of NAMES list.\r\n"; + +static const char* ircnet_names = + "communi _box Ste` `ViRuS` sensej ip \\x00 Dos Plato sonik [daro] 056DABT1Q Voicer Elcid NICK ComeAsYouAre nightmare AboutAGirl once Arwen vizion artico OnceW3reWarrior NT2000 Coolio babka dziadek OnceWereWarrior kaban nabak uytrew 705AAFHDM 705AAFHDO 705AAFHDN ggefew 233EAGIRG adsfds [jp] 233DADVTX 233DADVTW vaginakkk szok datanetek deeee italiano knbb em robo dupeczka 233DADWSZ mofaya fogiel [nsa] " + "vagina evil_ vaginallo why evil` inci yhw zazaza ewe bandoz zeus [animanera] {artic} Uptimed sisiako italianos elite polishpower nsa` `artic` RedDevil varna s rudy draven lupo ijnnk quest[2] desapir itsab r0d keep An0nym0uz _sparco nsa- KaPPa devilkickers wannie PaulAnunda TuOmaS- Ainame TeSsIer MarkrIckeR Markvillam LasteS JaMeS_ CriStiaNo IvanaCosta brunodp HackYou Ducentesimo Created Ciwarshak " + "BroLy BriatoRe tasya cpanel liana shoutcast humantourch myznc kopisusu ainah IRC knb ipv4 zguba { rudi idur ls_212 [goku] xman josip mushroom ajo Patty alien^ ReMoNDiNi marselo NiTr0 iOrOxxo DartagnaN TheCure FurisO MetroNotte ToRSoLo register init-zero Pilszcz DjCaro wamper ToRQUaTo Alison Wenni^_^ Hambi MzMaNdY Howie^^ Chiwai EkinCheng Jenny^_^ abuser` die Mgla rcu |jp| |be| egg suka ircoholik " + "|de| ruciu japanase zncbot latitanz kafir sparco invisible elk jazz esprit strange rex grasshopper miracle outlaw t0r- veronica artic| [m] ToRDo ToRRoNe MusSi ToRBiDo gozmit ToReRo ToRReNTe Mediterraneo Sugar unregistered bohjan biskut xdos unix cheap android birc edit Robocop Neon Temp Apofis Seth Sokar Iron Control Kiler mrozek widzewiak klesk Dj Rcnet mybsd lis [d] resu` ussus_ ksychy sp kln " + "psk Kulf0n daro darecki pan_ban Anonymouz atos MarRosso CommenDa miglia Spike Sc0rpion Krotone ViboValentia Arcaverde AlcaTRaz Adriatico MescaliNa PiPo_ RogeS sm0k kakashi naintails smuga howkey aven[gers] [neo] [dill] Aptajm marcin founder roger feedback M-k Madmax Piramida Hator Loginek Lill Polibuda Zeus` bouncer msdos gurl kongsi mamak scid mylinux sock nana ibm samba k-pop gyna k-chat mail " + "chat yatie ircap Ho-Nam mynet rindunet qip eggies db fakap loco mircpro mircbot mynic bladez hackintosh egghelp kampung cisco girl skepticals nickname Uncle-B bohsia mircx Grypsio kaktej Asia HelpAR VaneSSaBeLL AcHIni DjuNaBarnEs HydRA WilHElm- BrIanCHon LiLi Br0doWski Apus BoUdin0 ERebpAR RetIculum TucANA CAsIk CANes PuppIs BeNaZech BeRnaRDus Lupus IzrAileviC UlAIn AdaMI Bartels AGliNK Helon UlpAR " + "BemELmaNS DelphINus AbBati FoRNAx BenKvicH Ulseth PIctoR BeJJini BroOWn Br00k AffanNU Achenbach BelloTTo AbrHHam CeNtAuRus Agutte AlbrECht AnGeLico Ar13S TAuRus BeReNIces AzARfAR AquIlA Br0uwEr BreYtenbaCH CAsImAR CAssIopeIA ColumbA CRux EuGen GeoFFrY HiPPolyter HoRologIum LAceRtA LeoMINoR NIsAIn NIsseth NoRmA PaVl0viC ScoRpIus SeRpeNs ShuRImAR artic TitoAguiAri ZIRpAR TuRfAR VAnIkAIn VolANs NIspAR " + "CAsImAl ThiErry INdus Cetus PeTerFraNcio GRus MadDox PIscIs VulpeculA CeCily TRIANgulum CApRIcoRNus FraNtz TuRIen AdeMollo BrIgnOni AgReSti AustRAle BoTTinI BouVIer BrenTANA BriNdiSi CAelum DoRAdo ErNIeBarnEs Helseth JeNNiferBart leBrocQUy Lepus LyNx OctANs OphIuchus PeNeTriL PIsces PyxIs roKkmAn SAgIttA TelescopIum CRAteR PeRseus ShuRpAR CAsseth BeLLini ChAmAeleoN MIcRoscopIum Ad0lphE BoReAlIs ARA_ CARINA " + "AquARIus_ BartoLomeo ShuRon t0r__ YaAcovAgam Betty- HydRus ANDRoMeD2 Mercurio HeRcules_ ORIoN- Br00ker Cepheus 276XAAAPU PegAsus_ CAspAR BoUchE MoNoceRos URsAMAjoR CAsIl AivaZZovskKy ERIdANus BoUdeWijNS LyR4 ERebseth ShuRseth AleChiNskY LIbRA Leo AceRbi AuRIgA BeNNo Bootes_ BriSSaud CIRcINus DRAco SAgIttAR2us WaSHingt0n JUliUs- TuRIk HansBellmEs PAvo SculptoR AddNet GemINI ANtlIA ShuRkAn BoUcheR Br0wn " + "URsAMINoR VelA CoRvus_ BoWerANO AustRINA Agn0l KaziMIerZ PhoeNIx- Scutum SebAStieN VIRgo_ CANceR_ CygNus_ ZIRseth t0r_ ERebon Equuleus BouLAngeR CAson SextANs JBelliNi BourdiDIchoN AzARAth DiLDoSauRo PumPinks Callisto Cosenza Meschino Portos IoRobot Eclipse HighLander T0XiC Popoff PaLLa Indiano MDma Eastie BleacH PoSiX Slash_ InUtero FormaGGino riggiu tirrenico papera MaXMerilio MalandriNo ToRTiGLia " + "ToRToRa BeLGo NetBeans NeverMind BlackSp1rit Ionico Anfetamina t0r ladyshrew ToRoNTo AsTRo` ToRCeTTo EnSi ToRNaDo ToRReTTa MaGReBiNo ToRBoSo ToRSiDa ToRCia ToRCiCoLLo Wokie RuMeNiNo ToRTiNo TheOne NOP oVaCoD KiFFa CLeMeNTiNo ToRaCe EviLDoG PoPkiss NeverDown EleCTrO CaM3LS_ Hulk StocaZZico YoUbEgGaReD Ocean aLBaNiN0 CaNeSeCCo AlwaysBack Crimson OuRwEeRiCiN Shorty BeeDeePee Punker ToRaLBa BeSTio BaBy_BluE " + "TeSTiCoLo^ BieBeron Prosexionist svansen artic^"; + +static const char* ircnet_admins = ""; +static const char* ircnet_ops = "Voicer artico Uptimed abuser` Mgla ruciu t0r- [m] Grypsio"; +static const char* ircnet_halfops = ""; + +static const char* ircnet_voices = + "_box Ste` `ViRuS` sensej ip \\x00 Dos Plato sonik [daro] 056DABT1Q Elcid NICK ComeAsYouAre nightmare AboutAGirl once Arwen vizion OnceW3reWarrior NT2000 Coolio babka dziadek OnceWereWarrior kaban nabak uytrew 705AAFHDM 705AAFHDO 705AAFHDN ggefew 233EAGIRG adsfds [jp] 233DADVTX 233DADVTW vaginakkk szok datanetek deeee italiano knbb em robo dupeczka 233DADWSZ mofaya fogiel [nsa] " + "vagina evil_ vaginallo why evil` inci yhw zazaza ewe bandoz zeus [animanera] {artic} sisiako italianos elite polishpower nsa` `artic` RedDevil varna s rudy draven lupo ijnnk quest[2] desapir itsab r0d keep An0nym0uz _sparco nsa- KaPPa devilkickers wannie PaulAnunda TuOmaS- Ainame TeSsIer MarkrIckeR Markvillam LasteS JaMeS_ CriStiaNo IvanaCosta brunodp HackYou Ducentesimo Created Ciwarshak " + "BroLy BriatoRe tasya cpanel liana shoutcast humantourch myznc kopisusu ainah IRC knb ipv4 zguba { rudi idur ls_212 [goku] xman josip mushroom ajo Patty alien^ ReMoNDiNi marselo NiTr0 iOrOxxo DartagnaN TheCure FurisO MetroNotte ToRSoLo register init-zero Pilszcz DjCaro wamper ToRQUaTo Alison Wenni^_^ Hambi MzMaNdY Howie^^ Chiwai EkinCheng Jenny^_^ die rcu |jp| |be| egg suka ircoholik " + "|de| japanase zncbot latitanz kafir sparco invisible elk jazz esprit strange rex grasshopper miracle outlaw veronica artic| ToRDo ToRRoNe MusSi ToRBiDo gozmit ToReRo ToRReNTe Mediterraneo Sugar unregistered bohjan biskut xdos unix cheap android birc edit Robocop Neon Temp Apofis Seth Sokar Iron Control Kiler mrozek widzewiak klesk Dj Rcnet mybsd lis [d] resu` ussus_ ksychy sp kln " + "psk Kulf0n daro darecki pan_ban Anonymouz atos MarRosso CommenDa miglia Spike Sc0rpion Krotone ViboValentia Arcaverde AlcaTRaz Adriatico MescaliNa PiPo_ RogeS sm0k kakashi naintails smuga howkey aven[gers] [neo] [dill] Aptajm marcin founder roger feedback M-k Madmax Piramida Hator Loginek Lill Polibuda Zeus` bouncer msdos gurl kongsi mamak scid mylinux sock nana ibm samba k-pop gyna k-chat mail " + "chat yatie ircap Ho-Nam mynet rindunet qip eggies db fakap loco mircpro mircbot mynic bladez hackintosh egghelp kampung cisco girl skepticals nickname Uncle-B bohsia mircx kaktej Asia HelpAR VaneSSaBeLL AcHIni DjuNaBarnEs HydRA WilHElm- BrIanCHon LiLi Br0doWski Apus BoUdin0 ERebpAR RetIculum TucANA CAsIk CANes PuppIs BeNaZech BeRnaRDus Lupus IzrAileviC UlAIn AdaMI Bartels AGliNK Helon UlpAR " + "BemELmaNS DelphINus AbBati FoRNAx BenKvicH Ulseth PIctoR BeJJini BroOWn Br00k AffanNU Achenbach BelloTTo AbrHHam CeNtAuRus Agutte AlbrECht AnGeLico Ar13S TAuRus BeReNIces AzARfAR AquIlA Br0uwEr BreYtenbaCH CAsImAR CAssIopeIA ColumbA CRux EuGen GeoFFrY HiPPolyter HoRologIum LAceRtA LeoMINoR NIsAIn NIsseth NoRmA PaVl0viC ScoRpIus SeRpeNs ShuRImAR artic TitoAguiAri ZIRpAR TuRfAR VAnIkAIn VolANs NIspAR " + "CAsImAl ThiErry INdus Cetus PeTerFraNcio GRus MadDox PIscIs VulpeculA CeCily TRIANgulum CApRIcoRNus FraNtz TuRIen AdeMollo BrIgnOni AgReSti AustRAle BoTTinI BouVIer BrenTANA BriNdiSi CAelum DoRAdo ErNIeBarnEs Helseth JeNNiferBart leBrocQUy Lepus LyNx OctANs OphIuchus PeNeTriL PIsces PyxIs roKkmAn SAgIttA TelescopIum CRAteR PeRseus ShuRpAR CAsseth BeLLini ChAmAeleoN MIcRoscopIum Ad0lphE BoReAlIs ARA_ CARINA " + "AquARIus_ BartoLomeo ShuRon t0r__ YaAcovAgam Betty- HydRus ANDRoMeD2 Mercurio HeRcules_ ORIoN- Br00ker Cepheus 276XAAAPU PegAsus_ CAspAR BoUchE MoNoceRos URsAMAjoR CAsIl AivaZZovskKy ERIdANus BoUdeWijNS LyR4 ERebseth ShuRseth AleChiNskY LIbRA Leo AceRbi AuRIgA BeNNo Bootes_ BriSSaud CIRcINus DRAco SAgIttAR2us WaSHingt0n JUliUs- TuRIk HansBellmEs PAvo SculptoR AddNet GemINI ANtlIA ShuRkAn BoUcheR Br0wn " + "URsAMINoR VelA CoRvus_ BoWerANO AustRINA Agn0l KaziMIerZ PhoeNIx- Scutum SebAStieN VIRgo_ CANceR_ CygNus_ ZIRseth t0r_ ERebon Equuleus BouLAngeR CAson SextANs JBelliNi BourdiDIchoN AzARAth DiLDoSauRo PumPinks Callisto Cosenza Meschino Portos IoRobot Eclipse HighLander T0XiC Popoff PaLLa Indiano MDma Eastie BleacH PoSiX Slash_ InUtero FormaGGino riggiu tirrenico papera MaXMerilio MalandriNo ToRTiGLia " + "ToRToRa BeLGo NetBeans NeverMind BlackSp1rit Ionico Anfetamina t0r ladyshrew ToRoNTo AsTRo` ToRCeTTo EnSi ToRNaDo ToRReTTa MaGReBiNo ToRBoSo ToRSiDa ToRCia ToRCiCoLLo Wokie RuMeNiNo ToRTiNo TheOne NOP oVaCoD KiFFa CLeMeNTiNo ToRaCe EviLDoG PoPkiss NeverDown EleCTrO CaM3LS_ Hulk StocaZZico YoUbEgGaReD Ocean aLBaNiN0 CaNeSeCCo AlwaysBack Crimson OuRwEeRiCiN Shorty BeeDeePee Punker ToRaLBa BeSTio BaBy_BluE " + "TeSTiCoLo^ BieBeron Prosexionist svansen artic^"; + +#endif // TST_IRCNET_H diff --git a/src/libcommuni/tests/benchmarks/benchmarks.pri b/src/libcommuni/tests/benchmarks/benchmarks.pri new file mode 100644 index 0000000..537efa0 --- /dev/null +++ b/src/libcommuni/tests/benchmarks/benchmarks.pri @@ -0,0 +1,9 @@ +###################################################################### +# Communi +###################################################################### + +QT = core network testlib +CONFIG += testcase +CONFIG -= app_bundle + +include(../tests.pri) diff --git a/src/libcommuni/tests/benchmarks/benchmarks.pro b/src/libcommuni/tests/benchmarks/benchmarks.pro new file mode 100644 index 0000000..ec48f5f --- /dev/null +++ b/src/libcommuni/tests/benchmarks/benchmarks.pro @@ -0,0 +1,12 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = subdirs + +SUBDIRS += ircmessage +SUBDIRS += irctextformat + +# - windows has problems with symbols +# - mac with private headers (frameworks) +!win32:!mac:SUBDIRS += ircmessagedecoder diff --git a/src/libcommuni/tests/benchmarks/ircmessage/ircmessage.pro b/src/libcommuni/tests/benchmarks/ircmessage/ircmessage.pro new file mode 100644 index 0000000..0a94dc8 --- /dev/null +++ b/src/libcommuni/tests/benchmarks/ircmessage/ircmessage.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircmessage.cpp + +include(../benchmarks.pri) diff --git a/src/libcommuni/tests/benchmarks/ircmessage/tst_ircmessage.cpp b/src/libcommuni/tests/benchmarks/ircmessage/tst_ircmessage.cpp new file mode 100644 index 0000000..47b1b5c --- /dev/null +++ b/src/libcommuni/tests/benchmarks/ircmessage/tst_ircmessage.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircmessage.h" +#include "ircconnection.h" +#include + +static const QByteArray MSG_32_5("Vestibulum eu libero eget metus."); +static const QByteArray MSG_64_9("Phasellus enim dui, sodales sed tincidunt quis, ultricies metus."); +static const QByteArray MSG_128_19("Ut porttitor volutpat tristique. Aenean semper ligula eget nulla condimentum tempor in quis felis. Sed sem diam, tincidunt amet."); +static const QByteArray MSG_256_37("Vestibulum quis lorem velit, a varius augue. Suspendisse risus augue, ultricies at convallis in, elementum in velit. Fusce fermentum congue augue sit amet dapibus. Fusce ultrices urna ut tortor laoreet a aliquet elit lobortis. Suspendisse volutpat posuere."); +static const QByteArray MSG_512_75("Nam leo risus, accumsan a sagittis eget, posuere eu velit. Morbi mattis auctor risus, vel consequat massa pulvinar nec. Proin aliquam convallis elit nec egestas. Pellentesque accumsan placerat augue, id volutpat nibh dictum vel. Aenean venenatis varius feugiat. Nullam molestie, ipsum id dignissim vulputate, eros urna vestibulum massa, in vehicula lacus nisi vitae risus. Ut nunc nunc, venenatis a mattis auctor, dictum et sem. Nulla posuere libero ut tortor elementum egestas. Aliquam egestas suscipit posuere."); + +class tst_IrcMessage : public QObject +{ + Q_OBJECT + +private slots: + void testFromData_data(); + void testFromData(); +}; + +void tst_IrcMessage::testFromData_data() +{ + QTest::addColumn("data"); + + QTest::newRow("null") << QByteArray(); + QTest::newRow("empty") << QByteArray(""); + + QTest::newRow("32 chars / 5 words") << MSG_32_5; + QTest::newRow("64 chars / 9 words") << MSG_64_9; + QTest::newRow("128 chars / 19 words") << MSG_128_19; + QTest::newRow("256 chars / 37 words") << MSG_256_37; + QTest::newRow("512 chars / 75 words") << MSG_512_75; + + QTest::newRow("32 chars / 5 words") << MSG_32_5; + QTest::newRow("64 chars / 9 words") << MSG_64_9; + QTest::newRow("128 chars / 19 words") << MSG_128_19; + QTest::newRow("256 chars / 37 words") << MSG_256_37; + QTest::newRow("512 chars / 75 words") << MSG_512_75; +} + +void tst_IrcMessage::testFromData() +{ + QFETCH(QByteArray, data); + + IrcConnection connection; + QBENCHMARK { + IrcMessage::fromData(data, &connection); + } +} + +QTEST_MAIN(tst_IrcMessage) + +#include "tst_ircmessage.moc" diff --git a/src/libcommuni/tests/benchmarks/ircmessagedecoder/ircmessagedecoder.pro b/src/libcommuni/tests/benchmarks/ircmessagedecoder/ircmessagedecoder.pro new file mode 100644 index 0000000..1ace28b --- /dev/null +++ b/src/libcommuni/tests/benchmarks/ircmessagedecoder/ircmessagedecoder.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircmessagedecoder.cpp + +include(../benchmarks.pri) diff --git a/src/libcommuni/tests/benchmarks/ircmessagedecoder/tst_ircmessagedecoder.cpp b/src/libcommuni/tests/benchmarks/ircmessagedecoder/tst_ircmessagedecoder.cpp new file mode 100644 index 0000000..f26e1f8 --- /dev/null +++ b/src/libcommuni/tests/benchmarks/ircmessagedecoder/tst_ircmessagedecoder.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircmessagedecoder_p.h" +#include +#include +#include + +static const QByteArray MSG_32_5("Vestibulum eu libero eget metus."); +static const QByteArray MSG_64_9("Phasellus enim dui, sodales sed tincidunt quis, ultricies metus."); +static const QByteArray MSG_128_19("Ut porttitor volutpat tristique. Aenean semper ligula eget nulla condimentum tempor in quis felis. Sed sem diam, tincidunt amet."); +static const QByteArray MSG_256_37("Vestibulum quis lorem velit, a varius augue. Suspendisse risus augue, ultricies at convallis in, elementum in velit. Fusce fermentum congue augue sit amet dapibus. Fusce ultrices urna ut tortor laoreet a aliquet elit lobortis. Suspendisse volutpat posuere."); +static const QByteArray MSG_512_75("Nam leo risus, accumsan a sagittis eget, posuere eu velit. Morbi mattis auctor risus, vel consequat massa pulvinar nec. Proin aliquam convallis elit nec egestas. Pellentesque accumsan placerat augue, id volutpat nibh dictum vel. Aenean venenatis varius feugiat. Nullam molestie, ipsum id dignissim vulputate, eros urna vestibulum massa, in vehicula lacus nisi vitae risus. Ut nunc nunc, venenatis a mattis auctor, dictum et sem. Nulla posuere libero ut tortor elementum egestas. Aliquam egestas suscipit posuere."); + +class tst_IrcMessageDecoder : public QObject +{ + Q_OBJECT + +private slots: + void testDecode_data(); + void testDecode(); +}; + +void tst_IrcMessageDecoder::testDecode_data() +{ + QTest::addColumn("data"); + + QTest::newRow("null") << QByteArray(); + QTest::newRow("empty") << QByteArray(""); + + QTest::newRow("32 chars / 5 words") << MSG_32_5; + QTest::newRow("64 chars / 9 words") << MSG_64_9; + QTest::newRow("128 chars / 19 words") << MSG_128_19; + QTest::newRow("256 chars / 37 words") << MSG_256_37; + QTest::newRow("512 chars / 75 words") << MSG_512_75; + + QTest::newRow("32 chars / 5 words") << MSG_32_5; + QTest::newRow("64 chars / 9 words") << MSG_64_9; + QTest::newRow("128 chars / 19 words") << MSG_128_19; + QTest::newRow("256 chars / 37 words") << MSG_256_37; + QTest::newRow("512 chars / 75 words") << MSG_512_75; +} + +void tst_IrcMessageDecoder::testDecode() +{ + QFETCH(QByteArray, data); + + IrcMessageDecoder decoder; + QBENCHMARK { + decoder.decode(data, "ISO-8859-15"); + } +} + +QTEST_MAIN(tst_IrcMessageDecoder) + +#include "tst_ircmessagedecoder.moc" diff --git a/src/libcommuni/tests/benchmarks/irctextformat/irctextformat.pro b/src/libcommuni/tests/benchmarks/irctextformat/irctextformat.pro new file mode 100644 index 0000000..61091aa --- /dev/null +++ b/src/libcommuni/tests/benchmarks/irctextformat/irctextformat.pro @@ -0,0 +1,7 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_irctextformat.cpp + +include(../benchmarks.pri) diff --git a/src/libcommuni/tests/benchmarks/irctextformat/tst_irctextformat.cpp b/src/libcommuni/tests/benchmarks/irctextformat/tst_irctextformat.cpp new file mode 100644 index 0000000..1da9483 --- /dev/null +++ b/src/libcommuni/tests/benchmarks/irctextformat/tst_irctextformat.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "irctextformat.h" +#include + +class tst_IrcTextFormat : public QObject +{ + Q_OBJECT + +private slots: + void testToHtml_data(); + void testToHtml(); +}; + +void tst_IrcTextFormat::testToHtml_data() +{ + QTest::addColumn("text"); + + QTest::newRow("info") << QString("[freenode-info] if you're at a conference and other people are having trouble connecting, please mention it to staff: http://freenode.net/faq.shtml#gettinghelp"); + QTest::newRow("topic") << QString("Communi 1.2.2 - IRC framework || Home: http://communi.github.com || Docs: http://communi.github.com/doc || MeeGo: http://store.ovi.com/content/219150"); + QTest::newRow("commit") << QString("[communi-desktop] jpnurmi pushed 2 new commits to master: https://github.com/communi/communi-desktop/compare/257ca915a490...8832bfe8d0b8"); + QTest::newRow("welcome") << QString("Welcome to the Communi development lounge. Communi for MeeGo/Symbian users are kindly asked to submit a review in Nokia Store."); +} + +void tst_IrcTextFormat::testToHtml() +{ + QFETCH(QString, text); + + IrcTextFormat format; + QBENCHMARK { + format.toHtml(text); + } +} + +QTEST_MAIN(tst_IrcTextFormat) + +#include "tst_irctextformat.moc" diff --git a/src/libcommuni/tests/build/build.pro b/src/libcommuni/tests/build/build.pro new file mode 100644 index 0000000..4f1eb29 --- /dev/null +++ b/src/libcommuni/tests/build/build.pro @@ -0,0 +1,6 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = subdirs +SUBDIRS += embed install namespace diff --git a/src/libcommuni/tests/build/embed/embed.pro b/src/libcommuni/tests/build/embed/embed.pro new file mode 100644 index 0000000..6dc3b5d --- /dev/null +++ b/src/libcommuni/tests/build/embed/embed.pro @@ -0,0 +1,11 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = app +TARGET = embed +QT += network + +include(../../../src/src.pri) + +SOURCES += main.cpp diff --git a/src/libcommuni/tests/build/embed/main.cpp b/src/libcommuni/tests/build/embed/main.cpp new file mode 100644 index 0000000..48449a8 --- /dev/null +++ b/src/libcommuni/tests/build/embed/main.cpp @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include +#include +#include + +int main() +{ + IrcConnection s; + IrcBuffer b; + IrcTextFormat f; +} diff --git a/src/libcommuni/tests/build/install/install.pro b/src/libcommuni/tests/build/install/install.pro new file mode 100644 index 0000000..5aa824e --- /dev/null +++ b/src/libcommuni/tests/build/install/install.pro @@ -0,0 +1,12 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = app +TARGET = embed +QT += network + +CONFIG += communi +COMMUNI += core model util + +SOURCES += main.cpp diff --git a/src/libcommuni/tests/build/install/main.cpp b/src/libcommuni/tests/build/install/main.cpp new file mode 100644 index 0000000..e006424 --- /dev/null +++ b/src/libcommuni/tests/build/install/main.cpp @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include +#include +#include + +int main() +{ + IrcConnection s; + IrcBuffer b; + IrcTextFormat f; +} diff --git a/src/libcommuni/tests/build/namespace/main.cpp b/src/libcommuni/tests/build/namespace/main.cpp new file mode 100644 index 0000000..73d7e10 --- /dev/null +++ b/src/libcommuni/tests/build/namespace/main.cpp @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include +#include +#include + +int main() +{ + Communi::IrcConnection s; + Communi::IrcBuffer b; + Communi::IrcTextFormat f; +} diff --git a/src/libcommuni/tests/build/namespace/namespace.pro b/src/libcommuni/tests/build/namespace/namespace.pro new file mode 100644 index 0000000..fdd1c92 --- /dev/null +++ b/src/libcommuni/tests/build/namespace/namespace.pro @@ -0,0 +1,12 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = app +TARGET = embed +QT += network + +DEFINES += IRC_NAMESPACE=Communi +include(../../../src/src.pri) + +SOURCES += main.cpp diff --git a/src/libcommuni/tests/tests.pri b/src/libcommuni/tests/tests.pri new file mode 100644 index 0000000..04588b0 --- /dev/null +++ b/src/libcommuni/tests/tests.pri @@ -0,0 +1,25 @@ +###################################################################### +# Communi +###################################################################### + +TARGET = tst_$$basename(_PRO_FILE_PWD_) + +DEPENDPATH += $$_PRO_FILE_PWD_ +INCLUDEPATH += $$_PRO_FILE_PWD_ + +CONFIG += install_name no_testcase_installs + +!verbose:CONFIG += silent + +CONFIG(debug, debug|release) { + OBJECTS_DIR = debug + MOC_DIR = debug +} else { + OBJECTS_DIR = release + MOC_DIR = release +} + +IRC_BUILDDIR = $$OUT_PWD/../../.. + +IRC_MODULES = IrcCore IrcModel IrcUtil +include(../src/module_deps.pri) diff --git a/src/libcommuni/tests/tests.pro b/src/libcommuni/tests/tests.pro new file mode 100644 index 0000000..bbe5635 --- /dev/null +++ b/src/libcommuni/tests/tests.pro @@ -0,0 +1,18 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = subdirs +SUBDIRS += auto +!no_benchmarks:SUBDIRS += benchmarks + +mac { + # TODO: install_name_tool? + check.commands += cd auto && + check.commands += DYLD_FRAMEWORK_PATH=$$OUT_PWD/../lib $(MAKE) check + !no_benchmarks { + check.commands += && cd ../benchmarks && + check.commands += DYLD_FRAMEWORK_PATH=$$OUT_PWD/../lib $(MAKE) check + } + QMAKE_EXTRA_TARGETS += check +} diff --git a/src/libcommuni/version.pri b/src/libcommuni/version.pri new file mode 100644 index 0000000..a16d8d1 --- /dev/null +++ b/src/libcommuni/version.pri @@ -0,0 +1,5 @@ +###################################################################### +# Communi +###################################################################### + +IRC_VERSION = 3.2.0 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..d69a266 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,13 @@ +#include +#include "crsm.hpp" + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + + CRSM *CrServerManager=new CRSM(&a); + if(!CrServerManager->isOk()) + return 1; + CrServerManager->start(); + return a.exec(); +} diff --git a/stop-CRSM b/stop-CRSM deleted file mode 100755 index 0a92951..0000000 --- a/stop-CRSM +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -netcat localhost 9372 < /dev/null -systemd -/exit -EOF diff --git a/systemd-service/CRSM.service b/systemd-service/CRSM.service new file mode 100644 index 0000000..882bd3d --- /dev/null +++ b/systemd-service/CRSM.service @@ -0,0 +1,17 @@ +[Unit] +Description=A Server Manager for Clonk Rage +After=network.target + +[Service] +User=clonk +Group=clonk +WorkingDirectory=/opt/clonk/ +ExecStart=/opt/clonk/CrServerManager +ExecReload=/opt/clonk/reload-CRSM +ExecStop=/opt/clonk/stop-CRSM +KillMode=process +Restart=on-abort +TimeoutStopSec=10 + +[Install] +WantedBy=multi-user.target diff --git a/systemd-service/reload-CRSM b/systemd-service/reload-CRSM new file mode 100755 index 0000000..d4e87c9 --- /dev/null +++ b/systemd-service/reload-CRSM @@ -0,0 +1,5 @@ +#!/bin/bash +netcat localhost 9372 < /dev/null +systemd +/reload +EOF diff --git a/systemd-service/stop-CRSM b/systemd-service/stop-CRSM new file mode 100755 index 0000000..0a92951 --- /dev/null +++ b/systemd-service/stop-CRSM @@ -0,0 +1,5 @@ +#!/bin/bash +netcat localhost 9372 < /dev/null +systemd +/exit +EOF -- cgit v1.2.3-54-g00ecf